lane@dalcs.UUCP (John Wright/Dr. Pat Lane) (07/21/88)
Hi. I was looking for a way to tell an AT with an HD (1.2Meg) drive to
use 360K disk format by default. This would make "/4" on FORMAT auto-
matic and make it possible to DISKCOPY 360K disks to unformatted target
disks (currently, on an AT, it gives something like "drive parms incompatible"
when it discovers it has to format the disk; you have to format with /4
first). It would solve problems with a few other programs, too.
I eventually discovered that using DRIVPARM=/D:0/F:0 (undocumented I think)
in CONFIG.SYS would do the trick but I wanted a small program to switch
back and forth. I imagined it would alter stored disk parameters somewhere
in DOS. By comparing core images I developed the following two extremely
primitive programs.
I can't recommend these programs as I have only a partial understanding
of what they do. For one I'm working with PC-DOS 3.20 and I doubt they
would work with anything else. I am in fact seeking advise and feedback.
(Like, "does anyone already have a decent program for this"?)
NAME SDRV360
ORG 100H
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:NOTHING
MOV AX,CS
MOV DS,AX
MOV SI,OFFSET LIST
XOR AX,AX
MOV ES,AX
MOV DI,1A92H
MOV CX,22
REP MOVSB
INT 20H
.RADIX 16
LIST DB 00,0F0,01,28,00,00,02,02,01,00,02,70,00,0D0,02,0FDH
DB 02,00,09,00,02,00
CODE ENDS
END
NAME SDRV12M
ORG 100H
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:NOTHING
MOV AX,CS
MOV DS,AX
MOV SI,OFFSET LIST
XOR AX,AX
MOV ES,AX
MOV DI,1A92H
MOV CX,22
REP MOVSB
INT 20H
.RADIX 16
LIST DB 01,32,00,50,00,00,02,01,01,00,02,0F0,00,60,09,0F9
DB 07,00,0F,00,02,00
CODE ENDS
END
Two things about assembling these. After assembling, linking, and
EXD2BIN'ing, the OFFSET LIST does not get biased by 100h. I have to
use DEBUG and fix it. Am I doing something wrong here?
Also, in the first program, in the LIST statement, if I take the "H" off
the "0FD" constant, I get a "Syntax Error", even though .RADIX is 16 and
all the other numbers are OK.
In the lists, I don't know what the first three bytes are. The next two
bytes are the number of tracks. The rest matchs the "BIOS Parameter
Block" which is written into the boot sector of every disk when it is
formatted (but are not found in the ROM BIOS).
A few other interesting (to me) points. There is a complicated mechanism
unique to the AT for tracking the type of drive and disk it is dealing
with. I've read that this includes knowing when the disk drive door is
opened and setting the drive type to unknown. There are some disk status
bytes at 40:90 & 91 (drive A & B) and an INT 13 function (17h) that set
those bytes. Status can be 360K in a 360K drive, 360K in a 1.2M drive,
1.2M in a 1.2M drive, or unknown. There are also "Operation Status"
bytes at 40:92 & 93 whose function is a mystery to me.
None of this makes any difference to FORMAT (at least in DOS 3.2). In
fact this program never does an INT 13. Everything seems to be done with
DOS (INT 21) function 44h (IOCTL). In particular undocumented (even in Ralf
Brown's comprehensive list of interupts - are you listening Ralf?) sub-
functions 13 and 15 (decimal). 13 is particularly interesting; it seems
to use a sub-subfunction code in CX. An 0860h returns in a buffer a
list of drive paarmeters (ie. fixed or floppy, no. of tracks, etc.) and
this is what FORMAT goes by. With CX set to 0842h it formats a track.
Strange, eh?
If anybody has insights to this, I'd be curious. Thanks.
--
John Wright ////////////////// Phone: 902-424-3805 or 902-424-6527
Post: c/o Dr Pat Lane, Biology Dept, Dalhousie U, Halifax N.S., CANADA B3H-4H8
Cdn/Bitnet: lane@cs.dal.cdn Arpa: lane%dalcs.uucp@uunet.uu.net
Uucp: lane@dalcs.uucp or {uunet,watmath,utai,garfield}!dalcs!lane