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 >
Assembly Source File  |  1984-04-29  |  9KB  |  265 lines

  1. ; MODIFIED BY FRED KAHL 3.24.78 FOR DRIVE VERIFICATION
  2. ; FORMAT
  3. ; FORMATTING PROGRAM FOR TARBELL FLOPPY DISK INTERFACE.
  4. ; MOST DISKS THAT COME FROM THE MANUFACTURER ARE
  5. ; ALREADY FORMATTED IN THE IBM FORMAT, ESPECIALLY IF
  6. ; YOU SPECIFY THIS.  THERE ARE TIMES, HOWEVER, THAT
  7. ; YOU MAY WANT TO FORMAT OR REFORMAT A DISK YOURSELF.
  8. ; USUALLY THIS IS WHEN THE SYSTEM CRASHED AND
  9. ; MESSED UP THE DISK SO BADLY THAT YOU CAN NO LONGER
  10. ; WRITE ONTO IT OR READ FROM IT IN THE NORMAL FASHION.
  11. ; SOMETIMES SURPLUS DISKS ARE AVAILABLE THAT ARE
  12. ; NOT FORMATTED PROPERLY.
  13. ;
  14. ; THIS PROGRAM FORMATS A BLANK DISK INTO A IBM FORMAT.
  15. ; NOTE THAT IT IS COMPLETELY SELF-CONTAINED, SO
  16. ; THAT NO OPERATING SYSTEM IS REQUIRED TO RUN IT.  NOTE
  17. ; THEREFORE, THAT IF YOUR CONSOLE I/O SET-UP IS
  18. ; DIFFERENT THAN THAT OF THIS PROGRAM, YOU WILL NEED
  19. ; TO MAKE THE NECESSARY CHANGES.
  20. ;
  21. ; DURINTG THE DEVELOPMENT OF THIS PROGRAM, IT WAS
  22. ; DETERMINED THAT THE 1000 PF CAPACITOR C4 SHOULD BE
  23. ; CHANGED TO A VALUE OF .1 MFD TO MAKE THIS ROUTINE
  24. ; RUN PROPERLY.  IT WAS FOUND THAT THE STEP ONE-SHOT
  25. ; WAS NOT ALWAYS LONG ENOUGH TO RELIABLY STEP THE
  26. ; HEAD.  THIS IS NOT A PROBLEM DURING NORMAL SEEK
  27. ; OPERATIONS, SINCE THE 1771 AUTOMATICALLY STEPS A
  28. ; FEW TRACKS AHEAD TO LOOK FOR THE CORRECT TRACK.
  29. ;
  30. ; ***** CAUTION *****
  31. ; DO NOT RUN THIS PROGRAM WITH A DISK THAT HAS DATA
  32. ; OR PROGRAMS ON IT THAT YOU WANT TO SAVE.  THIS PROGRAM
  33. ; ERASES ALL MATERIAL ON THE DISK THAT IT FORMATS.
  34. BDOS:      EQU  0005       ;BDOS ENTRY POINT
  35. DCOM      EQU  0F8H        ;DISK COMMAND PORT
  36. DSTAT     EQU  0F8H        ;DISK STATUS PORT
  37. TRACK     EQU  0F9H        ;DISK TRACK COMMAND
  38. SECTP     EQU  0FAH        ;DISK SECTOR PORT
  39. DDATA     EQU  0FBH        ;DISK DATA PORT
  40. WAIT      EQU  0FCH        ;DISK WAIT CONTROL PORT
  41.           ORG  0100H       ;LOAD & EX HERE
  42. ;
  43.     JMP START        ;JUMP AROUND MESSAGES
  44. MSG1:    DB 'MICRO-SERVE DISK FORMATTING PROGRAM'
  45.     DB 0DH,0AH,0DH,0AH
  46.     DB 'DRIVE TO BE FORMATTED? $'
  47. MSG2:    DB 0DH,0AH,'READY TO FORMAT IN DRIVE '
  48. DISKNO:    DS 1
  49.     DB 0DH,0AH,'IS BLANK DISK READY TO FORMAT (Y-N)? $'
  50. DISKTMP DB 0
  51. ;
  52. START:    MVI C,25        ;INTERROGATE DRIVE NUMBER
  53.     CALL BDOS
  54.     STA DISKTMP        ;SAVE COPY CURRENT DRIVE
  55.     MVI C,9            ;GET CODE FOR PRINT
  56.     LXI D,MSG1        ;GET ADDR OF MSG
  57.     CALL BDOS
  58.     MVI C,1            ;GET CONSOLE CHAR
  59.     CALL BDOS
  60.     STA DISKNO        ;PUT IN MSG
  61.     SBI 65            ;CONVERT TO BINARY
  62.     CALL SELDSK        ;SET DRIVE # TO FORMAT
  63. NXTDSK:    MVI C,9            ;GET CODE FOR PRINT
  64.     LXI D,MSG2        ;GET ADDR OF MSG
  65.     CALL BDOS    
  66.     MVI C,1            ;GET CONSOLE CHAR
  67.     CALL BDOS
  68.     CPI 'Y'            ;WAS IT A YES
  69.     JZ BEGIN        ;START FORMATTING
  70.     LDA DISKTMP        ;GET COPY OF ORIG LOGGED DISK
  71. SELDSK:    CMA
  72.     ADD A    
  73.     ADD A
  74.     ADD A    
  75.     ADD A
  76.     ORI 2
  77.     OUT WAIT
  78.     RET
  79. ;
  80. ;
  81. ; RESTORE DRIVE TO TRACK 00
  82. ;
  83. BEGIN:    MVI A,3          ;LOAD RESTORE CMD
  84.           OUT  DCOM        ;ISSUE HOME CMD
  85.       IN WAIT        ;WAIT FOR HOME
  86.           MVI  C,0         ;SET TRACK NUMBER TO 0
  87.           MVI  H,77        ;SET TOTAL TRACKS TO 77
  88. NXTTRK    MVI  D,1         ;SECTOR CNT TO 0
  89.           MVI  E,26        ;SET MAX # SECTORS -1 
  90.           MVI  B,46        ;GAP 4 PREINDEX 40 BYTES OF FF
  91.           MVI  A,0F4H      ;LOAD TRACK WRITE COMMAND
  92.           OUT  DCOM        ;ISSUE TRACK WRITE
  93. ; WRITE PREINDEX FILL
  94. PREIND    IN   WAIT        ;WAIT FOR DRQ
  95.           ORA  A           ;SET FLAGS
  96.           JP   ERRMSG      ;JMP OUT IF ERROR
  97.           XRA  A           ;LOAD PREINDEX FILL
  98.           OUT  DDATA       ;WRITE IT ON DISK
  99.           DCR  B           ;COUNT =COUNT - 1
  100.           JNZ  PREIND      ;GO BACK TILL B =0
  101. ;
  102. ; WRITE ADDRESS MARK ON TRACK
  103. ;
  104.           IN   WAIT        ;WAIT FOR DRQ
  105.           ORA  A           ;SET FLAGS
  106.           JP   ERRMSG      ;JMP OUT IF ERROR
  107.           MVI  A,0FCH      ;LOAD ADDRESS MARK
  108.           OUT  DDATA       ;WRITE IT ON DISK
  109. ;
  110. ; POST INDEX GAP
  111. ;
  112.           MVI  B,26        ;SET # OF BYTES
  113. POSTID    IN   WAIT        ;WAIT FOR DRQ
  114.           ORA  A           ;SET FLAGS
  115.           JP  ERRMSG       ;JMP OUT IF ERROR
  116.           MVI  A,0FFH      ;LOAD FILL DATA
  117.           OUT  DDATA       ;WRITE IT ON DISK
  118.           DCR  B           ;COUNT = COUNT - 1
  119.           JNZ  POSTID      ;IF NOT 0 GO BACK
  120. ;
  121. ; PRE ID SECTION
  122. ;
  123. ASECT     MVI  B,6         ;GET # OF BYTES
  124. SECTOR    IN   WAIT        ;WAIT FOR DRQ
  125.           ORA  A           ;SET FLAGS
  126.           JP   ERRMSG      ;JMP OUT IF ERROR
  127.           XRA  A           ;MAKE A = 0
  128.           OUT  DDATA       ;WRITE IT ON TRACK
  129.           DCR  B           ;COUNT = COUNT=1
  130.           JNZ  SECTOR      ;JMP BACK IF NOT DONE
  131. ;
  132. ; WRITE ID ADDRESS MARK
  133. ;
  134.           IN   WAIT        ;WAIT FOR DRQ
  135.           ORA  A           ;SET FLAGS
  136.           JP   ERRMSG      ;IF ERROR JMP OUT
  137.           MVI  A,0FEH      ;GET ADDRESS MARK
  138.           OUT  DDATA       ;WRITE IT ON DISK
  139. ;
  140. ; WRITE TRACK NUMBER ON DISK
  141. ;
  142.           IN   WAIT        ;WAIT FOR DRQ
  143.           ORA  A           ;SET FLAGS
  144.           JP   ERRMSG      ;JMP OUT IF ERROR
  145.           MOV  A,C         ;GET TRACK NUMBER
  146.           OUT  DDATA       ;WRITE IT ON DISK
  147. ;
  148. ; WRITE ONE BYTE OF 00
  149. ;
  150.           IN   WAIT        ;WAIT FOR DRQ
  151.           ORA  A           ;SET FLAGS
  152.           JP   ERRMSG      ;JMP OUT IF ERROR
  153.           XRA  A           ;SET A TO 0
  154.           OUT DDATA        ;WRITE IT ON DISK
  155. ;
  156. ; WRITE SECTOR # ON DISK
  157. ;
  158.           IN   WAIT        ;WAIT FOR DRQ
  159.           ORA  A           ;SET FLAGS
  160.           JP   ERRMSG      ;JMP OUT IF ERROR
  161.           MOV  A,D         ;GET SECTOR #
  162.           OUT DDATA        ;WRITE IT ON DISK
  163. ;
  164. ; ONE MORE BYTE 0
  165. ;
  166.           IN   WAIT        ;WAIT FOR DRQ
  167.           ORA  A           ;SET FLAGS
  168.           JP   ERRMSG      ;JMP OUT IF ERROR
  169.           XRA  A           ;SET A TO 00
  170.           OUT  DDATA       ;WRITE IT ON DISK
  171.           INR  D           ;BUMP SECT. #
  172. ;
  173. ; WRITE 2 CRC'S ON THIS SECTOR
  174. ;
  175.           IN   WAIT        ;WAIT FOR DRQ
  176.           ORA  A           ;SET FLAGS
  177.           JP   ERRMSG      ;JMP OUT IF ERROR
  178.           MVI  A,0F7H      ;GET CRC PATTERN
  179.           OUT DDATA        ;WRITE IT ON DISK
  180. ;
  181. ; PRE DATA 17 BYTES 00
  182. ;
  183.           MVI  B,17        ;SET COUNT
  184. PREDAT    IN   WAIT        ;WAIT FOR DRQ
  185.           ORA  A           ;SET FLAGS
  186.           JP   ERRMSG      ;JMP OUT IF ERROR
  187.           XRA  A           ;SET A TO 00
  188.           OUT  DDATA       ;WRITE IT ON DISK
  189.           DCR  B           ;REDUCE COUNT BY 1
  190.           JNZ  PREDAT      ;GO BACK IF NOT DONE
  191. ;
  192. ; DATA ADDRESS MARK
  193. ;
  194.           IN   WAIT        ;WAIT FOR DRQ
  195.           ORA  A           ;SET FLAGS
  196.           JP   ERRMSG      ;JMP OUT IF ERROR
  197.           MVI  A,0FBH      ;GET DATA ADDRESS MARK
  198.           OUT  DDATA       ;WRITE IT ON DISK
  199. ;
  200. ; FILL DATA FIELD WITH E5
  201. ;
  202.           MVI  B,128       ;SET FIELD LENGTH
  203. DFILL     IN   WAIT        ;WAIT FOR DRQ
  204.           ORA  A           ;YOU KNOW WHAT
  205.           JP   ERRMSG      ;HAPPENS HERE BY NOW
  206.           MVI  A,0E5H      ;GET FILL BYTE
  207.           OUT  DDATA       ;WRITE IT ON DISK
  208.           DCR  B           ;DROP 1 FROM COUNT
  209.           JNZ  DFILL       ;DO TILL 00
  210. ;
  211. ; WRITE CRC'S
  212. ;
  213.           IN   WAIT        ;WAIT TILL DRQ
  214.           ORA  A           ;SET FLAGS
  215.           JP   ERRMSG      ;JMP OUT IF ERROR
  216.           MVI  A,0F7H      ;GET CRC BYTE
  217.           OUT  DDATA       ;WRITE IT ON DISK
  218. ;
  219. ; END OF SECTOR FILL
  220. ;
  221.       DCR  E       ;REDUCE SECTOR COUNT
  222.       JZ  ENDTRK       ;IF 0 DO END OF TRACK RTN
  223. DATGAP    IN WAIT          ;WAIT FOR DRQ
  224.           ORA  A           ;SET FLAGS   
  225.           JP   ERRMSG      ;JMP OUT IF ERROR
  226.       MVI  A,0FFH       ;GET FILL CHARACTER
  227.           OUT  DDATA       ;WRITE IT ON DISK
  228.       JMP  POSTID-2    ;GO BACK FOR MORE
  229. ;
  230. ; DO TRACK & SECTOR HOUSE KEEPING
  231. ;
  232. ENDTRK    IN   WAIT        ;WAIT FOR DRQ OR INTRQ
  233.           ORA  A           ;SET FLAGS
  234.           JP   DONE        ;JMP OUT IF ERROR
  235.       MVI  A,0FFH       ;LOAD A WITH FFH
  236.           OUT  DDATA       ;WRITE IT ON DISK
  237.           JMP  ENDTRK      ;DO UNTIL INTRQ
  238. ;
  239. ; ERROR SORT ROUTINE
  240. ;
  241. DONE      IN   DSTAT       ;READ STATUS
  242.           ANI  0FFH        ;TEST FOR FLAG
  243.       JNZ  ERRMSG       ;IF ERR GO TO ERR PRINT RTN
  244.           INR  C           ;BUMP TRACK #
  245.           DCR  H           ;TRK COUNT =COUNT -1
  246.           JNZ  BMPTRK      ;IF NOT 0 THEN DO MORE
  247.       JMP NXTDSK       ;GO AGAIN
  248.  
  249. BMPTRK    MVI  A,43H       ;LOAD STEP IN
  250.           OUT  DCOM        ;STEP IN
  251.       IN  WAIT         ;WAIT TIL DONE
  252.       ORA A            ;SET FLAGS
  253.       IN   WAIT       ;WAIT FOR DRQ
  254.       IN   DSTAT       ;CHECK STATUS
  255.       ANI  0FFH       ;MASK NON ERR BITS
  256.       JNZ  ERRMSG
  257.       JMP  NXTTRK
  258. ;
  259. ;ERROR ROUTINE
  260. ;
  261. ERRMSG      STA 0000H
  262.       HLT
  263.           
  264.