home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
utils
/
dskutl
/
eset.aqm
/
ESET.ASM
Wrap
Assembly Source File
|
1985-02-09
|
19KB
|
795 lines
;+----------------------------------------------------------------------+
;| |
;| ESET.ASM |
;| Public Domain - 1984 Konrad Roeder, Albuquerque, NM |
;| |
;+----------------------------------------------------------------------+
;
;
; Revision Log:
;
7/16/84 V1.0 release to AMPRO-1
;
; Purpose:
;
; ESET allows any one of the four possible drives A, B, C, and D,
; to read a foreign format. The emulated foreign drive is called
; "E" when it is used with the foreign format and by its regular
; name when it is used with the normal format of the machine.
;
; ESET changes the specifications of the "E" drive in four areas:
; 1 - Disk Drive Select Byte
; 2 - Type Byte
; 3 - Disk Parameter Block
; 4 - Skew Table
;
; The following is a description of those data structures:
;
; DISK DRIVE SELECT BYTE
; Tells the system which drive is aliased to the foreign format "E"
; 00 - A 01 - B 02 - C 03 - D
;
; TYPE BYTE
;
;
; 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
;
;
; DISK PARAMETER BLOCK
; 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 DiRectory entries Minus one (word)
; AL0 directory group ALlocation 0 (byte)
; AL1 directory group ALlocation 1 (byte)
; CKS ChecK Size (word)
; OFF OFFset (# reserved tracks) (word)
;
; SKEW TABLE
; The skew table translates between logical and physical sector
; numbers. On some systems the sectors are not contiguously
; arranged so that access times can be improved.
;
;
*********************************************************************
CR: EQU 0DH ;carrige return
LF: EQU 0AH ;line feed
ESC: EQU 01BH ;escape
CAPS: EQU 05FH ;upper case
FF: EQU 0CH ;form feed
ETX: EQU 3 ;^c
ORG 0100H ;base of tpa
BEGIN: JMP START ;leave room for copyright
;
DB ' MULTIDSK Vers 1.4 Copyright (c) 1984'
DB ' AMPRO Computers, Inc. '
;
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
;
;eaddr gets the location of eparm in the bios.
;
EADDR: LHLD 1 ;get warm boot vector
MVI L,36H ;getedsk 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
;
;print the signon message.
;
SIGN: LXI D,SIGNON ;point to sign on message
CALL OUTPUT ;
;
;getdrv checks which drive is selected as the "e" drive.
;
GETDRV: CALL CONIN ;get drive selection
CPI ESC ;esc?
JZ DONE ;endit
CPI ETX ;^c?
JZ DONE ;
ANI CAPS ;force upper case
CPI 'A' ;a?
JZ PTMAIN ;
CPI 'B' ;b?
JZ PTMAIN ;
CPI 'C' ;c?
JZ PTMAIN ;
CPI 'D' ;d?
JZ PTMAIN ;
JMP GETDRV ;do it until you get it right!
;
;
; ptmain is the section that builds the type byte
;
PTMAIN: STA DRSEL+7 ;store drive in signoff message
SUI 41H ;ascii -> hex
STA DRIVE ;save drive selected
XRA A ;clear type byte
STA TYPE
LXI D,SELFMT
CALL OUTPUT ;print the format selection
GETFMT: CALL CONIN ;get the format selection
CPI ESC ;esc?
JZ PTMAIN ;start over
CPI ETX ;ctrl-c?
JZ DONE
ANI CAPS ;force caps
CPI 'A' ;a?
JZ FMTA
CPI 'B' ;b?
JZ FMTB
CPI 'C' ;c?
JZ FMTC
CPI 'D' ;d?
JZ FMTD
JMP GETFMT ;back until its ok
FMTA: JMP PTALL ;sssd = 00xxxxxx (no change)
FMTB: LDA TYPE ;ssdd = 10xxxxxx
ORI 80H
STA TYPE
JMP PTALL
FMTC: LDA TYPE ;dssd = 01xxxxxx
ORI 40H
STA TYPE
JMP PTSEC
FMTD: LDA TYPE ;dsdd = 11xxxxxx
ORI 0C0H
STA TYPE
JMP PTSEC
PTSEC: LXI D,SELSEC
CALL OUTPUT
GETSEC: CALL CONIN ;get sector numbering
CPI ESC ;esc?
JZ PTMAIN
CPI ETX ;ctrl-c?
JZ DONE
ANI CAPS
CPI 'A' ;a?
JZ SECA
CPI 'B' ;b?
JZ SECB
JMP GETSEC
;
SECA: LDA TYPE ; continuous xx1xxxxx
ORI 20H
STA TYPE
JMP PTALL
SECB: JMP PTALL ; same xx0xxxxx (no change)
;
PTALL: LXI D,SELALL
CALL OUTPUT
GETALL: CALL CONIN ; get allocation block size
CPI ESC ;esc?
JZ PTMAIN ; if so -- start over
CPI ETX ;ctrl-c?
JZ DONE ; if so -- bye
ANI CAPS ; convert to caps
CPI 'A' ;a?
JZ ALLA
CPI 'B' ;b?
JZ ALLB
JMP GETALL
ALLA: JMP PTBPS ; 1k xxxx00xx
ALLB: LDA TYPE ; 2k xxxx01xx
ORI 04H
STA TYPE
PTBPS: LXI D,SELBPS ; get bytes per sector memu
CALL OUTPUT
GETBPS: CALL CONIN ; get bps
CPI ESC ;esc?
JZ PTMAIN ; if so -- start over
CPI ETX ;ctrl-c?
JZ DONE ; if so -- bye
ANI CAPS ; caps to caps
CPI 'A' ;a?
JZ BPSA
CPI 'B' ;b?
JZ BPSB
CPI 'C' ;c?
JZ BPSC
CPI 'D' ;d?
JZ BPSD
JMP GETBPS
BPSA JMP FCMAIN ; 128 bps xxxxxx00
BPSB LDA TYPE ; 256 bps xxxxxx01
ORI 01H
STA TYPE
JMP FCMAIN
BPSC LDA TYPE ; 512 bps xxxxxx10
ORI 02H
STA TYPE
JMP FCMAIN
BPSD LDA TYPE ;1024 bps xxxxxx11
ORI 03H
STA TYPE
FCMAIN: LXI D,SELSPT ;sectors per track (word)
CALL OUTPUT
CALL DBIN
SHLD DPB ;store in dpb & dpb + 1
LXI D,SELBSH ;block shift (byte)
CALL OUTPUT
CALL DBIN
MOV A,L ;store in dpb+2
STA DPB+2
LXI D,SELBLM ;block mask (byte)
CALL OUTPUT
CALL DBIN
MOV A,L ;store in dpb+3
STA DPB+3
LXI D,SELEXM ;extent mask (byte)
CALL OUTPUT
CALL DBIN
MOV A,L ;store in dpb+4
STA DPB+4
LXI D,SELDSM ;disk size - 1 (word)
CALL OUTPUT
CALL DBIN
SHLD DPB+5
LXI D,SELDRM ;# directories - 1 (word)
CALL OUTPUT
CALL DBIN
SHLD DPB+7
LXI D,SELAL0 ;allocation 0 (byte)
CALL OUTPUT
CALL DBIN
MOV A,L
STA DPB+9
LXI D,SELAL1 ;allocation 1 (byte)
CALL OUTPUT
CALL DBIN
MOV A,L
STA DPB+10
LXI D,SELCKS ;dir check size (word)
CALL OUTPUT
CALL DBIN
SHLD DPB+11
LXI D,SELOFF ;reserved tracks (word)
CALL OUTPUT
CALL DBIN
SHLD DPB+13
LXI D,SELOK
CALL OUTPUT
GETOK: CALL CONIN
CPI ETX
JZ DONE
ANI CAPS
CPI 'Y'
JZ PTSKW
CPI 'N'
JZ FCMAIN
JMP GETOK
PTSKW: LXI D,SELSKW
CALL OUTPUT
GETSKW: CALL CONIN
CPI ESC ;esc?
JZ PTSKW
CPI ETX ;ctrl-c?
JZ DONE
ANI CAPS
CPI 'A'
JZ SKWWA
CPI 'B'
JZ SKWWB
CPI 'C'
JZ SKWWC
CPI 'D'
JZ SKWWD
CPI 'E'
JZ SKWWE
CPI 'F'
JZ SKWWF
CPI 'G'
JZ SKWWG
CPI 'H'
JZ SKWWH
CPI 'I'
JZ SKWWI
CPI 'J'
JZ SKWWJ
CPI 'K'
JZ SKWWK
CPI 'L'
JZ SKWWL
CPI 'M'
JZ SKWWM
CPI 'N'
JZ SKWWN
CPI 'O'
JZ SKWWO
CPI 'P'
JZ SKWWP
CPI 'Z'
JZ MKSKW
JMP GETSKW
SKWWA: LXI D,SKWA
JMP SKWFIN
SKWWB: LXI D,SKWB
JMP SKWFIN
SKWWC: LXI D,SKWC
JMP SKWFIN
SKWWD: LXI D,SKWD
JMP SKWFIN
SKWWE: LXI D,SKWE
JMP SKWFIN
SKWWF: LXI D,SKWF
JMP SKWFIN
SKWWG: LXI D,SKWG
JMP SKWFIN
SKWWH: LXI D,SKWH
JMP SKWFIN
SKWWI: LXI D,SKWI
JMP SKWFIN
SKWWJ: LXI D,SKWJ
JMP SKWFIN
SKWWK: LXI D,SKWK
JMP SKWFIN
SKWWL: LXI D,SKWL
JMP SKWFIN
SKWWM: LXI D,SKWM
JMP SKWFIN
SKWWN: LXI D,SKWN
JMP SKWFIN
SKWWO: LXI D,SKWO
JMP SKWFIN
SKWWP: LXI D,SKWP
JMP SKWFIN
MKSKW: LXI D,MKMSG ;did not find the skew table,
;so we will build one!
CALL OUTPUT
LXI H,SKW ;hl will point at the temp buffer
MVI B,20 ;b will count out twenty entries
MKSKW1: PUSH B ;save b for now
PUSH H ;hl too
LXI D,PROMPT ;print the prompt
CALL OUTPUT
CALL DBIN ;get a value in decimal -> hl
MOV A,L
POP H ;get the address it goes into
MOV M,A ;and move it there
INX H
POP B
DCR B ;count down
JNZ MKSKW1 ;not done yet - go again
LXI D,SKWOK ;ask 'em if its ok
CALL OUTPUT
GETSOK: CALL CONIN ;get their answer
CPI ETX ;ctrl-c?
JZ DONE ;end it
ANI CAPS ;convert to caps
CPI 'Y' ;y?
JZ LDDPB
CPI 'N' ;n?
JZ MKSKW
JMP GETSOK ;someday they may type y or n!
;
SKWFIN: LXI H,SKW
MVI B,20
CALL LOOP ;move the appropriate skew table in the
;temporary buffer area
;
;
;
; move the temporary buffer area into bios
;
LDDPB: LHLD ADDR ;get bios pointer back
MVI B,37 ;number of bytes to move (1+15+1+20)
LXI D,TYPE ;point to the temporary dpb
CALL LOOP
;
; clean up
;
LXI D,SGNOFF
CALL OUTPUT
LHLD OLDSP
SPHL ;put the old stack back into use
JMP 0H ;go to bios reset address
;
;
;
;conin gets a character from the console through bios and
;puts it in the accumulator.
;
CONIN: MVI A,9 ; bios call avoids echo to console
LHLD 1
MOV L,A
PCHL
;
;
;conout gets a single character from the accumulator and
;sends it to the console through bios
;
CONOUT: MOV C,A
MVI A,12
LHLD 1
MOV L,A
PCHL
;
;
;output sends the message pointed to by de to the screen.
;
OUTPUT: MVI C,9 ;print string function
CALL 5 ;bdos
RET ;
;
;
; dbin ascii decimal to 16 bits in hl
;
DBIN: PUSH D ;save registers
LXI H,0 ;clear hl
DBIN2: PUSH H ;save hl
CALL CONIN
POP H
CPI ETX ;ctrl-c?
JZ ABORT
CPI CR ;return?
JZ DBIN3
PUSH H
CALL CONOUT
POP H
SUI '0' ;convert this digit to binary
JC DBIN4 ; <0
CPI 10
JNC ERRDB ; >10
MOV D,H ; hl -> de
MOV E,L
DAD H ; *2
DAD H ; *4
DAD D ; *5
DAD H ; *10
MOV E,A ; new byte -> de
MOV D,0
DAD D ; de + hl -> hl
JMP DBIN2 ; next
DBIN4: CPI (' '-'0') AND 0FFH
JNZ ERRDB ;not blank
DBIN3: POP D ;restore
RET
ERRDB: LXI D,DBERR
CALL OUTPUT
POP D
JMP DBIN ;try again
ABORT: POP D
JMP DONE
DBERR: DB CR,LF,' unrecognizable digit on input -- try again :$'
;
;
;loop moves data from an address pointed to by de
; to an address pointed to by hl
; for b bytes.
;
LOOP: LDAX D
MOV M,A
INX D
INX H
DCR B
JNZ LOOP ;loop until done
RET
;
;
;
;
;the signon message...
;
SIGNON: DB CR,LF
DB FF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB LF
DB ' ESET prepares your AMPRO system to read, write, '
DB 'diskettes formatted for',CR,LF,' many other'
DB ' computers not supported by MULTIDSK '
DB CR,LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB ' Which drive do you wish to use as the "E" drive? '
DB '(A,B,C or D) $'
;
SELFMT: DB CR,LF
DB FF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB 'Defining TYPE byte for drive "E" ',CR,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB ' A) single sided, single density ',CR,LF
DB 0,0,0,0,0,0,0,0,0,0
DB ' B) single sided, double density ',CR,LF
DB 0,0,0,0,0,0,0,0,0,0
DB ' C) double sided, single density ',CR,LF
DB 0,0,0,0,0,0,0,0,0,0
DB ' D) double sided, double density ',CR,LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB ' Select a FORMAT or <ESC> to start over:$'
SELSEC: DB CR,LF
DB FF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF
DB 0,0,0,0,0,0,0,0,0,0
DB ' A) Continuous sector numbers -- ',CR,LF
DB 0,0,0,0,0,0,0,0,0,0
DB ' first sector on side 1 = last sector on side 0 + 1'
DB CR,LF,0,0,0,0,0,0,0,0,0
DB LF,0,0,0,0,0,0,0,0,0
DB ' B) Same sector numbers on both sides',CR,LF
DB 0,0,0,0,0,0,0,0,0,0
DB ' (normal method)',CR,LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF,0,0,0,0,0,0,0,0,0
DB ' Select the way sectors are numbered ',CR,LF
DB 0,0,0,0,0,0,0,0,0,0
DB ' or <ESC> to start over:$'
SELALL: DB CR,LF
DB FF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB ' A) 1k allocation blocks ',CR,LF
DB 0,0,0,0,0,0,0,0,0,0
DB ' B) 2k allocation blocks ',CR,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB ' Select the size of the allocation blocks',CR,LF
DB ' or type <ESC> to start over:$'
SELBPS: DB CR,LF
DB FF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB ' A) 128 byte sectors ',CR,LF
DB 0,0,0,0,0,0,0,0,0,0
DB ' B) 256 byte sectors ',CR,LF
DB 0,0,0,0,0,0,0,0,0,0
DB ' C) 512 byte sectors ',CR,LF
DB 0,0,0,0,0,0,0,0,0,0
DB ' D) 1024 byte sectors ',CR,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB ' Select the sector size or <ESC> to start over:$'
SELSPT: DB CR,LF
DB FF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB ' Defining Disk Parameter Block for drive "E"',CR,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB ' # of logical sectors per track (SPT):$'
SELBSH: DB CR,LF
DB ' block shift factor (BSH):$'
SELBLM: DB CR,LF
DB ' block mask (BLM):$'
SELEXM: DB CR,LF
DB ' extent mask / DB alloc. size (EXM):$'
SELDSM: DB CR,LF
DB ' maximum data block number - 1 (DSM):$'
SELDRM: DB CR,LF
DB ' maximum directory entries - 1 (DRM):$'
SELAL0: DB CR,LF
DB ' directory group allocation 0 (AL0):$'
SELAL1: DB CR,LF
DB ' directory group allocation 1 (AL1):$'
SELCKS: DB CR,LF
DB ' check size (CKS):$'
SELOFF: DB CR,LF
DB ' number of reserved tracks (OFF):$'
SELOK: DB CR,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB ' Are all entries in the dpb ok? $'
SELSKW: DB CR,LF
DB FF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0,LF
DB 0,0,0,0,0,0,0,0,0,0
DB ' A) 1,2,3,4,5 ',LF,CR
DB 0,0,0,0,0,0,0,0,0,0
DB ' B) 1,3,5,2,4 ',LF,CR
DB 0,0,0,0,0,0,0,0,0,0
DB ' C) 1,4,2,5,3 ',LF,CR
DB 0,0,0,0,0,0,0,0,0,0
DB ' D) 1,2,3,4,5,6,7,8 ',LF,CR
DB 0,0,0,0,0,0,0,0,0,0
DB ' E) 1,2,3,4,5,6,7,8,9 ',LF,CR
DB 0,0,0,0,0,0,0,0,0,0
DB ' F) 1,3,5,7,9,2,4,6,8 ',LF,CR
DB 0,0,0,0,0,0,0,0,0,0
DB ' G) 1,4,7,2,5,8,3,6,9 ',LF,CR
DB 0,0,0,0,0,0,0,0,0,0
DB ' H) 1,2,3,4,5,6,7,8,9,10 ',LF,CR
DB 0,0,0,0,0,0,0,0,0,0
DB ' I) 1,3,5,7,9,2,4,6,8,10 ',LF,CR
DB 0,0,0,0,0,0,0,0,0,0
DB ' J) 0,1,2,3,4,5,6,7,8,9 ',LF,CR
DB 0,0,0,0,0,0,0,0,0,0
DB ' K) 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 ',LF,CR
DB 0,0,0,0,0,0,0,0,0,0
DB ' L) 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 '
DB LF,CR,0,0,0,0,0,0,0,0,0,0
DB ' M) 1,3,5,7,9,11,13,15,17,2,4,6,8,10,12,14,16,18 '
DB LF,CR,0,0,0,0,0,0,0,0,0,0
DB ' N) 1,5,9,13,17,3,7,11,15,2,6,10,14,18,4,8,12,16 '
DB LF,CR,0,0,0,0,0,0,0,0,0,0
DB ' O) 1,6,11,16,3,8,13,18,5,10,15,2,7,12,17,4,9,14 '
DB LF,CR,0,0,0,0,0,0,0,0,0,0
DB ' P) 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 '
DB LF,CR,0,0,0,0,0,0,0,0,0,0
DB ' Z) none of the above ',LF,CR
DB 0,0,0,0,0,0,0,0,0,0,0,0,0
DB LF,CR,0,0,0,0,0,0,0,0,0,0
DB ' Select a skew table :$'
MKMSG: DB FF,'Enter the skew table -- enter zeros for '
DB 'the extra bytes ',CR,LF
DB '$'
PROMPT: DB CR,LF,' skw:$'
SKWOK: DB CR,LF,LF,' Are the skew table entries ok?$'
;ending message...
;
SGNOFF: DB CR,LF
DB FF
DB 0,0,0,0,0,0,0,0,0,0
DRSEL: DB LF,'Drive # is now the new format drive when you '
DB 'call it "E" .',CR,LF,'$'
;
;
;wrgdrv loads the wrong drive error message, prints
;it and exits to cp/m.
;
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
;
ERROR: DB 7,CR,LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF,'Wrong drive selected.',CR,LF
DB 'MULTIDSK can only be run from drive A, B, C, or D.'
DB CR,LF
DB 0,0,0,0,0,0,0,0,0,0
DB LF,'$'
;
;
SKWA: DB 1, 2, 3, 4, 5, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
SKWB: DB 1, 3, 5, 2, 4, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
SKWC: DB 1, 4, 2, 5, 3, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
SKWD: DB 1, 2, 3, 4, 5, 6, 7, 8, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
SKWE: DB 1, 2, 3, 4, 5, 6, 7, 8, 9, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
SKWF: DB 1, 3, 5, 7, 9, 2, 4, 6, 8, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
SKWG: DB 1, 4, 7, 2, 5, 8, 3, 6, 9, 0
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
SKWH: DB 1, 2, 3, 4, 5, 6, 7, 8, 9,10
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
SKWI DB 1, 3, 5, 7, 9, 2, 4, 6, 8,10
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
SKWJ DB 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
SKWK DB 1, 2, 3, 4, 5, 6, 7, 8, 9,10
DB 11,12,13,14,15,16, 0, 0, 0, 0
SKWL DB 1, 2, 3, 4, 5, 6, 7, 8, 9,10
DB 11,12,13,14,15,16,17,18, 0, 0
SKWM DB 1, 3, 5, 7, 9,11,13,15,17, 2
DB 4, 6, 8,10,12,14,16,18, 0, 0
SKWN DB 1, 5, 9,13,17, 3, 7,11,15, 2
DB 6,10,14,18, 4, 8,12,16, 0, 0
SKWO DB 1, 6,11,16, 3, 8,13,18, 5,10
DB 15, 2, 7,12,17, 4, 9,14, 0, 0
SKWP DB 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
DB 10,11,12,13,14,15,16,17, 0, 0
;
;
TYPE: DS 1 ;type byte
DPB: DS 15 ;disk parameter block
DRIVE: DS 1 ;drive selection
SKW: DS 32 ;skew table
ADDR: DS 2 ;"e" drive parms adr.
OLDSP: DS 2 ;room for old stack pointer
;
DS 010H ;16 level stack
STACK:
;
;
END BEGIN