// license:BSD-3-Clause // copyright-holders:Curt Coder /*************************************************************************** Explorer 85 12/05/2009 Skeleton driver. Setting Up ========== The terminal must be set for - Baud: 9600 - Format: 7E1 If it isn't, adjust the settings, then restart the system. Once started, press Space. The system will start up. All input must be in upper case. ****************************************************************************/ /* TODO: - dump of the hexadecimal keyboard monitor ROM - disable ROM mirror after boot - RAM expansions */ #include "emu.h" #include "includes/exp85.h" #include "cpu/i8085/i8085.h" #include "machine/i8155.h" #include "machine/i8355.h" #include "machine/ram.h" #include "speaker.h" /* Memory Maps */ void exp85_state::exp85_mem(address_map &map) { map.unmap_value_high(); map(0x0000, 0x07ff).bankr("bank1"); map(0xc000, 0xdfff).rom(); map(0xf000, 0xf7ff).rom(); map(0xf800, 0xf8ff).ram(); } void exp85_state::exp85_io(address_map &map) { map.unmap_value_high(); map.global_mask(0xff); map(0xf0, 0xf3).rw(I8355_TAG, FUNC(i8355_device::io_r), FUNC(i8355_device::io_w)); map(0xf8, 0xfd).rw(I8155_TAG, FUNC(i8155_device::io_r), FUNC(i8155_device::io_w)); // AM_RANGE(0xfe, 0xff) AM_DEVREADWRITE(I8279_TAG, i8279_r, i8279_w) } /* Input Ports */ INPUT_CHANGED_MEMBER( exp85_state::trigger_reset ) { m_maincpu->set_input_line(INPUT_LINE_RESET, newval ? CLEAR_LINE : ASSERT_LINE); } INPUT_CHANGED_MEMBER( exp85_state::trigger_rst75 ) { m_maincpu->set_input_line(I8085_RST75_LINE, newval ? CLEAR_LINE : ASSERT_LINE); } static INPUT_PORTS_START( exp85 ) PORT_START("SPECIAL") PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("R") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, exp85_state, trigger_reset, 0) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("I") PORT_CODE(KEYCODE_F2) PORT_CHANGED_MEMBER(DEVICE_SELF, exp85_state, trigger_rst75, 0) INPUT_PORTS_END /* 8355 Interface */ READ8_MEMBER( exp85_state::i8355_a_r ) { /* bit description PA0 tape control PA1 jumper S17 (open=+5V closed=GND) PA2 J5:13 PA3 PA4 J2:22 PA5 PA6 PA7 speaker output */ return 0x02; } WRITE8_MEMBER( exp85_state::i8355_a_w ) { /* bit description PA0 tape control PA1 jumper S17 (open=+5V closed=GND) PA2 J5:13 PA3 PA4 J2:22 PA5 PA6 PA7 speaker output */ /* tape control */ m_tape_control = BIT(data, 0); /* speaker output */ m_speaker->level_w(!BIT(data, 7)); } /* I8085A Interface */ READ_LINE_MEMBER( exp85_state::sid_r ) { int data = 1; if (m_tape_control) { data = (m_cassette->input() > +0.0); } else { data = m_rs232->rxd_r(); } return data; } WRITE_LINE_MEMBER( exp85_state::sod_w ) { if (m_tape_control) { m_cassette->output(state ? -1.0 : +1.0); } else { m_rs232->write_txd(state); } } /* Terminal Interface */ static DEVICE_INPUT_DEFAULTS_START( terminal ) DEVICE_INPUT_DEFAULTS( "RS232_TXBAUD", 0xff, RS232_BAUD_9600 ) DEVICE_INPUT_DEFAULTS( "RS232_RXBAUD", 0xff, RS232_BAUD_9600 ) DEVICE_INPUT_DEFAULTS( "RS232_STARTBITS", 0xff, RS232_STARTBITS_1 ) DEVICE_INPUT_DEFAULTS( "RS232_DATABITS", 0xff, RS232_DATABITS_7 ) DEVICE_INPUT_DEFAULTS( "RS232_PARITY", 0xff, RS232_PARITY_EVEN ) DEVICE_INPUT_DEFAULTS( "RS232_STOPBITS", 0xff, RS232_STOPBITS_1 ) DEVICE_INPUT_DEFAULTS_END /* Machine Initialization */ void exp85_state::machine_start() { address_space &program = m_maincpu->space(AS_PROGRAM); /* setup memory banking */ program.install_read_bank(0x0000, 0x07ff, "bank1"); program.unmap_write(0x0000, 0x07ff); membank("bank1")->configure_entry(0, m_rom->base() + 0xf000); membank("bank1")->configure_entry(1, m_rom->base()); membank("bank1")->set_entry(0); } /* Machine Driver */ MACHINE_CONFIG_START(exp85_state::exp85) /* basic machine hardware */ MCFG_DEVICE_ADD(I8085A_TAG, I8085A, 6.144_MHz_XTAL) MCFG_DEVICE_PROGRAM_MAP(exp85_mem) MCFG_DEVICE_IO_MAP(exp85_io) MCFG_I8085A_SID(READLINE(*this, exp85_state, sid_r)) MCFG_I8085A_SOD(WRITELINE(*this, exp85_state, sod_w)) /* sound hardware */ SPEAKER(config, "mono").front_center(); MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) /* devices */ I8155(config, I8155_TAG, 6.144_MHz_XTAL/2); i8355_device &i8355(I8355(config, I8355_TAG, 6.144_MHz_XTAL/2)); i8355.in_pa().set(FUNC(exp85_state::i8355_a_r)); i8355.out_pa().set(FUNC(exp85_state::i8355_a_w)); MCFG_CASSETTE_ADD("cassette") MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED) RS232_PORT(config, "rs232", default_rs232_devices, "terminal").set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(terminal)); /* internal ram */ RAM(config, RAM_TAG).set_default_size("256").set_extra_options("4K"); MACHINE_CONFIG_END /* ROMs */ ROM_START( exp85 ) ROM_REGION( 0x10000, I8085A_TAG, 0 ) ROM_DEFAULT_BIOS("eia") ROM_LOAD( "c000.bin", 0xc000, 0x0800, CRC(73ce4aad) SHA1(2c69cd0b6c4bdc92f4640bce18467e4e99255bab) ) ROM_LOAD( "c800.bin", 0xc800, 0x0800, CRC(eb3fdedc) SHA1(af92d07f7cb7533841b16e1176401363176857e1) ) ROM_LOAD( "d000.bin", 0xd000, 0x0800, CRC(c10c4a22) SHA1(30588ba0b27a775d85f8c581ad54400c8521225d) ) ROM_LOAD( "d800.bin", 0xd800, 0x0800, CRC(dfa43ef4) SHA1(56a7e7a64928bdd1d5f0519023d1594cacef49b3) ) ROM_SYSTEM_BIOS( 0, "eia", "EIA Terminal" ) ROMX_LOAD( "ex 85.u105", 0xf000, 0x0800, CRC(1a99d0d9) SHA1(57b6d48e71257bc4ef2d3dddc9b30edf6c1db766), ROM_BIOS(0) ) ROM_SYSTEM_BIOS( 1, "hex", "Hex Keyboard" ) ROMX_LOAD( "1kbd.u105", 0xf000, 0x0800, NO_DUMP, ROM_BIOS(1) ) ROM_REGION( 0x800, I8355_TAG, ROMREGION_ERASE00 ) /* ROM_DEFAULT_BIOS("terminal") ROM_SYSTEM_BIOS( 0, "terminal", "Terminal" ) ROMX_LOAD( "eia.u105", 0xf000, 0x0800, CRC(1a99d0d9) SHA1(57b6d48e71257bc4ef2d3dddc9b30edf6c1db766), ROM_BIOS(0) ) ROM_SYSTEM_BIOS( 1, "hexkbd", "Hex Keyboard" ) ROMX_LOAD( "hex.u105", 0xf000, 0x0800, NO_DUMP, ROM_BIOS(1) )*/ ROM_END /* System Drivers */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS COMP( 1979, exp85, 0, 0, exp85, exp85, exp85_state, empty_init, "Netronics", "Explorer/85", 0 )