nuclear@0: #include nuclear@0: #include "mouse.h" nuclear@0: #include "inttypes.h" nuclear@0: nuclear@0: nuclear@0: #define REG_BASE_ADDR 0xdff000 nuclear@0: #define REGNO_JOY0DAT 0x00a nuclear@0: #define REG_JOY0DAT *(volatile uint16_t*)(REG_BASE_ADDR | REGNO_JOY0DAT) nuclear@0: #define REG_CIAA_PORTA *(volatile uint8_t*)0xbfe001 nuclear@0: nuclear@0: #define CIAA_PA_FIR0 0x40 nuclear@0: #define CIAA_PA_FIR1 0x80 nuclear@0: nuclear@0: static int xrng[2] = {0, 320}; nuclear@0: static int yrng[2] = {0, 240}; nuclear@0: nuclear@0: void set_mouse_bounds(int x0, int y0, int x1, int y1) nuclear@0: { nuclear@0: xrng[0] = x0; nuclear@0: xrng[1] = x1; nuclear@0: yrng[0] = y0; nuclear@0: yrng[1] = y1; nuclear@0: } nuclear@0: nuclear@0: int mouse_state(int *x, int *y) nuclear@0: { nuclear@0: mouse_pos(x, y); nuclear@0: return mouse_bnstate(); nuclear@0: } nuclear@0: nuclear@0: int mouse_bnstate(void) nuclear@0: { nuclear@0: /* TODO: handle right mouse button */ nuclear@0: return (REG_CIAA_PORTA & CIAA_PA_FIR0) ? 0 : 1; nuclear@0: } nuclear@0: nuclear@0: /* TODO: for when I feel like making a proper mouse handler nuclear@0: * use vblank interrupt vector to read the mouse register once nuclear@0: * and have mouse_pos (and friends) simply access the global data nuclear@0: */ nuclear@0: void mouse_pos(int *x, int *y) nuclear@0: { nuclear@0: static int xpos, ypos; nuclear@0: static int prev_xcount, prev_ycount; nuclear@0: int xcount, ycount, dx, dy; nuclear@0: uint16_t raw = REG_JOY0DAT; nuclear@0: nuclear@0: xcount = raw & 0xff; nuclear@0: ycount = raw >> 8; nuclear@0: nuclear@0: dx = xcount - prev_xcount; nuclear@0: dy = ycount - prev_ycount; nuclear@0: nuclear@0: if(abs(dx) > 127) dx = 255 - (xcount - prev_xcount); nuclear@0: if(abs(dy) > 127) dy = 255 - (ycount - prev_ycount); nuclear@0: prev_xcount = xcount; nuclear@0: prev_ycount = ycount; nuclear@0: nuclear@0: xpos += dx; nuclear@0: ypos += dy; nuclear@0: nuclear@0: if(xpos < xrng[0]) xpos = xrng[0]; nuclear@0: if(ypos < yrng[0]) ypos = yrng[0]; nuclear@0: if(xpos >= xrng[1]) xpos = xrng[1] - 1; nuclear@0: if(ypos >= yrng[1]) ypos = yrng[1] - 1; nuclear@0: nuclear@0: *x = xpos; nuclear@0: *y = ypos; nuclear@0: }