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]
This commit is contained in:
Nigel Barnes 2023-07-22 16:43:51 +01:00
parent 460278695e
commit af17e41011
5 changed files with 272 additions and 65 deletions

View File

@ -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 )

View File

@ -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<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_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<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;
};
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<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_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 )

View File

@ -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");
}

View File

@ -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 )

View File

@ -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 )