По-моему, разгадка кроется в файле star.c, который в папке starscream. Там есть функции чтения/записи байт, слов и двойных слов. Например, вот эта: static void gen_readbw(int size)
{
align(32);
emit("readmemory%s:\n",sizename[size]);
emit("readmemorydec%s:\n",sizename[size]);
if (size == 1)
{
emit("\tmov [__access_address], edx\n");
emit("\tand edx, 0xFFFFFF\n");
emit("\txor ecx, ecx\n");
emit("\tcmp edx, 0xE00000\n");
emit("\tjb short .Not_In_Ram\n");
emit("\tand edx, 0xFFFF\n");
emit("\txor edx, byte 1\n");
emit("\tmov cl, [Ram_68k + edx]\n");
emit("\tmov edx, [__access_address]\n");
emit("\tret\n");
emit("align 4\n");
emit(".Not_In_Ram\n");
emit("\tpush eax\n");
emit("\tpush edx\n");
emit("\tmov [__io_cycle_counter], edi\n");
emit("\tmov [__io_fetchbase], ebp\n");
emit("\tmov [__io_fetchbased_pc], esi\n");
emit("\tcall M68K_RB\n");
// emit("\tmov eax, [esp]\n");
// emit("\tpush ebx\n");
// emit("\tmov ebx, eax\n");
// emit("\tand eax, 0xF80000\n");
// emit("\tshr eax, 17\n");
// emit("\tand ebx, 0xFFFFFF\n");
// emit("\tcall [M68K_Read_Byte_Table + eax]\n");
emit("\tmov ebp, [__io_fetchbase]\n");
emit("\tmov cl, al\n");
emit("\tmov edi, [__io_cycle_counter]\n");
emit("\tadd esp, byte 4\n");
emit("\tmov esi, [__io_fetchbased_pc]\n");
emit("\tmov edx, [__access_address]\n");
emit("\tpop eax\n");
emit("\tret\n");
}
if (size == 2)
{
emit("\tmov [__access_address], edx\n");
emit("\tand edx, 0xFFFFFF\n");
emit("\txor ecx, ecx\n");
emit("\tcmp edx, 0xE00000\n");
emit("\tjb short .Not_In_Ram\n");
emit("\tand edx, 0xFFFF\n");
emit("\tmov cx, [Ram_68k + edx]\n");
emit("\tmov edx,[__access_address]\n");
emit("\tret\n");
emit("align 4\n");
emit(".Not_In_Ram\n");
emit("\tpush eax\n");
emit("\tpush edx\n");
emit("\tmov [__io_cycle_counter], edi\n");
emit("\tmov [__io_fetchbase], ebp\n");
emit("\tmov [__io_fetchbased_pc], esi\n");
emit("\tcall M68K_RW\n");
emit("\tmov edi, [__io_cycle_counter]\n");
emit("\tadd esp, byte 4\n");
emit("\tmov ebp, [__io_fetchbase]\n");
emit("\tmov cx, ax\n");
emit("\tmov esi, [__io_fetchbased_pc]\n");
emit("\tmov edx, [__access_address]\n");
emit("\tpop eax\n");
emit("\tret\n");
}
}
как я понял, читает байт или слово (в зависимости от size). Обратите внимание, там идет проверка адреса, если он меньше 0xE00000, то происходит переход на метку not_in_ram и используются функции M68K_RB, M68K_RW,
a если больше или равно, то адрес берется по маске 0xFFFF и просто читается из массива Ram_68k emit("\tand edx, 0xFFFF\n");
emit("\tmov cx, [Ram_68k + edx]\n");
. Из-за маски 0xFFFF сколько бы мы не увеличивали память, она все равно будет читаться/записываться в первы 64 кб. Ну, естественно, нужно будет сделать изменения в файле CPU_68K.c.