|
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: 18944 (0x4a00) Types: TextFile Names: »FFORMAT.ASM«
└─⟦1f6b46325⟧ Bits:30004393 CP/M-80 rel. 1 Utilities source disk └─ ⟦this⟧ »FFORMAT.ASM«
TITLE 'CHRISTIAN ROVSING A/S FLOPPY FORMATTING UTILITY' PAGE 43 ;****************************************************************************** ; CHRISTIAN ROVSING A/S - CP/M MINI FLOPPY DISK FORMATTING PROGRAM ;****************************************************************************** ; ; ; MINI FLOPPY DISK FORMATTING PROGRAM FOR FORMATTING A 96 TPI 5 1/4 ; INCH MINIFLOPPY DISK DRIVE. USE OF A CHRISTIAN ROVSING A/S MP2 ; BOARD IS REQUIRED. ; ; 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 ; 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 ; ; ; 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 ; PAGE ; ;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 - DISK FORMATTING UTILITY',CR,LF DB 'FOR TANDON TM-100 96 TPI 5 1/4" FLOPPY DRIVES',CR,LF DB ESC,'Æm' DB CR,LF,CR,LF DB ' SELECT OPTION -',CR,LF DB ' A) FORMAT MINI FLOPPY DISK A:',CR,LF DB ' B) FORMAT MINI FLOPPY DISK B:',CR,LF DB CR,LF DB ' OPTION (A OR B) = ','#' ; PAGE ;***************************************************************************** ; ; MONITOR: CALL CECHO ;GET OPERATOR ENTRY CHARACTER ANI 05FH ;CONVERT TO UPPER CASE SUI 'A' ;ADJUST TO ZERO VALUE CPI 02H ;CHECK IF TOO BIG A SELECT JNC ERRR ;OPTION SELECT ERROR ; PAGE ; ;HERE IF TO FORMAT A DISKETTE IN A MINI FLOPPY UNIT ; MFFMT: PUSH PSW 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 ; GOMS2: DB ': (Y/N) ','#' GOMS3: DB CR,LF,'HAS DISKETTE BEEN INSTALLED IN DRIVE ','#' GOMS4: DB CR,LF,'ALL INFORMATION ON THE DISKETTE WILL BE ERASED !!' DB CR,LF,'TYPE "G" IF READY 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,'DO YOU WANT TO FORMAT ANOTHER DISK? (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 ; PAGE ; 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 ; ; ; HLCO1: ;ROUTINE TO PRINT CONTENTS OF (HL) MOV A,H CALL BYTEO MOV A,L CALL BYTEO RET ; PAGE ; 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 ; ; ;ERROR ON ENTRY OF OPERATOR PARAMETERS ; ERRR: MVI C,'?' ;OUTPUT UNKNOWN PARAMETER CALL CO CALL CRLF JMP ENDCHK ;GO TO OPERATOR END CHECK SEQUENCE ; PAGE ;****************************************************************************** ; ; ;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 ; PAGE ;****************************************************************************** ; ; 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 MREST ;RESTORE SELECTED UNIT ORA A ;CHECK RESTORE STATUS JNZ FLPERR ;OUT IF ERROR ; 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 TRACK REPORT MESSAGE ; TRKMSG: DB CR,'TRACK ','#' ; PAGE ;****************************************************************************** ; ; 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: 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 ;****************************************************************************** ; ;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 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 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 ; ; ; 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 0 ;DATA RECORD BUFFER ; END ; ;+++...END OF FILE «eof»