|
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 - 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»