summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/jornada.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/jornada.cpp')
-rw-r--r--src/mame/drivers/jornada.cpp318
1 files changed, 224 insertions, 94 deletions
diff --git a/src/mame/drivers/jornada.cpp b/src/mame/drivers/jornada.cpp
index f1f184913d5..25d2c2de387 100644
--- a/src/mame/drivers/jornada.cpp
+++ b/src/mame/drivers/jornada.cpp
@@ -4,29 +4,33 @@
HP Jornada PDA skeleton driver
- Notes:
- - GPIO1: IRQ from SA-1111
+ To boot:
+ - Start MAME with the debugger enabled
+ - Use the following breakpoint command: bp 13E2C,R3==3 && R1==10
+ - Close the debugger and allow the machine to run
+ - When the breakpoint is hit, use the following command: R3=0
+ - Close the debugger, booting will proceed
***************************************************************************/
#include "emu.h"
#include "cpu/arm7/arm7.h"
#include "cpu/arm7/arm7core.h"
+#include "machine/m950x0.h"
#include "machine/sa1110.h"
#include "machine/sa1111.h"
#include "sound/uda1344.h"
#include "video/sed1356.h"
#include "screen.h"
#include "emupal.h"
+#include "speaker.h"
#define LOG_MCU (1 << 1)
#define LOG_ALL (LOG_MCU)
-#define VERBOSE (LOG_ALL)
+#define VERBOSE (0)
#include "logmacro.h"
-#define SA1110_CLOCK 206000000
-
namespace
{
@@ -39,26 +43,58 @@ public:
, m_ram(*this, "ram")
, m_sa_periphs(*this, "onboard")
, m_companion(*this, "companion")
- , m_eeprom_data(*this, "eeprom")
, m_epson(*this, "epson")
, m_codec(*this, "codec")
- , m_kbd_port(*this, "KBD0")
+ , m_nvram(*this, "nvram")
+ , m_kbd_ports(*this, "KBD%u", 0U)
+ , m_pen_x(*this, "PENX")
+ , m_pen_y(*this, "PENY")
+ , m_pen_button(*this, "PENZ")
{ }
void jornada720(machine_config &config);
DECLARE_INPUT_CHANGED_MEMBER(key_changed);
+ DECLARE_INPUT_CHANGED_MEMBER(pen_changed);
+
+ enum : uint8_t
+ {
+ MCU_TXDUMMY = 0x11,
+ MCU_TXDUMMY2 = 0x88
+ };
+
+
+ enum
+ {
+ KEY_ON_OFF = 0x7f,
+ KEY_S = 0x32,
+ KEY_K = 0x38,
+ KEY_1 = 0x11,
+ KEY_2 = 0x12,
+ KEY_3 = 0x13,
+ KEY_4 = 0x14,
+ KEY_9 = 0x19,
+ KEY_TAB = 0x51,
+ KEY_ENTER = 0x4c,
+ KEY_A = 0x31,
+ KEY_N = 0x46,
+ KEY_L = 0x39,
+ KEY_M = 0x47,
+ KEY_P = 0x2a,
+ KEY_C = 0x43,
+ KEY_B = 0x45,
+ KEY_ALT = 0x65,
+ KEY_SPACE = 0x74,
+ KEY_BACKSPACE = 0x2c,
+ KEY_LSHIFT = 0x53,
+ KEY_RSHIFT = 0x5c
+ };
enum
{
- KEY_ON_OFF,
- KEY_S,
- KEY_K,
- KEY_1,
- KEY_2,
- KEY_3,
- KEY_4,
- KEY_9
+ PEN_X,
+ PEN_Y,
+ PEN_BUTTON
};
protected:
@@ -67,17 +103,23 @@ protected:
virtual void machine_reset() override;
virtual void device_reset_after_children() override;
+ static constexpr uint32_t SA1110_CLOCK = 206000000;
+
void main_map(address_map &map);
+ void mcu_assemble_touch_data();
void mcu_byte_received(uint16_t data);
- void eeprom_cmd_received(uint16_t data);
+ void eeprom_data_received(uint16_t data);
+ void eeprom_select(int state);
enum mcu_state : int
{
MCU_IDLE,
MCU_KBD_SEND_COUNT,
- MCU_KBD_SEND_CODES
+ MCU_KBD_SEND_CODES,
+
+ MCU_TOUCH_SEND_DATA
};
// devices
@@ -85,22 +127,25 @@ protected:
required_shared_ptr<uint32_t> m_ram;
required_device<sa1110_periphs_device> m_sa_periphs;
required_device<sa1111_device> m_companion;
- required_region_ptr<uint8_t> m_eeprom_data;
required_device<sed1356_device> m_epson;
required_device<uda1344_device> m_codec;
+ required_device<m95020_device> m_nvram;
- required_ioport m_kbd_port;
+ required_ioport_array<3> m_kbd_ports;
+ required_ioport m_pen_x;
+ required_ioport m_pen_y;
+ required_ioport m_pen_button;
// MCU-related members
int m_mcu_state;
uint8_t m_mcu_key_send_idx;
uint8_t m_mcu_key_codes[2][8];
uint8_t m_mcu_key_count[2];
-
- // EEPROM-related members
- uint8_t m_eeprom_cmd;
- uint8_t m_eeprom_count;
- uint8_t m_eeprom_read_idx;
+ uint8_t m_mcu_key_idx[2];
+ uint8_t m_mcu_touch_send_idx;
+ uint8_t m_mcu_touch_data[2][8];
+ uint8_t m_mcu_touch_count[2];
+ uint8_t m_mcu_touch_idx[2];
};
void jornada_state::main_map(address_map &map)
@@ -110,6 +155,7 @@ void jornada_state::main_map(address_map &map)
map(0x40000000, 0x40001fff).m(m_companion, FUNC(sa1111_device::map));
map(0x48000000, 0x481fffff).m(m_epson, FUNC(sed1356_device::map));
map(0x48200000, 0x4827ffff).m(m_epson, FUNC(sed1356_device::vram_map));
+ map(0x80030000, 0x8003007b).rw(m_sa_periphs, FUNC(sa1110_periphs_device::icp_r), FUNC(sa1110_periphs_device::icp_w));
map(0x80050000, 0x80050023).rw(m_sa_periphs, FUNC(sa1110_periphs_device::uart3_r), FUNC(sa1110_periphs_device::uart3_w));
map(0x80060000, 0x8006001b).rw(m_sa_periphs, FUNC(sa1110_periphs_device::mcp_r), FUNC(sa1110_periphs_device::mcp_w));
map(0x80070000, 0x80070077).rw(m_sa_periphs, FUNC(sa1110_periphs_device::ssp_r), FUNC(sa1110_periphs_device::ssp_w));
@@ -119,6 +165,8 @@ void jornada_state::main_map(address_map &map)
map(0x90030000, 0x90030007).rw(m_sa_periphs, FUNC(sa1110_periphs_device::reset_r), FUNC(sa1110_periphs_device::reset_w));
map(0x90040000, 0x90040023).rw(m_sa_periphs, FUNC(sa1110_periphs_device::gpio_r), FUNC(sa1110_periphs_device::gpio_w));
map(0x90050000, 0x90050023).rw(m_sa_periphs, FUNC(sa1110_periphs_device::intc_r), FUNC(sa1110_periphs_device::intc_w));
+ map(0x90060000, 0x90060013).rw(m_sa_periphs, FUNC(sa1110_periphs_device::ppc_r), FUNC(sa1110_periphs_device::ppc_w));
+ map(0xb0000000, 0xb00000bf).rw(m_sa_periphs, FUNC(sa1110_periphs_device::dma_r), FUNC(sa1110_periphs_device::dma_w));
map(0xc0000000, 0xc1ffffff).ram().share("ram");
map(0xe0000000, 0xe0003fff).noprw(); // Cache-Flush Region 0
map(0xe0100000, 0xe01003ff).noprw(); // Cache-Flush Region 1
@@ -126,6 +174,23 @@ void jornada_state::main_map(address_map &map)
void jornada_state::device_reset_after_children()
{
+ m_sa_periphs->gpio_in<9>(1);
+}
+
+void jornada_state::mcu_assemble_touch_data()
+{
+ const uint16_t pen_x = m_pen_x->read();
+ const uint16_t pen_y = m_pen_y->read();
+ const uint8_t touch_recv_idx = 1 - m_mcu_touch_send_idx;
+ m_mcu_touch_data[touch_recv_idx][0] = (uint8_t)pen_x;
+ m_mcu_touch_data[touch_recv_idx][1] = (uint8_t)pen_x;
+ m_mcu_touch_data[touch_recv_idx][2] = (uint8_t)pen_x;
+ m_mcu_touch_data[touch_recv_idx][3] = (uint8_t)pen_y;
+ m_mcu_touch_data[touch_recv_idx][4] = (uint8_t)pen_y;
+ m_mcu_touch_data[touch_recv_idx][5] = (uint8_t)pen_y;
+ m_mcu_touch_data[touch_recv_idx][6] = (uint8_t)((pen_x >> 8) * 0x15);
+ m_mcu_touch_data[touch_recv_idx][7] = (uint8_t)((pen_y >> 8) * 0x15);
+ m_mcu_touch_count[touch_recv_idx] = 8;
}
void jornada_state::mcu_byte_received(uint16_t data)
@@ -133,7 +198,7 @@ void jornada_state::mcu_byte_received(uint16_t data)
const uint8_t raw_value = (uint8_t)(data >> 8);
const uint8_t value = bitswap<8>(raw_value, 0, 1, 2, 3, 4, 5, 6, 7);
- uint8_t response = 0x11;
+ uint8_t response = MCU_TXDUMMY;
switch (m_mcu_state)
{
case MCU_IDLE:
@@ -144,6 +209,11 @@ void jornada_state::mcu_byte_received(uint16_t data)
m_mcu_state = MCU_KBD_SEND_COUNT;
m_mcu_key_send_idx = 1 - m_mcu_key_send_idx;
break;
+ case 0xa0:
+ LOGMASKED(LOG_MCU, "mcu_byte_received in MCU_IDLE: GetTouchSamples, entering TOUCH_SEND_DATA state\n");
+ m_mcu_state = MCU_TOUCH_SEND_DATA;
+ m_mcu_touch_send_idx = 1 - m_mcu_touch_send_idx;
+ break;
default:
LOGMASKED(LOG_MCU, "mcu_byte_received in MCU_IDLE: Unknown (%02x), ignoring and sending TxDummy response\n", value);
break;
@@ -151,7 +221,7 @@ void jornada_state::mcu_byte_received(uint16_t data)
break;
case MCU_KBD_SEND_COUNT:
- if (value == 0x11)
+ if (value == MCU_TXDUMMY || value == MCU_TXDUMMY2)
{
LOGMASKED(LOG_MCU, "mcu_byte_received in MCU_KBD_SEND_COUNT: TxDummy, entering KBD_SEND_CODES state\n");
response = m_mcu_key_count[m_mcu_key_send_idx];
@@ -159,16 +229,42 @@ void jornada_state::mcu_byte_received(uint16_t data)
}
else
{
- LOGMASKED(LOG_MCU, "mcu_byte_received in MCU_KBD_SEND_COUNT: Unknown (%02x), sending ErrorCode response and returning to IDLE state\n");
+ LOGMASKED(LOG_MCU, "mcu_byte_received in MCU_KBD_SEND_COUNT: Unknown (%02x), sending ErrorCode response and returning to IDLE state\n", value);
+ response = 0;
+ }
+ break;
+
+ case MCU_TOUCH_SEND_DATA:
+ if (value == MCU_TXDUMMY || value == MCU_TXDUMMY2)
+ {
+ m_mcu_touch_count[m_mcu_touch_send_idx]--;
+ response = m_mcu_touch_data[m_mcu_touch_send_idx][m_mcu_touch_idx[m_mcu_touch_send_idx]];
+ m_mcu_touch_idx[m_mcu_touch_send_idx]++;
+ if (m_mcu_touch_count[m_mcu_touch_send_idx])
+ {
+ LOGMASKED(LOG_MCU, "mcu_byte_received in MCU_TOUCH_SEND_DATA: TxDummy, sending touch data %02x with %d remaining\n", response, m_mcu_touch_count[m_mcu_touch_send_idx]);
+ }
+ else
+ {
+ LOGMASKED(LOG_MCU, "mcu_byte_received in MCU_TOUCH_SEND_DATA: TxDummy, sending touch data %02x and returning to IDLE state\n", response);
+ m_mcu_state = MCU_IDLE;
+ m_mcu_touch_idx[m_mcu_touch_send_idx] = 0;
+ //machine().debug_break();
+ }
+ }
+ else
+ {
+ LOGMASKED(LOG_MCU, "mcu_byte_received in MCU_TOUCH_SEND_DATA: Unknown (%02x), sending ErrorCode response and returning to IDLE state\n", value);
response = 0;
}
break;
case MCU_KBD_SEND_CODES:
- if (value == 0x11)
+ if (value == MCU_TXDUMMY || value == MCU_TXDUMMY2)
{
m_mcu_key_count[m_mcu_key_send_idx]--;
- response = m_mcu_key_codes[m_mcu_key_send_idx][m_mcu_key_count[m_mcu_key_send_idx]];
+ response = m_mcu_key_codes[m_mcu_key_send_idx][m_mcu_key_idx[m_mcu_key_send_idx]];
+ m_mcu_key_idx[m_mcu_key_send_idx]++;
if (m_mcu_key_count[m_mcu_key_send_idx])
{
LOGMASKED(LOG_MCU, "mcu_byte_received in MCU_KBD_SEND_CODES: TxDummy, sending scan code %02x with %d remaining\n", response, m_mcu_key_count[m_mcu_key_send_idx]);
@@ -177,6 +273,7 @@ void jornada_state::mcu_byte_received(uint16_t data)
{
LOGMASKED(LOG_MCU, "mcu_byte_received in MCU_KBD_SEND_CODES: TxDummy, sending scan code %02x and returning to IDLE state\n", response);
m_mcu_state = MCU_IDLE;
+ m_mcu_key_idx[m_mcu_key_send_idx] = 0;
}
}
else
@@ -190,59 +287,20 @@ void jornada_state::mcu_byte_received(uint16_t data)
m_sa_periphs->ssp_in((uint16_t)response);
}
-void jornada_state::eeprom_cmd_received(uint16_t data)
+void jornada_state::eeprom_select(int state)
{
- bool reset_state = true;
- uint8_t response = 0;
-
- if (m_eeprom_cmd == 0)
- {
- m_eeprom_cmd = (uint8_t)data;
- if (m_eeprom_cmd == 3)
- reset_state = false;
- }
- else if (m_eeprom_count == 0)
- {
- if (m_eeprom_cmd == 3)
- {
- m_eeprom_count = (uint8_t)data;
- m_eeprom_read_idx = 0;
- reset_state = false;
- }
- }
- else if (m_eeprom_read_idx < m_eeprom_count)
- {
- response = m_eeprom_data[m_eeprom_read_idx];
- m_eeprom_read_idx++;
- if (m_eeprom_read_idx < m_eeprom_count)
- reset_state = false;
- }
+ m_nvram->select_w(!state);
+}
+void jornada_state::eeprom_data_received(uint16_t data)
+{
+ const uint8_t response = m_nvram->access((uint8_t)data);
m_companion->ssp_in((uint16_t)response);
-
- if (reset_state)
- {
- m_eeprom_cmd = 0;
- m_eeprom_count = 0;
- m_eeprom_read_idx = 0;
- }
}
INPUT_CHANGED_MEMBER(jornada_state::key_changed)
{
- uint8_t scan_code = 0;
- switch (param)
- {
- case KEY_ON_OFF: scan_code = 0x7f; break;
- case KEY_S: scan_code = 0x32; break;
- case KEY_K: scan_code = 0x38; break;
- case KEY_1: scan_code = 0x11; break;
- case KEY_2: scan_code = 0x12; break;
- case KEY_3: scan_code = 0x13; break;
- case KEY_4: scan_code = 0x14; break;
- case KEY_9: scan_code = 0x19; break;
- default: return;
- }
+ uint8_t scan_code = (uint8_t)param;
m_sa_periphs->gpio_in<0>(1);
m_sa_periphs->gpio_in<0>(0);
@@ -255,16 +313,72 @@ INPUT_CHANGED_MEMBER(jornada_state::key_changed)
}
}
+INPUT_CHANGED_MEMBER(jornada_state::pen_changed)
+{
+ switch (param)
+ {
+ case PEN_X:
+ case PEN_Y:
+ if (m_pen_button->read() && m_mcu_state == MCU_IDLE)
+ {
+ mcu_assemble_touch_data();
+ m_sa_periphs->gpio_in<9>(1);
+ m_sa_periphs->gpio_in<9>(0);
+ }
+ break;
+ case PEN_BUTTON:
+ if (newval)
+ {
+ m_sa_periphs->gpio_in<9>(0);
+ mcu_assemble_touch_data();
+ }
+ else
+ {
+ m_sa_periphs->gpio_in<9>(1);
+ }
+ break;
+ }
+}
+
static INPUT_PORTS_START( jornada720 )
PORT_START("KBD0")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("On/Off") PORT_CODE(KEYCODE_HOME) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_ON_OFF)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("S") PORT_CODE(KEYCODE_S) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_S)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_K)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_1)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_2)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("3") PORT_CODE(KEYCODE_1) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_3)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("4") PORT_CODE(KEYCODE_2) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_4)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("9") PORT_CODE(KEYCODE_2) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_9)
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("On/Off") PORT_CODE(KEYCODE_HOME) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_ON_OFF)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_S)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_K)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1") PORT_CODE(KEYCODE_1) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_1)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2") PORT_CODE(KEYCODE_2) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_2)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3") PORT_CODE(KEYCODE_1) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_3)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4") PORT_CODE(KEYCODE_2) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_4)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9") PORT_CODE(KEYCODE_2) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_9)
+
+ PORT_START("KBD1")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_TAB)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_ENTER)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_A)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_N)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_L)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_M)
+ PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_P)
+ PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_C)
+
+ PORT_START("KBD2")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_B)
+ PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Alt") PORT_CODE(KEYCODE_LALT) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_ALT)
+ PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_SPACE)
+ PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Backspace") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_BACKSPACE)
+ PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_LSHIFT)
+ PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_RSHIFT) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, key_changed, jornada_state::KEY_RSHIFT)
+ PORT_BIT(0xc0, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("PENX")
+ PORT_BIT(0x3ff, 590, IPT_LIGHTGUN_X) PORT_NAME("Pen X") PORT_MINMAX(270, 910) PORT_SENSITIVITY(50) PORT_CROSSHAIR(X, 1.0, 0.0, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, pen_changed, jornada_state::PEN_X)
+
+ PORT_START("PENY")
+ PORT_BIT(0x3ff, 500, IPT_LIGHTGUN_Y) PORT_NAME("Pen Y") PORT_MINMAX(180, 820) PORT_SENSITIVITY(50) PORT_CROSSHAIR(Y, 1.0, 0.0, 0) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, pen_changed, jornada_state::PEN_Y)
+
+ PORT_START("PENZ")
+ PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Pen Touch") PORT_CODE(MOUSECODE_BUTTON1) PORT_CHANGED_MEMBER(DEVICE_SELF, jornada_state, pen_changed, jornada_state::PEN_BUTTON)
+ PORT_BIT(0xfe, IP_ACTIVE_HIGH, IPT_UNUSED)
INPUT_PORTS_END
void jornada_state::machine_start()
@@ -273,23 +387,28 @@ void jornada_state::machine_start()
save_item(NAME(m_mcu_key_send_idx));
save_item(NAME(m_mcu_key_codes));
save_item(NAME(m_mcu_key_count));
-
- save_item(NAME(m_eeprom_cmd));
- save_item(NAME(m_eeprom_count));
- save_item(NAME(m_eeprom_read_idx));
+ save_item(NAME(m_mcu_key_idx));
+ save_item(NAME(m_mcu_touch_send_idx));
+ save_item(NAME(m_mcu_touch_data));
+ save_item(NAME(m_mcu_touch_count));
+ save_item(NAME(m_mcu_touch_idx));
}
void jornada_state::machine_reset()
{
m_mcu_state = MCU_IDLE;
+
m_mcu_key_send_idx = 0;
memset(m_mcu_key_codes[0], 0, 8);
memset(m_mcu_key_codes[1], 0, 8);
memset(m_mcu_key_count, 0, 2);
+ memset(m_mcu_key_idx, 0, 2);
- m_eeprom_cmd = 0;
- m_eeprom_count = 0;
- m_eeprom_read_idx = 0;
+ m_mcu_touch_send_idx = 0;
+ memset(m_mcu_touch_data[0], 0, 8);
+ memset(m_mcu_touch_data[1], 0, 8);
+ memset(m_mcu_touch_count, 0, 2);
+ memset(m_mcu_touch_idx, 0, 2);
}
void jornada_state::jornada720(machine_config &config)
@@ -300,13 +419,24 @@ void jornada_state::jornada720(machine_config &config)
SA1110_PERIPHERALS(config, m_sa_periphs, SA1110_CLOCK, m_maincpu);
m_sa_periphs->ssp_out().set(FUNC(jornada_state::mcu_byte_received));
- SA1111(config, m_companion);
- m_companion->ssp_out().set(FUNC(jornada_state::eeprom_cmd_received));
+ SA1111(config, m_companion, 3.6864_MHz_XTAL, m_maincpu);
+ m_companion->set_audio_codec_tag(m_codec);
+ m_companion->pb_out<0>().set(FUNC(jornada_state::eeprom_select));
+ m_companion->ssp_out().set(FUNC(jornada_state::eeprom_data_received));
m_companion->l3_addr_out().set(m_codec, FUNC(uda1344_device::l3_addr_w));
m_companion->l3_data_out().set(m_codec, FUNC(uda1344_device::l3_data_w));
+ m_companion->i2s_out().set(m_codec, FUNC(uda1344_device::i2s_input_w));
+ m_companion->irq_out().set(m_sa_periphs, FUNC(sa1110_periphs_device::gpio_in<1>));
+
+ M95020(config, m_nvram);
UDA1344(config, m_codec);
m_codec->l3_ack_out().set(m_companion, FUNC(sa1111_device::l3wd_in));
+ m_codec->add_route(0, "lspeaker", 0.5);
+ m_codec->add_route(1, "rspeaker", 0.5);
+
+ SPEAKER(config, "lspeaker").front_left();
+ SPEAKER(config, "rspeaker").front_right();
SED1356(config, m_epson);
m_epson->set_screen("screen");
@@ -328,8 +458,8 @@ ROM_START( jorn720 )
ROM_REGION32_LE( 0x2000000, "firmware", ROMREGION_ERASE00 )
ROM_LOAD( "jornada720.bin", 0x0000000, 0x2000000, CRC(5fcd433a) SHA1(f05f7b377b582a7355bf119d74435f0ee6104cca) )
- ROM_REGION( 0x80, "eeprom", ROMREGION_ERASE00 )
- ROM_LOAD( "jorn720_eeprom.bin", 0x00, 0x80, CRC(54ffaaff) SHA1(5b8296782b6dc1c60b80169c071fb157d0681567) BAD_DUMP )
+ ROM_REGION( 0x100, "nvram", ROMREGION_ERASE00 )
+ ROM_LOAD( "jorn720_eeprom.bin", 0x000, 0x100, CRC(9bc1d53a) SHA1(793d6ff355e2e9b3e75574ff80edfa5af2aaeee6) BAD_DUMP )
ROM_END
} // anonymous namespace