OSDN Git Service

[VM][WIP] Use namespace to devices per VMs.
[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 namespace FMR50 {
16         
17 void KEYBOARD::initialize()
18 {
19         key_buf = new FIFO(64);
20         register_frame_event(this);
21 }
22
23 void KEYBOARD::release()
24 {
25         key_buf->release();
26         delete key_buf;
27 }
28
29 void KEYBOARD::reset()
30 {
31         memset(table, 0, sizeof(table));
32         key_buf->clear();
33         kbstat = kbdata = kbint = kbmsk = 0;
34 }
35
36 void KEYBOARD::write_io8(uint32_t addr, uint32_t data)
37 {
38         switch(addr) {
39         case 0x600:
40                 // data
41 //              kbstat |= 2;
42                 break;
43         case 0x602:
44                 // command
45                 break;
46         case 0x604:
47                 kbmsk = data;
48                 break;
49         }
50 }
51
52 uint32_t KEYBOARD::read_io8(uint32_t addr)
53 {
54         switch(addr) {
55         case 0x600:
56                 kbint &= ~1;
57                 d_pic->write_signal(SIG_I8259_CHIP0 | SIG_I8259_IR1, 0, 0);
58                 kbstat &= ~1;
59                 return kbdata;
60         case 0x602:
61                 return kbstat;
62         case 0x604:
63                 return kbint | 0xfc;
64         }
65         return 0;
66 }
67
68 void KEYBOARD::event_frame()
69 {
70         if(!(kbstat & 1) && !key_buf->empty()) {
71                 kbstat |= 1;
72                 kbdata = key_buf->read();
73         }
74         if((kbstat & 1) && (kbmsk & 1) && !(kbint & 1)) {
75                 kbint |= 1;
76                 d_pic->write_signal(SIG_I8259_CHIP0 | SIG_I8259_IR1, 1, 1);
77         }
78 //      kbstat &= ~2;
79 }
80
81 void KEYBOARD::key_down(int code)
82 {
83 //      if(!table[code]) {
84                 table[code] = 1;
85                 if(code = key_table[code]) {
86                         // $11:CTRL, $10:SHIFT
87                         key_buf->write(0xa0 | (table[0x11] ? 8 : 0) | (table[0x10] ? 4 : 0));
88                         key_buf->write(code);
89                 }
90 //      }
91 }
92
93 void KEYBOARD::key_up(int code)
94 {
95 //      if(table[code]) {
96                 table[code] = 0;
97                 if(code = key_table[code]) {
98                         key_buf->write(0xb0);
99                         key_buf->write(code);
100                 }
101 //      }
102 }
103
104 #define STATE_VERSION   1
105
106 bool KEYBOARD::process_state(FILEIO* state_fio, bool loading)
107 {
108         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
109                 return false;
110         }
111         if(!state_fio->StateCheckInt32(this_device_id)) {
112                 return false;
113         }
114         if(!key_buf->process_state((void *)state_fio, loading)) {
115                 return false;
116         }
117         state_fio->StateUint8(kbstat);
118         state_fio->StateUint8(kbdata);
119         state_fio->StateUint8(kbint);
120         state_fio->StateUint8(kbmsk);
121         state_fio->StateBuffer(table, sizeof(table), 1);
122         return true;
123 }
124
125 }