📄 toki.c
字号:
GFX_SPR = GFX+0x040000; GFX_FG0 = GFX+0x000000; for(ta=0;ta<0x100000;ta++){ GFX_BG0[ta]^=15; } for(ta=0;ta<0x100000;ta++){ GFX_BG1[ta]^=15; } for(ta=0;ta<0x040000;ta++){ GFX_FG0[ta]^=15; } RAM_BG0 = RAM+0x0F000; RAM_BG1 = RAM+0x0E800; RAM_SPR = RAM+0x11806; RAM_FG0 = RAM+0x0F800; GFX_BG0_SOLID = make_solid_mask_16x16(GFX_BG0, 0x1000); GFX_BG1_SOLID = make_solid_mask_16x16(GFX_BG1, 0x1000); GFX_SPR_SOLID = make_solid_mask_16x16(GFX_SPR, 0x2000); GFX_FG0_SOLID = make_solid_mask_8x8 (GFX_FG0, 0x1000); Z80ROM=RAM+0x22000; if(!load_rom("toki.e1", Z80ROM, 0x10000)) return; // Z80 SOUND ROM // Apply Speed Patch // ----------------- Z80ROM[0x0E40]=0xD3; // OUTA (AAh) Z80ROM[0x0E41]=0xAA; // SetStopZ80Mode2(0x0E42); // Setup Z80 memory map // -------------------- AddZ80AROMBase(Z80ROM, 0x0038, 0x0066); AddZ80AReadByte(0x0000, 0xBFFF, NULL, Z80ROM+0x0000); // Z80 ROM/BANK ROM AddZ80AReadByte(0xF000, 0xF7FF, NULL, Z80ROM+0xF000); // Z80 RAM AddZ80AReadByte(0xF800, 0xF800, SoundRead, NULL); // COMM AddZ80AReadByte(0xEC00, 0xEC01, YM3812ReadZ80, NULL); AddZ80AReadByte(0xEC08, 0xEC09, YM3812ReadZ80, NULL); AddZ80AReadByte(0x0000, 0xFFFF, DefBadReadZ80, NULL); AddZ80AReadByte( -1, -1, NULL, NULL); AddZ80AWriteByte(0xF000, 0xF7FF, NULL, Z80ROM+0xF000); // Z80 RAM AddZ80AWriteByte(0xEC00, 0xEC01, YM3812WriteZ80, NULL); AddZ80AWriteByte(0xEC08, 0xEC09, YM3812WriteZ80, NULL); AddZ80AWriteByte(0x0000, 0xFFFF, DefBadWriteZ80, NULL); AddZ80AWriteByte( -1, -1, NULL, NULL); AddZ80AReadPort(0x00, 0xFF, DefBadReadZ80, NULL); AddZ80AReadPort( -1, -1, NULL, NULL); AddZ80AWritePort(0xAA, 0xAA, StopZ80Mode2, NULL); AddZ80AWritePort(0x00, 0xFF, DefBadWriteZ80, NULL); AddZ80AWritePort( -1, -1, NULL, NULL); AddZ80AInit(); memset(RAM+0x00000,0x00,0x22000); memset(RAM+0x20000,0xFF,0x00100); // Speed Hack WriteLong68k(&ROM[0x1A1D4],0x13FC0000); WriteLong68k(&ROM[0x1A1D8],0x00AA0000); WriteWord68k(&ROM[0x1A1E2],0x4E71); WriteWord68k(&ROM[0x1A1EA],0x4E71); WriteLong68k(&ROM[0x1A342],0x13FC0000); WriteLong68k(&ROM[0x1A346],0x00AA0000); WriteLong68k(&ROM[0x1A6A2],0x13FC0000); WriteLong68k(&ROM[0x1A6A6],0x00AA0000); // Scroll Sync WriteLong68k(&ROM[0x00288],0x4EF80300); WriteWord68k(&ROM[0x00300],0x33C1); WriteLong68k(&ROM[0x00302],0x00075008); WriteLong68k(&ROM[0x00306],0x13FC0000); WriteLong68k(&ROM[0x0030A],0x00AA0000); WriteWord68k(&ROM[0x0030E],0x4E75); // Sound Comm WriteLong68k(&ROM[0x1D940],0x00BB0000); set_colour_mapper(&col_map_xxxx_bbbb_gggg_rrrr_rev); InitPaletteMap(RAM+0x0E000, 0x40, 0x10, 0x1000);/* * StarScream Stuff follows */ ByteSwap(ROM,0x60000); ByteSwap(RAM,0x20300); AddMemFetch(0x000000, 0x05FFFF, ROM+0x000000-0x000000); // 68000 ROM AddMemFetch(-1, -1, NULL); AddReadByte(0x000000, 0x05FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadByte(0x060000, 0x07FFFF, NULL, RAM+0x000000); // 68000 RAM/VRAM/PALETTE/SPRITE AddReadByte(0x080000, 0x0800FF, NULL, RAM+0x020200); AddReadByte(0x0C0000, 0x0C00FF, NULL, RAM+0x020000); // DSW/INPUT AddReadByte(0x000000, 0xFFFFFF, DefBadReadByte, NULL); // <Bad Reads> AddReadByte(-1, -1, NULL, NULL); AddReadWord(0x000000, 0x05FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadWord(0x060000, 0x07FFFF, NULL, RAM+0x000000); // 68000 RAM/VRAM/PALETTE/SPRITE AddReadWord(0x080000, 0x0800FF, NULL, RAM+0x020200); AddReadWord(0x0C0000, 0x0C00FF, NULL, RAM+0x020000); // DSW/INPUT AddReadWord(0x000000, 0xFFFFFF, DefBadReadWord, NULL); // <Bad Reads> AddReadWord(-1, -1,NULL, NULL); AddWriteByte(0x060000, 0x07FFFF, NULL, RAM+0x000000); // 68000 RAM/VRAM/PALETTE/SPRITE AddWriteByte(0x080000, 0x0800FF, NULL, RAM+0x020200); AddWriteByte(0x0A0000, 0x0A00FF, NULL, RAM+0x020100); AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByte(0xBB0000, 0xBB0001, SoundWrite, NULL); // Sound Comm AddWriteByte(0x000000, 0xFFFFFF, DefBadWriteByte, NULL); // <Bad Writes> AddWriteByte(-1, -1, NULL, NULL); AddWriteWord(0x060000, 0x07FFFF, NULL, RAM+0x000000); // 68000 RAM/VRAM/PALETTE/SPRITE AddWriteWord(0x080000, 0x0800FF, NULL, RAM+0x020200); AddWriteWord(0x0A0000, 0x0A00FF, NULL, RAM+0x020100); AddWriteWord(0x000000, 0xFFFFFF, DefBadWriteByte, NULL); // <Bad Writes> AddWriteWord(-1, -1, NULL, NULL); AddInitMemory(); // Set Starscream mem pointers...}void ClearToki(void){ #ifdef RAINE_DEBUG save_debug("ROM.bin",ROM,0x060000,1); //save_debug("RAM.bin",RAM,0x022000,1); //save_debug("GFX.bin",GFX,0x440000,0); #endif}void ExecuteTokiFrame(void){ static int ta; cpu_execute_cycles(CPU_68K_0, CPU_FRAME_MHz(16,60)); // M68000 12MHz (60fps) cpu_interrupt(CPU_68K_0, 1); cpu_execute_cycles(CPU_68K_0, CPU_FRAME_MHz(4,60)); // Sync ta++; cpu_execute_cycles(CPU_Z80_0, CPU_FRAME_MHz(1,60)); // Z80 4MHz (60fps) Timer on YM3812 needs fixing!! cpu_execute_cycles(CPU_Z80_0, CPU_FRAME_MHz(1,60)); // Z80 4MHz (60fps) cpu_execute_cycles(CPU_Z80_0, CPU_FRAME_MHz(1,60)); // Z80 4MHz (60fps) if(ta&1) cpu_execute_cycles(CPU_Z80_0, CPU_FRAME_MHz(1,60)); // Z80 4MHz (60fps)}void DrawToki(void){ int zz,zzz,zzzz,x16,y16,x,y,ta,ofs_x,col_msk; UINT8 *map; UINT8 *RAM_BG,*GFX_BG,*MSK_BG,*SCR_BG; ClearPaletteMap(); if(RAM_FG0[0x710]!=0x44){ RAM_BG = RAM_BG0; GFX_BG = GFX_BG0; MSK_BG = GFX_BG0_SOLID; SCR_BG = RAM+0x15008; ofs_x = 0x101; col_msk = 0x30; } else{ RAM_BG = RAM_BG1; GFX_BG = GFX_BG1; MSK_BG = GFX_BG1_SOLID; SCR_BG = RAM+0x15004; ofs_x = 0x103; col_msk = 0x20; } // BG0 // --- MAKE_SCROLL_512x512_2_16( ReadWord(SCR_BG+2)-ofs_x, ReadWord(SCR_BG)+16+1 ); START_SCROLL_512x512_2_16(32,32,256,224); MAP_PALETTE_MAPPED_NEW( ((ReadWord(&RAM_BG[zz])>>12)&0x0F)|col_msk, 16, map ); Draw16x16_Mapped_Rot(&GFX_BG[(ReadWord(&RAM_BG[zz])&0x0FFF)<<8], x, y, map); END_SCROLL_512x512_2_16(); // BG1 // --- if(RAM_FG0[0x710]==0x44){ RAM_BG = RAM_BG0; GFX_BG = GFX_BG0; MSK_BG = GFX_BG0_SOLID; SCR_BG = RAM+0x15008; ofs_x = 0x101; col_msk = 0x30; } else{ RAM_BG = RAM_BG1; GFX_BG = GFX_BG1; MSK_BG = GFX_BG1_SOLID; SCR_BG = RAM+0x15004; ofs_x = 0x103; col_msk = 0x20; } MAKE_SCROLL_512x512_2_16( ReadWord(SCR_BG+2)-ofs_x, ReadWord(SCR_BG)+16+1 ); START_SCROLL_512x512_2_16(32,32,256,224); ta = ReadWord(&RAM_BG[zz])&0x0FFF; if(MSK_BG[ta]){ // No pixels; skip MAP_PALETTE_MAPPED_NEW( ((ReadWord(&RAM_BG[zz])>>12)&0x0F)|col_msk, 16, map ); if(MSK_BG[ta]==1){ // Some pixels; trans Draw16x16_Trans_Mapped_Rot(&GFX_BG[ta<<8], x, y, map); } else{ // all pixels; solid Draw16x16_Mapped_Rot(&GFX_BG[ta<<8], x, y, map); } } END_SCROLL_512x512_2_16(); // OBJECT // ------ for(zz=0;zz<0x800;zz+=8){ y = ReadWord(&RAM_SPR[zz+0]); if((y&0xF000)==0){ y = (255 - y)&0x1FF; if((y>16)&&(y<224+32)){ ta = ReadWord(&RAM_SPR[zz+2])&0x1FFF; if(GFX_SPR_SOLID[ta]){ // No pixels; skip x = (32+ReadWord(&RAM_SPR[zz+6]))&0x1FF; if((x>16)&&(x<256+32)){ MAP_PALETTE_MAPPED_NEW( ((ReadWord(&RAM_SPR[zz+4])>>12)&0x0F)|0x00, 16, map ); if(GFX_SPR_SOLID[ta]==1){ // Some pixels; trans switch(RAM_SPR[zz+3]&0xC0){ case 0x00: Draw16x16_Trans_Mapped_Rot(&GFX_SPR[ta<<8], x, y, map); break; case 0x40: Draw16x16_Trans_Mapped_FlipY_Rot(&GFX_SPR[ta<<8], x, y, map); break; case 0x80: Draw16x16_Trans_Mapped_FlipX_Rot(&GFX_SPR[ta<<8], x, y, map); break; case 0xC0: Draw16x16_Trans_Mapped_FlipXY_Rot(&GFX_SPR[ta<<8], x, y, map); break; } } else{ // all pixels; solid switch(RAM_SPR[zz+3]&0xC0){ case 0x00: Draw16x16_Mapped_Rot(&GFX_SPR[ta<<8], x, y, map); break; case 0x40: Draw16x16_Mapped_FlipY_Rot(&GFX_SPR[ta<<8], x, y, map); break; case 0x80: Draw16x16_Mapped_FlipX_Rot(&GFX_SPR[ta<<8], x, y, map); break; case 0xC0: Draw16x16_Mapped_FlipXY_Rot(&GFX_SPR[ta<<8], x, y, map); break; } } } } } } else{ zz=0x800; } } // FG0 // --- MAKE_SCROLL_256x256_2_8( 0, 16 ); START_SCROLL_256x256_2_8(32,32,256,224); ta = ReadWord(&RAM_FG0[zz])&0x0FFF; if(GFX_FG0_SOLID[ta]){ // No pixels; skip MAP_PALETTE_MAPPED_NEW( ((ReadWord(&RAM_FG0[zz])>>12)&0x0F)|0x10, 16, map ); if(GFX_FG0_SOLID[ta]==1){ // Some pixels; trans Draw8x8_Trans_Mapped_Rot(&GFX_FG0[ta<<6], x, y, map); } else{ // all pixels; solid Draw8x8_Mapped_Rot(&GFX_FG0[ta<<6], x, y, map); } } END_SCROLL_256x256_2_8();}/*Background Data (2 bytes per tile)==================================Byte(s)| Bit(s) | Description-------+76543210+---------------------------- 00 |xxxx....| Tile Palette bank (0-15) 00 |....xxxx| Tile Number (high 4 bits) 01 |xxxxxxxx| Tile Number (low 8 bits)Sprite Data (8 bytes per Sprite)================================Byte(s)| Bit(s) | Description-------+76543210+---------------------------- 00 |.......x| Sprite Ypos (high bit) 01 |xxxxxxxx| Sprite Ypos (low 8 bits) 02 |.x......| Sprite Flip X-Axis 02 |...xxxxx| Sprite Number (low 5 bits) 03 |xxxxxxxx| Sprite Number (high 8 bits) 04 |xxxx....| Sprite Palette Bank (0-15) 06 |.......x| Sprite Xpos (high bit) 07 |xxxxxxxx| Sprite Xpos (low 8 bits)Palette Bank Info=================Banks 00-15: SpritesBanks 16-31: ForegroundBanks 32-47: Backgound#1Banks 48-63: Backgound#2*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -