Не удается прочитать компакт-диск с использованием ATAPI

Вот мой код. Он заполняет массив ATAPI_RAWDATA числом 65535 в десятичном виде. Нет кодов ошибок. Порт вторичного регистра ошибок заполнен 0. Он не останавливается и нет cpu_triple_fault. Когда я удаляю устройство Secondary Master CD, процедура обычно останавливается. Эти циклы в коде для обнаружения бита BSY или чего-то еще. Я попробовал процедуру EJECT на реальном оборудовании, поэтому в этом коде нет никаких проблем, но процедура ATAPIREADSECTOR не работает нормально. Есть ли проблема с командой READCD или чем-то еще?

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;

person user2590769    schedule 03.07.2016    source источник
comment
Создает ли эта конструкция for развернутый цикл...? Разве не достаточно иметь обычный цикл?   -  person Matti Virkkunen    schedule 03.07.2016
comment
@MattiVirkkunen Трудно сказать из-за его ужасного форматирования, но код написан с использованием встроенной сборки в каком-то варианте Pascal (вероятно, Delphi), так что это обычный цикл for Pascal.   -  person Ross Ridge    schedule 03.07.2016
comment
@RossRidge: О, хорошо. Я думал, что это какой-то странный ассемблер макросов.   -  person Matti Virkkunen    schedule 03.07.2016
comment
Обычно я не спрашиваю об этом, обычно игнорирую странные вопросы, но мне интересно, зачем вам писать код для чтения компакт-диска на языке ассемблера?   -  person barny    schedule 04.07.2016
comment
Для моего хобби os @barny   -  person user2590769    schedule 04.07.2016
comment
Росс Ридж: Возможно, Delphi1 для win3.1x. Все, что было после этого, было 32-битным, а это 16-битный ассемблер. Хотя, скорее всего, это Turbo Pascal.   -  person Marco van de Voort    schedule 05.07.2016
comment
Вероятно, действительно Турбо Паскаль. Непосредственное чтение портов — это то, что вам не следует делать в Windows, даже в Windows 3.x. Если это для хобби ОС, то винды все равно скорее всего нет.   -  person Rudy Velthuis    schedule 06.07.2016
comment
Это ФПК. И я решил проблему с исправлением массива команд.   -  person user2590769    schedule 06.07.2016


Ответы (1)


Команда SCSI READ CD $BE не использует эту структуру, поэтому используйте READ 12 $A8 SCSI COMMAND вместо READ CD $BE:

READCD:array[0..5] of word($00A8,$0000,$0000,$0000,$0001,$0000);
person user2590769    schedule 03.07.2016