annotate io.c @ 2496:187bc857a76a default tip

Fix bug in MED mapper protection bit implementation
author Michael Pavone <pavone@retrodev.com>
date Sun, 28 Apr 2024 23:33:11 -0700
parents 1978bd770023
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
467
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 451
diff changeset
1 /*
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 451
diff changeset
2 Copyright 2013 Michael Pavone
483
3e1573fa22cf Implement turbo/slow motion feature that overclocks or underclocks the entire system at the push of a button
Mike Pavone <pavone@retrodev.com>
parents: 467
diff changeset
3 This file is part of BlastEm.
467
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 451
diff changeset
4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text.
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 451
diff changeset
5 */
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 722
diff changeset
6 #ifndef _WIN32
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
7 #include <unistd.h>
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
8 #include <fcntl.h>
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
9 #include <sys/socket.h>
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
10 #include <sys/un.h>
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
11 #include <sys/types.h>
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
12 #include <sys/stat.h>
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
13 #include <errno.h>
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 722
diff changeset
14 #endif
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
15 #include <string.h>
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 722
diff changeset
16 #include <stdlib.h>
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
17
1427
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
18 #include "serialize.h"
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
19 #include "io.h"
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
20 #include "blastem.h"
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
21 #include "render.h"
903
0e5f9d6135be Make nexus player remote useable as a controller for games that only require a dpad + start + c. Use warning() instead of fprintf(stder,...) in io.c
Michael Pavone <pavone@retrodev.com>
parents: 897
diff changeset
22 #include "util.h"
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
23 #include "bindings.h"
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
24
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
25 #define CYCLE_NEVER 0xFFFFFFFF
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1035
diff changeset
26 #define MIN_POLL_INTERVAL 6840
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
27
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
28 const char * device_type_names[] = {
1650
d6c403135e64 Re-order IO device type enum so "None" is selected when no device is specified for a port
Michael Pavone <pavone@retrodev.com>
parents: 1610
diff changeset
29 "None",
1146
3e24de8d8073 Add support for SMS controllers
Michael Pavone <pavone@retrodev.com>
parents: 1144
diff changeset
30 "SMS gamepad",
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
31 "3-button gamepad",
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
32 "6-button gamepad",
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
33 "Mega Mouse",
1026
7267bc1ab547 Fix bug in 68K movep.l when the destination is a register mapped to a host register
Michael Pavone <pavone@retrodev.com>
parents: 1005
diff changeset
34 "Saturn Keyboard",
1232
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
35 "XBAND Keyboard",
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
36 "Menacer",
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
37 "Justifier",
2235
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
38 "Sega Multi-tap",
2238
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
39 "EA 4-way Play",
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
40 "EA 4-way Play",
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
41 "Sega Parallel Transfer Board",
2025
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
42 "Generic Device",
2027
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
43 "Generic Serial",
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
44 "Heartbeat Personal Trainer"
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
45 };
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
46
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
47 #define GAMEPAD_TH0 0
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
48 #define GAMEPAD_TH1 1
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
49 #define GAMEPAD_EXTRA 2
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
50 #define GAMEPAD_NONE 0xF
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
51
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
52 #define IO_TH0 0
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
53 #define IO_TH1 1
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
54 #define IO_STATE 2
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
55
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
56 enum {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
57 IO_WRITE_PENDING,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
58 IO_WRITTEN,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
59 IO_READ_PENDING,
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
60 IO_READ
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
61 };
1207
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1202
diff changeset
62
2027
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
63 enum {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
64 HBPT_NEED_INIT,
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
65 HBPT_IDLE,
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
66 HBPT_CMD_PAYLOAD,
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
67 HBPT_REPLY
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
68 };
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
69
2238
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
70 #define EA_PASSTHRU_MODE 0xFF
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
71
1207
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1202
diff changeset
72 typedef struct {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
73 uint8_t states[2], value;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
74 } gp_button_def;
937
9364dad5561a Added reasonable handling of joystick hotplug
Michael Pavone <pavone@retrodev.com>
parents: 916
diff changeset
75
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
76
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
77 static gp_button_def button_defs[NUM_GAMEPAD_BUTTONS] = {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
78 [DPAD_UP] = {.states = {GAMEPAD_TH0, GAMEPAD_TH1}, .value = 0x1},
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
79 [DPAD_DOWN] = {.states = {GAMEPAD_TH0, GAMEPAD_TH1}, .value = 0x2},
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
80 [DPAD_LEFT] = {.states = {GAMEPAD_TH1, GAMEPAD_NONE}, .value = 0x4},
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
81 [DPAD_RIGHT] = {.states = {GAMEPAD_TH1, GAMEPAD_NONE}, .value = 0x8},
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
82 [BUTTON_A] = {.states = {GAMEPAD_TH0, GAMEPAD_NONE}, .value = 0x10},
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
83 [BUTTON_B] = {.states = {GAMEPAD_TH1, GAMEPAD_NONE}, .value = 0x10},
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
84 [BUTTON_C] = {.states = {GAMEPAD_TH1, GAMEPAD_NONE}, .value = 0x20},
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
85 [BUTTON_START] = {.states = {GAMEPAD_TH0, GAMEPAD_NONE}, .value = 0x20},
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
86 [BUTTON_X] = {.states = {GAMEPAD_EXTRA, GAMEPAD_NONE}, .value = 0x4},
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
87 [BUTTON_Y] = {.states = {GAMEPAD_EXTRA, GAMEPAD_NONE}, .value = 0x2},
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
88 [BUTTON_Z] = {.states = {GAMEPAD_EXTRA, GAMEPAD_NONE}, .value = 0x1},
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
89 [BUTTON_MODE] = {.states = {GAMEPAD_EXTRA, GAMEPAD_NONE}, .value = 0x8},
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
90 };
937
9364dad5561a Added reasonable handling of joystick hotplug
Michael Pavone <pavone@retrodev.com>
parents: 916
diff changeset
91
2422
1978bd770023 Expose gamepad state in debugger
Michael Pavone <pavone@retrodev.com>
parents: 2238
diff changeset
92 io_port *find_gamepad(sega_io *io, uint8_t gamepad_num)
1207
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1202
diff changeset
93 {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
94 for (int i = 0; i < 3; i++)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
95 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
96 io_port *port = io->ports + i;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
97 if (port->device_type < IO_MOUSE && port->device.pad.gamepad_num == gamepad_num) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
98 return port;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
99 }
2027
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
100 if (port->device_type == IO_HEARTBEAT_TRAINER && port->device.heartbeat_trainer.device_num == gamepad_num) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
101 return port;
2235
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
102 }
2238
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
103 if (port->device_type == IO_SEGA_MULTI || port->device_type == IO_EA_MULTI_A) {
2235
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
104 for (int j = 0; j < 4; j++)
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
105 {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
106 io_port *tap_port = port->device.multitap.ports + j;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
107 if (tap_port->device_type < IO_MOUSE && tap_port->device.pad.gamepad_num == gamepad_num) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
108 return tap_port;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
109 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
110 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
111 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
112 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
113 return NULL;
1207
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1202
diff changeset
114 }
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1202
diff changeset
115
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
116 static io_port *find_mouse(sega_io *io, uint8_t mouse_num)
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
117 {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
118 for (int i = 0; i < 3; i++)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
119 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
120 io_port *port = io->ports + i;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
121 if (port->device_type == IO_MOUSE && port->device.mouse.mouse_num == mouse_num) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
122 return port;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
123 }
2238
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
124 if (port->device_type == IO_SEGA_MULTI) {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
125 for (int j = 0; j < 4; j++)
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
126 {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
127 io_port *tap_port = port->device.multitap.ports + j;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
128 if (tap_port->device_type == IO_MOUSE && tap_port->device.mouse.mouse_num == mouse_num) {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
129 return tap_port;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
130 }
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
131 }
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
132 }
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
133 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
134 return NULL;
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
135 }
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
136
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
137 static io_port *find_keyboard(sega_io *io)
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
138 {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
139 for (int i = 0; i < 3; i++)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
140 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
141 io_port *port = io->ports + i;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
142 if (port->device_type == IO_SATURN_KEYBOARD || port->device_type == IO_XBAND_KEYBOARD) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
143 return port;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
144 }
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
145 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
146 return NULL;
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
147 }
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
148
1610
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
149 void io_port_gamepad_down(io_port *port, uint8_t button)
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
150 {
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
151 gp_button_def *def = button_defs + button;
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
152 port->input[def->states[0]] |= def->value;
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
153 if (def->states[1] != GAMEPAD_NONE) {
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
154 port->input[def->states[1]] |= def->value;
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
155 }
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
156 }
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
157
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
158 void io_port_gamepad_up(io_port *port, uint8_t button)
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
159 {
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
160 gp_button_def *def = button_defs + button;
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
161 port->input[def->states[0]] &= ~def->value;
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
162 if (def->states[1] != GAMEPAD_NONE) {
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
163 port->input[def->states[1]] &= ~def->value;
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
164 }
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
165 }
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
166
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
167 void io_gamepad_down(sega_io *io, uint8_t gamepad_num, uint8_t button)
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
168 {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
169 io_port *port = find_gamepad(io, gamepad_num);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
170 if (port) {
1610
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
171 io_port_gamepad_down(port, button);
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
172 }
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
173 }
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
174
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
175 void io_gamepad_up(sega_io *io, uint8_t gamepad_num, uint8_t button)
1194
1ad0ec7e3939 Make gamepad "semantic" mapping play nice with hotplug support
Michael Pavone <pavone@retrodev.com>
parents: 1187
diff changeset
176 {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
177 io_port *port = find_gamepad(io, gamepad_num);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
178 if (port) {
1610
c206a422d466 Added J-Cart support
Michael Pavone <pavone@retrodev.com>
parents: 1595
diff changeset
179 io_port_gamepad_up(port, button);
1207
9d6f155732ed Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents: 1202
diff changeset
180 }
1194
1ad0ec7e3939 Make gamepad "semantic" mapping play nice with hotplug support
Michael Pavone <pavone@retrodev.com>
parents: 1187
diff changeset
181 }
1ad0ec7e3939 Make gamepad "semantic" mapping play nice with hotplug support
Michael Pavone <pavone@retrodev.com>
parents: 1187
diff changeset
182
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
183 void io_mouse_down(sega_io *io, uint8_t mouse_num, uint8_t button)
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
184 {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
185 io_port *port = find_mouse(io, mouse_num);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
186 if (port) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
187 port->input[0] |= button;
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
188 }
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
189 }
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
190
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
191 void io_mouse_up(sega_io *io, uint8_t mouse_num, uint8_t button)
493
36c080ece4ed Add support for UI bindings on gamepad buttons and dpads
Mike Pavone <pavone@retrodev.com>
parents: 483
diff changeset
192 {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
193 io_port *port = find_mouse(io, mouse_num);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
194 if (port) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
195 port->input[0] &= ~button;
907
b5d35222047e Mega mouse support is mostly done
Michael Pavone <pavone@retrodev.com>
parents: 903
diff changeset
196 }
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
197 }
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
198
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
199 void io_mouse_motion_absolute(sega_io *io, uint8_t mouse_num, uint16_t x, uint16_t y)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
200 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
201 io_port *port = find_mouse(io, mouse_num);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
202 if (port) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
203 port->device.mouse.cur_x = x;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
204 port->device.mouse.cur_y = y;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
205 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
206 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
207
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
208 void io_mouse_motion_relative(sega_io *io, uint8_t mouse_num, int32_t x, int32_t y)
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
209 {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
210 io_port *port = find_mouse(io, mouse_num);
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
211 if (port) {
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
212 port->device.mouse.cur_x += x;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
213 port->device.mouse.cur_y += y;
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
214 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
215 }
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
216
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
217 void store_key_event(io_port *keyboard_port, uint16_t code)
1026
7267bc1ab547 Fix bug in 68K movep.l when the destination is a register mapped to a host register
Michael Pavone <pavone@retrodev.com>
parents: 1005
diff changeset
218 {
1028
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
219 if (keyboard_port && keyboard_port->device.keyboard.write_pos != keyboard_port->device.keyboard.read_pos) {
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
220 //there's room in the buffer, record this event
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
221 keyboard_port->device.keyboard.events[keyboard_port->device.keyboard.write_pos] = code;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
222 if (keyboard_port->device.keyboard.read_pos == 0xFF) {
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
223 //ring buffer was empty, update read_pos to indicate there is now data
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
224 keyboard_port->device.keyboard.read_pos = keyboard_port->device.keyboard.write_pos;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
225 }
1026
7267bc1ab547 Fix bug in 68K movep.l when the destination is a register mapped to a host register
Michael Pavone <pavone@retrodev.com>
parents: 1005
diff changeset
226 keyboard_port->device.keyboard.write_pos = (keyboard_port->device.keyboard.write_pos + 1) & 7;
7267bc1ab547 Fix bug in 68K movep.l when the destination is a register mapped to a host register
Michael Pavone <pavone@retrodev.com>
parents: 1005
diff changeset
227 }
7267bc1ab547 Fix bug in 68K movep.l when the destination is a register mapped to a host register
Michael Pavone <pavone@retrodev.com>
parents: 1005
diff changeset
228 }
7267bc1ab547 Fix bug in 68K movep.l when the destination is a register mapped to a host register
Michael Pavone <pavone@retrodev.com>
parents: 1005
diff changeset
229
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
230 void io_keyboard_down(sega_io *io, uint8_t scancode)
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
231 {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
232 store_key_event(find_keyboard(io), scancode);
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
233 }
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
234
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
235 void io_keyboard_up(sega_io *io, uint8_t scancode)
432
18cde14e8c10 Read joystick bindings from config file
Mike Pavone <pavone@retrodev.com>
parents: 431
diff changeset
236 {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
237 store_key_event(find_keyboard(io), 0xF000 | scancode);
1576
2b132d894d76 Release capture of mouse and keyboard when entering UI
Michael Pavone <pavone@retrodev.com>
parents: 1549
diff changeset
238 }
2b132d894d76 Release capture of mouse and keyboard when entering UI
Michael Pavone <pavone@retrodev.com>
parents: 1549
diff changeset
239
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
240 uint8_t io_has_keyboard(sega_io *io)
431
440efd7d27a9 Read key bindings from config file
Mike Pavone <pavone@retrodev.com>
parents: 421
diff changeset
241 {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
242 return find_keyboard(io) != NULL;
431
440efd7d27a9 Read key bindings from config file
Mike Pavone <pavone@retrodev.com>
parents: 421
diff changeset
243 }
440efd7d27a9 Read key bindings from config file
Mike Pavone <pavone@retrodev.com>
parents: 421
diff changeset
244
2025
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
245 static void set_serial_clock(io_port *port)
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
246 {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
247 switch(port->serial_ctrl >> 6)
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
248 {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
249 case 0: port->serial_divider = 11186; break; //4800 bps
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
250 case 1: port->serial_divider = 22372; break; //2400 bps
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
251 case 2: port->serial_divider = 44744; break; //1200 bps
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
252 case 3: port->serial_divider = 178976; break; //300 bps
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
253 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
254 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
255
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
256 void process_device(char * device_type, io_port * port)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
257 {
2025
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
258 set_serial_clock(port);
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
259 //assuming that the io_port struct has been zeroed if this is the first time this has been called
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
260 if (!device_type)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
261 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
262 return;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
263 }
2235
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
264 io_port *old_ports = NULL;
2238
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
265 if (port->device_type == IO_SEGA_MULTI || port->device_type == IO_EA_MULTI_A) {
2235
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
266 old_ports = port->device.multitap.ports;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
267 }
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
268
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
269 const int gamepad_len = strlen("gamepad");
1783
eda8df5bc74c Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
270 if (startswith(device_type, "gamepad"))
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
271 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
272 if (
1146
3e24de8d8073 Add support for SMS controllers
Michael Pavone <pavone@retrodev.com>
parents: 1144
diff changeset
273 (device_type[gamepad_len] != '3' && device_type[gamepad_len] != '6' && device_type[gamepad_len] != '2')
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
274 || device_type[gamepad_len+1] != '.' || device_type[gamepad_len+2] < '1'
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
275 || device_type[gamepad_len+2] > '8' || device_type[gamepad_len+3] != 0
1146
3e24de8d8073 Add support for SMS controllers
Michael Pavone <pavone@retrodev.com>
parents: 1144
diff changeset
276 ) {
903
0e5f9d6135be Make nexus player remote useable as a controller for games that only require a dpad + start + c. Use warning() instead of fprintf(stder,...) in io.c
Michael Pavone <pavone@retrodev.com>
parents: 897
diff changeset
277 warning("%s is not a valid gamepad type\n", device_type);
1146
3e24de8d8073 Add support for SMS controllers
Michael Pavone <pavone@retrodev.com>
parents: 1144
diff changeset
278 } else if (device_type[gamepad_len] == '3') {
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
279 port->device_type = IO_GAMEPAD3;
1146
3e24de8d8073 Add support for SMS controllers
Michael Pavone <pavone@retrodev.com>
parents: 1144
diff changeset
280 } else if (device_type[gamepad_len] == '2') {
3e24de8d8073 Add support for SMS controllers
Michael Pavone <pavone@retrodev.com>
parents: 1144
diff changeset
281 port->device_type = IO_GAMEPAD2;
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
282 } else {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
283 port->device_type = IO_GAMEPAD6;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
284 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
285 port->device.pad.gamepad_num = device_type[gamepad_len+2] - '0';
2027
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
286 } else if(startswith(device_type, "heartbeat_trainer.")) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
287 port->device_type = IO_HEARTBEAT_TRAINER;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
288 port->device.heartbeat_trainer.nv_memory = NULL;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
289 port->device.heartbeat_trainer.device_num = device_type[strlen("heartbeat_trainer.")] - '0';
1783
eda8df5bc74c Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
290 } else if(startswith(device_type, "mouse")) {
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
291 if (port->device_type != IO_MOUSE) {
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
292 port->device_type = IO_MOUSE;
1783
eda8df5bc74c Minor cleanup
Michael Pavone <pavone@retrodev.com>
parents: 1689
diff changeset
293 port->device.mouse.mouse_num = device_type[strlen("mouse")+1] - '0';
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
294 port->device.mouse.last_read_x = 0;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
295 port->device.mouse.last_read_y = 0;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
296 port->device.mouse.cur_x = 0;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
297 port->device.mouse.cur_y = 0;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
298 port->device.mouse.latched_x = 0;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
299 port->device.mouse.latched_y = 0;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
300 port->device.mouse.ready_cycle = CYCLE_NEVER;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
301 port->device.mouse.tr_counter = 0;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
302 }
1028
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
303 } else if(!strcmp(device_type, "saturn keyboard")) {
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
304 if (port->device_type != IO_SATURN_KEYBOARD) {
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
305 port->device_type = IO_SATURN_KEYBOARD;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
306 port->device.keyboard.read_pos = 0xFF;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
307 port->device.keyboard.write_pos = 0;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
308 }
1232
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
309 } else if(!strcmp(device_type, "xband keyboard")) {
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
310 if (port->device_type != IO_XBAND_KEYBOARD) {
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
311 port->device_type = IO_XBAND_KEYBOARD;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
312 port->device.keyboard.read_pos = 0xFF;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
313 port->device.keyboard.write_pos = 0;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
314 }
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
315 } else if(!strcmp(device_type, "sega_parallel")) {
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
316 if (port->device_type != IO_SEGA_PARALLEL) {
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
317 port->device_type = IO_SEGA_PARALLEL;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
318 port->device.stream.data_fd = -1;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
319 port->device.stream.listen_fd = -1;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
320 }
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
321 } else if(!strcmp(device_type, "generic")) {
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
322 if (port->device_type != IO_GENERIC) {
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
323 port->device_type = IO_GENERIC;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
324 port->device.stream.data_fd = -1;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
325 port->device.stream.listen_fd = -1;
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
326 }
2025
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
327 } else if(!strcmp(device_type, "serial")) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
328 if (port->device_type != IO_GENERIC_SERIAL) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
329 port->device_type = IO_GENERIC_SERIAL;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
330 port->device.stream.data_fd = -1;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
331 port->device.stream.listen_fd = -1;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
332 }
2235
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
333 } else if(startswith(device_type, "sega_multitap.")) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
334 if (port->device_type != IO_SEGA_MULTI) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
335 port->device_type = IO_SEGA_MULTI;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
336 port->device.multitap.ports = old_ports ? old_ports : calloc(4, sizeof(io_port));
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
337 port->device.multitap.tap_num = device_type[strlen("sega_multitap.")] - '0';
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
338 if (!old_ports) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
339 port->device.multitap.tr_counter = 0;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
340 port->device.multitap.ready_cycle = CYCLE_NEVER;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
341 port->input[0] = 0x13;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
342 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
343 old_ports = NULL;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
344 }
2238
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
345 } else if(!strcmp(device_type, "ea_multitap_port_a")) {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
346 if (port->device_type != IO_EA_MULTI_A) {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
347 port->device_type = IO_EA_MULTI_A;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
348 port->device.multitap.ports = old_ports ? old_ports : calloc(4, sizeof(io_port));
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
349 port->device.multitap.tap_num = 1;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
350 port->device.multitap.cur_port = EA_PASSTHRU_MODE;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
351 old_ports = NULL;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
352 }
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
353 } else if(!strcmp(device_type, "ea_multitap_port_b")) {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
354 port->device_type = IO_EA_MULTI_B;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
355 port->device.multitap.ports = NULL;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
356 port->device.multitap.tap_num = 1;
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
357 }
2235
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
358 free(old_ports);
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
359 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
360
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
361 char * io_name(int i)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
362 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
363 switch (i)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
364 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
365 case 0:
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
366 return "1";
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
367 case 1:
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
368 return "2";
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
369 case 2:
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
370 return "EXT";
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
371 default:
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
372 return "invalid";
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
373 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
374 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
375
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
376 static char * sockfile_name;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
377 static void cleanup_sockfile()
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
378 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
379 unlink(sockfile_name);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
380 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
381
1116
fe8c79f82c22 More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
382 void setup_io_devices(tern_node * config, rom_info *rom, sega_io *io)
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
383 {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
384 io_port * ports = io->ports;
1326
071e761bcdcf Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents: 1294
diff changeset
385 tern_node *io_nodes = tern_find_path(config, "io\0devices\0", TVAL_NODE).ptrval;
1689
7f42a93f18a4 Have a suitable default IO port configuration when nonIO is present from the config file. Fixed off by one in processing gamepad button events in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1650
diff changeset
386 char * io_1 = rom->port1_override ? rom->port1_override : tern_find_ptr_default(io_nodes, "1", "gamepad6.1");
7f42a93f18a4 Have a suitable default IO port configuration when nonIO is present from the config file. Fixed off by one in processing gamepad button events in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1650
diff changeset
387 char * io_2 = rom->port2_override ? rom->port2_override : tern_find_ptr_default(io_nodes, "2", "gamepad6.2");
7f42a93f18a4 Have a suitable default IO port configuration when nonIO is present from the config file. Fixed off by one in processing gamepad button events in libretro build
Mike Pavone <pavone@retrodev.com>
parents: 1650
diff changeset
388 char * io_ext = rom->ext_override ? rom->ext_override : tern_find_ptr(io_nodes, "ext");
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
389
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
390 process_device(io_1, ports);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
391 process_device(io_2, ports+1);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
392 process_device(io_ext, ports+2);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
393
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
394 uint8_t mouse_mode;
1396
aca496957999 Only capture mouse if an emulated mouse is attached
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
395 if (ports[0].device_type == IO_MOUSE || ports[1].device_type == IO_MOUSE || ports[2].device_type == IO_MOUSE) {
aca496957999 Only capture mouse if an emulated mouse is attached
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
396 if (render_fullscreen()) {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
397 mouse_mode = MOUSE_RELATIVE;
1396
aca496957999 Only capture mouse if an emulated mouse is attached
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
398 } else {
aca496957999 Only capture mouse if an emulated mouse is attached
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
399 if (rom->mouse_mode && !strcmp(rom->mouse_mode, "absolute")) {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
400 mouse_mode = MOUSE_ABSOLUTE;
1396
aca496957999 Only capture mouse if an emulated mouse is attached
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
401 } else {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
402 mouse_mode = MOUSE_CAPTURE;
1396
aca496957999 Only capture mouse if an emulated mouse is attached
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
403 }
aca496957999 Only capture mouse if an emulated mouse is attached
Michael Pavone <pavone@retrodev.com>
parents: 1379
diff changeset
404 }
916
20c464dbae8f Finished implementation of mouse capture mode
Michael Pavone <pavone@retrodev.com>
parents: 915
diff changeset
405 } else {
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
406 mouse_mode = MOUSE_NONE;
915
9e882eca717e Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents: 914
diff changeset
407 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
408 bindings_set_mouse_mode(mouse_mode);
915
9e882eca717e Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents: 914
diff changeset
409
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
410 for (int i = 0; i < 3; i++)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
411 {
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 722
diff changeset
412 #ifndef _WIN32
1595
360d5bab199f Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents: 1583
diff changeset
413 if (ports[i].device_type == IO_SEGA_PARALLEL && ports[i].device.stream.data_fd == -1)
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
414 {
1326
071e761bcdcf Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents: 1294
diff changeset
415 char *pipe_name = tern_find_path(config, "io\0parallel_pipe\0", TVAL_PTR).ptrval;
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
416 if (!pipe_name)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
417 {
903
0e5f9d6135be Make nexus player remote useable as a controller for games that only require a dpad + start + c. Use warning() instead of fprintf(stder,...) in io.c
Michael Pavone <pavone@retrodev.com>
parents: 897
diff changeset
418 warning("IO port %s is configured to use the sega parallel board, but no paralell_pipe is set!\n", io_name(i));
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
419 ports[i].device_type = IO_NONE;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
420 } else {
1792
52a47611a273 Avoid printing a bunch of junk to stdout when GDB remote debugging is enabled as this can confuse GDB
Michael Pavone <pavone@retrodev.com>
parents: 1791
diff changeset
421 debug_message("IO port: %s connected to device '%s' with pipe name: %s\n", io_name(i), device_type_names[ports[i].device_type], pipe_name);
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
422 if (!strcmp("stdin", pipe_name))
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
423 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
424 ports[i].device.stream.data_fd = STDIN_FILENO;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
425 } else {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
426 if (mkfifo(pipe_name, 0666) && errno != EEXIST)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
427 {
903
0e5f9d6135be Make nexus player remote useable as a controller for games that only require a dpad + start + c. Use warning() instead of fprintf(stder,...) in io.c
Michael Pavone <pavone@retrodev.com>
parents: 897
diff changeset
428 warning("Failed to create fifo %s for Sega parallel board emulation: %d %s\n", pipe_name, errno, strerror(errno));
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
429 ports[i].device_type = IO_NONE;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
430 } else {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
431 ports[i].device.stream.data_fd = open(pipe_name, O_NONBLOCK | O_RDONLY);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
432 if (ports[i].device.stream.data_fd == -1)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
433 {
903
0e5f9d6135be Make nexus player remote useable as a controller for games that only require a dpad + start + c. Use warning() instead of fprintf(stder,...) in io.c
Michael Pavone <pavone@retrodev.com>
parents: 897
diff changeset
434 warning("Failed to open fifo %s for Sega parallel board emulation: %d %s\n", pipe_name, errno, strerror(errno));
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
435 ports[i].device_type = IO_NONE;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
436 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
437 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
438 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
439 }
2025
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
440 } else if (ports[i].device_type == IO_GENERIC || ports[i].device_type == IO_GENERIC_SERIAL && ports[i].device.stream.data_fd == -1) {
1326
071e761bcdcf Fix a deficiency in the way types were handled in my ternary tree. Fixes in which some paths that were constructed from a template with variables would sometimes get an extra garbage character thrown in
Michael Pavone <pavone@retrodev.com>
parents: 1294
diff changeset
441 char *sock_name = tern_find_path(config, "io\0socket\0", TVAL_PTR).ptrval;
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
442 if (!sock_name)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
443 {
903
0e5f9d6135be Make nexus player remote useable as a controller for games that only require a dpad + start + c. Use warning() instead of fprintf(stder,...) in io.c
Michael Pavone <pavone@retrodev.com>
parents: 897
diff changeset
444 warning("IO port %s is configured to use generic IO, but no socket is set!\n", io_name(i));
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
445 ports[i].device_type = IO_NONE;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
446 } else {
1792
52a47611a273 Avoid printing a bunch of junk to stdout when GDB remote debugging is enabled as this can confuse GDB
Michael Pavone <pavone@retrodev.com>
parents: 1791
diff changeset
447 debug_message("IO port: %s connected to device '%s' with socket name: %s\n", io_name(i), device_type_names[ports[i].device_type], sock_name);
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
448 ports[i].device.stream.data_fd = -1;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
449 ports[i].device.stream.listen_fd = socket(AF_UNIX, SOCK_STREAM, 0);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
450 size_t pathlen = strlen(sock_name);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
451 size_t addrlen = offsetof(struct sockaddr_un, sun_path) + pathlen + 1;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
452 struct sockaddr_un *saddr = malloc(addrlen);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
453 saddr->sun_family = AF_UNIX;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
454 memcpy(saddr->sun_path, sock_name, pathlen+1);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
455 if (bind(ports[i].device.stream.listen_fd, (struct sockaddr *)saddr, addrlen))
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
456 {
903
0e5f9d6135be Make nexus player remote useable as a controller for games that only require a dpad + start + c. Use warning() instead of fprintf(stder,...) in io.c
Michael Pavone <pavone@retrodev.com>
parents: 897
diff changeset
457 warning("Failed to bind socket for IO Port %s to path %s: %d %s\n", io_name(i), sock_name, errno, strerror(errno));
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
458 goto cleanup_sock;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
459 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
460 if (listen(ports[i].device.stream.listen_fd, 1))
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
461 {
903
0e5f9d6135be Make nexus player remote useable as a controller for games that only require a dpad + start + c. Use warning() instead of fprintf(stder,...) in io.c
Michael Pavone <pavone@retrodev.com>
parents: 897
diff changeset
462 warning("Failed to listen on socket for IO Port %s: %d %s\n", io_name(i), errno, strerror(errno));
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
463 goto cleanup_sockfile;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
464 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
465 sockfile_name = sock_name;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
466 atexit(cleanup_sockfile);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
467 continue;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
468 cleanup_sockfile:
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
469 unlink(sock_name);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
470 cleanup_sock:
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
471 close(ports[i].device.stream.listen_fd);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
472 ports[i].device_type = IO_NONE;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
473 }
883
9f149f0e98b7 It is now possible to switch back and forth between the menu ROM and the game
Michael Pavone <pavone@retrodev.com>
parents: 796
diff changeset
474 } else
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 722
diff changeset
475 #endif
1146
3e24de8d8073 Add support for SMS controllers
Michael Pavone <pavone@retrodev.com>
parents: 1144
diff changeset
476 if (ports[i].device_type == IO_GAMEPAD3 || ports[i].device_type == IO_GAMEPAD6 || ports[i].device_type == IO_GAMEPAD2) {
1792
52a47611a273 Avoid printing a bunch of junk to stdout when GDB remote debugging is enabled as this can confuse GDB
Michael Pavone <pavone@retrodev.com>
parents: 1791
diff changeset
477 debug_message("IO port %s connected to gamepad #%d with type '%s'\n", io_name(i), ports[i].device.pad.gamepad_num, device_type_names[ports[i].device_type]);
2027
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
478 } else if (ports[i].device_type == IO_HEARTBEAT_TRAINER) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
479 debug_message("IO port %s connected to Heartbeat Personal Trainer #%d\n", io_name(i), ports[i].device.heartbeat_trainer.device_num);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
480 if (rom->save_type == SAVE_HBPT) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
481 ports[i].device.heartbeat_trainer.nv_memory = rom->save_buffer;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
482 uint32_t page_size = 16;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
483 for (; page_size < 128; page_size *= 2)
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
484 {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
485 if (rom->save_size / page_size < 256) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
486 break;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
487 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
488 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
489 ports[i].device.heartbeat_trainer.nv_page_size = page_size;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
490 uint32_t num_pages = rom->save_size / page_size;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
491 ports[i].device.heartbeat_trainer.nv_pages = num_pages < 256 ? num_pages : 255;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
492 } else {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
493 ports[i].device.heartbeat_trainer.nv_page_size = 16;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
494 ports[i].device.heartbeat_trainer.nv_pages = 32;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
495 size_t bufsize =
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
496 ports[i].device.heartbeat_trainer.nv_page_size * ports[i].device.heartbeat_trainer.nv_pages
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
497 + 5 + 8;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
498 ports[i].device.heartbeat_trainer.nv_memory = malloc(bufsize);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
499 memset(ports[i].device.heartbeat_trainer.nv_memory, 0xFF, bufsize);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
500 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
501 ports[i].device.heartbeat_trainer.state = HBPT_NEED_INIT;
2235
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
502 } else if (ports[i].device_type == IO_SEGA_MULTI) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
503 char path[] = "io\0sega_multitap.1\0";
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
504 path[17] = '0' + ports[i].device.multitap.tap_num;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
505 tern_node *port_defs = tern_find_path(config, path, TVAL_NODE).ptrval;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
506 debug_message("IO port %s connected to Sega multitap %d\n", io_name(i), ports[i].device.multitap.tap_num);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
507 for (int j = 0; j < 4; j++)
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
508 {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
509 char port_num[] = {'1' + j, 0, 0};
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
510 char *dev_type = tern_find_ptr(port_defs, port_num);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
511 process_device(dev_type, ports[i].device.multitap.ports + j);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
512 debug_message("\tTap port %d connected to device '%s'\n", j + 1, device_type_names[ports[i].device.multitap.ports[j].device_type]);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
513 if (ports[i].control & ports[i].output & 0x40) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
514 io_control_write(ports[i].device.multitap.ports + j, 0x40, 0);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
515 io_data_write(ports[i].device.multitap.ports + j, 0x40, 0);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
516 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
517 }
2238
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
518 } else if (ports[i].device_type == IO_EA_MULTI_A) {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
519 char path[] = "io\0ea_multitap\0";
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
520 tern_node *port_defs = tern_find_path(config, path, TVAL_NODE).ptrval;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
521 debug_message("IO port %s connected to EA 4-way Play A-side\n", io_name(i));
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
522 for (int j = 0; j < 4; j++)
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
523 {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
524 char port_num[] = {'1' + j, 0, 0};
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
525 char *dev_type = tern_find_ptr(port_defs, port_num);
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
526 process_device(dev_type, ports[i].device.multitap.ports + j);
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
527 debug_message("\tTap port %d connected to device '%s'\n", j + 1, device_type_names[ports[i].device.multitap.ports[j].device_type]);
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
528 io_control_write(ports[i].device.multitap.ports + j, 0x40, 0);
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
529 io_data_write(ports[i].device.multitap.ports + j, 0, 0);
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
530 }
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
531 } else if (ports[i].device_type == IO_EA_MULTI_B) {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
532 debug_message("IO port %s connected to EA 4-way Play B-side\n", io_name(i));
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
533 for (int j = 0; j < 3; j++)
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
534 {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
535 if (ports[j].device_type == IO_EA_MULTI_A) {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
536 ports[i].device.multitap.ports = ports + j;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
537 break;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
538 }
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
539 }
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
540 } else {
1792
52a47611a273 Avoid printing a bunch of junk to stdout when GDB remote debugging is enabled as this can confuse GDB
Michael Pavone <pavone@retrodev.com>
parents: 1791
diff changeset
541 debug_message("IO port %s connected to device '%s'\n", io_name(i), device_type_names[ports[i].device_type]);
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
542 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
543 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
544 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
545
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
546
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
547 #define TH 0x40
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
548 #define TR 0x20
2235
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
549 #define TL 0x10
694
7497334bb548 Adjust TH timeout value to take into account the move to master clock cycles
Michael Pavone <pavone@retrodev.com>
parents: 645
diff changeset
550 #define TH_TIMEOUT 56000
2235
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
551 #define SLOW_RISE_DEVICE (30*7)
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
552 #define SLOW_RISE_INPUT (12*7)
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
553
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
554 static uint8_t get_output_value(io_port *port, uint32_t current_cycle, uint32_t slow_rise_delay)
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
555 {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
556 uint8_t output = (port->control | 0x80) & port->output;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
557 for (int i = 0; i < 8; i++)
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
558 {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
559 if (!(port->control & 1 << i)) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
560 if (port->slow_rise_start[i] != CYCLE_NEVER) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
561 if (current_cycle - port->slow_rise_start[i] >= slow_rise_delay) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
562 output |= 1 << i;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
563 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
564 } else {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
565 output |= 1 << i;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
566 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
567 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
568 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
569 return output;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
570 }
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
571
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
572 void mouse_check_ready(io_port *port, uint32_t current_cycle)
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
573 {
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
574 if (current_cycle >= port->device.mouse.ready_cycle) {
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
575 port->device.mouse.tr_counter++;
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
576 port->device.mouse.ready_cycle = CYCLE_NEVER;
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
577 if (port->device.mouse.tr_counter == 3) {
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
578 port->device.mouse.latched_x = port->device.mouse.cur_x;
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
579 port->device.mouse.latched_y = port->device.mouse.cur_y;
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
580 /* FIXME mouse mode owned by bindings now
1111
2eb54e24914e Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
581 if (current_io->mouse_mode == MOUSE_ABSOLUTE) {
915
9e882eca717e Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents: 914
diff changeset
582 //avoid overflow in absolute mode
9e882eca717e Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents: 914
diff changeset
583 int deltax = port->device.mouse.latched_x - port->device.mouse.last_read_x;
9e882eca717e Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents: 914
diff changeset
584 if (abs(deltax) > 255) {
9e882eca717e Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents: 914
diff changeset
585 port->device.mouse.latched_x = port->device.mouse.last_read_x + (deltax > 0 ? 255 : -255);
9e882eca717e Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents: 914
diff changeset
586 }
9e882eca717e Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents: 914
diff changeset
587 int deltay = port->device.mouse.latched_y - port->device.mouse.last_read_y;
9e882eca717e Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents: 914
diff changeset
588 if (abs(deltay) > 255) {
9e882eca717e Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents: 914
diff changeset
589 port->device.mouse.latched_y = port->device.mouse.last_read_y + (deltay > 0 ? 255 : -255);
9e882eca717e Initial support for relative mouse mode and skeleton of support for capture mode. Avoid mouse position overflow in absolute mode. Allow absolute mode to be set by ROM DB.
Michael Pavone <pavone@retrodev.com>
parents: 914
diff changeset
590 }
1583
430dd12e4010 Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents: 1576
diff changeset
591 }*/
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
592 }
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
593 }
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
594 }
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
595
2235
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
596 void multitap_check_ready(io_port *port, uint32_t current_cycle)
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
597 {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
598 if (current_cycle >= port->device.multitap.ready_cycle) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
599 if (port->device.multitap.reset_state) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
600 uint8_t output = get_output_value(port, current_cycle, SLOW_RISE_DEVICE);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
601 if (output & TR) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
602 port->input[0] |= TL;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
603 port->device.multitap.reset_state = 0;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
604 } else {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
605 port->input[0] &= TR;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
606 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
607 port->device.multitap.ready_cycle = CYCLE_NEVER;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
608 return;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
609 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
610 port->device.multitap.tr_counter++;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
611 port->device.multitap.ready_cycle = CYCLE_NEVER;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
612 switch (port->device.multitap.tr_counter)
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
613 {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
614 case 1:
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
615 for (int i = 0; i < 4; i++)
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
616 {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
617 uint8_t id = io_data_read(port->device.multitap.ports + i, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
618 io_data_write(port->device.multitap.ports + i, 0, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
619 uint8_t value = io_data_read(port->device.multitap.ports + i, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
620 uint8_t pad_data = (id & 0x3F) | (value << 2 & 0xC0);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
621 id = (id & 0xA) | (id << 1 & 0xA);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
622 id |= (value & 0x5) | (value >> 1 & 0x5);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
623 id = (id & 0x9) | (id << 1 & 0x4) | (id >> 1 & 0x2);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
624 if (id == 0xD || id == 0xC) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
625 port->device.multitap.data[i] = pad_data;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
626 io_data_write(port->device.multitap.ports + i, 0x40, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
627 } else if (id == 0x3) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
628 //set TR to output for mouse
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
629 io_control_write(port->device.multitap.ports + i, 0x60, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
630 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
631 port->device.multitap.device_ids[i] = id;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
632 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
633 port->input[0] = 0;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
634 break;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
635 case 2:
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
636 for (int i = 0; i < 4; i++)
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
637 {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
638 if (port->device.multitap.device_ids[i] == 0xC || port->device.multitap.device_ids[i] == 0xD) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
639 io_data_write(port->device.multitap.ports + i, 0, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
640 } else if (port->device.multitap.device_ids[i] == 0x3) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
641 //TODO: Fix delays so mouse has enough time to respond
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
642 io_data_write(port->device.multitap.ports + i, 0x20, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
643 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
644 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
645 port->input[0] = 0x10;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
646 break;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
647 case 3:
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
648 for (int i = 0; i < 4; i++)
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
649 {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
650 if (port->device.multitap.device_ids[i] == 0xC || port->device.multitap.device_ids[i] == 0xD) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
651 io_data_write(port->device.multitap.ports + i, 0x40, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
652 io_data_write(port->device.multitap.ports + i, 0, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
653 uint8_t value = io_data_read(port->device.multitap.ports + i, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
654 if (value & 0xF) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
655 //3 button
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
656 port->device.multitap.device_ids[i] = 0;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
657 } else {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
658 port->device.multitap.device_ids[i] = 1;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
659 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
660 } else if (port->device.multitap.device_ids[i] == 0xC) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
661 //TODO: Fix delays so mouse has enough time to respond
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
662 io_data_write(port->device.multitap.ports + i, 0, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
663 port->device.multitap.device_ids[i] = 2;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
664 } else {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
665 port->device.multitap.device_ids[i] = 0xF;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
666 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
667 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
668 port->input[0] = port->device.multitap.device_ids[0];
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
669 break;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
670 case 4:
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
671 port->input[0] = 0x10 | port->device.multitap.device_ids[1];
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
672 break;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
673 case 5:
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
674 port->input[0] = port->device.multitap.device_ids[2];
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
675 break;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
676 case 6:
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
677 port->input[0] = 0x10 | port->device.multitap.device_ids[3];
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
678 port->device.multitap.cur_port = 0;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
679 port->device.multitap.port_start = 7;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
680 break;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
681 default: {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
682 port->input[0] = (port->input[0] & ~TL) | ((~port->input[0]) & TL);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
683 uint8_t tr_diff = port->device.multitap.tr_counter - port->device.multitap.port_start;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
684 for (;;)
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
685 {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
686 if (port->device.multitap.cur_port > 3) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
687 return;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
688 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
689 switch (port->device.multitap.device_ids[port->device.multitap.cur_port])
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
690 {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
691 case 0:
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
692 if (tr_diff) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
693 port->input[0] = (port->input[0] & 0xF0) | (port->device.multitap.data[port->device.multitap.cur_port] >> 4);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
694 port->device.multitap.cur_port++;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
695 port->device.multitap.port_start = port->device.multitap.tr_counter + 1;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
696 } else {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
697 port->input[0] = (port->input[0] & 0xF0) | (port->device.multitap.data[port->device.multitap.cur_port] & 0xF);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
698 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
699 return;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
700 case 1:
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
701 if (tr_diff == 2) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
702 uint8_t value = io_data_read(port->device.multitap.ports + port->device.multitap.cur_port, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
703 port->input[0] = (port->input[0] & 0xF0) | (value & 0xF);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
704 //finish 6-button cycle
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
705 io_data_write(port->device.multitap.ports + port->device.multitap.cur_port, 0, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
706 port->device.multitap.cur_port++;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
707 port->device.multitap.port_start = port->device.multitap.tr_counter + 1;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
708 } else if (tr_diff) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
709 io_data_write(port->device.multitap.ports + port->device.multitap.cur_port, 0x40, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
710 port->input[0] = (port->input[0] & 0xF0) | (port->device.multitap.data[port->device.multitap.cur_port] >> 4);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
711 } else {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
712 port->input[0] = (port->input[0] & 0xF0) | (port->device.multitap.data[port->device.multitap.cur_port] & 0xF);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
713 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
714 return;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
715 case 2: {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
716 io_port *dst_port = port->device.multitap.ports + port->device.multitap.cur_port;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
717 uint8_t value = io_data_read(dst_port, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
718 io_data_write(dst_port, (~dst_port->output) & TR, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
719 if (tr_diff == 5) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
720 port->device.multitap.cur_port++;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
721 port->device.multitap.port_start = port->device.multitap.tr_counter + 1;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
722 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
723 return;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
724 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
725 default:
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
726 port->device.multitap.cur_port++;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
727 port->device.multitap.port_start = port->device.multitap.tr_counter;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
728 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
729 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
730 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
731 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
732 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
733 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
734
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
735 void io_adjust_cycles(io_port * port, uint32_t current_cycle, uint32_t deduction)
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
736 {
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
737 /*uint8_t control = pad->control | 0x80;
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
738 uint8_t th = control & pad->output;
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
739 if (pad->input[GAMEPAD_TH0] || pad->input[GAMEPAD_TH1]) {
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
740 printf("adjust_cycles | control: %X, TH: %X, GAMEPAD_TH0: %X, GAMEPAD_TH1: %X, TH Counter: %d, Timeout: %d, Cycle: %d\n", control, th, pad->input[GAMEPAD_TH0], pad->input[GAMEPAD_TH1], pad->th_counter,pad->timeout_cycle, current_cycle);
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
741 }*/
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
742 if (port->device_type == IO_GAMEPAD6)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
743 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
744 if (current_cycle >= port->device.pad.timeout_cycle)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
745 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
746 port->device.pad.th_counter = 0;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
747 } else {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
748 port->device.pad.timeout_cycle -= deduction;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
749 }
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
750 } else if (port->device_type == IO_MOUSE) {
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
751 mouse_check_ready(port, current_cycle);
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
752 if (port->device.mouse.ready_cycle != CYCLE_NEVER) {
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
753 port->device.mouse.ready_cycle -= deduction;
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
754 }
2235
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
755 } else if (port->device_type == IO_SEGA_MULTI) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
756 multitap_check_ready(port, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
757 if (port->device.multitap.ready_cycle != CYCLE_NEVER) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
758 port->device.multitap.ready_cycle -= deduction;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
759 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
760 for (int i = 0; i < 4; i++)
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
761 {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
762 io_adjust_cycles(port->device.multitap.ports + i, current_cycle, deduction);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
763 }
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
764 }
1348
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
765 for (int i = 0; i < 8; i++)
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
766 {
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
767 if (port->slow_rise_start[i] != CYCLE_NEVER) {
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
768 if (port->slow_rise_start[i] >= deduction) {
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
769 port->slow_rise_start[i] -= deduction;
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
770 } else {
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
771 port->slow_rise_start[i] = CYCLE_NEVER;
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
772 }
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
773 }
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
774 }
2025
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
775 if (port->transmit_end >= deduction) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
776 port->transmit_end -= deduction;
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1035
diff changeset
777 } else {
2025
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
778 port->transmit_end = 0;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
779 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
780 if (port->receive_end >= deduction) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
781 port->receive_end -= deduction;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
782 } else {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
783 port->receive_end = 0;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
784 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
785 if (port->last_poll_cycle >= deduction) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
786 port->last_poll_cycle -= deduction;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
787 } else {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
788 port->last_poll_cycle = 0;
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1035
diff changeset
789 }
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
790 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
791
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 722
diff changeset
792 #ifndef _WIN32
2025
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
793 static void wait_for_connection(io_port *port)
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
794 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
795 if (port->device.stream.data_fd == -1)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
796 {
2025
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
797 debug_message("Waiting for socket connection...\n");
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
798 port->device.stream.data_fd = accept(port->device.stream.listen_fd, NULL, NULL);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
799 fcntl(port->device.stream.data_fd, F_SETFL, O_NONBLOCK | O_RDWR);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
800 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
801 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
802
2025
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
803 static void poll_for_connection(io_port *port)
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
804 {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
805 if (port->device.stream.data_fd == -1)
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
806 {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
807 fcntl(port->device.stream.listen_fd, F_SETFL, O_NONBLOCK | O_RDWR);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
808 port->device.stream.data_fd = accept(port->device.stream.listen_fd, NULL, NULL);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
809 fcntl(port->device.stream.listen_fd, F_SETFL, O_RDWR);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
810 if (port->device.stream.data_fd != -1) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
811 fcntl(port->device.stream.data_fd, F_SETFL, O_NONBLOCK | O_RDWR);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
812 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
813 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
814 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
815
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
816 static void write_serial_byte(io_port *port)
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
817 {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
818 fcntl(port->device.stream.data_fd, F_SETFL, O_RDWR);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
819 for (int sent = 0; sent != sizeof(port->serial_transmitting);)
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
820 {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
821 sent = send(port->device.stream.data_fd, &port->serial_transmitting, sizeof(port->serial_transmitting), 0);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
822 if (sent < 0) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
823 close(port->device.stream.data_fd);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
824 port->device.stream.data_fd = -1;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
825 wait_for_connection(port);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
826 fcntl(port->device.stream.data_fd, F_SETFL, O_RDWR);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
827 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
828 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
829 fcntl(port->device.stream.data_fd, F_SETFL, O_NONBLOCK | O_RDWR);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
830 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
831
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
832 static void read_serial_byte(io_port *port)
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
833 {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
834 poll_for_connection(port);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
835 if (port->device.stream.data_fd == -1) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
836 return;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
837 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
838 int read = recv(port->device.stream.data_fd, &port->serial_receiving, sizeof(port->serial_receiving), 0);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
839 if (read < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
840 close(port->device.stream.data_fd);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
841 port->device.stream.data_fd = -1;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
842 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
843 if (read > 0) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
844 port->receive_end = port->serial_cycle + 10 * port->serial_divider;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
845 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
846 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
847
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
848 static void service_pipe(io_port *port)
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
849 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
850 uint8_t value;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
851 int numRead = read(port->device.stream.data_fd, &value, sizeof(value));
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
852 if (numRead > 0)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
853 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
854 port->input[IO_TH0] = (value & 0xF) | 0x10;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
855 port->input[IO_TH1] = (value >> 4) | 0x10;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
856 } else if(numRead == -1 && errno != EAGAIN && errno != EWOULDBLOCK) {
903
0e5f9d6135be Make nexus player remote useable as a controller for games that only require a dpad + start + c. Use warning() instead of fprintf(stder,...) in io.c
Michael Pavone <pavone@retrodev.com>
parents: 897
diff changeset
857 warning("Error reading pipe for IO port: %d %s\n", errno, strerror(errno));
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
858 }
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
859 }
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
860
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
861 static void service_socket(io_port *port)
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
862 {
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
863 uint8_t buf[32];
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
864 uint8_t blocking = 0;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
865 int numRead = 0;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
866 while (numRead <= 0)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
867 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
868 numRead = recv(port->device.stream.data_fd, buf, sizeof(buf), 0);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
869 if (numRead > 0)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
870 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
871 port->input[IO_TH0] = buf[numRead-1];
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
872 if (port->input[IO_STATE] == IO_READ_PENDING)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
873 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
874 port->input[IO_STATE] = IO_READ;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
875 if (blocking)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
876 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
877 //pending read satisfied, back to non-blocking mode
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
878 fcntl(port->device.stream.data_fd, F_SETFL, O_RDWR | O_NONBLOCK);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
879 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
880 } else if (port->input[IO_STATE] == IO_WRITTEN) {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
881 port->input[IO_STATE] = IO_READ;
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
882 }
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
883 } else if (numRead == 0) {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
884 port->device.stream.data_fd = -1;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
885 wait_for_connection(port);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
886 } else if (errno != EAGAIN && errno != EWOULDBLOCK) {
903
0e5f9d6135be Make nexus player remote useable as a controller for games that only require a dpad + start + c. Use warning() instead of fprintf(stder,...) in io.c
Michael Pavone <pavone@retrodev.com>
parents: 897
diff changeset
887 warning("Error reading from socket for IO port: %d %s\n", errno, strerror(errno));
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
888 close(port->device.stream.data_fd);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
889 wait_for_connection(port);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
890 } else if (port->input[IO_STATE] == IO_READ_PENDING) {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
891 //clear the nonblocking flag so the next read will block
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
892 if (!blocking)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
893 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
894 fcntl(port->device.stream.data_fd, F_SETFL, O_RDWR);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
895 blocking = 1;
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
896 }
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
897 } else {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
898 //no new data, but that's ok
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
899 break;
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
900 }
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
901 }
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
902
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
903 if (port->input[IO_STATE] == IO_WRITE_PENDING)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
904 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
905 uint8_t value = port->output & port->control;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
906 int written = 0;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
907 blocking = 0;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
908 while (written <= 0)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
909 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
910 send(port->device.stream.data_fd, &value, sizeof(value), 0);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
911 if (written > 0)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
912 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
913 port->input[IO_STATE] = IO_WRITTEN;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
914 if (blocking)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
915 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
916 //pending write satisfied, back to non-blocking mode
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
917 fcntl(port->device.stream.data_fd, F_SETFL, O_RDWR | O_NONBLOCK);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
918 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
919 } else if (written == 0) {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
920 port->device.stream.data_fd = -1;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
921 wait_for_connection(port);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
922 } else if (errno != EAGAIN && errno != EWOULDBLOCK) {
903
0e5f9d6135be Make nexus player remote useable as a controller for games that only require a dpad + start + c. Use warning() instead of fprintf(stder,...) in io.c
Michael Pavone <pavone@retrodev.com>
parents: 897
diff changeset
923 warning("Error writing to socket for IO port: %d %s\n", errno, strerror(errno));
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
924 close(port->device.stream.data_fd);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
925 wait_for_connection(port);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
926 } else {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
927 //clear the nonblocking flag so the next write will block
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
928 if (!blocking)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
929 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
930 fcntl(port->device.stream.data_fd, F_SETFL, O_RDWR);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
931 blocking = 1;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
932 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
933 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
934 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
935 }
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
936 }
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 722
diff changeset
937 #endif
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
938
2027
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
939 enum {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
940 HBPT_UNKNOWN1 = 1,
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
941 HBPT_POLL,
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
942 HBPT_READ_PAGE = 5,
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
943 HBPT_WRITE_PAGE,
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
944 HBPT_READ_RTC,
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
945 HBPT_SET_RTC,
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
946 HBPT_GET_STATUS,
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
947 HBPT_ERASE_NVMEM,
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
948 HBPT_NVMEM_PARAMS,
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
949 HBPT_INIT
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
950 };
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
951
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
952 static void start_reply(io_port *port, uint8_t bytes, const uint8_t *src)
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
953 {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
954 port->device.heartbeat_trainer.remaining_bytes = bytes;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
955 port->device.heartbeat_trainer.state = HBPT_REPLY;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
956 port->device.heartbeat_trainer.cur_buffer = (uint8_t *)src;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
957 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
958
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
959 static void simple_reply(io_port *port, uint8_t value)
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
960 {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
961 port->device.heartbeat_trainer.param = value;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
962 start_reply(port, 1, &port->device.heartbeat_trainer.param);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
963 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
964
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
965 static void expect_payload(io_port *port, uint8_t bytes, uint8_t *dst)
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
966 {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
967 port->device.heartbeat_trainer.remaining_bytes = bytes;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
968 port->device.heartbeat_trainer.state = HBPT_CMD_PAYLOAD;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
969 port->device.heartbeat_trainer.cur_buffer = dst;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
970 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
971
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
972 void hbpt_check_init(io_port *port)
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
973 {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
974 if (port->device.heartbeat_trainer.state == HBPT_NEED_INIT) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
975 port->device.heartbeat_trainer.rtc_base_timestamp = 0;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
976 for (int i = 0; i < 8; i ++)
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
977 {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
978 port->device.heartbeat_trainer.rtc_base_timestamp <<= 8;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
979 port->device.heartbeat_trainer.rtc_base_timestamp |= port->device.heartbeat_trainer.nv_memory[i];
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
980 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
981 memcpy(port->device.heartbeat_trainer.rtc_base, port->device.heartbeat_trainer.nv_memory + 8, 5);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
982 if (port->device.heartbeat_trainer.rtc_base_timestamp == UINT64_MAX) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
983 //uninitialized save, set the appropriate status bit
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
984 port->device.heartbeat_trainer.status |= 1;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
985 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
986 port->device.heartbeat_trainer.bpm = 60;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
987 port->device.heartbeat_trainer.state = HBPT_IDLE;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
988 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
989 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
990
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
991 void hbpt_check_send_reply(io_port *port)
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
992 {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
993 if (port->device.heartbeat_trainer.state == HBPT_REPLY && !port->receive_end) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
994 port->serial_receiving = *(port->device.heartbeat_trainer.cur_buffer++);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
995 port->receive_end = port->serial_cycle + 10 * port->serial_divider;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
996 if (!--port->device.heartbeat_trainer.remaining_bytes) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
997 port->device.heartbeat_trainer.state = HBPT_IDLE;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
998 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
999 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1000 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1001
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1002 uint8_t is_leap_year(uint16_t year)
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1003 {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1004 if (year & 3) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1005 return 0;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1006 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1007 if (year % 100) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1008 return 1;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1009 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1010 if (year % 400) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1011 return 0;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1012 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1013 return 1;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1014 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1015
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1016 uint8_t days_in_month(uint8_t month, uint16_t year)
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1017 {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1018 static uint8_t days_per_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1019 if (month == 2 && is_leap_year(year)) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1020 return 29;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1021 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1022 if (month > 12 || !month) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1023 return 30;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1024 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1025 return days_per_month[month-1];
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1026 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1027
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1028 void hbpt_write_byte(io_port *port)
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1029 {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1030 hbpt_check_init(port);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1031 uint8_t reply;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1032 switch (port->device.heartbeat_trainer.state)
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1033 {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1034 case HBPT_IDLE:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1035 port->device.heartbeat_trainer.cmd = port->serial_transmitting;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1036 switch (port->device.heartbeat_trainer.cmd)
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1037 {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1038 case HBPT_UNKNOWN1:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1039 start_reply(port, 11, NULL);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1040 break;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1041 case HBPT_POLL:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1042 start_reply(port, 3, &port->device.heartbeat_trainer.bpm);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1043 if (port->serial_cycle - port->last_poll_cycle > MIN_POLL_INTERVAL) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1044 process_events();
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1045 port->last_poll_cycle = port->serial_cycle;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1046 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1047 port->device.heartbeat_trainer.buttons = (port->input[GAMEPAD_TH0] << 2 & 0xC0) | (port->input[GAMEPAD_TH1] & 0x1F);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1048 if (port->device.heartbeat_trainer.cadence && port->input[GAMEPAD_TH1] & 0x20) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1049 port->device.heartbeat_trainer.cadence--;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1050 printf("Cadence: %d\n", port->device.heartbeat_trainer.cadence);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1051 } else if (port->device.heartbeat_trainer.cadence < 255 && port->input[GAMEPAD_EXTRA] & 1) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1052 port->device.heartbeat_trainer.cadence++;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1053 printf("Cadence: %d\n", port->device.heartbeat_trainer.cadence);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1054 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1055 if (port->device.heartbeat_trainer.bpm && port->input[GAMEPAD_EXTRA] & 4) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1056 port->device.heartbeat_trainer.bpm--;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1057 printf("Heart Rate: %d\n", port->device.heartbeat_trainer.bpm);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1058 } else if (port->device.heartbeat_trainer.bpm < 255 && port->input[GAMEPAD_EXTRA] & 2) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1059 port->device.heartbeat_trainer.bpm++;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1060 printf("Heart Rate: %d\n", port->device.heartbeat_trainer.bpm);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1061 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1062
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1063 break;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1064 case HBPT_READ_PAGE:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1065 case HBPT_WRITE_PAGE:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1066 //strictly speaking for the write case, we want 1 + page size here
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1067 //but the rest of the payload goes to a different destination
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1068 expect_payload(port, 1, &port->device.heartbeat_trainer.param);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1069 break;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1070 case HBPT_READ_RTC: {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1071 uint8_t *rtc = port->device.heartbeat_trainer.rtc_base;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1072 start_reply(port, 5, rtc);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1073 uint64_t now = time(NULL);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1074 uint64_t delta = (now - port->device.heartbeat_trainer.rtc_base_timestamp + 30) / 60;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1075 rtc[4] += delta % 60;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1076 if (rtc[4] > 59) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1077 rtc[4] -= 60;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1078 rtc[3]++;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1079 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1080 delta /= 60;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1081 if (delta) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1082 rtc[3] += delta % 24;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1083 delta /= 24;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1084 if (rtc[3] > 23) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1085 rtc[3] -= 24;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1086 delta++;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1087 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1088 if (delta) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1089 uint16_t year = rtc[0] < 81 ? 2000 + rtc[0] : 1900 + rtc[0];
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1090 uint8_t days_cur_month = days_in_month(rtc[1], year);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1091 while (delta + rtc[2] > days_cur_month) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1092 delta -= days_cur_month + 1 - rtc[2];
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1093 rtc[2] = 1;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1094 if (++rtc[1] == 13) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1095 rtc[1] = 1;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1096 year++;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1097 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1098 days_cur_month = days_in_month(rtc[1], year);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1099 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1100 rtc[1] += delta;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1101 rtc[0] = year % 100;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1102 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1103 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1104 printf("RTC %02d-%02d-%02d %02d:%02d\n", rtc[0], rtc[1], rtc[2], rtc[3], rtc[4]);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1105 port->device.heartbeat_trainer.rtc_base_timestamp = now;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1106 break;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1107 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1108 case HBPT_SET_RTC:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1109 port->device.heartbeat_trainer.rtc_base_timestamp = time(NULL);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1110 expect_payload(port, 5, port->device.heartbeat_trainer.rtc_base);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1111 break;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1112 case HBPT_GET_STATUS:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1113 simple_reply(port, port->device.heartbeat_trainer.status);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1114 break;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1115 case HBPT_ERASE_NVMEM:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1116 expect_payload(port, 1, &port->device.heartbeat_trainer.param);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1117 break;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1118 case HBPT_NVMEM_PARAMS:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1119 start_reply(port, 2, &port->device.heartbeat_trainer.nv_page_size);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1120 break;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1121 case HBPT_INIT:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1122 expect_payload(port, 19, NULL);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1123 break;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1124 default:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1125 // it's unclear what these commands do as they are unused by Outback Joey
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1126 // just return 0 to indicate failure
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1127 simple_reply(port, 0);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1128 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1129 break;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1130 case HBPT_CMD_PAYLOAD:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1131 if (port->device.heartbeat_trainer.cur_buffer) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1132 *(port->device.heartbeat_trainer.cur_buffer++) = port->serial_transmitting;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1133 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1134 if (!--port->device.heartbeat_trainer.remaining_bytes) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1135 switch (port->device.heartbeat_trainer.cmd)
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1136 {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1137 case HBPT_READ_PAGE:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1138 case HBPT_WRITE_PAGE:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1139 if (
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1140 port->device.heartbeat_trainer.cmd == HBPT_WRITE_PAGE
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1141 && port->device.heartbeat_trainer.cur_buffer != &port->device.heartbeat_trainer.param + 1) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1142 simple_reply(port, 1);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1143 break;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1144 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1145 port->device.heartbeat_trainer.remaining_bytes = port->device.heartbeat_trainer.nv_page_size;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1146 port->device.heartbeat_trainer.cur_buffer =
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1147 port->device.heartbeat_trainer.param < port->device.heartbeat_trainer.nv_pages
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1148 ? port->device.heartbeat_trainer.nv_memory + 5 + 8
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1149 + port->device.heartbeat_trainer.param * port->device.heartbeat_trainer.nv_page_size
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1150 : NULL;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1151 if (port->device.heartbeat_trainer.cmd == HBPT_WRITE_PAGE) {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1152 return;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1153 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1154 port->device.heartbeat_trainer.state = HBPT_REPLY;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1155 break;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1156 case HBPT_SET_RTC:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1157 //save RTC base values back to nv memory area so it's saved to disk on exit
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1158 for (int i = 0; i < 8; i++)
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1159 {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1160 port->device.heartbeat_trainer.nv_memory[i] = port->device.heartbeat_trainer.rtc_base_timestamp >> (56 - i*8);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1161 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1162 memcpy(port->device.heartbeat_trainer.nv_memory + 8, port->device.heartbeat_trainer.rtc_base, 5);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1163 simple_reply(port, 1);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1164 break;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1165 case HBPT_ERASE_NVMEM:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1166 memset(
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1167 port->device.heartbeat_trainer.nv_memory + 5 + 8,
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1168 port->device.heartbeat_trainer.param,
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1169 port->device.heartbeat_trainer.nv_pages * port->device.heartbeat_trainer.nv_page_size
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1170 );
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1171 simple_reply(port, 1);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1172 break;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1173 case HBPT_INIT: {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1174 static const char reply[] = "(C) HEARTBEAT CORP";
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1175 start_reply(port, strlen(reply), reply);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1176 break;
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1177 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1178 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1179 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1180 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1181 hbpt_check_send_reply(port);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1182 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1183
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1184 void hbpt_read_byte(io_port *port)
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1185 {
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1186 hbpt_check_init(port);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1187 hbpt_check_send_reply(port);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1188 }
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1189
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1190 const int mouse_delays[] = {112*7, 120*7, 96*7, 132*7, 104*7, 96*7, 112*7, 96*7};
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1191
1232
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1192 enum {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1193 KB_SETUP,
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1194 KB_READ,
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1195 KB_WRITE
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1196 };
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1197
2025
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1198 enum {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1199 SCTRL_BIT_TX_FULL = 1,
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1200 SCTRL_BIT_RX_READY = 2,
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1201 SCTRL_BIT_RX_ERROR = 4,
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1202 SCTRL_BIT_RX_INTEN = 8,
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1203 SCTRL_BIT_TX_ENABLE = 0x10,
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1204 SCTRL_BIT_RX_ENABLE = 0x20
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1205 };
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1206
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1207 void io_run(io_port *port, uint32_t current_cycle)
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1208 {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1209 uint32_t new_serial_cycle = ((current_cycle - port->serial_cycle) / port->serial_divider) * port->serial_divider + port->serial_cycle;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1210 if (port->transmit_end && port->transmit_end <= new_serial_cycle) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1211 port->transmit_end = 0;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1212
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1213 if (port->serial_ctrl & SCTRL_BIT_TX_ENABLE) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1214 switch (port->device_type)
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1215 {
2027
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1216 case IO_HEARTBEAT_TRAINER:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1217 hbpt_write_byte(port);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1218 break;
2025
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1219 #ifndef _WIN32
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1220 case IO_GENERIC_SERIAL:
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1221 write_serial_byte(port);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1222 break;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1223 #endif
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1224 //TODO: think about how serial mode might interact with non-serial peripherals
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1225 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1226 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1227 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1228 if (!port->transmit_end && new_serial_cycle != port->serial_cycle && (port->serial_ctrl & SCTRL_BIT_TX_FULL)) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1229 //there's a transmit byte pending and no byte is currently being sent
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1230 port->serial_transmitting = port->serial_out;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1231 port->serial_ctrl &= ~SCTRL_BIT_TX_FULL;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1232 //1 start bit, 8 data bits and 1 stop bit
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1233 port->transmit_end = new_serial_cycle + 10 * port->serial_divider;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1234 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1235 port->serial_cycle = new_serial_cycle;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1236 if (port->serial_ctrl && SCTRL_BIT_RX_ENABLE) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1237 if (port->receive_end && new_serial_cycle >= port->receive_end) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1238 port->serial_in = port->serial_receiving;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1239 port->serial_ctrl |= SCTRL_BIT_RX_READY;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1240 port->receive_end = 0;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1241 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1242 if (!port->receive_end) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1243 switch(port->device_type)
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1244 {
2027
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1245 case IO_HEARTBEAT_TRAINER:
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1246 hbpt_read_byte(port);
0f54a898db03 Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents: 2025
diff changeset
1247 break;
2025
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1248 #ifndef _WIN32
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1249 case IO_GENERIC_SERIAL:
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1250 read_serial_byte(port);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1251 break;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1252 #endif
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1253 //TODO: think about how serial mode might interact with non-serial peripherals
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1254 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1255 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1256 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1257 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1258
1348
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1259 void io_control_write(io_port *port, uint8_t value, uint32_t current_cycle)
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1260 {
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1261 uint8_t changes = value ^ port->control;
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1262 if (changes) {
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1263 for (int i = 0; i < 8; i++)
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1264 {
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1265 if (!(value & 1 << i) && !(port->output & 1 << i)) {
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1266 //port switched from output to input and the output value was 0
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1267 //since there is a weak pull-up on input pins, this will lead
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1268 //to a slow rise from 0 to 1 if the pin isn't being externally driven
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1269 port->slow_rise_start[i] = current_cycle;
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1270 } else {
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1271 port->slow_rise_start[i] = CYCLE_NEVER;
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1272 }
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1273 }
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1274 port->control = value;
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1275 }
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1276 }
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1277
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1278 void io_data_write(io_port * port, uint8_t value, uint32_t current_cycle)
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1279 {
2235
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1280 uint8_t old_output = get_output_value(port, current_cycle, SLOW_RISE_DEVICE);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1281 port->output = value;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1282 uint8_t output = get_output_value(port, current_cycle, SLOW_RISE_DEVICE);
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1283 switch (port->device_type)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1284 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1285 case IO_GAMEPAD6:
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1286 //check if TH has changed
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1287 if ((old_output & TH) ^ (output & TH)) {
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1288 if (current_cycle >= port->device.pad.timeout_cycle) {
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1289 port->device.pad.th_counter = 0;
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1290 }
1144
be3df2d8530a Increment TH counter on low to high transitions rather than high to low transitions for six button controllers. Fixes Charles MacDonald's SMS six button controller demo
Michael Pavone <pavone@retrodev.com>
parents: 1116
diff changeset
1291 if ((output & TH)) {
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1292 port->device.pad.th_counter++;
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1293 }
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1294 port->device.pad.timeout_cycle = current_cycle + TH_TIMEOUT;
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1295 }
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1296 break;
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1297 case IO_MOUSE:
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1298 mouse_check_ready(port, current_cycle);
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1299 if (output & TH) {
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1300 //request is over or mouse is being reset
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1301 if (port->device.mouse.tr_counter) {
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1302 //request is over
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1303 port->device.mouse.last_read_x = port->device.mouse.latched_x;
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1304 port->device.mouse.last_read_y = port->device.mouse.latched_y;
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1305 }
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1306 port->device.mouse.tr_counter = 0;
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1307 port->device.mouse.ready_cycle = CYCLE_NEVER;
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1308 } else {
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1309 if ((output & TR) != (old_output & TR)) {
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1310 int delay_index = port->device.mouse.tr_counter >= sizeof(mouse_delays) ? sizeof(mouse_delays)-1 : port->device.mouse.tr_counter;
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1311 port->device.mouse.ready_cycle = current_cycle + mouse_delays[delay_index];
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1312 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1313 }
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1314 break;
1028
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1315 case IO_SATURN_KEYBOARD:
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1316 if (output & TH) {
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1317 //request is over
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1318 if (port->device.keyboard.tr_counter >= 10 && port->device.keyboard.read_pos != 0xFF) {
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1319 //remove scan code from buffer
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1320 port->device.keyboard.read_pos++;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1321 port->device.keyboard.read_pos &= 7;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1322 if (port->device.keyboard.read_pos == port->device.keyboard.write_pos) {
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1323 port->device.keyboard.read_pos = 0xFF;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1324 }
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1325 }
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1326 port->device.keyboard.tr_counter = 0;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1327 } else {
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1328 if ((output & TR) != (old_output & TR)) {
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1329 port->device.keyboard.tr_counter++;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1330 }
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1331 }
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1332 break;
1232
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1333 case IO_XBAND_KEYBOARD:
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1334 if (output & TH) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1335 //request is over
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1336 if (
1257
db28178bd2a1 Fix removal of scan codes from buffer in XBAND keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1256
diff changeset
1337 port->device.keyboard.mode == KB_READ && port->device.keyboard.tr_counter > 6
1232
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1338 && (port->device.keyboard.tr_counter & 1)
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1339 ) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1340 if (port->device.keyboard.events[port->device.keyboard.read_pos] & 0xFF00) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1341 port->device.keyboard.events[port->device.keyboard.read_pos] &= 0xFF;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1342 } else {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1343 port->device.keyboard.read_pos++;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1344 port->device.keyboard.read_pos &= 7;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1345 if (port->device.keyboard.read_pos == port->device.keyboard.write_pos) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1346 port->device.keyboard.read_pos = 0xFF;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1347 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1348 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1349 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1350 port->device.keyboard.tr_counter = 0;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1351 port->device.keyboard.mode = KB_SETUP;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1352 } else {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1353 if ((output & TR) != (old_output & TR)) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1354 port->device.keyboard.tr_counter++;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1355 if (port->device.keyboard.tr_counter == 2) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1356 port->device.keyboard.mode = (output & 0xF) ? KB_READ : KB_WRITE;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1357 } else if (port->device.keyboard.mode == KB_WRITE) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1358 switch (port->device.keyboard.tr_counter)
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1359 {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1360 case 3:
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1361 //host writes 0b0001
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1362 break;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1363 case 4:
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1364 //host writes 0b0000
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1365 break;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1366 case 5:
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1367 //host writes 0b0000
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1368 break;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1369 case 6:
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1370 port->device.keyboard.cmd = output << 4;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1371 break;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1372 case 7:
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1373 port->device.keyboard.cmd |= output & 0xF;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1374 //TODO: actually do something with the command
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1375 break;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1376 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1377 } else if (
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1378 port->device.keyboard.mode == KB_READ && port->device.keyboard.tr_counter > 7
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1379 && !(port->device.keyboard.tr_counter & 1)
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1380 ) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1381
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1382 if (port->device.keyboard.events[port->device.keyboard.read_pos] & 0xFF00) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1383 port->device.keyboard.events[port->device.keyboard.read_pos] &= 0xFF;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1384 } else {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1385 port->device.keyboard.read_pos++;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1386 port->device.keyboard.read_pos &= 7;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1387 if (port->device.keyboard.read_pos == port->device.keyboard.write_pos) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1388 port->device.keyboard.read_pos = 0xFF;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1389 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1390 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1391 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1392 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1393 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1394 break;
2235
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1395 case IO_SEGA_MULTI:
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1396 multitap_check_ready(port, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1397 if (output & TH) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1398 //request is over
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1399 port->device.multitap.tr_counter = 0;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1400 if ((output & TR) != (old_output & TR)) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1401 port->device.multitap.ready_cycle = current_cycle + 16 * 7;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1402 port->device.multitap.reset_state = 1;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1403 } else if (!port->device.multitap.reset_state) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1404 port->device.multitap.ready_cycle = CYCLE_NEVER;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1405 port->input[0] = 0x13;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1406 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1407 for (int i = 0; i < 4; i++)
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1408 {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1409 io_control_write(port->device.multitap.ports + i, 0x40, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1410 io_data_write(port->device.multitap.ports + i, 0x40, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1411 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1412 } else {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1413 if (old_output & TH) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1414 port->input[0] = 0x1F;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1415 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1416 if ((output & TR) != (old_output & TR)) {
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1417 //TODO: measure actual delays
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1418 port->device.multitap.ready_cycle = current_cycle + 16 * 7;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1419 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1420 }
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1421 break;
2238
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1422 case IO_EA_MULTI_A:
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1423 if ((output & TH) != (old_output & TH)) {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1424 uint8_t port_num = port->device.multitap.cur_port == EA_PASSTHRU_MODE ? 1 : port->device.multitap.cur_port;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1425 if (port_num < 4) {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1426 io_data_write(port->device.multitap.ports + port_num, output & 0x40, current_cycle);
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1427 }
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1428 }
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1429 break;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1430 case IO_EA_MULTI_B: {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1431 io_port *main_port = port->device.multitap.ports;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1432 io_port *passthru = main_port->device.multitap.ports + 1;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1433 if (main_port->device.multitap.cur_port == EA_PASSTHRU_MODE) {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1434 output &= port->control | 0x40;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1435 output |= io_data_read(passthru, current_cycle) & ~(port->control | 0x40);
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1436 }
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1437 uint8_t old_port = main_port->device.multitap.cur_port;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1438 if ((output & 0xF) == 0xC) {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1439 main_port->device.multitap.cur_port = output >> 4 & 7;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1440 } else {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1441 main_port->device.multitap.cur_port = EA_PASSTHRU_MODE;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1442 }
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1443 if (old_port == EA_PASSTHRU_MODE && main_port->device.multitap.cur_port < 4) {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1444 //switched from passthru to multitap mode, set TH for selected controller to port A value
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1445 output = get_output_value(main_port, current_cycle, SLOW_RISE_DEVICE);
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1446 io_data_write(main_port->device.multitap.ports + main_port->device.multitap.cur_port, output & 0x40, current_cycle);
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1447 } else if (main_port->device.multitap.cur_port == EA_PASSTHRU_MODE) {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1448 //in passhtru mode, set TH to controller 2 to port B value
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1449 io_data_write(main_port->device.multitap.ports + 1, output & 0x40, current_cycle);
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1450 }
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1451 break;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1452 }
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 722
diff changeset
1453 #ifndef _WIN32
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1454 case IO_GENERIC:
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1455 wait_for_connection(port);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1456 port->input[IO_STATE] = IO_WRITE_PENDING;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1457 service_socket(port);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1458 break;
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 722
diff changeset
1459 #endif
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1460 }
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1461 port->output = value;
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1462
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1463 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1464
2025
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1465 void io_tx_write(io_port *port, uint8_t value, uint32_t current_cycle)
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1466 {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1467 io_run(port, current_cycle);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1468 port->serial_out = value;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1469 port->serial_ctrl |= SCTRL_BIT_TX_FULL;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1470 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1471
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1472 void io_sctrl_write(io_port *port, uint8_t value, uint32_t current_cycle)
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1473 {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1474 io_run(port, current_cycle);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1475 port->serial_ctrl = (port->serial_ctrl & 0x7) | (value & 0xF8);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1476 set_serial_clock(port);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1477 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1478
1232
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1479 uint8_t get_scancode_bytes(io_port *port)
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1480 {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1481 if (port->device.keyboard.read_pos == 0xFF) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1482 return 0;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1483 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1484 uint8_t bytes = 0, read_pos = port->device.keyboard.read_pos;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1485 do {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1486 bytes += port->device.keyboard.events[read_pos] & 0xFF00 ? 2 : 1;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1487 read_pos++;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1488 read_pos &= 7;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1489 } while (read_pos != port->device.keyboard.write_pos);
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1490
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1491 return bytes;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1492 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1493
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1494 uint8_t io_data_read(io_port * port, uint32_t current_cycle)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1495 {
1348
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1496 uint8_t output = get_output_value(port, current_cycle, SLOW_RISE_DEVICE);
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1497 uint8_t control = port->control | 0x80;
911
73732ae76fa8 IO port pins should read as high from the perspective of a device when they are set as inputs
Michael Pavone <pavone@retrodev.com>
parents: 910
diff changeset
1498 uint8_t th = output & 0x40;
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1499 uint8_t input;
1348
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1500 uint8_t device_driven;
2025
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1501 if (current_cycle - port->last_poll_cycle > MIN_POLL_INTERVAL) {
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1035
diff changeset
1502 process_events();
2025
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1503 port->last_poll_cycle = current_cycle;
1077
1a66d5165ea7 Cleanup the separation of render backend and VDP code in preparation for having extra debug windows. Make determination of H40/H32 based on number of lines in each mode.
Michael Pavone <pavone@retrodev.com>
parents: 1035
diff changeset
1504 }
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1505 switch (port->device_type)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1506 {
1146
3e24de8d8073 Add support for SMS controllers
Michael Pavone <pavone@retrodev.com>
parents: 1144
diff changeset
1507 case IO_GAMEPAD2:
3e24de8d8073 Add support for SMS controllers
Michael Pavone <pavone@retrodev.com>
parents: 1144
diff changeset
1508 input = ~port->input[GAMEPAD_TH1];
1379
65f1d6558e9e Update SMS code for changes supporting slow rise time emulation in IO code
Michael Pavone <pavone@retrodev.com>
parents: 1377
diff changeset
1509 device_driven = 0x3F;
1146
3e24de8d8073 Add support for SMS controllers
Michael Pavone <pavone@retrodev.com>
parents: 1144
diff changeset
1510 break;
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1511 case IO_GAMEPAD3:
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1512 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1513 input = port->input[th ? GAMEPAD_TH1 : GAMEPAD_TH0];
888
bc127fa1f800 Fix Mega Drive peripheral ID for 3-button pad
Michael Pavone <pavone@retrodev.com>
parents: 886
diff changeset
1514 if (!th) {
bc127fa1f800 Fix Mega Drive peripheral ID for 3-button pad
Michael Pavone <pavone@retrodev.com>
parents: 886
diff changeset
1515 input |= 0xC;
bc127fa1f800 Fix Mega Drive peripheral ID for 3-button pad
Michael Pavone <pavone@retrodev.com>
parents: 886
diff changeset
1516 }
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1517 //controller output is logically inverted
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1518 input = ~input;
1348
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1519 device_driven = 0x3F;
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1520 break;
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1521 }
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1522 case IO_GAMEPAD6:
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1523 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1524 if (current_cycle >= port->device.pad.timeout_cycle) {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1525 port->device.pad.th_counter = 0;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1526 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1527 /*if (port->input[GAMEPAD_TH0] || port->input[GAMEPAD_TH1]) {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1528 printf("io_data_read | control: %X, TH: %X, GAMEPAD_TH0: %X, GAMEPAD_TH1: %X, TH Counter: %d, Timeout: %d, Cycle: %d\n", control, th, port->input[GAMEPAD_TH0], port->input[GAMEPAD_TH1], port->th_counter,port->timeout_cycle, context->current_cycle);
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1529 }*/
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1530 if (th) {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1531 if (port->device.pad.th_counter == 3) {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1532 input = port->input[GAMEPAD_EXTRA];
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1533 } else {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1534 input = port->input[GAMEPAD_TH1];
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1535 }
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1536 } else {
1144
be3df2d8530a Increment TH counter on low to high transitions rather than high to low transitions for six button controllers. Fixes Charles MacDonald's SMS six button controller demo
Michael Pavone <pavone@retrodev.com>
parents: 1116
diff changeset
1537 if (port->device.pad.th_counter == 2) {
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1538 input = port->input[GAMEPAD_TH0] | 0xF;
1144
be3df2d8530a Increment TH counter on low to high transitions rather than high to low transitions for six button controllers. Fixes Charles MacDonald's SMS six button controller demo
Michael Pavone <pavone@retrodev.com>
parents: 1116
diff changeset
1539 } else if(port->device.pad.th_counter == 3) {
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1540 input = port->input[GAMEPAD_TH0] & 0x30;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1541 } else {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1542 input = port->input[GAMEPAD_TH0] | 0xC;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1543 }
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1544 }
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1545 //controller output is logically inverted
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1546 input = ~input;
1348
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1547 device_driven = 0x3F;
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1548 break;
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1549 }
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1550 case IO_MOUSE:
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1551 {
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1552 mouse_check_ready(port, current_cycle);
911
73732ae76fa8 IO port pins should read as high from the perspective of a device when they are set as inputs
Michael Pavone <pavone@retrodev.com>
parents: 910
diff changeset
1553 uint8_t tr = output & TR;
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1554 if (th) {
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1555 if (tr) {
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1556 input = 0x10;
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1557 } else {
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1558 input = 0;
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1559 }
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1560 } else {
913
a5a51465f8b0 Allow IO device config to be overriden by ROM DB
Michael Pavone <pavone@retrodev.com>
parents: 912
diff changeset
1561
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1562 int16_t delta_x = port->device.mouse.latched_x - port->device.mouse.last_read_x;
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1563 int16_t delta_y = port->device.mouse.last_read_y - port->device.mouse.latched_y;
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1564 switch (port->device.mouse.tr_counter)
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1565 {
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1566 case 0:
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1567 input = 0xB;
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1568 break;
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1569 case 1:
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1570 case 2:
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1571 input = 0xF;
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1572 break;
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1573 case 3:
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1574 input = 0;
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1575 if (delta_y > 255 || delta_y < -255) {
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1576 input |= 8;
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1577 }
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1578 if (delta_x > 255 || delta_x < -255) {
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1579 input |= 4;
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1580 }
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1581 if (delta_y < 0) {
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1582 input |= 2;
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1583 }
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1584 if (delta_x < 0) {
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1585 input |= 1;
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1586 }
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1587 break;
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1588 case 4:
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1589 input = port->input[0];
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1590 break;
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1591 case 5:
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1592 input = delta_x >> 4 & 0xF;
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1593 break;
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1594 case 6:
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1595 input = delta_x & 0xF;
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1596 break;
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1597 case 7:
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1598 input = delta_y >> 4 & 0xF;
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1599 break;
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1600 case 8:
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1601 default:
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1602 input = delta_y & 0xF;
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1603 break;
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1604 }
912
599e2861f484 Rough emulation of mouse response delays when TR is toggled. Latch current mouse value rather than delta. Some other IO cleanup/fixes
Michael Pavone <pavone@retrodev.com>
parents: 911
diff changeset
1605 input |= ((port->device.mouse.tr_counter & 1) == 0) << 4;
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1606 }
1348
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1607 device_driven = 0x1F;
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1608 break;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1609 }
1028
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1610 case IO_SATURN_KEYBOARD:
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1611 {
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1612 if (th) {
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1613 input = 0x11;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1614 } else {
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1615 uint8_t tr = output & TR;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1616 uint16_t code = port->device.keyboard.read_pos == 0xFF ? 0
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1617 : port->device.keyboard.events[port->device.keyboard.read_pos];
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1618 switch (port->device.keyboard.tr_counter)
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1619 {
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1620 case 0:
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1621 input = 1;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1622 break;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1623 case 1:
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1624 //Saturn peripheral ID
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1625 input = 3;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1626 break;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1627 case 2:
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1628 //data size
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1629 input = 4;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1630 break;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1631 case 3:
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1632 //d-pad
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1633 //TODO: set these based on keyboard state
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1634 input = 0xF;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1635 break;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1636 case 4:
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1637 //Start ABC
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1638 //TODO: set these based on keyboard state
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1639 input = 0xF;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1640 break;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1641 case 5:
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1642 //R XYZ
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1643 //TODO: set these based on keyboard state
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1644 input = 0xF;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1645 break;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1646 case 6:
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1647 //L and KBID
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1648 //TODO: set L based on keyboard state
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1649 input = 0x8;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1650 break;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1651 case 7:
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1652 //Capslock, Numlock, Scrolllock
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1653 //TODO: set these based on keyboard state
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1654 input = 0;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1655 break;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1656 case 8:
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1657 input = 6;
1232
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1658 if (code & 0xFF00) {
1028
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1659 //break
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1660 input |= 1;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1661 } else if (code) {
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1662 input |= 8;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1663 }
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1664 break;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1665 case 9:
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1666 input = code >> 4 & 0xF;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1667 break;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1668 case 10:
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1669 input = code & 0xF;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1670 break;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1671 case 11:
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1672 input = 0;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1673 break;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1674 default:
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1675 input = 1;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1676 break;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1677 }
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1678 input |= ((port->device.keyboard.tr_counter & 1) == 0) << 4;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1679 }
1348
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1680 device_driven = 0x1F;
1028
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1681 break;
56b1748a8473 Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents: 1026
diff changeset
1682 }
1232
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1683 case IO_XBAND_KEYBOARD:
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1684 {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1685 if (th) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1686 input = 0x1C;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1687 } else {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1688 uint8_t size;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1689 if (port->device.keyboard.mode == KB_SETUP || port->device.keyboard.mode == KB_READ) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1690 switch (port->device.keyboard.tr_counter)
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1691 {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1692 case 0:
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1693 input = 0x3;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1694 break;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1695 case 1:
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1696 input = 0x6;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1697 break;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1698 case 2:
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1699 //This is where thoe host indicates a read or write
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1700 //presumably, the keyboard only outputs this if the host
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1701 //is not already driving the data bus low
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1702 input = 0x9;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1703 break;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1704 case 3:
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1705 size = get_scancode_bytes(port);
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1706 if (size) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1707 ++size;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1708 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1709 if (size > 15) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1710 size = 15;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1711 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1712 input = size;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1713 break;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1714 case 4:
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1715 case 5:
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1716 //always send packet type 0 for now
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1717 input = 0;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1718 break;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1719 default:
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1720 if (port->device.keyboard.read_pos == 0xFF) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1721 //we've run out of bytes
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1722 input = 0;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1723 } else if (port->device.keyboard.events[port->device.keyboard.read_pos] & 0xFF00) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1724 if (port->device.keyboard.tr_counter & 1) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1725 input = port->device.keyboard.events[port->device.keyboard.read_pos] >> 8 & 0xF;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1726 } else {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1727 input = port->device.keyboard.events[port->device.keyboard.read_pos] >> 12;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1728 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1729 } else {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1730 if (port->device.keyboard.tr_counter & 1) {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1731 input = port->device.keyboard.events[port->device.keyboard.read_pos] & 0xF;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1732 } else {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1733 input = port->device.keyboard.events[port->device.keyboard.read_pos] >> 4;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1734 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1735 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1736 break;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1737 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1738 } else {
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1739 input = 0xF;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1740 }
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1741 input |= ((port->device.keyboard.tr_counter & 1) == 0) << 4;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1742 }
1453
cd6e566eb6b9 Fix regression in XBAND keyboard support. Fixes ticket:33
Michael Pavone <pavone@retrodev.com>
parents: 1438
diff changeset
1743 //this is not strictly correct at all times, but good enough for now
cd6e566eb6b9 Fix regression in XBAND keyboard support. Fixes ticket:33
Michael Pavone <pavone@retrodev.com>
parents: 1438
diff changeset
1744 device_driven = 0x1F;
1232
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1745 break;
c0120977eeea Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents: 1208
diff changeset
1746 }
2235
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1747 case IO_SEGA_MULTI:
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1748 multitap_check_ready(port, current_cycle);
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1749 device_driven = 0x1F;
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1750 input = port->input[0];
93918a6a8ab7 Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents: 2028
diff changeset
1751 break;
2238
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1752 case IO_EA_MULTI_A:
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1753 device_driven = 0x3F;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1754 if (port->device.multitap.cur_port == EA_PASSTHRU_MODE) {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1755 input = io_data_read(port->device.multitap.ports, current_cycle);
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1756 } else if (port->device.multitap.cur_port < 4) {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1757 input = io_data_read(port->device.multitap.ports + port->device.multitap.cur_port, current_cycle);
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1758 } else {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1759 input = 0x3C;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1760 }
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1761 break;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1762 case IO_EA_MULTI_B: {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1763 io_port *main_port = port->device.multitap.ports;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1764 if (main_port->device.multitap.cur_port == EA_PASSTHRU_MODE) {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1765 input = io_data_read(main_port->device.multitap.ports + 1, current_cycle);
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1766 device_driven = 0x3F;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1767 } else {
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1768 input = 0;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1769 device_driven = 0;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1770 }
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1771 break;
0a107b2d5837 Add support for EA 4-way Play
Michael Pavone <pavone@retrodev.com>
parents: 2235
diff changeset
1772 }
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 722
diff changeset
1773 #ifndef _WIN32
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1774 case IO_SEGA_PARALLEL:
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1775 if (!th)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1776 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1777 service_pipe(port);
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1778 }
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1779 input = port->input[th ? IO_TH1 : IO_TH0];
1348
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1780 device_driven = 0x3F;
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1781 break;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1782 case IO_GENERIC:
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1783 if (port->input[IO_TH0] & 0x80 && port->input[IO_STATE] == IO_WRITTEN)
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1784 {
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1785 //device requested a blocking read after writes
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1786 port->input[IO_STATE] = IO_READ_PENDING;
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1787 }
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1788 service_socket(port);
897
b9564fb88a5a WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents: 888
diff changeset
1789 input = port->input[IO_TH0];
1348
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1790 device_driven = 0x7F;
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1791 break;
745
daa31ee7d8cd Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents: 722
diff changeset
1792 #endif
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1793 default:
1348
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1794 input = 0;
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1795 device_driven = 0;
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1796 break;
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1797 }
1348
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1798 uint8_t value = (input & (~control) & device_driven) | (port->output & control);
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1799 //deal with pins that are configured as inputs, but not being actively driven by the device
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1800 uint8_t floating = (~device_driven) & (~control);
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1801 if (floating) {
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1802 value |= get_output_value(port, current_cycle, SLOW_RISE_INPUT) & floating;
040c5600e2d9 Implemented slow rise time of IO pins set as inputs, but not driven by device. Fixes input in Decap Attack and possibly other games with buggy controller code
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
1803 }
645
d77c79cec800 Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents: 504
diff changeset
1804 /*if (port->input[GAMEPAD_TH0] || port->input[GAMEPAD_TH1]) {
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1805 printf ("value: %X\n", value);
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1806 }*/
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1807 return value;
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1808 }
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1809
2025
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1810 uint8_t io_rx_read(io_port * port, uint32_t current_cycle)
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1811 {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1812 io_run(port, current_cycle);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1813 port->serial_ctrl &= ~SCTRL_BIT_RX_READY;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1814 return port->serial_in;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1815 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1816
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1817 uint8_t io_sctrl_read(io_port *port, uint32_t current_cycle)
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1818 {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1819 io_run(port, current_cycle);
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1820 return port->serial_ctrl;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1821 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1822
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1823 uint32_t io_next_interrupt(io_port *port, uint32_t current_cycle)
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1824 {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1825 if (!(port->control & 0x80)) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1826 return CYCLE_NEVER;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1827 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1828 if (port->serial_ctrl & SCTRL_BIT_RX_INTEN) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1829 if (port->serial_ctrl & SCTRL_BIT_RX_READY) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1830 return current_cycle;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1831 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1832 if ((port->serial_ctrl & SCTRL_BIT_RX_ENABLE) && port->receive_end) {
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1833 return port->receive_end;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1834 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1835 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1836 //TODO: handle external interrupts from TH transitions
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1837 return CYCLE_NEVER;
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1838 }
e7a516f08cec Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents: 1792
diff changeset
1839
1427
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1840 void io_serialize(io_port *port, serialize_buffer *buf)
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1841 {
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1842 save_int8(buf, port->output);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1843 save_int8(buf, port->control);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1844 save_int8(buf, port->serial_out);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1845 save_int8(buf, port->serial_in);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1846 save_int8(buf, port->serial_ctrl);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1847 save_int8(buf, port->device_type);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1848 save_buffer32(buf, port->slow_rise_start, 8);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1849 switch (port->device_type)
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1850 {
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1851 case IO_GAMEPAD6:
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1852 save_int32(buf, port->device.pad.timeout_cycle);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1853 save_int16(buf, port->device.pad.th_counter);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1854 break;
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1855 case IO_MOUSE:
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1856 save_int32(buf, port->device.mouse.ready_cycle);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1857 save_int16(buf, port->device.mouse.last_read_x);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1858 save_int16(buf, port->device.mouse.last_read_y);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1859 save_int16(buf, port->device.mouse.latched_x);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1860 save_int16(buf, port->device.mouse.latched_y);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1861 save_int8(buf, port->device.mouse.tr_counter);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1862 break;
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1863 case IO_SATURN_KEYBOARD:
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1864 case IO_XBAND_KEYBOARD:
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1865 save_int8(buf, port->device.keyboard.tr_counter);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1866 if (port->device_type == IO_XBAND_KEYBOARD) {
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1867 save_int8(buf, port->device.keyboard.mode);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1868 save_int8(buf, port->device.keyboard.cmd);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1869 }
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1870 break;
2028
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1871 case IO_HEARTBEAT_TRAINER:
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1872 save_int8(buf, port->device.heartbeat_trainer.bpm);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1873 save_int8(buf, port->device.heartbeat_trainer.cadence);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1874 save_int8(buf, port->device.heartbeat_trainer.param);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1875 save_int8(buf, port->device.heartbeat_trainer.state);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1876 save_int8(buf, port->device.heartbeat_trainer.status);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1877 save_int8(buf, port->device.heartbeat_trainer.cmd);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1878 save_int8(buf, port->device.heartbeat_trainer.remaining_bytes);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1879 break;
1427
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1880 }
2028
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1881 save_int32(buf, port->serial_cycle);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1882 save_int32(buf, port->transmit_end);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1883 save_int32(buf, port->receive_end);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1884 save_int8(buf, port->serial_transmitting);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1885 save_int8(buf, port->serial_receiving);
1427
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1886 }
421
d0cacb4ade0b Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1887
1427
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1888 void io_deserialize(deserialize_buffer *buf, void *vport)
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1889 {
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1890 io_port *port = vport;
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1891 port->output = load_int8(buf);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1892 port->control = load_int8(buf);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1893 port->serial_out = load_int8(buf);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1894 port->serial_in = load_int8(buf);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1895 port->serial_ctrl = load_int8(buf);
2028
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1896 set_serial_clock(port);
1427
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1897 uint8_t device_type = load_int8(buf);
2028
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1898 load_buffer32(buf, port->slow_rise_start, 8);
1427
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1899 if (device_type != port->device_type) {
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1900 warning("Loaded save state has a different device type from the current configuration");
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1901 return;
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1902 }
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1903 switch (port->device_type)
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1904 {
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1905 case IO_GAMEPAD6:
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1906 port->device.pad.timeout_cycle = load_int32(buf);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1907 port->device.pad.th_counter = load_int16(buf);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1908 break;
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1909 case IO_MOUSE:
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1910 port->device.mouse.ready_cycle = load_int32(buf);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1911 port->device.mouse.last_read_x = load_int16(buf);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1912 port->device.mouse.last_read_y = load_int16(buf);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1913 port->device.mouse.latched_x = load_int16(buf);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1914 port->device.mouse.latched_y = load_int16(buf);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1915 port->device.mouse.tr_counter = load_int8(buf);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1916 break;
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1917 case IO_SATURN_KEYBOARD:
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1918 case IO_XBAND_KEYBOARD:
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1919 port->device.keyboard.tr_counter = load_int8(buf);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1920 if (port->device_type == IO_XBAND_KEYBOARD) {
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1921 port->device.keyboard.mode = load_int8(buf);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1922 port->device.keyboard.cmd = load_int8(buf);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1923 }
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1924 break;
2028
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1925 case IO_HEARTBEAT_TRAINER:
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1926 port->device.heartbeat_trainer.bpm = load_int8(buf);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1927 port->device.heartbeat_trainer.cadence = load_int8(buf);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1928 port->device.heartbeat_trainer.param = load_int8(buf);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1929 port->device.heartbeat_trainer.state = load_int8(buf);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1930 port->device.heartbeat_trainer.status = load_int8(buf);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1931 port->device.heartbeat_trainer.cmd = load_int8(buf);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1932 port->device.heartbeat_trainer.remaining_bytes = load_int8(buf);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1933 break;
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1934 }
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1935 if (buf->cur_pos < buf->size) {
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1936 port->serial_cycle = load_int32(buf);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1937 port->transmit_end = load_int32(buf);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1938 port->receive_end = load_int32(buf);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1939 port->serial_transmitting = load_int8(buf);
e597572f45ce Add new serial state, and Heartbeat Personal Trainer state to save state serialize/deserialize code and fix bug in IO deserialize implementation
Michael Pavone <pavone@retrodev.com>
parents: 2027
diff changeset
1940 port->serial_receiving = load_int8(buf);
1427
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1941 }
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1400
diff changeset
1942 }