OSDN Git Service

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