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

📄 upl.c

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 C
📖 第 1 页 / 共 5 页
字号:
static UINT8 sound_byte;static void UPLSoundWrite(UINT16 offset, UINT8 data){   sound_byte = data;}static UINT8 UPLSoundRead(UINT16 offset){   UINT8 ta;   ta = sound_byte;   sound_byte = 0xFF;   return ta;}/******************************************************************************//* ROBO KID VIDEO RAM BANKING                                                 *//******************************************************************************/#if 0static UINT8 *BG_BANK[4];static void UPLBG0BankWrite(UINT16 offset, UINT8 data){   BG_BANK[2] = RAM_VIDEO+(2<<11)+((data&1)<<10);}static void UPLBG1BankWrite(UINT16 offset, UINT8 data){   BG_BANK[1] = RAM_VIDEO+(1<<11)+((data&1)<<10);}static void UPLBG2BankWrite(UINT16 offset, UINT8 data){   BG_BANK[0] = RAM_VIDEO+(0<<11)+((data&1)<<10);}static void UPLBG012Write(UINT16 offset, UINT8 data){   BG_BANK[(offset>>10)&3][offset&0x3FF] = data;}static UINT8 UPLBG012Read(UINT16 offset){   return BG_BANK[(offset>>10)&3][offset&0x3FF];}static void UPLBG012Init(void){   BG_BANK[0] = RAM_VIDEO+(0<<11);   BG_BANK[1] = RAM_VIDEO+(1<<11);   BG_BANK[2] = RAM_VIDEO+(2<<11);   BG_BANK[3] = RAM_VIDEO+(3<<11);}#endif/******************************************************************************//* GFX DECODES (from MS-1)                                                    *//******************************************************************************/static int MS1DecodeFG0(UINT8 *src, UINT32 size){   UINT32 ta,tb;   if(!(GFX_FG0=AllocateMem(0x10000))) return(0);   memset(GFX_FG0,0x00,0x10000);   tb=0;   for(ta=0;ta<size;ta++,tb+=2){      GFX_FG0[tb+0]=(src[ta]>>4)^15;      GFX_FG0[tb+1]=(src[ta]&15)^15;   }   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&0x7F)==0){tb-=0x78;}      else{if((tb&0x7F)==8){tb-=8;}}   }   SPR_Mask = make_solid_mask_16x16(GFX_SPR, 0x1000);   return 1;}static int MS1DecodeSPR_TypeB(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 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&0x7F)==0){tb-=0x78;}      else{if((tb&0x7F)==8){tb-=8;}}   }   BG0_Mask = make_solid_mask_16x16(GFX_BG0, 0x1000);   return 1;}static int MS1DecodeBG2_TypeB(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_TypeB(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_TypeB(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 UPLLoadUpdate(void){   UINT8 ta;   // Bank Refresh   ta = Z80Bank;   Z80Bank = -1;   UPLBankWrite(0,ta);}/******************************************************************************/void LoadNinjaKid2(void){   UINT8 *TMP;   int ta;   romset=0;   Z80BankCount=0x20000/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(0x28000))) return;   if(!load_rom("nk2_01.rom",TMP+0x00000,0x08000)) return;	// Z80 MAIN ROM *   if(!load_rom("nk2_02.rom",TMP+0x08000,0x08000)) return;	// Z80 MAIN ROM   if(!load_rom("nk2_03.rom",TMP+0x10000,0x08000)) return;	// Z80 MAIN ROM   if(!load_rom("nk2_04.rom",TMP+0x18000,0x08000)) return;	// Z80 MAIN ROM   if(!load_rom("nk2_05.rom",TMP+0x20000,0x08000)) return;	// Z80 MAIN ROM   // Fix ROM Checksum   // ----------------   TMP[0x2984]=0x18;  // JR xx   // Decustomize Interrupt   // ---------------------   TMP[0x0039]=0x10;   // Skip Idle Z80   // -------------   TMP[0x02C2]=0xD3;  // OUTA (AAh)   TMP[0x02C3]=0xAA;  //   SetStopZ80BMode2(0x02C4);   init_bank_rom(TMP,ROM,2);   memset(RAM+0x00000, 0x00, 0x10000);   memset(RAM+0x0C000, 0xFF, 0x00010);   memcpy(RAM, TMP, 0x8000+0x4000);   AddZ80BROMBase(RAM, 0x0010, 0x0066);   AddZ80BReadByte(0x0000, 0xBFFF, NULL,			NULL);		// Z80 ROM/BANK ROM   AddZ80BReadByte(0xC800, 0xFFFF, NULL,			RAM+0xC800);	// COLOR/FG0/BG0/RAM/OBJECT   AddZ80BReadByte(0xC000, 0xC00F, NULL,			RAM+0xC000);	// INPUT   AddZ80BReadByte(0x0000, 0xFFFF, DefBadReadZ80,		NULL);		// <bad reads>   AddZ80BReadByte(-1, -1, NULL, NULL);   AddZ80BWriteByte(0xC800, 0xFFFF, NULL,			RAM+0xC800);	// COLOR/FG0/BG0/RAM/OBJECT   AddZ80BWriteByte(0xC202, 0xC202, UPLBankWrite,		NULL);		// ROM BANK   AddZ80BWriteByte(0xC200, 0xC200, UPLSoundWrite,		NULL);		// SOUND   AddZ80BWriteByte(0xC100, 0xC7FF, NULL,			RAM+0xC100);	// MISC CTRL   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   if(!load_rom("nk2_06.rom",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, UPLSoundRead,		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(0x040000))) return;   if(!load_rom("nk2_12.rom", TMP+0x8000, 0x8000)) return;    // 8x8 FG0 TILES *   for(ta=0;ta<0x2000;ta++){      TMP[ta+ta+0x0000]=TMP[ta+0x08000];	// Interleave      TMP[ta+ta+0x0001]=TMP[ta+0x0A000];      TMP[ta+ta+0x4000]=TMP[ta+0x0C000];	// Interleave      TMP[ta+ta+0x4001]=TMP[ta+0x0E000];   }   if(!MS1DecodeFG0(TMP,0x08000))return;   if(!load_rom("nk2_08.rom", TMP+0x20000, 0x10000)) return;  // 16x16 SPRITES *   if(!load_rom("nk2_07.rom", TMP+0x30000, 0x10000)) return;  // 16x16 SPRITES *   for(ta=0;ta<0x4000;ta++){      TMP[ta+ta+0x00000]=TMP[ta+0x20000];	// Interleave      TMP[ta+ta+0x00001]=TMP[ta+0x24000];      TMP[ta+ta+0x08000]=TMP[ta+0x28000];	// Interleave      TMP[ta+ta+0x08001]=TMP[ta+0x2C000];      TMP[ta+ta+0x10000]=TMP[ta+0x30000];	// Interleave      TMP[ta+ta+0x10001]=TMP[ta+0x34000];      TMP[ta+ta+0x18000]=TMP[ta+0x38000];	// Interleave      TMP[ta+ta+0x18001]=TMP[ta+0x3C000];   }   if(!MS1DecodeSPR(TMP,0x20000))return;   if(!load_rom("nk2_11.rom", TMP+0x20000, 0x10000)) return;  // 16x16 BG0 *   if(!load_rom("nk2_10.rom", TMP+0x30000, 0x10000)) return;  // 16x16 BG0 *   for(ta=0;ta<0x4000;ta++){      TMP[ta+ta+0x00000]=TMP[ta+0x20000];	// Interleave      TMP[ta+ta+0x00001]=TMP[ta+0x24000];      TMP[ta+ta+0x08000]=TMP[ta+0x28000];	// Interleave      TMP[ta+ta+0x08001]=TMP[ta+0x2C000];      TMP[ta+ta+0x10000]=TMP[ta+0x30000];	// Interleave      TMP[ta+ta+0x10001]=TMP[ta+0x34000];      TMP[ta+ta+0x18000]=TMP[ta+0x38000];	// Interleave      TMP[ta+ta+0x18001]=TMP[ta+0x3C000];   }   if(!MS1DecodeBG0(TMP,0x20000))return;   FreeMem(TMP);   InitPaletteMap(RAM+0xC800, 0x40, 0x10, 0x1000);   set_colour_mapper(&col_map_rrrr_gggg_bbbb_xxxx_68k);   AddLoadCallback(UPLLoadUpdate);   AddSaveData(SAVE_USER_0, (UINT8 *) &Z80Bank,             sizeof(Z80Bank));   AddSaveData(SAVE_USER_1, (UINT8 *) &sound_byte,          sizeof(sound_byte));   // Init Video Hardware   // -------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -