Import backup from 2003-09-01_2
This commit is contained in:
parent
dae5569216
commit
9076a15f08
7
defines.h
Normal file
7
defines.h
Normal file
@ -0,0 +1,7 @@
|
||||
|
||||
typedef unsigned int dword;
|
||||
typedef unsigned short word;
|
||||
typedef unsigned char byte;
|
||||
|
||||
|
||||
|
173
io.asm
173
io.asm
@ -14,6 +14,7 @@
|
||||
[global _console_cls]
|
||||
[global _putHex]
|
||||
[global _putDec]
|
||||
[global _putDecu]
|
||||
|
||||
|
||||
;
|
||||
@ -173,9 +174,9 @@ _printf:
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
pusha
|
||||
mov ebx, [ebp+8] ;ebx = ptr in format string
|
||||
mov ebx, [ebp+8] ;ebx = in format string
|
||||
mov esi, ebp
|
||||
add esi, 12 ;esi = ptr to next variable arg
|
||||
add esi, 12 ;esi = to next variable arg
|
||||
xor ecx, ecx ;ecx used if we encounter a '%'
|
||||
printf_loop:
|
||||
mov al, [ebx]
|
||||
@ -196,6 +197,8 @@ printf_special:
|
||||
xor ecx, ecx
|
||||
cmp al, 'd'
|
||||
jz printf_decimal
|
||||
cmp al, 'u'
|
||||
jz printf_decimalu
|
||||
cmp al, 'x'
|
||||
jz printf_hex
|
||||
cmp al, '%'
|
||||
@ -211,6 +214,13 @@ printf_decimal:
|
||||
add esp, 4
|
||||
jmp printf_special_done
|
||||
|
||||
printf_decimalu:
|
||||
mov eax, [esi]
|
||||
push eax
|
||||
call _putDecu
|
||||
add esp, 4
|
||||
jmp printf_special_done
|
||||
|
||||
printf_hex:
|
||||
mov eax, [esi]
|
||||
push eax
|
||||
@ -330,14 +340,6 @@ putHex_loop_end:
|
||||
ret
|
||||
|
||||
|
||||
;
|
||||
;int putDec(dword number)
|
||||
;
|
||||
_putDec:
|
||||
|
||||
ret
|
||||
|
||||
|
||||
;
|
||||
;int puts(char *str)
|
||||
;
|
||||
@ -346,7 +348,7 @@ _puts:
|
||||
mov ebp, esp
|
||||
push esi
|
||||
push eax
|
||||
mov esi, [ebp+8] ;esi = ptr to string
|
||||
mov esi, [ebp+8] ;esi = to string
|
||||
puts_loop:
|
||||
lodsb
|
||||
cmp al, 0
|
||||
@ -367,3 +369,152 @@ puts_done:
|
||||
|
||||
|
||||
|
||||
_putDecu:
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
sub esp, 24
|
||||
mov DWORD [ebp-4], 1
|
||||
mov BYTE [ebp-5], 0
|
||||
L2:
|
||||
mov edx, DWORD [ebp+8]
|
||||
mov eax, -858993459
|
||||
mul edx
|
||||
mov eax, edx
|
||||
shr eax, 3
|
||||
cmp eax, DWORD [ebp-4]
|
||||
jae L4
|
||||
jmp L3
|
||||
L4:
|
||||
mov eax, DWORD [ebp-4]
|
||||
mov edx, eax
|
||||
sal edx, 2
|
||||
add edx, eax
|
||||
lea eax, [edx+edx]
|
||||
mov DWORD [ebp-4], eax
|
||||
jmp L2
|
||||
L3:
|
||||
nop
|
||||
L5:
|
||||
cmp DWORD [ebp-4], 1
|
||||
ja L7
|
||||
jmp L6
|
||||
L7:
|
||||
mov edx, DWORD [ebp+8]
|
||||
mov eax, edx
|
||||
mov edx, 0
|
||||
div DWORD [ebp-4]
|
||||
mov DWORD [ebp-12], eax
|
||||
mov al, BYTE [ebp-12]
|
||||
mov BYTE [ebp-5], al
|
||||
mov eax, 0
|
||||
mov al, BYTE [ebp-5]
|
||||
imul eax, DWORD [ebp-4]
|
||||
sub DWORD [ebp+8], eax
|
||||
mov edx, DWORD [ebp-4]
|
||||
mov eax, -858993459
|
||||
mul edx
|
||||
mov eax, edx
|
||||
shr eax, 3
|
||||
mov DWORD [ebp-4], eax
|
||||
lea eax, [ebp-5]
|
||||
add BYTE [eax], 48
|
||||
sub esp, 12
|
||||
mov eax, 0
|
||||
mov al, BYTE [ebp-5]
|
||||
push eax
|
||||
call _putc
|
||||
add esp, 16
|
||||
jmp L5
|
||||
L6:
|
||||
sub esp, 12
|
||||
mov al, BYTE [ebp+8]
|
||||
add eax, 48
|
||||
and eax, 255
|
||||
push eax
|
||||
call _putc
|
||||
add esp, 16
|
||||
leave
|
||||
ret
|
||||
|
||||
|
||||
|
||||
|
||||
_putDec:
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
sub esp, 24
|
||||
cmp DWORD [ebp+8], 0
|
||||
jns L9
|
||||
sub esp, 12
|
||||
push 45
|
||||
call _putc
|
||||
add esp, 16
|
||||
neg DWORD [ebp+8]
|
||||
L9:
|
||||
mov DWORD [ebp-4], 1
|
||||
mov BYTE [ebp-5], 0
|
||||
L10:
|
||||
mov eax, DWORD [ebp+8]
|
||||
cmp eax, DWORD [ebp-4]
|
||||
jae L12
|
||||
jmp L11
|
||||
L12:
|
||||
mov eax, DWORD [ebp-4]
|
||||
mov edx, eax
|
||||
sal edx, 2
|
||||
add edx, eax
|
||||
lea eax, [edx+edx]
|
||||
mov DWORD [ebp-4], eax
|
||||
jmp L10
|
||||
L11:
|
||||
mov edx, DWORD [ebp-4]
|
||||
mov eax, -858993459
|
||||
mul edx
|
||||
mov eax, edx
|
||||
shr eax, 3
|
||||
mov DWORD [ebp-4], eax
|
||||
L13:
|
||||
cmp DWORD [ebp-4], 1
|
||||
ja L15
|
||||
jmp L14
|
||||
L15:
|
||||
mov edx, DWORD [ebp+8]
|
||||
mov eax, edx
|
||||
mov edx, 0
|
||||
div DWORD [ebp-4]
|
||||
mov DWORD [ebp-12], eax
|
||||
mov al, BYTE [ebp-12]
|
||||
mov BYTE [ebp-5], al
|
||||
mov eax, 0
|
||||
mov al, BYTE [ebp-5]
|
||||
imul eax, DWORD [ebp-4]
|
||||
sub DWORD [ebp+8], eax
|
||||
mov edx, DWORD [ebp-4]
|
||||
mov eax, -858993459
|
||||
mul edx
|
||||
mov eax, edx
|
||||
shr eax, 3
|
||||
mov DWORD [ebp-4], eax
|
||||
lea eax, [ebp-5]
|
||||
add BYTE [eax], 48
|
||||
sub esp, 12
|
||||
mov eax, 0
|
||||
mov al, BYTE [ebp-5]
|
||||
push eax
|
||||
call _putc
|
||||
add esp, 16
|
||||
jmp L13
|
||||
L14:
|
||||
sub esp, 12
|
||||
mov al, BYTE [ebp+8]
|
||||
add eax, 48
|
||||
and eax, 255
|
||||
push eax
|
||||
call _putc
|
||||
add esp, 16
|
||||
leave
|
||||
ret
|
||||
|
||||
|
||||
|
||||
|
||||
|
3
io.h
3
io.h
@ -8,7 +8,8 @@ word getCursorPosition();
|
||||
int putc(byte chr);
|
||||
int printf(char *fmt, ...);
|
||||
int puts(char *str);
|
||||
int putDec(dword number);
|
||||
int putDec(int number);
|
||||
int putDecu(dword number);
|
||||
int putHex(dword number);
|
||||
void console_cls();
|
||||
void console_scroll();
|
||||
|
15
kernel.c
15
kernel.c
@ -29,8 +29,21 @@ void k_init()
|
||||
outportb(0x40, 0x2e); //msb
|
||||
enable_ints();
|
||||
video_init((ModeInfoBlock *) 0x90306);
|
||||
console_cls();
|
||||
mm_init();
|
||||
console_cls();
|
||||
printf("Memory available to OS: %d MB", mm_totalmem/0x100000);
|
||||
pageblock *pb = first_pageblock;
|
||||
for (;;)
|
||||
{
|
||||
if (pb->flags == MM_PB_NP)
|
||||
break;
|
||||
printf("\nBase: 0x%x; Limit: 0x%x; Flags: 0x%x, Link: 0x%x", pb->base, pb->length, pb->flags, pb->link);
|
||||
pb = (pageblock *) pb->link;
|
||||
}
|
||||
int a;
|
||||
for (a = -1024; a < 778; a += 98)
|
||||
printf("\n%u\t%d\t%x", a, a, a);
|
||||
//printf("\n%d\t%d", -123, -23456);
|
||||
}
|
||||
|
||||
void isr(dword num)
|
||||
|
87
mm.c
87
mm.c
@ -5,7 +5,7 @@
|
||||
|
||||
|
||||
pageblock *first_pageblock = (pageblock *) 0;
|
||||
dword totalmem = 0;
|
||||
dword mm_totalmem = 0x100000; //assume 1mb
|
||||
|
||||
void mm_init()
|
||||
{
|
||||
@ -16,24 +16,89 @@ void mm_init()
|
||||
{
|
||||
if (maps[a].attributes == 1) // (1) mem free to OS
|
||||
{
|
||||
if ((maps[a].base.lowdword + maps[a].limit.lowdword) > (FREERAM_START+4096)) //goes past where we start freeram
|
||||
mm_totalmem += maps[a].limit.lowdword;
|
||||
if ((maps[a].base.lowdword + maps[a].limit.lowdword) > (FREERAM_START+8192)) //goes past where we start freeram
|
||||
{
|
||||
if (first_pageblock == 0) //no pageblock page set up yet
|
||||
if (maps[a].base.lowdword < FREERAM_START)
|
||||
{
|
||||
if (maps[a].base.lowdword < (FREERAM_START+4096))
|
||||
{
|
||||
first_pageblock = (pageblock *) FREERAM_START;
|
||||
maps[a].limit.lowdword = maps[a].limit.lowdword - (FREERAM_START - maps[a].base.lowdword);
|
||||
maps[a].base.lowdword = FREERAM_START; //block at least 4kb, starts >= FREERAM_START
|
||||
}
|
||||
if (first_pageblock == 0) //no pageblock page set up yet, so set it up here
|
||||
{
|
||||
first_pageblock = (pageblock *) maps[a].base.lowdword;
|
||||
maps[a].base.lowdword += 4096;
|
||||
maps[a].limit.lowdword -= 4096;
|
||||
mm_init_pageblockpage(first_pageblock);
|
||||
first_pageblock->base = maps[a].base.lowdword;
|
||||
first_pageblock->length = maps[a].limit.lowdword / 4096;
|
||||
first_pageblock->flags = MM_PB_AVAIL;
|
||||
}
|
||||
else //first_pageblock already set up, add on segment
|
||||
{
|
||||
pageblock *pb = first_pageblock;
|
||||
for (;;)
|
||||
{
|
||||
if (pb->flags == MM_PB_NP)
|
||||
break;
|
||||
else
|
||||
pb++;
|
||||
}
|
||||
pb->base = maps[a].base.lowdword;
|
||||
pb->length = maps[a].limit.lowdword / 4096;
|
||||
pb->flags = MM_PB_AVAIL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (first_pageblock == 0)
|
||||
{
|
||||
printf("ERROR! NO INITIAL PAGE BLOCK COULD BE CREATED.");
|
||||
asm("cli");
|
||||
asm("hlt");
|
||||
}
|
||||
}
|
||||
totalmem += maps[a].limit.lowdword;
|
||||
}
|
||||
}
|
||||
printf("Total memory available to OS: %x", totalmem);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void mm_init_pageblockpage(pageblock *pbp)
|
||||
{
|
||||
pageblock *pb = pbp;
|
||||
int a;
|
||||
for (a=0; a<512; a++)
|
||||
{
|
||||
pb->base = 0;
|
||||
pb->length = 0;
|
||||
pb->flags = MM_PB_NP;
|
||||
if (a<511)
|
||||
pb->link = (dword)++pb + sizeof(pageblock);
|
||||
else
|
||||
pb->link = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void *mm_palloc(dword numpages)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
int mm_pfree(void *ptr)
|
||||
{
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
14
mm.h
14
mm.h
@ -1,9 +1,5 @@
|
||||
|
||||
|
||||
void mm_init();
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
qword base;
|
||||
qword limit;
|
||||
@ -19,6 +15,16 @@ typedef struct {
|
||||
} __attribute__ ((packed)) pageblock; //16 byte pageblock entry - 512 entries = 1 page
|
||||
|
||||
|
||||
void mm_init();
|
||||
void mm_init_pageblockpage(pageblock *pbp);
|
||||
void *mm_palloc(dword numpages);
|
||||
int mm_pfree(void *ptr);
|
||||
|
||||
|
||||
#define MM_PB_FLAGMASK 0x03 //00000011
|
||||
#define MM_PB_NP 0x00 //00000000
|
||||
#define MM_PB_AVAIL 0x01 //00000001
|
||||
#define MM_PB_USED 0x02 //00000010
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user