?? bshark.c
字號(hào):
/******************************************************************************/
/* */
/* BATTLE SHARK (C) 1989 TAITO CORPORATION */
/* */
/******************************************************************************/
#include "gameinc.h"
#include "bshark.h"
#include "tc100scn.h"
#include "tc110pcr.h"
#include "tc150rod.h"
#include "tc220ioc.h"
#include "sasound.h" // sample support routines
#include "taitosnd.h"
#ifdef RAINE_DEBUG
#include "debug.h"
#endif
static struct DIR_INFO battle_shark_dirs[] =
{
{ "battle_shark", },
{ "bshark", },
{ NULL, },
};
static struct ROM_INFO battle_shark_roms[] =
{
{ "bshark03.bin", 0x00080000, 0xa18eab78, 0, 0, 0, },
{ "bshark05.bin", 0x00080000, 0x596b83da, 0, 0, 0, },
{ "bshark07.bin", 0x00080000, 0xedb07808, 0, 0, 0, },
{ "bshark09.bin", 0x00080000, 0xc4cbc907, 0, 0, 0, },
{ "bshark01.bin", 0x00080000, 0x3ebe8c63, 0, 0, 0, },
{ "bshark70.bin", 0x00020000, 0xd77d81e2, 0, 0, 0, },
{ "bshark72.bin", 0x00020000, 0xc09c0f91, 0, 0, 0, },
{ "bshark74.bin", 0x00020000, 0x6869fa99, 0, 0, 0, },
{ "bshark75.bin", 0x00020000, 0x6ba65542, 0, 0, 0, },
{ "bshark02.bin", 0x00080000, 0x8488ba10, 0, 0, 0, },
{ "bshark04.bin", 0x00080000, 0x2446b0da, 0, 0, 0, },
{ "bshark06.bin", 0x00080000, 0xd200b6eb, 0, 0, 0, },
{ "bshark08.bin", 0x00020000, 0x1c79e69c, 0, 0, 0, },
{ "bshark18.bin", 0x00010000, 0x7245a6f6, 0, 0, 0, },
{ "bshark67.bin", 0x00020000, 0x39307c74, 0, 0, 0, },
{ "bshark69.bin", 0x00020000, 0xa54c137a, 0, 0, 0, },
{ "bshark71.bin", 0x00020000, 0xdf1fa629, 0, 0, 0, },
{ "bshark73.bin", 0x00020000, 0xf2fe62b5, 0, 0, 0, },
{ "bshark19.bin", 0x00000100, 0x2ee9c404, 0, 0, 0, },
{ NULL, 0, 0, 0, 0, 0, },
};
static struct INPUT_INFO battle_shark_inputs[] =
{
{ KB_DEF_COIN1, MSG_COIN1, 0x027014, 0x02, BIT_ACTIVE_0 },
{ KB_DEF_COIN2, MSG_COIN2, 0x027014, 0x01, BIT_ACTIVE_0 },
{ KB_DEF_TILT, MSG_TILT, 0x027014, 0x08, BIT_ACTIVE_0 },
{ KB_DEF_SERVICE, MSG_SERVICE, 0x027014, 0x04, BIT_ACTIVE_0 },
{ KB_DEF_P1_START, MSG_P1_START, 0x02701E, 0x01, BIT_ACTIVE_0 },
{ KB_DEF_P1_B1, MSG_P1_B1, 0x02701E, 0x40, BIT_ACTIVE_0 },
{ KB_DEF_P2_START, MSG_P2_START, 0x02701E, 0x02, BIT_ACTIVE_0 },
{ 0, NULL, 0, 0, 0 },
};
static struct DSW_DATA dsw_data_battle_shark_0[] =
{
{ MSG_DSWA_BIT1, 0x01, 0x02 },
{ MSG_OFF, 0x01, 0x00 },
{ MSG_ON, 0x00, 0x00 },
{ MSG_DSWA_BIT2, 0x02, 0x02 },
{ MSG_OFF, 0x02, 0x00 },
{ MSG_ON, 0x00, 0x00 },
{ MSG_TEST_MODE, 0x04, 0x02 },
{ MSG_OFF, 0x04, 0x00 },
{ MSG_ON, 0x00, 0x00 },
{ MSG_DEMO_SOUND, 0x08, 0x02 },
{ MSG_ON, 0x08, 0x00 },
{ MSG_OFF, 0x00, 0x00 },
{ MSG_DSWA_BIT5, 0x10, 0x02 },
{ MSG_OFF, 0x10, 0x00 },
{ MSG_ON, 0x00, 0x00 },
{ MSG_DSWA_BIT6, 0x20, 0x02 },
{ MSG_OFF, 0x20, 0x00 },
{ MSG_ON, 0x00, 0x00 },
{ MSG_DSWA_BIT7, 0x40, 0x02 },
{ MSG_OFF, 0x40, 0x00 },
{ MSG_ON, 0x00, 0x00 },
{ MSG_DSWA_BIT8, 0x80, 0x02 },
{ MSG_OFF, 0x80, 0x00 },
{ MSG_ON, 0x00, 0x00 },
{ NULL, 0, 0, },
};
static struct DSW_INFO battle_shark_dsw[] =
{
{ 0x027010, 0xFF, dsw_data_battle_shark_0 },
{ 0x027012, 0xFF, dsw_data_default_1 },
{ 0, 0, NULL, },
};
static struct ROMSW_DATA romsw_data_battle_shark_0[] =
{
{ "Taito 0", 0x00 },
{ "Taito 1", 0x01 },
{ "Taito 2", 0x02 },
{ "Taito 3", 0x03 },
{ NULL, 0 },
};
static struct ROMSW_INFO battle_shark_romsw[] =
{
{ 0x07FFFF, 0x02, romsw_data_battle_shark_0 },
{ 0, 0, NULL },
};
static struct VIDEO_INFO battle_shark_video =
{
DrawBattleShark,
320,
240,
32,
VIDEO_ROTATE_NORMAL| VIDEO_ROTATABLE,
};
struct GAME_MAIN game_battle_shark =
{
battle_shark_dirs,
battle_shark_roms,
battle_shark_inputs,
battle_shark_dsw,
battle_shark_romsw,
LoadBattleShark,
ClearBattleShark,
&battle_shark_video,
ExecuteBattleSharkFrame,
"bshark",
"Battle Shark",
NULL,
COMPANY_ID_TAITO,
"C34",
1989,
taito_ym2610b_sound,
GAME_SHOOT,
};
#define OBJ_A_COUNT (0x75C8)
// OBJECT TILE MAPS
static UINT8 *OBJECT_MAP;
// 16x16 OBJECT TILES BANK A
static UINT8 *GFX_OBJ_A;
static UINT8 *GFX_OBJ_A_SOLID;
static UINT8 *zoom16_ofs;
static UINT8 *zoom8_ofs;
static UINT8 *RAM_VIDEO;
static UINT8 *RAM_SCROLL;
static UINT8 *RAM_INPUT;
static UINT8 *GFX_BG0_SOLID;
static UINT8 *GFX_LINES;
static UINT16 YM2610Read68k(UINT32 address)
{
return YM2610ReadZ80( (UINT16) ((address&7)>>1) );
}
static void YM2610Write68k(UINT32 address, UINT16 data)
{
YM2610WriteZ80( (UINT16) ((address&7)>>1), (UINT8) data);
}
void LoadBattleShark(void)
{
int ta,tb,tc;
UINT8 *TMP;
if(!(GFX=AllocateMem(0x100000))) return;
if(!(GFX_LINES=AllocateMem(0x200000))) return;
if(!(GFX_OBJ_A=AllocateMem(OBJ_A_COUNT*0x80))) return;
if(!(OBJECT_MAP=AllocateMem(0x80000))) return;
if(!(TMP=AllocateMem(0x80000))) return;
if(!load_rom("bshark07.bin", TMP, 0x80000)) return; // 1024x1 ROAD LINES
tb=0;
for(ta=0;ta<0x80000;ta+=2){
tc=ReadWord(&TMP[ta]);
GFX_LINES[tb+0] =((tc&0x8000)>>(14));
GFX_LINES[tb+1] =((tc&0x4000)>>(13));
GFX_LINES[tb+2] =((tc&0x2000)>>(12));
GFX_LINES[tb+3] =((tc&0x1000)>>(11));
GFX_LINES[tb+4] =((tc&0x0800)>>(10));
GFX_LINES[tb+5] =((tc&0x0400)>>( 9));
GFX_LINES[tb+6] =((tc&0x0200)>>( 8));
GFX_LINES[tb+7] =((tc&0x0100)>>( 7));
GFX_LINES[tb+0]|=((tc&0x0080)>>( 7));
GFX_LINES[tb+1]|=((tc&0x0040)>>( 6));
GFX_LINES[tb+2]|=((tc&0x0020)>>( 5));
GFX_LINES[tb+3]|=((tc&0x0010)>>( 4));
GFX_LINES[tb+4]|=((tc&0x0008)>>( 3));
GFX_LINES[tb+5]|=((tc&0x0004)>>( 2));
GFX_LINES[tb+6]|=((tc&0x0002)>>( 1));
GFX_LINES[tb+7]|=((tc&0x0001)>>( 0));
tb+=8;
}
if(!load_rom("bshark01.bin", TMP, OBJ_A_COUNT*0x10)) return; // 16x16 OBJ A
tb=0;
for(ta=0;ta<OBJ_A_COUNT*0x10;ta+=2){
tc=ReadWord(&TMP[ta]);
GFX_OBJ_A[tb+0] =((tc&0x8000)>>(15));
GFX_OBJ_A[tb+1] =((tc&0x4000)>>(14));
GFX_OBJ_A[tb+2] =((tc&0x2000)>>(13));
GFX_OBJ_A[tb+3] =((tc&0x1000)>>(12));
GFX_OBJ_A[tb+4] =((tc&0x0800)>>(11));
GFX_OBJ_A[tb+5] =((tc&0x0400)>>(10));
GFX_OBJ_A[tb+6] =((tc&0x0200)>>( 9));
GFX_OBJ_A[tb+7] =((tc&0x0100)>>( 8));
GFX_OBJ_A[tb+8] =((tc&0x0080)>>( 7));
GFX_OBJ_A[tb+9] =((tc&0x0040)>>( 6));
GFX_OBJ_A[tb+10]=((tc&0x0020)>>( 5));
GFX_OBJ_A[tb+11]=((tc&0x0010)>>( 4));
GFX_OBJ_A[tb+12]=((tc&0x0008)>>( 3));
GFX_OBJ_A[tb+13]=((tc&0x0004)>>( 2));
GFX_OBJ_A[tb+14]=((tc&0x0002)>>( 1));
GFX_OBJ_A[tb+15]=((tc&0x0001)>>( 0));
tb+=16;
}
if(!load_rom("bshark02.bin", TMP, OBJ_A_COUNT*0x10)) return; // 16x16 OBJ A
tb=0;
for(ta=0;ta<OBJ_A_COUNT*0x10;ta+=2){
tc=ReadWord(&TMP[ta]);
GFX_OBJ_A[tb+0] |=((tc&0x8000)>>(14));
GFX_OBJ_A[tb+1] |=((tc&0x4000)>>(13));
GFX_OBJ_A[tb+2] |=((tc&0x2000)>>(12));
GFX_OBJ_A[tb+3] |=((tc&0x1000)>>(11));
GFX_OBJ_A[tb+4] |=((tc&0x0800)>>(10));
GFX_OBJ_A[tb+5] |=((tc&0x0400)>>( 9));
GFX_OBJ_A[tb+6] |=((tc&0x0200)>>( 8));
GFX_OBJ_A[tb+7] |=((tc&0x0100)>>( 7));
GFX_OBJ_A[tb+8] |=((tc&0x0080)>>( 6));
GFX_OBJ_A[tb+9] |=((tc&0x0040)>>( 5));
GFX_OBJ_A[tb+10]|=((tc&0x0020)>>( 4));
GFX_OBJ_A[tb+11]|=((tc&0x0010)>>( 3));
GFX_OBJ_A[tb+12]|=((tc&0x0008)>>( 2));
GFX_OBJ_A[tb+13]|=((tc&0x0004)>>( 1));
GFX_OBJ_A[tb+14]|=((tc&0x0002)>>( 0));
GFX_OBJ_A[tb+15]|=((tc&0x0001)<<( 1));
tb+=16;
}
if(!load_rom("bshark03.bin", TMP, OBJ_A_COUNT*0x10)) return; // 16x16 OBJ A
tb=0;
for(ta=0;ta<OBJ_A_COUNT*0x10;ta+=2){
tc=ReadWord(&TMP[ta]);
GFX_OBJ_A[tb+0] |=((tc&0x8000)>>(13));
GFX_OBJ_A[tb+1] |=((tc&0x4000)>>(12));
GFX_OBJ_A[tb+2] |=((tc&0x2000)>>(11));
GFX_OBJ_A[tb+3] |=((tc&0x1000)>>(10));
GFX_OBJ_A[tb+4] |=((tc&0x0800)>>( 9));
GFX_OBJ_A[tb+5] |=((tc&0x0400)>>( 8));
GFX_OBJ_A[tb+6] |=((tc&0x0200)>>( 7));
GFX_OBJ_A[tb+7] |=((tc&0x0100)>>( 6));
GFX_OBJ_A[tb+8] |=((tc&0x0080)>>( 5));
GFX_OBJ_A[tb+9] |=((tc&0x0040)>>( 4));
GFX_OBJ_A[tb+10]|=((tc&0x0020)>>( 3));
GFX_OBJ_A[tb+11]|=((tc&0x0010)>>( 2));
GFX_OBJ_A[tb+12]|=((tc&0x0008)>>( 1));
GFX_OBJ_A[tb+13]|=((tc&0x0004)>>( 0));
GFX_OBJ_A[tb+14]|=((tc&0x0002)<<( 1));
GFX_OBJ_A[tb+15]|=((tc&0x0001)<<( 2));
tb+=16;
}
if(!load_rom("bshark04.bin", TMP, OBJ_A_COUNT*0x10)) return; // 16x16 OBJ A
tb=0;
for(ta=0;ta<OBJ_A_COUNT*0x10;ta+=2){
tc=ReadWord(&TMP[ta]);
GFX_OBJ_A[tb+0] |=((tc&0x8000)>>(12));
GFX_OBJ_A[tb+1] |=((tc&0x4000)>>(11));
GFX_OBJ_A[tb+2] |=((tc&0x2000)>>(10));
GFX_OBJ_A[tb+3] |=((tc&0x1000)>>( 9));
GFX_OBJ_A[tb+4] |=((tc&0x0800)>>( 8));
GFX_OBJ_A[tb+5] |=((tc&0x0400)>>( 7));
GFX_OBJ_A[tb+6] |=((tc&0x0200)>>( 6));
GFX_OBJ_A[tb+7] |=((tc&0x0100)>>( 5));
GFX_OBJ_A[tb+8] |=((tc&0x0080)>>( 4));
GFX_OBJ_A[tb+9] |=((tc&0x0040)>>( 3));
GFX_OBJ_A[tb+10]|=((tc&0x0020)>>( 2));
GFX_OBJ_A[tb+11]|=((tc&0x0010)>>( 1));
GFX_OBJ_A[tb+12]|=((tc&0x0008)>>( 0));
GFX_OBJ_A[tb+13]|=((tc&0x0004)<<( 1));
GFX_OBJ_A[tb+14]|=((tc&0x0002)<<( 2));
GFX_OBJ_A[tb+15]|=((tc&0x0001)<<( 3));
tb+=16;
}
if(!load_rom("bshark06.bin", OBJECT_MAP, 0x80000)) return; // TILE MAPPING
if(!load_rom("bshark05.bin", TMP, 0x80000)) return; // 8x8 BG0 TILES
tb=0;
for(ta=0;ta<0x80000;ta+=2){
tc=ReadWord(&TMP[ta]);
GFX[tb+0] = ((tc&0xF000)>>12);
GFX[tb+1] = ((tc&0x0F00)>> 8);
GFX[tb+2] = ((tc&0x00F0)>> 4);
GFX[tb+3] = ((tc&0x000F)>> 0);
tb+=4;
}
FreeMem(TMP);
GFX_OBJ_A_SOLID = make_solid_mask_16x8(GFX_OBJ_A, OBJ_A_COUNT);
GFX_BG0_SOLID = make_solid_mask_8x8 (GFX, 0x4000);
RAMSize=0x80000;
if(!(RAM=AllocateMem(0x80000))) return;
if(!(ROM=AllocateMem(0x100000))) return;
if(!load_rom("bshark71.bin", RAM, 0x20000)) return; // 68000 MAIN ROM
for(ta=0;ta<0x20000;ta++){
ROM[ta+ta]=RAM[ta];
}
if(!load_rom("bshark69.bin", RAM, 0x20000)) return;
for(ta=0;ta<0x20000;ta++){
ROM[ta+ta+1]=RAM[ta];
}
if(!load_rom("bshark70.bin", RAM, 0x20000)) return; // 68000 MAIN ROM
for(ta=0;ta<0x20000;ta++){
ROM[ta+ta+0x40000]=RAM[ta];
}
if(!load_rom("bshark67.bin", RAM, 0x20000)) return;
for(ta=0;ta<0x20000;ta++){
ROM[ta+ta+0x40001]=RAM[ta];
}
if(!load_rom("bshark74.bin", RAM, 0x20000)) return; // 68000 SUB ROM
for(ta=0;ta<0x20000;ta++){
ROM[ta+ta+0x80000]=RAM[ta];
}
if(!load_rom("bshark72.bin", RAM, 0x20000)) return;
for(ta=0;ta<0x20000;ta++){
ROM[ta+ta+0x80001]=RAM[ta];
}
if(!load_rom("bshark75.bin", RAM, 0x20000)) return; // 68000 SUB ROM
for(ta=0;ta<0x20000;ta++){
ROM[ta+ta+0xC0000]=RAM[ta];
}
if(!load_rom("bshark73.bin", RAM, 0x20000)) return;
for(ta=0;ta<0x20000;ta++){
ROM[ta+ta+0xC0001]=RAM[ta];
}
/*-----[Sound Setup]-----*/
if(!(PCMROM=AllocateMem(0x0A0000))) return;
if(!load_rom("bshark09.bin",PCMROM+0x00000,0x80000)) return; // ADPCM A rom
if(!load_rom("bshark08.bin",PCMROM+0x80000,0x20000)) return; // ADPCM B rom (rom too small?)
YM2610SetBuffers(PCMROM, PCMROM+0x80000, 0x80000, 0x20000);
/*-----------------------*/
memset(RAM+0x00000,0x00,0x40000);
RAM_VIDEO = RAM+0x14000;
RAM_SCROLL = RAM+0x27000;
RAM_INPUT = RAM+0x27010;
GFX_FG0 = RAM+0x3C000;
set_colour_mapper(&col_map_xbbb_bbgg_gggr_rrrr);
InitPaletteMap(RAM+0x25000, 0x100, 0x10, 0x8000);
// CPU Communication
// -----------------
ROM[0x0BD52]=0x60;
WriteLong68k(&ROM[0x0BD6A],0x4E714E71); // nop
WriteLong68k(&ROM[0x0BD72],0x4E714E71); // nop
ROM[0x0BEB6]=0x60;
ROM[0x0BEE6]=0x60;
ROM[0x0BF0E]=0x60;
WriteLong68k(&ROM[0x0BF24],0x4E714E71); // nop
WriteWord68k(&ROM[0x0BF3A],0x4E71); // nop
// Control Hack
// ------------
WriteWord68k(&ROM[0x07FDE],0x1B79); // X
WriteLong68k(&ROM[0x07FE0],0x00800001); //
WriteWord68k(&ROM[0x07FE4],0xB902); //
WriteWord68k(&ROM[0x07FE6],0x1B79); // Y
WriteLong68k(&ROM[0x07FE8],0x00800003); //
WriteWord68k(&ROM[0x07FEC],0xB903); //
WriteWord68k(&ROM[0x07FEE],0x3E1F); // move (a7)+,D7
WriteWord68k(&ROM[0x07FF0],0x4E73); // rte
// Main 68000 Speed Hack
// ---------------------
WriteWord68k(&ROM[0x0304C],0x4EF9); // jmp $2F00
WriteLong68k(&ROM[0x0304E],0x00002F00); //
WriteLong68k(&ROM[0x02F00],0x13FC0000); // move.b #$00,$AA0000
WriteLong68k(&ROM[0x02F04],0x00AA0000); //
WriteWord68k(&ROM[0x02F08],0x4EB9); // jsr <random_gen>
WriteLong68k(&ROM[0x02F0A],0x000004C6); //
WriteWord68k(&ROM[0x02F0E],0x4EF9); // jmp $3052
WriteLong68k(&ROM[0x02F10],0x00003052); //
// Sub 68000 Speed Hack
// ---------------------
WriteLong68k(&ROM[0x8093C],0x13FC0000); // move.b #$00,$AA0000
WriteLong68k(&ROM[0x80940],0x00AA0000); //
WriteWord68k(&ROM[0x80944],0x6100-10); // bra.s loop
// Init tc0220ioc emulation
// ------------------------
tc0220ioc.RAM = RAM_INPUT;
tc0220ioc.ctrl = 0; //TC0220_STOPCPU;
reset_tc0220ioc();
// Init tc0150rod emulation
// ------------------------
tc0150rod.RAM = RAM + 0x34000;
tc0150rod.GFX = GFX_LINES;
tc0150rod.PAL = NULL;
tc0150rod.mapper = &Map_15bit_xBGR;
tc0150rod.bmp_x = 32;
tc0150rod.bmp_y = 32;
tc0150rod.bmp_w = 320;
tc0150rod.bmp_h = 240;
tc0150rod.scr_x = 0;
tc0150rod.scr_y = -14;
// Init tc0100scn emulation
// ------------------------
tc0100scn[0].layer[0].RAM =RAM_VIDEO+0x0000;
tc0100scn[0].layer[0].GFX =GFX;
tc0100scn[0].layer[0].MASK =GFX_BG0_SOLID;
tc0100scn[0].layer[0].SCR =RAM_SCROLL+0;
tc0100scn[0].layer[0].type =0;
tc0100scn[0].layer[0].bmp_x =32;
tc0100scn[0].layer[0].bmp_y =32;
tc0100scn[0].layer[0].bmp_w =320;
tc0100scn[0].layer[0].bmp_h =240;
tc0100scn[0].layer[0].mapper =&Map_15bit_xBGR;
tc0100scn[0].layer[0].tile_mask=0x3FFF;
tc0100scn[0].layer[0].scr_x =16;
tc0100scn[0].layer[0].scr_y =8;
tc0100scn[0].layer[1].RAM =RAM_VIDEO+0x8000;
tc0100scn[0].layer[1].GFX =GFX;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -