summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Nigel Barnes <ngbarnes@gmail.com>2023-07-22 16:43:51 +0100
committer Nigel Barnes <ngbarnes@gmail.com>2023-07-22 16:43:51 +0100
commitaf17e41011532e97fb7eb15ff6ed6efe79aa852f (patch)
tree2f078fa55700501f1aecc29782e989183ea15d63
parent460278695e12e31c5de2bf0a1f5fd0ae1dd3c539 (diff)
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]
-rw-r--r--src/mame/psion/psion3.cpp43
-rw-r--r--src/mame/psion/psion3a.cpp204
-rw-r--r--src/mame/psion/psionhc.cpp45
-rw-r--r--src/mame/psion/siena.cpp27
-rw-r--r--src/mame/psion/workabout.cpp12
5 files changed, 269 insertions, 62 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<psion_asic1_device> m_asic1;
required_device<psion_asic2_device> m_asic2;
required_device<ram_device> m_ram;
+ required_device<nvram_device> m_nvram;
required_device<palette_device> m_palette;
required_ioport_array<10> m_keyboard;
required_device<pcd3311_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"
+class psion3a_codec_device : public device_t, public device_sound_interface
+{
+public:
+ 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<read_stream_view> const &inputs, std::vector<write_stream_view> &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<read_stream_view> const &inputs, std::vector<write_stream_view> &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_state : public driver_device
+class psion3a_base_state : public driver_device
{
public:
- psion3a_state(const machine_config &mconfig, device_type type, const char *tag)
+ 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<psion_asic9_device> m_asic9;
required_device<ram_device> m_ram;
+ required_device<nvram_device> m_nvram;
required_device<palette_device> m_palette;
required_ioport_array<8> m_keyboard;
required_device<speaker_sound_device> m_speaker;
+ required_device<psion3a_codec_device> m_codec;
required_device_array<psion_ssd_device, 2> m_ssd;
- optional_device<psion_sibo_slot_device> m_sibo;
- optional_device<psion_honda_slot_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;
};
+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<psion_sibo_slot_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<psion_condor_device> m_condor;
+ required_device<psion_honda_slot_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<psion_honda_slot_device> m_honda;
+};
+
-void psion3a_state::machine_start()
+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<psion_asic2_device> m_asic2;
required_device<psion_asic3_device> m_asic3;
required_device<ram_device> m_ram;
+ required_device<nvram_device> m_nvram;
required_device<palette_device> m_palette;
required_ioport_array<8> m_keyboard;
required_device<speaker_sound_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<psion_asic9_device> m_asic9;
required_device<ram_device> m_ram;
+ required_device<nvram_device> m_nvram;
required_device<palette_device> m_palette;
required_ioport_array<8> m_keyboard;
required_device<speaker_sound_device> m_speaker;
+ //required_device<psion_condor_device> m_condor;
required_device<psion_honda_slot_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<psion_asic9_device> m_asic9;
required_device<ram_device> m_ram;
+ required_device<nvram_device> m_nvram;
required_device<palette_device> m_palette;
required_ioport_array<8> m_keyboard;
required_device<speaker_sound_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 )