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

📄 tc101scn.c

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 C
字号:
/******************************************************************************//*                                                                            *//*             tc0100scn: TAITO SCREEN LAYER CHIP (BG0/BG1/FG0)               *//*                                                                            *//******************************************************************************/#include "gameinc.h"#include "tc100scn.h"#include "savegame.h"#define GFX_FG0_COUNT	0x100static UINT8 *RAM_FG[MAX_CHIP];static UINT8 *GFX_FG[MAX_CHIP];int layer_id_data[MAX_CHIP][3];static UINT32 gfx_fg0_dirty_count[MAX_CHIP];static UINT32 GFX_FG0_DIRTY[MAX_CHIP][GFX_FG0_COUNT];static UINT8 GFX_FG0_SOLID[MAX_CHIP][GFX_FG0_COUNT];static char *layer_id_name[MAX_CHIP][3] ={   { "BG0",   "BG1",   "FG0",   },   { "BG0#2", "BG1#2", "FG0#2", },   //{ "TC0100SCN:BG0",   "TC0100SCN:BG1",   "TC0100SCN:FG0",   },   //{ "TC0100SCN#2:BG0", "TC0100SCN#2:BG1", "TC0100SCN#2:FG0", },};void tc0100scn_0_load_update(void);void init_tc0100scn(int chip){   GFX_FG[chip] = tc0100scn[chip].GFX_FG0;   RAM_FG[chip] = tc0100scn[chip].RAM+0x6000;   tc0100scn[chip].layer[2].MASK	= GFX_FG0_SOLID[chip];   gfx_fg0_dirty_count[chip] = 0;   memset(GFX_FG0_DIRTY[chip],0x00,GFX_FG0_COUNT*4);   memset(GFX_FG0_SOLID[chip],0x00,GFX_FG0_COUNT);   layer_id_data[chip][0] = add_layer_info(layer_id_name[chip][0]);   layer_id_data[chip][1] = add_layer_info(layer_id_name[chip][1]);   layer_id_data[chip][2] = add_layer_info(layer_id_name[chip][2]);   if(GFX_FG[chip]){      memset(GFX_FG[chip],0x00, 0x4000);      memset(RAM_FG[chip],0x00, 0x1000);   }   AddLoadCallback(tc0100scn_0_load_update);}/******************************************************************************/#undef  RAM_PTR#undef  GFX_PTR#define RAM_PTR		RAM_FG[0]#define GFX_PTR		GFX_FG[0]void tc0100scn_0_load_update(void){   UINT32 i,j;   gfx_fg0_dirty_count[0] = 0;   for(i = 0; i < 0x1000; i += 2){      j = ReadWord(&RAM_PTR[i]);      WriteWord(&RAM_PTR[i], ~j);      tc0100scn_0_gfx_fg0_ww(i, j);   }}void tc0100scn_0_update_gfx_fg0(void){   UINT32 ta,tb,tc,td,te;   UINT8 *source;   for(ta = 0; ta < gfx_fg0_dirty_count[0]; ta++){      tb = GFX_FG0_DIRTY[0][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[0][tb]=0;	// All pixels are 0: Don't Draw      if((td==1)&&(te==1)) GFX_FG0_SOLID[0][tb]=1;	// Mixed: Draw Trans      if((td==1)&&(te==0)) GFX_FG0_SOLID[0][tb]=2;	// All pixels are !0: Draw Solid         }   gfx_fg0_dirty_count[0] = 0;}void tc0100scn_0_gfx_fg0_wb(UINT32 addr, UINT8 data){   int tb;   addr=(addr^1)&0xFFF;   if((RAM_PTR[addr])!=data){   // Write to RAM   // ------------   RAM_PTR[addr]=data;   // Write to 8x8 GFX   // ----------------   tb=(addr&0xFFE)<<2;   if((addr&1)==0){      GFX_PTR[tb+0] = (GFX_PTR[tb+0]&0x02)|((data&0x80)>>7);      GFX_PTR[tb+1] = (GFX_PTR[tb+1]&0x02)|((data&0x40)>>6);      GFX_PTR[tb+2] = (GFX_PTR[tb+2]&0x02)|((data&0x20)>>5);      GFX_PTR[tb+3] = (GFX_PTR[tb+3]&0x02)|((data&0x10)>>4);      GFX_PTR[tb+4] = (GFX_PTR[tb+4]&0x02)|((data&0x08)>>3);      GFX_PTR[tb+5] = (GFX_PTR[tb+5]&0x02)|((data&0x04)>>2);      GFX_PTR[tb+6] = (GFX_PTR[tb+6]&0x02)|((data&0x02)>>1);      GFX_PTR[tb+7] = (GFX_PTR[tb+7]&0x02)|((data&0x01)>>0);   }   else{      GFX_PTR[tb+0] = (GFX_PTR[tb+0]&0x01)|((data&0x80)>>6);      GFX_PTR[tb+1] = (GFX_PTR[tb+1]&0x01)|((data&0x40)>>5);      GFX_PTR[tb+2] = (GFX_PTR[tb+2]&0x01)|((data&0x20)>>4);      GFX_PTR[tb+3] = (GFX_PTR[tb+3]&0x01)|((data&0x10)>>3);      GFX_PTR[tb+4] = (GFX_PTR[tb+4]&0x01)|((data&0x08)>>2);      GFX_PTR[tb+5] = (GFX_PTR[tb+5]&0x01)|((data&0x04)>>1);      GFX_PTR[tb+6] = (GFX_PTR[tb+6]&0x01)|((data&0x02)>>0);      GFX_PTR[tb+7] = (GFX_PTR[tb+7]&0x01)|((data&0x01)<<1);   }   // request mask update   tb >>= 6;   if(GFX_FG0_SOLID[0][tb] != 3){      GFX_FG0_SOLID[0][tb] = 3;      GFX_FG0_DIRTY[0][gfx_fg0_dirty_count[0]++] = tb;   }   }}void tc0100scn_0_gfx_fg0_ww(UINT32 addr, UINT16 data){   addr&=0xFFE;   if(ReadWord(&RAM_PTR[addr])!=data){   // Write to RAM   // ------------   WriteWord(&RAM_PTR[addr],data);   // Write to 8x8 GFX   // ----------------   addr=addr<<2;   GFX_PTR[addr+0] = ((data&0x8000)>>14)|((data&0x0080)>>7);   GFX_PTR[addr+1] = ((data&0x4000)>>13)|((data&0x0040)>>6);   GFX_PTR[addr+2] = ((data&0x2000)>>12)|((data&0x0020)>>5);   GFX_PTR[addr+3] = ((data&0x1000)>>11)|((data&0x0010)>>4);   GFX_PTR[addr+4] = ((data&0x0800)>>10)|((data&0x0008)>>3);   GFX_PTR[addr+5] = ((data&0x0400)>> 9)|((data&0x0004)>>2);   GFX_PTR[addr+6] = ((data&0x0200)>> 8)|((data&0x0002)>>1);   GFX_PTR[addr+7] = ((data&0x0100)>> 7)|((data&0x0001)>>0);   // request mask update   addr >>= 6;   if(GFX_FG0_SOLID[0][addr] != 3){      GFX_FG0_SOLID[0][addr] = 3;      GFX_FG0_DIRTY[0][gfx_fg0_dirty_count[0]++] = addr;   }      }}void tc0100scn_0_copy_gfx_fg0(UINT8 *src, UINT32 size){   UINT32 i;   for(i=0; i<size; i+=2){      tc0100scn_0_gfx_fg0_ww(i, (UINT16) (ReadWord68k(&src[i])) );   }}/******************************************************************************/#undef  RAM_PTR#undef  GFX_PTR#define RAM_PTR		RAM_FG[1]#define GFX_PTR		GFX_FG[1]#if 0// unused !!!static void tc0100scn_1_update_gfx_fg0(void){   UINT32 ta,tb,tc,td,te;   UINT8 *source;   for(ta = 0; ta < gfx_fg0_dirty_count[1]; ta++){      tb = GFX_FG0_DIRTY[1][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[1][tb]=0;	// All pixels are 0: Don't Draw      if((td==1)&&(te==1)) GFX_FG0_SOLID[1][tb]=1;	// Mixed: Draw Trans      if((td==1)&&(te==0)) GFX_FG0_SOLID[1][tb]=2;	// All pixels are !0: Draw Solid         }   gfx_fg0_dirty_count[1] = 0;}#endifvoid tc0100scn_1_gfx_fg0_wb(UINT32 addr, UINT8 data){   int tb;   addr=(addr^1)&0xFFF;   if((RAM_PTR[addr])!=data){   // Write to RAM   // ------------   RAM_PTR[addr]=data;   // Write to 8x8 GFX   // ----------------   tb=(addr&0xFFE)<<2;   if((addr&1)==0){      GFX_PTR[tb+0] = (GFX_PTR[tb+0]&0x02)|((data&0x80)>>7);      GFX_PTR[tb+1] = (GFX_PTR[tb+1]&0x02)|((data&0x40)>>6);      GFX_PTR[tb+2] = (GFX_PTR[tb+2]&0x02)|((data&0x20)>>5);      GFX_PTR[tb+3] = (GFX_PTR[tb+3]&0x02)|((data&0x10)>>4);      GFX_PTR[tb+4] = (GFX_PTR[tb+4]&0x02)|((data&0x08)>>3);      GFX_PTR[tb+5] = (GFX_PTR[tb+5]&0x02)|((data&0x04)>>2);      GFX_PTR[tb+6] = (GFX_PTR[tb+6]&0x02)|((data&0x02)>>1);      GFX_PTR[tb+7] = (GFX_PTR[tb+7]&0x02)|((data&0x01)>>0);   }   else{      GFX_PTR[tb+0] = (GFX_PTR[tb+0]&0x01)|((data&0x80)>>6);      GFX_PTR[tb+1] = (GFX_PTR[tb+1]&0x01)|((data&0x40)>>5);      GFX_PTR[tb+2] = (GFX_PTR[tb+2]&0x01)|((data&0x20)>>4);      GFX_PTR[tb+3] = (GFX_PTR[tb+3]&0x01)|((data&0x10)>>3);      GFX_PTR[tb+4] = (GFX_PTR[tb+4]&0x01)|((data&0x08)>>2);      GFX_PTR[tb+5] = (GFX_PTR[tb+5]&0x01)|((data&0x04)>>1);      GFX_PTR[tb+6] = (GFX_PTR[tb+6]&0x01)|((data&0x02)>>0);      GFX_PTR[tb+7] = (GFX_PTR[tb+7]&0x01)|((data&0x01)<<1);   }   }}void tc0100scn_1_gfx_fg0_ww(UINT32 addr, UINT16 data){   addr&=0xFFE;   if(ReadWord(&RAM_PTR[addr])!=data){   // Write to RAM   // ------------   WriteWord(&RAM_PTR[addr],data);   // Write to 8x8 GFX   // ----------------   addr=addr<<2;   GFX_PTR[addr+0] = ((data&0x8000)>>14)|((data&0x0080)>>7);   GFX_PTR[addr+1] = ((data&0x4000)>>13)|((data&0x0040)>>6);   GFX_PTR[addr+2] = ((data&0x2000)>>12)|((data&0x0020)>>5);   GFX_PTR[addr+3] = ((data&0x1000)>>11)|((data&0x0010)>>4);   GFX_PTR[addr+4] = ((data&0x0800)>>10)|((data&0x0008)>>3);   GFX_PTR[addr+5] = ((data&0x0400)>> 9)|((data&0x0004)>>2);   GFX_PTR[addr+6] = ((data&0x0200)>> 8)|((data&0x0002)>>1);   GFX_PTR[addr+7] = ((data&0x0100)>> 7)|((data&0x0001)>>0);   }}void tc0100scn_1_copy_gfx_fg0(UINT8 *src, UINT32 size){   UINT32 i;   for(i=0; i<size; i+=2){      tc0100scn_1_gfx_fg0_ww(i, (UINT16) (ReadWord68k(&src[i])) );   }}/******************************************************************************/#undef  RAM_PTR#undef  GFX_PTR#define RAM_PTR		RAM_FG[0]#define GFX_PTR		GFX_FG[0]void tc0100scn_0_gfx_fg0_wb_r270(UINT32 addr, UINT8 data){   int tb;   addr=(addr^1)&0xFFF;   if((RAM_PTR[addr])!=data){   // Write to RAM   // ------------   RAM_PTR[addr]=data;   // Write to 8x8 GFX   // ----------------   tb=((addr&0xFF0)<<2)|((addr&0x0E)>>1);   if((addr&1)==0){      GFX_PTR[tb+0x00] = (GFX_PTR[tb+0x00]&0x02)|((data&0x01)>>0);      GFX_PTR[tb+0x08] = (GFX_PTR[tb+0x08]&0x02)|((data&0x02)>>1);      GFX_PTR[tb+0x10] = (GFX_PTR[tb+0x10]&0x02)|((data&0x04)>>2);      GFX_PTR[tb+0x18] = (GFX_PTR[tb+0x18]&0x02)|((data&0x08)>>3);      GFX_PTR[tb+0x20] = (GFX_PTR[tb+0x20]&0x02)|((data&0x10)>>4);      GFX_PTR[tb+0x28] = (GFX_PTR[tb+0x28]&0x02)|((data&0x20)>>5);      GFX_PTR[tb+0x30] = (GFX_PTR[tb+0x30]&0x02)|((data&0x40)>>6);      GFX_PTR[tb+0x38] = (GFX_PTR[tb+0x38]&0x02)|((data&0x80)>>7);   }   else{      GFX_PTR[tb+0x00] = (GFX_PTR[tb+0x00]&0x01)|((data&0x01)<<1);      GFX_PTR[tb+0x08] = (GFX_PTR[tb+0x08]&0x01)|((data&0x02)>>0);      GFX_PTR[tb+0x10] = (GFX_PTR[tb+0x10]&0x01)|((data&0x04)>>1);      GFX_PTR[tb+0x18] = (GFX_PTR[tb+0x18]&0x01)|((data&0x08)>>2);      GFX_PTR[tb+0x20] = (GFX_PTR[tb+0x20]&0x01)|((data&0x10)>>3);      GFX_PTR[tb+0x28] = (GFX_PTR[tb+0x28]&0x01)|((data&0x20)>>4);      GFX_PTR[tb+0x30] = (GFX_PTR[tb+0x30]&0x01)|((data&0x40)>>5);      GFX_PTR[tb+0x38] = (GFX_PTR[tb+0x38]&0x01)|((data&0x80)>>6);   }   }}void tc0100scn_0_gfx_fg0_ww_r270(UINT32 addr, UINT16 data){   int tb;   addr&=0xFFE;   if(ReadWord(&RAM_PTR[addr])!=data){   // Write to RAM   // ------------   WriteWord(&RAM_PTR[addr],data);   // Write to 8x8 GFX   // ----------------   tb=((addr&0xFF0)<<2)|((addr&0x0E)>>1);   GFX_PTR[tb+0x00] = ((data&0x0100)>> 7)|((data&0x0001)>>0);   GFX_PTR[tb+0x08] = ((data&0x0200)>> 8)|((data&0x0002)>>1);   GFX_PTR[tb+0x10] = ((data&0x0400)>> 9)|((data&0x0004)>>2);   GFX_PTR[tb+0x18] = ((data&0x0800)>>10)|((data&0x0008)>>3);   GFX_PTR[tb+0x20] = ((data&0x1000)>>11)|((data&0x0010)>>4);   GFX_PTR[tb+0x28] = ((data&0x2000)>>12)|((data&0x0020)>>5);   GFX_PTR[tb+0x30] = ((data&0x4000)>>13)|((data&0x0040)>>6);   GFX_PTR[tb+0x38] = ((data&0x8000)>>14)|((data&0x0080)>>7);   }}void tc0100scn_0_copy_gfx_fg0_r270(UINT8 *src, UINT32 size){   UINT32 i;   for(i=0; i<size; i+=2){      tc0100scn_0_gfx_fg0_ww_r270(i, (UINT16) (ReadWord68k(&src[i])) );   }}/******************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -