📄 robokid.c
字号:
} FG0_Mask = make_solid_mask_8x8(GFX_FG0, 0x400); return 1;}static int MS1DecodeSPR(UINT8 *src, UINT32 size){ UINT32 ta,tb; if(!(GFX_SPR=AllocateMem(0x100000))) return(0); memset(GFX_SPR,0x00,0x100000); tb=0; for(ta=0;ta<size;ta+=4){ GFX_SPR[tb+0]=(src[ta+0]>>4)^15; GFX_SPR[tb+1]=(src[ta+0]&15)^15; GFX_SPR[tb+2]=(src[ta+1]>>4)^15; GFX_SPR[tb+3]=(src[ta+1]&15)^15; GFX_SPR[tb+4]=(src[ta+2]>>4)^15; GFX_SPR[tb+5]=(src[ta+2]&15)^15; GFX_SPR[tb+6]=(src[ta+3]>>4)^15; GFX_SPR[tb+7]=(src[ta+3]&15)^15; tb+=16; if((tb&0xFF)==0){tb-=0xF8;} else{if((tb&0xFF)==8){tb-=8;}} } SPR_Mask = make_solid_mask_16x16(GFX_SPR, 0x1000); return 1;}static int MS1DecodeBG2(UINT8 *src, UINT32 size){ UINT32 ta,tb; if(!(GFX_BG2=AllocateMem(0x100000))) return(0); memset(GFX_BG2,0x00,0x100000); tb=0; for(ta=0;ta<size;ta+=4){ GFX_BG2[tb+0]=(src[ta+0]>>4)^15; GFX_BG2[tb+1]=(src[ta+0]&15)^15; GFX_BG2[tb+2]=(src[ta+1]>>4)^15; GFX_BG2[tb+3]=(src[ta+1]&15)^15; GFX_BG2[tb+4]=(src[ta+2]>>4)^15; GFX_BG2[tb+5]=(src[ta+2]&15)^15; GFX_BG2[tb+6]=(src[ta+3]>>4)^15; GFX_BG2[tb+7]=(src[ta+3]&15)^15; tb+=16; if((tb&0xFF)==0){tb-=0xF8;} else{if((tb&0xFF)==8){tb-=8;}} } BG2_Mask = make_solid_mask_16x16(GFX_BG2, 0x1000); return 1;}static int MS1DecodeBG1(UINT8 *src, UINT32 size){ UINT32 ta,tb; if(!(GFX_BG1=AllocateMem(0x100000))) return(0); memset(GFX_BG1,0x00,0x100000); tb=0; for(ta=0;ta<size;ta+=4){ GFX_BG1[tb+0]=(src[ta+0]>>4)^15; GFX_BG1[tb+1]=(src[ta+0]&15)^15; GFX_BG1[tb+2]=(src[ta+1]>>4)^15; GFX_BG1[tb+3]=(src[ta+1]&15)^15; GFX_BG1[tb+4]=(src[ta+2]>>4)^15; GFX_BG1[tb+5]=(src[ta+2]&15)^15; GFX_BG1[tb+6]=(src[ta+3]>>4)^15; GFX_BG1[tb+7]=(src[ta+3]&15)^15; tb+=16; if((tb&0xFF)==0){tb-=0xF8;} else{if((tb&0xFF)==8){tb-=8;}} } BG1_Mask = make_solid_mask_16x16(GFX_BG1, 0x1000); return 1;}static int MS1DecodeBG0(UINT8 *src, UINT32 size){ UINT32 ta,tb; if(!(GFX_BG0=AllocateMem(0x100000))) return(0); memset(GFX_BG0,0x00,0x100000); tb=0; for(ta=0;ta<size;ta+=4){ GFX_BG0[tb+0]=(src[ta+0]>>4)^15; GFX_BG0[tb+1]=(src[ta+0]&15)^15; GFX_BG0[tb+2]=(src[ta+1]>>4)^15; GFX_BG0[tb+3]=(src[ta+1]&15)^15; GFX_BG0[tb+4]=(src[ta+2]>>4)^15; GFX_BG0[tb+5]=(src[ta+2]&15)^15; GFX_BG0[tb+6]=(src[ta+3]>>4)^15; GFX_BG0[tb+7]=(src[ta+3]&15)^15; tb+=16; if((tb&0xFF)==0){tb-=0xF8;} else{if((tb&0xFF)==8){tb-=8;}} } BG0_Mask = make_solid_mask_16x16(GFX_BG0, 0x1000); return 1;}/******************************************************************************/void RoboKidLoadUpdate(void){ UINT8 ta; #ifdef RAINE_DEBUG print_debug("Robokid Load Callback()\n"); #endif // Bank Refresh ta = Z80Bank; Z80Bank = -1; RoboKidBankWrite(0,ta); // BG RAM Bank Refresh if(romset==0){ RoboKidBG0BankWrite(0xDD05,RAM[0xDD05]); RoboKidBG1BankWrite(0xDE05,RAM[0xDE05]); RoboKidBG2BankWrite(0xDF05,RAM[0xDF05]); }}void LoadRoboKid(void){ UINT8 *TMP; romset=0; Z80BankCount=0x40000/0x4000; if(!(ROM=AllocateMem(0xC000*Z80BankCount))) return; if(!(ROM2=AllocateMem(0x10000))) return; RAMSize = 0x10000+0x10000+0x2000+0x10; if(!(RAM=AllocateMem(RAMSize))) return; RAM2 = RAM+0x10000; RAM_VIDEO = RAM+0x10000+0x10000; if(!(TMP =AllocateMem(0x40000))) return; if(is_current_game("robokid")){ if(!load_rom("robokid1.18j",TMP+0x00000,0x10000)) return; // Z80 MAIN ROM * if(!load_rom("robokid2.18k",TMP+0x10000,0x10000)) return; // Z80 MAIN ROM // Fix ROM Checksum TMP[0x33e2]=0x18; // JR xx } else{ if(!load_rom("1.29",TMP+0x00000,0x10000)) return; // Z80 MAIN ROM * if(!load_rom("2.30",TMP+0x10000,0x10000)) return; // Z80 MAIN ROM // Fix ROM Checksum TMP[0x3401]=0x18; // JR xx } if(!load_rom("robokid3.15k",TMP+0x20000,0x10000)) return; // Z80 MAIN ROM if(!load_rom("robokid4.12k",TMP+0x30000,0x10000)) return; // Z80 MAIN ROM // Decustomize Interrupt TMP[0x0039]=0x10; // Skip Idle Z80 TMP[0x0108]=0xD3; // OUTA (AAh) TMP[0x0109]=0xAA; // SetStopZ80BMode2(0x010A); init_bank_rom(TMP,ROM,0); memset(RAM+0x00000, 0x00, 0x10000); memset(RAM+0x0DC00, 0xFF, 0x00010); memcpy(RAM, TMP, 0x8000+0x4000); AddZ80BROMBase(RAM, 0x0010, 0x0066); AddZ80BReadByte(0x0000, 0xBFFF, NULL, NULL); // Z80 ROM/BANK ROM AddZ80BReadByte(0xE000, 0xFFFF, NULL, RAM+0xE000); // RAM/OBJECT RAM AddZ80BReadByte(0xC000, 0xCFFF, NULL, RAM+0xC000); // COLOR/FG0 RAM AddZ80BReadByte(0xD000, 0xDBFF, RoboKidBG012Read, NULL); // BG0-2 RAM AddZ80BReadByte(0xDC00, 0xDC0F, NULL, RAM+0xDC00); // INPUT AddZ80BReadByte(0x0000, 0xFFFF, DefBadReadZ80, NULL); // <bad reads> AddZ80BReadByte(-1, -1, NULL, NULL); AddZ80BWriteByte(0xE000, 0xFFFF, NULL, RAM+0xE000); // RAM/OBJECT RAM AddZ80BWriteByte(0xC000, 0xCFFF, NULL, RAM+0xC000); // COLOR/FG0 RAM AddZ80BWriteByte(0xD000, 0xDBFF, RoboKidBG012Write, NULL); // BG0-2 RAM AddZ80BWriteByte(0xDC00, 0xDC00, RoboKidSoundWrite, NULL); // SOUND AddZ80BWriteByte(0xDC02, 0xDC02, RoboKidBankWrite, NULL); // ROM BANK AddZ80BWriteByte(0xDD05, 0xDD05, RoboKidBG0BankWrite, NULL); // BG0 BANK AddZ80BWriteByte(0xDE05, 0xDE05, RoboKidBG1BankWrite, NULL); // BG1 BANK AddZ80BWriteByte(0xDF05, 0xDF05, RoboKidBG2BankWrite, NULL); // BG2 BANK AddZ80BWriteByte(0xDD00, 0xDFFF, NULL, RAM+0xDD00); // SCROLL AddZ80BWriteByte(0x0000, 0xFFFF, DefBadWriteZ80, NULL); // <bad writes> AddZ80BWriteByte(-1, -1, NULL, NULL); AddZ80BReadPort(0x00, 0xFF, DefBadReadZ80, NULL); // <bad reads> AddZ80BReadPort(-1, -1, NULL, NULL); AddZ80BWritePort(0xAA, 0xAA, StopZ80BMode2, NULL); // Trap Idle Z80 AddZ80BWritePort(0x00, 0xFF, DefBadWriteZ80, NULL); // <bad writes> AddZ80BWritePort(-1, -1, NULL, NULL); AddZ80BInit(); if(!load_rom("robokid.k7",ROM2+0x00000,0x10000)) return; // Z80 SUB ROM // Skip Idle Z80 // ------------- ROM2[0x00B2]=0xD3; // OUTA (AAh) ROM2[0x00B3]=0xAA; // SetStopZ80CMode2(0x00B2); memset(RAM2+0x00000, 0x00, 0x10000); memcpy(RAM2, ROM2, 0x8000+0x4000); AddZ80CROMBase(RAM2, 0x0038, 0x0066); AddZ80CReadByte(0x0000, 0xC7FF, NULL, RAM2+0x0000); // Z80 ROM/BANK ROM/RAM AddZ80CReadByte(0xE000, 0xE000, RoboKidSoundRead, NULL); // SOUND AddZ80CReadByte(0x0000, 0xFFFF, DefBadReadZ80, NULL); // <bad reads> AddZ80CReadByte(-1, -1, NULL, NULL); AddZ80CWriteByte(0xC000, 0xC7FF, NULL, RAM2+0xC000); // RAM AddZ80CWriteByte(0x0000, 0xFFFF, DefBadWriteZ80, NULL); // <bad writes> AddZ80CWriteByte(-1, -1, NULL, NULL); AddZ80CReadPort(0x00, 0x01, YM2203AReadZ80, NULL); // YM2203#1 AddZ80CReadPort(0x80, 0x81, YM2203BReadZ80, NULL); // YM2203#2 AddZ80CReadPort(0x00, 0xFF, DefBadReadZ80, NULL); // <bad reads> AddZ80CReadPort(-1, -1, NULL, NULL); AddZ80CWritePort(0x00, 0x01, YM2203AWriteZ80, NULL); // YM2203#1 AddZ80CWritePort(0x80, 0x81, YM2203BWriteZ80, NULL); // YM2203#2 AddZ80CWritePort(0xAA, 0xAA, StopZ80CMode2, NULL); // Trap Idle Z80 AddZ80CWritePort(0x00, 0xFF, DefBadWriteZ80, NULL); // <bad writes> AddZ80CWritePort(-1, -1, NULL, NULL); AddZ80CInit(); FreeMem(TMP); /*-----------------------*/ if(!(TMP=AllocateMem(0x080000))) return; if(!load_rom("robokid.b9", TMP, 0x8000)) return; // 8x8 FG0 TILES * if(!MS1DecodeFG0(TMP,0x08000))return; if(!load_rom("robokid.15f", TMP+0x00000, 0x10000)) return; // 16x16 SPRITES * if(!load_rom("robokid.16f", TMP+0x10000, 0x10000)) return; // 16x16 SPRITES * if(!load_rom("robokid.17f", TMP+0x20000, 0x10000)) return; // 16x16 SPRITES * if(!load_rom("robokid.18f", TMP+0x30000, 0x10000)) return; // 16x16 SPRITES * if(!MS1DecodeSPR(TMP,0x40000))return; memset(TMP,0xFF,0x80000); if(!load_rom("robokid.19c", TMP+0x00000, 0x10000)) return; // 16x16 BG0 * if(!load_rom("robokid.20c", TMP+0x10000, 0x10000)) return; // 16x16 BG0 * if(!load_rom("robokid.17d", TMP+0x20000, 0x10000)) return; // 16x16 BG0 ? if(!load_rom("robokid.18d", TMP+0x30000, 0x10000)) return; // 16x16 BG0 * if(!load_rom("robokid.19d", TMP+0x40000, 0x10000)) return; // 16x16 BG0 ? if(!load_rom("robokid.20d", TMP+0x50000, 0x10000)) return; // 16x16 BG0 * if(!load_rom("robokid.19f", TMP+0x60000, 0x10000)) return; // 16x16 BG0 * if(!MS1DecodeBG0(TMP,0x80000))return; memset(TMP,0xFF,0x80000); if(!load_rom("robokid.12c", TMP+0x00000, 0x10000)) return; // 16x16 BG1 if(!load_rom("robokid.14c", TMP+0x10000, 0x10000)) return; // 16x16 BG1 * if(!load_rom("robokid.15c", TMP+0x20000, 0x10000)) return; // 16x16 BG1 * if(!load_rom("robokid.16c", TMP+0x30000, 0x10000)) return; // 16x16 BG1 * (why 16a?) if(!load_rom("robokid.17c", TMP+0x40000, 0x10000)) return; // 16x16 BG1 * if(!load_rom("robokid.18c", TMP+0x50000, 0x10000)) return; // 16x16 BG1 * if(!load_rom("robokid.15d", TMP+0x60000, 0x10000)) return; // 16x16 BG1 * if(!load_rom("robokid.16d", TMP+0x70000, 0x10000)) return; // 16x16 BG1 * if(!MS1DecodeBG1(TMP,0x80000))return; memset(TMP,0xFF,0x80000); if(!load_rom("robokid.12a", TMP+0x00000, 0x10000)) return; // 16x16 BG2 if(!load_rom("robokid.14a", TMP+0x10000, 0x10000)) return; // 16x16 BG2 * if(!load_rom("robokid.15a", TMP+0x20000, 0x10000)) return; // 16x16 BG2 if(!load_rom("robokid.16a", TMP+0x30000, 0x10000)) return; // 16x16 BG2 * (why 16c?) if(!load_rom("robokid.17a", TMP+0x40000, 0x10000)) return; // 16x16 BG2 * if(!load_rom("robokid.18a", TMP+0x50000, 0x10000)) return; // 16x16 BG2 * if(!MS1DecodeBG2(TMP,0x80000))return; FreeMem(TMP); RoboKidBG012Init(); RAM_BG0 = RAM_VIDEO+0x1000; RAM_BG1 = RAM_VIDEO+0x0800; RAM_BG2 = RAM_VIDEO+0x0000; RAM_FG0 = RAM+0xC800; RAM_SPR = RAM+0xFA00; SCR_BG0 = RAM+0xDD00; SCR_BG1 = RAM+0xDE00; SCR_BG2 = RAM+0xDF00; mask_bg0 = 0x00; mask_bg1 = 0x00; mask_bg2 = 0x00; mask_fg0 = 0x30; mask_spr = 0x20; InitPaletteMap(RAM+0xC000, 0x40, 0x10, 0x1000); set_colour_mapper(&col_map_rrrr_gggg_bbbb_xxxx_68k); AddLoadCallback(RoboKidLoadUpdate); AddSaveData(SAVE_USER_0, (UINT8 *) &Z80Bank, sizeof(Z80Bank)); AddSaveData(SAVE_USER_1, (UINT8 *) &sound_byte, sizeof(sound_byte));}void ClearRoboKid(void){ #ifdef RAINE_DEBUG save_debug("RAM.BIN", RAM, RAMSize, 0); #endif}void ExecuteRoboKidFrame(void){ cpu_execute_cycles(CPU_Z80_1, CPU_FRAME_MHz(8,60)); // Main Z80 8MHz (60fps) /*#ifdef RAINE_DEBUG print_debug("Z80PC_MAIN:%04x [%04x]\n",z80pc,ReadWord(&RAM[0xE000])); #endif*/ cpu_interrupt(CPU_Z80_1, 0x10); cpu_execute_cycles(CPU_Z80_2, CPU_FRAME_MHz(6,60)); // Sub Z80 6MHz (60fps) /*#ifdef RAINE_DEBUG print_debug("Z80PC_SUB:%04x\n",z80pc); #endif*/ cpu_interrupt(CPU_Z80_2, 0x38); cpu_interrupt(CPU_Z80_2, 0x38);}static UINT16 bg_map[0x10] ={ 0x0000+0x0000+0x0000+0x0000, // 0x00 0x0800+0x0000+0x0000+0x0000, // 0x10 0x0000+0x0400+0x0000+0x0000, // 0x20 0x0800+0x0400+0x0000+0x0000, // 0x30
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -