OSDN Git Service

fcbd6f317bd3a78e98da75663f35eb3dcd86c4fa
[csp-qt/common_source_project-fm7.git] / source / src / vm / jr800 / io.cpp
1 /*
2         National JR-800 Emulator 'eJR-800'
3
4         Author : Takeda.Toshiya
5         Origin : PockEmul
6         Date   : 2017.03.13-
7
8         [ memory mapped i/o ]
9 */
10
11 #include "./io.h"
12 #include "../hd44102.h"
13
14 namespace JR800 {
15
16 void IO::write_memory_mapped_io8(uint32_t addr, uint32_t data)
17 {
18         int chip = 0;
19         
20         switch(addr & 0xf00) {
21         case 0xa00:
22         case 0xb00:
23                 switch(addr & 0xff) {
24                 case 0x01: chip = 0; break;
25                 case 0x02: chip = 1; break;
26                 case 0x04: chip = 2; break;
27                 case 0x08: chip = 3; break;
28                 case 0x10: chip = 4; break;
29                 case 0x20: chip = 5; break;
30                 case 0x40: chip = 6; break;
31                 case 0x80: chip = 7; break;
32                 }
33                 d_lcd[chip]->write(addr >> 8, data);
34                 break;
35         }
36 }
37
38 uint32_t IO::read_memory_mapped_io8(uint32_t addr)
39 {
40         const uint8_t* key_stat = emu->get_key_buffer();
41         uint8_t data = 0;
42         int chip = 0;
43         
44         switch(addr & 0xf00) {
45         case 0xa00:
46         case 0xb00:
47                 switch(addr & 0xff) {
48                 case 0x01: chip = 0; break;
49                 case 0x02: chip = 1; break;
50                 case 0x04: chip = 2; break;
51                 case 0x08: chip = 3; break;
52                 case 0x10: chip = 4; break;
53                 case 0x20: chip = 5; break;
54                 case 0x40: chip = 6; break;
55                 case 0x80: chip = 7; break;
56                 }
57                 return d_lcd[chip]->read(addr >> 8);
58         case 0xd00:
59         case 0xe00:
60         case 0xf00:
61                 if(!(addr & 0x001)) {
62                         if(key_stat[0x60]) data |= 0x01; // NumPad 0
63                         if(key_stat[0x61]) data |= 0x02; // NumPad 1
64                         if(key_stat[0x62]) data |= 0x04; // NumPad 2
65                         if(key_stat[0x63]) data |= 0x08; // NumPad 3
66                         if(key_stat[0x64]) data |= 0x10; // NumPad 4
67                         if(key_stat[0x65]) data |= 0x20; // NumPad 5
68                         if(key_stat[0x66]) data |= 0x40; // NumPad 6
69                         if(key_stat[0x67]) data |= 0x80; // NumPad 7
70                 }
71                 if(!(addr & 0x002)) {
72                         if(key_stat[0x68]) data |= 0x01; // NumPad 8
73                         if(key_stat[0x69]) data |= 0x02; // NumPad 9
74                         if(key_stat[0x6a]) data |= 0x04; // NumPad *
75                         if(key_stat[0x6b]) data |= 0x08; // NumPad +
76                         if(key_stat[0x6c]) data |= 0x10; // NumPad =
77                         if(key_stat[0x6d]) data |= 0x20; // NumPad -
78                         if(key_stat[0x6e]) data |= 0x40; // NumPad .
79                         if(key_stat[0x6f]) data |= 0x80; // NumPad /
80                         //
81                         if(key_stat[0xdb]) data |= 0x04; // [ -> NumPad *
82                         if(key_stat[0xe2]) data |= 0x08; // _ -> NumPad +
83                         if(key_stat[0xbf]) data |= 0x10; // / -> NumPad =
84                         if(key_stat[0xdd]) data |= 0x20; // ] -> NumPad -
85                         if(key_stat[0xdc]) data |= 0x80; // \ -> NumPad /
86                 }
87                 if(!(addr & 0x004)) {
88                         if(key_stat[0x30]) data |= 0x01; // 0
89                         if(key_stat[0x31]) data |= 0x02; // 1
90                         if(key_stat[0x32]) data |= 0x04; // 2
91                         if(key_stat[0x33]) data |= 0x08; // 3
92                         if(key_stat[0x34]) data |= 0x10; // 4
93                         if(key_stat[0x35]) data |= 0x20; // 5
94                         if(key_stat[0x36]) data |= 0x40; // 6
95                         if(key_stat[0x37]) data |= 0x80; // 7
96                 }
97                 if(!(addr & 0x008)) {
98                         if(key_stat[0x38]) data |= 0x01; // 8
99                         if(key_stat[0x39]) data |= 0x02; // 9
100                         if(key_stat[0xba]) data |= 0x04; // :
101                         if(key_stat[0xbb]) data |= 0x08; // ;
102                         if(key_stat[0xbc]) data |= 0x10; // ,
103                         if(key_stat[0xde]) data |= 0x20; // ^
104                         if(key_stat[0xbe]) data |= 0x40; // .
105                         if(key_stat[0x24]) data |= 0x80; // Home
106                 }
107                 if(!(addr & 0x010)) {
108                         if(key_stat[0x20]) data |= 0x01; // Space
109                         if(key_stat[0x41]) data |= 0x02; // A
110                         if(key_stat[0x42]) data |= 0x04; // B
111                         if(key_stat[0x43]) data |= 0x08; // C
112                         if(key_stat[0x44]) data |= 0x10; // D
113                         if(key_stat[0x45]) data |= 0x20; // E
114                         if(key_stat[0x46]) data |= 0x40; // F
115                         if(key_stat[0x47]) data |= 0x80; // G
116                 }
117                 if(!(addr & 0x020)) {
118                         if(key_stat[0x48]) data |= 0x01; // H
119                         if(key_stat[0x49]) data |= 0x02; // I
120                         if(key_stat[0x4a]) data |= 0x04; // J
121                         if(key_stat[0x4b]) data |= 0x08; // K
122                         if(key_stat[0x4c]) data |= 0x10; // L
123                         if(key_stat[0x4d]) data |= 0x20; // M
124                         if(key_stat[0x4e]) data |= 0x40; // N
125                         if(key_stat[0x4f]) data |= 0x80; // O
126                 }
127                 if(!(addr & 0x040)) {
128                         if(key_stat[0x50]) data |= 0x01; // P
129                         if(key_stat[0x51]) data |= 0x02; // Q
130                         if(key_stat[0x52]) data |= 0x04; // R
131                         if(key_stat[0x53]) data |= 0x08; // S
132                         if(key_stat[0x54]) data |= 0x10; // T
133                         if(key_stat[0x55]) data |= 0x20; // U
134                         if(key_stat[0x56]) data |= 0x40; // V
135                         if(key_stat[0x57]) data |= 0x80; // W
136                 }
137                 if(!(addr & 0x080)) {
138                         if(key_stat[0x58]) data |= 0x01; // X
139                         if(key_stat[0x59]) data |= 0x02; // Y
140                         if(key_stat[0x5a]) data |= 0x04; // Z
141                         if(key_stat[0x2d]) data |= 0x08; // Ins
142                         if(key_stat[0x27]) data |= 0x10; // Right
143                         if(key_stat[0x26]) data |= 0x20; // Up
144                         if(key_stat[0x0d]) data |= 0x40; // Enter
145                         if(key_stat[0x03]) data |= 0x80; // Break
146                 }
147                 if(!(addr & 0x100)) {
148                         if(key_stat[0x70]) data |= 0x01; // F1
149                         if(key_stat[0x71]) data |= 0x02; // F2
150                         if(key_stat[0x72]) data |= 0x04; // F3
151                         if(key_stat[0x73]) data |= 0x08; // F4
152                         if(key_stat[0x74]) data |= 0x10; // F5
153                         if(key_stat[0x75]) data |= 0x20; // F6
154                         if(key_stat[0x76]) data |= 0x40; // F7
155                         if(key_stat[0x77]) data |= 0x80; // F8
156                 }
157                 if(!(addr & 0x200)) {
158                         if(key_stat[0x12]) data |= 0x04; // Alt
159                         if(key_stat[0x10]) data |= 0x08; // Shift
160                         if(key_stat[0x11]) data |= 0x10; // Ctrl
161                 }
162                 return (data ^ 0xff);
163         }
164         return 0xff;
165 }
166
167 #define STATE_VERSION   1
168
169 bool IO::process_state(FILEIO* state_fio, bool loading)
170 {
171         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
172                 return false;
173         }
174         if(!state_fio->StateCheckInt32(this_device_id)) {
175                 return false;
176         }
177         return true;
178 }
179
180 }