diff --git a/Asuro.iso b/Asuro.iso index 9873a0b5..1d66cfde 100644 Binary files a/Asuro.iso and b/Asuro.iso differ diff --git a/bin/kernel.bin b/bin/kernel.bin index d6353d9c..87386766 100755 Binary files a/bin/kernel.bin and b/bin/kernel.bin differ diff --git a/compile.sh b/compile.sh index 1d1e0104..683c47bc 100755 --- a/compile.sh +++ b/compile.sh @@ -22,6 +22,8 @@ echo " " echo "=======================" echo " " +./versioning.sh + if [ "$1" = "-d" ] then echo "Compiling Debug FPC Sources..." diff --git a/iso/boot/asuro.bin b/iso/boot/asuro.bin index d6353d9c..87386766 100755 Binary files a/iso/boot/asuro.bin and b/iso/boot/asuro.bin differ diff --git a/lib/ACE.ppu b/lib/ACE.ppu index c64a42a9..66999b06 100644 Binary files a/lib/ACE.ppu and b/lib/ACE.ppu differ diff --git a/lib/BPE.ppu b/lib/BPE.ppu index 675492cd..f453759c 100644 Binary files a/lib/BPE.ppu and b/lib/BPE.ppu differ diff --git a/lib/BTSSE.ppu b/lib/BTSSE.ppu index 4f200fc2..6dce0bbd 100644 Binary files a/lib/BTSSE.ppu and b/lib/BTSSE.ppu differ diff --git a/lib/CFE.ppu b/lib/CFE.ppu index 513e9242..c9be1f38 100644 Binary files a/lib/CFE.ppu and b/lib/CFE.ppu differ diff --git a/lib/CSOE.ppu b/lib/CSOE.ppu index 80b11722..be5eeccc 100644 Binary files a/lib/CSOE.ppu and b/lib/CSOE.ppu differ diff --git a/lib/DBGE.ppu b/lib/DBGE.ppu index 9ede75a6..f34c2fb7 100644 Binary files a/lib/DBGE.ppu and b/lib/DBGE.ppu differ diff --git a/lib/DBZ.ppu b/lib/DBZ.ppu index 79b59bd0..00ba5f33 100644 Binary files a/lib/DBZ.ppu and b/lib/DBZ.ppu differ diff --git a/lib/DFE.ppu b/lib/DFE.ppu index 1b8fb9db..721e0f92 100644 Binary files a/lib/DFE.ppu and b/lib/DFE.ppu differ diff --git a/lib/E1000.ppu b/lib/E1000.ppu index 7735f03e..f43ea689 100644 Binary files a/lib/E1000.ppu and b/lib/E1000.ppu differ diff --git a/lib/GPF.ppu b/lib/GPF.ppu index 097168bd..42b58ded 100644 Binary files a/lib/GPF.ppu and b/lib/GPF.ppu differ diff --git a/lib/IDE.ppu b/lib/IDE.ppu index ff0848ae..41ed4ca4 100644 Binary files a/lib/IDE.ppu and b/lib/IDE.ppu differ diff --git a/lib/IDOE.ppu b/lib/IDOE.ppu index 6c6d1bef..2b7d1671 100644 Binary files a/lib/IDOE.ppu and b/lib/IDOE.ppu differ diff --git a/lib/IOPE.ppu b/lib/IOPE.ppu index c95dce02..077ff261 100644 Binary files a/lib/IOPE.ppu and b/lib/IOPE.ppu differ diff --git a/lib/MCE.ppu b/lib/MCE.ppu index 8a3523b0..127444bd 100644 Binary files a/lib/MCE.ppu and b/lib/MCE.ppu differ diff --git a/lib/NCE.ppu b/lib/NCE.ppu index 58ee364a..4686574c 100644 Binary files a/lib/NCE.ppu and b/lib/NCE.ppu differ diff --git a/lib/NMIE.ppu b/lib/NMIE.ppu index 94698c2f..c0ce4d29 100644 Binary files a/lib/NMIE.ppu and b/lib/NMIE.ppu differ diff --git a/lib/OOBE.ppu b/lib/OOBE.ppu index 95ea3695..73080166 100644 Binary files a/lib/OOBE.ppu and b/lib/OOBE.ppu differ diff --git a/lib/PCI.ppu b/lib/PCI.ppu index 5264561a..770f062c 100644 Binary files a/lib/PCI.ppu and b/lib/PCI.ppu differ diff --git a/lib/PF.ppu b/lib/PF.ppu index 2ff461ce..15246c6d 100644 Binary files a/lib/PF.ppu and b/lib/PF.ppu differ diff --git a/lib/PS2_KEYBOARD_ISR.ppu b/lib/PS2_KEYBOARD_ISR.ppu index 44a9c7d5..e821abd2 100644 Binary files a/lib/PS2_KEYBOARD_ISR.ppu and b/lib/PS2_KEYBOARD_ISR.ppu differ diff --git a/lib/RTC.ppu b/lib/RTC.ppu index e2f7ccf2..e9751b34 100644 Binary files a/lib/RTC.ppu and b/lib/RTC.ppu differ diff --git a/lib/SFE.ppu b/lib/SFE.ppu index e731a091..2579761c 100644 Binary files a/lib/SFE.ppu and b/lib/SFE.ppu differ diff --git a/lib/SNPE.ppu b/lib/SNPE.ppu index 093f6516..97fdef12 100644 Binary files a/lib/SNPE.ppu and b/lib/SNPE.ppu differ diff --git a/lib/TMR_0_ISR.ppu b/lib/TMR_0_ISR.ppu index 5e38e3c3..8e212515 100644 Binary files a/lib/TMR_0_ISR.ppu and b/lib/TMR_0_ISR.ppu differ diff --git a/lib/UIE.ppu b/lib/UIE.ppu index 8eb624d4..2b28ba1d 100644 Binary files a/lib/UIE.ppu and b/lib/UIE.ppu differ diff --git a/lib/USB.ppu b/lib/USB.ppu index a23f5998..186cf958 100644 Binary files a/lib/USB.ppu and b/lib/USB.ppu differ diff --git a/lib/arp.ppu b/lib/arp.ppu index e1670b47..d4a25320 100644 Binary files a/lib/arp.ppu and b/lib/arp.ppu differ diff --git a/lib/asuro.ppu b/lib/asuro.ppu new file mode 100644 index 00000000..43dd1945 Binary files /dev/null and b/lib/asuro.ppu differ diff --git a/lib/bios_data_area.ppu b/lib/bios_data_area.ppu index 0f6e0be0..cfc67aac 100644 Binary files a/lib/bios_data_area.ppu and b/lib/bios_data_area.ppu differ diff --git a/lib/console.o b/lib/console.o index 7e0217f7..ce0bf009 100644 Binary files a/lib/console.o and b/lib/console.o differ diff --git a/lib/console.ppu b/lib/console.ppu index e70b52cd..4f1d49f4 100644 Binary files a/lib/console.ppu and b/lib/console.ppu differ diff --git a/lib/drivermanagement.ppu b/lib/drivermanagement.ppu index 349ac860..051647e4 100644 Binary files a/lib/drivermanagement.ppu and b/lib/drivermanagement.ppu differ diff --git a/lib/eth2.ppu b/lib/eth2.ppu index 28a016a7..171c8df9 100644 Binary files a/lib/eth2.ppu and b/lib/eth2.ppu differ diff --git a/lib/fat32.ppu b/lib/fat32.ppu index 0f9da424..fb61b101 100644 Binary files a/lib/fat32.ppu and b/lib/fat32.ppu differ diff --git a/lib/gdt.ppu b/lib/gdt.ppu index 802e7274..b0616532 100644 Binary files a/lib/gdt.ppu and b/lib/gdt.ppu differ diff --git a/lib/idt.ppu b/lib/idt.ppu index 108a773f..fde9a046 100644 Binary files a/lib/idt.ppu and b/lib/idt.ppu differ diff --git a/lib/ipv4.ppu b/lib/ipv4.ppu index f4550ee6..2f3137b6 100644 Binary files a/lib/ipv4.ppu and b/lib/ipv4.ppu differ diff --git a/lib/irq.ppu b/lib/irq.ppu index e309ecee..761d27ba 100644 Binary files a/lib/irq.ppu and b/lib/irq.ppu differ diff --git a/lib/isr.ppu b/lib/isr.ppu index f3859417..b26656ee 100644 Binary files a/lib/isr.ppu and b/lib/isr.ppu differ diff --git a/lib/kernel.ppu b/lib/kernel.ppu index 5c647f4b..7ffa452f 100644 Binary files a/lib/kernel.ppu and b/lib/kernel.ppu differ diff --git a/lib/keyboard.ppu b/lib/keyboard.ppu index 018aeb73..b74bf176 100644 Binary files a/lib/keyboard.ppu and b/lib/keyboard.ppu differ diff --git a/lib/libpconsole.a b/lib/libpconsole.a index 3f9742d3..c0bd22e2 100644 Binary files a/lib/libpconsole.a and b/lib/libpconsole.a differ diff --git a/lib/libpmultiboot.a b/lib/libpmultiboot.a index 8d0bd23d..168d4aa2 100644 Binary files a/lib/libpmultiboot.a and b/lib/libpmultiboot.a differ diff --git a/lib/libpsystem.a b/lib/libpsystem.a index b8bf5746..36415fcc 100644 Binary files a/lib/libpsystem.a and b/lib/libpsystem.a differ diff --git a/lib/lists.ppu b/lib/lists.ppu index 17cc0476..e80f0744 100644 Binary files a/lib/lists.ppu and b/lib/lists.ppu differ diff --git a/lib/lmemorymanager.ppu b/lib/lmemorymanager.ppu index a656ec23..ec6bd60c 100644 Binary files a/lib/lmemorymanager.ppu and b/lib/lmemorymanager.ppu differ diff --git a/lib/mouse.ppu b/lib/mouse.ppu index 08eacef4..9814917b 100644 Binary files a/lib/mouse.ppu and b/lib/mouse.ppu differ diff --git a/lib/net.ppu b/lib/net.ppu index 797ad5e5..d699b625 100644 Binary files a/lib/net.ppu and b/lib/net.ppu differ diff --git a/lib/netutils.ppu b/lib/netutils.ppu index 71f7403f..e870f95e 100644 Binary files a/lib/netutils.ppu and b/lib/netutils.ppu differ diff --git a/lib/pmemorymanager.ppu b/lib/pmemorymanager.ppu index 16add03d..8ef6b1dd 100644 Binary files a/lib/pmemorymanager.ppu and b/lib/pmemorymanager.ppu differ diff --git a/lib/scheduler.ppu b/lib/scheduler.ppu index 6e7952cd..dd679bc8 100644 Binary files a/lib/scheduler.ppu and b/lib/scheduler.ppu differ diff --git a/lib/storagemanagement.ppu b/lib/storagemanagement.ppu index d4e73b56..4741d718 100644 Binary files a/lib/storagemanagement.ppu and b/lib/storagemanagement.ppu differ diff --git a/lib/strings.ppu b/lib/strings.ppu index 6d486297..ceeea445 100644 Binary files a/lib/strings.ppu and b/lib/strings.ppu differ diff --git a/lib/terminal.ppu b/lib/terminal.ppu index 8070fbcd..072471af 100644 Binary files a/lib/terminal.ppu and b/lib/terminal.ppu differ diff --git a/lib/testdriver.ppu b/lib/testdriver.ppu index 3c1c5d6a..9ea09e68 100644 Binary files a/lib/testdriver.ppu and b/lib/testdriver.ppu differ diff --git a/lib/tracer.ppu b/lib/tracer.ppu index d3ca016d..0f950971 100644 Binary files a/lib/tracer.ppu and b/lib/tracer.ppu differ diff --git a/lib/tss.ppu b/lib/tss.ppu index f8a3860f..bb0c0cef 100644 Binary files a/lib/tss.ppu and b/lib/tss.ppu differ diff --git a/lib/util.ppu b/lib/util.ppu index a1bb9312..73f4ba7a 100644 Binary files a/lib/util.ppu and b/lib/util.ppu differ diff --git a/lib/vmemorymanager.ppu b/lib/vmemorymanager.ppu index 322e8c4f..400d3c9c 100644 Binary files a/lib/vmemorymanager.ppu and b/lib/vmemorymanager.ppu differ diff --git a/src/console.pas b/src/console.pas index 23cae020..bfd510ef 100644 --- a/src/console.pas +++ b/src/console.pas @@ -96,6 +96,64 @@ 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); @@ -107,9 +165,13 @@ procedure drawPixel32(x : uint32; y : uint32; pixel : uint32); function getPixel64(x : uint32; y : uint32) : uint64; procedure drawPixel64(x : uint32; y : uint32; pixel : uint64); -procedure setMousePosition(x : uint32; y : uint32); +{ Windows Methods } +procedure setMousePosition(x : uint32; y : uint32); procedure redrawWindows; +procedure toggleWNDVisible(WND : uint32); +procedure setWNDVisible(WND : uint32; visible : boolean); +procedure closeAllWindows; implementation @@ -117,7 +179,8 @@ uses lmemorymanager, strings; const - MAX_WINDOWS = 5; + MAX_WINDOWS = 10; + DefaultWND = 0; type TConsoleProperties = record @@ -179,12 +242,31 @@ var Console_Cursor : TCoord; //The text cursor position WindowManager : TWindowManager; //Window Manager Ready : Boolean = false; //Is the unit ready for use? - FocusedWND : uint32 = 0; //The currently focused Window for printing 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; +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; @@ -315,9 +397,7 @@ 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].visible:= true; - WindowManager.Windows[w].Buffer[y][x].character:= ' '; - WindowManager.Windows[w].Buffer[y][x].attributes:= Console_Properties.Default_Attribute; + WindowManager.Windows[w].Buffer[y][x]:= Default_Char; Console_Real[y][x].character:= char(1); end; end; @@ -328,25 +408,13 @@ begin WindowManager.Windows[0].WND_Y:= 0; WindowManager.Windows[0].WND_H:= 63; WindowManager.Windows[0].WND_W:= 159; - for y:=0 to 63 do begin - for x:=0 to 159 do begin - WindowManager.Windows[0].Buffer[y][x].visible:= true; - WindowManager.Windows[0].Buffer[y][x].character:= ' '; - end; - end; - WindowManager.Windows[1].visible:= true; - WindowManager.Windows[1].WND_X:= 50; - WindowManager.Windows[1].WND_W:= 50; - WindowManager.Windows[1].WND_Y:= 20; - WindowManager.Windows[1].WND_H:= 20; - WindowManager.Windows[1].WND_NAME:= 'Test Window'; - for y:=0 to 63 do begin - for x:=0 to 159 do begin - WindowManager.Windows[1].Buffer[y][x].visible:= true; - WindowManager.Windows[1].Buffer[y][x].character:= ' '; - end; - end; + 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; @@ -518,6 +586,8 @@ Begin Ready:= True; end; +{ Default Console Write Functions } + procedure clear(); [public, alias: 'console_clear']; var x,y: Byte; @@ -525,16 +595,16 @@ var begin for y:=0 to 63 do begin for x:=0 to 159 do begin - WindowManager.Windows[FocusedWND].Buffer[y][x].Character:= ' '; - WindowManager.Windows[FocusedWND].Buffer[y][x].Attributes:= Console_Properties.Default_Attribute; - WindowManager.Windows[FocusedWND].row_dirty[y]:= true; + 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[FocusedWND].Cursor.X:= 0; - WindowManager.Windows[FocusedWND].Cursor.Y:= 0; + WindowManager.Windows[DefaultWND].Cursor.X:= 0; + WindowManager.Windows[DefaultWND].Cursor.Y:= 0; redrawWindows; //Console_Cursor.X:= 0; //Console_Cursor.Y:= 0; @@ -675,12 +745,12 @@ end; procedure writecharex(character: char; attributes: uint32); [public, alias: 'console_writecharex']; begin - WindowManager.Windows[FocusedWND].Buffer[WindowManager.Windows[FocusedWND].Cursor.Y][WindowManager.Windows[FocusedWND].Cursor.X].Character:= character; - WindowManager.Windows[FocusedWND].Buffer[WindowManager.Windows[FocusedWND].Cursor.Y][WindowManager.Windows[FocusedWND].Cursor.X].Attributes:= attributes; + 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[FocusedWND].row_dirty[WindowManager.Windows[FocusedWND].Cursor.Y]:= true; + WindowManager.Windows[DefaultWND].row_dirty[WindowManager.Windows[DefaultWND].Cursor.Y]:= true; console._safeincrement_x(); end; @@ -890,21 +960,21 @@ begin //outb($3D4, $0E); //b:= pos shr 8; //outb($3D5, b); - redrawWindows; + //redrawWindows; end; procedure backspace; begin - Dec(WindowManager.Windows[FocusedWND].Cursor.X); + Dec(WindowManager.Windows[DefaultWND].Cursor.X); writechar(' '); - Dec(WindowManager.Windows[FocusedWND].Cursor.X); + Dec(WindowManager.Windows[DefaultWND].Cursor.X); _update_cursor(); end; procedure _increment_x(); [public, alias: '_console_increment_x']; begin - WindowManager.Windows[FocusedWND].Cursor.X:= WindowManager.Windows[FocusedWND].Cursor.X+1; - If WindowManager.Windows[FocusedWND].Cursor.X > WindowManager.Windows[FocusedWND].WND_W-1 then WindowManager.Windows[FocusedWND].Cursor.X:= 0; + 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; @@ -913,10 +983,10 @@ end; procedure _increment_y(); [public, alias: '_console_increment_y']; begin - WindowManager.Windows[FocusedWND].Cursor.Y:= WindowManager.Windows[FocusedWND].Cursor.Y+1; - If WindowManager.Windows[FocusedWND].Cursor.Y > WindowManager.Windows[FocusedWND].WND_H-1 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[FocusedWND].Cursor.Y:= WindowManager.Windows[FocusedWND].WND_H-1; + WindowManager.Windows[DefaultWND].Cursor.Y:= WindowManager.Windows[DefaultWND].WND_H-1; end; console._update_cursor; //Console_Cursor.Y:= Console_Cursor.Y+1; @@ -929,8 +999,8 @@ end; procedure _safeincrement_x(); [public, alias: '_console_safeincrement_x']; begin - WindowManager.Windows[FocusedWND].Cursor.X:= WindowManager.Windows[FocusedWND].Cursor.X+1; - if WindowManager.Windows[FocusedWND].Cursor.X > WindowManager.Windows[FocusedWND].WND_W-1 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; @@ -943,12 +1013,12 @@ end; procedure _safeincrement_y(); [public, alias: '_console_safeincrement_y']; begin - WindowManager.Windows[FocusedWND].Cursor.Y:= WindowManager.Windows[FocusedWND].Cursor.Y+1; - if WindowManager.Windows[FocusedWND].Cursor.Y > WindowManager.Windows[FocusedWND].WND_H-1 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[FocusedWND].Cursor.Y:= WindowManager.Windows[FocusedWND].WND_H-1; + WindowManager.Windows[DefaultWND].Cursor.Y:= WindowManager.Windows[DefaultWND].WND_H-1; end; - WindowManager.Windows[FocusedWND].Cursor.X:= 0; + WindowManager.Windows[DefaultWND].Cursor.X:= 0; console._update_cursor; //Console_Cursor.Y:= Console_Cursor.Y+1; //If Console_Cursor.Y > 63 then begin @@ -964,18 +1034,18 @@ var x, y : byte; begin - if WindowManager.Windows[FocusedWND].WND_W = 0 then exit; - if WindowManager.Windows[FocusedWND].WND_H = 0 then exit; - for x:=0 to WindowManager.Windows[FocusedWND].WND_W do begin - for y:=0 to WindowManager.Windows[FocusedWND].WND_H-1 do begin - WindowManager.Windows[FocusedWND].buffer[y][x]:= WindowManager.Windows[FocusedWND].buffer[y+1][x]; - WindowManager.Windows[FocusedWND].row_dirty[y]:= true; + 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[FocusedWND].WND_W do begin - WindowManager.Windows[FocusedWND].buffer[WindowManager.Windows[FocusedWND].WND_H-1][x].Character:= ' '; - WindowManager.Windows[FocusedWND].buffer[WindowManager.Windows[FocusedWND].WND_H-1][x].Attributes:= $FFFF0000; + 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; @@ -986,5 +1056,455 @@ begin //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/consoleBK.pas b/src/consoleBK.pas new file mode 100644 index 00000000..f0be921e --- /dev/null +++ b/src/consoleBK.pas @@ -0,0 +1,795 @@ +{ ************************************************ + * 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(); + +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); + +implementation + +uses + lmemorymanager; + +const + MAX_WINDOWS = 10; + +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; + + TCoord = record + X : Byte; + Y : Byte; + end; + + TWindow = record + visible : boolean; + buffer : T2DVideoMemory; + row_dirty : Array[0..63] of Boolean; + invalid : boolean; + WND_X : uint32; + WND_Y : uint32; + WND_W : uint32; + WND_H : uint32; + end; + + TWindows = Array[0..MAX_WINDOWS-1] of TWindow; + + TWindowManager = record + Windows : TWindows; + MouseX : uint32; + MouseY : uint32; + end; + +var + Console_Properties : TConsoleProperties; + Console_Matrix : T2DVideoMemory; + Console_Cursor : TCoord; + WindowManager : TWindowManager; + Ready : Boolean = false; + +procedure redrawWindows; +var + x, y, w : uint32; + row_dirty : Arrray[0..63] of Boolean; + +begin + for w:=0 to 63 do begin + row_dirty[w]:= false; + end; + for y:=0 to 63 do begin + for w:=0 to MAX_WINDOWS-1 do begin + if WindowManager.Windows[w].row_dirty[y] OR row_dirty[y] then begin + row_dirty[y]:= true; + if WindowManager.Windows[w].visible then begin + for x:=0 to 159 do begin + if WindowManager.Windows[w].buffer[x][y].visible then begin + if Console_Matrix[x][y].Character <> WindowManager.Windows[w].buffer[x][y].character then begin + Console_Matrix[x][y].Character:= WindowManager.Windows[w].buffer[x][y].character; + Console_Matrix[x][y].attributes:= WindowManager.Windows[w].buffer[x][y].attributes; + end; + end; + end; + end; + end; + end; + end; +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)); + Console_Properties.Default_Attribute:= console.combinecolors($FFFF, $0000); + console.clear(); + Ready:= True; +end; + +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 + 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; + 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 + 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; + 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); +end; + +procedure backspace; +begin + Dec(Console_Cursor.X); + writechar(' '); + Dec(Console_Cursor.X); + _update_cursor(); +end; + +procedure _increment_x(); [public, alias: '_console_increment_x']; +begin + 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 + 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 + 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 + 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 + for x:=0 to 159 do begin + for y:=0 to 63 do begin + Console_Matrix[y][x]:= Console_Matrix[y+1][x]; + end; + end; + for x:=0 to 159 do begin + 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/asuro.pas b/src/include/asuro.pas new file mode 100644 index 00000000..d281f712 --- /dev/null +++ b/src/include/asuro.pas @@ -0,0 +1,10 @@ +unit asuro; + +interface + +const + VERSION = '1.0.0-549a'; + +implementation + +end. diff --git a/src/include/util.pas b/src/include/util.pas index a75bdd12..4456b33a 100644 --- a/src/include/util.pas +++ b/src/include/util.pas @@ -304,6 +304,7 @@ var begin disable_cursor; + closeAllWindows; if not BSOD_ENABLE then exit; console.setdefaultattribute(console.combinecolors($FFFF, $F800)); console.clear; @@ -355,6 +356,7 @@ begin end else begin console.writestringln('Unknown.') end; + console.redrawWindows; halt_and_catch_fire(); end; diff --git a/src/terminal.pas b/src/terminal.pas index 771df795..4dca41ba 100644 --- a/src/terminal.pas +++ b/src/terminal.pas @@ -18,7 +18,11 @@ uses util, lmemorymanager, strings, - tracer; + tracer, + asuro; + +const + TERMINAL_HWND = 1; type PParamList = ^TParamList; @@ -55,9 +59,15 @@ function paramCount(params : PParamList) : uint32; function getParam(index : uint32; params : PParamList) : pchar; procedure setWorkingDirectory(str : pchar); function getWorkingDirectory : pchar; +function getTerminalHWND : uint32; implementation +function getTerminalHWND : uint32; +begin + getTerminalHWND:= TERMINAL_HWND; +end; + function getWorkingDirectory : pchar; begin getWorkingDirectory:= Working_Directory; @@ -164,7 +174,7 @@ end; procedure testParams(params : PParamList); begin while params^.Param <> nil do begin - writestringln(params^.Param); + writestringlnWND(params^.Param, TERMINAL_HWND); params:= params^.next; end; end; @@ -176,21 +186,21 @@ var begin current:= params^.next; while current^.param <> nil do begin - console.writestring(current^.param); - console.writestring(' '); + console.writestringWND(current^.param, TERMINAL_HWND); + console.writestringWND(' ', TERMINAL_HWND); current:= current^.next; end; - console.writestringln(''); + console.writestringlnWND('', TERMINAL_HWND); end; procedure clear(params : PParamList); begin - console.clear(); + console.clearWND(TERMINAL_HWND); end; procedure version(params : PParamList); begin - console.writestringln('Asuro v1.0'); + console.writestringlnWND(asuro.VERSION, TERMINAL_HWND); end; procedure help(params : PParamList); @@ -198,13 +208,13 @@ var i : uint32; begin - console.writestringln('Registered Commands: '); + console.writestringlnWND('Registered Commands: ', TERMINAL_HWND); for i:=0 to 65534 do begin if Commands[i].Registered then begin - console.writestring(' '); - console.writestring(Commands[i].command); - console.writestring(' - '); - console.writestringln(Commands[i].description); + console.writestringWND(' ', TERMINAL_HWND); + console.writestringWND(Commands[i].command, TERMINAL_HWND); + console.writestringWND(' - ', TERMINAL_HWND); + console.writestringlnWND(Commands[i].description, TERMINAL_HWND); end; end; end; @@ -231,9 +241,9 @@ end; procedure test(params : PParamList); begin if paramCount(params) > 0 then begin - console.writeintln(stringToInt(getParam(0, params))); + console.writeintlnWND(stringToInt(getParam(0, params)), TERMINAL_HWND); end else begin - console.writestringln('Invalid number of params'); + console.writestringlnWND('Invalid number of params', TERMINAL_HWND); end; end; @@ -262,7 +272,7 @@ begin push_trace('terminal.process_command'); { Start a new line. } - console.writecharln(' '); + console.writecharlnWND(' ', TERMINAL_HWND); { Enable fallthrough/Unrecognized command } fallthrough:= true; @@ -289,13 +299,13 @@ begin { Display message if command is unknown AKA fallthrough is active } if fallthrough then begin - console.writestringln('Unknown Command.'); + console.writestringlnWND('Unknown Command.', TERMINAL_HWND); end; { Reset the terminal ready for the next command } - console.writestring('Asuro#'); - console.writestring(Working_Directory); - console.writestring('> '); + console.writestringWND('Asuro#', TERMINAL_HWND); + console.writestringWND(Working_Directory, TERMINAL_HWND); + console.writestringWND('> ', TERMINAL_HWND); bIndex:= 0; memset(uint32(@buffer[0]), 0, 1024); @@ -308,12 +318,12 @@ begin if bIndex < 1024 then begin buffer[bIndex]:= info.key_code; inc(bIndex); - console.writechar(char(info.key_code)); + console.writecharWND(char(info.key_code), TERMINAL_HWND); end; end; if info.key_code = 8 then begin //backspace if bIndex > 0 then begin - console.backspace; + console.backspaceWND(TERMINAL_HWND); dec(bIndex); buffer[bIndex]:= 0; end; @@ -330,6 +340,11 @@ begin end; end; +procedure ToggleWND1(Params : PParamList); +begin + console.toggleWNDVisible(1); +end; + procedure init; begin console.writestringln('TERMINAL: INIT BEGIN.'); @@ -341,18 +356,20 @@ begin registerCommand('ECHO', @echo, 'Echo''s text to the terminal.'); registerCommand('TESTPARAMS', @testParams, 'Tests param parsing.'); registerCommand('TEST', @test, 'Command for testing.'); - registerCommand('CD', @change_dir, 'Change Directory test'); - registerCommand('COCKWOMBLE', @cockwomble, 'Womblecocks'); + registerCommand('CD', @change_dir, 'Change Directory test.'); + registerCommand('PATTERN', @cockwomble, 'Print an animated pattern to the screen.'); + registerCommand('TOGGLEWND1', @ToggleWND1, 'Toggle WND 1 Visibility.'); console.writestringln('TERMINAL: INIT END.'); end; procedure run; begin keyboard.hook(@key_event); - console.clear(); - console.writestring('Asuro#'); - console.writestring(Working_Directory); - console.writestring('> '); + console.clearWND(TERMINAL_HWND); + console.writestringWND('Asuro#', TERMINAL_HWND); + console.writestringWND(Working_Directory, TERMINAL_HWND); + console.writestringWND('> ', TERMINAL_HWND); + console.setWNDVisible(TERMINAL_HWND, true); end; end. \ No newline at end of file diff --git a/version b/version new file mode 100644 index 00000000..7e461b3a --- /dev/null +++ b/version @@ -0,0 +1 @@ +1 0 0 a diff --git a/versioning.sh b/versioning.sh new file mode 100755 index 00000000..b4a4d430 --- /dev/null +++ b/versioning.sh @@ -0,0 +1,21 @@ +#!/bin/bash +outfile="src/include/asuro.pas" +file="version" +while IFS=: read -r line;do + major=$(echo $line | awk '{print $1}') + minor=$(echo $line | awk '{print $2}') + sub=$(echo $line | awk '{print $3}') + release=$(echo $line | awk '{print $4}') +done <"$file" +revision=$(svn info | grep Revision | awk '{print $2}') +echo $major"."$minor"."$sub"-r"$revision$release +echo "unit asuro;" > $outfile +echo " " >> $outfile +echo "interface" >> $outfile +echo " " >> $outfile +echo "const" >> $outfile +echo " VERSION = '$major.$minor.$sub-$revision$release';" >> $outfile +echo " " >> $outfile +echo "implementation" >> $outfile +echo " " >> $outfile +echo "end." >> $outfile