summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--io.c112
-rw-r--r--io.h5
-rwxr-xr-xrender_sdl.c33
-rw-r--r--stateview.c4
4 files changed, 140 insertions, 14 deletions
diff --git a/io.c b/io.c
index 0e562a1..80472b2 100644
--- a/io.c
+++ b/io.c
@@ -258,18 +258,18 @@ void handle_binding_down(keybinding * binding)
void store_key_event(uint16_t code)
{
- if (keyboard_port) {
- keyboard_port->device.keyboard.write_pos = (keyboard_port->device.keyboard.write_pos + 1) & 7;
- if (keyboard_port->device.keyboard.write_pos == keyboard_port->device.keyboard.read_pos) {
- //we've wrapped around to the read position, drop this event
- keyboard_port->device.keyboard.write_pos = (keyboard_port->device.keyboard.write_pos - 1) & 7;
- return;
- }
+ if (keyboard_port && keyboard_port->device.keyboard.write_pos != keyboard_port->device.keyboard.read_pos) {
+ //there's room in the buffer, record this event
keyboard_port->device.keyboard.events[keyboard_port->device.keyboard.write_pos] = code;
+ if (keyboard_port->device.keyboard.read_pos == 0xFF) {
+ //ring buffer was empty, update read_pos to indicate there is now data
+ keyboard_port->device.keyboard.read_pos = keyboard_port->device.keyboard.write_pos;
+ }
+ keyboard_port->device.keyboard.write_pos = (keyboard_port->device.keyboard.write_pos + 1) & 7;
}
}
-void handle_keydown(int keycode, char scancode)
+void handle_keydown(int keycode, uint8_t scancode)
{
int bucket = keycode >> 15 & 0xFFFF;
if (!bindings[bucket]) {
@@ -404,7 +404,7 @@ void handle_binding_up(keybinding * binding)
}
}
-void handle_keyup(int keycode, char scancode)
+void handle_keyup(int keycode, uint8_t scancode)
{
int bucket = keycode >> 15 & 0xFFFF;
if (!bindings[bucket]) {
@@ -681,6 +681,10 @@ void process_device(char * device_type, io_port * port)
port->device.mouse.latched_y = 0;
port->device.mouse.ready_cycle = CYCLE_NEVER;
port->device.mouse.tr_counter = 0;
+ } else if(!strcmp(device_type, "saturn keyboard")) {
+ port->device_type = IO_SATURN_KEYBOARD;
+ port->device.keyboard.read_pos = 0xFF;
+ port->device.keyboard.write_pos = 0;
} else if(!strcmp(device_type, "sega_parallel")) {
port->device_type = IO_SEGA_PARALLEL;
port->device.stream.data_fd = -1;
@@ -1281,6 +1285,24 @@ void io_data_write(io_port * port, uint8_t value, uint32_t current_cycle)
}
}
break;
+ case IO_SATURN_KEYBOARD:
+ if (output & TH) {
+ //request is over
+ if (port->device.keyboard.tr_counter >= 10 && port->device.keyboard.read_pos != 0xFF) {
+ //remove scan code from buffer
+ port->device.keyboard.read_pos++;
+ port->device.keyboard.read_pos &= 7;
+ if (port->device.keyboard.read_pos == port->device.keyboard.write_pos) {
+ port->device.keyboard.read_pos = 0xFF;
+ }
+ }
+ port->device.keyboard.tr_counter = 0;
+ } else {
+ if ((output & TR) != (old_output & TR)) {
+ port->device.keyboard.tr_counter++;
+ }
+ }
+ break;
#ifndef _WIN32
case IO_GENERIC:
wait_for_connection(port);
@@ -1397,6 +1419,78 @@ uint8_t io_data_read(io_port * port, uint32_t current_cycle)
}
break;
}
+ case IO_SATURN_KEYBOARD:
+ {
+ if (th) {
+ input = 0x11;
+ } else {
+ uint8_t tr = output & TR;
+ uint16_t code = port->device.keyboard.read_pos == 0xFF ? 0
+ : port->device.keyboard.events[port->device.keyboard.read_pos];
+ switch (port->device.keyboard.tr_counter)
+ {
+ case 0:
+ input = 1;
+ break;
+ case 1:
+ //Saturn peripheral ID
+ input = 3;
+ break;
+ case 2:
+ //data size
+ input = 4;
+ break;
+ case 3:
+ //d-pad
+ //TODO: set these based on keyboard state
+ input = 0xF;
+ break;
+ case 4:
+ //Start ABC
+ //TODO: set these based on keyboard state
+ input = 0xF;
+ break;
+ case 5:
+ //R XYZ
+ //TODO: set these based on keyboard state
+ input = 0xF;
+ break;
+ case 6:
+ //L and KBID
+ //TODO: set L based on keyboard state
+ input = 0x8;
+ break;
+ case 7:
+ //Capslock, Numlock, Scrolllock
+ //TODO: set these based on keyboard state
+ input = 0;
+ break;
+ case 8:
+ input = 6;
+ if (code & 0x100) {
+ //break
+ input |= 1;
+ } else if (code) {
+ input |= 8;
+ }
+ break;
+ case 9:
+ input = code >> 4 & 0xF;
+ break;
+ case 10:
+ input = code & 0xF;
+ break;
+ case 11:
+ input = 0;
+ break;
+ default:
+ input = 1;
+ break;
+ }
+ input |= ((port->device.keyboard.tr_counter & 1) == 0) << 4;
+ }
+ break;
+ }
#ifndef _WIN32
case IO_SEGA_PARALLEL:
if (!th)
diff --git a/io.h b/io.h
index 1fb1564..ead06ba 100644
--- a/io.h
+++ b/io.h
@@ -50,6 +50,7 @@ typedef struct {
uint16_t events[8];
uint8_t read_pos;
uint8_t write_pos;
+ uint8_t tr_counter;
} keyboard;
} device;
uint8_t output;
@@ -82,8 +83,8 @@ void setup_io_devices(tern_node * config, rom_info *rom, genesis_context * gen);
void io_adjust_cycles(io_port * pad, uint32_t current_cycle, uint32_t deduction);
void io_data_write(io_port * pad, uint8_t value, uint32_t current_cycle);
uint8_t io_data_read(io_port * pad, uint32_t current_cycle);
-void handle_keydown(int keycode, char scancode);
-void handle_keyup(int keycode, char scancode);
+void handle_keydown(int keycode, uint8_t scancode);
+void handle_keyup(int keycode, uint8_t scancode);
void handle_joydown(int joystick, int button);
void handle_joyup(int joystick, int button);
void handle_joy_dpad(int joystick, int dpad, uint8_t state);
diff --git a/render_sdl.c b/render_sdl.c
index 7347af3..e27b5e8 100755
--- a/render_sdl.c
+++ b/render_sdl.c
@@ -592,7 +592,38 @@ uint8_t scancode_map[SDL_NUM_SCANCODES] = {
[SDL_SCANCODE_9] = 0x46,
[SDL_SCANCODE_0] = 0x45,
[SDL_SCANCODE_RETURN] = 0x5A,
- [SDL_SCANCODE_SPACE] = 0x29
+ [SDL_SCANCODE_ESCAPE] = 0x76,
+ [SDL_SCANCODE_SPACE] = 0x29,
+ [SDL_SCANCODE_TAB] = 0x0D,
+ [SDL_SCANCODE_BACKSPACE] = 0x66,
+ [SDL_SCANCODE_F1] = 0x05,
+ [SDL_SCANCODE_F2] = 0x06,
+ [SDL_SCANCODE_F3] = 0x04,
+ [SDL_SCANCODE_F4] = 0x0C,
+ [SDL_SCANCODE_F5] = 0x03,
+ [SDL_SCANCODE_F6] = 0x0B,
+ [SDL_SCANCODE_F7] = 0x83,
+ [SDL_SCANCODE_F8] = 0x0A,
+ [SDL_SCANCODE_F9] = 0x01,
+ [SDL_SCANCODE_F10] = 0x09,
+ [SDL_SCANCODE_F11] = 0x78,
+ [SDL_SCANCODE_F12] = 0x07,
+ [SDL_SCANCODE_LCTRL] = 0x14,
+ [SDL_SCANCODE_LSHIFT] = 0x12,
+ [SDL_SCANCODE_LALT] = 0x11,
+ [SDL_SCANCODE_RSHIFT] = 0x59,
+ [SDL_SCANCODE_INSERT] = 0x81,
+ [SDL_SCANCODE_PAUSE] = 0x82,
+ [SDL_SCANCODE_PRINTSCREEN] = 0x84,
+ [SDL_SCANCODE_DELETE] = 0x85,
+ [SDL_SCANCODE_LEFT] = 0x86,
+ [SDL_SCANCODE_HOME] = 0x87,
+ [SDL_SCANCODE_END] = 0x88,
+ [SDL_SCANCODE_UP] = 0x89,
+ [SDL_SCANCODE_DOWN] = 0x8A,
+ [SDL_SCANCODE_PAGEUP] = 0x8B,
+ [SDL_SCANCODE_PAGEDOWN] = 0x8C,
+ [SDL_SCANCODE_RIGHT] = 0x8D
};
int32_t handle_event(SDL_Event *event)
diff --git a/stateview.c b/stateview.c
index 51d736d..08e8be3 100644
--- a/stateview.c
+++ b/stateview.c
@@ -50,11 +50,11 @@ void ym_address_write_part2(ym2612_context * context, uint8_t address)
{
}
-void handle_keydown(int keycode)
+void handle_keydown(int keycode, uint8_t scancode)
{
}
-void handle_keyup(int keycode)
+void handle_keyup(int keycode, uint8_t scancode)
{
}