From c43a8bfa414c00d6c47568217b822a20aadd0c48 Mon Sep 17 00:00:00 2001 From: Sandro Ronco Date: Sat, 20 Dec 2014 19:59:20 +0100 Subject: (MESS) digel804: added RS232 port. (nw) --- src/mess/drivers/digel804.c | 74 ++++++++++++++++++++++++++++++-------------- src/mess/layout/digel804.lay | 5 --- 2 files changed, 50 insertions(+), 29 deletions(-) diff --git a/src/mess/drivers/digel804.c b/src/mess/drivers/digel804.c index f433d52db6e..f8c9b3c1a3b 100644 --- a/src/mess/drivers/digel804.c +++ b/src/mess/drivers/digel804.c @@ -20,11 +20,8 @@ * hook up keypad via 74C923 and mode buttons via logic gate mess * * TODO: +* remove ACIA hack in digel804_state::acia_command_w * minor finishing touches to i/o map -* hook up 6551/ACIA interrupt (currently ACIA device doesn't have a callback for /IRQ line) -* attach terminal to 6551/ACIA serial for recieving from ep804 -* correctly hook up 10937 vfd controller: por is not hooked up (relates to /MEMEN) -* SCLK line should be handled inside the 10937 device * EPROM socket stuff (ports 0x40, 0x41, 0x42 and 0x47) * artwork * @@ -59,15 +56,14 @@ /* Core includes */ #include "emu.h" #include "cpu/z80/z80.h" -#include "machine/terminal.h" #include "sound/speaker.h" #include "machine/roc10937.h" #include "machine/mos6551.h" #include "machine/mm74c922.h" #include "machine/ram.h" +#include "bus/rs232/rs232.h" #include "digel804.lh" -#define TERMINAL_TAG "terminal" class digel804_state : public driver_device { @@ -75,22 +71,22 @@ public: digel804_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_terminal(*this, TERMINAL_TAG), m_speaker(*this, "speaker"), m_acia(*this, "acia"), m_vfd(*this, "vfd"), m_kb(*this, "74c923"), - m_ram(*this, RAM_TAG) + m_ram(*this, RAM_TAG), + m_rambank(*this, "bankedram") { } required_device m_maincpu; - required_device m_terminal; required_device m_speaker; required_device m_acia; required_device m_vfd; required_device m_kb; required_device m_ram; + required_memory_bank m_rambank; virtual void machine_reset(); DECLARE_DRIVER_INIT(digel804); @@ -115,13 +111,14 @@ public: DECLARE_WRITE8_MEMBER( acia_command_w ); DECLARE_READ8_MEMBER( acia_control_r ); DECLARE_WRITE8_MEMBER( acia_control_w ); + DECLARE_WRITE_LINE_MEMBER( acia_irq_w ); + DECLARE_WRITE_LINE_MEMBER( ep804_acia_irq_w ); DECLARE_WRITE_LINE_MEMBER( da_w ); DECLARE_INPUT_CHANGED_MEMBER(mode_change); // current speaker state for port 45 UINT8 m_speaker_state; // ram stuff for banking UINT8 m_ram_bank; - //required_shared_ptr m_main_ram; // states UINT8 m_acia_intq; UINT8 m_overload_state; @@ -133,7 +130,6 @@ public: UINT8 m_chipinsert_state; UINT8 m_keyen_state; UINT8 m_op41; - DECLARE_WRITE8_MEMBER(digel804_serial_put); }; @@ -156,7 +152,7 @@ DRIVER_INIT_MEMBER(digel804_state,digel804) m_op41 = 0; m_keyen_state = 1; // /KEYEN - membank( "bankedram" )->set_base(m_ram->pointer()); + m_rambank->set_base(m_ram->pointer()); } void digel804_state::machine_reset() @@ -236,7 +232,7 @@ READ8_MEMBER( digel804_state::ip43 ) WRITE8_MEMBER( digel804_state::op00 ) { m_ram_bank = data; - membank( "bankedram" )->set_base(m_ram->pointer() + ((m_ram_bank * 0x8000) & m_ram->mask())); + m_rambank->set_base(m_ram->pointer() + ((m_ram_bank * 0x8000) & m_ram->mask())); } WRITE8_MEMBER( digel804_state::op43 ) @@ -257,7 +253,7 @@ WRITE8_MEMBER( digel804_state::op43 ) if ((data&0xF8)!=0) logerror("Digel804: port 0x43 ram bank had unexpected data %02x written to it!\n", data); - membank( "bankedram" )->set_base(m_ram->pointer() + ((m_ram_bank * 0x8000) & m_ram->mask())); + m_rambank->set_base(m_ram->pointer() + ((m_ram_bank * 0x8000) & m_ram->mask())); } WRITE8_MEMBER( digel804_state::op43_1_4 ) @@ -372,6 +368,8 @@ INPUT_CHANGED_MEMBER( digel804_state::mode_change ) m_sim_mode = 0; break; } + + m_acia->reset(); } // press one of those keys reset the Z80 @@ -406,6 +404,8 @@ READ8_MEMBER( digel804_state::acia_command_r ) WRITE8_MEMBER( digel804_state::acia_command_w ) { + data |= 0x08; // HACK for ep804 remote mode + m_acia->write(space, 2, data); } @@ -458,7 +458,7 @@ static ADDRESS_MAP_START(z80_io_1_4, AS_IO, 8, digel804_state) ADDRESS_MAP_GLOBAL_MASK(0xff) // io bits: x 1 x x x * * * // writes to 47, 4e, 57, 5e, 67, 6e, 77, 7e, c7, ce, d7, de, e7, ee, f7, fe all go to 47, same with reads - AM_RANGE(0x00, 0x00) AM_MIRROR(0xB8) AM_WRITE(op00) // W, banked ram + AM_RANGE(0x00, 0x00) AM_MIRROR(0x38) AM_WRITE(op00) // W, banked ram AM_RANGE(0x40, 0x40) AM_MIRROR(0xB8) AM_READWRITE(ip40, op40) // RW, eprom socket data bus input/output value AM_RANGE(0x41, 0x41) AM_MIRROR(0xB8) AM_WRITE(op41) // W, eprom socket address low out AM_RANGE(0x42, 0x42) AM_MIRROR(0xB8) AM_WRITE(op42) // W, eprom socket address hi/control out @@ -553,18 +553,33 @@ static INPUT_PORTS_START( digel804 ) PORT_DIPSETTING( 0x00, DEF_STR( On ) ) INPUT_PORTS_END +static DEVICE_INPUT_DEFAULTS_START( digel804_rs232_defaults ) + DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_9600 ) + DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_9600 ) + DEVICE_INPUT_DEFAULTS( "RS232_STARTBITS", 0xff, RS232_STARTBITS_1 ) + DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_7 ) + DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_ODD ) + DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 ) +DEVICE_INPUT_DEFAULTS_END + /****************************************************************************** Machine Drivers ******************************************************************************/ -WRITE8_MEMBER(digel804_state::digel804_serial_put) -{ - //m_acia->receive_character(data); -} WRITE_LINE_MEMBER( digel804_state::da_w ) { - m_maincpu->set_input_line(0, state ? ASSERT_LINE : CLEAR_LINE); m_key_intq = state ? 0 : 1; + m_maincpu->set_input_line(0, (m_key_intq & m_acia_intq) ? CLEAR_LINE : ASSERT_LINE); +} + +WRITE_LINE_MEMBER( digel804_state::acia_irq_w ) +{ + m_acia_intq = state ? 0 : 1; + m_maincpu->set_input_line(0, (m_key_intq & m_acia_intq) ? CLEAR_LINE : ASSERT_LINE); +} + +WRITE_LINE_MEMBER( digel804_state::ep804_acia_irq_w ) +{ } static MACHINE_CONFIG_START( digel804, digel804_state ) @@ -577,9 +592,6 @@ static MACHINE_CONFIG_START( digel804, digel804_state ) MCFG_ROC10937_ADD("vfd",0) // RIGHT_TO_LEFT /* video hardware */ - MCFG_DEVICE_ADD(TERMINAL_TAG, GENERIC_TERMINAL, 0) - MCFG_GENERIC_TERMINAL_KEYBOARD_CB(WRITE8(digel804_state, digel804_serial_put)) - MCFG_DEFAULT_LAYOUT(layout_digel804) MCFG_DEVICE_ADD("74c923", MM74C923, 0) @@ -591,7 +603,18 @@ static MACHINE_CONFIG_START( digel804, digel804_state ) /* acia */ MCFG_DEVICE_ADD("acia", MOS6551, 0) - MCFG_MOS6551_XTAL(XTAL_1_8432MHz) + MCFG_MOS6551_XTAL(XTAL_3_6864MHz/2) + MCFG_MOS6551_IRQ_HANDLER(WRITELINE(digel804_state, acia_irq_w)) + MCFG_MOS6551_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd)) + MCFG_MOS6551_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts)) + MCFG_MOS6551_DTR_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_dtr)) + + MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "null_modem") + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("acia", mos6551_device, write_rxd)) + MCFG_RS232_DSR_HANDLER(DEVWRITELINE("acia", mos6551_device, write_dsr)) + MCFG_RS232_CTS_HANDLER(DEVWRITELINE("acia", mos6551_device, write_cts)) + MCFG_DEVICE_CARD_DEVICE_INPUT_DEFAULTS("null_modem", digel804_rs232_defaults) + MCFG_DEVICE_CARD_DEVICE_INPUT_DEFAULTS("terminal", digel804_rs232_defaults) MCFG_RAM_ADD(RAM_TAG) MCFG_RAM_DEFAULT_SIZE("256K") @@ -609,6 +632,9 @@ static MACHINE_CONFIG_DERIVED( ep804, digel804 ) MCFG_CPU_PROGRAM_MAP(z80_mem_804_1_2) MCFG_CPU_IO_MAP(z80_io_1_2) + MCFG_DEVICE_MODIFY("acia") + MCFG_MOS6551_IRQ_HANDLER(WRITELINE(digel804_state, ep804_acia_irq_w)) + MCFG_RAM_MODIFY(RAM_TAG) MCFG_RAM_DEFAULT_SIZE("32K") MCFG_RAM_EXTRA_OPTIONS("64K") diff --git a/src/mess/layout/digel804.lay b/src/mess/layout/digel804.lay index 88910e469ec..5e4f498b46a 100644 --- a/src/mess/layout/digel804.lay +++ b/src/mess/layout/digel804.lay @@ -214,9 +214,4 @@ - - - - - -- cgit v1.2.3-70-g09d2