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; }
static INT32 drvFrame() { INT32 nInterleave = 8; if (drvReset) { // Reset machine //HACK wait_control=60; glob_framecpt=0; glob_replay_last_dx16=glob_replay_last_dy16=0; glob_replay_last_fingerOn=0; // drvDoReset(); } if (glob_replay_mode==REPLAY_PLAYBACK_MODE) { //REPLAY unsigned int next_frame_event; next_frame_event=(unsigned int)(glob_replay_data_stream[glob_replay_data_index])|((unsigned int)(glob_replay_data_stream[glob_replay_data_index+1])<<8) |((unsigned int)(glob_replay_data_stream[glob_replay_data_index+2])<<16)|((unsigned int)(glob_replay_data_stream[glob_replay_data_index+3])<<24); if (glob_framecpt==next_frame_event) { glob_replay_data_index+=4; glob_replay_flag=glob_replay_data_stream[glob_replay_data_index++]; if (glob_replay_flag&REPLAY_FLAG_TOUCHONOFF) { glob_replay_last_fingerOn^=1; } if (glob_replay_flag&REPLAY_FLAG_POSX) { glob_replay_last_dx16=(unsigned int)(glob_replay_data_stream[glob_replay_data_index])|((unsigned int)(glob_replay_data_stream[glob_replay_data_index+1])<<8); glob_replay_data_index+=2; } if (glob_replay_flag&REPLAY_FLAG_POSY) { glob_replay_last_dy16=(unsigned int)(glob_replay_data_stream[glob_replay_data_index])|((unsigned int)(glob_replay_data_stream[glob_replay_data_index+1])<<8); glob_replay_data_index+=2; } if (glob_replay_flag&REPLAY_FLAG_IN0) { last_DrvInput[0]=(unsigned int)(glob_replay_data_stream[glob_replay_data_index]); glob_replay_data_index++; } if (glob_replay_flag&REPLAY_FLAG_IN1) { last_DrvInput[1]=(unsigned int)(glob_replay_data_stream[glob_replay_data_index]); glob_replay_data_index++; } if (glob_replay_flag&REPLAY_FLAG_IN2) { last_DrvInput[2]=(unsigned int)(glob_replay_data_stream[glob_replay_data_index]); glob_replay_data_index++; } } drvInput[0]=last_DrvInput[0]; drvInput[1]=last_DrvInput[1]; drvInput[2]=last_DrvInput[2]; } else { // Compile digital inputs drvInput[0] = 0x00; // Buttons drvInput[1] = 0x00; // Player 1 drvInput[2] = 0x00; // Player 2 for (INT32 i = 0; i < 8; i++) { drvInput[0] |= (drvJoy1[i] & 1) << i; drvInput[1] |= (drvJoy2[i] & 1) << i; drvInput[2] |= (drvButton[i] & 1) << i; } //HACK if (glob_ffingeron&&virtual_stick_on) { if (glob_mov_y>0) drvInput[0]|=1; if (glob_mov_y<0) drvInput[0]|=2; if (glob_mov_x<0) drvInput[0]|=4; if (glob_mov_x>0) drvInput[0]|=8; if (cur_ifba_conf->vpad_followfinger_firemode==0) { drvInput[0]&=~((1<<4)); //clear fire 1 if (glob_shooton) { switch (glob_shootmode) { case 0: //shoot if ((glob_autofirecpt%10)==0) drvInput[0]|=1<<4; glob_autofirecpt++; break; case 1: //laser drvInput[0]|=1<<4; break; } } } } // ToaClearOpposites(&drvInput[0]); ToaClearOpposites(&drvInput[1]); //HACK //replay data - drvinputs if ((glob_replay_mode==REPLAY_RECORD_MODE)&&(glob_replay_data_index<MAX_REPLAY_DATA_BYTES-MAX_REPLAY_FRAME_SIZE)) {//SAVE REPLAY glob_replay_flag=0; if (glob_framecpt==0) {//first frame //STORE FRAME_INDEX (0) glob_replay_data_stream[glob_replay_data_index++]=glob_framecpt&0xFF; //frame index glob_replay_data_stream[glob_replay_data_index++]=(glob_framecpt>>8)&0xFF; //frame index glob_replay_data_stream[glob_replay_data_index++]=(glob_framecpt>>16)&0xFF; //frame index glob_replay_data_stream[glob_replay_data_index++]=(glob_framecpt>>24)&0xFF; //frame index //STORE FLAG (00001100b) glob_replay_data_stream[glob_replay_data_index++]=REPLAY_FLAG_IN0|REPLAY_FLAG_IN1|REPLAY_FLAG_IN2; //STORE INPUTS glob_replay_data_stream[glob_replay_data_index++]=drvInput[0]; glob_replay_data_stream[glob_replay_data_index++]=drvInput[1]; glob_replay_data_stream[glob_replay_data_index++]=drvInput[2]; last_DrvInput[0]=drvInput[0]; last_DrvInput[1]=drvInput[1]; last_DrvInput[2]=drvInput[2]; } else { if (last_DrvInput[0]!=drvInput[0]) {
int twinhawkFrame() { if (drvReset) { // Reset machine drvDoReset(); } twinhawkInpMake(); int nInterleave =10; SekNewFrame(); SekOpen(0); ZetOpen(0); nCyclesTotal[0] = 8000000/60; nCyclesTotal[1] = 4000000/60; rCyclesDone[0] = rCyclesDone[1] = 0; int nSoundBufferPos = 0; for (int i = 0; i < nInterleave; i++) { int nCurrentCPU; int nNext; // Run 68000 nCurrentCPU = 0; nNext = (i + 1) * nCyclesTotal[nCurrentCPU] / nInterleave; nCyclesSegment = nNext - rCyclesDone[nCurrentCPU]; rCyclesDone[nCurrentCPU] += SekRun(nCyclesSegment); // Run Z80 nCurrentCPU = 1; nNext = (i + 1) * nCyclesTotal[nCurrentCPU] / nInterleave; nCyclesSegment = nNext - rCyclesDone[nCurrentCPU]; nCyclesSegment = ZetRun(nCyclesSegment); rCyclesDone[nCurrentCPU] += nCyclesSegment; { // Render sound segment if (pBurnSoundOut) { int nSegmentLength = nBurnSoundLen / nInterleave; short* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); BurnYM2151Render(pSoundBuf, nSegmentLength); nSoundBufferPos += nSegmentLength; } } } { // Make sure the buffer is entirely filled. if (pBurnSoundOut) { int nSegmentLength = nBurnSoundLen - nSoundBufferPos; short* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); if (nSegmentLength) { BurnYM2151Render(pSoundBuf, nSegmentLength); } } } SekSetIRQLine(2, SEK_IRQSTATUS_AUTO); ZetClose(); SekClose(); if (pBurnDraw) { twinhawkDraw(); // Draw screen if needed } return 0; }
int twinhawkInit() { int nRet=0; int nLen=0; //--------------Allocate Memory----------------- Mem=NULL; MemIndex(); nLen=MemEnd-(unsigned char *)0; Mem=(unsigned char *)malloc(nLen); if (Mem==NULL) return 1; memset(Mem,0,nLen); // blank all memory MemIndex(); // Index the allocated memory //--------------- Load Roms ------------------- nRet=LoadRoms(); if (nRet!=0) return 1; // Load the roms into memory // Map in memory: // ----------------- Cpu 1 68k ------------------------ SekInit(0, 0x68000); // Allocate 1 68000 SekOpen(0); SekMapMemory( Rom ,0x000000,0x3ffff,SM_ROM); // 68000 Rom SekMapMemory(twinhawk_src_pal,0xb00000,0xb00FFF,SM_RAM); SekMapMemory(sysbvidattr,0xd00000,0xd00fff,SM_RAM); SekMapMemory(sysbvidram,0xe00000,0xe03fff,SM_RAM); SekMapMemory(twinhawk_ram,0xf00000,0xf03fff,SM_RAM); SekSetReadWordHandler(0, twinhawkReadWord); SekSetWriteWordHandler(0, twinhawkWriteWord); SekSetReadByteHandler(0, twinhawkReadByte); SekSetWriteByteHandler(0, twinhawkWriteByte); SekClose(); // ------------------------------------------------ // ----------------- Cpu 2 Z80 ------------------------ ZetInit(1); ZetOpen(0); ZetSetReadHandler(twinhawkZ80Read); ZetSetWriteHandler(twinhawkZ80Write); ZetMapArea (0x0000,0x3FFF,0,z80_rom); ZetMapArea (0x0000,0x3FFF,2,z80_rom); // ZetMapArea (0x4000,0x7FFF,0,z80_rom+0x4000); // ZetMapArea (0x4000,0x7FFF,2,z80_rom+0x4000); ZetMapArea (0xc000,0xdfff,0,z80_ram); ZetMapArea (0xc000,0xdfff,2,z80_ram); ZetMapArea (0xc000,0xdfff,1,z80_ram); ZetMemEnd(); ZetMemCallback(0xe000, 0xFFFF, 0); // Read ZetMemCallback(0xe000, 0xFFFF, 1); // Write ZetReset(); ZetClose(); //------------------------------------------------- //-------- sound stuff ---------------------------- //---------- YM2151 Setup ---------------------- BurnYM2151Init(4000000, 50.0); BurnYM2151SetIrqHandler(&twinhawkYM2151IRQHandler); nCurrentBank=-1; //-------------------------------------------------- // ------- GFX Init ------------------- taito_pal=twinhawk_pal; SysXInit(0); drvDoReset(); return 0; }
static int drvFrame() { int nInterleave = 8; if (drvReset) { // Reset machine drvDoReset(); } // Compile digital inputs drvInput[0] = 0x00; // Buttons drvInput[1] = 0x00; // Player 1 drvInput[2] = 0x00; // Player 2 for (int i = 0; i < 8; i++) { drvInput[0] |= (drvJoy1[i] & 1) << i; drvInput[1] |= (drvJoy2[i] & 1) << i; drvInput[2] |= (drvButton[i] & 1) << i; } DrvClearOpposites(&drvInput[0]); DrvClearOpposites(&drvInput[1]); SekNewFrame(); nCyclesTotal[0] = (int)((long long)16000000 * nBurnCPUSpeedAdjust / (0x0100 * 60)); nCyclesTotal[1] = TOA_Z80_SPEED / 60; nCyclesDone[0] = nCyclesDone[1] = 0; SekSetCyclesScanline(nCyclesTotal[0] / 262); nToaCyclesDisplayStart = nCyclesTotal[0] - ((nCyclesTotal[0] * (TOA_VBLANK_LINES + 240)) / 262); nToaCyclesVBlankStart = nCyclesTotal[0] - ((nCyclesTotal[0] * TOA_VBLANK_LINES) / 262); bVBlank = false; int nSoundBufferPos = 0; SekOpen(0); for (int i = 1; i <= nInterleave; i++) { int nCurrentCPU; int nNext; // Run 68000 nCurrentCPU = 0; nNext = i * nCyclesTotal[nCurrentCPU] / nInterleave; // Trigger VBlank interrupt if (!bVBlank && nNext > nToaCyclesVBlankStart) { if (nCyclesDone[nCurrentCPU] < nToaCyclesVBlankStart) { nCyclesSegment = nToaCyclesVBlankStart - nCyclesDone[nCurrentCPU]; if (!CheckSleep(nCurrentCPU)) { nCyclesDone[nCurrentCPU] += SekRun(nCyclesSegment); } else { nCyclesDone[nCurrentCPU] += SekIdle(nCyclesSegment); } } ToaBufferGP9001Sprites(); if (pBurnDraw) { // Draw screen if needed drvDraw(); } nIRQPending = 1; SekSetIRQLine(2, SEK_IRQSTATUS_ACK); bVBlank = true; } nCyclesSegment = nNext - nCyclesDone[nCurrentCPU]; if (!CheckSleep(nCurrentCPU)) { // See if this CPU is busywaiting nCyclesDone[nCurrentCPU] += SekRun(nCyclesSegment); } else { nCyclesDone[nCurrentCPU] += SekIdle(nCyclesSegment); } if ((i & 1) == 0) { // Run Z80 nCurrentCPU = 1; nNext = i * nCyclesTotal[nCurrentCPU] / nInterleave; nCyclesSegment = nNext - nCyclesDone[nCurrentCPU]; nCyclesDone[nCurrentCPU] += ZetRun(nCyclesSegment); // Render sound segment if (pBurnSoundOut) { int nSegmentLength = (nBurnSoundLen * i / nInterleave) - nSoundBufferPos; short* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); BurnYM2151Render(pSoundBuf, nSegmentLength); MSM6295Render(0, pSoundBuf, nSegmentLength); MSM6295Render(1, pSoundBuf, nSegmentLength); nSoundBufferPos += nSegmentLength; } } } SekClose(); { // Make sure the buffer is entirely filled. if (pBurnSoundOut) { int nSegmentLength = nBurnSoundLen - nSoundBufferPos; short* pSoundBuf = pBurnSoundOut + (nSoundBufferPos << 1); if (nSegmentLength) { BurnYM2151Render(pSoundBuf, nSegmentLength); MSM6295Render(0, pSoundBuf, nSegmentLength); MSM6295Render(1, pSoundBuf, nSegmentLength); } } } return 0; }
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; }
int rastanInit() { int nRet=0; int nLen=0; //--------------Allocate Memory----------------- Mem=NULL; MemIndex(); nLen=MemEnd-(unsigned char *)0; Mem=(unsigned char *)malloc(nLen); if (Mem==NULL) return 1; memset(Mem,0,nLen); // blank all memory MemIndex(); // Index the allocated memory //--------------- Load Roms ------------------- nRet=LoadRoms(); if (nRet!=0) return 1; // Load the roms into memory taito_pal=rastan_pal; init_taito_gfx(); // Map in memory: // ----------------- Cpu 1 ------------------------ SekInit(0, 0x68000); // Allocate 1 68000 SekOpen(0); SekMapMemory( Rom ,0x000000,0x05ffff,SM_ROM); // 68000 Rom SekMapMemory(rastan_ram,0x10c000,0x10ffff,SM_RAM); //0x4000 SekMapMemory(rastan_src_pal,0x200000,0x200fff,SM_RAM); SekMapMemory(rastan_ram+0x4000,0x350008,0x350010,SM_RAM); SekMapMemory(PC090OJ_spritectrl,0x380000,0x380003,SM_RAM); SekMapMemory(rastan_ram+0x4012,0x3c0000,0x3c0003,SM_WRITE); SekMapMemory(PC080SN_word_0,0xc00000,0xc0ffff,SM_RAM); SekMapMemory(PC080SN_ctrl_word_0,0xc50000,0xc50003,SM_WRITE); SekMapMemory(PC090OJ_word_0,0xd00000,0xd03fff,SM_RAM); SekSetReadWordHandler(0, rastanReadWord); SekSetWriteWordHandler(0, rastanWriteWord); SekSetReadByteHandler(0, rastanReadByte); SekSetWriteByteHandler(0, rastanWriteByte); // ------------------------------------------------ SekClose(); ZetInit(1); ZetOpen(0); ZetSetReadHandler(RastanZ80Read); ZetSetWriteHandler(RastanZ80Write); ZetMapArea (0x0000,0x3FFF,0,z80_rom); ZetMapArea (0x0000,0x3FFF,2,z80_rom); ZetMapArea (0x4000,0x7FFF,0,z80_rom+0x4000); ZetMapArea (0x4000,0x7FFF,2,z80_rom+0x4000); ZetMapArea (0x8000,0x8FFF,0,z80_ram); ZetMapArea (0x8000,0x8FFF,1,z80_ram); ZetMemEnd(); ZetMemCallback(0x9000, 0xa001, 0); // Read ZetMemCallback(0x9000, 0xa001, 1); // Write ZetReset(); ZetClose(); //------------------------------------------------- BurnYM2151Init(4000000, 50.0); BurnYM2151SetIrqHandler(&RastanYM2151IRQHandler); BurnYM2151SetPortHandler(&rastanBankSwitch); nCurrentBank=0; // bank number 0 or 1 MSM5205Init(0,8000, 60,1); drvDoReset(); return 0; }