📄 metalb.c
字号:
GFX_BG0[tb+3]=RAM[ta+1]>>4; } FreeMem(RAM); memset(GFX_SPR+0x000F00,0x00,0x100); // Mask Sprite memset(GFX_SPR+0x168C00,0x00,0x100); // Sun Sprite RAMSize=0x40000+0x20000; if(!(RAM=AllocateMem(RAMSize))) return; if(!(ROM=AllocateMem(0xC0000))) return; if(!load_rom_index(8, RAM, 0x40000)) return; for(ta=0;ta<0x40000;ta++){ ROM[ta+ta]=RAM[ta]; } if(!load_rom_index(7, RAM, 0x40000)) return; for(ta=0;ta<0x40000;ta++){ ROM[ta+ta+1]=RAM[ta]; } if(!load_rom_index(6, RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta+0x80000]=RAM[ta]; } if(!load_rom_index(5, RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta+0x80001]=RAM[ta]; } /*-----[Sound Setup]-----*/ Z80ROM=RAM+0x40000; if(!load_rom_index(9, Z80ROM, 0x20000)) return; // Z80 SOUND ROM if(!(PCMROM=AllocateMem(0x180000))) return; if(!load_rom_index(4,PCMROM+0x00000,0x080000)) return; // ADPCM A rom if(!load_rom_index(1,PCMROM+0x80000,0x100000)) return; // ADPCM B rom YM2610SetBuffers(PCMROM, PCMROM+0x80000, 0x080000, 0x100000); AddTaitoYM2610(0x0217, 0x0180, 0x20000); /*-----------------------*/ memset(RAM+0x00000,0x00,0x40000); memset(RAM+0x34100,0xFF,0x00020); if(is_current_game("metalb")){ WriteWord68k(&ROM[0x0248E],0x4EF9); // jmp $300 WriteLong68k(&ROM[0x02490],0x00000300); WriteLong68k(&ROM[0x00300],0x4EB820DE); // jsr <random gen> WriteLong68k(&ROM[0x00304],0x13FC0000); // move.b #$00,$AA0000 WriteLong68k(&ROM[0x00308],0x00AA0000); WriteWord68k(&ROM[0x0030C],0x6100-14); // bra.s <loop> } else{ WriteWord68k(&ROM[0x024BA],0x4EF9); // jmp $300 WriteLong68k(&ROM[0x024BC],0x00000300); WriteLong68k(&ROM[0x00300],0x4EB8210A); // jsr <random gen> WriteLong68k(&ROM[0x00304],0x13FC0000); // move.b #$00,$AA0000 WriteLong68k(&ROM[0x00308],0x00AA0000); WriteWord68k(&ROM[0x0030C],0x6100-14); // bra.s <loop> } RAM_OBJECT = RAM+0x10000; RAM_INPUT = RAM+0x34100; GFX_BG0_SOLID = make_solid_mask_16x16(GFX_BG0, 0x2000); GFX_SPR_SOLID = make_solid_mask_16x16(GFX_SPR, 0x2000); InitPaletteMap(RAM+0x30000, 0x200, 0x10, 0x1000); set_colour_mapper(&col_map_rrrr_gggg_bbbb_xxxx); RAM_BG0=RAM+0x23000; RAM_BG1=RAM+0x22000; RAM_BG2=RAM+0x21000; RAM_BG3=RAM+0x20000; RAM_SCR0=RAM+0x34006; RAM_SCR1=RAM+0x34004; RAM_SCR2=RAM+0x34002; RAM_SCR3=RAM+0x34000; RAM_SCR4=RAM+0x34018; SCR0_XOFS=0x0036; SCR1_XOFS=0x0032; SCR2_XOFS=0x002E; SCR3_XOFS=0x002A; SCR4_XOFS=0x0039; SCR0_YOFS=0x0014; SCR1_YOFS=0x0014; SCR2_YOFS=0x0014; SCR3_YOFS=0x0014; SCR4_YOFS=0x0014; // Init tc0006vcu emulation // ------------------------ if(!(tc0006vcu.GFX_FG = AllocateMem(0x4000))) return; tc0006vcu.RAM = RAM+0x20000; tc0006vcu.RAM_SCR = RAM+0x34000; tc0006vcu.GFX_BG = GFX_BG0; tc0006vcu.GFX_BG_MASK= GFX_BG0_SOLID; tc0006vcu.tile_mask = 0x1FFF; tc0006vcu.mapper = &Map_12bit_RGBx; tc0006vcu.pal_ofs = 0x100; tc0006vcu.bmp_x = 48; tc0006vcu.bmp_y = 48; tc0006vcu.bmp_w = 320; tc0006vcu.bmp_h = 224; tc0006vcu.scr_x[0] = SCR0_XOFS; tc0006vcu.scr_x[1] = SCR1_XOFS; tc0006vcu.scr_x[2] = SCR2_XOFS; tc0006vcu.scr_x[3] = SCR3_XOFS; tc0006vcu.scr_x[4] = SCR4_XOFS; tc0006vcu.scr_y[0] = SCR0_YOFS; tc0006vcu.scr_y[1] = SCR1_YOFS; tc0006vcu.scr_y[2] = SCR2_YOFS; tc0006vcu.scr_y[3] = SCR3_YOFS; tc0006vcu.scr_y[4] = SCR4_YOFS; init_tc0006vcu(); // Init tc0200obj emulation // ------------------------ tc0200obj.RAM = RAM_OBJECT+0x0000; tc0200obj.RAM_B = RAM_OBJECT+0x8000; tc0200obj.GFX = GFX_SPR; tc0200obj.MASK = GFX_SPR_SOLID; tc0200obj.bmp_x = 48; tc0200obj.bmp_y = 48; tc0200obj.bmp_w = 320; tc0200obj.bmp_h = 224; tc0200obj.mapper = &Map_12bit_RGBx; tc0200obj.tile_mask = 0x1FFF; tc0200obj.ofs_x = 0; tc0200obj.ofs_y = 0; tc0200obj.cols = 16; init_tc0200obj(); // Init tc0220ioc emulation // ------------------------ tc0220ioc.RAM = input_buffer; tc0220ioc.ctrl = 0; //TC0220_STOPCPU; reset_tc0220ioc();/* * StarScream Stuff follows */ ByteSwap(ROM,0xC0000); ByteSwap(RAM,0x40000); AddMemFetch(0x000000, 0x0BFFFF, ROM+0x000000-0x000000); // 68000 ROM AddMemFetch(-1, -1, NULL); AddReadByte(0x000000, 0x0BFFFF, NULL, ROM+0x000000); // 68000 ROM AddReadByte(0x100000, 0x10FFFF, NULL, RAM+0x000000); // 68000 RAM AddReadByte(0x300000, 0x30FFFF, NULL, RAM_OBJECT); // OBJECT RAM AddReadByte(0x500000, 0x50FFFF, NULL, RAM+0x020000); // SCREEN RAM AddReadByte(0x700000, 0x703FFF, NULL, RAM+0x030000); // COLOR RAM AddReadByte(0x800000, 0x80000F, tc0220ioc_rb_bswap, NULL); // INPUT AddReadByte(0x900000, 0x900003, tc0140syt_read_main_68k, NULL); // SOUND COMM AddReadByte(0x000000, 0xFFFFFF, DefBadReadByte, NULL); // <Bad Reads> AddReadByte(-1, -1, NULL, NULL); AddReadWord(0x000000, 0x0BFFFF, NULL, ROM+0x000000); // 68000 ROM AddReadWord(0x100000, 0x10FFFF, NULL, RAM+0x000000); // 68000 RAM AddReadWord(0x300000, 0x30FFFF, NULL, RAM_OBJECT); // OBJECT RAM AddReadWord(0x500000, 0x50FFFF, NULL, RAM+0x020000); // SCREEN RAM AddReadWord(0x700000, 0x703FFF, NULL, RAM+0x030000); // COLOR RAM AddReadWord(0x800000, 0x80000F, tc0220ioc_rw_bswap, NULL); // INPUT AddReadWord(0x000000, 0xFFFFFF, DefBadReadWord, NULL); // <Bad Reads> AddReadWord(-1, -1,NULL, NULL); AddWriteByte(0x100000, 0x10FFFF, NULL, RAM+0x000000); // 68000 RAM AddWriteByte(0x300000, 0x30FFFF, NULL, RAM_OBJECT); // OBJECT RAM AddWriteByte(0x500000, 0x50DFFF, NULL, RAM+0x020000); // SCREEN RAM AddWriteByte(0x50E000, 0x50FFFF, tc0006vcu_gfx_fg0_wb, NULL); // FG0 GFX RAM AddWriteByte(0x700000, 0x703FFF, NULL, RAM+0x030000); // COLOR RAM AddWriteByte(0x900000, 0x900003, tc0140syt_write_main_68k, NULL); // SOUND COMM AddWriteByte(0x800000, 0x80000F, tc0220ioc_wb_bswap, NULL); // INPUT AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByte(0x000000, 0xFFFFFF, DefBadWriteByte, NULL); // <Bad Writes> AddWriteByte(-1, -1, NULL, NULL); AddWriteWord(0x100000, 0x10FFFF, NULL, RAM+0x000000); // 68000 RAM AddWriteWord(0x300000, 0x30FFFF, NULL, RAM_OBJECT); // OBJECT RAM AddWriteWord(0x500000, 0x50DFFF, NULL, RAM+0x020000); // SCREEN RAM AddWriteWord(0x50E000, 0x50FFFF, tc0006vcu_gfx_fg0_ww, NULL); // FG0 GFX RAM AddWriteWord(0x700000, 0x703FFF, NULL, RAM+0x030000); // COLOR RAM AddWriteWord(0x530000, 0x5300FF, NULL, RAM+0x034000); // SCROLL AddWriteWord(0x800000, 0x80000F, tc0220ioc_ww_bswap, NULL); // INPUT AddWriteWord(0x000000, 0xFFFFFF, BadWriteWord, NULL); // <Bad Writes> AddWriteWord(-1, -1, NULL, NULL); AddInitMemory(); // Set Starscream mem pointers... }void ClearMetalBlack(void){ RemoveTaitoYM2610(); #ifdef RAINE_DEBUG //save_debug("RAM.bin",RAM,0x040000,1); #endif}void ExecuteMetalBlackFrame(void){ cpu_execute_cycles(CPU_68K_0, CPU_FRAME_MHz(16,60)); // M68000 16MHz (60fps) /*#ifdef RAINE_DEBUG print_debug("PC:%06x SR:%04x\n",s68000context.pc,s68000context.sr); #endif*/ cpu_interrupt(CPU_68K_0, 6); cpu_interrupt(CPU_68K_0, 5); Taito2610_Frame(); // Z80 and YM2610 IntF3System(); debug_tc0006vcu();}static UINT8 bg_pri[32][4] ={ { 0, 1, 2, 3, }, // 0x00 { 0, 1, 2, 3, }, // 0x01 { 0, 1, 2, 3, }, // 0x02 { 0, 1, 2, 3, }, // 0x03 { 0, 1, 2, 3, }, // 0x04 { 0, 1, 2, 3, }, // 0x05 { 0, 1, 2, 3, }, // 0x06 { 0, 1, 2, 3, }, // 0x07 { 0, 1, 2, 3, }, // 0x08 { 0, 1, 2, 3, }, // 0x09 { 0, 1, 2, 3, }, // 0x0A { 0, 1, 2, 3, }, // 0x0B { 0, 3, 1, 2, }, // 0x0C { 0, 1, 2, 3, }, // 0x0D { 0, 1, 2, 3, }, // 0x0E { 3, 0, 1, 2, }, // 0x0F { 3, 0, 1, 2, }, // 0x10 { 0, 1, 2, 3, }, // 0x11 { 3, 2, 1, 0, }, // 0x12 { 3, 2, 1, 0, }, // 0x13 { 0, 1, 2, 3, }, // 0x14 { 0, 1, 2, 3, }, // 0x15 { 0, 1, 2, 3, }, // 0x16 { 0, 1, 2, 3, }, // 0x17 { 0, 1, 2, 3, }, // 0x18 { 0, 1, 2, 3, }, // 0x19 { 0, 1, 2, 3, }, // 0x1A { 0, 1, 2, 3, }, // 0x1B { 0, 1, 2, 3, }, // 0x1C { 0, 1, 2, 3, }, // 0x1D { 0, 3, 2, 1, }, // 0x1E { 0, 3, 2, 1, }, // 0x1F};void DrawMetalBlack(void){ UINT32 i; ClearPaletteMap(); tc0006vcu_layer_count = 0; i = ReadWord(RAM+0x3401E) & 0x1F; tc0006vcu_render_layer(bg_pri[i][0]); tc0006vcu_render_layer(bg_pri[i][1]); tc0006vcu_render_layer(bg_pri[i][2]); tc0006vcu_render_layer(bg_pri[i][3]); render_tc0200obj_mapped(); tc0006vcu_render_fg0();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -