static INT32 drvDoReset() { // Insert region code into 68K ROM, code by BisonSAS UINT8 nRegion = drvRegion & 0x1F; if (nRegion<=25) { Rom01[0x00000^1]=(UINT8)(nRegion<<13) | (drvRegion & 0x1F); } SekOpen(0); nIRQPending = 0; SekSetIRQLine(0, SEK_IRQSTATUS_NONE); Map68KTextROM(true); SekReset(); SekClose(); ZetOpen(0); ZetReset(); ZetClose(); MSM6295Reset(0); MSM6295Reset(1); BurnYM2151Reset(); return 0; }
// Scan ram static INT32 drvScan(INT32 nAction, INT32* pnMin) { struct BurnArea ba; if (pnMin) { // Return minimum compatible version *pnMin = 0x029496; } if (nAction & ACB_VOLATILE) { // Scan volatile ram memset(&ba, 0, sizeof(ba)); ba.Data = RamStart; ba.nLen = RamEnd - RamStart; ba.szName = "RAM"; BurnAcb(&ba); SekScan(nAction); // Scan 68000 ZetScan(nAction); // Scan Z80 SCAN_VAR(nCurrentBank); MSM6295Scan(0, nAction); MSM6295Scan(1, nAction); BurnYM2151Scan(nAction); ToaScanGP9001(nAction, pnMin); SCAN_VAR(nIRQPending); SCAN_VAR(nTextROMStatus); SCAN_VAR(drvInput); if (nAction & ACB_WRITE) { INT32 n = nTextROMStatus; nTextROMStatus = -1; SekOpen(0); Map68KTextROM(n); SekClose(); n = nCurrentBank; nCurrentBank = -1; ZetOpen(0); drvZ80Bankswitch(n); ZetClose(); } } return 0; }
static INT32 drvInit() { INT32 nLen; #ifdef DRIVER_ROTATION bToaRotateScreen = true; #endif nGP9001ROMSize[0] = 0x01000000; // Find out how much memory is needed Mem = NULL; MemIndex(); nLen = MemEnd - (UINT8*)0; if ((Mem = (UINT8*)BurnMalloc(nLen)) == NULL) { return 1; } memset(Mem, 0, nLen); // Zero memory MemIndex(); // Index the allocated memory if (LoadRoms()) { return 1; } { SekInit(0, 0x68000); // Allocate 68000 SekOpen(0); // Map 68000 memory: SekMapMemory(Rom01, 0x000000, 0x1FFFFF, SM_ROM); // CPU 0 ROM SekMapMemory(Ram02, 0x208000, 0x20FFFF, SM_RAM); Map68KTextROM(true); SekSetReadWordHandler(0, batriderReadWord); SekSetReadByteHandler(0, batriderReadByte); SekSetWriteWordHandler(0, batriderWriteWord); SekSetWriteByteHandler(0, batriderWriteByte); SekMapHandler(1, 0x400000, 0x400400, SM_RAM); // GP9001 addresses SekSetReadWordHandler(1, batriderReadWordGP9001); SekSetWriteWordHandler(1, batriderWriteWordGP9001); SekMapHandler(2, 0x300000, 0x37FFFF, SM_ROM); // Z80 ROM SekSetReadByteHandler(2, batriderReadByteZ80ROM); SekSetReadWordHandler(2, batriderReadWordZ80ROM); SekClose(); } nSpriteYOffset = 0x0001; nLayer0XOffset = -0x01D6; nLayer1XOffset = -0x01D8; nLayer2XOffset = -0x01DA; ToaInitGP9001(); nExtraTXOffset = 0x2C; ToaExtraTextInit(); drvZInit(); // Initialize Z80 BurnYM2151Init(32000000 / 8); BurnYM2151SetAllRoutes(1.00, BURN_SND_ROUTE_BOTH); MSM6295Init(0, 32000000 / 10 / 132, 1); MSM6295Init(1, 32000000 / 10 / 165, 1); MSM6295SetRoute(0, 1.00, BURN_SND_ROUTE_BOTH); MSM6295SetRoute(1, 1.00, BURN_SND_ROUTE_BOTH); nToaPalLen = nColCount; ToaPalSrc = RamPal; ToaPalInit(); nTextROMStatus = -1; bDrawScreen = true; drvDoReset(); // Reset machine return 0; }
void __fastcall batriderWriteWord(UINT32 sekAddress, UINT16 wordValue) { switch (sekAddress) { case 0x500020: { RamShared[0] = wordValue; // The 68K program normally writes 0x500020/0x500022 as a single longword, // except during the communications test. if (wordValue == 0x55) { ZetNmi(); nCyclesDone[1] += ZetRun(0x1800); } break; } case 0x500022: RamShared[1] = wordValue; // Sound commands are processed by the Z80 using an NMI // So, trigger a Z80 NMI and execute it ZetNmi(); nCyclesDone[1] += ZetRun(0x1800); break; case 0x500024: // Writes to this address only occur in situations where the program sets // 0x20FA19 (Ram02[0x7A18]) to 0xFF, and then sits in a loop waiting for it to become 0x00 // Interrupt 4 does this (the same code is also conditionally called from interrupt 2) nIRQPending = 1; SekSetIRQLine(4, SEK_IRQSTATUS_ACK); break; case 0x500060: // Bit 0 of the value written to this location must be echod at 0x50000C nData = wordValue; break; case 0x500080: Map68KTextROM(false); break; case 0x500082: // Acknowledge interrupt SekSetIRQLine(0, SEK_IRQSTATUS_NONE); nIRQPending = 0; break; case 0x5000C0: case 0x5000C1: case 0x5000C2: case 0x5000C3: case 0x5000C4: case 0x5000C5: case 0x5000C6: case 0x5000C7: case 0x5000C8: case 0x5000C9: case 0x5000CA: case 0x5000CB: case 0x5000CC: case 0x5000CD: case 0x5000CE: GP9001TileBank[(sekAddress & 0x0F) >> 1] = ((wordValue & 0x0F) << 15); break; // default: // printf("Attempt to write %06X (word) -> %04X.\n", sekAddress, wordValue); } }
static int drvInit() { int nLen; #ifdef DRIVER_ROTATION bToaRotateScreen = true; #endif nGP9001ROMSize[0] = 0x01000000; // Find out how much memory is needed Mem = NULL; MemIndex(); nLen = MemEnd - (unsigned char*)0; if ((Mem = (unsigned char*)malloc(nLen)) == NULL) { return 1; } memset(Mem, 0, nLen); // Zero memory MemIndex(); // Index the allocated memory if (LoadRoms()) { return 1; } { SekInit(0, 0x68000); // Allocate 68000 SekOpen(0); // Map 68000 memory: SekMapMemory(Rom01, 0x000000, 0x1FFFFF, SM_ROM); // CPU 0 ROM SekMapMemory(Ram02, 0x208000, 0x20FFFF, SM_RAM); Map68KTextROM(true); SekSetReadWordHandler(0, batriderReadWord); SekSetReadByteHandler(0, batriderReadByte); SekSetWriteWordHandler(0, batriderWriteWord); SekSetWriteByteHandler(0, batriderWriteByte); SekMapHandler(1, 0x400000, 0x400400, SM_RAM); // GP9001 addresses SekSetReadWordHandler(1, batriderReadWordGP9001); SekSetWriteWordHandler(1, batriderWriteWordGP9001); SekMapHandler(2, 0x300000, 0x37FFFF, SM_ROM); // Z80 ROM SekSetReadByteHandler(2, batriderReadByteZ80ROM); SekSetReadWordHandler(2, batriderReadWordZ80ROM); SekClose(); } nSpriteYOffset = 0x0001; nLayer0XOffset = -0x01D6; nLayer1XOffset = -0x01D8; nLayer2XOffset = -0x01DA; ToaInitGP9001(); nExtraTXOffset = 0x2C; ToaExtraTextInit(); drvZInit(); // Initialize Z80 BurnYM2151Init(32000000 / 8, 50.0); MSM6295Init(0, 32000000 / 10 / 132, 50.0, 1); MSM6295Init(1, 32000000 / 10 / 165, 50.0, 1); nToaPalLen = nColCount; ToaPalSrc = RamPal; ToaPalInit(); nTextROMStatus = -1; bDrawScreen = true; #if defined FBA_DEBUG && defined USE_SPEEDHACKS bprintf(PRINT_IMPORTANT, _T(" * Using speed-hacks (detecting idle loops).\n")); #endif drvDoReset(); // Reset machine return 0; }