static void reset(RomMapperObsonet* rm) { rm->regBank = 0; rm->romMapper = 0; amdFlashReset(rm->amdFlash); rtl8019Reset(rm->rtl8019); rm->flashPage = amdFlashGetPage(rm->amdFlash, rm->romMapper * 0x4000); slotMapPage(rm->slot, rm->sslot, rm->startPage + 0, rm->flashPage, 1, 0); }
static void updateMapper(RomMapperNoWind* rm, UInt8 page) { rm->romMapper = page & 0x1f; rm->flashPage = amdFlashGetPage(rm->amdFlash, rm->romMapper * 0x4000); slotMapPage(rm->slot, rm->sslot, rm->startPage + 0, NULL, 0, 0); slotMapPage(rm->slot, rm->sslot, rm->startPage + 1, NULL, 0, 0); slotMapPage(rm->slot, rm->sslot, rm->startPage + 2, rm->flashPage, 1, 0); slotMapPage(rm->slot, rm->sslot, rm->startPage + 3, rm->flashPage + 0x2000, 1, 0); slotMapPage(rm->slot, rm->sslot, rm->startPage + 4, NULL, 0, 0); slotMapPage(rm->slot, rm->sslot, rm->startPage + 5, rm->flashPage + 0x2000, 1, 0); }
static void loadState(RomMapperObsonet* rm) { SaveState* state = saveStateOpenForRead("mapperObsonet"); rm->romMapper = (UInt8)saveStateGet(state, "romMapper", 0); rm->regBank = (UInt8)saveStateGet(state, "regBank", 0); saveStateClose(state); amdFlashLoadState(rm->amdFlash); rtl8019LoadState(rm->rtl8019); rm->flashPage = amdFlashGetPage(rm->amdFlash, rm->romMapper * 0x4000); slotMapPage(rm->slot, rm->sslot, rm->startPage + 0, rm->flashPage, 1, 0); }
static void mapPage(RomMapperMegaFlashRomScc* rm, int bank, int page) { int readEnable; UInt8* bankData; rm->romMapper[bank] = page & (rm->size / 0x2000 - 1); rm->flashPage[bank] = page; if (rm->flashPage[bank] < 0) { bankData = rm->romData + page * 0x2000; } else { bankData = amdFlashGetPage(rm->flash, rm->flashPage[bank] * 0x2000); } readEnable = (bank == 2 && rm->sccEnable) || rm->flashPage[bank] >= 0 ? 0 : 1; slotMapPage(rm->slot, rm->sslot, rm->startPage + bank, bankData, readEnable, 0); }
static void write(RomMapperObsonet* rm, UInt16 address, UInt8 value) { if ((address & 0x3fe0) == 0x3fe0) { if (rm->regBank < 3) { // printf("W %d: %.4x %.2x\n", rm->regBank, address & 0x1f, value); } switch (address & 0x1f) { case 0: rm->regBank = value >> 6; break; case 2: if (rm->regBank == 3) { rm->romMapper = value & 0x1f; rm->flashPage = amdFlashGetPage(rm->amdFlash, rm->romMapper * 0x4000); slotMapPage(rm->slot, rm->sslot, rm->startPage + 0, rm->flashPage, 1, 0); } break; } rtl8019Write(rm->rtl8019, address & 0x1f, value); } else if (address < 0x4000) {