summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Robbbert <Robbbert@users.noreply.github.com>2019-08-18 20:40:19 +1000
committer Robbbert <Robbbert@users.noreply.github.com>2019-08-18 20:40:19 +1000
commit0cfb056fbac1cfca8348b91482490bde54a1bfb1 (patch)
tree6b8d5cfedae43166f71b517cdb8772964e4e6aac
parent0dc30579dbf2d2a0f1d2e2306ca92f65baa10922 (diff)
(nw) mfabfz : added a cassette interface
-rw-r--r--src/mame/drivers/mfabfz.cpp111
1 files 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<cpu_device> m_maincpu;
+ required_device<cassette_image_device> m_cass;
+ required_device<i8251_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