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
28 static const int freq_table[4] = {120, 60, 30, 15};
30 void MOUSE::initialize()
32 status = emu->get_mouse_buffer();
37 register_frame_event(this);
38 register_event(this, EVENT_TIMER, 1000000.0 / freq_table[freq], true, ®ister_id);
47 #if !defined(SUPPORT_HIRESO)
48 void MOUSE::write_io8(uint32_t addr, uint32_t data)
52 if((data & 0xfc) == 0) {
59 uint32_t MOUSE::read_io8(uint32_t addr)
69 void MOUSE::event_callback(int event_id, int err)
71 if(!(ctrlreg & 0x10)) {
72 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR5, 1, 1);
74 if(cur_freq != (freq & 3)) {
75 cancel_event(this, register_id);
76 register_event(this, EVENT_TIMER, 1000000.0 / freq_table[freq & 3] + err, true, ®ister_id);
81 void MOUSE::event_frame()
98 void MOUSE::write_signal(int id, uint32_t data, uint32_t mask)
100 if(!(ctrlreg & 0x80) && (data & 0x80)) {
105 ctrlreg = data & mask;
109 void MOUSE::update_mouse()
113 if(!(status[2] & 1)) val |= 0x80; // left
114 if(!(status[2] & 2)) val |= 0x20; // right
115 if(!(status[2] & 4)) val |= 0x40; // center
117 switch(ctrlreg & 0xe0) {
118 case 0x00: val |= (dx >> 0) & 0x0f; break;
119 case 0x20: val |= (dx >> 4) & 0x0f; break;
120 case 0x40: val |= (dy >> 0) & 0x0f; break;
121 case 0x60: val |= (dy >> 4) & 0x0f; break;
122 case 0x80: val |= (lx >> 0) & 0x0f; break;
123 case 0xa0: val |= (lx >> 4) & 0x0f; break;
124 case 0xc0: val |= (ly >> 0) & 0x0f; break;
125 case 0xe0: val |= (ly >> 4) & 0x0f; break;
127 d_pio->write_signal(SIG_I8255_PORT_A, val, 0xff);
130 #define STATE_VERSION 2
132 bool MOUSE::process_state(FILEIO* state_fio, bool loading)
134 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
137 if(!state_fio->StateCheckInt32(this_device_id)) {
140 state_fio->StateInt32(ctrlreg);
141 state_fio->StateInt32(freq);
142 state_fio->StateInt32(cur_freq);
143 state_fio->StateInt32(dx);
144 state_fio->StateInt32(dy);
145 state_fio->StateInt32(lx);
146 state_fio->StateInt32(ly);
147 state_fio->StateInt32(register_id);