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

BIN
Asuro.iso

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

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);
console_writestring(@Buffer[0], attributes);
end;
kwritestr(@Buffer[0]);
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,44 +25,26 @@ 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!');
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
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_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