big cleanup

This commit is contained in:
Michaël Banaan Ananas 2012-06-08 06:45:48 +00:00
parent e74dad2324
commit 75f4abf813

View File

@ -7,8 +7,9 @@ driver by Angelo Salese
A fortune-teller machine with 24 characters LED-array and a printer. A fortune-teller machine with 24 characters LED-array and a printer.
TODO: TODO:
-Emulate the graphics with genuine artwork display; - Emulate the graphics with genuine artwork display;
-Printer emulation; - Printer emulation;
- Sound;
***************************************************************************/ ***************************************************************************/
@ -20,15 +21,28 @@ class destiny_state : public driver_device
{ {
public: public:
destiny_state(const machine_config &mconfig, device_type type, const char *tag) destiny_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag) , : driver_device(mconfig, type, tag),
m_io_ram(*this, "io_ram"){ } m_maincpu(*this, "maincpu")
{ }
required_device<cpu_device> m_maincpu;
required_shared_ptr<UINT8> m_io_ram;
char m_led_array[21]; char m_led_array[21];
UINT8 m_bank;
DECLARE_READ8_MEMBER(io_r); DECLARE_WRITE8_MEMBER(firq_ack_w);
DECLARE_WRITE8_MEMBER(io_w); DECLARE_WRITE8_MEMBER(nmi_ack_w);
void update_led_array(UINT8 new_data); DECLARE_READ8_MEMBER(printer_status_r);
DECLARE_READ8_MEMBER(display_ready_r);
DECLARE_WRITE8_MEMBER(display_w);
DECLARE_WRITE8_MEMBER(out_w);
DECLARE_WRITE8_MEMBER(bank_select_w);
DECLARE_INPUT_CHANGED_MEMBER(coin_inserted);
protected:
// driver_device overrides
virtual void machine_start();
virtual void machine_reset();
}; };
@ -50,131 +64,175 @@ static SCREEN_UPDATE_IND16( destiny )
return 0; return 0;
} }
/*I don't know it this is 100% correct,might be different...*/
void destiny_state::update_led_array(UINT8 new_data)
/***************************************************************************
I/O
***************************************************************************/
WRITE8_MEMBER(destiny_state::firq_ack_w)
{ {
UINT8 i; device_set_input_line(m_maincpu, M6809_FIRQ_LINE, CLEAR_LINE);
/*scroll the data*/ }
for(i=0;i<19;i++)
WRITE8_MEMBER(destiny_state::nmi_ack_w)
{
device_set_input_line(m_maincpu, INPUT_LINE_NMI, CLEAR_LINE);
}
READ8_MEMBER(destiny_state::printer_status_r)
{
// d2: mark sensor
// d3: motor stop
// d4: status
// d5: /L-SW
// d6: paper
// d7: /R-SW
return 0xff;
}
READ8_MEMBER(destiny_state::display_ready_r)
{
// d7: /display ready
// other bits: N/C
return 0;
}
WRITE8_MEMBER(destiny_state::display_w)
{
/* this is preliminary, just fills a string and doesn't support control codes etc. */
// scroll the data
for (int i = 0; i < 19; i++)
m_led_array[i] = m_led_array[i+1]; m_led_array[i] = m_led_array[i+1];
/*update the data*/
m_led_array[19] = new_data; // update
m_led_array[19] = data;
} }
WRITE8_MEMBER(destiny_state::out_w)
static void answer_bankswitch(running_machine &machine,UINT8 new_bank)
{ {
destiny_state *state = machine.driver_data<destiny_state>(); // d0: coin blocker
if(state->m_bank!=new_bank) coin_lockout_w(machine(), 0, ~data & 1);
{
UINT8 *ROM = state->memregion("answers")->base();
UINT32 bankaddress;
state->m_bank = new_bank; // d1: paper cutter 1
bankaddress = 0 + 0x6000 * state->m_bank; // d2: paper cutter 2
state->membank("bank1")->set_base(&ROM[bankaddress]); // other bits: N/C?
}
} }
READ8_MEMBER(destiny_state::io_r) WRITE8_MEMBER(destiny_state::bank_select_w)
{ {
switch(offset) // d0-d2 and d4: bank (but only up to 4 banks supported)
{ membank("bank1")->set_base(memregion("answers")->base() + 0x6000 * (data & 3));
case 0x00: return 0xff; //printer read
case 0x03: return ioport("KEY1")->read();
case 0x04: return ioport("KEY2")->read();
case 0x05: return ioport("DIPSW")->read();
case 0x07: return ioport("KEY3")->read();
case 0x0a: return m_io_ram[offset]; //"buzzer" 0 read
case 0x0b: return m_io_ram[offset]; //"buzzer" 1 read
}
// printf("R -> [%02x]\n",offset);
return m_io_ram[offset];
} }
WRITE8_MEMBER(destiny_state::io_w) INPUT_CHANGED_MEMBER(destiny_state::coin_inserted)
{ {
switch(offset) // NMI on Coin SW or Service SW
{ if (oldval)
case 0x00: /*Printer data*/ return; device_set_input_line(m_maincpu, INPUT_LINE_NMI, ASSERT_LINE);
case 0x02: update_led_array(data); return;
case 0x05: coin_lockout_w(machine(), 0,m_io_ram[offset] & 1);return; // coincounter on coin insert
case 0x06: /*Printer IRQ enable*/ return; if (((int)(FPTR)param) == 0)
// case 0x0a: "buzzer" 0 write coin_counter_w(machine(), 0, newval);
// case 0x0b: "buzzer" 1 write
case 0x0c: answer_bankswitch(machine(),data&0x03); return; //data & 0x10 enabled too,dunno if it is worth to shift the data...
}
m_io_ram[offset] = data;
// printf("%02x -> [%02x]\n",data,offset);
} }
static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, destiny_state ) static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, destiny_state )
AM_RANGE(0x0000, 0x5fff) AM_ROMBANK("bank1") AM_RANGE(0x0000, 0x5fff) AM_ROMBANK("bank1")
AM_RANGE(0x8000, 0x87ff) AM_RAM AM_RANGE(0x8000, 0x87ff) AM_RAM
AM_RANGE(0x9000, 0x900f) AM_READWRITE(io_r,io_w) AM_SHARE("io_ram") //i/o area AM_RANGE(0x9000, 0x9000) AM_READWRITE(printer_status_r, firq_ack_w)
AM_RANGE(0x9001, 0x9001) AM_READ_PORT("SYSTEM") AM_WRITE(nmi_ack_w)
AM_RANGE(0x9002, 0x9002) AM_READWRITE(display_ready_r, display_w)
AM_RANGE(0x9003, 0x9003) AM_READ_PORT("KEY1")
AM_RANGE(0x9004, 0x9004) AM_READ_PORT("KEY2")
AM_RANGE(0x9005, 0x9005) AM_READ_PORT("DIPSW") AM_WRITE(out_w)
// AM_RANGE(0x9006, 0x9006) AM_NOP // printer motor on
// AM_RANGE(0x9007, 0x9007) AM_NOP // printer data
// AM_RANGE(0x900a, 0x900a) AM_NOP // sound on
// AM_RANGE(0x900b, 0x900b) AM_NOP // sound off
AM_RANGE(0x900c, 0x900c) AM_WRITE(bank_select_w)
// AM_RANGE(0x900d, 0x900d) AM_NOP // printer motor off
// AM_RANGE(0x900e, 0x900e) AM_NOP // printer motor jam reset
AM_RANGE(0xc000, 0xffff) AM_ROM AM_RANGE(0xc000, 0xffff) AM_ROM
ADDRESS_MAP_END ADDRESS_MAP_END
/***************************************************************************
Inputs
***************************************************************************/
static INPUT_PORTS_START( destiny ) static INPUT_PORTS_START( destiny )
PORT_START("KEY1") PORT_START("KEY1")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON11 ) PORT_NAME("Key Male") PORT_CODE(KEYCODE_SLASH_PAD) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Key Male") PORT_CODE(KEYCODE_SLASH_PAD)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Key 3") PORT_CODE(KEYCODE_3_PAD) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Key 3") PORT_CODE(KEYCODE_3_PAD)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Key 2") PORT_CODE(KEYCODE_2_PAD) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Key 2") PORT_CODE(KEYCODE_2_PAD)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Key 1") PORT_CODE(KEYCODE_1_PAD) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Key 1") PORT_CODE(KEYCODE_1_PAD)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON12 ) PORT_NAME("Key Female") PORT_CODE(KEYCODE_ASTERISK) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Key Female") PORT_CODE(KEYCODE_ASTERISK)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Key 6") PORT_CODE(KEYCODE_6_PAD) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Key 6") PORT_CODE(KEYCODE_6_PAD)
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Key 5") PORT_CODE(KEYCODE_5_PAD) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Key 5") PORT_CODE(KEYCODE_5_PAD)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Key 4") PORT_CODE(KEYCODE_4_PAD) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Key 4") PORT_CODE(KEYCODE_4_PAD)
PORT_START("KEY2") PORT_START("KEY2")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("Key 0") PORT_CODE(KEYCODE_0_PAD) PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Key 0") PORT_CODE(KEYCODE_0_PAD)
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("Key 9") PORT_CODE(KEYCODE_9_PAD) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Key 9") PORT_CODE(KEYCODE_9_PAD)
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("Key 8") PORT_CODE(KEYCODE_8_PAD) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Key 8") PORT_CODE(KEYCODE_8_PAD)
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("Key 7") PORT_CODE(KEYCODE_7_PAD) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Key 7") PORT_CODE(KEYCODE_7_PAD)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON11 ) PORT_NAME("Key Enter") PORT_CODE(KEYCODE_ENTER_PAD) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Key Enter") PORT_CODE(KEYCODE_ENTER_PAD)
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON13 ) PORT_NAME("Key Cancel") PORT_CODE(KEYCODE_PLUS_PAD) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Key Cancel") PORT_CODE(KEYCODE_PLUS_PAD)
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_START("KEY3")
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("DIPSW") PORT_START("DIPSW")
PORT_DIPNAME( 0x01, 0x00, DEF_STR( Unknown ) ) PORT_DIPNAME( 0x01, 0x00, DEF_STR( Coinage ) ) PORT_DIPLOCATION("SW1:1")
PORT_DIPSETTING( 0x01, DEF_STR( 2C_1C ) )
PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) )
PORT_DIPUNKNOWN_DIPLOC( 0x02, 0x00, "SW1:2" )
PORT_DIPUNKNOWN_DIPLOC( 0x04, 0x00, "SW1:3" )
PORT_DIPUNKNOWN_DIPLOC( 0x08, 0x00, "SW1:4" )
PORT_DIPUNKNOWN_DIPLOC( 0x10, 0x00, "SW1:5" )
PORT_DIPNAME( 0x20, 0x00, "Force Start" ) PORT_DIPLOCATION("SW1:6")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) ) PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x01, DEF_STR( On ) ) PORT_DIPSETTING( 0x20, DEF_STR( On ) )
PORT_DIPNAME( 0x02, 0x00, DEF_STR( Unknown ) ) PORT_DIPNAME( 0xc0, 0x00, "Operation Mode" ) PORT_DIPLOCATION("SW1:7,8")
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x02, DEF_STR( On ) )
PORT_DIPNAME( 0x04, 0x00, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x04, DEF_STR( On ) )
PORT_DIPNAME( 0x08, 0x00, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x08, DEF_STR( On ) )
PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) )
PORT_DIPSETTING( 0x00, DEF_STR( Off ) )
PORT_DIPSETTING( 0x10, DEF_STR( On ) )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_COIN1 )
PORT_DIPNAME( 0xc0, 0x00, "Operation Mode" )
PORT_DIPSETTING( 0x00, "Normal Mode" ) PORT_DIPSETTING( 0x00, "Normal Mode" )
// PORT_DIPSETTING( 0x40, "Normal Mode" ) // dupe
PORT_DIPSETTING( 0x80, "Test Mode" ) PORT_DIPSETTING( 0x80, "Test Mode" )
PORT_DIPSETTING( 0xc0, "I/O Test" ) PORT_DIPSETTING( 0xc0, "I/O Test" )
// 0x40, Normal Mode again
PORT_START("SYSTEM")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE4 ) PORT_NAME("Paper Cutter Reset")
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_SERVICE3 ) PORT_NAME("Paper Cutter Set")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SERVICE2 ) PORT_NAME("Paper Cutter Point")
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SERVICE1 ) PORT_NAME("Spear") // starts game
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_CHANGED_MEMBER(DEVICE_SELF, destiny_state, coin_inserted, (void *)0)
PORT_START("SERVICE")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_CHANGED_MEMBER(DEVICE_SELF, destiny_state, coin_inserted, (void *)1)
INPUT_PORTS_END INPUT_PORTS_END
/*Is it there an IRQ mask?*/
static INTERRUPT_GEN( timer_irq )
/***************************************************************************
Machine Config(s)
***************************************************************************/
void destiny_state::machine_start()
{ {
cputag_set_input_line(device->machine(), "maincpu", M6809_IRQ_LINE, HOLD_LINE);
} }
static MACHINE_RESET( destiny ) void destiny_state::machine_reset()
{ {
destiny_state *state = machine.driver_data<destiny_state>(); bank_select_w(*m_maincpu->memory().space(AS_PROGRAM), 0, 0);
state->m_bank = -1;
} }
static MACHINE_CONFIG_START( destiny, destiny_state ) static MACHINE_CONFIG_START( destiny, destiny_state )
@ -182,11 +240,9 @@ static MACHINE_CONFIG_START( destiny, destiny_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", M6809, XTAL_4MHz/2) MCFG_CPU_ADD("maincpu", M6809, XTAL_4MHz/2)
MCFG_CPU_PROGRAM_MAP(main_map) MCFG_CPU_PROGRAM_MAP(main_map)
MCFG_CPU_VBLANK_INT("screen", timer_irq) MCFG_CPU_PERIODIC_INT(irq0_line_hold, 60) // timer irq controls update speed, frequency needs to be determined yet (2MHz through three 74LS390)
MCFG_MACHINE_RESET(destiny) /* video hardware (dummy) */
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
@ -202,6 +258,8 @@ static MACHINE_CONFIG_START( destiny, destiny_state )
MACHINE_CONFIG_END MACHINE_CONFIG_END
/*************************************************************************** /***************************************************************************
Game driver(s) Game driver(s)