2016-07-03 12 views
0

ここに私のコードです。 ATAPI_RAWDATA配列に10進数で65535を入れます。エラーコードはありません。二次エラーレジスタポートに0が入っています。停止せず、cpu_triple_faultもありません。セカンダリマスターCDデバイスを取り外すと、手順は正常に停止します。これらのループは、BSYビットなどを検出するためのコードです。私は実際のハードウェアでEJECTプロシージャを試したので、そのコードに問題はありませんが、ATAPIREADSECTORプロシージャはうまくいきません。 READCDコマンドなどに問題はありますか?ATAPIを使用してCDを読み取れません

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; 
+0

'for'構造体はアンロールされたループを生成しますか?通常のループだけでは十分ではないでしょうか? –

+3

@MattiVirkkunenそれはひどいフォーマットのために伝えるのは難しいですが、コードはPascal(おそらくDelphi)のある種の亜種でインラインアセンブリを使って書かれているので、これは普通のパスカルforループです。 –

+0

@RossRidge:Ooh、OK。私はそれがある種の奇妙なマクロアセンブラだと思った。 –

答えて

-1

SCSIコマンドのREAD CDの$ので、代わりにREAD CDの$ BEのREAD 12 $ A8 SCSIコマンドを使用し、その構造体を使用していないBE:

READCD:array[0..5] of word($00A8,$0000,$0000,$0000,$0001,$0000); 
関連する問題