From f1d3dabe14883ea8e7fc70002bc5ccdfe9defb58 Mon Sep 17 00:00:00 2001 From: kieron Date: Mon, 30 Apr 2018 17:22:09 +0000 Subject: [PATCH] git-svn-id: https://spexeah.com:8443/svn/Asuro@610 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c --- src/{ => backup}/consoleBK.pas | 0 src/backup/consoleWNDBK.pas | 1512 ++++++++++++++++++++++++++++++++ src/console.pas | 532 +++++++---- src/include/system.pas | 1 + src/include/util.pas | 2 +- src/kernel.pas | 6 +- src/prog/memview.pas | 102 +++ src/terminal.pas | 9 +- 8 files changed, 1976 insertions(+), 188 deletions(-) rename src/{ => backup}/consoleBK.pas (100%) create mode 100644 src/backup/consoleWNDBK.pas create mode 100644 src/prog/memview.pas diff --git a/src/consoleBK.pas b/src/backup/consoleBK.pas similarity index 100% rename from src/consoleBK.pas rename to src/backup/consoleBK.pas diff --git a/src/backup/consoleWNDBK.pas b/src/backup/consoleWNDBK.pas new file mode 100644 index 00000000..920bbe20 --- /dev/null +++ b/src/backup/consoleWNDBK.pas @@ -0,0 +1,1512 @@ +{ ************************************************ + * Asuro + * Unit: console + * Description: Basic Console Output + ************************************************ + * Author: K Morris + * Contributors: + ************************************************ } + +unit console; + +interface + +uses + util, + bios_data_area, + multiboot, + fonts, + tracer; + +type + TColor = ( Black = $0, + Blue = $1, + Green = $2, + Aqua = $3, + Red = $4, + Purple = $5, + Yellow = $6, + White = $7, + Gray = $8, + lBlue = $9, + lGreen = $A, + lAqua = $B, + lRed = $C, + lPurple = $D, + lYellow = $E, + lWhite = $F ); + +procedure init(); +procedure clear(); +procedure setdefaultattribute(attribute : uint32); + +procedure disable_cursor; + +procedure writechar(character : char); +procedure writecharln(character : char); +procedure writecharex(character : char; attributes: uint32); +procedure writecharlnex(character : char; attributes: uint32); + +procedure Output(identifier : PChar; str : PChar); +procedure Outputln(identifier : PChar; str : PChar); + +procedure writestring(str: PChar); +procedure writestringln(str: PChar); +procedure writestringex(str: PChar; attributes: uint32); +procedure writestringlnex(str: PChar; attributes: uint32); + +procedure writeint(i: Integer); +procedure writeintln(i: Integer); +procedure writeintex(i: Integer; attributes: uint32); +procedure writeintlnex(i: Integer; attributes: uint32); + +procedure writeword(i: DWORD); +procedure writewordln(i: DWORD); +procedure writewordex(i: DWORD; attributes: uint32); +procedure writewordlnex(i: DWORD; attributes: uint32); + +procedure writehexpair(b : uint8); +procedure writehex(i: DWORD); +procedure writehexln(i: DWORD); +procedure writehexex(i : DWORD; attributes: uint32); +procedure writehexlnex(i: DWORD; attributes: uint32); + +procedure writebin8(b : uint8); +procedure writebin8ln(b : uint8); +procedure writebin8ex(b : uint8; attributes: uint32); +procedure writebin8lnex(b : uint8; attributes: uint32); + +procedure writebin16(b : uint16); +procedure writebin16ln(b : uint16); +procedure writebin16ex(b : uint16; attributes: uint32); +procedure writebin16lnex(b : uint16; attributes: uint32); + +procedure writebin32(b : uint32); +procedure writebin32ln(b : uint32); +procedure writebin32ex(b : uint32; attributes: uint32); +procedure writebin32lnex(b : uint32; attributes: uint32); + +procedure backspace; + +function combinecolors(Foreground, Background : uint16) : uint32; + +procedure _increment_x(); +procedure _increment_y(); +procedure _safeincrement_y(); +procedure _safeincrement_x(); +procedure _newline(); + +{ WND Specific } + +procedure clearWND(WND : uint32); + +procedure writecharWND(character : char; WND : uint32); +procedure writecharlnWND(character : char; WND : uint32); +procedure writecharexWND(character : char; attributes: uint32; WND : uint32); +procedure writecharlnexWND(character : char; attributes: uint32; WND : uint32); + +procedure OutputWND(identifier : PChar; str : PChar; WND : uint32); +procedure OutputlnWND(identifier : PChar; str : PChar; WND : uint32); + +procedure writestringWND(str: PChar; WND : uint32); +procedure writestringlnWND(str: PChar; WND : uint32); +procedure writestringexWND(str: PChar; attributes: uint32; WND : uint32); +procedure writestringlnexWND(str: PChar; attributes: uint32; WND : uint32); + +procedure writeintWND(i: Integer; WND : uint32); +procedure writeintlnWND(i: Integer; WND : uint32); +procedure writeintexWND(i: Integer; attributes: uint32; WND : uint32); +procedure writeintlnexWND(i: Integer; attributes: uint32; WND : uint32); + +procedure writewordWND(i: DWORD; WND : uint32); +procedure writewordlnWND(i: DWORD; WND : uint32); +procedure writewordexWND(i: DWORD; attributes: uint32; WND : uint32); +procedure writewordlnexWND(i: DWORD; attributes: uint32; WND : uint32); + +procedure writehexpairWND(b : uint8; WND : uint32); +procedure writehexWND(i: DWORD; WND : uint32); +procedure writehexlnWND(i: DWORD; WND : uint32); +procedure writehexexWND(i : DWORD; attributes: uint32; WND : uint32); +procedure writehexlnexWND(i: DWORD; attributes: uint32; WND : uint32); + +procedure writebin8WND(b : uint8; WND : uint32); +procedure writebin8lnWND(b : uint8; WND : uint32); +procedure writebin8exWND(b : uint8; attributes: uint32; WND : uint32); +procedure writebin8lnexWND(b : uint8; attributes: uint32; WND : uint32); + +procedure writebin16WND(b : uint16; WND : uint32); +procedure writebin16lnWND(b : uint16; WND : uint32); +procedure writebin16exWND(b : uint16; attributes: uint32; WND : uint32); +procedure writebin16lnexWND(b : uint16; attributes: uint32; WND : uint32); + +procedure writebin32WND(b : uint32; WND : uint32); +procedure writebin32lnWND(b : uint32; WND : uint32); +procedure writebin32exWND(b : uint32; attributes: uint32; WND : uint32); +procedure writebin32lnexWND(b : uint32; attributes: uint32; WND : uint32); + +procedure backspaceWND(WND : uint32); + +procedure _increment_x_WND(WND : uint32); +procedure _increment_y_WND(WND : uint32); +procedure _safeincrement_y_WND(WND : uint32); +procedure _safeincrement_x_WND(WND : uint32); +procedure _newlineWND(WND : uint32); + +{ Drawing } + +procedure outputChar(c : char; x : uint8; y : uint8; fgcolor : uint16; bgcolor : uint16); +procedure outputCharToScreenSpace(c : char; x : uint32; y : uint32; fgcolor : uint16); +procedure outputCharTransparent(c : char; x : uint8; y : uint8; fgcolor : uint16); + +function getPixel(x : uint32; y : uint32) : uint16; +procedure drawPixel(x : uint32; y : uint32; color : uint16); +function getPixel32(x : uint32; y : uint32) : uint32; +procedure drawPixel32(x : uint32; y : uint32; pixel : uint32); +function getPixel64(x : uint32; y : uint32) : uint64; +procedure drawPixel64(x : uint32; y : uint32; pixel : uint64); + +{ Windows Methods } + +procedure setMousePosition(x : uint32; y : uint32); +procedure redrawWindows; +procedure toggleWNDVisible(WND : uint32); +procedure setWNDVisible(WND : uint32; visible : boolean); +procedure closeAllWindows; + +implementation + +uses + lmemorymanager, strings; + +const + MAX_WINDOWS = 10; + DefaultWND = 0; + +type + TConsoleProperties = record + Default_Attribute : uint32; + end; + + TCharacter = bitpacked record + Character : Char; + attributes : uint32; + visible : boolean; + end; + PCharacter = ^TCharacter; + + TVideoMemory = Array[0..1999] of TCharacter; + PVideoMemory = ^TVideoMemory; + + T2DVideoMemory = Array[0..63] of Array[0..159] of TCharacter; + P2DVideoMemory = ^T2DVideoMemory; + + TMouseCoord = record + X : sint32; + Y : sint32; + end; + + TCoord = record + X : Byte; + Y : Byte; + end; + + TWindow = record + visible : boolean; + buffer : T2DVideoMemory; + row_dirty : Array[0..63] of Boolean; + WND_X : uint32; + WND_Y : uint32; + WND_W : uint32; + WND_H : uint32; + Cursor : TCoord; + WND_NAME : PChar; + end; + PWindow = ^TWindow; + + TWindows = Array[0..MAX_WINDOWS-1] of TWindow; + + TWindowManager = record + Windows : TWindows; + MousePos : TMouseCoord; + MousePrev : TMouseCoord; + end; + + TMouseDirt = record + TopLeft : TMouseCoord; + BottomRight : TMouseCoord; + end; + +var + Console_Properties : TConsoleProperties; //Generic Properties + Console_Real : T2DVideoMemory; //The real state of the Console/TUI + Console_Matrix : T2DVideoMemory; //The next buffer to be written + Console_Cursor : TCoord; //The text cursor position + WindowManager : TWindowManager; //Window Manager + Ready : Boolean = false; //Is the unit ready for use? + MouseDrawActive : Boolean = false; //Is the Mouse currently being updated? + mouse_dirt : TMouseDirt; //Character Cell(s) the mouse occupies, these need to be rewritten on mouse move. + Window_Border : TCharacter; + Default_Char : TCharacter; + +procedure closeAllWindows; +var + i : uint32; + +begin + for i:=1 to MAX_WINDOWS-1 do begin + setWNDVisible(i, false); + end; +end; + +procedure setWNDVisible(WND : uint32; visible : boolean); +begin + WindowManager.Windows[WND].visible:= visible; +end; + +procedure toggleWNDVisible(WND : uint32); +begin + WindowManager.Windows[WND].visible:= not WindowManager.Windows[WND].visible; +end; + +procedure drawMouse; +var + x, y : uint32; + MX, MY : uint32; + +begin + MouseDrawActive:= true; + MX:= WindowManager.MousePos.X; + MY:= WindowManager.MousePos.Y; + WindowManager.MousePrev.x:= MX; + WindowManager.MousePrev.y:= MY; + mouse_dirt.TopLeft.x:= (MX div 8) - 2; + mouse_dirt.TopLeft.y:= (MY div 16) - 2; + mouse_dirt.BottomRight.x:= (MX div 8) + 2; + mouse_dirt.BottomRight.y:= (MY div 16) + 2; + if mouse_dirt.TopLeft.x < 0 then mouse_dirt.TopLeft.x:= 0; + if mouse_dirt.TopLeft.y < 0 then mouse_dirt.TopLeft.y:= 0; + if mouse_dirt.BottomRight.x > 159 then mouse_dirt.BottomRight.x:= 159; + if mouse_dirt.BottomRight.y > 63 then mouse_dirt.BottomRight.y:= 63; + MouseDrawActive:= false; +end; + +procedure redrawMatrix; +var + x, y, w: uint32; + +begin + if (WindowManager.MousePos.x <> WindowManager.MousePrev.x) OR (WindowManager.MousePos.y <> WindowManager.MousePrev.y) then begin + for y:=mouse_dirt.TopLeft.y to mouse_dirt.BottomRight.y do begin + for x:=mouse_dirt.TopLeft.x to mouse_dirt.BottomRight.x do begin + Console_Real[y][x].character:= char(1); + end; + end; + drawMouse; + end; + for y:=0 to 63 do begin + for x:=0 to 159 do begin + if (Console_Matrix[y][x].character <> Console_Real[y][x].character) or (Console_Matrix[y][x].attributes <> Console_Real[y][x].attributes) then begin + OutputChar(Console_Matrix[y][x].Character, x, y, Console_Matrix[y][x].Attributes SHR 16, Console_Matrix[y][x].Attributes AND $FFFF); + Console_Real[y][x]:= Console_Matrix[y][x]; + end; + end; + end; + outputCharToScreenSpace(char(0), WindowManager.MousePrev.x, WindowManager.MousePrev.y, $FFFF); +end; + +procedure setMousePosition(x : uint32; y : uint32); +begin + if MouseDrawActive then exit; + WindowManager.MousePos.X:= x; + WindowManager.MousePos.Y:= y; +end; + +procedure redrawWindows; +var + x, y, w : uint32; + WXL, WYL : sint32; + WXR, WYR : sint32; + STRC : uint32; + MIDP, STARTP : uint32; + +begin + for y:=0 to 63 do begin + for x:=0 to 159 do begin + Console_Matrix[y][x]:= Default_Char; + end; + end; + for w:=0 to MAX_WINDOWS-1 do begin + If WindowManager.Windows[w].visible then begin + if w <> 0 then begin + WXL:= WindowManager.Windows[w].WND_X - 1; + WYL:= WindowManager.Windows[w].WND_Y - 1; + WXR:= WindowManager.Windows[w].WND_X + WindowManager.Windows[w].WND_W + 1; + WYR:= WindowManager.Windows[w].WND_Y + WindowManager.Windows[w].WND_H + 1; + for y:=WYL to WYR do begin + Console_Matrix[y][WXL]:= Window_Border; + Console_Matrix[y][WXL-1]:= Window_Border; + Console_Matrix[y][WXR]:= Window_Border; + Console_Matrix[y][WXR+1]:= Window_Border; + Console_Real[y][WXL].Character:= char(3); + Console_Real[y][WXL-1].Character:= char(3); + Console_Real[y][WXR].Character:= char(3); + Console_Real[y][WXR+1].Character:= char(3); + end; + STRC:= 0; + MIDP:= (WXR + WXL) div 2; + STARTP:= MIDP - (StringSize(WindowManager.Windows[w].WND_NAME) div 2) - 1; + for x:=WXL to WXR do begin + Console_Matrix[WYL][x]:= Window_Border; + if (x >= STARTP) and (STRC < StringSize(WindowManager.Windows[w].WND_NAME)) then begin + Console_Matrix[WYL][x].character:= WindowManager.Windows[w].WND_NAME[STRC]; + inc(STRC); + end; + if x = WXR then begin + Console_Matrix[WYL][x].character:= 'x'; + end; + Console_Matrix[WYR][x]:= Window_Border; + Console_Real[WYL][x].Character:= char(3); + Console_Real[WYR][x].Character:= char(3); + end; + end; + for y:=WindowManager.Windows[w].WND_Y to WindowManager.Windows[w].WND_Y + WindowManager.Windows[w].WND_H do begin + if y > 63 then break; + for x:=WindowManager.Windows[w].WND_X to WindowManager.Windows[w].WND_X + WindowManager.Windows[w].WND_W do begin + if x > 159 then break; + Console_Matrix[y][x]:= WindowManager.Windows[w].buffer[y - WindowManager.Windows[w].WND_Y][x - WindowManager.Windows[w].WND_X]; + end; + end; + end; + end; + redrawMatrix; +end; + +procedure initWindows; +var + x, y, w : uint32; + +begin + Default_Char.Character:= ' '; + Default_Char.attributes:= Console_Properties.Default_Attribute; + Default_Char.visible:= true; + + Window_Border.Character:= ' '; + Window_Border.Attributes:= $0000FFFF; + Window_Border.visible:= true; + + for w:=0 to MAX_WINDOWS-1 do begin + WindowManager.Windows[w].visible:= false; + for y:=0 to 63 do begin + for x:=0 to 159 do begin + WindowManager.Windows[w].Buffer[y][x]:= Default_Char; + Console_Real[y][x].character:= char(1); + end; + end; + end; + + WindowManager.Windows[0].visible:= true; + WindowManager.Windows[0].WND_X:= 0; + WindowManager.Windows[0].WND_Y:= 0; + WindowManager.Windows[0].WND_H:= 63; + WindowManager.Windows[0].WND_W:= 159; + + WindowManager.Windows[1].visible:= false; + WindowManager.Windows[1].WND_X:= 20; + WindowManager.Windows[1].WND_W:= 90; + WindowManager.Windows[1].WND_Y:= 10; + WindowManager.Windows[1].WND_H:= 20; + WindowManager.Windows[1].WND_NAME:= 'ASURO TERMINAL'; +end; + +function getPixel(x : uint32; y : uint32) : uint16; +var + dest : puint16; + +begin + if not ready then exit; + dest:= puint16(multibootinfo^.framebuffer_addr); + dest:= dest + (y * 1280) + x; + getPixel:= dest^; +end; + +procedure drawPixel(x : uint32; y : uint32; color : uint16); +var + dest : puint16; + +begin + if not ready then exit; + dest:= puint16(multibootinfo^.framebuffer_addr); + dest:= dest + (y * 1280) + x; + dest^:= color; +end; + +function getPixel32(x : uint32; y : uint32) : uint32; +var + dest : puint16; + dest32 : puint32; + +begin + if not ready then exit; + dest:= puint16(multibootinfo^.framebuffer_addr); + dest:= dest + (y * 1280) + x; + dest32:= puint32(dest); + getPixel32:= dest32[0]; +end; + +procedure drawPixel32(x : uint32; y : uint32; pixel : uint32); +var + dest : puint16; + dest32 : puint32; + +begin + if not ready then exit; + dest:= puint16(multibootinfo^.framebuffer_addr); + dest:= dest + (y * 1280) + x; + dest32:= puint32(dest); + dest32[0]:= pixel; +end; + +function getPixel64(x : uint32; y : uint32) : uint64; +var + dest : puint16; + dest64 : puint64; + +begin + if not ready then exit; + dest:= puint16(multibootinfo^.framebuffer_addr); + dest:= dest + (y * 1280) + x; + dest64:= puint64(dest); + getPixel64:= dest64^; +end; + +procedure drawPixel64(x : uint32; y : uint32; pixel : uint64); +var + dest : puint16; + dest64 : puint64; + +begin + if not ready then exit; + dest:= puint16(multibootinfo^.framebuffer_addr); + dest:= dest + (y * 1280) + x; + dest64:= puint64(dest); + dest64^:= pixel; +end; + +procedure outputCharToScreenSpace(c : char; x : uint32; y : uint32; fgcolor : uint16); +var + dest : puint16; + dest32 : puint32; + fgcolor32, bgcolor32 : uint32; + mask : puint32; + i : uint32; + +begin + if not ready then exit; + fgcolor32:= fgcolor OR (fgcolor SHL 16); + mask:= puint32(@Std_Mask[uint32(c) * (16 * 8)]); + dest:= puint16(multibootinfo^.framebuffer_addr); + //dest:= puint16(windowmanager.getBuffer(0)); + dest:= dest + (y * 1280) + x; + dest32:= puint32(dest); + for i:=0 to 15 do begin + dest32[(i*640)+0]:= (dest32[(i*640)+0] AND NOT(mask[(i*4)+0])) OR (fgcolor32 AND mask[(i*4)+0]); + dest32[(i*640)+1]:= (dest32[(i*640)+1] AND NOT(mask[(i*4)+1])) OR (fgcolor32 AND mask[(i*4)+1]); + dest32[(i*640)+2]:= (dest32[(i*640)+2] AND NOT(mask[(i*4)+2])) OR (fgcolor32 AND mask[(i*4)+2]); + dest32[(i*640)+3]:= (dest32[(i*640)+3] AND NOT(mask[(i*4)+3])) OR (fgcolor32 AND mask[(i*4)+3]); + end; + //windowmanager.redraw; +end; + +procedure outputCharTransparent(c : char; x : uint8; y : uint8; fgcolor : uint16); +var + dest : puint16; + dest32 : puint32; + fgcolor32, bgcolor32 : uint32; + mask : puint32; + i : uint32; + +begin + if not ready then exit; + fgcolor32:= fgcolor OR (fgcolor SHL 16); + mask:= puint32(@Std_Mask[uint32(c) * (16 * 8)]); + dest:= puint16(multibootinfo^.framebuffer_addr); + //dest:= puint16(windowmanager.getBuffer(0)); + dest:= dest + (y*(1280 * 16)) + (x * 8); + dest32:= puint32(dest); + for i:=0 to 15 do begin + dest32[(i*640)+0]:= (dest32[(i*640)+0] AND NOT(mask[(i*4)+0])) OR (fgcolor32 AND mask[(i*4)+0]); + dest32[(i*640)+1]:= (dest32[(i*640)+1] AND NOT(mask[(i*4)+1])) OR (fgcolor32 AND mask[(i*4)+1]); + dest32[(i*640)+2]:= (dest32[(i*640)+2] AND NOT(mask[(i*4)+2])) OR (fgcolor32 AND mask[(i*4)+2]); + dest32[(i*640)+3]:= (dest32[(i*640)+3] AND NOT(mask[(i*4)+3])) OR (fgcolor32 AND mask[(i*4)+3]); + end; + //windowmanager.redraw; +end; + +procedure outputChar(c : char; x : uint8; y : uint8; fgcolor : uint16; bgcolor : uint16); +var + dest : puint16; + dest32 : puint32; + fgcolor32, bgcolor32 : uint32; + mask : puint32; + i : uint32; + +begin + if not ready then exit; + fgcolor32:= fgcolor OR (fgcolor SHL 16); + bgcolor32:= bgcolor OR (bgcolor SHL 16); + mask:= puint32(@Std_Mask[uint32(c) * (16 * 8)]); + dest:= puint16(multibootinfo^.framebuffer_addr); + //dest:= puint16(windowmanager.getBuffer(0)); + dest:= dest + (y*(1280 * 16)) + (x * 8); + dest32:= puint32(dest); + for i:=0 to 15 do begin + dest32[(i*640)+0]:= (bgcolor32 AND NOT(mask[(i*4)+0])) OR (fgcolor32 AND mask[(i*4)+0]); + dest32[(i*640)+1]:= (bgcolor32 AND NOT(mask[(i*4)+1])) OR (fgcolor32 AND mask[(i*4)+1]); + dest32[(i*640)+2]:= (bgcolor32 AND NOT(mask[(i*4)+2])) OR (fgcolor32 AND mask[(i*4)+2]); + dest32[(i*640)+3]:= (bgcolor32 AND NOT(mask[(i*4)+3])) OR (fgcolor32 AND mask[(i*4)+3]); + end; + //windowmanager.redraw; +end; + +procedure disable_cursor; +begin + outb($3D4, $0A); + outb($3D5, $20); +end; + +procedure init(); [public, alias: 'console_init']; +var + fb: puint32; + +Begin + fb:= puint32(uint32(multibootinfo^.framebuffer_addr)); + kpalloc(uint32(fb)); + initWindows; + Console_Properties.Default_Attribute:= console.combinecolors($FFFF, $0000); + console.clear(); + Ready:= True; +end; + +{ Default Console Write Functions } + +procedure clear(); [public, alias: 'console_clear']; +var + x,y: Byte; + +begin + for y:=0 to 63 do begin + for x:=0 to 159 do begin + WindowManager.Windows[DefaultWND].Buffer[y][x].Character:= ' '; + WindowManager.Windows[DefaultWND].Buffer[y][x].Attributes:= Console_Properties.Default_Attribute; + WindowManager.Windows[DefaultWND].row_dirty[y]:= true; + //Console_Matrix[y][x].Character:= ' '; + //Console_Matrix[y][x].Attributes:= Console_Properties.Default_Attribute; + //OutputChar(Console_Matrix[y][x].Character, x, y, Console_Matrix[y][x].Attributes SHR 16, Console_Matrix[y][x].Attributes AND $FFFF); + end; + end; + WindowManager.Windows[DefaultWND].Cursor.X:= 0; + WindowManager.Windows[DefaultWND].Cursor.Y:= 0; + redrawWindows; + //Console_Cursor.X:= 0; + //Console_Cursor.Y:= 0; +end; + +procedure writebin8ex(b : uint8; attributes: uint32); +var + Mask : PMask; + i : uint8; + +begin + Mask:= PMask(@b); + for i:=0 to 7 do begin + If Mask^[7-i] then writecharex('1', attributes) else writecharex('0', attributes); + end; +end; + +procedure writebin16ex(b : uint16; attributes: uint32); +var + Mask : PMask; + i,j : uint8; + +begin + for j:=1 downto 0 do begin + Mask:= PMask(uint32(@b) + (1 * j)); + for i:=0 to 7 do begin + If Mask^[7-i] then writecharex('1', attributes) else writecharex('0', attributes); + end; + end; +end; + +procedure writebin32ex(b : uint32; attributes: uint32); +var + Mask : PMask; + i,j : uint8; + +begin + for j:=3 downto 0 do begin + Mask:= PMask(uint32(@b) + (1 * j)); + for i:=0 to 7 do begin + If Mask^[7-i] then writecharex('1', attributes) else writecharex('0', attributes); + end; + end; +end; + +procedure writebin8(b : uint8); +begin + writebin8ex(b, Console_Properties.Default_Attribute); +end; + +procedure writebin16(b : uint16); +begin + writebin16ex(b, Console_Properties.Default_Attribute); +end; + +procedure writebin32(b : uint32); +begin + writebin32ex(b, Console_Properties.Default_Attribute); +end; + +procedure writebin8lnex(b : uint8; attributes: uint32); +begin + writebin8ex(b, attributes); + console._safeincrement_y(); +end; + +procedure writebin16lnex(b : uint16; attributes: uint32); +begin + writebin16ex(b, attributes); + console._safeincrement_y(); +end; + +procedure writebin32lnex(b : uint32; attributes: uint32); +begin + writebin32ex(b, attributes); + console._safeincrement_y(); +end; + +procedure writebin8ln(b : uint8); +begin + writebin8lnex(b, Console_Properties.Default_Attribute); +end; + +procedure writebin16ln(b : uint16); +begin + writebin16lnex(b, Console_Properties.Default_Attribute); +end; + +procedure writebin32ln(b : uint32); +begin + writebin32lnex(b, Console_Properties.Default_Attribute); +end; + +procedure setdefaultattribute(attribute: uint32); [public, alias: 'console_setdefaultattribute']; +begin + Console_Properties.Default_Attribute:= attribute; +end; + +procedure writechar(character: char); [public, alias: 'console_writechar']; +begin + console.writecharex(character, Console_Properties.Default_Attribute); +end; + +procedure writestring(str: PChar); [public, alias: 'console_writestring']; +begin + console.writestringex(str, Console_Properties.Default_Attribute); +end; + +procedure writeint(i: Integer); [public, alias: 'console_writeint']; +begin + console.writeintex(i, Console_Properties.Default_Attribute); +end; + +procedure writeword(i: DWORD); [public, alias: 'console_writeword']; +begin + console.writewordex(i, Console_Properties.Default_Attribute); +end; + +procedure writecharln(character: char); [public, alias: 'console_writecharln']; +begin + console.writecharlnex(character, Console_Properties.Default_Attribute); +end; + +procedure writestringln(str: PChar); [public, alias: 'console_writestringln']; +begin + console.writestringlnex(str, Console_Properties.Default_Attribute); +end; + +procedure writeintln(i: Integer); [public, alias: 'console_writeintln']; +begin + console.writeintlnex(i, Console_Properties.Default_Attribute); +end; + +procedure writewordln(i: DWORD); [public, alias: 'console_writewordln']; +begin + console.writewordlnex(i, Console_Properties.Default_Attribute); +end; + +procedure writecharex(character: char; attributes: uint32); [public, alias: 'console_writecharex']; +begin + WindowManager.Windows[DefaultWND].Buffer[WindowManager.Windows[DefaultWND].Cursor.Y][WindowManager.Windows[DefaultWND].Cursor.X].Character:= character; + WindowManager.Windows[DefaultWND].Buffer[WindowManager.Windows[DefaultWND].Cursor.Y][WindowManager.Windows[DefaultWND].Cursor.X].Attributes:= attributes; + //outputChar(character, Console_Cursor.X, Console_Cursor.Y, attributes SHR 16, attributes AND $FFFF); + //Console_Matrix[Console_Cursor.Y][Console_Cursor.X].Character:= character; + //Console_Matrix[Console_Cursor.Y][Console_Cursor.X].Attributes:= attributes; + WindowManager.Windows[DefaultWND].row_dirty[WindowManager.Windows[DefaultWND].Cursor.Y]:= true; + console._safeincrement_x(); +end; + +procedure writehexpair(b : uint8); +var + bn : Array[0..1] of uint8; + i : uint8; + +begin + bn[0]:= b SHR 4; + bn[1]:= b AND $0F; + for i:=0 to 1 do begin + case bn[i] of + 0:writestring('0'); + 1:writestring('1'); + 2:writestring('2'); + 3:writestring('3'); + 4:writestring('4'); + 5:writestring('5'); + 6:writestring('6'); + 7:writestring('7'); + 8:writestring('8'); + 9:writestring('9'); + 10:writestring('A'); + 11:writestring('B'); + 12:writestring('C'); + 13:writestring('D'); + 14:writestring('E'); + 15:writestring('F'); + end; + end; +end; + +procedure writehexex(i : dword; attributes: uint32); [public, alias: 'console_writehexex']; +var + Hex : Array[0..7] of Byte; + Res : DWORD; + Rem : DWORD; + c : Integer; + +begin + for c:=0 to 7 do begin + Hex[c]:= 0; + end; + c:=0; + Res:= i; + Rem:= Res mod 16; + while Res > 0 do begin + Hex[c]:= Rem; + Res:= Res div 16; + Rem:= Res mod 16; + c:=c+1; + end; + writestringex('0x', attributes); + for c:=7 downto 0 do begin + if Hex[c] <> 255 then begin + case Hex[c] of + 0:writecharex('0', attributes); + 1:writecharex('1', attributes); + 2:writecharex('2', attributes); + 3:writecharex('3', attributes); + 4:writecharex('4', attributes); + 5:writecharex('5', attributes); + 6:writecharex('6', attributes); + 7:writecharex('7', attributes); + 8:writecharex('8', attributes); + 9:writecharex('9', attributes); + 10:writecharex('A', attributes); + 11:writecharex('B', attributes); + 12:writecharex('C', attributes); + 13:writecharex('D', attributes); + 14:writecharex('E', attributes); + 15:writecharex('F', attributes); + else writecharex('?', attributes); + end; + end; + end; +end; + +procedure writehex(i : dword); [public, alias: 'console_writehex']; +begin + console.writehexex(i, Console_Properties.Default_Attribute); +end; + +procedure writehexlnex(i : dword; attributes: uint32); +begin + console.writehexex(i, attributes); + console._safeincrement_y(); +end; + +procedure writehexln(i : dword); +begin + writehexlnex(i, Console_Properties.Default_Attribute); +end; + +procedure Output(identifier : PChar; str : PChar); +begin + writestring('['); + writestring(identifier); + writestring('] '); + writestring(str); +end; + +procedure Outputln(identifier : PChar; str : PChar); +begin + Output(identifier, str); + writestringln(' '); +end; + +procedure writestringex(str: PChar; attributes: uint32); [public, alias: 'console_writestringex']; +var + i : integer; + +begin + i:= 0; + while (str[i] <> #0) do begin + console.writecharex(str[i], attributes); + i:=i+1; + end; +end; + +procedure writeintex(i: Integer; attributes: uint32); [public, alias: 'console_writeintex']; +var + buffer: array [0..11] of Char; + str: PChar; + digit: DWORD; + minus: Boolean; +begin + str := @buffer[11]; + str^ := #0; + if (i < 0) then begin + digit := -i; + minus := True; + 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 + Dec(str); + str^ := '-'; + end; + console.writestringex(str, attributes); +end; + +procedure writewordex(i: DWORD; attributes: uint32); [public, alias: 'console_writedwordex']; +var + buffer: array [0..11] of Char; + str: PChar; + digit: DWORD; +begin + 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.writestringex(@Buffer[0], attributes); +end; + +procedure writecharlnex(character: char; attributes: uint32); [public, alias: 'console_writecharlnex']; +begin + console.writecharex(character, attributes); + console._safeincrement_y(); +end; + +procedure writestringlnex(str: PChar; attributes: uint32); [public, alias: 'console_writestringlnex']; +begin + console.writestringex(str, attributes); + console._safeincrement_y(); +end; + +procedure writeintlnex(i: Integer; attributes: uint32); [public, alias: 'console_writeintlnex']; +begin + console.writeintex(i, attributes); + console._safeincrement_y(); +end; + +procedure writewordlnex(i: DWORD; attributes: uint32); [public, alias: 'console_writewordlnex']; +begin + console.writewordex(i, attributes); + console._safeincrement_y(); +end; + +function combinecolors(Foreground, Background: uint16): uint32; +begin + combinecolors:= (uint32(Foreground) SHL 16) OR Background; +end; + +procedure _update_cursor(); [public, alias: '_console_update_cursor']; +var + pos : word; + b : byte; + +begin + //pos:= (Console_Cursor.Y * 80) + Console_Cursor.X; + //outb($3D4, $0F); + //b:= pos and $00FF; + //outb($3D5, b); + //outb($3D4, $0E); + //b:= pos shr 8; + //outb($3D5, b); + if CONSOLE_SLOW_REDRAW then redrawWindows; + //sleep(1); +end; + +procedure backspace; +begin + Dec(WindowManager.Windows[DefaultWND].Cursor.X); + writechar(' '); + Dec(WindowManager.Windows[DefaultWND].Cursor.X); + _update_cursor(); +end; + +procedure _increment_x(); [public, alias: '_console_increment_x']; +begin + WindowManager.Windows[DefaultWND].Cursor.X:= WindowManager.Windows[DefaultWND].Cursor.X+1; + If WindowManager.Windows[DefaultWND].Cursor.X > WindowManager.Windows[DefaultWND].WND_W-1 then WindowManager.Windows[DefaultWND].Cursor.X:= 0; + console._update_cursor; + //Console_Cursor.X:= Console_Cursor.X+1; + //If Console_Cursor.X > 159 then Console_Cursor.X:= 0; + //console._update_cursor; +end; + +procedure _increment_y(); [public, alias: '_console_increment_y']; +begin + WindowManager.Windows[DefaultWND].Cursor.Y:= WindowManager.Windows[DefaultWND].Cursor.Y+1; + If WindowManager.Windows[DefaultWND].Cursor.Y > WindowManager.Windows[DefaultWND].WND_H-1 then begin + console._newline(); + WindowManager.Windows[DefaultWND].Cursor.Y:= WindowManager.Windows[DefaultWND].WND_H-1; + end; + console._update_cursor; + //Console_Cursor.Y:= Console_Cursor.Y+1; + //If Console_Cursor.Y > 63 then begin + // console._newline(); + // Console_Cursor.Y:= 63; + //end; + //console._update_cursor; +end; + +procedure _safeincrement_x(); [public, alias: '_console_safeincrement_x']; +begin + WindowManager.Windows[DefaultWND].Cursor.X:= WindowManager.Windows[DefaultWND].Cursor.X+1; + if WindowManager.Windows[DefaultWND].Cursor.X > WindowManager.Windows[DefaultWND].WND_W-1 then begin + console._safeincrement_y(); + end; + console._update_cursor; + //Console_Cursor.X:= Console_Cursor.X+1; + //If Console_Cursor.X > 159 then begin + // console._safeincrement_y(); + //end; + //console._update_cursor; +end; + +procedure _safeincrement_y(); [public, alias: '_console_safeincrement_y']; +begin + WindowManager.Windows[DefaultWND].Cursor.Y:= WindowManager.Windows[DefaultWND].Cursor.Y+1; + if WindowManager.Windows[DefaultWND].Cursor.Y > WindowManager.Windows[DefaultWND].WND_H-1 then begin + console._newline(); + WindowManager.Windows[DefaultWND].Cursor.Y:= WindowManager.Windows[DefaultWND].WND_H-1; + end; + WindowManager.Windows[DefaultWND].Cursor.X:= 0; + console._update_cursor; + //Console_Cursor.Y:= Console_Cursor.Y+1; + //If Console_Cursor.Y > 63 then begin + // console._newline(); + // Console_Cursor.Y:= 63; + //end; + //Console_Cursor.X:= 0; + //console._update_cursor; +end; + +procedure _newline(); [public, alias: '_console_newline']; +var + x, y : byte; + +begin + if WindowManager.Windows[DefaultWND].WND_W = 0 then exit; + if WindowManager.Windows[DefaultWND].WND_H = 0 then exit; + for x:=0 to WindowManager.Windows[DefaultWND].WND_W do begin + for y:=0 to WindowManager.Windows[DefaultWND].WND_H-1 do begin + WindowManager.Windows[DefaultWND].buffer[y][x]:= WindowManager.Windows[DefaultWND].buffer[y+1][x]; + WindowManager.Windows[DefaultWND].row_dirty[y]:= true; + //Console_Matrix[y][x]:= Console_Matrix[y+1][x]; + end; + end; + for x:=0 to WindowManager.Windows[DefaultWND].WND_W do begin + WindowManager.Windows[DefaultWND].buffer[WindowManager.Windows[DefaultWND].WND_H-1][x].Character:= ' '; + WindowManager.Windows[DefaultWND].buffer[WindowManager.Windows[DefaultWND].WND_H-1][x].Attributes:= $FFFF0000; + //Console_Matrix[63][x].Character:= ' '; + //Console_Matrix[63][x].Attributes:= $FFFF0000; + end; + //for y:=0 to 63 do begin + // for x:=0 to 159 do begin + // OutputChar(Console_Matrix[y][x].Character, x, y, Console_Matrix[y][x].Attributes SHR 16, Console_Matrix[y][x].Attributes AND $FFFF); + // end; + //end; + console._update_cursor; +end; + +{ WND Specific Console Draw Functions } + +procedure clearWND(WND : uint32); +var + x,y: Byte; + +begin + for y:=0 to 63 do begin + for x:=0 to 159 do begin + WindowManager.Windows[WND].Buffer[y][x].Character:= ' '; + WindowManager.Windows[WND].Buffer[y][x].Attributes:= Console_Properties.Default_Attribute; + WindowManager.Windows[WND].row_dirty[y]:= true; + //Console_Matrix[y][x].Character:= ' '; + //Console_Matrix[y][x].Attributes:= Console_Properties.Default_Attribute; + //OutputChar(Console_Matrix[y][x].Character, x, y, Console_Matrix[y][x].Attributes SHR 16, Console_Matrix[y][x].Attributes AND $FFFF); + end; + end; + WindowManager.Windows[WND].Cursor.X:= 0; + WindowManager.Windows[WND].Cursor.Y:= 0; + redrawWindows; + //Console_Cursor.X:= 0; + //Console_Cursor.Y:= 0; +end; + +procedure writebin8exWND(b : uint8; attributes: uint32; WND : uint32); +var + Mask : PMask; + i : uint8; + +begin + Mask:= PMask(@b); + for i:=0 to 7 do begin + If Mask^[7-i] then writecharexWND('1', attributes, WND) else writecharexWND('0', attributes, WND); + end; +end; + +procedure writebin16exWND(b : uint16; attributes: uint32; WND : uint32); +var + Mask : PMask; + i,j : uint8; + +begin + for j:=1 downto 0 do begin + Mask:= PMask(uint32(@b) + (1 * j)); + for i:=0 to 7 do begin + If Mask^[7-i] then writecharexWND('1', attributes, WND) else writecharexWND('0', attributes, WND); + end; + end; +end; + +procedure writebin32exWND(b : uint32; attributes: uint32; WND : uint32); +var + Mask : PMask; + i,j : uint8; + +begin + for j:=3 downto 0 do begin + Mask:= PMask(uint32(@b) + (1 * j)); + for i:=0 to 7 do begin + If Mask^[7-i] then writecharexWND('1', attributes, WND) else writecharexWND('0', attributes, WND); + end; + end; +end; + +procedure writebin8WND(b : uint8; WND : uint32); +begin + writebin8exWND(b, Console_Properties.Default_Attribute, WND); +end; + +procedure writebin16WND(b : uint16; WND : uint32); +begin + writebin16exWND(b, Console_Properties.Default_Attribute, WND); +end; + +procedure writebin32WND(b : uint32; WND : uint32); +begin + writebin32exWND(b, Console_Properties.Default_Attribute, WND); +end; + +procedure writebin8lnexWND(b : uint8; attributes: uint32; WND : uint32); +begin + writebin8exWND(b, attributes, WND); + console._safeincrement_y_WND(WND); +end; + +procedure writebin16lnexWND(b : uint16; attributes: uint32; WND : uint32); +begin + writebin16exWND(b, attributes, WND); + console._safeincrement_y_WND(WND); +end; + +procedure writebin32lnexWND(b : uint32; attributes: uint32; WND : uint32); +begin + writebin32exWND(b, attributes, WND); + console._safeincrement_y_WND(WND); +end; + +procedure writebin8lnWND(b : uint8; WND : uint32); +begin + writebin8lnexWND(b, Console_Properties.Default_Attribute, WND); +end; + +procedure writebin16lnWND(b : uint16; WND : uint32); +begin + writebin16lnexWND(b, Console_Properties.Default_Attribute, WND); +end; + +procedure writebin32lnWND(b : uint32; WND : uint32); +begin + writebin32lnexWND(b, Console_Properties.Default_Attribute, WND); +end; + +{procedure setdefaultattribute(attribute: uint32); [public, alias: 'console_setdefaultattribute']; +begin + Console_Properties.Default_Attribute:= attribute; +end;} + +procedure writecharWND(character: char; WND : uint32); +begin + console.writecharexWND(character, Console_Properties.Default_Attribute, WND); +end; + +procedure writestringWND(str: PChar; WND : uint32); +begin + console.writestringexWND(str, Console_Properties.Default_Attribute, WND); +end; + +procedure writeintWND(i: Integer; WND : uint32); +begin + console.writeintexWND(i, Console_Properties.Default_Attribute, WND); +end; + +procedure writewordWND(i: DWORD; WND : uint32); +begin + console.writewordexWND(i, Console_Properties.Default_Attribute, WND); +end; + +procedure writecharlnWND(character: char; WND : uint32); +begin + console.writecharlnexWND(character, Console_Properties.Default_Attribute, WND); +end; + +procedure writestringlnWND(str: PChar; WND : uint32); +begin + console.writestringlnexWND(str, Console_Properties.Default_Attribute, WND); +end; + +procedure writeintlnWND(i: Integer; WND : uint32); +begin + console.writeintlnexWND(i, Console_Properties.Default_Attribute, WND); +end; + +procedure writewordlnWND(i: DWORD; WND : uint32); +begin + console.writewordlnexWND(i, Console_Properties.Default_Attribute, WND); +end; + +procedure writecharexWND(character: char; attributes: uint32; WND : uint32); +begin + WindowManager.Windows[WND].Buffer[WindowManager.Windows[WND].Cursor.Y][WindowManager.Windows[WND].Cursor.X].Character:= character; + WindowManager.Windows[WND].Buffer[WindowManager.Windows[WND].Cursor.Y][WindowManager.Windows[WND].Cursor.X].Attributes:= attributes; + //outputChar(character, Console_Cursor.X, Console_Cursor.Y, attributes SHR 16, attributes AND $FFFF); + //Console_Matrix[Console_Cursor.Y][Console_Cursor.X].Character:= character; + //Console_Matrix[Console_Cursor.Y][Console_Cursor.X].Attributes:= attributes; + WindowManager.Windows[WND].row_dirty[WindowManager.Windows[WND].Cursor.Y]:= true; + console._safeincrement_x_WND(WND); +end; + +procedure writehexpairWND(b : uint8; WND : uint32); +var + bn : Array[0..1] of uint8; + i : uint8; + +begin + bn[0]:= b SHR 4; + bn[1]:= b AND $0F; + for i:=0 to 1 do begin + case bn[i] of + 0 :writestringWND('0', WND); + 1 :writestringWND('1', WND); + 2 :writestringWND('2', WND); + 3 :writestringWND('3', WND); + 4 :writestringWND('4', WND); + 5 :writestringWND('5', WND); + 6 :writestringWND('6', WND); + 7 :writestringWND('7', WND); + 8 :writestringWND('8', WND); + 9 :writestringWND('9', WND); + 10:writestringWND('A', WND); + 11:writestringWND('B', WND); + 12:writestringWND('C', WND); + 13:writestringWND('D', WND); + 14:writestringWND('E', WND); + 15:writestringWND('F', WND); + end; + end; +end; + +procedure writehexexWND(i : dword; attributes: uint32; WND : uint32); +var + Hex : Array[0..7] of Byte; + Res : DWORD; + Rem : DWORD; + c : Integer; + +begin + for c:=0 to 7 do begin + Hex[c]:= 0; + end; + c:=0; + Res:= i; + Rem:= Res mod 16; + while Res > 0 do begin + Hex[c]:= Rem; + Res:= Res div 16; + Rem:= Res mod 16; + c:=c+1; + end; + writestringexWND('0x', attributes, WND); + for c:=7 downto 0 do begin + if Hex[c] <> 255 then begin + case Hex[c] of + 0:writecharexWND('0', attributes, WND); + 1:writecharexWND('1', attributes, WND); + 2:writecharexWND('2', attributes, WND); + 3:writecharexWND('3', attributes, WND); + 4:writecharexWND('4', attributes, WND); + 5:writecharexWND('5', attributes, WND); + 6:writecharexWND('6', attributes, WND); + 7:writecharexWND('7', attributes, WND); + 8:writecharexWND('8', attributes, WND); + 9:writecharexWND('9', attributes, WND); + 10:writecharexWND('A', attributes, WND); + 11:writecharexWND('B', attributes, WND); + 12:writecharexWND('C', attributes, WND); + 13:writecharexWND('D', attributes, WND); + 14:writecharexWND('E', attributes, WND); + 15:writecharexWND('F', attributes, WND); + else writecharexWND('?', attributes, WND); + end; + end; + end; +end; + +procedure writehexWND(i : dword; WND : uint32); +begin + console.writehexexWND(i, Console_Properties.Default_Attribute, WND); +end; + +procedure writehexlnexWND(i : dword; attributes: uint32; WND : uint32); +begin + console.writehexexWND(i, attributes, WND); + console._safeincrement_y_WND(WND); +end; + +procedure writehexlnWND(i : dword; WND : uint32); +begin + writehexlnexWND(i, Console_Properties.Default_Attribute, WND); +end; + +procedure OutputWND(identifier : PChar; str : PChar; WND : uint32); +begin + writestringWND('[', WND); + writestringWND(identifier, WND); + writestringWND('] ', WND); + writestringWND(str, WND); +end; + +procedure OutputlnWND(identifier : PChar; str : PChar; WND : uint32); +begin + OutputWND(identifier, str, WND); + writestringlnWND(' ', WND); +end; + +procedure writestringexWND(str: PChar; attributes: uint32; WND : uint32); +var + i : integer; + +begin + i:= 0; + while (str[i] <> #0) do begin + console.writecharexWND(str[i], attributes, WND); + i:=i+1; + end; +end; + +procedure writeintexWND(i: Integer; attributes: uint32; WND : uint32); +var + buffer: array [0..11] of Char; + str: PChar; + digit: DWORD; + minus: Boolean; +begin + str := @buffer[11]; + str^ := #0; + if (i < 0) then begin + digit := -i; + minus := True; + 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 + Dec(str); + str^ := '-'; + end; + console.writestringexWND(str, attributes, WND); +end; + +procedure writewordexWND(i: DWORD; attributes: uint32; WND : uint32); +var + buffer: array [0..11] of Char; + str: PChar; + digit: DWORD; +begin + 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.writestringexWND(@Buffer[0], attributes, WND); +end; + +procedure writecharlnexWND(character: char; attributes: uint32; WND : uint32); +begin + console.writecharexWND(character, attributes, WND); + console._safeincrement_y_WND(WND); +end; + +procedure writestringlnexWND(str: PChar; attributes: uint32; WND : uint32); +begin + console.writestringexWND(str, attributes, WND); + console._safeincrement_y_WND(WND); +end; + +procedure writeintlnexWND(i: Integer; attributes: uint32; WND : uint32); +begin + console.writeintexWND(i, attributes, WND); + console._safeincrement_y_WND(WND); +end; + +procedure writewordlnexWND(i: DWORD; attributes: uint32; WND : uint32); +begin + console.writewordexWND(i, attributes, WND); + console._safeincrement_y_WND(WND); +end; + +procedure backspaceWND(WND : uint32); +begin + Dec(WindowManager.Windows[WND].Cursor.X); + writecharWND(' ', WND); + Dec(WindowManager.Windows[WND].Cursor.X); + _update_cursor(); +end; + +procedure _increment_x_WND(WND : uint32); +begin + WindowManager.Windows[WND].Cursor.X:= WindowManager.Windows[WND].Cursor.X+1; + If WindowManager.Windows[WND].Cursor.X > WindowManager.Windows[WND].WND_W-1 then WindowManager.Windows[WND].Cursor.X:= 0; + console._update_cursor; + //Console_Cursor.X:= Console_Cursor.X+1; + //If Console_Cursor.X > 159 then Console_Cursor.X:= 0; + //console._update_cursor; +end; + +procedure _increment_y_WND(WND : uint32); +begin + WindowManager.Windows[WND].Cursor.Y:= WindowManager.Windows[WND].Cursor.Y+1; + If WindowManager.Windows[WND].Cursor.Y > WindowManager.Windows[WND].WND_H-1 then begin + console._newlineWND(WND); + WindowManager.Windows[WND].Cursor.Y:= WindowManager.Windows[WND].WND_H-1; + end; + console._update_cursor; + //Console_Cursor.Y:= Console_Cursor.Y+1; + //If Console_Cursor.Y > 63 then begin + // console._newline(); + // Console_Cursor.Y:= 63; + //end; + //console._update_cursor; +end; + +procedure _safeincrement_x_WND(WND : uint32); +begin + WindowManager.Windows[WND].Cursor.X:= WindowManager.Windows[WND].Cursor.X+1; + if WindowManager.Windows[WND].Cursor.X > WindowManager.Windows[WND].WND_W-1 then begin + console._safeincrement_y_WND(WND); + end; + console._update_cursor; + //Console_Cursor.X:= Console_Cursor.X+1; + //If Console_Cursor.X > 159 then begin + // console._safeincrement_y(); + //end; + //console._update_cursor; +end; + +procedure _safeincrement_y_WND(WND : uint32); +begin + WindowManager.Windows[WND].Cursor.Y:= WindowManager.Windows[WND].Cursor.Y+1; + if WindowManager.Windows[WND].Cursor.Y > WindowManager.Windows[WND].WND_H-1 then begin + console._newlineWND(WND); + WindowManager.Windows[WND].Cursor.Y:= WindowManager.Windows[WND].WND_H-1; + end; + WindowManager.Windows[WND].Cursor.X:= 0; + console._update_cursor; + //Console_Cursor.Y:= Console_Cursor.Y+1; + //If Console_Cursor.Y > 63 then begin + // console._newline(); + // Console_Cursor.Y:= 63; + //end; + //Console_Cursor.X:= 0; + //console._update_cursor; +end; + +procedure _newlineWND(WND : uint32); +var + x, y : byte; + +begin + if WindowManager.Windows[WND].WND_W = 0 then exit; + if WindowManager.Windows[WND].WND_H = 0 then exit; + for x:=0 to WindowManager.Windows[WND].WND_W do begin + for y:=0 to WindowManager.Windows[WND].WND_H-1 do begin + WindowManager.Windows[WND].buffer[y][x]:= WindowManager.Windows[WND].buffer[y+1][x]; + WindowManager.Windows[WND].row_dirty[y]:= true; + //Console_Matrix[y][x]:= Console_Matrix[y+1][x]; + end; + end; + for x:=0 to WindowManager.Windows[WND].WND_W do begin + WindowManager.Windows[WND].buffer[WindowManager.Windows[WND].WND_H-1][x].Character:= ' '; + WindowManager.Windows[WND].buffer[WindowManager.Windows[WND].WND_H-1][x].Attributes:= $FFFF0000; + //Console_Matrix[63][x].Character:= ' '; + //Console_Matrix[63][x].Attributes:= $FFFF0000; + end; + //for y:=0 to 63 do begin + // for x:=0 to 159 do begin + // OutputChar(Console_Matrix[y][x].Character, x, y, Console_Matrix[y][x].Attributes SHR 16, Console_Matrix[y][x].Attributes AND $FFFF); + // end; + //end; + console._update_cursor; +end; + +end. diff --git a/src/console.pas b/src/console.pas index 95d57f6c..60914ad6 100644 --- a/src/console.pas +++ b/src/console.pas @@ -36,6 +36,15 @@ type lYellow = $E, lWhite = $F ); + TEventType = ( EVENT_DRAW, + EVENT_MOUSE_CLICK, + EVENT_MOUSE_MOVE, + EVENT_MOUSE_DOWN, + EVENT_MOUSE_UP, + EVENT_KEY_PRESSED, + EVENT_CLOSE, + EVENT_MINIMIZE ); + procedure init(); procedure clear(); procedure setdefaultattribute(attribute : uint32); @@ -172,14 +181,18 @@ procedure redrawWindows; procedure toggleWNDVisible(WND : uint32); procedure setWNDVisible(WND : uint32; visible : boolean); procedure closeAllWindows; +function newWindow(x : uint32; y : uint32; Width : uint32; Height : uint32; Title : PChar) : HWND; +function registerEventHandler(WND : HWND; Event : TEventType; Handler : void) : boolean; +procedure forceQuitAll; +procedure closeWindow(WND : HWND); implementation uses - lmemorymanager, strings; + lmemorymanager, strings, keyboard, serial; const - MAX_WINDOWS = 10; + MAX_WINDOWS = 255; DefaultWND = 0; type @@ -210,6 +223,26 @@ type Y : Byte; end; + TDrawHook = procedure(); + TMouseClickHook = procedure(x : uint32; y : uint32; left : boolean); + TMouseMoveHook = procedure(x : uint32; y : uint32); + TMouseDownHook = procedure(x : uint32; y : uint32); + TMouseUpHook = procedure(x : uint32; y : uint32); + TKeyPressedHook = procedure(info : TKeyInfo); + TCloseHook = procedure(); + TMinimizeHook = procedure(); + + THooks = record + OnDraw : TDrawHook; + OnMouseClick : TMouseClickHook; + OnMouseMove : TMouseMoveHook; + OnMouseDown : TMouseDownHook; + OnMouseUp : TMouseUpHook; + OnKeyPressed : TKeyPressedHook; + OnClose : TCloseHook; + OnMinimize : TMinimizeHook; + end; + TWindow = record visible : boolean; buffer : T2DVideoMemory; @@ -220,9 +253,12 @@ type WND_H : uint32; Cursor : TCoord; WND_NAME : PChar; + Hooks : THooks; + Closed : boolean; end; + PWindow = ^TWindow; - TWindows = Array[0..MAX_WINDOWS-1] of TWindow; + TWindows = Array[0..MAX_WINDOWS-1] of PWindow; TWindowManager = record Windows : TWindows; @@ -244,9 +280,103 @@ var Ready : Boolean = false; //Is the unit ready for use? MouseDrawActive : Boolean = false; //Is the Mouse currently being updated? mouse_dirt : TMouseDirt; //Character Cell(s) the mouse occupies, these need to be rewritten on mouse move. - Window_Border : TCharacter; + Window_Border : TCharacter; Default_Char : TCharacter; +function registerEventHandler(WND : HWND; Event : TEventType; Handler : void) : boolean; +begin + registerEventHandler:= true; + if WindowManager.Windows[WND] <> nil then begin + case Event of + EVENT_DRAW : WindowManager.Windows[WND]^.Hooks.OnDraw:= TDrawHook(Handler); + EVENT_MOUSE_CLICK : WindowManager.Windows[WND]^.Hooks.OnMouseClick:= TMouseClickHook(Handler); + EVENT_MOUSE_MOVE : WindowManager.Windows[WND]^.Hooks.OnMouseMove:= TMouseMoveHook(Handler); + EVENT_MOUSE_DOWN : WindowManager.Windows[WND]^.Hooks.OnMouseDown:= TMouseDownHook(Handler); + EVENT_MOUSE_UP : WindowManager.Windows[WND]^.Hooks.OnMouseUp:= TMouseUpHook(Handler); + EVENT_KEY_PRESSED : WindowManager.Windows[WND]^.Hooks.OnKeyPressed:= TKeyPressedHook(Handler); + EVENT_CLOSE : WindowManager.Windows[WND]^.Hooks.OnClose:= TCloseHook(Handler); + EVENT_MINIMIZE : WindowManager.Windows[WND]^.Hooks.OnMinimize:= TMinimizeHook(Handler); + else registerEventHandler:= false; + end; + end else begin + registerEventHandler:= false; + end; +end; + +function newWindow(x : uint32; y : uint32; Width : uint32; Height : uint32; Title : PChar) : HWND; +var + idx : uint32; + WND : PWindow; + +begin + newWindow:= 0; + for idx:=1 to MAX_WINDOWS-1 do begin + if WindowManager.Windows[idx] = nil then begin + newWindow:= idx; + break; + end; + end; + if newWindow <> 0 then begin + WND:= PWindow(kalloc(sizeof(TWindow))); + WND^.WND_NAME:= StringCopy(Title); + WND^.WND_X:= x; + WND^.WND_Y:= y; + WND^.WND_W:= Width; + WND^.WND_H:= Height; + WND^.Cursor.x:= 0; + WND^.Cursor.y:= 0; + WND^.visible:= true; + WND^.Closed:= false; + WND^.Hooks.OnDraw := nil; + WND^.Hooks.OnMouseClick := nil; + WND^.Hooks.OnMouseMove := nil; + WND^.Hooks.OnMouseDown := nil; + WND^.Hooks.OnMouseUp := nil; + WND^.Hooks.OnKeyPressed := nil; + WND^.Hooks.OnClose := nil; + WND^.Hooks.OnMinimize := nil; + WindowManager.Windows[newWindow]:= WND; + end; +end; + +procedure forceQuitAll; +var + i : uint32; + WND : PWindow; + +begin + for i:=1 to MAX_WINDOWS-1 do begin + if WindowManager.Windows[i] <> nil then begin + WND:= WindowManager.Windows[i]; + WindowManager.Windows[i]:= nil; + kfree(void(WND^.WND_NAME)); + kfree(void(WND)); + end; + end; +end; + + +procedure _closeWindow(WND : HWND); +var + WNDCopy : PWindow; + +begin + if WindowManager.Windows[WND] <> nil then begin + WNDCopy:= WindowManager.Windows[WND]; + WindowManager.Windows[WND]:= nil; + if WNDCopy^.Hooks.OnClose <> nil then WNDCopy^.Hooks.OnClose(); + kfree(void(WNDCopy^.WND_NAME)); + kfree(void(WNDCopy)); + end; +end; + +procedure closeWindow(WND : HWND); +begin + if WindowManager.Windows[WND] <> nil then begin + WindowManager.Windows[WND]^.Closed:= True; + end; +end; + procedure closeAllWindows; var i : uint32; @@ -259,12 +389,16 @@ end; procedure setWNDVisible(WND : uint32; visible : boolean); begin - WindowManager.Windows[WND].visible:= visible; + if WindowManager.Windows[WND] <> nil then begin + WindowManager.Windows[WND]^.visible:= visible; + end; end; procedure toggleWNDVisible(WND : uint32); begin - WindowManager.Windows[WND].visible:= not WindowManager.Windows[WND].visible; + if WindowManager.Windows[DefaultWND] <> nil then begin + WindowManager.Windows[WND]^.visible:= not WindowManager.Windows[WND]^.visible; + end; end; procedure drawMouse; @@ -335,46 +469,52 @@ begin end; end; for w:=0 to MAX_WINDOWS-1 do begin - If WindowManager.Windows[w].visible then begin + if WindowManager.Windows[w] <> nil then begin if w <> 0 then begin - WXL:= WindowManager.Windows[w].WND_X - 1; - WYL:= WindowManager.Windows[w].WND_Y - 1; - WXR:= WindowManager.Windows[w].WND_X + WindowManager.Windows[w].WND_W + 1; - WYR:= WindowManager.Windows[w].WND_Y + WindowManager.Windows[w].WND_H + 1; - for y:=WYL to WYR do begin - Console_Matrix[y][WXL]:= Window_Border; - Console_Matrix[y][WXL-1]:= Window_Border; - Console_Matrix[y][WXR]:= Window_Border; - Console_Matrix[y][WXR+1]:= Window_Border; - Console_Real[y][WXL].Character:= char(3); - Console_Real[y][WXL-1].Character:= char(3); - Console_Real[y][WXR].Character:= char(3); - Console_Real[y][WXR+1].Character:= char(3); + if WindowManager.Windows[w]^.Hooks.OnDraw <> nil then WindowManager.Windows[w]^.Hooks.OnDraw(); + end; + If WindowManager.Windows[w]^.visible then begin + if w <> 0 then begin + WXL:= WindowManager.Windows[w]^.WND_X - 1; + WYL:= WindowManager.Windows[w]^.WND_Y - 1; + WXR:= WindowManager.Windows[w]^.WND_X + WindowManager.Windows[w]^.WND_W + 1; + WYR:= WindowManager.Windows[w]^.WND_Y + WindowManager.Windows[w]^.WND_H + 1; + for y:=WYL to WYR do begin + Console_Matrix[y][WXL]:= Window_Border; + Console_Matrix[y][WXL-1]:= Window_Border; + Console_Matrix[y][WXR]:= Window_Border; + Console_Matrix[y][WXR+1]:= Window_Border; + Console_Real[y][WXL].Character:= char(3); + Console_Real[y][WXL-1].Character:= char(3); + Console_Real[y][WXR].Character:= char(3); + Console_Real[y][WXR+1].Character:= char(3); + end; + STRC:= 0; + MIDP:= (WXR + WXL) div 2; + STARTP:= MIDP - (StringSize(WindowManager.Windows[w]^.WND_NAME) div 2) - 1; + for x:=WXL to WXR do begin + Console_Matrix[WYL][x]:= Window_Border; + if (x >= STARTP) and (STRC < StringSize(WindowManager.Windows[w]^.WND_NAME)) then begin + Console_Matrix[WYL][x].character:= WindowManager.Windows[w]^.WND_NAME[STRC]; + inc(STRC); + end; + if x = WXR then begin + Console_Matrix[WYL][x].character:= 'x'; + end; + Console_Matrix[WYR][x]:= Window_Border; + Console_Real[WYL][x].Character:= char(3); + Console_Real[WYR][x].Character:= char(3); + end; end; - STRC:= 0; - MIDP:= (WXR + WXL) div 2; - STARTP:= MIDP - (StringSize(WindowManager.Windows[w].WND_NAME) div 2) - 1; - for x:=WXL to WXR do begin - Console_Matrix[WYL][x]:= Window_Border; - if (x >= STARTP) and (STRC < StringSize(WindowManager.Windows[w].WND_NAME)) then begin - Console_Matrix[WYL][x].character:= WindowManager.Windows[w].WND_NAME[STRC]; - inc(STRC); + for y:=WindowManager.Windows[w]^.WND_Y to WindowManager.Windows[w]^.WND_Y + WindowManager.Windows[w]^.WND_H do begin + if y > 63 then break; + for x:=WindowManager.Windows[w]^.WND_X to WindowManager.Windows[w]^.WND_X + WindowManager.Windows[w]^.WND_W do begin + if x > 159 then break; + Console_Matrix[y][x]:= WindowManager.Windows[w]^.buffer[y - WindowManager.Windows[w]^.WND_Y][x - WindowManager.Windows[w]^.WND_X]; end; - if x = WXR then begin - Console_Matrix[WYL][x].character:= 'x'; - end; - Console_Matrix[WYR][x]:= Window_Border; - Console_Real[WYL][x].Character:= char(3); - Console_Real[WYR][x].Character:= char(3); - end; - end; - for y:=WindowManager.Windows[w].WND_Y to WindowManager.Windows[w].WND_Y + WindowManager.Windows[w].WND_H do begin - if y > 63 then break; - for x:=WindowManager.Windows[w].WND_X to WindowManager.Windows[w].WND_X + WindowManager.Windows[w].WND_W do begin - if x > 159 then break; - Console_Matrix[y][x]:= WindowManager.Windows[w].buffer[y - WindowManager.Windows[w].WND_Y][x - WindowManager.Windows[w].WND_X]; end; end; + if WindowManager.Windows[w]^.Closed then _closeWindow(w); end; end; redrawMatrix; @@ -383,6 +523,7 @@ end; procedure initWindows; var x, y, w : uint32; + WND : PWindow; begin Default_Char.Character:= ' '; @@ -393,28 +534,21 @@ begin Window_Border.Attributes:= $0000FFFF; Window_Border.visible:= true; - for w:=0 to MAX_WINDOWS-1 do begin - WindowManager.Windows[w].visible:= false; - for y:=0 to 63 do begin - for x:=0 to 159 do begin - WindowManager.Windows[w].Buffer[y][x]:= Default_Char; - Console_Real[y][x].character:= char(1); - end; - end; + For w:=0 to MAX_WINDOWS-1 do begin + WindowManager.Windows[w]:= nil; end; - WindowManager.Windows[0].visible:= true; - WindowManager.Windows[0].WND_X:= 0; - WindowManager.Windows[0].WND_Y:= 0; - WindowManager.Windows[0].WND_H:= 63; - WindowManager.Windows[0].WND_W:= 159; - - WindowManager.Windows[1].visible:= false; - WindowManager.Windows[1].WND_X:= 20; - WindowManager.Windows[1].WND_W:= 90; - WindowManager.Windows[1].WND_Y:= 10; - WindowManager.Windows[1].WND_H:= 20; - WindowManager.Windows[1].WND_NAME:= 'ASURO TERMINAL'; + WND:= PWindow(kalloc(sizeof(TWindow))); + WND^.WND_NAME:= 'Asuro'; + WND^.WND_X:= 0; + WND^.WND_Y:= 0; + WND^.WND_W:= 159; + WND^.WND_H:= 63; + WND^.Cursor.x:= 0; + WND^.Cursor.y:= 0; + WND^.visible:= true; + WND^.Closed:= false; + WindowManager.Windows[0]:= WND; end; function getPixel(x : uint32; y : uint32) : uint16; @@ -593,19 +727,21 @@ var x,y: Byte; begin - for y:=0 to 63 do begin - for x:=0 to 159 do begin - WindowManager.Windows[DefaultWND].Buffer[y][x].Character:= ' '; - WindowManager.Windows[DefaultWND].Buffer[y][x].Attributes:= Console_Properties.Default_Attribute; - WindowManager.Windows[DefaultWND].row_dirty[y]:= true; - //Console_Matrix[y][x].Character:= ' '; - //Console_Matrix[y][x].Attributes:= Console_Properties.Default_Attribute; - //OutputChar(Console_Matrix[y][x].Character, x, y, Console_Matrix[y][x].Attributes SHR 16, Console_Matrix[y][x].Attributes AND $FFFF); - end; + if WindowManager.Windows[DefaultWND] <> nil then begin + for y:=0 to 63 do begin + for x:=0 to 159 do begin + WindowManager.Windows[DefaultWND]^.Buffer[y][x].Character:= ' '; + WindowManager.Windows[DefaultWND]^.Buffer[y][x].Attributes:= Console_Properties.Default_Attribute; + WindowManager.Windows[DefaultWND]^.row_dirty[y]:= true; + //Console_Matrix[y][x].Character:= ' '; + //Console_Matrix[y][x].Attributes:= Console_Properties.Default_Attribute; + //OutputChar(Console_Matrix[y][x].Character, x, y, Console_Matrix[y][x].Attributes SHR 16, Console_Matrix[y][x].Attributes AND $FFFF); + end; + end; + WindowManager.Windows[DefaultWND]^.Cursor.X:= 0; + WindowManager.Windows[DefaultWND]^.Cursor.Y:= 0; + //redrawWindows; end; - WindowManager.Windows[DefaultWND].Cursor.X:= 0; - WindowManager.Windows[DefaultWND].Cursor.Y:= 0; - redrawWindows; //Console_Cursor.X:= 0; //Console_Cursor.Y:= 0; end; @@ -745,13 +881,15 @@ end; procedure writecharex(character: char; attributes: uint32); [public, alias: 'console_writecharex']; begin - WindowManager.Windows[DefaultWND].Buffer[WindowManager.Windows[DefaultWND].Cursor.Y][WindowManager.Windows[DefaultWND].Cursor.X].Character:= character; - WindowManager.Windows[DefaultWND].Buffer[WindowManager.Windows[DefaultWND].Cursor.Y][WindowManager.Windows[DefaultWND].Cursor.X].Attributes:= attributes; - //outputChar(character, Console_Cursor.X, Console_Cursor.Y, attributes SHR 16, attributes AND $FFFF); - //Console_Matrix[Console_Cursor.Y][Console_Cursor.X].Character:= character; - //Console_Matrix[Console_Cursor.Y][Console_Cursor.X].Attributes:= attributes; - WindowManager.Windows[DefaultWND].row_dirty[WindowManager.Windows[DefaultWND].Cursor.Y]:= true; - console._safeincrement_x(); + if WindowManager.Windows[DefaultWND] <> nil then begin + WindowManager.Windows[DefaultWND]^.Buffer[WindowManager.Windows[DefaultWND]^.Cursor.Y][WindowManager.Windows[DefaultWND]^.Cursor.X].Character:= character; + WindowManager.Windows[DefaultWND]^.Buffer[WindowManager.Windows[DefaultWND]^.Cursor.Y][WindowManager.Windows[DefaultWND]^.Cursor.X].Attributes:= attributes; + //outputChar(character, Console_Cursor.X, Console_Cursor.Y, attributes SHR 16, attributes AND $FFFF); + //Console_Matrix[Console_Cursor.Y][Console_Cursor.X].Character:= character; + //Console_Matrix[Console_Cursor.Y][Console_Cursor.X].Attributes:= attributes; + WindowManager.Windows[DefaultWND]^.row_dirty[WindowManager.Windows[DefaultWND]^.Cursor.Y]:= true; + console._safeincrement_x(); + end; end; procedure writehexpair(b : uint8); @@ -966,17 +1104,21 @@ end; procedure backspace; begin - Dec(WindowManager.Windows[DefaultWND].Cursor.X); - writechar(' '); - Dec(WindowManager.Windows[DefaultWND].Cursor.X); - _update_cursor(); + if WindowManager.Windows[DefaultWND] <> nil then begin + Dec(WindowManager.Windows[DefaultWND]^.Cursor.X); + writechar(' '); + Dec(WindowManager.Windows[DefaultWND]^.Cursor.X); + _update_cursor(); + end; end; procedure _increment_x(); [public, alias: '_console_increment_x']; begin - WindowManager.Windows[DefaultWND].Cursor.X:= WindowManager.Windows[DefaultWND].Cursor.X+1; - If WindowManager.Windows[DefaultWND].Cursor.X > WindowManager.Windows[DefaultWND].WND_W-1 then WindowManager.Windows[DefaultWND].Cursor.X:= 0; - console._update_cursor; + if WindowManager.Windows[DefaultWND] <> nil then begin + WindowManager.Windows[DefaultWND]^.Cursor.X:= WindowManager.Windows[DefaultWND]^.Cursor.X+1; + If WindowManager.Windows[DefaultWND]^.Cursor.X > WindowManager.Windows[DefaultWND]^.WND_W-1 then WindowManager.Windows[DefaultWND]^.Cursor.X:= 0; + console._update_cursor; + end; //Console_Cursor.X:= Console_Cursor.X+1; //If Console_Cursor.X > 159 then Console_Cursor.X:= 0; //console._update_cursor; @@ -984,12 +1126,14 @@ end; procedure _increment_y(); [public, alias: '_console_increment_y']; begin - WindowManager.Windows[DefaultWND].Cursor.Y:= WindowManager.Windows[DefaultWND].Cursor.Y+1; - If WindowManager.Windows[DefaultWND].Cursor.Y > WindowManager.Windows[DefaultWND].WND_H-1 then begin - console._newline(); - WindowManager.Windows[DefaultWND].Cursor.Y:= WindowManager.Windows[DefaultWND].WND_H-1; + if WindowManager.Windows[DefaultWND] <> nil then begin + WindowManager.Windows[DefaultWND]^.Cursor.Y:= WindowManager.Windows[DefaultWND]^.Cursor.Y+1; + If WindowManager.Windows[DefaultWND]^.Cursor.Y > WindowManager.Windows[DefaultWND]^.WND_H-1 then begin + console._newline(); + WindowManager.Windows[DefaultWND]^.Cursor.Y:= WindowManager.Windows[DefaultWND]^.WND_H-1; + end; + console._update_cursor; end; - console._update_cursor; //Console_Cursor.Y:= Console_Cursor.Y+1; //If Console_Cursor.Y > 63 then begin // console._newline(); @@ -1000,11 +1144,13 @@ end; procedure _safeincrement_x(); [public, alias: '_console_safeincrement_x']; begin - WindowManager.Windows[DefaultWND].Cursor.X:= WindowManager.Windows[DefaultWND].Cursor.X+1; - if WindowManager.Windows[DefaultWND].Cursor.X > WindowManager.Windows[DefaultWND].WND_W-1 then begin - console._safeincrement_y(); + if WindowManager.Windows[DefaultWND] <> nil then begin + WindowManager.Windows[DefaultWND]^.Cursor.X:= WindowManager.Windows[DefaultWND]^.Cursor.X+1; + if WindowManager.Windows[DefaultWND]^.Cursor.X > WindowManager.Windows[DefaultWND]^.WND_W-1 then begin + console._safeincrement_y(); + end; + console._update_cursor; end; - console._update_cursor; //Console_Cursor.X:= Console_Cursor.X+1; //If Console_Cursor.X > 159 then begin // console._safeincrement_y(); @@ -1014,13 +1160,15 @@ end; procedure _safeincrement_y(); [public, alias: '_console_safeincrement_y']; begin - WindowManager.Windows[DefaultWND].Cursor.Y:= WindowManager.Windows[DefaultWND].Cursor.Y+1; - if WindowManager.Windows[DefaultWND].Cursor.Y > WindowManager.Windows[DefaultWND].WND_H-1 then begin - console._newline(); - WindowManager.Windows[DefaultWND].Cursor.Y:= WindowManager.Windows[DefaultWND].WND_H-1; + if WindowManager.Windows[DefaultWND] <> nil then begin + WindowManager.Windows[DefaultWND]^.Cursor.Y:= WindowManager.Windows[DefaultWND]^.Cursor.Y+1; + if WindowManager.Windows[DefaultWND]^.Cursor.Y > WindowManager.Windows[DefaultWND]^.WND_H-1 then begin + console._newline(); + WindowManager.Windows[DefaultWND]^.Cursor.Y:= WindowManager.Windows[DefaultWND]^.WND_H-1; + end; + WindowManager.Windows[DefaultWND]^.Cursor.X:= 0; + console._update_cursor; end; - WindowManager.Windows[DefaultWND].Cursor.X:= 0; - console._update_cursor; //Console_Cursor.Y:= Console_Cursor.Y+1; //If Console_Cursor.Y > 63 then begin // console._newline(); @@ -1035,27 +1183,29 @@ var x, y : byte; begin - if WindowManager.Windows[DefaultWND].WND_W = 0 then exit; - if WindowManager.Windows[DefaultWND].WND_H = 0 then exit; - for x:=0 to WindowManager.Windows[DefaultWND].WND_W do begin - for y:=0 to WindowManager.Windows[DefaultWND].WND_H-1 do begin - WindowManager.Windows[DefaultWND].buffer[y][x]:= WindowManager.Windows[DefaultWND].buffer[y+1][x]; - WindowManager.Windows[DefaultWND].row_dirty[y]:= true; - //Console_Matrix[y][x]:= Console_Matrix[y+1][x]; - end; + if WindowManager.Windows[DefaultWND] <> nil then begin + if WindowManager.Windows[DefaultWND]^.WND_W = 0 then exit; + if WindowManager.Windows[DefaultWND]^.WND_H = 0 then exit; + for x:=0 to WindowManager.Windows[DefaultWND]^.WND_W do begin + for y:=0 to WindowManager.Windows[DefaultWND]^.WND_H-1 do begin + WindowManager.Windows[DefaultWND]^.buffer[y][x]:= WindowManager.Windows[DefaultWND]^.buffer[y+1][x]; + WindowManager.Windows[DefaultWND]^.row_dirty[y]:= true; + //Console_Matrix[y][x]:= Console_Matrix[y+1][x]; + end; + end; + for x:=0 to WindowManager.Windows[DefaultWND]^.WND_W do begin + WindowManager.Windows[DefaultWND]^.buffer[WindowManager.Windows[DefaultWND]^.WND_H-1][x].Character:= ' '; + WindowManager.Windows[DefaultWND]^.buffer[WindowManager.Windows[DefaultWND]^.WND_H-1][x].Attributes:= $FFFF0000; + //Console_Matrix[63][x].Character:= ' '; + //Console_Matrix[63][x].Attributes:= $FFFF0000; + end; + //for y:=0 to 63 do begin + // for x:=0 to 159 do begin + // OutputChar(Console_Matrix[y][x].Character, x, y, Console_Matrix[y][x].Attributes SHR 16, Console_Matrix[y][x].Attributes AND $FFFF); + // end; + //end; + console._update_cursor; end; - for x:=0 to WindowManager.Windows[DefaultWND].WND_W do begin - WindowManager.Windows[DefaultWND].buffer[WindowManager.Windows[DefaultWND].WND_H-1][x].Character:= ' '; - WindowManager.Windows[DefaultWND].buffer[WindowManager.Windows[DefaultWND].WND_H-1][x].Attributes:= $FFFF0000; - //Console_Matrix[63][x].Character:= ' '; - //Console_Matrix[63][x].Attributes:= $FFFF0000; - end; - //for y:=0 to 63 do begin - // for x:=0 to 159 do begin - // OutputChar(Console_Matrix[y][x].Character, x, y, Console_Matrix[y][x].Attributes SHR 16, Console_Matrix[y][x].Attributes AND $FFFF); - // end; - //end; - console._update_cursor; end; { WND Specific Console Draw Functions } @@ -1065,19 +1215,21 @@ var x,y: Byte; begin - for y:=0 to 63 do begin - for x:=0 to 159 do begin - WindowManager.Windows[WND].Buffer[y][x].Character:= ' '; - WindowManager.Windows[WND].Buffer[y][x].Attributes:= Console_Properties.Default_Attribute; - WindowManager.Windows[WND].row_dirty[y]:= true; - //Console_Matrix[y][x].Character:= ' '; - //Console_Matrix[y][x].Attributes:= Console_Properties.Default_Attribute; - //OutputChar(Console_Matrix[y][x].Character, x, y, Console_Matrix[y][x].Attributes SHR 16, Console_Matrix[y][x].Attributes AND $FFFF); - end; + if WindowManager.Windows[WND] <> nil then begin + for y:=0 to 63 do begin + for x:=0 to 159 do begin + WindowManager.Windows[WND]^.Buffer[y][x].Character:= ' '; + WindowManager.Windows[WND]^.Buffer[y][x].Attributes:= Console_Properties.Default_Attribute; + WindowManager.Windows[WND]^.row_dirty[y]:= true; + //Console_Matrix[y][x].Character:= ' '; + //Console_Matrix[y][x].Attributes:= Console_Properties.Default_Attribute; + //OutputChar(Console_Matrix[y][x].Character, x, y, Console_Matrix[y][x].Attributes SHR 16, Console_Matrix[y][x].Attributes AND $FFFF); + end; + end; + WindowManager.Windows[WND]^.Cursor.X:= 0; + WindowManager.Windows[WND]^.Cursor.Y:= 0; + //redrawWindows; end; - WindowManager.Windows[WND].Cursor.X:= 0; - WindowManager.Windows[WND].Cursor.Y:= 0; - redrawWindows; //Console_Cursor.X:= 0; //Console_Cursor.Y:= 0; end; @@ -1217,13 +1369,15 @@ end; procedure writecharexWND(character: char; attributes: uint32; WND : uint32); begin - WindowManager.Windows[WND].Buffer[WindowManager.Windows[WND].Cursor.Y][WindowManager.Windows[WND].Cursor.X].Character:= character; - WindowManager.Windows[WND].Buffer[WindowManager.Windows[WND].Cursor.Y][WindowManager.Windows[WND].Cursor.X].Attributes:= attributes; - //outputChar(character, Console_Cursor.X, Console_Cursor.Y, attributes SHR 16, attributes AND $FFFF); - //Console_Matrix[Console_Cursor.Y][Console_Cursor.X].Character:= character; - //Console_Matrix[Console_Cursor.Y][Console_Cursor.X].Attributes:= attributes; - WindowManager.Windows[WND].row_dirty[WindowManager.Windows[WND].Cursor.Y]:= true; - console._safeincrement_x_WND(WND); + if WindowManager.Windows[WND] <> nil then begin + WindowManager.Windows[WND]^.Buffer[WindowManager.Windows[WND]^.Cursor.Y][WindowManager.Windows[WND]^.Cursor.X].Character:= character; + WindowManager.Windows[WND]^.Buffer[WindowManager.Windows[WND]^.Cursor.Y][WindowManager.Windows[WND]^.Cursor.X].Attributes:= attributes; + //outputChar(character, Console_Cursor.X, Console_Cursor.Y, attributes SHR 16, attributes AND $FFFF); + //Console_Matrix[Console_Cursor.Y][Console_Cursor.X].Character:= character; + //Console_Matrix[Console_Cursor.Y][Console_Cursor.X].Attributes:= attributes; + WindowManager.Windows[WND]^.row_dirty[WindowManager.Windows[WND]^.Cursor.Y]:= true; + console._safeincrement_x_WND(WND); + end; end; procedure writehexpairWND(b : uint8; WND : uint32); @@ -1416,17 +1570,21 @@ end; procedure backspaceWND(WND : uint32); begin - Dec(WindowManager.Windows[WND].Cursor.X); - writecharWND(' ', WND); - Dec(WindowManager.Windows[WND].Cursor.X); - _update_cursor(); + if WindowManager.Windows[WND] <> nil then begin + Dec(WindowManager.Windows[WND]^.Cursor.X); + writecharWND(' ', WND); + Dec(WindowManager.Windows[WND]^.Cursor.X); + _update_cursor(); + end; end; procedure _increment_x_WND(WND : uint32); begin - WindowManager.Windows[WND].Cursor.X:= WindowManager.Windows[WND].Cursor.X+1; - If WindowManager.Windows[WND].Cursor.X > WindowManager.Windows[WND].WND_W-1 then WindowManager.Windows[WND].Cursor.X:= 0; - console._update_cursor; + if WindowManager.Windows[WND] <> nil then begin + WindowManager.Windows[WND]^.Cursor.X:= WindowManager.Windows[WND]^.Cursor.X+1; + If WindowManager.Windows[WND]^.Cursor.X > WindowManager.Windows[WND]^.WND_W-1 then WindowManager.Windows[WND]^.Cursor.X:= 0; + console._update_cursor; + end; //Console_Cursor.X:= Console_Cursor.X+1; //If Console_Cursor.X > 159 then Console_Cursor.X:= 0; //console._update_cursor; @@ -1434,12 +1592,14 @@ end; procedure _increment_y_WND(WND : uint32); begin - WindowManager.Windows[WND].Cursor.Y:= WindowManager.Windows[WND].Cursor.Y+1; - If WindowManager.Windows[WND].Cursor.Y > WindowManager.Windows[WND].WND_H-1 then begin - console._newlineWND(WND); - WindowManager.Windows[WND].Cursor.Y:= WindowManager.Windows[WND].WND_H-1; + if WindowManager.Windows[WND] <> nil then begin + WindowManager.Windows[WND]^.Cursor.Y:= WindowManager.Windows[WND]^.Cursor.Y+1; + If WindowManager.Windows[WND]^.Cursor.Y > WindowManager.Windows[WND]^.WND_H-1 then begin + console._newlineWND(WND); + WindowManager.Windows[WND]^.Cursor.Y:= WindowManager.Windows[WND]^.WND_H-1; + end; + console._update_cursor; end; - console._update_cursor; //Console_Cursor.Y:= Console_Cursor.Y+1; //If Console_Cursor.Y > 63 then begin // console._newline(); @@ -1450,11 +1610,13 @@ end; procedure _safeincrement_x_WND(WND : uint32); begin - WindowManager.Windows[WND].Cursor.X:= WindowManager.Windows[WND].Cursor.X+1; - if WindowManager.Windows[WND].Cursor.X > WindowManager.Windows[WND].WND_W-1 then begin - console._safeincrement_y_WND(WND); + if WindowManager.Windows[WND] <> nil then begin + WindowManager.Windows[WND]^.Cursor.X:= WindowManager.Windows[WND]^.Cursor.X+1; + if WindowManager.Windows[WND]^.Cursor.X > WindowManager.Windows[WND]^.WND_W-1 then begin + console._safeincrement_y_WND(WND); + end; + console._update_cursor; end; - console._update_cursor; //Console_Cursor.X:= Console_Cursor.X+1; //If Console_Cursor.X > 159 then begin // console._safeincrement_y(); @@ -1464,13 +1626,15 @@ end; procedure _safeincrement_y_WND(WND : uint32); begin - WindowManager.Windows[WND].Cursor.Y:= WindowManager.Windows[WND].Cursor.Y+1; - if WindowManager.Windows[WND].Cursor.Y > WindowManager.Windows[WND].WND_H-1 then begin - console._newlineWND(WND); - WindowManager.Windows[WND].Cursor.Y:= WindowManager.Windows[WND].WND_H-1; + if WindowManager.Windows[WND] <> nil then begin + WindowManager.Windows[WND]^.Cursor.Y:= WindowManager.Windows[WND]^.Cursor.Y+1; + if WindowManager.Windows[WND]^.Cursor.Y > WindowManager.Windows[WND]^.WND_H-1 then begin + console._newlineWND(WND); + WindowManager.Windows[WND]^.Cursor.Y:= WindowManager.Windows[WND]^.WND_H-1; + end; + WindowManager.Windows[WND]^.Cursor.X:= 0; + console._update_cursor; end; - WindowManager.Windows[WND].Cursor.X:= 0; - console._update_cursor; //Console_Cursor.Y:= Console_Cursor.Y+1; //If Console_Cursor.Y > 63 then begin // console._newline(); @@ -1485,27 +1649,29 @@ var x, y : byte; begin - if WindowManager.Windows[WND].WND_W = 0 then exit; - if WindowManager.Windows[WND].WND_H = 0 then exit; - for x:=0 to WindowManager.Windows[WND].WND_W do begin - for y:=0 to WindowManager.Windows[WND].WND_H-1 do begin - WindowManager.Windows[WND].buffer[y][x]:= WindowManager.Windows[WND].buffer[y+1][x]; - WindowManager.Windows[WND].row_dirty[y]:= true; - //Console_Matrix[y][x]:= Console_Matrix[y+1][x]; - end; + if WindowManager.Windows[WND] <> nil then begin + if WindowManager.Windows[WND]^.WND_W = 0 then exit; + if WindowManager.Windows[WND]^.WND_H = 0 then exit; + for x:=0 to WindowManager.Windows[WND]^.WND_W do begin + for y:=0 to WindowManager.Windows[WND]^.WND_H-1 do begin + WindowManager.Windows[WND]^.buffer[y][x]:= WindowManager.Windows[WND]^.buffer[y+1][x]; + WindowManager.Windows[WND]^.row_dirty[y]:= true; + //Console_Matrix[y][x]:= Console_Matrix[y+1][x]; + end; + end; + for x:=0 to WindowManager.Windows[WND]^.WND_W do begin + WindowManager.Windows[WND]^.buffer[WindowManager.Windows[WND]^.WND_H-1][x].Character:= ' '; + WindowManager.Windows[WND]^.buffer[WindowManager.Windows[WND]^.WND_H-1][x].Attributes:= $FFFF0000; + //Console_Matrix[63][x].Character:= ' '; + //Console_Matrix[63][x].Attributes:= $FFFF0000; + end; + //for y:=0 to 63 do begin + // for x:=0 to 159 do begin + // OutputChar(Console_Matrix[y][x].Character, x, y, Console_Matrix[y][x].Attributes SHR 16, Console_Matrix[y][x].Attributes AND $FFFF); + // end; + //end; + console._update_cursor; end; - for x:=0 to WindowManager.Windows[WND].WND_W do begin - WindowManager.Windows[WND].buffer[WindowManager.Windows[WND].WND_H-1][x].Character:= ' '; - WindowManager.Windows[WND].buffer[WindowManager.Windows[WND].WND_H-1][x].Attributes:= $FFFF0000; - //Console_Matrix[63][x].Character:= ' '; - //Console_Matrix[63][x].Attributes:= $FFFF0000; - end; - //for y:=0 to 63 do begin - // for x:=0 to 159 do begin - // OutputChar(Console_Matrix[y][x].Character, x, y, Console_Matrix[y][x].Attributes SHR 16, Console_Matrix[y][x].Attributes AND $FFFF); - // end; - //end; - console._update_cursor; end; end. diff --git a/src/include/system.pas b/src/include/system.pas index bb56b8fd..07b5ed4a 100644 --- a/src/include/system.pas +++ b/src/include/system.pas @@ -56,6 +56,7 @@ type PDouble = ^Double; Void = ^uInt32; + HWND = uint32; //Alternate Types UBit1 = 0..(1 shl 01) - 1; diff --git a/src/include/util.pas b/src/include/util.pas index 8edd14a1..ee1205ba 100644 --- a/src/include/util.pas +++ b/src/include/util.pas @@ -333,7 +333,7 @@ var begin disable_cursor; - closeAllWindows; + console.forceQuitAll; if not BSOD_ENABLE then exit; console.setdefaultattribute(console.combinecolors($FFFF, $F800)); console.clear; diff --git a/src/kernel.pas b/src/kernel.pas index 0e80bf69..4801ee8d 100644 --- a/src/kernel.pas +++ b/src/kernel.pas @@ -45,7 +45,8 @@ uses faults, fonts, RTC, - serial; + serial, + memview; procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: uint32); stdcall; @@ -210,6 +211,9 @@ begin console.writestringln('Press any key to boot in to Asuro Terminal...'); tracer.pop_trace; + { Init Progs } + memview.init(); + tracer.push_trace('kmain.KEYHOOK'); keyboard.hook(@temphook); tracer.pop_trace; diff --git a/src/prog/memview.pas b/src/prog/memview.pas new file mode 100644 index 00000000..95df225a --- /dev/null +++ b/src/prog/memview.pas @@ -0,0 +1,102 @@ +unit memview; + +interface + +uses + console, terminal; + +procedure init(); + +implementation + +uses + strings, tracer; + +var + Handle : HWND = 0; + MEM_LOC : uint32; + +procedure mvprintmemory(source : uint32; length : uint32; col : uint32; delim : PChar; offset_row : boolean); +var + buf : puint8; + i : uint32; + +begin + tracer.push_trace('memview.printmemory'); + buf:= puint8(source); + console.writestringlnWND(' ', Handle); + console.writestringlnWND(' ', Handle); + for i:=0 to length-1 do begin + if offset_row and (i = 0) then begin + console.writestringWND(' ', Handle); + console.writehexWND(source + (i), Handle); + console.writestringWND(': ', Handle); + end; + console.writehexpairWND(buf[i], Handle); + if i<>length-1 then begin + if ((i+1) MOD col) = 0 then begin + console.writestringlnWND(' ', Handle); + if offset_row then begin + console.writestringWND(' ', Handle); + console.writehexWND(source + (i + 1), Handle); + console.writestringWND(': ', Handle); + end; + end else begin + console.writestringWND(delim, Handle); + end; + end; + end; + console.writestringlnWND(' ', Handle); +end; + +procedure OnClose(); +begin + Handle:= 0; +end; + +procedure Draw(); +begin + tracer.push_trace('memview.draw'); + if Handle <> 0 then begin + clearWND(Handle); + mvprintmemory(MEM_LOC, 176, 16, ' ', true); + end; +end; + +procedure run(Params : PParamList); +var + loc : PChar; + +begin + tracer.push_trace('memview.run'); + if ParamCount(Params) < 1 then begin + writestringlnWND('No memory location specified!', getTerminalHWND); + end else begin + loc:= GetParam(0, Params); + if StringEquals(loc, 'close') then begin + tracer.push_trace('memview.close'); + if Handle <> 0 then begin + closeWindow(Handle); + end; + end else begin + MEM_LOC:= stringToInt(loc); + if Handle = 0 then begin + Handle:= newWindow(20, 40, 63, 14, 'MEMVIEW'); + registerEventHandler(Handle, EVENT_DRAW, void(@Draw)); + registerEventHandler(Handle, EVENT_CLOSE, void(@OnClose)); + writestringWND('Memview started at location: ', getTerminalHWND); + end else begin + writestringWND('Memview location changed to: ', getTerminalHWND); + end; + writehexlnWND(MEM_LOC, getTerminalHWND); + end; + end; +end; + +procedure init(); +begin + tracer.push_trace('memview.init'); + terminal.registerCommand('MEMVIEW', @Run, 'View a location in memory [MEMVIEW ]'); +end; + +end. \ No newline at end of file diff --git a/src/terminal.pas b/src/terminal.pas index ee546da2..36bdd72c 100644 --- a/src/terminal.pas +++ b/src/terminal.pas @@ -22,9 +22,6 @@ uses asuro, serial; -const - TERMINAL_HWND = 1; - type PParamList = ^TParamList; TParamList = record @@ -67,6 +64,9 @@ implementation uses RTC; +var + TERMINAL_HWND : HWND = 1; + function getTerminalHWND : uint32; begin getTerminalHWND:= TERMINAL_HWND; @@ -387,6 +387,7 @@ begin success:= success AND Serial.Send(COM1, uint8('R'), 1000); success:= success AND Serial.Send(COM1, uint8('L'), 1000); success:= success AND Serial.Send(COM1, uint8('D'), 1000); + success:= success AND Serial.Send(COM1, 10, 1000); success:= success AND Serial.Send(COM1, 13, 1000); if success then begin console.writestringlnWND('Send Success!', TERMINAL_HWND); @@ -416,6 +417,8 @@ end; procedure run; begin + TERMINAL_HWND:= newWindow(20, 10, 90, 20, 'ASURO TERMINAL'); + //newWindow(10, 10, 32, 32, 'MEMVIEW'); keyboard.hook(@key_event); console.clearWND(TERMINAL_HWND); console.writestringWND('Asuro#', TERMINAL_HWND);