📄 othunder.c
字号:
ROM[0x7FF06]=0x13; // move.b #$00,$AA0000 ROM[0x7FF07]=0xFC; // (Speed Hack) ROM[0x7FF08]=0x00; ROM[0x7FF09]=0x00; ROM[0x7FF0A]=0x00; ROM[0x7FF0B]=0xAA; ROM[0x7FF0C]=0x00; ROM[0x7FF0D]=0x00; ROM[0x7FF0E]=0x60; // Loop ROM[0x7FF0F]=0x100-0x0A; // EEPROM Read Hack // ---------------- WriteLong68k(&ROM[0xCD68],0x4E560000); // link a6,#0 WriteLong68k(&ROM[0xCD6C],0x48E7C0C0); // movem.l D0-D1/a0-a1,-(a7) WriteLong68k(&ROM[0xCD70],0x206E0008); // movea.l 8(a6),a0 WriteLong68k(&ROM[0xCD74],0x322E000C); // move 12(a6),D1 WriteLong68k(&ROM[0xCD78],0x02810000); // andi.l #$0000003F,D1 WriteWord68k(&ROM[0xCD7C],0x003F); // WriteWord68k(&ROM[0xCD7E],0x43F9); // lea EXT_0000,a1 WriteLong68k(&ROM[0xCD80],0x00BB0000); // WriteWord68k(&ROM[0xCD84],0xE349); // lsL #1,D1 WriteWord68k(&ROM[0xCD86],0xD2C1); // adda D1,a1 WriteWord68k(&ROM[0xCD88],0x3091); // move (a1),(a0) WriteLong68k(&ROM[0xCD8A],0x4CDF0303); // movem.l (a7)+,D0-D1/a0-a1 WriteWord68k(&ROM[0xCD8E],0x4E5E); // unlk a6 WriteWord68k(&ROM[0xCD90],0x4E75); // rts // EEPROM Write Hack // ----------------- WriteLong68k(&ROM[0xCE32],0x4E560000); // link a6,#0 WriteLong68k(&ROM[0xCE36],0x48E7C0C0); // movem.l D0-D1/a0-a1,-(a7) WriteLong68k(&ROM[0xCE3A],0x206E0008); // movea.l 8(a6),a0 WriteLong68k(&ROM[0xCE3E],0x322E000C); // move 12(a6),D1 WriteLong68k(&ROM[0xCE42],0x02810000); // andi.l #$0000003F,D1 WriteWord68k(&ROM[0xCE46],0x003F); // WriteWord68k(&ROM[0xCE48],0x43F9); // lea EXT_0000,a1 WriteLong68k(&ROM[0xCE4A],0x00BB0000); // WriteWord68k(&ROM[0xCE4E],0xE349); // lsL #1,D1 WriteWord68k(&ROM[0xCE50],0xD2C1); // adda D1,a1 WriteWord68k(&ROM[0xCE52],0x3290); // move (a0),(a1) WriteLong68k(&ROM[0xCE54],0x4CDF0303); // movem.l (a7)+,D0-D1/a0-a1 WriteWord68k(&ROM[0xCE58],0x4E5E); // unlk a6 WriteWord68k(&ROM[0xCE5A],0x4E75); // rts // Init tc0220ioc emulation // ------------------------ tc0220ioc.RAM = RAM_INPUT; tc0220ioc.ctrl = 0; //TC0220_STOPCPU; reset_tc0220ioc(); // Init tc0100scn emulation // ------------------------ tc0100scn[0].layer[0].RAM =RAM_VIDEO+0x0000; tc0100scn[0].layer[0].GFX =GFX; tc0100scn[0].layer[0].MASK =GFX_BG0_SOLID; tc0100scn[0].layer[0].SCR =RAM_SCROLL+0; tc0100scn[0].layer[0].type =0; tc0100scn[0].layer[0].bmp_x =64; tc0100scn[0].layer[0].bmp_y =64; tc0100scn[0].layer[0].bmp_w =320; tc0100scn[0].layer[0].bmp_h =240; tc0100scn[0].layer[0].mapper =&Map_15bit_xRGB; tc0100scn[0].layer[0].tile_mask=0x3FFF; tc0100scn[0].layer[0].scr_x =20; tc0100scn[0].layer[0].scr_y =8; tc0100scn[0].layer[1].RAM =RAM_VIDEO+0x8000; tc0100scn[0].layer[1].GFX =GFX; tc0100scn[0].layer[1].MASK =GFX_BG0_SOLID; tc0100scn[0].layer[1].SCR =RAM_SCROLL+2; tc0100scn[0].layer[1].type =0; tc0100scn[0].layer[1].bmp_x =64; tc0100scn[0].layer[1].bmp_y =64; tc0100scn[0].layer[1].bmp_w =320; tc0100scn[0].layer[1].bmp_h =240; tc0100scn[0].layer[1].mapper =&Map_15bit_xRGB; tc0100scn[0].layer[1].tile_mask=0x3FFF; tc0100scn[0].layer[1].scr_x =20; tc0100scn[0].layer[1].scr_y =8; tc0100scn[0].layer[2].RAM =RAM_VIDEO+0x4000; tc0100scn[0].layer[2].GFX =GFX_FG0; tc0100scn[0].layer[2].SCR =RAM_SCROLL+4; tc0100scn[0].layer[2].type =3; tc0100scn[0].layer[2].bmp_x =64; tc0100scn[0].layer[2].bmp_y =64; tc0100scn[0].layer[2].bmp_w =320; tc0100scn[0].layer[2].bmp_h =240; tc0100scn[0].layer[2].mapper =&Map_15bit_xRGB; tc0100scn[0].layer[2].scr_x =20; tc0100scn[0].layer[2].scr_y =8; tc0100scn[0].RAM = RAM_VIDEO; tc0100scn[0].GFX_FG0 = GFX_FG0; init_tc0100scn(0);/* * StarScream Stuff follows */ ByteSwap(ROM,0x80000); ByteSwap(RAM,0x3C000); AddMemFetch(0x000000, 0x07FFFF, ROM+0x000000-0x000000); // 68000 ROM AddMemFetch(-1, -1, NULL); AddReadByte(0x000000, 0x07FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadByte(0x080000, 0x08FFFF, NULL, RAM+0x000000); // MAIN RAM AddReadByte(0x200000, 0x20FFFF, NULL, RAM_VIDEO); // SCREEN RAM AddReadByte(0x090000, 0x09000F, NULL, RAM_INPUT); // INPUT AddReadByte(0x500000, 0x50000F, NULL, RAM+0x028200); // GUN PORTS AddReadByte(0x000000, 0xFFFFFF, DefBadReadByte, NULL); // <Bad Reads> AddReadByte(-1, -1, NULL, NULL); AddReadWord(0x000000, 0x07FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadWord(0x080000, 0x08FFFF, NULL, RAM+0x000000); // MAIN RAM AddReadWord(0x200000, 0x20FFFF, NULL, RAM_VIDEO); // SCREEN RAM AddReadWord(0x400000, 0x4005FF, NULL, RAM+0x020000); // SPRITE RAM AddReadWord(0x090000, 0x09000F, NULL, RAM_INPUT); // INPUT AddReadWord(0x100000, 0x100007, tc0110pcr_rw, NULL); // COLOR RAM AddReadWord(0x300000, 0x300003, tc0140syt_read_main_68k, NULL); // SOUND COMM AddReadWord(0xBB0000, 0xBB007F, NULL, EEPROM+0x000000); // EEPROM AddReadWord(0x000000, 0xFFFFFF, DefBadReadWord, NULL); // <Bad Reads> AddReadWord(-1, -1, NULL, NULL); AddWriteByte(0x080000, 0x08FFFF, NULL, RAM+0x000000); // MAIN RAM AddWriteByte(0x206000, 0x206FFF, tc0100scn_0_gfx_fg0_wb, NULL); // FG0 GFX RAM AddWriteByte(0x200000, 0x20FFFF, NULL, RAM_VIDEO); // SCREEN RAM AddWriteByte(0x500000, 0x50000F, NULL, RAM+0x028200); // GUN PORTS AddWriteByte(0x090000, 0x09000F, tc0220ioc_wb, NULL); // INPUT 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); // 68000 RAM AddWriteWord(0x206000, 0x206FFF, tc0100scn_0_gfx_fg0_ww, NULL); // FG0 GFX RAM AddWriteWord(0x200000, 0x20FFFF, NULL, RAM_VIDEO); // SCREEN RAM AddWriteWord(0x400000, 0x4005FF, NULL, RAM+0x020000); // SPRITE RAM AddWriteWord(0x100000, 0x100007, tc0110pcr_ww, NULL); // COLOR RAM AddWriteWord(0x220000, 0x22000F, NULL, RAM_SCROLL); // SCROLL RAM AddWriteWord(0x500000, 0x50000F, NULL, RAM+0x028200); // GUN PORTS AddWriteWord(0x300000, 0x300003, tc0140syt_write_main_68k, NULL); // SOUND COMM AddWriteWord(0x600000, 0x60000F, NULL, RAM+0x028400); // ??? RAM AddWriteWord(0x090000, 0x09000F, tc0220ioc_ww, NULL); // INPUT AddWriteWord(0xBB0000, 0xBB007F, NULL, EEPROM+0x000000); // EEPROM AddWriteWord(0x000000, 0xFFFFFF, DefBadWriteWord, NULL); // <Bad Writes> AddWriteWord(-1, -1, NULL, NULL); AddInitMemory(); // Set Starscream mem pointers... x1=64; myy1=64; x2=64; y2=64; GameMouse=1;}void ClearOpThunderbolt(void){ RemoveTaitoYM2610(); save_eeprom(); #ifdef RAINE_DEBUG //save_debug("ROM.bin",ROM,0x080000,1); save_debug("RAM.bin",RAM,0x058000,1); //save_debug("GFX.bin",GFX,0x55B000,0); #endif}void ExecuteOpThunderboltFrame(void){ /*------[Mouse Hack]-------*/ set_mouse_range(0,0,319,239); x11=319-mouse_x; myy11=mouse_y; x1=(x11<<7)/320; myy1=(myy11<<7)/240; if(x1<0){x1=0;} if(x1>127){x1=127;} if(myy1<0){myy1=0;} if(myy1>127){myy1=127;} if(mouse_b&1) RAM[0x2800E] &= ~0x01; if(mouse_b&2) RAM[0x2800E] &= ~0x04; /*-----[Keyboard Hack]-----*/ if(((RAM[0x28010]&0x01)!=0)&&(myy1> 0)) myy1--; if(((RAM[0x28010]&0x02)!=0)&&(myy1<127)) myy1++; if(((RAM[0x28010]&0x08)!=0)&&(x1> 0)) x1--; if(((RAM[0x28010]&0x04)!=0)&&(x1<127)) x1++; if(((RAM[0x28020]&0x01)!=0)&&(y2> 0)) y2--; if(((RAM[0x28020]&0x02)!=0)&&(y2<127)) y2++; if(((RAM[0x28020]&0x08)!=0)&&(x2> 0)) x2--; if(((RAM[0x28020]&0x04)!=0)&&(x2<127)) x2++; /*----[Write Positions]----*/ RAM[0x2854]=x1+128-64; RAM[0x2856]=myy1+128-64; RAM[0x2858]=x2+128-64; RAM[0x285A]=y2+128-64; /*------[EE-ROM Hack]------*/ WriteLong(&RAM[0xA026+0x00], 0x00C00040); WriteLong(&RAM[0xA026+0x04], 0x80000002); WriteLong(&RAM[0xA026+0x08], 0x00C00040); WriteLong(&RAM[0xA026+0x0C], 0xE0000001); WriteLong(&RAM[0xA026+0x10], 0x00C00040); WriteLong(&RAM[0xA026+0x14], 0x80000002); WriteLong(&RAM[0xA026+0x18], 0x00C00040); WriteLong(&RAM[0xA026+0x1C], 0xE0000001); WriteLong(&RAM[0xA026+0x20], 0x00800080); WriteLong(&RAM[0xA026+0x24], 0x00800080); WriteLong(&RAM[0xA026+0x28], 0x80000002); WriteLong(&RAM[0xA026+0x2C], 0xE0000001); WriteLong(&RAM[0xA026+0x30], 0x80000002); WriteLong(&RAM[0xA026+0x34], 0xE0000001); WriteLong(&RAM[0xA026+0x38], 0x80000002); WriteLong(&RAM[0xA026+0x3C], 0xE0000001); WriteLong(&RAM[0xA026+0x40], 0x80000002); WriteLong(&RAM[0xA026+0x44], 0xE0000001); WriteLong(&RAM[0xA026+0x24], 0x00800080); cpu_execute_cycles(CPU_68K_0, CPU_FRAME_MHz(12,60)); // M68000 12MHz (60fps) cpu_interrupt(CPU_68K_0, 5); cpu_interrupt(CPU_68K_0, 6); Taito2610_Frame(); // Z80 and YM2610}void DrawOpThunderbolt(void){ int x,y,z,ta,zz; UINT8 *MAP; ClearPaletteMap(); // Init tc0100scn emulation // ------------------------ tc0100scn_layer_count = 0; tc0100scn[0].ctrl = ReadWord(RAM_SCROLL+12); // BG0 // --- render_tc0100scn_layer_mapped_flipy(0,0); // OBJECT LOW // ---------- for(zz=0x20600-8;zz>=0x20000;zz-=8){ if((RAM[zz+3]&0x80)!=0){ z=(RAM[zz+1]>>1)&63; if(z!=0){ y=RAM[zz]; if((RAM[zz+1]&1)!=0){y=0-((y^255)+1);} y=32+19+y; x=ReadWord(&RAM[zz+2])&0x1FF; if(x>400){x=0-((x^511)+1);} x=(320+(63-z))-x; if((x>0)&&(y>0)&&(x<320+64)&&(y<240+64)){ ta=ReadWord(&RAM[zz+6])&0x7FF; if((ta!=0)&&(ta<0x559)){ MAP_PALETTE_MAPPED_NEW( RAM[zz+5], 16, MAP ); if((RAM[zz+7]&0x80)==0){ if((RAM[zz+3]&0x40)!=0){ Draw64x64_Trans_Mapped_Zoom(&GFX_SPR[ta<<12],x,y,MAP,z);} else{ Draw64x64_Trans_Mapped_Zoom_FlipY(&GFX_SPR[ta<<12],x,y,MAP,z);} } else{ if((RAM[zz+3]&0x40)!=0){ Draw64x64_Trans_Mapped_Zoom_FlipX(&GFX_SPR[ta<<12],x,y,MAP,z);} else{ Draw64x64_Trans_Mapped_Zoom_FlipXY(&GFX_SPR[ta<<12],x,y,MAP,z);} } } } } } } // BG1 // --- render_tc0100scn_layer_mapped_flipy(0,1); // OBJECT HIGH // ----------- for(zz=0x20600-8;zz>=0x20000;zz-=8){ if((RAM[zz+3]&0x80)==0){ z=(RAM[zz+1]>>1)&63; if(z!=0){ y=RAM[zz]; if((RAM[zz+1]&1)!=0){y=0-((y^255)+1);} y=32+19+y; x=ReadWord(&RAM[zz+2])&0x1FF; if(x>400){x=0-((x^511)+1);} x=(320+(63-z))-x; if((x>0)&&(y>0)&&(x<320+64)&&(y<240+64)){ ta=ReadWord(&RAM[zz+6])&0x7FF; if((ta!=0)&&(ta<0x559)){ MAP_PALETTE_MAPPED_NEW( RAM[zz+5], 16, MAP ); //(*Zoom64x64_Trans_Mapped_JumpList[z])(&GFX_SPR[ta<<12],x,y,MAP); if((RAM[zz+7]&0x80)==0){ if((RAM[zz+3]&0x40)!=0){ Draw64x64_Trans_Mapped_Zoom(&GFX_SPR[ta<<12],x,y,MAP,z);} else{ Draw64x64_Trans_Mapped_Zoom_FlipY(&GFX_SPR[ta<<12],x,y,MAP,z);} } else{ if((RAM[zz+3]&0x40)!=0){ Draw64x64_Trans_Mapped_Zoom_FlipX(&GFX_SPR[ta<<12],x,y,MAP,z);} else{ Draw64x64_Trans_Mapped_Zoom_FlipXY(&GFX_SPR[ta<<12],x,y,MAP,z);} } } } } } } // FG0 // --- render_tc0100scn_layer_mapped_flipy(0,2); // GUNS // ---- x=(64+(((127-x2)*320)>>7))-7; // Player 2 y=(64+((y2*240)>>7))-(7+16); if((x>48)&&(y>48)&&(x<320+64)&&(y<240+64)){ Draw16x16_Trans(SpriteGun2,x,y,0); } x=(64+(319-x11))-7; // Player 1 y=(64+myy11)-(7+16); if((x>48)&&(y>48)&&(x<320+64)&&(y<240+64)){ Draw16x16_Trans(SpriteGun1,x,y,0); } pal[254].r=0; pal[254].g=0; pal[254].b=0; pal[253].r=31; pal[253].g=31; pal[253].b=63; pal[252].r=63; pal[252].g=31; pal[252].b=31;}/*Sprite List Format (8 bytes/sprite)===================================Byte | Bit(s) | Description-----+76543210+-------------------- 0 |.xxxxxx.| ZoomY (0-63) 0 |.......x| Y Position (High) 1 |xxxxxxxx| Y Position (Low) 2 |.x......| Flip Y Axis 2 |x.......| Sprite:BG1 Priority 2 |..?????x| X Position (High) 3 |xxxxxxxx| X Position (Low) 4 |xxxxxxxx| Palette Bank 5 |..xxxxxx| ZoomX (0-63) 6 |x.......| Flip X Axis? 6 |.....xxx| Sprite Number (High) 7 |xxxxxxxx| Sprite Number (Low)*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -