Scrolling and Shutdown

This commit is contained in:
Adrien Bourmault 2019-05-08 00:05:29 +02:00
commit 8bfb9a5da0
6 changed files with 109 additions and 27 deletions

View File

@ -31,11 +31,9 @@
//----------------------------------------------------------------------------// //----------------------------------------------------------------------------//
void PoShutdownQemu(void); noreturn void PoShutdownQemu(void);
noreturn void PoShutdownVirtualbox(void);
void PoShutdownVirtualbox(void); noreturn void PoShutdownBochs(void);
void PoShutdownBochs(void);
//----------------------------------------------------------------------------// //----------------------------------------------------------------------------//

View File

@ -38,8 +38,10 @@ extern void BtInitBootInfo(multiboot_info_t *mbi, void *codeSeg);
// io/vga.c // io/vga.c
extern error_t IoInitVGABuffer(void); extern error_t IoInitVGABuffer(void);
extern void IoScrollDown(void);
extern void IoScrollUp(void);
//io/keyb.c // io/keyb.c
extern void IoEnableKeyb(void); extern void IoEnableKeyb(void);
// cpu/idt.c // cpu/idt.c
@ -56,6 +58,9 @@ extern void divideByZero(void);
// //
noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic, void *codeSeg) noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic, void *codeSeg)
{ {
uchar ch;
error_t rc;
KeDisableIRQs(); KeDisableIRQs();
// Initialize the BootInfo_t structure // Initialize the BootInfo_t structure
@ -76,24 +81,38 @@ noreturn void BtStartKern(multiboot_info_t *mbInfo, uint mbMagic, void *codeSeg)
// Several inits // Several inits
MmInitHeap(); MmInitHeap();
//PsInitSched(); PsInitSched();
// Interrupts launching // Interrupts launching
IdtSetup(); IdtSetup();
KeEnableIRQs(); KeEnableIRQs();
// Drivers enabling
// Start drivers
IoEnableRtc(); IoEnableRtc();
IoEnableKeyb(); IoEnableKeyb();
IoGetRtcTimeChar(); IoGetRtcTimeChar();
IoPrintRtcTime(); IoPrintRtcTime();
IoDoStarWars();
KernLog("Goodbye at %s\n", IoGetRtcTimeChar()); int i=0;
while(i++<50)KernLog("%d\n", i);
//PoShutdownQemu(); // Main loop
while ((rc = bgetc(BStdIn, &ch)) == EOK) {
// End this machine's suffering switch (ch) {
case 17: // DC1
IoScrollUp();
break;
case 18: // DC2
IoScrollDown();
break;
case 27: // ESC
BFlushBuf(BStdOut); BFlushBuf(BStdOut);
KeCrashSystem(); PoShutdownQemu();
break;
}
}
KernLog("End of input reached\n");
PoShutdownQemu();
} }

View File

@ -30,8 +30,8 @@ char ScanCodes[100] = { 0 };
void KeybPrint(char code) void KeybPrint(char code)
{ {
if (code) {
bputc(BStdIn, ScanCodes[(int)code]); bputc(BStdIn, ScanCodes[(int)code]);
if (code && (isprint(ScanCodes[(int)code]) || ScanCodes[(int)code]=='\n')) {
bputc(BStdOut, ScanCodes[(int)code]); bputc(BStdOut, ScanCodes[(int)code]);
//bprintf(BStdOut, "%x ", code); //bprintf(BStdOut, "%x ", code);
BStdOut->flusher(BStdOut); BStdOut->flusher(BStdOut);
@ -40,6 +40,7 @@ void KeybPrint(char code)
void ScanCodesInit(void) void ScanCodesInit(void)
{ {
ScanCodes[0x01] = 27; // ESC
ScanCodes[0x02] = '1'; ScanCodes[0x02] = '1';
ScanCodes[0x03] = '2'; ScanCodes[0x03] = '2';
ScanCodes[0x04] = '3'; ScanCodes[0x04] = '3';
@ -94,6 +95,12 @@ void ScanCodesInit(void)
ScanCodes[0x1C] = '\n'; ScanCodes[0x1C] = '\n';
ScanCodes[0x39] = ' '; ScanCodes[0x39] = ' ';
// 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
} }
void KeybHandler(ISRFrame_t *regs) void KeybHandler(ISRFrame_t *regs)

View File

@ -26,11 +26,6 @@
#include <kernel/boot.h> #include <kernel/boot.h>
#include <kernel/cursor.h> #include <kernel/cursor.h>
//----------------------------------------------------------//
// Internal functions for VGA terminals //
// These DO NOT check input correctness //
//----------------------------------------------------------//
// //
// VGA-related macros // VGA-related macros
// //
@ -38,6 +33,8 @@
#define VGA_ComputeOffset(term, x, y) ((y) * (term)->width + (x)) #define VGA_ComputeOffset(term, x, y) ((y) * (term)->width + (x))
#define VGA_ComputeEntry(ch, cl) (((ushort)(ch)) | (ushort)(cl) << 8) #define VGA_ComputeEntry(ch, cl) (((ushort)(ch)) | (ushort)(cl) << 8)
static uint bscroll = 0;
// //
// VGA Buffer Flusher // VGA Buffer Flusher
// //
@ -49,7 +46,7 @@ error_t bvgaflusher(Buffer_t *buf)
uchar *currentLine = buf->wp - buf->lineLen - buf->lastLF; uchar *currentLine = buf->wp - buf->lineLen - buf->lastLF;
uchar *bufStart = (uchar *)lmax((size_t)buf->buf, uchar *bufStart = (uchar *)lmax((size_t)buf->buf,
(size_t)currentLine (size_t)currentLine
- (buf->nLines - 2) * buf->lineLen); - (buf->nLines - 2 + bscroll) * buf->lineLen);
uchar *ptr = bufStart; uchar *ptr = bufStart;
@ -80,6 +77,23 @@ error_t bvgaflusher(Buffer_t *buf)
return EOK; return EOK;
} }
void IoScrollDown(void)
{
if (bscroll > 0)
bscroll--;
bvgaflusher(BStdOut);
}
void IoScrollUp(void)
{
// Keep the 8 below the 10 given to BOpenTermBufEx
if (bscroll < BtVideoInfo.framebufferHeight * 8)
bscroll++;
bvgaflusher(BStdOut);
}
// //
// Initialize VGA buffer // Initialize VGA buffer
// //
@ -94,7 +108,7 @@ error_t IoInitVGABuffer(void)
bvgabufsrc, BS_WRONLY, bvgabufsrc, BS_WRONLY,
BtVideoInfo.framebufferWidth, BtVideoInfo.framebufferWidth,
BtVideoInfo.framebufferHeight, BtVideoInfo.framebufferHeight,
1, bvgaflusher); 10, bvgaflusher);
BEnableAutoScroll(BStdOut); BEnableAutoScroll(BStdOut);

View File

@ -26,29 +26,35 @@
#include <kernel/iomisc.h> #include <kernel/iomisc.h>
#include <kernel/time.h> #include <kernel/time.h>
void PoShutdownQemu(void) noreturn void PoShutdownQemu(void)
{ {
KernLog("Shutdown QEMU at %s...\n", IoGetRtcTimeChar()); KernLog("Shutdown QEMU at %s...\n", IoGetRtcTimeChar());
IoRtcWait(1000); IoRtcWait(1000);
IoWriteWordOnPort(0x604, 0x2000); IoWriteWordOnPort(0x604, 0x2000);
__builtin_unreachable();
}; };
void PoShutdownVirtualbox(void) noreturn void PoShutdownVirtualbox(void)
{ {
KernLog("Shutdown VirtualBox at %s...\n", IoGetRtcTimeChar()); KernLog("Shutdown VirtualBox at %s...\n", IoGetRtcTimeChar());
IoRtcWait(1000); IoRtcWait(1000);
IoWriteWordOnPort(0x4004, 0x3400); IoWriteWordOnPort(0x4004, 0x3400);
__builtin_unreachable();
}; };
void PoShutdownBochs(void) noreturn void PoShutdownBochs(void)
{ {
KernLog("Shutdown Bochs at %s...\n", IoGetRtcTimeChar()); KernLog("Shutdown Bochs at %s...\n", IoGetRtcTimeChar());
IoRtcWait(1000); IoRtcWait(1000);
IoWriteWordOnPort(0xB004, 0x2000); IoWriteWordOnPort(0xB004, 0x2000);
__builtin_unreachable();
}; };

View File

@ -25,12 +25,17 @@
#include <extras/buf.h> #include <extras/buf.h>
#include <extras/locks.h> #include <extras/locks.h>
#ifdef _KALEID_KERNEL
#include <kernel/time.h>
#endif
error_t BGetFromBuf(Buffer_t *buf, uchar *ch) error_t BGetFromBuf(Buffer_t *buf, uchar *ch)
{ {
error_t rc; error_t rc;
assert(buf && buf->initDone == INITOK); assert(buf && buf->initDone == INITOK);
if (!buf) return EINVAL; if (!buf) return EINVAL;
if (buf->flags & BF_TERM) return EBADF;
if (buf->state != BS_RDWR && buf->state != BS_RDONLY) { if (buf->state != BS_RDWR && buf->state != BS_RDONLY) {
return EBADF; return EBADF;
} }
@ -41,12 +46,45 @@ error_t BGetFromBuf(Buffer_t *buf, uchar *ch)
return rc; return rc;
} }
// XXX for now, at most 4096 characters can be inputed in BStdIn
error_t bgetc(Buffer_t *buf, uchar *ch) error_t bgetc(Buffer_t *buf, uchar *ch)
{ {
error_t rc = EOK; error_t rc = EOK;
if (buf->flags & (BF_EOF|BF_ERR)) return EENDF; if (buf->flags & (BF_EOF|BF_ERR)) return EENDF;
assert(!(buf->rp > buf->wp)); // Shouldn't be possible right now
if (buf->rp == buf->buf + buf->size) {
buf->flags |= BF_EOF;
return EENDF;
}
// Are there things to read at all?
if (buf->rp < buf->wp) {
*ch = *buf->rp++;
return EOK; return EOK;
}
// We need to fill the buffer
else {
// We need a BFiller_t
// For now we wait until something is in there
// (so that BStdIn works; don't make anything else)
while (buf->rp >= buf->wp) {
#ifdef _KALEID_KERNEL
IoRtcWait(1);
#endif
}
*ch = *buf->rp++;
}
if (rc != EOK) {
// buf->flags |= BF_ERR;
}
return rc;
} }