OSDN Git Service

[VM][General] Merge upstream 2016-03-01. (Pahse 1).
[csp-qt/common_source_project-fm7.git] / source / src / vm / fmr50 / keyboard.cpp
1 /*
2         FUJITSU FMR-50 Emulator 'eFMR-50'
3         FUJITSU FMR-60 Emulator 'eFMR-60'
4
5         Author : Takeda.Toshiya
6         Date   : 2008.05.01 -
7
8         [ keyboard ]
9 */
10
11 #include "keyboard.h"
12 #include "../i8259.h"
13 #include "../../fifo.h"
14
15 void KEYBOARD::initialize()
16 {
17         key_buf = new FIFO(64);
18         register_frame_event(this);
19 }
20
21 void KEYBOARD::release()
22 {
23         key_buf->release();
24         delete key_buf;
25 }
26
27 void KEYBOARD::reset()
28 {
29         memset(table, 0, sizeof(table));
30         key_buf->clear();
31         kbstat = kbdata = kbint = kbmsk = 0;
32 }
33
34 void KEYBOARD::write_io8(uint32_t addr, uint32_t data)
35 {
36         switch(addr) {
37         case 0x600:
38                 // data
39 //              kbstat |= 2;
40                 break;
41         case 0x602:
42                 // command
43                 break;
44         case 0x604:
45                 kbmsk = data;
46                 break;
47         }
48 }
49
50 uint32_t KEYBOARD::read_io8(uint32_t addr)
51 {
52         switch(addr) {
53         case 0x600:
54                 kbint &= ~1;
55                 d_pic->write_signal(SIG_I8259_CHIP0 | SIG_I8259_IR1, 0, 0);
56                 kbstat &= ~1;
57                 return kbdata;
58         case 0x602:
59                 return kbstat;
60         case 0x604:
61                 return kbint | 0xfc;
62         }
63         return 0;
64 }
65
66 void KEYBOARD::event_frame()
67 {
68         if(!(kbstat & 1) && !key_buf->empty()) {
69                 kbstat |= 1;
70                 kbdata = key_buf->read();
71         }
72         if((kbstat & 1) && (kbmsk & 1) && !(kbint & 1)) {
73                 kbint |= 1;
74                 d_pic->write_signal(SIG_I8259_CHIP0 | SIG_I8259_IR1, 1, 1);
75         }
76 //      kbstat &= ~2;
77 }
78
79 void KEYBOARD::key_down(int code)
80 {
81 //      if(!table[code]) {
82                 table[code] = 1;
83                 if(code = key_table[code]) {
84                         // $11:CTRL, $10:SHIFT
85                         key_buf->write(0xa0 | (table[0x11] ? 8 : 0) | (table[0x10] ? 4 : 0));
86                         key_buf->write(code);
87                 }
88 //      }
89 }
90
91 void KEYBOARD::key_up(int code)
92 {
93 //      if(table[code]) {
94                 table[code] = 0;
95                 if(code = key_table[code]) {
96                         key_buf->write(0xb0);
97                         key_buf->write(code);
98                 }
99 //      }
100 }
101
102 #define STATE_VERSION   1
103
104 void KEYBOARD::save_state(FILEIO* state_fio)
105 {
106         state_fio->FputUint32(STATE_VERSION);
107         state_fio->FputInt32(this_device_id);
108         
109         key_buf->save_state((void *)state_fio);
110         state_fio->FputUint8(kbstat);
111         state_fio->FputUint8(kbdata);
112         state_fio->FputUint8(kbint);
113         state_fio->FputUint8(kbmsk);
114         state_fio->Fwrite(table, sizeof(table), 1);
115 }
116
117 bool KEYBOARD::load_state(FILEIO* state_fio)
118 {
119         if(state_fio->FgetUint32() != STATE_VERSION) {
120                 return false;
121         }
122         if(state_fio->FgetInt32() != this_device_id) {
123                 return false;
124         }
125         if(!key_buf->load_state((void *)state_fio)) {
126                 return false;
127         }
128         kbstat = state_fio->FgetUint8();
129         kbdata = state_fio->FgetUint8();
130         kbint = state_fio->FgetUint8();
131         kbmsk = state_fio->FgetUint8();
132         state_fio->Fread(table, sizeof(table), 1);
133         return true;
134 }
135