2 NEC PC-9801 Emulator 'ePC-9801'
3 NEC PC-9801E/F/M Emulator 'ePC-9801E'
4 NEC PC-9801U Emulator 'ePC-9801U'
5 NEC PC-9801VF Emulator 'ePC-9801VF'
6 NEC PC-9801VM Emulator 'ePC-9801VM'
7 NEC PC-9801VX Emulator 'ePC-9801VX'
8 NEC PC-9801RA Emulator 'ePC-9801RA'
9 NEC PC-98XA Emulator 'ePC-98XA'
10 NEC PC-98XL Emulator 'ePC-98XL'
11 NEC PC-98RL Emulator 'ePC-98RL'
12 NEC PC-98DO Emulator 'ePC-98DO'
14 Author : Takeda.Toshiya
26 static const int freq_table[4] = {120, 60, 30, 15};
28 void MOUSE::initialize()
30 status = emu->get_mouse_buffer();
35 register_frame_event(this);
36 register_event(this, EVENT_TIMER, 1000000.0 / freq_table[freq], true, ®ister_id);
45 #if !defined(SUPPORT_HIRESO)
46 void MOUSE::write_io8(uint32_t addr, uint32_t data)
50 if((data & 0xfc) == 0) {
57 uint32_t MOUSE::read_io8(uint32_t addr)
67 void MOUSE::event_callback(int event_id, int err)
69 if(!(ctrlreg & 0x10)) {
70 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR5, 1, 1);
72 if(cur_freq != (freq & 3)) {
73 cancel_event(this, register_id);
74 register_event(this, EVENT_TIMER, 1000000.0 / freq_table[freq & 3] + err, true, ®ister_id);
79 void MOUSE::event_frame()
96 void MOUSE::write_signal(int id, uint32_t data, uint32_t mask)
98 if(!(ctrlreg & 0x80) && (data & 0x80)) {
103 ctrlreg = data & mask;
107 void MOUSE::update_mouse()
111 if(!(status[2] & 1)) val |= 0x80; // left
112 if(!(status[2] & 2)) val |= 0x20; // right
113 if(!(status[2] & 4)) val |= 0x40; // center
115 switch(ctrlreg & 0xe0) {
116 case 0x00: val |= (dx >> 0) & 0x0f; break;
117 case 0x20: val |= (dx >> 4) & 0x0f; break;
118 case 0x40: val |= (dy >> 0) & 0x0f; break;
119 case 0x60: val |= (dy >> 4) & 0x0f; break;
120 case 0x80: val |= (lx >> 0) & 0x0f; break;
121 case 0xa0: val |= (lx >> 4) & 0x0f; break;
122 case 0xc0: val |= (ly >> 0) & 0x0f; break;
123 case 0xe0: val |= (ly >> 4) & 0x0f; break;
125 d_pio->write_signal(SIG_I8255_PORT_A, val, 0xff);
128 #define STATE_VERSION 2
130 bool MOUSE::process_state(FILEIO* state_fio, bool loading)
132 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
135 if(!state_fio->StateCheckInt32(this_device_id)) {
138 state_fio->StateInt32(ctrlreg);
139 state_fio->StateInt32(freq);
140 state_fio->StateInt32(cur_freq);
141 state_fio->StateInt32(dx);
142 state_fio->StateInt32(dy);
143 state_fio->StateInt32(lx);
144 state_fio->StateInt32(ly);
145 state_fio->StateInt32(register_id);