diff options
author | Daniel Serpell <daniel.serpell@gmail.com> | 2017-05-01 20:13:14 -0300 |
---|---|---|
committer | Daniel Serpell <daniel.serpell@gmail.com> | 2017-05-01 20:13:14 -0300 |
commit | 513a61c5fc73f7cd2d766d8d89f85219e9069e71 (patch) | |
tree | 3105aaba52c23c1f5f636e25c013ada57ba2213b | |
parent | 40c929882b9b207c7ae8109208d00b3c5a510d32 (diff) | |
download | emu2-513a61c5fc73f7cd2d766d8d89f85219e9069e71.tar.gz |
Implements keyboard reading from port 60h, emulates all kbd interrupts.
-rw-r--r-- | src/keyb.c | 53 | ||||
-rw-r--r-- | src/keyb.h | 2 | ||||
-rw-r--r-- | src/main.c | 2 |
3 files changed, 32 insertions, 25 deletions
@@ -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 @@ -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); @@ -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; } |