Tweaked XT keyboard code a bit. Fixes Keyboard Error reported by AMI XT clone.
This commit is contained in:
parent
51db026b90
commit
de3379a19f
1 changed files with 11 additions and 11 deletions
|
|
@ -1,5 +1,6 @@
|
||||||
#include "ibm.h"
|
#include "ibm.h"
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
|
#include "fdd.h"
|
||||||
#include "io.h"
|
#include "io.h"
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
#include "pic.h"
|
#include "pic.h"
|
||||||
|
|
@ -31,6 +32,8 @@ struct
|
||||||
uint8_t pa;
|
uint8_t pa;
|
||||||
uint8_t pb;
|
uint8_t pb;
|
||||||
|
|
||||||
|
int shift_full;
|
||||||
|
|
||||||
int tandy;
|
int tandy;
|
||||||
int pb2_turbo;
|
int pb2_turbo;
|
||||||
} keyboard_xt;
|
} keyboard_xt;
|
||||||
|
|
@ -41,14 +44,17 @@ static int key_queue_start = 0, key_queue_end = 0;
|
||||||
void keyboard_xt_poll()
|
void keyboard_xt_poll()
|
||||||
{
|
{
|
||||||
keybsenddelay += (1000 * TIMER_USEC);
|
keybsenddelay += (1000 * TIMER_USEC);
|
||||||
|
if (!(keyboard_xt.pb & 0x40) && romset != ROM_TANDY)
|
||||||
|
return;
|
||||||
if (keyboard_xt.wantirq)
|
if (keyboard_xt.wantirq)
|
||||||
{
|
{
|
||||||
keyboard_xt.wantirq = 0;
|
keyboard_xt.wantirq = 0;
|
||||||
keyboard_xt.pa = keyboard_xt.key_waiting;
|
keyboard_xt.pa = keyboard_xt.key_waiting;
|
||||||
|
keyboard_xt.shift_full = 1;
|
||||||
picint(2);
|
picint(2);
|
||||||
pclog("keyboard_xt : take IRQ\n");
|
pclog("keyboard_xt : take IRQ\n");
|
||||||
}
|
}
|
||||||
if (key_queue_start != key_queue_end && !keyboard_xt.pa)
|
if (key_queue_start != key_queue_end && !keyboard_xt.shift_full)
|
||||||
{
|
{
|
||||||
keyboard_xt.key_waiting = key_queue[key_queue_start];
|
keyboard_xt.key_waiting = key_queue[key_queue_start];
|
||||||
pclog("Reading %02X from the key queue at %i\n", keyboard_xt.key_waiting, key_queue_start);
|
pclog("Reading %02X from the key queue at %i\n", keyboard_xt.key_waiting, key_queue_start);
|
||||||
|
|
@ -109,6 +115,9 @@ void keyboard_xt_write(uint16_t port, uint8_t val, void *priv)
|
||||||
if (!(keyboard_xt.pb & 0x40) && (val & 0x40)) /*Reset keyboard*/
|
if (!(keyboard_xt.pb & 0x40) && (val & 0x40)) /*Reset keyboard*/
|
||||||
{
|
{
|
||||||
pclog("keyboard_xt : reset keyboard\n");
|
pclog("keyboard_xt : reset keyboard\n");
|
||||||
|
key_queue_start = key_queue_end = 0;
|
||||||
|
keyboard_xt.wantirq = 0;
|
||||||
|
keyboard_xt.shift_full = 0;
|
||||||
keyboard_xt_adddata(0xaa);
|
keyboard_xt_adddata(0xaa);
|
||||||
}
|
}
|
||||||
keyboard_xt.pb = val;
|
keyboard_xt.pb = val;
|
||||||
|
|
@ -130,6 +139,7 @@ void keyboard_xt_write(uint16_t port, uint8_t val, void *priv)
|
||||||
if (val & 0x80)
|
if (val & 0x80)
|
||||||
{
|
{
|
||||||
keyboard_xt.pa = 0;
|
keyboard_xt.pa = 0;
|
||||||
|
keyboard_xt.shift_full = 0;
|
||||||
picintc(2);
|
picintc(2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -159,16 +169,6 @@ uint8_t keyboard_xt_read(uint16_t port, void *priv)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
temp = keyboard_xt.pa;
|
temp = keyboard_xt.pa;
|
||||||
if (key_queue_start == key_queue_end)
|
|
||||||
{
|
|
||||||
keyboard_xt.wantirq = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
keyboard_xt.key_waiting = key_queue[key_queue_start];
|
|
||||||
key_queue_start = (key_queue_start + 1) & 0xf;
|
|
||||||
keyboard_xt.wantirq = 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue