📄 ksystem.c
字号:
AddZ80BWriteByte(0xC000, 0xE7FF, NULL, RAM+0xC000); // RAM AddZ80BWriteByte(0xE800, 0xE8FF, KSystemMCUWrite, NULL); // MCU COMM AREA AddZ80BWriteByte(0xE900, 0xEFFF, NULL, RAM+0xE900); // RAM AddZ80BWriteByte(0xF000, 0xF000, KSystemNewBankWrite, NULL); // ROM BANK AddZ80BWriteByte(0xF008, 0xF008, KSystemF008Write, NULL); // MCU?? AddZ80BWriteByte(0xF010, 0xF010, KSystemInputWrite, NULL); // INPUT AddZ80BWriteByte(0xF018, 0xF018, NULL, RAM+0xF018); // WATCHDOG 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 reads> AddZ80BWritePort(-1, -1, NULL, NULL); AddZ80BInit(); FreeMem(TMP); if(!load_rom("a85-11.rom",ROM2,0x8000)) return; // Z80 SUB ROM // Skip Idle Z80 // ------------- ROM2[0x007F]=0x00; // NOP ROM2[0x0080]=0x00; // NOP ROM2[0x00BE]=0xC3; // JP 00A4 ROM2[0x00BF]=0xA4; // ROM2[0x00C0]=0x00; // ROM2[0x009C]=0x1A; // ROM2[0x009D]=0x32; // ROM2[0x009E]=0xFD; // ROM2[0x009F]=0x9F; // ROM2[0x00A0]=0x36; // ROM2[0x00A1]=0x0F; // ROM2[0x00A2]=0x18; // ROM2[0x00A3]=0x10; // ROM2[0x00A4]=0xD3; // OUTA (AAh) ROM2[0x00A5]=0xAA; // ROM2[0x00A6]=0x7E; // ROM2[0x00A7]=0xFE; // ROM2[0x00A8]=0xFF; // ROM2[0x00A9]=0x28; // ROM2[0x00AA]=0xF9; // ROM2[0x00AB]=0xC3; // ROM2[0x00AC]=0xC3; // ROM2[0x00AD]=0x00; // SetStopZ80CMode2(0x00A6); memset(RAM2+0x00000, 0x00, 0x10000); memcpy(RAM2, ROM2, 0x8000); AddZ80CROMBase(RAM2, 0x0038, 0x0066); AddZ80CReadByte(0x0000, 0x7FFF, NULL, RAM2+0x0000); // Z80 ROM AddZ80CReadByte(0x8000, 0x9FFF, NULL, RAM +0xC000); // COMMON RAM AddZ80CReadByte(0xC000, 0xC001, KSystemYM2203Read, NULL); // YM2203; INPUT AddZ80CReadByte(0xA800, 0xC7FF, NULL, RAM2+0xA800); // RAM? AddZ80CReadByte(0x0000, 0xFFFF, DefBadReadZ80, NULL); // <bad reads> AddZ80CReadByte(-1, -1, NULL, NULL); AddZ80CWriteByte(0x8000, 0x9FFF, NULL, RAM +0xC000); // COMMON RAM AddZ80CWriteByte(0xC000, 0xC001, KSystemYM2203Write, NULL); // YM2203; INPUT AddZ80CWriteByte(0xA800, 0xC7FF, NULL, RAM2+0xA800); // RAM? AddZ80CWriteByte(0x0000, 0xFFFF, DefBadWriteZ80, NULL); // <bad writes> AddZ80CWriteByte(-1, -1, NULL, NULL); AddZ80CReadPort(0x00, 0xFF, DefBadReadZ80, NULL); // <bad reads> AddZ80CReadPort(-1, -1, NULL, NULL); AddZ80CWritePort(0xAA, 0xAA, StopZ80CMode2, NULL); // Trap Idle Z80 AddZ80CWritePort(0x00, 0xFF, DefBadWriteZ80, NULL); // <bad reads> AddZ80CWritePort(-1, -1, NULL, NULL); AddZ80CInit(); /* MCU ROM */ if(!load_rom("knightb.uc",RAM_MCU,0x800)) return; if(!(GFX=AllocateMem(0x080000))) return; if(!(TMP=AllocateMem(0x040000))) return; tb=0; if(!load_rom("a85-15.rom", TMP+0x00000, 0x10000)) return; if(!load_rom("a85-14.rom", TMP+0x10000, 0x10000)) return; if(!load_rom("a85-13.rom", TMP+0x20000, 0x10000)) return; if(!load_rom("a85-12.rom", TMP+0x30000, 0x10000)) return; for(ta=0;ta<0x20000;ta+=2,tb+=8){ DrawNibble0(GFX+tb+0, 0, (UINT8) (TMP[ta+0x00000]&15) ); DrawNibble (GFX+tb+0, 1, (UINT8) (TMP[ta+0x00000]>>4) ); DrawNibble (GFX+tb+0, 2, (UINT8) (TMP[ta+0x20000]&15) ); DrawNibble (GFX+tb+0, 3, (UINT8) (TMP[ta+0x20000]>>4) ); DrawNibble0(GFX+tb+4, 0, (UINT8) (TMP[ta+0x00001]&15) ); DrawNibble (GFX+tb+4, 1, (UINT8) (TMP[ta+0x00001]>>4) ); DrawNibble (GFX+tb+4, 2, (UINT8) (TMP[ta+0x20001]&15) ); DrawNibble (GFX+tb+4, 3, (UINT8) (TMP[ta+0x20001]>>4) ); } tb=0; if(!load_rom("a85-08.rom", TMP+0x00000, 0x80)) return; if(!load_rom("a85-10.rom", TMP+0x00080, 0x80)) return; if(!load_rom("a85-09.rom", TMP+0x00100, 0x80)) return; for(ta=0;ta<0x80;ta++,tb+=2){ td = (ta&0x70)|(0x0F-(ta&0x0F)); tc = (TMP[td+0x000]&0x0F)<<8; tc |= (TMP[td+0x080]&0x0F)<<4; tc |= (TMP[td+0x100]&0x0F)<<0; WriteWord(&RAM_COLOUR[tb+0x000],tc); WriteWord(&RAM_COLOUR[tb+0x100],tc); } FreeMem(TMP); GFX_BG0_SOLID = make_solid_mask_8x8(GFX, 0x2000);}void LoadKnightBoy(void){ int ta,tb,tc,td; UINT8 *TMP; romset=0; Z80BankCount=0x20000/0x4000; mcu_enable=0; RAMSize=0x10000+0x10000+0x10+0x200+0x800; if(!(ROM=AllocateMem(0xC000*Z80BankCount))) return; if(!(ROM2=AllocateMem(0x8000))) return; if(!(RAM=AllocateMem(RAMSize))) return; RAM2 = RAM+0x10000; RAM_INPUT = RAM+0x10000+0x10000; RAM_COLOUR = RAM+0x10000+0x10000+0x10; RAM_MCU = RAM+0x10000+0x10000+0x10+0x200; if(!(TMP=AllocateMem(0x20000))) return; if(!load_rom("a85-17.rom",TMP+0x00000,0x10000)) return; // Z80 MAIN ROM if(!load_rom("a85-16.rom",TMP+0x10000,0x10000)) return; // Z80 MAIN ROM // Fix Checksum TMP[0x485a]=0xC9; // RET // Skip Idle Z80 TMP[0x0503]=0x28; // JR Z,#0508 TMP[0x0504]=0x03; // TMP[0x0505]=0xD3; // OUTA (AAh) TMP[0x0506]=0xAA; // SetStopZ80BMode2(0x04FF); init_bank_rom(TMP,ROM); memset(RAM+0x00000, 0x00, 0x10000); memcpy(RAM, ROM, 0x8000+0x4000); AddZ80BROMBase(RAM, 0x0038, 0x0066); AddZ80BReadByte(0x0000, 0xBFFF, NULL, NULL); // Z80 ROM/BANK ROM AddZ80BReadByte(0xC000, 0xE7FF, NULL, RAM+0xC000); // RAM AddZ80BReadByte(0xE800, 0xE8FF, KSystemMCURead, NULL); // MCU COMM AREA AddZ80BReadByte(0xE900, 0xEFFF, NULL, RAM+0xE900); // RAM AddZ80BReadByte(0xF010, 0xF010, KSystemInputRead, NULL); // INPUT AddZ80BReadByte(0x0000, 0xFFFF, DefBadReadZ80, NULL); // <bad reads> AddZ80BReadByte(-1, -1, NULL, NULL); AddZ80BWriteByte(0xC000, 0xE7FF, NULL, RAM+0xC000); // RAM AddZ80BWriteByte(0xE800, 0xE8FF, KSystemMCUWrite, NULL); // MCU COMM AREA AddZ80BWriteByte(0xE900, 0xEFFF, NULL, RAM+0xE900); // RAM AddZ80BWriteByte(0xF000, 0xF000, KSystemNewBankWrite, NULL); // ROM BANK AddZ80BWriteByte(0xF008, 0xF008, KSystemF008Write, NULL); // MCU?? AddZ80BWriteByte(0xF010, 0xF010, KSystemInputWrite, NULL); // INPUT AddZ80BWriteByte(0xF018, 0xF018, NULL, RAM+0xF018); // WATCHDOG 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 reads> AddZ80BWritePort(-1, -1, NULL, NULL); AddZ80BInit(); FreeMem(TMP); if(!load_rom("a85-11.rom",ROM2,0x8000)) return; // Z80 SUB ROM // Skip Idle Z80 // ------------- ROM2[0x007F]=0x00; // NOP ROM2[0x0080]=0x00; // NOP ROM2[0x00BE]=0xC3; // JP 00A4 ROM2[0x00BF]=0xA4; // ROM2[0x00C0]=0x00; // ROM2[0x009C]=0x1A; // ROM2[0x009D]=0x32; // ROM2[0x009E]=0xFD; // ROM2[0x009F]=0x9F; // ROM2[0x00A0]=0x36; // ROM2[0x00A1]=0x0F; // ROM2[0x00A2]=0x18; // ROM2[0x00A3]=0x10; // ROM2[0x00A4]=0xD3; // OUTA (AAh) ROM2[0x00A5]=0xAA; // ROM2[0x00A6]=0x7E; // ROM2[0x00A7]=0xFE; // ROM2[0x00A8]=0xFF; // ROM2[0x00A9]=0x28; // ROM2[0x00AA]=0xF9; // ROM2[0x00AB]=0xC3; // ROM2[0x00AC]=0xC3; // ROM2[0x00AD]=0x00; // SetStopZ80CMode2(0x00A6); memset(RAM2+0x00000, 0x00, 0x10000); memcpy(RAM2, ROM2, 0x8000); AddZ80CROMBase(RAM2, 0x0038, 0x0066); AddZ80CReadByte(0x0000, 0x7FFF, NULL, RAM2+0x0000); // Z80 ROM AddZ80CReadByte(0x8000, 0x9FFF, NULL, RAM +0xC000); // COMMON RAM AddZ80CReadByte(0xC000, 0xC001, KSystemYM2203Read, NULL); // YM2203; INPUT AddZ80CReadByte(0xA000, 0xC7FF, NULL, RAM2+0xA000); // RAM? AddZ80CReadByte(0x0000, 0xFFFF, DefBadReadZ80, NULL); // <bad reads> AddZ80CReadByte(-1, -1, NULL, NULL); AddZ80CWriteByte(0x8000, 0x9FFF, NULL, RAM +0xC000); // COMMON RAM AddZ80CWriteByte(0xC000, 0xC001, KSystemYM2203Write, NULL); // YM2203; INPUT AddZ80CWriteByte(0xA000, 0xC7FF, NULL, RAM2+0xA000); // RAM? AddZ80CWriteByte(0x0000, 0xFFFF, DefBadWriteZ80, NULL); // <bad writes> AddZ80CWriteByte(-1, -1, NULL, NULL); AddZ80CReadPort(0x00, 0xFF, DefBadReadZ80, NULL); // <bad reads> AddZ80CReadPort(-1, -1, NULL, NULL); AddZ80CWritePort(0xAA, 0xAA, StopZ80CMode2, NULL); // Trap Idle Z80 AddZ80CWritePort(0x00, 0xFF, DefBadWriteZ80, NULL); // <bad reads> AddZ80CWritePort(-1, -1, NULL, NULL); AddZ80CInit(); /* MCU ROM */ if(!load_rom("knightb.uc",RAM_MCU,0x800)) return; if(!(GFX=AllocateMem(0x080000))) return; if(!(TMP=AllocateMem(0x040000))) return; tb=0; if(!load_rom("knightb.d", TMP+0x00000, 0x10000)) return; if(!load_rom("a85-14.rom", TMP+0x10000, 0x10000)) return; if(!load_rom("knightb.b", TMP+0x20000, 0x10000)) return; if(!load_rom("a85-12.rom", TMP+0x30000, 0x10000)) return; for(ta=0;ta<0x20000;ta+=2,tb+=8){ DrawNibble0(GFX+tb+0, 0, (UINT8) (TMP[ta+0x00000]&15) ); DrawNibble (GFX+tb+0, 1, (UINT8) (TMP[ta+0x00000]>>4) ); DrawNibble (GFX+tb+0, 2, (UINT8) (TMP[ta+0x20000]&15) ); DrawNibble (GFX+tb+0, 3, (UINT8) (TMP[ta+0x20000]>>4) ); DrawNibble0(GFX+tb+4, 0, (UINT8) (TMP[ta+0x00001]&15) ); DrawNibble (GFX+tb+4, 1, (UINT8) (TMP[ta+0x00001]>>4) ); DrawNibble (GFX+tb+4, 2, (UINT8) (TMP[ta+0x20001]&15) ); DrawNibble (GFX+tb+4, 3, (UINT8) (TMP[ta+0x20001]>>4) ); } tb=0; if(!load_rom("a85-08.rom", TMP+0x00000, 0x80)) return; if(!load_rom("a85-10.rom", TMP+0x00080, 0x80)) return; if(!load_rom("a85-09.rom", TMP+0x00100, 0x80)) return; for(ta=0;ta<0x80;ta++,tb+=2){ td = (ta&0x70)|(0x0F-(ta&0x0F)); tc = (TMP[td+0x000]&0x0F)<<8; tc |= (TMP[td+0x080]&0x0F)<<4; tc |= (TMP[td+0x100]&0x0F)<<0; WriteWord(&RAM_COLOUR[tb+0x000],tc); WriteWord(&RAM_COLOUR[tb+0x100],tc); } FreeMem(TMP); GFX_BG0_SOLID = make_solid_mask_8x8(GFX, 0x2000);}void ClearKSystem(void){ #ifdef RAINE_DEBUG save_debug("RAM.bin", RAM, RAMSize, 0); save_debug("GFX.bin", GFX, 0x080000, 0); #endif}/* this is a patch for Kicn&Run. * it hacks it to accept an MCU from Mexico86. * If we ever got a proper K&R dump, we could probably remove this patch. */static UINT8 PatchTable[] = { 0x3E, 0x00, 0x32, 0x4A, 0xE8, 0x32, 0x4B, 0xE8, 0x32, 0x77, 0xE8, 0x32, 0x54, 0xE8, 0x32, 0x60, 0xE8, 0x3E, 0x37, 0x32, 0x4C, 0xE8, 0x3E, 0x12, 0x32, 0x4F, 0xE8, 0x3E, 0x08, 0x32, 0x7B, 0xE8, 0x3E, 0x80, 0x32, 0x7F, 0xE8, 0x3E, 0x92, 0x32, 0x00, 0xE8, 0xC9};void LoadKickRun(void){ int ta,tb,tc,td; UINT8 *TMP; romset=1; Z80BankCount=0x20000/0x4000; mcu_enable=0; RAMSize=0x10000+0x10000+0x10+0x200+0x800; if(!(ROM=AllocateMem(0xC000*Z80BankCount))) return; if(!(ROM2=AllocateMem(0x8000))) return; if(!(RAM=AllocateMem(RAMSize))) return; RAM2 = RAM+0x10000; RAM_INPUT = RAM+0x10000+0x10000; RAM_COLOUR = RAM+0x10000+0x10000+0x10; RAM_MCU = RAM+0x10000+0x10000+0x10+0x200; if(!(TMP=AllocateMem(0x20000))) return; if(!load_rom("a87-08.bin",TMP+0x00000,0x10000)) return; // Z80 MAIN ROM if(!load_rom("a87-07.bin",TMP+0x10000,0x10000)) return; // Z80 MAIN ROM /* Mexico86 is a bootleg of Kick&Run. We don't have a MCU dump for K&R, so * we will use Mexico86's. However, the Mex86 dump is not quite an 100% * copy, so we need to patch Kick&Run to accept it. * If we ever got a proper K&R dump, we could probably remove this patch. */ TMP[0x01C8] = 0x92; TMP[0x0207] = 0x3E; TMP[0x0208] = 0x92; TMP[0x0209] = 0x00; TMP[0x0223] = 0x18; TMP[0x07D1] = 0x18; for (ta=0;ta<sizeof(PatchTable);ta++) { TMP[0x084C+ta] = PatchTable[ta]; } for (ta=0x0877;ta<=0x08b1;ta++) TMP[ta] = 0xff; init_bank_rom(TMP,ROM); memset(RAM, 0x00, RAMSize); memcpy(RAM, ROM, 0x8000+0x4000); AddZ80BROMBase(RAM, 0x0038, 0x0066); AddZ80BReadByte(0x0000, 0xBFFF, NULL, NULL); // Z80 ROM/BANK ROM AddZ80BReadByte(0xC000, 0xE7FF, NULL, RAM+0xC000); // RAM AddZ80BReadByte(0xE800, 0xE8FF, KSystemMCURead, NULL); // MCU AddZ80BReadByte(0xE900, 0xEFFF, NULL, RAM+0xE900); // RAM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -