📄 setax1.c
字号:
/******************************************************************************//* *//* SETA X1-001A/002A/006/004/003: SETA & TAITO VIDEO HARDWARE *//* *//******************************************************************************/#include "gameinc.h"#include "setax1.h"/*CHIP DATA---------BALLOON BROS:SETA X1-001ASETA X1-002ASETA X1-004KAGEKI:SETA X1-002ASETA X1-003SETA X1-004SETA X1-006DAISENPU:SETA X1-001ASETA X1-002ASETA X1-004SETA X1-006SETA X1-007ARKANOID 2:SETA X1-001SETA X1-002SETA X1-003SETA X1-004M68000 MAPPING--------------VIDEO RAM - SECTION A - there is no bank switching for double buffer--------------+---------------------+------------------Address Range | Used Bit(s) | Information--------------+-FEDC-BA98-7654-3210-+------------------D00000-D003FF | .... ...x xxxx xxxx | Sprite YD00400-D005FF | .... .... xxxx xxxx | BG0 Strip X and YD00600-D007FF | .... .... .... .... | Control Data--------------+---------------------+------------------VIDEO RAM - SECTION B- there is bank switching for double buffer--------------+---------------------+------+------------------Address Range | Used Bit(s) | Bank |Information--------------+-FEDC-BA98-7654-3210-+------+------------------E00000-E003FF | ..xx xxxx xxxx xxxx | A | Tile Number''''''-'''''' | .x.. .... .... .... | A | Flip X Axis''''''-'''''' | x... .... .... .... | A | Flip Y AxisE00400-E007FF | .... ...x xxxx xxxx | A | Sprite X''''''-'''''' | xxxx x... .... .... | A | Colour BankE00800-E00BFF | ..xx xxxx xxxx xxxx | A | BG0 Strip Tile Number''''''-'''''' | .x.. .... .... .... | A | BG0 Strip Flip X Axis''''''-'''''' | x... .... .... .... | A | BG0 Strip Flip Y AxisE00C00-E00FFF | xxxx x... .... .... | A | BG0 Strip Colour BankE02000-E023FF | ..xx xxxx xxxx xxxx | B | Tile Number''''''-'''''' | .x.. .... .... .... | B | Flip X Axis''''''-'''''' | x... .... .... .... | B | Flip Y AxisE02400-E027FF | .... ...x xxxx xxxx | B | Sprite X''''''-'''''' | xxxx x... .... .... | B | Colour BankE02800-E02BFF | ..xx xxxx xxxx xxxx | B | BG0 Strip Tile Number''''''-'''''' | .x.. .... .... .... | B | BG0 Strip Flip X Axis''''''-'''''' | x... .... .... .... | B | BG0 Strip Flip Y AxisE02C00-E02FFF | xxxx x... .... .... | B | BG0 Strip Colour Bank--------------+---------------------+------+------------------CONTROL DATA-----+--------+-------------------------Byte | Bit(s) | Information-----+76543210+------------------------- 1 |.x......| Screen Invert 3 |....xxxx| BG0 Strip Count 3 |.x......| Double Buffer Bank 5 |xxxxxxxx| BG0 Strip Y high (0-7) 7 |xxxxxxxx| BG0 Strip Y high (8-15)-----+--------+-------------------------Z80---0000-01FF | Tile (low)0200-03FF | X (low)0400-05FF | BG0 Tile (low)0600-07FF | BG0 Colour (low)1000-11FF | Tile (high)1200-13FF | X (high)1400-15FF | BG0 Tile (high)1600-17FF | BG0 Colour (low)3000-31FF | Sprite Y3200-32FF | BG0 X/Y3300-33FF | Control Data- Line enable is number of lines to draw: 0 = draw no lines 1 = draw all 16 lines 2-15 = draw 2-15 linesTodo: - test mode hatch is not showing in extermination, enable problem? - screen invert (added it to z80 version, because chuka taisen seems to require it)*/#define MASK_X (0x1FF)#define MASK_Y (0x0FF)void render_seta_x1_68000(void){ int zz,zzz,z,x16,y16,x,y,ta,rx,ry; int st,tb; UINT32 tile_mask; UINT8 *map; UINT8 *RAM_BGA; UINT8 *RAM_BGB; UINT8 *RAM_A; UINT8 *RAM_B; UINT8 *GFX_SPR; UINT8 *GFX_SPR_SOLID; UINT32 bmp_x,bmp_y,bmp_w,bmp_h; UINT32 scr_x,scr_y; RAM_A = seta_x1.RAM_A; RAM_B = seta_x1.RAM_B; bmp_x = seta_x1.bmp_x; bmp_y = seta_x1.bmp_y; bmp_w = seta_x1.bmp_w; bmp_h = seta_x1.bmp_h; scr_x = seta_x1.scr_x; scr_y = seta_x1.scr_y; GFX_SPR = seta_x1.GFX; GFX_SPR_SOLID = seta_x1.MASK; tile_mask = seta_x1.tile_mask; // BASE SCREEN COLOUR MAP_PALETTE_MAPPED_NEW( 0x1F, 16, map ); clear_game_screen(map[0]); // BACK if( (ReadWord(&RAM_B[0x0602])&0x40) == 0){ RAM_BGA = RAM_A + 0x0800; RAM_BGB = RAM_A + 0x0C00; } else{ RAM_BGA = RAM_A + 0x2800; RAM_BGB = RAM_A + 0x2C00; } st = ReadWord(&RAM_B[0x0602])&0x0F; if(st!=0){ if(st==1) st=16; tb = ( ((ReadWord(&RAM_B[0x0604])&0xFF)<<8) | ((ReadWord(&RAM_B[0x0606])&0xFF)<<16) ); for(zzz=0;zzz<st;zzz++){ z = zzz<<5; x16 = ((16+ (ReadWord(&RAM_B[0x0408+z]) | (tb&0x100))) + scr_x) & MASK_X; y16 = ((((249+16) - ReadWord(&RAM_B[0x0400+z]))) + scr_y) & MASK_Y; tb >>= 1; z <<= 1; y = y16; for(ry=0;ry<0x10;ry++){ x = x16; for(rx=0;rx<0x02;rx++){ if((x>16)&&(y>0)&&((UINT32)x<bmp_w+32)&&((UINT32)y<bmp_h+16)){ ta = ReadWord(&RAM_BGA[z])&tile_mask; if(GFX_SPR_SOLID[ta]){ // No pixels; skip MAP_PALETTE_MAPPED_NEW( ReadWord(&RAM_BGB[z])>>11, 16, map ); if(GFX_SPR_SOLID[ta]==1){ // Some pixels; trans switch(ReadWord(&RAM_BGA[z])&0xC000){ case 0x0000: Draw16x16_Trans_Mapped_Rot(&GFX_SPR[ta<<8], x, y+16, map); break; case 0x4000: Draw16x16_Trans_Mapped_FlipX_Rot(&GFX_SPR[ta<<8], x, y+16, map); break; case 0x8000: Draw16x16_Trans_Mapped_FlipY_Rot(&GFX_SPR[ta<<8], x, y+16, map); break; case 0xC000: Draw16x16_Trans_Mapped_FlipXY_Rot(&GFX_SPR[ta<<8], x, y+16, map); break; } } else{ // all pixels; solid switch(ReadWord(&RAM_BGA[z])&0xC000){ case 0x0000: Draw16x16_Mapped_Rot(&GFX_SPR[ta<<8], x, y+16, map); break; case 0x4000: Draw16x16_Mapped_FlipX_Rot(&GFX_SPR[ta<<8], x, y+16, map); break; case 0x8000: Draw16x16_Mapped_FlipY_Rot(&GFX_SPR[ta<<8], x, y+16, map); break; case 0xC000: Draw16x16_Mapped_FlipXY_Rot(&GFX_SPR[ta<<8], x, y+16, map); break; } } } } x = (x+16)&MASK_X; z += 2; } y = (y+16)&0x0FF; } } } // OBJECT if( (ReadWord(&RAM_B[0x0602])&0x40) == 0){ RAM_BGA = RAM_A + 0x0000; RAM_BGB = RAM_A + 0x0400; } else{ RAM_BGA = RAM_A + 0x2000; RAM_BGB = RAM_A + 0x2400; } for(zz=0x3FE;zz>=0;zz-=2){ x = ((16+ReadWord(&RAM_BGB[zz])) + scr_x) & MASK_X; y = (((250+0)-ReadWord(&RAM_B[zz])) + scr_y) & MASK_Y; if((x>16)&&(y>0)&&((UINT32)x<bmp_w+32)&&((UINT32)y<bmp_h+16)){ ta = ReadWord(&RAM_BGA[zz])&tile_mask; if(GFX_SPR_SOLID[ta]){ // No pixels; skip MAP_PALETTE_MAPPED_NEW( ReadWord(&RAM_BGB[zz])>>11, 16, map ); if(GFX_SPR_SOLID[ta]==1){ // Some pixels; trans switch(ReadWord(&RAM_BGA[zz])&0xC000){ case 0x0000: Draw16x16_Trans_Mapped_Rot(&GFX_SPR[ta<<8], x, y+16, map); break; case 0x4000: Draw16x16_Trans_Mapped_FlipX_Rot(&GFX_SPR[ta<<8], x, y+16, map); break; case 0x8000: Draw16x16_Trans_Mapped_FlipY_Rot(&GFX_SPR[ta<<8], x, y+16, map); break; case 0xC000: Draw16x16_Trans_Mapped_FlipXY_Rot(&GFX_SPR[ta<<8], x, y+16, map); break; } } else{ // all pixels; solid switch(ReadWord(&RAM_BGA[zz])&0xC000){ case 0x0000: Draw16x16_Mapped_Rot(&GFX_SPR[ta<<8], x, y+16, map); break; case 0x4000: Draw16x16_Mapped_FlipX_Rot(&GFX_SPR[ta<<8], x, y+16, map); break; case 0x8000: Draw16x16_Mapped_FlipY_Rot(&GFX_SPR[ta<<8], x, y+16, map); break; case 0xC000: Draw16x16_Mapped_FlipXY_Rot(&GFX_SPR[ta<<8], x, y+16, map); break; } } } } }}void render_seta_x1_z80(void){ int zz,zzz,z,x16,y16,x,y,ta;#if 0 int rx,ry;#endif int st,tb; UINT32 tile_mask; UINT8 *map; UINT8 *RAM_BGA; UINT8 *RAM_BGB; UINT8 *RAM_A; UINT8 *RAM_B; UINT8 *GFX_SPR; UINT8 *GFX_SPR_SOLID; UINT32 bmp_x,bmp_y,bmp_w,bmp_h; UINT32 scr_x,scr_y; RAM_A = seta_x1.RAM_A; RAM_B = seta_x1.RAM_B; bmp_x = seta_x1.bmp_x; bmp_y = seta_x1.bmp_y; bmp_w = seta_x1.bmp_w; bmp_h = seta_x1.bmp_h; scr_x = seta_x1.scr_x; scr_y = seta_x1.scr_y; GFX_SPR = seta_x1.GFX; GFX_SPR_SOLID = seta_x1.MASK; tile_mask = seta_x1.tile_mask; // BASE SCREEN COLOUR MAP_PALETTE_MAPPED_NEW( 0x1F, 16, map ); clear_game_screen(map[0]); if( ((RAM_B[0x0300])&0x40) == 0){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -