git-svn-id: https://spexeah.com:8443/svn/Asuro@746 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c

This commit is contained in:
kieron 2018-05-22 03:33:51 +00:00
parent 4a1d7a942d
commit 8066634367
97 changed files with 422 additions and 123 deletions

BIN
Asuro.iso

Binary file not shown.

Binary file not shown.

View File

@ -5,6 +5,10 @@ echo "======================="
echo "== ASURO COMPILATION ==" echo "== ASURO COMPILATION =="
echo "=======================" echo "======================="
echo " " echo " "
echo "Checking out latest VM Source..."
echo " "
./updatevm.sh
echo " "
echo "Compiling ASM Stub..." echo "Compiling ASM Stub..."
echo " " echo " "
rm lib/* rm lib/*

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/icmp.ppu Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/types.ppu Normal file

Binary file not shown.

Binary file not shown.

BIN
lib/vm.ppu Normal file

Binary file not shown.

BIN
lib/vm_instance.ppu Normal file

Binary file not shown.

BIN
lib/vm_scheduler.ppu Normal file

Binary file not shown.

Binary file not shown.

BIN
lib/vmlog.ppu Normal file

Binary file not shown.

View File

@ -71,11 +71,6 @@ procedure writeintln(i: Integer);
procedure writeintex(i: Integer; attributes: uint32); procedure writeintex(i: Integer; attributes: uint32);
procedure writeintlnex(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 writehexpair(b : uint8);
procedure writehex(i: DWORD); procedure writehex(i: DWORD);
procedure writehexln(i: DWORD); procedure writehexln(i: DWORD);
@ -130,11 +125,6 @@ procedure writeintlnWND(i: Integer; WND : uint32);
procedure writeintexWND(i: Integer; attributes: uint32; WND : uint32); procedure writeintexWND(i: Integer; attributes: uint32; WND : uint32);
procedure writeintlnexWND(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 writehexpairWND(b : uint8; WND : uint32);
procedure writehexpairExWND(b : uint8; Attributes : uint32; WND : uint32); procedure writehexpairExWND(b : uint8; Attributes : uint32; WND : uint32);
procedure writehexWND(i: DWORD; WND : uint32); procedure writehexWND(i: DWORD; WND : uint32);
@ -285,10 +275,14 @@ type
TWindows = Array[0..MAX_WINDOWS-1] of PWindow; TWindows = Array[0..MAX_WINDOWS-1] of PWindow;
TZOrder = Array[0..MAX_WINDOWS-1] of uint32; TZOrder = Array[0..MAX_WINDOWS-1] of uint32;
TBackOrder = Array[0..MAX_WINDOWS-1] of uint32;
TFrontOrder = Array[0..MAX_WINDOWS-1] of uint32;
TWindowManager = record TWindowManager = record
Windows : TWindows; Windows : TWindows;
Z_Order : TZOrder; Z_Order : TZOrder;
Back_Order : TBackOrder;
Front_Order : TFrontOrder;
MousePos : TMouseCoord; MousePos : TMouseCoord;
MousePrev : TMouseCoord; MousePrev : TMouseCoord;
end; end;
@ -544,6 +538,7 @@ var
WND : PWindow; WND : PWindow;
begin begin
tracer.push_trace('console.newWindow');
newWindow:= 0; newWindow:= 0;
for idx:=1 to MAX_WINDOWS-1 do begin for idx:=1 to MAX_WINDOWS-1 do begin
if WindowManager.Windows[idx] = nil then begin if WindowManager.Windows[idx] = nil then begin
@ -927,6 +922,16 @@ begin
WND^.Closed:= false; WND^.Closed:= false;
WND^.Border:= false; WND^.Border:= false;
WND^.ShellWND:= false; WND^.ShellWND:= 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;
WND^.Hooks.OnFocus:= nil;
WND^.Hooks.OnLoseFocus:= nil;
WindowManager.Windows[0]:= WND; WindowManager.Windows[0]:= WND;
AddToZOrder(0); AddToZOrder(0);
FocusZOrder(0); FocusZOrder(0);
@ -1252,11 +1257,6 @@ begin
console.writeintex(i, Console_Properties.Default_Attribute); console.writeintex(i, Console_Properties.Default_Attribute);
end; 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']; procedure writecharln(character: char); [public, alias: 'console_writecharln'];
begin begin
console.writecharlnex(character, Console_Properties.Default_Attribute); console.writecharlnex(character, Console_Properties.Default_Attribute);
@ -1272,13 +1272,9 @@ begin
console.writeintlnex(i, Console_Properties.Default_Attribute); console.writeintlnex(i, Console_Properties.Default_Attribute);
end; 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']; procedure writecharex(character: char; attributes: uint32); [public, alias: 'console_writecharex'];
begin begin
serial.send(COM1, uint8(character), 10000);
if WindowManager.Windows[DefaultWND] <> nil then begin 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].Character:= character;
WindowManager.Windows[DefaultWND]^.Buffer[WindowManager.Windows[DefaultWND]^.Cursor.Y][WindowManager.Windows[DefaultWND]^.Cursor.X].Attributes:= attributes; WindowManager.Windows[DefaultWND]^.Buffer[WindowManager.Windows[DefaultWND]^.Cursor.Y][WindowManager.Windows[DefaultWND]^.Cursor.X].Attributes:= attributes;
@ -1436,24 +1432,6 @@ begin
console.writestringex(str, attributes); console.writestringex(str, attributes);
end; 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']; procedure writecharlnex(character: char; attributes: uint32); [public, alias: 'console_writecharlnex'];
begin begin
console.writecharex(character, attributes); console.writecharex(character, attributes);
@ -1472,12 +1450,6 @@ begin
console._safeincrement_y(); console._safeincrement_y();
end; 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; function combinecolors(Foreground, Background: uint16): uint32;
begin begin
combinecolors:= (uint32(Foreground) SHL 16) OR Background; combinecolors:= (uint32(Foreground) SHL 16) OR Background;
@ -1558,6 +1530,8 @@ end;
procedure _safeincrement_y(); [public, alias: '_console_safeincrement_y']; procedure _safeincrement_y(); [public, alias: '_console_safeincrement_y'];
begin begin
serial.send(COM1, uint8(13), 10000);
serial.send(COM1, uint8(10), 10000);
if WindowManager.Windows[DefaultWND] <> nil then begin if WindowManager.Windows[DefaultWND] <> nil then begin
WindowManager.Windows[DefaultWND]^.Cursor.Y:= WindowManager.Windows[DefaultWND]^.Cursor.Y+1; 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 if WindowManager.Windows[DefaultWND]^.Cursor.Y > WindowManager.Windows[DefaultWND]^.WND_H-1 then begin
@ -1758,11 +1732,6 @@ begin
console.writeintexWND(i, Console_Properties.Default_Attribute, WND); console.writeintexWND(i, Console_Properties.Default_Attribute, WND);
end; end;
procedure writewordWND(i: DWORD; WND : uint32);
begin
console.writewordexWND(i, Console_Properties.Default_Attribute, WND);
end;
procedure writecharlnWND(character: char; WND : uint32); procedure writecharlnWND(character: char; WND : uint32);
begin begin
console.writecharlnexWND(character, Console_Properties.Default_Attribute, WND); console.writecharlnexWND(character, Console_Properties.Default_Attribute, WND);
@ -1778,11 +1747,6 @@ begin
console.writeintlnexWND(i, Console_Properties.Default_Attribute, WND); console.writeintlnexWND(i, Console_Properties.Default_Attribute, WND);
end; 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); procedure writecharexWND(character: char; attributes: uint32; WND : uint32);
begin begin
if WindowManager.Windows[WND] <> nil then begin if WindowManager.Windows[WND] <> nil then begin
@ -1947,24 +1911,6 @@ begin
console.writestringexWND(str, attributes, WND); console.writestringexWND(str, attributes, WND);
end; 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); procedure writecharlnexWND(character: char; attributes: uint32; WND : uint32);
begin begin
console.writecharexWND(character, attributes, WND); console.writecharexWND(character, attributes, WND);
@ -1983,12 +1929,6 @@ begin
console._safeincrement_y_WND(WND); console._safeincrement_y_WND(WND);
end; 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); procedure backspaceWND(WND : uint32);
begin begin
if WindowManager.Windows[WND] <> nil then begin if WindowManager.Windows[WND] <> nil then begin

View File

@ -3,7 +3,7 @@ unit serial;
interface interface
uses uses
util, isrmanager; util, isrmanager, strings;
const const
COM1 = $3F8; COM1 = $3F8;
@ -14,6 +14,7 @@ const
procedure init(); procedure init();
function receive(PORT : uint16; timeout : uint32) : uint8; function receive(PORT : uint16; timeout : uint32) : uint8;
function send(PORT : uint16; data : uint8; timeout : uint32) : boolean; function send(PORT : uint16; data : uint8; timeout : uint32) : boolean;
function sendString(str : pchar) : boolean;
implementation implementation
@ -85,4 +86,17 @@ begin
end; end;
end; end;
function sendString(str : pchar) : boolean;
var
i : uint32;
begin
sendString:= true;
for i:=0 to StringSize(str)-1 do begin
sendString:= sendString AND send(COM1, uint8(str[i]), 10000);
end;
sendString:= sendString AND send(COM1, uint8(13), 10000);
sendString:= sendString AND send(COM1, uint8(10), 10000);
end;
end. end.

View File

@ -22,6 +22,7 @@ function MACToIIPv4(mac : puint8) : puint8;
procedure sendGratuitous; procedure sendGratuitous;
procedure sendRequest(ip : puint8); procedure sendRequest(ip : puint8);
procedure send(hType : uint16; pType : uint16; op : uint16; p_context : PPacketContext); procedure send(hType : uint16; pType : uint16; op : uint16; p_context : PPacketContext);
function resolveIP(ip : puint8) : puint8;
implementation implementation
@ -67,18 +68,6 @@ begin
end; end;
end; end;
function findCacheRecord(ip : puint8) : PARPCacheRecord;
var
CacheRecord : PARPCacheRecord;
begin
CacheRecord:= findCacheRecordByIP(ip);
if CacheRecord = nil then begin
end;
findCacheRecord:= CacheRecord;
end;
procedure send(hType : uint16; pType : uint16; op : uint16; p_context : PPacketContext); procedure send(hType : uint16; pType : uint16; op : uint16; p_context : PPacketContext);
var var
buf : void; buf : void;
@ -171,6 +160,21 @@ begin
sendRequestGateway(ip); sendRequestGateway(ip);
end; end;
function resolveIP(ip : puint8) : puint8;
var
CacheRecord : PARPCacheRecord;
begin
CacheRecord:= findCacheRecordByIP(ip);
resolveIP:= nil;
if CacheRecord = nil then begin
sendRequest(ip);
sendRequestGateway(ip);
end else begin
resolveIP:= @CacheRecord^.MAC[0];
end;
end;
procedure recv(p_data : void; p_len : uint16; p_context : PPacketContext); procedure recv(p_data : void; p_len : uint16; p_context : PPacketContext);
var var
Header : PARPHeader; Header : PARPHeader;

View File

@ -3,26 +3,114 @@ unit icmp;
interface interface
uses uses
net, nettypes, netutils, ipv4, console, terminal; bios_data_area,
lmemorymanager,
net, nettypes, netutils, ipv4, console, terminal, arp, util;
type
TARPErrorCode = (aecFailedToResolveHost, aecNoRouteToHost, aecTimeout, aecTTLExpired);
TARPReplyCallback = procedure(hdr : PICMPHeader);
TARPErrorCallback = procedure(hdr : PICMPHeader; Reason : TARPErrorCode);
TARPHandler = record
Active : Boolean;
OnReply : TARPReplyCallback;
OnError : TARPErrorCallback;
end;
procedure register; procedure register;
procedure sendICMPRequest(ip : puint8; Sequence : uint16; TTL : uint8; OnRep : TARPReplyCallback; OnErr : TARPErrorCallback);
procedure ping_err(hdr : PICMPHeader; Reason : TARPErrorCode);
procedure ping_rep(hdr : PICMPHeader);
implementation implementation
var
Handlers : Array[0..255] of TARPHandler;
function nextInactiveHandler : uint8;
var
i : uint8;
begin
nextInactiveHandler:= 0;
for i:=1 to 255 do begin
if not Handlers[i].Active then begin
nextInactiveHandler:= i;
break;
end;
end;
end;
procedure sendResponse(p_context : PPacketContext); procedure sendResponse(p_context : PPacketContext);
begin begin
end; end;
procedure sendRequest(ip : puint8); procedure sendICMPRequest(ip : puint8; Sequence : uint16; TTL : uint8; OnRep : TARPReplyCallback; OnErr : TARPErrorCallback);
var
handle : uint8;
dest_mac : puint8;
context : PPacketContext;
Header : PICMPHeader;
Buffer : void;
CHK : uint16;
Size : uint32;
begin
handle:= nextInactiveHandler;
Handlers[handle].Active:= true;
Handlers[handle].OnReply:= OnRep;
Handlers[handle].OnError:= OnErr;
if SameSubnetIPv4(ip, @getIPv4Config^.Address[0], @getIPv4Config^.Netmask[0]) then begin
dest_mac:= arp.resolveIP(ip);
end else begin
dest_mac:= arp.resolveIP(@getIPv4Config^.Gateway[0]);
end;
if dest_mac = nil then begin
if Handlers[handle].OnError <> nil then Handlers[handle].OnError(nil, aecFailedToResolveHost);
Handlers[handle].Active:= false;
end else begin
context:= newPacketContext;
copyMAC(getMAC, @context^.MAC.Source[0]);
copyIPv4(@getIPv4Config^.Address[0], @context^.IP.Source[0]);
copyMAC(dest_mac, @context^.MAC.Destination[0]);
copyIPv4(ip, @context^.IP.Destination[0]);
context^.TTL:= TTL;
context^.Protocol.L4:= $01;
Size:= sizeof(TICMPHeader) + sizeof(ICMP_DATA_GENERIC);
Buffer:= kalloc(Size);
Header:= PICMPHeader(Buffer);
Header^.ICMP_Type:= $08;
Header^.ICMP_CHK_Hi:= 0;
Header^.ICMP_CHK_Lo:= 0;
Header^.Identifier:= handle;
Header^.Sequence:= Sequence;
memcpy(uint32(@ICMP_DATA_GENERIC[0]), uint32(Buffer) + sizeof(TICMPHeader), sizeof(ICMP_DATA_GENERIC));
CHK:= calculateChecksum(puint16(Buffer), Size);
Header^.ICMP_CHK_Hi:= CHK AND $FF;
Header^.ICMP_CHK_Lo:= CHK SHR 8;
ipv4.send(Buffer, size, context);
freePacketContext(context);
end;
end;
{procedure sendRequest(ip : puint8);
begin begin
end; end;}
procedure recv(p_data : void; p_len : uint16; p_context : PPacketContext); procedure recv(p_data : void; p_len : uint16; p_context : PPacketContext);
var var
Header : PICMPHeader; Header : PICMPHeader;
CHK : uint16; CHK : uint16;
Handle : uint8;
begin begin
writeToLogLn(' L4: icmp.recv'); writeToLogLn(' L4: icmp.recv');
@ -45,13 +133,100 @@ begin
end; end;
$00:begin //Reply $00:begin //Reply
writeToLogLn(' L4: icmp.reply'); writeToLogLn(' L4: icmp.reply');
Handle:= Header^.Identifier;
if (Handle > 0) and (Handle < 256) then begin
If Handlers[Handle].Active then begin
If Handlers[Handle].OnReply <> nil then Handlers[Handle].OnReply(Header);
Handlers[Handle].Active:= false;
Handlers[Handle].OnError:= nil;
Handlers[Handle].OnReply:= nil;
end;
end;
end;
end;
end;
var
PING_T1 : uint64;
PING_N : uint16;
PING_C : uint16;
PING_L : uint32;
PING_IP : puint8;
procedure ping_err(hdr : PICMPHeader; Reason : TARPErrorCode);
begin
writestringWND('Ping Error: ', getTerminalHWND);
case Reason of
aecFailedToResolveHost:writestringlnWND('Failed to resolve host.', getTerminalHWND);
aecNoRouteToHost:writestringlnWND('No route to host.', getTerminalHWND);
aecTimeout:writestringlnWND('Timeout expired.', getTerminalHWND);
aecTTLExpired:writestringlnWND('TTL Expired.', getTerminalHWND);
end;
PING_T1:= Counters.c64;
INC(PING_C);
if PING_C < PING_N then begin
sendICMPRequest(PING_IP, PING_C, 128, @ping_rep, @ping_err);
end else begin
terminal.done(PING_L);
end;
end;
procedure ping_rep(hdr : PICMPHeader);
var
PING_T2 : uint64;
begin
PING_T2:= Counters.c64;
writestringWND('Ping Reply: ', getTerminalHWND);
writeIntWND(PING_T2-PING_T1, getTerminalHWND);
writeStringlnWND('ms.', getTerminalHWND);
PING_T1:= PING_T2;
INC(PING_C);
if PING_C < PING_N then begin
sendICMPRequest(PING_IP, PING_C, 128, @ping_rep, @ping_err);
end else begin
terminal.done(PING_L);
end;
end;
procedure ping_terminate();
begin
PING_N:= 0;
end;
procedure terminal_command_ping(Params : PParamList);
var
ip_str : pchar;
ip : puint8;
begin
if ParamCount(Params) > 0 then begin
ip_str:= getParam(0, Params);
ip:= stringToIPv4(ip_str);
if ip <> nil then begin
terminal.halt(PING_L, @ping_terminate);
PING_L:= Counters.c32;
PING_N:= 10;
PING_C:= 0;
PING_T1:= Counters.c64;
PING_IP:= ip;
sendICMPRequest(PING_IP, PING_C, 128, @ping_rep, @ping_err);
end; end;
end; end;
end; end;
procedure register; procedure register;
var
i : uint32;
begin begin
for i:=0 to 255 do begin
Handlers[i].Active:= false;
Handlers[i].OnError:= nil;
Handlers[i].OnReply:= nil;
end;
ipv4.registerProtocol($01, @recv); ipv4.registerProtocol($01, @recv);
terminal.registerCommand('PING', @terminal_command_ping, 'Ping a host.');
end; end;
end. end.

View File

@ -45,9 +45,7 @@ procedure register();
begin begin
if not registered then begin if not registered then begin
asm asm
mov al, $36 mov ax, 1193
out $46, al
mov ax, 1165
out $40, al out $40, al
mov al, ah mov al, ah
out $40, al out $40, al

View File

@ -3,20 +3,20 @@ unit asuro;
interface interface
const const
VERSION = '1.0.1-728ia'; VERSION = '1.0.1-745ia';
VERSION_MAJOR = '1'; VERSION_MAJOR = '1';
VERSION_MINOR = '0'; VERSION_MINOR = '0';
VERSION_SUB = '1'; VERSION_SUB = '1';
REVISION = '728'; REVISION = '745';
RELEASE = 'ia'; RELEASE = 'ia';
LINE_COUNT = 28522; LINE_COUNT = 29372;
FILE_COUNT = 90; FILE_COUNT = 110;
DRIVER_COUNT = 32; DRIVER_COUNT = 32;
FPC_VERSION = '2.6.4'; FPC_VERSION = '2.6.4';
NASM_VERSION = '2.10.09'; NASM_VERSION = '2.10.09';
MAKE_VERSION = '3.81'; MAKE_VERSION = '3.81';
COMPILE_DATE = '13/05/18'; COMPILE_DATE = '22/05/18';
COMPILE_TIME = '16:34:39'; COMPILE_TIME = '04:31:53';
implementation implementation

9
src/include/types.pas Normal file
View File

@ -0,0 +1,9 @@
unit types;
interface
{ THIS IS JUST HERE SO THAT VM PLAYS NICE WITHOUT CHANGES }
implementation
end.

View File

@ -53,6 +53,8 @@ function get32bitcounter : uint32;
function get64bitcounter : uint64; function get64bitcounter : uint64;
function getTSC : uint64; function getTSC : uint64;
function div6432(dividend : uint64; divisor : uint32) : uint64;
function BCDToUint8(bcd : uint8) : uint8; function BCDToUint8(bcd : uint8) : uint8;
function HexCharToDecimal(hex : char) : uint8; function HexCharToDecimal(hex : char) : uint8;
@ -61,6 +63,8 @@ procedure resetSystem();
function getESP : uint32; function getESP : uint32;
function MsSinceSystemBoot : uint64;
var var
endptr : uint32; external name '__end'; endptr : uint32; external name '__end';
stack : uint32; external name 'KERNEL_STACK'; stack : uint32; external name 'KERNEL_STACK';
@ -70,6 +74,33 @@ implementation
uses uses
console, RTC, cpu; console, RTC, cpu;
function MsSinceSystemBoot : uint64;
begin
MsSinceSystemBoot:= div6432(getTSC, (CPUID.ClockSpeed.Hz div 1000));
end;
function div6432(dividend : uint64; divisor : uint32) : uint64;
var
d0, d4 : uint32;
r0, r4 : uint32;
begin
d4:= dividend SHR 32;
d0:= dividend AND $FFFFFFFF;
asm
PUSHAD
xor edx, edx
mov eax, d4
div divisor
mov r4, eax
mov eax, d0
div divisor
mov r0, eax
POPAD
end;
div6432:= (r0 SHL 32) OR r4;
end;
function switchendian32(b : uint32) : uint32; function switchendian32(b : uint32) : uint32;
begin begin
switchendian32:= ((b AND $FF000000) SHR 24) OR switchendian32:= ((b AND $FF000000) SHR 24) OR
@ -254,6 +285,7 @@ begin
POP EDX POP EDX
POP EAX POP EAX
end; end;
io_wait;
end; end;
procedure outw(port : uint16; val : uint16); [public, alias: 'util_outw']; procedure outw(port : uint16; val : uint16); [public, alias: 'util_outw'];
@ -267,6 +299,7 @@ begin
POP EDX POP EDX
POP EAX POP EAX
end; end;
io_wait;
end; end;
procedure outb(port : uint16; val : uint8); [public, alias: 'util_outb']; procedure outb(port : uint16; val : uint8); [public, alias: 'util_outb'];
@ -280,6 +313,7 @@ begin
POP EDX POP EDX
POP EAX POP EAX
end; end;
io_wait;
end; end;
procedure halt_and_catch_fire(); [public, alias: 'util_halt_and_catch_fire']; procedure halt_and_catch_fire(); [public, alias: 'util_halt_and_catch_fire'];
@ -307,6 +341,7 @@ begin
POP EDX POP EDX
POP EAX POP EAX
end; end;
io_wait;
end; end;
function inw(port : uint16) : uint16; [public, alias: 'util_inw']; function inw(port : uint16) : uint16; [public, alias: 'util_inw'];
@ -320,6 +355,7 @@ begin
POP EDX POP EDX
POP EAX POP EAX
end; end;
io_wait;
end; end;
function inb(port : uint16) : uint8; [public, alias: 'util_inb']; function inb(port : uint16) : uint8; [public, alias: 'util_inb'];
@ -333,6 +369,7 @@ begin
POP EDX POP EDX
POP EAX POP EAX
end; end;
io_wait;
end; end;
procedure memset(location : uint32; value : uint8; size : uint32); procedure memset(location : uint32; value : uint8; size : uint32);

View File

@ -43,7 +43,9 @@ uses
splash, splash,
cpu, cpu,
themer, themer,
netlog; netlog,
vmlog,
vm;
procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: uint32); stdcall; procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: uint32); stdcall;
@ -97,6 +99,9 @@ var
l : PLinkedListBase; l : PLinkedListBase;
begin begin
{ Serial Init }
serial.init();
{ Store Multiboot info } { Store Multiboot info }
multibootinfo:= mbinfo; multibootinfo:= mbinfo;
multibootmagic:= mbmagic; multibootmagic:= mbmagic;
@ -133,6 +138,15 @@ begin
BSOD('GDT', 'Failed to load the GDT correctly.'); BSOD('GDT', 'Failed to load the GDT correctly.');
end; end;
console.output('MULTIBOOT', 'Assigned Framebuffer: ');
console.writehexln(multibootinfo^.framebuffer_addr);
console.output('MULTIBOOT', 'Assigned Framebuffer Metrics: ');
console.writeint(multibootinfo^.framebuffer_width);
console.writestring('x');
console.writeint(multibootinfo^.framebuffer_height);
console.writestring('x');
console.writeintln(multibootinfo^.framebuffer_bpp);
{ Memory/CPU Init } { Memory/CPU Init }
idt.init(); idt.init();
irq.init(); irq.init();
@ -151,9 +165,6 @@ begin
{ CPUID } { CPUID }
cpu.init(); cpu.init();
{ Serial Init }
serial.init();
{ Call Tracer } { Call Tracer }
tracer.init(); tracer.init();
@ -184,7 +195,7 @@ begin
{ Bus Drivers } { Bus Drivers }
tracer.push_trace('kmain.BUSDRV'); tracer.push_trace('kmain.BUSDRV');
console.outputln('KERNEL', 'BUS DRIVERS: INIT BEGIN.'); console.outputln('KERNEL', 'BUS DRIVERS: INIT BEGIN.');
USB.init(); //USB.init();
pci.init(); pci.init();
console.outputln('KERNEL', 'BUS DRIVERS: INIT END.'); console.outputln('KERNEL', 'BUS DRIVERS: INIT END.');
@ -192,26 +203,43 @@ begin
tracer.push_trace('kmain.NETDRV'); tracer.push_trace('kmain.NETDRV');
net.init; net.init;
tracer.push_trace('kmain.VMINIT');
vm.init();
{ Init Progs }
tracer.push_trace('kmain.SHELLINIT');
shell.init();
tracer.push_trace('kmain.MEMVIEWINIT');
memview.init();
tracer.push_trace('kmain.THEMERINIT');
themer.init();
tracer.push_trace('kmain.NETLOGINIT');
netlog.init();
tracer.push_trace('kmain.VMLOGINIT');
vmlog.init();
terminal.run();
{ Init Splash }
tracer.push_trace('kmain.SPLASHINIT');
splash.init();
{ End of Boot } { End of Boot }
tracer.push_trace('kmain.EOB'); tracer.push_trace('kmain.EOB');
console.writestringln(''); console.writestringln('');
console.setdefaultattribute(console.combinecolors($17E0, $0000)); console.setdefaultattribute(console.combinecolors($17E0, $0000));
console.writestringln('Asuro Booted Correctly!'); console.writestringln('Asuro Booted Correctly!');
console.setdefaultattribute(console.combinecolors($FFFF, $0000)); console.setdefaultattribute(console.combinecolors($FFFF, $0000));
{ Init Progs }
shell.init();
memview.init();
themer.init();
netlog.init();
{ Init Splash }
splash.init();
tracer.push_trace('kmain.END'); tracer.push_trace('kmain.END');
tracer.push_trace('kmain.TICK');
while true do begin while true do begin
tracer.push_trace('kmain.RedrawWindows');
console.redrawWindows; console.redrawWindows;
tracer.push_trace('kmain.VMTick');
vm.tick();
end; end;
end; end;

View File

@ -125,7 +125,7 @@ begin
force_alloc_block(2, 0); //First 12MiB reserved for Kernel/BIOS. force_alloc_block(2, 0); //First 12MiB reserved for Kernel/BIOS.
force_alloc_block(3, 0); force_alloc_block(3, 0);
console.output('PMM',' '); console.output('PMM',' ');
console.writeword(nPresent); console.writeint(nPresent);
console.writestringln('/1024 Block Available for Allocation.'); console.writestringln('/1024 Block Available for Allocation.');
console.outputln('PMM','INIT END.'); console.outputln('PMM','INIT END.');
pop_trace; pop_trace;

View File

@ -27,6 +27,8 @@ procedure run(Params : PParamList);
begin begin
if Handle = 0 then begin if Handle = 0 then begin
Handle:= newWindow(20, 40, 63, 14, 'NETLOG'); Handle:= newWindow(20, 40, 63, 14, 'NETLOG');
clearWND(Handle);
registerEventHandler(Handle, EVENT_CLOSE, void(@OnClose));
end; end;
end; end;

View File

@ -3,7 +3,7 @@ unit shell;
interface interface
uses uses
Console, RTC, terminal, strings, asuro; Console, RTC, terminal, strings, asuro, tracer;
procedure init(); procedure init();
function getTaskbarColorsPtr : puint32; function getTaskbarColorsPtr : puint32;
@ -197,24 +197,38 @@ end;
procedure init(); procedure init();
begin begin
tracer.push_trace('shell.init.1');
Takbar_Colors:= console.combinecolors($0000, $FFFF); Takbar_Colors:= console.combinecolors($0000, $FFFF);
tracer.push_trace('shell.init.2');
Explore_Colors:= console.combinecolors($01C3, $07EE); Explore_Colors:= console.combinecolors($01C3, $07EE);
tracer.push_trace('shell.init.3');
Desktop_Colors:= console.combinecolors($FFFF, $34DB); Desktop_Colors:= console.combinecolors($FFFF, $34DB);
tracer.push_trace('shell.init.4');
DesktopHandle:= Console.newWindow(0, 0, 159, 63, 'DESKTOP'); DesktopHandle:= Console.newWindow(0, 0, 159, 63, 'DESKTOP');
tracer.push_trace('shell.init.5');
TaskBarHandle:= Console.newWindow(0, 63, 159, 1, 'SHELL'); TaskBarHandle:= Console.newWindow(0, 63, 159, 1, 'SHELL');
tracer.push_trace('shell.init.6');
console.bordersEnabled(TaskBarHandle, false); console.bordersEnabled(TaskBarHandle, false);
tracer.push_trace('shell.init.7');
console.setShellWindow(TaskBarHandle, false); console.setShellWindow(TaskBarHandle, false);
tracer.push_trace('shell.init.8');
console.bordersEnabled(DesktopHandle, false); console.bordersEnabled(DesktopHandle, false);
tracer.push_trace('shell.init.9');
console.setShellWindow(DesktopHandle, false); console.setShellWindow(DesktopHandle, false);
tracer.push_trace('shell.init.10');
console.registerEventHandler(TaskBarHandle, EVENT_DRAW, void(@Draw)); console.registerEventHandler(TaskBarHandle, EVENT_DRAW, void(@Draw));
tracer.push_trace('shell.init.11');
console.registerEventHandler(TaskBarHandle, EVENT_MOUSE_CLICK, void(@OnMouseClick)); console.registerEventHandler(TaskBarHandle, EVENT_MOUSE_CLICK, void(@OnMouseClick));
tracer.push_trace('shell.init.12');
console.registerEventHandler(DesktopHandle, EVENT_DRAW, void(@onBaseDraw)); console.registerEventHandler(DesktopHandle, EVENT_DRAW, void(@onBaseDraw));
tracer.push_trace('shell.init.13');
terminal.registerCommand('BACKGROUND', @Command_Background, 'Hide/Show background - usage: BACKGROUND <hide/show>'); terminal.registerCommand('BACKGROUND', @Command_Background, 'Hide/Show background - usage: BACKGROUND <hide/show>');
tracer.push_trace('shell.init.14');
terminal.registerCommand('COLORS', @Command_Colors, 'Set the desktop colors'); terminal.registerCommand('COLORS', @Command_Colors, 'Set the desktop colors');
end; end;

View File

@ -71,7 +71,7 @@ function done(id : uint32) : boolean;
implementation implementation
uses uses
RTC; RTC, cpu;
var var
TERMINAL_HWND : HWND = 0; TERMINAL_HWND : HWND = 0;
@ -520,6 +520,27 @@ begin
terminal.halt(555, @teapot_halt); terminal.halt(555, @teapot_halt);
end; end;
var
c1, c2 : uint64;
first : boolean = true;
procedure testt(Params : PParamList);
var
diff : uint32;
begin
if first then begin
c1:= Counters.c64;
first:= false;
end else begin
c2:= Counters.c64;
diff:= c2 - c1;
writeIntWND(diff, getTerminalHWND);
writeStringlnWND('ms', getTerminalHWND);
c1:= c2;
end;
end;
procedure init; procedure init;
begin begin
console.writestringln('TERMINAL: INIT BEGIN.'); console.writestringln('TERMINAL: INIT BEGIN.');
@ -533,6 +554,7 @@ begin
registerCommandEx('SERIAL', @SendSerial, 'Send ''helloworld'' through COM1.', true); registerCommandEx('SERIAL', @SendSerial, 'Send ''helloworld'' through COM1.', true);
registerCommand('REBOOT', @Reboot, 'Reboot the system.'); registerCommand('REBOOT', @Reboot, 'Reboot the system.');
registerCommandEx('LOLWUT', @teapot, '?', true); registerCommandEx('LOLWUT', @teapot, '?', true);
registerCommandEx('TEST', @testt, '?', true);
console.writestringln('TERMINAL: INIT END.'); console.writestringln('TERMINAL: INIT END.');
end; end;

41
src/prog/vmlog.pas Normal file
View File

@ -0,0 +1,41 @@
unit vmlog;
interface
uses
console, terminal, keyboard, util, strings, tracer;
procedure init();
function getVMLogHWND : HWND;
implementation
var
Handle : HWND = 0;
function getVMLogHWND : HWND;
begin
getVMLogHWND:= Handle;
end;
procedure OnClose();
begin
Handle:= 0;
end;
procedure run(Params : PParamList);
begin
if Handle = 0 then begin
Handle:= newWindow(20, 40, 63, 14, 'VMLOG');
clearWND(Handle);
registerEventHandler(Handle, EVENT_CLOSE, void(@OnClose));
end;
end;
procedure init();
begin
tracer.push_trace('vmlog.init');
terminal.registerCommand('VMLOG', @Run, 'View virtual-machine event log.');
end;
end.

11
updatevm.sh Executable file
View File

@ -0,0 +1,11 @@
#!/bin/sh
DIRECTORY="src/vm"
if [ -d "$DIRECTORY" ]; then
cd "src/vm"
svn update
cd ".."
cd ".."
else
cd src
svn checkout http://ovh.spexeah.com:81/svn/MINJ/src/vm
fi