|
>IDE(Integrated Drive Electronics)有时也被称为ATAPI型控制器。此种控制器速度快,集 成度高,在PC机中应用广泛。我们可以通过一些IDE控制命令来完成硬盘的读/写/校验等各种操作。本文仅介绍其中的硬盘测试命令--0ECH。表1列出了IDE控制器的端口寄存器分配及功能,其中"主状态寄存器"(1F7H)的各位定义如表2。表1 IDE端口寄存器地址及功能表2"硬盘控制寄存器"(3F6H)各位定义如表3。表3输出IDE控制命令可采用下列步骤:(1)向端口3F6H写入控制字节,建立相应的硬盘控制方式;(2)检验控制器和驱动器的状态(通过检测端口1F7H的B7、B6两位),若控制器空闲且驱动器就绪,即可输出命令;(3)完整地输出7B长的命令块,依次写入端口1F1H-1F7H,不论是否需要,端口1F1H-1F6H对应的前6B参数必须输出,端口1F7H输出命令码0ECH;(4)检测端口1F7H的B7、B3位,若控制器空闲且B3置1,表示操作结束,即可读取结果;(5)通过端口1F0H独取100H字至缓冲区;(6)再次读取端口1F7H,判断B0位是否为0,若B0=0,表示命令成功,否则表示命令失败,转至错误处理;(7)通过表4所示的偏移量,读取我们所需的信息并转换成可显示的信息。表4源程序如下。.MODEL SMALL.286.DATAcopydb 'IDE hard drive identify program 1.0',0dh,0ahdb 'Copyright (c) 1995 by LiChunsheng',0dh,0ahdb 'All rights reserved.'db 0dh,0ah,0ah,'Model Number......'iofm dw 14h dup(2020h)db 0dh,0ah,'Firmware Revision....'dw 4 dup(2020h)db 0dh,0ah,'Serial number......'dw 0ah dup(2020h)db 0ahdb 0dh,0ah,'Cylinders......'nofcdb 5 dup(20h)db 0dh,0ah,'Heads......'db 5 dup(20h)db 0dh,0ah,'Sectors per track...'db 5 dup(20h)db 0dh,0ah,'Bytes per track....'db 5 dup(20h)db 0dh,0ah,'Bytes per sector....'db 5 dup(20h)db 0dh,0ah,'Buffer size(KB).....'db 5 dup(20h)db 0dh,0ah,'ECC bytes......'db 5 dup(20h)db 0dh,0ah,'Drive capacity......'db 5 dup(20h)db 'MB',24haddrdb 2,6,12,8,10,42,44addr1dw 36h,14h,2eh,04h,14h,0ahcmddb 0,0,0,0,0,0,0echhdinfodw 100h dup(?)t-o-msg db 'Time out of range!!!',0dh,0ah,24herrmsg db 'Error!!!',0dh,0ah,24h.CODEdec160PROCpush dipush dxpush cxpush axmov al,20hstdcmp dx,9999ja dloopstosbcmp dx,999ja dloopstosbcmp dx,99ja dloopstosbcmp dx,9ja dloopstosbdloop:mov ax,dxmov dx,0mov cx,10div cxxchg ax,dxadd al,30hstosbcmp dx,0jnz dlooppop axpop cxpop dxpop dicldretdec160endpmainPROCmov ax,@DATAmov ds,axmov es,axmloop1:mov cx,0mov dx,1f7hmloop2:in al,dxand al,11000000bcmp al,01000000bjz d-rdyloop mloop2jmp time-outd-rdy:mov al,0mov dx,3f6hout dx,almov si,offset cmdmov al,byte ptrand al,1mov cl,4shl al,clor al,0a0hmov byte ptr,almov dx,1f1hmov cx,7mloop3:lodsbout dx,alinc dxloop mloop3dec dxxor cx,cxmloop4:in al,dxand al,10001000bcmp al,00001000bjz readdataloop mloop4jmp time-outreaddata:clicldmov dx,1f0hmov di,offset hdinfomov cx,100hrepz inswstimov dx,1f7hin al,dxand al,71hxor al,50hjnz errendmov si,offset addrmov di,offset nofcadd di,4mov bh,0mov cx,7mloop6:mov bl,byte ptrmov dx,word ptrcall dec160inc siadd di,28loop mloop6mov ax,1mov si,offset addrmov cx,3mloop7:mov bl,byte ptrmul word ptrinc siloop mloop7mov bx,2048div bxmov dx,axcall dec160mov bx,offset hdinfomov si,offset addr1mov di,offset iofmmov cx,3mloop8:push cxpush bxadd bx,mov cx,add si,4mloop9:mov ax,word ptrxchg ah,a1stosbmov al,ahstosbadd bx,2loop mloop9pop bxpop cxadd di,23loop mloop8mov dx,offset copyjmp endproctime-out:mov dx,offset t-o-msgjmp endprocerrend:mov dx,offset errmsgendproc:mov ah,09hint 21hmov ah,4chint 21hmainendpend main
作者:李春生
|