1
Lowlevel-Coding / Re: Tastatur Eingabe
« am: 27. November 2011, 19:07 »
Oh man, man kann ja auch Interrupts maskieren, damit sollte es doch dann gehen, oder?
23. November 2024, 11:49
Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.
void handle_interrupt(struct cpu_state* cpu)
{
if (cpu->intr <= 0x1f) {
print("Exception %d, Kernel angehalten!");
moveCursor(0,0);
// TODO Hier den CPU-Zustand ausgeben
while(1) {
// Prozessor anhalten
asm volatile("cli; hlt");
}
} else if (cpu->intr >= 0x20 && cpu->intr <= 0x2f) {
if(cpu->intr == 33){ // Tastatur
mprintf(byteToChar(key_ins),80*13,0x07); //Nur ne Ausgabe wieviel Tastenanschläge bzw. Tastatur Interrupts es gab
moveCursor(0,0);
unsigned char flag;
unsigned char input;
flag = inb(0x64) & (0x01); //Hier ggf noch überprüfen ob flag auch wirklich gesetzt bevors weiter geht
input = inb(0x60);
new_checkKeys(flag, input); //schreibt mir in ne bitmaske welche tasten gerade gedrückt sind
if((readKeys > 0) && (input < 128))
new_getLine_int(flag, input); //ruft die methode auf welche nacheinander die Zeichen in den Buffer lädt
key_ins++;
} else
if(cpu->intr == 32){ //timer
mprintf(byteToChar(tim),80*12,0x07); //Ausgabe von Timer Interrupt Anzahl -> Zeit seit dem das programm leuft
moveCursor(0,0);
tim++; //und Variable hochzählen
}
if(readKeys > 0 ){ //--> Hier is die Frage ob man des so machen kann, also wenn readKeys auf 1 is, den Prozessor noch im Interrupt schlafen legen
outb(0x20, 0x20);// und warten bis neuer Interrupt kommt
outb(0xa0, 0x20);
asm volatile ("sti;hlt");
}
if (cpu->intr >= 0x28) {
// EOI an Slave-PIC
outb(0xa0, 0x20);
}
// EOI an Master-PIC
outb(0x20, 0x20);
} else {
print("Unbekannter Interrupt");
while(1) {
// Prozessor anhalten
asm volatile("cli; hlt");
}
}
}
void pit_init(int freq)
{
freq = 1193182 / freq;
outb(0x43, 0x34);
outb(0x40,freq & 0xFF);
outb(0x40,freq >> 8);
}
eingestellt hab, hat mein handler einfach mal garnichts gemacht...static inline unsigned long getTime(void){
unsigned long h,l;
asm volatile ("xor %ah, %ah");
asm volatile ("int $0x1a": "=c" (h), "=d" (l));
return ((h<<16) | (l & 0x00ff));
}