Category : Assembly Language Source Code
Archive   : PARK.ZIP
Filename : PARK.ASM
Output of file : PARK.ASM contained in archive : PARK.ZIP
;
; 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
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/