home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol026 / format.z80 < prev    next >
Text File  |  1984-04-29  |  9KB  |  599 lines

  1. ;  THIS IS A PROGRAM TO FORMAT CPM DISKS USEING A VERSAFLOPPY II DISK 
  2. ;  CONTROLLER. NOTE IT IS SELF A CONTAINED PROGRAM (EXCEPT FOR CONSOLE I/O)
  3. ;  IT DOES NOT REQUIRE THE ROM BIOS TO FORMAT A DISK.
  4. ;
  5. ;    JOHN MONAHAN        5/21/81        VERSION    0.0
  6. ;
  7. ;
  8. ;
  9. NBYTES    EQU    128    ;BYTES PER SECTOR (*2 FOR 256 BYTE SECTORS)
  10. LF    EQU    0AH
  11. CR    EQU    0DH
  12. BELL    EQU    07H
  13. CLEAR    EQU    1AH
  14. TAB    EQU    09H
  15. ;
  16. CI    EQU    0F003H    ;CONSOLE INPUT
  17. CO    EQU    0F009H    ;CONSOLE OUTPUT
  18. ;    
  19. TADDR    EQU    40H    ;STORE FOR DMA ADDRESS
  20. UNIT    EQU    42H    ;NEW UNIT BYTE
  21. SCTR    EQU    43H    ;SECTOR
  22. TRK    EQU    44H    ;TRACK
  23. ERMASK    EQU    46H    ;ERROR MASK
  24. ERSTAT    EQU    47H    ;PRESENT ERROR STORE
  25. CMDSV    EQU    4EH    ;COMMAND SAVE
  26. SPSV    EQU    4FH    ;SP SAVE
  27. TEMP2    EQU    51H    ;2 BYTE TEMP RECORD
  28. UNITCK    EQU    55H    ;OLD UNIT BYTE
  29. SSTACK    EQU    80H    ;SYSTEM STACK
  30. COLD    EQU    80H    ;COLD START ADDRESS
  31. ;
  32. ;    PORTS FOR 1791
  33. RSET    EQU    60H        ;CONTROLLER RESET ADDRESS
  34. SELECT    EQU    63H        ;DRIVE SELECT PORT
  35. STATUS    EQU    64H        ;STATUS PORT
  36. TRACK    EQU    65H        ;TRACK PORT
  37. SECTOR    EQU    66H        ;SECTOR PORT
  38. DATA    EQU    67H        ;DATA PORT
  39. CMD    EQU    64H        ;COMMAND PORT
  40. ;
  41. RDACMD    EQU    0C0H        ;READ ADDRESS CODE
  42. RDCMD    EQU    088H        ;READ SECTOR CODE
  43. WRCMD    EQU    0A8H        ;WRITE SECTOR CODE
  44. WRTCMD    EQU    0F4H        ;WRITE TRACK CODE
  45. ;
  46. ;
  47. ;    EQUATES FOR [IX] REGISTRAR
  48. ;
  49. NSCTRS    EQU    0
  50. HEADR    EQU    1
  51. GAP1    EQU    2
  52. GAP2    EQU    3
  53. GAP3    EQU    4
  54. RSCMD    EQU    5
  55. SKNCMD    EQU    6
  56. SKCMD    EQU    7
  57. ;
  58. ;------------------------------------------------------------------------------
  59.     ORG    100H
  60. ;
  61. START:    LD    SP,STACK
  62.     LD    A,(UNIT)    ;GET TYPE OF CURRENT A: DRIVE
  63.     LD    (TEMP),A
  64. AGAIN:    LD    HL,OMSG
  65.     CALL    PMSG
  66.     LD    A,77        ;DEFALT OF 77 TRACKS /DISK
  67.     LD    (TRKNO),A
  68.     CALL    TABLEX        ;FIND OUT WHAT IS WANTED
  69.     JP    NZ,DONE
  70.     LD    A,B
  71.     LD    (UNIT),A
  72.     CALL    FMAT
  73.     JR    NZ,ERROR
  74.     LD    HL,ENDMSG
  75.     CALL    PMSG
  76.     JP    AGAIN
  77. DONE:    LD    A,(TEMP)
  78.     LD    (UNIT),A
  79.     JP    0        ;RETURN TO CPM
  80. ;
  81. ERROR:    LD    HL,ERRMSG
  82.     CALL    PMSG
  83.     JR    DONE
  84. ;
  85. PMSG    LD    A,(HL)        ;PRINT MESSAGE STRING
  86.     OR    A
  87.     RET    Z
  88.     LD    C,A
  89.     CALL    CO
  90.     INC    HL
  91.     JP    PMSG
  92. ;
  93. TABLEX:    CALL    CI        ;GET FIRST CHARACTER
  94.     PUSH    AF
  95.     LD    C,A
  96.     CALL    CO
  97.     POP    AF
  98.     CP    'D'        ;MUST WANT DD 8"
  99.     LD    B,41H
  100.     RET    Z
  101.     CP    'S'        ;MUST WANT SD 8"
  102.     LD    B,01H
  103.     RET    Z
  104.     CP    'X'        ;IS SYSTEM TRACK FORMAT REQ
  105.     LD    A,0
  106.     RET    NZ        ;RETURN IF NONE OF THE ABOVE
  107.     LD    A,2        ;SET TO FORMAT ONLY TWO TRACKS
  108.     LD    (TRKNO),A
  109.     JP    TABLEX
  110. ;    
  111. ;
  112. ;
  113. ;**************** DISK FORMAT ROUTINE *****************************************
  114. ;
  115. FMAT:    CALL    UNITFX
  116.     LD    (TEMP2),SP
  117.     PUSH    IY
  118.     PUSH    IX
  119.     PUSH    HL
  120.     LD    HL,800H
  121.     LD    (TADDR),HL
  122.     LD    (SPSV),SP
  123.     POP    HL
  124.     CALL    DRVSET
  125.     PUSH    AF        ;SWITCH ON DRIVE & LET IT GET UP TO SPEED
  126.     LD    A,00001001B    ;SEND A HEAD LOAD SIGNAL
  127.     OUT    (CMD),A
  128.     LD    A,0FFH
  129.     CALL    DELAY1
  130.     POP    AF
  131.     CALL    Z,HOME1
  132.     JR    NZ,ERXIT  
  133.     CALL    SCTRIM
  134.     CALL    TRCKIM
  135.     XOR    A
  136. IDSET:    CALL    SETID
  137.     PUSH    BC
  138.     CALL    FMAT1
  139.     CALL    NXTRK
  140.     POP    BC
  141.     JR    NZ,FINISH
  142.     PUSH    DE        ;---
  143.     LD    D,A        ;---
  144.     LD    A,(TRKNO)    ;---
  145.     CP    D        ;---
  146.     LD    A,D        ;---
  147.     POP    DE          ;---
  148. ;    CP    (IX+NTRKS)
  149.     JR    NZ,IDSET  
  150. FINISH:    POP    IX
  151.     POP    IY
  152.     RET
  153. ;
  154. ERXIT:    POP    IX
  155.     LD    SP,(TEMP2)
  156.     RET
  157. ;
  158. ;*********** SECTOR IMAGE ROUTINE *******************
  159. SCTRIM:    LD    HL,(TADDR)
  160.     LD    A,(IX+GAP2)
  161.     RRCA
  162.     LD    A,4EH
  163.     JP    NC,HEADER
  164.     LD    A,0FFH
  165. HEADER:    LD    E,A
  166.     LD    B,(IX+HEADR)
  167.     CALL    IMBLD
  168.     LD    B,(IX+GAP3)
  169.     CALL    IMBLD
  170.     XOR    A
  171.     LD    B,(IX+GAP1)
  172.     CALL    IMBLD
  173.     CALL    MRKCHK
  174. IDMARK:    LD    A,0FEH
  175.     LD    (HL),A
  176.     INC    HL
  177.     PUSH    HL
  178.     EXX
  179.     POP    DE
  180.     EXX
  181.     XOR    A
  182.     LD    B,4
  183.     CALL    IMBLD
  184.     LD    A,0F7H
  185.     LD    (HL),A
  186.     INC    HL
  187.     LD    B,(IX+GAP2)
  188.     LD    A,B
  189.     SRL    A
  190.     INC    A
  191.     LD    C,A
  192.     LD    A,E
  193.     CALL    IMBLD
  194.     LD    B,C
  195.     XOR    A
  196.     CALL    IMBLD
  197.     CALL    MRKCHK
  198.     LD    A,0FBH
  199.     LD    (HL),A
  200.     INC    HL
  201.     LD    B,128
  202.     LD    A,(UNIT)
  203.     RLCA
  204.     JR    NC,IDM
  205.     LD    B,0
  206. IDM:    LD    A,0E5H
  207.     CALL    IMBLD
  208.     LD    A,0F7H
  209.     LD    (HL),A
  210.     INC    HL
  211.     RET
  212. ;
  213. MRKCHK:    LD    A,E
  214.     OR    A
  215.     RET    M
  216.     LD    A,0F5H
  217.     LD    B,3
  218. ;
  219. IMBLD:    LD    (HL),A
  220.     INC    HL
  221.     DJNZ    IMBLD
  222.     RET
  223. ;
  224. ;********* TRACK IMAGE ROUTINE ******************
  225. TRCKIM:    EXX
  226.     LD    B,(IX+NSCTRS)
  227.     DEC    B
  228.     EXX
  229.     LD    DE,(TADDR)
  230.     PUSH    HL
  231.     OR    A
  232.     LD    C,(IX+HEADR)
  233.     LD    B,0
  234.     EX    DE,HL
  235.     ADD    HL,BC
  236.     EX    DE,HL
  237.     SBC    HL,DE
  238.     PUSH    HL
  239.     POP    BC
  240.     POP    HL
  241.     PUSH    BC
  242.     EX    DE,HL
  243.     EXX
  244. BLDTRK:    EXX
  245.     LDIR
  246.     POP    BC
  247.     PUSH    BC
  248.     EXX
  249.     DJNZ    BLDTRK  
  250.     EXX
  251.     POP    BC
  252.     EX    DE,HL            ;NOTE SIDECK: HAS BEEN REMOVED
  253.     XOR    A
  254. SCHK1:    LD    L,A            ;(NOT NEEDED WILL DO ONLY SINGLE SIDE)
  255.     LD    H,L            ;[H]=0 FOR SIDE NO
  256.     RET
  257. ;
  258. ;******* SECTOR ID ROUTINE **************
  259. SETID:    PUSH    HL
  260.     PUSH    BC
  261.     EXX
  262.     POP    BC
  263.     POP    HL
  264.     PUSH    DE
  265.     POP    IY
  266.     PUSH    DE
  267.     EX    AF,AF'
  268.     LD    D,1
  269.     LD    A,(IX+NSCTRS)
  270.     CP    26
  271.     LD    A,1
  272.     JR    Z,ID1 
  273.     LD    A,(IX+NSCTRS)
  274.     SRL    A
  275.     INC    A
  276.     JR    NC,ID2  
  277. ID1:    EX    AF,AF'
  278.     LD    (IY),A            ;PUT TRACK # @ [IY]
  279.     LD    (IY+1),H        ;SIDE NO @ [IY+2]
  280. ID1A:    EX    AF,AF'
  281.     LD    (IY+2),A
  282.     PUSH    AF
  283.     LD    A,(UNIT)
  284.     RLCA
  285.     JR    NC,ID4
  286.     LD    A,1
  287.     LD    (IY+3),A
  288. ID4:    POP    AF
  289.     CP    (IX+NSCTRS)
  290.     JR    Z,ID3  
  291.     ADD    IY,BC
  292.     INC    A
  293. ID2:    LD    E,A            ;TEMPORLY STORE SECTOR COUNT
  294.     LD    A,26
  295.     CP    (IX+NSCTRS)
  296.     LD    A,E            ;GET SECTOR COUNT BACK
  297.     JR    Z,ID1
  298.     LD    A,D
  299.     LD    D,E
  300.     JR    ID1  
  301. ID3:    EX    AF,AF'
  302.     POP    DE
  303.     EXX
  304.     RET
  305. ;
  306. ; ********** DISK FORMAT WRITE ************
  307. FMAT1:    PUSH    DE
  308.     PUSH    BC
  309.     EXX
  310.     EX    AF,AF'
  311.     POP    BC
  312.     PUSH    DE
  313.     LD    E,A
  314.     LD    D,C
  315.     LD    B,(IX+HEADR)
  316.     LD    C,DATA
  317.     LD    HL,(TADDR)
  318.     LD    A,80H
  319.     LD    (ERMASK),A
  320.     CALL    SWEB
  321.     LD    A,(UNIT)
  322.     RLCA
  323.     LD    A,0
  324.     JR    NC,FMAT3
  325.     LD    A,1
  326. FMAT3:    LD    (TEMP1),A
  327.     LD    A,WRTCMD
  328.     LD    (CMDSV),A
  329.     DI
  330.     OUT    (CMD),A
  331.     LD    A,(TEMP1)
  332.     OTIR
  333.     LD    B,D
  334. FMAT5:    OTIR
  335.     OR    A
  336.     JR    Z,FMAT4
  337.     OTIR
  338. FMAT4:    LD    B,D
  339.     DEC    E
  340.     JR    NZ,FMAT5
  341.     POP    DE
  342.     POP    HL
  343.     LD    A,(HL)
  344. OY2:    OUT    (C),A
  345.     DJNZ    OY2
  346.     EI
  347.     EXX
  348.     EX    AF,AF'
  349.     RET
  350. ;
  351. ;
  352. NXTRK:    EX    AF,AF'
  353.     LD    A,47
  354. DEL1:    DJNZ    DEL1
  355.     DEC    A
  356.     JR    NZ,DEL1  
  357.     IN    A,(SELECT)
  358.     OR    80H
  359.     OUT    (SELECT),A
  360.     EX    AF,AF'
  361.     INC    A
  362.     PUSH    DE        ;---
  363.     LD    D,A        ;---
  364.     LD    A,(TRKNO)    ;---
  365.     CP    D        ;---
  366.     LD    A,D        ;---
  367.     POP    DE        ;---
  368.     RET    Z
  369.     LD    (TRK),A
  370.     PUSH    HL
  371.     LD    (SPSV),SP
  372.     POP    HL
  373. E0:    DJNZ    E0
  374.     EXX
  375.     EX    DE,HL
  376.     LD    A,(IX+SKNCMD)
  377.     CALL    SEEK4
  378.     EX    DE,HL
  379.     EXX
  380.     IN    A,(TRACK)
  381.     LD    B,A
  382.     LD    A,(TRK)
  383.     CP    B
  384.     LD    B,0
  385.     RET
  386. ;
  387. ;
  388. ;
  389. ;    SEND A RESTORE TO DISK
  390. HOME1:    LD    (SPSV),SP
  391.     LD    A,(IX+RSCMD)
  392.     CALL    SEEK4
  393.     XOR    A
  394.     RET
  395. ;
  396. ;    CHECK DRIVE SELECT & CHANGE IF DIFFERENT
  397. DRVSET:LD    DE,UNIT
  398.     LD    A,(DE)
  399.     AND    0E0H
  400.     LD    C,A
  401.     LD    A,(DE)
  402.     AND    03
  403.     LD    B,A
  404.     LD    A,1
  405.     JR    Z,DRVSEL  
  406. CKDRV1:    RLCA
  407.     DJNZ    CKDRV1  
  408. DRVSEL:    OR    C
  409.     AND    7FH
  410.     LD    B,A
  411.     LD    A,C
  412.     LD    IX,STDSDT
  413.     CP    0
  414.     JR    Z,CKDRV  
  415.     LD    IX,STDDDT
  416.     CP    40H
  417.     JR    Z,CKDRV  
  418.     LD    IX,DDT256
  419. CKDRV:    LD    (IXSAV),IX
  420.     PUSH    BC
  421. DRVST:    POP    AF
  422.     CPL
  423.     OUT    (SELECT),A
  424.     LD    A,(DE)
  425.     LD    (UNITCK),A
  426.     CALL    DELAY
  427. RDYCK:    IN    A,(STATUS)
  428.     AND    80H
  429.     JP    NZ,END2
  430.     RET
  431. ;
  432. ;
  433. DELAY:    LD    A,(UNIT)
  434.     BIT    5,A
  435.     LD    A,39
  436.     JR    Z,DELAY1  
  437.     LD    A,60
  438. DELAY1:    LD    B,0
  439. M0:    DJNZ    M0
  440.     DEC    A
  441.     JR    NZ,DELAY1  
  442.     RET
  443. ;
  444. ;
  445. END:    CALL    WAIT
  446.     IN    A,(STATUS)
  447.     LD    D,A
  448.     LD    A,(ERMASK)
  449.     AND    D
  450.     RET    Z
  451. END1:    LD    A,D
  452. END2:    LD    (ERSTAT),A
  453.     CALL    DELAY
  454.     OR    1
  455.     LD    SP,(SPSV)
  456.     CALL    UNITFX
  457.     RET
  458. ;
  459. ;
  460. ;    SEEK TRACK
  461. SEEK4:    LD    (CMDSV),A
  462.     LD    B,210
  463. S0:    DJNZ    S0
  464.     CALL    WAIT
  465.     LD    A,(TRK)
  466.     OUT    (DATA),A
  467.     LD    A,80H
  468.     LD    (ERMASK),A
  469.     LD    A,(CMDSV)
  470.     OUT    (CMD),A
  471.     LD    B,10
  472. D0:    DJNZ    D0
  473.     CALL    END
  474.     CALL    DELAY
  475.     LD    A,(CMDSV)
  476.     CP    (IX+RSCMD)
  477.     RET    Z
  478.     IN    A,(STATUS)
  479.     AND    10H
  480.     JR    NZ,SEEK2
  481.     IN    A,(TRACK)
  482.     CP    C
  483.     RET    Z
  484. SEEK2:    LD    A,20H
  485. END2JP:    JR    END2  
  486. ;
  487. WAIT:    LD    E,0
  488.     PUSH    BC
  489.     LD    C,2
  490. WAIT2:    IN    A,(STATUS)
  491.     AND    1
  492.     JR    Z,DWAIT
  493.     DJNZ    WAIT2  
  494.     DEC    E
  495.     JR    NZ,WAIT2
  496.     DEC    C
  497.     JR    NZ,WAIT2
  498.     POP    BC  
  499.     IN    A,(SELECT)
  500.     OR    80H
  501.     OUT    (RSET),A
  502. F0:    DJNZ    F0
  503.     IN    A,(RSET)
  504.     CALL    FRCINT
  505.     LD    A,(IX+RSCMD)
  506.     CALL    SEEK4
  507.     LD    A,0FEH
  508.     JP    END2JP    
  509. ;
  510. ;    DISABLE WAIT STATES
  511. DWAIT:    POP    BC
  512.     IN    A,(SELECT)
  513.     OR    80H
  514.     OUT    (SELECT),A
  515.     RET
  516. ;
  517. ;    ENABLE WAIT STATES
  518. SWEB:    IN    A,(SELECT)
  519.     AND    7FH
  520.     OUT    (SELECT),A
  521.     RET
  522. ;
  523. ;
  524. ;    FORCE CHIP INTERUPT
  525. FRCINT:    LD    A,0D0H
  526.     OUT    (CMD),A
  527.     LD    A,10
  528. FRC1:    DEC    A
  529.     JR    NZ,FRC1
  530.     IN    A,(STATUS)
  531.     RET
  532. ;
  533. ;
  534. UNITFX:    LD    A,0FFH
  535.     LD    (UNITCK),A
  536.     RET
  537. ;
  538. ;
  539. ;------    NOTE 15H & 11H TURN ON UNDERLINE ON SD VIDIO BOARD MAY WANT TO CHANGE--
  540. ;
  541. OMSG    DB    CR,LF,LF
  542.     DB    'Enter a one letter code indicating drive density',CR,LF
  543.     DB    'Note a prefix of X before D or S means format system '
  544.     db    'tracks only.',CR,LF
  545.     DB    'Enter CR when finished',CR,LF,LF
  546.     DB    'S = ',15H,'SINGLE',11H,' DENSITY      D = '
  547.     DB    15H,'DOUBLE',11H,' DENSITY',CR,LF,0
  548. ENDMSG:    DB    CR,LF,BELL,'Disk has been formatted ',CR,LF,0
  549. ERRMSG:    DB    CR,LF,BELL,'SORRY COULD NOT SEEK NEXT TRACK',CR,LF,0
  550. ;
  551. ;
  552. ;    LOOKUP TABLES OF DISK PARAMETERS
  553. ;
  554. ;    8" SINGLE DENSITY DRIVE VARIABLES
  555. STDSDT:    DEFB    26    ;SECTORS PER TRACK
  556. ;    DEFB    77    ;TRACKS PER SIDE
  557.     DEFB    100-27    ;INDEX HEADER GAP
  558.     DEFB    6    ;GAP 1
  559.     DEFB    11    ;GAP 2
  560.     DEFB    27    ;GAP 3
  561.     DEFB    9    ;RESTORE CODE
  562.     DEFB    19H    ;SEEK NO VERIFY CODE
  563.     DEFB    1DH    ;SEEK WITH VERIFY
  564. ;    
  565. ;    8" DOUBLE DENSITY (128 BYTE SECTORS)
  566. STDDDT:    DEFB    50    ;SECTORS PER TRACK
  567. ;    DEFB    77    ;TRACKS PER SIDE
  568.     DEFB    100-16    ;HEADER GAP
  569.     DEFB    8    ;GAP 1
  570.     DEFB    22    ;GAP 2
  571.     DEFB    16    ;GAP 3
  572.     DEFB    9    ;RESTORE CODE
  573.     DEFB    19H    ;SEEK NO VERIFY
  574.     DEFB    1DH    ;SEEK WITH VERIFY
  575. ;
  576. ;    8" DOUBLE DENSITY (256 BYTE SECTORS) ----NOTE THIS FORMAT IS UNTESTED
  577. DDT256:    DEFB    26    ;NBR SECTORS PER TRACK
  578. ;    DEFB    77    ;NBR TRACKS PER SIDE
  579.     DEFB    100-54    ;INDEX HEADER GAP
  580.     DEFB    8    ;NBR GAP 1
  581.     DEFB    22    ;NBR GAP 2
  582.     DEFB    54    ;NBR GAP 3
  583.     DEFB    9    ;RESTORE CODE
  584.     DEFB    19H    ;SEEK NO VERIFY
  585.     DEFB    1DH    ;SEEK WITH VERIFY
  586. ;
  587. ;
  588. ;
  589. ;    THE FOLLOWING RAM LOCATIONS ARE REQ
  590. ;
  591. TRKNO    DB    0H    
  592. TEMP    DB    0H    
  593. TEMP1    DB    0H    
  594. IXSAV    DW    0000H    
  595.     DS    30H
  596. STACK    EQU    $
  597. ;END
  598.  
  599.