📄 opwolf.c
字号:
ROM[ta+ta+0x20001]=RAM[ta]; } if(!load_rom("operwolf.09", Z80ROM2, 0x8000)) return; // Z80 C-CHIP ROM } else{ // ORIGINAL tb=0; if(!load_rom("opwlf.13", RAM, 0x80000)) return; // 8x8 TILES for(ta=0;ta<0x80000;ta+=2){ GFX[tb++]=RAM[ta+1]>>4; GFX[tb++]=RAM[ta+1]&15; GFX[tb++]=RAM[ta+0]>>4; GFX[tb++]=RAM[ta+0]&15; } if(!load_rom("opwlf.72", RAM, 0x80000)) return; // 16x16 TILES for(ta=0;ta<0x80000;ta+=2){ GFX[tb++]=RAM[ta+1]>>4; GFX[tb++]=RAM[ta+1]&15; GFX[tb++]=RAM[ta+0]>>4; GFX[tb++]=RAM[ta+0]&15; } if(!load_rom("opwlf.40", RAM, 0x10000)) return; // 68000 ROM for(ta=0;ta<0x10000;ta++){ ROM[ta+ta]=RAM[ta]; } if(!load_rom("opwlf.30", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+1]=RAM[ta]; } if(!load_rom("opwlf.39", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0x20000]=RAM[ta]; } if(!load_rom("opwlf.29", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0x20001]=RAM[ta]; } if(!load_rom("operwolf.09", Z80ROM2, 0x8000)) return; // Z80 C-CHIP ROM } /*--------[C-Chip Z80]---------*/ Z80ROM2[0x19B]=0xC3; Z80ROM2[0x19C]=0x80; Z80ROM2[0x19D]=0x00; Z80ROM2[0x080]=0x21; Z80ROM2[0x081]=0x1B; Z80ROM2[0x082]=0xC0; Z80ROM2[0x083]=0xD3; // OUTA (AAh) Z80ROM2[0x084]=0xAA; // Z80ROM2[0x0570]=0x18; Z80ROM2[0x059E]=0x18; SetStopZ80BMode2(0x019E); memset(Z80ROM2+0x8000,0x00,0x8000); AddZ80BROMBase(Z80ROM2, 0x0038, 0x0066); AddZ80BReadByte(0x0000, 0xFFFF, NULL, Z80ROM2+0x0000); // Z80 ROM/RAM AddZ80BReadByte(0x0000, 0xFFFF, DefBadReadZ80, NULL); AddZ80BReadByte( -1, -1, NULL, NULL); AddZ80BWriteByte(0x0000, 0xFFFF, NULL, Z80ROM2+0x0000); // Z80 RAM AddZ80BWriteByte(0x0000, 0xFFFF, DefBadWriteZ80, NULL); AddZ80BWriteByte( -1, -1, NULL, NULL); AddZ80BReadPort(0x00, 0xFF, DefBadReadZ80, NULL); AddZ80BReadPort( -1, -1, NULL, NULL); AddZ80BWritePort(0xAA, 0xAA, StopZ80BMode2, NULL); AddZ80BWritePort(0x00, 0xFF, DefBadWriteZ80, NULL); AddZ80BWritePort( -1, -1, NULL, NULL); AddZ80BInit(); /*-----[Sound Setup]-----*/ Z80ROM=RAM+0x40000; if(romset==0){ if(!load_rom("opwlf_s.10", Z80ROM, 0x10000)) return; // Z80 SOUND ROM } else{ if(!load_rom("operwolf.30", Z80ROM, 0x10000)) return; // Z80 SOUND ROM } tb=16; // First Sample=1 for(ta=0;ta<(0x3C*7);ta+=7){ Z80ROM[ta+0x2F00]=tb>>16; Z80ROM[ta+0x2F02]=tb>>8; Z80ROM[ta+0x2F01]=tb; tb+=16; // Next Sample } AddTaitoYM2151(0x028A, 0x0219, 0x10000, (void *) OpWolfWriteADPCMA, (void *) OpWolfWriteADPCMB); /*------[Sample Setup]--------*/ if(!(PCMROM=AllocateMem(0x80000))) return; if(romset==0){ if(!load_rom("opwlf_s.21", PCMROM, 0x80000)) return; } else{ if(!(TMP=AllocateMem(0x80000))) return; if(!load_rom("operwolf.29", TMP+0x00000, 0x10000)) return; if(!load_rom("operwolf.28", TMP+0x10000, 0x10000)) return; if(!load_rom("operwolf.27", TMP+0x20000, 0x10000)) return; if(!load_rom("operwolf.26", TMP+0x30000, 0x10000)) return; if(!load_rom("operwolf.25", TMP+0x40000, 0x10000)) return; if(!load_rom("operwolf.24", TMP+0x50000, 0x10000)) return; if(!load_rom("operwolf.23", TMP+0x60000, 0x10000)) return; if(!load_rom("operwolf.22", TMP+0x70000, 0x10000)) return; for(ta=0;ta<0x40000;ta++){ PCMROM[ta+ta+0]=TMP[ta+0x00000]; PCMROM[ta+ta+1]=TMP[ta+0x40000]; } FreeMem(TMP); } msm5205_interface.rom[0] = PCMROM; msm5205_interface.romsize[0] = 0x80000; msm5205_interface.rom[1] = PCMROM; msm5205_interface.romsize[1] = 0x80000; msm5205_interface.updatemode = MSM5205_MONO; //ROM[0x0988]=0x60; // FIX C-CHIP USER ERROR //ROM[0x0C32]=0x60; // COIN ERROR WriteWord68k(&ROM[0xBB72],0x4E71); // nop // 68000 Speed Hack // ---------------- WriteLong68k(&ROM[0x04F4],0x13FC0000); // move.b #$00,$AA0000 WriteLong68k(&ROM[0x04F8],0x00AA0000); WriteWord68k(&ROM[0x04FC],0x6100-16); // <loop> memset(RAM+0x00000,0x00,0x40000); RAM_VIDEO = RAM+0x08000; RAM_SCROLL = RAM+0x2B200; RAM_OBJECT = RAM+0x28000; GFX_BG0_SOLID = make_solid_mask_8x8 (GFX, 0x4000); GFX_SPR_SOLID = make_solid_mask_16x16(GFX_SPR, 0x1000); set_colour_mapper(&col_map_xxxx_rrrr_gggg_bbbb); InitPaletteMap(RAM+0x2A000, 0x100, 0x10, 0x1000);/* * StarScream Main 68000 Setup */ ByteSwap(ROM,0x40000); ByteSwap(RAM,0x40000); AddMemFetch(0x000000, 0x03FFFF, ROM+0x000000-0x000000); // 68000 ROM AddMemFetch(-1, -1, NULL); AddReadByte(0x000000, 0x03FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadByte(0x100000, 0x107FFF, NULL, RAM+0x000000); // MAIN RAM AddReadByte(0xC00000, 0xC1FFFF, NULL, RAM_VIDEO); // SCREEN RAM AddReadByte(0xD00000, 0xD01FFF, NULL, RAM_OBJECT); // OBJECT RAM AddReadByte(0x0FF000, 0x0FFFFF, CChipReadB, NULL); // C-CHIP AddReadByte(0x380000, 0x38000F, NULL, RAM+0x02B000); // I/O RAM AddReadByte(0x0F0000, 0x0F000F, NULL, RAM+0x02B100); // I/O RAM AddReadByte(0x3E0000, 0x3E0003, tc0140syt_read_main_68k, NULL); // SOUND AddReadByte(0x000000, 0xFFFFFF, BadReadByte, NULL); // <Bad Reads> AddReadByte(-1, -1, NULL, NULL); AddReadWord(0x000000, 0x03FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadWord(0x100000, 0x107FFF, NULL, RAM+0x000000); // MAIN RAM AddReadWord(0x200000, 0x2007FF, NULL, RAM+0x02A000); // COLOR RAM AddReadWord(0xC00000, 0xC1FFFF, NULL, RAM_VIDEO); // SCREEN RAM AddReadWord(0x0FF000, 0x0FFFFF, CChipReadW, NULL); // C-CHIP AddReadWord(0x380000, 0x38000F, NULL, RAM+0x02B000); // I/O RAM AddReadWord(0x3A0000, 0x3A000F, NULL, RAM+0x02B400); // GUN AddReadWord(0x0F0000, 0x0F000F, NULL, RAM+0x02B100); // I/O RAM AddReadWord(0x000000, 0xFFFFFF, BadReadWord, NULL); // <Bad Reads> AddReadWord(-1, -1,NULL, NULL); AddWriteByte(0x100000, 0x107FFF, NULL, RAM+0x000000); // MAIN RAM AddWriteByte(0xC00000, 0xC1FFFF, NULL, RAM_VIDEO); // SCREEN RAM AddWriteByte(0xD00000, 0xD01FFF, NULL, RAM_OBJECT); // OBJECT RAM AddWriteByte(0x0FF000, 0x0FFFFF, CChipWriteB, NULL); // C-CHIP AddWriteByte(0x3E0000, 0x3E0003, tc0140syt_write_main_68k, NULL); // SOUND AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByte(0x000000, 0xFFFFFF, BadWriteByte, NULL); // <Bad Writes> AddWriteByte(-1, -1, NULL, NULL); AddWriteWord(0x100000, 0x107FFF, NULL, RAM+0x000000); // MAIN RAM AddWriteWord(0xC00000, 0xC1FFFF, NULL, RAM_VIDEO); // SCREEN RAM AddWriteWord(0xD00000, 0xD01FFF, NULL, RAM_OBJECT); // OBJECT RAM AddWriteWord(0x200000, 0x2007FF, NULL, RAM+0x02A000); // COLOR RAM AddWriteWord(0xC20000, 0xC20003, NULL, RAM_SCROLL+6); // SCROLL Y AddWriteWord(0xC40000, 0xC40003, NULL, RAM_SCROLL+0); // SCROLL X AddWriteWord(0xC50000, 0xC50001, NULL, RAM_SCROLL+14); // CTRL AddWriteWord(0x0FF000, 0x0FFFFF, CChipWriteW, NULL); // C-CHIP AddWriteWord(0x000000, 0xFFFFFF, BadWriteWord, NULL); // <Bad Writes> AddWriteWord(-1, -1, NULL, NULL); AddInitMemory(); // Set Starscream mem pointers... GameMouse=1;}void LoadOperationWolf(void){ romset=0; // Original LoadActual();}void LoadOperationWolfB(void){ romset=1; // Bootleg LoadActual();}void ClearOperationWolf(void){ RemoveTaitoYM2151(); #ifdef RAINE_DEBUG save_debug("ROM.bin",ROM,0x040000,1); save_debug("RAM.bin",RAM,0x050000,1); //save_debug("GFX.bin",GFX,0x200000,0); #endif}void ExecuteOperationWolfFrame(void){ /*------[Mouse Hack]-------*/ set_mouse_range(0,0,319,239); x11=mouse_x; myy11=mouse_y; x1=x11+16; if(romset==1){ myy1=myy11-8; } else{ myy1=myy11-24; } if(x1<0) x1=0; if(x1>319) x1=319; if(myy1<0) myy1=0; if(myy1>239) myy1=239; if(mouse_b&1) RAM[0x2B10A]&= ~0x01; if(mouse_b&2) RAM[0x2B10A]&= ~0x02; /*-----[Keyboard Hack]-----*/ if(((RAM[0x2B408]&0x01)!=0)&&(myy1>0)) myy1--; if(((RAM[0x2B408]&0x02)!=0)&&(myy1<239)) myy1++; if(((RAM[0x2B408]&0x04)!=0)&&(x1>0)) x1--; if(((RAM[0x2B408]&0x08)!=0)&&(x1<319)) x1++; /*----[Write Positions]----*/ RAM[0x2B400]=x1; RAM[0x2B402]=myy1; cpu_execute_cycles(CPU_Z80_1, 400000); // C-CHIP Z80 4Mhz? cpu_interrupt(CPU_Z80_1, 0x38); cpu_execute_cycles(CPU_68K_0, CPU_FRAME_MHz(12,60)); // M68000 12MHz (60fps) // MAIN 68000 12Mhz? cpu_interrupt(CPU_68K_0, 5); Taito2151_FrameFast(); // Z80 and YM2151}void DrawOperationWolf(void){ int x,y; ClearPaletteMap(); // Init tc0100scn emulation // ------------------------ tc0100scn_layer_count = 0; tc0100scn[0].ctrl = ReadWord(RAM_SCROLL+12); if(RefreshBuffers){ tc0100scn[0].layer[0].RAM =RAM_VIDEO+0x0000; tc0100scn[0].layer[0].GFX =GFX; tc0100scn[0].layer[0].MASK =GFX_BG0_SOLID; tc0100scn[0].layer[0].SCR =RAM_SCROLL+0; tc0100scn[0].layer[0].type =0; tc0100scn[0].layer[0].bmp_x =32; tc0100scn[0].layer[0].bmp_y =32; tc0100scn[0].layer[0].bmp_w =320; tc0100scn[0].layer[0].bmp_h =240; tc0100scn[0].layer[0].mapper =&Map_12bit_xRGB; tc0100scn[0].layer[0].tile_mask=0x3FFF; tc0100scn[0].layer[0].scr_x =16; tc0100scn[0].layer[0].scr_y =8; tc0100scn[0].layer[1].RAM =RAM_VIDEO+0x8000; tc0100scn[0].layer[1].GFX =GFX; tc0100scn[0].layer[1].MASK =GFX_BG0_SOLID; tc0100scn[0].layer[1].SCR =RAM_SCROLL+2; tc0100scn[0].layer[1].type =0; tc0100scn[0].layer[1].bmp_x =32; tc0100scn[0].layer[1].bmp_y =32; tc0100scn[0].layer[1].bmp_w =320; tc0100scn[0].layer[1].bmp_h =240; tc0100scn[0].layer[1].mapper =&Map_12bit_xRGB; tc0100scn[0].layer[1].tile_mask=0x3FFF; tc0100scn[0].layer[1].scr_x =16; tc0100scn[0].layer[1].scr_y =8; } // Init tc0002obj emulation // ------------------------ //tc0002obj.ctrl = ReadWord(&RAM[0x1B010]); tc0002obj.ctrl = 0x2000; if(RefreshBuffers){ tc0002obj.RAM = RAM_OBJECT; tc0002obj.GFX = GFX_SPR; tc0002obj.MASK = GFX_SPR_SOLID; tc0002obj.bmp_x = 32; tc0002obj.bmp_y = 32; tc0002obj.bmp_w = 320; tc0002obj.bmp_h = 240; tc0002obj.mapper = &Map_12bit_xRGB; tc0002obj.tile_mask = 0x0FFF; tc0002obj.ofs_x = 0; tc0002obj.ofs_y = -8; } // BG0 // --- render_tc0100scn_layer_mapped(0,0); // BG1+OBJECT // ---------- if((tc0002obj.ctrl & 0x2000)==0){ render_tc0100scn_layer_mapped(0,1); render_tc0002obj_mapped(); } else{ render_tc0002obj_mapped(); render_tc0100scn_layer_mapped(0,1); } // CURSOR // ------ x=(32+x11)-7; y=(32+myy11)-7; if((x>16)&&(y>16)&&(x<320+32)&&(y<224+32)){ Draw16x16_Trans(SpriteGun1,x,y,0); } pal[254].r=0; pal[254].g=0; pal[254].b=0; pal[253].r=31; pal[253].g=31; pal[253].b=63; pal[252].r=63; pal[252].g=31; pal[252].b=31;}/*-------[ADPCM PORT]-------*/static int ad[8];void OpWolfWriteADPCMA(UINT16 offset, UINT8 data){ int ta=0; offset&=7; ad[offset]=data; if(offset==6){#ifdef RAINE_DEBUG print_debug("OpWolfADPCM(%02X%02X:%02X%02X:%02X%02X)\n",ad[1],ad[0],ad[3],ad[2],ad[4],ad[5]);#endif ta=ad[0]; if((ta>0)&&(ta<=0x3C)){ MSM5205buffer_request( 0, ta-1 ); } }}/*------[ADPCM PORT 2]------*/static int ad2[8];void OpWolfWriteADPCMB(UINT16 offset, UINT8 data){ int ta=0; offset&=7; ad2[offset]=data; if(offset==6){ #ifdef RAINE_DEBUG print_debug("OpWolfADPCM#2(%02X%02X:%02X%02X:%02X%02X)\n",ad2[1],ad2[0],ad2[3],ad2[2],ad2[4],ad2[5]); #endif ta=ad2[0]; if((ta>0)&&(ta<=0x3C)){ MSM5205buffer_request( 1, ta-1 ); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -