* * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* EDRIVE.ASM *
* *
* TERRY HAZEN, LOS GATOS, CA *
* *
* ADAPTED FROM MULTIDSK VER 2.2 *
* COPYRIGHT (C) 1984,1985 AMPRO COMPUTERS, INC. *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * *
; revision log:
;
; 8/18/85 Release Ver 2.0 (Adapted from MULTIDSK Ver 2.2)
; Added support for command line specification of an
; alternate drive to be used for the "E" drive.
;
; (FOR BIOS VERSIONS GREATER THAN 3.0:
; Added support for reading a 48tpi format in a 96tpi
; drive, also for its commmand line specification.)
;
;
; 8/06/85 Release Ver 1.0 (Adapted from MULTIDSK Ver 1.0)
;
;-----------------------------------------------------------------------
;
; EDRIVE allows the "E" drive of the AMPRO series 100 computers to read
; and write a user-defined foreign 48tpi or 96tpi disk format.
;
; EDRIVE is most useful for formats which are not included in MULTIDSK
; and are used often enough to make the use of ESET awkward, or for
; MULTIDSK formats when the smaller size and faster operation of EDRIVE
; are assets.
;
; EDRIVE changes the TYPE byte, DPB, drive, and the skew table in the
; BIOS. A total of 37 bytes are used (1 for TYPE byte, 15 for DPB,
; 1 for drive selected, 20 for skew table):
;
; The FTYPE byte identifies the format as 48tpi or 96tpi.
;
; The EDRIVE byte defines which drive will be used as the "E"
; drive (A, B, C, or D).
;
; The ETYPE byte defines whether you are reading a 48tpi format on
; a 48tpi drive or a 96tpi drive.
;
; The TYPE byte is a single byte which defines the particulars of
; the foreign disk format:
;
; bit 7......density: 0=single; 1=double
; bit 6......double sided media if = 1
; bit 5......double sided mode:
; 1 = continuous sector numbers (first
; sector on side one = last sector
; on side 0 + 1).
; both tracks are treated as a
; single track with twice as many
; sectors.
; 0 = same sectors on both sides
; (normal method)
; bit 4......reserved
; bits 3-2...00 = 1k allocation blocks
; 01 = 2k allocation blocks
; 10 = not used
; 11 = not used
; bits 1-0...00 = 128 byte sectors
; 01 = 256 byte sectors
; 10 = 512 byte sectors
; 11 = 1024 byte sectors
;
; The DPB (disk parameter block) is the standard Digital Research
; DBP and can be learned by studying the CP/M 2 Alteration Guide
; as supplied by Digital Research. The disk parameter block tells
; the system about how the data is arranged on the disk. The DPB
; has ten entries:
;
; SPT Sectors Per Track (word)
; BSH Block SHift (byte)
; BLM BLock Mask (byte)
; EXM EXtent Mask (byte)
; DSM Directory Size Minus one (word)
; DRM DiRictory entries Minus one (word)
; AL0 directory group ALlocation 0 (byte)
; AL1 directory group ALlocation 1 (byte)
; CKS ChecK Size (word)
; OFF OFFset (# of system tracks) (word)
;
; (You may obtain the DPB and skew table information for
; a foreign format by running DSKPRAM on that format.)
;
; The drive byte defines the drive being used as the "E" drive.
; It is changed by EDRIVE and is not user-entered data.
;
; The skew table translates between logical and physical sector
; numbers. On some systems the sectors are not contiguously
; arranged in order to improve access times.
;
;-----------------------------------------------------------------------
;
; Customizing EDRIVE for your foreign format:
;
; Put the type of format you will use (48tpi or 96tpi) at FTYPE,
; the drive you wish to use as the default "E" drive at EDRIVE,
; the type of drive (48tpi or 96tpi) at ETYPE, your foreign format
; type byte, DPB, and skew table at FORMAT, the name of your
; foreign format in the message at SIGNOFF, and assemble.
;
;-----------------------------------------------------------------------
;
; Using EDRIVE:
;
; In normal use, the format and drive selections you entered in
; EDRIVE.ASM will be used as your "E" drive when the program
; is run. EDRIVE may be run from any drive except "E". EDRIVE
; may also be combined with other commands in a multiple ZCPR
; command line in the normal manner:
;
; A>edrive b4;dir e:
;
;
; Modifying Drive and Drive Type Selections on the Command Line:
;
; You may also change the "E" drive and drive type selections by
; placing the new drive letter and type on the command line
; following the program name:
;
; 96tpi Formats:
;
; Since a 96tpi format must be read in a 96tpi drive, only
; the new drive letter (which must be a 96tpi drive)
; needs to be specified on the command line:
;
; A>edrive b
;
;
; 48tpi Formats (BIOS version less than 3.0):
;
; BIOS versions less than 3.0 do not directly support
; reading a 48tpi format in a 96tpi drive, so only the new
; drive letter (which must be a 48tpi drive) needs to be
; specified on the command line:
;
; A>edrive c
;
; (IF YOUR BIOS VERSION IS LESS THAN 3.0, and you want to
; read a 48tpi format in a 96tpi drive, you must run
; 48TPI.COM prior to running EDRIVE. 48TPI makes your
; 96tpi "E" drive look like a 48tpi drive, with some
; limitations. See 48TPI.DOC)
;
;
; 48tpi Formats (BIOS versions 3.0 or greater):
;
; EDRIVE supports READING your 48tpi format in a 96tpi
; drive (writing a 48tpi format on a 96tpi drive is NOT
; recommended.)
;
; To modify your default "E" drive selection, add the new
; drive letter to the command line following the program
; name. If the drive type of your new "E" drive is
; different than the default type, add the number for the
; new drive type after the drive letter (4 for 48tpi or
; 9 for 96tpi):
;
; Examples:
;
; If your default "E" drive is the 48tpi drive 'B' and you
; wanted to make the 48tpi drive 'C' the new "E" drive,
; you would type:
;
; A>edrive c or A>edrive c4
;
; and if you wanted to make the 96tpi drive 'D' the new "E"
; drive, you would type:
;
; A>edrive d9
;
;
; If your default "E" drive is the 96tpi drive 'D' and you
; wanted to make the 48tpi drive 'C' the new "E" drive,
; you would type:
;
; A>edrive c4
;
;
; The default value for ETYPE that you entered in EDRIVE.ASM
; file will always be used unless you specify a different
; value on the command line.
;
; Whenever you specify a 48tpi format in a 96tpi drive,
; EDRIVE will remind you in the sign-off message.
;
;-----------------------------------------------------------------------
CR: EQU 0DH ; carrige return
LF: EQU 0AH ; line feed
;
BDOS: EQU 5
;
ORG 0100H ; base of tpa
BEGIN: JMP START ; leave room for copyright and format data
;
DB ' EDRIVE Vers 2.0, adapted by Terry Hazen'
DB ' from MULTIDSK Vers 2.2, Copyright (c) 1984,1985'
DB ' AMPRO Computers, Inc. '
DB 1AH
;
;=======================================================================;
; ;
; USER-ENTERED FOREIGN FORMAT DATA: ;
; --------------------------------- ;
; ;
; The following table contains the type byte, dpb, drive selected, ;
; and skew for your foreign format, and the sign-off message. ;
; ;
; Enter your data here... ;
; ;
;-----------------------------------------------------------------------;;
; ;;
; The use of 96tpi drives to READ 48tpi formats is supported only ;;
; with Bios versions 3.0 and above. If your BIOS version is less ;;
; than 3.0, ignore FTYPE and ETYPE: ;;
; ;;
FTYPE: DB '4' ; foreign format type: ;;
; ; ('4': it's a 48tpi format) ;;
; ; ('9': it's a 96tpi format) ;;
; ;;
EDRIVE: DB 'B' ; drive selected as "E" drive: ;;
; ; ('A','B','C',or'D') ;;
; ;;
ETYPE: DB '4' ; type of drive: ;;
; ; 48tpi format: ;;
; ; is the selected drive 48tpi or ;;
; ; 96tpi? ;;
; ; ('4': it's a 48tpi drive) ;;
; ; ('9': it's a 96tpi drive) ;;
; ; ;;
; ; 96tpi format: ;;
; ; ETYPE will be ignored. ;;
;-----------------------------------------------------------------------;;
; ;;
FORMAT: ;;
; ;;
;type byte ;;
DB 0C7H ; MORROW MD3 DSDD 48tpi format ;;
; ;;
;dpb ;;
DW 40 ; spt ;;
DB 4 ; block shift ;;
DB 15 ; block mask ;;
DB 1 ; extent mask ;;
DW 0C2H ; disk size-1 ;;
DW 0BFH ; # of directories-1 ;;
DB 0E0H ; allocation 0 ;;
DB 0 ; allocation 1 ;;
DW 48 ; dir check size ;;
DW 2 ; reserved tracks ;;
; ;;
;drive ;;
DB 1 ; this byte is changed by EDRIVE ;;
; ; and is not user-entered ;;
; ;;
;skew table - must contain 20 bytes total ;;
DB 1,4,2,5,3 ;;
DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;;
; ;;
;-----------------------------------------------------------------------;;
; ;
;the sign-off message: ;
; ;
SIGNOFF: ;
DB CR,LF ;
DB 'Drive A is now a ' ;
;-----------------------------------------------------------------------;;
; ;;
; ...Enter the name of your foreign format here: ;;
; ;;
DB 'MORROW MD3 DSDD 48tpi' ;;
; ;;
;-----------------------------------------------------------------------;;
DB CR,LF ;
DB 'drive when you call it "E".' ;
DB CR,LF,'$' ;
;-----------------------------------------------------------------------;
; ;
; END OF USER-ENTERED DATA AREA... ;
; ;
;=======================================================================;
;
;
START: LXI H,0 ; zero out h&l
DAD SP ; add sp to hl
SHLD OLDSP ; save it
LXI SP,STACK ; set up new stack
;
;
;ckdrv loads the default drive and compares it
;against the e drive, which isn't allowed. prints
;error message if true.
;
CKDRV: LDA 4 ; get default drive
CPI 4 ; is it drive "e"?
JZ WRGDRV ; get ready to quit if it is
;
LHLD 01H
MVI L,74H
MOV A,M
ANI 3FH ; mask off D-speed & D-step
MOV M,A
;
;
;eaddr gets the location of eparm in the bios.
;
EADDR: LHLD 1 ; get warm boot vector
MVI L,36H ; get edsk offset
LXI D,BIORET ; point to bios return point
PUSH D ; save d
PCHL ; return with dpb addr
;
;
;bioret returns with the bios location of eparm
;and saves it for use later.
;
BIORET: DCX H ; back up to type byte location
SHLD ADDR ; save location
;
;interrogate the command line for any characters
;
LXI H,80H
MOV A,M
INX H
ORA A
JZ BIOS$VER
MOV B,A
LXI D,EDRIVE
MVI C,2
;
NEXTCHR:
MOV A,M
DCR B
INX H
JM BIOS$VER
CPI ' '
JZ NEXTCHR
STAX D
INX D
DCR C
JZ BIOS$VER
JMP NEXTCHR
;
BIOS$VER:
MVI A,0 ; clear bios version
STA LB$VERS
CALL GET$BIOS$VERS ; get bios version
JMP MAIN
;
;
GET$BIOS$VERS:
; Get bios version -- Brings the current BIOS jump tables (starting
; at warm boot) to a local area for ease of utility access. If
; this BIOS is version 2.1 or greater, the secondary jump table
; is brought in as well.
;
; Entry: none
; Exit: Z = bios < 2.1 (old bios)
; NZ = bios 2.1+ (fixed disk bios)
; All registers are modified
;
LHLD 1 ; Get start of bios jump table
LXI D,LB$BIOS$TBL ; Move bios to local storage
LXI B,LB$LEN ; . (length of bios area)
DB 0EDH,0B0H ; . (move routine)
MVI A,0 ; Test CP/M version
CALL LB$GETNXT ; Get next jump table
STA LB$VERS ; Save bios version
INX H ; See if HL is 0FFFFh
MOV A,H ; .
ORA L ; .
RZ ; If so, then old version
DCX H ; Fix HL as it has the table addr
LXI D,LB$XTBL ; Move extra table to local storage
LXI B,LB$XLEN ; . (length of extra table)
DB 0EDH,0B0H ; . (move routine)
MVI A,0FFH ; Set NZ to indicate bios
ORA A ; ... version 2.1+
RET ; ... and return.
; * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; *
; Data area . . . *
; *
; * * * * * * * * * * * * * * * * * * * * * * * * * * * *
;
; Replicated BIOS for ease of use . . .
;
LB$BIOS$TBL:
LB$WBOOT: DB 0,0,0 ; Warm boot
LB$CONST: DB 0,0,0 ; Console status
LB$CONIN: DB 0,0,0 ; Console input
LB$CONOUT: DB 0,0,0 ; Console output
LB$LISTOUT: DB 0,0,0 ; List output
LB$PUNCH: DB 0,0,0 ; Punch output
LB$READER: DB 0,0,0 ; Reader input
LB$HOMDSK: DB 0,0,0 ; Home disk (move to track 00)
LB$SELDSK: DB 0,0,0 ; Select disk drive
LB$SETTRK: DB 0,0,0 ; Select track number
LB$SETSEC: DB 0,0,0 ; Select sector number
LB$SETDMA: DB 0,0,0 ; Set DMA address
LB$DSKREAD: DB 0,0,0 ; Disk read
LB$DSKWRITE: DB 0,0,0 ; Disk write
LB$LISTST: DB 0,0,0 ; List status
LB$SECTRN: DB 0,0,0 ; Sector translate routine
;
; AMPRO-specific BIOS calls
;
LB$GETNXT: DB 0,0,0 ; Get bios ver & next tbl address
LB$GETEDSK: DB 0,0,0 ; Get pointer to E-disk storage
LB$IOINIT: DB 0,0,0 ; Set new I/O parameters
LB$SCSIDRV: DB 0,0,0 ; SCSI direct driver
;
LB$LEN: EQU $-LB$WBOOT ; Length of bios table
;
LB$XTBL:
LB$SWAP$DRV: DB 0,0,0 ; Swap two logical drives
LB$WINDRV: DB 0,0,0 ; Set/get win drive parameters
LB$PHYTAB: DB 0,0,0 ; Set/get phytab access
LB$GET$LDTE: DB 0,0,0 ; Get physical table entry address
LB$RESERVED: DB 0,0,0 ; Reserved entry
;
LB$XLEN:EQU $-LB$XTBL ; Length of extra table
;
LB$VERS: DB 0
;
;
MAIN: LDA EDRIVE ; get drive back
STA SIGNOFF+8 ; store it in sign-off message
SUI 'A' ;
STA FORMAT+16 ; store it
LHLD ADDR ; get bios pointer back
MVI B,37 ; number of bytes to move (1+15+1+20)
LXI D,FORMAT ; point to new dpb
CALL LOOP ; put into memory
JMP DONE ; done
;
;
;wrgdrv loads the wrong drive error message, prints
;it and exits to zcpr3.
;
WRGDRV: LXI D,ERROR ; load error message
CALL OUTPUT ; bdos
;
DONE: LHLD OLDSP ; get stack back
SPHL ; put it in sp
RET ; return to zcpr3
;
;
;loop moves the type byte, dpb, drive,and
;skew table to the location in the bios pointed to
;by the hl registers. the bytes to be moved are pointed
;to by the de registers and b contains the number
;of bytes to be moved.
;
LOOP: LDA FTYPE
CPI '4' ; 48tpi format?
JNZ SIGN ; no, print sign-off message
;
D4896: LDA ETYPE
CPI '9' ; 96tpi drive?
JNZ SIGN ; no, print sign-off message
LDA LB$VERS ; yes, so get bios version
SUI 1EH ; bios version > 3.0?
JP SETDST ; yes, set double-step
;
LXI D,WRGBIOS ; no, 48/96 not supported,
CALL OUTPUT ; so print error msg and quit
JMP DONE
;
SETDST: PUSH H
LHLD 1
MVI L,74H
MOV A,M
ORI 40H
MOV M,A
;
PUSH B
PUSH D
LXI D,SIGNOFF ; point to sign-off message
CALL OUTPUT ; print it
LXI D,MSG4896 ; point to 48/96 message
CALL OUTPUT ; print it
POP D
POP B
;
POP H
JMP LOOP2
;
SIGN: PUSH B
PUSH D
PUSH H
LXI D,SIGNOFF ; point to sign-off message
CALL OUTPUT ; print it
POP H
POP D
POP B
;
LOOP2: LDAX D ; put 1st byte into a
MOV M,A ; store it in bios
INX D ; roll up d
INX H ; roll up h
DCR B ; decrement b
JNZ LOOP2 ; loop until done
RET
;
;
;output sends the message pointed to by de to the screen.
;
OUTPUT: MVI C,9 ; print string function
CALL 5 ; bdos
RET ;
;
WRGBIOS:
DB 7,CR,LF
DB '+++ Your BIOS is not version 3.0 or greater, so reading '
DB CR,LF
DB 'a 48tpi format in a 96tpi drive is not supported.'
DB CR,LF,'$'
;
ERROR: DB 7,CR,LF
DB '+++ Wrong drive selected.'
DB CR,LF
DB 'EDRIVE can only be run from drive A, B, C, or D.'
DB CR,LF,'$'
;
MSG4896:
DB CR,LF
DB 'This is a 48tpi format in a 96tpi drive:'
DB CR,LF
DB '- Writing to this drive is not recommended!'
DB CR,LF,'$'
;
ADDR: DS 2 ; "e" drive parms addr
;
;
;
DS 64 ; 32 level stack
STACK:
;
OLDSP: DS 2 ; room for old stack pointer
;
;
;
END BEGIN