OSDN Git Service

[VM][FMTOWNS][MOUSE][JOYSTICK] More integrate to common interface.
[csp-qt/common_source_project-fm7.git] / source / src / vm / fmtowns / joystick.h
1 /*
2         FUJITSU FM Towns Emulator 'eFMTowns'
3
4         Author : Kyuma.Ohta <whatisthis.sowhat _at_ gmail.com>
5         Date   : 2020.01.28 -
6     History : 2020.01.28 Initial from FM7.
7         [ Towns Joystick ports]
8
9 */
10
11 #pragma once
12
13 #include "../device.h"
14
15 #define SIG_JOYPORT_CH0                         0
16 #define SIG_JOYPORT_CH1                         (65536 * 256)
17 #define SIG_JOYPORT_DATA                        256
18 #define SIG_JOYPORT_COM                         512
19 #define SIG_JOYPORT_MASK                        768
20
21 #define SIG_JOYPORT_TYPE_NULL           0
22 #define SIG_JOYPORT_TYPE_2BUTTONS       1
23 #define SIG_JOYPORT_TYPE_6BUTTONS       2
24 #define SIG_JOYPORT_TYPE_ANALOG         3 /* ToDo: For CYBER STICK */
25 #define SIG_JOYPORT_TYPE_MOUSE          4
26 #define SIG_JOYPORT_TYPE_TWIN_2B_0      5 /* ToDo: For RIBBLE RABBLE */
27 #define SIG_JOYPORT_TYPE_TWIN_2B_1      6 /* ToDo: For RIBBLE RABBLE */
28 #define SIG_JOYPORT_CONNECT                     7 /* ToDo: RESET */
29
30 // MSX RELATED PORT CONFIGURATION
31 // https://www.msx.org/wiki/General_Purpose_port
32 #define LINE_JOYPORT_UP                         (1 << 0) /* IN 1 */
33 #define LINE_JOYPORT_DOWN                       (1 << 1) /* IN 2 */
34 #define LINE_JOYPORT_LEFT                       (1 << 2) /* IN 3 */
35 #define LINE_JOYPORT_RIGHT                      (1 << 3) /* IN 4 */
36 #define LINE_JOYPORT_A                          (1 << 4) /* IN 6 */
37 #define LINE_JOYPORT_B                          (1 << 5) /* IN 7 */
38 #define LINE_JOYPORT_TRIGGER            (1 << 6) /* OUT 8 */
39 #define LINE_JOYPORT_DUMMY                      (1 << 7) /* DUMMY */
40 // Belows are dummy define
41 #define LINE_JOYPORT_POW_PLUS           (1 << 8) /* +5V PIN 5*/
42 #define LINE_JOYPORT_POW_GND            (1 << 9) /* GND PIN 8*/
43
44 namespace FMTOWNS {
45 class JOYSTICK : public DEVICE
46 {
47 private:
48         DEVICE* d_mouse;
49         DEVICE* d_joypad[2];
50         
51         bool emulate_mouse[2];
52         uint32_t joydata[2];
53         bool stat_com[2];
54         
55         uint8_t mouse_mask;
56         uint32_t connected_type[2];
57         
58         void set_emulate_mouse();
59         void __FASTCALL send_signals(int ch, uint32_t data);
60
61 public:
62         JOYSTICK(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVICE(parent_vm, parent_emu)
63         {
64                 d_mouse = NULL;
65                 d_joypad[0] = NULL;
66                 d_joypad[1] = NULL;
67                 connected_type[0] = SIG_JOYPORT_CH0 | SIG_JOYPORT_TYPE_NULL;
68                 connected_type[1] = SIG_JOYPORT_CH1 | SIG_JOYPORT_TYPE_NULL;
69
70                 set_device_name(_T("FM-Towns PAD Port"));
71         }
72         ~JOYSTICK() {}
73         
74         // common functions
75         void initialize(void);
76         void release();
77         void reset();
78         
79         void __FASTCALL write_io8(uint32_t addr, uint32_t data);
80         uint32_t __FASTCALL read_io8(uint32_t addr);
81         void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
82         uint32_t __FASTCALL read_signal(int id);
83
84         void update_config();
85         bool process_state(FILEIO* state_fio, bool loading);
86
87         // unique functions
88         void set_context_joypad(int num, DEVICE* dev)
89         {
90                 if((d_joypad[num] == nullptr) && (dev != nullptr)) {
91                         d_joypad[num] = dev;
92                 }
93         }
94         void set_context_mouse(DEVICE* dev)
95         {
96                 if((d_mouse == nullptr) && (dev != nullptr)) {
97                         d_mouse = dev;
98                 }
99         }
100
101                         
102 };
103 }
104
105