diff options
author | 2017-09-21 05:46:58 +1000 | |
---|---|---|
committer | 2017-09-21 05:46:58 +1000 | |
commit | 83f687a8d7119e2d399b5fc03086c67f726c99bc (patch) | |
tree | c00a343a30c93da0b6ae7f392dfbba0d9c892802 | |
parent | 647a85ecbd6527d529ae1d043d2523c34cacc95c (diff) |
(nw) okean240t : added uart, fixed regression in terminal screen.
-rw-r--r-- | src/mame/drivers/okean240.cpp | 101 |
1 files changed, 66 insertions, 35 deletions
diff --git a/src/mame/drivers/okean240.cpp b/src/mame/drivers/okean240.cpp index 1de7c0e53f2..fc61fa7e306 100644 --- a/src/mame/drivers/okean240.cpp +++ b/src/mame/drivers/okean240.cpp @@ -52,7 +52,9 @@ Usage of terminal: #include "emu.h" #include "cpu/i8085/i8085.h" #include "machine/keyboard.h" -#include "machine/terminal.h" +#include "machine/clock.h" +#include "machine/i8251.h" +#include "bus/rs232/rs232.h" #include "screen.h" @@ -65,16 +67,18 @@ public: }; okean240_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_term_data(0), - m_j(0), - m_scroll(0), - m_p_videoram(*this, "videoram"), - m_io_modifiers(*this, "MODIFIERS"), - m_maincpu(*this, "maincpu") - { - } - + : driver_device(mconfig, type, tag) + , m_term_data(0) + , m_j(0) + , m_scroll(0) + , m_tog(0) + , m_p_videoram(*this, "videoram") + , m_io_modifiers(*this, "MODIFIERS") + , m_maincpu(*this, "maincpu") + , m_uart(*this, "uart") + { } + + DECLARE_WRITE_LINE_MEMBER(clock_tick); DECLARE_READ8_MEMBER(okean240_kbd_status_r); DECLARE_READ8_MEMBER(okean240a_kbd_status_r); DECLARE_READ8_MEMBER(term_status_r); @@ -87,44 +91,46 @@ public: DECLARE_DRIVER_INIT(okean240); uint32_t screen_update_okean240(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); -protected: +private: virtual void machine_start() override; virtual void machine_reset() override; virtual void video_start() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - uint8_t m_term_data; uint8_t m_j; uint8_t m_scroll; + uint8_t m_tog; required_shared_ptr<uint8_t> m_p_videoram; optional_ioport m_io_modifiers; ioport_port *m_io_port[11]; required_device<cpu_device> m_maincpu; + optional_device<i8251_device> m_uart; }; // okean240 requires bit 4 to change READ8_MEMBER( okean240_state::okean240_kbd_status_r ) { + m_tog ^= 0x18; if (m_term_data) - return (machine().rand() & 0x10) | 2; + return m_tog | 2; else - return machine().rand() & 0x10; + return m_tog & 0x18; } // see if a key is pressed and indicate status READ8_MEMBER( okean240_state::okean240a_kbd_status_r ) { uint8_t i,j; + m_tog ^= 0x18; for (i = 0; i < 11; i++) { j = m_io_port[i]->read(); if (j) - return (machine().rand() & 0x10) | 2; + return m_tog | 2; } m_j = 0; - return machine().rand() & 0x10; + return m_tog & 0x18; } // for test rom @@ -140,7 +146,8 @@ READ8_MEMBER( okean240_state::okean240_keyboard_r ) else if (offset == 1) // port 41 bit 1 (test rom status bit) { - return (machine().rand() & 2); + m_tog ^= 6; + return m_tog; } else // port 42 (not used) return 0; @@ -168,7 +175,8 @@ READ8_MEMBER( okean240_state::okean240a_keyboard_r ) else if (offset == 1) // port 41 bits 6&7 (modifier keys), and bit 1 (test rom status bit) { - return (machine().rand() & 2) | m_io_modifiers->read(); + m_tog ^= 2; + return m_tog | m_io_modifiers->read(); } else // port 42 (get a row) { @@ -224,8 +232,8 @@ static ADDRESS_MAP_START(okean240a_io, AS_IO, 8, okean240_state) ADDRESS_MAP_GLOBAL_MASK(0xff) AM_RANGE(0x40, 0x42) AM_READWRITE(okean240a_keyboard_r,okean240_keyboard_w) AM_RANGE(0x80, 0x80) AM_READ(okean240a_kbd_status_r) - AM_RANGE(0xa0, 0xa0) AM_READ(term_r) - AM_RANGE(0xa1, 0xa1) AM_READ(term_status_r) + AM_RANGE(0xa0, 0xa0) AM_DEVREADWRITE("uart", i8251_device, data_r, data_w) + AM_RANGE(0xa1, 0xa1) AM_DEVREADWRITE("uart", i8251_device, status_r, control_w) AM_RANGE(0xc0, 0xc0) AM_WRITE(scroll_w) // AM_RANGE(0x00, 0x1f)=ppa00.data // AM_RANGE(0x20, 0x23)=dsk.data @@ -241,12 +249,14 @@ ADDRESS_MAP_END static ADDRESS_MAP_START(okean240t_io, AS_IO, 8, okean240_state) ADDRESS_MAP_GLOBAL_MASK(0xff) - AM_RANGE(0x40, 0x42) AM_READWRITE(okean240_keyboard_r,okean240_keyboard_w) + AM_RANGE(0x20, 0x23) AM_WRITENOP + AM_RANGE(0x40, 0x42) AM_READ(okean240_keyboard_r) AM_RANGE(0x80, 0x80) AM_READ(okean240_kbd_status_r) - AM_RANGE(0xa0, 0xa0) AM_DEVWRITE("terminal", generic_terminal_device, write) - AM_RANGE(0xa0, 0xa0) AM_READ(term_r) - AM_RANGE(0xa1, 0xa1) AM_READ(term_status_r) + AM_RANGE(0xa0, 0xa0) AM_DEVREADWRITE("uart", i8251_device, data_r, data_w) + AM_RANGE(0xa1, 0xa1) AM_DEVREADWRITE("uart", i8251_device, status_r, control_w) AM_RANGE(0xc0, 0xc0) AM_WRITE(scroll_w) + AM_RANGE(0xc1, 0xc3) AM_WRITENOP + AM_RANGE(0xe0, 0xe3) AM_WRITENOP ADDRESS_MAP_END /* Input ports */ @@ -472,6 +482,13 @@ static GFXDECODE_START( okean240a ) GFXDECODE_ENTRY( "maincpu", 0xef63, okean240_charlayout, 0, 1 ) GFXDECODE_END +// source of baud frequency is not documented, so we invent a clock +WRITE_LINE_MEMBER( okean240_state::clock_tick ) +{ + m_uart->write_txc(state); + m_uart->write_rxc(state); +} + static MACHINE_CONFIG_START( okean240t ) /* basic machine hardware */ @@ -479,8 +496,21 @@ static MACHINE_CONFIG_START( okean240t ) MCFG_CPU_PROGRAM_MAP(okean240_mem) MCFG_CPU_IO_MAP(okean240t_io) + MCFG_DEVICE_ADD("uart_clock", CLOCK, 153600) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(okean240_state, clock_tick)) + + MCFG_DEVICE_ADD("uart", I8251, 0) + MCFG_I8251_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd)) + MCFG_I8251_DTR_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_dtr)) + MCFG_I8251_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts)) + + MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "terminal") + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("uart", i8251_device, write_rxd)) + MCFG_RS232_DSR_HANDLER(DEVWRITELINE("uart", i8251_device, write_dsr)) + MCFG_RS232_CTS_HANDLER(DEVWRITELINE("uart", i8251_device, write_cts)) + /* video hardware */ - MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_ADD("screen1", RASTER) MCFG_SCREEN_REFRESH_RATE(50) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ MCFG_SCREEN_SIZE(256, 256) @@ -489,25 +519,26 @@ static MACHINE_CONFIG_START( okean240t ) MCFG_SCREEN_PALETTE("palette") MCFG_PALETTE_ADD_MONOCHROME("palette") - - MCFG_DEVICE_ADD("terminal", GENERIC_TERMINAL, 0) - MCFG_GENERIC_TERMINAL_KEYBOARD_CB(PUT(okean240_state, kbd_put)) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( okean240a, okean240t ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_IO_MAP(okean240a_io) MCFG_GFXDECODE_ADD("gfxdecode", "palette", okean240a) - MCFG_DEVICE_REMOVE("terminal") - MCFG_DEVICE_ADD("keyboard", GENERIC_KEYBOARD, 0) - MCFG_GENERIC_KEYBOARD_CB(PUT(okean240_state, kbd_put)) + MCFG_DEVICE_REMOVE("rs232") + MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "keyboard") + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("uart", i8251_device, write_rxd)) + MCFG_RS232_DSR_HANDLER(DEVWRITELINE("uart", i8251_device, write_dsr)) + MCFG_RS232_CTS_HANDLER(DEVWRITELINE("uart", i8251_device, write_cts)) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( okean240, okean240t ) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_IO_MAP(okean240_io) MCFG_GFXDECODE_ADD("gfxdecode", "palette", okean240) - MCFG_DEVICE_REMOVE("terminal") + MCFG_DEVICE_REMOVE("uart") + MCFG_DEVICE_REMOVE("uart_clock") + MCFG_DEVICE_REMOVE("rs232") MCFG_DEVICE_ADD("keyboard", GENERIC_KEYBOARD, 0) MCFG_GENERIC_KEYBOARD_CB(PUT(okean240_state, kbd_put)) MACHINE_CONFIG_END @@ -535,4 +566,4 @@ ROM_END // YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS COMP( 1986, okean240, 0, 0, okean240, okean240, okean240_state, okean240, "<unknown>", "Okeah-240", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) COMP( 1986, okean240a, okean240, 0, okean240a, okean240a, okean240_state, okean240, "<unknown>", "Ocean-240 with FDD", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) -COMP( 1986, okean240t, okean240, 0, okean240t, okean240, okean240_state, okean240, "<unknown>", "Ocean-240 Test ROM", MACHINE_NO_SOUND) +COMP( 1986, okean240t, okean240, 0, okean240t, okean240, okean240_state, okean240, "<unknown>", "Ocean-240 Test ROM", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) |