Mercurial > repos > blastem
annotate io.c @ 2235:93918a6a8ab7
Initial support for Sega multi-tap
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 13 Sep 2022 20:08:26 -0700 |
parents | e597572f45ce |
children | 0a107b2d5837 |
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", |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
39 "EA 4-way Play cable A", |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
40 "EA 4-way Play cable B", |
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 |
1207
9d6f155732ed
Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents:
1202
diff
changeset
|
70 typedef struct { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
71 uint8_t states[2], value; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
72 } gp_button_def; |
937
9364dad5561a
Added reasonable handling of joystick hotplug
Michael Pavone <pavone@retrodev.com>
parents:
916
diff
changeset
|
73 |
897
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
74 |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
75 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
|
76 [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
|
77 [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
|
78 [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
|
79 [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
|
80 [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
|
81 [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
|
82 [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
|
83 [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
|
84 [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
|
85 [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
|
86 [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
|
87 [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
|
88 }; |
937
9364dad5561a
Added reasonable handling of joystick hotplug
Michael Pavone <pavone@retrodev.com>
parents:
916
diff
changeset
|
89 |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
90 static 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
|
91 { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
92 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
|
93 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
94 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
|
95 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
|
96 return port; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
97 } |
2027
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
98 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
|
99 return port; |
2235
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
100 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
101 if (port->device_type == IO_SEGA_MULTI) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
102 for (int j = 0; j < 4; j++) |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
103 { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
104 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
|
105 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
|
106 return tap_port; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
107 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
108 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
109 } |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
110 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
111 return NULL; |
1207
9d6f155732ed
Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents:
1202
diff
changeset
|
112 } |
9d6f155732ed
Basic support for mapping an analog axis to functionality
Michael Pavone <pavone@retrodev.com>
parents:
1202
diff
changeset
|
113 |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
114 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
|
115 { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
116 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
|
117 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
118 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
|
119 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
|
120 return port; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
121 } |
421
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
122 } |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
123 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
|
124 } |
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
125 |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
126 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
|
127 { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
128 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
|
129 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
130 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
|
131 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
|
132 return port; |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
133 } |
421
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
134 } |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
135 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
|
136 } |
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
137 |
1610 | 138 void io_port_gamepad_down(io_port *port, uint8_t button) |
139 { | |
140 gp_button_def *def = button_defs + button; | |
141 port->input[def->states[0]] |= def->value; | |
142 if (def->states[1] != GAMEPAD_NONE) { | |
143 port->input[def->states[1]] |= def->value; | |
144 } | |
145 } | |
146 | |
147 void io_port_gamepad_up(io_port *port, uint8_t button) | |
148 { | |
149 gp_button_def *def = button_defs + button; | |
150 port->input[def->states[0]] &= ~def->value; | |
151 if (def->states[1] != GAMEPAD_NONE) { | |
152 port->input[def->states[1]] &= ~def->value; | |
153 } | |
154 } | |
155 | |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
156 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
|
157 { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
158 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
|
159 if (port) { |
1610 | 160 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
|
161 } |
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
162 } |
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
163 |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
164 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
|
165 { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
166 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
|
167 if (port) { |
1610 | 168 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
|
169 } |
1194
1ad0ec7e3939
Make gamepad "semantic" mapping play nice with hotplug support
Michael Pavone <pavone@retrodev.com>
parents:
1187
diff
changeset
|
170 } |
1ad0ec7e3939
Make gamepad "semantic" mapping play nice with hotplug support
Michael Pavone <pavone@retrodev.com>
parents:
1187
diff
changeset
|
171 |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
172 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
|
173 { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
174 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
|
175 if (port) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
176 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
|
177 } |
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
178 } |
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
179 |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
180 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
|
181 { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
182 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
|
183 if (port) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
184 port->input[0] &= ~button; |
907
b5d35222047e
Mega mouse support is mostly done
Michael Pavone <pavone@retrodev.com>
parents:
903
diff
changeset
|
185 } |
421
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
186 } |
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
187 |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
188 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
|
189 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
190 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
|
191 if (port) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
192 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
|
193 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
|
194 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
195 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
196 |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
197 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
|
198 { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
199 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
|
200 if (port) { |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
201 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
|
202 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
|
203 } |
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
204 } |
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 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
|
207 { |
1028
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
208 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
|
209 //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
|
210 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
|
211 if (keyboard_port->device.keyboard.read_pos == 0xFF) { |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
212 //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
|
213 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
|
214 } |
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
|
215 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
|
216 } |
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
|
217 } |
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 |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
219 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
|
220 { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
221 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
|
222 } |
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
223 |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
224 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
|
225 { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
226 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
|
227 } |
2b132d894d76
Release capture of mouse and keyboard when entering UI
Michael Pavone <pavone@retrodev.com>
parents:
1549
diff
changeset
|
228 |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
229 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
|
230 { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
231 return find_keyboard(io) != NULL; |
431
440efd7d27a9
Read key bindings from config file
Mike Pavone <pavone@retrodev.com>
parents:
421
diff
changeset
|
232 } |
440efd7d27a9
Read key bindings from config file
Mike Pavone <pavone@retrodev.com>
parents:
421
diff
changeset
|
233 |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
234 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
|
235 { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
236 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
|
237 { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
238 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
|
239 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
|
240 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
|
241 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
|
242 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
243 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
244 |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
245 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
|
246 { |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
247 set_serial_clock(port); |
1595
360d5bab199f
Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents:
1583
diff
changeset
|
248 //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
|
249 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
|
250 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
251 return; |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
252 } |
2235
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
253 io_port *old_ports = NULL; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
254 if (port->device_type == IO_SEGA_MULTI) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
255 old_ports = port->device.multitap.ports; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
256 } |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
257 |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
258 const int gamepad_len = strlen("gamepad"); |
1783 | 259 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
|
260 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
261 if ( |
1146
3e24de8d8073
Add support for SMS controllers
Michael Pavone <pavone@retrodev.com>
parents:
1144
diff
changeset
|
262 (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
|
263 || 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
|
264 || 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
|
265 ) { |
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
|
266 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
|
267 } 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
|
268 port->device_type = IO_GAMEPAD3; |
1146
3e24de8d8073
Add support for SMS controllers
Michael Pavone <pavone@retrodev.com>
parents:
1144
diff
changeset
|
269 } else if (device_type[gamepad_len] == '2') { |
3e24de8d8073
Add support for SMS controllers
Michael Pavone <pavone@retrodev.com>
parents:
1144
diff
changeset
|
270 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
|
271 } else { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
272 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
|
273 } |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
274 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
|
275 } 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
|
276 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
|
277 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
|
278 port->device.heartbeat_trainer.device_num = device_type[strlen("heartbeat_trainer.")] - '0'; |
1783 | 279 } 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
|
280 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
|
281 port->device_type = IO_MOUSE; |
1783 | 282 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
|
283 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
|
284 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
|
285 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
|
286 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
|
287 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
|
288 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
|
289 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
|
290 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
|
291 } |
1028
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
292 } 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
|
293 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
|
294 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
|
295 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
|
296 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
|
297 } |
1232
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
298 } 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
|
299 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
|
300 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
|
301 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
|
302 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
|
303 } |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
304 } 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
|
305 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
|
306 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
|
307 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
|
308 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
|
309 } |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
310 } 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
|
311 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
|
312 port->device_type = IO_GENERIC; |
360d5bab199f
Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents:
1583
diff
changeset
|
313 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
|
314 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
|
315 } |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
316 } 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
|
317 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
|
318 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
|
319 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
|
320 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
|
321 } |
2235
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
322 } else if(startswith(device_type, "sega_multitap.")) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
323 if (port->device_type != IO_SEGA_MULTI) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
324 port->device_type = IO_SEGA_MULTI; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
325 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
|
326 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
|
327 if (!old_ports) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
328 port->device.multitap.tr_counter = 0; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
329 port->device.multitap.ready_cycle = CYCLE_NEVER; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
330 port->input[0] = 0x13; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
331 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
332 old_ports = NULL; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
333 } |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
334 } |
2235
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
335 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
|
336 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
337 |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
338 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
|
339 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
340 switch (i) |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
341 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
342 case 0: |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
343 return "1"; |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
344 case 1: |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
345 return "2"; |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
346 case 2: |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
347 return "EXT"; |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
348 default: |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
349 return "invalid"; |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
350 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
351 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
352 |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
353 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
|
354 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
|
355 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
356 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
|
357 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
358 |
1116
fe8c79f82c22
More cleanup in preparation for SMS/Mark III support
Michael Pavone <pavone@retrodev.com>
parents:
1111
diff
changeset
|
359 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
|
360 { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
361 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
|
362 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
|
363 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
|
364 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
|
365 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
|
366 |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
367 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
|
368 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
|
369 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
|
370 |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
371 uint8_t mouse_mode; |
1396
aca496957999
Only capture mouse if an emulated mouse is attached
Michael Pavone <pavone@retrodev.com>
parents:
1379
diff
changeset
|
372 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
|
373 if (render_fullscreen()) { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
374 mouse_mode = MOUSE_RELATIVE; |
1396
aca496957999
Only capture mouse if an emulated mouse is attached
Michael Pavone <pavone@retrodev.com>
parents:
1379
diff
changeset
|
375 } else { |
aca496957999
Only capture mouse if an emulated mouse is attached
Michael Pavone <pavone@retrodev.com>
parents:
1379
diff
changeset
|
376 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
|
377 mouse_mode = MOUSE_ABSOLUTE; |
1396
aca496957999
Only capture mouse if an emulated mouse is attached
Michael Pavone <pavone@retrodev.com>
parents:
1379
diff
changeset
|
378 } else { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
379 mouse_mode = MOUSE_CAPTURE; |
1396
aca496957999
Only capture mouse if an emulated mouse is attached
Michael Pavone <pavone@retrodev.com>
parents:
1379
diff
changeset
|
380 } |
aca496957999
Only capture mouse if an emulated mouse is attached
Michael Pavone <pavone@retrodev.com>
parents:
1379
diff
changeset
|
381 } |
916
20c464dbae8f
Finished implementation of mouse capture mode
Michael Pavone <pavone@retrodev.com>
parents:
915
diff
changeset
|
382 } else { |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
383 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
|
384 } |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
385 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
|
386 |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
387 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
|
388 { |
745
daa31ee7d8cd
Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents:
722
diff
changeset
|
389 #ifndef _WIN32 |
1595
360d5bab199f
Update controller config when changed in UI without restart
Michael Pavone <pavone@retrodev.com>
parents:
1583
diff
changeset
|
390 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
|
391 { |
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
|
392 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
|
393 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
|
394 { |
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
|
395 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
|
396 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
|
397 } 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
|
398 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
|
399 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
|
400 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
401 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
|
402 } else { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
403 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
|
404 { |
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
|
405 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
|
406 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
|
407 } else { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
408 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
|
409 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
|
410 { |
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
|
411 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
|
412 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
|
413 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
414 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
415 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
416 } |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
417 } 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
|
418 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
|
419 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
|
420 { |
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
|
421 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
|
422 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
|
423 } 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
|
424 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
|
425 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
|
426 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
|
427 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
|
428 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
|
429 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
|
430 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
|
431 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
|
432 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
|
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 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
|
435 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
|
436 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
437 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
|
438 { |
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
|
439 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
|
440 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
|
441 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
442 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
|
443 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
|
444 continue; |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
445 cleanup_sockfile: |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
446 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
|
447 cleanup_sock: |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
448 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
|
449 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
|
450 } |
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
|
451 } else |
745
daa31ee7d8cd
Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents:
722
diff
changeset
|
452 #endif |
1146
3e24de8d8073
Add support for SMS controllers
Michael Pavone <pavone@retrodev.com>
parents:
1144
diff
changeset
|
453 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
|
454 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
|
455 } 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
|
456 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
|
457 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
|
458 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
|
459 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
|
460 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
|
461 { |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
462 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
|
463 break; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
464 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
465 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
466 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
|
467 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
|
468 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
|
469 } else { |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
470 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
|
471 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
|
472 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
|
473 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
|
474 + 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
|
475 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
|
476 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
|
477 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
478 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
|
479 } 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
|
480 char path[] = "io\0sega_multitap.1\0"; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
481 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
|
482 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
|
483 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
|
484 for (int j = 0; j < 4; j++) |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
485 { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
486 char port_num[] = {'1' + j, 0, 0}; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
487 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
|
488 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
|
489 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
|
490 if (ports[i].control & ports[i].output & 0x40) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
491 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
|
492 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
|
493 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
494 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
495 |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
496 } 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
|
497 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
|
498 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
499 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
500 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
501 |
421
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
502 |
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
503 #define TH 0x40 |
897
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
504 #define TR 0x20 |
2235
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
505 #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
|
506 #define TH_TIMEOUT 56000 |
2235
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
507 #define SLOW_RISE_DEVICE (30*7) |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
508 #define SLOW_RISE_INPUT (12*7) |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
509 |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
510 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
|
511 { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
512 uint8_t output = (port->control | 0x80) & port->output; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
513 for (int i = 0; i < 8; i++) |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
514 { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
515 if (!(port->control & 1 << i)) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
516 if (port->slow_rise_start[i] != CYCLE_NEVER) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
517 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
|
518 output |= 1 << i; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
519 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
520 } else { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
521 output |= 1 << i; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
522 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
523 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
524 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
525 return output; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
526 } |
421
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
527 |
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
|
528 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
|
529 { |
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
|
530 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
|
531 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
|
532 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
|
533 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
|
534 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
|
535 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
|
536 /* 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
|
537 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
|
538 //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
|
539 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
|
540 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
|
541 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
|
542 } |
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
|
543 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
|
544 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
|
545 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
|
546 } |
1583
430dd12e4010
Refactor to split device bindings from IO emulation code
Michael Pavone <pavone@retrodev.com>
parents:
1576
diff
changeset
|
547 }*/ |
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
|
548 } |
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
|
549 } |
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
|
550 } |
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
|
551 |
2235
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
552 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
|
553 { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
554 if (current_cycle >= port->device.multitap.ready_cycle) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
555 if (port->device.multitap.reset_state) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
556 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
|
557 if (output & TR) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
558 port->input[0] |= TL; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
559 port->device.multitap.reset_state = 0; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
560 } else { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
561 port->input[0] &= TR; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
562 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
563 port->device.multitap.ready_cycle = CYCLE_NEVER; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
564 return; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
565 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
566 port->device.multitap.tr_counter++; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
567 port->device.multitap.ready_cycle = CYCLE_NEVER; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
568 switch (port->device.multitap.tr_counter) |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
569 { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
570 case 1: |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
571 for (int i = 0; i < 4; i++) |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
572 { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
573 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
|
574 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
|
575 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
|
576 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
|
577 id = (id & 0xA) | (id << 1 & 0xA); |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
578 id |= (value & 0x5) | (value >> 1 & 0x5); |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
579 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
|
580 if (id == 0xD || id == 0xC) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
581 port->device.multitap.data[i] = pad_data; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
582 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
|
583 } else if (id == 0x3) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
584 //set TR to output for mouse |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
585 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
|
586 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
587 port->device.multitap.device_ids[i] = id; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
588 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
589 port->input[0] = 0; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
590 break; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
591 case 2: |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
592 for (int i = 0; i < 4; i++) |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
593 { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
594 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
|
595 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
|
596 } 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
|
597 //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
|
598 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
|
599 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
600 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
601 port->input[0] = 0x10; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
602 break; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
603 case 3: |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
604 for (int i = 0; i < 4; i++) |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
605 { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
606 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
|
607 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
|
608 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
|
609 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
|
610 if (value & 0xF) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
611 //3 button |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
612 port->device.multitap.device_ids[i] = 0; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
613 } else { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
614 port->device.multitap.device_ids[i] = 1; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
615 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
616 } 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
|
617 //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
|
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 port->device.multitap.device_ids[i] = 2; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
620 } else { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
621 port->device.multitap.device_ids[i] = 0xF; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
622 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
623 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
624 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
|
625 break; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
626 case 4: |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
627 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
|
628 break; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
629 case 5: |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
630 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
|
631 break; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
632 case 6: |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
633 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
|
634 port->device.multitap.cur_port = 0; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
635 port->device.multitap.port_start = 7; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
636 break; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
637 default: { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
638 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
|
639 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
|
640 for (;;) |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
641 { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
642 if (port->device.multitap.cur_port > 3) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
643 return; |
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 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
|
646 { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
647 case 0: |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
648 if (tr_diff) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
649 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
|
650 port->device.multitap.cur_port++; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
651 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
|
652 } else { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
653 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
|
654 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
655 return; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
656 case 1: |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
657 if (tr_diff == 2) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
658 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
|
659 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
|
660 //finish 6-button cycle |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
661 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
|
662 port->device.multitap.cur_port++; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
663 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
|
664 } else if (tr_diff) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
665 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
|
666 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
|
667 } else { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
668 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
|
669 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
670 return; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
671 case 2: { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
672 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
|
673 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
|
674 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
|
675 if (tr_diff == 5) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
676 port->device.multitap.cur_port++; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
677 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
|
678 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
679 return; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
680 } |
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->device.multitap.cur_port++; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
683 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
|
684 } |
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 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
687 } |
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 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
690 |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
691 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
|
692 { |
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
693 /*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
|
694 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
|
695 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
|
696 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
|
697 }*/ |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
698 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
|
699 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
700 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
|
701 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
702 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
|
703 } else { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
704 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
|
705 } |
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
|
706 } 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
|
707 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
|
708 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
|
709 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
|
710 } |
2235
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
711 } else if (port->device_type == IO_SEGA_MULTI) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
712 multitap_check_ready(port, current_cycle); |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
713 if (port->device.multitap.ready_cycle != CYCLE_NEVER) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
714 port->device.multitap.ready_cycle -= deduction; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
715 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
716 for (int i = 0; i < 4; i++) |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
717 { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
718 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
|
719 } |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
720 } |
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
|
721 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
|
722 { |
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
|
723 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
|
724 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
|
725 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
|
726 } 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
|
727 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
|
728 } |
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
|
729 } |
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
|
730 } |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
731 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
|
732 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
|
733 } else { |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
734 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
|
735 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
736 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
|
737 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
|
738 } else { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
739 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
|
740 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
741 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
|
742 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
|
743 } else { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
744 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
|
745 } |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
746 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
747 |
745
daa31ee7d8cd
Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents:
722
diff
changeset
|
748 #ifndef _WIN32 |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
749 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
|
750 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
751 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
|
752 { |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
753 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
|
754 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
|
755 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
|
756 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
757 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
758 |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
759 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
|
760 { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
761 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
|
762 { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
763 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
|
764 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
|
765 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
|
766 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
|
767 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
|
768 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
769 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
770 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
771 |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
772 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
|
773 { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
774 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
|
775 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
|
776 { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
777 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
|
778 if (sent < 0) { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
779 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
|
780 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
|
781 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
|
782 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
|
783 } |
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 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
|
786 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
787 |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
788 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
|
789 { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
790 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
|
791 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
|
792 return; |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
793 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
794 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
|
795 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
|
796 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
|
797 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
|
798 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
799 if (read > 0) { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
800 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
|
801 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
802 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
803 |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
804 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
|
805 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
806 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
|
807 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
|
808 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
|
809 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
810 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
|
811 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
|
812 } 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
|
813 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
|
814 } |
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
815 } |
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
816 |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
817 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
|
818 { |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
819 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
|
820 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
|
821 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
|
822 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
|
823 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
824 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
|
825 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
|
826 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
827 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
|
828 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
|
829 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
830 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
|
831 if (blocking) |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
832 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
833 //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
|
834 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
|
835 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
836 } 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
|
837 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
|
838 } |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
839 } 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
|
840 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
|
841 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
|
842 } 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
|
843 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
|
844 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
|
845 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
|
846 } 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
|
847 //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
|
848 if (!blocking) |
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 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
|
851 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
|
852 } |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
853 } else { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
854 //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
|
855 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
|
856 } |
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
857 } |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
858 |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
859 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
|
860 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
861 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
|
862 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
|
863 blocking = 0; |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
864 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
|
865 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
866 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
|
867 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
|
868 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
869 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
|
870 if (blocking) |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
871 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
872 //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
|
873 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
|
874 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
875 } 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
|
876 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
|
877 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
|
878 } 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
|
879 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
|
880 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
|
881 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
|
882 } else { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
883 //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
|
884 if (!blocking) |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
885 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
886 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
|
887 blocking = 1; |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
888 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
889 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
890 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
891 } |
421
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
892 } |
745
daa31ee7d8cd
Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents:
722
diff
changeset
|
893 #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
|
894 |
2027
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
895 enum { |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
896 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
|
897 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
|
898 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
|
899 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
|
900 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
|
901 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
|
902 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
|
903 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
|
904 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
|
905 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
|
906 }; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
907 |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
908 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
|
909 { |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
910 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
|
911 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
|
912 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
|
913 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
914 |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
915 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
|
916 { |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
917 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
|
918 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
|
919 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
920 |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
921 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
|
922 { |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
923 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
|
924 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
|
925 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
|
926 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
927 |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
928 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
|
929 { |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
930 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
|
931 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
|
932 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
|
933 { |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
934 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
|
935 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
|
936 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
937 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
|
938 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
|
939 //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
|
940 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
|
941 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
942 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
|
943 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
|
944 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
945 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
946 |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
947 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
|
948 { |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
949 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
|
950 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
|
951 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
|
952 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
|
953 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
|
954 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
955 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
956 } |
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 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
|
959 { |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
960 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
|
961 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
|
962 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
963 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
|
964 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
|
965 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
966 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
|
967 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
|
968 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
969 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
|
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 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
|
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 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
|
975 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
|
976 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
|
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 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
|
979 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
|
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 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
|
982 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
983 |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
984 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
|
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 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
|
987 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
|
988 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
|
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 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
|
991 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
|
992 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
|
993 { |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
994 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
|
995 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
|
996 break; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
997 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
|
998 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
|
999 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
|
1000 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
|
1001 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
|
1002 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1003 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
|
1004 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
|
1005 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
|
1006 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
|
1007 } 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
|
1008 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
|
1009 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
|
1010 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1011 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
|
1012 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
|
1013 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
|
1014 } 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
|
1015 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
|
1016 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
|
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 |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1019 break; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1020 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
|
1021 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
|
1022 //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
|
1023 //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
|
1024 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
|
1025 break; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1026 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
|
1027 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
|
1028 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
|
1029 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
|
1030 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
|
1031 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
|
1032 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
|
1033 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
|
1034 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
|
1035 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1036 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
|
1037 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
|
1038 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
|
1039 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
|
1040 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
|
1041 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
|
1042 delta++; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1043 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1044 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
|
1045 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
|
1046 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
|
1047 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
|
1048 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
|
1049 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
|
1050 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
|
1051 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
|
1052 year++; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1053 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1054 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
|
1055 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1056 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
|
1057 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
|
1058 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1059 } |
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("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
|
1061 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
|
1062 break; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1063 } |
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_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
|
1065 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
|
1066 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
|
1067 break; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1068 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
|
1069 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
|
1070 break; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1071 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
|
1072 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
|
1073 break; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1074 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
|
1075 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
|
1076 break; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1077 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
|
1078 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
|
1079 break; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1080 default: |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1081 // 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
|
1082 // 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
|
1083 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
|
1084 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1085 break; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1086 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
|
1087 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
|
1088 *(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
|
1089 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1090 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
|
1091 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
|
1092 { |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1093 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
|
1094 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
|
1095 if ( |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1096 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
|
1097 && 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
|
1098 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
|
1099 break; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1100 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1101 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
|
1102 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
|
1103 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
|
1104 ? 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
|
1105 + 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
|
1106 : NULL; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1107 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
|
1108 return; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1109 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1110 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
|
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_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
|
1113 //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
|
1114 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
|
1115 { |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1116 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
|
1117 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1118 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
|
1119 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
|
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_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
|
1122 memset( |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1123 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
|
1124 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
|
1125 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
|
1126 ); |
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, 1); |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1128 break; |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1129 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
|
1130 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
|
1131 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
|
1132 break; |
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 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1135 } |
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 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
|
1138 } |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1139 |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1140 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
|
1141 { |
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1142 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
|
1143 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
|
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 |
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
|
1146 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
|
1147 |
1232
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1148 enum { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1149 KB_SETUP, |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1150 KB_READ, |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1151 KB_WRITE |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1152 }; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1153 |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1154 enum { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1155 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
|
1156 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
|
1157 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
|
1158 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
|
1159 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
|
1160 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
|
1161 }; |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1162 |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1163 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
|
1164 { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1165 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
|
1166 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
|
1167 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
|
1168 |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1169 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
|
1170 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
|
1171 { |
2027
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1172 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
|
1173 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
|
1174 break; |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1175 #ifndef _WIN32 |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1176 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
|
1177 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
|
1178 break; |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1179 #endif |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1180 //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
|
1181 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1182 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1183 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1184 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
|
1185 //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
|
1186 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
|
1187 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
|
1188 //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
|
1189 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
|
1190 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1191 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
|
1192 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
|
1193 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
|
1194 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
|
1195 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
|
1196 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
|
1197 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1198 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
|
1199 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
|
1200 { |
2027
0f54a898db03
Implement Heartbeat Personal Trainer peripheral and add ROM DB entry for Outback Joey
Michael Pavone <pavone@retrodev.com>
parents:
2025
diff
changeset
|
1201 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
|
1202 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
|
1203 break; |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1204 #ifndef _WIN32 |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1205 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
|
1206 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
|
1207 break; |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1208 #endif |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1209 //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
|
1210 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1211 } |
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 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1214 |
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
|
1215 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
|
1216 { |
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
|
1217 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
|
1218 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
|
1219 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
|
1220 { |
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
|
1221 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
|
1222 //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
|
1223 //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
|
1224 //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
|
1225 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
|
1226 } 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
|
1227 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
|
1228 } |
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
|
1229 } |
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
|
1230 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
|
1231 } |
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
|
1232 } |
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
|
1233 |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1234 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
|
1235 { |
2235
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1236 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
|
1237 port->output = value; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1238 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
|
1239 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
|
1240 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1241 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
|
1242 //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
|
1243 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
|
1244 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
|
1245 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
|
1246 } |
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
|
1247 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
|
1248 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
|
1249 } |
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
|
1250 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
|
1251 } |
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
|
1252 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
|
1253 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
|
1254 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
|
1255 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
|
1256 //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
|
1257 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
|
1258 //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
|
1259 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
|
1260 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
|
1261 } |
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
|
1262 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
|
1263 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
|
1264 } 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
|
1265 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
|
1266 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
|
1267 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
|
1268 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1269 } |
897
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1270 break; |
1028
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1271 case IO_SATURN_KEYBOARD: |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1272 if (output & TH) { |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1273 //request is over |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1274 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
|
1275 //remove scan code from buffer |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1276 port->device.keyboard.read_pos++; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1277 port->device.keyboard.read_pos &= 7; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1278 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
|
1279 port->device.keyboard.read_pos = 0xFF; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1280 } |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1281 } |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1282 port->device.keyboard.tr_counter = 0; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1283 } else { |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1284 if ((output & TR) != (old_output & TR)) { |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1285 port->device.keyboard.tr_counter++; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1286 } |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1287 } |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1288 break; |
1232
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1289 case IO_XBAND_KEYBOARD: |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1290 if (output & TH) { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1291 //request is over |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1292 if ( |
1257
db28178bd2a1
Fix removal of scan codes from buffer in XBAND keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1256
diff
changeset
|
1293 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
|
1294 && (port->device.keyboard.tr_counter & 1) |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1295 ) { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1296 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
|
1297 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
|
1298 } else { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1299 port->device.keyboard.read_pos++; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1300 port->device.keyboard.read_pos &= 7; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1301 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
|
1302 port->device.keyboard.read_pos = 0xFF; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1303 } |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1304 } |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1305 } |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1306 port->device.keyboard.tr_counter = 0; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1307 port->device.keyboard.mode = KB_SETUP; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1308 } else { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1309 if ((output & TR) != (old_output & TR)) { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1310 port->device.keyboard.tr_counter++; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1311 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
|
1312 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
|
1313 } 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
|
1314 switch (port->device.keyboard.tr_counter) |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1315 { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1316 case 3: |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1317 //host writes 0b0001 |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1318 break; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1319 case 4: |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1320 //host writes 0b0000 |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1321 break; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1322 case 5: |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1323 //host writes 0b0000 |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1324 break; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1325 case 6: |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1326 port->device.keyboard.cmd = output << 4; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1327 break; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1328 case 7: |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1329 port->device.keyboard.cmd |= output & 0xF; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1330 //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
|
1331 break; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1332 } |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1333 } else if ( |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1334 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
|
1335 && !(port->device.keyboard.tr_counter & 1) |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1336 ) { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1337 |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1338 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
|
1339 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
|
1340 } else { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1341 port->device.keyboard.read_pos++; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1342 port->device.keyboard.read_pos &= 7; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1343 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
|
1344 port->device.keyboard.read_pos = 0xFF; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1345 } |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1346 } |
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 break; |
2235
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1351 case IO_SEGA_MULTI: |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1352 multitap_check_ready(port, current_cycle); |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1353 if (output & TH) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1354 //request is over |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1355 port->device.multitap.tr_counter = 0; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1356 if ((output & TR) != (old_output & TR)) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1357 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
|
1358 port->device.multitap.reset_state = 1; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1359 } else if (!port->device.multitap.reset_state) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1360 port->device.multitap.ready_cycle = CYCLE_NEVER; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1361 port->input[0] = 0x13; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1362 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1363 for (int i = 0; i < 4; i++) |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1364 { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1365 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
|
1366 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
|
1367 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1368 } else { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1369 if (old_output & TH) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1370 port->input[0] = 0x1F; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1371 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1372 if ((output & TR) != (old_output & TR)) { |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1373 //TODO: measure actual delays |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1374 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
|
1375 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1376 } |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1377 break; |
745
daa31ee7d8cd
Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents:
722
diff
changeset
|
1378 #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
|
1379 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
|
1380 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
|
1381 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
|
1382 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
|
1383 break; |
745
daa31ee7d8cd
Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents:
722
diff
changeset
|
1384 #endif |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1385 } |
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
|
1386 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
|
1387 |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1388 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1389 |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1390 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
|
1391 { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1392 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
|
1393 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
|
1394 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
|
1395 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1396 |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1397 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
|
1398 { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1399 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
|
1400 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
|
1401 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
|
1402 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1403 |
1232
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1404 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
|
1405 { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1406 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
|
1407 return 0; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1408 } |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1409 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
|
1410 do { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1411 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
|
1412 read_pos++; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1413 read_pos &= 7; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1414 } 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
|
1415 |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1416 return bytes; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1417 } |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1418 |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1419 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
|
1420 { |
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
|
1421 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
|
1422 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
|
1423 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
|
1424 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
|
1425 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
|
1426 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
|
1427 process_events(); |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1428 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
|
1429 } |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1430 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
|
1431 { |
1146
3e24de8d8073
Add support for SMS controllers
Michael Pavone <pavone@retrodev.com>
parents:
1144
diff
changeset
|
1432 case IO_GAMEPAD2: |
3e24de8d8073
Add support for SMS controllers
Michael Pavone <pavone@retrodev.com>
parents:
1144
diff
changeset
|
1433 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
|
1434 device_driven = 0x3F; |
1146
3e24de8d8073
Add support for SMS controllers
Michael Pavone <pavone@retrodev.com>
parents:
1144
diff
changeset
|
1435 break; |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1436 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
|
1437 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1438 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
|
1439 if (!th) { |
bc127fa1f800
Fix Mega Drive peripheral ID for 3-button pad
Michael Pavone <pavone@retrodev.com>
parents:
886
diff
changeset
|
1440 input |= 0xC; |
bc127fa1f800
Fix Mega Drive peripheral ID for 3-button pad
Michael Pavone <pavone@retrodev.com>
parents:
886
diff
changeset
|
1441 } |
897
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1442 //controller output is logically inverted |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1443 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
|
1444 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
|
1445 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
|
1446 } |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1447 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
|
1448 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1449 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
|
1450 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
|
1451 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1452 /*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
|
1453 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
|
1454 }*/ |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1455 if (th) { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1456 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
|
1457 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
|
1458 } else { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1459 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
|
1460 } |
421
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1461 } 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
|
1462 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
|
1463 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
|
1464 } 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
|
1465 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
|
1466 } else { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1467 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
|
1468 } |
421
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1469 } |
897
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1470 //controller output is logically inverted |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1471 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
|
1472 device_driven = 0x3F; |
897
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1473 break; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1474 } |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1475 case IO_MOUSE: |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1476 { |
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
|
1477 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
|
1478 uint8_t tr = output & TR; |
897
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1479 if (th) { |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1480 if (tr) { |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1481 input = 0x10; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1482 } else { |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1483 input = 0; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1484 } |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1485 } else { |
913
a5a51465f8b0
Allow IO device config to be overriden by ROM DB
Michael Pavone <pavone@retrodev.com>
parents:
912
diff
changeset
|
1486 |
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
|
1487 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
|
1488 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
|
1489 switch (port->device.mouse.tr_counter) |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1490 { |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1491 case 0: |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1492 input = 0xB; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1493 break; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1494 case 1: |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1495 case 2: |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1496 input = 0xF; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1497 break; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1498 case 3: |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1499 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
|
1500 if (delta_y > 255 || delta_y < -255) { |
897
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1501 input |= 8; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1502 } |
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
|
1503 if (delta_x > 255 || delta_x < -255) { |
897
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1504 input |= 4; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1505 } |
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
|
1506 if (delta_y < 0) { |
897
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1507 input |= 2; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1508 } |
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
|
1509 if (delta_x < 0) { |
897
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1510 input |= 1; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1511 } |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1512 break; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1513 case 4: |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1514 input = port->input[0]; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1515 break; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1516 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
|
1517 input = delta_x >> 4 & 0xF; |
897
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1518 break; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1519 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
|
1520 input = delta_x & 0xF; |
897
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1521 break; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1522 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
|
1523 input = delta_y >> 4 & 0xF; |
897
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1524 break; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1525 case 8: |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1526 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
|
1527 input = delta_y & 0xF; |
897
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1528 break; |
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1529 } |
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
|
1530 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
|
1531 } |
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
|
1532 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
|
1533 break; |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1534 } |
1028
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1535 case IO_SATURN_KEYBOARD: |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1536 { |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1537 if (th) { |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1538 input = 0x11; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1539 } else { |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1540 uint8_t tr = output & TR; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1541 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
|
1542 : 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
|
1543 switch (port->device.keyboard.tr_counter) |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1544 { |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1545 case 0: |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1546 input = 1; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1547 break; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1548 case 1: |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1549 //Saturn peripheral ID |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1550 input = 3; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1551 break; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1552 case 2: |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1553 //data size |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1554 input = 4; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1555 break; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1556 case 3: |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1557 //d-pad |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1558 //TODO: set these based on keyboard state |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1559 input = 0xF; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1560 break; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1561 case 4: |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1562 //Start ABC |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1563 //TODO: set these based on keyboard state |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1564 input = 0xF; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1565 break; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1566 case 5: |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1567 //R XYZ |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1568 //TODO: set these based on keyboard state |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1569 input = 0xF; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1570 break; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1571 case 6: |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1572 //L and KBID |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1573 //TODO: set L based on keyboard state |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1574 input = 0x8; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1575 break; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1576 case 7: |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1577 //Capslock, Numlock, Scrolllock |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1578 //TODO: set these based on keyboard state |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1579 input = 0; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1580 break; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1581 case 8: |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1582 input = 6; |
1232
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1583 if (code & 0xFF00) { |
1028
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1584 //break |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1585 input |= 1; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1586 } else if (code) { |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1587 input |= 8; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1588 } |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1589 break; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1590 case 9: |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1591 input = code >> 4 & 0xF; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1592 break; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1593 case 10: |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1594 input = code & 0xF; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1595 break; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1596 case 11: |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1597 input = 0; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1598 break; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1599 default: |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1600 input = 1; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1601 break; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1602 } |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1603 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
|
1604 } |
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
|
1605 device_driven = 0x1F; |
1028
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1606 break; |
56b1748a8473
Initial stab at Saturn keyboard support
Michael Pavone <pavone@retrodev.com>
parents:
1026
diff
changeset
|
1607 } |
1232
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1608 case IO_XBAND_KEYBOARD: |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1609 { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1610 if (th) { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1611 input = 0x1C; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1612 } else { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1613 uint8_t size; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1614 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
|
1615 switch (port->device.keyboard.tr_counter) |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1616 { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1617 case 0: |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1618 input = 0x3; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1619 break; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1620 case 1: |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1621 input = 0x6; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1622 break; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1623 case 2: |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1624 //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
|
1625 //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
|
1626 //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
|
1627 input = 0x9; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1628 break; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1629 case 3: |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1630 size = get_scancode_bytes(port); |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1631 if (size) { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1632 ++size; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1633 } |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1634 if (size > 15) { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1635 size = 15; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1636 } |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1637 input = size; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1638 break; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1639 case 4: |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1640 case 5: |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1641 //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
|
1642 input = 0; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1643 break; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1644 default: |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1645 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
|
1646 //we've run out of bytes |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1647 input = 0; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1648 } 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
|
1649 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
|
1650 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
|
1651 } else { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1652 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
|
1653 } |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1654 } else { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1655 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
|
1656 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
|
1657 } else { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1658 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
|
1659 } |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1660 } |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1661 break; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1662 } |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1663 } else { |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1664 input = 0xF; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1665 } |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1666 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
|
1667 } |
1453
cd6e566eb6b9
Fix regression in XBAND keyboard support. Fixes ticket:33
Michael Pavone <pavone@retrodev.com>
parents:
1438
diff
changeset
|
1668 //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
|
1669 device_driven = 0x1F; |
1232
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1670 break; |
c0120977eeea
Initial implementation of the XBAND "Eric Smith" keyboard
Michael Pavone <pavone@retrodev.com>
parents:
1208
diff
changeset
|
1671 } |
2235
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1672 case IO_SEGA_MULTI: |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1673 multitap_check_ready(port, current_cycle); |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1674 device_driven = 0x1F; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1675 input = port->input[0]; |
93918a6a8ab7
Initial support for Sega multi-tap
Michael Pavone <pavone@retrodev.com>
parents:
2028
diff
changeset
|
1676 break; |
745
daa31ee7d8cd
Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents:
722
diff
changeset
|
1677 #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
|
1678 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
|
1679 if (!th) |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1680 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1681 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
|
1682 } |
897
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1683 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
|
1684 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
|
1685 break; |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1686 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
|
1687 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
|
1688 { |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1689 //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
|
1690 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
|
1691 } |
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1692 service_socket(port); |
897
b9564fb88a5a
WIP support for mega mouse
Michael Pavone <pavone@retrodev.com>
parents:
888
diff
changeset
|
1693 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
|
1694 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
|
1695 break; |
745
daa31ee7d8cd
Get windows build compiling again post-merge
Michael Pavone <pavone@retrodev.com>
parents:
722
diff
changeset
|
1696 #endif |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1697 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
|
1698 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
|
1699 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
|
1700 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
|
1701 } |
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
|
1702 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
|
1703 //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
|
1704 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
|
1705 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
|
1706 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
|
1707 } |
645
d77c79cec800
Initial support for configurable IO, custom IO and sega transfer board emulation
Michael Pavone <pavone@retrodev.com>
parents:
504
diff
changeset
|
1708 /*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
|
1709 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
|
1710 }*/ |
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1711 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
|
1712 } |
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1713 |
2025
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1714 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
|
1715 { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1716 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
|
1717 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
|
1718 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
|
1719 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1720 |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1721 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
|
1722 { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1723 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
|
1724 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
|
1725 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1726 |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1727 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
|
1728 { |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1729 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
|
1730 return CYCLE_NEVER; |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1731 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1732 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
|
1733 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
|
1734 return current_cycle; |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1735 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1736 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
|
1737 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
|
1738 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1739 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1740 //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
|
1741 return CYCLE_NEVER; |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1742 } |
e7a516f08cec
Implement serial IO, a generic serial device type and external interrupts
Michael Pavone <pavone@retrodev.com>
parents:
1792
diff
changeset
|
1743 |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1744 void io_serialize(io_port *port, serialize_buffer *buf) |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1745 { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1746 save_int8(buf, port->output); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1747 save_int8(buf, port->control); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1748 save_int8(buf, port->serial_out); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1749 save_int8(buf, port->serial_in); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1750 save_int8(buf, port->serial_ctrl); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1751 save_int8(buf, port->device_type); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1752 save_buffer32(buf, port->slow_rise_start, 8); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1753 switch (port->device_type) |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1754 { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1755 case IO_GAMEPAD6: |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1756 save_int32(buf, port->device.pad.timeout_cycle); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1757 save_int16(buf, port->device.pad.th_counter); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1758 break; |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1759 case IO_MOUSE: |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1760 save_int32(buf, port->device.mouse.ready_cycle); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1761 save_int16(buf, port->device.mouse.last_read_x); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1762 save_int16(buf, port->device.mouse.last_read_y); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1763 save_int16(buf, port->device.mouse.latched_x); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1764 save_int16(buf, port->device.mouse.latched_y); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1765 save_int8(buf, port->device.mouse.tr_counter); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1766 break; |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1767 case IO_SATURN_KEYBOARD: |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1768 case IO_XBAND_KEYBOARD: |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1769 save_int8(buf, port->device.keyboard.tr_counter); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1770 if (port->device_type == IO_XBAND_KEYBOARD) { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1771 save_int8(buf, port->device.keyboard.mode); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1772 save_int8(buf, port->device.keyboard.cmd); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1773 } |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1774 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
|
1775 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
|
1776 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
|
1777 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
|
1778 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
|
1779 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
|
1780 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
|
1781 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
|
1782 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
|
1783 break; |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1784 } |
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
|
1785 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
|
1786 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
|
1787 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
|
1788 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
|
1789 save_int8(buf, port->serial_receiving); |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1790 } |
421
d0cacb4ade0b
Move IO code to a separate file and do a tiny bit of refactoring
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1791 |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1792 void io_deserialize(deserialize_buffer *buf, void *vport) |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1793 { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1794 io_port *port = vport; |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1795 port->output = load_int8(buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1796 port->control = load_int8(buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1797 port->serial_out = load_int8(buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1798 port->serial_in = load_int8(buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1799 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
|
1800 set_serial_clock(port); |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1801 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
|
1802 load_buffer32(buf, port->slow_rise_start, 8); |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1803 if (device_type != port->device_type) { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1804 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
|
1805 return; |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1806 } |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1807 switch (port->device_type) |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1808 { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1809 case IO_GAMEPAD6: |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1810 port->device.pad.timeout_cycle = load_int32(buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1811 port->device.pad.th_counter = load_int16(buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1812 break; |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1813 case IO_MOUSE: |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1814 port->device.mouse.ready_cycle = load_int32(buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1815 port->device.mouse.last_read_x = load_int16(buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1816 port->device.mouse.last_read_y = load_int16(buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1817 port->device.mouse.latched_x = load_int16(buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1818 port->device.mouse.latched_y = load_int16(buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1819 port->device.mouse.tr_counter = load_int8(buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1820 break; |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1821 case IO_SATURN_KEYBOARD: |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1822 case IO_XBAND_KEYBOARD: |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1823 port->device.keyboard.tr_counter = load_int8(buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1824 if (port->device_type == IO_XBAND_KEYBOARD) { |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1825 port->device.keyboard.mode = load_int8(buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1826 port->device.keyboard.cmd = load_int8(buf); |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1827 } |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1828 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
|
1829 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
|
1830 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
|
1831 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
|
1832 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
|
1833 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
|
1834 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
|
1835 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
|
1836 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
|
1837 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
|
1838 } |
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
|
1839 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
|
1840 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
|
1841 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
|
1842 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
|
1843 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
|
1844 port->serial_receiving = load_int8(buf); |
1427
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1845 } |
4e5797b3935a
WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents:
1400
diff
changeset
|
1846 } |