не могу записать сектор на хард..
использую команду 30h,31h (W.S.)
вообщем что происходит:
-загоняю необходимые ей регистры (sc,sn,cl,ch....)
-загружаю регистр команд CR
- читаю регистр состояния SR (читаю сразу без какой-л задержки!(равно как и с ней))
- бамц а там 58h... то есть все круто но без БИТА BSY
(по протоколу PO он должен быть установлен... да и вообще я прочел SR сразу после команды[чтобы команда ни делала устройство должно реагировать на нее установлением BSY])
вопрос почему?!?!?!
----
вообщем как вывод - ниче не работает
ps значение 58 возникало на двух хардах...
[Low HDD] ошибка в протоколе PIO???19.11.02 21:08 Автор: kar Статус: Незарегистрированный пользователь
> не могу записать сектор на хард.. > использую команду 30h,31h (W.S.) > вообщем что происходит: > -загоняю необходимые ей регистры (sc,sn,cl,ch....) > -загружаю регистр команд CR > - читаю регистр состояния SR (читаю сразу без какой-л > задержки!(равно как и с ней)) > - бамц а там 58h... то есть все круто но без БИТА BSY > (по протоколу PO он должен быть установлен... да и вообще я > прочел SR сразу после команды[чтобы команда ни делала > устройство должно реагировать на нее установлением BSY]) > вопрос почему?!?!?! > ---- > вообщем как вывод - ниче не работает > ps значение 58 возникало на двух хардах... ------------
хмм вот что обнаружил - на некоторых хардах сразу после команды WS рег.состаяния имеет значение D0h (бит BSY установлен;-)
смотрим что дальше - Немного погодя этот бит сбрасывается и устанавливается бит DRQ (дальше соотвественно записав данные все выполняется)
вопрос - почему сбрасывается BSY??
в протоколе PO(pio) опубликованном у в.кулакова наоборот перед передачей BSY устанавливается
Надеюсь, ты делаешь это в чистом досе ?20.11.02 11:22 Автор: Chingachguk <Chingachguk> Статус: Member
> Или раньше, ибо под виндой с винтом работать просто так не > выйдет ;) ну есесно.. я писал что запись проходит нормально.. меня все интересует бит bsy
вот если хочешь посмотри у себя(хард на примари мастер):
.386
DATA segment use16
sector512 db 512 dup (0)
sectoraddress dd ?
tblhex db '0123456789ABCDEF'
standardATAbases dw 1f0h,170h
channelnumber db ?
disknumber db ?
ATAfeatures db ?
ATAsectorcount db ?
ATAsectornumber db ?
ATAcylinder dw ?
ATAhead db ?
ATAaddressmode db ?
ATAcommand db ?
ATAbaseportaddr dw ?
deverrorcode db ?
optime dd ?
DATA ends
CODE segment use16
assume cs:CODE,ds:CODE,fs:DATA
begin:
push DATA
pop fs
push fs
pop ds
push 0b800h
pop es
;delay 20ticks
push es
push 0000
pop es
mov eax,es:[046ch]
mov fs:[optime],eax
wait1:
mov eax,es:[046ch]
sub eax,fs:[optime]
cmp eax,20
jb wait1
pop es
;DUMP SR! (=58h)
; mov di,80
; mov dx,fs:[ATAbaseportaddr]
; add dx,7
; in al,dx
; mov ah,0AAh ;можно не писать
; call dumpAX
;write sector
mov si,offset sector512
mov dx,fs:[ATAbaseportaddr]
mov cx,256
rep outsw
exit:
mov ax,4c00h
int 21h
e_exit:
mov di,0
mov ax,0EFEFh
call dumpAX
jmp exit
;---------------------------------------------------------------------------------------
cmd2HDD proc
pusha
push es
push 0000
pop es
mov dx,fs:[ATAbaseportaddr]
add dx,6
mov al,fs:[disknumber]
shl al,4
or al,10100000b
out dx,al
mov eax,es:[046ch]
mov fs:[optime],eax
inc dx
waitHDready:
mov eax,es:[046ch]
sub eax,fs:[optime]
cmp eax,3
ja @err1
in al,dx
test al,80h
jnz waitHDready
test al,08h
jnz waitHDready
test al,32
jnz @err1
mov dx,fs:[ATAbaseportaddr]
inc dx
mov al,fs:[ATAfeatures]
out dx,al
inc dx
mov al,fs:[ATAsectorcount]
out dx,al
inc dx
mov al,fs:[ATAsectornumber]
out dx,al
inc dx
mov ax,fs:[ATAcylinder]
out dx,al
inc dx
mov al,ah
out dx,al
inc dx
mov al,fs:[disknumber]
shl al,4
or al,10100000b
or al,fs:[ATAhead]
mov ah,fs:[ATAaddressmode]
shl ah,6
or al,ah
out dx,al
inc dx
mov al,fs:[ATAcommand]
out dx,al
jmp @end1
@err1: mov fs:[deverrorcode],1
@end1:
pop es
popa
retn
endp cmd2HDD
;------
dumpAX proc ;input ds=DATA!
push bx
push ax
and ax,0f0h
shr ax,4
mov bx,offset tblhex
xlat
mov es:[di],al
inc di
inc di
pop ax
push ax
and ax,0fh
xlat
mov es:[di],al
inc di
inc di
pop ax
push ax
and ax,0f000h
shr ax,12
xlat
mov es:[di],al
inc di
inc di
pop ax
push ax
and ax,0f00h
shr ax,8
xlat
mov es:[di],al
inc di
inc di
pop ax
pop bx
retn
dumpAX endp
CODE ends
end begin