From 0cfb056fbac1cfca8348b91482490bde54a1bfb1 Mon Sep 17 00:00:00 2001 From: Robbbert Date: Sun, 18 Aug 2019 20:40:19 +1000 Subject: (nw) mfabfz : added a cassette interface --- src/mame/drivers/mfabfz.cpp | 111 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 101 insertions(+), 10 deletions(-) diff --git a/src/mame/drivers/mfabfz.cpp b/src/mame/drivers/mfabfz.cpp index 4aa0429258e..139dc39b24f 100644 --- a/src/mame/drivers/mfabfz.cpp +++ b/src/mame/drivers/mfabfz.cpp @@ -35,16 +35,22 @@ T Trace interval Pressing enter will change the prompt from KMD > to KMD+> and pressing space will change it back. -mfabfz85 -bios 1 : produces no output -others are working +mfabfz85 -bios 0 and 3 work; others produce rubbish. + +Cassette: +- Unable to locate handbook 4.4.a which deals with the CMT. +- It is known to use a 8251 UART at ports FE/FF. +- So, added a 1200 baud Kansas City interface, which works. ****************************************************************************/ #include "emu.h" #include "cpu/i8085/i8085.h" +#include "imagedev/cassette.h" #include "machine/clock.h" #include "machine/i8251.h" #include "bus/rs232/rs232.h" +#include "speaker.h" class mfabfz_state : public driver_device @@ -53,6 +59,8 @@ public: mfabfz_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") + , m_cass(*this, "cassette") + , m_uart(*this, "uart2") { } void mfabfz85(machine_config &config); @@ -63,7 +71,13 @@ private: void mfabfz_io(address_map &map); void mfabfz_mem(address_map &map); virtual void machine_reset() override; + DECLARE_WRITE_LINE_MEMBER(kansas_r); + DECLARE_WRITE_LINE_MEMBER(kansas_w); + u8 m_cass_data[4]; + bool m_cassoutbit, m_cassold; required_device m_maincpu; + required_device m_cass; + required_device m_uart; }; @@ -94,8 +108,63 @@ static INPUT_PORTS_START( mfabfz ) INPUT_PORTS_END +WRITE_LINE_MEMBER( mfabfz_state::kansas_w ) +{ + if ((m_cass->get_state() & CASSETTE_MASK_UISTATE) == CASSETTE_RECORD) + { + // incoming @76923Hz + u8 twobit = m_cass_data[3] & 63; + + if (state) + { + if (twobit == 0) + m_cassold = m_cassoutbit; + + if (m_cassold) + m_cass->output(BIT(m_cass_data[3], 4) ? -1.0 : +1.0); // 2400Hz + else + m_cass->output(BIT(m_cass_data[3], 5) ? -1.0 : +1.0); // 1200Hz + + m_cass_data[3]++; + } + } + + m_uart->write_txc(state); +} + +WRITE_LINE_MEMBER(mfabfz_state::kansas_r) +{ + // incoming @76923Hz + // no tape - set to idle + m_cass_data[1]++; + if (m_cass_data[1] > 192) + { + m_cass_data[1] = 192; + m_uart->write_rxd(1); + } + + if ((m_cass->get_state() & CASSETTE_MASK_UISTATE) != CASSETTE_PLAY) + return; + + /* cassette - turn 1200/2400Hz to a bit */ + m_cass_data[1]++; + uint8_t cass_ws = (m_cass->input() > +0.04) ? 1 : 0; + + if (cass_ws != m_cass_data[0]) + { + m_cass_data[0] = cass_ws; + m_uart->write_rxd((m_cass_data[1] < 96) ? 1 : 0); + m_cass_data[1] = 0; + } + m_uart->write_rxc(state); +} + void mfabfz_state::machine_reset() { + m_cass_data[0] = m_cass_data[1] = m_cass_data[2] = m_cass_data[3] = 0; + m_cassoutbit = m_cassold = 1; + m_uart->write_rxd(1); + m_uart->write_cts(0); } @@ -106,8 +175,8 @@ void mfabfz_state::mfabfz(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &mfabfz_state::mfabfz_mem); m_maincpu->set_addrmap(AS_IO, &mfabfz_state::mfabfz_io); - // uart1 - terminal - clock hardware unknown - clock_device &uart1_clock(CLOCK(config, "uart1_clock", 153600)); + // uart1 - terminal + clock_device &uart1_clock(CLOCK(config, "uart1_clock", 4_MHz_XTAL / 26)); uart1_clock.signal_handler().set("uart1", FUNC(i8251_device::write_txc)); uart1_clock.signal_handler().append("uart1", FUNC(i8251_device::write_rxc)); @@ -122,7 +191,18 @@ void mfabfz_state::mfabfz(machine_config &config) rs232.cts_handler().set("uart1", FUNC(i8251_device::write_cts)); // uart2 - cassette - clock comes from 2MHz through a divider consisting of 4 chips and some jumpers. - I8251(config, "uart2", 0); + I8251(config, m_uart, 4_MHz_XTAL / 2); + m_uart->txd_handler().set([this] (bool state) { m_cassoutbit = state; }); + + clock_device &uart_clock(CLOCK(config, "uart_clock", 4_MHz_XTAL / 52)); + uart_clock.signal_handler().set(FUNC(mfabfz_state::kansas_w)); + uart_clock.signal_handler().append(FUNC(mfabfz_state::kansas_r)); + + // cassette is connected to the uart + CASSETTE(config, m_cass); + m_cass->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED); + SPEAKER(config, "mono").front_center(); + m_cass->add_route(ALL_OUTPUTS, "mono", 0.05); } static DEVICE_INPUT_DEFAULTS_START( terminal ) @@ -146,7 +226,18 @@ void mfabfz_state::mfabfz85(machine_config &config) rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "terminal")); rs232.set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(terminal)); - I8251(config, "uart2", 0); + I8251(config, m_uart, 4_MHz_XTAL / 2); + m_uart->txd_handler().set([this] (bool state) { m_cassoutbit = state; }); + + clock_device &uart_clock(CLOCK(config, "uart_clock", 4_MHz_XTAL / 52)); + uart_clock.signal_handler().set(FUNC(mfabfz_state::kansas_w)); + uart_clock.signal_handler().append(FUNC(mfabfz_state::kansas_r)); + + // cassette is connected to the uart + CASSETTE(config, m_cass); + m_cass->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_ENABLED); + SPEAKER(config, "mono").front_center(); + m_cass->add_route(ALL_OUTPUTS, "mono", 0.05); } @@ -158,14 +249,14 @@ ROM_END ROM_START( mfabfz85 ) ROM_REGION( 0x8000, "roms", 0 ) - ROM_SYSTEM_BIOS( 0, "32k", "MAT32K v1.8s" ) // 1982, not working + ROM_SYSTEM_BIOS( 0, "32k", "MAT32K v1.8s" ) // 1982, 4800, 8N2, txd-invert ROMX_LOAD( "mfa_mat32k_vers.1.8-s_ic0.bin", 0x0000, 0x8000, CRC(021d7dff) SHA1(aa34b3a8bac52fc7746d35f5ffc6328734788cc2), ROM_BIOS(0) ) ROM_SYSTEM_BIOS( 1, "8k", "MAT85 8k" ) // 1982, not working ROMX_LOAD( "mfa_mat_1_0000.bin", 0x0000, 0x0800, CRC(73b588ea) SHA1(2b9570fe44c3c19d6aa7c7c11ecf390fa5d48998), ROM_BIOS(1) ) ROMX_LOAD( "mfa_mat_2_0800.bin", 0x0800, 0x0800, CRC(13f5be91) SHA1(2b9d64600679bab319a37381fc84e874c3b2a877), ROM_BIOS(1) ) ROMX_LOAD( "mfa_mat_3_1000.bin", 0x1000, 0x0800, CRC(c9b91bb4) SHA1(ef829964f507b1f6bbcf3c557c274fe728636efe), ROM_BIOS(1) ) ROMX_LOAD( "mfa_mat_4_1800.bin", 0x1800, 0x0800, CRC(649cd7f0) SHA1(e92f29c053234b36f22d525fe92e61bf24476f14), ROM_BIOS(1) ) - ROM_SYSTEM_BIOS( 2, "16k_set1", "MAT85+ 16k set1" ) + ROM_SYSTEM_BIOS( 2, "16k_set1", "MAT85+ 16k set1" ) // not working ROMX_LOAD( "mfa_mat85_0x0000-0x07ff.bin", 0x0000, 0x0800, CRC(73b588ea) SHA1(2b9570fe44c3c19d6aa7c7c11ecf390fa5d48998), ROM_BIOS(2) ) ROMX_LOAD( "mfa_mat85_0x0800-0x0fff.bin", 0x0800, 0x0800, CRC(13f5be91) SHA1(2b9d64600679bab319a37381fc84e874c3b2a877), ROM_BIOS(2) ) ROMX_LOAD( "mfa_mat85_0x1000-0x17ff.bin", 0x1000, 0x0800, CRC(c9b91bb4) SHA1(ef829964f507b1f6bbcf3c557c274fe728636efe), ROM_BIOS(2) ) @@ -174,7 +265,7 @@ ROM_START( mfabfz85 ) ROMX_LOAD( "mfa_mat85_0x2800-0x2fff.bin", 0x2800, 0x0800, CRC(9a6aafa9) SHA1(af897e91cc2ce5d6e49fa88c920ad85e1f0209bf), ROM_BIOS(2) ) ROMX_LOAD( "mfa_mat85_0x3000-0x37ff.bin", 0x3000, 0x0800, CRC(eae4e3d5) SHA1(f7112965874417bbfc4a32f31f84e1db83249ab7), ROM_BIOS(2) ) ROMX_LOAD( "mfa_mat85_0x3800-0x3fff.bin", 0x3800, 0x0800, CRC(536db0e3) SHA1(328ccc18455f710390c29c0fd0f4b0713a4a69ae), ROM_BIOS(2) ) - ROM_SYSTEM_BIOS( 3, "16k_set2", "MAT85+ 16k set2" ) + ROM_SYSTEM_BIOS( 3, "16k_set2", "MAT85+ 16k set2" ) // 2400, 7O2, txd-invert ROMX_LOAD( "mat85_1_1of8.bin", 0x0000, 0x0800, CRC(73b588ea) SHA1(2b9570fe44c3c19d6aa7c7c11ecf390fa5d48998), ROM_BIOS(3) ) ROMX_LOAD( "mat85_2_2of8.bin", 0x0800, 0x0800, CRC(c97acc82) SHA1(eedb27c19a2d21b5ec5bca6cafeb25584e21e500), ROM_BIOS(3) ) ROMX_LOAD( "mat85_3_3of8.bin", 0x1000, 0x0800, CRC(c9b91bb4) SHA1(ef829964f507b1f6bbcf3c557c274fe728636efe), ROM_BIOS(3) ) @@ -183,7 +274,7 @@ ROM_START( mfabfz85 ) ROMX_LOAD( "soft_2_6of8.bin", 0x2800, 0x0800, CRC(81fc3b24) SHA1(186dbd389fd700c5af1ef7c37948e11701ec596e), ROM_BIOS(3) ) ROMX_LOAD( "soft_3_7of8.bin", 0x3000, 0x0800, CRC(eae4e3d5) SHA1(f7112965874417bbfc4a32f31f84e1db83249ab7), ROM_BIOS(3) ) ROMX_LOAD( "soft_4_8of8.bin", 0x3800, 0x0800, CRC(536db0e3) SHA1(328ccc18455f710390c29c0fd0f4b0713a4a69ae), ROM_BIOS(3) ) - ROM_SYSTEM_BIOS (4, "32k_dtp", "MAT32K dtp" ) + ROM_SYSTEM_BIOS (4, "32k_dtp", "MAT32K dtp" ) // not working ROMX_LOAD( "mfa_mat85_sp1_ed_kpl_dtp_terminal.bin", 0x0000, 0x8000, CRC(ed432c19) SHA1(31cbc06d276dbb201d50967f4ddba26a42560753), ROM_BIOS(4) ) ROM_END -- cgit v1.2.3