diff options
Diffstat (limited to 'src/mame/drivers/poly88.cpp')
-rw-r--r-- | src/mame/drivers/poly88.cpp | 225 |
1 files changed, 0 insertions, 225 deletions
diff --git a/src/mame/drivers/poly88.cpp b/src/mame/drivers/poly88.cpp deleted file mode 100644 index e7bb817c9dd..00000000000 --- a/src/mame/drivers/poly88.cpp +++ /dev/null @@ -1,225 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Miodrag Milanovic -/*************************************************************************** - -Poly-88 driver by Miodrag Milanovic - -2009-05-18 Initial implementation -2019-05-25 Poly8813 new roms - -All input must be UPPERcase. - -11K is the minimal amount of user RAM required to run the later version of -BASIC. PolyMorphic's "System 16" package shipped with 16K of RAM (as did -the 8813), though their earlier systems had only 8K or less. - -ToDo: -- More accurate interrupt emulation. -- Single-step control. -- .CAS file format support (http://deramp.com/polymorphic-computers/emu88.html). - -Poly-8813 is a disk-based computer with 3 mini-floppy drives. -Booting is done by pressing the "Load" button, mounted on the -front panel near the power switch. Although user manuals are easy -to obtain, technical information and drive controller schematics -are not. The disk format is known to be 256 bytes per sector, 10 -sectors per track, 35 tracks, single sided, for a total of 89600 -bytes. - -Notes for old poly8813 roms: - -The Poly-8813 BIOS makes use of undocumented instructions which we -do not currently emulate. These are at 006A (print a character -routine - ED ED 05); another is at 0100 (move memory routine - -ED ED 03); the last is at 087B (disk I/O routine - ED ED 01). The -code at 0100 can be replaced by 7E 12 13 23 03 79 B0 C2 00 01 C9, -which exactly fits into the available space. The routine at 006A is -likewise could be exactly replaced with F5 C5 D5 E5, which enters -a display routine that appears in other assembly listings but seems -to have no entry point here. Since the ED ED opcode is defined as -for CALLN in the NEC V20/V30's 8080 mode, it might be the case that -these are actually hooks patched into the original code for -emulation purposes. (There is also a slim possibility that this -opcode invokes an undocumented feature of the NEC uPD8080AF, which -at least some models of the Poly-88 are known to have used.) - -****************************************************************************/ - -#include "emu.h" -#include "includes/poly88.h" - -#include "bus/s100/ascsasi.h" -#include "bus/s100/poly16k.h" -#include "bus/s100/polyfdc.h" -#include "bus/s100/polyvti.h" -#include "bus/s100/seals8k.h" - -#include "cpu/i8085/i8085.h" -#include "imagedev/cassette.h" -#include "speaker.h" - - -void poly88_state::s100_mem(address_map &map) -{ - map(0x0000, 0xffff).rw(FUNC(poly88_state::mem_r), FUNC(poly88_state::mem_w)); -} - -void poly88_state::s100_io(address_map &map) -{ - map(0x00, 0xff).rw(FUNC(poly88_state::in_r), FUNC(poly88_state::out_w)); -} - -void poly88_state::poly88_io(address_map &map) -{ - map.unmap_value_high(); - map(0x00, 0x01).mirror(2).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); - map(0x04, 0x04).mirror(3).w(FUNC(poly88_state::baud_rate_w)); - map(0x08, 0x08).mirror(3).w(FUNC(poly88_state::intr_w)); -} - -void poly88_state::poly8813_io(address_map &map) -{ - map.unmap_value_high(); - map(0x00, 0x01).mirror(2).rw(m_usart, FUNC(i8251_device::read), FUNC(i8251_device::write)); - map(0x04, 0x04).mirror(3).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); -} - -/* Input ports */ -static INPUT_PORTS_START( poly88 ) - PORT_START("CONFIG") - PORT_CONFNAME(0x80, 0x00, "Tape Mode") - PORT_CONFSETTING( 0x00, "Byte (300 baud)") - PORT_CONFSETTING( 0x80, "Polyphase (2400 baud)") - - PORT_START("ONBOARD") - PORT_CONFNAME(7, 0, "Onboard Addresses") - PORT_CONFSETTING(0, "0000-0FFF (M), 00-0F (I/O)") // jumper J - PORT_CONFSETTING(4, "8000-8FFF (M), 80-8F (I/O)") // jumper S - PORT_CONFSETTING(7, "E000-EFFF (M), E0-EF (I/O)") // jumper T -INPUT_PORTS_END - - -static void poly88_s100_devices(device_slot_interface &device) -{ - device.option_add("vti", S100_POLY_VTI); - device.option_add("8ksc", S100_8K_SC); - device.option_add("8kscbb", S100_8K_SC_BB); - device.option_add("poly16k", S100_POLY_16K); - device.option_add("polyfdc", S100_POLY_FDC); - device.option_add("ascsasi", S100_ASC_SASI); -} - -DEVICE_INPUT_DEFAULTS_START(poly88_vti_1800) - DEVICE_INPUT_DEFAULTS("ADDRESS", 0x3f, 0x06) // 1800-1FFF -DEVICE_INPUT_DEFAULTS_END - -DEVICE_INPUT_DEFAULTS_START(poly88_16k_2000) - DEVICE_INPUT_DEFAULTS("DSW", 0xf, 0xd) // 2000-5FFF -DEVICE_INPUT_DEFAULTS_END - -DEVICE_INPUT_DEFAULTS_START(poly88_16k_6000) - DEVICE_INPUT_DEFAULTS("DSW", 0xf, 0x9) // 6000-9FFF -DEVICE_INPUT_DEFAULTS_END - -DEVICE_INPUT_DEFAULTS_START(poly88_16k_a000) - DEVICE_INPUT_DEFAULTS("DSW", 0xf, 0x5) // A000-DFFF -DEVICE_INPUT_DEFAULTS_END - -void poly88_state::poly88(machine_config &config) -{ - /* basic machine hardware */ - I8080A(config, m_maincpu, 16.5888_MHz_XTAL / 9); // uses 8224 clock generator - m_maincpu->set_addrmap(AS_PROGRAM, &poly88_state::s100_mem); - m_maincpu->set_addrmap(AS_IO, &poly88_state::s100_io); - m_maincpu->set_irq_acknowledge_callback(FUNC(poly88_state::poly88_irq_callback)); - - ADDRESS_MAP_BANK(config, m_onboard_io); - m_onboard_io->set_addrmap(0, &poly88_state::poly88_io); - m_onboard_io->set_data_width(8); - m_onboard_io->set_addr_width(4); - - TIMER(config, "rtc").configure_periodic(FUNC(poly88_state::rtc_tick), attotime::from_hz(60)); // from AC power - - /* audio hardware */ - SPEAKER(config, "mono").front_center(); - - /* cassette */ - CASSETTE(config, m_cassette); - m_cassette->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED); - m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05); - TIMER(config, "kansas_r").configure_periodic(FUNC(poly88_state::kansas_r), attotime::from_hz(38400)); - - /* uart */ - I8251(config, m_usart, 16.5888_MHz_XTAL / 9); - m_usart->rxrdy_handler().set(FUNC(poly88_state::usart_ready_w)); - m_usart->txrdy_handler().set(FUNC(poly88_state::usart_ready_w)); - m_usart->txd_handler().set([this] (bool state) { m_txd = state; }); - m_usart->dtr_handler().set([this] (bool state) { m_dtr = state; }); - m_usart->rts_handler().set([this] (bool state) { m_rts = state; }); - - MM5307AA(config, m_brg, 16.5888_MHz_XTAL / 18); - m_brg->output_cb().set(FUNC(poly88_state::cassette_clock_w)); - - /* snapshot */ - SNAPSHOT(config, "snapshot", "img", attotime::from_seconds(2)).set_load_callback(FUNC(poly88_state::snapshot_cb)); - - S100_BUS(config, m_s100, 16.5888_MHz_XTAL / 9); - m_s100->vi2().set(FUNC(poly88_state::vi2_w)); - m_s100->vi5().set(FUNC(poly88_state::vi5_w)); - - // Poly-88 backplane has 5 slots, but CPU uses one - S100_SLOT(config, m_s100_slot[0], poly88_s100_devices, "vti"); - S100_SLOT(config, m_s100_slot[1], poly88_s100_devices, "poly16k"); - S100_SLOT(config, m_s100_slot[2], poly88_s100_devices, nullptr); - S100_SLOT(config, m_s100_slot[3], poly88_s100_devices, nullptr); - - m_s100_slot[1]->set_option_device_input_defaults("poly16k", DEVICE_INPUT_DEFAULTS_NAME(poly88_16k_2000)); - m_s100_slot[2]->set_option_device_input_defaults("poly16k", DEVICE_INPUT_DEFAULTS_NAME(poly88_16k_6000)); - m_s100_slot[3]->set_option_device_input_defaults("poly16k", DEVICE_INPUT_DEFAULTS_NAME(poly88_16k_a000)); -} - -void poly88_state::poly8813(machine_config &config) -{ - poly88(config); - m_onboard_io->set_addrmap(0, &poly88_state::poly8813_io); - - m_s100_slot[0]->set_option_device_input_defaults("vti", DEVICE_INPUT_DEFAULTS_NAME(poly88_vti_1800)); - m_s100_slot[1]->set_default_option("polyfdc"); - m_s100_slot[2]->set_default_option("poly16k"); - - // Poly-8813 backplane has 10 slots, but CPU uses one - S100_SLOT(config, m_s100_slot[4], poly88_s100_devices, nullptr); - S100_SLOT(config, m_s100_slot[5], poly88_s100_devices, nullptr); - S100_SLOT(config, m_s100_slot[6], poly88_s100_devices, nullptr); - S100_SLOT(config, m_s100_slot[7], poly88_s100_devices, nullptr); - S100_SLOT(config, m_s100_slot[8], poly88_s100_devices, nullptr); - - m_s100_slot[2]->set_option_device_input_defaults("poly16k", DEVICE_INPUT_DEFAULTS_NAME(poly88_16k_2000)); - m_s100_slot[3]->set_option_device_input_defaults("poly16k", DEVICE_INPUT_DEFAULTS_NAME(poly88_16k_6000)); - m_s100_slot[4]->set_option_device_input_defaults("poly16k", DEVICE_INPUT_DEFAULTS_NAME(poly88_16k_a000)); -} - -/* ROM definition */ -ROM_START( poly88 ) - ROM_REGION( 0xc00, "maincpu", ROMREGION_ERASEFF ) - ROM_LOAD( "polymon4.bin", 0x0000, 0x0400, CRC(0baa1a4c) SHA1(c6cf4b89bdde200813d34aab08150d5f3025ce33)) - ROM_LOAD( "tbasic_1.rom", 0x0400, 0x0400, CRC(ec22740e) SHA1(bc606c58ef5f046200bdf402eda66ec070464306)) - ROM_LOAD( "tbasic_2.rom", 0x0800, 0x0400, CRC(f2619232) SHA1(eb6fb0356d2fb153111cfddf39eab10253cb4c53)) -ROM_END - -ROM_START( poly8813 ) - ROM_REGION( 0xc00, "maincpu", ROMREGION_ERASEFF ) - ROM_LOAD( "poly8813.27", 0x0000, 0x0400, CRC(0baa1a4c) SHA1(c6cf4b89bdde200813d34aab08150d5f3025ce33) ) - ROM_LOAD( "poly8813.26", 0x0400, 0x0400, CRC(7011f3a3) SHA1(228eb54b9f62649b3b674e9f1bf21f2981e12c03) ) - ROM_LOAD( "poly8813.25", 0x0800, 0x0400, CRC(9f7570e2) SHA1(767f2111b4eb856a077b1b4afe9209aca3866e52) ) - //ROM_LOAD( "poly8813-1.bin", 0x0000, 0x0400, CRC(7fd980a0) SHA1(a71d5999deb4323a11db1c0ea0dcb1dacfaf47ef)) - //ROM_LOAD( "poly8813-2.rom", 0x0400, 0x0400, CRC(1ad7c06c) SHA1(c96b8f03c184de58dbdcee18d297dbccf2d77176)) - //ROM_LOAD( "poly8813-3.rom", 0x0800, 0x0400, CRC(3df57e5b) SHA1(5b0c4febfc7515fc07e63dcb21d0ab32bc6a2e46)) -ROM_END -/* Driver */ - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1976, poly88, 0, 0, poly88, poly88, poly88_state, empty_init, "PolyMorphic Systems", "Poly-88", 0 ) -COMP( 1977, poly8813, poly88, 0, poly8813, poly88, poly88_state, empty_init, "PolyMorphic Systems", "Poly-8813", MACHINE_NOT_WORKING ) |