home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG025.ARK
/
FORMAT.ASM
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
9KB
|
265 lines
; 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