OSDN Git Service

[VM][General][WIP] Start to merge upstream 2018-10-14.Open branch upstream_20181014 .
[csp-qt/common_source_project-fm7.git] / source / src / vm / pv1000 / joystick.cpp
1 /*
2         CASIO PV-1000 Emulator 'ePV-1000'
3
4         Author : Takeda.Toshiya
5         Date   : 2006.11.16 -
6
7         [ joystick ]
8 */
9
10 #include "./joystick.h"
11
12 namespace PV1000 {
13
14 void JOYSTICK::initialize()
15 {
16         key = emu->get_key_buffer();
17         joy = emu->get_joy_buffer();
18         
19         // register event to interrupt
20         register_frame_event(this);
21 }
22
23 void JOYSTICK::reset()
24 {
25         status = 0;
26 }
27
28 void JOYSTICK::write_io8(uint32_t addr, uint32_t data)
29 {
30         switch(addr & 0xff) {
31         case 0xfc:
32 //              status = data;
33                 break;
34         case 0xfd:
35                 column = data;
36                 status |= 2;
37                 break;
38         }
39 //      this->out_debug_log(_T("OUT\t%2x, %2x\n"), addr & 0xff, data);
40 }
41
42 uint32_t JOYSTICK::read_io8(uint32_t addr)
43 {
44         uint32_t val = 0xff;
45         
46         switch(addr & 0xff) {
47         case 0xfc:
48                 val = status;
49                 status &= ~1;
50                 break;
51         case 0xfd:
52                 val = 0;
53                 if(column & 1) {
54                         if(joy[0] & 0x40) val |= 1;     // #1 select
55                         if(joy[0] & 0x80) val |= 2;     // #1 start
56                         if(joy[1] & 0x40) val |= 4;     // #2 select
57                         if(joy[1] & 0x80) val |= 8;     // #2 start
58                 }
59                 if(column & 2) {
60                         if(joy[0] & 0x02) val |= 1;     // #1 down
61                         if(joy[0] & 0x08) val |= 2;     // #1 right
62                         if(joy[1] & 0x02) val |= 4;     // #2 down
63                         if(joy[1] & 0x08) val |= 8;     // #2 right
64                 }
65                 if(column & 4) {
66                         if(joy[0] & 0x04) val |= 1;     // #1 left
67                         if(joy[0] & 0x01) val |= 2;     // #1 up
68                         if(joy[1] & 0x04) val |= 4;     // #2 left
69                         if(joy[1] & 0x01) val |= 8;     // #2 up
70                 }
71                 if(column & 8) {
72                         if(joy[0] & 0x10) val |= 1;     // #1 trig1
73                         if(joy[0] & 0x20) val |= 2;     // #1 trig2
74                         if(joy[1] & 0x10) val |= 4;     // #2 trig1
75                         if(joy[1] & 0x20) val |= 8;     // #2 trig2
76                 }
77 //              status &= ~2;
78                 break;
79         }
80 //      this->out_debug_log(_T("IN\t%2x, %2x\n"), addr & 0xff, val);
81         return val;
82 }
83
84 void JOYSTICK::event_frame()
85 {
86         status |= 1;
87 }
88
89 #define STATE_VERSION   1
90
91 bool JOYSTICK::process_state(FILEIO* state_fio, bool loading)
92 {
93         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
94                 return false;
95         }
96         if(!state_fio->StateCheckInt32(this_device_id)) {
97                 return false;
98         }
99         state_fio->StateValue(column);
100         state_fio->StateValue(status);
101         return true;
102 }
103
104 }