git-svn-id: https://spexeah.com:8443/svn/Asuro@258 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
parent
542c728681
commit
60c5febc60
@ -68,7 +68,7 @@ var
|
||||
|
||||
procedure init(_controller : TPCI_device);
|
||||
procedure read(address : uint32; data_lba : uint32; data_bytes : uint32);
|
||||
procedure write(address : uint32);
|
||||
procedure write(address : uint32; data_lba : uint32; data_bytes : uint32);
|
||||
procedure callback(data : void);
|
||||
|
||||
implementation
|
||||
@ -155,7 +155,66 @@ begin
|
||||
|
||||
end;
|
||||
|
||||
procedure write(address : uint32); begin
|
||||
procedure write(address : uint32; data_lba : uint32; data_bytes : uint32);
|
||||
var
|
||||
PRD : Physical_Region_Descriptor;
|
||||
empty_table : array[0..100] of Physical_Region_Descriptor;
|
||||
i : uint32;
|
||||
ptr : intptr;
|
||||
sector_count : uint8;
|
||||
cb : ATA_Command_Buffer;
|
||||
begin
|
||||
devices[0].device_lba := data_lba;
|
||||
devices[0].reading := true;
|
||||
PRD_Table := empty_table;
|
||||
PRD.MRPB_Address := address;
|
||||
|
||||
//limit
|
||||
if data_bytes > 6400000 then exit;
|
||||
|
||||
if data_bytes < 64001 then begin
|
||||
PRD.EOT := 1;
|
||||
if data_bytes = 64000 then begin
|
||||
PRD.Byte_Count := 0
|
||||
end else begin
|
||||
PRD.Byte_Count := data_bytes;
|
||||
end;
|
||||
end else begin
|
||||
while data_bytes > 64000 do begin
|
||||
PRD.EOT := 0;
|
||||
PRD.MRPB_Address := address;
|
||||
PRD.Byte_Count := 0;
|
||||
|
||||
data_bytes := data_bytes - 64000;
|
||||
address := address + 64000;
|
||||
end;
|
||||
|
||||
PRD.EOT := 1;
|
||||
PRD.MRPB_Address := address;
|
||||
PRD.Byte_Count := data_bytes;
|
||||
|
||||
end;
|
||||
|
||||
ptr := intptr(devices[0].PRDT_Address_Reg);
|
||||
ptr^ := uint32(@PRD_Table);
|
||||
|
||||
ptr := intptr(devices[0].Status_Register);
|
||||
ptr^ := 0;
|
||||
|
||||
outb(ports.drive, $A0);
|
||||
outb(ports.sector_count, 125);
|
||||
outb(ports.lba_low, (data_lba and $000000FF));
|
||||
outb(ports.lba_mid, (data_lba and $0000FF00) SHR 8);
|
||||
outb(ports.lba_hi, (data_lba and $0000FF00) SHR 16);
|
||||
outb(ports.command, $CA);
|
||||
devices[0].currentIndex := 1;
|
||||
|
||||
cb.start_stop_bit := 1;
|
||||
cb.read_write_bit := 1;
|
||||
|
||||
ptr := intptr(devices[0].Command_Register);
|
||||
ptr^ := uint8(cb);
|
||||
|
||||
end;
|
||||
|
||||
procedure callback(data : void); //need r/w, is last
|
||||
@ -163,36 +222,44 @@ var
|
||||
cb : ATA_Command_Buffer;
|
||||
ptr : intptr;
|
||||
tmp : uint16;
|
||||
mode : uint8;
|
||||
begin
|
||||
if(PRD_Table[devices[0].currentIndex - 1].EOT = 1) then begin
|
||||
//other stuff
|
||||
exit;
|
||||
end;
|
||||
|
||||
if(devices[0].reading = true) then begin
|
||||
//if(devices[0].reading = true) then begin
|
||||
if(PRD_Table[devices[0].currentIndex].EOT = 0) then begin
|
||||
outb(ports.sector_count, 125);
|
||||
outb(ports.lba_low, (devices[0].device_lba + (64000 * devices[0].currentIndex)) and $000000FF);
|
||||
outb(ports.lba_mid, (((devices[0].device_lba + (64000 * devices[0].currentIndex))) and $0000FF00) SHR 8);
|
||||
outb(ports.lba_hi, (((devices[0].device_lba + (64000 * devices[0].currentIndex))) and $0000FF00) SHR 16);
|
||||
outb(ports.command, $C8);
|
||||
//outb(ports.command, $C8);
|
||||
end else begin
|
||||
tmp := uint16((PRD_Table[devices[0].currentIndex].Byte_Count and $FFFF) DIV 512);
|
||||
outb(ports.sector_count, uint16(tmp)); // wont work if 64k
|
||||
outb(ports.lba_low, (devices[0].device_lba + (64000 * devices[0].currentIndex)) and $000000FF);
|
||||
outb(ports.lba_mid, (((devices[0].device_lba + (64000 * devices[0].currentIndex))) and $0000FF00) SHR 8);
|
||||
outb(ports.lba_hi, (((devices[0].device_lba + (64000 * devices[0].currentIndex))) and $0000FF00) SHR 16);
|
||||
outb(ports.command, $C8);
|
||||
//outb(ports.command, $C8);
|
||||
end;
|
||||
|
||||
if(devices[0].reading = true) then begin
|
||||
outb(ports.command, $C8);
|
||||
cb.start_stop_bit := 1;
|
||||
cb.read_write_bit := 0;
|
||||
|
||||
end else begin
|
||||
outb(ports.command, $CA);
|
||||
cb.start_stop_bit := 1;
|
||||
cb.read_write_bit := 1;
|
||||
end;
|
||||
ptr := intptr(devices[0].Command_Register);
|
||||
ptr^ := uint8(cb);
|
||||
|
||||
|
||||
devices[0].currentIndex := devices[0].currentIndex + 1;
|
||||
end;
|
||||
//end;
|
||||
end;
|
||||
|
||||
|
||||
|
@ -66,6 +66,8 @@ var
|
||||
i : uint32;
|
||||
cEIP : uint32;
|
||||
|
||||
temp : uint32;
|
||||
|
||||
begin
|
||||
multibootinfo:= mbinfo;
|
||||
multibootmagic:= mbmagic;
|
||||
@ -116,6 +118,12 @@ begin
|
||||
mouse.init();
|
||||
console.writestringln('DRIVERS: INIT END.');
|
||||
|
||||
//temp := 8294;
|
||||
//ata.write(uint32(@temp), 0, 4);
|
||||
//temp := 1234;
|
||||
//ata.read(uint32(@temp), 0, 4);
|
||||
//console.writeintln(temp);
|
||||
|
||||
console.writestringln('');
|
||||
console.setdefaultattribute(console.combinecolors(Green, Black));
|
||||
console.writestringln('Asuro Booted Correctly!');
|
||||
|
Loading…
x
Reference in New Issue
Block a user