|
|
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: 11264 (0x2c00)
Types: TextFile
Names: »FORMAT86.A86«
└─⟦98758eebd⟧ Bits:30004394 CP/M-86 sources for adaptation to CR8 release 1
└─⟦this⟧ »FORMAT86.A86«
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»