2018-07-31 19:01:19 +00:00
|
|
|
#include "platform.h"
|
|
|
|
|
2018-08-03 01:59:31 +00:00
|
|
|
#define KBD_STATUS_OR_KEY ((unsigned char *)0xC000)
|
|
|
|
#define KBD_CLEAR_CURRENT_KEY ((unsigned char *)0xC010)
|
2018-07-31 19:01:19 +00:00
|
|
|
|
|
|
|
#define KEY_READY_MASK 0x80
|
|
|
|
#define KEY_VALUE_MASK 0x7F
|
|
|
|
|
|
|
|
// Returns non-zero if a key is ready to be read.
|
|
|
|
int keyboard_test(void)
|
|
|
|
{
|
|
|
|
return *KBD_STATUS_OR_KEY & KEY_READY_MASK;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Clears current key, sets up next one for test or get
|
|
|
|
void keyboard_clear(void)
|
|
|
|
{
|
|
|
|
unsigned char clear_key;
|
|
|
|
|
|
|
|
// On 6502, a write cycle READS AND THEN WRITES, so just read the
|
|
|
|
// "latch next key" strobe.
|
|
|
|
clear_key = *KBD_CLEAR_CURRENT_KEY;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Wait until a key is ready and then return it without high bit set
|
|
|
|
unsigned char keyboard_get(void)
|
|
|
|
{
|
|
|
|
unsigned char key;
|
|
|
|
|
|
|
|
while(!((key = *KBD_STATUS_OR_KEY) & KEY_READY_MASK));
|
|
|
|
|
|
|
|
keyboard_clear();
|
|
|
|
|
|
|
|
return key & KEY_VALUE_MASK;
|
|
|
|
}
|