📄 cabal.c
字号:
if(!load_rom("cabal_01.bin",&RAM[0x30000],0x10000)) return; // SPR GFX if(!load_rom("cabal_02.bin",&RAM[0x20000],0x10000)) return; // SPR GFX if(!load_rom("cabal_03.bin",&RAM[0x10000],0x10000)) return; // SPR GFX if(!load_rom("cabal_04.bin",&RAM[0x00000],0x10000)) return; // SPR GFX if(!load_rom("cabal_08.bin",&RAM[0x70000],0x10000)) return; // SPR GFX if(!load_rom("cabal_07.bin",&RAM[0x60000],0x10000)) return; // SPR GFX if(!load_rom("cabal_06.bin",&RAM[0x50000],0x10000)) return; // SPR GFX if(!load_rom("cabal_05.bin",&RAM[0x40000],0x10000)) return; // SPR GFX tb=0x10000; for(ta=0;ta<0x40000;ta++){ tc=RAM[ta]; GFX[tb+3]=((tc&0x80)>>7)<<1; GFX[tb+2]=((tc&0x40)>>6)<<1; GFX[tb+1]=((tc&0x20)>>5)<<1; GFX[tb+0]=((tc&0x10)>>4)<<1; GFX[tb+3]|=((tc&0x08)>>3)<<0; GFX[tb+2]|=((tc&0x04)>>2)<<0; GFX[tb+1]|=((tc&0x02)>>1)<<0; GFX[tb+0]|=((tc&0x01)>>0)<<0; tc=RAM[ta+0x40000]; GFX[tb+3]|=((tc&0x80)>>7)<<3; GFX[tb+2]|=((tc&0x40)>>6)<<3; GFX[tb+1]|=((tc&0x20)>>5)<<3; GFX[tb+0]|=((tc&0x10)>>4)<<3; GFX[tb+3]|=((tc&0x08)>>3)<<2; GFX[tb+2]|=((tc&0x04)>>2)<<2; GFX[tb+1]|=((tc&0x02)>>1)<<2; GFX[tb+0]|=((tc&0x01)>>0)<<2; tb+=4; } if(!load_rom("cabal_12.bin",&RAM[0x20000],0x10000)) return; // BG0 GFX if(!load_rom("cabal_13.bin",&RAM[0x30000],0x10000)) return; // BG0 GFX if(!load_rom("cabal_14.bin",&RAM[0x10000],0x10000)) return; // BG0 GFX if(!load_rom("cabal_15.bin",&RAM[0x00000],0x10000)) return; // BG0 GFX if(!load_rom("cabal_18.bin",&RAM[0x60000],0x10000)) return; // BG0 GFX if(!load_rom("cabal_19.bin",&RAM[0x70000],0x10000)) return; // BG0 GFX if(!load_rom("cabal_16.bin",&RAM[0x50000],0x10000)) return; // BG0 GFX if(!load_rom("cabal_17.bin",&RAM[0x40000],0x10000)) return; // BG0 GFX tb=0x110000; for(ta=0;ta<0x40000;ta+=2){ tc=RAM[ta]; GFX[tb+3]=((tc&0x80)>>7)<<1; GFX[tb+2]=((tc&0x40)>>6)<<1; GFX[tb+1]=((tc&0x20)>>5)<<1; GFX[tb+0]=((tc&0x10)>>4)<<1; GFX[tb+3]|=((tc&0x08)>>3)<<0; GFX[tb+2]|=((tc&0x04)>>2)<<0; GFX[tb+1]|=((tc&0x02)>>1)<<0; GFX[tb+0]|=((tc&0x01)>>0)<<0; tc=RAM[ta+0x40000]; GFX[tb+3]|=((tc&0x80)>>7)<<3; GFX[tb+2]|=((tc&0x40)>>6)<<3; GFX[tb+1]|=((tc&0x20)>>5)<<3; GFX[tb+0]|=((tc&0x10)>>4)<<3; GFX[tb+3]|=((tc&0x08)>>3)<<2; GFX[tb+2]|=((tc&0x04)>>2)<<2; GFX[tb+1]|=((tc&0x02)>>1)<<2; GFX[tb+0]|=((tc&0x01)>>0)<<2; tb+=4; tc=RAM[ta+1]; GFX[tb+3]=((tc&0x80)>>7)<<1; GFX[tb+2]=((tc&0x40)>>6)<<1; GFX[tb+1]=((tc&0x20)>>5)<<1; GFX[tb+0]=((tc&0x10)>>4)<<1; GFX[tb+3]|=((tc&0x08)>>3)<<0; GFX[tb+2]|=((tc&0x04)>>2)<<0; GFX[tb+1]|=((tc&0x02)>>1)<<0; GFX[tb+0]|=((tc&0x01)>>0)<<0; tc=RAM[ta+0x40001]; GFX[tb+3]|=((tc&0x80)>>7)<<3; GFX[tb+2]|=((tc&0x40)>>6)<<3; GFX[tb+1]|=((tc&0x20)>>5)<<3; GFX[tb+0]|=((tc&0x10)>>4)<<3; GFX[tb+3]|=((tc&0x08)>>3)<<2; GFX[tb+2]|=((tc&0x04)>>2)<<2; GFX[tb+1]|=((tc&0x02)>>1)<<2; GFX[tb+0]|=((tc&0x01)>>0)<<2; tb+=12; if((tb&0xFF)==0){tb-=0xF8;} else{if((tb&0xFF)==8){tb-=8;}} } for(ta=0;ta<0x210000;ta++){ GFX[ta]^=15; } if(!load_rom("cabal_24.bin", RAM, 0x10000)) return; // MAIN 68000 for(ta=0;ta<0x10000;ta++){ ROM[ta+ta]=RAM[ta]; } if(!load_rom("cabal_22.bin", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+1]=RAM[ta]; } if(!load_rom("cabal_23.bin", RAM, 0x10000)) return; // MAIN 68000 for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0x20000]=RAM[ta]; } if(!load_rom("cabal_21.bin", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0x20001]=RAM[ta]; } /*-------[SOUND SYSTEM INIT]-------*/ Z80ROM=RAM+0x20000; if(!load_rom("cabal_11.bin", Z80ROM, 0x10000)) return; // Z80 SOUND ROM // Apply Speed Patch // ----------------- Z80ROM[0x0120]=0xD3; // OUTA (AAh) Z80ROM[0x0121]=0xAA; // SetStopZ80Mode2(0x0110); // Setup Z80 memory map // -------------------- AddZ80AROMBase(Z80ROM, 0x0038, 0x0066); AddZ80AReadByte(0x0000, 0x27FF, NULL, Z80ROM+0x0000); // Z80 ROM/RAM AddZ80AReadByte(0x400E, 0x400F, YM2151ReadZ80, NULL); // YM2151 I/O AddZ80AReadByte(0x4000, 0x400D, CabalSoundReadZ80, NULL); // 68000 + OTHER I/O AddZ80AReadByte(0x8000, 0xFFFF, NULL, Z80ROM+0x8000); // MORE ROM AddZ80AReadByte(0x0000, 0xFFFF, DefBadReadZ80, NULL); // <bad reads> AddZ80AReadByte(-1, -1, NULL, NULL); AddZ80AWriteByte(0x2000, 0x27FF, NULL, Z80ROM+0x2000); // Z80 RAM AddZ80AWriteByte(0x400E, 0x400F, YM2151WriteZ80, NULL); // YM2151 I/O AddZ80AWriteByte(0x4000, 0x400D, CabalSoundWriteZ80, NULL); // 68000 + OTHER I/O AddZ80AWriteByte(0x0000, 0xFFFF, DefBadWriteZ80, NULL); // <bad writes> AddZ80AWriteByte(-1, -1, NULL, NULL); AddZ80AReadPort(0x00, 0xFF, DefBadReadZ80, NULL); AddZ80AReadPort( -1, -1, NULL, NULL); AddZ80AWritePort(0xAA, 0xAA, StopZ80Mode2, NULL); AddZ80AWritePort(0x00, 0xFF, DefBadWriteZ80, NULL); AddZ80AWritePort( -1, -1, NULL, NULL); AddZ80AInit(); if(!(PCMROM = AllocateMem(0x20000))) return; if(!load_rom("cabal_09.bin", PCMROM+0x00000, 0x10000)) return; if(!load_rom("cabal_10.bin", PCMROM+0x10000, 0x10000)) return; tc = 0x102; for(ta=0;ta<5;ta++,tc+=2){ tb = ReadWord(&PCMROM[tc+0x00000]); smp16_romlist_chip_a[ta].data = PCMROM+0x00000+(tb+2); smp16_romlist_chip_a[ta].size = ReadWord68k(&PCMROM[tb+0x00000]); smp16_romlist_chip_a[ta].type = 0; } tc = 0x102; for(ta=0;ta<7;ta++,tc+=2){ tb = ReadWord(&PCMROM[tc+0x10000]); smp16_romlist_chip_b[ta].data = PCMROM+0x10000+(tb+2); smp16_romlist_chip_b[ta].size = ReadWord68k(&PCMROM[tb+0x10000]); smp16_romlist_chip_b[ta].type = 0; } /*-----------------------*/ memset(RAM+0x00000,0x00,0x20000); memset(RAM+0x05400,0xFF,0x00100); RAMSize=0x30000; set_colour_mapper(&col_map_xxxx_bbbb_gggg_rrrr_rev); InitPaletteMap(RAM+0x4C00, 0x40, 0x10, 0x1000); // 68000 Speed hack // ---------------- WriteWord68k(&ROM[0x04FE],0x4EF9); WriteLong68k(&ROM[0x0500],0x00000300); WriteWord68k(&ROM[0x0300],0x5279); WriteLong68k(&ROM[0x0302],0x0004003E); WriteLong68k(&ROM[0x0306],0x13FC0000); // move.b #$00,$AA0000 WriteLong68k(&ROM[0x030A],0x00AA0000); // WriteWord68k(&ROM[0x030E],0x6100-16);/* * StarScream Stuff follows */ ByteSwap(ROM,0x40000); ByteSwap(RAM,0x20000); AddMemFetch(0x000000, 0x03FFFF, ROM+0x000000-0x000000); // 68000 ROM AddMemFetch(-1, -1, NULL); AddReadByte(0x000000, 0x03FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadByte(0x040000, 0x043FFF, NULL, RAM+0x000000); // 68000 RAM AddReadByte(0x060000, 0x0607FF, NULL, RAM+0x004000); // FG0 RAM AddReadByte(0x0E8000, 0x0E800F, CabalSoundRead68k, NULL); // COIN RAM AddReadByte(0x000000, 0xFFFFFF, DefBadReadByte, NULL); // <Bad Reads> AddReadByte(-1, -1, NULL, NULL); AddReadWord(0x000000, 0x03FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadWord(0x040000, 0x043FFF, NULL, RAM+0x000000); // 68000 RAM AddReadWord(0x060000, 0x0607FF, NULL, RAM+0x004000); // FG0 RAM AddReadWord(0x0A0000, 0x0A001F, NULL, RAM+0x005410); // INPUT RAM AddReadWord(0x000000, 0xFFFFFF, DefBadReadWord, NULL); // <Bad Reads> AddReadWord(-1, -1,NULL, NULL); AddWriteByte(0x040000, 0x043FFF, NULL, RAM+0x000000); // 68000 RAM AddWriteByte(0x060000, 0x0607FF, NULL, RAM+0x004000); // FG0 RAM AddWriteByte(0x0E8000, 0x0E800F, CabalSoundWrite68k, NULL); // SOUND COMM AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByte(0x000000, 0xFFFFFF, DefBadWriteByte, NULL); // <Bad Writes> AddWriteByte(-1, -1, NULL, NULL); AddWriteWord(0x040000, 0x043FFF, NULL, RAM+0x000000); // 68000 RAM AddWriteWord(0x060000, 0x0607FF, NULL, RAM+0x004000); // FG0 RAM AddWriteWord(0x080000, 0x0803FF, NULL, RAM+0x004800); // BG0 RAM AddWriteWord(0x0E0000, 0x0E07FF, NULL, RAM+0x004C00); // COLOR RAM AddWriteWord(0x000000, 0xFFFFFF, DefBadWriteWord, NULL); // <Bad Writes> AddWriteWord(-1, -1, NULL, NULL); AddInitMemory(); // Set Starscream mem pointers... }void ClearCabal(void){ /*#ifdef RAINE_DEBUG save_debug("ROM.bin",ROM,0x040000,1); save_debug("RAM.bin",RAM,0x040000,1); //save_debug("GFX.bin",GFX,0x210000,0); #endif*/}void ExecuteCabalFrame(void){ static int coin_toggle; if((RAM[0x5404]&0x07)!=7){ if(coin_toggle==0){ coin_toggle=1; } else{ RAM[0x5404]|=0x07; } } else{ coin_toggle=0; } // Main 68000 (8MHz) // ----------------- cpu_execute_cycles(CPU_68K_0, CPU_FRAME_MHz(12,60)); // M68000 12MHz (60fps) cpu_interrupt(CPU_68K_0, 1); // Sound Z80 (4MHz) // ---------------- cpu_execute_cycles(CPU_Z80_0, 4000000/60); // Sound Z80 /*#ifdef RAINE_DEBUG print_debug("Z80PC0:%04x\n",z80pc); #endif*/ cpu_interrupt(CPU_Z80_0, 0x38); cpu_int_nmi(CPU_Z80_0);}void DrawCabal(void){ int x,y,x16,y16; int zz,zzzz,ta; UINT8 *MAP; ClearPaletteMap(); x16=16; y16=16; zzzz=0x20; zzzz=zzzz&0x3FF; for(y=(16+y16);y<(224+32);y+=16){ zz=zzzz; for(x=(16+x16);x<(256+32);x+=16){ MAP_PALETTE_MAPPED_NEW( (ReadWord(&RAM[0x4800+zz])>>12)|0x20, // 0x20 o 0x30
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -