📄 tc004vcu.c
字号:
WriteWord(&RAM_GFX_HG0B[addr],data); // Write to 8x8 GFX // ---------------- addr=addr<<2; GFX_HG0[addr+0]=(GFX_HG0[addr+0]&0x03)|(((data&0x8000)>>15)<<3)|(((data&0x0080)>>7)<<2); GFX_HG0[addr+1]=(GFX_HG0[addr+1]&0x03)|(((data&0x4000)>>14)<<3)|(((data&0x0040)>>6)<<2); GFX_HG0[addr+2]=(GFX_HG0[addr+2]&0x03)|(((data&0x2000)>>13)<<3)|(((data&0x0020)>>5)<<2); GFX_HG0[addr+3]=(GFX_HG0[addr+3]&0x03)|(((data&0x1000)>>12)<<3)|(((data&0x0010)>>4)<<2); GFX_HG0[addr+4]=(GFX_HG0[addr+4]&0x03)|(((data&0x0800)>>11)<<3)|(((data&0x0008)>>3)<<2); GFX_HG0[addr+5]=(GFX_HG0[addr+5]&0x03)|(((data&0x0400)>>10)<<3)|(((data&0x0004)>>2)<<2); GFX_HG0[addr+6]=(GFX_HG0[addr+6]&0x03)|(((data&0x0200)>>9)<<3)|(((data&0x0002)>>1)<<2); GFX_HG0[addr+7]=(GFX_HG0[addr+7]&0x03)|(((data&0x0100)>>8)<<3)|(((data&0x0001)>>0)<<2); }}/******************************************************************************/void tc0004vcu_render_bg0(void){ int x,y,x16,y16,zzzz,zzz,zz; UINT8 *map; UINT8 *RAM_BG; UINT8 *RAM_BG_B; UINT8 *RAM_SCR; UINT8 *RAM_GFX; UINT32 tile_mask; UINT32 bmp_x,bmp_y,bmp_w,bmp_h; UINT32 scr_x,scr_y; RAM_BG = tc0004vcu.RAM + 0x0C000; RAM_BG_B = tc0004vcu.RAM + 0x1C000; RAM_SCR = tc0004vcu.RAM + 0x20802; RAM_GFX = tc0004vcu.GFX_BG0; tile_mask = tc0004vcu.tile_mask; bmp_x = tc0004vcu.bmp_x; bmp_y = tc0004vcu.bmp_y; bmp_w = tc0004vcu.bmp_w; bmp_h = tc0004vcu.bmp_h; scr_x = tc0004vcu.scr_x; scr_y = tc0004vcu.scr_y; MAKE_SCROLL_1024x1024_2_16( scr_x-(ReadWord(RAM_SCR+0)), scr_y+(ReadWord(RAM_SCR+4)) ); START_SCROLL_1024x1024_2_16(bmp_x,bmp_y,bmp_w,bmp_h); MAP_PALETTE_MAPPED_NEW( RAM_BG_B[zz]&0x3F, 16, map ); switch(RAM_BG_B[zz]&0xC0){ case 0x00: Draw16x16_Mapped_Rot(&RAM_GFX[(ReadWord(&RAM_BG[zz])&tile_mask)<<8],x,y,map); break; case 0x40: Draw16x16_Mapped_FlipY_Rot(&RAM_GFX[(ReadWord(&RAM_BG[zz])&tile_mask)<<8],x,y,map); break; case 0x80: Draw16x16_Mapped_FlipX_Rot(&RAM_GFX[(ReadWord(&RAM_BG[zz])&tile_mask)<<8],x,y,map); break; case 0xC0: Draw16x16_Mapped_FlipXY_Rot(&RAM_GFX[(ReadWord(&RAM_BG[zz])&tile_mask)<<8],x,y,map); break; } END_SCROLL_1024x1024_2_16();}void tc0004vcu_render_bg1(void){ int x,y,x16,y16,zzzz,zzz,zz,ta; UINT8 *map; UINT8 *RAM_BG; UINT8 *RAM_BG_B; UINT8 *RAM_SCR; UINT8 *RAM_GFX; UINT8 *RAM_MSK; UINT32 tile_mask; UINT32 bmp_x,bmp_y,bmp_w,bmp_h; UINT32 scr_x,scr_y; RAM_BG = tc0004vcu.RAM + 0x0E000; RAM_BG_B = tc0004vcu.RAM + 0x1E000; RAM_SCR = tc0004vcu.RAM + 0x20804; RAM_GFX = tc0004vcu.GFX_BG0; RAM_MSK = tc0004vcu.GFX_BG0_MSK; tile_mask = tc0004vcu.tile_mask; bmp_x = tc0004vcu.bmp_x; bmp_y = tc0004vcu.bmp_y; bmp_w = tc0004vcu.bmp_w; bmp_h = tc0004vcu.bmp_h; scr_x = tc0004vcu.scr_x; scr_y = tc0004vcu.scr_y; MAKE_SCROLL_1024x1024_2_16( scr_x-(ReadWord(RAM_SCR+0)), scr_y+(ReadWord(RAM_SCR+4)) ); START_SCROLL_1024x1024_2_16(bmp_x,bmp_y,bmp_w,bmp_h); ta=ReadWord(&RAM_BG[zz])&tile_mask; if(RAM_MSK[ta]!=0){ // No pixels; skip MAP_PALETTE_MAPPED_NEW( RAM_BG_B[zz]&0x3F, 16, map ); if(RAM_MSK[ta]==1){ // Some pixels; trans switch(RAM_BG_B[zz]&0xC0){ case 0x00: Draw16x16_Trans_Mapped_Rot(&RAM_GFX[ta<<8],x,y,map); break; case 0x40: Draw16x16_Trans_Mapped_FlipY_Rot(&RAM_GFX[ta<<8],x,y,map); break; case 0x80: Draw16x16_Trans_Mapped_FlipX_Rot(&RAM_GFX[ta<<8],x,y,map); break; case 0xC0: Draw16x16_Trans_Mapped_FlipXY_Rot(&RAM_GFX[ta<<8],x,y,map); break; } } else{ // all pixels; solid switch(RAM_BG_B[zz]&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_1024x1024_2_16();}void tc0004vcu_render_fg0(void){ int x,y,x16,y16,zzzz,zzz,zz,ta,tx; UINT8 *map; UINT8 *RAM_BG; UINT8 *RAM_SCR; UINT8 *GFX_BG; UINT32 bmp_x,bmp_y,bmp_w,bmp_h; UINT32 scr_x,scr_y; RAM_BG = tc0004vcu.RAM + 0x01000; RAM_SCR = tc0004vcu.RAM + 0x2080A; GFX_BG = tc0004vcu.GFX_FG0; bmp_x = tc0004vcu.bmp_x; bmp_y = tc0004vcu.bmp_y; bmp_w = tc0004vcu.bmp_w; bmp_h = tc0004vcu.bmp_h; scr_x = tc0004vcu.scr_x; scr_y = tc0004vcu.scr_y; tx = 64-(bmp_w>>3); MAKE_SCROLL_512x512_1_8( scr_x, //-(ReadWord(RAM_SCR+0)), scr_y //+(ReadWord(RAM_SCR+4)) ); zz=zzzz; for(y=bmp_y;(UINT32)y<(bmp_h+bmp_y);y+=8,zz+=tx){ for(x=bmp_x;(UINT32)x<(bmp_w+bmp_x);x+=8,zz++){ ta=RAM_BG[zz^1]; if(ta!=0){ // No pixels; skip MAP_PALETTE_MAPPED_NEW( 32, 16, map ); Draw8x8_Trans_Mapped_Rot(&GFX_BG[ta<<6],x,y,map); } } }}static UINT32 chain_y_size[4] ={ 1, // 64x16: OK 2, // 64x32: ? 4, // 64x64: OK 4, // 64x64: ?};void tc0004vcu_render_obj(void){ int x,y,zz,ta,td; int rx,ry,x_store,zx,zy; UINT8 *zoom_dat_x; UINT8 *zoom_dat_y; UINT8 *zdx_store; UINT8 *map; UINT8 *RAM_BG; UINT8 *RAM_GFX; UINT8 *RAM_MSK; UINT8 *RAM_CH; UINT8 *RAM_CH_B; UINT32 tile_mask; int sx_1,sy_1,sx_2,sy_2; int ofs_x,ofs_y; RAM_BG = tc0004vcu.RAM + 0x20400; RAM_GFX = tc0004vcu.GFX_BG0; RAM_MSK = tc0004vcu.GFX_BG0_MSK; RAM_CH = tc0004vcu.RAM + 0x00000; RAM_CH_B = tc0004vcu.RAM + 0x10000; tile_mask = tc0004vcu.tile_mask; sx_1 = tc0004vcu.bmp_x; sy_1 = tc0004vcu.bmp_y; sx_2 = tc0004vcu.bmp_x + tc0004vcu.bmp_w; sy_2 = tc0004vcu.bmp_y + tc0004vcu.bmp_h; ofs_x = tc0004vcu.bmp_x - tc0004vcu.scr_x; ofs_y = tc0004vcu.bmp_y - tc0004vcu.scr_y; zz = 0x03F0; do{ if(ReadWord(&RAM_BG[zz+4])!=0x0000){ x_store = (ofs_x+ReadWord(&RAM_BG[zz+2]))&OBJ_X_MASK; y = (ofs_y+ReadWord(&RAM_BG[zz+0]))&OBJ_Y_MASK; td = ((ReadWord(&RAM_BG[zz+6])&0x1FFF)<<3); zdx_store = zoom16_ofs+(zoom_conv_x[(RAM_BG[zz+5]&0x7F)]<<2); //zoom_dat_y = zoom16_ofs+(zoom_conv_y[(RAM_BG[zz+4]&0x7F)]<<2); zoom_dat_y = zoom16_ofs+(zoom_conv_x[(RAM_BG[zz+5]&0x7F)]<<2); ry = chain_y_size[(ReadWord(&RAM_BG[zz])>>10)&0x03]; do{ x = x_store; rx = 4; zoom_dat_x = zdx_store; zy = *zoom_dat_y++; do{ zx = *zoom_dat_x++; if(((x+zx) > sx_1) && (x < sx_2)){ if(((y+zy) > sy_1) && (y < sy_2)){ ta=ReadWord(&RAM_CH[td])&tile_mask; if(RAM_MSK[ta]!=0){ // No pixels; skip MAP_PALETTE_MAPPED_NEW( RAM_CH_B[td]&0x3F, 16, map ); if(RAM_MSK[ta]==1){ // Some pixels; trans switch(RAM_CH_B[td]&0xC0){ case 0x00: Draw16x16_32_Trans_Mapped_ZoomXY(&RAM_GFX[ta<<8],x,y,map,zx,zy); break; case 0x40: Draw16x16_32_Trans_Mapped_ZoomXY_FlipY(&RAM_GFX[ta<<8],x,y,map,zx,zy); break; case 0x80: Draw16x16_32_Trans_Mapped_ZoomXY_FlipX(&RAM_GFX[ta<<8],x,y,map,zx,zy); break; case 0xC0: Draw16x16_32_Trans_Mapped_ZoomXY_FlipXY(&RAM_GFX[ta<<8],x,y,map,zx,zy); break; } } else{ // all pixels; solid switch(RAM_CH_B[td]&0xC0){ case 0x00: Draw16x16_32_Mapped_ZoomXY(&RAM_GFX[ta<<8],x,y,map,zx,zy); break; case 0x40: Draw16x16_32_Mapped_ZoomXY_FlipY(&RAM_GFX[ta<<8],x,y,map,zx,zy); break; case 0x80: Draw16x16_32_Mapped_ZoomXY_FlipX(&RAM_GFX[ta<<8],x,y,map,zx,zy); break; case 0xC0: Draw16x16_32_Mapped_ZoomXY_FlipXY(&RAM_GFX[ta<<8],x,y,map,zx,zy); break; } } } } } x = (x+zx)&OBJ_X_MASK; td += 2; }while(--rx); y = (y+zy)&OBJ_Y_MASK; }while(--ry); } }while((zz-=8)>=0);}/******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -