PCem
view src/mouse_ps2.c @ 154:d0d530adce12
Initial port to Linux (using Allegro).
64-bit fixes.
Some changes to aid portability.
A few other tweaks.
| author | TomW |
|---|---|
| date | Thu Sep 04 21:07:24 2014 +0100 |
| parents | bba9a2b71a78 |
| children |
line source
1 #include "ibm.h"
2 #include "keyboard_at.h"
3 #include "mouse.h"
4 #include "mouse_ps2.h"
5 #include "plat-mouse.h"
7 enum
8 {
9 MOUSE_STREAM,
10 MOUSE_REMOTE,
11 MOUSE_ECHO
12 };
14 #define MOUSE_ENABLE 0x20
15 #define MOUSE_SCALE 0x10
17 static struct
18 {
19 int mode;
21 uint8_t flags;
22 uint8_t resolution;
24 uint8_t command;
26 int cd;
27 } mouse_ps2;
29 void mouse_ps2_write(uint8_t val)
30 {
31 if (mouse_ps2.cd)
32 {
33 mouse_ps2.cd = 0;
34 switch (mouse_ps2.command)
35 {
36 case 0xe8: /*Set mouse resolution*/
37 mouse_ps2.resolution = val;
38 keyboard_at_adddata_mouse(0xfa);
39 break;
41 case 0xf3: /*Set sample rate*/
42 keyboard_at_adddata_mouse(0xfa);
43 break;
45 // default:
46 // fatal("mouse_ps2 : Bad data write %02X for command %02X\n", val, mouse_ps2.command);
47 }
48 }
49 else
50 {
51 mouse_ps2.command = val;
52 switch (mouse_ps2.command)
53 {
54 case 0xe6: /*Set scaling to 1:1*/
55 mouse_ps2.flags &= ~MOUSE_SCALE;
56 keyboard_at_adddata_mouse(0xfa);
57 break;
59 case 0xe7: /*Set scaling to 2:1*/
60 mouse_ps2.flags |= MOUSE_SCALE;
61 keyboard_at_adddata_mouse(0xfa);
62 break;
64 case 0xe8: /*Set mouse resolution*/
65 mouse_ps2.cd = 1;
66 keyboard_at_adddata_mouse(0xfa);
67 break;
69 case 0xf2: /*Read ID*/
70 keyboard_at_adddata_mouse(0xfa);
71 keyboard_at_adddata_mouse(0x00);
72 break;
74 case 0xf3: /*Set sample rate*/
75 mouse_ps2.cd = 1;
76 keyboard_at_adddata_mouse(0xfa);
77 break;
79 case 0xf4: /*Enable*/
80 mouse_ps2.flags |= MOUSE_ENABLE;
81 keyboard_at_adddata_mouse(0xfa);
82 break;
84 case 0xf5: /*Disable*/
85 mouse_ps2.flags &= ~MOUSE_ENABLE;
86 keyboard_at_adddata_mouse(0xfa);
87 break;
89 case 0xff: /*Reset*/
90 mouse_ps2.mode = MOUSE_STREAM;
91 mouse_ps2.flags = 0;
92 keyboard_at_adddata_mouse(0xfa);
93 keyboard_at_adddata_mouse(0xaa);
94 keyboard_at_adddata_mouse(0x00);
95 break;
97 // default:
98 // fatal("mouse_ps2 : Bad command %02X\n", val, mouse_ps2.command);
99 }
100 }
101 }
103 static int ps2_x = 0, ps2_y = 0, ps2_b = 0;
104 void mouse_ps2_poll(int x, int y, int b)
105 {
106 uint8_t packet[3] = {0x08, 0, 0};
107 if (!x && !y && b == ps2_b) return;
108 ps2_x += x;
109 ps2_y -= y;
110 if (mouse_ps2.mode == MOUSE_STREAM && (mouse_ps2.flags & MOUSE_ENABLE) &&
111 ((mouse_queue_end - mouse_queue_start) & 0xf) < 13)
112 {
113 ps2_b = b;
114 // pclog("Send packet : %i %i\n", ps2_x, ps2_y);
115 if (ps2_x > 255)
116 ps2_x = 255;
117 if (ps2_x < -256)
118 ps2_x = -256;
119 if (ps2_y > 255)
120 ps2_y = 255;
121 if (ps2_y < -256)
122 ps2_y = -256;
123 if (ps2_x < 0)
124 packet[0] |= 0x10;
125 if (ps2_y < 0)
126 packet[0] |= 0x20;
127 if (mouse_buttons & 1)
128 packet[0] |= 1;
129 if (mouse_buttons & 2)
130 packet[0] |= 2;
131 if (mouse_buttons & 4)
132 packet[0] |= 4;
133 packet[1] = ps2_x & 0xff;
134 packet[2] = ps2_y & 0xff;
136 ps2_x = ps2_y = 0;
138 keyboard_at_adddata_mouse(packet[0]);
139 keyboard_at_adddata_mouse(packet[1]);
140 keyboard_at_adddata_mouse(packet[2]);
141 }
142 }
145 void mouse_ps2_init()
146 {
147 mouse_poll = mouse_ps2_poll;
148 mouse_write = mouse_ps2_write;
149 mouse_ps2.cd = 0;
150 mouse_ps2.flags = 0;
151 mouse_ps2.mode = MOUSE_STREAM;
152 }
