From ea31bce8ea27a5ad2785e8bdc22dd7295b7a9d51 Mon Sep 17 00:00:00 2001 From: Robbbert Date: Fri, 12 Jul 2019 15:50:14 +1000 Subject: [PATCH] (nw) poly88: used ascii keyboard (see assembly manual section 4.4) --- src/mame/drivers/poly88.cpp | 104 ++++++++----------------------- src/mame/includes/poly88.h | 28 +-------- src/mame/machine/poly88.cpp | 120 ------------------------------------ 3 files changed, 28 insertions(+), 224 deletions(-) diff --git a/src/mame/drivers/poly88.cpp b/src/mame/drivers/poly88.cpp index b588693a5a1..c4eed823ae1 100644 --- a/src/mame/drivers/poly88.cpp +++ b/src/mame/drivers/poly88.cpp @@ -7,6 +7,8 @@ Poly-88 driver by Miodrag Milanovic 2009-05-18 Initial implementation 2019-05-25 Poly8813 new roms +All input must be UPPERcase. + ToDo: - POLY88 - Polyphase format not working because 8251 device doesn't support sync. - POLY8813 - Schematic shows a 8251 on the main board. @@ -46,6 +48,7 @@ at least some models of the Poly-88 are known to have used.) #include "cpu/i8085/i8085.h" //#include "bus/s100/s100.h" #include "imagedev/cassette.h" +#include "machine/keyboard.h" #include "emupal.h" #include "screen.h" #include "speaker.h" @@ -87,94 +90,36 @@ void poly88_state::poly8813_io(address_map &map) { map.unmap_value_high(); map.global_mask(0xff); + map(0x00, 0x01).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); + map(0x04, 0x04).w(FUNC(poly88_state::baud_rate_w)); + map(0x08, 0x0b); //.r(ROM on for CPM).w(RTC reset); + map(0x0c, 0x0f); //.r(ROM off for CPM).w(Single-step trigger); + map(0x18, 0x18).r(FUNC(poly88_state::keyboard_r)); + map(0x20, 0x2f);//single-density fdc } /* Input ports */ static INPUT_PORTS_START( poly88 ) - PORT_START("LINEC") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED) - 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_START("CONFIG") PORT_CONFNAME( 0x80, 0x00, "Tape Mode") PORT_CONFSETTING( 0x00, "Byte (300 baud)") PORT_CONFSETTING( 0x80, "Polyphase (2400 baud)") - - PORT_START("LINE0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) - - PORT_START("LINE1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(":") PORT_CODE(KEYCODE_QUOTE) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(";") PORT_CODE(KEYCODE_COLON) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(",") PORT_CODE(KEYCODE_COMMA) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(".") PORT_CODE(KEYCODE_STOP) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("/") PORT_CODE(KEYCODE_SLASH) - - PORT_START("LINE2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("@") PORT_CODE(KEYCODE_END) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) - - PORT_START("LINE3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) - - PORT_START("LINE4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) - - PORT_START("LINE5") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("[") PORT_CODE(KEYCODE_OPENBRACE) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\\") PORT_CODE(KEYCODE_BACKSLASH) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("]") PORT_CODE(KEYCODE_CLOSEBRACE) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("~") PORT_CODE(KEYCODE_TILDE) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("DEL")PORT_CODE(KEYCODE_BACKSPACE) - - PORT_START("LINE6") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("LF") PORT_CODE(KEYCODE_RALT) INPUT_PORTS_END +void poly88_state::kbd_put(u8 data) +{ + if (data) + { + if (data==8) + data=127; // fix backspace + m_last_code = data; + m_int_vector = 0xef; + m_maincpu->set_input_line(0, HOLD_LINE); + } +} + + /* F4 Character Displayer */ static const gfx_layout poly88_charlayout = { @@ -234,6 +179,9 @@ void poly88_state::poly88(machine_config &config) MM5307AA(config, m_brg, 16.5888_MHz_XTAL / 18); m_brg->output_cb().set(FUNC(poly88_state::cassette_clock_w)); + generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0)); + keyboard.set_keyboard_callback(FUNC(poly88_state::kbd_put)); + /* snapshot */ SNAPSHOT(config, "snapshot", "img", attotime::from_seconds(2)).set_load_callback(FUNC(poly88_state::snapshot_cb), this); } diff --git a/src/mame/includes/poly88.h b/src/mame/includes/poly88.h index 1cc3dbbacc0..93a90caa2e7 100644 --- a/src/mame/includes/poly88.h +++ b/src/mame/includes/poly88.h @@ -19,12 +19,6 @@ class poly88_state : public driver_device { public: - enum - { - TIMER_USART, - TIMER_KEYBOARD - }; - poly88_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_video_ram(*this, "video_ram") @@ -32,14 +26,7 @@ public: , m_usart(*this, "usart") , m_brg(*this, "brg") , m_cassette(*this, "cassette") - , m_linec(*this, "LINEC") - , m_line0(*this, "LINE0") - , m_line1(*this, "LINE1") - , m_line2(*this, "LINE2") - , m_line3(*this, "LINE3") - , m_line4(*this, "LINE4") - , m_line5(*this, "LINE5") - , m_line6(*this, "LINE6") + , m_linec(*this, "CONFIG") { } void poly88(machine_config &config); @@ -52,8 +39,6 @@ private: uint8_t *m_FNT; uint8_t m_last_code; uint8_t m_int_vector; - emu_timer * m_usart_timer; - emu_timer * m_keyboard_timer; void baud_rate_w(uint8_t data); uint8_t keyboard_r(); void intr_w(uint8_t data); @@ -63,9 +48,9 @@ private: virtual void video_start() override; uint32_t screen_update_poly88(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(poly88_interrupt); - TIMER_CALLBACK_MEMBER(keyboard_callback); TIMER_DEVICE_CALLBACK_MEMBER(kansas_r); DECLARE_WRITE_LINE_MEMBER(cassette_clock_w); + void kbd_put(u8 data); DECLARE_WRITE_LINE_MEMBER(usart_ready_w); IRQ_CALLBACK_MEMBER(poly88_irq_callback); DECLARE_SNAPSHOT_LOAD_MEMBER(snapshot_cb); @@ -80,15 +65,6 @@ private: required_device m_brg; required_device m_cassette; required_ioport m_linec; - required_ioport m_line0; - required_ioport m_line1; - required_ioport m_line2; - required_ioport m_line3; - required_ioport m_line4; - required_ioport m_line5; - required_ioport m_line6; - uint8_t row_number(uint8_t code); - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; }; #endif // MAME_INCLUDES_POLY88_H diff --git a/src/mame/machine/poly88.cpp b/src/mame/machine/poly88.cpp index dec62c27b59..3ab75038dcc 100644 --- a/src/mame/machine/poly88.cpp +++ b/src/mame/machine/poly88.cpp @@ -10,23 +10,9 @@ #include "emu.h" #include "cpu/i8085/i8085.h" -#include "imagedev/cassette.h" #include "includes/poly88.h" -void poly88_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - switch (id) - { - case TIMER_KEYBOARD: - keyboard_callback(ptr, param); - break; - default: - assert_always(false, "Unknown id in poly88_state::device_timer"); - } -} - - // bits 0-3 baud rate; bit 4 (0=cassette, 1=rs232); bit 5 (1=disable rom and ram) void poly88_state::baud_rate_w(uint8_t data) { @@ -34,110 +20,6 @@ void poly88_state::baud_rate_w(uint8_t data) m_brg->control_w(data & 15); } -uint8_t poly88_state::row_number(uint8_t code) { - if (BIT(code,0)) return 0; - if (BIT(code,1)) return 1; - if (BIT(code,2)) return 2; - if (BIT(code,3)) return 3; - if (BIT(code,4)) return 4; - if (BIT(code,5)) return 5; - if (BIT(code,6)) return 6; - if (BIT(code,7)) return 7; - return 0; -} - -TIMER_CALLBACK_MEMBER(poly88_state::keyboard_callback) -{ - int i; - uint8_t code; - uint8_t key_code = 0; - uint8_t shift = m_linec->read() & 0x02 ? 1 : 0; - uint8_t ctrl = m_linec->read() & 0x01 ? 1 : 0; - - for(i = 0; i < 7; i++) - { - switch ( i ) - { - case 0: code = m_line0->read(); break; - case 1: code = m_line1->read(); break; - case 2: code = m_line2->read(); break; - case 3: code = m_line3->read(); break; - case 4: code = m_line4->read(); break; - case 5: code = m_line5->read(); break; - case 6: code = m_line6->read(); break; - default: code = 0; - } - if (code != 0) - { - if (i==0 && shift==0) { - key_code = 0x30 + row_number(code) + 8*i; // for numbers and some signs - } - if (i==0 && shift==1) { - key_code = 0x20 + row_number(code) + 8*i; // for shifted numbers - } - if (i==1 && shift==0) { - if (row_number(code) < 4) { - key_code = 0x30 + row_number(code) + 8*i; // for numbers and some signs - } else { - key_code = 0x20 + row_number(code) + 8*i; // for numbers and some signs - } - } - if (i==1 && shift==1) { - if (row_number(code) < 4) { - key_code = 0x20 + row_number(code) + 8*i; // for numbers and some signs - } else { - key_code = 0x30 + row_number(code) + 8*i; // for numbers and some signs - } - } - if (i>=2 && i<=4 && shift==1 && ctrl==0) { - key_code = 0x60 + row_number(code) + (i-2)*8; // for small letters - } - if (i>=2 && i<=4 && shift==0 && ctrl==0) { - key_code = 0x40 + row_number(code) + (i-2)*8; // for big letters - } - if (i>=2 && i<=4 && ctrl==1) { - key_code = 0x00 + row_number(code) + (i-2)*8; // for CTRL + letters - } - if (i==5 && shift==1 && ctrl==0) { - if (row_number(code)<7) { - key_code = 0x60 + row_number(code) + (i-2)*8; // for small letters - } else { - key_code = 0x40 + row_number(code) + (i-2)*8; // for signs it is switched - } - } - if (i==5 && shift==0 && ctrl==0) { - if (row_number(code)<7) { - key_code = 0x40 + row_number(code) + (i-2)*8; // for small letters - } else { - key_code = 0x60 + row_number(code) + (i-2)*8; // for signs it is switched - } - } - if (i==5 && shift==0 && ctrl==1) { - key_code = 0x00 + row_number(code) + (i-2)*8; // for letters + ctrl - } - if (i==6) { - switch(row_number(code)) - { - case 0: key_code = 0x11; break; - case 1: key_code = 0x12; break; - case 2: key_code = 0x13; break; - case 3: key_code = 0x14; break; - case 4: key_code = 0x20; break; // Space - case 5: key_code = 0x0D; break; // Enter - case 6: key_code = 0x09; break; // TAB - case 7: key_code = 0x0A; break; // LF - } - } - } - } - if (key_code==0 && m_last_code !=0){ - m_int_vector = 0xef; - m_maincpu->set_input_line(0, HOLD_LINE); - } else { - m_last_code = key_code; - } -} - IRQ_CALLBACK_MEMBER(poly88_state::poly88_irq_callback) { return m_int_vector; @@ -224,8 +106,6 @@ WRITE_LINE_MEMBER(poly88_state::cassette_clock_w) void poly88_state::init_poly88() { - m_keyboard_timer = timer_alloc(TIMER_KEYBOARD); - m_keyboard_timer->adjust(attotime::from_hz(24000), 0, attotime::from_hz(24000)); } void poly88_state::machine_reset()