|
|
DataMuseum.dkPresents historical artifacts from the history of: CP/M |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CP/M Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 25088 (0x6200)
Types: TextFile
Notes: Unread_Sectors
Names: »FORMAT5.ASM«
└─⟦1f6b46325⟧ Bits:30004393 CP/M-80 rel. 1 Utilities source disk
└─⟦this⟧ »FORMAT5.ASM«
TITLE 'CR8 DISK FORMATTING UTILITY'
PAGE 43
;******************************************************************************
; CHRISTIAN ROVSING A/S - CP/M DISK FORMATTING PROGRAM
;******************************************************************************
;
; HARD DISK FORMATTING PROGRAM FOR FORMATTING A SEGATE ST-506
; 5 1/4 INCH WINCHESTER DISK DRIVE. USE OF A MICRO COMPUTER
; SYSTEMS INC. MCS-9205 MULTIBUS WINCHESTER DISK DRIVE CONTROLLER
; IS REQUIRED.
; THE WINCHESTER DISK CONTROLLER FIRMWARE SUPPORTS A PARAMETER
; BLOCK FORMAT SIMILAR TO AN INTEL SBC 206 DISK CONTROLLER WITH
; A MODIFIED SET OF PARAMETERS THAT MAP TO THE CHARACTERISTICS OF
; THE SEAGATE 5 1/4 INCH WINCHESTER DRIVE. THE CONTROLLER / DRIVE
; CHARACTERISTICS ARE MAPPED AS FOLLOWS:
;
; 153 CYLINDERS
; 17 RECORDS PER CYLINDER
; FOUR HEADS/SURFACES
; 512 BYTE RECORDS
; CP/M MAPS LOGICAL DRIVES A: TO D: TO THE FOUR HEADS
;
; ACCESS AND CONTROL OF THE MINI FLOPPY WILL BE THROUGH THE DISK
; CONTROLLER CIRCUITRY OF THE CHRISTIAN ROVSING A/S MP2 BOARD.
; MINI FLOPPY FORMAT IS AS FOLLOWS:
;
; 77 TRACKS
; 16 RECORDS PER TRACK
; TWO HEADS/SIDES
; 256 BYTE RECORDS
; CP/M MAPS LOGICAL DRIVE E: TO THE MINI FLOPPY WITH
; ... ODD TRACKS ON HEAD 0 AND EVEN TRACKS ON HEAD 1
;
; SINCE THE HARD DISK CONTROLLER (MSC 9205) DOES NOT FORMAT WITH
; A USER SELECTABLE SECTOR FILL CHARACTER, THE FORMAT PROGRAM WILL
; WRITE AN APPROPIATE NUMBER OF HARD DISK TRACKS WITH A "0E5H" DATA
; PATTERN. THIS IS NECESSARY SO THAT THE CP/M DIRECTORY AREA LOOKS
; EMPTY TO CP/M 2.2. THE MINIFLOPPY FORMAT OPTION CAUSES THE COMPLETE
; DISK TO BE WRITTEN WITH SECTORS FILLED WITH 0E5H DATA.
;
PAGE
;******************************************************************************
;
;
;GENERAL EQUATES
;
CR EQU 0DH ;CARRIAGE RETURN CODE
LF EQU 0AH ;LINE FEED CODE
BS EQU 08H ;BACK SPACE CODE
BEL EQU 07H ;BELL RING CODE
ESC EQU 01BH ;ESCAPE CODE
TRUE EQU 0FFFFH ;TRUE CODE
FALSE EQU NOT TRUE ;FALSE CODE
;
;
;LOGICAL DRIVE CONFIGURATION SELECTION
;
ONEMINI EQU TRUE ;SET TO TRUE IF HARDWARE IS CONFIGURED
;...ONE MINI FLOPPY DRIVE. FALSE FOR
;...TWO DRIVES.
MINISEL EQU 04H ;BASE CP/M SELECT DESIGNATOR FOR MINI FLOPPY
;UNIT: 04H FOR DRIVE E:
; 05H FOR DRIVE F: ETC.
;
MAXDSK EQU 000 ;MAXIMUM DISK NUMBER
MAXTRK EQU 152 ;MAXIMUM TRACK OF ST506
MAXREC EQU 017 ;MAXIMUM RECORD NUMBER
MAXPLAT EQU 003 ;MAXIMUM DRIVE PLATTER NUMBER
MAXSUR EQU 000 ;MAXIMUM DISK SURFACE NUMBER
SECSIZ EQU 512 ;NUMBER OF BYTES IN DISK RECORD
LASTE5 EQU 006 ;LAST SURFACE CYLINDER TO FILL WITH E5
;
;
;DEFINE HARD DISK FORMAT FILLER CHARACTER
;
FMTCHAR EQU 0E5H ;CP/M FORMAT FILLER BYTE
;
;
;SPECIAL HARD DISK ACCESS INSTRUCTION DEFINITION
;
DIFMT EQU 02H ;FORMAT TRACK
;
PAGE
;
; UNIT/MODE REGISTER FOR DISK DRIVES SELECT
;
; BIT 7 - COMPENSATION "1" ENABLES FLOPPY WRITE PRECOMPENSATION
; BIT 6 - DRIVE TYPE "1" SELECTS CLOCKING FOR A 5 1/4 DRIVE
; "0" SELECTS FOR AN 8 INCH UNIT
; BIT 5 - DENSITY "1" SETS FOR MFM DOUBLE DENSITY
; "0" SELECTS FM SINGLE DENSITY
;
COMPEN EQU 080H ;WRITE COMPENSATION ENABLE
MINIEN EQU 040H ;MINI DRIVE ENABLE
DENSEL EQU 020H ;BIT MASK FOR DENSITY SELECT
;
FSPT EQU 016 ;NUMBER OF MINI FLOPPY SECTORS PER TRACK
FSECSIZ EQU 256 ;NUMBER OF BYTES IN A MINI FLOPPY SECTOR
FSECCDE EQU 001 ;FLOPPY SECTOR HEADER SIZE CODE
FTPS EQU 77 ;NUMBER OF FLOPPY TRACKS PER SIDE
;
;
;DEFINE MEMORY BASED I/O MODULE ENTRY POINTS
;
MODBASE EQU 0F800H ;SET JUMP TABLE EQUIVALENT ADDRESSES
;
INITSER EQU MODBASE+00 ;INITIALIZE SERIAL I/O PORTS
; ;(NO PARAMETERS)
SETCBAUD EQU MODBASE+03 ;SET CONSOLE I/O BAUD RATE FACTOR
; ;(HL) = COUNTER TIMER PARAMETER VALUE
SETLBAUD EQU MODBASE+06 ;SET LINE PRINTER I/O BAUD RATE FACTOR
; ;(HL) = COUNTER TIMER VALUE
SETLRMSK EQU MODBASE+09 ;SET LINE PRINTER SIO RECEIVER MASK VALUE
;(A) = LINE PRINTER SIO MASK BYTE
SETLRVAL EQU MODBASE+012 ;SET LINE PRINTER SIO RECEIVER POLL VALUE
; ;(A) = LINE PRINTER POLL VALUE
SETLTMSK EQU MODBASE+015 ;SET LINE PRINTER SIO TRANSMITTER MASK VALUE
; ;(A) = LINE PRINTER SIO MASK BYTE
SETLTVAL EQU MODBASE+018 ;SET LINE PRINTER SIO TRANSMITTER POLL VALUE
; ;(A) = LINE PRINTER SIO POLL VALUE BYTE
CONSTAT EQU MODBASE+021 ;GET CONSOLE STATUS
; ;RETURN (A)=00 FOR NOT READY INPUT
; ; (A)=FF FOR READY INPUT
CONIN EQU MODBASE+024 ;GO GET CONSOLE INPUT CHARACTER
; ;(A)=INPUT CONSOLE CHARACTER
CONOUT EQU MODBASE+027 ;PUT OUT CONSOLE CHAR
; ;(C)=CHARACTER TO OUTPUT
LPTSTAT EQU MODBASE+030 ;GET LINE PRINTER STATUS
; ;RETURN (A)=00 FOR NOT NEXT OUTPUT
; ; (A)=FF FOR READY OUTPUT
LPTIN EQU MODBASE+033 ;GO GET LINE PRINTER INPUT CHARACTER
; ;(A)=INPUT LPT SERIAL PORT CHARACTER
LPTOUT EQU MODBASE+036 ;PUT OUT LINE PRINTER CHARACTER
; ;(C)=LPT SERIAL OUTPUT CHARACTER
HUNIT EQU MODBASE+039 ;SELECT HARD DISK UNIT NUMBER
; ;(C)=UNIT NUMBER ON MSC 9205 CONTROLLER
HPLAT EQU MODBASE+042 ;SELECT HARD DISK PLATTER (HEAD) NUMBER
; ;(C)=HEAD SELECT NUMBER
HSURF EQU MODBASE+045 ;SELECT HARD DISK SURFACE(HEAD 2^2) NUMBER
; ;(C)=MSB OF HEAD NUMBER
HCYL EQU MODBASE+048 ;SELECT HARD DISK CYLINDER NUMBER
; ;(BC)=CYLINDER NUMBER
HREC EQU MODBASE+051 ;SELECT HARD DISK RECORD NUMBER
; ;(C)=RECORD NUMBER
HCNT EQU MODBASE+054 ;SELECT HARD DISK SECTOR COUNT
; ;(C)=RECORD COUNT
HBADDR EQU MODBASE+057 ;SET 9205 CONTROLLER DMA ADDRESS
; ;(BC)=16 BIT DATA BUFFER ADDRESS
HREST EQU MODBASE+060 ;RESTORE SELECTED HARD DISK UNIT
; ;(A) RETURNS ERROR CODE
HREAD EQU MODBASE+063 ;READ SELECTED SECTOR(S)
; ;(A) RETURNS ERROR CODE
HVERF EQU MODBASE+066 ;VERIFY SELECTED SECTOR(S)
; ;(A) RETURNS ERROR CODE
HWRIT EQU MODBASE+069 ;WRITE SELECTED SECTOR(S);
; ;(A) RETURNS ERROR CODE
HEXEC EQU MODBASE+072 ;EXECUTE SPECIAL COMMAND OF MSC 9205
; ;(C) ENTRY WITH MSC 9205 COMMAND
; ;(A) RETURNS ERROR CODE
HRESET EQU MODBASE+075 ;RESET HARD DISK CONTROLLER MSC 9205
; ;NO PARAMETERS
MUNIT EQU MODBASE+078 ;SELECT MINI FLOPPY UNIT NUMBER
; ;(C)=FLOPPY PHYSICAL UNIT NUMBER
MSURF EQU MODBASE+081 ;SELECT MINI FLOPPY SURFACE(HEAD) NUMBER
; ;(C)=FLOPPY SIDE NUMBER
MCYL EQU MODBASE+084 ;SELECT MINI FLOPPY CYLINDER(TRACK) NUMBER
; ;(C)=FLOPPY TRACK NUMBER
MREC EQU MODBASE+087 ;SELECT MINI FLOPPY RECORD NUMBER
; ;(C)=FLOPPY SECTOR NUMBER
MCNT EQU MODBASE+090 ;SELECT MINI FLOPPY PHYSICAL SECTOR COUNT
; ;(C)=MINI FLOPPY SECTOR COUNT
MSIZE EQU MODBASE+093 ;SELECT FLOPPY SECTOR SIZE (00)=256 BYTES
; ;(C)=MINI FLOPPY TRACK NUMBER
MBADDR EQU MODBASE+096 ;SET FLOPPY DISK DATA BUFFER ADDRESS
; ;(BC)=FLOPPY BUFFER ADDRESS
MREST EQU MODBASE+099 ;RESTORE SELECTED MINI FLOPPY UNIT
; ;(A)=RETURNS ERROR STATUS
MVERF EQU MODBASE+102 ;VERIFY (READ) SELECTED SECTOR
; ;(A)=RETURNS STATUS
MWRIT EQU MODBASE+105 ;WRITE SELECTED SECTOR
; ;(A)=RETURNED STATUS
MREAD EQU MODBASE+108 ;READ SELECTED SECTOR
; ;(A)=RETURNED STATUS
MWTRK EQU MODBASE+111 ;WRITE SELECTED FLOPPY TRACK
; ;(A)=RETURNED STATUS
MMODE EQU MODBASE+114 ;SET FLOPPY OPERATION MODE
; ;(C)=STANDARD MODE DEFINITION
MINST EQU MODBASE+117 ;FETCH CURRENT INSTRUCTION CODE
; ;(A)=RETURNED INSTRUCTION PATTERN
MMOFF EQU MODBASE+120 ;CHECK MINI FLOPPY MOTOR ON COUNT
; ;OUT TIMER
PAGE
;******************************************************************************
;
;SET START OF PROGRAM CP/M TRANSIENT PROGRAM AREA
;
ORG 0100H
;
DI ;DON'T ALLOW INTERRUPTS HERE
JMP START
;
;
;
;CP/M CONSOLE I/O INTERFACE ENTRY ROUTINES
;
; DIRECT CALLS TO THE BIOS ARE DONE
;
VECTAB EQU 0001H ;LOCATION IN MEMORY CONTAINING
;WARM BOOT VECTOR
CSTOFF EQU 0003H ;CONSOLE STAT OFFSET FROM WBOOT
CINOFF EQU 0006H ;CONSOLE INPUT OFFSET FROM WBOOT
COTOFF EQU 0009H ;CONSOLE OUTPUT OFFSET FROM WBOOT
;
;
;CONSOLE INPUT ROUTINE (RETURNS CHARACTER IN A REGISTER)
;
CI:
PUSH H ;SAVE REGISTERS
PUSH D
PUSH B
LHLD VECTAB ;GET POINTER BASE
LXI D,CINOFF ;GET OFFSET VALUE
DAD D
LXI D,CI1 ;PUT A RETURN BACK ONTO STACK
PUSH D
PCHL ;GO TO BIOS ROUTINE
CI1:
POP B
POP D ;RESTORE CALLERS REGS
POP H
RET
;
PAGE
;
;CONSOLE OUTPUT ROUTINE (OUTPUT CHARACTER FROM C REG)
;
CO:
PUSH H ;SAVE REGISTERS
PUSH D
PUSH B
LHLD VECTAB ;GET POINTER BASE
LXI D,COTOFF ;GET OFFSET VALUE
DAD D
LXI D,CO1 ;PUT A RETURN BACK ONTO STACK
PUSH D
PCHL ;GO TO BIOS ROUTINE
CO1:
POP B
POP D ;RESTORE CALLERS REGS
POP H
RET
;
;
;CONSOLE TERMINAL STATUS ROUTINE
; RETURNS A=00 IF NO CHARACTER PRESENT
; RETURNS A=FF IF CHARACTER PRESENT
;
CSTS:
PUSH H ;SAVE REGISTERS
PUSH D
PUSH B
LHLD VECTAB ;GET POINTER BASE
LXI D,CSTOFF ;GET OFFSET VALUE
DAD D
LXI D,CSTS1 ;PUT A RETURN BACK ONTO STACK
PUSH D
PCHL ;GO TO BIOS ROUTINE
CSTS1:
POP B
POP D ;RESTORE CALLERS REGS
POP H
RET
;
PAGE
;COMPARE DOUBLE REGISTER PAIRS (DE) TO (HL) AND RETURN
;FLAGS SIMILAR TO STANDARD CMP B INSTRUCTION. IE (A) CORRESPONDS
;TO (DE) AND (B) CORRESPONDS TO (HL).
;
CDEHL:
MOV A,D ;CHECK HIGH BYTES FIRST
CMP H
RNZ ;RETURN IF HIGH BYTES SET FLAGS
MOV A,E
CMP L ;CHECK LOW BYTES
RET
;
;******************************************************************************
;
START: ;BEGINNING OF PROGRAM
LXI SP,STCKK ;MAKE OURSELVES A STACK
;
SIGNON: ;SEND HELLO TO CRT
CALL CRLF
CALL CRLF
LXI D,STRMSG
CALL CRTMS
JMP MONITOR ;GO TO MONITOR ROUTINE
;
;
;FORMAT PROGRAM MESSAGES
;
STRMSG:
DB ESC,'Æ7;2m'
DB 'CHRISTIAN ROVSING A/S - CR8 DISK FORMATTING UTILITY ',CR,LF
DB 'FOR SEAGATE ST-506 HARD DISK / TANDON TM100-4 FLOPPY',CR,LF
DB ESC,'Æm'
DB CR,LF,CR,LF
DB ' SELECT OPTION -',CR,LF
DB ' A) FORMAT HARD DISK A:',CR,LF
DB ' B) FORMAT HARD DISK B:',CR,LF
DB ' C) FORMAT HARD DISK C:',CR,LF
DB ' D) FORMAT HARD DISK D:',CR,LF
DB ' E) FORMAT MINI FLOPPY E:',CR,LF
;
PAGE
;
IF NOT ONEMINI
DB ' F) FORMAT MINI FLOPPY F:',CR,LF
ENDIF
;
DB CR,LF
;
IF ONEMINI
DB ' OPTION (A,B,C,D, OR E) = ','#'
ENDIF
;
IF NOT ONEMINI
DB ' OPTION (A,B,C,D,E, OR F) = ','#'
ENDIF
;
;
;******************************************************************************
;
;
MONITOR:
CALL CECHO ;GET OPERATOR ENTRY CHARACTER
ANI 05FH ;CONVERT TO UPPER CASE
SUI 'A' ;ADJUST TO ZERO VALUE
CPI 04H
;
JC HDFMT ;GO DO HARD UNIT FORMAT
;
CPI 04H ;CHECK FOR MINI FLOPPY E:
JZ MFFMT ;IF SO GO DO MINI FORMAT
;
IF NOT ONEMINI
CPI 05H ;CHECK FOR MINI FLOPPY F:
JZ MFFMT
ENDIF
;
JMP ERRR ;OPTION SELECT ERROR
;
PAGE
;
;HERE IF WE WANT TO FORMAT A HARD DISK UNIT
;
HDFMT:
PUSH PSW ;SAVE CP/M DRIVE NUMBER
MOV C,A
;
CALL HPLAT ;GO SET HEAD/PLATTER NUMBER FOR CP/M DRIVE
MVI C,0
CALL HSURF
;
LXI D,GOMS1 ;PRINT ARE YOU SURE MESSAGE
CALL CRTMS
POP PSW
ADI 'A' ;SET FOR ASCII PRINTING OF DRIVE
MOV C,A
CALL CO
LXI D,GOMS2
CALL CRTMS
CALL CECHO ;GET OPERATOR INPUT
ANI 05FH ;CONVERT RESPONSE TO UPPER CASE
CPI 'Y'
JNZ ENDCHK ;IF NOT READY THEN GO TO END CHECK
;
LXI D,GOMS4 ;PRINT SECOND MAKE SURE MESSAGE
CALL CRTMS
CALL CECHO ;GET OPERATOR RESPONSE
ANI 05FH ;UPPER CASE
CPI 'G' ;G FOR GO TO BE SURE
JNZ ENDCHK ;BALE OUT IF NOT REALLY READY
;
CALL CRLF
;
CALL FMDSK ;GO FORMAT THAT SELECTED UNIT
CALL E5FILL ;GO FILL TRACKS WITH 'E5'S
JMP FMTDONE
;
PAGE
;
;HERE IF TO FORMAT A DISKETTE IN A MINI FLOPPY UNIT
;
MFFMT:
PUSH PSW
SUI MINISEL ;SET MINI FLOPPY BASE ADDRESS TO ZERO
MOV C,A ;SET MINI FLOPPY UNIT IN IOPB
CALL MUNIT
MVI C,COMPEN+MINIEN+DENSEL
CALL MMODE ;SET PROPER MINI FLOPPY MODE
LXI D,GOMS3 ;PRINT READY MESSAGE FOR FLOPPY
CALL CRTMS
POP PSW
ADI 'A' ;SET FOR ASCII UNIT NUMBER PRINTING
MOV C,A
CALL CO ;PRINT SELECTED MINI DESIGNATOR
LXI D,GOMS2
CALL CRTMS
CALL CECHO ;GET OPERATOR RESPONSE
ANI 05FH ;UPPER CASE
CPI 'Y'
JNZ ENDCHK ;END PROCESS IF NOT READY
;
LXI D,GOMS4 ;PRINT SECOND MAKE SURE MESSAGE
CALL CRTMS
CALL CECHO ;GET OPERATOR RESPONSE
ANI 05FH ;UPPER CASE
CPI 'G' ;G FOR GO TO BE SURE
JNZ ENDCHK ;BALE OUT IF NOT REALLY READY
;
CALL CRLF
CALL FLOPFMT ;GO FORMAT SELECTED MINI FLOPPY
;
FMTDONE:
LXI D,FORDMS ;PRINT FORMAT COMPLETE MESSAGE
CALL CRTMS
JMP ENDCHK
;
PAGE
;
GOMS1:
DB CR,LF,'READY TO FORMAT HARD DISK DRIVE ','#'
GOMS2:
DB ': (Y/N) ','#'
GOMS3:
DB CR,LF,'HAS DISKETTE BEEN INSTALLED IN DRIVE ','#'
GOMS4:
DB CR,LF,'ALL INFORMATION ON DISK WILL BE ERASED. '
DB CR,LF,'TYPE "G" TO FORMAT OR "N" TO STOP (G/N) ','#'
FORDMS:
DB CR,LF,'FORMATTING COMPLETE',CR,LF,'#'
;
;
;******************************************************************************
;
; OPERATION DONE OR ERROR EXIT POINT
;
;
ENDCHK:
LXI D,DONMSG ;PRINT DONE MESSAGE
CALL CRTMS
CALL CECHO ;GET OPERATOR ANSWER
ANI 05FH ;CONVERT RESPONSE TO UPPER CASE
CPI 'Y' ;SEE IF HE WANTS TO GO AGAIN
JZ SIGNON ;GO START ALL OVER AGAIN
;
CALL CRLF
LHLD VECTAB ;GET WARM BOOT JUMP ADDRESS
PCHL ;GO TO WARM BOOT
;
;
DONMSG:
DB CR,LF,'MORE DISKS TO BE FORMATTED? (Y/N) ','#'
;
PAGE
;******************************************************************************
;
; GENERAL PURPOSE I/O SUBROUTINES
;
;
CRLF: ;ROUTINE TO DO CONSOL CR AND LF
MVI C,CR
CALL CO
MVI C,LF
CALL CO
RET
;
;
;
CECHO: ;ROUTINE TO GET AND ECHO A CHARACTER
CALL CI
MOV C,A
PUSH PSW
CALL CO
POP PSW
ANI 07FH ;GET RID OF PARITY
RET
;
;
;
NBL: ;ROUTINE TO CONVERT A BYTE TO A HEX NIBBLE
SUI '0'
RC
ADI 0E9H
RC
ADI 06H
JP NIO
ADI 07H
RC
NIO:
ADI 10
ORA A
RET
;
PAGE
;
BYTEC: ;ROUTINE TO GET A HEX BYTE IN A
CALL CECHO ;GET CHARACTER
BYTC1:
CALL NBL ;CONVERT TO HEX
JC ERRR ;TO ERROR ROUTINE
RLC
RLC
RLC
RLC
PUSH PSW ;SAVE 1ST ENTRY
CALL CECHO ;GET 2ND CHARACTER
CALL NBL ;CONVERT IT TO HEX
JC ERRR
POP B ;RECOVER 1ST RESULT
ORA B ;COMBINE WITH 2ND
RET
;
CONI: ;ROUTINE TO GET A 1 BYTE PARAMETER
PUSH B
CALL BYTEC
POP B
RET
;
PARAM: ;ROUTINE TO INPUT 4 HEX CHARACTERS
LXI H,0
PARM1: CALL CECHO ;GET INPUT
CPI 0DH ;LOOK FOR RETURN
RZ
DAD H
DAD H
DAD H
DAD H
JC ERRR
CALL NBL ;CONVERT ENTRY TO HEX
JC ERRR
ORA L
MOV L,A
JMP PARM1 ;GO FOR NEXT CHARACTER
;
PAGE
;
HLCO1: ;ROUTINE TO PRINT CONTENTS OF (HL)
MOV A,H
CALL BYTEO
MOV A,L
CALL BYTEO
RET
;
;
;
BYTEO: ;ROUTINE TO OUTPUT A HEX BYTE TO THE CONSOLE
PUSH PSW
CALL BYTO1
MOV C,A
CALL CO
POP PSW
CALL BYTO2
MOV C,A
CALL CO
RET
;
BYTO1:
RRC
RRC
RRC
RRC
BYTO2:
ANI 0FH
CPI 0AH
JM BYTO3
ADI 07H
BYTO3:
ADI 030H
RET
;
PAGE
;
;ERROR ON ENTRY OF OPERATOR PARAMETERS
;
ERRR:
MVI C,'?' ;OUTPUT UNKNOWN PARAMETER
CALL CO
CALL CRLF
JMP ENDCHK ;GO TO OPERATOR END CHECK SEQUENCE
;
;
;******************************************************************************
;
;
;CRTMS - ROUTINE TO DISPLAY A MESSAGE ON THE CRT. REGISTERS D AND E
; CONTAIN THE MESSAGE POINTER. END OF MESSAGE IS INDICATED BY
; A "#" CHARACTER.
;
CRTMS: ;ROUTINE PRINTS MESSAGE ON CRT
LDAX D
CPI '#' ;END MESSAGE MARKER
RZ ;YES - RETURN
MOV C,A
CALL CO
INX D
JMP CRTMS
;
;
;******************************************************************************
;
; SHORT DELAY ROUTINE FOR TIME DELAYS OF (A REG) X 1 MSEC
;
;
SDLY:
MVI L,070H ;ONE MILLISECOND TIME FACTOR
DCR L ;..COUNT IN (A)
JNZ $-1
DCR A
JNZ SDLY
RET
;
PAGE
;******************************************************************************
;
; FORMAT WHOLE PLATTER OF 506 DRIVE DIRECT FIRMWARE
;
;
FMDSK:
CALL HREST ;RESTORE DRIVE AS REQUIRED BY CTLR
ORA A ;CHECK I/O STATUS
JNZ RESPERR
;
LXI H,0000H ;START WITH CYLINDER ZERO
SHLD CURCYL
FMCYL:
LHLD CURCYL ;SPECIFY CURRENT CYLINDER
MOV C,L ;SET IOPB FOR CYLINDER
MOV B,H
CALL HCYL
CALL FMEXEC ;GO EXECUTE FORMAT FOR THIS TRACK
LHLD CURCYL
INX H ;INCREMENT CYLINDER NUMBER
SHLD CURCYL
LXI D,MAXTRK+1 ;CHECK IF DONE WITH LAST CYLINDER
XCHG
CALL CDEHL ;DOUBLE COMPARE
JNZ FMCYL ;GO DO NEXT CYLINDER IF NOT
RET
;
;
;EXECUTE FORMAT INSTRUCTION FOR SELECTED CYLINDER
;
FMEXEC:
MVI C,DIFMT ;SETUP FORMAT INSTRUCTION
CALL HEXEC ;GO EXECUTE THIS COMMAND
ORA A
JNZ RESPERR ;BALE OUT IF ERROR
RET
;
PAGE
;******************************************************************************
;
; MINI FLOPPY FORMAT ROUTINE WILL FORMAT ALL TRACKS ON BOTH
; SIDES OF A MINI FLOPPY DISKETTE. THE TRACK NUMBERS ARE CYCLED
; TO TWI_UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD_OR
;
XRA A ;SET INITIAL TRACK TO ZERO
STA CURCYL
FLFMTLP:
MVI C,01H ;SET SECTOR DEFAULT TO 1
CALL MREC
LDA CURCYL ;TURN TRACK TO SIDE/PHYS TRACK
PUSH PSW
ANI 01H ;FIND OUT WHAT THE SIDE NUMBER IS
MOV C,A
CALL MSURF ;SET MINI HEAD NUMBER
POP PSW
ORA A
RAR ;DIVIDE TRACK BY 2
MOV C,A ;SEND PHYSICAL TRACK TO IOPB
CALL MCYL
;
CALL TRKFILL ;GO BUILD THE IMAGE FOR THIS TRACK
LXI B,DATBF ;SET FLOPPY I/O POINTER ADDRESS
CALL MBADDR
MVI C,00H ;SET BLOCK WRITE SIZE
CALL MSIZE
MVI C,25 ;SET NUMBER OF BLOCKS TO WRITE
CALL MCNT
CALL MWTRK ;GO ATTEMPT TO WRITE THE TRACK
ORA A
JNZ FLPERR ;IF WRITE ERROR THEN QUIT
;
MVI C,01H ;SET START SECTOR FOR VERIFY
CALL MREC
;
MVI C,00 ;SET FLOPPY SIZE OF SECTOR
CALL MSIZE ;TO NUMBER OF UNITS
MVI C,16 ;SET NUMBER OF SECTORS TO READ
CALL MCNT
CALL MREAD ;GO READ ALL SECTORS OF TRACK
ORA A
JNZ FLPERR ;GO REPORT ERROR IF SECTORS COULDN'T BE READ
;
LXI D,TRKMSG ;PRINT TRACK REPORT MESSAGE
CALL CRTMS
LDA CURCYL ;..AND JUST COMPLETED TRACK NUMBER
CALL BYTEO
;
LDA CURCYL ;SET FOR NEXT TRACK NUMBER
INR A
STA CURCYL ;SAVE OFF FOR I/O ROUTINE
CPI (FTPS*2)+1 ;CHECK IF WEVE DONE ALL TRACKS
JNZ FLFMTLP
;
RET
;
;MINI FLOPPY FORMAT TR_UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD_K FORMAT IMAGE. VARIABLES REQUIRED TO BE SETUP
; BEFORE ENTRY ARE "FLPTRK" WITH THE TRACK NUMBER AND
; "FSIDE" WITH THE SIDE NUMBER.
;
TRKFILL:
MVI D,01H ;START SECTOR COUNT
MVI E,FSPT ;MAX NUMBER OF SECTORS ON TRACK
LXI H,DATBF ;POINT TO BUFFER FOR IMAGE BULID
;
;
;FIXUP PREINDEX GAP 4A
;
MVI B,80 ;PREINDEX FILL 80 BYTES OF "4E"
MVI A,04EH
PREIND:
MOV M,A ;PUT 4E INTO BUFFER
INX H
DCR B ;CHECK BYTE COUNT
JNZ PREIND
;
MVI B,12 ;SYNC 12 BYTES OF "00"
MVI A,00H
PREIND1:
MOV M,A ;PUT 00 INTO BUFFER
INX H
DCR B ;CHECK BYTE COUNT
JNZ PREIND1
;
;
;WRITE INDEX ADDRESS MARK ONTO TRACK HERE
;
MVI B,03 ;THREE BYTES OF "F6"
MVI A,0F6H
IAM:
MOV M,A ;PUT F6 INTO BUFFER
INX H
DCR B ;CHECK BYTE COUNT
JNZ IAM
;
;
;WRITE INDEX MARK ITSELF
;
MVI M,0FCH ;ONE BYTE OF "F6"
INX H
;
;
;WRITE POST INDEX GAP 1
;
MVI B,50 ;GAP 1 50 BYTES OF "4E"
MVI A,04EH
POSTID:
MOV M,A ;PUT 4E INTO BUFFER
INX H
DCR B ;CHECK BYTE COUNT
JNZ POSTID
;
;
;PRE SECTOR ID SYNC (ALSO ENTRY POINT TO DO NEXT SECTOR)
;
SECTOR:
MVI B,012 ;12 BYTES OF "00"
MVI A,00H
SECSYNC:
MOV M,A ;PUT THE 00 INTO BUFFER
INX H
DCR B ;CHECK THE BYTE COUNT
JNZ SECSYNC
;
;
;WRITE SECTOR ID ADDRESS MARK
;
MVI B,03H ;THREE BYTES OF "F5"
MVI A,0F5H
SIDAM:
MOV M,A ;PUT F5 INTO BUFFER
INX H
DCR B ;CHECK THAT BYTE COUNT
JNZ SIDAM
;
;
;PUT SINGLE BYTE SECTOR ID MARK
;
MVI M,0FEH ;ONE BYTE "FE"
INX H
;
;
;WRITE TRACK NUMBER INTO ID FIELD
;
LDA CURCYL ;GET TRACK NUMBER VARIABLE
PUSH PSW
ORA A
RAR ;DIVIDE TRACK BY 2
MOV M,A
INX H
;
;
;WRITE SIDE NUMBER INTO THE ID FIELD
;
POP PSW
ANI 01H ;FIND OUT WHAT THE SIDE NUMBER IS
MOV M,A
INX H
;
;
;PUT SECTOR NUMBER INTO THE ID FIELD
;
MOV M,D ;GET SECTOR NUMBER FROM (D)
INX H
;
;
;PUT DATA FIELD LENGTH BYTE INTO THE ID FIELD
;
MVI M,FSECCDE ;02 FOR 512 BYTE SECTORS
;01 FOR 256 BYTE SECTORS
;00 FOR 128 BYTE SECTORS
INX H
;
;
;SET CODE TO WRITE TWO CRC'S ONTO THE TRACK
;
MVI M,0F7H ;ONE BYTE "F7"
INX H
;
;
;FILL GAP 2 BEFORE DATA FIELD
;
MVI B,22 ;22 BYTES OF "4E"
MVI A,04EH
PREDAT:
MOV M,A ;PUT THE 4E INTO BUFFER
INX H
DCR B ;CHECK THAT BYTE COUNT
JNZ PREDAT
;
;
;FILL DATA FIELD SYNC AREA
;
MVI B,12 ;12 BYTES OF "00"
MVI A,00H
PREDAT1:
MOV M,A ;PUT 00 INTO BUFFER
INX H
DCR B ;CHECK THAT BYTE COUNT ONE MORE TIME...
JNZ PREDAT1
;
;
;WRITE DATA ADDRESS MARK
;
MVI B,03 ;THREE BYTES OF "F5"
MVI A,0F5H
DAM:
MOV M,A ;PUT THE F5 INTO BUFFER
INX H
DCR B ;BYTE COUNT CHECK
JNZ DAM
;
;
;ONE BYTE DATA FIELD MARK
;
MVI M,0FBH ;ONE BYTE OF 0FBH
INX H
;
;
;FILL DATA FIELD WITH 0E5H DATA
;
LXI B,FSECSIZ ;GET SECTOR BYTE COUNT
DFILL:
MVI M,0E5H ;PUT E5 INTO BUFFER
INX H
DCX B ;CHECK BYTE COUNT
MOV A,B
ORA C
JNZ DFILL
;
;
;SET CODE TO WRITE DATA FIELD CRC'S
;
MVI M,0F7H ;ONE BYTE CRC CODE (F7)
INX H
;
;
;END SECTOR FILL
;
MVI B,54 ;54 BYTES OF "4E"
MVI A,04EH
DATGAP:
MOV M,A ;PUT THE 4E INTO BUFFER
INX H
DCR B
JNZ DATGAP
;
;
;CHECK IF DONE WITH LAST SECTOR IMAGE
;
INR D ;GET SECTOR NUMBER READY FOR NEXT LOOP
DCR E ;DEC TOTAL SECTOR COUNT
JNZ SECTOR ;OFF TO DO THAT AGAIN FOR NEXT SECTOR
;
;
;END TRACK FILL
;
LXI B,2300 ;FILL TO END OF TRACK WITH "4E"
ETFILL:
MVI M,04EH ;PUT THE "4E" INTO BUFFER
INX H
DCX B ;CHECK THE BYTE COUNT
MOV A,B
ORA C
JNZ ETFILL
;
RET ;BUFFER NOW SETUP
;
PAGE
;************************************************************************
;
; TRACK 2 0E5H DATA FILLING SUBROUTINE TO SET THE CP/M
; DIRECTORY TRACK RIGHT FOR THE EMPTY FILLER BYTES
;
E5FILL:
CALL FILL ;PUT DATA INTO BUFFER
LXI H,0002H ;SET START CYLINDER 2
E5NTRK:
PUSH H ;SAVE CURRENT FILL CYLINDER NUMBER
MOV C,L ;SET IOPB CYLINDER
MOV B,H
CALL HCYL
MVI C,01 ;START WITH FIRST RECORD
E5FLP:
PUSH B ;SAVE RECORD COUNTER
CALL HREC ;PUT RECORD INTO IOPB
LXI B,DATBF ;POINT CONTROLLER TO DATA BUFFER
CALL HBADDR
CALL HWRIT ;WRITE IT
ORA A
JNZ RESPERR ;BALE OUT IF ERROR
CALL HVERF ;VERIFY THAT ITS RIGHT
ORA A
JNZ RESPERR ;BALE OUT IF ERROR
;
POP B
INR C ;INCREMENT RECORD NUMBER
MOV A,C ;CHECK IF DONE
CPI MAXREC+1
JNZ E5FLP
;
POP H ;GET BACK JUST DONE CYLINDER NUMBER
INX H ;GET READY FOR NEXT ONE
LXI D,LASTE5+1 ;SEE IF DONE WITH LAST TRACK
CALL CDEHL ;GO COMPARE
JNZ E5NTRK ;NOT DONE THEN GO DO NEXT TRACK
;
RET ;GO BACK TO THOSE WHOM CALLED US
;
PAGE
;
;DATA BUFFER FILL SUBROUTINE FOR THE FORMAT PROGRAM
;
FILL:
MVI D,FMTCHAR ;PUT FILL BYTE IN (D)
LXI H,DATBF ;POINT TO FILL AREA
LXI B,SECSIZ ;GET BUFFER SIZE
FILLP:
MOV M,D ;PUT BYTE IN
INX H ;INC BUFFER POINTER
DCX B ;DECREASE BYTE COUNT
MOV A,B
ORA C
JNZ FILLP ;DONE YET?
RET
;
;******************************************************************************
;SHORT ROUTINE TO REPORT ERROR CODE ON OPERATION TO THE CONSOLE
;FOR A SIMPLE DEGREE OF FAULT ISOLATION. "STCHK" ERROR CODE IS REPORTED
;
;ENTRY POINT RESPERR: IS USED FOR HARD DISK WHILE
;ENTRY POINT FLPERR: IS USED FOR MINI FLOPPY ERROR REPORTING
;
RESPERR: ;ENTRY POINT FOR HARD DISK ERRORS
PUSH PSW ;SAVE THE ERROR CODE
LXI D,ERRMSG ;PRINT ERROR MESSAGE
JMP ERRFIN ;GO FINISH ERROR ROUTINE
FLPERR: ;ENTRY POINT FOR FLOPPY DISK ERRORS
PUSH PSW
LXI D,ERRMS2 ;PRINT MINI FLOPPY ERROR MESSAGE
ERRFIN:
CALL CRTMS
POP PSW
CALL BYTEO ;OUTPUT ERROR CODE
LXI D,ERRMS1 ;PRINT REST OF MESSAGE
CALL CRTMS
JMP ENDCHK
;
PAGE
;
ERRMSG:
DB CR,LF,CR,LF,BEL,BEL,' *** HARD DISK I/O ERROR - CODE(','#'
;
ERRMS1:
DB ') ***',CR,LF,'#'
;
ERRMS2:
DB CR,LF,CR,LF,BEL,BEL,' *** MINI FLOPPY DISK I/O '
DB 'ERROR - CODE(','#'
;
;
;******************************************************************************
;
; DATA PARAMETER STORAGE FOR DISK CONTROLLER
;
;
;
CURCYL:
DW 0 ;CURRENT CYLINDER CHECK
;
;
;FORMAT PROGRAM STACK AREA
;
DS 80 ;SETUP STORAGE FOR 40 LEVEL STACK
STCKK EQU $
;
;
;
;LOCAL RECORD BUFFER AND MINI FLOPPY TRACK IMAGE BUFFER
;
DATBF:
DS SECSIZ ;DATA RECORD BUFFER
;
END
;
;+++...END OF FILE
«eof»