📄 bshark.c
字号:
tc0100scn[0].layer[1].MASK =GFX_BG0_SOLID;
tc0100scn[0].layer[1].SCR =RAM_SCROLL+2;
tc0100scn[0].layer[1].type =0;
tc0100scn[0].layer[1].bmp_x =32;
tc0100scn[0].layer[1].bmp_y =32;
tc0100scn[0].layer[1].bmp_w =320;
tc0100scn[0].layer[1].bmp_h =240;
tc0100scn[0].layer[1].mapper =&Map_15bit_xBGR;
tc0100scn[0].layer[1].tile_mask=0x3FFF;
tc0100scn[0].layer[1].scr_x =16;
tc0100scn[0].layer[1].scr_y =8;
tc0100scn[0].layer[2].RAM =RAM_VIDEO+0x4000;
tc0100scn[0].layer[2].GFX =GFX_FG0;
tc0100scn[0].layer[2].SCR =RAM_SCROLL+4;
tc0100scn[0].layer[2].type =3;
tc0100scn[0].layer[2].bmp_x =32;
tc0100scn[0].layer[2].bmp_y =32;
tc0100scn[0].layer[2].bmp_w =320;
tc0100scn[0].layer[2].bmp_h =240;
tc0100scn[0].layer[2].mapper =&Map_15bit_xBGR;
tc0100scn[0].layer[2].scr_x =16;
tc0100scn[0].layer[2].scr_y =8;
tc0100scn[0].RAM = RAM_VIDEO;
tc0100scn[0].GFX_FG0 = GFX_FG0;
init_tc0100scn(0);
init_16x8_zoom();
zoom16_ofs = make_16x16_zoom_ofs_type1zz();
zoom8_ofs = make_16x8_zoom_ofs_type1zz();
GameMouse = 1;
/*
* StarScream Stuff follows
*/
ByteSwap(ROM,0x100000);
ByteSwap(RAM,0x40000);
AddMemFetch(0x000000, 0x07FFFF, ROM+0x000000-0x000000); // 68000 ROM
AddMemFetch(-1, -1, NULL);
AddReadByte(0x000000, 0x07FFFF, NULL, ROM+0x000000); // 68000 ROM
AddReadByte(0x100000, 0x113FFF, NULL, RAM+0x000000); // 68000 RAM
AddReadByte(0xD00000, 0xD0FFFF, NULL, RAM_VIDEO); // SCREEN RAM
AddReadByte(0xC00000, 0xC00FFF, NULL, RAM+0x024000); // OBJECT RAM
AddReadByte(0xA00000, 0xA01FFF, NULL, RAM+0x025000); // COLOR RAM
AddReadByte(0x400000, 0x40000F, NULL, RAM_INPUT); // INPUT
AddReadByte(0x800000, 0x80000F, NULL, RAM+0x027020); // CURSOR
AddReadByte(0x000000, 0xFFFFFF, DefBadReadByte, NULL); // <Bad Reads>
AddReadByte(-1, -1, NULL, NULL);
AddReadWord(0x000000, 0x07FFFF, NULL, ROM+0x000000); // 68000 ROM
AddReadWord(0x100000, 0x113FFF, NULL, RAM+0x000000); // 68000 RAM
AddReadWord(0xD00000, 0xD0FFFF, NULL, RAM_VIDEO); // SCREEN RAM
AddReadWord(0xC00000, 0xC00FFF, NULL, RAM+0x024000); // OBJECT RAM
AddReadWord(0xA00000, 0xA01FFF, NULL, RAM+0x025000); // COLOR RAM
AddReadWord(0x400000, 0x40000F, NULL, RAM_INPUT); // INPUT
AddReadWord(0x000000, 0xFFFFFF, DefBadReadWord, NULL); // <Bad Reads>
AddReadWord(-1, -1,NULL, NULL);
AddWriteByte(0x100000, 0x113FFF, NULL, RAM+0x000000); // 68000 RAM
AddWriteByte(0xD06000, 0xD06FFF, tc0100scn_0_gfx_fg0_wb, NULL); // FG0 GFX RAM
AddWriteByte(0xD00000, 0xD0FFFF, NULL, RAM_VIDEO); // SCREEN RAM
AddWriteByte(0xC00000, 0xC00FFF, NULL, RAM+0x024000); // OBJECT RAM
AddWriteByte(0xA00000, 0xA01FFF, NULL, RAM+0x025000); // COLOR RAM
AddWriteByte(0x400000, 0x40000F, tc0220ioc_wb, NULL); // INPUT
AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000
AddWriteByte(0x000000, 0xFFFFFF, DefBadWriteByte, NULL); // <Bad Writes>
AddWriteByte(-1, -1, NULL, NULL);
AddWriteWord(0x100000, 0x113FFF, NULL, RAM+0x000000); // 68000 RAM
AddWriteWord(0xD06000, 0xD06FFF, tc0100scn_0_gfx_fg0_ww, NULL); // FG0 GFX RAM
AddWriteWord(0xD00000, 0xD0FFFF, NULL, RAM_VIDEO); // SCREEN RAM
AddWriteWord(0xC00000, 0xC00FFF, NULL, RAM+0x024000); // OBJECT RAM
AddWriteWord(0xA00000, 0xA01FFF, NULL, RAM+0x025000); // COLOR RAM
AddWriteWord(0xD20000, 0xD2000F, NULL, RAM_SCROLL); // SCROLL RAM
AddWriteWord(0x400000, 0x40000F, tc0220ioc_ww, NULL); // INPUT
AddWriteWord(0x000000, 0xFFFFFF, DefBadWriteWord, NULL); // <Bad Writes>
AddWriteWord(-1, -1, NULL, NULL);
AddInitMemory(); // Set Starscream mem pointers...
AddMemFetchMC68000B(0x000000, 0x07FFFF, ROM+0x080000-0x000000); // 68000 ROM
AddMemFetchMC68000B(-1, -1, NULL);
AddReadByteMC68000B(0x000000, 0x07FFFF, NULL, ROM+0x080000); // 68000 ROM
AddReadByteMC68000B(0x108000, 0x10BFFF, NULL, RAM+0x030000); // MAIN RAM
AddReadByteMC68000B(0x110000, 0x113FFF, NULL, RAM+0x010000); // COMMON RAM
AddReadByteMC68000B(0x000000, 0xFFFFFF, DefBadReadByte, NULL); // <Bad Reads>
AddReadByteMC68000B(-1, -1, NULL, NULL);
AddReadWordMC68000B(0x000000, 0x07FFFF, NULL, ROM+0x080000); // 68000 ROM
AddReadWordMC68000B(0x108000, 0x10BFFF, NULL, RAM+0x030000); // MAIN RAM
AddReadWordMC68000B(0x110000, 0x113FFF, NULL, RAM+0x010000); // COMMON RAM
AddReadWordMC68000B(0x600000, 0x600007, YM2610Read68k, NULL); // YM2610
AddReadWordMC68000B(0x000000, 0xFFFFFF, DefBadReadWord, NULL); // <Bad Reads>
AddReadWordMC68000B(-1, -1, NULL, NULL);
AddWriteByteMC68000B(0x108000, 0x10BFFF, NULL, RAM+0x030000); // MAIN RAM
AddWriteByteMC68000B(0x110000, 0x113FFF, NULL, RAM+0x010000); // COMMON RAM
AddWriteByteMC68000B(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000
AddWriteByteMC68000B(0x000000, 0xFFFFFF, DefBadWriteByte, NULL); // <Bad Writes>
AddWriteByteMC68000B(-1, -1, NULL, NULL);
AddWriteWordMC68000B(0x108000, 0x10BFFF, NULL, RAM+0x030000); // MAIN RAM
AddWriteWordMC68000B(0x110000, 0x113FFF, NULL, RAM+0x010000); // COMMON RAM
AddWriteWordMC68000B(0x800000, 0x801FFF, NULL, RAM+0x034000); // ROADSCROLL RAM
AddWriteWordMC68000B(0x600000, 0x600007, YM2610Write68k, NULL); // YM2610
AddWriteWordMC68000B(0x000000, 0xFFFFFF, DefBadWriteWord, NULL); // <Bad Writes>
AddWriteWordMC68000B(-1, -1, NULL, NULL);
AddInitMemoryMC68000B(); // Set Starscream mem pointers...
}
void ClearBattleShark(void)
{
#ifdef RAINE_DEBUG
//save_debug("ROM.bin",ROM,0x100000,1);
save_debug("RAM.bin",RAM,0x040000,1);
//save_debug("GFX.bin",GFX,0x100000,0);
#endif
}
static int x1,myy1,x11,myy11;
void ExecuteBattleSharkFrame(void)
{
/*------[Mouse Hack]-------*/
set_mouse_range(0,0,319,239);
x11=319-mouse_x;
myy11=mouse_y;
x1=(x11*106)/320;
myy1=(myy11*98)/240;
if(x1<0){x1=0;}
if(x1>127){x1=127;}
if(myy1<0){myy1=0;}
if(myy1>127){myy1=127;}
RAM[0x27020]=x1-0x40+12;
RAM[0x27022]=myy1-0x40+18;
if(mouse_b&1) RAM[0x2701E] &= ~0x40;
/*------[CPU Execution]------*/
cpu_execute_cycles(CPU_68K_0, CPU_FRAME_MHz(10,60)); // M68000 12MHz (60fps)
#ifdef RAINE_DEBUG
print_debug("PC0:%06x SR0:%04x\n",s68000context.pc,s68000context.sr);
#endif
cpu_interrupt(CPU_68K_0, 6);
cpu_interrupt(CPU_68K_0, 4);
cpu_execute_cycles(CPU_68K_1, CPU_FRAME_MHz(10,60)); // M68000 12MHz (60fps)
#ifdef RAINE_DEBUG
print_debug("PC1:%06x SR1:%04x\n",s68000context.pc,s68000context.sr);
#endif
cpu_interrupt(CPU_68K_1, 4);
}
static void render_z_system_sprites(int pri)
{
int x,y,ta,tb,zz;
int zx,zy,rx,ry,xx,zzx,zzy;
UINT8 *map,*SPR_MAP;
UINT8 *zoom_dat_x;
UINT8 *zoom_dat_y;
/*
if(pri!=0)
pri=0x00;
else
pri=0x80;
*/
// OBJECT Z-SYSTEM
// ---------------
for(zz=0x24000;zz<0x25000;zz+=8){
//if((RAM[zz+2]&0x80)==pri){
zx=(RAM[zz+2]>>0)&0x3F;
zy=(RAM[zz+1]>>1)&0x3F;
if((zx!=0)&&(zy!=0)){
ta = ReadWord(&RAM[zz+6])&0xFFF;
if(ta!=0){
x=((320+32)-(ReadWord(&RAM[zz+4])+zx))&0x1FF;
//y=(32+ReadWord(&RAM[zz+0])+(0x3F-(zy>>1)))&0x1FF;
y=(((64-16)+32+7)+(ReadWord(&RAM[zz+0])-zy))&0x1FF;
MAP_PALETTE_MAPPED_NEW(
(ReadWord(&RAM[zz+2])>>7)&0xFF,
16,
map
);
zoom_dat_x = zoom16_ofs+(zx<<2);
zoom_dat_y = zoom8_ofs+(zy<<3);
SPR_MAP = OBJECT_MAP + (ta<<6);
switch(RAM[zz+5]&0xC0){
case 0x40:
xx=x;
for(ry=0;ry<8;ry++){
zzy = zoom_dat_y[ry];
if((y>16)&&(y<240+32)){
ta=0;
for(rx=0;rx<4;rx++){
zzx = zoom_dat_x[rx];
if((x>16)&&(x<320+32)){
tb=ReadWord(&SPR_MAP[ta])&0x7FFF;
if(GFX_OBJ_A_SOLID[tb]!=0){ // No pixels; skip
if(GFX_OBJ_A_SOLID[tb]==1) // Some pixels; trans
Draw16x8_Trans_Mapped_ZoomXY(&GFX_OBJ_A[tb<<7],x,y,map,zzx,zzy);
else // all pixels; solid
Draw16x8_Mapped_ZoomXY(&GFX_OBJ_A[tb<<7],x,y,map,zzx,zzy);
}
}
ta+=2;
x = (x+zzx)&0x1FF;
}
}
y = (y+zzy)&0x1FF;
SPR_MAP+=8;
x=xx;
}
break;
case 0x00:
x+=(zx+1);
xx=x;
for(ry=0;ry<8;ry++){
zzy = zoom_dat_y[ry];
if((y>16)&&(y<240+32)){
ta=0;
for(rx=0;rx<4;rx++){
zzx = zoom_dat_x[rx];
x = (x-zzx)&0x1FF;
if((x>16)&&(x<320+32)){
tb=ReadWord(&SPR_MAP[ta])&0x7FFF;
if(GFX_OBJ_A_SOLID[tb]!=0){ // No pixels; skip
if(GFX_OBJ_A_SOLID[tb]==1) // Some pixels; trans
Draw16x8_Trans_Mapped_ZoomXY_FlipY(&GFX_OBJ_A[tb<<7],x,y,map,zzx,zzy);
else // all pixels; solid
Draw16x8_Mapped_ZoomXY_FlipY(&GFX_OBJ_A[tb<<7],x,y,map,zzx,zzy);
}
}
ta+=2;
}
}
y = (y+zzy)&0x1FF;
SPR_MAP+=8;
x=xx;
}
break;
case 0xC0:
y+=zy;
xx=x;
for(ry=0;ry<8;ry++){
zzy = zoom_dat_y[ry];
y = (y-zzy)&0x1FF;
if((y>16)&&(y<240+32)){
ta=0;
for(rx=0;rx<4;rx++){
zzx = zoom_dat_x[rx];
if((x>16)&&(x<320+32)){
tb=ReadWord(&SPR_MAP[ta])&0x7FFF;
if(GFX_OBJ_A_SOLID[tb]!=0){ // No pixels; skip
if(GFX_OBJ_A_SOLID[tb]==1) // Some pixels; trans
Draw16x8_Trans_Mapped_ZoomXY_FlipX(&GFX_OBJ_A[tb<<7],x,y,map,zzx,zzy);
else // all pixels; solid
Draw16x8_Mapped_ZoomXY_FlipX(&GFX_OBJ_A[tb<<7],x,y,map,zzx,zzy);
}
}
ta+=2;
x = (x+zzx)&0x1FF;
}
}
SPR_MAP+=8;
x=xx;
}
break;
case 0x80:
x+=(zx+1);
y+=zy;
xx=x;
for(ry=0;ry<8;ry++){
zzy = zoom_dat_y[ry];
y = (y-zzy)&0x1FF;
if((y>16)&&(y<240+32)){
ta=0;
for(rx=0;rx<4;rx++){
zzx = zoom_dat_x[rx];
x = (x-zzx)&0x1FF;
if((x>16)&&(x<320+32)){
tb=ReadWord(&SPR_MAP[ta])&0x7FFF;
if(GFX_OBJ_A_SOLID[tb]!=0){ // No pixels; skip
if(GFX_OBJ_A_SOLID[tb]==1) // Some pixels; trans
Draw16x8_Trans_Mapped_ZoomXY_FlipXY(&GFX_OBJ_A[tb<<7],x,y,map,zzx,zzy);
else // all pixels; solid
Draw16x8_Mapped_ZoomXY_FlipXY(&GFX_OBJ_A[tb<<7],x,y,map,zzx,zzy);
}
}
ta+=2;
}
}
SPR_MAP+=8;
x=xx;
}
break;
}
}
}
//}
}
}
void DrawBattleShark(void)
{
int x,y;
ClearPaletteMap();
// Init tc0100scn emulation
// ------------------------
tc0100scn_layer_count = 0;
tc0100scn[0].ctrl = ReadWord(RAM_SCROLL+12);
// BG0
// ---
render_tc0100scn_layer_mapped_flipy(0,0);
// BG1
// ---
render_tc0100scn_layer_mapped_flipy(0,1);
// 3D-ROAD Z-SYSTEM
// ----------------
tc0150rod_init_palette();
tc0150rod_render_flipy(0x000,0x800);
// OBJECT
// ------
render_z_system_sprites(1);
// FG0
// ---
render_tc0100scn_layer_mapped_flipy(0,2);
// CURSOR
// ------
x=(32+(319-x11))-7;
y=(32+myy11)-7;
if((x>16)&&(y>16)&&(x<320+32)&&(y<240+32)){
Draw16x16_Trans(SpriteGun1,x,y,0);
}
pal[254].r=0;
pal[254].g=0;
pal[254].b=0;
pal[253].r=31;
pal[253].g=31;
pal[253].b=63;
pal[252].r=63;
pal[252].g=31;
pal[252].b=31;
}
/*
BATTLE SHARK
------------
- Taito; 1989; Z-System
- 68000; 68000; YM2610
-------------+--------------------------------
File | Contents
-------------+--------------------------------
BSHARK01.BIN | Sprite Tiles (plane0)
BSHARK02.BIN | Sprite Tiles (plane1)
BSHARK03.BIN | Sprite Tiles (plane2)
BSHARK04.BIN | Sprite Tiles (plane3)
BSHARK05.BIN | 8x8 BG0 Tiles
BSHARK06.BIN | Sprite Table
BSHARK07.BIN | tc0150rod gfx
BSHARK08.BIN | YM2610 ADPCM
BSHARK09.BIN | YM2610 ADPCM
BSHARK18.BIN | ? (Zoom table data/Roadscroll)
BSHARK19.BIN | ? (256 bytes)
BSHARK67.BIN | Main 68000 block#1 (odd)
BSHARK69.BIN | Main 68000 block#0 (odd)
BSHARK70.BIN | Main 68000 block#1 (even)
BSHARK71.BIN | Main 68000 block#0 (even)
BSHARK72.BIN | Sub 68000 block#0 (odd)
BSHARK73.BIN | Sub 68000 block#1 (odd)
BSHARK74.BIN | Sub 68000 block#0 (even)
BSHARK75.BIN | Sub 68000 block#1 (even)
-------------+--------------------------------
OBJECT RAM
----------
-----+--------+-------------------------------
Byte | Bit(s) | Description
-----+76543210+-------------------------------
0 |.xxxxxx.| Zoom Y Axis (0-63)
0 |.......x| Y Position (High)
1 |xxxxxxxx| Y Position (Low)
2 |.xxxxxxx| Colour Bank (High)
3 |x.......| Colour Bank (Low)
3 |..xxxxxx| Zoom X Axis (0-63)
4 |x.......| Flip X Axis
4 |.x......| Flip Y Axis
4 |.......x| X Position (High)
5 |xxxxxxxx| X Position (Low)
6 |....xxxx| Sprite Tile (High)
7 |xxxxxxxx| Sprite Tile (Low)
-----+--------+-------------------------------
- Colour ram looks like it can switch access mode:
A00004 == 0000: Normal access (A00000-A01FFF)
A00004 == 0001: Port access (A00000-A00003)
- Maybe other taito games can switch like this.
- Maybe they just left some old code in the rom.
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -