; DISK FORMATTING PROGRAM ; WRITTEN BY DICK CULBERTSON IN AUG, 1977 ; MODIFIED BY DON TARBELL IN SEP, 1977 ; MODIFIED BY MARC FARJEON - MAY 24, 1979. ; ; THE PURPOSE OF THIS PROGRAM IS TO FORMAT ; OR REFORMAT A DISK ON DRIVE A. THIS MAY BE REQUIRED ; IF A NEW DISK IS NOT FORMATTED CORRECTLY, ; OR IF AN OLD ONE IS CRASHED. ; BE CAREFULL, THIS PROGRAM WIPES OUT ; ANY INFORMATION YOU MAY HAVE HAD ; ON THE DISK. ALSO BE SURE THAT YOU HAVE ;CHANGED C4 FROM 1000PF TO .1MFD PERMENANTLY. ; 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 ENTRY EQU 5 ;ENTRY PT TO FDOS ORG 0100H ;LOAD & EX HERE ;STARTING MESSAGE MVI C,9 ;GET CODE FOR PRINT. LXI D,MSG ;GET ADR OF MESSAGE. CALL ENTRY ;PRINT OPENING. BGIN: MVI C,9 LXI D,RDY ;PRINT READY MESSAGE. CALL ENTRY MVI C,1 ;READ A CHAR FROM KB. CALL ENTRY CPI 'Y' ;IF IT'S A 'Y', RNZ JMP START ;GO AHEAD AND DO IT. MSG: DB 'INITIALIZATION ROUTINE FOR FLOPPIES' DB 13,10,'FORMAT91 ' DB 0DH,0AH,0AH DB 'BY DICK CULBERTSON' DB 0DH,0AH,'AUG, 1977 $' RDY: DB 0DH,0AH,'BLANK DISK READY TO FORMAT? (Y,N) $' ; ; RESTORE DRIVE TO TRACK 00 ; START: MVI A,0B2H ;SET PERSCI OUT WAIT ;RESTORE LINE. MVI A,3 ;LOAD HOME CMD. OUT DCOM ;ISSUE HOME CMD IN WAIT ;WAIT FOR HOME MVI A,0F2H ;RESET RESTORE LINE. OUT WAIT MVI C,0 ;SET TRACK NUMBER TO 0 MVI H,77 ;SET TOTAL TRACKS TO 77 NXTTRK MVI D,1 ;SECTOR CNT TO 0 MVI E,26 ;SET MAX # SECTORS -1 MVI B,40 ;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 MVI A,0FFH ;LOAD PREINDEX FILL OUT DDATA ;WRITE IT ON DISK DCR B ;COUNT = COUNT - 1 JNZ PREIND ;GO BACK TILL B =0 MVI B,6 PREIN1: IN WAIT ORA A JP ERRMSG XRA A OUT DDATA DCR B JNZ PREIN1 ; ; 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,11 ;SET COUNT PREDAT IN WAIT ;WAIT FOR DRQ ORA A ;SET FLAGS JP ERRMSG ;JMP OUT IF ERROR MVI A,0FFH ;SET A TO 00 OUT DDATA ;WRITE IT ON DISK DCR B ;REDUCE COUNT BY 1 JNZ PREDAT ;GO BACK IF NOT DONE MVI B,6 PREDA1: IN WAIT ORA A JP ERRMSG XRA A OUT DDATA DCR B JNZ PREDA1 ; ; 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 JMP BGIN ;GO BACK TO DO ROUTINE AGAIN BMPTRK MVI A,53H ;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 PUSH H ;SAVE H&L MVI A,1 ;GET PERSCI STEP CMD OUT WAIT ;STEP IT LXI H,0FFFH ;SET DELAY COUNT LOOP1 DCX H ;COUNT IT DOWN MOV A,H ;LOAD H FOR TEST ORA L ;TEST IT JNZ LOOP1 ;GO BACK IF NOT DONE POP H ;RESTORE H JMP NXTTRK ; ;ERROR ROUTINE ; ERRMSG STA 0000H HLT ement hardware allows dynamic mapping of logical to 1 Mbyte of physical memory in 4k blocks. This consists of a fast on-board memory of 16 bytes, which holds a table. The 4-bit address of this memory comes from the upper four address lines of the Z-80