home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol136 / bigbdfmt.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  5.9 KB  |  244 lines

  1. BDOS:      EQU  0005       ;BDOS ENTRY POINT
  2. DCOM      EQU  010H        ;DISK COMMAND PORT
  3. DSTAT     EQU  010H        ;DISK STATUS PORT
  4. TRACK     EQU  011H        ;DISK TRACK COMMAND
  5. SECTP     EQU  012H        ;DISK SECTOR PORT
  6. DDATA     EQU  013H        ;DISK DATA PORT
  7. SELECT    EQU    0F6B1H    ;MONITOR ENTRY TO SELECT DRIVE
  8. RESTOR    EQU    0F6F1H    ;MONITOR ENTRY TO GO TO TRK 00
  9.           ORG  0100H       ;LOAD & EX HERE
  10. ;
  11.     JMP START        ;JUMP AROUND MESSAGES
  12.  
  13.  
  14. MSG1:    DB 'BIG-BOARD DISK FORMATTING PROGRAM'
  15.     DB '     VER. 1.6'
  16.     DB 0DH,0AH,0DH,0AH
  17.     DB 'DRIVE TO BE FORMATTED? (A,B,C,D) : $'
  18. MSG2:    DB 0DH,0AH,'READY TO FORMAT IN DRIVE '
  19. DISKNO:    DS 1
  20.     DB 0DH,0AH,'IS BLANK DISK READY TO FORMAT (Y-N)? $'
  21. SELERR:    DB 0DH,0AH,'INVALID DRIVE SELECTION'
  22.     DB 0DH,0AH,'ENTER A,B,C OR D : $'
  23. MSG3:    DB 0DH,0AH,'DRIVE '
  24. DISKID: DS 1
  25.     DB ' NOT READY.',0DH,0AH,0AH
  26.     DB 'PROGRAM RESTARTING ..........',0DH,0AH,0AH,'$'
  27. DISKTMP DB 0
  28. FMTDSK:    DS 1            ;HOLDS DISK # TO BE USED
  29. TEMP    DS 1
  30. SPSAV:    DS 2            ;SAVE AREA FOR CP/M STACK PTR
  31. ;
  32. START:    LDA    066H        ;SET UP NMI VECTOR
  33.     STA TEMP        ;FOR IMMEDIATE RETURN
  34.     MVI    A,0C9H
  35.     STA    066H
  36.     LXI    H,0
  37.     DAD    SP
  38.     SHLD    SPSAV        ;SAVE CP/M'S STACK PTR
  39.     MVI    C,25        ;INTERROGATE DRIVE NUMBER
  40.     CALL BDOS
  41.     STA DISKTMP        ;SAVE COPY CURRENT DRIVE
  42. REQ:    MVI C,9            ;GET CODE FOR PRINT
  43.     LXI D,MSG1        ;GET ADDR OF MSG
  44.     CALL BDOS
  45. RESP:    MVI C,1            ;GET CONSOLE CHAR
  46.     CALL BDOS
  47.     ANI    0DFH        ;CONVERT TO UPPER CASE
  48.     STA DISKNO        ;PUT IN MSG
  49.     STA DISKID
  50.     SBI 65            ;CONVERT TO BINARY
  51.     STA    FMTDSK        ;SAVE VALUE FOR SELDSK
  52.     CPI    4        ;CHECK FOR VALID RESPONSE
  53.     JC    NXTDSK        ;JUMP IF VALID DRIVE #
  54. ERR:    MVI    C,9
  55.     LXI    D,SELERR
  56.     CALL    BDOS
  57.     JMP    RESP        ;ASK FOR DRIVE # AGAIN
  58. NXTDSK:    MVI C,9            ;GET CODE FOR PRINT
  59.     LXI D,MSG2        ;GET ADDR OF MSG
  60.     CALL BDOS    
  61.     EI            ;ENABLE INTERRUPTS
  62.     MVI C,1            ;GET CONSOLE CHAR
  63.     CALL BDOS
  64.     CPI 'Y'            ;WAS IT A YES
  65.     JZ BEGIN        ;START FORMATTING
  66.     CPI 'Y'+20H    ;CHECK FOR LOWER CASE 'Y'
  67.     JZ BEGIN
  68.     LDA    TEMP
  69.     STA    066H        ;RESTORE NMI VECTOR
  70.     LHLD    SPSAV
  71.     SPHL            ;RESTORE CP/M STACK PTR
  72.     LDA DISKTMP        ;GET COPY OF ORIG LOGGED DISK
  73. SELDSK:    MOV    C,A
  74.     JMP    SELECT
  75. ;
  76. ;
  77. ; RESTORE DRIVE TO TRACK 00
  78. ;
  79. BEGIN    LDA    FMTDSK    ;DISK TO BE USED IN ACC
  80.     CALL SELDSK    ;SELECT DRIVE
  81.     ORA    A    ;SET FLAGS
  82.     JZ    CONT    ;JUMP IF SELECTION OK
  83.     LXI    D,MSG3
  84.     MVI    C,9
  85.     CALL    BDOS    ;PRINT ERROR MSG
  86.     JMP    REQ    ;START AGAIN
  87. CONT    CALL    RESTOR
  88.           MVI  C,0         ;SET TRACK NUMBER TO 0
  89.           MVI  H,77        ;SET TOTAL TRACKS TO 77
  90. NXTTRK    MVI  D,1         ;SECTOR NUMBER
  91.           MVI  E,26        ;SET MAX # SECTORS  
  92.           MVI  B,40        ;GAP 4 PREINDEX 40 BYTES OF FF
  93.     DI            ;DISABLE INTERRUPTS
  94.           MVI  A,0F4H      ;LOAD TRACK WRITE COMMAND
  95.           OUT  DCOM        ;ISSUE TRACK WRITE
  96.     XTHL
  97.     XTHL            ;WASTE SOME TIME
  98. ; WRITE PREINDEX FILL
  99.     MVI    A,0FFH
  100. PREIND    HLT        ;WAIT FOR DRQ
  101.           OUT  DDATA       ;WRITE IT ON DISK
  102.           DCR  B           ;COUNT =COUNT - 1
  103.           JNZ  PREIND      ;GO BACK TILL B =0
  104.     MVI    B,6    ;WRITE 6 BYTES OF ZEROES
  105.     XRA    A
  106. PREIN2    HLT        ;WAIT FOR DRQ
  107.     OUT    DDATA
  108.     DCR    B
  109.     JNZ    PREIN2
  110. ;
  111. ; WRITE ADDRESS MARK ON TRACK
  112. ;
  113.     MVI    A,0FCH        ;LOAD ADDRESS MARK
  114.     HLT        ;WAIT FOR DRQ
  115.           OUT  DDATA       ;WRITE IT ON DISK
  116. ;
  117. ; POST INDEX GAP
  118. ;
  119. PID          MVI  B,26        ;SET # OF BYTES
  120.     MVI    A,0FFH        ;LOAD FILL DATA
  121. POSTID    HLT        ;WAIT FOR DRQ
  122.           OUT  DDATA       ;WRITE IT ON DISK
  123.           DCR  B           ;COUNT = COUNT - 1
  124.           JNZ  POSTID      ;IF NOT 0 GO BACK
  125. ;
  126. ; PRE ID SECTION
  127. ;
  128. ASECT     MVI  B,6         ;GET # OF BYTES
  129.     XRA    A    ;LOAD ZEROES
  130. SECTOR    HLT        ;WAIT FOR DRQ
  131.           OUT  DDATA       ;WRITE IT ON TRACK
  132.           DCR  B           ;COUNT = COUNT=1
  133.           JNZ  SECTOR      ;JMP BACK IF NOT DONE
  134. ;
  135. ; WRITE ID ADDRESS MARK
  136. ;
  137.     MVI    A,0FEH    ;LOAD ADDRESS MARK
  138.     HLT        ;WAIT FOR DRQ
  139.           OUT  DDATA       ;WRITE IT ON DISK
  140. ;
  141. ; WRITE TRACK NUMBER ON DISK
  142. ;
  143.     MOV    A,C    ;GET TRACK NUMBER
  144.     HLT        ;WAIT FOR DRQ
  145.           OUT  DDATA       ;WRITE IT ON DISK
  146. ;
  147. ; WRITE ONE BYTE OF 00
  148. ;
  149.     XRA    A
  150.     HLT        ;WAIT FOR DRQ
  151.           OUT DDATA        ;WRITE IT ON DISK
  152. ;
  153. ; WRITE SECTOR # ON DISK
  154. ;
  155.     MOV    A,D    ;GET SECTOR NUMBER
  156.     HLT        ;WAIT FOR DRQ
  157.           OUT DDATA        ;WRITE IT ON DISK
  158. ;
  159. ; ONE MORE BYTE 0
  160. ;
  161.     XRA    A
  162.     HLT        ;WAIT FOR DRQ
  163.           OUT  DDATA       ;WRITE IT ON DISK
  164.           INR  D           ;BUMP SECT. #
  165. ;
  166. ; WRITE 2 CRC'S ON THIS SECTOR
  167. ;
  168.     MVI    A,0F7H    ;GET CRC PATTERN
  169.     HLT        ;WAIT FOR DRQ
  170.           OUT DDATA        ;WRITE IT ON DISK
  171. ;
  172. ; PRE DATA 17 BYTES 
  173. ;
  174.           MVI  B,11        ;SET COUNT
  175.     MVI    A,0FFH
  176. PREDAT    HLT        ;WAIT FOR DRQ
  177.           OUT  DDATA       ;WRITE IT ON DISK
  178.           DCR  B           ;REDUCE COUNT BY 1
  179.           JNZ  PREDAT      ;GO BACK IF NOT DONE
  180.     MVI    B,6        ;SET COUNT
  181.     XRA    A    ;SET DATA TO ZERO
  182. PREDAT2    HLT            ;WAIT FOR DRQ
  183.     OUT    DDATA        ;DO IT
  184.     DCR    B        ;DECREMENT COUNT
  185.     JNZ    PREDAT2
  186. ;
  187. ; DATA ADDRESS MARK
  188. ;
  189.     MVI    A,0FBH    ;GET DATA ADDRESS MARK
  190.     HLT        ;WAIT FOR DRQ
  191.           OUT  DDATA       ;WRITE IT ON DISK
  192. ;
  193. ; FILL DATA FIELD WITH E5
  194. ;
  195.           MVI  B,128       ;SET FIELD LENGTH
  196.     MVI    A,0E5H    ;GET FILL BYTE
  197. DFILL    HLT        ;WAIT FOR DRQ
  198.           OUT  DDATA       ;WRITE IT ON DISK
  199.           DCR  B           ;DROP 1 FROM COUNT
  200.           JNZ  DFILL       ;DO TILL 00
  201. ;
  202. ; WRITE CRC'S
  203. ;
  204.     MVI    A,0F7H    ;GET CRC BYTE
  205.     HLT        ;WAIT FOR DRQ
  206.           OUT  DDATA       ;WRITE IT ON DISK
  207. ;
  208. ; END OF SECTOR FILL
  209. ;
  210.       DCR  E       ;REDUCE SECTOR COUNT
  211.       JZ  ENDTRK       ;IF 0 DO END OF TRACK RTN
  212.     MVI    A,0FFH    ;GET FILL CHAR.
  213. DATGAP    HLT        ;WAIT FOR DRQ
  214.           OUT  DDATA       ;WRITE IT ON DISK
  215.       JMP  PID    ;GO BACK FOR MORE
  216. ;
  217. ; DO TRACK & SECTOR HOUSE KEEPING
  218. ;
  219. ENDTRK    IN    DSTAT        ;LOOK AT STATUS
  220.     ANI    3        ;CHECK FOR DRQ, BUSY
  221.     JZ    DONE
  222.     MVI    A,0FFH    ;LOAD FILL CHAR.
  223.     HLT            ;WAIT FOR DRQ
  224.           OUT  DDATA       ;WRITE IT ON DISK
  225.           JMP  ENDTRK      ;DO UNTIL INTRQ
  226. ;
  227. ;
  228. DONE          INR  C           ;BUMP TRACK #
  229.           DCR  H           ;TRK COUNT =COUNT -1
  230.           JNZ  BMPTRK      ;IF NOT 0 THEN DO MORE
  231.       JMP NXTDSK       ;GO AGAIN
  232.  
  233. BMPTRK    MVI  A,43H       ;LOAD STEP IN
  234.           OUT  DCOM        ;STEP IN
  235.     XTHL
  236.     XTHL        ;DELAY
  237. LOOP    IN    DSTAT    ;CHECK STATUS
  238.     ANI    01    ;LOOK FOR BUSY
  239.     JNZ    LOOP
  240.       JMP  NXTTRK
  241. ;
  242.     END    0100H
  243.           
  244.