diff --git a/Makefile b/Makefile index 6488f72..4566daa 100644 --- a/Makefile +++ b/Makefile @@ -98,7 +98,8 @@ KernSources = kernel/cpu/cpuid.c \ kernel/mm/gdt.c kernel/ps/sched.c \ kernel/init/info.c kernel/init/ssp.c \ kernel/io/rtc.c kernel/io/keyb.c \ - kernel/io/spkr.c kernel/po/shtdwn.c + kernel/io/spkr.c kernel/po/shtdwn.c \ + kernel/ke/shell.c LibCObj=$(patsubst %.c,$(KOBJDIR)/%.o,$(LibCSources)) diff --git a/kaleid/kernel/init/init.c b/kaleid/kernel/init/init.c index 234af40..5c7bcd9 100644 --- a/kaleid/kernel/init/init.c +++ b/kaleid/kernel/init/init.c @@ -22,45 +22,13 @@ // along with OS/K. If not, see . // //----------------------------------------------------------------------------// -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// info.c -extern void BtDoSanityChecks(uint mbMagic); -extern void BtInitBootInfo(multiboot_info_t *mbi, void *codeSeg); - -// io/vga.c -extern error_t IoInitVGABuffer(void); -extern void IoScrollDown(void); -extern void IoScrollUp(void); - -// io/keyb.c -extern void IoEnableKeyb(void); - -// cpu/idt.c -extern void IdtSetup(void); - -// ps/proc.c test function -extern void pstest(void); - -// interrupts tests -extern void divideByZero(void); +#include "init.h" // // Entry point of the Kaleid kernel // noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic, void *codeSeg) { - uchar ch; - error_t rc; - KeDisableIRQs(); // Initialize the BootInfo_t structure @@ -94,34 +62,7 @@ noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic, void *codeSeg) IoGetRtcTimeChar(); IoPrintRtcTime(); - int i=0; - while(i++<50)KernLog("%d\n", i); - - // Main loop - while ((rc = bgetc(BStdIn, &ch)) == EOK) { - switch (ch) { - - case 7: // BEL - if (rand() % 32 == 0) { - IoDoStarWars(); - } - else IoDoBeep(); - break; - - case 17: // DC1 - IoScrollUp(); - break; - - case 18: // DC2 - IoScrollDown(); - break; - - case 27: // ESC - BFlushBuf(BStdOut); - PoShutdownQemu(); - break; - } - } + KeStartShell(); KernLog("End of input reached\n"); PoShutdownQemu(); diff --git a/kaleid/kernel/init/init.h b/kaleid/kernel/init/init.h new file mode 100644 index 0000000..fa90d51 --- /dev/null +++ b/kaleid/kernel/init/init.h @@ -0,0 +1,56 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Desc: Kernel entry point // +// // +// // +// Copyright © 2018-2019 The OS/K Team // +// // +// This file is part of OS/K. // +// // +// OS/K is free software: you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation, either version 3 of the License, or // +// any later version. // +// // +// OS/K is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY//without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with OS/K. If not, see . // +//----------------------------------------------------------------------------// + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// info.c +extern void BtDoSanityChecks(uint mbMagic); +extern void BtInitBootInfo(multiboot_info_t *mbi, void *codeSeg); + +// io/vga.c +extern error_t IoInitVGABuffer(void); + +// ke/shell.c +extern void KeStartShell(void); + +// io/keyb.c +extern void IoEnableKeyb(void); + +// cpu/idt.c +extern void IdtSetup(void); + +// ps/proc.c test function +extern void pstest(void); + +// interrupts tests +extern void divideByZero(void); + diff --git a/kaleid/kernel/io/keyb.c b/kaleid/kernel/io/keyb.c index b3eb126..42b476a 100644 --- a/kaleid/kernel/io/keyb.c +++ b/kaleid/kernel/io/keyb.c @@ -26,12 +26,15 @@ #include #include -char ScanCodes[100] = { 0 }; +static char ScanCodes[100] = { 0 }; +static char Invisible[100] = { 0 }; void KeybPrint(char code) { - bputc(BStdIn, ScanCodes[(int)code]); - if (code && (isprint(ScanCodes[(int)code]) || ScanCodes[(int)code]=='\n')) { + uchar ch = ScanCodes[(int)code]; + + bputc(BStdIn, ch); + if (code && Invisible[(int)code] == 0) { bputc(BStdOut, ScanCodes[(int)code]); //bprintf(BStdOut, "%x ", code); BStdOut->flusher(BStdOut); @@ -41,6 +44,7 @@ void KeybPrint(char code) void ScanCodesInit(void) { ScanCodes[0x01] = 27; // ESC + Invisible[0x01] = 1; ScanCodes[0x02] = '1'; ScanCodes[0x03] = '2'; ScanCodes[0x04] = '3'; @@ -97,12 +101,17 @@ void ScanCodesInit(void) ScanCodes[0x39] = ' '; ScanCodes[0x40] = 7; // BEL + Invisible[0x40] = 1; // Numpad ScanCodes[0x48] = 17; // DC1, will serve as Arrow Up ScanCodes[0x50] = 18; // DC2, will serve as Arrow Down ScanCodes[0x4B] = 19; // DC3, will serve as Arrow Left ScanCodes[0x4D] = 20; // DC4, will serve as Arrow Right + Invisible[0x48] = 1; + Invisible[0x50] = 1; + Invisible[0x4B] = 1; + Invisible[0x4D] = 1; } void KeybHandler(ISRFrame_t *regs) diff --git a/kaleid/kernel/ke/shell.c b/kaleid/kernel/ke/shell.c new file mode 100644 index 0000000..afc77ba --- /dev/null +++ b/kaleid/kernel/ke/shell.c @@ -0,0 +1,63 @@ +//----------------------------------------------------------------------------// +// GNU GPL OS/K // +// // +// Desc: Kernel "shell" entry point // +// // +// // +// Copyright © 2018-2019 The OS/K Team // +// // +// This file is part of OS/K. // +// // +// OS/K is free software: you can redistribute it and/or modify // +// it under the terms of the GNU General Public License as published by // +// the Free Software Foundation, either version 3 of the License, or // +// any later version. // +// // +// OS/K is distributed in the hope that it will be useful, // +// but WITHOUT ANY WARRANTY//without even the implied warranty of // +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // +// GNU General Public License for more details. // +// // +// You should have received a copy of the GNU General Public License // +// along with OS/K. If not, see . // +//----------------------------------------------------------------------------// + +#include +#include +#include +#include + +extern void IoScrollDown(void); +extern void IoScrollUp(void); + +void KeStartShell(void) +{ + uchar ch; + error_t rc; + + while ((rc = bgetc(BStdIn, &ch)) == EOK) { + switch (ch) { + + case 7: // BEL + if (rand() % 64 == 0) { + IoDoStarWars(); + } + else IoDoBeep(); + break; + + case 17: // DC1 + IoScrollUp(); + break; + + case 18: // DC2 + IoScrollDown(); + break; + + case 27: // ESC + BFlushBuf(BStdOut); + PoShutdownQemu(); + break; + } + } +} +