git-svn-id: https://spexeah.com:8443/svn/Asuro@18 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
kieron 2017-05-15 19:52:31 +00:00
parent e33d8ad9eb
commit eebe77ad9b
19 changed files with 36 additions and 31 deletions

BIN
Asuro.iso

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -13,10 +13,11 @@ type
limit_n_flags : Byte; limit_n_flags : Byte;
base_high : Byte; base_high : Byte;
end; end;
PSegmentDescriptor = ^TSegmentDescriptor;
var var
GDTarr : array[0..3] of TSegementDescriptor; GDTarr : array of TSegementDescriptor;
GDTptr : ^TSegementDescriptor; GDTptr : PSegmentDescriptor;
GDT_length : integer = 0; GDT_length : integer = 0;
procedure init(); procedure init();
@ -46,48 +47,52 @@ end;
procedure create(base : dword; limit : dword; flags : byte); procedure create(base : dword; limit : dword; flags : byte);
var var
descriptor : array[0..8] of Byte; descriptor : array[0..8] of Byte;
descriptor_ptr : ^Byte = @descriptor[0]; descriptor_ptr : ^Byte = @descriptor[0];
s_descriptor : TSegementDescriptor; s_descriptor : TSegementDescriptor;
s_descriptor_ptr : ^TSegementDescriptor = @s_descriptor; s_descriptor_ptr : ^TSegementDescriptor = @s_descriptor;
begin begin
if limit <= 65536 then if limit <= 65536 then begin
descriptor[6] := $40 descriptor[6] := $40
else end else begin
if (limit and $FFF) <> $FFF then if (limit and $FFF) <> $FFF then begin
limit := (limit >> 12) -1 limit := (limit SHR 12) -1
else end else begin
limit := limit >> 12; limit := limit SHR 12;
descriptor[6] := $C0; end;
end;
descriptor[6] := $C0;
descriptor[0] := limit and $FF; descriptor[0] := limit and $FF;
descriptor[1] := (limit shr 8) and $FF; descriptor[1] := (limit shr 8) and $FF;
descriptor[6] := limit or ((limit shr 16) and $F); descriptor[6] := limit or ((limit shr 16) and $F);
descriptor[2] := base and $FF; descriptor[2] := base and $FF;
descriptor[3] := (base shr 8) and $FF; descriptor[3] := (base shr 8) and $FF;
descriptor[4] := (base shr 16) and $FF; descriptor[4] := (base shr 16) and $FF;
descriptor[7] := (base shr 24) and $FF; descriptor[7] := (base shr 24) and $FF;
descriptor[5] := flags; descriptor[5] := flags;
asm asm
MOV EAX, descriptor_ptr MOV EAX, descriptor_ptr
MOV s_descriptor_ptr, EAX MOV s_descriptor_ptr, EAX
end; end;
descriptor_ptr = @descriptor[4]; descriptor_ptr = @descriptor[4];
asm asm
MOV EAX, descriptor_ptr MOV EAX, descriptor_ptr
MOV EBX, s_descriptor_ptr MOV EBX, s_descriptor_ptr
ADD EBX, 1 ADD EBX, 1
MOV (EBX), EAX MOV (EBX), EAX
end; end;
GDTarr[GDT_length] := s_descriptor; GDTarr[GDT_length] := s_descriptor;
GDT_length := GDT_length + 1; GDT_length := GDT_length + 1;
end; end;
end. end.