This repository has been archived on 2025-04-11. You can view files and clone it, but cannot push or open issues or pull requests.
csce410pine64backup/MP3/MP3_Sources/simple_keyboard.C

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);
}