1

implement exercise 04 interrupts

This commit is contained in:
churl
2022-05-14 21:12:32 +02:00
parent deb0ebd8eb
commit 13df44fb6f
8 changed files with 208 additions and 120 deletions

View File

@ -9,6 +9,7 @@
*****************************************************************************/
#include "devices/Keyboard.h"
#include "kernel/Globals.h"
/* Tabellen fuer ASCII-Codes (Klassenvariablen) intiialisieren */
@ -321,3 +322,44 @@ void Keyboard::set_led(char led, bool on) {
/* Hier muss Code eingefuegt werden. */
}
// Registriert die Tastatur ISR im IntDispatcher
// und erlaubt den keyboard interrupt
void Keyboard::plugin(IntDispatcher& intdis, PIC& pic) {
intdis.assign(IntDispatcher::keyboard, *this);
pic.allow(PIC::keyboard);
}
void scroll_mode(Key key);
void Keyboard::trigger() {
// TODO: Get data from PS/2 Mouse if necessary
Key key = this->key_hit();
// NOTE: My keyboard has no delete key...
if (key.ctrl_left() && key.alt_left() && (char)key == 'r') {
this->reboot();
}
scroll_mode(key);
// kout.show(0, 0, (char)key);
}
// TODO: Where to place this?
// Waits for keys to control the scrollback buffer display
void scroll_mode(Key key) {
kout.show(kout.COLUMNS - 1, 0, (char)(48 + kout.current_page));
switch ((char)key) {
case 'k':
kout.scroll_page_backward();
kout.show(kout.COLUMNS - 1, 0, (char)(48 + kout.current_page));
break;
case 'j':
kout.scroll_page_forward();
kout.show(kout.COLUMNS - 1, 0, (char)(48 + kout.current_page));
break;
}
}

View File

@ -12,44 +12,53 @@
#define __Keyboard_include__
#include "devices/Key.h"
#include "kernel/IOport.h"
#include "kernel/interrupts/IntDispatcher.h"
#include "kernel/interrupts/ISR.h"
#include "kernel/interrupts/PIC.h"
#include "kernel/IOport.h"
class Keyboard : public ISR {
private:
Keyboard(const Keyboard &copy); // Verhindere Kopieren
unsigned char code; // Byte von Tastatur
unsigned char prefix; // Prefix von Tastatur
Key gather; // letzter dekodierter Key
char leds; // Zustand LEDs
private:
Keyboard(const Keyboard& copy); // Verhindere Kopieren
unsigned char code; // Byte von Tastatur
unsigned char prefix; // Prefix von Tastatur
Key gather; // letzter dekodierter Key
char leds; // Zustand LEDs
// Benutzte Ports des Tastaturcontrollers
const IOport ctrl_port; // Status- (R) u. Steuerregister (W)
const IOport data_port; // Ausgabe- (R) u. Eingabepuffer (W)
const IOport ctrl_port; // Status- (R) u. Steuerregister (W)
const IOport data_port; // Ausgabe- (R) u. Eingabepuffer (W)
// Bits im Statusregister
enum { outb = 0x01, inpb = 0x02, auxb = 0x20 };
enum { outb = 0x01,
inpb = 0x02,
auxb = 0x20 };
// Kommandos an die Tastatur
struct kbd_cmd {
enum { set_led = 0xed, set_speed = 0xf3 };
enum { set_led = 0xed,
set_speed = 0xf3 };
};
enum { cpu_reset = 0xfe };
// Namen der LEDs
struct led {
enum { caps_lock = 4, num_lock = 2, scroll_lock = 1 };
};
enum { caps_lock = 4,
num_lock = 2,
scroll_lock = 1 };
};
// Antworten der Tastatur
struct kbd_reply {
enum { ack = 0xfa };
};
};
// Konstanten fuer die Tastaturdekodierung
enum { break_bit = 0x80, prefix1 = 0xe0, prefix2 = 0xe1 };
enum { break_bit = 0x80,
prefix1 = 0xe0,
prefix2 = 0xe1 };
// Klassenvariablen
static unsigned char normal_tab[];
@ -57,36 +66,35 @@ private:
static unsigned char alt_tab[];
static unsigned char asc_num_tab[];
static unsigned char scan_num_tab[];
// Interpretiert die Make und Break-Codes der Tastatur.
bool key_decoded ();
bool key_decoded();
// Ermittelt anhand von Tabellen den ASCII-Code.
void get_ascii_code ();
void get_ascii_code();
public:
// Initialisierung der Tastatur.
Keyboard();
// Initialisierung der Tastatur.
Keyboard ();
// Tastaturabfrage (vorerst Polling)
Key key_hit();
// Tastaturabfrage (vorerst Polling)
Key key_hit ();
// Fuehrt einen Neustart des Rechners durch.
void reboot();
// Fuehrt einen Neustart des Rechners durch.
void reboot ();
// Einstellen der Wiederholungsrate der Tastatur.
void set_repeat_rate(int speed, int delay);
// Einstellen der Wiederholungsrate der Tastatur.
void set_repeat_rate (int speed, int delay);
// Setzt oder loescht die angegebene Leuchtdiode.
void set_led(char led, bool on);
// Setzt oder loescht die angegebene Leuchtdiode.
void set_led (char led, bool on);
// Aktivierung der Unterbrechungen fuer die Tastatur
// TODO: NOTE: I added this (parameters), but is it supposed to be this way?
void plugin(IntDispatcher& intdis, PIC& pic);
// Aktivierung der Unterbrechungen fuer die Tastatur
void plugin ();
// Unterbrechnungsroutine der Tastatur.
void trigger ();
// Unterbrechnungsroutine der Tastatur.
void trigger() override;
};
#endif