aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Serpell <daniel.serpell@gmail.com>2017-05-01 20:13:14 -0300
committerDaniel Serpell <daniel.serpell@gmail.com>2017-05-01 20:13:14 -0300
commit513a61c5fc73f7cd2d766d8d89f85219e9069e71 (patch)
tree3105aaba52c23c1f5f636e25c013ada57ba2213b
parent40c929882b9b207c7ae8109208d00b3c5a510d32 (diff)
downloademu2-513a61c5fc73f7cd2d766d8d89f85219e9069e71.tar.gz
Implements keyboard reading from port 60h, emulates all kbd interrupts.
-rw-r--r--src/keyb.c53
-rw-r--r--src/keyb.h2
-rw-r--r--src/main.c2
3 files changed, 32 insertions, 25 deletions
diff --git a/src/keyb.c b/src/keyb.c
index 9f9bee6..7e99a26 100644
--- a/src/keyb.c
+++ b/src/keyb.c
@@ -411,46 +411,49 @@ int kbhit(void)
{
init_keyboard();
queued_key = read_key();
+ if(queued_key != -1)
+ {
+ update_bios_state();
+ cpuTriggerIRQ(1);
+ }
}
- update_bios_state();
return (queued_key == -1) ? 0 : queued_key;
}
int getch(int detect_brk)
{
int ret;
- if(queued_key != -1)
+ while(queued_key == -1)
{
- ret = queued_key;
- queued_key = -1;
- return ret;
+ if( kbhit() )
+ break;
+ usleep(1000000);
+ waiting_key = 1;
+ emulator_update();
+ waiting_key = 0;
}
- else
- {
- init_keyboard();
- while((ret = read_key()) == -1)
- {
- usleep(1000000);
- waiting_key = 1;
- emulator_update();
- waiting_key = 0;
- cpuTriggerIRQ(1);
- }
- }
- update_bios_state();
- if(detect_brk && ((ret & 0xFF) == 3))
+ if(detect_brk && ((queued_key & 0xFF) == 3))
raise(SIGINT);
+ ret = queued_key;
+ queued_key = -1;
return ret;
}
void update_keyb(void)
{
- if(tty_fd >= 0 && !waiting_key)
- {
- // Check if there are keys available, and calls IRQ-1
- if(queued_key == -1 && kbhit())
- cpuTriggerIRQ(1);
- }
+ // See if any key is available:
+ if(tty_fd >= 0 && !waiting_key && queued_key == -1)
+ kbhit();
+}
+
+// Handle keyboard controller port reading
+uint8_t keyb_read_port(unsigned port)
+{
+ debug(debug_int, "keyboard read_port: %02X (key=%04X)\n", port, queued_key);
+ if(port == 0x60)
+ return queued_key >> 8;
+ else
+ return 0xFF;
}
// BIOS keyboards handler
diff --git a/src/keyb.h b/src/keyb.h
index d37b926..3de5a21 100644
--- a/src/keyb.h
+++ b/src/keyb.h
@@ -1,6 +1,8 @@
#pragma once
+#include <stdint.h>
void update_keyb(void);
int getch(int detect_brk);
int kbhit(void);
void int16(void);
+uint8_t keyb_read_port(unsigned port);
diff --git a/src/main.c b/src/main.c
index c09d206..74eabda 100644
--- a/src/main.c
+++ b/src/main.c
@@ -31,6 +31,8 @@ uint8_t read_port(unsigned port)
return 0;
else if(port >= 0x40 && port <= 0x43)
return port_timer_read(port);
+ else if(port >= 0x60 && port <= 0x65)
+ return keyb_read_port(port);
debug(debug_port, "port read %04x\n", port);
return 0xFF;
}
Un proyecto texto-plano.xyz