Эмулятор БК-0010-01, БК-0011 и БК-0011М

Формат файла .MSF версии 1.1 (Memory state file) для эмулятора БК 0010(01) и БК 0011М

Файлы данного формата обычно хранят в себе полный слепок всей памяти БК на момент сохранения, состояние регистров, уменьшенную копию экрана, а также любую другую необходимую для последующего восстановления информацию. Формат является бинарным, и представляет из себя теговую структуру. Каждый тег представляет из себя заголовок, и данные некоторого типа. Теги могут располагаться в любом порядке (кроме первого заголовочного тега STATE_FILE_HEADER), а также быть вложенными один в другой. Теоретически любой из тегов может быть пропущен, а также могут присутствовать теги, которые незнакомы эмулятору данной версии, и будут без проблем пропущены. Таким образом теоретически осуществляется совместимость форматов разных версий в обе стороны.

Формат заголовочного тега:

struct MSF_FILE_HEADER

{
DWORD type; - тип файла всегда равен (STATE_ID == 65536)
DWORD version; - версия файла: 10 – 1.0, 15 – 1.5, 20 – 2.0, и т.д. В настоящее время время версия файла 1.1 (11)
DWORD configuration; - конфигурация компьютера:
  1. БК 0010(01) с БЕЙСИКом “Вильнюс 1986”
  2. БК 0010(01) с блоком МСТД
  3. БК 0010(01) с дополнительным блоком ОЗУ 32Кб
  4. БК 0010(01) с контроллером НГМД А16М с ДОЗУ 16К
  5. БК 0011М
  6. БК 0011М со стандартным контроллером НГМД или А16М
};

Далее следуют теги для конкретной конфигурации.

Формат тега:

struct MSF_BLOCK_HEADER

{
  DWORD type; - тип тега
  DWORD length; - длина в файле, занимаемая им вместе с заголовком
};

За тегом сразу следуют данные. Теги бывают следующих типов:

Тип Комментарий Длина
-1 неизвестный блок. Просто пустая болванка, сделан на всякий случай 8 и более
0 блок памяти основного 64Кбайтного пространства. Вся память с 0 – 0200000, то, что в ней находится в текущий момент. В версии 1.0 вместе с системными регистрами, в версии 1.1 системные регистры сохраняются в отдельном блоке 8 + 64Кб
1 Регистры процессора: R0 – R5, SP, PC, PSW 8 + 18
2 Малая копия экрана. См. описание ниже  
3 Блок расширенной памяти КНГМД А16М 16К ОЗУ + 8К ПЗУ. 8 + 24Кб
4 Страницы расширенной памяти 32К. Располагается с адресов 0120000 – 140000 8 + 32Кб
5 Страницы расширенной памяти 64К для БК11М. Формат не определён. Устарел. Зарезервирован.  
6 (Начиная с версии 1.1) Блок размещения системных регистров 177660,177662,177664,177700-177716 8 + 30
7 (Начиная с версии 1.1) Карта памяти, в которой обозначено, какие страницы и банки памяти куда подключены. 8 + 16*20 + 16
8 (Начиная с версии 1.1) Весь блок памяти БК 11М, включая доп. ПЗУ + ПЗУ контроллера А16М и доп. ОЗУ 8+0700000
9 (Начиная с версии 1.1) Блок памяти ОЗУ контроллера SMK-512. Т.к. 16Кб уже сохраняется в блоках №3 и №8, то здесь сохраняется 512Кб-16Кб 8+(512-16)*1024

Формат тега “Блок памяти основного 64Кбайтного пространства”. Тип 0:

struct MSF_BLOCK_HEADER

{
  DWORD type;  
  DWORD length;  
};

Далее следуют 64Кбайта основной памяти в диапазоне адресов 0 – 200000.

Формат тега “Регистры процессора”. Тип 1:

struct MSF_BLOCK_HEADER

{
  DWORD type;  
  DWORD length;  
};

struct MSF_CPU_REGISTERS

{
  WORD r0; - регистр общего назначения R0
  WORD r1; - регистр общего назначения R1
  WORD r2; - регистр общего назначения R2
  WORD r3; - регистр общего назначения R3
  WORD r4; - регистр общего назначения R4
  WORD r5; - регистр общего назначения R5
  WORD sp; - регистр стека SP
  WORD pc; - регистр команд PC
  WORD psw; - слово состояния процессора PSW
};

Формат тега “Малая копия экрана”. Тип 2:

struct MSF_BLOCK_HEADER

{
  DWORD type;  
  DWORD length;  
};

struct BITMAPINFOHEADER

{
  DWORD biSize = 40; - размер структуры BITMAPINFOHEADER
  DWORD biWidth = 200; - всегда 200
  DWORD biHeight = 200; - всегда 200
  WORD biPlanes = 1; - всегда 1 (1 плоскость);
  WORD biBitCount = 32; - кол-во бит на пиксел (любое допустимое кол-во бит)
  DWORD biCompression = 0; - всегда 0 (без компрессии)
  DWORD biSizeImage = 0; - не используется
  DWORD biXPelsPerMeter = 0; - не используется
  DWORD biYPelsPerMeter = 0; - не используется
  DWORD biClrUsed = 0; - не используется
  DWORD biClrImportant = 0; - не используется
};

Далее следует непосредственно массив бит картинки. Картинка записывается в перевёрнутом по вертикали виде, где каждая строка выровнена на границу 4-х байт.

Формат тега “Блок расширенной памяти КНГМД А16М 16К ОЗУ + 8К ПЗУ”. Тип 3:

struct MSF_BLOCK_HEADER

{
  DWORD type;  
  DWORD length;  
};

Для версии 1.0:

DWORD bBasic - флаг, включено ли ПЗУ (0 – нет, 1 – да)

Далее следуют 24Кбайта памяти при установленном флаге bBasic в 1 (обычно ПЗУ 24К бейсика)

Далее следуют 24Кбайта памяти при установленном флаге bBasic в 0 (обычно ДОЗУ 16К + ПЗУ НГМД 8К)

Для версии 1.1:

Далее следуют 24Кбайта памяти при установленном флаге bBasic в 0 (обычно ДОЗУ 16К + ПЗУ НГМД 8К)

Формат тега “Страницы расширенной памяти 32К”. Тип 4

struct MSF_BLOCK_HEADER

{
  DWORD type;  
  DWORD length;  
};

DWORD nPage - номер подключенной страницы 0 – 3

Далее следуют 32Кбайта дополнительной памяти

Формат тега “Системные регистры”. Тип 6:

struct MSF_BLOCK_HEADER

{
  DWORD type;  
  DWORD length;  
};

struct MSF_PORT_REGS

{
  WORD p0177660; - регистр состояния клавиатуры
  WORD p0177662_in; - регистр данных клавиатуры
  WORD p0177662_out; - регистр палитр, буфера экрана и таймер по вектору 100 (только на БК11М)
  WORD p0177664; - регистр смещения
  WORD p0177700; - регистр режима
  WORD p0177702; - регистр адреса прерывания
  WORD p0177704; - регистр ошибки
  WORD p0177706; - регистр установки таймера
  WORD p0177710; - регистр счётчика таймера
  WORD p0177712; - регистр управления таймером
  WORD p0177714_in; - входной регистр порта ввода вывода
  WORD p0177714_out; - выходной регистр порта ввода вывода
  WORD p0177716_in; - регистр порта по чтению (чтение с МФ или с линии)
  WORD p0177716_out_tap; - регистр порта по записи (запись на МФ или в линию)
  WORD p0177716_out_mem; - регистр порта по записи (установка страниц памяти, на БК11М)
};

Формат тега “Карта памяти”. Тип 7:

struct MSF_BLOCK_HEADER

{
  DWORD type;  
  DWORD length;  
};

Далее следует массив из 16 элементов следующей структуры, которые отвечают за сегменты адресного пространства размером 4Кб, последний сегмент служит для хранения режимов работы контроллера AltPro:

struct BKMEMBank_Type

{
  BOOL bReadable; - флаг, указывающий что память доступна для чтения
  BOOL bWritable; - флаг, указывающий что память доступна для записи
  int nBank; - номер банка памяти 4kb
  int nPage; - страница памяти БК11 == nBank >> 2
  int nOffset; - смещение в массиве == nBank << 12
};

И затем следует один элемент следующей структуры, который сохраняет информацию о типе FDD контроллера и режимах работы контроллеров АльтПро.

struct ConfBKModel_Type

{
  DWORD nBKModel; - модель БК, для конфигуратора
  DWORD nAltProMemBank; - код подключения страницы памяти контроллера для записи
  DWORD nExtCodes; - доп. коды контроллера, такие как 10 - подключение бейсика и 4 - блокировка регистров 177130 и 177132 по чтению (для простоты ПЗУ бейсика включается только в режиме 020. В остальных режимах не имеет смысла, хотя на реальной железке технически возможно)
  DWORD nAltProMode; - код режима контроллера
};

Последовательности тегов для конфигураций создаваемых эмулятором версии 3.x. Хотя порядок тегов может быть произвольным, в реальных файлах MSF теги идут именно так:

1 – БК 0010(01) с БЕЙСИКом “Вильнюс 1986”

Тип Название
Hdr Заголовочный тег
2 Preview
1 Регистры процессора
6 Системные регистры и порты
7 Карта памяти
0 Основная память 64К

2 – БК 0010(01) с блоком МСТД

Тип Название
Hdr Заголовочный тег
2 Preview
1 Регистры процессора
6 Системные регистры и порты
7 Карта памяти
0 Основная память 64К

3 – БК 0010(01) с дополнительным блоком ОЗУ 32Кб

Тип Название
Hdr Заголовочный тег
2 Preview
1 Регистры процессора
6 Системные регистры и порты
7 Карта памяти
0 Основная память 64К
4 Страницы расширенной памяти 32К

4 – БК 0010(01) с контроллером A16M c ДОЗУ 16К

Тип Название
Hdr Заголовочный тег
2 Preview
1 Регистры процессора
6 Системные регистры и порты
7 Карта памяти
0 Основная память 64К
3 Блок расширенной памяти 16К + 8К КНГМД

5 – БК 0010(01) с контроллером SMK512 c ДОЗУ 512К

Тип Название
Hdr Заголовочный тег
2 Preview
1 Регистры процессора
6 Системные регистры и порты
7 Карта памяти
0 Основная память 64К
3 Блок расширенной памяти 16К + 8К КНГМД
9 Блок памяти ОЗУ контроллера SMK-512

6,7,8 – БК 0011М без FDD, со стандартным FDD, с контроллером A16M c ДОЗУ 16К

Тип Название
Hdr Заголовочный тег
2 Preview
1 Регистры процессора
6 Системные регистры и порты
7 Карта памяти
8 Весь блок памяти БК 11М, включая доп. ПЗУ + ПЗУ контроллера А16М и доп. ОЗУ

9 – БК 0011М с контроллером SMK512 c ДОЗУ 512К

Тип Название
Hdr Заголовочный тег
2 Preview
1 Регистры процессора
6 Системные регистры и порты
7 Карта памяти
8 Весь блок памяти БК 11М, включая доп. ПЗУ + ПЗУ контроллера А16М и доп. ОЗУ
9 Блок памяти ОЗУ контроллера SMK-512

По всем вопросам обращаться gray-gid@yandex.ru