My OS freezes whenever I do something similar to the following:
Code: Select all
// code
char buffer[1024];
keyboardRead(buffer);
// keyboard.h
#ifndef __K_KEYBOARD_H__
#define __K_KEYBOARD_H__
#include <kernel.lib/assembly.h>
#define KEY_SHIFT 1
extern unsigned char keyChr;
extern void keyboardRead(char *buffer);
extern void keyboardClearKey();
extern void keyboardHandler(struct TRegisters *registers);
extern void keyboardInit();
#endif // __K_KEYBOARD_H__
// keyboard.c
#include <kernel.lib/hardware.h>
#include <kernel.lib/memory.h>
#include <kernel.lib/vga.h>
#include <kernel.sys/irq.h>
#include <kernel.sys/keyboard.h>
#include <kernel.sys/timer.h>
int keyboardScan = 0;
char *keyBuf;
unsigned short keyboardStatus = 0;
unsigned char keyboard[1][2][128] = {
{
{
0, 27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-',
'=', '\b', '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p',
'[', ']', '\n', 0, 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l',
';', '\'', '`', 0, '\\', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',',
'.', '/', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, '-', 0, 0, 0,
'+', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
},
{
0, 27, '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_',
'+', '\b', '\t', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P',
'{', '}', '\n', 0, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L',
':', '"', '~', 0, '|', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<',
'>', '?', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, '-', 0, 0, 0,
'+', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
}
}
}, keyChr = '\0';
/**
* keyboardRead - Starts reading to a user-specified buffer
* buffer - Pointer to the buffer
*/
void keyboardRead(char *buffer) {
keyboardScan = 1;
keyBuf = buffer;
while (keyboardScan == 1) {
}
}
/**
* keyboardHandler - Handles keypresses
* registers - Registers at the time of the event
*/
void keyboardHandler(struct TRegisters *registers) {
unsigned char scanCode;
// Get rid of those nasty unused parameter warnings
if (registers->intNumber == 1) { }
// Read the byte from port 0x60
scanCode = readB(0x60);
if (scanCode == 42 || scanCode == 54) {
keyboardStatus |= (1 << KEY_SHIFT);
}
if (scanCode == 42 + 128 || scanCode == 54 + 128) {
keyboardStatus &= ~(1 << KEY_SHIFT);
}
if (keyboardStatus & (1 << KEY_SHIFT)) {
keyChr = keyboard[0][1][scanCode];
printChr(keyChr);
if (keyboardScan == 1) {
if (keyChr == '\n') {
keyboardScan = 0;
} else {
*keyBuf++ = keyChr;
}
}
} else {
// Make sure that this isn't a released key!
if (scanCode < 128) {
keyChr = keyboard[0][0][scanCode];
printChr(keyChr);
if (keyboardScan == 1) {
if (keyChr == '\n') {
keyboardScan = 0;
} else {
*keyBuf++ = keyChr;
}
}
}
}
writeB(0x20, 0x20);
}
/**
* keyboardInit - Initializes the keyboard
*/
void keyboardInit() {
irqInstall(1, keyboardHandler);
}
![Sad :(](./images/smilies/icon_sad.gif)