summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Angelo Salese <angelosa@users.noreply.github.com>2011-11-09 19:52:32 +0000
committer Angelo Salese <angelosa@users.noreply.github.com>2011-11-09 19:52:32 +0000
commit488de34f249029cf5524ff494e06b760e8d6b746 (patch)
treeaee8d5c9c5459730e516c2b4c860b8698fbc4bd3
parentc041a6eddc6ddfda5eedab78722ee9581d56347d (diff)
Bonanza Bros. with correct SFX, lesse if nothing get broken (obviously going to credit Phil and Charles if everything is ok)
-rw-r--r--src/mame/drivers/segas24.c90
-rw-r--r--src/mame/includes/segas24.h10
2 files changed, 80 insertions, 20 deletions
diff --git a/src/mame/drivers/segas24.c b/src/mame/drivers/segas24.c
index aa431bd06a1..6a8730f5b48 100644
--- a/src/mame/drivers/segas24.c
+++ b/src/mame/drivers/segas24.c
@@ -348,8 +348,18 @@ Notes:
#define VIDEO_CLOCK XTAL_32MHz
#define TIMER_CLOCK (VIDEO_CLOCK/4)
#define HSYNC_CLOCK (VIDEO_CLOCK/2/656.0)
+#define FRC_CLOCK_MODE0 (MASTER_CLOCK/2)/16 // 625 kHz
+#define FRC_CLOCK_MODE1 (MASTER_CLOCK/2)/1024 // 9 kHz
-// Floppy Fisk Controller
+enum {
+ IRQ_YM2151 = 1,
+ IRQ_TIMER = 2,
+ IRQ_VBLANK = 3,
+ IRQ_SPRITE = 4,
+ IRQ_FRC = 5
+};
+
+// Floppy Disk Controller
void segas24_state::fdc_init()
{
@@ -722,15 +732,30 @@ WRITE16_MEMBER( segas24_state::curbank_w )
}
}
-/* FIXME: used by Bonanza Bros. when a SFX plays */
-READ8_MEMBER( segas24_state::mode_r )
+READ8_MEMBER( segas24_state::frc_mode_r )
{
- return cnt_mode & 1;
+ return frc_mode & 1;
}
-WRITE8_MEMBER( segas24_state::mode_w )
+WRITE8_MEMBER( segas24_state::frc_mode_w )
{
- cnt_mode = data & 1;
+ /* reset frc if a write here happens */
+ frc_cnt = 0;
+ frc_mode = data & 1;
+ irq_frc->adjust(attotime::from_hz(frc_mode ? FRC_CLOCK_MODE1 : FRC_CLOCK_MODE0));
+}
+
+READ8_MEMBER( segas24_state::frc_r )
+{
+ return frc_cnt;
+}
+
+WRITE8_MEMBER( segas24_state::frc_w )
+{
+ /* Undocumented behaviour ... */
+ frc_cnt = data;
+ cputag_set_input_line(machine(), "maincpu", IRQ_FRC+1, CLEAR_LINE);
+ cputag_set_input_line(machine(), "sub", IRQ_FRC+1, CLEAR_LINE);
}
@@ -778,13 +803,6 @@ WRITE16_MEMBER( segas24_state::mlatch_w )
// Timers and IRQs
-enum {
- IRQ_YM2151 = 1,
- IRQ_TIMER = 2,
- IRQ_VBLANK = 3,
- IRQ_SPRITE = 4
-};
-
void segas24_state::irq_timer_sync()
{
attotime ctime = machine().time();
@@ -872,6 +890,31 @@ static TIMER_DEVICE_CALLBACK( irq_timer_clear_cb )
cputag_set_input_line(timer.machine(), "sub", IRQ_SPRITE+1, CLEAR_LINE);
}
+static TIMER_DEVICE_CALLBACK( irq_frc_cb )
+{
+ segas24_state *state = timer.machine().driver_data<segas24_state>();
+ state->frc_cnt++;
+
+ if((state->frc_mode == 0 && state->frc_cnt == 0x100) || (state->frc_mode == 1 && state->frc_cnt == 0x67))
+ {
+ state->frc_cnt = 0;
+ }
+
+ if(state->frc_mode == 1)
+ {
+ if(state->irq_allow0 & (1 << IRQ_FRC))
+ {
+ cputag_set_input_line(timer.machine(), "maincpu", IRQ_FRC+1, ASSERT_LINE);
+ }
+ if(state->irq_allow1 & (1 << IRQ_FRC))
+ {
+ cputag_set_input_line(timer.machine(), "sub", IRQ_FRC+1, ASSERT_LINE);
+ }
+ }
+
+ state->irq_frc->adjust(attotime::from_hz(state->frc_mode ? FRC_CLOCK_MODE1 : FRC_CLOCK_MODE0));
+}
+
void segas24_state::irq_init()
{
irq_tdata = 0;
@@ -884,6 +927,7 @@ void segas24_state::irq_init()
irq_sprite = 0;
irq_timer = machine().device<timer_device>("irq_timer");
irq_timer_clear = machine().device<timer_device>("irq_timer_clear");
+ irq_frc = machine().device<timer_device>("irq_frc");
irq_tval = 0;
irq_synctime = attotime::zero;
irq_vsynctime = attotime::zero;
@@ -908,20 +952,22 @@ WRITE16_MEMBER(segas24_state::irq_w)
}
break;
case 2:
- irq_allow0 = data & 0x1f;
+ irq_allow0 = data & 0x3f;
irq_timer_pend0 = 0;
cputag_set_input_line(machine(), "maincpu", IRQ_TIMER+1, CLEAR_LINE);
cputag_set_input_line(machine(), "maincpu", IRQ_YM2151+1, irq_yms && (irq_allow0 & (1 << IRQ_YM2151)) ? ASSERT_LINE : CLEAR_LINE);
cputag_set_input_line(machine(), "maincpu", IRQ_VBLANK+1, irq_vblank && (irq_allow0 & (1 << IRQ_VBLANK)) ? ASSERT_LINE : CLEAR_LINE);
cputag_set_input_line(machine(), "maincpu", IRQ_SPRITE+1, irq_sprite && (irq_allow0 & (1 << IRQ_SPRITE)) ? ASSERT_LINE : CLEAR_LINE);
+ //cputag_set_input_line(machine(), "maincpu", IRQ_FRC+1, irq_frc && (irq_allow0 & (1 << IRQ_FRC)) ? ASSERT_LINE : CLEAR_LINE);
break;
case 3:
- irq_allow1 = data & 0x1f;
+ irq_allow1 = data & 0x3f;
irq_timer_pend1 = 0;
cputag_set_input_line(machine(), "sub", IRQ_TIMER+1, CLEAR_LINE);
cputag_set_input_line(machine(), "sub", IRQ_YM2151+1, irq_yms && (irq_allow1 & (1 << IRQ_YM2151)) ? ASSERT_LINE : CLEAR_LINE);
cputag_set_input_line(machine(), "sub", IRQ_VBLANK+1, irq_vblank && (irq_allow1 & (1 << IRQ_VBLANK)) ? ASSERT_LINE : CLEAR_LINE);
cputag_set_input_line(machine(), "sub", IRQ_SPRITE+1, irq_sprite && (irq_allow1 & (1 << IRQ_SPRITE)) ? ASSERT_LINE : CLEAR_LINE);
+ //cputag_set_input_line(machine(), "sub", IRQ_FRC+1, irq_frc && (irq_allow1 & (1 << IRQ_FRC)) ? ASSERT_LINE : CLEAR_LINE);
break;
}
}
@@ -1164,12 +1210,14 @@ static ADDRESS_MAP_START( system24_cpu1_map, AS_PROGRAM, 16, segas24_state )
AM_RANGE(0xb00008, 0xb0000f) AM_MIRROR(0x07fff0) AM_READWRITE(fdc_status_r, fdc_ctrl_w)
AM_RANGE(0xb80000, 0xbbffff) AM_ROMBANK("bank1")
AM_RANGE(0xbc0000, 0xbc0001) AM_MIRROR(0x03fff8) AM_READWRITE(curbank_r, curbank_w)
- AM_RANGE(0xbc0002, 0xbc0003) AM_MIRROR(0x03fff8) AM_READWRITE8(mode_r, mode_w,0x00ff)
+ AM_RANGE(0xbc0002, 0xbc0003) AM_MIRROR(0x03fff8) AM_READWRITE8(frc_mode_r, frc_mode_w,0x00ff)
+ AM_RANGE(0xbc0004, 0xbc0005) AM_MIRROR(0x03fff8) AM_READWRITE8(frc_r, frc_w,0x00ff)
AM_RANGE(0xbc0006, 0xbc0007) AM_MIRROR(0x03fff8) AM_READWRITE(mlatch_r, mlatch_w)
AM_RANGE(0xc00000, 0xc00011) AM_MIRROR(0x07ffe0) AM_READWRITE(hotrod3_ctrl_r, hotrod3_ctrl_w)
AM_RANGE(0xc80000, 0xcbffff) AM_ROMBANK("bank2")
AM_RANGE(0xcc0000, 0xcc0001) AM_MIRROR(0x03fff8) AM_READWRITE(curbank_r, curbank_w)
- AM_RANGE(0xcc0002, 0xcc0003) AM_MIRROR(0x03fff8) AM_READWRITE8(mode_r, mode_w,0x00ff)
+ AM_RANGE(0xcc0002, 0xcc0003) AM_MIRROR(0x03fff8) AM_READWRITE8(frc_mode_r, frc_mode_w,0x00ff)
+ AM_RANGE(0xcc0004, 0xcc0005) AM_MIRROR(0x03fff8) AM_READWRITE8(frc_r, frc_w,0x00ff)
AM_RANGE(0xcc0006, 0xcc0007) AM_MIRROR(0x03fff8) AM_READWRITE(mlatch_r, mlatch_w)
AM_RANGE(0xf00000, 0xf3ffff) AM_MIRROR(0x040000) AM_RAM AM_SHARE("share2")
AM_RANGE(0xf80000, 0xfbffff) AM_MIRROR(0x040000) AM_RAM AM_SHARE("share1")
@@ -1203,10 +1251,14 @@ static ADDRESS_MAP_START( system24_cpu2_map, AS_PROGRAM, 16, segas24_state )
AM_RANGE(0xb00008, 0xb0000f) AM_MIRROR(0x07fff0) AM_READWRITE(fdc_status_r, fdc_ctrl_w)
AM_RANGE(0xb80000, 0xbbffff) AM_ROMBANK("bank1")
AM_RANGE(0xbc0000, 0xbc0001) AM_MIRROR(0x03fff8) AM_READWRITE(curbank_r, curbank_w)
+ AM_RANGE(0xbc0002, 0xbc0003) AM_MIRROR(0x03fff8) AM_READWRITE8(frc_mode_r, frc_mode_w,0x00ff)
+ AM_RANGE(0xbc0004, 0xbc0005) AM_MIRROR(0x03fff8) AM_READWRITE8(frc_r, frc_w,0x00ff)
AM_RANGE(0xbc0006, 0xbc0007) AM_MIRROR(0x03fff8) AM_READWRITE(mlatch_r, mlatch_w)
AM_RANGE(0xc00000, 0xc00011) AM_MIRROR(0x07ffe0) AM_READWRITE(hotrod3_ctrl_r, hotrod3_ctrl_w)
AM_RANGE(0xc80000, 0xcbffff) AM_ROMBANK("bank2")
AM_RANGE(0xcc0000, 0xcc0001) AM_MIRROR(0x03fff8) AM_READWRITE(curbank_r, curbank_w)
+ AM_RANGE(0xcc0002, 0xcc0003) AM_MIRROR(0x03fff8) AM_READWRITE8(frc_mode_r, frc_mode_w,0x00ff)
+ AM_RANGE(0xcc0004, 0xcc0005) AM_MIRROR(0x03fff8) AM_READWRITE8(frc_r, frc_w,0x00ff)
AM_RANGE(0xcc0006, 0xcc0007) AM_MIRROR(0x03fff8) AM_READWRITE(mlatch_r, mlatch_w)
AM_RANGE(0xf00000, 0xf3ffff) AM_MIRROR(0x040000) AM_RAM AM_SHARE("share2")
AM_RANGE(0xf80000, 0xfbffff) AM_MIRROR(0x040000) AM_RAM AM_SHARE("share1")
@@ -1248,6 +1300,9 @@ static MACHINE_RESET( system24 )
state->reset_bank();
state->irq_init();
state->mlatch = 0x00;
+ state->frc_mode = 0;
+ state->frc_cnt = 0;
+ state->irq_frc->adjust(attotime::from_hz(state->frc_mode ? FRC_CLOCK_MODE1 : FRC_CLOCK_MODE0));
}
/*************************************
@@ -1919,6 +1974,7 @@ static MACHINE_CONFIG_START( system24, segas24_state )
MCFG_TIMER_ADD("irq_timer", irq_timer_cb)
MCFG_TIMER_ADD("irq_timer_clear", irq_timer_clear_cb)
+ MCFG_TIMER_ADD("irq_frc", irq_frc_cb)
MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_AFTER_VBLANK)
diff --git a/src/mame/includes/segas24.h b/src/mame/includes/segas24.h
index a236f279507..01d05a4be7e 100644
--- a/src/mame/includes/segas24.h
+++ b/src/mame/includes/segas24.h
@@ -41,15 +41,17 @@ public:
int irq_yms;
int irq_vblank;
int irq_sprite;
+ int frc_cnt;
attotime irq_synctime, irq_vsynctime;
timer_device *irq_timer;
timer_device *irq_timer_clear;
+ timer_device *irq_frc;
+ UINT8 frc_mode;
UINT16 *shared_ram;
UINT8 (segas24_state::*io_r)(UINT8 port);
void (segas24_state::*io_w)(UINT8 port, UINT8 data);
UINT8 io_cnt, io_dir;
- UINT8 cnt_mode;
segas24_tile *vtile;
segas24_sprite *vsprite;
@@ -65,8 +67,10 @@ public:
DECLARE_WRITE16_MEMBER( fdc_ctrl_w );
DECLARE_READ16_MEMBER( curbank_r );
DECLARE_WRITE16_MEMBER( curbank_w );
- DECLARE_READ8_MEMBER( mode_r );
- DECLARE_WRITE8_MEMBER( mode_w );
+ DECLARE_READ8_MEMBER( frc_mode_r );
+ DECLARE_WRITE8_MEMBER( frc_mode_w );
+ DECLARE_READ8_MEMBER( frc_r );
+ DECLARE_WRITE8_MEMBER( frc_w );
DECLARE_READ16_MEMBER( mlatch_r );
DECLARE_WRITE16_MEMBER( mlatch_w );
DECLARE_READ16_MEMBER( hotrod3_ctrl_r );