diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 227bf501146..aa15459139b 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -39095,9 +39095,11 @@ psionla psionlam psionlz psionlz64 -psionlz64s psionp200 +psionp200a +psionp250 psionp350 +psionp432 psionp464 psionxp diff --git a/src/mame/psion/psion.cpp b/src/mame/psion/psion.cpp index 3c9f6c1b78a..043161f5eee 100644 --- a/src/mame/psion/psion.cpp +++ b/src/mame/psion/psion.cpp @@ -4,11 +4,9 @@ Psion Organiser II series - Driver by Sandro Ronco - TODO: - dump CGROM of the HD44780 - - emulate other devices in slot C(Comms Link, printer) + - emulate other devices in slot C (Comms Link, Printer, etc.) Note: - 4 lines display has an custom LCD controller derived from an HD66780 @@ -22,16 +20,151 @@ #include "emu.h" -#include "psion.h" +#include "psion_pack.h" +#include "cpu/m6800/m6801.h" +#include "machine/nvram.h" +#include "machine/ram.h" +#include "machine/timer.h" +#include "video/hd44780.h" +#include "sound/beep.h" + +#include "emupal.h" #include "screen.h" #include "softlist_dev.h" #include "speaker.h" +namespace { + +class psion_state : public driver_device +{ +public: + psion_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_maincpu(*this, "maincpu") + , m_lcdc(*this, "hd44780") + , m_screen(*this, "screen") + , m_beep(*this, "beeper") + , m_pack(*this, "pack%u", 1U) + , m_topslot(*this, "topslot") + , m_nvram(*this, "nvram") + , m_ram(*this, "ram") + , m_kb_lines(*this, "K%u", 1U) + , m_kb_on(*this, "ON") + , m_battery(*this, "BATTERY") + { } + + void psion_base(machine_config &config); + + DECLARE_INPUT_CHANGED_MEMBER(psion_on); + +protected: + virtual void machine_start() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD; + + required_device m_maincpu; + required_device m_lcdc; + required_device m_screen; + required_device m_beep; + required_device_array m_pack; + optional_device m_topslot; + required_device m_nvram; + required_device m_ram; + required_ioport_array<7> m_kb_lines; + required_ioport m_kb_on; + required_ioport m_battery; + + uint8_t kb_read(); + void port2_w(offs_t offset, uint8_t data, uint8_t ddr); + uint8_t port2_r(); + uint8_t port5_r(); + void port6_w(uint8_t data); + uint8_t port6_r(); + + void psion_palette(palette_device &palette) const; + TIMER_DEVICE_CALLBACK_MEMBER(nmi_timer); + + uint16_t m_kb_counter = 0; + bool m_nmi_enable = false; + uint8_t m_pulse_enable = 0; +}; + + +class psion1_state : public psion_state +{ +public: + psion1_state(const machine_config &mconfig, device_type type, const char *tag) + : psion_state(mconfig, type, tag) + { } + + void psion1(machine_config &config); + +protected: + virtual void machine_reset() override ATTR_COLD; + +private: + HD44780_PIXEL_UPDATE(psion1_pixel_update); + + void psion1_mem(address_map &map) ATTR_COLD; + + uint8_t reset_kb_counter_r(); + uint8_t inc_kb_counter_r(); + uint8_t switchoff_r(); +}; + + +class psion2_state : public psion_state +{ +public: + psion2_state(const machine_config &mconfig, device_type type, const char *tag) + : psion_state(mconfig, type, tag) + , m_rambank1(*this, "rambank1") + , m_rambank2(*this, "rambank2") + , m_rombank1(*this, "rombank1") + , m_rombank2(*this, "rombank2") + { } + + void psion2(machine_config &config); + void psioncm(machine_config &config); + void psionxp(machine_config &config); + void psionla(machine_config &config); + void psionlz(machine_config &config); + void psionlz64(machine_config &config); + void psionp200(machine_config &config); + void psionp350(machine_config &config); + void psionp432(machine_config &config); + void psionp464(machine_config &config); + +protected: + virtual void machine_start() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD; + +private: + required_memory_bank m_rambank1; + optional_memory_bank m_rambank2; + required_memory_bank m_rombank1; + optional_memory_bank m_rombank2; + + HD44780_PIXEL_UPDATE(lz_pixel_update); + + void io_rw(uint16_t offset); + void io_w(offs_t offset, uint8_t data); + uint8_t io_r(offs_t offset); + + void psioncm_mem(address_map &map) ATTR_COLD; + void psionxp_mem(address_map &map) ATTR_COLD; + void psionla_mem(address_map &map) ATTR_COLD; + + // RAM/ROM banks + uint8_t m_rambank_count = 0; + uint8_t m_rombank_count = 0; +}; + + TIMER_DEVICE_CALLBACK_MEMBER(psion_state::nmi_timer) { - if (m_enable_nmi) + if (m_nmi_enable) m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero); } @@ -55,26 +188,26 @@ uint8_t psion_state::kb_read() return data & 0x7c; } -void psion_state::update_banks() -{ - if (m_ram_bank < m_ram_bank_count && m_ram_bank_count) - membank("rambank")->set_entry(m_ram_bank); - - if (m_rom_bank < m_rom_bank_count && m_rom_bank_count) - membank("rombank")->set_entry(m_rom_bank); -} void psion_state::port2_w(offs_t offset, uint8_t data, uint8_t ddr) { /* datapack i/o data bus */ - m_pack1->data_w(data & ddr); - m_pack2->data_w(data & ddr); + m_pack[0]->data_w(data & ddr); + m_pack[1]->data_w(data & ddr); + + if (m_topslot) + m_topslot->data_w(data & ddr); } uint8_t psion_state::port2_r() { /* datapack i/o data bus */ - return m_pack1->data_r() | m_pack2->data_r(); + uint8_t data = m_pack[0]->data_r() | m_pack[1]->data_r(); + + if (m_topslot) + data |= m_topslot->data_r(); + + return data; } uint8_t psion_state::port5_r() @@ -85,7 +218,7 @@ uint8_t psion_state::port5_r() ---- --x- pulse ---- ---x battery status */ - return kb_read() | ioport("BATTERY")->read() | ioport("ON")->read() | (m_kb_counter == 0x7ff)<<1 | m_pulse<<1; + return kb_read() | m_battery->read() | m_kb_on->read() | (m_kb_counter == 0x7ff)<<1 | m_pulse_enable<<1; } void psion_state::port6_w(uint8_t data) @@ -101,18 +234,26 @@ void psion_state::port6_w(uint8_t data) ---- --x- reset line ---- ---x clock line */ - m_pack1->control_w((data & 0x8f) | (data & 0x10)); - m_pack2->control_w((data & 0x8f) | ((data & 0x20) >> 1)); + m_pack[0]->control_w((data & 0x8f) | (data & 0x10)); + m_pack[1]->control_w((data & 0x8f) | ((data & 0x20) >> 1)); + + if (m_topslot) + m_topslot->control_w((data & 0x8f) | ((data & 0x40) >> 2)); } uint8_t psion_state::port6_r() { /* datapack control lines */ - return (m_pack1->control_r() | (m_pack2->control_r() & 0x8f)) | ((m_pack2->control_r() & 0x10)<<1); + uint8_t data = (m_pack[0]->control_r() | (m_pack[1]->control_r() & 0x8f)) | ((m_pack[1]->control_r() & 0x10) << 1); + + if (m_topslot) + data |= (m_topslot->control_r() & 0x8f) | ((m_topslot->control_r() & 0x10) << 2); + + return data; } /* Read/Write common */ -void psion_state::io_rw(uint16_t offset) +void psion2_state::io_rw(uint16_t offset) { if (machine().side_effects_disabled()) return; @@ -121,17 +262,14 @@ void psion_state::io_rw(uint16_t offset) { case 0xc0: /* switch off, CPU goes into standby mode */ - m_enable_nmi = false; + m_nmi_enable = false; m_maincpu->set_input_line(M6801_STBY_LINE, ASSERT_LINE); break; case 0x100: - m_pulse = 1; + m_pulse_enable = 1; break; case 0x140: - m_pulse = 0; - break; - case 0x200: - m_kb_counter = 0; + m_pulse_enable = 0; break; case 0x180: m_beep->set_state(1); @@ -139,40 +277,53 @@ void psion_state::io_rw(uint16_t offset) case 0x1c0: m_beep->set_state(0); break; + case 0x200: + m_kb_counter = 0; + break; case 0x240: - if (offset == 0x260 && (m_rom_bank_count || m_ram_bank_count)) + if (offset == 0x260 && (m_rombank_count || m_rambank_count)) { - m_ram_bank=0; - m_rom_bank=0; - update_banks(); + if (m_rambank_count) + m_rambank2->set_entry(0); + + if (m_rombank_count) + m_rombank2->set_entry(0); } else + { m_kb_counter++; + } break; case 0x280: - if (offset == 0x2a0 && m_ram_bank_count) + if (offset == 0x2a0 && m_rambank_count) { - m_ram_bank++; - update_banks(); + int const rambank = m_rambank2->entry() + 1; + if (rambank < m_rambank_count) + m_rambank2->set_entry(rambank); } else - m_enable_nmi = true; + { + m_nmi_enable = true; + } break; case 0x2c0: - if (offset == 0x2e0 && m_rom_bank_count) + if (offset == 0x2e0 && m_rombank_count) { - m_rom_bank++; - update_banks(); + int const rombank = m_rombank2->entry() + 1; + if (rombank < m_rombank_count) + m_rombank2->set_entry(rombank); } else - m_enable_nmi = false; + { + m_nmi_enable = false; + } break; } } -void psion_state::io_w(offs_t offset, uint8_t data) +void psion2_state::io_w(offs_t offset, uint8_t data) { - switch (offset & 0x0ffc0) + switch (offset & 0xffc0) { case 0x80: m_lcdc->write(offset & 0x01, data); @@ -183,15 +334,14 @@ void psion_state::io_w(offs_t offset, uint8_t data) } } -uint8_t psion_state::io_r(offs_t offset) +uint8_t psion2_state::io_r(offs_t offset) { switch (offset & 0xffc0) { case 0x80: return m_lcdc->read(offset & 0x01); default: - if (!machine().side_effects_disabled()) - io_rw(offset); + io_rw(offset); break; } @@ -241,69 +391,112 @@ void psion1_state::psion1_mem(address_map &map) map(0x4000, 0x47ff).ram().share("ram"); } -void psion_state::psioncm_mem(address_map &map) +void psion2_state::psioncm_mem(address_map &map) { map.unmap_value_low(); - map(0x0100, 0x03ff).rw(FUNC(psion_state::io_r), FUNC(psion_state::io_w)); - map(0x2000, 0x3fff).ram().share("ram"); - map(0x8000, 0xffff).rom(); + map(0x0100, 0x03ff).rw(FUNC(psion2_state::io_r), FUNC(psion2_state::io_w)); + map(0x2000, 0x3fff).bankrw("rambank1"); + map(0x8000, 0xbfff).bankr("rombank2"); + map(0xc000, 0xffff).bankr("rombank1"); } -void psion_state::psionla_mem(address_map &map) +void psion2_state::psionxp_mem(address_map &map) { map.unmap_value_low(); - map(0x0100, 0x03ff).rw(FUNC(psion_state::io_r), FUNC(psion_state::io_w)); - map(0x0400, 0x5fff).ram().share("ram"); - map(0x8000, 0xffff).rom(); + map(0x0100, 0x03ff).rw(FUNC(psion2_state::io_r), FUNC(psion2_state::io_w)); + map(0x2000, 0x5fff).bankrw("rambank1"); + map(0x8000, 0xbfff).bankr("rombank2"); + map(0xc000, 0xffff).bankr("rombank1"); } -void psion_state::psionp350_mem(address_map &map) +void psion2_state::psionla_mem(address_map &map) { map.unmap_value_low(); - map(0x0100, 0x03ff).rw(FUNC(psion_state::io_r), FUNC(psion_state::io_w)); - map(0x0400, 0x3fff).ram().share("ram"); - map(0x4000, 0x7fff).bankrw("rambank"); - map(0x8000, 0xffff).rom(); + map(0x0100, 0x03ff).rw(FUNC(psion2_state::io_r), FUNC(psion2_state::io_w)); + map(0x0400, 0x3fff).bankrw("rambank1"); + map(0x4000, 0x7fff).bankrw("rambank2"); + map(0x8000, 0xbfff).bankr("rombank2"); + map(0xc000, 0xffff).bankr("rombank1"); } -void psion_state::psionlam_mem(address_map &map) -{ - map.unmap_value_low(); - map(0x0100, 0x03ff).rw(FUNC(psion_state::io_r), FUNC(psion_state::io_w)); - map(0x0400, 0x7fff).ram().share("ram"); - map(0x8000, 0xbfff).bankr("rombank"); - map(0xc000, 0xffff).rom(); -} - -void psion_state::psionlz_mem(address_map &map) -{ - map.unmap_value_low(); - map(0x0100, 0x03ff).rw(FUNC(psion_state::io_r), FUNC(psion_state::io_w)); - map(0x0400, 0x3fff).ram().share("ram"); - map(0x4000, 0x7fff).bankrw("rambank"); - map(0x8000, 0xbfff).bankr("rombank"); - map(0xc000, 0xffff).rom(); -} /* Input ports */ INPUT_PORTS_START( psion ) PORT_START("BATTERY") - PORT_CONFNAME( 0x01, 0x00, "Battery Status" ) - PORT_CONFSETTING( 0x00, DEF_STR( Normal ) ) - PORT_CONFSETTING( 0x01, "Low Battery" ) + PORT_CONFNAME( 0x01, 0x00, "Battery Status" ) + PORT_CONFSETTING( 0x00, DEF_STR( Normal ) ) + PORT_CONFSETTING( 0x01, "Low Battery" ) PORT_START("ON") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ON/CLEAR") PORT_CODE(KEYCODE_MINUS) PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(psion_state::psion_on), 0) + PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ON/CLEAR") PORT_CODE(KEYCODE_ESC) PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(psion_state::psion_on), 0) +INPUT_PORTS_END + +INPUT_PORTS_START( psion1 ) + PORT_INCLUDE(psion) PORT_START("K1") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("MODE") PORT_CODE(KEYCODE_EQUALS) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Up [CAP]") PORT_CODE(KEYCODE_UP) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Down [NUM]") PORT_CODE(KEYCODE_DOWN) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RIGHT") PORT_CODE(KEYCODE_RIGHT) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2192 [>>]") PORT_CODE(KEYCODE_RIGHT) // U+2192 = → + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2190 [<<]") PORT_CODE(KEYCODE_LEFT) // U+2190 = ← + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2193 [FIND]") PORT_CODE(KEYCODE_DOWN) // U+2193 = ↓ + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2191 [SAVE]") PORT_CODE(KEYCODE_UP) // U+2191 = ↑ + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("MODE/HOME") PORT_CODE(KEYCODE_EQUALS) PORT_START("K2") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S [,]") PORT_CODE(KEYCODE_S) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M [%]") PORT_CODE(KEYCODE_M) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G [=]") PORT_CODE(KEYCODE_G) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A [<]") PORT_CODE(KEYCODE_A) + + PORT_START("K3") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y [(]") PORT_CODE(KEYCODE_Y) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T [:]") PORT_CODE(KEYCODE_T) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N [$]") PORT_CODE(KEYCODE_N) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H [\"]") PORT_CODE(KEYCODE_H) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B [>]") PORT_CODE(KEYCODE_B) + + PORT_START("K4") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z [)]") PORT_CODE(KEYCODE_Z) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U [0]") PORT_CODE(KEYCODE_U) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O [1]") PORT_CODE(KEYCODE_O) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I [4]") PORT_CODE(KEYCODE_I) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C [7]") PORT_CODE(KEYCODE_C) + + PORT_START("K5") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DELETE") PORT_CODE(KEYCODE_DEL) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W [EE]") PORT_CODE(KEYCODE_W) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q [3]") PORT_CODE(KEYCODE_Q) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K [6]") PORT_CODE(KEYCODE_K) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E [9]") PORT_CODE(KEYCODE_E) + + PORT_START("K6") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("EXECUTE") PORT_CODE(KEYCODE_ENTER) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X [+]") PORT_CODE(KEYCODE_X) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R [-]") PORT_CODE(KEYCODE_R) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L [*]") PORT_CODE(KEYCODE_L) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F [/]") PORT_CODE(KEYCODE_F) + + PORT_START("K7") + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V [.]") PORT_CODE(KEYCODE_V) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P [2]") PORT_CODE(KEYCODE_P) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J [5]") PORT_CODE(KEYCODE_J) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D [8]") PORT_CODE(KEYCODE_D) +INPUT_PORTS_END + +INPUT_PORTS_START( psion2 ) + PORT_INCLUDE(psion) + + // Normal keyboard + PORT_START("K1") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("MODE") PORT_CODE(KEYCODE_EQUALS) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2191 [CAP]") PORT_CODE(KEYCODE_UP) // U+2191 = ↑ + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2193 [NUM]") PORT_CODE(KEYCODE_DOWN) // U+2193 = ↓ + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2190") PORT_CODE(KEYCODE_LEFT) // U+2190 = ← + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2192") PORT_CODE(KEYCODE_RIGHT) // U+2192 = → + + PORT_START("K2") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S [;]") PORT_CODE(KEYCODE_S) PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M [,]") PORT_CODE(KEYCODE_M) PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G [=]") PORT_CODE(KEYCODE_G) @@ -324,7 +517,7 @@ INPUT_PORTS_START( psion ) PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C [(]") PORT_CODE(KEYCODE_C) PORT_START("K5") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W [3]") PORT_CODE(KEYCODE_W) PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q [6]") PORT_CODE(KEYCODE_Q) PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K [9]") PORT_CODE(KEYCODE_K) @@ -345,142 +538,199 @@ INPUT_PORTS_START( psion ) PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D [)]") PORT_CODE(KEYCODE_D) INPUT_PORTS_END -INPUT_PORTS_START( psion1 ) - PORT_START("BATTERY") - PORT_CONFNAME( 0x01, 0x00, "Battery Status" ) - PORT_CONFSETTING( 0x00, DEF_STR( Normal ) ) - PORT_CONFSETTING( 0x01, "Low Battery" ) - - PORT_START("ON") - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ON/CLEAR") PORT_CODE(KEYCODE_MINUS) PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(psion_state::psion_on), 0) +INPUT_PORTS_START( psion2a ) + PORT_INCLUDE(psion) + // Alpha keyboard PORT_START("K1") - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("RIGHT") PORT_CODE(KEYCODE_RIGHT) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Down [NUM]") PORT_CODE(KEYCODE_DOWN) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Up [CAP]") PORT_CODE(KEYCODE_UP) - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("MODE") PORT_CODE(KEYCODE_EQUALS) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("MODE") PORT_CODE(KEYCODE_EQUALS) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2191") PORT_CODE(KEYCODE_UP) // U+2191 = ↑ + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2193") PORT_CODE(KEYCODE_DOWN) // U+2193 = ↓ + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2190") PORT_CODE(KEYCODE_LEFT) // U+2190 = ← + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(u8"\u2192") PORT_CODE(KEYCODE_RIGHT) // U+2192 = → PORT_START("K2") - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S [;]") PORT_CODE(KEYCODE_S) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M [,]") PORT_CODE(KEYCODE_M) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G [=]") PORT_CODE(KEYCODE_G) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A [<]") PORT_CODE(KEYCODE_A) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_LSHIFT) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_START("K3") - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y [0]") PORT_CODE(KEYCODE_Y) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T [:]") PORT_CODE(KEYCODE_T) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N [$]") PORT_CODE(KEYCODE_N) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H [\"]") PORT_CODE(KEYCODE_H) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B [>]") PORT_CODE(KEYCODE_B) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DEL") PORT_CODE(KEYCODE_DEL) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("No [N]") PORT_CODE(KEYCODE_N) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_START("K4") - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z [.]") PORT_CODE(KEYCODE_Z) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U [1]") PORT_CODE(KEYCODE_U) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O [4]") PORT_CODE(KEYCODE_O) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I [7]") PORT_CODE(KEYCODE_I) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C [(]") PORT_CODE(KEYCODE_C) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("YES [Y]") PORT_CODE(KEYCODE_Y) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_START("K5") - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("DEL") PORT_CODE(KEYCODE_DEL) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W [3]") PORT_CODE(KEYCODE_W) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q [6]") PORT_CODE(KEYCODE_Q) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K [9]") PORT_CODE(KEYCODE_K) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E [%]") PORT_CODE(KEYCODE_E) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(". [W]") PORT_CODE(KEYCODE_W) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2 [Q]") PORT_CODE(KEYCODE_Q) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5 [K]") PORT_CODE(KEYCODE_K) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8 [E]") PORT_CODE(KEYCODE_E) PORT_START("K6") - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("EXE") PORT_CODE(KEYCODE_ENTER) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X [+]") PORT_CODE(KEYCODE_X) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R [-]") PORT_CODE(KEYCODE_R) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L [*]") PORT_CODE(KEYCODE_L) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F [/]") PORT_CODE(KEYCODE_F) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("ENTER") PORT_CODE(KEYCODE_ENTER) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("- [X]") PORT_CODE(KEYCODE_X) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3 [R]") PORT_CODE(KEYCODE_R) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6 [L]") PORT_CODE(KEYCODE_L) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9 [F]") PORT_CODE(KEYCODE_F) PORT_START("K7") - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V [2]") PORT_CODE(KEYCODE_V) - PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P [5]") PORT_CODE(KEYCODE_P) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J [8]") PORT_CODE(KEYCODE_J) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D [)]") PORT_CODE(KEYCODE_D) + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0 [V]") PORT_CODE(KEYCODE_V) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("1 [P]") PORT_CODE(KEYCODE_P) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4 [J]") PORT_CODE(KEYCODE_J) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7 [D]") PORT_CODE(KEYCODE_D) +INPUT_PORTS_END + +INPUT_PORTS_START( psion2n ) + PORT_INCLUDE(psion) + + // Numerical keyboard + PORT_START("K1") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("7") PORT_CODE(KEYCODE_7) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8") PORT_CODE(KEYCODE_8) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_9) + + PORT_START("K2") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("EXE") PORT_CODE(KEYCODE_ENTER) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("MODE") PORT_CODE(KEYCODE_EQUALS) + + PORT_START("K3") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_4) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("K4") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("K5") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(".") PORT_CODE(KEYCODE_STOP) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("K6") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_3) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("6") PORT_CODE(KEYCODE_6) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) + + PORT_START("K7") + PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) + PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("5") PORT_CODE(KEYCODE_5) + PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED) INPUT_PORTS_END void psion_state::machine_start() { - if (!strcmp(machine().system().name, "psionlam")) - { - m_rom_bank_count = 3; - m_ram_bank_count = 0; - } - else if (!strncmp(machine().system().name, "psionlz", 7)) - { - m_rom_bank_count = 3; - m_ram_bank_count = 3; - } - else if (!strcmp(machine().system().name, "psionp464")) - { - m_rom_bank_count = 3; - m_ram_bank_count = 9; - } - else if (!strncmp(machine().system().name, "psionp", 6)) - { - m_rom_bank_count = 0; - m_ram_bank_count = 5; - } - else - { - m_rom_bank_count = 0; - m_ram_bank_count = 0; - } - - if (m_rom_bank_count) - { - uint8_t* rom_base = (uint8_t *)memregion("maincpu")->base(); - - membank("rombank")->configure_entry(0, rom_base + 0x8000); - membank("rombank")->configure_entries(1, m_rom_bank_count-1, rom_base + 0x10000, 0x4000); - membank("rombank")->set_entry(0); - } - - if (m_ram_bank_count) - { - m_paged_ram = std::make_unique(m_ram_bank_count * 0x4000); - memset(m_paged_ram.get(), 0, sizeof(uint8_t) * (m_ram_bank_count * 0x4000)); - membank("rambank")->configure_entries(0, m_ram_bank_count, m_paged_ram.get(), 0x4000); - membank("rambank")->set_entry(0); - } - - m_nvram1->set_base(m_ram, m_ram.bytes()); - if (m_nvram2) - m_nvram2->set_base(m_paged_ram.get(), m_ram_bank_count * 0x4000); + m_nvram->set_base(m_ram->pointer(), m_ram->size()); save_item(NAME(m_kb_counter)); - save_item(NAME(m_enable_nmi)); - save_item(NAME(m_pulse)); - save_item(NAME(m_rom_bank)); - save_item(NAME(m_ram_bank)); - save_pointer(NAME(m_paged_ram), m_ram_bank_count * 0x4000); + save_item(NAME(m_nmi_enable)); + save_item(NAME(m_pulse_enable)); +} + +void psion2_state::machine_start() +{ + psion_state::machine_start(); + + uint8_t *rom_base = memregion("maincpu")->base(); + uint32_t rom_size = memregion("maincpu")->bytes(); + + m_rombank_count = 0; + switch (rom_size) + { + case 0x8000: // 32K + m_rombank1->set_base(rom_base + 0x4000); + m_rombank2->set_base(rom_base); + break; + + default: // >= 64K + m_rombank_count = (rom_size - 0x4000) / 0x4000; + + m_rombank1->set_base(rom_base + 0x4000); + m_rombank2->configure_entry(0, rom_base); + m_rombank2->configure_entries(1, m_rombank_count-1, rom_base + 0x8000, 0x4000); + m_rombank2->set_entry(0); + break; + } + + m_rambank_count = 0; + switch (m_ram->size()) + { + case 0x2000: // 8K + case 0x4000: // 16K + m_rambank1->set_base(m_ram->pointer()); + break; + + case 0x8000: // 32K + m_rambank1->set_base(m_ram->pointer() + 0x0400); + m_rambank2->set_base(m_ram->pointer() + 0x4000); + break; + + default: // >= 64K + m_rambank_count = (m_ram->size() - 0x4000) / 0x4000; + + m_rambank1->set_base(m_ram->pointer() + 0x0400); + m_rambank2->configure_entries(0, m_rambank_count, m_ram->pointer() + 0x4000, 0x4000); + m_rambank2->set_entry(0); + break; + } } void psion_state::machine_reset() { - m_enable_nmi = false; + m_nmi_enable = false; m_kb_counter = 0; - m_ram_bank = 0; - m_rom_bank = 0; - m_pulse = 0; - - if (m_rom_bank_count || m_ram_bank_count) - update_banks(); + m_pulse_enable = 0; } void psion1_state::machine_reset() { psion_state::machine_reset(); - m_enable_nmi = true; + + m_nmi_enable = true; } -HD44780_PIXEL_UPDATE(psion_state::lz_pixel_update) +void psion2_state::machine_reset() +{ + psion_state::machine_reset(); + + if (m_rambank_count) + m_rambank2->set_entry(0); + + if (m_rombank_count) + m_rombank2->set_entry(0); +} + + +HD44780_PIXEL_UPDATE(psion2_state::lz_pixel_update) { if (pos < 40) { @@ -524,67 +774,37 @@ static GFXDECODE_START( gfx_psion ) GFXDECODE_ENTRY( "hd44780:cgrom", 0x0000, psion_charlayout, 0, 1 ) GFXDECODE_END -/* basic configuration for 2 lines display */ -void psion_state::psion_2lines(machine_config &config) -{ - /* basic machine hardware */ - HD6303X(config, m_maincpu, 3.6864_MHz_XTAL); // internal operating frequency is 0.9216 MHz - m_maincpu->nvram_enable_backup(true); - m_maincpu->in_p2_cb().set(FUNC(psion_state::port2_r)); - m_maincpu->out_p2_cb().set(FUNC(psion_state::port2_w)); - m_maincpu->in_p5_cb().set(FUNC(psion_state::port5_r)); - m_maincpu->in_p6_cb().set(FUNC(psion_state::port6_r)); - m_maincpu->out_p6_cb().set(FUNC(psion_state::port6_w)); +void psion_state::psion_base(machine_config &config) +{ /* video hardware */ - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); - screen.set_refresh_hz(50); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ - screen.set_screen_update("hd44780", FUNC(hd44780_device::screen_update)); - screen.set_size(6*16, 9*2); - screen.set_visarea_full(); - screen.set_palette("palette"); + SCREEN(config, m_screen, SCREEN_TYPE_LCD); + m_screen->set_refresh_hz(50); + m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + m_screen->set_screen_update("hd44780", FUNC(hd44780_device::screen_update)); + m_screen->set_palette("palette"); PALETTE(config, "palette", FUNC(psion_state::psion_palette), 2); GFXDECODE(config, "gfxdecode", "palette", gfx_psion); - HD44780(config, m_lcdc, 270'000); // TODO: Wrong device? Custom? clock not measured, datasheet typical clock used - m_lcdc->set_lcd_size(2, 16); + HD44780(config, m_lcdc, 270'000); // TODO: clock not measured, datasheet typical clock used /* sound hardware */ SPEAKER(config, "mono").front_center(); BEEP(config, m_beep, 3250).add_route(ALL_OUTPUTS, "mono", 1.00); - NVRAM(config, "nvram1", nvram_device::DEFAULT_ALL_0); // RAM - - TIMER(config, "nmi_timer").configure_periodic(FUNC(psion_state::nmi_timer), attotime::from_seconds(1)); + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // RAM /* Datapack */ - PSION_DATAPACK(config, m_pack1, 0); - PSION_DATAPACK(config, m_pack2, 0); - - /* Software lists */ - SOFTWARE_LIST(config, "pack_list").set_original("psion2"); -} - -/* basic configuration for 4 lines display */ -void psion_state::psion_4lines(machine_config &config) -{ - psion_2lines(config); - - /* video hardware */ - subdevice("screen")->set_size(6*20, 9*4); - subdevice("screen")->set_visarea_full(); - - m_lcdc->set_lcd_size(4, 20); - m_lcdc->set_pixel_update_cb(FUNC(psion_state::lz_pixel_update)); + PSION_DATAPACK(config, m_pack[0]).set_interface("psion_pack"); + PSION_DATAPACK(config, m_pack[1]).set_interface("psion_pack"); } void psion1_state::psion1(machine_config &config) { - psion_2lines(config); + psion_base(config); - HD6301X0(config.replace(), m_maincpu, 3.6864_MHz_XTAL); + HD6301X0(config, m_maincpu, 3.6864_MHz_XTAL); m_maincpu->set_addrmap(AS_PROGRAM, &psion1_state::psion1_mem); m_maincpu->nvram_enable_backup(true); m_maincpu->in_p2_cb().set(FUNC(psion1_state::port2_r)); @@ -593,192 +813,295 @@ void psion1_state::psion1(machine_config &config) m_maincpu->in_p6_cb().set(FUNC(psion1_state::port6_r)); m_maincpu->out_p6_cb().set(FUNC(psion1_state::port6_w)); - timer_device &nmi_timer(TIMER(config.replace(), "nmi_timer")); + RAM(config, m_ram).set_default_size("2K"); + + timer_device &nmi_timer(TIMER(config, "nmi_timer")); nmi_timer.configure_periodic(FUNC(psion1_state::nmi_timer), attotime::from_msec(500)); nmi_timer.set_start_delay(attotime::from_seconds(1)); - subdevice("screen")->set_size(6*16, 1*8); - subdevice("screen")->set_visarea_full(); + m_screen->set_size(6*16, 1*8); + m_screen->set_visarea_full(); m_lcdc->set_lcd_size(1, 16); m_lcdc->set_pixel_update_cb(FUNC(psion1_state::psion1_pixel_update)); - /* Software lists */ - SOFTWARE_LIST(config.replace(), "pack_list").set_original("psion1"); + SOFTWARE_LIST(config, "pack_list").set_original("psion1"); } -void psion_state::psioncm(machine_config &config) +void psion2_state::psion2(machine_config &config) { - psion_2lines(config); + psion_base(config); - m_maincpu->set_addrmap(AS_PROGRAM, &psion_state::psioncm_mem); + HD6303X(config, m_maincpu, 3.6864_MHz_XTAL); // internal operating frequency is 0.9216 MHz + m_maincpu->nvram_enable_backup(true); + m_maincpu->in_p2_cb().set(FUNC(psion2_state::port2_r)); + m_maincpu->out_p2_cb().set(FUNC(psion2_state::port2_w)); + m_maincpu->in_p5_cb().set(FUNC(psion2_state::port5_r)); + m_maincpu->in_p6_cb().set(FUNC(psion2_state::port6_r)); + m_maincpu->out_p6_cb().set(FUNC(psion2_state::port6_w)); + + RAM(config, m_ram).set_default_size("32K"); + + m_screen->set_size(6*16, 9*2); + m_screen->set_visarea_full(); + + m_lcdc->set_lcd_size(2, 16); + + TIMER(config, "nmi_timer").configure_periodic(FUNC(psion2_state::nmi_timer), attotime::from_seconds(1)); + + PSION_DATAPACK(config, m_topslot).set_interface("psion_topslot"); + + SOFTWARE_LIST(config, "pack_list").set_original("psion2"); } -void psion_state::psionla(machine_config &config) +void psion2_state::psioncm(machine_config &config) { - psion_2lines(config); + psion2(config); - m_maincpu->set_addrmap(AS_PROGRAM, &psion_state::psionla_mem); + m_maincpu->set_addrmap(AS_PROGRAM, &psion2_state::psioncm_mem); + + m_ram->set_default_size("8K"); + + subdevice("pack_list")->set_filter("CM"); } -void psion_state::psionlam(machine_config &config) +void psion2_state::psionxp(machine_config &config) { - psion_2lines(config); + psion2(config); - m_maincpu->set_addrmap(AS_PROGRAM, &psion_state::psionlam_mem); + m_maincpu->set_addrmap(AS_PROGRAM, &psion2_state::psionxp_mem); + + m_ram->set_default_size("16K"); + + subdevice("pack_list")->set_filter("XP"); } -void psion_state::psionp350(machine_config &config) +void psion2_state::psionla(machine_config &config) { - psion_2lines(config); + psionxp(config); - m_maincpu->set_addrmap(AS_PROGRAM, &psion_state::psionp350_mem); + m_maincpu->set_addrmap(AS_PROGRAM, &psion2_state::psionla_mem); - NVRAM(config, "nvram2", nvram_device::DEFAULT_ALL_0); // paged RAM + m_ram->set_default_size("32K"); } -void psion_state::psionlz(machine_config &config) +void psion2_state::psionp200(machine_config &config) { - psion_4lines(config); + psionla(config); - m_maincpu->set_addrmap(AS_PROGRAM, &psion_state::psionlz_mem); + subdevice("pack_list")->set_filter("POS"); +} - NVRAM(config, "nvram2", nvram_device::DEFAULT_ALL_0); // paged RAM +void psion2_state::psionp350(machine_config &config) +{ + psionla(config); + + m_ram->set_default_size("96K"); + + subdevice("pack_list")->set_filter("POS"); +} + +void psion2_state::psionlz(machine_config &config) +{ + psionla(config); + + /* video hardware */ + m_screen->set_size(6*20, 9*4); + m_screen->set_visarea_full(); + + m_lcdc->set_lcd_size(4, 20); + m_lcdc->set_pixel_update_cb(FUNC(psion2_state::lz_pixel_update)); + + subdevice("pack_list")->set_filter("LZ"); +} + +void psion2_state::psionlz64(machine_config &config) +{ + psionlz(config); + + m_ram->set_default_size("64K"); + + subdevice("pack_list")->set_filter("LZ,LZ64"); +} + +void psion2_state::psionp432(machine_config &config) +{ + psionlz(config); + + subdevice("pack_list")->set_filter("POS"); +} + +void psion2_state::psionp464(machine_config &config) +{ + psionlz64(config); + + subdevice("pack_list")->set_filter("POS"); } /* ROM definition */ ROM_START( psion1 ) ROM_REGION( 0x1000, "maincpu", ROMREGION_ERASEFF ) - ROM_SYSTEM_BIOS(0, "v1", "Organiser I") - ROMX_LOAD( "psion1.rom", 0x0000, 0x1000, CRC(7e2609c1) SHA1(a3320ea8ac3ab9e0039ee16f7c571731adde5869), ROM_BIOS(0)) + ROM_LOAD("psion1.rom", 0x0000, 0x1000, CRC(7e2609c1) SHA1(a3320ea8ac3ab9e0039ee16f7c571731adde5869)) ROM_END ROM_START( psioncm ) - ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) + ROM_REGION( 0x8000, "maincpu", ROMREGION_ERASEFF ) + ROM_DEFAULT_BIOS( "v33" ) ROM_SYSTEM_BIOS(0, "v24", "CM v2.4") - ROMX_LOAD("24-cm.dat", 0x8000, 0x8000, CRC(f6798394) SHA1(736997f0db9a9ee50d6785636bdc3f8ff1c33c66), ROM_BIOS(0)) + ROMX_LOAD("24-cm.rom", 0x0000, 0x8000, CRC(f6798394) SHA1(736997f0db9a9ee50d6785636bdc3f8ff1c33c66), ROM_BIOS(0)) ROM_SYSTEM_BIOS(1, "v26", "CM v2.6") - ROMX_LOAD("26-cm.rom", 0x8000, 0x8000, CRC(21b7c94c) SHA1(e0a3168c96a3f0b37b8698e86574e40597fe3c62), ROM_BIOS(1)) + ROMX_LOAD("26-cm.rom", 0x0000, 0x8000, CRC(21b7c94c) SHA1(e0a3168c96a3f0b37b8698e86574e40597fe3c62), ROM_BIOS(1)) ROM_SYSTEM_BIOS(2, "v33", "CM v3.3") - ROMX_LOAD("33-cm.rom", 0x8000, 0x8000, CRC(5c10b167) SHA1(6deea00fe648bddae1d61a22858023bc80277ea0), ROM_BIOS(2)) - ROM_SYSTEM_BIOS(3, "v33f","CM v3.3 French") - ROMX_LOAD("33-cmf.rom", 0x8000, 0x8000, CRC(4d626ce2) SHA1(82b96f11a0abfc1931b6022b84733d975ad7ab2b), ROM_BIOS(3)) - ROM_SYSTEM_BIOS(4, "v36f","CM v3.6 French") - ROMX_LOAD("36-cmf.rom", 0x8000, 0x8000, CRC(beabe0f5) SHA1(a5ef3bb92190a257cb0e94d58b2c23935436edeb), ROM_BIOS(4)) + ROMX_LOAD("33-cm.rom", 0x0000, 0x8000, CRC(5c10b167) SHA1(6deea00fe648bddae1d61a22858023bc80277ea0), ROM_BIOS(2)) + ROM_SYSTEM_BIOS(3, "v33f", "CM v3.3 French") + ROMX_LOAD("33-cmf.rom", 0x0000, 0x8000, CRC(4d626ce2) SHA1(82b96f11a0abfc1931b6022b84733d975ad7ab2b), ROM_BIOS(3)) + ROM_SYSTEM_BIOS(4, "v36f", "CM v3.6 French") + ROMX_LOAD("36-cmf.rom", 0x0000, 0x8000, CRC(beabe0f5) SHA1(a5ef3bb92190a257cb0e94d58b2c23935436edeb), ROM_BIOS(4)) ROM_END ROM_START( psionxp ) - ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) - ROM_SYSTEM_BIOS(0, "v26", "XP v2.6") - ROMX_LOAD( "26-xp.rom", 0x8000, 0x8000, CRC(a81db40f) SHA1(af72d94ccee1fa1dade8776bdbd39920665a68b7), ROM_BIOS(0) ) + ROM_REGION( 0x8000, "maincpu", ROMREGION_ERASEFF ) + ROM_DEFAULT_BIOS( "v31" ) + ROM_SYSTEM_BIOS(0, "v24", "XP v2.4") + ROMX_LOAD("24-xp.rom", 0x0000, 0x8000, CRC(3407062c) SHA1(c3818f3f0865cc235905bd7ef6cba325e44fa076), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "v26", "XP v2.6") + ROMX_LOAD("26-xp.rom", 0x0000, 0x8000, CRC(a81db40f) SHA1(af72d94ccee1fa1dade8776bdbd39920665a68b7), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(2, "v31", "XP v3.1") + ROMX_LOAD("31-xp.rom", 0x0000, 0x8000, CRC(cb10b6bf) SHA1(af5e82f62a149ff0dfa6e60414c928649a2abaaa), ROM_BIOS(2)) ROM_END ROM_START( psionla ) - ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) - ROM_SYSTEM_BIOS(0, "v33", "LA v3.3") - ROMX_LOAD("33-la.dat", 0x8000, 0x8000, CRC(02668ed4) SHA1(e5d4ee6b1cde310a2970ffcc6f29a0ce09b08c46), ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "v34g", "LA v3.4 German") - ROMX_LOAD("34-lag.rom", 0x8000, 0x8000, CRC(13a92c4b) SHA1(dab8bd6a41a5fd509c5ad4b0b0ab80d14f2c421a), ROM_BIOS(1)) - ROM_SYSTEM_BIOS(2, "v36", "LA v3.6") - ROMX_LOAD("36-la.rom", 0x8000, 0x8000, CRC(7442c7f6) SHA1(94f15bd06bd750be70fa4a4ab588237c5a703f65), ROM_BIOS(2)) - ROM_SYSTEM_BIOS(3, "v30", "LA v3.0") - ROMX_LOAD("30-lahp.rom", 0x8000, 0x8000, CRC(50192528) SHA1(c556d53f70bf5ecae756b2ebfc6d954912316bbe), ROM_BIOS(3)) + ROM_REGION( 0x8000, "maincpu", ROMREGION_ERASEFF ) + ROM_DEFAULT_BIOS( "v36" ) + ROM_SYSTEM_BIOS(0, "v30hp", "LA v3.0 Hand Held Products") + ROMX_LOAD("30-lahp.rom", 0x0000, 0x8000, CRC(50192528) SHA1(c556d53f70bf5ecae756b2ebfc6d954912316bbe), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "v33", "LA v3.3") + ROMX_LOAD("33-la.rom", 0x0000, 0x8000, CRC(02668ed4) SHA1(e5d4ee6b1cde310a2970ffcc6f29a0ce09b08c46), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(2, "v34g", "LA v3.4 German") + ROMX_LOAD("34-lag.rom", 0x0000, 0x8000, CRC(13a92c4b) SHA1(dab8bd6a41a5fd509c5ad4b0b0ab80d14f2c421a), ROM_BIOS(2)) + ROM_SYSTEM_BIOS(3, "v36", "LA v3.6") + ROMX_LOAD("36-la.rom", 0x0000, 0x8000, CRC(7442c7f6) SHA1(94f15bd06bd750be70fa4a4ab588237c5a703f65), ROM_BIOS(3)) ROM_SYSTEM_BIOS(4, "v36f", "LA v3.6 French") - ROMX_LOAD("36-laf.rom", 0x8000, 0x8000, CRC(036ef00e) SHA1(98f303273e570e94a1e25a58cf1ffcec0db32165), ROM_BIOS(4)) -ROM_END - -ROM_START( psionp200 ) - ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) - ROM_SYSTEM_BIOS(0, "v33", "POS200a v3.3") - ROMX_LOAD("33-p200a.rom", 0x8000, 0x8000, CRC(91e94998) SHA1(e9e8106eb9283d20452697859894aa407cc07bd1), ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "v36", "POS200 v3.6") - ROMX_LOAD("36-p200.rom", 0x8000, 0x8000, CRC(4569ef5b) SHA1(8c275474cc6e3f50156f0b6e32121cadd14ea8be), ROM_BIOS(1)) - ROM_SYSTEM_BIOS(2, "v36a", "POS200a v3.6") - ROMX_LOAD("36-p200a.rom", 0x8000, 0x8000, CRC(36cceeb7) SHA1(57069812c5a16babfff91dc7d7e0842e5dc68652), ROM_BIOS(2)) - ROM_SYSTEM_BIOS(3, "v36b", "POS250 v3.6") - ROMX_LOAD("36-p250.rom", 0x8000, 0x8000, CRC(235cc76a) SHA1(3229cdff4b049a1fbf9a758ce3abf3fdc9b547c9), ROM_BIOS(3)) -ROM_END - -ROM_START( psionp350 ) - ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) - ROM_SYSTEM_BIOS(0, "v36", "POS350 v3.6") - ROMX_LOAD("36-p350.dat", 0x8000, 0x8000, CRC(3a371a74) SHA1(9167210b2c0c3bd196afc08ca44ab23e4e62635e), ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "v38", "POS350 v3.8") - ROMX_LOAD("38-p350.dat", 0x8000, 0x8000, CRC(1b8b082f) SHA1(a3e875a59860e344f304a831148a7980f28eaa4a), ROM_BIOS(1)) + ROMX_LOAD("36-laf.rom", 0x0000, 0x8000, CRC(036ef00e) SHA1(98f303273e570e94a1e25a58cf1ffcec0db32165), ROM_BIOS(4)) + ROM_SYSTEM_BIOS(5, "v36g", "LA v3.6 German") + ROMX_LOAD("36-lag.rom", 0x0000, 0x8000, CRC(33c6b4d4) SHA1(81d665ce0fa325996d52004655349162093d60a6), ROM_BIOS(5)) ROM_END ROM_START( psionlam ) - ROM_REGION( 0x18000, "maincpu", ROMREGION_ERASEFF ) - ROM_SYSTEM_BIOS(0, "v37", "LA v3.7") - ROMX_LOAD("37-lam.dat", 0x8000, 0x10000, CRC(7ee3a1bc) SHA1(c7fbd6c8e47c9b7d5f636e9f56e911b363d6796b), ROM_BIOS(0)) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) + ROM_SYSTEM_BIOS(0, "v37", "LA v3.7 Multilingual") + ROMX_LOAD("37-lam.dat", 0x0000, 0x10000, CRC(7ee3a1bc) SHA1(c7fbd6c8e47c9b7d5f636e9f56e911b363d6796b), ROM_BIOS(0)) ROM_END -ROM_START( psionlz64 ) - ROM_REGION( 0x18000, "maincpu", ROMREGION_ERASEFF ) - ROM_SYSTEM_BIOS(0, "v44", "LZ64 v4.4") - ROMX_LOAD("44-lz64.dat", 0x8000, 0x10000, CRC(aa487913) SHA1(5a44390f63fc8c1bc94299ab2eb291bc3a5b989a), ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "v46si", "LZ64 v4.6 Spanish / Italian") - ROMX_LOAD("46-lz64i.rom", 0x8000, 0x10000, CRC(c96c7e65) SHA1(1b4af43657bbd3ecd92f370762bde166047b85e2), ROM_BIOS(1)) - ROM_SYSTEM_BIOS(2, "v43", "LZ64 v4.3") - ROMX_LOAD("43-lz64.rom", 0x8000, 0x10000, CRC(57e7a372) SHA1(46c2da1cfe991c0c1f2486e4aa28388767937ddd), ROM_BIOS(2)) - ROM_SYSTEM_BIOS(3, "v46a", "LZ64 v4.6a") - ROMX_LOAD("46a-lz64.rom", 0x8000, 0x10000, CRC(9b0d5a7a) SHA1(f1cdd6ef43cd65ef18e148deca0500f0c1ad2f80), ROM_BIOS(3)) - ROM_SYSTEM_BIOS(4, "v46b", "LZ64 v4.6b") - ROMX_LOAD("46b-lz64.rom", 0x8000, 0x10000, CRC(8d1101e2) SHA1(eddd0c3a2881667a1485b0d66f82f8c7792995c2), ROM_BIOS(4)) - ROM_SYSTEM_BIOS(5, "v45", "LZ64 v4.5") - ROMX_LOAD("45-lz64.rom", 0x8000, 0x10000, CRC(4fbd5d88) SHA1(43f97549d2060840aa6313d526000530f384a08f), ROM_BIOS(5)) - - ROM_REGION( 0x1000, "hd44780", 0 ) - ROM_LOAD("psion_lz_charset.bin", 0x0000, 0x1000, BAD_DUMP CRC(44bff6f6) SHA1(aef544548b783d608a7d55456f6c46f421a11ed7)) +ROM_START( psionp200 ) + ROM_REGION( 0x8000, "maincpu", ROMREGION_ERASEFF ) + ROM_SYSTEM_BIOS(0, "v36", "POS 200 v3.6") + ROMX_LOAD("36-p200.rom", 0x0000, 0x8000, CRC(4569ef5b) SHA1(8c275474cc6e3f50156f0b6e32121cadd14ea8be), ROM_BIOS(0)) ROM_END -ROM_START( psionlz64s ) - ROM_REGION( 0x18000, "maincpu", ROMREGION_ERASEFF ) - ROM_SYSTEM_BIOS(0, "v46", "LZ64 v4.6") - ROMX_LOAD("46-lz64s.dat", 0x8000, 0x10000, CRC(328d9772) SHA1(7f9e2d591d59ecfb0822d7067c2fe59542ea16dd), ROM_BIOS(0)) +ROM_START( psionp200a ) + ROM_REGION( 0x8000, "maincpu", ROMREGION_ERASEFF ) + ROM_DEFAULT_BIOS( "v36" ) + ROM_SYSTEM_BIOS(0, "v33", "Alpha POS 200 v3.3") + ROMX_LOAD("33-p200a.rom", 0x0000, 0x8000, CRC(91e94998) SHA1(e9e8106eb9283d20452697859894aa407cc07bd1), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "v36", "Alpha POS 200 v3.6") + ROMX_LOAD("36-p200a.rom", 0x0000, 0x8000, CRC(36cceeb7) SHA1(57069812c5a16babfff91dc7d7e0842e5dc68652), ROM_BIOS(1)) +ROM_END - ROM_REGION( 0x1000, "hd44780", 0 ) - ROM_LOAD("psion_lz_charset.bin", 0x0000, 0x1000, BAD_DUMP CRC(44bff6f6) SHA1(aef544548b783d608a7d55456f6c46f421a11ed7)) +ROM_START( psionp250 ) + ROM_REGION( 0x8000, "maincpu", ROMREGION_ERASEFF ) + ROM_SYSTEM_BIOS(0, "v36b", "POS 250 v3.6") + ROMX_LOAD("36-p250.rom", 0x0000, 0x8000, CRC(235cc76a) SHA1(3229cdff4b049a1fbf9a758ce3abf3fdc9b547c9), ROM_BIOS(0)) +ROM_END + +ROM_START( psionp350 ) + ROM_REGION( 0x8000, "maincpu", ROMREGION_ERASEFF ) + ROM_DEFAULT_BIOS( "v36" ) + ROM_SYSTEM_BIOS(0, "v36", "POS 350 v3.6") + ROMX_LOAD("36-p350.rom", 0x0000, 0x8000, CRC(3a371a74) SHA1(9167210b2c0c3bd196afc08ca44ab23e4e62635e), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "v38", "POS 350 v3.8") + ROMX_LOAD("38-p350.rom", 0x0000, 0x8000, CRC(1b8b082f) SHA1(a3e875a59860e344f304a831148a7980f28eaa4a), ROM_BIOS(1)) ROM_END ROM_START( psionlz ) - ROM_REGION( 0x18000, "maincpu", ROMREGION_ERASEFF ) - ROM_SYSTEM_BIOS(0, "v46", "LZ v4.6") - ROMX_LOAD("46-lz.dat", 0x8000, 0x10000, CRC(22715f48) SHA1(cf460c81cadb53eddb7afd8dadecbe8c38ea3fc2), ROM_BIOS(0)) - ROM_SYSTEM_BIOS(1, "v42", "LZ v4.2") - ROMX_LOAD("42-lz.rom", 0x8000, 0x10000, CRC(f2d6ad47) SHA1(ee8315ae872463068d805c6e0b71f62ae8eb65be), ROM_BIOS(1)) - ROM_SYSTEM_BIOS(2, "v44", "LZ v4.4") - ROMX_LOAD("44-lz.rom", 0x8000, 0x10000, CRC(4a0a990b) SHA1(dde0ba69a4a7f02b610ad6bd69a8b8552b060223), ROM_BIOS(2)) - ROM_SYSTEM_BIOS(3, "v45", "LZ v4.5") - ROMX_LOAD("45-lz.rom", 0x8000, 0x10000, CRC(f95d8f39) SHA1(cb64152c2418bf730c89999d1b13c1d1ada1f082), ROM_BIOS(3)) - ROM_SYSTEM_BIOS(4, "v45s", "LZ v4.5S") - ROMX_LOAD("45-lzs.rom", 0x8000, 0x10000, CRC(2d082d7f) SHA1(fcd00864a0cc617e61997240945ea70a8e9fa211), ROM_BIOS(4)) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) + ROM_DEFAULT_BIOS( "v46" ) + ROM_SYSTEM_BIOS(0, "v42", "LZ v4.2 English, French, German") + ROMX_LOAD("42-lz.rom", 0x0000, 0x10000, CRC(f2d6ad47) SHA1(ee8315ae872463068d805c6e0b71f62ae8eb65be), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "v44", "LZ v4.4 English, French, German") + ROMX_LOAD("44-lz.rom", 0x0000, 0x10000, CRC(4a0a990b) SHA1(dde0ba69a4a7f02b610ad6bd69a8b8552b060223), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(2, "v45", "LZ v4.5 English, French, German") + ROMX_LOAD("45-lz.rom", 0x0000, 0x10000, CRC(f95d8f39) SHA1(cb64152c2418bf730c89999d1b13c1d1ada1f082), ROM_BIOS(2)) + ROM_SYSTEM_BIOS(3, "v45i", "LZ v4.5 English, Spanish, Italian") + ROMX_LOAD("45-lzi.rom", 0x0000, 0x10000, CRC(202b556d) SHA1(39f061c4b94a1371bfe62484828a8ce424d7315c), ROM_BIOS(3)) + ROM_SYSTEM_BIOS(4, "v45s", "LZ v4.5 English, Swedish, Danish") + ROMX_LOAD("45-lzs.rom", 0x0000, 0x10000, CRC(2d082d7f) SHA1(fcd00864a0cc617e61997240945ea70a8e9fa211), ROM_BIOS(4)) + ROM_SYSTEM_BIOS(5, "v46", "LZ v4.6 English, French, German") + ROMX_LOAD("46-lz.rom", 0x0000, 0x10000, CRC(22715f48) SHA1(cf460c81cadb53eddb7afd8dadecbe8c38ea3fc2), ROM_BIOS(5)) + ROM_SYSTEM_BIOS(6, "v46i", "LZ v4.6 English, Spanish, Italian") + ROMX_LOAD("46-lzi.rom", 0x0000, 0x10000, CRC(ee50b6e9) SHA1(f1821ad179b018d6b22129ef4e8e8b23f452b2f6), ROM_BIOS(6)) ROM_REGION( 0x1000, "hd44780", 0 ) - ROM_LOAD("psion_lz_charset.bin", 0x0000, 0x1000, BAD_DUMP CRC(44bff6f6) SHA1(aef544548b783d608a7d55456f6c46f421a11ed7)) + ROM_LOAD("psion_lz_charset.bin", 0x0000, 0x1000, BAD_DUMP CRC(44bff6f6) SHA1(aef544548b783d608a7d55456f6c46f421a11ed7)) +ROM_END + +ROM_START( psionlz64 ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) + ROM_DEFAULT_BIOS( "v46a" ) + ROM_SYSTEM_BIOS(0, "v42", "LZ64 v4.2 English, French, German") + ROMX_LOAD("42-lz64.rom", 0x0000, 0x10000, CRC(2df76f5a) SHA1(4255bc2abfc6f6cb666c0464a86d4ac98050268e), ROM_BIOS(0)) + ROM_SYSTEM_BIOS(1, "v43", "LZ64 v4.3 English, French, German") + ROMX_LOAD("43-lz64.rom", 0x0000, 0x10000, CRC(57e7a372) SHA1(46c2da1cfe991c0c1f2486e4aa28388767937ddd), ROM_BIOS(1)) + ROM_SYSTEM_BIOS(2, "v44", "LZ64 v4.4 English, French, German") + ROMX_LOAD("44-lz64.rom", 0x0000, 0x10000, CRC(aa487913) SHA1(5a44390f63fc8c1bc94299ab2eb291bc3a5b989a), ROM_BIOS(2)) + ROM_SYSTEM_BIOS(3, "v45", "LZ64 v4.5 English, French, German") + ROMX_LOAD("45-lz64.rom", 0x0000, 0x10000, CRC(4fbd5d88) SHA1(43f97549d2060840aa6313d526000530f384a08f), ROM_BIOS(3)) + ROM_SYSTEM_BIOS(4, "v46a", "LZ64 v4.6a English, French, German") + ROMX_LOAD("46a-lz64.rom", 0x0000, 0x10000, CRC(9b0d5a7a) SHA1(f1cdd6ef43cd65ef18e148deca0500f0c1ad2f80), ROM_BIOS(4)) + ROM_SYSTEM_BIOS(5, "v46b", "LZ64 v4.6b English, French, German") + ROMX_LOAD("46b-lz64.rom", 0x0000, 0x10000, CRC(8d1101e2) SHA1(eddd0c3a2881667a1485b0d66f82f8c7792995c2), ROM_BIOS(5)) + ROM_SYSTEM_BIOS(6, "v46i", "LZ64 v4.6 English, Spanish, Italian") + ROMX_LOAD("46-lz64i.rom", 0x0000, 0x10000, CRC(c96c7e65) SHA1(1b4af43657bbd3ecd92f370762bde166047b85e2), ROM_BIOS(6)) + ROM_SYSTEM_BIOS(7, "v46s", "LZ64 v4.6 English, Swedish, Danish") + ROMX_LOAD("46-lz64s.rom", 0x0000, 0x10000, CRC(328d9772) SHA1(7f9e2d591d59ecfb0822d7067c2fe59542ea16dd), ROM_BIOS(7)) + + ROM_REGION( 0x1000, "hd44780", 0 ) + ROM_LOAD("psion_lz_charset.bin", 0x0000, 0x1000, BAD_DUMP CRC(44bff6f6) SHA1(aef544548b783d608a7d55456f6c46f421a11ed7)) +ROM_END + +ROM_START( psionp432 ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) + ROM_SYSTEM_BIOS(0, "v46", "POS432 v4.6") + ROMX_LOAD("46-p432n.rom", 0x0000, 0x10000, CRC(6683737a) SHA1(2c6bd9938f1b1d762adc8d45802c24f007e3445a), ROM_BIOS(0)) + + ROM_REGION( 0x1000, "hd44780", 0 ) + ROM_LOAD("psion_lz_charset.bin", 0x0000, 0x1000, BAD_DUMP CRC(44bff6f6) SHA1(aef544548b783d608a7d55456f6c46f421a11ed7)) ROM_END ROM_START( psionp464 ) - ROM_REGION( 0x18000, "maincpu", ROMREGION_ERASEFF ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) ROM_SYSTEM_BIOS(0, "v46", "POS464 v4.6") - ROMX_LOAD( "46-p464.dat", 0x8000, 0x10000, CRC(672a0945) SHA1(d2a6e3fe1019d1bd7ae4725e33a0b9973f8cd7d8), ROM_BIOS(0)) + ROMX_LOAD("46-p464.rom", 0x0000, 0x10000, CRC(672a0945) SHA1(d2a6e3fe1019d1bd7ae4725e33a0b9973f8cd7d8), ROM_BIOS(0)) ROM_REGION( 0x1000, "hd44780", 0 ) - ROM_LOAD( "psion_lz_charset.bin", 0x0000, 0x1000, BAD_DUMP CRC(44bff6f6) SHA1(aef544548b783d608a7d55456f6c46f421a11ed7)) + ROM_LOAD("psion_lz_charset.bin", 0x0000, 0x1000, BAD_DUMP CRC(44bff6f6) SHA1(aef544548b783d608a7d55456f6c46f421a11ed7)) ROM_END -/* Driver */ +} // anonymous namespace -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1984, psion1, 0, 0, psion1, psion1, psion1_state, empty_init, "Psion", "Organiser I", MACHINE_NOT_WORKING ) -COMP( 1986, psioncm, 0, 0, psioncm, psion, psion_state, empty_init, "Psion", "Organiser II CM", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -COMP( 1986, psionla, psioncm, 0, psionla, psion, psion_state, empty_init, "Psion", "Organiser II LA", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -COMP( 1986, psionxp, psioncm, 0, psionla, psion, psion_state, empty_init, "Psion", "Organiser II XP", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -COMP( 1986, psionp200, psioncm, 0, psionp350, psion, psion_state, empty_init, "Psion", "Organiser II P200", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -COMP( 1986, psionp350, psioncm, 0, psionp350, psion, psion_state, empty_init, "Psion", "Organiser II P350", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -COMP( 1986, psionlam, psioncm, 0, psionlam, psion, psion_state, empty_init, "Psion", "Organiser II LAM", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -COMP( 1989, psionlz, 0, 0, psionlz, psion, psion_state, empty_init, "Psion", "Organiser II LZ", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -COMP( 1989, psionlz64, psionlz, 0, psionlz, psion, psion_state, empty_init, "Psion", "Organiser II LZ64", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -COMP( 1989, psionlz64s, psionlz, 0, psionlz, psion, psion_state, empty_init, "Psion", "Organiser II LZ64S", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) -COMP( 1989, psionp464, psionlz, 0, psionlz, psion, psion_state, empty_init, "Psion", "Organiser II P464", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) + +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1984, psion1, 0, 0, psion1, psion1, psion1_state, empty_init, "Psion", "Organiser I", MACHINE_NOT_WORKING ) +COMP( 1986, psioncm, 0, 0, psioncm, psion2, psion2_state, empty_init, "Psion", "Organiser II CM", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +COMP( 1986, psionxp, psioncm, 0, psionxp, psion2, psion2_state, empty_init, "Psion", "Organiser II XP", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +COMP( 1986, psionla, psioncm, 0, psionla, psion2, psion2_state, empty_init, "Psion", "Organiser II LA", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +COMP( 1986, psionlam, psioncm, 0, psionla, psion2, psion2_state, empty_init, "Psion", "Organiser II LA Multilingual", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +COMP( 1986, psionp200, psioncm, 0, psionp200, psion2n, psion2_state, empty_init, "Psion", "Organiser II POS 200", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +COMP( 1986, psionp200a, psioncm, 0, psionp200, psion2a, psion2_state, empty_init, "Psion", "Organiser II Alpha POS 200", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +COMP( 1986, psionp250, psioncm, 0, psionp200, psion2, psion2_state, empty_init, "Psion", "Organiser II P 250", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +COMP( 1986, psionp350, psioncm, 0, psionp350, psion2, psion2_state, empty_init, "Psion", "Organiser II P 350", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +COMP( 1989, psionlz, 0, 0, psionlz, psion2, psion2_state, empty_init, "Psion", "Organiser II LZ", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +COMP( 1989, psionlz64, psionlz, 0, psionlz64, psion2, psion2_state, empty_init, "Psion", "Organiser II LZ64", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +COMP( 1989, psionp432, psionlz, 0, psionp432, psion2n, psion2_state, empty_init, "Psion", "Organiser II P 432", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) +COMP( 1989, psionp464, psionlz, 0, psionp464, psion2, psion2_state, empty_init, "Psion", "Organiser II P 464", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_GRAPHICS ) diff --git a/src/mame/psion/psion.h b/src/mame/psion/psion.h deleted file mode 100644 index c77f6b134fe..00000000000 --- a/src/mame/psion/psion.h +++ /dev/null @@ -1,120 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Sandro Ronco -/*************************************************************************** - - Psion Organiser II series - -****************************************************************************/ -#ifndef MAME_PSION_PSION_H -#define MAME_PSION_PSION_H - -#pragma once - -#include "cpu/m6800/m6801.h" -#include "machine/nvram.h" -#include "psion_pack.h" -#include "machine/timer.h" -#include "video/hd44780.h" -#include "sound/beep.h" -#include "emupal.h" - - -// ======================> psion_state - -class psion_state : public driver_device -{ -public: - psion_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_lcdc(*this, "hd44780") - , m_beep(*this, "beeper") - , m_pack1(*this, "pack1") - , m_pack2(*this, "pack2") - , m_nvram1(*this, "nvram1") - , m_nvram2(*this, "nvram2") - , m_ram(*this, "ram") - , m_kb_lines(*this, "K%u", 1U) - { } - - void psion_2lines(machine_config &config); - void psion_4lines(machine_config &config); - void psionlam(machine_config &config); - void psioncm(machine_config &config); - void psionlz(machine_config &config); - void psionla(machine_config &config); - void psionp350(machine_config &config); - - DECLARE_INPUT_CHANGED_MEMBER(psion_on); - -protected: - required_device m_maincpu; - required_device m_lcdc; - required_device m_beep; - required_device m_pack1; - required_device m_pack2; - required_device m_nvram1; - optional_device m_nvram2; - - uint16_t m_kb_counter = 0; - bool m_enable_nmi = false; - uint8_t m_pulse = 0; - - // RAM/ROM banks - required_shared_ptr m_ram; - std::unique_ptr m_paged_ram; - uint8_t m_rom_bank = 0; - uint8_t m_ram_bank = 0; - uint8_t m_ram_bank_count = 0; - uint8_t m_rom_bank_count = 0; - - required_ioport_array<7> m_kb_lines; - - virtual void machine_start() override ATTR_COLD; - virtual void machine_reset() override ATTR_COLD; - void nvram_init(nvram_device &nvram, void *data, size_t size); - - uint8_t kb_read(); - void update_banks(); - void port2_w(offs_t offset, uint8_t data, uint8_t ddr); - uint8_t port2_r(); - uint8_t port5_r(); - void port6_w(uint8_t data); - uint8_t port6_r(); - void io_rw(uint16_t offset); - void io_w(offs_t offset, uint8_t data); - uint8_t io_r(offs_t offset); - void psion_palette(palette_device &palette) const; - TIMER_DEVICE_CALLBACK_MEMBER(nmi_timer); - - HD44780_PIXEL_UPDATE(lz_pixel_update); - void psion_int_reg(address_map &map) ATTR_COLD; - void psioncm_mem(address_map &map) ATTR_COLD; - void psionla_mem(address_map &map) ATTR_COLD; - void psionlam_mem(address_map &map) ATTR_COLD; - void psionlz_mem(address_map &map) ATTR_COLD; - void psionp350_mem(address_map &map) ATTR_COLD; -}; - - -class psion1_state : public psion_state -{ -public: - psion1_state(const machine_config &mconfig, device_type type, const char *tag) - : psion_state(mconfig, type, tag) - { } - - void psion1(machine_config &config); - -private: - virtual void machine_reset() override ATTR_COLD; - - uint8_t reset_kb_counter_r(); - uint8_t inc_kb_counter_r(); - uint8_t switchoff_r(); - - HD44780_PIXEL_UPDATE(psion1_pixel_update); - void psion1_mem(address_map &map) ATTR_COLD; -}; - -#endif // MAME_PSION_PSION_H diff --git a/src/mame/psion/psion_pack.cpp b/src/mame/psion/psion_pack.cpp index cafb221303a..879f8fe335c 100644 --- a/src/mame/psion/psion_pack.cpp +++ b/src/mame/psion/psion_pack.cpp @@ -2,7 +2,7 @@ // copyright-holders:Sandro Ronco /**************************************************************************** - psion_pack.c + psion_pack.cpp Psion Organiser II Datapack emulation @@ -67,6 +67,7 @@ DEFINE_DEVICE_TYPE(PSION_DATAPACK, datapack_device, "datapack", "Psion Datapack" datapack_device::datapack_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, PSION_DATAPACK, tag, owner, clock) , device_memcard_image_interface(mconfig, *this) + , m_interface(nullptr) { } diff --git a/src/mame/psion/psion_pack.h b/src/mame/psion/psion_pack.h index 27e1400de1a..dcb5e8ecfa4 100644 --- a/src/mame/psion/psion_pack.h +++ b/src/mame/psion/psion_pack.h @@ -23,16 +23,18 @@ class datapack_device : public device_t, { public: // construction/destruction - datapack_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + datapack_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); virtual ~datapack_device(); + void set_interface(const char *interface) { m_interface = interface; } + // device_image_interface implementation virtual std::pair call_load() override; virtual void call_unload() override; virtual std::pair call_create(int format_type, util::option_resolution *create_args) override; virtual bool is_reset_on_load() const noexcept override { return false; } - virtual const char *image_interface() const noexcept override { return "psion_pack"; } + virtual const char *image_interface() const noexcept override { return m_interface; } virtual const char *file_extensions() const noexcept override { return "opk"; } virtual const char *image_type_name() const noexcept override { return "datapack"; } virtual const char *image_brief_type_name() const noexcept override { return "dpak"; } @@ -64,6 +66,8 @@ private: uint16_t m_counter = 0; //address counter uint8_t m_page = 0; //active page (only for paged Datapack) uint8_t m_segment = 0; //active segment (only for segmented Datapack) + + const char *m_interface; };