Формат файла .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М со стандартным контроллером НГМД или А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 |