2 FUJITSU FM Towns Emulator 'eFMTowns'
4 Author : Kyuma.Ohta <whatisthis.sowhat _at_ gmail.com>
6 History : 2020.01.28 Initial from FM7.
7 [ Towns Joystick ports]
11 #include "./joystick.h"
16 void JOYSTICK::reset()
19 update_config(); // Update MOUSE PORT.
21 for(int i = 0; i < 2; i++) {
22 if(connected_type[i] == SIG_JOYPORT_TYPE_2BUTTONS) {
23 write_signals(&outputs_query, 1 << i);
24 } else if(connected_type[i] == SIG_JOYPORT_TYPE_MOUSE) {
25 write_signals(&outputs_query, (1 << i) | 0x04);
31 void JOYSTICK::initialize()
33 joydata[0] = joydata[1] = 0x00;
36 connected_type[0] = 0xffffffff;
37 connected_type[1] = 0xffffffff;
38 stat_com[0] = stat_com[1] = false;
42 void JOYSTICK::release()
46 void JOYSTICK::write_io8(uint32_t address, uint32_t data)
49 if(address == 0x04d6) {
50 if(mouse_mask != data) {
52 write_signals(&outputs_mask, data);
57 uint32_t JOYSTICK::read_io8(uint32_t address)
59 // ToDo: Implement 6 buttons pad. & mouse
61 uint8_t port_num = (address & 0x02) >> 1;
66 uint8_t trig = (mouse_mask >> (port_num << 1)) & 0x03;
67 uint8_t mask2 = (mouse_mask >> (port_num + 4)) & 0x01;
69 if(connected_type[port_num] == SIG_JOYPORT_TYPE_2BUTTONS) {
70 write_signals(&outputs_query, 1 << port_num);
71 } else if(connected_type[port_num] == SIG_JOYPORT_TYPE_MOUSE) {
72 if(emulate_mouse[port_num]) {
73 write_signals(&outputs_query, (1 << port_num) | 0x04);
77 if((mask2 != 0) && (stat_com[port_num])) { // COM
82 if((mask2 != 0) && (stat_com[port_num])) { // COM
85 // Trigger independents from direction keys.
86 if(((trig & 0x02) != 0) && ((joydata[port_num] & LINE_JOYPORT_B) == 0)) {
87 retval = retval | 0x20;
89 if(((trig & 0x01) != 0) && ((joydata[port_num] & LINE_JOYPORT_A) == 0)) {
90 retval = retval | 0x10;
92 //if((mask & (0x10 << port_num)) == 0) {
93 // if((mask2 & 0x01) == 0) { // COM
94 if((joydata[port_num] & LINE_JOYPORT_LEFT) != 0) { // LEFT
95 retval = retval & ~0x04; // LEFT
97 if((joydata[port_num] & LINE_JOYPORT_RIGHT) != 0) { // RIGHT
98 retval = retval & ~0x08; // RIGHT
100 if((joydata[port_num] & LINE_JOYPORT_UP) != 0) { // UP
101 retval = retval & ~0x01; // FWD
103 if((joydata[port_num] & LINE_JOYPORT_DOWN) != 0) { // DOWN
104 retval = retval & ~0x02; // BACK
117 void JOYSTICK::write_signal(int id, uint32_t data, uint32_t mask)
119 int ch = (id >> 24) & 1;
120 int bustype = id & 0x300;
122 //out_debug_log(_T("SIGNAL SENT, CH=%d TYPE=%d VALUE=%08X"), ch, num, data);
123 if(num == connected_type[ch]) {
125 case SIG_JOYPORT_DATA:
128 case SIG_JOYPORT_COM:
129 stat_com[ch] = ((data & mask) != 0) ? true : false;
133 //if(type != connected_type[num]) return;
135 uint32_t JOYSTICK::read_signal(int id)
137 int ch = (id >> 24) & 1;
138 int bustype = id & 0x300;
142 case SIG_JOYPORT_DATA:
145 case SIG_JOYPORT_COM:
146 data = (stat_com[ch]) ? 0xffffffff : 0;
148 case SIG_JOYPORT_MASK:
155 void JOYSTICK::update_config(void)
157 uint32_t ntype[2] = {0};
158 for(int i = 0; i < 2; i++) {
159 switch(config.joystick_type) {
161 ntype[i] = SIG_JOYPORT_TYPE_NULL;
164 ntype[i] = SIG_JOYPORT_TYPE_2BUTTONS;
167 ntype[i] = SIG_JOYPORT_TYPE_6BUTTONS;
172 if(emulate_mouse[0]) {
173 ntype[0] = SIG_JOYPORT_TYPE_MOUSE;
175 if(emulate_mouse[1]) {
176 ntype[1] = SIG_JOYPORT_TYPE_MOUSE;
179 write_signals(&outputs_mask, mouse_mask);
180 for(int i = 0; i < 2; i++) {
181 // if(connected_type[i] != ntype[i]) {
182 write_signals(&outputs_enable[i], 1 << ntype[i]);
185 case SIG_JOYPORT_TYPE_2BUTTONS:
186 case SIG_JOYPORT_TYPE_6BUTTONS:
187 connected_type[i] = SIG_JOYPORT_TYPE_2BUTTONS;
190 connected_type[i] = ntype[i];
197 void JOYSTICK::set_emulate_mouse()
199 switch(config.mouse_type & 0x03){
201 emulate_mouse[0] = true;
202 emulate_mouse[1] = false;
203 if(d_mouse != nullptr) {
204 d_mouse->write_signal(SIG_MOUSE_ENABLE, 0xfffffffe, 0xffffffff);
208 emulate_mouse[0] = false;
209 emulate_mouse[1] = true;
210 if(d_mouse != nullptr) {
211 d_mouse->write_signal(SIG_MOUSE_ENABLE, 0xffffffff, 0xffffffff);
215 emulate_mouse[0] = false;
216 emulate_mouse[1] = false;
217 if(d_mouse != nullptr) {
218 d_mouse->write_signal(SIG_MOUSE_ENABLE, 0x00000000, 0xffffffff);
224 #define STATE_VERSION 6
226 bool JOYSTICK::process_state(FILEIO *state_fio, bool loading)
228 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
231 if(!state_fio->StateCheckInt32(this_device_id)) {
234 state_fio->StateValue(mouse_mask);
235 state_fio->StateArray(joydata, sizeof(joydata), 1);
236 state_fio->StateArray(connected_type, sizeof(connected_type), 1);
238 state_fio->StateArray(emulate_mouse, sizeof(emulate_mouse), 1);
239 state_fio->StateArray(stat_com, sizeof(stat_com), 1);