dev #2
@ -12,6 +12,6 @@ typedef struct {
|
||||
} MouseData;
|
||||
|
||||
// Чтение мыши с порта
|
||||
MouseData read_mouse(volatile u8* port);
|
||||
void read_mouse(MouseData* dst, volatile u8* port);
|
||||
|
||||
#endif
|
||||
|
||||
@ -14,7 +14,8 @@ int main() {
|
||||
char buf[40]; //буфер строки для вывода на экран
|
||||
|
||||
while(TRUE) {
|
||||
MouseData m1 = read_mouse(PORT1);
|
||||
MouseData m1;
|
||||
read_mouse(&m1, PORT1);
|
||||
sprintf(buf, "+%X%X%X%X %X %X %X%X %X%X",
|
||||
m1.nibbles[0], m1.nibbles[1], m1.nibbles[2], m1.nibbles[3],
|
||||
m1.nibbles[4], m1.nibbles[5], m1.nibbles[6], m1.nibbles[7],
|
||||
@ -42,7 +43,8 @@ int main() {
|
||||
VDP_drawText(buf, 1, 24);
|
||||
}
|
||||
|
||||
MouseData m2 = read_mouse(PORT2);
|
||||
MouseData m2;
|
||||
read_mouse(&m2, PORT2);
|
||||
sprintf(buf, "%X%X%X%X %X %X %X%X %X%X+",
|
||||
m2.nibbles[0], m2.nibbles[1], m2.nibbles[2], m2.nibbles[3],
|
||||
m2.nibbles[4], m2.nibbles[5], m2.nibbles[6], m2.nibbles[7],
|
||||
|
||||
35
src/mouse.c
35
src/mouse.c
@ -14,41 +14,34 @@ static inline void delay(void) {
|
||||
);
|
||||
}
|
||||
|
||||
MouseData read_mouse(volatile u8* port) {
|
||||
u8 nibbles[16];
|
||||
MouseData md = {0};
|
||||
void read_mouse(MouseData* dst, volatile u8* port) {
|
||||
|
||||
dst->valid = 0;
|
||||
|
||||
Z80_HALT = 0x0100;
|
||||
*port = 0x60; delay();
|
||||
|
||||
nibbles[0] = *port & 0x0F;
|
||||
dst->nibbles[0] = *port & 0x0F;
|
||||
for(int i=1; i<10; i++) {
|
||||
*port = (i&1) ? 0x20 : 0x00;
|
||||
delay();
|
||||
nibbles[i] = *port & 0x0F;
|
||||
dst->nibbles[i] = *port & 0x0F;
|
||||
delay();
|
||||
}
|
||||
|
||||
*port = 0x60; delay();
|
||||
Z80_HALT = 0x0000;
|
||||
|
||||
// копируем нибблы для вывода RAW
|
||||
for(int i=0;i<10;i++) md.nibbles[i] = nibbles[i];
|
||||
|
||||
// проверка сигнатуры 0BFF
|
||||
if (nibbles[0]==0x0 && nibbles[1]==0xB && nibbles[2]==0xF && nibbles[3]==0xF) {
|
||||
md.valid = 1;
|
||||
s16 dx = (nibbles[6] << 4) | nibbles[7];
|
||||
s16 dy = (nibbles[8] << 4) | nibbles[9];
|
||||
if (nibbles[4] & 8) dy = 255;
|
||||
if (nibbles[4] & 4) dx = 255;
|
||||
if (nibbles[4] & 2) dy |= 0xFF00; // sign-extend
|
||||
if (nibbles[4] & 1) dx |= 0xFF00;
|
||||
if (dst->nibbles[0]==0x0 && dst->nibbles[1]==0xB && dst->nibbles[2]==0xF && dst->nibbles[3]==0xF) {
|
||||
dst->valid = 1;
|
||||
dst->dx = (dst->nibbles[6] << 4) | dst->nibbles[7];
|
||||
dst->dy = (dst->nibbles[8] << 4) | dst->nibbles[9];
|
||||
if (dst->nibbles[4] & 8) dst->dy = 255;
|
||||
if (dst->nibbles[4] & 4) dst->dx = 255;
|
||||
if (dst->nibbles[4] & 2) dst->dy |= 0xFF00; // sign-extend
|
||||
if (dst->nibbles[4] & 1) dst->dx |= 0xFF00;
|
||||
|
||||
md.dx = dx;
|
||||
md.dy = dy;
|
||||
md.buttons = nibbles[5];
|
||||
dst->buttons = dst->nibbles[5];
|
||||
}
|
||||
|
||||
return md;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user