home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 December
/
simtel1292_SIMTEL_1292_Walnut_Creek.iso
/
msdos
/
progjorn
/
pj_6_3.arc
/
PARK.ASM
< prev
next >
Wrap
Assembly Source File
|
1985-05-03
|
5KB
|
296 lines
title 'Park Disk Routine for Hard Disks 5-3-85'
;
; Hard Disk Parking Routine for MSDOS
; Version for Seagate 20-60 meg drives, though should work for
; any size hard disks
;
; Currently setup for DOS and MASM
;
; Also provides limited diagnostics (ie Drive Parameters)
; and parks multiple drives
;
; Author: M. Steven Baker
; Revision date January 31, 1985
; Last revision May 3, 1985
;
; If using MASM use exe2bin to convert to a .COM file
; you can then load PARK.com with debug and change CX=260
; and W (write) out the file shrinking its size
; This chops off the 200h bytes of stack space from the COM file
;
; E Q U A T E S
;
cr equ 0dh
lf equ 0ah
ESC equ 1bh
;
false equ 0
true equ not false
;
CPM86 equ false
MSDOS equ not CPM86
MASM equ true
if MASM ;use some Macros
jmps macro dummy
jmp short dummy
endm
;
rs macro count
db count dup(?)
endm
cseg macro
CODE segment
assume cs:CODE,ds:CODE,es:CODE,ss:CODE
endm
ENDIF ;MASM
;
cseg
ORG 0100h
;
start: jmps start1
dosflg: dw MSDOS ;0=CPM86 FF=dos
;
start1: mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,offset stktop
cld
;
call ilprt
db cr,lf,'Park version 2.01 5-3-85 (msb)',cr,lf,0
;
parkit: mov dx,80h
push dx
call getparms
jnc parm_ok
parker: jmp parm_err
;
parm_ok: mov ax,dx
pop dx
;
push ax
call ilprt
db 'DRIVE PARMETERs: TotDrvs=',0
pop ax
push ax
add al,'0' ;AL = number of drives
call conout
pop ax
call crlf
;
xor cx,cx ;zero CX as loop counter
mov cl,al
or cx,cx ; are there any drives
jz nodrives
;
parklp: push cx ;save number of drives
push dx ;save drive number
mov ax,1100h ;recalibrate hard disk
int 13h
jnc recal_ok
jmp recal_err
;
recal_ok:
call getparms
jnc ok_2
jmp parm_err
;
ok_2: mov ax,dx
pop dx ;restore drive number
push dx
call sayparms
MOV AX,0C00H ;seek command
INT 13H
jc seek_err
;
pop dx
inc dx ; go to next drive
pop cx ;get back loop counter
loop parklp
call ilprt
db CR,LF,'Head(s) parked !!',CR,LF,0
jmp exit ;and terminate
;
nodrives:
call ilprt
db cr,lf,'NO HARD DISK drives installed',cr,lf,0
jmp exit
;
seek_err:
call ilprt
db cr,lf,'Seek error on drive ',0
call saydrive
jmp abort
recal_err:
call ilprt
db cr,lf,'Recalibrate error on drive ',0
call saydrive
jmp abort
parm_err:
call ilprt
db cr,lf,'Disk Parameter call returned error on drive ',0
call saydrive
jmp abort
saydrive:
push ax
mov al,dl ;get hard disk drive # to AL
and al,7fh ;strip 8th bit
add al,'0'
call conout
pop ax
ret
getparms:
mov ax,0800h ;get current drive parameters
int 13h
ret
; S A Y P A R M S
; entry: DL = drive number
; AL = number of consecutive drives
; AH = maximum useable head number
; CH = maximum useable value for cylinder
; CL = maximum useable value for sector number
; and cylinder number high bits
; exit: all registers preserved
sayparms:
push ax
push bx
push cx
push dx
;
push ax
call ilprt
db 'DRIVE PARMs: Drv=',0
mov al,dl ;Drive #
and al,7fh ;strip off lower bits
add al,'0'
call conout ;say drive
;
call ilprt
db ' Heads=',0
pop ax ;restore heads and tot drives
xchg ah,al
call hexout
;
call ilprt
db ' Cyls=',0
push cx ;save cylinders and sectors
mov ax,cx
and ax,0c0h ;strip off high bits of CL
;
push cx
mov cx,6
shloop: shr ax,1
loop shloop
pop cx
;
call hexout
pop cx ;restore CX = sectors & cylinders
mov al,ch ;now lower 8 bits of cylinders
call hexout
mov al,'h'
call conout
;
call ilprt
db ' Sectors= ',0
mov al,cl
and al,3fh ;strip off lower 6 bits
call hexout
mov al,'h'
call conout
;
call crlf
;
pop dx
pop cx
pop bx
pop ax
ret
;
conout: push ax
push bx
push dx
mov dl,al
mov ah,6
int 21h ;change this to a CALL BDOS for CP/M
pop dx
pop bx
pop ax
ret
;
ilprt:
pop si
ilprt1: lodsb
or al,al
jz ilprtr
call conout
jmps ilprt1
ilprtr: push si
ret
;
hexout: push ax
shr al,1
shr al,1
shr al,1
shr al,1
call pnib
pop ax
push ax
call pnib
pop ax
ret
;
pnib: and al,0fh
add al,'0'
cmp al,'9'
jbe pnib2
add al,7
pnib2:
call conout
ret
crlf: push ax
mov al,CR
call conout
mov al,LF
call conout
pop ax
ret
abort:
call ilprt
db ' .. Aborting',cr,lf,0
exit: mov ax,0
int 21h ;change to a call BDOS for CP/M
exit1: jmps exit1
;
db 0
even
;temp equ $ and 0fffeh ;make on even boundary for CP/M-86
;
; org temp
RS 200h
stktop dw 0
dw 0
;
CODE ends
end start ;put starting label routine at 100h