Import backup from 2003-09-09

This commit is contained in:
Josh Holtrop 2003-09-09 22:00:00 -04:00
parent 3f4c7ff32f
commit fdfeb94ae3
6 changed files with 318 additions and 35 deletions

View File

@ -78,6 +78,9 @@ isr_main:
iret iret

9
io.asm
View File

@ -205,6 +205,8 @@ printf_special:
jz printf_ppercent jz printf_ppercent
cmp al, 's' cmp al, 's'
jz printf_string jz printf_string
cmp al, 'c'
jz printf_char
jmp printf_special_done jmp printf_special_done
printf_decimal: printf_decimal:
@ -240,6 +242,13 @@ printf_string:
call _puts call _puts
add esp, 4 add esp, 4
jmp printf_special_done jmp printf_special_done
printf_char:
mov eax, [esi]
push eax
call _putc
add esp, 4
jmp printf_special_done
printf_special_done printf_special_done
add esi, 4 ;point to next extra argument add esi, 4 ;point to next extra argument

View File

@ -54,7 +54,7 @@ newgdtcontinue:
call _k_init call _k_init
hlt ;halt processor when k_init is done hlt ;halt processor when k_init is done
jmp $ ;shouldn't get here... jmp $ ;shouldn't get here...
%include "gdt.inc" %include "gdt.inc"
%include "idt.inc" %include "idt.inc"

View File

@ -13,19 +13,17 @@
#include "functions.h" #include "functions.h"
#include "video.h" #include "video.h"
#include "mm.h" #include "mm.h"
#include "keyboard.h"
void isr(dword num); void isr(dword num);
void k_init(); void k_init();
#include "keyboard.c"
#include "mm.c" #include "mm.c"
#include "functions.c" #include "functions.c"
#include "video.c" #include "video.c"
dword timer = 0; dword timer = 0;
word index = 0;
dword ptrs[512];
dword goon = 1;
dword req = 0;
void k_init() void k_init()
{ {
@ -36,12 +34,13 @@ void k_init()
outportb(0x40, 0x2e); //msb outportb(0x40, 0x2e); //msb
video_init((ModeInfoBlock *) 0x90306); video_init((ModeInfoBlock *) 0x90306);
mm_init(); mm_init();
int a;
for (a=0; a<512; a++)
ptrs[a] = 0;
enable_ints(); enable_ints();
console_cls(); console_cls();
printf("Memory available to OS: %d MB", mm_totalmem/0x100000); printf("Memory available to OS: %d MB", mm_totalmem/0x100000);
for (;;)
{
printf("%d ", kbdWaitKey());
}
/* pageblock *pb = first_pageblock; /* pageblock *pb = first_pageblock;
for (;;) for (;;)
{ {
@ -58,31 +57,6 @@ void isr(dword num)
{ {
timer++; timer++;
(*(byte *)0xb8000)++; (*(byte *)0xb8000)++;
if ((timer%50)==0)
{
if (goon)
{
if(ptrs[index] = (dword)mm_palloc(1024))
printf("\nReq:%d\tAddr: %x\tEntries: %x\tMem: %x\tIndex: %x", req++, ptrs[index++], mm_freeentries(), mm_freemem(), index);
else
{
goon = 0;
index = 0;
}
}
else
{
dword reslt = mm_pfree((void *)ptrs[index]); //zero returned means chunk freed successfully
printf("\nReq:%d\tFree(): %x\tEntries: %x\tMem: %x\tIndex: %x", req++, reslt, mm_freeentries(), mm_freemem(), index++);
if (reslt)
{
for (index=0; index<512; index++)
ptrs[index] = 0;
index = 0;
goon = 1;
}
}
}
switch(timer) switch(timer)
{ {
case 150: case 150:
@ -109,8 +83,10 @@ void isr(dword num)
} }
eoi(); eoi();
} }
//if (num == 0x21) if (num == 0x21)
// restart(); {
isr_keyboard();
}
} }

248
keyboard.c Normal file
View File

@ -0,0 +1,248 @@
//Keyboard.c
// Created: 04/17/03 Josh Holtrop
// Modified: 09/09/03
//for HOS
byte kbdFlags = 0;
byte kbdAscii = 0;
byte kbdScan = 0;
dword kbdBuffer[32];
byte kbdBufferStart = 0;
byte kbdBufferEnd = 0;
byte kbdExt = 0;
byte kbdExt2 = 0;
byte ackReason = 0; //used to record the reason why we would get an acknowledge byte (0xFA)
//nul esc bksp tab lctl lsft rsft lalt caps F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 numScrlNumPad------- unknown---- F11 F12 unknown....
const byte SCAN2ASCII[128] = "\000\0331234567890-=\010\011qwertyuiop[]\n\001asdfghjkl;'`\001\\zxcvbnm,./\001*\001 \001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001-\001\001\001+\001\001\001\001\001\002\002\002\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002";
const byte SCAN2ASCIISHIFT[128] = "\000\033!@#$%^&*()_+\010\011QWERTYUIOP{}\n\001ASDFGHJKL:\"~\001|ZXCVBNM<>?\001*\001 \001\001\001\001\001\001\001\001\001\001\001\001\001789-456+1230.\002\002\002\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002";
//====FUNCTIONS:
void isr_keyboard()
{
kbdScan = inportb(0x60);
byte inState = inportb(0x61);
outportb(0x61, inState|0x80);
outportb(0x61, inState);
if (kbdScan == 0xFA) //250 //ACKnowledge
{
if (ackReason == 0xED) //reset LEDs
{
outportb(0x64, (kbdFlags & 0x07));
printf("KBD_ACK!");
}
ackReason = 0;
}
if (kbdScan == 224) //extended key
{
kbdExt = 1;
eoi();
return;
}
if (kbdScan == 225)
{
kbdExt2 = 2;
eoi();
return;
}
//====handle control keys::
kbdAscii = 2;
switch (kbdScan) //control keys
{
case KBD_SCAN_LSHIFT:
kbdFlags |= KBD_SHIFT;
kbdAscii = 1;
break;
case KBD_SCAN_RSHIFT:
kbdFlags |= KBD_SHIFT;
kbdAscii = 1;
break;
case KBD_SCAN_LCTRL:
kbdFlags |= KBD_CTRL;
kbdAscii = 1;
break;
case KBD_SCAN_LALT:
kbdFlags |= KBD_ALT;
kbdAscii = 1;
break;
case KBD_SCAN_LSHIFT + KBD_SCAN_RELEASED:
kbdFlags &= (KBD_SHIFT ^ 0xFF);
kbdAscii = 1;
break;
case KBD_SCAN_RSHIFT + KBD_SCAN_RELEASED:
kbdFlags &= (KBD_SHIFT ^ 0xFF);
kbdAscii = 1;
break;
case KBD_SCAN_LCTRL + KBD_SCAN_RELEASED:
kbdFlags &= (KBD_CTRL ^ 0xFF);
kbdAscii = 1;
break;
case KBD_SCAN_LALT + KBD_SCAN_RELEASED:
kbdFlags &= (KBD_ALT ^ 0xFF);
kbdAscii = 1;
break;
case KBD_SCAN_CAPS+KBD_SCAN_RELEASED:
kbdFlags ^= KBD_CAPS;
kbdAscii = 1;
kbd_resetLEDs(); //update LEDs
break;
case KBD_SCAN_SCROLL+KBD_SCAN_RELEASED:
kbdFlags ^= KBD_SCROLL;
kbdAscii = 1;
kbd_resetLEDs(); //update LEDs
break;
case KBD_SCAN_NUM+KBD_SCAN_RELEASED:
kbdFlags ^= KBD_NUM;
kbdAscii = 1;
kbd_resetLEDs(); //update LEDs
break;
}
if (kbdAscii == 1)
{
if (kbdExt > 0)
kbdExt--;
eoi();
return;
}
//====determine ASCII value of key::
if (kbdExt > 0) //extended key, kbdScan holds extended key
{
kbdExt--;
kbdAscii = 1;
switch (kbdScan)
{
case KBD_SCANE_ENTER:
kbdAscii = '\n'; break;
case 53: // '/' character (divide on numpad)
kbdAscii = '/'; break;
}
}
else if (kbdExt2 > 0) //extended key 2
{
kbdExt2--;
// if (kbdScan == 69) // (pause|break)
// kbdAscii = 2; //flag ascii value of 1 means control character (pausebreak)
// else
kbdAscii = 2; //flag ascii value of 2 means ignore key (or unknown value)
}
else //not an extended key
{
// if letter key
if (((kbdScan >= 16) && (kbdScan <= 25)) || ((kbdScan >= 30) && (kbdScan <= 38)) || ((kbdScan >= 44) && (kbdScan <= 50)))
{
// if caps and shift are different (either one pressed, not both)
if (((kbdFlags & KBD_SHIFT) != 0) & ((kbdFlags & KBD_CAPS) != 0))
kbdAscii = SCAN2ASCII[kbdScan & 0x7F];
else if (((kbdFlags & KBD_SHIFT) == 0) & ((kbdFlags & KBD_CAPS) == 0))
kbdAscii = SCAN2ASCII[kbdScan & 0x7F];
else
kbdAscii = SCAN2ASCIISHIFT[kbdScan & 0x7F];
}
// if numpad key
else if ((kbdScan >= 71) && (kbdScan <= 83))
{
// if numlock on
if (kbdFlags & KBD_NUM)
kbdAscii = SCAN2ASCIISHIFT[kbdScan & 0x7F];
else
kbdAscii = SCAN2ASCII[kbdScan & 0x7F];
}
// other key
else
{
if ((kbdFlags & KBD_SHIFT) != 0)
kbdAscii = SCAN2ASCIISHIFT[kbdScan & 0x7F];
else
kbdAscii = SCAN2ASCII[kbdScan & 0x7F];
}
}
//====do something with key::
if ((kbdScan == 83) & ((kbdFlags & KBD_CTRL) != 0) & ((kbdFlags & KBD_ALT) != 0))
{
printf("Initiating reboot.");
restart();
}
if (kbdAscii == 2) //unknown key / ignore key
{
eoi();
return;
}
if (kbdScan < KBD_SCAN_RELEASED) //a key was pressed, save it
{
if ((kbdBufferStart-kbdBufferEnd) == 1) //no key slots available
{
eoi();
return;
}
else if ((kbdBufferStart == 0) & (kbdBufferEnd == 31)) //no key slots available
{
eoi();
return;
}
else
{
kbdBuffer[kbdBufferEnd] = (dword) ((kbdFlags << 16) | (kbdScan << 8) | kbdAscii);
kbdBufferEnd++;
if (kbdBufferEnd == 32)
kbdBufferEnd = 0;
}
}
eoi();
// if (key == 0xFA) //ACKnowledge
// outportb(0x60, 0x3);
};
inline byte switchCase(byte asciiCode)
{
if ((asciiCode >= 'A') & (asciiCode <= 'Z'))
return (asciiCode + ('a' - 'A'));
if ((asciiCode >= 'a') & (asciiCode <= 'z'))
return (asciiCode - ('a' - 'A'));
return asciiCode;
}
dword kbdGetKey()
{
if (kbdBufferEnd == kbdBufferStart) //buffer empty
return 0;
dword retVal = kbdBuffer[kbdBufferStart];
kbdBufferStart++;
if (kbdBufferStart == 32)
kbdBufferStart = 0;
return retVal;
}
dword kbdWaitKey()
{
dword retVal = 0;
for (;;)
{
retVal = kbdGetKey();
if (retVal != 0)
return retVal;
}
}
inline void kbd_resetLEDs()
{
outportb(0x64, 0xED);
//outportb(0x64, (kbdFlags & 0x07));
ackReason = 0xED;
}

47
keyboard.h Normal file
View File

@ -0,0 +1,47 @@
//Keyboard.h
// Created: 04/17/03 Josh Holtrop
// Modified: 05/07/03
//for HOS
#define KBD_SCROLL 0x01
#define KBD_NUM 0x02
#define KBD_CAPS 0x04
#define KBD_SHIFT 0x10
#define KBD_CTRL 0x20
#define KBD_ALT 0x40
#define KBD_SCAN_RELEASED 128
#define KBD_SCAN_LCTRL 29
#define KBD_SCAN_LSHIFT 42
#define KBD_SCAN_RSHIFT 54
#define KBD_SCAN_LALT 56
#define KBD_SCAN_SCROLL 70
#define KBD_SCAN_CAPS 58
#define KBD_SCAN_NUM 69
#define KBD_SCANE_PRINTSCREEN 55
#define KBD_SCANE_INS 82
#define KBD_SCANE_HOME 71
#define KBD_SCANE_PGUP 73
#define KBD_SCANE_DEL 83
#define KBD_SCANE_END 79
#define KBD_SCANE_PGDN 81
#define KBD_SCANE_ENTER 28
#define KBD_SCANE_NULL 42
//====PROTOTYPES:
void isr_keyboard();
inline void kbd_resetLEDs();
inline byte kbd_ascii(dword keycode);
inline byte kbd_scancode(dword keycode);
inline byte kbd_flags(dword keycode);
inline byte switchCase(byte asciiCode);
dword kbdGetKey();
dword kbdWaitKey();