reformatted

This commit is contained in:
Markus Fröschle
2014-05-11 20:38:33 +00:00
parent 86b1f17deb
commit ac9a887a39
2 changed files with 231 additions and 207 deletions

View File

@@ -1,2 +1,2 @@
~/Dokumente/Development/workspace/BaS_gcc/include include
/usr/m68k-elf/include /usr/m68k-elf/include

View File

@@ -40,276 +40,300 @@ static unsigned char tx_queue[QUEUE_LEN];
static unsigned char wptr = 0, rptr = 0; static unsigned char wptr = 0, rptr = 0;
// structure to keep track of ikbd state // structure to keep track of ikbd state
static struct { static struct
unsigned char cmd; {
unsigned char state; unsigned char cmd;
unsigned char expect; unsigned char state;
unsigned char expect;
// joystick state // joystick state
unsigned char joystick[2]; unsigned char joystick[2];
// mouse state // mouse state
unsigned short mouse_pos_x, mouse_pos_y; unsigned short mouse_pos_x, mouse_pos_y;
unsigned char mouse_buttons; unsigned char mouse_buttons;
} ikbd; } ikbd;
// #define IKBD_DEBUG // #define IKBD_DEBUG
void ikbd_init() { void ikbd_init()
// reset ikbd state {
memset(&ikbd, 0, sizeof(ikbd)); // reset ikbd state
ikbd.state = IKBD_DEFAULT; memset(&ikbd, 0, sizeof(ikbd));
ikbd.state = IKBD_DEFAULT;
} }
static void enqueue(unsigned char b) { static void enqueue(unsigned char b)
if(((wptr + 1)&(QUEUE_LEN-1)) == rptr) { {
xprintf("IKBD: !!!!!!! tx queue overflow !!!!!!!!!\n"); if (((wptr + 1)&(QUEUE_LEN-1)) == rptr)
return; {
} xprintf("IKBD: !!!!!!! tx queue overflow !!!!!!!!!\n");
return;
}
tx_queue[wptr] = b; tx_queue[wptr] = b;
wptr = (wptr+1)&(QUEUE_LEN-1); wptr = (wptr + 1) & (QUEUE_LEN - 1);
} }
// convert internal joystick format into atari ikbd format // convert internal joystick format into atari ikbd format
static unsigned char joystick_map2ikbd(unsigned in) { static unsigned char joystick_map2ikbd(unsigned in)
unsigned char out = 0; {
unsigned char out = 0;
if(in & JOY_UP) out |= 0x01; if (in & JOY_UP) out |= 0x01;
if(in & JOY_DOWN) out |= 0x02; if (in & JOY_DOWN) out |= 0x02;
if(in & JOY_LEFT) out |= 0x04; if (in & JOY_LEFT) out |= 0x04;
if(in & JOY_RIGHT) out |= 0x08; if (in & JOY_RIGHT) out |= 0x08;
if(in & JOY_BTN1) out |= 0x80; if (in & JOY_BTN1) out |= 0x80;
return out; return out;
} }
// process inout from atari core into ikbd // process inout from atari core into ikbd
void ikbd_handle_input(unsigned char cmd) { void ikbd_handle_input(unsigned char cmd)
// expecting a second byte for command {
if(ikbd.expect) { // expecting a second byte for command
ikbd.expect--; if (ikbd.expect)
{
ikbd.expect--;
// last byte of command received // last byte of command received
if(!ikbd.expect) { if (!ikbd.expect)
switch(ikbd.cmd) { {
case 0x07: // set mouse button action switch(ikbd.cmd)
xprintf("IKBD: mouse button action = %x\n", cmd); {
case 0x07: // set mouse button action
xprintf("IKBD: mouse button action = %x\n", cmd);
// bit 2: Mouse buttons act like keys (LEFT=0x74 & RIGHT=0x75) // bit 2: Mouse buttons act like keys (LEFT=0x74 & RIGHT=0x75)
if(cmd & 0x04) ikbd.state |= IKBD_STATE_MOUSE_BUTTON_AS_KEY; if(cmd & 0x04) ikbd.state |= IKBD_STATE_MOUSE_BUTTON_AS_KEY;
else ikbd.state &= ~IKBD_STATE_MOUSE_BUTTON_AS_KEY; else ikbd.state &= ~IKBD_STATE_MOUSE_BUTTON_AS_KEY;
break; break;
case 0x80: // ibkd reset case 0x80: // ibkd reset
// reply "everything is ok" // reply "everything is ok"
enqueue(0xf0); enqueue(0xf0);
break; break;
default: default:
break; break;
} }
}
return;
} }
return; ikbd.cmd = cmd;
}
ikbd.cmd = cmd; switch(cmd)
{
case 0x07:
xprintf("IKBD: Set mouse button action");
ikbd.expect = 1;
break;
switch(cmd) { case 0x08:
case 0x07: xprintf("IKBD: Set relative mouse positioning");
xprintf("IKBD: Set mouse button action"); ikbd.state &= ~IKBD_STATE_MOUSE_DISABLED;
ikbd.expect = 1; ikbd.state &= ~IKBD_STATE_MOUSE_ABSOLUTE;
break; break;
case 0x08: case 0x09:
xprintf("IKBD: Set relative mouse positioning"); xprintf("IKBD: Set absolute mouse positioning");
ikbd.state &= ~IKBD_STATE_MOUSE_DISABLED; ikbd.state &= ~IKBD_STATE_MOUSE_DISABLED;
ikbd.state &= ~IKBD_STATE_MOUSE_ABSOLUTE; ikbd.state |= IKBD_STATE_MOUSE_ABSOLUTE;
break; ikbd.expect = 4;
break;
case 0x09: case 0x0b:
xprintf("IKBD: Set absolute mouse positioning"); xprintf("IKBD: Set Mouse threshold");
ikbd.state &= ~IKBD_STATE_MOUSE_DISABLED; ikbd.expect = 2;
ikbd.state |= IKBD_STATE_MOUSE_ABSOLUTE; break;
ikbd.expect = 4;
break;
case 0x0b: case 0x0f:
xprintf("IKBD: Set Mouse threshold"); xprintf("IKBD: Set Y at bottom");
ikbd.expect = 2; ikbd.state |= IKBD_STATE_MOUSE_Y_BOTTOM;
break; break;
case 0x0f: case 0x10:
xprintf("IKBD: Set Y at bottom"); xprintf("IKBD: Set Y at top");
ikbd.state |= IKBD_STATE_MOUSE_Y_BOTTOM; ikbd.state &= ~IKBD_STATE_MOUSE_Y_BOTTOM;
break; break;
case 0x10: case 0x12:
xprintf("IKBD: Set Y at top"); xprintf("IKBD: Disable mouse");
ikbd.state &= ~IKBD_STATE_MOUSE_Y_BOTTOM; ikbd.state |= IKBD_STATE_MOUSE_DISABLED;
break; break;
case 0x12: case 0x14:
xprintf("IKBD: Disable mouse"); xprintf("IKBD: Set Joystick event reporting");
ikbd.state |= IKBD_STATE_MOUSE_DISABLED; ikbd.state |= IKBD_STATE_JOYSTICK_EVENT_REPORTING;
break; break;
case 0x14: case 0x15:
xprintf("IKBD: Set Joystick event reporting"); xprintf("IKBD: Set Joystick interrogation mode");
ikbd.state |= IKBD_STATE_JOYSTICK_EVENT_REPORTING; ikbd.state &= ~IKBD_STATE_JOYSTICK_EVENT_REPORTING;
break; break;
case 0x15: case 0x16: // interrogate joystick
xprintf("IKBD: Set Joystick interrogation mode"); // send reply
ikbd.state &= ~IKBD_STATE_JOYSTICK_EVENT_REPORTING; enqueue(0xfd);
break; enqueue(joystick_map2ikbd(ikbd.joystick[0]));
enqueue(joystick_map2ikbd(ikbd.joystick[1]));
break;
case 0x16: // interrogate joystick case 0x1a:
// send reply xprintf("IKBD: Disable joysticks");
enqueue(0xfd); ikbd.state &= ~IKBD_STATE_JOYSTICK_EVENT_REPORTING;
enqueue(joystick_map2ikbd(ikbd.joystick[0])); break;
enqueue(joystick_map2ikbd(ikbd.joystick[1]));
break;
case 0x1a: case 0x1c:
xprintf("IKBD: Disable joysticks"); xprintf("IKBD: Interrogate time of day");
ikbd.state &= ~IKBD_STATE_JOYSTICK_EVENT_REPORTING;
break;
case 0x1c: enqueue(0xfc);
xprintf("IKBD: Interrogate time of day"); enqueue(0x13); // year bcd
enqueue(0x03); // month bcd
enqueue(0x07); // day bcd
enqueue(0x20); // hour bcd
enqueue(0x58); // minute bcd
enqueue(0x00); // second bcd
break;
enqueue(0xfc);
enqueue(0x13); // year bcd
enqueue(0x03); // month bcd
enqueue(0x07); // day bcd
enqueue(0x20); // hour bcd
enqueue(0x58); // minute bcd
enqueue(0x00); // second bcd
break;
case 0x80: case 0x80:
xprintf("IKBD: Reset"); xprintf("IKBD: Reset");
ikbd.expect = 1; ikbd.expect = 1;
ikbd.state = IKBD_DEFAULT; ikbd.state = IKBD_DEFAULT;
break; break;
default: default:
xprintf("IKBD: unknown command: %x\n", cmd); xprintf("IKBD: unknown command: %x\n", cmd);
break; break;
} }
} }
void ikbd_poll(void) { void ikbd_poll(void) {
static int mtimer = 0; static int mtimer = 0;
if(CheckTimer(mtimer)) { if (CheckTimer(mtimer))
mtimer = GetTimer(10); {
mtimer = GetTimer(10);
// check for incoming ikbd data
// check for incoming ikbd data
EnableIO();
SPI(UIO_IKBD_IN);
while(SPI(0))
ikbd_handle_input(SPI(0));
DisableIO();
}
// send data from queue if present
if(rptr == wptr) return;
// transmit data from queue
EnableIO(); EnableIO();
SPI(UIO_IKBD_IN); SPI(UIO_IKBD_OUT);
SPI(tx_queue[rptr]);
while(SPI(0))
ikbd_handle_input(SPI(0));
DisableIO(); DisableIO();
}
// send data from queue if present rptr = (rptr + 1) & (QUEUE_LEN - 1);
if(rptr == wptr) return;
// transmit data from queue
EnableIO();
SPI(UIO_IKBD_OUT);
SPI(tx_queue[rptr]);
DisableIO();
rptr = (rptr+1)&(QUEUE_LEN-1);
} }
void ikbd_joystick(unsigned char joystick, unsigned char map) { void ikbd_joystick(unsigned char joystick, unsigned char map)
// todo: suppress events for joystick 0 as long as mouse {
// is enabled? // todo: suppress events for joystick 0 as long as mouse
// is enabled?
if(ikbd.state & IKBD_STATE_JOYSTICK_EVENT_REPORTING) {
if (ikbd.state & IKBD_STATE_JOYSTICK_EVENT_REPORTING)
{
#ifdef IKBD_DEBUG #ifdef IKBD_DEBUG
xprintf("IKBD: joy %d %x\n", joystick, map); xprintf("IKBD: joy %d %x\n", joystick, map);
#endif #endif
// only report joystick data for joystick 0 if the mouse is disabled // only report joystick data for joystick 0 if the mouse is disabled
if((ikbd.state & IKBD_STATE_MOUSE_DISABLED) || (joystick == 1)) { if ((ikbd.state & IKBD_STATE_MOUSE_DISABLED) || (joystick == 1))
enqueue(0xfe + joystick); {
enqueue(joystick_map2ikbd(map)); enqueue(0xfe + joystick);
enqueue(joystick_map2ikbd(map));
}
if (!(ikbd.state & IKBD_STATE_MOUSE_DISABLED))
{
// the fire button also generates a mouse event if
// mouse reporting is enabled
if ((map & JOY_BTN1) != (ikbd.joystick[joystick] & JOY_BTN1))
{
// generate mouse event (ikbd_joystick_buttons is evaluated inside
// user_io_mouse)
ikbd.joystick[joystick] = map;
ikbd_mouse(0, 0, 0);
}
}
} }
if(!(ikbd.state & IKBD_STATE_MOUSE_DISABLED)) {
// the fire button also generates a mouse event if
// mouse reporting is enabled
if((map & JOY_BTN1) != (ikbd.joystick[joystick] & JOY_BTN1)) {
// generate mouse event (ikbd_joystick_buttons is evaluated inside
// user_io_mouse)
ikbd.joystick[joystick] = map;
ikbd_mouse(0, 0, 0);
}
}
}
#ifdef IKBD_DEBUG #ifdef IKBD_DEBUG
else else
xprintf("IKBD: no monitor, drop joy %d %x\n", joystick, map); xprintf("IKBD: no monitor, drop joy %d %x\n", joystick, map);
#endif #endif
// save state of joystick for interrogation mode // save state of joystick for interrogation mode
ikbd.joystick[joystick] = map; ikbd.joystick[joystick] = map;
} }
void ikbd_keyboard(unsigned char code) { void ikbd_keyboard(unsigned char code)
{
#ifdef IKBD_DEBUG #ifdef IKBD_DEBUG
xprintf("IKBD: send keycode %x%s\n", code&0x7f, (code&0x80)?" BREAK":""); xprintf("IKBD: send keycode %x%s\n", code&0x7f, (code&0x80)?" BREAK":"");
#endif #endif
enqueue(code); enqueue(code);
} }
void ikbd_mouse(uint8_t b, int8_t x, int8_t y) { void ikbd_mouse(uint8_t b, int8_t x, int8_t y)
if(ikbd.state & IKBD_STATE_MOUSE_DISABLED) {
return; if (ikbd.state & IKBD_STATE_MOUSE_DISABLED)
return;
// joystick and mouse buttons are wired together in // joystick and mouse buttons are wired together in
// atari st // atari st
b |= (ikbd.joystick[0] & JOY_BTN1)?1:0; b |= (ikbd.joystick[0] & JOY_BTN1)?1:0;
b |= (ikbd.joystick[1] & JOY_BTN1)?2:0; b |= (ikbd.joystick[1] & JOY_BTN1)?2:0;
static unsigned char b_old = 0; static unsigned char b_old = 0;
// monitor state of two mouse buttons // monitor state of two mouse buttons
if(b != b_old) { if (b != b_old)
// check if mouse buttons are supposed to be treated like keys {
if(ikbd.state & IKBD_STATE_MOUSE_BUTTON_AS_KEY) { // check if mouse buttons are supposed to be treated like keys
// Mouse buttons act like keys (LEFT=0x74 & RIGHT=0x75) if (ikbd.state & IKBD_STATE_MOUSE_BUTTON_AS_KEY)
{
// handle left mouse button // Mouse buttons act like keys (LEFT=0x74 & RIGHT=0x75)
if((b ^ b_old) & 1) ikbd_keyboard(0x74 | ((b&1)?0x00:0x80));
// handle right mouse button // handle left mouse button
if((b ^ b_old) & 2) ikbd_keyboard(0x75 | ((b&2)?0x00:0x80)); if((b ^ b_old) & 1) ikbd_keyboard(0x74 | ((b&1)?0x00:0x80));
// handle right mouse button
if((b ^ b_old) & 2) ikbd_keyboard(0x75 | ((b&2)?0x00:0x80));
}
b_old = b;
} }
b_old = b;
}
#if 0 #if 0
if(ikbd.state & IKBD_STATE_MOUSE_BUTTON_AS_KEY) { if(ikbd.state & IKBD_STATE_MOUSE_BUTTON_AS_KEY)
b = 0; {
// if mouse position is 0/0 quit here b = 0;
if(!x && !y) return; // if mouse position is 0/0 quit here
} if(!x && !y) return;
}
#endif #endif
if(ikbd.state & IKBD_STATE_MOUSE_ABSOLUTE) { if (ikbd.state & IKBD_STATE_MOUSE_ABSOLUTE)
} else { {
// atari has mouse button bits swapped }
enqueue(0xf8|((b&1)?2:0)|((b&2)?1:0)); else
enqueue(x); {
enqueue((ikbd.state & IKBD_STATE_MOUSE_Y_BOTTOM)?-y:y); // atari has mouse button bits swapped
} enqueue(0xf8|((b&1)?2:0)|((b&2)?1:0));
enqueue(x);
enqueue((ikbd.state & IKBD_STATE_MOUSE_Y_BOTTOM)?-y:y);
}
} }