Code: Select all
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
; NAME: FLOPPY_INT
;
; DESCRIPTION: Floppy disk interrupt
;
; PARAMETERS:
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
floppy_int Proc far
mov al,ds:IntFlag
or al,al
jnz floppy_int_done
inc al
mov ds:IntFlag,al
mov bx,ds:FloppyThread
Signal
floppy_int_done:
ret
floppy_int Endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
; NAME: CommandPhase
;
; DESCRIPTION: Execute command phase
;
; PARAMETERS: CX Number of bytes to output
;
; RETURNS: NC Performed ok
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CommandPhase Proc near
push ax
push bx
push dx
push si
ClearSignal
mov ds:IntFlag,0
mov si,2000
mov bx,OFFSET CmdCode
CommandPhaseLoop:
push cx
xor cx,cx
CommandPhaseReqLoop:
mov dx,3F4h
in al,dx
test al,80h
jnz CommandPhaseReqSet
mov ax,50
WaitMicroSec
sub si,1
jnc CommandPhaseReqLoop
pop cx
jmp CommandPhaseDone
CommandPhaseReqSet:
pop cx
test al,40h
stc
jnz CommandPhaseDone
;
mov dx,3F5h
mov al,[bx]
inc bx
out dx,al ; output data byte
loop CommandPhaseLoop
mov ax,30
WaitMicroSec
clc
CommandPhaseDone:
pop si
pop dx
pop bx
pop ax
ret
CommandPhase Endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
; NAME: ResultPhase
;
; DESCRIPTION: Execute result phase
;
; RETURNS: NC Performed ok
; CX Number of bytes in result
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ResultPhase Proc near
push ax
push bx
push dx
push si
mov si,200
xor cx,cx
mov bx,OFFSET st0
ResultPhaseLoop:
mov ax,50
WaitMicroSec
;
mov dx,3F4h
in al,dx
test al,10h
clc
jz ResultPhaseDone
test al,80h
jnz ResultPhaseReqSet
mov ax,50
WaitMicroSec
sub si,1
jnc ResultPhaseLoop
jmp ResultPhaseDone
ResultPhaseReqSet:
test al,40h
stc
jz ResultPhaseDone
inc cx
mov dx,3F5h
in al,dx
mov [bx],al
inc bx
jmp ResultPhaseLoop
ResultPhaseDone:
pop si
pop dx
pop bx
pop ax
ret
ResultPhase Endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
; NAME: SenseIntCmd
;
; DESCRIPTION: Sense interrupt command
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SenseIntCmd Proc near
push ax
push cx
mov ax,10
WaitMilliSec
mov ds:CmdCode,8
mov cx,1
call CommandPhase
jc SenseIntDone
call ResultPhase
SenseIntDone:
pop cx
pop ax
ret
SenseIntCmd Endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
; NAME: ResetController
;
; DESCRIPTION: ResetController
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ResetController Proc near
push es
push ax
push cx
push dx
push di
mov ax,ds
mov es,ax
mov cx,100
mov ds:cTrack,-1
ResetControllerLoop:
GetThread
mov ds:FloppyThread,ax
ClearSignal
mov ds:IntFlag,0
mov al,8
mov dx,3F2h
out dx,al
mov ax,250
WaitMicroSec
;
mov al,0Ch
mov dx,3F2h
out dx,al
mov ds:DriveControl,al
;
mov ds:TimeoutCount,20
WaitForSignal
mov al,ds:IntFlag
or al,al
jz ResetControllerFailed
ResetControllerStart:
mov al,0Ch
out dx,al
mov ds:DriveControl,al
ResetControllerSense:
int 3
call SenseIntCmd
jc ResetControllerFailed
;
call SenseIntCmd
jc ResetControllerFailed
;
call SenseIntCmd
jc ResetControllerFailed
;
call SenseIntCmd
jc ResetControllerFailed