Console Refactoring.

git-svn-id: https://spexeah.com:8443/svn/Asuro@6 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
kieron
2015-09-18 18:28:01 +00:00
parent ca2e904cf6
commit 815d1b8199
11 changed files with 162 additions and 134 deletions

View File

@ -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.

View File

@ -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.