// license:BSD-3-Clause // copyright-holders:Robbbert /*************************************************************************** Imsai MPU-B. One of the earliest single-board computers on a S100 card. 2013-09-11 Skeleton driver. Chips used: i8085, i8251, i8253, 3622 fusable prom. XTAL 6MHz Press any key to start the monitor program. ToDo: - Banking - Dipswitches ****************************************************************************/ #include "emu.h" #include "cpu/i8085/i8085.h" //#include "bus/s100/s100.h" #include "machine/i8251.h" #include "machine/pit8253.h" #include "machine/terminal.h" class imsai_state : public driver_device { public: imsai_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_terminal(*this, "terminal") , m_pit(*this, "pit") { } void kbd_put(u8 data); DECLARE_READ8_MEMBER(keyin_r); DECLARE_READ8_MEMBER(status_r); DECLARE_WRITE8_MEMBER(control_w); void imsai(machine_config &config); void imsai_io(address_map &map); void imsai_mem(address_map &map); private: uint8_t m_term_data; virtual void machine_reset() override; required_device m_maincpu; required_device m_terminal; required_device m_pit; }; void imsai_state::imsai_mem(address_map &map) { map.unmap_value_high(); map(0x0000, 0x07ff).rom().region("prom", 0); map(0xd000, 0xd0ff).ram(); map(0xd100, 0xd103).rw(m_pit, FUNC(pit8253_device::read), FUNC(pit8253_device::write)); map(0xd800, 0xdfff).rom().region("prom", 0); } void imsai_state::imsai_io(address_map &map) { map.unmap_value_high(); map.global_mask(0xff); map(0x02, 0x02).r(this, FUNC(imsai_state::keyin_r)).w(m_terminal, FUNC(generic_terminal_device::write)); map(0x03, 0x03).r(this, FUNC(imsai_state::status_r)); map(0x04, 0x04).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); map(0x05, 0x05).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); map(0x12, 0x12).rw("uart", FUNC(i8251_device::data_r), FUNC(i8251_device::data_w)); map(0x13, 0x13).rw("uart", FUNC(i8251_device::status_r), FUNC(i8251_device::control_w)); map(0x14, 0x14).r(this, FUNC(imsai_state::keyin_r)).w(m_terminal, FUNC(generic_terminal_device::write)); map(0x15, 0x15).r(this, FUNC(imsai_state::status_r)); map(0xf3, 0xf3).w(this, FUNC(imsai_state::control_w)); } /* Input ports */ static INPUT_PORTS_START( imsai ) INPUT_PORTS_END READ8_MEMBER( imsai_state::keyin_r ) { uint8_t ret = m_term_data; m_term_data = 0; return ret; } READ8_MEMBER( imsai_state::status_r ) { return (m_term_data) ? 3 : 1; } void imsai_state::kbd_put(u8 data) { m_term_data = data; } WRITE8_MEMBER( imsai_state::control_w ) { } void imsai_state::machine_reset() { m_term_data = 0; } MACHINE_CONFIG_START(imsai_state::imsai) /* basic machine hardware */ MCFG_DEVICE_ADD("maincpu",I8085A, XTAL(6'000'000)) MCFG_DEVICE_PROGRAM_MAP(imsai_mem) MCFG_DEVICE_IO_MAP(imsai_io) /* video hardware */ MCFG_DEVICE_ADD("terminal", GENERIC_TERMINAL, 0) MCFG_GENERIC_TERMINAL_KEYBOARD_CB(PUT(imsai_state, kbd_put)) /* Devices */ MCFG_DEVICE_ADD("uart", I8251, 0) MCFG_DEVICE_ADD("pit", PIT8253, 0) MCFG_PIT8253_CLK0(XTAL(6'000'000) / 3) /* Timer 0: baud rate gen for 8251 */ MCFG_PIT8253_OUT0_HANDLER(WRITELINE("uart", i8251_device, write_txc)) MCFG_DEVCB_CHAIN_OUTPUT(WRITELINE("uart", i8251_device, write_rxc)) MCFG_PIT8253_CLK1(XTAL(6'000'000) / 3) /* Timer 1: user */ MCFG_PIT8253_CLK2(XTAL(6'000'000) / 3) /* Timer 2: user */ MACHINE_CONFIG_END /* ROM definition */ ROM_START( imsai ) ROM_REGION( 0x800, "prom", 0 ) // 2716 or 2708 program PROM ROM_LOAD( "vdb-80.rom", 0x0000, 0x0800, CRC(0afc4683) SHA1(a5419aaee00badf339d7c627f50ef8b2538e42e2) ) ROM_REGION( 0x200, "decode", 0 ) // 512x4 address decoder ROM ROM_LOAD( "3622.u31", 0x000, 0x200, NO_DUMP ) ROM_REGION( 0x20, "status", 0 ) // PROM for decoding 8085 status signals ROM_LOAD( "74s288.u38", 0x00, 0x20, NO_DUMP ) ROM_END /* Driver */ // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS COMP( 1978, imsai, 0, 0, imsai, imsai, imsai_state, empty_init, "Imsai", "MPU-B", MACHINE_NOT_WORKING | MACHINE_NO_SOUND_HW )