home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv009.ark / SECTOR.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  9.1 KB  |  688 lines

  1.     TITLE    'SECTOR DISK MAINTENANCE PROGRAM'
  2. ;    DERIVED 8/77 W. EARNEST
  3. ;    MODIFIED 9/77 FOR EFFICIENCY+LOGIC
  4. ;    MODIFIED 4/07/78 FOR MORE FEATURES
  5. ;    MODIFIED 1/15/79 FOR CP/M USAGE
  6. ;    MODIFIED 7/14/80 FOR CP/M REV 2.X
  7. ;
  8. BDOS    EQU    5
  9. BOOT    EQU    0    ;BDOS FUNCT CODES
  10. CONIN    EQU    1
  11. CONOU    EQU    2
  12. LIST    EQU    5
  13. PMSG    EQU    9
  14. REVNR    EQU    12
  15. GETDPB    EQU    31
  16. ;            BIOS OFFSETS
  17. SDRV    EQU    27
  18. STRK    EQU    30
  19. SSEC    EQU    33
  20. SDMA    EQU    36
  21. READ    EQU    39
  22. WRITE    EQU    42
  23. SECTRN    EQU    48
  24. ;
  25.     ORG    100H
  26. BEGIN:    LXI    SP,STACK
  27.     MVI    C,REVNR
  28.     CALL    BDOS    ;CHECK SYSTEM REVISION
  29.     MOV    A,L
  30.     ORA    A
  31.     JNZ    CPMOK    ;CURRENT SYSTEM
  32.     LXI    D,REVMSG
  33.     CALL    MSGO
  34.     JMP    EXIT    ;GIVE UP NOW
  35. ;
  36. CPMOK:    LDA    2    ;BIOS PAGE BYTE
  37.     STA    SEDMA+2
  38.     STA    FILBF+2
  39.     STA    WRTBF+2
  40.     STA    SESCT+2
  41.     STA    SETRK+2
  42.     STA    SEDRV+2
  43.     STA    SCTRN+2
  44.     LXI    B,BUFFR
  45. SEDMA:    CALL    SDMA
  46.     JMP    START
  47. ;
  48. EXIT:    CALL    CRLF
  49.     JMP    BOOT
  50. ;
  51. CO:    PUSH    PSW
  52.     PUSH    H
  53.     PUSH    D
  54.     PUSH    B
  55.     MVI    C,CONOU
  56.     MOV    E,A
  57.     CALL    BDOS
  58.     POP    B
  59.     POP    D
  60.     POP    H
  61.     POP    PSW
  62.     RET    
  63. ;
  64. CI:    MVI    C,CONIN
  65.     PUSH    H
  66.     PUSH    D
  67.     CALL    BDOS
  68.     POP    D
  69.     POP    H
  70.     ANI    7FH
  71.     CPI    1BH    ;ESC CODE
  72.     JZ    ESCCH    ;ABORT THIS COMMAND
  73.     CPI    61H    ;LOWER  CASE A
  74.     RC
  75.     ANI    5FH    ;CONVT TO UPPER
  76.     RET    
  77. ;
  78. SO:    JMP    CO    ;VARIABLE JUMP FOR PRINT
  79. ;
  80. LO:    PUSH    PSW
  81.     PUSH    H
  82.     PUSH    D
  83.     PUSH    B
  84.     MVI    C,LIST
  85.     MOV    E,A
  86.     CALL    BDOS
  87.     POP    B
  88.     POP    D
  89.     POP    H
  90.     POP    PSW
  91.     RET
  92. ;
  93. DEFUN:    LXI    D,PRMUN
  94.     CALL    MSGO
  95. UNAGN:    CALL    IN2NR
  96.     MOV    A,L
  97. KPUNT:    STA    NUNIT
  98. DEFTK:    LXI    D,PRMTK
  99.     CALL    MSGO
  100. TKAGN:    CALL    IN2NR
  101.     MOV    A,L
  102.     CPI    77
  103.     JC    KPTRK
  104.     CALL    INERR
  105.     JMP    TKAGN
  106. ;
  107. KPTRK:    STA    NTRAK
  108. DEFSC:    LXI    D,PRMSC
  109.     CALL    MSGO
  110. SCAGN:    CALL    IN2NR
  111.     DCR    L    ;START W/SCTR 1
  112.     MOV    A,L
  113. KPSCT:    STA    NSCTR
  114. MODBR:    JMP    LDBUF    ;CHGS FOR BLOCK MOVE
  115. ;
  116. LDBUF:    LDA    BUFLG
  117.     ORA    A
  118.     JNZ    WTBUF
  119.     CALL    SUPRD
  120.     CALL    FILBF
  121. PRINT:    CALL    PRBUF
  122. ;
  123. START:    LXI    SP,STACK
  124.     CALL    PRMPT
  125.     CALL    CI
  126.     SUI    'A'    ;TABLE START VALUE
  127.     JC    INVLID    ;BELOW LEGAL RANGE
  128.     CPI    'Z'-'A'+1 ;END OF TABLE
  129.     JNC    INVLID    ;ABOVE LEGAL RANGE
  130.     ADD    A    ;DOUBLE
  131.     MOV    E,A
  132.     MVI    D,0
  133.     LXI    H,DOTBL
  134.     DAD    D    ;CALCULATE VECTOR
  135.     MOV    A,M
  136.     INX    H
  137.     MOV    H,M
  138.     MOV    L,A
  139.     CALL    CRLF
  140.     PCHL        ;GO TO ROUTINE
  141. ;
  142. ESCCH:    POP    H
  143.     LXI    D,CANMSG
  144.     JMP    EMSG
  145. ;
  146. INVLID:    CALL    CRLF
  147.     LXI    D,INVAL
  148. EMSG:    CALL    MSGO
  149.     JMP    START
  150. ;
  151. DOTBL:    DW    TOMEM    ;A DISK TO MEMORY
  152.     DW    BLKMV    ;B BLOCK MOVE
  153.     DW    CHGBF    ;C CHANGE CONTENTS
  154.     DW    DMODE    ;D DECIMAL MODE
  155.     DW    EXTTBL    ;E EXTRNAL XLATE
  156.     DW    PHSTBL    ;F PHYSICAL SECTORS
  157.     DW    GENTBL    ;G LOGICAL SECTORS
  158.     DW    HMODE    ;H HEXADECIMAL MODE
  159.     DW    START    ;I
  160.     DW    START    ;J
  161.     DW    EXIT    ;K EXIT TO CP/M
  162.     DW    LSET    ;L LINE PRINTER OUT
  163.     DW    MOVE    ;M MOVE SECTOR
  164.     DW    START    ;N
  165.     DW    START    ;O
  166.     DW    PRINT    ;P PRINT BUFFER
  167.     DW    START    ;Q
  168.     DW    START    ;R
  169.     DW    DEFSC    ;S SET SECTOR
  170.     DW    DEFTK    ;T SET TRACK
  171.     DW    DEFUN    ;U SET UNIT
  172.     DW    VSET    ;V VIDEO OUTPUT
  173.     DW    WTBUF    ;W WRITE BUFF TO DISK
  174.     DW    XLATE    ;X XLATE BLOCK (INTERLACE)
  175.     DW    START    ;Y
  176.     DW    FRMEM    ;Z MEMORY TO DISK
  177. ;
  178. PHSTBL:    LXI    H,PHMAP
  179.     MVI    A,'F'
  180.     JMP    TBLST
  181. ;
  182. GENTBL:    LXI    H,GENMAP
  183.     MVI    A,'G'
  184. ;
  185. TBLST:    SHLD    HLDIT
  186.     SHLD    HLDOT
  187.     STA    PRMST
  188.     JMP    START
  189. ;
  190. XLATE:    CALL    CI
  191.     LXI    H,PHMAP
  192.     CPI    'F'
  193.     JZ    XLSET
  194.     LXI    H,GENMAP
  195.     CPI    'G'
  196.     JZ    XLSET
  197.     LXI    H,EXMAP
  198.     CPI    'E'
  199.     JZ    XLSET
  200.     JMP    INVLID
  201. ;
  202. EXTTBL:    LXI    H,EXTBL    ;TABLE FOR EXTRN SKEW
  203.     SHLD    CHGBAS
  204.     LXI    H,EXMAP
  205.     SHLD    HLDIT
  206.     SHLD    HLDOT
  207.     MVI    A,'E'
  208.     STA    PRMST
  209.     MVI    B,0
  210.     PUSH    B
  211.     JMP    CHGLP
  212. ;
  213. CHGBF:    LXI    H,BUFFR-1
  214.     SHLD    CHGBAS
  215.     CALL    IN2NR
  216.     MOV    B,L
  217.     PUSH    B
  218. CHGLP:    CALL    IN2NR
  219.     POP    B
  220.     LDA    LSTCH
  221.     CPI    0DH    ;CR?
  222.     JZ    CHEND    ;YES
  223.     MOV    C,L
  224.     MOV    A,B
  225.     CPI    129
  226.     JNC    RGERR
  227.     LHLD    CHGBAS
  228.     ADD    L
  229.     MOV    L,A
  230.     JNC    NCARY
  231.     INR    H
  232. NCARY:    MOV    M,C
  233.     INR    B
  234.     PUSH    B
  235.     LDA    LSTCH
  236.     CPI    '.'
  237.     JNZ    CHGLP
  238.     POP    B
  239. CHEND:    CALL    CRLF
  240.     JMP    START
  241. ;
  242. RGERR:    LXI    D,RNMSG
  243.     JMP    EMSG
  244. ;
  245. WTBUF:    CALL    SUPWT
  246.     CALL    WRTBF
  247.     XRA    A
  248.     STA    BUFLG
  249.     JMP    START
  250. ;
  251. MOVE:    CALL    CRLF
  252.     LXI    D,ADMSG
  253.     CALL    MSGO
  254.     MVI    A,1
  255.     STA    BUFLG    ;MARK TO BE WRITTEN
  256.     CALL    CRLF
  257.     JMP    DEFUN
  258. ;
  259. XLSET:    SHLD    HLDOT
  260. BLKMV:    LXI    D,FRMMG
  261.     LXI    H,RDSTU
  262. STUCOM:    SHLD    MODBR+1
  263.     CALL    MSGO
  264.     CALL    CRLF
  265.     JMP    DEFUN
  266. ;
  267. RDSTU:    LHLD    NSCTR
  268.     SHLD    RSCTR
  269.     LHLD    NTRAK
  270.     SHLD    RTRAK
  271.     LXI    D,TOMSG
  272.     LXI    H,WTSTU
  273.     JMP    STUCOM
  274. ;
  275. WTSTU:    LXI    D,SIZMG
  276.     CALL    MSGO
  277.     CALL    INNRS
  278.     SHLD    SCTCT
  279.     LXI    H,LDBUF
  280.     SHLD    MODBR+1
  281. MORBL:    CALL    SUPBK
  282.     CALL    FILBF
  283.     CALL    SUPWT
  284.     CALL    WRTBF
  285.     LXI    H,NSCTR
  286.     CALL    INCAD
  287.     LXI    H,RSCTR
  288.     CALL    INCAD
  289.     LHLD    SCTCT
  290.     DCX    H
  291.     SHLD    SCTCT
  292.     MOV    A,L
  293.     ORA    H
  294.     JNZ    MORBL
  295.     JMP    START
  296. ;
  297. INCAD:    INR    M
  298.     LDA    SPERT
  299.     CMP    M
  300.     JZ    TKEND
  301.     RNC
  302. TKEND:    MVI    M,0
  303.     INX    H
  304.     INX    H
  305.     INR    M
  306.     RET
  307. ;
  308. PRMPT    LXI    D,PRMST    ;PROMPT STRING
  309.     JMP    MSGO
  310. ;
  311. INERR:    LXI    D,ERRMG
  312. MSGO:    MVI    C,PMSG
  313.     JMP    BDOS
  314. ;
  315. LMSG:    CALL    PCRLF
  316. LMSGL:    LDAX    D
  317.     CPI    '$'
  318.     RZ
  319.     CALL    SO
  320.     INX    D
  321.     JMP    LMSGL
  322. ;
  323. IN2NR:    CALL    INNRS
  324.     MOV    A,H
  325.     ORA    A
  326.     RZ
  327.     LXI    D,LMSG1
  328.     CALL    MSGO
  329.     JMP    IN2NR
  330. ;
  331. INNRS:    LXI    H,0
  332. NRSLP:    PUSH    H
  333.     CALL    CI
  334.     STA    LSTCH
  335.     CPI    0DH
  336.     POP    H
  337.     JZ    LINFD
  338.     CPI    ','
  339.     RZ    
  340.     CPI    '.'
  341.     RZ    
  342.     CALL    HEXBI
  343.     JNC    NRSLP
  344.     LXI    D,LMSG2
  345.     CALL    MSGO
  346.     JMP    INNRS
  347. ;
  348. LINFD:    MVI    A,0AH
  349.     JMP    CO
  350. ;
  351. HEXBI:    CPI    '0'
  352.     RC    
  353.     CPI    '9'+1
  354.     JC    CVNUM
  355.     CPI    'A'
  356.     RC    
  357.     CPI    'G'
  358. ALJMP:    JC    CVALP
  359. NRBAD:    STC    
  360.     RET    
  361. ;
  362. CVALP:    ADI    9
  363. CVNUM:    ANI    0FH
  364.     PUSH    H
  365.     POP    D
  366.     DAD    H
  367.     RC    
  368.     DAD    H
  369.     RC    
  370. HDCHG:    DAD    H
  371.     RC    
  372.     DAD    H
  373.     RC    
  374.     ADD    L
  375.     MOV    L,A
  376.     RET    
  377. ;
  378. DMODE:    MVI    A,'D'
  379.     STA    PRMST+1
  380.     MVI    A,19H    ;DAD D
  381.     LXI    H,NRBAD
  382. MDCOM:    STA    HDCHG
  383.     SHLD    ALJMP+1
  384.     JMP    START
  385. ;
  386. HMODE:    MVI    A,'H'
  387.     STA    PRMST+1
  388.     MVI    A,29H    ;DAD    H
  389.     LXI    H,CVALP
  390.     JMP    MDCOM
  391. ;
  392. CRLF:    MVI    A,0DH
  393.     CALL    CO
  394.     MVI    A,0AH
  395.     JMP    CO
  396. ;
  397. FILBF:    JMP    READ
  398. ;
  399. WRTBF:    JMP    WRITE
  400. ;
  401. SUPBK:    LDA    RUNIT
  402.     MOV    C,A
  403.     CALL    SEDRV
  404.     LDA    RTRAK
  405.     ANI    7FH
  406.     MOV    C,A
  407.     CALL    SETRK
  408.     LHLD    RSCTR
  409.     XCHG
  410.     LXI    H,HLDIT
  411.     JMP    GTSEC
  412. ;
  413. SUPRD:    LXI    H,HLDIT
  414. SUUTK:    PUSH    H
  415.     LDA    NUNIT
  416.     MOV    C,A
  417.     CALL    SEDRV
  418.     LDA    NTRAK
  419.     ANI    7FH
  420.     MOV    C,A
  421.     CALL    SETRK
  422.     LHLD    NSCTR
  423.     XCHG
  424.     POP    H
  425.     JMP    GTSEC
  426. ;
  427. SUPWT:    LXI    H,HLDOT
  428.     JMP    SUUTK
  429. ;
  430. SEDRV:    CALL    SDRV
  431.     MOV    A,H
  432.     ORA    L
  433.     JZ    UNIERR
  434.     MOV    E,M
  435.     INX    H
  436.     MOV    D,M
  437.     XCHG
  438.     SHLD    XLTADR
  439.     LXI    H,9
  440.     DAD    D
  441.     MOV    E,M
  442.     INX    H
  443.     MOV    D,M
  444.     XCHG
  445.     MOV    A,M
  446.     STA    SPERT
  447.     RET
  448. ;
  449. SETRK:    JMP    STRK
  450. UNIERR:    LXI    D,UNERMG
  451.     JMP    EMSG
  452. ;
  453. TOMEM:    LXI    D,MVMSG
  454.     CALL    MSGO
  455.     CALL    INNRS
  456.     LXI    D,BUFFR
  457. MVCOM:    MVI    B,128
  458. MMVLP:    LDAX    D
  459.     MOV    M,A
  460.     INX    D
  461.     INX    H
  462.     DCR    B
  463.     JNZ    MMVLP
  464.     JMP    START
  465. ;
  466. FRMEM:    LXI    D,MVMSG
  467.     CALL    MSGO
  468.     CALL    INNRS
  469.     LXI    D,BUFFR
  470.     XCHG
  471.     JMP    MVCOM
  472. ;
  473. PRBUF:    LDA    NUNIT
  474.     ORI    '0'
  475.     STA    IDMSG+5
  476.     LDA    NTRAK
  477.     LXI    H,IDMSG+13
  478.     CALL    PBYT
  479.     LDA    NSCTR
  480.     INR    A
  481.     LXI    H,IDMSG+23
  482.     CALL    PBYT
  483.     LXI    D,IDMSG
  484.     CALL    LMSG
  485.     LXI    D,BUFFR
  486.     PUSH    D
  487.     CALL    PCRLF
  488.     MVI    A,1
  489. PRBGN:    STA    PRPTR
  490.     POP    D
  491. PRILP:    PUSH    D
  492.     LDA    PRPTR
  493.     CALL    PRADR
  494.     POP    D
  495.     PUSH    D
  496.     CALL    PRSPC
  497.     CALL    PR4BT
  498.     CALL    PRSPC
  499.     CALL    PR4BT
  500.     CALL    PRSPC
  501.     CALL    PR4BT
  502.     CALL    PRSPC
  503.     CALL    PR4BT
  504.     CALL    PRSPC
  505.     POP    D
  506.     CALL    PRLIT
  507.     PUSH    D
  508.     CALL    PCRLF
  509.     POP    D
  510.     LDA    PRPTR
  511.     ADI    10H
  512.     STA    PRPTR
  513.     CPI    81H
  514.     JNZ    PRILP
  515.     RET    
  516. ;
  517. PR4BT:    CALL    PRHWD
  518.     CALL    PRHWD
  519.     RET    
  520. ;
  521. PRHWD:    LDAX    D
  522.     INX    D
  523.     MOV    H,A
  524.     LDAX    D
  525.     INX    D
  526.     MOV    L,A
  527.     PUSH    D
  528.     CALL    HEXCH
  529.     POP    D
  530.     RET    
  531. ;
  532. PBYT:    PUSH    PSW
  533.     RAR
  534.     RAR
  535.     RAR
  536.     RAR
  537.     CALL    CNIB
  538.     POP    PSW
  539. CNIB:    ANI    0FH
  540.     CPI    10
  541.     JC    NNIB
  542.     ADI    7
  543. NNIB:    ADI    '0'
  544.     MOV    M,A
  545.     INX    H
  546.     RET
  547. ;
  548. PRSPC:    MVI    A,' '
  549.     JMP    SO
  550. ;
  551. PRLIT:    MVI    A,'*'
  552.     CALL    SO
  553.     MVI    B,10H
  554. LITLP:    LDAX    D
  555.     INX    D
  556.     CPI    ' '
  557.     JC    INVIS
  558.     CPI    80H
  559.     JNC    INVIS
  560. LITBR:    CALL    SO
  561.     DCR    B
  562.     JNZ    LITLP
  563.     MVI    A,'*'
  564.     JMP    SO
  565. ;
  566. INVIS:    MVI    A,'.'
  567.     JMP    LITBR
  568. ;
  569. PRADR:    MOV    L,A
  570.     MVI    H,0
  571. HEXCH:    MVI    D,4
  572. HEXLP:    XRA    A
  573.     DAD    H
  574.     RAL    
  575.     DAD    H
  576.     RAL    
  577.     DAD    H
  578.     RAL    
  579.     DAD    H
  580.     RAL    
  581.     CPI    10
  582.     JC    NTALP
  583.     ADI    7
  584. NTALP:    ADI    '0'
  585.     CALL    SO
  586.     DCR    D
  587.     JNZ    HEXLP
  588.     RET    
  589. ;
  590. PCRLF:    MVI    A,0AH
  591.     CALL    SO
  592.     MVI    A,0DH
  593.     JMP    SO
  594. ;
  595. LSET:    LXI    H,LO
  596.     MVI    A,'L'
  597. PSET:    SHLD    SO+1
  598.     STA    PRMST+2
  599.     JMP    START
  600. ;
  601. VSET:    LXI    H,CO
  602.     MVI    A,'V'
  603.     JMP    PSET
  604. ;
  605. GTSEC:    LDA    SPERT
  606.     CMP    E    ;NR WANTED
  607.     JZ    SECERR
  608.     JC    SECERR
  609.     MOV    A,M
  610.     INX    H
  611.     MOV    H,M
  612.     MOV    L,A
  613.     PCHL
  614. ;
  615. SECERR:    LXI    D,SECERM
  616.     JMP    EMSG
  617. ;
  618. PHMAP:    MOV    C,E
  619.     INR    C
  620. SESCT:    JMP    SSEC
  621. ;
  622. EXMAP:    LXI    H,EXTBL
  623.     SHLD    XLTADR
  624. ;
  625. GENMAP:    MOV    C,E
  626.     MOV    B,D
  627.     LHLD    XLTADR
  628.     XCHG
  629. SCTRN:    CALL    SECTRN
  630.     MOV    C,L
  631.     JMP    SESCT
  632. ;
  633. EXTBL:    DB    1,2,3,4,5
  634.     DB    6,7,8,9,10
  635.     DB    11,12,13,14,15
  636.     DB    16,17,18,19,20
  637.     DB    21,22,23,24,25
  638.     DB    26,27,28,29,30
  639.     DB    31,32,33,34,35
  640.     DB    36,37,38,39,40
  641.     DB    41,42,43,44,45
  642.     DB    46,47,48,49,50
  643.     DB    51,52,53,54,55
  644.     DB    56,57,58,59,60
  645.     DB    61,62,63,64
  646. ;
  647. REVMSG:    DB    'Not valid CP/M revision!!$'
  648. INVAL:    DB    'Invalid Command:$'
  649. RNMSG:    DB    'Range exceeded:$'
  650. PRMTK:    DB    'Enter Track:$'
  651. PRMSC:    DB    'Enter Sector:$'
  652. PRMUN:    DB    'Enter Unit:$'
  653. FRMMG:    DB    'Enter Sending address:$'
  654. TOMSG:    DB    'Enter Receiving address:$'
  655. SIZMG:    DB    'Enter Number of Sectors to move:$'
  656. ADMSG:    DB    'Enter new address:$'
  657. MVMSG:    DB    'Enter Memory address:$'
  658. IDMSG:    DB    'Unit X,Track XX,Sector XX$'
  659. ERRMG:    DB    'RETYPE:$'
  660. LMSG1:    DB    '2 Hex Digit limit. Retype:$'
  661. LMSG2:    DB    '4 Hex Digit limit. Retype:$'
  662. UNERMG:    DB    'Invalid Unit number',0DH,0AH,'$'
  663. SECERM:    DB    'Invalid Sector number',0DH,0AH,'$'
  664. CANMSG:    DB    'Cancelled',0dh,0ah,'$'
  665. PRMST:    DB    'GHV==>$'
  666. ;
  667. ;    DONT MOVE THE NEXT 6 ITEMS
  668. NSCTR:    DW    0    ;XTRA BYTE FOR TBL CALC PAD    
  669. NTRAK:    DB    0    
  670. NUNIT:    DB    0    
  671. RSCTR:    DW    0
  672. RTRAK:    DB    0
  673. RUNIT:    DB    0
  674. SCTCT:    DW    0
  675. BUFLG:    DB    0
  676. HLDIT:    DW    GENMAP    ;CP/M IS DEFAULT
  677. HLDOT:    DW    GENMAP    ;CP/M FOR OUT ALSO
  678. CHGBAS:    DW    0    ;BASE ADDR FOR BYTE CHANGES
  679. XLTADR:    DW    EXTBL    ;POINT AT SOMETHING
  680. SPERT:    DB    26    ;SECTORS PER TRACK
  681. LSTCH:    DS    1
  682. PRPTR:    DS    1
  683.     DS    24
  684. STACK:    DS    2
  685. BUFFR:    DS    128
  686. ;
  687.     END
  688.