mirror of
https://github.com/holub/mame
synced 2025-04-25 09:50:04 +03:00
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:
parent
460278695e
commit
af17e41011
@ -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 )
|
||||
|
@ -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 )
|
||||
|
@ -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");
|
||||
}
|
||||
|
@ -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 )
|
||||
|
@ -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 )
|
||||
|
Loading…
Reference in New Issue
Block a user