📄 exzisus.c
字号:
memcpy(RAM, ROM, 0x0C000); AddZ80BROMBase(RAM, 0x0038, 0x0066); AddZ80BReadByte(0x0000, 0xBFFF, NULL, NULL); // Z80 ROM + BANK AddZ80BReadByte(0xE000, 0xEFFF, NULL, RAM +0xE000); // RAM AddZ80BReadByte(0xC000, 0xDFFF, NULL, RAM3+0x8000); // VIDEO AddZ80BReadByte(0xF800, 0xFFFF, NULL, RAM +0xF800); // COMMON RAM AddZ80BReadByte(0x0000, 0xFFFF, DefBadReadZ80, NULL); // <bad reads> AddZ80BReadByte(-1, -1, NULL, NULL); AddZ80BWriteByte(0xE000, 0xEFFF, NULL, RAM +0xE000); // RAM AddZ80BWriteByte(0xC000, 0xDFFF, NULL, RAM3+0x8000); // VIDEO AddZ80BWriteByte(0xF400, 0xF40F, exzisus_bank_w, NULL); // ROM BANK AddZ80BWriteByte(0xF800, 0xFFFF, NULL, RAM +0xF800); // COMMON RAM 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 reads> AddZ80BWritePort(-1, -1, NULL, NULL); AddZ80BInit(); if(!load_rom("b23-11.bin",TMP+0x00000,0x10000)) return; // Z80 SUB ROM if(!load_rom("b12-12.bin",TMP+0x10000,0x10000)) return; // Z80 SUB ROM if(!load_rom("b12-13.bin",TMP+0x20000,0x10000)) return; // Z80 SUB ROM memset(TMP+0x30000,0x00,0x10000); // Skip Idle Z80 TMP[0x0089]=0xD3; // OUTA (AAh) TMP[0x008A]=0xAA; // SetStopZ80CMode2(0x0083); init_bank_rom_1(TMP,ROM2); memset(RAM2, 0x00, 0x10000); memcpy(RAM2, ROM2, 0x0C000); AddZ80CROMBase(RAM2, 0x0038, 0x0066); AddZ80CReadByte(0x0000, 0xBFFF, NULL, NULL); // Z80 ROM + BANK AddZ80CReadByte(0xE000, 0xEFFF, NULL, RAM2+0xE000); // RAM AddZ80CReadByte(0xC000, 0xDFFF, NULL, RAM +0xC000); // VIDEO RAM [COMMON] AddZ80CReadByte(0xF000, 0xF001, tc0140syt_read_main_z80, NULL); // SOUND COMM AddZ80CReadByte(0xF800, 0xFFFF, NULL, RAM +0xF800); // COMMON? AddZ80CReadByte(0xF400, 0xF40F, exzisus_ioc_rb, NULL); // IOC AddZ80CReadByte(0x0000, 0xFFFF, DefBadReadZ80, NULL); // <bad reads> AddZ80CReadByte(-1, -1, NULL, NULL); AddZ80CWriteByte(0xE000, 0xEFFF, NULL, RAM2+0xE000); // RAM AddZ80CWriteByte(0xC000, 0xDFFF, NULL, RAM +0xC000); // VIDEO RAM [COMMON] AddZ80CWriteByte(0xF400, 0xF40F, exzisus_sub_bank_w, NULL); // ROM BANK AddZ80CWriteByte(0xF000, 0xF001, tc0140syt_write_main_z80, NULL); // SOUND COMM AddZ80CWriteByte(0xF800, 0xFFFF, NULL, RAM +0xF800); // COMMON? AddZ80CWriteByte(0x0000, 0xFFFF, DefBadWriteZ80, NULL); // <bad writes> AddZ80CWriteByte(-1, -1, NULL, NULL); AddZ80CReadPort(0x00, 0xFF, DefBadReadZ80, NULL); // <bad reads> AddZ80CReadPort(-1, -1, NULL, NULL); AddZ80CWritePort(0xAA, 0xAA, StopZ80CMode2, NULL); // Trap Idle Z80 AddZ80CWritePort(0x00, 0xFF, DefBadWriteZ80, NULL); // <bad reads> AddZ80CWritePort(-1, -1, NULL, NULL); AddZ80CInit(); if(!load_rom("b23-13.bin",RAM3,0x08000)) return; // Z80 SUB^SUB ROM memset(RAM3+0x8000, 0x00, 0x8000); // Skip Idle Z80 RAM3[0x010F]=0xD3; // OUTA (AAh) RAM3[0x0110]=0xAA; // SetStopZ80DMode2(0x0109); AddZ80DROMBase(RAM3, 0x0038, 0x0066); AddZ80DReadByte(0x0000, 0x7FFF, NULL, RAM3+0x0000); // Z80 ROM AddZ80DReadByte(0xB000, 0xBFFF, NULL, RAM3+0xB000); // RAM AddZ80DReadByte(0x8000, 0x9FFF, NULL, RAM3+0x8000); // VIDEO RAM [COMMON] AddZ80DReadByte(0xA000, 0xAFFF, NULL, RAM +0xE000); // COMMON AddZ80DReadByte(0x0000, 0xFFFF, DefBadReadZ80, NULL); // <bad reads> AddZ80DReadByte(-1, -1, NULL, NULL); AddZ80DWriteByte(0xB000, 0xBFFF, NULL, RAM3+0xB000); // RAM AddZ80DWriteByte(0x8000, 0x9FFF, NULL, RAM3+0x8000); // VIDEO RAM [COMMON] AddZ80DWriteByte(0xA000, 0xAFFF, NULL, RAM +0xE000); // COMMON AddZ80DWriteByte(0x0000, 0xFFFF, DefBadWriteZ80, NULL); // <bad writes> AddZ80DWriteByte(-1, -1, NULL, NULL); AddZ80DReadPort(0x00, 0xFF, DefBadReadZ80, NULL); // <bad reads> AddZ80DReadPort(-1, -1, NULL, NULL); AddZ80DWritePort(0xAA, 0xAA, StopZ80DMode2, NULL); // Trap Idle Z80 AddZ80DWritePort(0x00, 0xFF, DefBadWriteZ80, NULL); // <bad reads> AddZ80DWritePort(-1, -1, NULL, NULL); AddZ80DInit(); if(!(GFX=AllocateMem(0x100000+0x100000))) return; GFX_BG0 = GFX+0x000000; GFX_BG1 = GFX+0x100000; tb=0; if(!load_rom("b23-06.bin", TMP+0x00000, 0x10000)) return; if(!load_rom("b23-08.bin", TMP+0x10000, 0x10000)) return; memset(TMP+0x20000,0x00,0x10000); memset(TMP+0x30000,0x00,0x10000); if(!load_rom("b23-07.bin", TMP+0x40000, 0x10000)) return; if(!load_rom("b23-09.bin", TMP+0x50000, 0x10000)) return; memset(TMP+0x60000,0x00,0x10000); memset(TMP+0x70000,0x00,0x10000); for(ta=0;ta<0x40000;ta+=2,tb+=8){ DrawNibble0(GFX_BG1+tb+0, 0, (UINT8) (TMP[ta+0x00000]&15) ); DrawNibble (GFX_BG1+tb+0, 1, (UINT8) (TMP[ta+0x00000]>>4) ); DrawNibble (GFX_BG1+tb+0, 2, (UINT8) (TMP[ta+0x40000]&15) ); DrawNibble (GFX_BG1+tb+0, 3, (UINT8) (TMP[ta+0x40000]>>4) ); DrawNibble0(GFX_BG1+tb+4, 0, (UINT8) (TMP[ta+0x00001]&15) ); DrawNibble (GFX_BG1+tb+4, 1, (UINT8) (TMP[ta+0x00001]>>4) ); DrawNibble (GFX_BG1+tb+4, 2, (UINT8) (TMP[ta+0x40001]&15) ); DrawNibble (GFX_BG1+tb+4, 3, (UINT8) (TMP[ta+0x40001]>>4) ); } tb=0; if(!load_rom("b12-16.bin", TMP+0x00000, 0x10000)) return; if(!load_rom("b12-18.bin", TMP+0x10000, 0x10000)) return; if(!load_rom("b12-20.bin", TMP+0x20000, 0x10000)) return; memset(TMP+0x30000,0x00,0x10000); if(!load_rom("b12-15.bin", TMP+0x40000, 0x10000)) return; if(!load_rom("b12-17.bin", TMP+0x50000, 0x10000)) return; if(!load_rom("b12-19.bin", TMP+0x60000, 0x10000)) return; memset(TMP+0x70000,0x00,0x10000); for(ta=0;ta<0x40000;ta+=2,tb+=8){ DrawNibble0(GFX_BG0+tb+0, 0, (UINT8) (TMP[ta+0x00000]&15) ); DrawNibble (GFX_BG0+tb+0, 1, (UINT8) (TMP[ta+0x00000]>>4) ); DrawNibble (GFX_BG0+tb+0, 2, (UINT8) (TMP[ta+0x40000]&15) ); DrawNibble (GFX_BG0+tb+0, 3, (UINT8) (TMP[ta+0x40000]>>4) ); DrawNibble0(GFX_BG0+tb+4, 0, (UINT8) (TMP[ta+0x00001]&15) ); DrawNibble (GFX_BG0+tb+4, 1, (UINT8) (TMP[ta+0x00001]>>4) ); DrawNibble (GFX_BG0+tb+4, 2, (UINT8) (TMP[ta+0x40001]&15) ); DrawNibble (GFX_BG0+tb+4, 3, (UINT8) (TMP[ta+0x40001]>>4) ); } if(!load_rom("b23-04.bin", TMP+0x00000, 0x400)) return; if(!load_rom("b23-03.bin", TMP+0x00400, 0x400)) return; if(!load_rom("b23-05.bin", TMP+0x00800, 0x400)) return; for(ta=0;ta<0x200;ta++){ tb = ta & 0x1F0; tb |= 15 - (ta & 15); tc = (TMP[tb+0x000]&15)<<8; tc |= (TMP[tb+0x400]&15)<<4; tc |= (TMP[tb+0x800]&15)<<0; WriteWord(&RAM_COLOUR[ta<<1], tc); } FreeMem(TMP); GFX_BG0_SOLID = make_solid_mask_8x8(GFX_BG0, 0x4000); GFX_BG1_SOLID = make_solid_mask_8x8(GFX_BG1, 0x4000); InitPaletteMap(RAM_COLOUR, 0x20, 0x10, 0x1000); set_colour_mapper(&col_map_xxxx_rrrr_gggg_bbbb); exzisus_add_save_data(); R24[0] = ROM_BANK_1[0x02]; // Nasty hack until Language switch works on z80 roms}void clear_exzisus(void){ RemoveTaitoYM2151(); #ifdef RAINE_DEBUG save_debug("RAM.bin", RAM, RAMSize, 0); save_debug("GFX.bin", GFX, 0x200000, 0); #endif}void execute_exzisus_frame(void){ cpu_execute_cycles(CPU_Z80_2, CPU_FRAME_MHz(8,60)); // Main Z80 8MHz (60fps)#ifdef RAINE_DEBUG print_debug("Z80PC_MAIN:%04x\n",z80pc);#endif cpu_interrupt(CPU_Z80_2, 0x38); cpu_execute_cycles(CPU_Z80_3, CPU_FRAME_MHz(8,60)); // Sub-2 Z80 8MHz (60fps) #ifdef RAINE_DEBUG print_debug("Z80PC_SUB2:%04x\n",z80pc); #endif cpu_interrupt(CPU_Z80_3, 0x38); cpu_execute_cycles(CPU_Z80_1, CPU_FRAME_MHz(8,60)); // Sub-1 Z80 8MHz (60fps) #ifdef RAINE_DEBUG print_debug("Z80PC_SUB1:%04x\n",z80pc); #endif cpu_interrupt(CPU_Z80_1, 0x38); Taito2151_Frame();}void draw_exzisus(void){ int x,y,ta; int sx,sy,offs,goffs,gfx_offs,gfx_num,gfx_attr,height,xc,yc; UINT8 *map,*RAM_BG; ClearPaletteMap(); clear_game_screen(0); // TC0010VCU 0 RAM_BG = RAM+0xC000; sx = 0; for (offs=0;offs<0x600;offs+=4) { if (*(UINT32 *)(&RAM_BG[offs + 0]) == 0) continue; gfx_num = RAM_BG[offs + 1]; gfx_attr = RAM_BG[offs + 3]; if ((gfx_num & 0x80) == 0){ /* 16x16 sprites */ gfx_offs = gfx_num & 0x7F; gfx_offs <<= 3; gfx_offs += 0x0600; height = 2; sx = RAM_BG[offs + 2]; sx |= (gfx_attr & 0x40) << 2; } else{ /* 16x256 columns */ gfx_offs = gfx_num & 0x3F; gfx_offs <<= 7; gfx_offs += 0x0A00; height = 32; if(gfx_num & 0x40) sx += 16; else sx = RAM_BG[offs + 2]; sx |= (gfx_attr & 0x40) << 2; } sy = 256 - height*8 - (RAM_BG[offs + 0]); for (xc=0;xc<2;xc++) { goffs = gfx_offs; for (yc=0;yc<height;yc++,goffs+=2) { ta = ReadWord(&RAM_BG[goffs]); if(GFX_BG0_SOLID[ta&0x3FFF]){ MAP_PALETTE_MAPPED_NEW( (gfx_attr & 0x0F) | ((ta & 0xC000) >> 14), 16, map ); ta &= 0x3FFF; x = (sx + (xc << 3)) & 0xff; y = ((sy + (yc << 3)) & 0xff) -16; if ((x > -8) && (y > -8) && (x < 256) && (y < 224)) { if(GFX_BG0_SOLID[ta] == 1) Draw8x8_Trans_Mapped_Rot(&GFX_BG0[ta<<6], x+32, y+32, map); else Draw8x8_Mapped_Rot(&GFX_BG0[ta<<6], x+32, y+32, map); } } } gfx_offs += height<<1; } } // TC0010VCU 1 RAM_BG = RAM3+0x8000; sx = 0; for (offs=0;offs<0x600;offs+=4) { if (*(UINT32 *)(&RAM_BG[offs + 0]) == 0) continue; gfx_num = RAM_BG[offs + 1]; gfx_attr = RAM_BG[offs + 3]; if ((gfx_num & 0x80) == 0){ /* 16x16 sprites */ gfx_offs = gfx_num & 0x7F; gfx_offs <<= 3; gfx_offs += 0x0600; height = 2; sx = RAM_BG[offs + 2]; sx |= (gfx_attr & 0x40) << 2; } else{ /* 16x256 columns */ gfx_offs = gfx_num & 0x3F; gfx_offs <<= 7; gfx_offs += 0x0A00; height = 32; if(gfx_num & 0x40) sx += 16; else sx = RAM_BG[offs + 2]; sx |= (gfx_attr & 0x40) << 2; } sy = 256 - height*8 - (RAM_BG[offs + 0]); for (xc=0;xc<2;xc++) { goffs = gfx_offs; for (yc=0;yc<height;yc++,goffs+=2) { ta = ReadWord(&RAM_BG[goffs]); if(GFX_BG1_SOLID[ta&0x3FFF]){ MAP_PALETTE_MAPPED_NEW( (gfx_attr & 0x0F) | ((ta & 0xC000) >> 14) | 0x10, 16, map ); ta &= 0x3FFF; x = (sx + (xc << 3)) & 0xff; y = ((sy + (yc << 3)) & 0xff) -16; if ((x > -8) && (y > -8) && (x < 256) && (y < 224)) { if(GFX_BG1_SOLID[ta] == 1) Draw8x8_Trans_Mapped_Rot(&GFX_BG1[ta<<6], x+32, y+32, map); else Draw8x8_Mapped_Rot(&GFX_BG1[ta<<6], x+32, y+32, map); } } } gfx_offs += height<<1; } }}/*CTRL RAM (OBJECT RAM)0x0600 bytes 0 |xxxxxxxx| Sprite Y (low) 1 |x.......| 16x16 sprite / 16x256 column select 1 |.x......| X Chain (16x256 column) 1 |..xxxxxx| Sprite num (16x256 column) 1 |.xxxxxxx| Sprite num (16x16 sprite) 2 |xxxxxxxx| Sprite X (low) 3 |.x......| Sprite X (high) 3 |....xx..| Colour Bank (high) 3 |......xx| Colour Bank (low mirror)DATA RAM (SCREEN RAM)0x0400 bytes (16x16 sprite)0x1600 bytes (16x256 column) 0 |xx......| Colour Bank (low) 0 |..xxxxxx| Tile (high) 1 |xxxxxxxx| Tile (low)*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -