79 lines
2 KiB
C
Executable file
79 lines
2 KiB
C
Executable file
/*
|
|
File: simple_keyboard.C
|
|
|
|
Author: R. Bettati
|
|
Department of Computer Science
|
|
Texas A&M University
|
|
Date : 2017/06/30
|
|
|
|
Simple control of the keyboard.
|
|
*/
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* DEFINES */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
/* (none) */
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* INCLUDES */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
#include "assert.H"
|
|
#include "machine.H"
|
|
#include "console.H"
|
|
#include "interrupts.H"
|
|
#include "simple_keyboard.H"
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* CONSTRUCTOR */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
SimpleKeyboard::SimpleKeyboard() {
|
|
key_pressed = false;
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/* METHODS FOR CLASS S i m p l e K e y b o a r d */
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
void SimpleKeyboard::handle_interrupt(REGS *_r) {
|
|
/* What to do when keyboard interrupt occurs? In this case, we update
|
|
"key_pressed". */
|
|
|
|
unsigned char status = Machine::inportb(STATUS_PORT);
|
|
/* lowest bit of status will be set if buffer is not empty. */
|
|
if (status & 0x01) {
|
|
char kc = Machine::inportb(DATA_PORT);
|
|
if (kc >= 0) {
|
|
key_pressed = true;
|
|
key_code = kc;
|
|
}
|
|
}
|
|
}
|
|
|
|
void SimpleKeyboard::wait() {
|
|
/* Loop until the user presses a key. */
|
|
|
|
kb.key_pressed = false;
|
|
|
|
while(kb.key_pressed == false);
|
|
|
|
}
|
|
|
|
char SimpleKeyboard::read() {
|
|
/* Loop until the user presses a key, and then return the keycode. */
|
|
kb.key_pressed = false;
|
|
|
|
while (kb.key_pressed == false);
|
|
|
|
return kb.key_code;
|
|
}
|
|
|
|
SimpleKeyboard SimpleKeyboard::kb;
|
|
|
|
void SimpleKeyboard::init() {
|
|
InterruptHandler::register_handler(1, &kb);
|
|
}
|
|
|
|
|