📄 wgp.c
字号:
// Fix COMMON RAM sync problems WriteWord68k(&ROM[0x02E0E],0x600C); // Speed Hack M68000A WriteLong68k(&ROM[0x0159A],0x067915F3); WriteLong68k(&ROM[0x0159E],0x00108DA0); WriteLong68k(&ROM[0x015A2],0x13FC0000); // move.b #$00,$AA0000 WriteLong68k(&ROM[0x015A6],0x00AA0000); // WriteWord68k(&ROM[0x015AA],0x6100-18); // Speed Hack M68000B WriteWord68k(&ROM[0x40942],0x5279); // inc random number WriteLong68k(&ROM[0x40944],0x00101682); WriteLong68k(&ROM[0x40948],0x13FC0000); // move.b #$00,$AA0000 WriteLong68k(&ROM[0x4094C],0x00AA0000); // WriteWord68k(&ROM[0x40950],0x6100-16); WriteLong68k(&ROM[0x4820C],0x4E714E71); // don't kill random number WriteWord68k(&ROM[0x48210],0x4E71); // ? WriteWord68k(&ROM[0x482D2],0x4E71); // LAN HEAD ERROR WriteWord68k(&ROM[0x504D8],0x6010); // Init tc0220ioc emulation // ------------------------ tc0220ioc.RAM = RAM_INPUT; tc0220ioc.ctrl = 0; //TC0220_STOPCPU; reset_tc0220ioc(); // Init tc0100scn emulation // ------------------------ 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_RGBx; 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_RGBx; tc0100scn[0].layer[1].tile_mask=0x3FFF; tc0100scn[0].layer[1].scr_x =16; tc0100scn[0].layer[1].scr_y =8; tc0100scn[0].layer[2].RAM =RAM_VIDEO+0x4000; tc0100scn[0].layer[2].GFX =GFX_FG0; tc0100scn[0].layer[2].SCR =RAM_SCROLL+4; tc0100scn[0].layer[2].type =3; tc0100scn[0].layer[2].bmp_x =32; tc0100scn[0].layer[2].bmp_y =32; tc0100scn[0].layer[2].bmp_w =320; tc0100scn[0].layer[2].bmp_h =240; tc0100scn[0].layer[2].mapper =&Map_12bit_RGBx; tc0100scn[0].layer[2].scr_x =16; tc0100scn[0].layer[2].scr_y =8; tc0100scn[0].RAM = RAM_VIDEO; tc0100scn[0].GFX_FG0 = GFX_FG0; init_tc0100scn(0); init_16x16_zoom(); zoom16_ofs = make_16x16_zoom_ofs_type1z(); obj_id = add_layer_info("Zooming Object" ); rod_id = add_layer_info("Roadscroll" );/* * StarScream Stuff follows */ ByteSwap(ROM,0x80000); ByteSwap(RAM,0x70000); AddMemFetch(0x000000, 0x03FFFF, ROM+0x000000-0x000000); // 68000 ROM AddMemFetch(-1, -1, NULL); AddReadByte(0x000000, 0x0FFFFF, NULL, ROM+0x000000); // 68000 ROM * AddReadByte(0x100000, 0x10FFFF, NULL, RAM_MAIN); // 68000 RAM * AddReadByte(0x300000, 0x30FFFF, NULL, RAM_VIDEO); // SCREEN RAM * AddReadByte(0x500000, 0x51FFFF, NULL, RAM_VIDEO_2); // ? AddReadByte(0x140000, 0x143FFF, NULL, RAM_COMMON); // COMMON RAM * AddReadByte(0x400000, 0x40FFFF, NULL, RAM_OBJECT); // ? AddReadByte(0x180000, 0x18001F, tc0220ioc_rb, NULL); // INPUT * AddReadByte(0x000000, 0xFFFFFF, DefBadReadByte, NULL); // <Bad Reads> AddReadByte(-1, -1, NULL, NULL); AddReadWord(0x000000, 0x0FFFFF, NULL, ROM+0x000000); // 68000 ROM * AddReadWord(0x100000, 0x10FFFF, NULL, RAM_MAIN); // 68000 RAM * AddReadWord(0x300000, 0x30FFFF, NULL, RAM_VIDEO); // SCREEN RAM * AddReadWord(0x500000, 0x51FFFF, NULL, RAM_VIDEO_2); // ? AddReadWord(0x140000, 0x143FFF, NULL, RAM_COMMON); // COMMON RAM * AddReadWord(0x400000, 0x40FFFF, NULL, RAM_OBJECT); // ? AddReadWord(0x700000, 0x701FFF, NULL, RAM_COLOUR); // COLOR RAM * AddReadWord(0x200000, 0x20000F, NULL, RAM_INPUT_2); // ? AddReadWord(0x180000, 0x18001F, tc0220ioc_rw, NULL); // INPUT * AddReadWord(0x000000, 0xFFFFFF, DefBadReadWord, NULL); // <Bad Reads> AddReadWord(-1, -1,NULL, NULL); AddWriteByte(0x100000, 0x10FFFF, NULL, RAM_MAIN); // 68000 RAM * AddWriteByte(0x306000, 0x306FFF, tc0100scn_0_gfx_fg0_wb, NULL); // FG0 GFX RAM * AddWriteByte(0x300000, 0x30FFFF, NULL, RAM_VIDEO); // SCREEN RAM * AddWriteByte(0x500000, 0x51FFFF, NULL, RAM_VIDEO_2); // ? AddWriteByte(0x140000, 0x143FFF, NULL, RAM_COMMON); // COMMON RAM * AddWriteByte(0x400000, 0x40FFFF, NULL, RAM_OBJECT); // ? AddWriteByte(0x180000, 0x18001F, tc0220ioc_wb, NULL); // INPUT * AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByte(0x000000, 0xFFFFFF, DefBadWriteByte, NULL); // <Bad Writes> AddWriteByte(-1, -1, NULL, NULL); AddWriteWord(0x100000, 0x10FFFF, NULL, RAM_MAIN); // 68000 RAM * AddWriteWord(0x306000, 0x306FFF, tc0100scn_0_gfx_fg0_ww, NULL); // FG0 GFX RAM * AddWriteWord(0x300000, 0x30FFFF, NULL, RAM_VIDEO); // SCREEN RAM * AddWriteWord(0x500000, 0x51FFFF, NULL, RAM_VIDEO_2); // ? AddWriteWord(0x140000, 0x143FFF, NULL, RAM_COMMON); // COMMON RAM * AddWriteWord(0x400000, 0x40FFFF, NULL, RAM_OBJECT); // ? AddWriteWord(0x700000, 0x701FFF, NULL, RAM_COLOUR); // COLOR RAM * AddWriteWord(0x320000, 0x32000F, NULL, RAM_SCROLL); // SCROLL RAM * AddWriteWord(0x520000, 0x52001F, NULL, RAM_SCROLL_2); // ? AddWriteWord(0x180000, 0x18001F, tc0220ioc_ww, NULL); // INPUT * AddWriteWord(0x000000, 0xFFFFFF, DefBadWriteWord, NULL); // <Bad Writes> AddWriteWord(-1, -1, NULL, NULL); AddInitMemory(); // Set Starscream mem pointers... AddMemFetchMC68000B(0x000000, 0x03FFFF, ROM+0x040000-0x000000); // 68000 ROM AddMemFetchMC68000B(-1, -1, NULL); AddReadByteMC68000B(0x000000, 0x03FFFF, NULL, ROM+0x040000); // 68000 ROM AddReadByteMC68000B(0x100000, 0x107FFF, NULL, RAM_MAIN_2); // MAIN RAM AddReadByteMC68000B(0x140000, 0x143FFF, NULL, RAM_COMMON); // COMMON RAM * AddReadByteMC68000B(0x200000, 0x200003, tc0140syt_read_main_68k, NULL); // SOUND COMM * AddReadByteMC68000B(0x000000, 0xFFFFFF, DefBadReadByte, NULL); // <Bad Reads> AddReadByteMC68000B(-1, -1, NULL, NULL); AddReadWordMC68000B(0x000000, 0x03FFFF, NULL, ROM+0x040000); // 68000 ROM AddReadWordMC68000B(0x100000, 0x107FFF, NULL, RAM_MAIN_2); // MAIN RAM AddReadWordMC68000B(0x140000, 0x143FFF, NULL, RAM_COMMON); // COMMON RAM * AddReadWordMC68000B(0x000000, 0xFFFFFF, DefBadReadWord, NULL); // <Bad Reads> AddReadWordMC68000B(-1, -1, NULL, NULL); AddWriteByteMC68000B(0x100000, 0x107FFF, NULL, RAM_MAIN_2); // MAIN RAM AddWriteByteMC68000B(0x140000, 0x143FFF, NULL, RAM_COMMON); // COMMON RAM * AddWriteByteMC68000B(0x200000, 0x200003, tc0140syt_write_main_68k, NULL); // SOUND COMM * AddWriteByteMC68000B(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByteMC68000B(0x000000, 0xFFFFFF, DefBadWriteByte, NULL); // <Bad Writes> AddWriteByteMC68000B(-1, -1, NULL, NULL); AddWriteWordMC68000B(0x100000, 0x107FFF, NULL, RAM_MAIN_2); // MAIN RAM AddWriteWordMC68000B(0x140000, 0x143FFF, NULL, RAM_COMMON); // COMMON RAM * AddWriteWordMC68000B(0x000000, 0xFFFFFF, DefBadWriteWord, NULL); // <Bad Writes> AddWriteWordMC68000B(-1, -1, NULL, NULL); AddInitMemoryMC68000B(); // Set Starscream mem pointers... }void load_world_grand_prix(void){ load_actual(0);}void load_world_grand_prix_japanese(void){ load_actual(1);}void ClearWorldGrandPrix(void){ RemoveTaitoYM2610(); #ifdef RAINE_DEBUG //save_debug("ROM.bin",ROM,0x100000,1); save_debug("RAM.bin",RAM,0x070000,1); save_debug("GFX.bin",GFX_PIV,0x400000,0); #endif}void ExecuteWorldGrandPrixFrame(void){ cpu_execute_cycles(CPU_68K_0, CPU_FRAME_MHz(12,60)); // M68000 12MHz (60fps) #ifdef RAINE_DEBUG print_debug("PC0:%06x SR:%04x\n",s68000context.pc,s68000context.sr); #endif cpu_interrupt(CPU_68K_0, 4); cpu_interrupt(CPU_68K_0, 6); cpu_interrupt(CPU_68K_0, 6); cpu_interrupt(CPU_68K_0, 6); cpu_interrupt(CPU_68K_0, 6); cpu_interrupt(CPU_68K_0, 6); cpu_interrupt(CPU_68K_0, 6); cpu_execute_cycles(CPU_68K_1, CPU_FRAME_MHz(12,60)); // M68000 12MHz (60fps) #ifdef RAINE_DEBUG print_debug("PC1:%06x SR:%04x\n",s68000context.pc,s68000context.sr); #endif cpu_interrupt(CPU_68K_1, 4); cpu_interrupt(CPU_68K_1, 6); Taito2610_Frame(); // Z80 and YM2610 check_layer_switches();}static void render_z_system_sprites(void){ int x,y,ta,tb,zz; int zx,zy,rx,ry,xx,zzx,zzy; UINT8 *map,*SPR_MAP; UINT8 *zoom_dat_x; UINT8 *zoom_dat_y; // OBJECT Z-SYSTEM // --------------- for(zz=0x4C000;zz<0x4DC00;zz+=16){ zx=0x7F; zy=0x7F; if((zx!=0)&&(zy!=0)){ ta = (ReadWord(&RAM[zz+4]))&0x3FF; if(ta!=0){ x=(32+ReadWord(&RAM[zz+0]))&0x1FF; y=(32+ReadWord(&RAM[zz+2]))&0x1FF; MAP_PALETTE_MAPPED_NEW( (ReadWord(&RAM[zz+6])>>7)&0x3F, 16, map ); if((zx&0x40)!=0){ // [128x128] zoom_dat_x = zoom16_ofs+(zx<<3); zoom_dat_y = zoom16_ofs+(zy<<3); SPR_MAP = RAM + 0x40000 + (ta<<8); switch(RAM[zz+5]&0x00){ case 0x00: xx=x; for(ry=0;ry<8;ry++){ zzy = zoom_dat_y[ry]; if((y>16)&&(y<240+32)){ ta=0; for(rx=0;rx<8;rx++){ zzx = zoom_dat_x[rx]; if((x>16)&&(x<320+32)){ tb=ReadWord(&SPR_MAP[ta])&0x3FFF; if(GFX_OBJ_B_SOLID[tb]!=0){ // No pixels; skip if(GFX_OBJ_B_SOLID[tb]==1) // Some pixels; trans Draw16x16_Trans_Mapped_ZoomXY_Rot(&GFX_OBJ_B[tb<<8],x,y,map,zzx,zzy); else // all pixels; solid Draw16x16_Mapped_ZoomXY_Rot(&GFX_OBJ_B[tb<<8],x,y,map,zzx,zzy); } } ta+=4; x = (x+zzx)&0x1FF; } } y = (y+zzy)&0x1FF; SPR_MAP+=32; x=xx; } break; case 0x40: x+=(zx+1); xx=x; for(ry=0;ry<8;ry++){ zzy = zoom_dat_y[ry]; if((y>16)&&(y<240+32)){ ta=0; for(rx=0;rx<8;rx++){ zzx = zoom_dat_x[rx]; x = (x-zzx)&0x1FF; if((x>16)&&(x<320+32)){ tb=ReadWord(&SPR_MAP[ta])&0x3FFF; if(GFX_OBJ_B_SOLID[tb]!=0){ // No pixels; skip if(GFX_OBJ_B_SOLID[tb]==1) // Some pixels; trans Draw16x16_Trans_Mapped_ZoomXY_FlipY_Rot(&GFX_OBJ_B[tb<<8],x,y,map,zzx,zzy); else // all pixels; solid Draw16x16_Mapped_ZoomXY_FlipY_Rot(&GFX_OBJ_B[tb<<8],x,y,map,zzx,zzy); } } ta+=2; } } y = (y+zzy)&0x1FF; SPR_MAP+=16; x=xx; } break; case 0x80: y+=zy; xx=x; for(ry=0;ry<8;ry++){ zzy = zoom_dat_y[ry]; y = (y-zzy)&0x1FF; if((y>16)&&(y<240+32)){ ta=0; for(rx=0;rx<8;rx++){ zzx = zoom_dat_x[rx]; if((x>16)&&(x<320+32)){ tb=ReadWord(&SPR_MAP[ta])&0x3FFF; if(GFX_OBJ_B_SOLID[tb]!=0){ // No pixels; skip if(GFX_OBJ_B_SOLID[tb]==1) // Some pixels; trans Draw16x16_Trans_Mapped_ZoomXY_FlipX_Rot(&GFX_OBJ_B[tb<<8],x,y,map,zzx,zzy); else // all pixels; solid Draw16x16_Mapped_ZoomXY_FlipX_Rot(&GFX_OBJ_B[tb<<8],x,y,map,zzx,zzy); } } ta+=2; x = (x+zzx)&0x1FF; } } SPR_MAP+=16; x=xx; } break; case 0xC0: x+=(zx+1); y+=zy; xx=x; for(ry=0;ry<8;ry++){ zzy = zoom_dat_y[ry]; y = (y-zzy)&0x1FF; if((y>16)&&(y<240+32)){ ta=0; for(rx=0;rx<8;rx++){ zzx = zoom_dat_x[rx]; x = (x-zzx)&0x1FF; if((x>16)&&(x<320+32)){ tb=ReadWord(&SPR_MAP[ta])&0x3FFF; if(GFX_OBJ_B_SOLID[tb]!=0){ // No pixels; skip if(GFX_OBJ_B_SOLID[tb]==1) // Some pixels; trans Draw16x16_Trans_Mapped_ZoomXY_FlipXY_Rot(&GFX_OBJ_B[tb<<8],x,y,map,zzx,zzy); else // all pixels; solid Draw16x16_Mapped_ZoomXY_FlipXY_Rot(&GFX_OBJ_B[tb<<8],x,y,map,zzx,zzy); } } ta+=2; } } SPR_MAP+=16; x=xx; } break; } } else{ if((zy&0x20)!=0){ // [64x128] zoom_dat_x = zoom16_ofs+(((zx<<1)|1)<<3); zoom_dat_y = zoom16_ofs+(zy<<3); SPR_MAP = RAM + 0x20000 + (ta<<7); switch(RAM[zz+5]&0xC0){ case 0x00: xx=x; for(ry=0;ry<8;ry++){ zzy = zoom_dat_y[ry]; if((y>16)&&(y<240+32)){ ta=0; for(rx=0;rx<4;rx++){ zzx = zoom_dat_x[rx]; if((x>16)&&(x<320+32)){ tb=ReadWord(&SPR_MAP[ta])&0x3FFF; if(GFX_OBJ_B_SOLID[tb]!=0){ // No pixels; skip if(GFX_OBJ_B_SOLID[tb]==1) // Some pixels; trans Draw16x16_Trans_Mapped_ZoomXY_Rot(&GFX_OBJ_B[tb<<8],x,y,map,zzx,zzy); else // all pixels; solid Draw16x16_Mapped_ZoomXY_Rot(&GFX_OBJ_B[tb<<8],x,y,map,zzx,zzy); } } ta+=2; x = (x+zzx)&0x1FF; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -