📄 williams.c
字号:
{
port_select = data;
}
/***************************************************************************
Robotron-specific routines
***************************************************************************/
/* JB 970823 - speed up very busy loop in Robotron */
/* D19B: LDA $10 ; dp=98
D19D: CMPA #$02
D19F: BCS $D19B ; (BLO) */
int robotron_catch_loop_r (int offset)
{
unsigned char t = *robotron_catch;
if (t < 2 && cpu_getpc () == 0xd19d)
cpu_seticount (0);
return t;
}
/***************************************************************************
Stargate-specific routines
***************************************************************************/
int stargate_input_port_0_r(int offset)
{
int keys, altkeys;
keys = input_port_0_r (0);
altkeys = input_port_3_r (0);
if (altkeys)
{
keys |= altkeys;
if (Machine->memory_region[0][0x9c92] == 0xfd)
{
if (keys & 0x02)
keys = (keys & 0xfd) | 0x40;
else if (keys & 0x40)
keys = (keys & 0xbf) | 0x02;
}
}
return keys;
}
/* JB 970823 - speed up very busy loop in Stargate */
/* 0011: LDA $39 ; dp=9c
0013: BEQ $0011 */
int stargate_catch_loop_r (int offset)
{
unsigned char t = *stargate_catch;
if (t == 0 && cpu_getpc () == 0x0013)
cpu_seticount (0);
return t;
}
/***************************************************************************
Defender-specific routines
***************************************************************************/
/*
* Defender Select a bank
* There is just data in bank 0
*/
void defender_bank_select_w (int offset,int data)
{
static int bank[8] = { 0x0c000, 0x10000, 0x11000, 0x12000, 0x0c000, 0x0c000, 0x0c000, 0x13000 };
unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[0].memory_region];
/* set bank address */
cpu_setbank (1, &RAM[bank[data & 7]]);
if (bank[data] < 0x10000)
{
/* i/o area map */
cpu_setbankhandler_r (1, defender_io_r);
cpu_setbankhandler_w (1, defender_io_w);
}
else
{
/* bank rom map */
cpu_setbankhandler_r (1, MRA_BANK1);
cpu_setbankhandler_w (1, MWA_ROM);
}
}
/*
* Defender Read at C000-CFFF
*/
int defender_input_port_0_r(int offset)
{
int keys, altkeys;
keys = readinputport(0);
altkeys = readinputport(3);
if (altkeys)
{
keys |= altkeys;
if (Machine->memory_region[0][0xa0bb] == 0xfd)
{
if (keys & 0x02)
keys = (keys & 0xfd) | 0x40;
else if (keys & 0x40)
keys = (keys & 0xbf) | 0x02;
}
}
return keys;
}
int defender_io_r (int offset)
{
/* PIAs */
if (offset >= 0x0c00 && offset < 0x0c04)
return pia_2_r (offset - 0x0c00);
else if (offset >= 0x0c04 && offset < 0x0c08)
return pia_1_r (offset - 0x0c04);
/* video counter */
else if (offset == 0x800)
return *williams_video_counter;
/* If not bank 0 then return banked RAM */
return defender_bank_base[offset];
}
/*
* Defender Write at C000-CFFF
*/
void defender_io_w (int offset,int data)
{
defender_bank_base[offset] = data;
/* WatchDog */
if (offset == 0x03fc)
watchdog_reset_w (offset, data);
/* Palette */
else if (offset < 0x10)
paletteram_BBGGGRRR_w(offset,data);
/* PIAs */
else if (offset >= 0x0c00 && offset < 0x0c04)
pia_2_w (offset - 0x0c00, data);
else if (offset >= 0x0c04 && offset < 0x0c08)
pia_1_w (offset - 0x0c04, data);
}
/* JB 970823 - speed up very busy loop in Defender */
/* E7C3: LDA $5D ; dp=a0
E7C5: BEQ $E7C3 */
int defender_catch_loop_r(int offset)
{
unsigned char t = *defender_catch;
if (t == 0 && cpu_getpc () == 0xe7c5)
cpu_seticount (0);
return t;
}
/* DW 980925 - speed up very busy loop in Mayday */
/* There are two possible loops:
E7EA: LDA $3A ; 96 3A D665: LDA $5D ; 96 5D
E7EC: BEQ $E7EA ; 27 FC D667: BEQ $D66B ; 27 02
Consider the E7EA loop for the moment */
int mayday_catch_loop_r(int offset)
{
unsigned char t = *mayday_catch;
if (t == 0 && cpu_getpc () == 0xe7ec)
cpu_seticount (0);
return t;
}
/***************************************************************************
Colony 7-specific routines
***************************************************************************/
/*
* Colony7 Select a bank
* There is just data in bank 0
*/
void colony7_bank_select_w (int offset,int data)
{
static int bank[8] = { 0x0c000, 0x10000, 0x11000, 0x12000, 0x0c000, 0x0c000, 0x0c000, 0xc000 };
unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[0].memory_region];
/* set bank address */
cpu_setbank (1, &RAM[bank[data & 7]]);
if (bank[data] < 0x10000)
{
/* i/o area map */
cpu_setbankhandler_r (1, defender_io_r);
cpu_setbankhandler_w (1, defender_io_w);
}
else
{
/* bank rom map */
cpu_setbankhandler_r (1, MRA_BANK1);
cpu_setbankhandler_w (1, MWA_ROM);
}
}
/***************************************************************************
Defense Command-specific routines
***************************************************************************/
/*
* Defense Command Select a bank
* There is just data in bank 0
*/
void defcomnd_bank_select_w (int offset,int data)
{
static int bank[8] = { 0x0c000, 0x10000, 0x11000, 0x12000, 0x13000, 0x0c000, 0x0c000, 0x14000 };
unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[0].memory_region];
static int bankhit[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
bankhit[data & 7] = 1;
/* set bank address */
cpu_setbank (1, &RAM[bank[data & 7]]);
if (bank[data] < 0x10000)
{
/* i/o area map */
cpu_setbankhandler_r (1, defender_io_r);
cpu_setbankhandler_w (1, defender_io_w);
}
else
{
/* bank rom map */
cpu_setbankhandler_r (1, MRA_BANK1);
cpu_setbankhandler_w (1, MWA_ROM);
}
}
/***************************************************************************
Splat!-specific routines
***************************************************************************/
/* JB 970823 - speed up very busy loop in Splat */
/* D04F: LDA $4B ; dp=98
D051: BEQ $D04F */
int splat_catch_loop_r(int offset)
{
unsigned char t = *splat_catch;
if (t == 0 && cpu_getpc () == 0xd051)
cpu_seticount (0);
return t;
}
/***************************************************************************
Sinistar-specific routines
***************************************************************************/
/*
* Sinistar Joystick
*/
int sinistar_input_port_0_r (int offset)
{
int i;
int keys;
/*~~~~~ make it incremental */
keys = input_port_0_r (0);
if (keys & 0x04)
i = 0x40;
else if (keys & 0x08)
i = 0xC0;
else
i = 0x20;
if (keys&0x02)
i += 0x04;
else if (keys&0x01)
i += 0x0C;
else
i += 0x02;
return i;
}
static void sinistar_snd_cmd_w (int offset, int cmd)
{
switch (cmd)
{
case 0x31: /* beware i live */
sample_start (0,0,0);
break;
case 0x30: /* coin sound "I Hunger"*/
sample_start (0,1,0);
break;
case 0x3d: /* roar */
sample_start (0,2,0);
break;
case 0x32: /* i am sinistar */
sample_start (0,4,0);
break;
case 0x34: /* Run Run Run (may be wrong) */
sample_start (0,3,0);
break;
case 0x2c: /* Run coward (may be wrong) */
sample_start (0,5,0);
break;
case 0x39: /* Run coward (may be wrong) */
sample_start (0,7,0);
break;
case 0x22: /* I hunger coward (may be wrong) */
sample_start (0,6,0);
break;
}
timer_set (TIME_NOW, cmd | 0xc0, williams_snd_cmd_real_w);
}
/***************************************************************************
Blaster-specific routines
***************************************************************************/
/*
* Blaster Joystick
*/
int blaster_input_port_0_r (int offset)
{
int i;
int keys;
keys = input_port_0_r (0);
if (keys & 0x04)
i = 0x00;
else if (keys & 0x08)
i = 0x80;
else
i = 0x40;
if (keys&0x02)
i += 0x00;
else if (keys&0x01)
i += 0x08;
else
i += 0x04;
return i;
}
/*
* Blaster bank select
*/
static int bank[16] = { 0x00000, 0x10000, 0x14000, 0x18000, 0x1c000, 0x20000, 0x24000, 0x28000,
0x2c000, 0x30000, 0x34000, 0x38000, 0x2c000, 0x30000, 0x34000, 0x38000 };
void blaster_vram_select_w (int offset, int data)
{
unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[0].memory_region];
vram_bank = data;
if (vram_bank)
{
cpu_setbank (1, &RAM[bank[blaster_bank]]);
cpu_setbank (2, blaster_bank2_base);
}
else
{
cpu_setbank (1, williams_videoram);
cpu_setbank (2, williams_videoram + 0x4000);
}
}
void blaster_bank_select_w (int offset, int data)
{
unsigned char *RAM = Machine->memory_region[Machine->drv->cpu[0].memory_region];
blaster_bank = data & 15;
if (vram_bank)
{
cpu_setbank (1, &RAM[bank[blaster_bank]]);
}
else
{
cpu_setbank (1, williams_videoram);
}
}
#if 0 /* the fix for Blaster is more expensive than the loop */
/* JB 970823 - speed up very busy loop in Blaster */
/* D184: LDA $00 ; dp=97
D186: CMPA #$02
D188: BCS $D184 ; (BLO) */
int blaster_catch_loop_r(int offset)
{
unsigned char t = *blaster_catch;
if (t < 2 && cpu_getpc () == 0xd186)
cpu_seticount (0);
return t;
}
#endif
/***************************************************************************
Lotto Fun-specific routines
***************************************************************************/
int lottofun_input_port_0_r(int offset)
{
return input_port_0_r(offset) | ticket_dispenser_r(offset);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -