OSDN Git Service

[VM] MEMORY:: class within some VM will change Foo_MEMORY:: to reduce misundestanding...
[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 bool KEYBOARD::process_state(FILEIO* state_fio, bool loading)
105 {
106         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
107                 return false;
108         }
109         if(!state_fio->StateCheckInt32(this_device_id)) {
110                 return false;
111         }
112         if(!key_buf->process_state((void *)state_fio, loading)) {
113                 return false;
114         }
115         state_fio->StateUint8(kbstat);
116         state_fio->StateUint8(kbdata);
117         state_fio->StateUint8(kbint);
118         state_fio->StateUint8(kbmsk);
119         state_fio->StateBuffer(table, sizeof(table), 1);
120         return true;
121 }