📄 darius.c
字号:
WriteWord68k(&ROM[0x013c4],0x4E71); // Fix Sub 68000 Checksum WriteLong68k(&ROM[0x60A0A],0x4E714E71); } memset(RAM+0x00000,0x00,0x44000); InitPaletteMap(RAM+0x31000, 0x80, 0x10, 0x8000); // Main 68000 Memory Map // --------------------- ByteSwap(ROM,0xA0000); ByteSwap(RAM,0x44000); AddMemFetch(0x000000, 0x05FFFF, ROM+0x000000-0x000000); // 68000 ROM AddMemFetch(-1, -1, NULL); AddReadByte(0x000000, 0x05FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadByte(0x080000, 0x08FFFF, NULL, RAM+0x000000); // MAIN RAM AddReadByte(0xD00000, 0xD0FFFF, NULL, RAM+0x010000); // SCREEN RAM AddReadByte(0xE00000, 0xE10FFF, NULL, RAM+0x020000); // COMMON RAM AddReadByte(0xC00000, 0xC000FF, darius_ioc_rb, NULL); // I/O AddReadByte(0x000000, 0xFFFFFF, DefBadReadByte, NULL); // <Bad Reads> AddReadByte(-1, -1, NULL, NULL); AddReadWord(0x000000, 0x05FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadWord(0x080000, 0x08FFFF, NULL, RAM+0x000000); // MAIN RAM AddReadWord(0xD00000, 0xD0FFFF, NULL, RAM+0x010000); // SCREEN RAM AddReadWord(0xD80000, 0xD80FFF, NULL, RAM+0x031000); // COLOUR RAM AddReadWord(0xE00000, 0xE10FFF, NULL, RAM+0x020000); // COMMON RAM AddReadWord(0xC00000, 0xC000FF, darius_ioc_rw, NULL); // I/O AddReadWord(0x000000, 0xFFFFFF, BadReadWord, NULL); // <Bad Reads> AddReadWord(-1, -1,NULL, NULL); AddWriteByte(0x080000, 0x08FFFF, NULL, RAM+0x000000); // MAIN RAM AddWriteByte(0xD00000, 0xD0FFFF, NULL, RAM+0x010000); // SCREEN RAM AddWriteByte(0xE00000, 0xE10FFF, NULL, RAM+0x020000); // COMMON RAM AddWriteByte(0xC00000, 0xC000FF, darius_ioc_wb, NULL); // I/O AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByte(0x000000, 0xFFFFFF, DefBadWriteByte, NULL); // <Bad Writes> AddWriteByte(-1, -1, NULL, NULL); AddWriteWord(0x080000, 0x08FFFF, NULL, RAM+0x000000); // MAIN RAM AddWriteWord(0xD00000, 0xD0FFFF, NULL, RAM+0x010000); // SCREEN RAM AddWriteWord(0xD80000, 0xD80FFF, NULL, RAM+0x031000); // COLOUR RAM AddWriteWord(0xE00000, 0xE10FFF, NULL, RAM+0x020000); // COMMON RAM AddWriteWord(0xD20000, 0xD20003, NULL, RAM+0x042100); // YSCROLL RAM AddWriteWord(0xD40000, 0xD40003, NULL, RAM+0x042200); // XSCROLL RAM AddWriteWord(0xC00000, 0xC000FF, darius_ioc_ww, NULL); // I/O AddWriteWord(0x000000, 0xFFFFFF, BadWriteWord, NULL); // <Bad Writes> AddWriteWord(-1, -1, NULL, NULL); AddInitMemory(); // Set Starscream mem pointers... // Sub 68000 Memory Map // -------------------- AddMemFetchMC68000B(0x000000, 0x03FFFF, ROM+0x060000-0x000000); // 68000 ROM AddMemFetchMC68000B(-1, -1, NULL); AddReadByteMC68000B(0x000000, 0x03FFFF, NULL, ROM+0x060000); // 68000 ROM AddReadByteMC68000B(0x040000, 0x04FFFF, NULL, RAM+0x032000); // SUB LOCAL RAM AddReadByteMC68000B(0xE00000, 0xE10FFF, NULL, RAM+0x020000); // COMMON RAM AddReadByteMC68000B(0x000000, 0xFFFFFF, DefBadReadByte, NULL); // <Bad Reads> AddReadByteMC68000B(-1, -1, NULL, NULL); AddReadWordMC68000B(0x000000, 0x03FFFF, NULL, ROM+0x060000); // 68000 ROM AddReadWordMC68000B(0x040000, 0x04FFFF, NULL, RAM+0x032000); // SUB LOCAL RAM AddReadWordMC68000B(0xD80000, 0xD80FFF, NULL, RAM+0x031000); // COLOUR RAM AddReadWordMC68000B(0xE00000, 0xE10FFF, NULL, RAM+0x020000); // COMMON RAM AddReadWordMC68000B(0x000000, 0xFFFFFF, BadReadWord, NULL); // <Bad Reads> AddReadWordMC68000B(-1, -1, NULL, NULL); AddWriteByteMC68000B(0x040000, 0x04FFFF, NULL, RAM+0x032000); // SUB LOCAL RAM AddWriteByteMC68000B(0xE00000, 0xE10FFF, NULL, RAM+0x020000); // COMMON RAM AddWriteByteMC68000B(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByteMC68000B(0x000000, 0xFFFFFF, DefBadWriteByte, NULL); // <Bad Writes> AddWriteByteMC68000B(-1, -1, NULL, NULL); AddWriteWordMC68000B(0x040000, 0x04FFFF, NULL, RAM+0x032000); // SUB LOCAL RAM AddWriteWordMC68000B(0xD80000, 0xD80FFF, NULL, RAM+0x031000); // COLOUR RAM AddWriteWordMC68000B(0xE00000, 0xE10FFF, NULL, RAM+0x020000); // COMMON RAM AddWriteWordMC68000B(0xC00000, 0xC000FF, NULL, RAM+0x042000); // I/O RAM AddWriteWordMC68000B(0x000000, 0xFFFFFF, BadWriteWord, NULL); // <Bad Writes> AddWriteWordMC68000B(-1, -1, NULL, NULL); AddInitMemoryMC68000B(); // Set Starscream mem pointers... }void LoadDarius(void){ LoadActual(0);}void LoadDariusExtra(void){ LoadActual(1);}void LoadDariusAlt(void){ LoadActual(2);}void LoadDariuso(void){ LoadActual(3);}void ClearDarius(void){ RemoveTaitoSoundBanking();}void ExecuteDariusFrame(void){ tcpu=0; cpu_execute_cycles(CPU_68K_0, CPU_FRAME_MHz(12,60)); // M68000 12MHz (60fps) tcpu=1; cpu_execute_cycles(CPU_68K_1, 90000*2); tcpu=0; cpu_execute_cycles(CPU_68K_0, CPU_FRAME_MHz(12,60)); // M68000 12MHz (60fps) #ifdef RAINE_DEBUG print_debug("PC0:%06x SR0:%04x\n",s68000context.pc,s68000context.sr); #endif cpu_interrupt(CPU_68K_0, 4); tcpu=1; cpu_execute_cycles(CPU_68K_1, 90000*2); #ifdef RAINE_DEBUG print_debug("PC1:%06x SR1:%04x\n",s68000context.pc,s68000context.sr); #endif cpu_interrupt(CPU_68K_1, 4); if(tc0140syt_want_nmi()!=0) cpu_int_nmi(CPU_Z80_0); //cpu_execute_cycles(CPU_Z80_0, 4000000/60*2); // Sound Main Z80 cpu_execute_cycles(CPU_Z80_0, 5000000/60); // Sound Main Z80 /*#ifdef RAINE_DEBUG print_debug("Z80PC0:%04x\n",z80pc); #endif*/ cpu_interrupt(CPU_Z80_0, 0x38);}void DrawDarius(void){ int x,y,ta,zz,zzz,zzzz; int x16,y16; UINT8 *map; ClearPaletteMap(); // BG0 // --- MAKE_SCROLL_1024x512_2_8( 0-(ReadWord(&RAM[0x42200])), 0-(ReadWord(&RAM[0x42100])) ); START_SCROLL_1024x512_2_8(32,32,864,224); ta = ReadWord(&RAM[0x14000+zz])&0x3FFF; MAP_PALETTE_MAPPED( Map_15bit_xBGR, RAM[0x10000+zz]&0x3F, 16, map ); switch(RAM[0x10001+zz]&0xC0){ case 0x00: Draw8x8_Mapped(&GFX_BG0[ta<<6],x,y,map); break; case 0x40: Draw8x8_Mapped_FlipY(&GFX_BG0[ta<<6],x,y,map); break; case 0x80: Draw8x8_Mapped_FlipX(&GFX_BG0[ta<<6],x,y,map); break; case 0xC0: Draw8x8_Mapped_FlipXY(&GFX_BG0[ta<<6],x,y,map); break; } END_SCROLL_1024x512_2_8(); // OBJECT // ------ for(zz=0x20FF8;zz>=0x20100;zz-=8){ x=(32+ReadWord(&RAM[zz+2]))&0x3FF; y=((240+32)-ReadWord(&RAM[zz]))&0x1FF; if((x>16)&&(y>16)&&(x<864+32)&&(y<224+32)){ ta=ReadWord(&RAM[zz+4])&0x1FFF; if(GFX_SPR_SOLID[ta]){ // No pixels; skip MAP_PALETTE_MAPPED( Map_15bit_xBGR, RAM[zz+6]&0x7F, 16, map ); if(GFX_SPR_SOLID[ta]==1){ // Some pixels; trans switch(RAM[zz+5]&0xC0){ case 0x00: Draw16x16_Trans_Mapped(&GFX_SPR[ta<<8],x,y,map); break; case 0x40: Draw16x16_Trans_Mapped_FlipY(&GFX_SPR[ta<<8],x,y,map); break; case 0x80: Draw16x16_Trans_Mapped_FlipX(&GFX_SPR[ta<<8],x,y,map); break; case 0xC0: Draw16x16_Trans_Mapped_FlipXY(&GFX_SPR[ta<<8],x,y,map); break; } } else{ // all pixels; solid switch(RAM[zz+5]&0xC0){ case 0x00: Draw16x16_Mapped(&GFX_SPR[ta<<8],x,y,map); break; case 0x40: Draw16x16_Mapped_FlipY(&GFX_SPR[ta<<8],x,y,map); break; case 0x80: Draw16x16_Mapped_FlipX(&GFX_SPR[ta<<8],x,y,map); break; case 0xC0: Draw16x16_Mapped_FlipXY(&GFX_SPR[ta<<8],x,y,map); break; } } } } } // BG1 // --- MAKE_SCROLL_1024x512_2_8( 0-(ReadWord(&RAM[0x42202])), 0-(ReadWord(&RAM[0x42102])) ); START_SCROLL_1024x512_2_8(32,32,864,224); ta=ReadWord(&RAM[0x1C000+zz])&0x3FFF; if(GFX_BG0_SOLID[ta]){ // No pixels; skip MAP_PALETTE_MAPPED( Map_15bit_xBGR, RAM[0x18000+zz]&0x3F, 16, map ); if(GFX_BG0_SOLID[ta]==1){ // Some pixels; trans switch(RAM[0x18001+zz]&0xC0){ case 0x00: Draw8x8_Trans_Mapped(&GFX_BG0[ta<<6],x,y,map); break; case 0x40: Draw8x8_Trans_Mapped_FlipY(&GFX_BG0[ta<<6],x,y,map); break; case 0x80: Draw8x8_Trans_Mapped_FlipX(&GFX_BG0[ta<<6],x,y,map); break; case 0xC0: Draw8x8_Trans_Mapped_FlipXY(&GFX_BG0[ta<<6],x,y,map); break; } } else{ // all pixels; solid switch(RAM[0x18001+zz]&0xC0){ case 0x00: Draw8x8_Mapped(&GFX_BG0[ta<<6],x,y,map); break; case 0x40: Draw8x8_Mapped_FlipY(&GFX_BG0[ta<<6],x,y,map); break; case 0x80: Draw8x8_Mapped_FlipX(&GFX_BG0[ta<<6],x,y,map); break; case 0xC0: Draw8x8_Mapped_FlipXY(&GFX_BG0[ta<<6],x,y,map); break; } } } END_SCROLL_1024x512_2_8(); // FG0 // --- zz=0; for(y=32;y<224+32;y+=8){ for(x=32;x<864+32;x+=8){ ta=ReadWord(&RAM[0x2C000+zz])&0x7FF; if(GFX_FG0_SOLID[ta]){ // No pixels; skip MAP_PALETTE_MAPPED( Map_15bit_xBGR, RAM[0x28000+zz]&0x0F, 4, // 4 Colours map ); if(GFX_FG0_SOLID[ta]==1) // Some pixels; trans Draw8x8_Trans_Mapped(&GFX_FG0[ta<<6],x,y,map); else // all pixels; solid Draw8x8_Mapped(&GFX_FG0[ta<<6],x,y,map); } zz+=2; } zz+=(256-216); }}/*-------[YM2203 PORT]-------*/UINT16 DariusRead_YM2203A(UINT16 offset){#if 1 static int aaaa = 0, cnt = 0; if( ++cnt > 200 ){ aaaa = 255; cnt = 0; } else{ aaaa = 0; } return(aaaa);#else if((offset&1)==0){ return YM2203_status_port_0_r(0); } else{ return YM2203_read_port_0_r(0); }#endif}void DariusWrite_YM2203A(UINT16 offset, UINT8 data){ if((offset&1)==0){ YM2203_control_port_0_w(0,data); } else{ YM2203_write_port_0_w(0,data); }}/*-------[YM2203 PORT]-------*/UINT16 DariusRead_YM2203B(UINT16 offset){#if 1 static int aaaa; aaaa^=255; return(aaaa);#else if((offset&1)==0){ return YM2203_status_port_1_r(0); } else{ return YM2203_read_port_1_r(0); }#endif}void DariusWrite_YM2203B(UINT16 offset, UINT8 data){ if((offset&1)==0){ YM2203_control_port_1_w(0,data); } else{ YM2203_write_port_1_w(0,data); }}/*-------[ADPCM PORT]-------*/void DariusWrite_ADPCM(UINT16 offset, UINT8 data){ /*#ifdef RAINE_DEBUG print_debug("DariusADPCM(%02x)\n",data); #endif*/ data&=0x7F; if((data>0)&&(data<=0x1D)){ MSM5205buffer_request( 0, data ); }}static int DariusVolTable[] = { 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38, 0x40, 0x50, 0x60, 0x80, 0xa0, 0xc0, 0xe0, 0xf0,};static int darius_volFM[2];static int darius_volAY[2];static int darius_panFM[2];static int darius_panAY[2];void DariusYM2203SetFMPan( UINT16 offset, UINT8 data ){ int cen; if( !(offset&0x0400) ){ /**** make FM0 ****/ darius_panFM[0] = (~data)&0xff; saSetPan( YM2203_get_stream_num(0), darius_panFM[0] ); cen = darius_panFM[0] < 0x80 ? 0x80 - darius_panFM[0] : -(0x80 - darius_panFM[0]); data = darius_volFM[0] - ((darius_volFM[0] * cen)>>8); //saSetVolume( YM2203_get_stream_num(0), data ); //print_ingame(120,"Pan[0]:%02x %s", darius_panFM[0], stream_get_name(YM2203_get_stream_num(0)) ); } else{ darius_panFM[1] = (~data)&0xff; saSetPan( YM2203_get_stream_num(1), darius_panFM[1] ); cen = darius_panFM[1] < 0x80 ? 0x80 - darius_panFM[1] : -(0x80 - darius_panFM[1]); data = darius_volFM[1] - ((darius_volFM[1] * cen)>>8); //saSetVolume( YM2203_get_stream_num(1), data ); //print_ingame(120,"Pan[1]:%02x %s", darius_panFM[1], stream_get_name(YM2203_get_stream_num(1)) ); }}void DariusYM2203SetAYPan( UINT16 offset, UINT8 data ){ int cen; if( !(offset&0x0400) ){ darius_panAY[0] = (~data)&0xff; darius_volAY[0] = 0xff; saSetPanMulti( AY8910_get_stream_num(0), darius_panAY[0] ); cen = darius_panAY[0] < 0x80 ? 0x80 - darius_panAY[0] : -(0x80 - darius_panAY[0]); data = darius_volAY[0] - ((darius_volAY[0] * cen)>>8); //saSetVolume( AY8910_get_stream_num(0), data ); } else{ darius_panAY[1] = (~data)&0xff; darius_volAY[1] = 0xff; saSetPanMulti( AY8910_get_stream_num(1), darius_panAY[1] ); cen = darius_panAY[1] < 0x80 ? 0x80 - darius_panAY[1] : -(0x80 - darius_panAY[1]); data = darius_volAY[1] - ((darius_volAY[1] * cen)>>8); //saSetVolume( AY8910_get_stream_num(1), data ); }}void DariusVol( int offset, int data ){ int cen; if( (data&0xf0) == 0xf0 ){ //print_ingame(120,"Vol:%02x %s %s", data, stream_get_name(3*2), stream_get_name(3*2+1) ); darius_volFM[0] = DariusVolTable[data&0x0f]; darius_volFM[1] = darius_volFM[0]; /**** make FM0 ****/ cen = darius_panFM[0] < 0x80 ? 0x80 - darius_panFM[0] : -(0x80 - darius_panFM[0]); data = darius_volFM[0] - ((darius_volFM[0] * cen)>>8); //saSetVolume( YM2203_get_stream_num(0), data ); /**** make FM1 ****/ cen = darius_panFM[1] < 0x80 ? 0x80 - darius_panFM[1] : -(0x80 - darius_panFM[1]); data = darius_volFM[1] - ((darius_volFM[1] * cen)>>8); //saSetVolume( YM2203_get_stream_num(1), data ); }}void DariusMSM5205SetPan( UINT16 offset, UINT8 data ){ MSM5205buffer_setpan( 0, data );}/**************** end of file ****************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -