Формат файла .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; |
- конфигурация компьютера:
- БК 0010(01) с БЕЙСИКом “Вильнюс 1986”
- БК 0010(01) с блоком МСТД
- БК 0010(01) с дополнительным блоком ОЗУ 32Кб
- БК 0010(01) с контроллером НГМД А16М с ДОЗУ 16К
- БК 0011М
- БК 0011М cо стандартным контроллером НГМД или А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 |