diff --git a/Asuro.iso b/Asuro.iso index 5725f340..0a79ff7f 100644 Binary files a/Asuro.iso and b/Asuro.iso differ diff --git a/bin/kernel.bin b/bin/kernel.bin index 6fef80cb..71faf335 100755 Binary files a/bin/kernel.bin and b/bin/kernel.bin differ diff --git a/iso/boot/asuro.bin b/iso/boot/asuro.bin index 6fef80cb..71faf335 100755 Binary files a/iso/boot/asuro.bin and b/iso/boot/asuro.bin differ diff --git a/lib/console.o b/lib/console.o index 9b008b57..d8a0b35c 100644 Binary files a/lib/console.o and b/lib/console.o differ diff --git a/lib/console.ppu b/lib/console.ppu index ac9d4465..9992a87a 100644 Binary files a/lib/console.ppu and b/lib/console.ppu differ diff --git a/lib/kernel.o b/lib/kernel.o index e99c613d..fabb3333 100644 Binary files a/lib/kernel.o and b/lib/kernel.o differ diff --git a/lib/kernel.ppu b/lib/kernel.ppu index 20a974c0..d94c4732 100644 Binary files a/lib/kernel.ppu and b/lib/kernel.ppu differ diff --git a/lib/libpconsole.a b/lib/libpconsole.a index 25e4ce2d..d215f2f5 100644 Binary files a/lib/libpconsole.a and b/lib/libpconsole.a differ diff --git a/lib/libpkernel.a b/lib/libpkernel.a index d0b5227a..8c046e86 100644 Binary files a/lib/libpkernel.a and b/lib/libpkernel.a differ diff --git a/src/console.pas b/src/console.pas index ce86c43a..4155b0a3 100644 --- a/src/console.pas +++ b/src/console.pas @@ -15,16 +15,24 @@ unit console; interface -var - xpos: Integer = 0; - ypos: Integer = 0; +procedure console_init(); +procedure console_clear(); -procedure ktest(); -procedure kclearscreen(); -procedure kwritechr(c: Char); -procedure kwritestr(s: PChar); -procedure kwriteint(i: Integer); -procedure kwritedword(i: DWORD); +procedure console_writechar(character : char; attributes : char); +procedure console_writestring(str: PChar; attributes : char); +procedure console_writeint(i: Integer; attributes : char); +procedure console_writedword(i: DWORD; attributes : char); + +procedure console_writecharln(character : char; attributes : char); +procedure console_writestringln(str: PChar; attributes : char); +procedure console_writeintln(i: Integer; attributes : char); +procedure console_writedwordln(i: DWORD; attributes : char); + +procedure _console_increment_x(); +procedure _console_increment_y(); +procedure _console_safeincrement_y(); +procedure _console_safeincrement_x(); +procedure _console_newline(); implementation @@ -41,79 +49,56 @@ type T2DVideoMemory = Array[0..24] of Array[0..79] of TCharacter; P2DVideoMemory = ^T2DVideoMemory; + TCoord = record + X : Byte; + Y : Byte; + end; var - vidmem : PChar = PChar($b8000); - memory : PVideoMemory = PVideoMemory($b8000); - mem2d : P2DVideoMemory = P2DVideoMemory($b8000); + Console_Memory : PVideoMemory = PVideoMemory($b8000); + Console_Matrix : P2DVideoMemory = P2DVideoMemory($b8000); + Console_Cursor : TCoord; + +procedure console_init(); [public, alias: 'console_init']; +Begin + console_clear(); +end; + +procedure console_clear(); [public, alias: 'console_clear']; +var + x,y: Byte; -procedure ktest(); [public, alias: 'ktest']; begin - memory^[0].Attributes:= #7; - memory^[0].Character:= 'T'; - mem2d^[1][0].Attributes:=#7; - mem2d^[1][0].Character:='E'; - while true do begin + for x:=0 to 79 do begin + for y:=0 to 24 do begin + Console_Matrix^[y][x].Character:=#0; + Console_Matrix^[y][x].Attributes:=#7; + end; + end; + Console_Cursor.X:= 0; + Console_Cursor.Y:= 0; +end; + +procedure console_writechar(character: char; attributes: char); [public, alias: 'console_writechar']; +begin + Console_Matrix^[Console_Cursor.Y][Console_Cursor.X].Character:= character; + Console_Matrix^[Console_Cursor.Y][Console_Cursor.X].Attributes:= attributes; + _console_safeincrement_x(); +end; + +procedure console_writestring(str: PChar; attributes: char); [public, alias: 'console_writestring']; +var + i : integer; + +begin + i:= 0; + while (str[i] <> #0) do begin + console_writechar(str[i], attributes); + i:=i+1; end; end; -procedure kclearscreen(); [public, alias: 'kclearscreen']; -var - i: Integer; -begin - for i := 0 to 3999 do - vidmem[i] := #0; -end; - -procedure kwritechr(c: Char); [public, alias: 'kwritechr']; -var - offset: Integer; -begin - if (ypos > 24) then - ypos := 0; - - if (xpos > 79) then - xpos := 0; - - offset := (xpos shl 1) + (ypos * 160); - vidmem[offset] := c; - offset += 1; - vidmem[offset] := #7; - offset += 1; - - xpos := (offset mod 160); - ypos := (offset - xpos) div 160; - xpos := xpos shr 1; -end; - -procedure kwritestr(s: PChar); [public, alias: 'kwritestr']; -var - offset, i: Integer; -begin - if (ypos > 24) then - ypos := 0; - - if (xpos > 79) then - xpos := 0; - - offset := (xpos shl 1) + (ypos * 160); - i := 0; - - while (s[i] <> Char($0)) do - begin - vidmem[offset] := s[i]; - offset += 1; - vidmem[offset] := #7; - offset += 1; - i += 1; - end; - - xpos := (offset mod 160); - ypos := (offset - xpos) div 160; - xpos := xpos shr 1; -end; - -procedure kwriteint(i: Integer); [public, alias: 'kwriteint']; +procedure console_writeint(i: Integer; attributes : char); [public, alias: 'console_writeint']; var buffer: array [0..11] of Char; str: PChar; @@ -122,53 +107,114 @@ var begin str := @buffer[11]; str^ := #0; - - if (i < 0) then - begin + if (i < 0) then begin digit := -i; minus := True; - end - else - begin + end else begin digit := i; minus := False; end; - repeat Dec(str); str^ := Char((digit mod 10) + Byte('0')); digit := digit div 10; until (digit = 0); - - if (minus) then - begin + if (minus) then begin Dec(str); str^ := '-'; end; - - kwritestr(str); + console_writestring(str, attributes); end; -procedure kwritedword(i: DWORD); [public, alias: 'kwritedword']; +procedure console_writedword(i: DWORD; attributes : char); [public, alias: 'console_writedword']; var buffer: array [0..11] of Char; str: PChar; digit: DWORD; begin - for digit := 0 to 10 do - buffer[digit] := '0'; - + for digit := 0 to 10 do buffer[digit] := '0'; str := @buffer[11]; str^ := #0; - digit := i; repeat Dec(str); str^ := Char((digit mod 10) + Byte('0')); digit := digit div 10; until (digit = 0); - - kwritestr(@Buffer[0]); + console_writestring(@Buffer[0], attributes); +end; + +procedure console_writecharln(character: char; attributes: char); [public, alias: 'console_writecharln']; +begin + console_writechar(character, attributes); + _console_safeincrement_y(); +end; + +procedure console_writestringln(str: PChar; attributes: char); [public, alias: 'console_writestringln']; +begin + console_writestring(str, attributes); + _console_safeincrement_y(); +end; + +procedure console_writeintln(i: Integer; attributes: char); [public, alias: 'console_writeintln']; +begin + console_writeint(i, attributes); + _console_safeincrement_y(); +end; + +procedure console_writedwordln(i: DWORD; attributes: char); [public, alias: 'console_writedwordln']; +begin + console_writedword(i, attributes); + _console_safeincrement_y(); +end; + +procedure _console_increment_x(); [public, alias: '_console_increment_x']; +begin + Console_Cursor.X:= Console_Cursor.X+1; + If Console_Cursor.X > 79 then Console_Cursor.X:= 0; +end; + +procedure _console_increment_y(); [public, alias: '_console_increment_y']; +begin + Console_Cursor.Y:= Console_Cursor.Y+1; + If Console_Cursor.Y > 24 then begin + _console_newline(); + Console_Cursor.Y:= 24; + end; +end; + +procedure _console_safeincrement_x(); [public, alias: '_console_safeincrement_x']; +begin + Console_Cursor.X:= Console_Cursor.X+1; + If Console_Cursor.X > 79 then begin + _console_safeincrement_y(); + end; +end; + +procedure _console_safeincrement_y(); [public, alias: '_console_safeincrement_y']; +begin + Console_Cursor.Y:= Console_Cursor.Y+1; + If Console_Cursor.Y > 24 then begin + _console_newline(); + Console_Cursor.Y:= 24; + end; + Console_Cursor.X:= 0; +end; + +procedure _console_newline(); [public, alias: '_console_newline']; +var + x, y : byte; + +begin + for x:=0 to 79 do begin + for y:=0 to 23 do begin + Console_Matrix^[y][x]:= Console_Matrix^[y+1][x]; + end; + end; + for x:=0 to 79 do begin + Console_Matrix^[24][x].Character:= #0; + Console_Matrix^[24][x].Attributes:= #7; + end; end; end. diff --git a/src/kernel.pas b/src/kernel.pas index 492cc6ba..0530d5ce 100644 --- a/src/kernel.pas +++ b/src/kernel.pas @@ -25,48 +25,30 @@ implementation procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: DWORD); stdcall; [public, alias: 'kmain']; begin - kclearscreen(); - ktest(); - kwritestr('FUCK YOU!'); - kwritestr('Freepascal barebone OS booted!'); - xpos := 0; - ypos += 1; - - if (mbmagic <> MULTIBOOT_BOOTLOADER_MAGIC) then - begin - kwritestr('Halting system, a multiboot-compliant boot loader needed!'); - asm - cli - hlt - end; - end - else - begin - kwritestr('Booted by a multiboot-compliant boot loader!'); - xpos := 0; - ypos += 2; - kwritestr('Multiboot information:'); - xpos := 0; - ypos += 2; - kwritestr(' Lower memory = '); - kwriteint(mbinfo^.mem_lower); - kwritestr('KB'); - xpos := 0; - ypos += 1; - kwritestr(' Higher memory = '); - kwriteint(mbinfo^.mem_upper); - kwritestr('KB'); - xpos := 0; - ypos += 1; - kwritestr(' Total memory = '); - kwriteint(((mbinfo^.mem_upper + 1000) div 1024) +1); - kwritestr('MB'); - end; - + console_init(); + console_writestringln('Asuro Booting...', #7); + if (mbmagic <> MULTIBOOT_BOOTLOADER_MAGIC) then begin + console_writestringln('Multiboot Compliant Boot-Loader Needed!', #7); + console_writestringln('HALTING', #7); asm - @loop: - jmp @loop + cli + hlt end; + end; + console_writestringln('Asuro Booted Correctly!', #7); + console_writestring('Lower Memory = ', #7); + console_writeint(mbinfo^.mem_lower, #7); + console_writestringln('KB', #7); + console_writestring('Higher Memory = ', #7); + console_writeint(mbinfo^.mem_upper, #7); + console_writestringln('KB', #7); + console_writestring('Total Memory = ', #7); + console_writeint(((mbinfo^.mem_upper + 1000) div 1024) +1, #7); + console_writestringln('MB', #7); + asm + @loop: + jmp @loop + end; end; end.