Assembly 无法使用ATAPI读取CD

Assembly 无法使用ATAPI读取CD,assembly,x86,pascal,cd-rom,ata,Assembly,X86,Pascal,Cd Rom,Ata,这是我的密码。它用十进制65535填充ATAPI_RAWDATA数组。没有错误代码。辅助错误寄存器端口已填充0。它不会停止,并且没有cpu故障。当我取出辅助主CD设备时,程序正常停止。这些循环在代码中用于检测BSY位或其他内容。我在真实的硬件中尝试了弹出程序,所以代码上没有任何问题,但AtapiredSector程序运行不正常。READCD命令或其他命令是否有问题 var READCD:array[0..5] of word($00BE,$0000,$0000,$0000,$0001,$0000

这是我的密码。它用十进制65535填充ATAPI_RAWDATA数组。没有错误代码。辅助错误寄存器端口已填充0。它不会停止,并且没有cpu故障。当我取出辅助主CD设备时,程序正常停止。这些循环在代码中用于检测BSY位或其他内容。我在真实的硬件中尝试了弹出程序,所以代码上没有任何问题,但AtapiredSector程序运行不正常。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;
我的弹出程序工作正常:

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;

SCSI命令READ CD$不能使用该结构,因此请使用READ 12$A8 SCSI命令而不是READ CD$BE:

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

对于构造,该
是否生成展开循环。。。?仅仅有一个普通的循环还不够吗?@MattiVirkkunen很难说,因为它的格式太糟糕了,但是代码是用一些Pascal变体(可能是Delphi)中的内联汇编编写的,所以这只是一个普通的Pascal for循环。@RossRidge:Ooh,好的。我认为这是一种奇怪的宏汇编程序。我通常不会问这个问题,通常会忽略一些奇怪的问题,但我感兴趣的是,为什么要编写代码来用汇编语言读取cd?罗斯·里奇:Delphi1可能适用于win3.1x。之后的任何东西都是32位的,这是16位汇编程序。很可能是涡轮帕斯卡。