;+----------------------------------------------------------------------+ ;| | ;| 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 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 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 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 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