Hallo lowlevel community!
Hoffentlich störe ich euch nicht mit dem Thema,allerdings habe ich 3 Fragen zur kbc:
1:Zeichen ausgebenLetztes mal habe ich euch gefragt wie man den Keycode die Zeichen umwandle, allerdings, kann es sein das irgendwas falsch mache.
Das ganze funktioniert doch so; scancode -> Keycode -> Zeichenkette ?
Wie trage ich die Zeichen richtig in den Array ein?
Das ist jetzt so bisher:
#include "console.h"
#include "keyboard.h"
#include "stdint.h"
char list[] = {
"01"
};
char getsym(int keycode)
{
if(keycode == 0x1c)
{
kexit();
}
return list[keycode];
}
}
static uint8_t sc_to_kc[][128] = {
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 84, 00, 00, 86, 87, 88, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 }, { 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 96, 97, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 99, 00, 00, 100, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 102, 103, 104, 00, 105, 00, 106, 00, 107, 108, 109, 110, 111, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 }, };
uint8_t translate_scancode(int set, uint16_t scancode)
{
uint8_t keycode = 0;
switch (set) {
case 0:
keycode = sc_to_kc[0][scancode];
break;
case 1:
keycode = sc_to_kc[1][scancode];
break;
switch (scancode) {
case 0x451D: keycode = 119; break; default: keycode = 0x0; }; break; }
if (keycode == 0) {
} return keycode;
}
void init_keyboard(void);
static void keyboard_command(uint8_t command);
void keyboard_interrupt(void);
void init_keyboard(void)
{
while (inb(0x64) & 0x1) {
inb(0x60);
}
keyboard_command(0xF4);
}
static void keyboard_command(uint8_t command)
{
while ((inb(0x64) & 0x2))
{
}
outb(0x60, command);
}
void keyboard_interrupt(void){
char text;
uint8_t scancode;
int keycode;
uint8_t break_code = 0;
// Status-Variablen fuer das Behandeln von e0- und e1-Scancodes
static int e0_code = 0;
// Wird auf 1 gesetzt, sobald e1 gelesen wurde, und auf 2, sobald das erste
// Datenbyte gelesen wurde
static int e1_code = 0;
static uint16_t e1_prev = 0;
scancode = inb(0x60);
if ((scancode & 0x80) &&
(e1_code || (scancode != 0xE1)) &&
(e0_code || (scancode != 0xE0)))
{
break_code = 1;
scancode &= ~0x80;
}
if (e0_code) {
if ((scancode == 0x2A) || (scancode == 0x36)) {
e0_code = 0;
return;
}
keycode = translate_scancode(1, scancode);
e0_code = 0;
} else if (e1_code == 2) {
/*
e1_prev |= ((uint16_t) scancode <<;
keycode = translate_scancode(2, e1_prev);
e1_code = 0;
*/
} else if (e1_code == 1) {
e1_prev = scancode;
e1_code++;
} else if (scancode == 0xE0) {
// Anfang eines e0-Codes
e0_code = 1;
} else if (scancode == 0xE1) {
// Anfang eines e1-Codes
e1_code = 1;
} else {
// Normaler Scancode
keycode = translate_scancode(0, scancode);
}
text = getsym(keycode);
if(break_code == 0)
{
kprintf("%c",text);
}
else
{
}
}
2:Speziell Zeichen abfragenIm Code steht:
if(keycode == 0x1c)
{
kexit();
}
kexit habe ich als Funktion gemacht um den PC runter zu fahrenDamit möchte ich erreichen ,dass beim Tasten druck von Enter der Computer heruntergefahren wird, dies funktioniert aber nicht,wie würde ich das Problem lösen?
3:LesecharAnsonsten, hätte jemand von euch einen Denk anstoß um ein char namens kreadf() zu machen?Das wäre spitze
Freundliche Grüße,
Mineorbit!
EDIT:
3 ist gelöst,ich hatte nur einen syntaxfehler gemacht.