diff options
Diffstat (limited to 'src/mame/machine/dc-ctrl.cpp')
-rw-r--r-- | src/mame/machine/dc-ctrl.cpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/mame/machine/dc-ctrl.cpp b/src/mame/machine/dc-ctrl.cpp index a24a84cfd6a..56a14ca3b4f 100644 --- a/src/mame/machine/dc-ctrl.cpp +++ b/src/mame/machine/dc-ctrl.cpp @@ -3,6 +3,12 @@ #include "emu.h" #include "dc-ctrl.h" +/******************************* + * + * Dreamcast Controller + * + ******************************/ + DEFINE_DEVICE_TYPE(DC_CONTROLLER, dc_controller_device, "dcctrl", "Dreamcast Controller") dc_controller_device::dc_controller_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : @@ -48,6 +54,7 @@ void dc_controller_device::maple_w(const uint32_t *data, uint32_t in_size) void dc_controller_device::fixed_status(uint32_t *dest) { + // TODO: is this right? should be 0x01000000 dest[0] = 0x20000000; // Controller dest[1] = ((port[2] != nullptr) ? 0x010000 : 0) | @@ -73,6 +80,7 @@ void dc_controller_device::free_status(uint32_t *dest) void dc_controller_device::read(uint32_t *dest) { + // TODO: is this right? should be 0x01000000 dest[0] = 0x21000000; // Controller dest[1] = (port[0] ? port[0]->read() : 0xff) | @@ -95,3 +103,97 @@ void dc_controller_device::device_start() port[i] = ioport(port_tag[i]); } } + +/******************************* + * + * Dreamcast Keyboard + * + ******************************/ + +DEFINE_DEVICE_TYPE(DC_KEYBOARD, dc_keyboard_device, "dckb", "Dreamcast Keyboard") + +dc_keyboard_device::dc_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + maple_device(mconfig, DC_KEYBOARD, tag, owner, clock) +{ + memset(port_tag, 0, sizeof(port_tag)); + + id = "92key Keyboard for JPN"; + license = "Produced By or Under License From SEGA ENTERPRISES,LTD."; + versions = "Version 1.000,1998/06/12,315-6215-AD ,Key Scan Module: The 1st Edition. 05/20"; +} + +void dc_keyboard_device::maple_w(const uint32_t *data, uint32_t in_size) +{ + switch(data[0] & 0xff) { + case 0x01: // Device request + reply_start(5, 0x20, 29); + fixed_status(reply_buffer+1); + reply_ready_with_delay(); + break; + + case 0x02: // All status request + reply_start(6, 0x20, 49); + fixed_status(reply_buffer+1); + free_status(reply_buffer+29); + reply_ready_with_delay(); + break; + + case 0x03: // reset - we're stateless where it matters + reply_start(7, 0x20, 0); + reply_ready_with_delay(); + break; + + case 0x09: // get condition + if(1 || (in_size >= 2 && data[1] == 0x01000000)) { + reply_start(8, 0x20, 4); + read(reply_buffer+1); + reply_ready_with_delay(); + } + break; + } +} + +void dc_keyboard_device::fixed_status(uint32_t *dest) +{ + // 00000040 00102000 0800000000000000000 + dest[0] = 0x40000000; // Keyboard + dest[1] = 0x00201000; // 1st function + dest[2] = 0x00000008; // No 2nd function + dest[3] = 0x00000000; // No 3rd function + dest[4] = 0x00000002; // Japan region + copy_with_spaces(((uint8_t *)dest) + 18, id, 30); + copy_with_spaces(((uint8_t *)dest) + 48, license, 60); + dest[27] = 0x0190015e; // standby 35mA, max 40mA +} + +void dc_keyboard_device::free_status(uint32_t *dest) +{ + copy_with_spaces((uint8_t *)dest, versions, 80); +} + +void dc_keyboard_device::read(uint32_t *dest) +{ + dest[0] = 0x40000000; // Keyboard + // key code + dest[1] = + (port[0] ? port[0]->read() : 0) | + ((port[1] ? port[1]->read() : 0) << 8) | + ((port[2] ? port[2]->read() : 0) << 16) | + ((port[3] ? port[3]->read() : 0) << 24); + dest[2] = + (port[4] ? port[4]->read() : 0) | + ((port[5] ? port[5]->read() : 0) << 8) | + ((port[6] ? port[6]->read() : 0) << 16) | + ((port[7] ? port[7]->read() : 0) << 24); +} + +void dc_keyboard_device::device_start() +{ + maple_device::device_start(); + + for (int i = 0; i < 8; i++) + { + port[i] = ioport(port_tag[i]); + } +} + |