DataMuseum.dk

Presents historical artifacts from the history of:

CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦69b9df2b2⟧ TextFile

    Length: 11264 (0x2c00)
    Types: TextFile
    Names: »FORMAT86.A86«

Derivation

└─⟦98758eebd⟧ Bits:30004394 CP/M-86 sources for adaptation to CR8 release 1
    └─ ⟦this⟧ »FORMAT86.A86« 

TextFile


	TITLE '8088 FLOPPY FORMATTING'
	PAGESIZE 56
	PAGEWIDTH 111

;	AUTHOR:	LARS WINTHER			DATE: 830204
;******************************************************************************
;	CHRISTIAN ROVSING A/S - CR8 FLOPPY DISK FORMATTING PROGRAM
;******************************************************************************

;
;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
;
;
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
;
SYSINT	EQU	224		;SOFTWARE INTERRUPT TO OPERATING SYSTEM
IOINT	EQU	222		;SOFTWARE INTERRUPT TO SIMPLE I/O SYSTEM
CIN	EQU	01		;CONSOLE INPUT REQUEST TYPE
COUT	EQU	02		;CONSOLE OUTPUT REQUEST TYPE
;
	EJECT
;
;FLOPPY DISK INTERFACE DRIVER CONSTANTS
;
COMOPC	EQU	09H		;COMMAND OPCODE
RESTORE	EQU	00H		;RESTORE COMMAND CODE
READFD	EQU	01H		;READ DISK COMMAND CODE
WRITEFD	EQU	02H		;WRITE DISK COMMAND CODE
WRTRACK	EQU	03H		;FORMAT TRACK COMMAND CODE 
;
CPUSYNC	EQU	0FDH		;FLOPPY DRIVER SYNCHRONIZATION ERROR
;
;
;SIMPLE IO FUNCTIONS
;
MUNIT	EQU	18		;SET MINI FLOPPY UNIT NUMBER
MSURF	EQU	19		;SET MINI FLOPPY HEAD NUMBER
MCYL	EQU	20		;SET CYLINDER NUMBER
MREC	EQU	21		;SET SECTOR NUMBER
MCNT	EQU	22		;SET SECTOR COUNT
MSIZE	EQU	23		;SET SECTOR SIZE
MBADDR	EQU	24		;SET BUFFER OFFSET
MSEG	EQU	25		;SET BUFFER SEGMENT
MREST	EQU	26		;RESTORE DRIVE TO TRACK 0
MREAD	EQU	29		;DISK READ
MWTRK	EQU	30		;WRITE TRACK
;
	EJECT
;
	CSEG
	ORG	0
;
	JMPS	START
;
CI:
	MOV	CL,CIN
	INT	SYSINT
	RET
;
CO:
	MOV	DL,CL
	MOV	CL,COUT
	INT	SYSINT
	RET
;
START:
	MOV	SPOFF,SP
	MOV	SPSEG,SS	;SAVE ORIGINAL STACK
	MOV	AX,DS
	MOV	SS,AX
	MOV	SP,OFFSET STCKK	;SETUP LOCAL STACK
;
SIGNON:				;SEND HELLO TO CRT
	MOV	DX,OFFSET STRMSG
	CALL	CRTMS
	CALL	CI
	AND	AL,05FH		;UPPER CASE
	CMP	AL,'G'		;G FOR GO TO BE SURE
	JZ	FLOPFMT		;GO FORMAT DISK
	JMP	ENDCHK		;BALE OUT IF NOT REALLY READY
;
	EJECT
;************************************************************************
;
;	MINI FLOPPY FORMAT ROUTINE WILL FORMAT ALL TRACKS ON BOTH 
;	SIDES OF A MINI FLOPPY DISKETTE. THE TRACK NUMBERS ARE CYCLED
;	TO TWICE THE NUMBER OF TRACKS PER SIDE SO THAT THE LEAST
;	SIGNIFICANT BIT BECOMES THE SIDE SELECT BIT FOR THE DOUBLE
;	HEADED TANDON TM100 96 TPI DRIVE.
;
FLOPFMT:
	CALL	CRLF
	MOV	CL,0		;SET MINI FLOPPY UNIT IN IOPB
	MOV	SI,MUNIT
	INT	IOINT
;
	MOV	SI,MREST
	INT	IOINT		;GO EXECUTE RESTORE
;
	OR	AL,AL		;CHECK RESTORE STATUS
	JZ	FL1
	JMP	FLPERR		;OUT IF ERROR
FL1:
	MOV	CURCYL,0	;SET INITIAL TRACK TO ZERO
FLFMTLP:
	MOV	RETRY,3		;SETUP RETRY COUNT FOR TRACK WRITE
RTRYLP:
	MOV	CL,01H		;SET SECTOR DEFAULT TO 1
	MOV	SI,MREC
	INT	IOINT
;
	MOV	CL,CURCYL	;TURN TRACK TO SIDE/PHYS TRACK
	AND	CL,01H		;FIND OUT WHAT THE SIDE NUMBER IS
	MOV	SI,MSURF	;SET MINI HEAD NUMBER
	INT	IOINT
;
	MOV	CL,CURCYL
	SHR	CL,1		;DIVIDE TRACK BY 2
	MOV	SI,MCYL
	INT	IOINT
;
	CALL	TRKFILL		;GO BUILD THE IMAGE FOR THIS TRACK 
	MOV	CX,OFFSET DATBF	;SET FLOPPY I/O POINTER ADDRESS
	MOV	SI,MBADDR
	INT	IOINT
;
	MOV	CX,DS
	CMP	CX,1000H
	JNB	NOADJ
	ADD	CX,1000H
NOADJ:
	MOV	SI,MSEG
	INT	IOINT
;
	MOV	CL,00H		;SET BLOCK WRITE SIZE
	MOV	SI,MSIZE
	INT	IOINT
;
	MOV	CL,25		;SET NUMBER OF BLOCKS TO WRITE
	MOV	SI,MCNT
	INT	IOINT
;
	MOV	SI,MWTRK
	INT	IOINT		;GO FORMAT TRACK
;
	OR	AL,AL
	JZ	FL2
;
	DEC	RETRY
	JNZ	RTRYLP
;
	JMP	FLPERR		;IF WRITE ERROR THEN QUIT
FL2:
	MOV	CL,16		;SET NUMBER OF SECTORS TO READ
	MOV	SI,MCNT
	INT	IOINT
;
	MOV	SI,MREAD
	INT	IOINT		;GO EXECUTE FLOPPY READ
;
	OR	AL,AL
	JZ	FL3
;
	DEC	RETRY
	JNZ	RTRYLP
;
	JMP	FLPERR		;GO REPORT ERROR IF SECTORS COULDN'T BE READ
FL3:
	MOV	DX,OFFSET TRKMSG;PRINT TRACK REPORT MESSAGE
	CALL	CRTMS
	MOV	AL,CURCYL	;..AND JUST COMPLETED TRACK NUMBER
	CALL	BYTEO
;
	MOV	AL,CURCYL	;SET FOR NEXT TRACK NUMBER
	INC	AL
	MOV	CURCYL,AL	;SAVE OFF FOR I/O ROUTINE
	CMP	AL,(FTPS*2)	;CHECK IF WEVE DONE ALL TRACKS
	JZ	FMTDONE
	JMP	FLFMTLP
FMTDONE:
	MOV	DX,OFFSET FORDMS;PRINT FORMAT COMPLETE MESSAGE
	CALL	CRTMS
	JMP	ENDCHK
;
;*************************************************************************
;
;SHORT ROUTINE TO REPORT ERROR CODE ON OPERATION TO THE CONSOLE
;FOR A SIMPLE DEGREE OF FAULT ISOLATION. 
;
;
FLPERR:				;ENTRY POINT FOR FLOPPY DISK ERRORS
	PUSH	AX
	MOV	DX,OFFSET ERRMS2;PRINT MINI FLOPPY ERROR MESSAGE
ERRFIN:
	CALL	CRTMS
	POP	AX
	CALL	BYTEO		;OUTPUT ERROR CODE
	MOV	DX,OFFSET ERRMS1;PRINT REST OF MESSAGE
	CALL	CRTMS
;
	EJECT
;**************************************************************************
;
;	OPERATION DONE OR ERROR EXIT POINT
;
;
ENDCHK:
	MOV	DX,OFFSET DONMSG;PRINT DONE MESSAGE
	CALL	CRTMS
	CALL	CI		;GET OPERATOR ANSWER
	AND	AL,05FH		;CONVERT RESPONSE TO UPPER CASE
	CMP	AL,'Y'		;SEE IF HE WANTS TO GO AGAIN
	JNZ	FEXIT		;EXIT IF NOT
	JMP	SIGNON		;GO START ALL OVER AGAIN
FEXIT:
	CALL	CRLF
	MOV	SS,SPSEG
	MOV	SP,SPOFF
	RETF
;
;
;**************************************************************************
;
;
CRLF:				;ROUTINE TO DO CONSOL CR AND LF
	MOV	CL,CR
	CALL	CO
	MOV	CL,LF
	CALL	CO
	RET
;
	EJECT
;
BYTEO:				;ROUTINE TO OUTPUT A HEX BYTE TO THE CONSOLE
	PUSH	AX
	CALL	BYTO1
	MOV	CL,AL
	CALL	CO
	POP	AX
	CALL	BYTO2
	MOV	CL,AL
	CALL	CO
	RET
;
BYTO1:
	ROR	AL,1
	ROR	AL,1
	ROR	AL,1
	ROR	AL,1
BYTO2:
	AND	AL,0FH
	CMP	AL,0AH
	JS	BYTO3
	ADD	AL,07H
BYTO3:
	ADD	AL,030H
	RET
;
	EJECT
;*****************************************************************************
;
;
;CRTMS - ROUTINE TO DISPLAY A MESSAGE ON THE CRT. REGISTERS DX
;	 CONTAIN THE MESSAGE POINTER. END OF MESSAGE IS INDICATED BY
;	 A "#" CHARACTER.
;
;
CRTMS:				;ROUTINE PRINTS MESSAGE ON CRT
	PUSH	BX
	MOV	BX,DX
CRTMS1:
	MOV	CL,ÆBXÅ
	CMP	CL,'#'		;END MESSAGE MARKER
	JNZ	SENDIT
	POP	BX
	RET
SENDIT:
	PUSH	BX
	CALL	CO
	POP	BX
	INC	BX
	JMPS	CRTMS1
;
;
	EJECT
;************************************************************************
;
;	MINI FLOPPY TRACK IMAGE BUILDING ROUTINE
;
;	THIS BUILDS AN IMAGE INTO MEMORY FOR THE MINI FLOPPY
;	TRACK FORMAT IMAGE. VARIABLES REQUIRED TO BE SETUP
;	BEFORE ENTRY ARE "FLPTRK" WITH THE TRACK NUMBER AND
;	"FSIDE" WITH THE SIDE NUMBER.
;
TRKFILL:
	MOV	DH,01H		;START SECTOR COUNT
	MOV	DL,FSPT		;MAX NUMBER OF SECTORS ON TRACK
	MOV	BX,OFFSET DATBF	;POINT TO BUFFER FOR IMAGE BULID
;
;
;FIXUP PREINDEX GAP 4A
;
	MOV	CH,80		;PREINDEX FILL 80 BYTES OF "4E"
	MOV	AL,04EH
PREIND:
	MOV	ÆBXÅ,AL		;PUT 4E INTO BUFFER
	INC	BX
	DEC	CH		;CHECK BYTE COUNT
	JNZ	PREIND
;
	MOV	CH,12		;SYNC 12 BYTES OF "00"
	MOV	AL,00H
PREIND1:
	MOV	ÆBXÅ,AL		;PUT 00 INTO BUFFER
	INC	BX
	DEC	CH		;CHECK BYTE COUNT
	JNZ	PREIND1
;
;
;WRITE INDEX ADDRESS MARK ONTO TRACK HERE
;
	MOV	CH,03		;THREE BYTES OF "F6"
	MOV	AL,0F6H
IAM:
	MOV	ÆBXÅ,AL		;PUT F6 INTO BUFFER
	INC	BX
	DEC	CH		;CHECK BYTE COUNT
	JNZ	IAM
;
;
;WRITE INDEX MARK ITSELF
;
	MOV	AL,0FCH		;ONE BYTE OF "F6"
	MOV	ÆBXÅ,AL
	INC	BX
;
;
;WRITE POST INDEX GAP 1
;
	MOV	CH,50		;GAP 1 50 BYTES OF "4E"
	MOV	AL,04EH
POSTID:
	MOV	ÆBXÅ,AL		;PUT 4E INTO BUFFER
	INC	BX
	DEC	CH		;CHECK BYTE COUNT
	JNZ	POSTID
;
;
;PRE SECTOR ID SYNC (ALSO ENTRY POINT TO DO NEXT SECTOR)
;
SECTOR:
	MOV	CH,12		;12 BYTES OF "00"
	MOV	AL,00H
SECSYNC:
	MOV	ÆBXÅ,AL		;PUT THE 00 INTO BUFFER
	INC	BX
	DEC	CH		;CHECK THE BYTE COUNT
	JNZ	SECSYNC
;
;
;WRITE SECTOR ID ADDRESS MARK
;
	MOV	CH,03H		;THREE BYTES OF "F5"
	MOV	AL,0F5H
SIDAM:
	MOV	ÆBXÅ,AL		;PUT F5 INTO BUFFER
	INC	BX
	DEC	CH		;CHECK THAT BYTE COUNT
	JNZ	SIDAM
;
;
;PUT SINGLE BYTE SECTOR ID MARK
;
	MOV	AL,0FEH		;ONE BYTE "FE"
	MOV	ÆBXÅ,AL
	INC	BX
;
;
;WRITE TRACK NUMBER INTO ID FIELD
;
	MOV	AL,CURCYL	;GET TRACK NUMBER VARIABLE
	PUSH	AX
	SHR	AL,1		;DIVIDE TRACK BY 2
	MOV	ÆBXÅ,AL
	INC	BX
;
;
;WRITE SIDE NUMBER INTO THE ID FIELD
;
	POP	AX
	AND	AL,01H		;FIND OUT WHAT THE SIDE NUMBER IS
	MOV	ÆBXÅ,AL
	INC	BX
;
;
;PUT SECTOR NUMBER INTO THE ID FIELD
;
	MOV	ÆBXÅ,DH		;GET SECTOR NUMBER FROM (D)
	INC	BX
;
;
;PUT DATA FIELD LENGTH BYTE INTO THE ID FIELD
;
	MOV	AL,FSECCDE	;02 FOR 512 BYTE SECTORS
	MOV	ÆBXÅ,AL		;01 FOR 256 BYTE SECTORS
	INC	BX		;00 FOR 128 BYTE SECTORS
;
;
;SET CODE TO WRITE TWO CRC'S ONTO THE TRACK
;
	MOV	AL,0F7H		;ONE BYTE "F7"
	MOV	ÆBXÅ,AL
	INC	BX
;
;
;FILL GAP 2 BEFORE DATA FIELD
;
	MOV	CH,22		;22 BYTES OF "4E"
	MOV	AL,04EH
PREDAT:
	MOV	ÆBXÅ,AL		;PUT THE 4E INTO BUFFER
	INC	BX
	DEC	CH		;CHECK THAT BYTE COUNT
	JNZ	PREDAT
;
;
;FILL DATA FIELD SYNC AREA
;
	MOV	CH,12		;12 BYTES OF "00"
	MOV	AL,00H
PREDAT1:
	MOV	ÆBXÅ,AL		;PUT 00 INTO BUFFER
	INC	BX
	DEC	CH		;CHECK THAT BYTE COUNT ONE MORE TIME...
	JNZ	PREDAT1
;
;
;WRITE DATA ADDRESS MARK
;
	MOV	CH,03		;THREE BYTES OF "F5"
	MOV	AL,0F5H
DAM:
	MOV	ÆBXÅ,AL		;PUT THE F5 INTO BUFFER
	INC	BX
	DEC	CH		;BYTE COUNT CHECK
	JNZ	DAM
;
;
;ONE BYTE DATA FIELD MARK
;
	MOV	AL,0FBH		;ONE BYTE OF 0FBH
	MOV	ÆBXÅ,AL
	INC	BX
;
;
;FILL DATA FIELD WITH 0E5H DATA
;
	MOV	CX,FSECSIZ	;GET SECTOR BYTE COUNT
	MOV	AL,0E5H
DFILL:
	MOV	ÆBXÅ,AL		;PUT E5 INTO BUFFER
	INC	BX
	LOOP	DFILL
;
;
;SET CODE TO WRITE DATA FIELD CRC'S
;
	MOV	AL,0F7H		;ONE BYTE CRC CODE (F7)
	MOV	ÆBXÅ,AL
	INC	BX
;
;
;END SECTOR FILL
;
	MOV	CH,54		;54 BYTES OF "4E"
	MOV	AL,04EH
DATGAP:
	MOV	ÆBXÅ,AL		;PUT THE 4E INTO BUFFER
	INC	BX
	DEC	CH
	JNZ	DATGAP
;
;
;CHECK IF DONE WITH LAST SECTOR IMAGE
;
	INC	DH		;GET SECTOR NUMBER READY FOR NEXT LOOP
	DEC	DL		;DEC TOTAL SECTOR COUNT
	JNZ	SECTOR		;OFF TO DO THAT AGAIN FOR NEXT SECTOR
;
;
;END TRACK FILL
;
	MOV	CX,2300		;FILL TO END OF TRACK WITH "4E"
	MOV	AL,04EH
ETFILL:
	MOV	ÆBXÅ,AL		;PUT THE "4E" INTO BUFFER
	INC	BX
	LOOP 	ETFILL
;
	RET			;BUFFER NOW SETUP
;
	EJECT
;
	DSEG
	ORG	100H
;
;FORMAT PROGRAM MESSAGES
;
STRMSG:
	DB	ESC,'Æ2J'
	DB	ESC,'Æ7m'
	DB	'Christian Rovsing A/S floppy disk formatter program',CR,LF
	DB	'For dual sided 96 TPI 5 1/4 inch mini floppy drives',CR,LF
	DB	ESC,'Æm'
	DB	CR,LF,CR,LF
	DB	CR,LF,'This operation will erase ALL data on the disk!',CR,LF
	DB	CR,LF,'Type "G" if ready to format or "N" to stop (G/N) ','#'
FORDMS:
	DB	CR,LF,'Formatting complete',CR,LF,'#'
;
DONMSG:
	DB	CR,LF,'Do you want to format another disk? (Y/N) ','#'
;
;MINI FLOPPY FORMAT TRACK REPORT MESSAGE
;
TRKMSG:
	DB	CR,'TRACK ','#'
;
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 FORMATTING
;
;
SPOFF	RW	1
SPSEG	RW	1
;
CURCYL	DB	0		;CURRENT CYLINDER COUNTER
RETRY	DB	3		;TRACK WRITE  RETRY COUNTER
;
;FORMAT PROGRAM STACK AREA
;
	RW	40		;SETUP STORAGE FOR 40 LEVEL STACK
STCKK	EQU	OFFSET $
;
;
;LOCAL RECORD BUFFER AND MINI FLOPPY TRACK IMAGE BUFFER
;
DATBF	RB	8400		;DATA RECORD BUFFER
	DB	0
;
	END
«eof»