⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ksystem.c

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 C
📖 第 1 页 / 共 4 页
字号:
   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 + -