Есть такой Mem_M68k.asm, это карта памяти для 68к. Там прописаны процедуры чтения и записи b/w/l по блокам в 512 кб. Не знаю, почему выбран именно такой размер блока, но подозреваю, что потому, что старые версии VC++ (по 2003-й, а генс написан в 98-м) не работали с массивами больше 512 кб.
В частности, для RAM рассмотрим пример
dd M68K_Read_Byte_Ram, ; 0xE00000 - 0xE7FFFF
...
ALIGN32
M68K_Read_Byte_Ram:
and ebx, 0xFFFF
xor ebx, 1
mov al, [Ram_68k + ebx]
pop ebx
ret
Видно, что ebx усекается до окна в 64 кб. Xor нужен для работы с чётным адресом, правда, я не понял, как это работает, ведь в al всегда будет заноситься значение из чётного адреса.... Посмотрим для процедур, где нет усечения:
dd M68K_Read_Byte_RomB, ; 0x580000 - 0x5FFFFF
M68K_Read_Byte_RomB:
and ebx, 0x7FFFF
xor ebx, 0x580001
mov al, [Rom_Data + ebx]
pop ebx
ret
dd M68K_Read_Byte_Rom0, ; 0x000000 - 0x07FFFF
M68K_Read_Byte_Rom0:
and ebx, 0x7FFFF
xor ebx, 1
mov al, [Rom_Data + ebx]
pop ebx
ret
dd M68K_Read_Byte_Rom1, ; 0x080000 - 0x0FFFFF
M68K_Read_Byte_Rom1:
and ebx, 0x7FFFF
xor ebx, 0x080001
mov al, [Rom_Data + ebx]
pop ebx
ret
С and всё понятно - это усечение до размера блока в 512 кб. Для чего нужен xor - с нулевым битом (единичка в конце) и так ясно (чётный адрес), плюс по адресам блоков становится понятно, что xor убирает или наоборот ставит биты, отвечающие за старшие биты блока (т.е. сам блок, грубо говоря). Т.к. Rom_Data не меняется и, видимо, ссылается на начало блока РОМ:
DECL Rom_Data
resb 6 * 1024 * 1024 ; 6 мегабайт
то ebx содержит относительный адрес для 512 кб блока. А xor делает его абсолютным.
Короче, чтобы сделать память на 2 мб, надо поменять здесь
DECL Ram_68k
resb 64 * 1024 ; 64 кб
и во всех процедурах работы с Ram (пример в самом начале) вместо окна 0xFFFF вписать 0x7FFFF.
Я думаю, это всё. Как это повлияет на сейвы - не знаю, может, в сейвере прописан свой размер памяти.
Некоторые игры используют именно банк E00000, но только его, т.е. фишка с зеркалированием памяти им не грозит.
Вообще, вы всегда можете поговорить с авторами эмулей, они тоже люди. Вон в Gens32 сделали поддержку 13-метрового рома... каким-то образом.