home *** CD-ROM | disk | FTP | other *** search
- ; MODIFIED BY FRED KAHL 3.24.78 FOR DRIVE VERIFICATION
- ; 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.
- ;
- BDOS: EQU 0005 ;BDOS ENTRY POINT
- 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
- ;
- JMP START ;JUMP AROUND MESSAGES
- MSG1: DB 'MICRO-SERVE DISK FORMATTING PROGRAM'
- DB 0DH,0AH,0DH,0AH
- DB 'DRIVE TO BE FORMATTED? $'
- MSG2: DB 0DH,0AH,'READY TO FORMAT IN DRIVE '
- DISKNO: DS 1
- DB 0DH,0AH,'IS BLANK DISK READY TO FORMAT (Y-N)? $'
- DISKTMP DB 0
- ;
- START: MVI C,25 ;INTERROGATE DRIVE NUMBER
- CALL BDOS
- STA DISKTMP ;SAVE COPY CURRENT DRIVE
- MVI C,9 ;GET CODE FOR PRINT
- LXI D,MSG1 ;GET ADDR OF MSG
- CALL BDOS
- MVI C,1 ;GET CONSOLE CHAR
- CALL BDOS
- STA DISKNO ;PUT IN MSG
- SBI 65 ;CONVERT TO BINARY
- CALL SELDSK ;SET DRIVE # TO FORMAT
- NXTDSK: MVI C,9 ;GET CODE FOR PRINT
- LXI D,MSG2 ;GET ADDR OF MSG
- CALL BDOS
- MVI C,1 ;GET CONSOLE CHAR
- CALL BDOS
- CPI 'Y' ;WAS IT A YES
- JZ BEGIN ;START FORMATTING
- LDA DISKTMP ;GET COPY OF ORIG LOGGED DISK
- SELDSK: CMA
- ADD A
- ADD A
- ADD A
- ADD A
- ORI 2
- OUT WAIT
- RET
- ;
- ;
- ; RESTORE DRIVE TO TRACK 00
- ;
- BEGIN: 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,77 ;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
- JMP NXTDSK ;GO AGAIN
-
- 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
-
-