无法使用ATAPI读取CD

时间:2016-07-03 14:31:54

标签: assembly x86 pascal cd-rom ata

这是我的代码。它用十进制的65535填充ATAPI_RAWDATA数组。没有错误代码。辅助错误寄存器端口填充0.它不会停止,并且没有cpu_triple_fault。当我删除Secondary Master CD设备时,该过程正常停止。用于检测BSY位或其他内容的代码中的这些循环。我在真实硬件中尝试了EJECT程序,因此该代码没有任何问题,但ATAPIREADSECTOR程序没有问题。 READCD Command或其他什么问题?

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mpi.h>

int main(int argc, char **argv)
{
    char message[20];
    int i, rank, size, type = 99;
    MPI_Status status;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    if (rank == 0)
    {
        strcpy(message, "Hello, world!");
        for (i = 1; i < size; i++)
            MPI_Send(message, 14, MPI_CHAR, i, type,
                MPI_COMM_WORLD);
    }
    else
        MPI_Recv(message, 20, MPI_CHAR, 0, type,
            MPI_COMM_WORLD, &status);
    printf("Message from process = %d : %.14s\n", rank, message);
    MPI_Finalize();
    system("pause");
    return 0;
}

我的EJECT程序运行良好:

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;

1 个答案:

答案 0 :(得分:-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);