📄 tc006vcu.c
字号:
/******************************************************************************//* *//* tc0006vcu: TAITO VIDEO CHIP UNIT (F2/F3-SYSTEM HYBRID) *//* *//******************************************************************************/#include "gameinc.h"#include "tc006vcu.h"#include "savegame.h"/*Dead ConnectionFootball Champ / Euro Champ 92Metal BlackOperation Wolf 3tc0006vcu main--------------00000-03FFF | OBJECT A (tc0200obj)08000-0BFFF | OBJECT B (tc0200obj)10000-10FFF | BG0 RAM - 512 x 51211000-11FFF | BG0 RAM - 512 x 51212000-12FFF | BG0 RAM - 512 x 51213000-13FFF | BG0 RAM - 512 x 51210000-11FFF | BG0 RAM - 1024 x 51212000-13FFF | BG0 RAM - 1024 x 51214000-15FFF | BG0 RAM - 1024 x 51216000-17FFF | BG0 RAM - 1024 x 5121C000-1DFFF | FG0 RAM - 512 x 5121E000-1FFFF | FG0 GFX20000-201FF | LINE SET RAM (256 x 2 bytes) 1000 | ????20200-203FF | LINE SET RAM (256 x 2 bytes) 1400 | ????20400-205FF | LINE SET RAM (256 x 2 bytes) 1800 | ????20600-207FF | LINE SET RAM (256 x 2 bytes) 1C00 | ????20800-209FF | LINE SET RAM (256 x 2 bytes) 2000 | ????20A00-20BFF | LINE SET RAM (256 x 2 bytes) 2400 | ????20C00-20DFF | LINE SET RAM (256 x 2 bytes) 2800 | ????20E00-20FFF | LINE SET RAM (256 x 2 bytes) 2C00 | ????21000-21FFF | PIVOT PORT RAM22000-2FFFF | LINE DATA RAM24000-241FF | ? LINE SCROLL? (256 x 2 bytes)24200-243FF | ? LINE SCROLL? (256 x 2 bytes)24400-245FF | ? LINE SCROLL? (256 x 2 bytes)24600-247FF | ? LINE SCROLL? (256 x 2 bytes)24800-249FF | ? LINE SCROLL? (256 x 2 bytes)24A00-24BFF | ? LINE SCROLL? (256 x 2 bytes)24C00-24DFF | ? LINE SCROLL? (256 x 2 bytes)24E00-24FFF | ? LINE SCROLL? (256 x 2 bytes)28000-281FF | ? LINE ZOOM? (256 x 2 bytes)28200-283FF | ? LINE ZOOM? (256 x 2 bytes)28400-285FF | ? LINE ZOOM? (256 x 2 bytes)28600-287FF | ? LINE ZOOM? (256 x 2 bytes)28800-289FF | ? LINE ZOOM? (256 x 2 bytes)28A00-28BFF | ? LINE ZOOM? (256 x 2 bytes)28C00-28DFF | ? LINE ZOOM? (256 x 2 bytes)28E00-28FFF | ? LINE ZOOM? (256 x 2 bytes)30000-3FFFF | PIVOT RAMBS: 2-3-1-0 = 100F 140F 180F 1C02 2005 240F 2806 2C06BM: 0-1-3-2 = 100F 140F 180D 1C02 2005 240F 280E 2C07FG0 RAM:H: 0x02 bytes x 0x40 = 0x0080 = 512V: 0x80 bytes x 0x40 = 0x2000 = 512tc0006vcu scroll---------------------+--------+---------------------Byte | Bit(s) | Use-----+76543210+--------------------- 00 |xxxxxxxx| BG0 Scroll X (high) 01 |x+......| BG0 Scroll X (low) 02 |xxxxxxxx| BG1 Scroll X (high) 03 |x+......| BG1 Scroll X (low) 04 |xxxxxxxx| BG2 Scroll X (high) 05 |x+......| BG2 Scroll X (low) 06 |xxxxxxxx| BG3 Scroll X (high) 07 |x+......| BG3 Scroll X (low) 08 |xxxxxxxx| BG0 Scroll Y (high) 09 |x.......| BG0 Scroll Y (low) 0A |xxxxxxxx| BG1 Scroll Y (high) 0B |x.......| BG1 Scroll Y (low) 0C |xxxxxxxx| BG2 Scroll Y (high) 0D |x.......| BG2 Scroll Y (low) 0E |xxxxxxxx| BG3 Scroll Y (high) 0F |x.......| BG3 Scroll Y (low) 10 |........| BG0 ??? 11 |.xxxxxxx| BG0 ??? 12 |........| BG1 ??? 13 |.xxxxxxx| BG1 ??? 14 |........| BG2 ??? 15 |.xxxxxxx| BG2 ??? 16 |........| BG3 ??? 17 |.xxxxxxx| BG4 ??? 18 |.......x| PX0 Scroll X (high) 19 |xxxxxxxx| PX0 Scroll X (low) 1A |.......x| PX0 Scroll Y (high) 1B |xxxxxxxx| PX0 Scroll Y (low) 1C |00000000| Unused 1D |00000000| Unused 1E |00000000| Unused? 1F |...xxxxx| Priorities? 1F |..x.....| ? 1F |.x......| Screen flip 1F |x.......| 1024x512 bg size 20 |........| BG0 Zoom X (high) 21 |........| BG0 Zoom X (low) 22 |........| BG1 Zoom X (high) 23 |........| BG1 Zoom X (low) 24 |........| BG2 Zoom X (high) 25 |........| BG2 Zoom X (low) 26 |........| BG3 Zoom X (high) 27 |........| BG3 Zoom X (low) 28 |........| BG0 Zoom Y (high) 29 |........| BG0 Zoom Y (low) 2A |........| BG1 Zoom Y (high) 2B |........| BG1 Zoom Y (low) 2C |........| BG2 Zoom Y (high) 2D |........| BG2 Zoom Y (low) 2E |........| BG3 Zoom Y (high) 2F |........| BG3 Zoom Y (low)-----+--------+---------------------0x80 00000 = 0123 [Operation Wolf 3]0x00 00000 = 0123 [Dead Connection]0x00 00000 = 0123 [Football Champ]0x20 00000 = 0123 [Metal Black]0x23 00011 = 0 ? [Metal Black]0x2C 01100 = 0312 ? [Metal Black]0x2F 01111 = 3012 [Metal Black]0x30 10000 = 3012 [Metal Black]0x32 10010 = ? [Metal Black]0x33 10011 = 3210 [Metal Black]0x34 10100 = 23 ? [Metal Black]0x37 10111 = 23 ? [Metal Black]0x3C 11100 = 0 ? [Metal Black]0x3E 11110 = 0321 [Metal Black]0x3F 11111 = 0321 ? [Metal Black]*/#define GFX_FG0_COUNT 0x100static UINT8 *RAM_FG;static UINT8 *GFX_FG;static UINT32 gfx_fg0_dirty_count;static UINT32 GFX_FG0_DIRTY[GFX_FG0_COUNT];static UINT8 GFX_FG0_SOLID[GFX_FG0_COUNT];static int layer_id_data[5];static char *layer_id_name[5] ={ "BG0", "BG1", "BG2", "BG3", "FG0",};void tc0006vcu_load_update(void);static UINT8 *z_step;/*0x7F = Normal Size0xBF = 2x Size?0xFF = 3x Size??*/static UINT8 *make_16x16_zoom_ofs_type3b(void){ UINT8 *zoom16_ofs; int ta,tb,tc,td; zoom16_ofs = AllocateMem(128*32); for(ta=0;ta<128;ta++){ td=0; for(tb=0;tb<32;tb++){ tc = ((((tb+1)*16)*(ta+1))/64) - (((tb*16)*(ta+1))/64) + 16; zoom16_ofs[((ta)*32)+(31-tb)] = tc; #ifdef DEBUG_TABLES print_debug("%02x ",tc); #endif td += tc; } #ifdef DEBUG_TABLES print_debug("[%02x]\n",td); #endif } return zoom16_ofs;}void init_tc0006vcu(void){ GFX_FG = tc0006vcu.GFX_FG; RAM_FG = tc0006vcu.RAM + 0xE000; tc0006vcu.GFX_FG_MASK = GFX_FG0_SOLID; gfx_fg0_dirty_count = 0; memset(GFX_FG0_DIRTY, 0x00, GFX_FG0_COUNT*4); memset(GFX_FG0_SOLID, 0x00, GFX_FG0_COUNT); layer_id_data[0] = add_layer_info(layer_id_name[0]); layer_id_data[1] = add_layer_info(layer_id_name[1]); layer_id_data[2] = add_layer_info(layer_id_name[2]); layer_id_data[3] = add_layer_info(layer_id_name[3]); layer_id_data[4] = add_layer_info(layer_id_name[4]); if(GFX_FG){ memset(GFX_FG,0x00, 0x4000); memset(RAM_FG,0x00, 0x2000); } init_16x16_zoom_64(); z_step = make_16x16_zoom_ofs_type3b(); AddLoadCallback(tc0006vcu_load_update);}void debug_tc0006vcu(void){ #if 0 UINT8 *src; src = tc0006vcu.RAM_SCR; clear_ingame_message_list(); print_ingame(60,"BG0: (%04x,%04x) Z: (%04x,%04x) ?: %04x",ReadWord(&src[0x00]),ReadWord(&src[0x08]),ReadWord(&src[0x20]),ReadWord(&src[0x28]),ReadWord(&src[0x10])); print_ingame(60,"BG1: (%04x,%04x) Z: (%04x,%04x) ?: %04x",ReadWord(&src[0x02]),ReadWord(&src[0x08]),ReadWord(&src[0x22]),ReadWord(&src[0x2A]),ReadWord(&src[0x12])); print_ingame(60,"BG2: (%04x,%04x) Z: (%04x,%04x) ?: %04x",ReadWord(&src[0x04]),ReadWord(&src[0x08]),ReadWord(&src[0x24]),ReadWord(&src[0x2C]),ReadWord(&src[0x14])); print_ingame(60,"BG3: (%04x,%04x) Z: (%04x,%04x) ?: %04x",ReadWord(&src[0x06]),ReadWord(&src[0x08]),ReadWord(&src[0x26]),ReadWord(&src[0x2E]),ReadWord(&src[0x16])); print_ingame(60,"FG0: (%04x,%04x) 0: %04x Ctrl: %04x",ReadWord(&src[0x18]),ReadWord(&src[0x1A]),ReadWord(&src[0x1C]),ReadWord(&src[0x1E])); #endif}/******************************************************************************/#undef RAM_PTR#undef GFX_PTR#define RAM_PTR RAM_FG#define GFX_PTR GFX_FGvoid tc0006vcu_load_update(void){ UINT32 i,j; gfx_fg0_dirty_count = 0; for(i = 0; i < 0x2000; i += 2){ j = ReadWord(&RAM_PTR[i]); WriteWord(&RAM_PTR[i], ~j); tc0006vcu_gfx_fg0_ww(i, j); }}void tc0006vcu_update_gfx_fg0(void){ UINT32 ta,tb,tc,td,te; UINT8 *source; for(ta = 0; ta < gfx_fg0_dirty_count; ta++){ tb = GFX_FG0_DIRTY[ta]; source = GFX_PTR + (tb << 6); td=0; te=0; for(tc=0;tc<0x40;tc++){ if(source[tc]) td=1; else te=1; } if((td==0)&&(te==1)) GFX_FG0_SOLID[tb]=0; // All pixels are 0: Don't Draw if((td==1)&&(te==1)) GFX_FG0_SOLID[tb]=1; // Mixed: Draw Trans if((td==1)&&(te==0)) GFX_FG0_SOLID[tb]=2; // All pixels are !0: Draw Solid } gfx_fg0_dirty_count = 0;}void tc0006vcu_gfx_fg0_wb(UINT32 addr, UINT8 data){ addr ^= 1; addr &= 0x1FFF; if((RAM_PTR[addr])!=data){ // Write to RAM RAM_PTR[addr]=data; // Write to 8x8 GFX addr ^= 1; addr <<= 1; GFX_PTR[addr+0] = (data >> 0) & 0x0F; GFX_PTR[addr+1] = (data >> 4) & 0x0F; // request mask update addr >>= 6; if(GFX_FG0_SOLID[addr] != 3){ GFX_FG0_SOLID[addr] = 3; GFX_FG0_DIRTY[gfx_fg0_dirty_count++] = addr; } }}void tc0006vcu_gfx_fg0_ww(UINT32 addr, UINT16 data){ addr &= 0x1FFE; if(ReadWord(&RAM_PTR[addr])!=data){ // Write to RAM WriteWord(&RAM_PTR[addr],data); // Write to 8x8 GFX addr <<= 1; GFX_PTR[addr+0] = (data >> 0) & 0x0F; GFX_PTR[addr+1] = (data >> 4) & 0x0F; GFX_PTR[addr+2] = (data >> 8) & 0x0F; GFX_PTR[addr+3] = (data >> 12) & 0x0F; // request mask update addr >>= 6; if(GFX_FG0_SOLID[addr] != 3){ GFX_FG0_SOLID[addr] = 3; GFX_FG0_DIRTY[gfx_fg0_dirty_count++] = addr; } }}/******************************************************************************/void tc0006vcu_render_layer(int layer){ int zoom,zoom_2,tx,ty,txx,tyy; UINT8 *z_data_x,*z_data_y; int x,y,x16,y16,zzzz,zzz,zz,ta; UINT8 *map; UINT8 *RAM_BG; UINT8 *RAM_SCR; UINT8 *RAM_GFX; UINT8 *RAM_MSK; mapper_direct *pal_map; UINT32 bmp_x,bmp_y,bmp_w,bmp_h; UINT32 scr_x, scr_y, pal_ofs, tile_mask; if(!check_layer_enabled(layer_id_data[layer])) return; RAM_BG = tc0006vcu.RAM + (layer * 0x1000); RAM_SCR = tc0006vcu.RAM_SCR + (layer * 0x0002); RAM_GFX = tc0006vcu.GFX_BG; RAM_MSK = tc0006vcu.GFX_BG_MASK; pal_map = tc0006vcu.mapper; pal_ofs = tc0006vcu.pal_ofs; tile_mask = tc0006vcu.tile_mask; bmp_x = tc0006vcu.bmp_x; bmp_y = tc0006vcu.bmp_y; bmp_w = tc0006vcu.bmp_w; bmp_h = tc0006vcu.bmp_h; scr_x = tc0006vcu.scr_x[layer]; scr_y = tc0006vcu.scr_y[layer]; if(tc0006vcu_layer_count == 0){ zoom = RAM_SCR[0x10]; zoom_2 = RAM_SCR[0x11]; if((zoom<=0x7F)){ MAKE_SCROLL_512x512_4_16( scr_x - (ReadWord(&RAM_SCR[0])), scr_y + (ReadWord(&RAM_SCR[8])) ); START_SCROLL_512x512_4_16(bmp_x,bmp_y,bmp_w,bmp_h); MAP_PALETTE_MAPPED_NEW( RAM_BG[zz]|pal_ofs, 16, map ); ta = ReadWord(&RAM_BG[zz+2]) & tile_mask; switch(RAM_BG[zz+1]&0xC0){ case 0x00: Draw16x16_Mapped_Rot(&RAM_GFX[ta<<8],x,y,map); break; case 0x40: Draw16x16_Mapped_FlipY_Rot(&RAM_GFX[ta<<8],x,y,map); break; case 0x80: Draw16x16_Mapped_FlipX_Rot(&RAM_GFX[ta<<8],x,y,map); break; case 0xC0: Draw16x16_Mapped_FlipXY_Rot(&RAM_GFX[ta<<8],x,y,map); break; } END_SCROLL_512x512_4_16(); } else{ z_data_x = &z_step[(zoom-0x80)<<5]; z_data_y = &z_step[(zoom-0x80)<<5]; tx=0; ty=0; zzz = scr_x - (ReadWord(&RAM_SCR[0])); zzzz=(zzz&0x1F0)>>2; x16=zzz&15; zzz = scr_y + (ReadWord(&RAM_SCR[8])); zzzz|=(zzz&0x1F0)<<3; y16=zzz&15; x16 = (x16 * z_data_x[tx])/16; y16 = (y16 * z_data_y[ty])/16; zz=zzzz; for(y=(48-y16);y<(224+48);y+=tyy){ tyy = z_data_y[ty]; ty = (ty+1)&3; for(x=(48-x16);x<(320+48);x+=txx){ txx = z_data_x[tx]; tx = (tx+1)&3;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -