diff options
author | Robbbert <Robbbert@users.noreply.github.com> | 2018-07-25 01:22:32 +1000 |
---|---|---|
committer | Robbbert <Robbbert@users.noreply.github.com> | 2018-07-25 01:22:32 +1000 |
commit | 6e0055ccd7c8a525f3841599b8c6310e5bd2fbc5 (patch) | |
tree | b8db09d547063dcc1e87f7a5c8d1351866707974 | |
parent | b9d25274372f02905a562704dc8cabead42c8817 (diff) |
(nw) trs80m3 - bit more wip
-rw-r--r-- | src/mame/drivers/trs80m3.cpp | 88 | ||||
-rw-r--r-- | src/mame/includes/trs80m3.h | 7 | ||||
-rw-r--r-- | src/mame/machine/trs80m3.cpp | 47 |
3 files changed, 58 insertions, 84 deletions
diff --git a/src/mame/drivers/trs80m3.cpp b/src/mame/drivers/trs80m3.cpp index 3b55eab2995..db8b3b44b6d 100644 --- a/src/mame/drivers/trs80m3.cpp +++ b/src/mame/drivers/trs80m3.cpp @@ -23,7 +23,6 @@ EA: - UART status (read and write) on a Model III/4 E9: -- UART Configuration jumpers (read) on a Model III/4 - Set baud rate (Model III/4) E8: @@ -34,19 +33,18 @@ Model 4 - C0-CF = hard drive (optional) - 90-93 write sound (optional) - 80-8F hires graphics (optional) +Shift and Right-arrow will enable 32 cpl. + About the RTC - The time is incremented while ever the cursor is flashing. It is stored in a series of bytes in the computer's work area. The bytes are in a certain order, this is: - seconds, minutes, hours, year, day, month. On a model 1, the seconds are stored at - 0x4041, while on the model 4 it is 0x4217. A reboot always sets the time to zero. + seconds, minutes, hours, year, day, month. The seconds are stored at 0x4217. + A reboot always sets the time to zero. Model 4 memory organisation - Mode 0: ROM=0-37E7 and 37EA-3FFF; Printer=37E8-37E9; Keyboard=3800-3BFF; Video=3C00-3FFF Mode 1: Keyboard and Video as above; 0-3FFF read=ROM and write=RAM Mode 2: Keyboard=F400-F7FF; Video=F800-FFFF; the rest is RAM Mode 3: All RAM - In the "maincpu" memory map, the first 64k is given to the ROM, keyboard, printer and video, - while the second 64k is RAM that is switched in as needed. The area from 4800-FFFF - is considered a "black hole", any writes to there will disappear. The video is organised as 2 banks of 0x400 bytes, except in Mode 2 where it becomes contiguous. Model 4P - is the same as Model 4 except: @@ -96,7 +94,7 @@ void trs80m3_state::m3_io(address_map &map) map(0xe0, 0xe3).rw(FUNC(trs80m3_state::port_e0_r), FUNC(trs80m3_state::port_e0_w)); map(0xe4, 0xe4).rw(FUNC(trs80m3_state::port_e4_r), FUNC(trs80m3_state::port_e4_w)); map(0xe8, 0xe8).rw(FUNC(trs80m3_state::port_e8_r), FUNC(trs80m3_state::port_e8_w)); - map(0xe9, 0xe9).portr("E9").w(m_brg, FUNC(com8116_device::stt_str_w)); + map(0xe9, 0xe9).w(m_brg, FUNC(com8116_device::stt_str_w)); map(0xea, 0xea).rw(FUNC(trs80m3_state::port_ea_r), FUNC(trs80m3_state::port_ea_w)); map(0xeb, 0xeb).rw(m_uart, FUNC(ay31015_device::receive), FUNC(ay31015_device::transmit)); map(0xec, 0xef).rw(FUNC(trs80m3_state::port_ec_r), FUNC(trs80m3_state::port_ec_w)); @@ -208,8 +206,8 @@ void trs80m3_state::cp500_io(address_map &map) static INPUT_PORTS_START( trs80m4p ) PORT_START("LINE0") - PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("@") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@') - PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') + PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("@") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@') + PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') PORT_BIT(0x10, 0x00, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') @@ -241,64 +239,49 @@ static INPUT_PORTS_START( trs80m4p ) PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') - PORT_BIT(0xF8, 0x00, IPT_UNUSED) + PORT_BIT(0xF8, 0x00, IPT_UNUSED) // these bits were tested and do nothing useful PORT_START("LINE4") - PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(UCHAR_MAMEKEY(0_PAD)) - PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') PORT_CHAR(UCHAR_MAMEKEY(1_PAD)) - PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') PORT_CHAR(UCHAR_MAMEKEY(2_PAD)) - PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') PORT_CHAR(UCHAR_MAMEKEY(3_PAD)) - PORT_BIT(0x10, 0x00, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') PORT_CHAR(UCHAR_MAMEKEY(4_PAD)) - PORT_BIT(0x20, 0x00, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') PORT_CHAR(UCHAR_MAMEKEY(5_PAD)) - PORT_BIT(0x40, 0x00, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') PORT_CHAR(UCHAR_MAMEKEY(6_PAD)) - PORT_BIT(0x80, 0x00, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') PORT_CHAR(UCHAR_MAMEKEY(7_PAD)) + PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0') + PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') PORT_CHAR('!') + PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') PORT_CHAR('"') + PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') PORT_CHAR('#') + PORT_BIT(0x10, 0x00, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4') PORT_CHAR('$') + PORT_BIT(0x20, 0x00, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5') PORT_CHAR('%') + PORT_BIT(0x40, 0x00, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6') PORT_CHAR('&') + PORT_BIT(0x80, 0x00, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7') PORT_CHAR('\'') PORT_START("LINE5") - PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') PORT_CHAR(UCHAR_MAMEKEY(8_PAD)) - PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') PORT_CHAR(UCHAR_MAMEKEY(9_PAD)) + PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8') PORT_CHAR('(') + PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9') PORT_CHAR(')') PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME(": *") PORT_CODE(KEYCODE_MINUS) PORT_CHAR(':') PORT_CHAR('*') PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME("; +") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') PORT_BIT(0x10, 0x00, IPT_KEYBOARD) PORT_NAME(", <") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') PORT_BIT(0x20, 0x00, IPT_KEYBOARD) PORT_NAME("- =") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('-') PORT_CHAR('=') - PORT_BIT(0x40, 0x00, IPT_KEYBOARD) PORT_NAME(". >") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) + PORT_BIT(0x40, 0x00, IPT_KEYBOARD) PORT_NAME(". >") PORT_CODE(KEYCODE_STOP) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR('.') PORT_CHAR('>') PORT_BIT(0x80, 0x00, IPT_KEYBOARD) PORT_NAME("/ ?") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') PORT_START("LINE6") - PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD)) - PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("Clear") PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(F8)) // 3rd line, 1st key from right - PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("Break") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(F9)) // 1st line, 1st key from right - PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) - PORT_BIT(0x10, 0x00, IPT_KEYBOARD) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) + PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CHAR(13) + PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("Clear") PORT_CODE(KEYCODE_HOME) PORT_CHAR(UCHAR_MAMEKEY(F8)) + PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("Break") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(F9)) + PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) + PORT_BIT(0x10, 0x00, IPT_KEYBOARD) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) /* backspace do the same as cursor left */ PORT_BIT(0x20, 0x00, IPT_KEYBOARD) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) - PORT_BIT(0x40, 0x00, IPT_KEYBOARD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) - PORT_BIT(0x80, 0x00, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') + PORT_BIT(0x40, 0x00, IPT_KEYBOARD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) + PORT_BIT(0x80, 0x00, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') PORT_START("LINE7") - PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) - /* These keys are only on a Model 4. The one marked CTL seems to be another shift key (4 in total). */ + PORT_BIT(0x01, 0x00, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_BIT(0x02, 0x00, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT) + // These keys are only on a Model 4. These bits do nothing on Model 3. PORT_BIT(0x04, 0x00, IPT_KEYBOARD) PORT_NAME("CTL") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2) - PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME("Caps") PORT_CODE(KEYCODE_CAPSLOCK) - PORT_BIT(0x10, 0x00, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) + PORT_BIT(0x08, 0x00, IPT_KEYBOARD) PORT_NAME("Caps") PORT_CODE(KEYCODE_CAPSLOCK) // When activated, lowercase entry is possible + PORT_BIT(0x10, 0x00, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) // prints tic character PORT_BIT(0x20, 0x00, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) PORT_BIT(0x40, 0x00, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) PORT_BIT(0x80, 0x00, IPT_UNUSED) - - PORT_START("E9") // these are the power-on uart settings - PORT_BIT(0x07, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_DIPNAME( 0x88, 0x08, "Parity") - PORT_DIPSETTING( 0x08, DEF_STR(None)) - PORT_DIPSETTING( 0x00, "Odd") - PORT_DIPSETTING( 0x80, "Even") - PORT_DIPNAME( 0x10, 0x10, "Stop Bits") - PORT_DIPSETTING( 0x10, "2") - PORT_DIPSETTING( 0x00, "1") - PORT_DIPNAME( 0x60, 0x60, "Bits") - PORT_DIPSETTING( 0x00, "5") - PORT_DIPSETTING( 0x20, "6") - PORT_DIPSETTING( 0x40, "7") - PORT_DIPSETTING( 0x60, "8") INPUT_PORTS_END static INPUT_PORTS_START( trs80m3 ) @@ -378,11 +361,6 @@ MACHINE_CONFIG_START(trs80m3_state::model3) MCFG_FLOPPY_DRIVE_SOUND(true) MCFG_FLOPPY_DRIVE_ADD("fdc:1", trs80_floppies, "sssd", trs80m3_state::floppy_formats) MCFG_FLOPPY_DRIVE_SOUND(true) - // Optional external unit - MCFG_FLOPPY_DRIVE_ADD("fdc:2", trs80_floppies, "", trs80m3_state::floppy_formats) - MCFG_FLOPPY_DRIVE_SOUND(true) - MCFG_FLOPPY_DRIVE_ADD("fdc:3", trs80_floppies, "", trs80m3_state::floppy_formats) - MCFG_FLOPPY_DRIVE_SOUND(true) MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer") MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit7)) @@ -404,8 +382,6 @@ MACHINE_CONFIG_START(trs80m3_state::model3) //MCFG_AY31015_WRITE_DAV_CB(WRITELINE( , , )) MCFG_AY31015_AUTO_RDAV(true) MCFG_DEVICE_ADD("rs232", RS232_PORT, default_rs232_devices, nullptr) - - MCFG_MACHINE_RESET_OVERRIDE(trs80m3_state, trs80m3) MACHINE_CONFIG_END MACHINE_CONFIG_START(trs80m3_state::model4) @@ -448,8 +424,6 @@ MACHINE_CONFIG_START(trs80m3_state::cp500) model3(config); MCFG_DEVICE_MODIFY("maincpu") MCFG_DEVICE_IO_MAP(cp500_io) - - MCFG_MACHINE_RESET_OVERRIDE(trs80m3_state, cp500) MACHINE_CONFIG_END /*************************************************************************** @@ -547,5 +521,5 @@ void trs80m3_state::init_trs80m4p() // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS COMP( 1980, trs80m3, 0, trs80l2, model3, trs80m3, trs80m3_state, init_trs80m3, "Tandy Radio Shack", "TRS-80 Model III", 0 ) COMP( 1980, trs80m4, trs80m3, 0, model4, trs80m3, trs80m3_state, init_trs80m4, "Tandy Radio Shack", "TRS-80 Model 4", 0 ) -COMP( 1983, trs80m4p, trs80m3, 0, model4p, trs80m4p, trs80m3_state, init_trs80m4p, "Tandy Radio Shack", "TRS-80 Model 4P", 0 ) +COMP( 1983, trs80m4p, trs80m3, 0, model4p, trs80m4p, trs80m3_state, init_trs80m4p, "Tandy Radio Shack", "TRS-80 Model 4P", MACHINE_NOT_WORKING ) COMP( 1982, cp500, trs80m3, 0, cp500, trs80m3, trs80m3_state, init_trs80m3, "Prológica", "CP-500 (PVIII REV.3)", 0 ) diff --git a/src/mame/includes/trs80m3.h b/src/mame/includes/trs80m3.h index 446b03757cf..bbce370cea8 100644 --- a/src/mame/includes/trs80m3.h +++ b/src/mame/includes/trs80m3.h @@ -44,8 +44,6 @@ public: , m_fdc(*this, "fdc") , m_floppy0(*this, "fdc:0") , m_floppy1(*this, "fdc:1") - , m_floppy2(*this, "fdc:2") - , m_floppy3(*this, "fdc:3") , m_speaker(*this, "speaker") , m_cassette(*this, "cassette") , m_io_config(*this, "CONFIG") @@ -98,8 +96,6 @@ private: DECLARE_WRITE_LINE_MEMBER(intrq_w); DECLARE_WRITE_LINE_MEMBER(drq_w); DECLARE_QUICKLOAD_LOAD_MEMBER(trs80_cmd); - DECLARE_MACHINE_RESET(trs80m3); - DECLARE_MACHINE_RESET(cp500); uint32_t screen_update_trs80m3(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); void cp500_io(address_map &map); @@ -126,6 +122,7 @@ private: uint8_t m_size_store; bool m_a11_flipflop; uint16_t m_timeout; + bool m_wait; floppy_image_device *m_floppy; virtual void machine_start() override; virtual void machine_reset() override; @@ -142,8 +139,6 @@ private: optional_device<fd1793_device> m_fdc; optional_device<floppy_connector> m_floppy0; optional_device<floppy_connector> m_floppy1; - optional_device<floppy_connector> m_floppy2; - optional_device<floppy_connector> m_floppy3; required_device<speaker_sound_device> m_speaker; required_device<cassette_image_device> m_cassette; optional_ioport m_io_config; diff --git a/src/mame/machine/trs80m3.cpp b/src/mame/machine/trs80m3.cpp index 50ed486a217..0fdd073f562 100644 --- a/src/mame/machine/trs80m3.cpp +++ b/src/mame/machine/trs80m3.cpp @@ -86,7 +86,9 @@ READ8_MEMBER( trs80m3_state::port_e4_r ) m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); - return ~(m_nmi_mask & m_nmi_data); + u8 data = m_nmi_data; + m_nmi_data = 0; + return ~(m_nmi_mask & data); } READ8_MEMBER( trs80m3_state::port_e8_r ) @@ -375,13 +377,12 @@ WRITE8_MEMBER( trs80m3_state::port_ec_w ) WRITE8_MEMBER( trs80m3_state::port_f4_w ) { m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, BIT(data, 6) ? ASSERT_LINE : CLEAR_LINE); + m_wait = BIT(data, 6); m_floppy = nullptr; if (BIT(data, 0)) m_floppy = m_floppy0->get_device(); if (BIT(data, 1)) m_floppy = m_floppy1->get_device(); - if (BIT(data, 2)) m_floppy = m_floppy2->get_device(); - if (BIT(data, 3)) m_floppy = m_floppy3->get_device(); m_fdc->set_floppy(m_floppy); @@ -389,7 +390,7 @@ WRITE8_MEMBER( trs80m3_state::port_f4_w ) { m_floppy->mon_w(0); m_floppy->ss_w(BIT(data, 4)); - m_timeout = 160; + m_timeout = 1600; } m_fdc->dden_w(!BIT(data, 7)); @@ -431,6 +432,17 @@ INTERRUPT_GEN_MEMBER(trs80m3_state::rtc_interrupt) if (m_floppy) m_floppy->mon_w(1); // motor off } + // Also, if cpu is in wait, unlock it and trigger NMI + if (m_wait) + { + m_wait = false; + m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); + if (BIT(m_nmi_mask, 6)) + { + m_nmi_data |= 0x40; + m_maincpu->set_input_line(INPUT_LINE_NMI, HOLD_LINE); + } + } } // The floppy sector has been read. Enable CPU and NMI. @@ -438,23 +450,25 @@ WRITE_LINE_MEMBER(trs80m3_state::intrq_w) { if (state) { - //m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); + m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); + m_wait = false; if (BIT(m_nmi_mask, 7)) { - m_nmi_data = 0x80; + m_nmi_data |= 0x80; //m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); m_maincpu->set_input_line(INPUT_LINE_NMI, HOLD_LINE); } } - else - m_nmi_data = 0; } // The next byte from floppy is available. Enable CPU so it can get the byte. WRITE_LINE_MEMBER(trs80m3_state::drq_w) { if (state) + { m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); + m_wait = false; + } } @@ -508,8 +522,9 @@ void trs80m3_state::machine_start() { m_mode = 0; m_reg_load = 1; - m_nmi_data = 0xff; + m_nmi_data = 0; m_timeout = 1; + m_wait = 0; m_cassette_data_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(trs80m3_state::cassette_data_callback),this)); m_cassette_data_timer->adjust( attotime::zero, 0, attotime::from_hz(11025) ); @@ -557,14 +572,10 @@ void trs80m3_state::machine_start() void trs80m3_state::machine_reset() { - m_cassette_data = 0; -} - -MACHINE_RESET_MEMBER(trs80m3_state, trs80m3) -{ - address_space &mem = m_maincpu->space(AS_PROGRAM); + m_a11_flipflop = 0; // for cp500 m_cassette_data = 0; m_size_store = 0xff; + address_space &mem = m_maincpu->space(AS_PROGRAM); if (m_model4 & 4) port_9c_w(mem, 0, 1); // 4P - enable rom @@ -572,12 +583,6 @@ MACHINE_RESET_MEMBER(trs80m3_state, trs80m3) port_84_w(mem, 0, 0); // 4 & 4P - switch in devices } -MACHINE_RESET_MEMBER(trs80m3_state, cp500) -{ - m_a11_flipflop = 0; - MACHINE_RESET_CALL_MEMBER( trs80m3 ); -} - /*************************************************************************** PARAMETERS |