mirror of
https://github.com/holub/mame
synced 2025-10-06 17:08:28 +03:00
(MESS) MEK6800D2 : Added cassette interface, system listed as WORKING [Robbbert]
This commit is contained in:
parent
e84b3b1cd9
commit
cd96675234
@ -4,7 +4,8 @@
|
|||||||
|
|
||||||
system driver
|
system driver
|
||||||
|
|
||||||
Juergen Buchmueller <pullmoll@t-online.de>, Jan 2000
|
Juergen Buchmueller, Jan 2000
|
||||||
|
2013-06-16 Working driver [Robbbert]
|
||||||
|
|
||||||
memory map
|
memory map
|
||||||
|
|
||||||
@ -24,6 +25,28 @@
|
|||||||
e000-e3ff ROM JBUG monitor program
|
e000-e3ff ROM JBUG monitor program
|
||||||
e400-ffff -/- mirrors of monitor rom
|
e400-ffff -/- mirrors of monitor rom
|
||||||
|
|
||||||
|
|
||||||
|
Enter the 4 digit address then the command key:
|
||||||
|
|
||||||
|
- M : Examine and Change Memory (example: E000M, then G to skip to next, ESC to exit)
|
||||||
|
- E : Escape (abort) operation (ESC key in our emulation)
|
||||||
|
- R : Examine Registers
|
||||||
|
- G : Begin execution at specified address
|
||||||
|
- P : Punch data from memory to magnetic tape
|
||||||
|
- L : Load memory from magnetic tape
|
||||||
|
- N : Trace one instruction
|
||||||
|
- V : Set (and remove) breakpoints
|
||||||
|
|
||||||
|
The keys are laid out as:
|
||||||
|
|
||||||
|
P L N V
|
||||||
|
|
||||||
|
7 8 9 A M
|
||||||
|
4 5 6 B E
|
||||||
|
1 2 3 C R
|
||||||
|
0 F E D G
|
||||||
|
|
||||||
|
|
||||||
Pasting:
|
Pasting:
|
||||||
0-F : as is
|
0-F : as is
|
||||||
NEXT : ^
|
NEXT : ^
|
||||||
@ -38,8 +61,11 @@ Test Paste:
|
|||||||
program that you need to enter in step 1:
|
program that you need to enter in step 1:
|
||||||
H0020=8E^00^FF^4F^C6^04^CE^00^10^AB^00^08^5A^26^FA^97^15^3F^H
|
H0020=8E^00^FF^4F^C6^04^CE^00^10^AB^00^08^5A^26^FA^97^15^3F^H
|
||||||
|
|
||||||
|
Save the above program to tape:
|
||||||
|
HA002=00^20^00^32^HP (A002 has start address, A004 has end address, big endian)
|
||||||
|
|
||||||
TODO
|
TODO
|
||||||
Cassette (it is extremely complex, with approx 10 chips)
|
Display should go blank during cassette operations
|
||||||
|
|
||||||
|
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
@ -65,28 +91,38 @@ public:
|
|||||||
|
|
||||||
mekd2_state(const machine_config &mconfig, device_type type, const char *tag)
|
mekd2_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||||
: driver_device(mconfig, type, tag),
|
: driver_device(mconfig, type, tag),
|
||||||
m_maincpu(*this, "maincpu"),
|
m_maincpu(*this, "maincpu"),
|
||||||
m_pia_s(*this, "pia_s"),
|
m_pia_s(*this, "pia_s"),
|
||||||
m_pia_u(*this, "pia_u"),
|
m_pia_u(*this, "pia_u"),
|
||||||
m_acia(*this, "acia")
|
m_acia(*this, "acia"),
|
||||||
|
m_cass(*this, "cassette")
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
DECLARE_READ_LINE_MEMBER(mekd2_key40_r);
|
||||||
|
DECLARE_READ8_MEMBER(mekd2_key_r);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(mekd2_nmi_w);
|
||||||
|
DECLARE_WRITE8_MEMBER(mekd2_digit_w);
|
||||||
|
DECLARE_WRITE8_MEMBER(mekd2_segment_w);
|
||||||
|
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(mekd2_cart);
|
||||||
|
DECLARE_READ_LINE_MEMBER(cass_r);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(cass_w);
|
||||||
|
TIMER_DEVICE_CALLBACK_MEMBER(mekd2_c);
|
||||||
|
TIMER_DEVICE_CALLBACK_MEMBER(mekd2_p);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
|
||||||
|
|
||||||
|
private:
|
||||||
|
UINT8 m_cass_data[4];
|
||||||
|
UINT8 m_segment;
|
||||||
|
UINT8 m_digit;
|
||||||
|
UINT8 m_keydata;
|
||||||
|
bool m_cass_state;
|
||||||
required_device<cpu_device> m_maincpu;
|
required_device<cpu_device> m_maincpu;
|
||||||
required_device<pia6821_device> m_pia_s;
|
required_device<pia6821_device> m_pia_s;
|
||||||
required_device<pia6821_device> m_pia_u;
|
required_device<pia6821_device> m_pia_u;
|
||||||
required_device<acia6850_device> m_acia;
|
required_device<acia6850_device> m_acia;
|
||||||
DECLARE_READ_LINE_MEMBER( mekd2_key40_r );
|
required_device<cassette_image_device> m_cass;
|
||||||
DECLARE_READ8_MEMBER( mekd2_key_r );
|
|
||||||
DECLARE_WRITE_LINE_MEMBER( mekd2_nmi_w );
|
|
||||||
DECLARE_WRITE8_MEMBER( mekd2_digit_w );
|
|
||||||
DECLARE_WRITE8_MEMBER( mekd2_segment_w );
|
|
||||||
UINT8 m_segment;
|
|
||||||
UINT8 m_digit;
|
|
||||||
UINT8 m_keydata;
|
|
||||||
DECLARE_DEVICE_IMAGE_LOAD_MEMBER(mekd2_cart);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -113,29 +149,6 @@ ADDRESS_MAP_END
|
|||||||
|
|
||||||
************************************************************/
|
************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
Enter the 4 digit address then the command key:
|
|
||||||
|
|
||||||
- M : Examine and Change Memory (example: E000M, then G to skip to next, H to exit)
|
|
||||||
- E : Escape (abort) operation (H key in our emulation)
|
|
||||||
- R : Examine Registers
|
|
||||||
- G : Begin execution at specified address
|
|
||||||
- P : Punch data from memory to magnetic tape
|
|
||||||
- L : Load memory from magnetic tape
|
|
||||||
- N : Trace one instruction
|
|
||||||
- V : Set (and remove) breakpoints
|
|
||||||
|
|
||||||
The keys are laid out as:
|
|
||||||
|
|
||||||
P L N V
|
|
||||||
|
|
||||||
7 8 9 A M
|
|
||||||
4 5 6 B E
|
|
||||||
1 2 3 C R
|
|
||||||
0 F E D G
|
|
||||||
|
|
||||||
*/
|
|
||||||
static INPUT_PORTS_START( mekd2 )
|
static INPUT_PORTS_START( mekd2 )
|
||||||
PORT_START("X0")
|
PORT_START("X0")
|
||||||
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0')
|
PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0')
|
||||||
@ -312,16 +325,26 @@ static const pia6821_interface mekd2_u_mc6821_intf =
|
|||||||
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB output */
|
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB output */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
READ_LINE_MEMBER( mekd2_state::cass_r )
|
||||||
|
{
|
||||||
|
return (bool)m_cass_data[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER( mekd2_state::cass_w )
|
||||||
|
{
|
||||||
|
m_cass_state = state;
|
||||||
|
}
|
||||||
|
|
||||||
static ACIA6850_INTERFACE( mekd2_acia_intf )
|
static ACIA6850_INTERFACE( mekd2_acia_intf )
|
||||||
{
|
{
|
||||||
XTAL_MEKD2 / 256, //connected to cassette circuit /* tx clock 4800Hz */
|
XTAL_MEKD2 / 256, /* tx clock 4800Hz */
|
||||||
XTAL_MEKD2 / 256, //connected to cassette circuit /* rx clock varies, controlled by cassette circuit */
|
300, /* rx clock line, toggled by cassette circuit */
|
||||||
DEVCB_NULL,//LINE(cass),//connected to cassette circuit /* in rxd func */
|
DEVCB_DRIVER_LINE_MEMBER(mekd2_state, cass_r), /* in rxd func */
|
||||||
DEVCB_NULL,//LINE(cass),//connected to cassette circuit /* out txd func */
|
DEVCB_DRIVER_LINE_MEMBER(mekd2_state, cass_w), /* out txd func */
|
||||||
DEVCB_NULL, /* in cts func */
|
DEVCB_NULL, /* in cts func */
|
||||||
DEVCB_NULL, //connected to cassette circuit /* out rts func */
|
DEVCB_NULL, /* out rts func */
|
||||||
DEVCB_NULL, /* in dcd func */
|
DEVCB_NULL, /* in dcd func */
|
||||||
DEVCB_NULL /* out irq func */
|
DEVCB_NULL /* out irq func NOT USED */
|
||||||
};
|
};
|
||||||
|
|
||||||
DEVICE_IMAGE_LOAD_MEMBER( mekd2_state,mekd2_cart )
|
DEVICE_IMAGE_LOAD_MEMBER( mekd2_state,mekd2_cart )
|
||||||
@ -349,6 +372,30 @@ DEVICE_IMAGE_LOAD_MEMBER( mekd2_state,mekd2_cart )
|
|||||||
return IMAGE_INIT_PASS;
|
return IMAGE_INIT_PASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TIMER_DEVICE_CALLBACK_MEMBER(mekd2_state::mekd2_c)
|
||||||
|
{
|
||||||
|
m_cass_data[3]++;
|
||||||
|
|
||||||
|
if (m_cass_state)
|
||||||
|
m_cass->output(BIT(m_cass_data[3], 0) ? -1.0 : +1.0); // 2400Hz
|
||||||
|
else
|
||||||
|
m_cass->output(BIT(m_cass_data[3], 1) ? -1.0 : +1.0); // 1200Hz
|
||||||
|
}
|
||||||
|
|
||||||
|
TIMER_DEVICE_CALLBACK_MEMBER(mekd2_state::mekd2_p)
|
||||||
|
{
|
||||||
|
/* cassette - turn 1200/2400Hz to a bit */
|
||||||
|
m_cass_data[1]++;
|
||||||
|
UINT8 cass_ws = (m_cass->input() > +0.03) ? 1 : 0;
|
||||||
|
|
||||||
|
if (cass_ws != m_cass_data[0])
|
||||||
|
{
|
||||||
|
m_cass_data[0] = cass_ws;
|
||||||
|
m_cass_data[2] = ((m_cass_data[1] < 12) ? 1 : 0);
|
||||||
|
m_cass_data[1] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************
|
/***********************************************************
|
||||||
|
|
||||||
Machine
|
Machine
|
||||||
@ -379,6 +426,8 @@ static MACHINE_CONFIG_START( mekd2, mekd2_state )
|
|||||||
MCFG_PIA6821_ADD("pia_s", mekd2_s_mc6821_intf)
|
MCFG_PIA6821_ADD("pia_s", mekd2_s_mc6821_intf)
|
||||||
MCFG_PIA6821_ADD("pia_u", mekd2_u_mc6821_intf)
|
MCFG_PIA6821_ADD("pia_u", mekd2_u_mc6821_intf)
|
||||||
MCFG_ACIA6850_ADD("acia", mekd2_acia_intf)
|
MCFG_ACIA6850_ADD("acia", mekd2_acia_intf)
|
||||||
|
MCFG_TIMER_DRIVER_ADD_PERIODIC("mekd2_c", mekd2_state, mekd2_c, attotime::from_hz(4800))
|
||||||
|
MCFG_TIMER_DRIVER_ADD_PERIODIC("mekd2_p", mekd2_state, mekd2_p, attotime::from_hz(40000))
|
||||||
MACHINE_CONFIG_END
|
MACHINE_CONFIG_END
|
||||||
|
|
||||||
/***********************************************************
|
/***********************************************************
|
||||||
@ -398,5 +447,5 @@ ROM_END
|
|||||||
|
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */
|
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
|
||||||
CONS( 1977, mekd2, 0, 0, mekd2, mekd2, driver_device, 0, "Motorola", "MEK6800D2" , GAME_NOT_WORKING )
|
CONS( 1977, mekd2, 0, 0, mekd2, mekd2, driver_device, 0, "Motorola", "MEK6800D2" , 0 )
|
||||||
|
Loading…
Reference in New Issue
Block a user