OSDN Git Service

[VM][General] Merge upstream 2016-03-01. (Pahse 1).
[csp-qt/common_source_project-fm7.git] / source / src / vm / mz2800 / joystick.cpp
1 /*
2         SHARP MZ-2800 Emulator 'EmuZ-2800'
3
4         Author : Takeda.Toshiya
5         Date   : 2007.08.14 -
6
7         [ joystick ]
8 */
9
10 #include "joystick.h"
11
12 void JOYSTICK::initialize()
13 {
14         mode = 0xf;
15         joy_stat = emu->get_joy_buffer();
16 }
17
18 void JOYSTICK::write_io8(uint32_t addr, uint32_t data)
19 {
20         mode = data;
21 }
22
23 uint32_t JOYSTICK::read_io8(uint32_t addr)
24 {
25         uint32_t val = 0x3f;
26         int num = (mode & 0x40) ? 1 : 0;
27         bool dir = true;
28         
29         // trigger mask
30         if(num) {
31                 if(!(mode & 0x04)) val &= ~0x20;
32                 if(!(mode & 0x08)) val &= ~0x10;
33                 dir = ((mode & 0x20) == 0);
34         } else {
35                 if(!(mode & 0x01)) val &= ~0x20;
36                 if(!(mode & 0x02)) val &= ~0x10;
37                 dir = ((mode & 0x10) == 0);
38         }
39         
40         // direction
41         if(dir) {
42                 if(joy_stat[num] & 0x08) val &= ~0x08;
43                 if(joy_stat[num] & 0x04) val &= ~0x04;
44                 if(joy_stat[num] & 0x02) val &= ~0x02;
45                 if(joy_stat[num] & 0x01) val &= ~0x01;
46         }
47         
48         // trigger
49         if(joy_stat[num] & 0x10) val &= ~0x20;
50         if(joy_stat[num] & 0x20) val &= ~0x10;
51         return val;
52 }
53
54 #define STATE_VERSION   2
55
56 void JOYSTICK::save_state(FILEIO* state_fio)
57 {
58         state_fio->FputUint32(STATE_VERSION);
59         state_fio->FputInt32(this_device_id);
60         
61         state_fio->FputUint32(mode);
62 }
63
64 bool JOYSTICK::load_state(FILEIO* state_fio)
65 {
66         if(state_fio->FgetUint32() != STATE_VERSION) {
67                 return false;
68         }
69         if(state_fio->FgetInt32() != this_device_id) {
70                 return false;
71         }
72         mode = state_fio->FgetUint32();
73         return true;
74 }
75