硬盘I/O口读硬盘信息的问题?
我设置好第一磁盘控制器的01F1H,01F2H,01F3H,01F4H,01F5H,01F6H,然后向01F7H发送0ECH命令,然后从01F0H读出的磁盘信息有问题?问题在哪?程序片段
xor ax,ax
mov dx,01f1h
out dx,al
jmp $+2
inc dx ;01f2h
out dx,al
jmp $+2
inc dx ;01f3h
out dx,al
jmp $+2
inc dx ;01f4h
out dx,al
jmp $+2
inc dx ;01f5h
out dx,al
jmp $+2
inc dx ;01f6h
mov al,10100000b
out dx,al
jmp $+2
inc dx ;01f7h
mov al,0ech ;获得磁盘信息命令
out dx,al
jmp $+2
mov dx,01f0h
mov cx,100h/2
mov si,offset buffer ;缓冲地址
rep insw
call show_buffer ;显示缓冲内容
现在从端口01F0读出的信息不对,问题在哪?
谢谢
问题点数:20、回复次数:3Top
1 楼terry_followwind()回复于 2005-02-28 15:25:48 得分 20
首先你要去选读哪一个硬盘,master还是slave,而且,用LBA的模式和用INT13有点不一样,LBA0为第一个sector,还有,1f2 port下的是读几个sector,你下的是0,还有要注意的是从1f0要一个word一个word读出来.没时间写code,给你一个在debug下.(只能在dos下用)(LBA 28bit mode)
o 1f6 a0
i 1f7 (50 表示ready)
o 1f2 1
o 1f3 0
o 1f4 0
o 1f5 0
o 1f6 e0 (LBA enable)
o 1f7 20 (PIO read)
i 1f7 (58 ok)
i 1f0 (first word)
i 1f0 (second word)
具体想知道你可以去download ATA-6 Spec
去google搜索ATA Spec应该就找得到Top
2 楼xyyhjk(<我的理想是做一个平凡的人,现在我实现了>)回复于 2005-02-28 16:07:42 得分 0
谢谢楼上的解答
能否帮忙看看我下面的代码
我指定读第一个硬盘控制器的主盘,就是01F0-01F7端口,用F1命令设定磁盘密码,F1命令要求从01F0端口输出512字节,ATAPI上对01F1,01F2,01F3,01F4,01F5要求是NA,01F6要求是 OBS NA OBS DEV NA NA NA NA
我的程序片段
;先传输512字节到01F0H
MOV SI,OFFSET BUFF ;512字节,DS,CS,ES统一
MOV CX,100H ;字传送
MOV DX,01F0H ;端口
REP OUTSW
;传其他端口
MOV DX,01F1H
XOR AX,AX
OUT DX,AL
INC DX ;01F2H
OUT DX,AL
INC DX ;01F3H
OUT DX,AL
INC DX ;01F4H
OUT DX,AL
INC DX ;01F5H
OUT DX,AL
INC DX
MOV AL,10100000B ;DEV 为第一硬盘0
OUT DX,AL
INC DX ;01F7H
MOV AL,0F1H
OUT DX,AL
;命令发送完成
;现在有2个问题,一个是我向01F0端口发送数据时,01F7端口的BIT3 数据请求准备好的位总为0.就是没有准备好数据接受.如何让01F7的BIT3置为1即已准备好了
第二个问题是以上代码可以吗?OUT后的延时已经考虑了.
感谢再次解答
Top
3 楼terry_followwind()回复于 2005-03-14 14:30:52 得分 0
我不知道你要读什么,ATA和ATAPI有些不一样的Top




