; FORMAT ; FORMATTING PROGRAM FOR TARBELL FLOPPY DISK INTERFACE. ; MOST DISKS THAT COME FROM THE MANUFACTURER ARE ; ALREADY FORMATTED IN THE IBM FORMAT, ESPECIALLY IF ; YOU SPECIFY THIS. THERE ARE TIMES, HOWEVER, THAT ; YOU MAY WANT TO FORMAT OR REFORMAT A DISK YOURSELF. ; USUALLY THIS IS WHEN THE SYSTEM CRASHED AND ; MESSED UP THE DISK SO BADLY THAT YOU CAN NO LONGER ; WRITE ONTO IT OR READ FROM IT IN THE NORMAL FASHION. ; SOMETIMES SURPLUS DISKS ARE AVAILABLE THAT ARE ; NOT FORMATTED PROPERLY. ; ; THIS PROGRAM FORMATS A BLANK DISK INTO A IBM FORMAT. ; NOTE THAT IT IS COMPLETELY SELF-CONTAINED, SO ; THAT NO OPERATING SYSTEM IS REQUIRED TO RUN IT. NOTE ; THEREFORE, THAT IF YOUR CONSOLE I/O SET-UP IS ; DIFFERENT THAN THAT OF THIS PROGRAM, YOU WILL NEED ; TO MAKE THE NECESSARY CHANGES. ; ; DURINTG THE DEVELOPMENT OF THIS PROGRAM, IT WAS ; DETERMINED THAT THE 1000 PF CAPACITOR C4 SHOULD BE ; CHANGED TO A VALUE OF .1 MFD TO MAKE THIS ROUTINE ; RUN PROPERLY. IT WAS FOUND THAT THE STEP ONE-SHOT ; WAS NOT ALWAYS LONG ENOUGH TO RELIABLY STEP THE ; HEAD. THIS IS NOT A PROBLEM DURING NORMAL SEEK ; OPERATIONS, SINCE THE 1771 AUTOMATICALLY STEPS A ; FEW TRACKS AHEAD TO LOOK FOR THE CORRECT TRACK. ; ; ***** CAUTION ***** ; DO NOT RUN THIS PROGRAM WITH A DISK THAT HAS DATA ; OR PROGRAMS ON IT THAT YOU WANT TO SAVE. THIS PROGRAM ; ERASES ALL MATERIAL ON THE DISK THAT IT FORMATS. ; ; 1. INSERT THE DISK WITH THIS PROGRAM ON IT. ; 2. TYPE FORMAT TO CALL THE PROGRAM UP. ; 3. REMOVE THE DISK WITH THIS PROGRAM ON IT. ; 4. INSERT A DISK THAT YOU WANT FORMATTED. ; 5. PUSH CONTROL-F ON YOUR CONSOLE KEYBOARD. ; 6. STAND BY AND WAIT UNTIL THE SYSTEM RETURNS ; WITH A A> SIGNATURE. STAT EQU 00H ;KEYBOARD STATUS DATA EQU 01H ;KEYBOARD DATA DCOM EQU 0F8H ;DISK COMMAND PORT DSTAT EQU 0F8H ;DISK STATUS PORT TRACK EQU 0F9H ;DISK TRACK COMMAND SECTP EQU 0FAH ;DISK SECTOR PORT DDATA EQU 0FBH ;DISK DATA PORT WAIT EQU 0FCH ;DISK WAIT CONTROL PORT ORG 0100H ;LOAD & EX HERE ; ; KEY BOARD START ROUTINE ; KEYIN IN STAT ;CHECK STATUS ANI 1 ;TEST FOR BIT 1 LOW JNZ KEYIN ;IF NOT THEN LOOP IN DATA ;GET DATA ANI 7FH ;KILL PARITY BIT CPI 6 ;CHECK FOR CONTROL F JNZ KEYIN ;IF NOT CNTL F GO BACK ; ; RESTORE DRIVE TO TRACK 00 ; MVI A,3 ;LOAD RESTORE CMD OUT DCOM ;ISSUE HOME CMD IN WAIT ;WAIT FOR HOME MVI C,0 ;SET TRACK NUMBER TO 0 MVI H,76 ;SET TOTAL TRACKS TO 77 NXTTRK MVI D,1 ;SECTOR CNT TO 0 MVI E,26 ;SET MAX # SECTORS -1 MVI B,46 ;GAP 4 PREINDEX 40 BYTES OF FF MVI A,0F4H ;LOAD TRACK WRITE COMMAND OUT DCOM ;ISSUE TRACK WRITE ; WRITE PREINDEX FILL PREIND IN WAIT ;WAIT FOR DRQ ORA A ;SET FLAGS JP ERRMSG ;JMP OUT IF ERROR XRA A ;LOAD PREINDEX FILL OUT DDATA ;WRITE IT ON DISK DCR B ;COUNT =COUNT - 1 JNZ PREIND ;GO BACK TILL B =0 ; ; WRITE ADDRESS MARK ON TRACK ; IN WAIT ;WAIT FOR DRQ ORA A ;SET FLAGS JP ERRMSG ;JMP OUT IF ERROR MVI A,0FCH ;LOAD ADDRESS MARK OUT DDATA ;WRITE IT ON DISK ; ; POST INDEX GAP ; MVI B,26 ;SET # OF BYTES POSTID IN WAIT ;WAIT FOR DRQ ORA A ;SET FLAGS JP ERRMSG ;JMP OUT IF ERROR MVI A,0FFH ;LOAD FILL DATA OUT DDATA ;WRITE IT ON DISK DCR B ;COUNT = COUNT - 1 JNZ POSTID ;IF NOT 0 GO BACK ; ; PRE ID SECTION ; ASECT MVI B,6 ;GET # OF BYTES SECTOR IN WAIT ;WAIT FOR DRQ ORA A ;SET FLAGS JP ERRMSG ;JMP OUT IF ERROR XRA A ;MAKE A = 0 OUT DDATA ;WRITE IT ON TRACK DCR B ;COUNT = COUNT=1 JNZ SECTOR ;JMP BACK IF NOT DONE ; ; WRITE ID ADDRESS MARK ; IN WAIT ;WAIT FOR DRQ ORA A ;SET FLAGS JP ERRMSG ;IF ERROR JMP OUT MVI A,0FEH ;GET ADDRESS MARK OUT DDATA ;WRITE IT ON DISK ; ; WRITE TRACK NUMBER ON DISK ; IN WAIT ;WAIT FOR DRQ ORA A ;SET FLAGS JP ERRMSG ;JMP OUT IF ERROR MOV A,C ;GET TRACK NUMBER OUT DDATA ;WRITE IT ON DISK ; ; WRITE ONE BYTE OF 00 ; IN WAIT ;WAIT FOR DRQ ORA A ;SET FLAGS JP ERRMSG ;JMP OUT IF ERROR XRA A ;SET A TO 0 OUT DDATA ;WRITE IT ON DISK ; ; WRITE SECTOR # ON DISK ; IN WAIT ;WAIT FOR DRQ ORA A ;SET FLAGS JP ERRMSG ;JMP OUT IF ERROR MOV A,D ;GET SECTOR # OUT DDATA ;WRITE IT ON DISK ; ; ONE MORE BYTE 0 ; IN WAIT ;WAIT FOR DRQ ORA A ;SET FLAGS JP ERRMSG ;JMP OUT IF ERROR XRA A ;SET A TO 00 OUT DDATA ;WRITE IT ON DISK INR D ;BUMP SECT. # ; ; WRITE 2 CRC'S ON THIS SECTOR ; IN WAIT ;WAIT FOR DRQ ORA A ;SET FLAGS JP ERRMSG ;JMP OUT IF ERROR MVI A,0F7H ;GET CRC PATTERN OUT DDATA ;WRITE IT ON DISK ; ; PRE DATA 17 BYTES 00 ; MVI B,17 ;SET COUNT PREDAT IN WAIT ;WAIT FOR DRQ ORA A ;SET FLAGS JP ERRMSG ;JMP OUT IF ERROR XRA A ;SET A TO 00 OUT DDATA ;WRITE IT ON DISK DCR B ;REDUCE COUNT BY 1 JNZ PREDAT ;GO BACK IF NOT DONE ; ; DATA ADDRESS MARK ; IN WAIT ;WAIT FOR DRQ ORA A ;SET FLAGS JP ERRMSG ;JMP OUT IF ERROR MVI A,0FBH ;GET DATA ADDRESS MARK OUT DDATA ;WRITE IT ON DISK ; ; FILL DATA FIELD WITH E5 ; MVI B,128 ;SET FIELD LENGTH DFILL IN WAIT ;WAIT FOR DRQ ORA A ;YOU KNOW WHAT JP ERRMSG ;HAPPENS HERE BY NOW MVI A,0E5H ;GET FILL BYTE OUT DDATA ;WRITE IT ON DISK DCR B ;DROP 1 FROM COUNT JNZ DFILL ;DO TILL 00 ; ; WRITE CRC'S ; IN WAIT ;WAIT TILL DRQ ORA A ;SET FLAGS JP ERRMSG ;JMP OUT IF ERROR MVI A,0F7H ;GET CRC BYTE OUT DDATA ;WRITE IT ON DISK ; ; END OF SECTOR FILL ; DCR E ;REDUCE SECTOR COUNT JZ ENDTRK ;IF 0 DO END OF TRACK RTN DATGAP IN WAIT ;WAIT FOR DRQ ORA A ;SET FLAGS JP ERRMSG ;JMP OUT IF ERROR MVI A,0FFH ;GET FILL CHARACTER OUT DDATA ;WRITE IT ON DISK JMP POSTID-2 ;GO BACK FOR MORE ; ; DO TRACK & SECTOR HOUSE KEEPING ; ENDTRK IN WAIT ;WAIT FOR DRQ OR INTRQ ORA A ;SET FLAGS JP DONE ;JMP OUT IF ERROR MVI A,0FFH ;LOAD A WITH FFH OUT DDATA ;WRITE IT ON DISK JMP ENDTRK ;DO UNTIL INTRQ ; ; ERROR SORT ROUTINE ; DONE IN DSTAT ;READ STATUS ANI 0FFH ;TEST FOR FLAG JNZ ERRMSG ;IF ERR GO TO ERR PRINT RTN INR C ;BUMP TRACK # DCR H ;TRK COUNT =COUNT -1 JNZ BMPTRK ;IF NOT 0 THEN DO MORE RET ;RETURN TO SYSTEM. BMPTRK MVI A,43H ;LOAD STEP IN OUT DCOM ;STEP IN IN WAIT ;WAIT TIL DONE ORA A ;SET FLAGS IN WAIT ;WAIT FOR DRQ IN DSTAT ;CHECK STATUS ANI 0FFH ;MASK NON ERR BITS JNZ ERRMSG JMP NXTTRK ; ;ERROR ROUTINE ; ERRMSG STA 0000H HLT