📄 rainbow.c
字号:
{ "ri_m01.rom", 0x00080000, 0xb76c9168, 0, 0, 0, }, { "ri_m02.rom", 0x00080000, 0x1b87ecf0, 0, 0, 0, }, { "ri_m03.rom", 0x00020000, 0x3ebb0fb8, 0, 0, 0, }, { "ri_m04.rom", 0x00020000, 0x91625e7f, 0, 0, 0, }, { "b22-14", 0x00010000, 0x113c1a5b, 0, 0, 0, }, { "b22-13", 0x00010000, 0x2fda099f, 0, 0, 0, }, { "b22-12", 0x00010000, 0x67a76dc6, 0, 0, 0, }, { "ri_04.rom", 0x00010000, 0x4caa53bd, 0, 0, 0, }, { "ri_03.rom", 0x00010000, 0x4a4cb785, 0, 0, 0, }, { "ri_02.rom", 0x00010000, 0x4dead71f, 0, 0, 0, }, { "ri_01.rom", 0x00010000, 0x50690880, 0, 0, 0, }, { "jb1_f89", 0x00010000, 0x0810d327, 0, 0, 0, }, { NULL, 0, 0, 0, 0, 0, },};struct GAME_MAIN game_rainbow_islands_extra ={ rainbow_islands_extra_dirs, rainbow_islands_extra_roms, rainbow_islands_inputs, rainbow_islands_dsw, rainbow_islands_romsw, LoadRainbowE, ClearRainbow, &rainbow_islands_video, ExecuteRainbowFrame, "rainbowe", "Rainbow Islands (extra)", "儗僀儞儃乕傾僀儔儞僪僄僉僗僩儔", COMPANY_ID_TAITO, "B22", 1988, taito_ym2151_sound, GAME_PLATFORM,};#if 0static mapper_direct *col_mapper[3] ={ &Map_15bit_xBGR, // Original &Map_15bit_xBGR, // Extra //&Map_12bit_xBGR_Rev, // Bootleg};#endifstatic UINT8 *RAM_VIDEO;static UINT8 *RAM_SCROLL;static UINT8 *RAM_OBJECT;static UINT8 *GFX_BG0;static UINT8 *GFX_BG0_SOLID;static UINT8 *GFX_SPR;static UINT8 *GFX_SPR_SOLID;static int romset; // 0=ORIGINAL; 1=EXTRA; 2=JUMPINGstatic int subset;static UINT16 JumpingRead_b800(UINT16 offset);static void Jumpingsound_w(UINT32 offset,UINT8 data);static UINT8 *CBANK[8];static int CChip_Bank=0;static int CChip_ID=0x01;static int CChipReadB(UINT32 address){ int i; i=address&0x0FFF; switch(i){ case 0x803: return(CChip_ID); break; case 0xC01: return(CChip_Bank); break; default:#ifdef RAINE_DEBUG if(i>0x20){ print_debug("CCRB[%02x][%03x](%02x)\n",CChip_Bank,i,CBANK[CChip_Bank][i]); print_ingame(60,"CCRB[%02x][%03x](%02x)",CChip_Bank,i,CBANK[CChip_Bank][i]); }#endif return(CBANK[CChip_Bank][i]); break; }}static int CChipReadW(UINT32 address){ return(CChipReadB(address+1));}static void CChipWriteB(UINT32 address, int data){ int i; i=address&0x0FFF; switch(i){ case 0x11: // cchip[0][0x011]: COIN LEDS CBANK[CChip_Bank][i]=data; switch_led(0,(data>>4)&1); // Coin A [Coin Inserted] switch_led(1,(data>>5)&1); // Coin B [Coin Inserted] switch_led(2,((data>>6)&1)^1); // Coin A [Ready for coins] //switch_led(3,((data>>7)&1)^1); // Coin B [Ready for coins] break; case 0x803: break; case 0xC01: CChip_Bank=data&7; break; case 0x283: CBANK[0][i]=data; break; case 0x201: switch(CBANK[0][0x283]){ case 0x00: CBANK[1][0x285]=0x00; CBANK[1][0x287]=0x03; CBANK[1][0x289]=0x00; CBANK[1][0x28b]=0x00; break; case 0x01: CBANK[1][0x285]=0x00; CBANK[1][0x287]=0x03; CBANK[1][0x289]=0x03; CBANK[1][0x28b]=0x60; break; case 0x02: CBANK[1][0x285]=0x00; CBANK[1][0x287]=0x03; CBANK[1][0x289]=0x07; CBANK[1][0x28b]=0x98; break; case 0x03: CBANK[1][0x285]=0x00; CBANK[1][0x287]=0x03; CBANK[1][0x289]=0x0C; CBANK[1][0x28b]=0xA8; break; case 0x04: CBANK[1][0x285]=0x00; CBANK[1][0x287]=0x03; CBANK[1][0x289]=0x11; CBANK[1][0x28b]=0xB8; break; case 0x05: CBANK[1][0x285]=0x00; CBANK[1][0x287]=0x03; CBANK[1][0x289]=0x15; CBANK[1][0x28b]=0xF0; break; case 0x06: CBANK[1][0x285]=0x00; CBANK[1][0x287]=0x03; CBANK[1][0x289]=0x1B; CBANK[1][0x28b]=0x00; break; case 0x07: CBANK[1][0x285]=0x00; CBANK[1][0x287]=0x03; CBANK[1][0x289]=0x21; CBANK[1][0x28b]=0xC0; break; case 0x08: CBANK[1][0x285]=0x00; CBANK[1][0x287]=0x03; CBANK[1][0x289]=0x25; CBANK[1][0x28b]=0xB8; break; case 0x09: CBANK[1][0x285]=0x00; CBANK[1][0x287]=0x03; CBANK[1][0x289]=0x28; CBANK[1][0x28b]=0xF0; break; case 0x0A: CBANK[1][0x285]=0x00; CBANK[1][0x287]=0x03; CBANK[1][0x289]=0x2C; CBANK[1][0x28b]=0x00; break; case 0x0B: CBANK[1][0x285]=0x00; CBANK[1][0x287]=0x03; CBANK[1][0x289]=0x30; CBANK[1][0x28b]=0xC0; break; default: CBANK[1][0x285]=0x00; CBANK[1][0x287]=0x03; CBANK[1][0x289]=0x40; CBANK[1][0x28b]=0x00; break; } switch(CBANK[0][0x283]){ case 0x00: CBANK[1][0x005]=0x02; CBANK[1][0x003]=0xDC; break; case 0x01: CBANK[1][0x005]=0x03; CBANK[1][0x003]=0xB4; break; case 0x02: CBANK[1][0x005]=0x04; CBANK[1][0x003]=0x44; break; case 0x03: CBANK[1][0x005]=0x04; CBANK[1][0x003]=0xFC; break; case 0x04: CBANK[1][0x005]=0x03; CBANK[1][0x003]=0x7C; break; case 0x05: CBANK[1][0x005]=0x04; CBANK[1][0x003]=0x8C; break; case 0x06: CBANK[1][0x005]=0x06; CBANK[1][0x003]=0x3C; break; case 0x07: CBANK[1][0x005]=0x03; CBANK[1][0x003]=0x74; break; default: CBANK[1][0x005]=0x02; CBANK[1][0x003]=0xDC; break; } CBANK[1][0x201]=0xFF; break; default: break; }}static void CChipWriteW(UINT32 address, int data){ CChipWriteB(address+1,data&0xFF);}/*0 - Insect1 - Combat2 - Monster3 - Toy4 - Doh5 - Robot6 - Dragon7 - Magical8 - Darius9 - Bubble*/static UINT8 rmap[40] ={ (8*4)+0,(8*4)+1,(8*4)+2,(8*4)+3, (7*4)+0,(7*4)+1,(7*4)+2,(7*4)+3, (6*4)+0,(6*4)+1,(6*4)+2,(6*4)+3, (5*4)+0,(5*4)+1,(5*4)+2,(5*4)+3, (4*4)+0,(4*4)+1,(4*4)+2,(4*4)+3, (3*4)+0,(3*4)+1,(3*4)+2,(3*4)+3, (2*4)+0,(2*4)+1,(2*4)+2,(2*4)+3, (1*4)+0,(1*4)+1,(1*4)+2,(1*4)+3, (0*4)+0,(0*4)+1,(0*4)+2,(0*4)+3, (9*4)+0,(9*4)+1,(9*4)+2,(9*4)+3,};static UINT8 rmap_mask[16] ={ 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0};static void LoadActual(void){ int ta,tb,tc; UINT8 *TMP; RAMSize=0x34000; if(!(ROM=AllocateMem(0xA0000))) return; if(!(RAM=AllocateMem(RAMSize))) return; // $1B004 if(!(GFX=AllocateMem(0x240000))) return; GFX_SPR = GFX+0x000000; GFX_BG0 = GFX+0x140000; CBANK[0]=RAM+0x20000; CBANK[1]=RAM+0x20800; CBANK[2]=RAM+0x21000; CBANK[3]=RAM+0x21800; CBANK[4]=RAM+0x22000; CBANK[5]=RAM+0x22800; CBANK[6]=RAM+0x23000; CBANK[7]=RAM+0x23800; if(romset==2){ // Bootleg Z80ROM=RAM+0x24000; if(!load_rom("jb1_cd67", Z80ROM, 0x10000)) return; // Z80 SOUND ROM Z80ROM[0x186]=0xC3; // JP 0068h Z80ROM[0x187]=0x68; // Z80ROM[0x188]=0x00; // Z80ROM[0x068]=0xF3; // DI Z80ROM[0x069]=0xCD; // CALL 02B6h Z80ROM[0x06A]=0xB6; // Z80ROM[0x06B]=0x02; // Z80ROM[0x06C]=0xFB; // EI Z80ROM[0x06D]=0xCD; // CALL 1C8Fh Z80ROM[0x06E]=0x8F; // Z80ROM[0x06F]=0x1C; // Z80ROM[0x070]=0xCD; // CALL 04DCh Z80ROM[0x071]=0xDC; // Z80ROM[0x072]=0x04; // Z80ROM[0x073]=0xD3; // OUTA (AAh) Z80ROM[0x074]=0xAA; // Z80ROM[0x075]=0xCD; // CALL 1C8Fh Z80ROM[0x076]=0x8F; // Z80ROM[0x077]=0x1C; // Z80ROM[0x078]=0xCD; // CALL 04DCh Z80ROM[0x079]=0xDC; // Z80ROM[0x07A]=0x04; // Z80ROM[0x07B]=0xD3; // OUTA (AAh) Z80ROM[0x07C]=0xAA; // Z80ROM[0x07D]=0xCD; // CALL 1C8Fh Z80ROM[0x07E]=0x8F; // Z80ROM[0x07F]=0x1C; // Z80ROM[0x080]=0xCD; // CALL 04DCh Z80ROM[0x081]=0xDC; // Z80ROM[0x082]=0x04; // Z80ROM[0x083]=0xD3; // OUTA (AAh) Z80ROM[0x084]=0xAA; // Z80ROM[0x085]=0xC3; // JP 0068h Z80ROM[0x086]=0x68; // Z80ROM[0x087]=0x00; // AddZ80AROMBase(Z80ROM, 0x0038, 0x0066); AddZ80AReadByte(0xB000, 0xB001, YM2203AReadZ80, NULL); AddZ80AReadByte(0xB400, 0xB401, YM2203BReadZ80, NULL); AddZ80AReadByte(0xB800, 0xB800, JumpingRead_b800, NULL); AddZ80AReadByte(0x0000, 0xFFFF, NULL, Z80ROM+0x0000); // Z80 ROM/RAM AddZ80AReadByte(0x0000, 0xFFFF, DefBadReadZ80, NULL); AddZ80AReadByte( -1, -1, NULL, NULL); AddZ80AWriteByte(0xB000, 0xB001, YM2203AWriteZ80, NULL); AddZ80AWriteByte(0xB400, 0xB401, YM2203BWriteZ80, NULL); AddZ80AWriteByte(0x0000, 0xFFFF, NULL, Z80ROM+0x0000); // Z80 RAM AddZ80AWriteByte(0x0000, 0xFFFF, DefBadWriteZ80, NULL); AddZ80AWriteByte( -1, -1, NULL, NULL); AddZ80AReadPort(0x00, 0xFF, DefBadReadZ80, NULL); AddZ80AReadPort( -1, -1, NULL, NULL); AddZ80AWritePort(0xAA, 0xAA, StopZ80, NULL); // Trap Idle Z80 AddZ80AWritePort(0x00, 0xFF, DefBadWriteZ80, NULL); AddZ80AWritePort( -1, -1, NULL, NULL); AddZ80AInit(); } else{ // Original/Extra /*-----[Sound Setup]-----*/ Z80ROM=RAM+0x24000; if(!load_rom("b22-14", Z80ROM, 0x10000)) return; // Z80 SOUND ROM/* Z80ROM[0x0268]=0x00; // Fix timers causing sound drops Z80ROM[0x0269]=0x00; Z80ROM[0x026C]=0x00; Z80ROM[0x026D]=0x00; Z80ROM[0x0076]=0x00; Z80ROM[0x0077]=0x00;*/ AddTaitoYM2151(0x0259, 0x01E8, 0x10000, NULL, NULL); /*-----------------------*/ } if(romset==1){ if(!load_rom("ri_m01.rom", ROM, 0x80000)) return; tb=0; for(ta=0;ta<0x80000;ta+=2){ GFX_BG0[tb++]=ROM[ta+1]>>4; GFX_BG0[tb++]=ROM[ta+1]&15; GFX_BG0[tb++]=ROM[ta+0]>>4; GFX_BG0[tb++]=ROM[ta+0]&15; } if(!load_rom("ri_m02.rom", ROM, 0x80000)) return; tb=0; for(ta=0;ta<0x80000;ta+=2){ GFX_SPR[tb++]=ROM[ta+1]>>4; GFX_SPR[tb++]=ROM[ta+1]&15; GFX_SPR[tb++]=ROM[ta+0]>>4; GFX_SPR[tb++]=ROM[ta+0]&15; } if(!load_rom("b22-12",ROM+0x00000,0x10000)) return; if(!load_rom("b22-13",ROM+0x10000,0x10000)) return; for(ta=0;ta<0x10000;ta++){ GFX_SPR[tb++]=ROM[ta+0x10000]>>4; GFX_SPR[tb++]=ROM[ta+0x10000]&15; GFX_SPR[tb++]=ROM[ta]>>4; GFX_SPR[tb++]=ROM[ta]&15; } if(!load_rom("ri_01.rom", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta]=RAM[ta]; } if(!load_rom("ri_02.rom", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+1]=RAM[ta]; } if(!load_rom("ri_03.rom", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0x20000]=RAM[ta]; } if(!load_rom("ri_04.rom", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0x20001]=RAM[ta]; } if(!load_rom("ri_m03.rom", RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta+0x40000]=RAM[ta]; } if(!load_rom("ri_m04.rom", RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta+0x40001]=RAM[ta]; } if(!load_rom("jb1_f89", RAM, 0x10000)) return; // BOOTLEG C-CHIP for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0x80000]=0; ROM[ta+ta+0x80001]=RAM[ta]; } for(tc=0;tc<40;tc++){ for(ta=0;ta<0x10;ta++){ if(rmap_mask[ta]!=0){ tb=ta+0x4950; ROM[tb+tb+0x80000+(tc<<5)]=0; ROM[tb+tb+0x80001+(tc<<5)]=RAM[tb+(rmap[tc]<<4)]; } } } } if(romset==0){ if(!load_rom("ri_m01.rom", ROM, 0x80000)) return; // Came From Extra tb=0; for(ta=0;ta<0x80000;ta+=2){ GFX_BG0[tb++]=ROM[ta+1]>>4; GFX_BG0[tb++]=ROM[ta+1]&15; GFX_BG0[tb++]=ROM[ta+0]>>4; GFX_BG0[tb++]=ROM[ta+0]&15; } if(!load_rom("ri_m02.rom", ROM, 0x80000)) return; // Came From Extra
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -