⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tc006vcu.c

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************//*                                                                            *//*           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 + -