diff --git a/inc/mouse.h b/inc/mouse.h index bf41124..46fab17 100644 --- a/inc/mouse.h +++ b/inc/mouse.h @@ -12,6 +12,6 @@ typedef struct { } MouseData; // Чтение мыши с порта -MouseData read_mouse(volatile u8* port); +void read_mouse(MouseData* dst, volatile u8* port); #endif diff --git a/src/main.c b/src/main.c index 818433a..f64fbb4 100644 --- a/src/main.c +++ b/src/main.c @@ -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], diff --git a/src/mouse.c b/src/mouse.c index d7be0a1..1420cb0 100644 --- a/src/mouse.c +++ b/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; }