mirror of
https://github.com/holub/mame
synced 2025-06-06 21:03:47 +03:00
New systems marked not working
------------------------------ Series 3a [Nigel Barnes, The Last Psion] Series 3c [Nigel Barnes, The Last Psion] Series 3mx [Nigel Barnes, The Last Psion] Siena [Nigel Barnes, The Last Psion] Workabout [Nigel Barnes, The Last Psion] Workabout mx [Nigel Barnes, The Last Psion] New clones marked not working ----------------------------- Pocket Book II [Nigel Barnes, The Last Psion] Series 3a (2M) [Nigel Barnes, The Last Psion] Series 3a (2M) (German) [Nigel Barnes, The Last Psion]
This commit is contained in:
parent
2c3cbda8d0
commit
469c2906d9
@ -2867,6 +2867,21 @@ if (MACHINES["PLA"]~=null) then
|
||||
}
|
||||
end
|
||||
|
||||
---------------------------------------------------
|
||||
--
|
||||
--@src/devices/machine/psion_asic5.h,MACHINES["PSION_ASIC"] = true
|
||||
--@src/devices/machine/psion_asic9.h,MACHINES["PSION_ASIC"] = true
|
||||
---------------------------------------------------
|
||||
|
||||
if (MACHINES["PSION_ASIC"]~=null) then
|
||||
files {
|
||||
MAME_DIR .. "src/devices/machine/psion_asic5.cpp",
|
||||
MAME_DIR .. "src/devices/machine/psion_asic5.h",
|
||||
MAME_DIR .. "src/devices/machine/psion_asic9.cpp",
|
||||
MAME_DIR .. "src/devices/machine/psion_asic9.h",
|
||||
}
|
||||
end
|
||||
|
||||
---------------------------------------------------
|
||||
--
|
||||
--@src/devices/machine/pxa255.h,MACHINES["PXA255"] = true
|
||||
|
225
src/devices/machine/psion_asic5.cpp
Normal file
225
src/devices/machine/psion_asic5.cpp
Normal file
@ -0,0 +1,225 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/******************************************************************************
|
||||
|
||||
Psion ASIC5
|
||||
|
||||
ASIC5 is a general purpose I/O chip with a built-in UART that can be set to
|
||||
run in a number of different modes thereby simplifying the task of peripheral
|
||||
design. For example, it is possible to set up ASIC5 to run as a Centronics
|
||||
parallel port interface, an 8-bit parallel I/O port, a serial bar code
|
||||
controller or a serial RS232 converter.
|
||||
|
||||
TODO:
|
||||
- implement peripheral mode
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "psion_asic5.h"
|
||||
|
||||
#define VERBOSE 0
|
||||
//#define LOG_OUTPUT_FUNC osd_printf_info
|
||||
#include "logmacro.h"
|
||||
|
||||
|
||||
DEFINE_DEVICE_TYPE(PSION_ASIC5_PACK, psion_asic5_pack_device, "psion_asic5_pack", "Psion ASIC5 (Pack mode)")
|
||||
DEFINE_DEVICE_TYPE(PSION_ASIC5_PERIPHERAL, psion_asic5_peripheral_device, "psion_asic5_peripheral", "Psion ASIC5 (Peripheral mode)")
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// LIVE DEVICE
|
||||
//**************************************************************************
|
||||
|
||||
psion_asic5_device::psion_asic5_device(const machine_config &mconfig, device_type type, const char* tag, device_t* owner, uint32_t clock)
|
||||
: device_t(mconfig, type, tag, owner, clock)
|
||||
, m_in_a_handler(*this)
|
||||
, m_in_b_handler(*this)
|
||||
, m_out_a_handler(*this)
|
||||
, m_out_b_handler(*this)
|
||||
, m_out_c_handler(*this)
|
||||
, m_out_d_handler(*this)
|
||||
{
|
||||
}
|
||||
|
||||
psion_asic5_pack_device::psion_asic5_pack_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: psion_asic5_device(mconfig, PSION_ASIC5_PACK, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
psion_asic5_peripheral_device::psion_asic5_peripheral_device(const machine_config &mconfig, const char * tag, device_t *owner, uint32_t clock)
|
||||
: psion_asic5_device(mconfig, PSION_ASIC5_PERIPHERAL, tag, owner, clock)
|
||||
, m_serial(*this, "serial")
|
||||
//, m_irq4_callback(*this)
|
||||
//, m_txd1_callback(*this)
|
||||
//, m_dtr1_callback(*this)
|
||||
//, m_rts1_callback(*this)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void psion_asic5_peripheral_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
NS16550(config, m_serial, clock() / 13);
|
||||
//m_serial->out_int_callback().set([this](int state) { m_irq4_callback(state); });
|
||||
//m_serial->out_tx_callback().set([this](int state) { m_txd1_callback(state); });
|
||||
//m_serial->out_dtr_callback().set([this](int state) { m_dtr1_callback(state); });
|
||||
//m_serial->out_rts_callback().set([this](int state) { m_rts1_callback(state); });
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void psion_asic5_device::device_start()
|
||||
{
|
||||
m_in_a_handler.resolve();
|
||||
m_in_b_handler.resolve();
|
||||
m_out_a_handler.resolve_safe();
|
||||
m_out_b_handler.resolve_safe();
|
||||
m_out_c_handler.resolve_safe();
|
||||
m_out_d_handler.resolve_safe();
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void psion_asic5_device::device_reset()
|
||||
{
|
||||
m_portb_ctrl = 0x00;
|
||||
m_portb_counter = 0x00;
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// READ/WRITE HANDLERS
|
||||
//**************************************************************************
|
||||
|
||||
void psion_asic5_device::data_w(uint16_t data)
|
||||
{
|
||||
switch (data & 0x300)
|
||||
{
|
||||
case NULL_FRAME:
|
||||
break;
|
||||
|
||||
case CONTROL_FRAME:
|
||||
m_sibo_control = data & 0xff;
|
||||
|
||||
switch (m_sibo_control & 0xc0)
|
||||
{
|
||||
case 0x80: // SerialWrite
|
||||
//if (m_sibo_control == 0x82) // write A3Setup
|
||||
if (m_sibo_control == 0x93) // Multi Port D and C writes
|
||||
m_port_dc_writes = 0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case DATA_FRAME:
|
||||
data &= 0xff;
|
||||
switch (m_sibo_control & 0x0f)
|
||||
{
|
||||
case 0x00: // Port A write data
|
||||
LOG("%s data_w: Port A write data %02x\n", machine().describe_context(), data);
|
||||
m_out_a_handler(data);
|
||||
break;
|
||||
|
||||
case 0x01: // Port B write data
|
||||
LOG("%s data_w: Port B write data %02x\n", machine().describe_context(), data);
|
||||
m_out_b_handler(data);
|
||||
break;
|
||||
|
||||
case 0x02: // Port B control
|
||||
LOG("%s data_w: Port B control %02x\n", machine().describe_context(), data);
|
||||
m_portb_ctrl = data;
|
||||
break;
|
||||
|
||||
case 0x03: // Port D and C write data
|
||||
if (m_port_dc_writes)
|
||||
{
|
||||
LOG("%s data_w: Port C write data %02x\n", machine().describe_context(), data);
|
||||
m_out_c_handler(data);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG("%s data_w: Port D write data %02x\n", machine().describe_context(), data);
|
||||
m_out_d_handler(data);
|
||||
m_portb_counter = 0x00;
|
||||
m_out_b_handler(m_portb_counter);
|
||||
}
|
||||
m_port_dc_writes++;
|
||||
break;
|
||||
|
||||
case 0x06: // Interrupt mask write
|
||||
LOG("%s data_w: out int mask %02x\n", machine().describe_context(), data);
|
||||
m_interrupt_mask = data;
|
||||
break;
|
||||
|
||||
//case 0x07: // Control register
|
||||
// m = data;
|
||||
// break;
|
||||
|
||||
default:
|
||||
LOG("%s data_w: unknown control %02x data %02x\n", machine().describe_context(), m_sibo_control, data);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
uint8_t psion_asic5_device::data_r()
|
||||
{
|
||||
uint8_t data = 0x00;
|
||||
|
||||
switch (m_sibo_control & 0xc0)
|
||||
{
|
||||
case 0x40: // SerialSelect
|
||||
if (m_sibo_control == 0x42) // Asic5PackId
|
||||
data = m_info_byte; // A3InfoByte
|
||||
break;
|
||||
|
||||
case 0xc0: // SerialRead
|
||||
switch (m_sibo_control & 0x0f)
|
||||
{
|
||||
case 0x00: // Port A read data
|
||||
data = m_in_a_handler();
|
||||
LOG("%s data_r: Port A read data %02x\n", machine().describe_context(), data);
|
||||
if (m_sibo_control & 0x90) // Multi, increment Port B
|
||||
{
|
||||
m_portb_counter++;
|
||||
m_out_b_handler(m_portb_counter);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x01: // Port B read data
|
||||
data = m_in_b_handler();
|
||||
LOG("%s data_r: Port B read data %02x\n", machine().describe_context(), data);
|
||||
break;
|
||||
|
||||
case 0x02: // Port B counter
|
||||
m_portb_counter++;
|
||||
m_out_b_handler(m_portb_counter);
|
||||
LOG("%s data_r: Port B counter %02x\n", machine().describe_context(), m_portb_counter);
|
||||
break;
|
||||
|
||||
case 0x06: // Interrupt mask write
|
||||
data = m_interrupt_mask;
|
||||
LOG("%s data_r: in int mask %02x\n", machine().describe_context(), data);
|
||||
break;
|
||||
|
||||
//case 0x07: // Control register
|
||||
// m = data;
|
||||
// break;
|
||||
|
||||
default:
|
||||
LOG("%s data_r: unknown control %02x data %02x\n", machine().describe_context(), m_sibo_control, data);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
116
src/devices/machine/psion_asic5.h
Normal file
116
src/devices/machine/psion_asic5.h
Normal file
@ -0,0 +1,116 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/******************************************************************************
|
||||
|
||||
Psion ASIC5
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef MAME_MACHINE_PSION_ASIC5_H
|
||||
#define MAME_MACHINE_PSION_ASIC5_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "machine/ins8250.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
// ======================> psion_asic5_device
|
||||
|
||||
class psion_asic5_device : public device_t
|
||||
{
|
||||
public:
|
||||
auto readpa_handler() { return m_in_a_handler.bind(); }
|
||||
auto readpb_handler() { return m_in_b_handler.bind(); }
|
||||
|
||||
auto writepa_handler() { return m_out_a_handler.bind(); }
|
||||
auto writepb_handler() { return m_out_b_handler.bind(); }
|
||||
auto writepc_handler() { return m_out_c_handler.bind(); }
|
||||
auto writepd_handler() { return m_out_d_handler.bind(); }
|
||||
|
||||
void set_info_byte(uint8_t info) { m_info_byte = info; }
|
||||
|
||||
void data_w(uint16_t data);
|
||||
uint8_t data_r();
|
||||
|
||||
protected:
|
||||
// construction/destruction
|
||||
psion_asic5_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
|
||||
private:
|
||||
static constexpr uint16_t NULL_FRAME = 0x000;
|
||||
static constexpr uint16_t CONTROL_FRAME = 0x100;
|
||||
static constexpr uint16_t DATA_FRAME = 0x200;
|
||||
|
||||
devcb_read8 m_in_a_handler;
|
||||
devcb_read8 m_in_b_handler;
|
||||
devcb_write8 m_out_a_handler;
|
||||
devcb_write8 m_out_b_handler;
|
||||
devcb_write8 m_out_c_handler;
|
||||
devcb_write8 m_out_d_handler;
|
||||
|
||||
// Slave control mode
|
||||
static constexpr uint8_t READ_WRITE_SELECT = 0xc0;
|
||||
static constexpr uint8_t BYTE_WORD_TRANSFER = 0xa0;
|
||||
static constexpr uint8_t SINGLE_MULTI_TRANSFER = 0x90;
|
||||
|
||||
// registers
|
||||
uint8_t m_portb_counter;
|
||||
uint8_t m_portb_ctrl;
|
||||
int m_port_dc_writes;
|
||||
uint8_t m_interrupt_mask;
|
||||
|
||||
// internal
|
||||
uint8_t m_info_byte;
|
||||
uint8_t m_sibo_control;
|
||||
};
|
||||
|
||||
|
||||
// ======================> psion_asic5_pack_device
|
||||
|
||||
class psion_asic5_pack_device : public psion_asic5_device
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
psion_asic5_pack_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
|
||||
};
|
||||
|
||||
|
||||
// ======================> psion_asic5_peripheral_device
|
||||
|
||||
class psion_asic5_peripheral_device : public psion_asic5_device
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
psion_asic5_peripheral_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
|
||||
|
||||
//auto irq4() { return m_irq4_callback.bind(); }
|
||||
//auto txd1() { return m_txd1_callback.bind(); }
|
||||
//auto dtr1() { return m_dtr1_callback.bind(); }
|
||||
//auto rts1() { return m_rts1_callback.bind(); }
|
||||
|
||||
protected:
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
|
||||
private:
|
||||
required_device<ns16550_device> m_serial;
|
||||
|
||||
//devcb_write_line m_irq4_callback;
|
||||
//devcb_write_line m_txd1_callback;
|
||||
//devcb_write_line m_dtr1_callback;
|
||||
//devcb_write_line m_rts1_callback;
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(PSION_ASIC5_PACK, psion_asic5_pack_device)
|
||||
DECLARE_DEVICE_TYPE(PSION_ASIC5_PERIPHERAL, psion_asic5_peripheral_device)
|
||||
|
||||
#endif // MAME_MACHINE_PSION_ASIC5_H
|
1134
src/devices/machine/psion_asic9.cpp
Normal file
1134
src/devices/machine/psion_asic9.cpp
Normal file
File diff suppressed because it is too large
Load Diff
155
src/devices/machine/psion_asic9.h
Normal file
155
src/devices/machine/psion_asic9.h
Normal file
@ -0,0 +1,155 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/******************************************************************************
|
||||
|
||||
Psion ASIC9
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef MAME_MACHINE_PSION_ASIC9_H
|
||||
#define MAME_MACHINE_PSION_ASIC9_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "machine/ram.h"
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
// TYPE DEFINITIONS
|
||||
//**************************************************************************
|
||||
|
||||
// ======================> psion_asic9_device
|
||||
|
||||
class psion_asic9_device : public device_t,
|
||||
public device_memory_interface,
|
||||
public device_video_interface
|
||||
{
|
||||
public:
|
||||
psion_asic9_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
template <typename T, typename U> void set_ram_rom(T &&ram_tag, U &&rom_tag) { m_ram.set_tag(std::forward<T>(ram_tag)); m_rom.set_tag(std::forward<U>(rom_tag)); }
|
||||
|
||||
// callbacks
|
||||
auto buz_cb() { return m_buz_cb.bind(); }
|
||||
auto col_cb() { return m_col_cb.bind(); }
|
||||
auto port_ab_r() { return m_port_ab_r.bind(); }
|
||||
auto port_ab_w() { return m_port_ab_w.bind(); }
|
||||
|
||||
template <unsigned N> auto data_r() { static_assert(N < 8); return m_data_r[N].bind(); }
|
||||
template <unsigned N> auto data_w() { static_assert(N < 8); return m_data_w[N].bind(); }
|
||||
|
||||
uint16_t io_r(offs_t offset, uint16_t mem_mask);
|
||||
void io_w(offs_t offset, uint16_t data, uint16_t mem_mask);
|
||||
uint16_t mem_r(offs_t offset, uint16_t mem_mask);
|
||||
void mem_w(offs_t offset, uint16_t data, uint16_t mem_mask);
|
||||
|
||||
uint8_t col_r();
|
||||
|
||||
IRQ_CALLBACK_MEMBER(inta_cb);
|
||||
|
||||
DECLARE_WRITE_LINE_MEMBER(eint_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(enmi_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(medchng_w);
|
||||
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
|
||||
protected:
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
virtual void device_resolve_objects() override;
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
|
||||
virtual space_config_vector memory_space_config() const override;
|
||||
|
||||
private:
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<ram_device> m_ram;
|
||||
required_memory_region m_rom;
|
||||
|
||||
void mem_map(address_map &map);
|
||||
void io_map(address_map &map);
|
||||
|
||||
static constexpr int AS_A9_RAM = AS_OPCODES + 1;
|
||||
static constexpr int AS_A9_ROM = AS_OPCODES + 2;
|
||||
|
||||
const address_space_config m_ram_config;
|
||||
const address_space_config m_rom_config;
|
||||
|
||||
address_space *m_ram_space;
|
||||
address_space *m_rom_space;
|
||||
|
||||
emu_timer *m_tick_timer;
|
||||
emu_timer *m_frc1_timer;
|
||||
emu_timer *m_frc2_timer;
|
||||
emu_timer *m_watchdog_timer;
|
||||
emu_timer *m_rtc_timer;
|
||||
|
||||
TIMER_CALLBACK_MEMBER(tick);
|
||||
TIMER_CALLBACK_MEMBER(frc1);
|
||||
TIMER_CALLBACK_MEMBER(frc2);
|
||||
TIMER_CALLBACK_MEMBER(watchdog);
|
||||
TIMER_CALLBACK_MEMBER(rtc);
|
||||
|
||||
void update_interrupts();
|
||||
bool is_protected(offs_t offset);
|
||||
|
||||
uint8_t m_ram_type;
|
||||
uint32_t ram_device_size(uint8_t device_type);
|
||||
void configure_ram(uint8_t device_type = 0);
|
||||
void configure_rom();
|
||||
|
||||
uint8_t m_post;
|
||||
uint16_t m_a9_control;
|
||||
uint16_t m_a9_status;
|
||||
uint16_t m_a9_lcd_size;
|
||||
uint8_t m_a9_interrupt_status;
|
||||
uint8_t m_a9_interrupt_mask;
|
||||
uint16_t m_frc1_count;
|
||||
uint16_t m_frc1_reload;
|
||||
uint16_t m_frc2_count;
|
||||
uint16_t m_frc2_reload;
|
||||
uint8_t m_watchdog_count;
|
||||
bool m_a9_protection_mode;
|
||||
uint16_t m_a9_protection_upper;
|
||||
uint16_t m_a9_protection_lower;
|
||||
uint8_t m_a9_port_ab_ddr;
|
||||
uint8_t m_a9_port_c_ddr;
|
||||
uint8_t m_a9_port_d_ddr;
|
||||
uint8_t m_a9_psel_6000;
|
||||
uint8_t m_a9_psel_7000;
|
||||
uint8_t m_a9_psel_8000;
|
||||
uint8_t m_a9_psel_9000;
|
||||
uint16_t m_a9_control_extra;
|
||||
uint32_t m_rtc;
|
||||
|
||||
uint8_t m_a9_serial_data;
|
||||
uint8_t m_a9_serial_control;
|
||||
uint8_t m_a9_channel_select;
|
||||
|
||||
devcb_write8 m_configure_ram_cb;
|
||||
devcb_write_line m_buz_cb;
|
||||
devcb_write8 m_col_cb;
|
||||
devcb_read16 m_port_ab_r;
|
||||
devcb_write16 m_port_ab_w;
|
||||
|
||||
devcb_read8::array<8> m_data_r;
|
||||
devcb_write16::array<8> m_data_w;
|
||||
|
||||
emu_timer *m_busy_timer;
|
||||
|
||||
TIMER_CALLBACK_MEMBER(busy);
|
||||
|
||||
bool channel_active(int channel);
|
||||
void transmit_frame(uint16_t data);
|
||||
uint8_t receive_frame();
|
||||
|
||||
static constexpr uint16_t NULL_FRAME = 0x000;
|
||||
static constexpr uint16_t CONTROL_FRAME = 0x100;
|
||||
static constexpr uint16_t DATA_FRAME = 0x200;
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(PSION_ASIC9, psion_asic9_device)
|
||||
|
||||
#endif // MAME_MACHINE_PSION_ASIC9_H
|
@ -144,6 +144,7 @@ const double XTAL::known_xtals[] = {
|
||||
7'159'090, /* 7.15909_MHz_XTAL Blood Bros (2x NTSC subcarrier) */
|
||||
7'200'000, /* 7.2_MHz_XTAL Novag Constellation (later models, with /2 divider), Kawai K1 keyscan IC */
|
||||
7'372'800, /* 7.3728_MHz_XTAL - */
|
||||
7'680'000, /* 7.68_MHz_XTAL Psion Series 3 */
|
||||
7'864'300, /* 7.8643_MHz_XTAL Used on InterFlip games as video clock */
|
||||
7'987'000, /* 7.987_MHz_XTAL PC9801-86 YM2608 clock */
|
||||
7'995'500, /* 7.9955_MHz_XTAL Used on Electronic Devices Italy Galaxy Gunners sound board */
|
||||
|
@ -37602,9 +37602,24 @@ psionp350 //
|
||||
psionp464 //
|
||||
psionxp //
|
||||
|
||||
@source:psion/psion3a.cpp
|
||||
pocketbk2 // 1994 Acorn Pocket Book II
|
||||
psion3a // 1993 Psion Series 3a
|
||||
psion3a2 // 1995 Psion Series 3a
|
||||
psion3a2_de // 1995 Psion Series 3a (German)
|
||||
psion3c // 1996 Psion Series 3c
|
||||
psion3mx // 1998 Psion Series 3mx
|
||||
|
||||
@source:psion/psion5.cpp
|
||||
psion5mx //
|
||||
|
||||
@source:psion/siena.cpp
|
||||
siena // 1996 Psion Siena
|
||||
|
||||
@source:psion/workabout.cpp
|
||||
psionwa // 1995 Psion Workabout
|
||||
psionwamx // 1998 Psion Workabout mx
|
||||
|
||||
@source:quantel/dpb7000.cpp
|
||||
dpb7000 //
|
||||
|
||||
|
396
src/mame/psion/psion3a.cpp
Normal file
396
src/mame/psion/psion3a.cpp
Normal file
@ -0,0 +1,396 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/******************************************************************************
|
||||
|
||||
Psion Series 3a/3c/3mx
|
||||
|
||||
TODO:
|
||||
- battery backed RAM
|
||||
- sound devices
|
||||
- serial ports
|
||||
- fix RAM detection for 3mx
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "machine/psion_asic9.h"
|
||||
#include "machine/ram.h"
|
||||
#include "sound/spkrdev.h"
|
||||
//#include "bus/psion/exp/slot.h"
|
||||
#include "psion_ssd.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "softlist_dev.h"
|
||||
#include "speaker.h"
|
||||
#include "utf8.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class psion3a_state : public driver_device
|
||||
{
|
||||
public:
|
||||
psion3a_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_palette(*this, "palette")
|
||||
, m_keyboard(*this, "COL%u", 0U)
|
||||
, m_speaker(*this, "speaker")
|
||||
, m_ssd(*this, "ssd%u", 1U)
|
||||
//, m_exp(*this, "exp")
|
||||
{ }
|
||||
|
||||
void psion3a(machine_config &config);
|
||||
void psion3a2(machine_config &config);
|
||||
void psion3c(machine_config &config);
|
||||
void psion3mx(machine_config &config);
|
||||
|
||||
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<palette_device> m_palette;
|
||||
required_ioport_array<8> m_keyboard;
|
||||
required_device<speaker_sound_device> m_speaker;
|
||||
required_device_array<psion_ssd_device, 2> m_ssd;
|
||||
//required_device<psion_exp_slot_device> m_exp;
|
||||
|
||||
void palette_init(palette_device &palette);
|
||||
|
||||
uint16_t kbd_r();
|
||||
|
||||
uint8_t m_key_col = 0;
|
||||
};
|
||||
|
||||
|
||||
void psion3a_state::machine_start()
|
||||
{
|
||||
}
|
||||
|
||||
void psion3a_state::machine_reset()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
static INPUT_PORTS_START( psion3a )
|
||||
PORT_START("COL0")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_NAME("Enter")
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_NAME(UTF8_RIGHT" End")
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(0x09) PORT_NAME("Tab")
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_NAME(UTF8_LEFT" Home")
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_NAME(UTF8_DOWN" Pg Dn")
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
|
||||
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_SHIFT_2) PORT_NAME("Psion")
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) PORT_NAME("Sheet")
|
||||
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_NAME("Time")
|
||||
PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_NAME("Data")
|
||||
|
||||
PORT_START("COL1")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR(';')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('+') PORT_CHAR('=')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') PORT_CHAR(']')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR('*') PORT_CHAR(':')
|
||||
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_NAME("Shift (L)")
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) PORT_NAME("Calc")
|
||||
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) PORT_NAME("Agenda")
|
||||
PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_NAME("System")
|
||||
|
||||
PORT_START("COL2")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(0x08) PORT_NAME("Delete")
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('?') PORT_CHAR('}')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') PORT_CHAR('[')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
|
||||
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) PORT_NAME("Control")
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) PORT_NAME("World")
|
||||
PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_NAME("Word")
|
||||
|
||||
PORT_START("COL3")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) PORT_NAME("Help Dial")
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') PORT_CHAR('{')
|
||||
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_NAME("Shift (R)")
|
||||
|
||||
PORT_START("COL4")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') PORT_CHAR('~')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') PORT_CHAR('\'')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
|
||||
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_NAME("Caps")
|
||||
|
||||
PORT_START("COL5")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR(0xa3) PORT_CHAR('\\')
|
||||
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11)) PORT_NAME("Menu")
|
||||
|
||||
PORT_START("COL6")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
|
||||
|
||||
PORT_START("COL7")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') PORT_NAME("1 ! Off")
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') PORT_CHAR('#')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') PORT_CHAR('@')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_NAME(UTF8_UP" Pg Up")
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) PORT_NAME("Esc On")
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
static INPUT_PORTS_START( psion3a_de )
|
||||
PORT_INCLUDE(psion3a)
|
||||
|
||||
PORT_MODIFY("COL0")
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_NAME(UTF8_RIGHT" Ende")
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('z') PORT_CHAR('Z')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_NAME(UTF8_LEFT" Pos1")
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_NAME(UTF8_DOWN" Bild Dn")
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) PORT_NAME("Tabelle")
|
||||
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_NAME("Uhr")
|
||||
PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_NAME("Daten")
|
||||
|
||||
PORT_MODIFY("COL1")
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR(0xdf)
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('+') PORT_CHAR('<')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('=') PORT_CHAR('}')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR('*') PORT_CHAR('>')
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) PORT_NAME("Rechner")
|
||||
|
||||
PORT_MODIFY("COL2")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(0x08) PORT_NAME("Entf")
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') PORT_CHAR('[')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') PORT_CHAR(']')
|
||||
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) PORT_NAME("Strg")
|
||||
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) PORT_NAME("Welt")
|
||||
|
||||
PORT_MODIFY("COL3")
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR(';')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) PORT_NAME("Hilfe Wahl")
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('?') PORT_CHAR('{')
|
||||
|
||||
PORT_MODIFY("COL4")
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') PORT_CHAR('@')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') PORT_CHAR('\'')
|
||||
|
||||
PORT_MODIFY("COL5")
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR(0xa7) PORT_CHAR('\\')
|
||||
|
||||
PORT_MODIFY("COL6")
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('y') PORT_CHAR('Y')
|
||||
|
||||
PORT_MODIFY("COL7")
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') PORT_NAME("1 ! Aus")
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') PORT_CHAR(0xba)
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR(':')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_NAME(UTF8_UP" Bild Up")
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) PORT_NAME("Esc Ein")
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
static INPUT_PORTS_START( psion3c )
|
||||
PORT_INCLUDE(psion3a)
|
||||
|
||||
PORT_MODIFY("COL2")
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) PORT_NAME("Jotter")
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
//static INPUT_PORTS_START( psion3c_de )
|
||||
// PORT_INCLUDE(psion3a_de)
|
||||
//
|
||||
// PORT_MODIFY("COL2")
|
||||
// PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F9) PORT_CHAR(UCHAR_MAMEKEY(F9)) PORT_NAME("Notiz")
|
||||
//INPUT_PORTS_END
|
||||
|
||||
|
||||
static INPUT_PORTS_START( pocketbk2 )
|
||||
PORT_INCLUDE(psion3a)
|
||||
|
||||
PORT_MODIFY("COL0")
|
||||
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_SHIFT_2) PORT_NAME("Acorn")
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) PORT_NAME("Abacus")
|
||||
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_NAME("Time")
|
||||
PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_NAME("Cards")
|
||||
|
||||
PORT_MODIFY("COL1")
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) PORT_NAME("Calc")
|
||||
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) PORT_NAME("Schedule")
|
||||
PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_NAME("Desktop")
|
||||
|
||||
PORT_MODIFY("COL2")
|
||||
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) PORT_NAME("World")
|
||||
PORT_BIT(0x400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_NAME("Write")
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
uint16_t psion3a_state::kbd_r()
|
||||
{
|
||||
uint16_t data = 0x00;
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
if (BIT(m_key_col, i))
|
||||
data |= m_keyboard[i]->read();
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
void psion3a_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));
|
||||
palette.set_pen_color(2, rgb_t(190, 210, 180));
|
||||
}
|
||||
|
||||
|
||||
void psion3a_state::psion3a(machine_config &config)
|
||||
{
|
||||
PSION_ASIC9(config, m_asic9, 7.68_MHz_XTAL); // V30H
|
||||
m_asic9->set_ram_rom("ram", "rom");
|
||||
m_asic9->port_ab_r().set(FUNC(psion3a_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; });
|
||||
m_asic9->data_r<0>().set(m_ssd[0], FUNC(psion_ssd_device::data_r)); // SSD Pack 1
|
||||
m_asic9->data_w<0>().set(m_ssd[0], FUNC(psion_ssd_device::data_w));
|
||||
m_asic9->data_r<1>().set(m_ssd[1], FUNC(psion_ssd_device::data_r)); // SSD Pack 2
|
||||
m_asic9->data_w<1>().set(m_ssd[1], FUNC(psion_ssd_device::data_w));
|
||||
//m_asic9->data_r<4>().set(m_exp, FUNC(psion_exp_slot_device::data_r)); // Expansion port
|
||||
//m_asic9->data_w<4>().set(m_exp, FUNC(psion_exp_slot_device::data_w));
|
||||
|
||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
|
||||
screen.set_size(480, 160);
|
||||
screen.set_visarea_full();
|
||||
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);
|
||||
|
||||
// TODO: M7542
|
||||
|
||||
SPEAKER(config, "mono").front_center();
|
||||
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("256K");
|
||||
|
||||
PSION_SSD(config, m_ssd[0]);
|
||||
m_ssd[0]->door_cb().set(m_asic9, FUNC(psion_asic9_device::medchng_w));
|
||||
PSION_SSD(config, m_ssd[1]);
|
||||
m_ssd[1]->door_cb().set(m_asic9, FUNC(psion_asic9_device::medchng_w));
|
||||
|
||||
//PSION_EXP_SLOT(config, m_exp, psion_exp_devices, nullptr);
|
||||
|
||||
SOFTWARE_LIST(config, "ssd_list").set_original("psion_ssd").set_filter("S3,S3A");
|
||||
}
|
||||
|
||||
void psion3a_state::psion3a2(machine_config &config)
|
||||
{
|
||||
psion3a(config);
|
||||
|
||||
m_ram->set_default_size("2M").set_extra_options("1M");
|
||||
}
|
||||
|
||||
void psion3a_state::psion3c(machine_config &config)
|
||||
{
|
||||
psion3a(config);
|
||||
|
||||
m_ram->set_default_size("2M").set_extra_options("1M");
|
||||
|
||||
// TODO: M7702
|
||||
|
||||
// TODO: add Honda port
|
||||
}
|
||||
|
||||
void psion3a_state::psion3mx(machine_config &config)
|
||||
{
|
||||
psion3a(config);
|
||||
|
||||
m_asic9->set_clock(3.6864_MHz_XTAL * 15 / 2); // V30MX
|
||||
|
||||
m_ram->set_default_size("2M").set_extra_options("");
|
||||
|
||||
// TODO: M7702
|
||||
|
||||
// TODO: add Honda port
|
||||
}
|
||||
|
||||
|
||||
ROM_START(psion3a)
|
||||
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)
|
||||
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))
|
||||
ROM_END
|
||||
|
||||
ROM_START(psion3a2_de)
|
||||
ROM_REGION16_LE(0x200000, "rom", 0)
|
||||
ROM_SYSTEM_BIOS(0, "341f", "V3.41F/DEU")
|
||||
ROMX_LOAD("s3a_v3.41f_eng.bin", 0x000000, 0x200000, CRC(1f21cb0a) SHA1(fbb9c3356cf8b1d89b8cf50fc12175568c74ce3e), ROM_BIOS(0))
|
||||
ROM_END
|
||||
|
||||
ROM_START(psion3c)
|
||||
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)
|
||||
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))
|
||||
ROM_END
|
||||
|
||||
ROM_START(pocketbk2)
|
||||
ROM_REGION16_LE(0x200000, "rom", 0)
|
||||
ROM_SYSTEM_BIOS(0, "130f", "V1.30F/ACN")
|
||||
ROMX_LOAD("pb2_v1.30f_acn.bin", 0x000000, 0x200000, CRC(d7ba3a50) SHA1(2d29a7ac5ec4d6bf63bd7d93cc3763e0f9763136), ROM_BIOS(0))
|
||||
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( 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 )
|
284
src/mame/psion/psion_ssd.cpp
Normal file
284
src/mame/psion/psion_ssd.cpp
Normal file
@ -0,0 +1,284 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/****************************************************************************
|
||||
|
||||
Psion Solid State Disk emulation
|
||||
|
||||
|
||||
Memory Type No. devices Memory Size
|
||||
D7 D6 D5 D4 D3 D2 D1 D0
|
||||
0 0 0 RAM 0 0 1 device 0 0 0 No memory
|
||||
0 0 1 Type 1 Flash 0 1 2 devices 0 0 1 32K
|
||||
0 1 0 Type 2 Flash 1 0 3 devices 0 1 0 64K
|
||||
0 1 1 Type 3 Flash 1 1 4 devices 0 1 1 128K
|
||||
1 0 0 Type 4 Flash 1 0 0 256K
|
||||
1 0 1 Type 5 Flash 1 0 1 512K
|
||||
1 1 0 Read only SSD (ROM) 1 1 0 1M
|
||||
1 1 1 Hardware Write protected SSD 1 1 1 2M
|
||||
|
||||
Info Byte (* = confirmed)
|
||||
Psion Solid State Disk 64K Flash 001 01 001 0x29
|
||||
Psion Solid State Disk 128K Flash * 001 00 011 0x23
|
||||
- MC200 System Disk * 111 00 011 0xE3
|
||||
- MC400 System Disk * 111 00 011 0xE3
|
||||
Psion Solid State Disk 256K Flash * 001 01 011 0x2B
|
||||
- MC Word System Disk * 111 01 011 0xEB
|
||||
Psion Solid State Disk 512K Flash 001 01 100 0x2C
|
||||
Psion Solid State Disk 1MB Flash * 001 11 100 0x3C
|
||||
Psion Solid State Disk 2MB Flash * 001 11 101 0x3D
|
||||
Psion Solid State Disk 4MB Flash 001 11 110 0x3E
|
||||
Psion Solid State Disk 8MB Flash * 001 11 111 0x3F
|
||||
|
||||
Psion Solid State Disk 64K RAM 000 01 001 0x09
|
||||
Psion Solid State Disk 128K RAM 000 11 001 0x19
|
||||
Psion Solid State Disk 512K RAM 000 11 011 0x1B
|
||||
Psion Solid State Disk 1MB RAM 000 11 100 0x1C
|
||||
Psion Solid State Disk 2MB RAM 000 11 101 0x1D
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "psion_ssd.h"
|
||||
|
||||
#include "softlist_dev.h"
|
||||
|
||||
|
||||
DEFINE_DEVICE_TYPE(PSION_SSD, psion_ssd_device, "psion_ssd", "Psion Solid State Disk")
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_add_mconfig - add device configuration
|
||||
//-------------------------------------------------
|
||||
|
||||
void psion_ssd_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
PSION_ASIC5_PACK(config, m_asic5);
|
||||
m_asic5->readpa_handler().set([this]() { return m_ssd_data[latched_addr()]; });
|
||||
m_asic5->writepa_handler().set([this](uint8_t data) { m_ssd_data[latched_addr()] = data; });
|
||||
m_asic5->writepb_handler().set([this](uint8_t data) { m_addr_latch = (m_addr_latch & 0xffff00) | (data << 0); });
|
||||
m_asic5->writepd_handler().set([this](uint8_t data) { m_addr_latch = (m_addr_latch & 0xff00ff) | (data << 8); });
|
||||
m_asic5->writepc_handler().set([this](uint8_t data) { m_addr_latch = (m_addr_latch & 0x00ffff) | (data << 16); });
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// psion_ssd_device - constructor
|
||||
//-------------------------------------------------
|
||||
|
||||
psion_ssd_device::psion_ssd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, PSION_SSD, tag, owner, clock)
|
||||
, device_memcard_image_interface(mconfig, *this)
|
||||
, m_region(*this, DEVICE_SELF)
|
||||
, m_asic5(*this, "asic5")
|
||||
, m_door_cb(*this)
|
||||
, m_door_timer(nullptr)
|
||||
, m_info_byte(0)
|
||||
, m_addr_latch(0)
|
||||
, m_mem_width(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// psion_ssd_device - destructor
|
||||
//-------------------------------------------------
|
||||
|
||||
psion_ssd_device::~psion_ssd_device()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_resolve_objects - resolve objects that
|
||||
// may be needed for other devices to set
|
||||
// initial conditions at start time
|
||||
//-------------------------------------------------
|
||||
|
||||
void psion_ssd_device::device_resolve_objects()
|
||||
{
|
||||
m_door_cb.resolve_safe();
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_start - device-specific startup
|
||||
//-------------------------------------------------
|
||||
|
||||
void psion_ssd_device::device_start()
|
||||
{
|
||||
m_ssd_data = make_unique_clear<uint8_t[]>(0x800000);
|
||||
|
||||
// insert default System disk
|
||||
if (m_region.found())
|
||||
{
|
||||
uint32_t size = m_region->bytes();
|
||||
memcpy(&m_ssd_data[0], m_region->base(), size);
|
||||
set_info_byte(size, SSD_FLASH1);
|
||||
}
|
||||
|
||||
m_door_timer = timer_alloc(FUNC(psion_ssd_device::close_door), this);
|
||||
m_door_timer->reset();
|
||||
|
||||
save_pointer(NAME(m_ssd_data), 0x800000);
|
||||
save_item(NAME(m_info_byte));
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_reset - device-specific reset
|
||||
//-------------------------------------------------
|
||||
|
||||
void psion_ssd_device::device_reset()
|
||||
{
|
||||
m_addr_latch = 0x00;
|
||||
|
||||
// open the door
|
||||
m_door_cb(ASSERT_LINE);
|
||||
|
||||
// setup the timer to close the door
|
||||
m_door_timer->adjust(attotime::from_msec(200));
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// device_config_complete - perform any
|
||||
// operations now that the configuration is
|
||||
// complete
|
||||
//-------------------------------------------------
|
||||
|
||||
void psion_ssd_device::device_config_complete()
|
||||
{
|
||||
add_format("ssd", "Psion Solid State Disk image", "bin,rom", "");
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// get_software_list_loader -
|
||||
//-------------------------------------------------
|
||||
|
||||
const software_list_loader &psion_ssd_device::get_software_list_loader() const
|
||||
{
|
||||
return image_software_list_loader::instance();
|
||||
}
|
||||
|
||||
|
||||
|
||||
TIMER_CALLBACK_MEMBER(psion_ssd_device::close_door)
|
||||
{
|
||||
// close the door
|
||||
m_door_cb(CLEAR_LINE);
|
||||
}
|
||||
|
||||
|
||||
image_init_result psion_ssd_device::call_load()
|
||||
{
|
||||
device_image_interface *image = nullptr;
|
||||
interface(image);
|
||||
|
||||
uint32_t size = image->length();
|
||||
|
||||
if (size < 0x10000 || size > 0x800000 || (size & (size - 1)) != 0)
|
||||
{
|
||||
image->seterror(image_error::INVALIDIMAGE, "Invalid size, must be 64K, 128K, 256K, 512K, 1M, 2M, 4M, 8M");
|
||||
return image_init_result::FAIL;
|
||||
}
|
||||
|
||||
image->fread(m_ssd_data.get(), size);
|
||||
|
||||
// check for Flash header
|
||||
if ((m_ssd_data[0] | (m_ssd_data[1] << 8)) == 0xf1a5) // Flash
|
||||
set_info_byte(size, SSD_FLASH1);
|
||||
else
|
||||
set_info_byte(size, SSD_RAM);
|
||||
|
||||
// open the door
|
||||
m_door_cb(ASSERT_LINE);
|
||||
|
||||
// setup the timer to close the door
|
||||
m_door_timer->adjust(attotime::from_msec(200));
|
||||
|
||||
return image_init_result::PASS;
|
||||
}
|
||||
|
||||
|
||||
void psion_ssd_device::call_unload()
|
||||
{
|
||||
memset(m_ssd_data.get(), 0, sizeof(m_ssd_data));
|
||||
set_info_byte(0);
|
||||
}
|
||||
|
||||
|
||||
uint32_t psion_ssd_device::latched_addr()
|
||||
{
|
||||
return (m_addr_latch & make_bitmask<uint32_t>(m_mem_width)) | (BIT(m_addr_latch, 22, 2) << m_mem_width);
|
||||
}
|
||||
|
||||
|
||||
void psion_ssd_device::set_info_byte(uint32_t size, uint8_t type)
|
||||
{
|
||||
m_info_byte = 0x00;
|
||||
|
||||
// Type 1 Flash or RAM
|
||||
if (type != SSD_RAM)
|
||||
m_info_byte |= 0x20;
|
||||
|
||||
// No. devices and size
|
||||
switch (size)
|
||||
{
|
||||
case 0x010000: // 64K (2 x 32K)
|
||||
m_info_byte = 0x09;
|
||||
m_mem_width = 15;
|
||||
break;
|
||||
case 0x020000: // 128K (1 x 128K)
|
||||
m_info_byte = 0x03;
|
||||
m_mem_width = 17;
|
||||
break;
|
||||
case 0x040000: // 256K (2 x 128K)
|
||||
m_info_byte = 0x0b;
|
||||
m_mem_width = 17;
|
||||
break;
|
||||
case 0x080000: // 512K (2 x 256K)
|
||||
m_info_byte = 0x0c;
|
||||
m_mem_width = 18;
|
||||
break;
|
||||
case 0x100000: // 1M (4 x 256K)
|
||||
m_info_byte = 0x1c;
|
||||
m_mem_width = 18;
|
||||
break;
|
||||
case 0x200000: // 2M (4 x 512K)
|
||||
m_info_byte = 0x1d;
|
||||
m_mem_width = 19;
|
||||
break;
|
||||
case 0x400000:// 4M (4 x 1M)
|
||||
m_info_byte = 0x1e;
|
||||
m_mem_width = 20;
|
||||
break;
|
||||
case 0x800000:// 8M (4 x 2M)
|
||||
m_info_byte = 0x1f;
|
||||
m_mem_width = 21;
|
||||
break;
|
||||
}
|
||||
|
||||
// write protected
|
||||
m_info_byte |= 0xe0;
|
||||
|
||||
// set pull-ups on ASIC5
|
||||
m_asic5->set_info_byte(m_info_byte);
|
||||
}
|
||||
|
||||
|
||||
uint8_t psion_ssd_device::data_r()
|
||||
{
|
||||
if (m_info_byte)
|
||||
{
|
||||
return m_asic5->data_r();
|
||||
}
|
||||
return 0x00;
|
||||
}
|
||||
|
||||
void psion_ssd_device::data_w(uint16_t data)
|
||||
{
|
||||
if (m_info_byte)
|
||||
{
|
||||
m_asic5->data_w(data);
|
||||
}
|
||||
}
|
84
src/mame/psion/psion_ssd.h
Normal file
84
src/mame/psion/psion_ssd.h
Normal file
@ -0,0 +1,84 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/****************************************************************************
|
||||
|
||||
Psion Solid State Disk emulation
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef MAME_PSION_PSION_SSD_H
|
||||
#define MAME_PSION_PSION_SSD_H
|
||||
|
||||
#include "machine/psion_asic5.h"
|
||||
#include "imagedev/memcard.h"
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
TYPE DEFINITIONS
|
||||
***************************************************************************/
|
||||
|
||||
// ======================> psion_ssd_device
|
||||
|
||||
class psion_ssd_device : public device_t, public device_memcard_image_interface
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
psion_ssd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
|
||||
virtual ~psion_ssd_device();
|
||||
|
||||
// callbacks
|
||||
auto door_cb() { return m_door_cb.bind(); }
|
||||
|
||||
uint8_t data_r();
|
||||
void data_w(uint16_t data);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_resolve_objects() override;
|
||||
virtual void device_config_complete() override;
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
|
||||
// image-level overrides
|
||||
virtual image_init_result call_load() override;
|
||||
virtual void call_unload() override;
|
||||
|
||||
virtual bool is_reset_on_load() const noexcept override { return false; }
|
||||
virtual const char *image_interface() const noexcept override { return "psion_ssd"; }
|
||||
virtual const char *file_extensions() const noexcept override { return "rom,bin"; }
|
||||
virtual const char *image_type_name() const noexcept override { return "ssd"; }
|
||||
virtual const char *image_brief_type_name() const noexcept override { return "ssd"; }
|
||||
|
||||
// device_image_interface implementation
|
||||
virtual const software_list_loader &get_software_list_loader() const override;
|
||||
|
||||
private:
|
||||
optional_memory_region m_region;
|
||||
required_device<psion_asic5_device> m_asic5;
|
||||
|
||||
inline uint32_t mem_addr() const noexcept { return (m_addr_latch & make_bitmask<uint32_t>(m_mem_width)) | (BIT(m_addr_latch, 22, 2) << m_mem_width); }
|
||||
|
||||
TIMER_CALLBACK_MEMBER(close_door);
|
||||
|
||||
devcb_write_line m_door_cb;
|
||||
emu_timer *m_door_timer;
|
||||
|
||||
std::unique_ptr<uint8_t[]> m_ssd_data;
|
||||
|
||||
void set_info_byte(uint32_t size, uint8_t type = 0);
|
||||
uint32_t latched_addr();
|
||||
|
||||
uint8_t m_info_byte;
|
||||
uint32_t m_addr_latch;
|
||||
int m_mem_width;
|
||||
|
||||
static constexpr uint8_t SSD_RAM = 0;
|
||||
static constexpr uint8_t SSD_FLASH1 = 1;
|
||||
};
|
||||
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(PSION_SSD, psion_ssd_device)
|
||||
|
||||
#endif // MAME_PSION_PSION_SSD_H
|
226
src/mame/psion/siena.cpp
Normal file
226
src/mame/psion/siena.cpp
Normal file
@ -0,0 +1,226 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/******************************************************************************
|
||||
|
||||
Psion Siena
|
||||
|
||||
TODO:
|
||||
- battery backed RAM
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "machine/psion_asic9.h"
|
||||
#include "machine/ram.h"
|
||||
#include "sound/spkrdev.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "softlist_dev.h"
|
||||
#include "speaker.h"
|
||||
#include "utf8.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class siena_state : public driver_device
|
||||
{
|
||||
public:
|
||||
siena_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_palette(*this, "palette")
|
||||
, m_keyboard(*this, "COL%u", 0U)
|
||||
, m_speaker(*this, "speaker")
|
||||
{ }
|
||||
|
||||
void siena(machine_config &config);
|
||||
|
||||
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<palette_device> m_palette;
|
||||
required_ioport_array<8> m_keyboard;
|
||||
required_device<speaker_sound_device> m_speaker;
|
||||
|
||||
void palette_init(palette_device &palette);
|
||||
|
||||
uint16_t kbd_r();
|
||||
|
||||
uint8_t m_key_col = 0;
|
||||
};
|
||||
|
||||
|
||||
void siena_state::machine_start()
|
||||
{
|
||||
}
|
||||
|
||||
void siena_state::machine_reset()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
static INPUT_PORTS_START( siena )
|
||||
PORT_START("COL0")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CODE(KEYCODE_7_PAD) PORT_CHAR('7')
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CODE(KEYCODE_6_PAD) PORT_CHAR('6')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CODE(KEYCODE_5_PAD) PORT_CHAR('5')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CODE(KEYCODE_4_PAD) PORT_CHAR('4')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CODE(KEYCODE_3_PAD) PORT_CHAR('3') PORT_NAME("3 MC")
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CODE(KEYCODE_2_PAD) PORT_CHAR('2') PORT_NAME("2 MR")
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1') PORT_NAME("1 Min")
|
||||
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0')
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("On/CE")
|
||||
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_UNKNOWN)
|
||||
|
||||
PORT_START("COL1")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') PORT_CHAR('"')
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') PORT_CHAR('/')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR('(')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CODE(KEYCODE_8_PAD) PORT_CHAR('8')
|
||||
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RCONTROL) PORT_CHAR(UCHAR_SHIFT_2) PORT_NAME("Fn")
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_PGUP) PORT_NAME("IR Send")
|
||||
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_NAME("Word")
|
||||
|
||||
PORT_START("COL2")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') PORT_CHAR(0xa3)
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') PORT_CHAR('~')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F10) PORT_CHAR(UCHAR_MAMEKEY(F10)) PORT_NAME("Help")
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR(')')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CODE(KEYCODE_9_PAD) PORT_CHAR('9')
|
||||
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT)) PORT_NAME("Psion")
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_PGDN) PORT_NAME("IR Receive")
|
||||
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F4)) PORT_NAME("Agenda")
|
||||
|
||||
PORT_START("COL3")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') PORT_CHAR('$')
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') PORT_CHAR('@')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_NAME(UTF8_LEFT" Home")
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_NAME("= %")
|
||||
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_NAME("Shift (L)")
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Off")
|
||||
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F5) PORT_CHAR(UCHAR_MAMEKEY(F5)) PORT_NAME("Time")
|
||||
|
||||
PORT_START("COL4")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') PORT_CHAR('%')
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') PORT_CHAR('{')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_NAME(UTF8_DOWN" Pg Dn")
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_NAME(UTF8_UP" Pg Up")
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_NAME("Enter")
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_PLUS_PAD) PORT_CHAR('+') PORT_NAME("+ M+")
|
||||
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_NAME("Shift (R)")
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F6) PORT_CHAR(UCHAR_MAMEKEY(F6)) PORT_NAME("World")
|
||||
|
||||
PORT_START("COL5")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') PORT_CHAR('^')
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') PORT_CHAR('}')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_NAME(UTF8_RIGHT" End")
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(0x08) PORT_NAME("Del")
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ASTERISK) PORT_CHAR('*') PORT_NAME(u8"×")
|
||||
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_UNKNOWN)
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F8) PORT_CHAR(UCHAR_MAMEKEY(F8)) PORT_NAME("Sheet")
|
||||
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F7) PORT_CHAR(UCHAR_MAMEKEY(F7)) PORT_NAME("Calc")
|
||||
|
||||
PORT_START("COL6")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') PORT_CHAR('!')
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') PORT_CHAR('\\')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_NAME("Caps")
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') PORT_CHAR(']')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_CHAR('*')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH_PAD) PORT_CHAR('/') PORT_NAME(u8"÷")
|
||||
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS_PAD) PORT_CHAR('-') PORT_NAME("- M-")
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) PORT_NAME("Esc")
|
||||
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_NAME("Data")
|
||||
|
||||
PORT_START("COL7")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(0x09) PORT_NAME("Tab")
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') PORT_CHAR('#')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11)) PORT_NAME("Menu Info")
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') PORT_CHAR('[')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') PORT_CHAR('&')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR('.') PORT_NAME(". +/-")
|
||||
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) PORT_NAME("Control")
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||
PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_NAME("System")
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
uint16_t siena_state::kbd_r()
|
||||
{
|
||||
uint16_t data = 0x00;
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
if (BIT(m_key_col, i))
|
||||
data |= m_keyboard[i]->read();
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
void siena_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));
|
||||
palette.set_pen_color(2, rgb_t(190, 210, 180));
|
||||
}
|
||||
|
||||
|
||||
void siena_state::siena(machine_config &config)
|
||||
{
|
||||
PSION_ASIC9(config, m_asic9, 7.68_MHz_XTAL);
|
||||
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));
|
||||
m_asic9->col_cb().set([this](uint8_t data) { m_key_col = data; });
|
||||
|
||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
|
||||
screen.set_size(240, 160);
|
||||
screen.set_visarea_full();
|
||||
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(siena_state::palette_init), 3);
|
||||
|
||||
SPEAKER(config, "mono").front_center();
|
||||
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");
|
||||
|
||||
// TODO: add Honda port
|
||||
|
||||
SOFTWARE_LIST(config, "ssd_list").set_original("psion_ssd").set_filter("WA");
|
||||
}
|
||||
|
||||
|
||||
ROM_START(siena)
|
||||
ROM_REGION16_LE(0x100000, "rom", 0)
|
||||
ROM_SYSTEM_BIOS(0, "420f", "V4.20F")
|
||||
ROMX_LOAD("vine_v4.20f.bin", 0x00000, 0x100000, CRC(641f8e7c) SHA1(fe0e46540e0aac5aabb2dd1b96689da41e8f55fb), ROM_BIOS(0))
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
// 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 )
|
265
src/mame/psion/workabout.cpp
Normal file
265
src/mame/psion/workabout.cpp
Normal file
@ -0,0 +1,265 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nigel Barnes
|
||||
/******************************************************************************
|
||||
|
||||
Psion Workabout
|
||||
|
||||
TODO:
|
||||
- battery backed RAM
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "machine/psion_asic9.h"
|
||||
#include "machine/ram.h"
|
||||
#include "sound/spkrdev.h"
|
||||
//#include "bus/psion/exp/slot.h"
|
||||
#include "psion_ssd.h"
|
||||
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
#include "softlist_dev.h"
|
||||
#include "speaker.h"
|
||||
#include "utf8.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class workabout_state : public driver_device
|
||||
{
|
||||
public:
|
||||
workabout_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_palette(*this, "palette")
|
||||
, m_keyboard(*this, "COL%u", 0U)
|
||||
, m_speaker(*this, "speaker")
|
||||
, m_ssd(*this, "ssd%u", 1U)
|
||||
//, m_exp(*this, "exp%u", 1U)
|
||||
{ }
|
||||
|
||||
void workabout(machine_config &config);
|
||||
void psionwa(machine_config &config);
|
||||
void psionwamx(machine_config &config);
|
||||
|
||||
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<palette_device> m_palette;
|
||||
required_ioport_array<8> m_keyboard;
|
||||
required_device<speaker_sound_device> m_speaker;
|
||||
required_device_array<psion_ssd_device, 2> m_ssd;
|
||||
//required_device_array<psion_exp_slot_device, 3> m_exp;
|
||||
|
||||
void palette_init(palette_device &palette);
|
||||
|
||||
uint16_t kbd_r();
|
||||
|
||||
uint8_t m_key_col = 0;
|
||||
};
|
||||
|
||||
|
||||
void workabout_state::machine_start()
|
||||
{
|
||||
}
|
||||
|
||||
void workabout_state::machine_reset()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
static INPUT_PORTS_START( workabout )
|
||||
PORT_START("COL0")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') PORT_CHAR('}')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_NAME(UTF8_DOWN)
|
||||
PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||
PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) PORT_NAME("On/Esc")
|
||||
|
||||
PORT_START("COL1")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) PORT_NAME("Enter")
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) PORT_NAME(UTF8_RIGHT)
|
||||
PORT_BIT(0x180, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||
|
||||
PORT_START("COL2")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) PORT_NAME("Shift")
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') PORT_NAME("1 ! @")
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') PORT_CHAR('\'')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(0x08) PORT_NAME("Del")
|
||||
PORT_BIT(0x180, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||
|
||||
PORT_START("COL3")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_SHIFT_2) PORT_NAME("Psion")
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') PORT_CHAR('#')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') PORT_CHAR('[')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(0x09) PORT_NAME("Tab")
|
||||
PORT_BIT(0x180, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||
|
||||
PORT_START("COL4")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR(0xa3) PORT_CHAR('\\')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') PORT_CHAR(']')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP)) PORT_NAME(UTF8_UP)
|
||||
PORT_BIT(0x180, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||
|
||||
PORT_START("COL5")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('+') PORT_CHAR('=')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR('*') PORT_CHAR(':')
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F11) PORT_CHAR(UCHAR_MAMEKEY(F11)) PORT_NAME("Menu")
|
||||
PORT_BIT(0x180, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||
|
||||
PORT_START("COL6")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) PORT_NAME("Control")
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(';') PORT_CHAR('<')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') PORT_CHAR('~')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD)
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Contrast")
|
||||
PORT_BIT(0x180, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||
|
||||
PORT_START("COL7")
|
||||
PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
|
||||
PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
|
||||
PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
|
||||
PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR(',')
|
||||
PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') PORT_CHAR('{')
|
||||
PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT)) PORT_NAME(UTF8_LEFT)
|
||||
PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Backlight")
|
||||
PORT_BIT(0x180, IP_ACTIVE_HIGH, IPT_UNUSED)
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
uint16_t workabout_state::kbd_r()
|
||||
{
|
||||
uint16_t data = 0x00;
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
if (BIT(m_key_col, i))
|
||||
data |= m_keyboard[i]->read();
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
void workabout_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));
|
||||
palette.set_pen_color(2, rgb_t(190, 210, 180));
|
||||
}
|
||||
|
||||
|
||||
void workabout_state::workabout(machine_config &config)
|
||||
{
|
||||
PSION_ASIC9(config, m_asic9, 7.68_MHz_XTAL); // V30H
|
||||
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));
|
||||
m_asic9->col_cb().set([this](uint8_t data) { m_key_col = data; });
|
||||
m_asic9->data_r<0>().set(m_ssd[0], FUNC(psion_ssd_device::data_r)); // SSD Pack 1
|
||||
m_asic9->data_w<0>().set(m_ssd[0], FUNC(psion_ssd_device::data_w));
|
||||
m_asic9->data_r<1>().set(m_ssd[1], FUNC(psion_ssd_device::data_r)); // SSD Pack 2
|
||||
m_asic9->data_w<1>().set(m_ssd[1], FUNC(psion_ssd_device::data_w));
|
||||
//m_asic9->data_r<2>().set(m_exp[0], FUNC(psion_exp_slot_device::data_r)); // Expansion port A
|
||||
//m_asic9->data_w<2>().set(m_exp[0], FUNC(psion_exp_slot_device::data_w));
|
||||
//m_asic9->data_r<3>().set(m_exp[1], FUNC(psion_exp_slot_device::data_r)); // Expansion port B
|
||||
//m_asic9->data_w<3>().set(m_exp[1], FUNC(psion_exp_slot_device::data_w));
|
||||
//m_asic9->data_r<4>().set(m_exp[2], FUNC(psion_exp_slot_device::data_r)); // Expansion port C
|
||||
//m_asic9->data_w<4>().set(m_exp[2], FUNC(psion_exp_slot_device::data_w));
|
||||
|
||||
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));
|
||||
screen.set_size(240, 100);
|
||||
screen.set_visarea_full();
|
||||
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(workabout_state::palette_init), 3);
|
||||
|
||||
SPEAKER(config, "mono").front_center();
|
||||
SPEAKER_SOUND(config, m_speaker).add_route(ALL_OUTPUTS, "mono", 1.00); // Piezo buzzer
|
||||
|
||||
RAM(config, m_ram);
|
||||
|
||||
PSION_SSD(config, m_ssd[0]);
|
||||
m_ssd[0]->door_cb().set(m_asic9, FUNC(psion_asic9_device::medchng_w));
|
||||
PSION_SSD(config, m_ssd[1]);
|
||||
m_ssd[1]->door_cb().set(m_asic9, FUNC(psion_asic9_device::medchng_w));
|
||||
|
||||
//PSION_EXP_SLOT(config, m_exp[0], psion_exp_devices, nullptr);
|
||||
//PSION_EXP_SLOT(config, m_exp[1], psion_exp_devices, nullptr);
|
||||
//PSION_EXP_SLOT(config, m_exp[2], psion_exp_devices, nullptr);
|
||||
|
||||
SOFTWARE_LIST(config, "ssd_list").set_original("psion_ssd").set_filter("WA");
|
||||
}
|
||||
|
||||
|
||||
void workabout_state::psionwa(machine_config &config)
|
||||
{
|
||||
workabout(config);
|
||||
|
||||
m_ram->set_default_size("1M");
|
||||
}
|
||||
|
||||
void workabout_state::psionwamx(machine_config &config)
|
||||
{
|
||||
workabout(config);
|
||||
|
||||
m_asic9->set_clock(3.6864_MHz_XTAL * 15 / 2); // V30MX
|
||||
|
||||
m_ram->set_default_size("2M");
|
||||
}
|
||||
|
||||
|
||||
ROM_START(psionwa)
|
||||
ROM_REGION16_LE(0x200000, "rom", 0)
|
||||
ROM_SYSTEM_BIOS(0, "240f", "V2.40F 060897")
|
||||
ROMX_LOAD("w1_v2.40f.bin", 0x00000, 0x200000, CRC(4ef1d380) SHA1(d155edf7995c2a799525b53079fff9fb68789f0f), ROM_BIOS(0))
|
||||
ROM_SYSTEM_BIOS(1, "100f", "V1.00F 010195")
|
||||
ROMX_LOAD("w1_v1.00f.bin", 0x00000, 0x100000, CRC(8fd7c127) SHA1(316fdc6c54629470f1af3295c46a2e7d58ebdca9), ROM_BIOS(1))
|
||||
ROM_RELOAD(0x100000, 0x100000)
|
||||
ROM_SYSTEM_BIOS(2, "024b", "V0.24B 120296")
|
||||
ROMX_LOAD("w1_v0.24b.bin", 0x00000, 0x200000, CRC(6e7e3016) SHA1(5c35eea431f975cdefc770697a88fe62a1e7af7f), ROM_BIOS(2))
|
||||
ROM_END
|
||||
|
||||
ROM_START(psionwamx)
|
||||
ROM_REGION16_LE(0x200000, "rom", 0)
|
||||
ROM_SYSTEM_BIOS(0, "720f", "V7.20F 230798")
|
||||
ROMX_LOAD("w2mx_v7.20f.bin", 0x00000, 0x200000, CRC(63734683) SHA1(9d8aa1e45f52e7fcb52d6e81ac47f60d1104c35d), ROM_BIOS(0))
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
|
||||
// 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 )
|
Loading…
Reference in New Issue
Block a user