Формат файла .MSF версии 1.0 (Memory state file) для эмулятора БК 0010(01)
Файлы данного формата обычно хранят в себе полный слепок всей памяти БК на момент сохранения, состояние регистров, уменьшенную копию экрана, а также любую другую необходимую для последующего восстановления информацию. Формат является бинарным, и представляет из себя теговую структуру. Каждый тег представляет из себя заголовок, и данные некоторого типа. Теги могут располагаться в любом порядке (кроме первого заголовочного тега STATE_FILE_HEADER), а также быть вложенными один в другой. Теоретически любой из тегов может быть опущен, а также могут присутствовать теги, которые незнакомы эмулятору данной версии, и будут без проблем пропущены. Таким образом теоретически осуществляется совместимость форматов разных версий в обе стороны.
Формам заголовочного тега:
struct STATE_FILE_HEADER
{
DWORD type; |
- тип файла всегда равен (STATE_ID == 65536) |
|
DWORD version; |
- версия файла 10 – 1.0, 15 – 1.5, 20 – 2.0, и т.д. В наст время версия файла 1.0 (10) |
|
DWORD configuration; |
- конфигурация компьютера: 1 – БК 0010(01) с БЕЙСИКом “Вильнюс 1986” 2 – БК 0010(01) с блоком МСТД 3 – БК 0010(01) с дополнительным блоком ОЗУ 32Кб 4 – БК 0010(01) с контроллером НГМД и блоком ДОЗУ 16К 5 – БК 11М |
};
Далее следуют тегов для конкретной конфигурации.
Формат тега:
struct STATE_BLOCK_HEADER
{
DWORD type; |
- тип тега |
|
DWORD length; |
- длина в файле занимаемая им вместе с заголовком |
};
За тегом сразу следую данные. Теги бывают следующих типов:
Тип |
Коментарий |
Длина |
-1 |
неизвестный блок. Просто пустая болванка, сделан на всякий случай |
6 и более |
0 |
блок памяти основного 64Кбайтного пространства. Вся память с 0 – 200000, то, что в ней находится в текущий момент вместе с системными регистрами |
6 + 64Кб |
1 |
Регистры процессора: R0 – R5, SP, PC, PSW |
6 + 18 |
2 |
Малая копия экрана. См. описание ниже |
|
3 |
Блок расширенной памяти 16К + 8К КНГМД. Располагается с адресов 120000 – 160000 и НГМД с 160000 – 200000 |
6 + 24Кб |
4 |
Страницы расширенной памяти 32К. Располагается с адресов 120000 – 140000 |
6 + 32Кб |
5 |
Страницы расширенной памяти 64К для БК11М. Формат пока не определен. |
Формат тега “Блок памяти основного 64Кбайтного пространства”. Тип 0:
struct STATE_BLOCK_HEADER
{
DWORD type; |
||
DWORD length; |
};
Далее следуют 64Кбайта основной памяти в диапазоне адресов 0 – 200000.
Формат тега “Регистры процессора”. Тип 1:
struct STATE_BLOCK_HEADER
{
DWORD type; |
||
DWORD length; |
};
struct CPU_REGISTERS
{
WORD ro; |
- регистр общего назначения 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 STATE_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К + 8К КНГМД”. Тип 3:
struct STATE_BLOCK_HEADER
{
DWORD type; |
||
DWORD length; |
};
DWORD bBasic - флаг включено ли ПЗУ (0 – нет, 1 – да)
Далее следуют 24Кбайта памяти при установленном флаге bBasic в 1 (обычно ПЗУ 24К бейсика)
Далее следуют 24Кбайта памяти при установленном флаге bBasic в 0 (обычно ДОЗУ 16К + ПЗУ НГМД 8К)
Формат тега “Страницы расширенной памяти 32К”. Тип 4
struct STATE_BLOCK_HEADER
{
DWORD type; |
||
DWORD length; |
};
DWORD nPage - номер подключенной страницы 0 – 3
Далее следуют 32Кбайта дополнительной памяти
Последовательности тегов для конфигураций создаваемых эмулятором версии 2.6. Хоте порядок тегов может быть произвольной, в реальных файлах MSF теги идут именно так:
1 – БК 0010(01) с БЕЙСИКом “Вильнюс 1986”
Тип |
Название |
Hdr |
Заголовочный тег |
2 |
Preview |
1 |
Регистры процессора |
0 |
Основная память 64К |
2 – БК 0010(01) с блоком МСТД
Тип |
Название |
Hdr |
Заголовочный тег |
2 |
Preview |
1 |
Регистры процессора |
0 |
Основная память 64К |
3 – БК 0010(01) с дополнительным блоком ОЗУ 32Кб
Тип |
Название |
Hdr |
Заголовочный тег |
2 |
Preview |
1 |
Регистры процессора |
0 |
Основная память 64К |
4 |
Страницы расширенной памяти 32К |
4 – БК 0010(01) с контроллером НГМД и блоком ДОЗУ 16К
Тип |
Название |
Hdr |
Заголовочный тег |
2 |
Preview |
1 |
Регистры процессора |
0 |
Основная память 64К |
3 |
Блок расширенной памяти 16К + 8К КНГМД |