Merge branch 'cpu&memory' into BetterTerm
This commit is contained in:
commit
a2280e31e2
|
@ -38,6 +38,7 @@ extern error_t IoInitVGABuffer(void);
|
||||||
|
|
||||||
//io/keyb.c
|
//io/keyb.c
|
||||||
extern void IoSetupKeyb(void);
|
extern void IoSetupKeyb(void);
|
||||||
|
extern void IoEnableKeyb(void);
|
||||||
|
|
||||||
//io/rtc.c
|
//io/rtc.c
|
||||||
extern void IoSetupRtc(void);
|
extern void IoSetupRtc(void);
|
||||||
|
@ -87,21 +88,20 @@ noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic, void *codeSeg)
|
||||||
|
|
||||||
// Drivers ISR inits
|
// Drivers ISR inits
|
||||||
IoSetupRtc();
|
IoSetupRtc();
|
||||||
|
IoSetupKeyb();
|
||||||
// Interrupts launching
|
// Interrupts launching
|
||||||
IdtSetup();
|
IdtSetup();
|
||||||
KeEnableIRQs();
|
KeEnableIRQs();
|
||||||
// Drivers enabling
|
// Drivers enabling
|
||||||
IoEnableRtc();
|
IoEnableRtc();
|
||||||
|
IoEnableKeyb();
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
asm volatile ("hlt");
|
|
||||||
if (IoRtcTicks > 2000) {
|
|
||||||
KernLog("CC\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
KernLog("\nGoodbye after %d ticks", IoRtcTicks);
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
KernLog("\nGoodbye after %d ticks", IoRtcTicks);
|
||||||
// End this machine's suffering
|
// End this machine's suffering
|
||||||
BFlushBuf(BStdOut);
|
BFlushBuf(BStdOut);
|
||||||
KeCrashSystem();
|
KeCrashSystem();
|
||||||
|
|
|
@ -24,18 +24,83 @@
|
||||||
|
|
||||||
#include <kernel/base.h>
|
#include <kernel/base.h>
|
||||||
#include <kernel/iomisc.h>
|
#include <kernel/iomisc.h>
|
||||||
|
#include <extras/buf.h>
|
||||||
|
|
||||||
extern void KeybIsr(void);
|
extern void KeybIsr(void);
|
||||||
extern void IdtRegisterIrq(void (*isr)(void), uchar irq, uchar flags);
|
extern void IdtRegisterIrq(void (*isr)(void), uchar irq, uchar flags);
|
||||||
extern void SendEOItoPIC(void);
|
extern void SendEOItoPIC(void);
|
||||||
|
char ScanCodes[100] = { 0 };
|
||||||
|
|
||||||
void IoSetupKeyb(void)
|
void IoSetupKeyb(void)
|
||||||
{
|
{
|
||||||
IdtRegisterIrq(KeybIsr, 0x21, 0x8E);
|
IdtRegisterIrq(KeybIsr, 0x21, 0x8E);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void KeybPrint(char code)
|
||||||
|
{
|
||||||
|
if (code) {
|
||||||
|
bprintf(BStdOut, "%c", ScanCodes[(int)code]);
|
||||||
|
BFlushBuf(BStdOut);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uchar KeybHandler(void)
|
void ScanCodesInit(void)
|
||||||
|
{
|
||||||
|
ScanCodes[0x02] = '1';
|
||||||
|
ScanCodes[0x03] = '2';
|
||||||
|
ScanCodes[0x04] = '3';
|
||||||
|
ScanCodes[0x05] = '4';
|
||||||
|
ScanCodes[0x06] = '5';
|
||||||
|
ScanCodes[0x07] = '6';
|
||||||
|
ScanCodes[0x08] = '7';
|
||||||
|
ScanCodes[0x09] = '8';
|
||||||
|
ScanCodes[0x0A] = '9';
|
||||||
|
ScanCodes[0x0B] = '0';
|
||||||
|
|
||||||
|
ScanCodes[0x10] = 'a';
|
||||||
|
ScanCodes[0x11] = 'z';
|
||||||
|
ScanCodes[0x12] = 'e';
|
||||||
|
ScanCodes[0x13] = 'r';
|
||||||
|
ScanCodes[0x14] = 't';
|
||||||
|
ScanCodes[0x15] = 'y';
|
||||||
|
ScanCodes[0x16] = 'u';
|
||||||
|
ScanCodes[0x17] = 'i';
|
||||||
|
ScanCodes[0x18] = 'o';
|
||||||
|
ScanCodes[0x19] = 'p';
|
||||||
|
|
||||||
|
ScanCodes[0x1E] = 'q';
|
||||||
|
ScanCodes[0x1F] = 's';
|
||||||
|
ScanCodes[0x20] = 'd';
|
||||||
|
ScanCodes[0x21] = 'f';
|
||||||
|
ScanCodes[0x22] = 'g';
|
||||||
|
ScanCodes[0x23] = 'h';
|
||||||
|
ScanCodes[0x24] = 'j';
|
||||||
|
ScanCodes[0x25] = 'k';
|
||||||
|
ScanCodes[0x26] = 'l';
|
||||||
|
|
||||||
|
ScanCodes[0x2C] = 'w';
|
||||||
|
ScanCodes[0x2D] = 'x';
|
||||||
|
ScanCodes[0x2E] = 'c';
|
||||||
|
ScanCodes[0x2F] = 'v';
|
||||||
|
ScanCodes[0x30] = 'b';
|
||||||
|
ScanCodes[0x31] = 'n';
|
||||||
|
ScanCodes[0x32] = 'm';
|
||||||
|
|
||||||
|
ScanCodes[0x1C] = '\n';
|
||||||
|
ScanCodes[0x39] = ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
void IoEnableKeyb(void)
|
||||||
|
{
|
||||||
|
ulong flags = KePauseIRQs();
|
||||||
|
char readedInterruptConfig = IoReadByteFromPort(0x21);
|
||||||
|
IoWriteByteOnPort(0x21, 0xFD & readedInterruptConfig);
|
||||||
|
KeRestoreIRQs(flags);
|
||||||
|
|
||||||
|
ScanCodesInit();
|
||||||
|
}
|
||||||
|
|
||||||
|
void KeybHandler(void)
|
||||||
{
|
{
|
||||||
char status;
|
char status;
|
||||||
char code = 0;
|
char code = 0;
|
||||||
|
@ -50,7 +115,5 @@ uchar KeybHandler(void)
|
||||||
|
|
||||||
if(code < 0) code = 0;
|
if(code < 0) code = 0;
|
||||||
}
|
}
|
||||||
|
KeybPrint((int)code);
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue