From af17e41011532e97fb7eb15ff6ed6efe79aa852f Mon Sep 17 00:00:00 2001 From: Nigel Barnes Date: Sat, 22 Jul 2023 16:43:51 +0100 Subject: [PATCH] psion/psion3.cpp: Added non-volatile RAM for Series 3 machines, and batteries are now good. psion/psion3a.cpp: Added non-volatile RAM for Series 3a/3c/3mx machines, and CODEC sound device. psion/psionhc.cpp: Added non-volatile RAM for Series HC machines. psion/siena.cpp: Added non-volatile RAM. psion/workabout.cpp: Added non-volatile RAM for Workabout machines. Systems promoted to working --------------------------- Series 3 [Nigel Barnes] Series 3a [Nigel Barnes] Series 3c [Nigel Barnes] Series 3mx [Nigel Barnes] Siena [Nigel Barnes] Workabout [Nigel Barnes] Workabout mx [Nigel Barnes] Clones promoted to working -------------------------- Pocket Book [Nigel Barnes] Pocket Book II [Nigel Barnes] Series 3a (2M) [Nigel Barnes] Series 3a (2M) (German) [Nigel Barnes] Series 3a (2M) (Russian) [Nigel Barnes] Series 3s [Nigel Barnes] --- src/mame/psion/psion3.cpp | 43 ++++++- src/mame/psion/psion3a.cpp | 210 +++++++++++++++++++++++++++-------- src/mame/psion/psionhc.cpp | 45 ++++++-- src/mame/psion/siena.cpp | 27 ++++- src/mame/psion/workabout.cpp | 12 +- 5 files changed, 272 insertions(+), 65 deletions(-) diff --git a/src/mame/psion/psion3.cpp b/src/mame/psion/psion3.cpp index 3451f2f7b2f..aecdcfafde9 100644 --- a/src/mame/psion/psion3.cpp +++ b/src/mame/psion/psion3.cpp @@ -5,13 +5,13 @@ Psion Series 3 TODO: - - battery backed RAM - DTMF tone generator ******************************************************************************/ #include "emu.h" #include "cpu/nec/nec.h" +#include "machine/nvram.h" #include "machine/psion_asic1.h" #include "machine/psion_asic2.h" #include "machine/psion_ssd.h" @@ -38,6 +38,7 @@ public: , m_asic1(*this, "asic1") , m_asic2(*this, "asic2") , m_ram(*this, "ram") + , m_nvram(*this, "nvram") , m_palette(*this, "palette") , m_keyboard(*this, "COL%u", 0U) , m_dtmf(*this, "dtmf") @@ -60,6 +61,7 @@ private: required_device m_asic1; required_device m_asic2; required_device m_ram; + required_device m_nvram; required_device m_palette; required_ioport_array<10> m_keyboard; required_device m_dtmf; @@ -72,12 +74,16 @@ private: void mem_map(address_map &map); void io_map(address_map &map); void asic1_map(address_map &map); + + uint8_t port_data_r(); + void port_data_w(uint8_t data); }; void psion3_state::machine_start() { m_asic1->space(0).install_ram(0, m_ram->mask(), m_ram->pointer()); + m_nvram->set_base(m_ram->pointer(), m_ram->size()); } void psion3_state::machine_reset() @@ -100,6 +106,7 @@ void psion3_state::io_map(address_map &map) void psion3_state::asic1_map(address_map &map) { + map(0x00000, 0x7ffff).noprw(); map(0x80000, 0xfffff).rom().region("flash", 0); } @@ -244,6 +251,25 @@ INPUT_CHANGED_MEMBER(psion3_state::key_on) } +uint8_t psion3_state::port_data_r() +{ + // b0 MainBattery - 0 Low, 1 Good + // b1 BackupBattery - 0 Low, 1 Good + // b2 ? + // b3 ExternalPower - 0 Yes, 1 No + // b7 NC + return 0x03; +} + +void psion3_state::port_data_w(uint8_t data) +{ + // b4 ? + // b5 VOL0 + // b6 VOL1 + logerror("port_data_w: %02x\n", data); +} + + void psion3_state::palette_init(palette_device &palette) { palette.set_pen_color(0, rgb_t(170, 180, 160)); @@ -267,6 +293,7 @@ void psion3_state::psion3(machine_config &config) PALETTE(config, "palette", FUNC(psion3_state::palette_init), 2); PSION_ASIC1(config, m_asic1, 7.68_MHz_XTAL); + m_asic1->set_screen("screen"); m_asic1->set_laptop_mode(false); m_asic1->set_addrmap(0, &psion3_state::asic1_map); m_asic1->int_cb().set_inputline(m_maincpu, INPUT_LINE_IRQ0); @@ -280,6 +307,8 @@ void psion3_state::psion3(machine_config &config) m_asic2->buz_cb().set(m_speaker, FUNC(speaker_sound_device::level_w)); m_asic2->buzvol_cb().set([this](int state) { m_speaker->set_output_gain(ALL_OUTPUTS, state ? 1.0 : 0.25); }); m_asic2->col_cb().set([this](uint8_t data) { return m_keyboard[data]->read(); }); + m_asic2->read_pd_cb().set(FUNC(psion3_state::port_data_r)); + m_asic2->write_pd_cb().set(FUNC(psion3_state::port_data_w)); m_asic2->data_r<1>().set(m_ssd[0], FUNC(psion_ssd_device::data_r)); // SSD Pack 1 m_asic2->data_w<1>().set(m_ssd[0], FUNC(psion_ssd_device::data_w)); m_asic2->data_r<2>().set(m_ssd[1], FUNC(psion_ssd_device::data_r)); // SSD Pack 2 @@ -288,6 +317,7 @@ void psion3_state::psion3(machine_config &config) m_asic2->data_w<7>().set(m_sibo, FUNC(psion_sibo_slot_device::data_w)); RAM(config, m_ram).set_default_size("256K").set_extra_options("128K"); + NVRAM(config, "nvram", nvram_device::DEFAULT_NONE); SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00); // Piezo buzzer @@ -300,7 +330,7 @@ void psion3_state::psion3(machine_config &config) m_ssd[1]->door_cb().set(m_asic2, FUNC(psion_asic2_device::dnmi_w)); PSION_SIBO_SLOT(config, m_sibo, psion_sibo_devices, nullptr); - //m_sibo->int_cb().set(m_asic2, FUNC(psion_asic2_device::eint_w)); // TODO: unknown interrupt line + m_sibo->int_cb().set(m_asic2, FUNC(psion_asic2_device::sds_int_w)); SOFTWARE_LIST(config, "ssd_list").set_original("psion_ssd").set_filter("S3"); } @@ -330,12 +360,15 @@ ROM_START(pocketbk) ROM_REGION16_LE(0x80000, "flash", ROMREGION_ERASEFF) ROM_SYSTEM_BIOS(0, "191f", "V1.91F/ACN 270892") ROMX_LOAD("pb_v1.91f_acn.bin", 0x00000, 0x80000, CRC(875a804b) SHA1(9db07b3de9bcb9cc0c56c9a6fb35b9653eba68b3), ROM_BIOS(0)) + + ROM_REGION(0x80000, "ssd1", 0) // Acorn Spell was only available pre-installed in a Pocket Book + ROM_LOAD("acspell.bin", 0x00000, 0x80000, CRC(2e55032a) SHA1(560a425a19b3f3d12da9a0e2127f2c67aa829082)) ROM_END } // anonymous namespace // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1991, psion3, 0, 0, psion3, psion3, psion3_state, empty_init, "Psion", "Series 3", MACHINE_NOT_WORKING ) -COMP( 1992, pocketbk, psion3, 0, psion3s, pocketbk, psion3_state, empty_init, "Acorn Computers", "Pocket Book", MACHINE_NOT_WORKING ) -COMP( 1994, psion3s, psion3, 0, psion3s, psion3s, psion3_state, empty_init, "Psion", "Series 3s", MACHINE_NOT_WORKING ) +COMP( 1991, psion3, 0, 0, psion3, psion3, psion3_state, empty_init, "Psion", "Series 3", MACHINE_IMPERFECT_SOUND ) +COMP( 1992, pocketbk, psion3, 0, psion3s, pocketbk, psion3_state, empty_init, "Acorn Computers", "Pocket Book", MACHINE_IMPERFECT_SOUND ) +COMP( 1994, psion3s, psion3, 0, psion3s, psion3s, psion3_state, empty_init, "Psion", "Series 3s", MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/psion/psion3a.cpp b/src/mame/psion/psion3a.cpp index 224abf7fb38..3129deb527b 100644 --- a/src/mame/psion/psion3a.cpp +++ b/src/mame/psion/psion3a.cpp @@ -5,15 +5,16 @@ Psion Series 3a/3c/3mx TODO: - - battery backed RAM - - sound devices + - sound devices, replace fake Psion Codec device with M7542 and M7702-03 - serial ports - fix RAM detection for 3mx ******************************************************************************/ #include "emu.h" +#include "machine/nvram.h" #include "machine/psion_asic9.h" +//#include "machine/psion_condor.h" #include "machine/psion_ssd.h" #include "machine/ram.h" #include "sound/spkrdev.h" @@ -27,45 +28,96 @@ #include "utf8.h" -namespace { - -class psion3a_state : public driver_device +class psion3a_codec_device : public device_t, public device_sound_interface { public: - psion3a_state(const machine_config &mconfig, device_type type, const char *tag) + psion3a_codec_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); + + void pcm_in(uint8_t data); + +protected: + void device_start() override; + void sound_stream_update(sound_stream &stream, std::vector const &inputs, std::vector &outputs) override; + +private: + sound_stream *m_stream; + int16_t m_audio_out; +}; + +DEFINE_DEVICE_TYPE(PSION_S3A_CODEC, psion3a_codec_device, "psion3a_codec", "Series 3a A-law Codec") + +psion3a_codec_device::psion3a_codec_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, PSION_S3A_CODEC, tag, owner, clock) + , device_sound_interface(mconfig, *this) + , m_stream(nullptr) + , m_audio_out(0) +{ +} + +void psion3a_codec_device::device_start() +{ + m_stream = stream_alloc(0, 1, 8000); +} + +void psion3a_codec_device::sound_stream_update(sound_stream &stream, std::vector const &inputs, std::vector &outputs) +{ + outputs[0].fill(stream_buffer::sample_t(m_audio_out) * (1.0 / 4096.0)); +} + +void psion3a_codec_device::pcm_in(uint8_t data) +{ + m_stream->update(); + + // Expand 8-bit signed compressed number to 16-bit 2's complement integer (13-bit magnitude) using A-law + data ^= 0x55; + + uint8_t seg = (data & 0x70) >> 4; + m_audio_out = 0; + if (seg) + { + m_audio_out = 0x10; + seg--; + } + m_audio_out = (((m_audio_out + (data & 0x0f)) << 1) + 1) << seg; + + m_audio_out *= (data & 0x80) ? -1.0 : 1.0; +} + + +namespace { + +class psion3a_base_state : public driver_device +{ +public: + psion3a_base_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_asic9(*this, "asic9") , m_ram(*this, "ram") + , m_nvram(*this, "nvram") , m_palette(*this, "palette") , m_keyboard(*this, "COL%u", 0U) , m_speaker(*this, "speaker") + , m_codec(*this, "codec") , m_ssd(*this, "ssd%u", 1U) - , m_sibo(*this, "sibo") - , m_honda(*this, "honda") { } void psion_asic9(machine_config &config); - void psion3a(machine_config &config); - void psion3a2(machine_config &config); - void psion3c(machine_config &config); - void psion3mx(machine_config &config); DECLARE_INPUT_CHANGED_MEMBER(wakeup); protected: virtual void machine_start() override; - virtual void machine_reset() override; -private: required_device m_asic9; required_device m_ram; + required_device m_nvram; required_device m_palette; required_ioport_array<8> m_keyboard; required_device m_speaker; + required_device m_codec; required_device_array m_ssd; - optional_device m_sibo; - optional_device m_honda; +private: void palette_init(palette_device &palette); uint16_t kbd_r(); @@ -73,13 +125,63 @@ private: uint8_t m_key_col = 0; }; - -void psion3a_state::machine_start() +class psion3a_state : public psion3a_base_state { +public: + psion3a_state(const machine_config &mconfig, device_type type, const char *tag) + : psion3a_base_state(mconfig, type, tag) + , m_sibo(*this, "sibo") + { } + + void psion3a(machine_config &config); + void psion3a2(machine_config &config); + +private: + required_device m_sibo; +}; + +class psion3c_state : public psion3a_base_state +{ +public: + psion3c_state(const machine_config &mconfig, device_type type, const char *tag) + : psion3a_base_state(mconfig, type, tag) + //, m_condor(*this, "condor") + , m_honda(*this, "honda") + { } + + void psion3c(machine_config &config); + +protected: + virtual void machine_reset() override; + +private: + //required_device m_condor; + required_device m_honda; +}; + +class psion3mx_state : public psion3a_base_state +{ +public: + psion3mx_state(const machine_config &mconfig, device_type type, const char *tag) + : psion3a_base_state(mconfig, type, tag) + , m_honda(*this, "honda") + { } + + void psion3mx(machine_config &config); + +private: + required_device m_honda; +}; + + +void psion3a_base_state::machine_start() +{ + m_nvram->set_base(m_ram->pointer(), m_ram->size()); } -void psion3a_state::machine_reset() +void psion3c_state::machine_reset() { + //m_asic9->io_space().install_readwrite_handler(0x0100, 0x011f, read8sm_delegate(*m_condor, FUNC(psion_condor_device::read)), write8sm_delegate(*m_condor, FUNC(psion_condor_device::write)), 0x00ff); } @@ -260,13 +362,13 @@ static INPUT_PORTS_START( pocketbk2 ) INPUT_PORTS_END -INPUT_CHANGED_MEMBER(psion3a_state::wakeup) +INPUT_CHANGED_MEMBER(psion3a_base_state::wakeup) { m_asic9->eint0_w(newval); } -uint16_t psion3a_state::kbd_r() +uint16_t psion3a_base_state::kbd_r() { uint16_t data = 0x00; @@ -280,7 +382,7 @@ uint16_t psion3a_state::kbd_r() } -void psion3a_state::palette_init(palette_device &palette) +void psion3a_base_state::palette_init(palette_device &palette) { palette.set_pen_color(0, rgb_t(190, 220, 190)); palette.set_pen_color(1, rgb_t(130, 130, 110)); @@ -288,11 +390,12 @@ void psion3a_state::palette_init(palette_device &palette) } -void psion3a_state::psion_asic9(machine_config &config) +void psion3a_base_state::psion_asic9(machine_config &config) { PSION_ASIC9(config, m_asic9, 7.68_MHz_XTAL); // V30H + m_asic9->set_screen("screen"); m_asic9->set_ram_rom("ram", "rom"); - m_asic9->port_ab_r().set(FUNC(psion3a_state::kbd_r)); + m_asic9->port_ab_r().set(FUNC(psion3a_base_state::kbd_r)); m_asic9->buz_cb().set(m_speaker, FUNC(speaker_sound_device::level_w)); //m_asic9->buzvol_cb().set([this](int state) { m_speaker->set_output_gain(ALL_OUTPUTS, state ? 1.0 : 0.25); }); m_asic9->col_cb().set([this](uint8_t data) { m_key_col = data; }); @@ -307,12 +410,13 @@ void psion3a_state::psion_asic9(machine_config &config) screen.set_refresh_hz(66); screen.set_screen_update(m_asic9, FUNC(psion_asic9_device::screen_update)); screen.set_palette(m_palette); - PALETTE(config, "palette", FUNC(psion3a_state::palette_init), 3); + PALETTE(config, "palette", FUNC(psion3a_base_state::palette_init), 3); SPEAKER(config, "mono").front_center(); - SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00); // Piezo buzzer + SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00); RAM(config, m_ram); + NVRAM(config, "nvram", nvram_device::DEFAULT_NONE); PSION_SSD(config, m_ssd[0]); m_ssd[0]->door_cb().set(m_asic9, FUNC(psion_asic9_device::medchng_w)); @@ -330,11 +434,12 @@ void psion3a_state::psion3a(machine_config &config) // SIBO expansion port PSION_SIBO_SLOT(config, m_sibo, psion_sibo_devices, nullptr); - //m_sibo->int_cb().set(m_asic9, FUNC(psion_asic9_device::eint_w)); // TODO: unknown interrupt line + m_sibo->int_cb().set(m_asic9, FUNC(psion_asic9_device::sds_int_w)); m_asic9->data_r<4>().set(m_sibo, FUNC(psion_sibo_slot_device::data_r)); m_asic9->data_w<4>().set(m_sibo, FUNC(psion_sibo_slot_device::data_w)); - // TODO: M7542 + PSION_S3A_CODEC(config, m_codec).add_route(ALL_OUTPUTS, "mono", 1.00); // TODO: M7542 + m_asic9->pcm_out().set(m_codec, FUNC(psion3a_codec_device::pcm_in)); } void psion3a_state::psion3a2(machine_config &config) @@ -344,24 +449,33 @@ void psion3a_state::psion3a2(machine_config &config) m_ram->set_default_size("2M").set_extra_options("1M"); } -void psion3a_state::psion3c(machine_config &config) +void psion3c_state::psion3c(machine_config &config) { psion_asic9(config); m_ram->set_default_size("2M").set_extra_options("1M"); - // TODO: M7702 + PSION_S3A_CODEC(config, m_codec).add_route(ALL_OUTPUTS, "mono", 1.00); // TODO: M7702-03 + m_asic9->pcm_out().set(m_codec, FUNC(psion3a_codec_device::pcm_in)); - // TODO: unknown Temic device, likely provides RS232/Parallel to Honda port + //PSION_CONDOR(config, m_condor); + //m_condor->txd_handler().set(m_honda, FUNC(psion_honda_slot_device::write_txd)); + //m_condor->rts_handler().set(m_honda, FUNC(psion_honda_slot_device::write_rts)); + //m_condor->dtr_handler().set(m_honda, FUNC(psion_honda_slot_device::write_dtr)); + //m_condor->int_handler().set(m_asic9, FUNC(psion_asic9_device::eint1_w)); // Honda expansion port PSION_HONDA_SLOT(config, m_honda, psion_honda_devices, nullptr); - //m_honda->int_cb().set(m_asic9, FUNC(psion_asic9_device::eint_w)); // TODO: unknown interrupt line + //m_honda->rxd_handler().set(m_condor, FUNC(psion_condor_device::write_rxd)); + //m_honda->dcd_handler().set(m_condor, FUNC(psion_condor_device::write_dcd)); + //m_honda->dsr_handler().set(m_condor, FUNC(psion_condor_device::write_dsr)); + //m_honda->cts_handler().set(m_condor, FUNC(psion_condor_device::write_cts)); + m_honda->sdoe_handler().set(m_asic9, FUNC(psion_asic9_device::medchng_w)); // TODO: verify input line m_asic9->data_r<4>().set(m_honda, FUNC(psion_honda_slot_device::data_r)); m_asic9->data_w<4>().set(m_honda, FUNC(psion_honda_slot_device::data_w)); } -void psion3a_state::psion3mx(machine_config &config) +void psion3mx_state::psion3mx(machine_config &config) { psion_asic9(config); @@ -369,23 +483,30 @@ void psion3a_state::psion3mx(machine_config &config) m_ram->set_default_size("2M").set_extra_options(""); - // TODO: M7702 + PSION_S3A_CODEC(config, m_codec).add_route(ALL_OUTPUTS, "mono", 1.00); // TODO: M7702-03 + m_asic9->pcm_out().set(m_codec, FUNC(psion3a_codec_device::pcm_in)); // Honda expansion port PSION_HONDA_SLOT(config, m_honda, psion_honda_devices, nullptr); - //m_honda->int_cb().set(m_asic9, FUNC(psion_asic9_device::eint_w)); // TODO: unknown interrupt line + //m_honda->rxd_handler().set(m_asic9mx, FUNC(psion_condor_device::write_rxd)); + //m_honda->dcd_handler().set(m_asic9mx, FUNC(psion_condor_device::write_dcd)); + //m_honda->dsr_handler().set(m_asic9mx, FUNC(psion_condor_device::write_dsr)); + //m_honda->cts_handler().set(m_asic9mx, FUNC(psion_condor_device::write_cts)); + m_honda->sdoe_handler().set(m_asic9, FUNC(psion_asic9_device::medchng_w)); // TODO: verify input line m_asic9->data_r<4>().set(m_honda, FUNC(psion_honda_slot_device::data_r)); m_asic9->data_w<4>().set(m_honda, FUNC(psion_honda_slot_device::data_w)); } ROM_START(psion3a) + // Known versions: English, Belgian, Dutch, German ROM_REGION16_LE(0x100000, "rom", 0) ROM_SYSTEM_BIOS(0, "322f", "V3.22F/ENG") ROMX_LOAD("s3a_v3.22f_eng.bin", 0x000000, 0x100000, CRC(fafa3820) SHA1(c1a320b43280cfdb74fc1cb1363fca88dd187487), ROM_BIOS(0)) ROM_END ROM_START(psion3a2) + // Known versions: English, Dutch, French, German, Italian, Russian ROM_REGION16_LE(0x200000, "rom", 0) ROM_SYSTEM_BIOS(0, "340f", "V3.40F/ENG") ROMX_LOAD("s3a_v3.40f_eng.bin", 0x000000, 0x200000, CRC(f0adf12c) SHA1(3eb4e7f1fc5611a4d6e65d27d336969ebae94395), ROM_BIOS(0)) @@ -404,13 +525,14 @@ ROM_START(psion3a2_ru) ROM_END ROM_START(psion3c) - // Versions advertised: English, German, French, Flemish and Dutch + // Known versions: English, French, German, Italian, Flemish and Dutch ROM_REGION16_LE(0x200000, "rom", 0) ROM_SYSTEM_BIOS(0, "520f", "V5.20F/ENG") ROMX_LOAD("oak_v5.20f_eng.bin", 0x000000, 0x200000, CRC(d8e672ca) SHA1(23e7570ddbecbfd50953ce6a6b7ead7128814402), ROM_BIOS(0)) ROM_END ROM_START(psion3mx) + // Known versions: English, Dutch, French, German, Italian ROM_REGION16_LE(0x200000, "rom", 0) ROM_SYSTEM_BIOS(0, "616f", "V6.16F/ENG") ROMX_LOAD("maple_v6.16f_uk.bin", 0x000000, 0x200000, CRC(10011d9d) SHA1(8c657414513ed57ccf6beddc65dca1fe5ab600fb), ROM_BIOS(0)) @@ -425,11 +547,11 @@ ROM_END } // anonymous namespace -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1993, psion3a, 0, 0, psion3a, psion3a, psion3a_state, empty_init, "Psion", "Series 3a", MACHINE_NOT_WORKING ) -COMP( 1994, pocketbk2, psion3a, 0, psion3a, pocketbk2, psion3a_state, empty_init, "Acorn Computers", "Pocket Book II", MACHINE_NOT_WORKING ) -COMP( 1995, psion3a2, psion3a, 0, psion3a2, psion3a, psion3a_state, empty_init, "Psion", "Series 3a (2M)", MACHINE_NOT_WORKING ) -COMP( 1995, psion3a2_de, psion3a, 0, psion3a2, psion3a_de, psion3a_state, empty_init, "Psion", "Series 3a (2M) (German)", MACHINE_NOT_WORKING ) -COMP( 1997, psion3a2_ru, psion3a, 0, psion3a2, psion3a, psion3a_state, empty_init, "Psion", "Series 3a (2M) (Russian)", MACHINE_NOT_WORKING ) -COMP( 1996, psion3c, 0, 0, psion3c, psion3c, psion3a_state, empty_init, "Psion", "Series 3c", MACHINE_NOT_WORKING ) -COMP( 1998, psion3mx, 0, 0, psion3mx, psion3c, psion3a_state, empty_init, "Psion", "Series 3mx", MACHINE_NOT_WORKING ) +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1993, psion3a, 0, 0, psion3a, psion3a, psion3a_state, empty_init, "Psion", "Series 3a", 0 ) +COMP( 1994, pocketbk2, psion3a, 0, psion3a, pocketbk2, psion3a_state, empty_init, "Acorn Computers", "Pocket Book II", 0 ) +COMP( 1995, psion3a2, psion3a, 0, psion3a2, psion3a, psion3a_state, empty_init, "Psion", "Series 3a (2M)", 0 ) +COMP( 1995, psion3a2_de, psion3a, 0, psion3a2, psion3a_de, psion3a_state, empty_init, "Psion", "Series 3a (2M) (German)", 0 ) +COMP( 1997, psion3a2_ru, psion3a, 0, psion3a2, psion3a, psion3a_state, empty_init, "Psion", "Series 3a (2M) (Russian)", 0 ) +COMP( 1996, psion3c, 0, 0, psion3c, psion3c, psion3c_state, empty_init, "Psion", "Series 3c", 0 ) +COMP( 1998, psion3mx, 0, 0, psion3mx, psion3c, psion3mx_state, empty_init, "Psion", "Series 3mx", 0 ) diff --git a/src/mame/psion/psionhc.cpp b/src/mame/psion/psionhc.cpp index 88312ec1e67..a12be5724d9 100644 --- a/src/mame/psion/psionhc.cpp +++ b/src/mame/psion/psionhc.cpp @@ -11,6 +11,7 @@ #include "emu.h" #include "cpu/nec/nec.h" +#include "machine/nvram.h" #include "machine/psion_asic1.h" #include "machine/psion_asic2.h" #include "machine/psion_asic3.h" @@ -38,6 +39,7 @@ public: , m_asic2(*this, "asic2") , m_asic3(*this, "asic3") , m_ram(*this, "ram") + , m_nvram(*this, "nvram") , m_palette(*this, "palette") , m_keyboard(*this, "COL%u", 0U) , m_speaker(*this, "speaker") @@ -61,6 +63,7 @@ private: required_device m_asic2; required_device m_asic3; required_device m_ram; + required_device m_nvram; required_device m_palette; required_ioport_array<8> m_keyboard; required_device m_speaker; @@ -73,6 +76,9 @@ private: void io_map(address_map &map); void asic1_map(address_map &map); + uint8_t port_data_r(); + void port_data_w(uint8_t data); + int m_dr = 0; }; @@ -80,6 +86,7 @@ private: void psionhc_state::machine_start() { m_asic1->space(0).install_ram(0, m_ram->mask(), m_ram->pointer()); + m_nvram->set_base(m_ram->pointer(), m_ram->size()); } void psionhc_state::machine_reset() @@ -102,6 +109,7 @@ void psionhc_state::io_map(address_map &map) void psionhc_state::asic1_map(address_map &map) { + map(0x00000, 0x7ffff).noprw(); map(0x80000, 0xfffff).rom().region("flash", 0); } @@ -264,6 +272,24 @@ INPUT_CHANGED_MEMBER(psionhc_state::key_on) } +uint8_t psionhc_state::port_data_r() +{ + // b0 NC + // b1 NC + // b2 LED ? + // b3 VSLED ? + // b4 SCK6 + // b5 SD6 + // b6 ? + return 0x00; +} + +void psionhc_state::port_data_w(uint8_t data) +{ + // b7 BackLight ? +} + + void psionhc_state::palette_init(palette_device &palette) { palette.set_pen_color(0, rgb_t(131, 136, 139)); @@ -279,6 +305,7 @@ void psionhc_state::psionhc100(machine_config &config) m_maincpu->set_irq_acknowledge_callback(m_asic1, FUNC(psion_asic1_device::inta_cb)); RAM(config, m_ram).set_default_size("128K"); + NVRAM(config, "nvram", nvram_device::DEFAULT_NONE); screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD)); screen.set_size(160, 80); @@ -289,6 +316,7 @@ void psionhc_state::psionhc100(machine_config &config) PALETTE(config, "palette", FUNC(psionhc_state::palette_init), 2); PSION_ASIC1(config, m_asic1, 7.68_MHz_XTAL); + m_asic1->set_screen("screen"); m_asic1->set_laptop_mode(false); m_asic1->set_addrmap(0, &psionhc_state::asic1_map); m_asic1->int_cb().set_inputline(m_maincpu, INPUT_LINE_IRQ0); @@ -303,20 +331,22 @@ void psionhc_state::psionhc100(machine_config &config) m_asic2->buzvol_cb().set([this](int state) { m_speaker->set_output_gain(ALL_OUTPUTS, state ? 1.0 : 0.25); }); m_asic2->dr_cb().set([this](int state) { m_dr = state; }); m_asic2->col_cb().set([this](uint8_t data) { return m_keyboard[data & 7]->read(); }); + m_asic2->read_pd_cb().set(FUNC(psionhc_state::port_data_r)); + m_asic2->write_pd_cb().set(FUNC(psionhc_state::port_data_w)); m_asic2->data_r<0>().set(m_asic3, FUNC(psion_asic3_device::data_r)); // Power supply (ASIC3) m_asic2->data_w<0>().set(m_asic3, FUNC(psion_asic3_device::data_w)); m_asic2->data_r<1>().set(m_ssd[0], FUNC(psion_ssd_device::data_r)); // SSD m_asic2->data_w<1>().set(m_ssd[0], FUNC(psion_ssd_device::data_w)); m_asic2->data_r<2>().set(m_ssd[1], FUNC(psion_ssd_device::data_r)); // SSD m_asic2->data_w<2>().set(m_ssd[1], FUNC(psion_ssd_device::data_w)); - m_asic2->data_r<5>().set(m_exp[0], FUNC(psion_module_slot_device::data_r)); // Expansion port A - m_asic2->data_w<5>().set(m_exp[0], FUNC(psion_module_slot_device::data_w)); - m_asic2->data_r<6>().set(m_exp[1], FUNC(psion_module_slot_device::data_r)); // Expansion port B - m_asic2->data_w<6>().set(m_exp[1], FUNC(psion_module_slot_device::data_w)); + m_asic2->data_r<5>().set(m_exp[1], FUNC(psion_module_slot_device::data_r)); // Expansion port B + m_asic2->data_w<5>().set(m_exp[1], FUNC(psion_module_slot_device::data_w)); + m_asic2->data_r<6>().set(m_exp[0], FUNC(psion_module_slot_device::data_r)); // Expansion port A + m_asic2->data_w<6>().set(m_exp[0], FUNC(psion_module_slot_device::data_w)); m_asic2->data_r<7>().set(m_exp[2], FUNC(psion_module_slot_device::data_r)); // Expansion port C m_asic2->data_w<7>().set(m_exp[2], FUNC(psion_module_slot_device::data_w)); - PSION_ASIC3(config, m_asic3); + PSION_PSU_ASIC3(config, m_asic3); SPEAKER(config, "mono").front_center(); SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00); // Piezo buzzer @@ -327,10 +357,11 @@ void psionhc_state::psionhc100(machine_config &config) m_ssd[1]->door_cb().set(m_asic2, FUNC(psion_asic2_device::dnmi_w)); PSION_MODULE_SLOT(config, m_exp[0], psion_hcmodule_devices, nullptr); // RS232/Parallel - m_exp[0]->intr_cb().set(m_asic1, FUNC(psion_asic1_device::eint1_w)); + m_exp[0]->intr_cb().set(m_asic1, FUNC(psion_asic1_device::eint2_w)); PSION_MODULE_SLOT(config, m_exp[1], psion_hcmodule_devices, nullptr); - m_exp[1]->intr_cb().set(m_asic1, FUNC(psion_asic1_device::eint2_w)); + m_exp[1]->intr_cb().set(m_asic1, FUNC(psion_asic1_device::eint1_w)); PSION_MODULE_SLOT(config, m_exp[2], psion_hcmodule_devices, nullptr); + m_exp[2]->intr_cb().set(m_asic1, FUNC(psion_asic1_device::eint3_w)); SOFTWARE_LIST(config, "ssd_list").set_original("psion_ssd").set_filter("HC"); } diff --git a/src/mame/psion/siena.cpp b/src/mame/psion/siena.cpp index b4b471cac7b..ebc6d2a3afb 100644 --- a/src/mame/psion/siena.cpp +++ b/src/mame/psion/siena.cpp @@ -4,13 +4,12 @@ Psion Siena - TODO: - - battery backed RAM - ******************************************************************************/ #include "emu.h" +#include "machine/nvram.h" #include "machine/psion_asic9.h" +//#include "machine/psion_condor.h" #include "machine/ram.h" #include "sound/spkrdev.h" #include "bus/psion/honda/slot.h" @@ -31,9 +30,11 @@ public: : driver_device(mconfig, type, tag) , m_asic9(*this, "asic9") , m_ram(*this, "ram") + , m_nvram(*this, "nvram") , m_palette(*this, "palette") , m_keyboard(*this, "COL%u", 0U) , m_speaker(*this, "speaker") + //, m_condor(*this, "condor") , m_honda(*this, "honda") { } @@ -48,9 +49,11 @@ protected: private: required_device m_asic9; required_device m_ram; + required_device m_nvram; required_device m_palette; required_ioport_array<8> m_keyboard; required_device m_speaker; + //required_device m_condor; required_device m_honda; void palette_init(palette_device &palette); @@ -63,10 +66,12 @@ private: void siena_state::machine_start() { + m_nvram->set_base(m_ram->pointer(), m_ram->size()); } void siena_state::machine_reset() { + //m_asic9->io_space().install_readwrite_handler(0x0100, 0x011f, read8sm_delegate(*m_condor, FUNC(psion_condor_device::read)), write8sm_delegate(*m_condor, FUNC(psion_condor_device::write)), 0x00ff); } @@ -200,6 +205,7 @@ void siena_state::palette_init(palette_device &palette) void siena_state::siena(machine_config &config) { PSION_ASIC9(config, m_asic9, 7.68_MHz_XTAL); + m_asic9->set_screen("screen"); m_asic9->set_ram_rom("ram", "rom"); m_asic9->port_ab_r().set(FUNC(siena_state::kbd_r)); m_asic9->buz_cb().set(m_speaker, FUNC(speaker_sound_device::level_w)); @@ -217,12 +223,21 @@ void siena_state::siena(machine_config &config) SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00); // Piezo buzzer RAM(config, m_ram).set_default_size("512K").set_extra_options("1M"); + NVRAM(config, "nvram", nvram_device::DEFAULT_NONE); - // TODO: unknown Temic device, likely provides RS232/Parallel to Honda port + //PSION_CONDOR(config, m_condor); + //m_condor->txd_handler().set(m_honda, FUNC(psion_honda_slot_device::write_txd)); + //m_condor->rts_handler().set(m_honda, FUNC(psion_honda_slot_device::write_rts)); + //m_condor->dtr_handler().set(m_honda, FUNC(psion_honda_slot_device::write_dtr)); + //m_condor->int_handler().set(m_asic9, FUNC(psion_asic9_device::eint1_w)); // Honda expansion port PSION_HONDA_SLOT(config, m_honda, psion_honda_devices, "ssd"); - m_honda->int_cb().set(m_asic9, FUNC(psion_asic9_device::medchng_w)); // TODO: verify interrupt line + //m_honda->rxd_handler().set(m_condor, FUNC(psion_condor_device::write_rxd)); + //m_honda->dcd_handler().set(m_condor, FUNC(psion_condor_device::write_dcd)); + //m_honda->dsr_handler().set(m_condor, FUNC(psion_condor_device::write_dsr)); + //m_honda->cts_handler().set(m_condor, FUNC(psion_condor_device::write_cts)); + m_honda->sdoe_handler().set(m_asic9, FUNC(psion_asic9_device::medchng_w)); m_asic9->data_r<4>().set(m_honda, FUNC(psion_honda_slot_device::data_r)); m_asic9->data_w<4>().set(m_honda, FUNC(psion_honda_slot_device::data_w)); @@ -240,4 +255,4 @@ ROM_END // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1996, siena, 0, 0, siena, siena, siena_state, empty_init, "Psion", "Siena", MACHINE_NOT_WORKING ) +COMP( 1996, siena, 0, 0, siena, siena, siena_state, empty_init, "Psion", "Siena", 0 ) diff --git a/src/mame/psion/workabout.cpp b/src/mame/psion/workabout.cpp index be4ad26c49b..902829cbe10 100644 --- a/src/mame/psion/workabout.cpp +++ b/src/mame/psion/workabout.cpp @@ -5,11 +5,12 @@ Psion Workabout TODO: - - battery backed RAM + - expansion LIF ports ******************************************************************************/ #include "emu.h" +#include "machine/nvram.h" #include "machine/psion_asic9.h" #include "machine/psion_ssd.h" #include "machine/ram.h" @@ -32,6 +33,7 @@ public: : driver_device(mconfig, type, tag) , m_asic9(*this, "asic9") , m_ram(*this, "ram") + , m_nvram(*this, "nvram") , m_palette(*this, "palette") , m_keyboard(*this, "COL%u", 0U) , m_speaker(*this, "speaker") @@ -52,6 +54,7 @@ protected: private: required_device m_asic9; required_device m_ram; + required_device m_nvram; required_device m_palette; required_ioport_array<8> m_keyboard; required_device m_speaker; @@ -68,6 +71,7 @@ private: void workabout_state::machine_start() { + m_nvram->set_base(m_ram->pointer(), m_ram->size()); } void workabout_state::machine_reset() @@ -190,6 +194,7 @@ void workabout_state::palette_init(palette_device &palette) void workabout_state::workabout(machine_config &config) { PSION_ASIC9(config, m_asic9, 7.68_MHz_XTAL); // V30H + m_asic9->set_screen("screen"); m_asic9->set_ram_rom("ram", "rom"); m_asic9->port_ab_r().set(FUNC(workabout_state::kbd_r)); m_asic9->buz_cb().set(m_speaker, FUNC(speaker_sound_device::level_w)); @@ -217,6 +222,7 @@ void workabout_state::workabout(machine_config &config) SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00); // Piezo buzzer RAM(config, m_ram); + NVRAM(config, "nvram", nvram_device::DEFAULT_NONE); PSION_SSD(config, m_ssd[0]); m_ssd[0]->door_cb().set(m_asic9, FUNC(psion_asic9_device::medchng_w)); @@ -269,5 +275,5 @@ ROM_END // YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1995, psionwa, 0, 0, psionwa, workabout, workabout_state, empty_init, "Psion", "Workabout", MACHINE_NOT_WORKING ) -COMP( 1998, psionwamx, 0, 0, psionwamx, workabout, workabout_state, empty_init, "Psion", "Workabout mx", MACHINE_NOT_WORKING ) +COMP( 1995, psionwa, 0, 0, psionwa, workabout, workabout_state, empty_init, "Psion", "Workabout", 0 ) +COMP( 1998, psionwamx, 0, 0, psionwamx, workabout, workabout_state, empty_init, "Psion", "Workabout mx", 0 )