Вот мой код. Он заполняет массив ATAPI_RAWDATA числом 65535 в десятичной системе. Нет кодов ошибок. Порт регистрации вторичных ошибок, заполненный 0. Он не останавливается, и нет cpu_triple_fault. Когда я удаляю Secondary Master CD-устройство, процедура останавливается нормально. Эти петли в коде для обнаружения бит BSY или что-то еще. Я пробовал процедуру EJECT в реальном аппаратном обеспечении, поэтому никаких проблем с этим кодом нет, но процедура ATAPIREADSECTOR не подходит. Есть ли какие-либо проблемы в команде READCD или что-то еще?Невозможно прочитать компакт-диск с использованием ATAPI
var
READCD:array[0..5] of word($00BE,$0000,$0000,$0000,$0001,$0000);
ATAPI_RAWdata:array[0..1023] of word;
procedure ATAPI_READSECTOR(LBA:Integer;Dev:Byte);
var
i:integer;
x:word;
begin
asm
mov dx,177h
@loop1:
in al,dx
and al,10000000b
jne @loop1
mov dx,177h
@loop2:
in al,dx
and al,01000000b
je @loop2
mov dx,176h
mov al,0A0h
out dx,al
mov dx,3F6h
mov al,00001010b
out dx,al
mov dx,177h
mov al,0a0h
out dx,al
mov cx,0FFFFh
@waitloop:
loopnz @waitloop
mov dx,177h
@loop3:
in al,dx
and al,10000000b
jne @loop3
mov dx,177h
@loop4:
in al,dx
and al,00001000b
je @loop4
end;
for i:=0 to 5 do begin //SEND COMMAND
x:=READCD[i];
outw($170,x);
inb($376);
end;
inb($376);
asm
mov dx,177h
@loop5:
in al,dx
and al,10000000b
jne @loop5
end;
for i:=0 to 1023 do begin //INPUT DATA from DATA REGISTER
atapi_rawdata[i]:=inw($170);
end;
end;
Моя процедура EJECT работает отлично:
var
EJECT_COM:array [0..5] of Word=($001B,$0000,$0002,$0000,$0000,$0000);
procedure EJECT_CD;
var
i:integer;
x:word;
begin
asm
mov dx,177h
@loop1:
in al,dx
and al,10000000b
jne @loop1
mov dx,177h
@loop2:
in al,dx
and al,01000000b
je @loop2
mov dx,176h
mov al,0A0h
out dx,al
mov dx,3F6h
mov al,00001010b
out dx,al
mov dx,177h
mov al,0a0h
out dx,al
mov cx,0FFFFh
@waitloop:
loopnz @waitloop
mov dx,177h
@loop3:
in al,dx
and al,10000000b
jne @loop3
mov dx,177h
@loop4:
in al,dx
and al,00001000b
je @loop4
end;
for i:=0 to 5 do begin
x:=EJECT_COM[i];
outw($170,x);
inb($376);
end;
inb($376);
asm
mov dx,177h
@loop5:
in al,dx
and al,10000000b
jne @loop5
end;
end;
Создает ли это 'for' конструкцию развернутого цикла ...? Разве не было бы достаточно иметь нормальный цикл? –
@MattiVirkkunen Трудно сказать из-за его зверского форматирования, но код написан с использованием встроенной сборки в некотором варианте Pascal (возможно, Delphi), так что это обычный цикл Pascal для цикла. –
@RossRidge: Ох, хорошо. Я думал, что это какой-то причудливый макросборщик. –