mirror of
https://github.com/holub/mame
synced 2025-04-24 09:20:02 +03:00
s11, s11a, s11b: Changed main IRQ timing based on schematics.
Removed YM2151 reset from s11 and s11a, as this is not hooked up on background music boards used on these systems. Made background board communications two-way. Added HC55516 to s11b background music hardware. [Barry Rodewald]
This commit is contained in:
parent
71ab429d8e
commit
ec177d66bc
@ -23,6 +23,11 @@ ToDo:
|
||||
#include "sound/dac.h"
|
||||
#include "s11.lh"
|
||||
|
||||
// Length of time in cycles between IRQs on the main 6808 CPU
|
||||
// This length is determined by the settings of the W14 and W15 jumpers
|
||||
// It can be 0x300, 0x380, 0x700 or 0x780 cycles long.
|
||||
// IRQ length is always 32 cycles
|
||||
#define S11_IRQ_CYCLES 0x700
|
||||
|
||||
class s11_state : public genpin_class
|
||||
{
|
||||
@ -62,7 +67,6 @@ public:
|
||||
DECLARE_WRITE8_MEMBER(pia34_pb_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(pia34_cb2_w);
|
||||
DECLARE_WRITE8_MEMBER(pia40_pa_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(pia40_ca2_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(pia40_cb2_w);
|
||||
DECLARE_READ8_MEMBER(dips_r);
|
||||
DECLARE_READ8_MEMBER(switch_r);
|
||||
@ -70,8 +74,6 @@ public:
|
||||
DECLARE_READ_LINE_MEMBER(pias_ca1_r);
|
||||
DECLARE_READ_LINE_MEMBER(pia21_ca1_r);
|
||||
DECLARE_READ8_MEMBER(pia28_w7_r);
|
||||
DECLARE_READ_LINE_MEMBER(pia28_ca1_r);
|
||||
DECLARE_READ_LINE_MEMBER(pia28_cb1_r);
|
||||
DECLARE_WRITE_LINE_MEMBER(pias_ca2_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(pias_cb2_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(pia21_ca2_w);
|
||||
@ -81,13 +83,12 @@ public:
|
||||
DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { }; // comma1&2
|
||||
DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { }; // dummy to stop error log filling up
|
||||
DECLARE_WRITE_LINE_MEMBER(ym2151_irq_w);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(irq);
|
||||
DECLARE_WRITE_LINE_MEMBER(pia_irq);
|
||||
DECLARE_INPUT_CHANGED_MEMBER(main_nmi);
|
||||
DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
|
||||
DECLARE_MACHINE_RESET(s11);
|
||||
DECLARE_DRIVER_INIT(s11);
|
||||
protected:
|
||||
|
||||
// devices
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_audiocpu;
|
||||
@ -104,6 +105,8 @@ protected:
|
||||
required_device<pia6821_device> m_pia34;
|
||||
required_device<pia6821_device> m_pia40;
|
||||
required_device<ym2151_device> m_ym;
|
||||
|
||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
|
||||
private:
|
||||
UINT8 m_sound_data;
|
||||
UINT8 m_strobe;
|
||||
@ -112,6 +115,10 @@ private:
|
||||
UINT32 m_segment1;
|
||||
UINT32 m_segment2;
|
||||
bool m_ca1;
|
||||
emu_timer* m_irq_timer;
|
||||
bool m_irq_active;
|
||||
|
||||
static const device_timer_id TIMER_IRQ = 0;
|
||||
};
|
||||
|
||||
static ADDRESS_MAP_START( s11_main_map, AS_PROGRAM, 8, s11_state )
|
||||
@ -221,6 +228,33 @@ static INPUT_PORTS_START( s11 )
|
||||
PORT_CONFSETTING( 0x10, "English" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
void s11_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||
{
|
||||
switch(id)
|
||||
{
|
||||
case TIMER_IRQ:
|
||||
if(param == 1)
|
||||
{
|
||||
m_maincpu->set_input_line(M6800_IRQ_LINE,ASSERT_LINE);
|
||||
m_irq_timer->adjust(attotime::from_ticks(32,4000000/2),0);
|
||||
m_pias->cb1_w(0);
|
||||
m_irq_active = true;
|
||||
m_pia28->ca1_w(BIT(ioport("DIAGS")->read(), 2)); // Advance
|
||||
m_pia28->cb1_w(BIT(ioport("DIAGS")->read(), 3)); // Up/Down
|
||||
}
|
||||
else
|
||||
{
|
||||
m_maincpu->set_input_line(M6800_IRQ_LINE,CLEAR_LINE);
|
||||
m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
|
||||
m_pias->cb1_w(1);
|
||||
m_irq_active = false;
|
||||
m_pia28->ca1_w(1);
|
||||
m_pia28->cb1_w(1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
MACHINE_RESET_MEMBER( s11_state, s11 )
|
||||
{
|
||||
membank("bank0")->set_entry(0);
|
||||
@ -241,6 +275,23 @@ INPUT_CHANGED_MEMBER( s11_state::audio_nmi )
|
||||
m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( s11_state::pia_irq )
|
||||
{
|
||||
if(state == CLEAR_LINE)
|
||||
{
|
||||
// restart IRQ timer
|
||||
m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
|
||||
m_irq_active = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// disable IRQ timer while other IRQs are being handled
|
||||
// (counter is reset every 32 cycles while a PIA IRQ is handled)
|
||||
m_irq_timer->adjust(attotime::zero);
|
||||
m_irq_active = true;
|
||||
}
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( s11_state::sol3_w )
|
||||
{
|
||||
|
||||
@ -271,8 +322,8 @@ static const pia6821_interface pia21_intf =
|
||||
DEVCB_DRIVER_MEMBER(s11_state, sol2_w), /* port B out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia21_ca2_w), /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia21_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
WRITE8_MEMBER( s11_state::lamp0_w )
|
||||
@ -292,20 +343,10 @@ static const pia6821_interface pia24_intf =
|
||||
DEVCB_DRIVER_MEMBER(s11_state, lamp1_w), /* port B out */
|
||||
DEVCB_NULL, /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia24_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
READ_LINE_MEMBER( s11_state::pia28_ca1_r )
|
||||
{
|
||||
return BIT(ioport("DIAGS")->read(), 2) ? 1 : 0; // advance button
|
||||
}
|
||||
|
||||
READ_LINE_MEMBER( s11_state::pia28_cb1_r )
|
||||
{
|
||||
return BIT(ioport("DIAGS")->read(), 3) ? 1 : 0; // up/down switch
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( s11_state::dig0_w )
|
||||
{
|
||||
static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0x58, 0x4c, 0x62, 0x69, 0x78, 0 }; // 7447
|
||||
@ -345,16 +386,16 @@ static const pia6821_interface pia28_intf =
|
||||
{
|
||||
DEVCB_DRIVER_MEMBER(s11_state, pia28_w7_r), /* port A in */
|
||||
DEVCB_NULL, /* port B in */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia28_ca1_r), /* line CA1 in */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia28_cb1_r), /* line CB1 in */
|
||||
DEVCB_NULL, /* line CA1 in */
|
||||
DEVCB_NULL, /* line CB1 in */
|
||||
DEVCB_NULL, /* line CA2 in */
|
||||
DEVCB_NULL, /* line CB2 in */
|
||||
DEVCB_DRIVER_MEMBER(s11_state, dig0_w), /* port A out */
|
||||
DEVCB_DRIVER_MEMBER(s11_state, dig1_w), /* port B out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia28_ca2_w), /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia28_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
WRITE8_MEMBER( s11_state::pia2c_pa_w )
|
||||
@ -391,8 +432,8 @@ static const pia6821_interface pia2c_intf =
|
||||
DEVCB_DRIVER_MEMBER(s11_state, pia2c_pb_w), /* port B out */
|
||||
DEVCB_NULL, /* line CA2 out */
|
||||
DEVCB_NULL, /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
READ8_MEMBER( s11_state::switch_r )
|
||||
@ -419,8 +460,8 @@ static const pia6821_interface pia30_intf =
|
||||
DEVCB_DRIVER_MEMBER(s11_state, switch_w), /* port B out */
|
||||
DEVCB_NULL, /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia30_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
WRITE8_MEMBER( s11_state::pia34_pa_w )
|
||||
@ -456,8 +497,8 @@ static const pia6821_interface pia34_intf =
|
||||
DEVCB_DRIVER_MEMBER(s11_state, pia34_pb_w), /* port B out */
|
||||
DEVCB_NULL, /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia34_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
WRITE8_MEMBER( s11_state::bank_w )
|
||||
@ -522,12 +563,6 @@ WRITE_LINE_MEMBER( s11_state::ym2151_irq_w)
|
||||
m_pia40->ca1_w(0);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( s11_state::pia40_ca2_w)
|
||||
{
|
||||
if(state == ASSERT_LINE)
|
||||
m_ym->reset();
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( s11_state::pia40_cb2_w)
|
||||
{
|
||||
m_pia34->cb1_w(state); // To Widget MCB1 through CPU Data interface
|
||||
@ -543,7 +578,7 @@ static const pia6821_interface pia40_intf =
|
||||
DEVCB_NULL, /* line CB2 in */
|
||||
DEVCB_DRIVER_MEMBER(s11_state, pia40_pa_w), /* port A out */
|
||||
DEVCB_DRIVER_MEMBER(s11_state, dac_w), /* port B out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia40_ca2_w), /* line CA2 out */
|
||||
DEVCB_NULL, /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11_state, pia40_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("bgcpu", M6809_FIRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("bgcpu", INPUT_LINE_NMI) /* IRQB */
|
||||
@ -556,19 +591,15 @@ DRIVER_INIT_MEMBER( s11_state, s11 )
|
||||
membank("bank1")->configure_entries(0, 2, &ROM[0x18000], 0x4000);
|
||||
membank("bank0")->set_entry(0);
|
||||
membank("bank1")->set_entry(0);
|
||||
}
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER( s11_state::irq)
|
||||
{
|
||||
m_maincpu->set_input_line(M6800_IRQ_LINE, HOLD_LINE);
|
||||
m_pias->cb1_w(0);
|
||||
m_irq_timer = timer_alloc(TIMER_IRQ);
|
||||
m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
|
||||
m_irq_active = false;
|
||||
}
|
||||
|
||||
static MACHINE_CONFIG_START( s11, s11_state )
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_ADD("maincpu", M6802, 4000000)
|
||||
MCFG_CPU_PROGRAM_MAP(s11_main_map)
|
||||
MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s11_state, irq, attotime::from_hz(1000))
|
||||
MCFG_MACHINE_RESET_OVERRIDE(s11_state, s11)
|
||||
|
||||
/* Video */
|
||||
|
@ -9,7 +9,6 @@
|
||||
ToDo:
|
||||
- Doesn't react to the Advance button very well
|
||||
- Some LEDs flicker
|
||||
- Diagnostic LED blinks constantly
|
||||
|
||||
Note: To start a game, certain switches need to be activated. You must first press and
|
||||
hold one of the trough switches (usually the left) and the ball shooter switch for
|
||||
@ -28,6 +27,11 @@ Note: To start a game, certain switches need to be activated. You must first pr
|
||||
#include "sound/dac.h"
|
||||
#include "s11a.lh"
|
||||
|
||||
// Length of time in cycles between IRQs on the main 6808 CPU
|
||||
// This length is determined by the settings of the W14 and W15 jumpers
|
||||
// It can be 0x300, 0x380, 0x700 or 0x780 cycles long.
|
||||
// IRQ length is always 32 cycles
|
||||
#define S11_IRQ_CYCLES 0x700
|
||||
|
||||
class s11a_state : public genpin_class
|
||||
{
|
||||
@ -68,15 +72,13 @@ public:
|
||||
DECLARE_WRITE8_MEMBER(pia34_pb_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(pia34_cb2_w);
|
||||
DECLARE_WRITE8_MEMBER(pia40_pa_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(pia40_ca2_w);
|
||||
DECLARE_WRITE8_MEMBER(pia40_pb_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(pia40_cb2_w);
|
||||
DECLARE_READ8_MEMBER(dips_r);
|
||||
DECLARE_READ8_MEMBER(switch_r);
|
||||
DECLARE_WRITE8_MEMBER(switch_w);
|
||||
DECLARE_READ_LINE_MEMBER(pias_ca1_r);
|
||||
DECLARE_READ_LINE_MEMBER(pia21_ca1_r);
|
||||
DECLARE_READ_LINE_MEMBER(pia28_ca1_r);
|
||||
DECLARE_READ_LINE_MEMBER(pia28_cb1_r);
|
||||
DECLARE_READ8_MEMBER(pia28_w7_r);
|
||||
DECLARE_WRITE_LINE_MEMBER(pias_ca2_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(pias_cb2_w);
|
||||
@ -87,6 +89,7 @@ public:
|
||||
DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { }; // comma1&2
|
||||
DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { }; // dummy to stop error log filling up
|
||||
DECLARE_WRITE_LINE_MEMBER(ym2151_irq_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(pia_irq);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(irq);
|
||||
DECLARE_INPUT_CHANGED_MEMBER(main_nmi);
|
||||
DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
|
||||
@ -110,6 +113,8 @@ protected:
|
||||
required_device<pia6821_device> m_pia34;
|
||||
required_device<pia6821_device> m_pia40;
|
||||
required_device<ym2151_device> m_ym;
|
||||
|
||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
|
||||
private:
|
||||
UINT8 m_sound_data;
|
||||
UINT8 m_strobe;
|
||||
@ -118,6 +123,10 @@ private:
|
||||
UINT32 m_segment1;
|
||||
UINT32 m_segment2;
|
||||
bool m_ca1;
|
||||
emu_timer* m_irq_timer;
|
||||
bool m_irq_active;
|
||||
|
||||
static const device_timer_id TIMER_IRQ = 0;
|
||||
};
|
||||
|
||||
static ADDRESS_MAP_START( s11a_main_map, AS_PROGRAM, 8, s11a_state )
|
||||
@ -222,12 +231,39 @@ static INPUT_PORTS_START( s11a )
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Audio Diag") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, s11a_state, audio_nmi, 1)
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Main Diag") PORT_CODE(KEYCODE_F2) PORT_CHANGED_MEMBER(DEVICE_SELF, s11a_state, main_nmi, 1)
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Advance") PORT_CODE(KEYCODE_0)
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Up/Down") PORT_CODE(KEYCODE_9)
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Up/Down") PORT_CODE(KEYCODE_9) PORT_TOGGLE
|
||||
PORT_CONFNAME( 0x10, 0x10, "Language" )
|
||||
PORT_CONFSETTING( 0x00, "German" )
|
||||
PORT_CONFSETTING( 0x10, "English" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
void s11a_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||
{
|
||||
switch(id)
|
||||
{
|
||||
case TIMER_IRQ:
|
||||
if(param == 1)
|
||||
{
|
||||
m_maincpu->set_input_line(M6800_IRQ_LINE,ASSERT_LINE);
|
||||
m_irq_timer->adjust(attotime::from_ticks(32,4000000/2),0);
|
||||
m_pias->cb1_w(0);
|
||||
m_irq_active = true;
|
||||
m_pia28->ca1_w(BIT(ioport("DIAGS")->read(), 2)); // Advance
|
||||
m_pia28->cb1_w(BIT(ioport("DIAGS")->read(), 3)); // Up/Down
|
||||
}
|
||||
else
|
||||
{
|
||||
m_maincpu->set_input_line(M6800_IRQ_LINE,CLEAR_LINE);
|
||||
m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
|
||||
m_pias->cb1_w(1);
|
||||
m_irq_active = false;
|
||||
m_pia28->ca1_w(1);
|
||||
m_pia28->cb1_w(1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
MACHINE_RESET_MEMBER( s11a_state, s11a )
|
||||
{
|
||||
membank("bank0")->set_entry(0);
|
||||
@ -249,6 +285,23 @@ INPUT_CHANGED_MEMBER( s11a_state::audio_nmi )
|
||||
m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( s11a_state::pia_irq )
|
||||
{
|
||||
if(state == CLEAR_LINE)
|
||||
{
|
||||
// restart IRQ timer
|
||||
m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
|
||||
m_irq_active = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// disable IRQ timer while other IRQs are being handled
|
||||
// (counter is reset every 32 cycles while a PIA IRQ is handled)
|
||||
m_irq_timer->adjust(attotime::zero);
|
||||
m_irq_active = true;
|
||||
}
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( s11a_state::sol3_w )
|
||||
{
|
||||
|
||||
@ -279,8 +332,8 @@ static const pia6821_interface pia21_intf =
|
||||
DEVCB_DRIVER_MEMBER(s11a_state, sol2_w), /* port B out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia21_ca2_w), /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia21_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
WRITE8_MEMBER( s11a_state::lamp0_w )
|
||||
@ -300,20 +353,10 @@ static const pia6821_interface pia24_intf =
|
||||
DEVCB_DRIVER_MEMBER(s11a_state, lamp1_w), /* port B out */
|
||||
DEVCB_NULL, /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia24_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
READ_LINE_MEMBER( s11a_state::pia28_ca1_r )
|
||||
{
|
||||
return BIT(ioport("DIAGS")->read(), 2) ? 1 : 0; // advance button
|
||||
}
|
||||
|
||||
READ_LINE_MEMBER( s11a_state::pia28_cb1_r )
|
||||
{
|
||||
return BIT(ioport("DIAGS")->read(), 3) ? 1 : 0; // up/down switch
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( s11a_state::dig0_w )
|
||||
{
|
||||
data &= 0x7f;
|
||||
@ -354,16 +397,16 @@ static const pia6821_interface pia28_intf =
|
||||
{
|
||||
DEVCB_DRIVER_MEMBER(s11a_state, pia28_w7_r), /* port A in */
|
||||
DEVCB_NULL, /* port B in */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia28_ca1_r), /* line CA1 in */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia28_cb1_r), /* line CB1 in */
|
||||
DEVCB_NULL, /* line CA1 in */
|
||||
DEVCB_NULL, /* line CB1 in */
|
||||
DEVCB_NULL, /* line CA2 in */
|
||||
DEVCB_NULL, /* line CB2 in */
|
||||
DEVCB_DRIVER_MEMBER(s11a_state, dig0_w), /* port A out */
|
||||
DEVCB_DRIVER_MEMBER(s11a_state, dig1_w), /* port B out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia28_ca2_w), /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia28_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
WRITE8_MEMBER( s11a_state::pia2c_pa_w )
|
||||
@ -400,8 +443,8 @@ static const pia6821_interface pia2c_intf =
|
||||
DEVCB_DRIVER_MEMBER(s11a_state, pia2c_pb_w), /* port B out */
|
||||
DEVCB_NULL, /* line CA2 out */
|
||||
DEVCB_NULL, /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
READ8_MEMBER( s11a_state::switch_r )
|
||||
@ -428,8 +471,8 @@ static const pia6821_interface pia30_intf =
|
||||
DEVCB_DRIVER_MEMBER(s11a_state, switch_w), /* port B out */
|
||||
DEVCB_NULL, /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia30_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
WRITE8_MEMBER( s11a_state::pia34_pa_w )
|
||||
@ -465,8 +508,8 @@ static const pia6821_interface pia34_intf =
|
||||
DEVCB_DRIVER_MEMBER(s11a_state, pia34_pb_w), /* port B out */
|
||||
DEVCB_NULL, /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia34_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
WRITE8_MEMBER( s11a_state::bank_w )
|
||||
@ -507,12 +550,6 @@ WRITE8_MEMBER( s11a_state::dac_w )
|
||||
m_dac->write_unsigned8(data);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( s11a_state::pia40_ca2_w)
|
||||
{
|
||||
if(state == ASSERT_LINE)
|
||||
m_ym->reset();
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( s11a_state::pia40_cb2_w)
|
||||
{
|
||||
m_pia34->cb1_w(state); // To Widget MCB1 through CPU Data interface
|
||||
@ -528,7 +565,7 @@ static const pia6821_interface pias_intf =
|
||||
DEVCB_NULL, /* line CB2 in */
|
||||
DEVCB_DRIVER_MEMBER(s11a_state, sound_w), /* port A out */
|
||||
DEVCB_DRIVER_MEMBER(s11a_state, dac_w), /* port B out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia40_ca2_w), /* line CA2 out */
|
||||
DEVCB_NULL, /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia40_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("audiocpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("audiocpu", M6800_IRQ_LINE) /* IRQB */
|
||||
@ -539,6 +576,11 @@ WRITE8_MEMBER( s11a_state::pia40_pa_w )
|
||||
m_dac1->write_unsigned8(data);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( s11a_state::pia40_pb_w )
|
||||
{
|
||||
m_pia34->portb_w(data);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( s11a_state::ym2151_irq_w)
|
||||
{
|
||||
if(state == CLEAR_LINE)
|
||||
@ -556,7 +598,7 @@ static const pia6821_interface pia40_intf =
|
||||
DEVCB_LINE_VCC, /* line CA2 in */
|
||||
DEVCB_NULL, /* line CB2 in */
|
||||
DEVCB_DRIVER_MEMBER(s11a_state, pia40_pa_w), /* port A out */
|
||||
DEVCB_DRIVER_MEMBER(s11a_state, dac_w), /* port B out */
|
||||
DEVCB_DRIVER_MEMBER(s11a_state, pia40_pb_w), /* port B out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pias_ca2_w), /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11a_state, pias_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("bgcpu", M6809_FIRQ_LINE), /* IRQA */
|
||||
@ -573,19 +615,15 @@ DRIVER_INIT_MEMBER( s11a_state, s11a )
|
||||
membank("bank0")->set_entry(0);
|
||||
membank("bank1")->set_entry(0);
|
||||
membank("bgbank")->set_entry(0);
|
||||
}
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER( s11a_state::irq)
|
||||
{
|
||||
m_maincpu->set_input_line(M6800_IRQ_LINE, HOLD_LINE);
|
||||
m_pias->cb1_w(0);
|
||||
m_irq_timer = timer_alloc(TIMER_IRQ);
|
||||
m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
|
||||
m_irq_active = false;
|
||||
}
|
||||
|
||||
static MACHINE_CONFIG_START( s11a, s11a_state )
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_ADD("maincpu", M6802, 4000000)
|
||||
MCFG_CPU_ADD("maincpu", M6808, 4000000)
|
||||
MCFG_CPU_PROGRAM_MAP(s11a_main_map)
|
||||
MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s11a_state, irq, attotime::from_hz(1000))
|
||||
MCFG_MACHINE_RESET_OVERRIDE(s11a_state, s11a)
|
||||
|
||||
/* Video */
|
||||
@ -604,7 +642,7 @@ static MACHINE_CONFIG_START( s11a, s11a_state )
|
||||
MCFG_NVRAM_ADD_1FILL("nvram")
|
||||
|
||||
/* Add the soundcard */
|
||||
MCFG_CPU_ADD("audiocpu", M6808, 3580000)
|
||||
MCFG_CPU_ADD("audiocpu", M6802, 3580000)
|
||||
MCFG_CPU_PROGRAM_MAP(s11a_audio_map)
|
||||
|
||||
MCFG_SPEAKER_STANDARD_MONO("mono")
|
||||
|
@ -17,6 +17,11 @@
|
||||
#include "sound/dac.h"
|
||||
#include "s11b.lh"
|
||||
|
||||
// Length of time in cycles between IRQs on the main 6808 CPU
|
||||
// This length is determined by the settings of the W14 and W15 jumpers
|
||||
// It can be 0x300, 0x380, 0x700 or 0x780 cycles long.
|
||||
// IRQ length is always 32 cycles
|
||||
#define S11_IRQ_CYCLES 0x700
|
||||
|
||||
class s11b_state : public genpin_class
|
||||
{
|
||||
@ -29,6 +34,7 @@ public:
|
||||
m_dac(*this, "dac"),
|
||||
m_dac1(*this, "dac1"),
|
||||
m_hc55516(*this, "hc55516"),
|
||||
m_bg_hc55516(*this, "hc55516_bg"),
|
||||
m_pias(*this, "pias"),
|
||||
m_pia21(*this, "pia21"),
|
||||
m_pia24(*this, "pia24"),
|
||||
@ -51,12 +57,15 @@ public:
|
||||
DECLARE_WRITE8_MEMBER(sol2_w) { }; // solenoids 8-15
|
||||
DECLARE_WRITE8_MEMBER(sol3_w); // solenoids 0-7
|
||||
DECLARE_WRITE8_MEMBER(sound_w);
|
||||
DECLARE_WRITE8_MEMBER(bg_speech_clock_w);
|
||||
DECLARE_WRITE8_MEMBER(bg_speech_digit_w);
|
||||
DECLARE_WRITE8_MEMBER(pia2c_pa_w);
|
||||
DECLARE_WRITE8_MEMBER(pia2c_pb_w);
|
||||
DECLARE_WRITE8_MEMBER(pia34_pa_w);
|
||||
DECLARE_WRITE8_MEMBER(pia34_pb_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(pia34_cb2_w);
|
||||
DECLARE_WRITE8_MEMBER(pia40_pa_w);
|
||||
DECLARE_WRITE8_MEMBER(pia40_pb_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(pia40_ca2_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(pia40_cb2_w);
|
||||
DECLARE_READ8_MEMBER(dips_r);
|
||||
@ -64,8 +73,6 @@ public:
|
||||
DECLARE_WRITE8_MEMBER(switch_w);
|
||||
DECLARE_READ_LINE_MEMBER(pias_ca1_r);
|
||||
DECLARE_READ_LINE_MEMBER(pia21_ca1_r);
|
||||
DECLARE_READ_LINE_MEMBER(pia28_ca1_r);
|
||||
DECLARE_READ_LINE_MEMBER(pia28_cb1_r);
|
||||
DECLARE_READ8_MEMBER(pia28_w7_r);
|
||||
DECLARE_WRITE_LINE_MEMBER(pias_ca2_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(pias_cb2_w);
|
||||
@ -76,7 +83,7 @@ public:
|
||||
DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { }; // comma1&2
|
||||
DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { }; // dummy to stop error log filling up
|
||||
DECLARE_WRITE_LINE_MEMBER(ym2151_irq_w);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(irq);
|
||||
DECLARE_WRITE_LINE_MEMBER(pia_irq);
|
||||
DECLARE_INPUT_CHANGED_MEMBER(main_nmi);
|
||||
DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
|
||||
DECLARE_MACHINE_RESET(s11b);
|
||||
@ -91,6 +98,7 @@ protected:
|
||||
required_device<dac_device> m_dac;
|
||||
required_device<dac_device> m_dac1;
|
||||
required_device<hc55516_device> m_hc55516;
|
||||
required_device<hc55516_device> m_bg_hc55516;
|
||||
required_device<pia6821_device> m_pias;
|
||||
required_device<pia6821_device> m_pia21;
|
||||
required_device<pia6821_device> m_pia24;
|
||||
@ -100,6 +108,8 @@ protected:
|
||||
required_device<pia6821_device> m_pia34;
|
||||
required_device<pia6821_device> m_pia40;
|
||||
required_device<ym2151_device> m_ym;
|
||||
|
||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
|
||||
private:
|
||||
UINT8 m_sound_data;
|
||||
UINT8 m_strobe;
|
||||
@ -109,6 +119,10 @@ private:
|
||||
UINT32 m_segment2;
|
||||
bool m_ca1;
|
||||
bool m_invert; // later System 11B games start expecting inverted data to the display LED segments.
|
||||
emu_timer* m_irq_timer;
|
||||
bool m_irq_active;
|
||||
|
||||
static const device_timer_id TIMER_IRQ = 0;
|
||||
};
|
||||
|
||||
static ADDRESS_MAP_START( s11b_main_map, AS_PROGRAM, 8, s11b_state )
|
||||
@ -132,9 +146,11 @@ static ADDRESS_MAP_START( s11b_audio_map, AS_PROGRAM, 8, s11b_state )
|
||||
ADDRESS_MAP_END
|
||||
|
||||
static ADDRESS_MAP_START( s11b_bg_map, AS_PROGRAM, 8, s11b_state )
|
||||
AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x1800) AM_RAM
|
||||
AM_RANGE(0x0000, 0x07ff) AM_RAM
|
||||
AM_RANGE(0x2000, 0x2001) AM_MIRROR(0x1ffe) AM_DEVREADWRITE("ym2151", ym2151_device, read, write)
|
||||
AM_RANGE(0x4000, 0x4003) AM_MIRROR(0x1ffc) AM_DEVREADWRITE("pia40", pia6821_device, read, write)
|
||||
AM_RANGE(0x6000, 0x67ff) AM_WRITE(bg_speech_digit_w)
|
||||
AM_RANGE(0x6800, 0x6fff) AM_WRITE(bg_speech_clock_w)
|
||||
AM_RANGE(0x7800, 0x7fff) AM_WRITE(bgbank_w)
|
||||
AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bgbank")
|
||||
ADDRESS_MAP_END
|
||||
@ -213,12 +229,39 @@ static INPUT_PORTS_START( s11b )
|
||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Audio Diag") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, s11b_state, audio_nmi, 1)
|
||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Main Diag") PORT_CODE(KEYCODE_F2) PORT_CHANGED_MEMBER(DEVICE_SELF, s11b_state, main_nmi, 1)
|
||||
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Advance") PORT_CODE(KEYCODE_0)
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Up/Down") PORT_CODE(KEYCODE_9)
|
||||
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Up/Down") PORT_CODE(KEYCODE_9) PORT_TOGGLE
|
||||
PORT_CONFNAME( 0x10, 0x10, "Language" )
|
||||
PORT_CONFSETTING( 0x00, "German" )
|
||||
PORT_CONFSETTING( 0x10, "English" )
|
||||
INPUT_PORTS_END
|
||||
|
||||
void s11b_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||
{
|
||||
switch(id)
|
||||
{
|
||||
case TIMER_IRQ:
|
||||
if(param == 1)
|
||||
{
|
||||
m_maincpu->set_input_line(M6800_IRQ_LINE,ASSERT_LINE);
|
||||
m_irq_timer->adjust(attotime::from_ticks(32,4000000/2),0);
|
||||
m_pias->cb1_w(0);
|
||||
m_irq_active = true;
|
||||
m_pia28->ca1_w(BIT(ioport("DIAGS")->read(), 2)); // Advance
|
||||
m_pia28->cb1_w(BIT(ioport("DIAGS")->read(), 3)); // Up/Down
|
||||
}
|
||||
else
|
||||
{
|
||||
m_maincpu->set_input_line(M6800_IRQ_LINE,CLEAR_LINE);
|
||||
m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
|
||||
m_pias->cb1_w(1);
|
||||
m_irq_active = false;
|
||||
m_pia28->ca1_w(1);
|
||||
m_pia28->cb1_w(1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
MACHINE_RESET_MEMBER( s11b_state, s11b )
|
||||
{
|
||||
membank("bank0")->set_entry(0);
|
||||
@ -243,6 +286,23 @@ INPUT_CHANGED_MEMBER( s11b_state::audio_nmi )
|
||||
m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( s11b_state::pia_irq )
|
||||
{
|
||||
if(state == CLEAR_LINE)
|
||||
{
|
||||
// restart IRQ timer
|
||||
m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
|
||||
m_irq_active = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// disable IRQ timer while other IRQs are being handled
|
||||
// (counter is reset every 32 cycles while a PIA IRQ is handled)
|
||||
m_irq_timer->adjust(attotime::zero);
|
||||
m_irq_active = true;
|
||||
}
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( s11b_state::sol3_w )
|
||||
{
|
||||
|
||||
@ -253,6 +313,18 @@ WRITE8_MEMBER( s11b_state::sound_w )
|
||||
m_sound_data = data;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( s11b_state::bg_speech_clock_w )
|
||||
{
|
||||
hc55516_clock_w(m_bg_hc55516, data);
|
||||
popmessage("BG HC55516 Clock write %02x",data);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( s11b_state::bg_speech_digit_w )
|
||||
{
|
||||
hc55516_digit_w(m_bg_hc55516, data);
|
||||
popmessage("BG HC55516 Digit write %02x",data);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( s11b_state::pia21_ca2_w )
|
||||
{
|
||||
// sound ns
|
||||
@ -273,8 +345,8 @@ static const pia6821_interface pia21_intf =
|
||||
DEVCB_DRIVER_MEMBER(s11b_state, sol2_w), /* port B out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia21_ca2_w), /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia21_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
WRITE8_MEMBER( s11b_state::lamp0_w )
|
||||
@ -294,27 +366,17 @@ static const pia6821_interface pia24_intf =
|
||||
DEVCB_DRIVER_MEMBER(s11b_state, lamp1_w), /* port B out */
|
||||
DEVCB_NULL, /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia24_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
READ_LINE_MEMBER( s11b_state::pia28_ca1_r )
|
||||
{
|
||||
return BIT(ioport("DIAGS")->read(), 2) ? 1 : 0; // advance button
|
||||
}
|
||||
|
||||
READ_LINE_MEMBER( s11b_state::pia28_cb1_r )
|
||||
{
|
||||
return BIT(ioport("DIAGS")->read(), 3) ? 1 : 0; // up/down switch
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( s11b_state::dig0_w )
|
||||
{
|
||||
data &= 0x7f;
|
||||
m_strobe = data & 15;
|
||||
m_diag = (data & 0x70) >> 4;
|
||||
output_set_digit_value(60, 0); // not connected to PA5 or PA6?
|
||||
output_set_digit_value(61, m_diag & 0x01); // connected to PA4
|
||||
output_set_digit_value(61, m_diag & 0x01); // connected to PA4, normal behaviour is to be continually blinking
|
||||
output_set_digit_value(62, 0);
|
||||
m_segment1 = 0;
|
||||
m_segment2 = 0;
|
||||
@ -351,16 +413,16 @@ static const pia6821_interface pia28_intf =
|
||||
{
|
||||
DEVCB_DRIVER_MEMBER(s11b_state, pia28_w7_r), /* port A in */
|
||||
DEVCB_NULL, /* port B in */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia28_ca1_r), /* line CA1 in */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia28_cb1_r), /* line CB1 in */
|
||||
DEVCB_NULL, /* line CA1 in */
|
||||
DEVCB_NULL, /* line CB1 in */
|
||||
DEVCB_NULL, /* line CA2 in */
|
||||
DEVCB_NULL, /* line CB2 in */
|
||||
DEVCB_DRIVER_MEMBER(s11b_state, dig0_w), /* port A out */
|
||||
DEVCB_DRIVER_MEMBER(s11b_state, dig1_w), /* port B out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia28_ca2_w), /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia28_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
WRITE8_MEMBER( s11b_state::pia2c_pa_w )
|
||||
@ -403,8 +465,8 @@ static const pia6821_interface pia2c_intf =
|
||||
DEVCB_DRIVER_MEMBER(s11b_state, pia2c_pb_w), /* port B out */
|
||||
DEVCB_NULL, /* line CA2 out */
|
||||
DEVCB_NULL, /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
READ8_MEMBER( s11b_state::switch_r )
|
||||
@ -431,8 +493,8 @@ static const pia6821_interface pia30_intf =
|
||||
DEVCB_DRIVER_MEMBER(s11b_state, switch_w), /* port B out */
|
||||
DEVCB_NULL, /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia30_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
WRITE8_MEMBER( s11b_state::pia34_pa_w )
|
||||
@ -471,8 +533,8 @@ static const pia6821_interface pia34_intf =
|
||||
DEVCB_DRIVER_MEMBER(s11b_state, pia34_pb_w), /* port B out */
|
||||
DEVCB_NULL, /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia34_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
|
||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq), /* IRQA */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq) /* IRQB */
|
||||
};
|
||||
|
||||
WRITE8_MEMBER( s11b_state::bank_w )
|
||||
@ -494,7 +556,10 @@ READ_LINE_MEMBER( s11b_state::pias_ca1_r )
|
||||
WRITE_LINE_MEMBER( s11b_state::pias_ca2_w )
|
||||
{
|
||||
// speech clock
|
||||
hc55516_clock_w(m_hc55516, state);
|
||||
if(state == CLEAR_LINE)
|
||||
hc55516_clock_w(m_hc55516, 0);
|
||||
else
|
||||
hc55516_clock_w(m_hc55516, 1);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( s11b_state::pias_cb2_w )
|
||||
@ -534,6 +599,11 @@ WRITE8_MEMBER( s11b_state::pia40_pa_w )
|
||||
m_dac1->write_unsigned8(data);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( s11b_state::pia40_pb_w )
|
||||
{
|
||||
m_pia34->portb_w(data);
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER( s11b_state::ym2151_irq_w)
|
||||
{
|
||||
if(state == CLEAR_LINE)
|
||||
@ -562,7 +632,7 @@ static const pia6821_interface pia40_intf =
|
||||
DEVCB_LINE_VCC, /* line CA2 in */
|
||||
DEVCB_NULL, /* line CB2 in */
|
||||
DEVCB_DRIVER_MEMBER(s11b_state, pia40_pa_w), /* port A out */
|
||||
DEVCB_DRIVER_MEMBER(s11b_state, dac_w), /* port B out */
|
||||
DEVCB_DRIVER_MEMBER(s11b_state, pia40_pb_w), /* port B out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia40_ca2_w), /* line CA2 out */
|
||||
DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia40_cb2_w), /* line CB2 out */
|
||||
DEVCB_CPU_INPUT_LINE("bgcpu", M6809_FIRQ_LINE), /* IRQA */
|
||||
@ -580,6 +650,9 @@ DRIVER_INIT_MEMBER( s11b_state, s11b )
|
||||
membank("bank1")->set_entry(0);
|
||||
membank("bgbank")->set_entry(0);
|
||||
m_invert = false;
|
||||
m_irq_timer = timer_alloc(TIMER_IRQ);
|
||||
m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
|
||||
m_irq_active = false;
|
||||
}
|
||||
|
||||
DRIVER_INIT_MEMBER( s11b_state, s11b_invert )
|
||||
@ -593,19 +666,15 @@ DRIVER_INIT_MEMBER( s11b_state, s11b_invert )
|
||||
membank("bank1")->set_entry(0);
|
||||
membank("bgbank")->set_entry(0);
|
||||
m_invert = true;
|
||||
}
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER( s11b_state::irq)
|
||||
{
|
||||
m_maincpu->set_input_line(M6800_IRQ_LINE, HOLD_LINE);
|
||||
m_pias->cb1_w(0);
|
||||
m_irq_timer = timer_alloc(TIMER_IRQ);
|
||||
m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
|
||||
m_irq_active = false;
|
||||
}
|
||||
|
||||
static MACHINE_CONFIG_START( s11b, s11b_state )
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_ADD("maincpu", M6808, 4000000)
|
||||
MCFG_CPU_PROGRAM_MAP(s11b_main_map)
|
||||
MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s11b_state, irq, attotime::from_hz(1000))
|
||||
MCFG_MACHINE_RESET_OVERRIDE(s11b_state, s11b)
|
||||
|
||||
/* Video */
|
||||
@ -645,11 +714,14 @@ static MACHINE_CONFIG_START( s11b, s11b_state )
|
||||
MCFG_SPEAKER_STANDARD_MONO("bg")
|
||||
MCFG_YM2151_ADD("ym2151", 3580000)
|
||||
MCFG_YM2151_IRQ_HANDLER(WRITELINE(s11b_state, ym2151_irq_w))
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bg", 0.50)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bg", 0.25)
|
||||
|
||||
MCFG_DAC_ADD("dac1")
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bg", 0.50)
|
||||
|
||||
MCFG_SOUND_ADD("hc55516_bg", HC55516, 0)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speech", 0.50)
|
||||
|
||||
MCFG_PIA6821_ADD("pia40", pia40_intf)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user