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 / CPM / UTILS / DIRUTL / CDIR11.LBR / CDIR12.AQM / CDIR12.ASM
Assembly Source File  |  2000-06-30  |  11KB  |  545 lines

  1. ;       CDIR - A program to compare directories of two disks.
  2. ;
  3. ;Written by:    Robert Wilcox
  4. ;        920 N. Washington St.
  5. ;        Owosso,  MI     48867
  6. ;
  7. ;Date:        15 Sept. 82
  8. ;
  9. ;------- Revisions --------
  10. ;
  11. ; v1.2        Added equates for Kaypro computers and made a Kaypro-only
  12. ; 04/02/86    version (CDIR-K84.COM) with even more video equates used.
  13. ;
  14. ;        Steve Sanders, TBKUG/DataCOM Super Systems
  15. ;        (813) 791-1454 or 791-1455 modem  300/1200/2400
  16. ;
  17. ;-----
  18. ;
  19. ; v1.1         Fixes and mods by Mark Pulver
  20. ;
  21. ;--------------------------------------------------------------------
  22. ;
  23. ;Operation: CDIR<CR> prints a directory of files of the disk in drive
  24. ;           A, with files that are also on drive B indicated by the
  25. ;           file name being in reverse video if the terminal supports
  26. ;           it, or by "*" if it does not.
  27. ;
  28. ;           Wild cards (CDIR *.ASM, CDIR test?.as?, etc. are supported.
  29. ;
  30. ;           CDIR ?<CR> gives a help message.
  31. ;
  32. ;           Any key pressed while the directory is being printed aborts
  33. ;           the program.
  34. ;
  35. ;software system used:  CP/M 2.2
  36. ;terminals supported:     ADDS Viewpoint/3A Plus
  37. ;                       Heath H-19
  38. ;                       Imsai VIO
  39. ;            Televideo series
  40. ;            Wyse50
  41. ;            ADM3A/Kaypro
  42. ;
  43. ;-----------------------------------------------------------------------------
  44. ;                          terminal codes (hex)                              ;
  45. ;-----------------------------------------------------------------------------
  46. ;           clear  cursor erase to   address    set/reset       set attribute:
  47. ;           screen up     end of pg  cursor     attribute flag  reverse video
  48. ;           ------ ------ ---------  ---------  --------------  --------------
  49. ;ADDS 3A    1A     0B     1B,59      1B,3D,r,c  1B,29/1B,28     1B,30,50
  50. ;Heath H-19 1B,45  1B,41  1B,4A      1B,59,r,c  1B,70/1B,71       n/a
  51. ;Imsai VIO  1A     0B     15         1B,3D,r,c  1B,56/1B,56       n/a
  52. ;Televideo  1A     0B     1B,59      1B,3D,r,c  1B,29/1B,28       n/a   
  53. ;Wyse50 (same as Televideo)
  54. ;Kaypro     1A     0B     17         1B,3D,r,c  1B,42,30/1B,43,30  n/a
  55. ;
  56. FALSE    EQU    0
  57. TRUE    EQU    NOT FALSE
  58. ;
  59. ;One and only one of the following conditionals should be true
  60. ;to select the visual attributes and cursor addressing for the
  61. ;terminal used.
  62. ;
  63. ADDS    EQU    FALSE
  64. HEATH    EQU    FALSE
  65. IMSAI    EQU    FALSE
  66. TVI    EQU    FALSE        ;also Wyse50
  67. ;
  68. KAYPRO  EQU    TRUE
  69. ;
  70. ;
  71. OTHER    EQU    FALSE    ;used if the terminal used does not support
  72.             ;cursor addressing or reverse video
  73. ;
  74. ;CP/M FUNCTION CODES - PASS IN REGISTER C TO BDOS
  75. RCCFC    EQU    01    ;READ CONSOLE CHARACTER
  76. WCCFC    EQU    02    ;WRITE CONSOLE CHARACTER
  77. WCBFC    EQU    09    ;WRITE CONSOLE BUFFER
  78. GCSFC    EQU    11    ;GET CONSOLE STATUS
  79. RESET    EQU    13    ;DISK RESET
  80. SRFFC    EQU    17    ;SEARCH FIRST
  81. SRNFC    EQU    18    ;SEARCH NEXT
  82. ;
  83. ;CP/M ADDRESS EQUATES
  84. ;
  85. BDOS    EQU    0005H    ;BDOS ENTRY POINT
  86. SFCB    EQU    005CH    ;SYSTEM FILE CONTROL BLOCK
  87. DBUF    EQU    0080H    ;SYSTEM DISK BUFFER
  88. ;
  89. ;ASCII EQUATES
  90. ;
  91. BEL    EQU    07H        ;BELL
  92. LF    EQU    0AH        ;LINE FEED
  93. VT    EQU    0BH        ;VERTICAL TAB (CTRL-K)
  94. CR    EQU    0DH        ;CARRIAGE RETURN
  95. NAK    EQU    15H        ;CTRL-U
  96. CLR    EQU    1AH        ;CTRL-Z/CLEAR SCREEN
  97. ESC    EQU    1BH        ;ESCAPE
  98. EOS    EQU    '$'        ;END OF STRING
  99. ;
  100. PRTN:    EQU    4        ;number of file names on a line
  101. ;
  102.     ORG    0100H        ;program originate address
  103. ;
  104. START:    LXI    H,0        ;begin by saving system
  105.     DAD    SP        ;stack pointer and setting
  106.     SHLD    OLDSP        ;program stack
  107.     LXI    SP,STACK+64
  108. ;
  109.     LXI    D,MSG0
  110.     CALL    WASC        ;print program title
  111. ;
  112. ;    print a help message if '?' was
  113. ;    typed after the program name.
  114. ;
  115.     lda    dbuf        ;look at dbuf
  116.     ana    a        ;see if anything typed after "CDIR"
  117.     jz    makefcb        ;if not, make like "CDIR *.*"
  118.     cpi    2        ;2 characters (" ?") typed?
  119.     jnz    nohelp        ;no -
  120.     lda    dbuf+2        ;if yes, was it '?'
  121.     cpi    '?'
  122.     jnz    nohelp
  123.     lxi    d,helpmsg    ;if '?' type help message and
  124.     call    wasc        ;return to cp/m
  125.     jmp    exit
  126. ;
  127. makefcb:
  128.     lxi    h,fcba        ;if no file specifications typed,
  129.     lxi    d,sfcb        ;make it as if "*.*" was typed.
  130.     mvi    b,16
  131.     call    move
  132. ;
  133. nohelp:;            ;program continues - -
  134.     LXI    D,MSG2
  135.     CALL    WASC        ;give instructions
  136. WAIT:    CALL    RACC        ;wait for <CR>
  137.     CPI    ' '        ;space returns
  138.     JZ    DONE        ;to CP/M
  139.     CPI    CR
  140.     JNZ    WAIT
  141.     MVI    C,RESET
  142.     CALL    BDOS
  143.     LXI    D,MSG1
  144.     CALL    WASC        ;print header
  145.     LXI    D,SFCB
  146.     CALL    GETFL        ;get file list
  147.     LDA    FLCNT
  148.     ORA    A
  149.     JZ    NONE        ;no matching files on drive A
  150.     MVI    A,PRTN
  151.     STA    PCOUNT
  152. ;
  153. LOOP:    CALL    CKABRT        ;check if any key pressed
  154.                 ;abort if so.
  155.     LHLD    FLPTR        ;HL = ptr to next name
  156.     LXI    D,SFCB        ;DE = destination addr
  157.     MVI    B,16        ;# bytes to move
  158.     CALL    MOVE
  159.     SHLD    FLPTR        ;update file list ptr
  160.     MVI    A,2        ;set drive specification for B
  161.     STA    SFCB
  162.     LXI    D,SFCB        ;search for file
  163.     CALL    SRCHF        ;on drive B.
  164.     INR    A
  165.     PUSH    PSW
  166. ;
  167.     IF    NOT OTHER
  168.     JZ    LOOP1
  169.     LXI    D,MSG6        ;set attribute tag
  170.     CALL    WASC
  171.     ENDIF
  172. ;
  173. LOOP1:
  174.     MVI    A,' '
  175.     CALL    WACC        ;print a space
  176.     LXI    H,SFCB+1    ;point to file name
  177.     MVI    B,8
  178.     CALL    PMSG        ;print file name
  179.     MVI    A,' '
  180.     CALL    WACC        ;print a space
  181.     MVI    B,3
  182.     CALL    PMSG        ;print file type
  183.     MVI    A,' '
  184.     CALL    WACC        ;print a space
  185.     POP    PSW
  186.     JZ    LOOP2
  187.     LXI    D,MSG7        ;reset attribute tag
  188.                 ;or "*"
  189.     CALL    WASC
  190. ;
  191.     IF    OTHER
  192.     JMP    LOOP3
  193. ;
  194. LOOP2:
  195.     MVI    A,' '
  196.     CALL    WACC
  197.     ENDIF
  198. ;
  199.     IF    NOT OTHER
  200. LOOP2:
  201.     ENDIF
  202. ;
  203. LOOP3:    LXI    H,FLCNT        ;decrement filelist count
  204.     DCR    M        ;and quit if no files left,
  205.     JZ    DONE        ;otherwise continue.
  206.     LXI    H,PCOUNT
  207.     DCR    M        ;if this line is full skip the
  208.     JZ    LOOP4        ;spaces and start a new line.
  209.     LXI    D,SPACES
  210.     CALL    WASC        ;print "  |  "
  211.     JMP    LOOP        ;and get next file name
  212. ;
  213. LOOP4:    CALL    WEOLC        ;start a new line
  214.     MVI    A,PRTN
  215.     STA    PCOUNT
  216.     JMP    LOOP        ;and get next file name.
  217. ;
  218. CKABRT:    MVI    C,GCSFC        ;get console status function code
  219.     CALL    BDOS
  220.     ANA    A        ;set flags..A=0 if no key pressed
  221.     RZ
  222.     CALL    RACC
  223. ;
  224. DONE:    CALL    WEOLC
  225.     LXI    D,MSG4
  226.     CALL    WASC
  227.     CALL    RACC
  228.     MVI    C,RESET
  229.     CALL    BDOS
  230. ;
  231.     IF    NOT OTHER
  232.     LXI    D,MSG5
  233.     CALL    WASC
  234.     ENDIF
  235. ;
  236.     JMP    EXIT        ;back to CP/M
  237. NONE:    LXI    D,MSG3
  238.     CALL    WASC
  239. ;
  240. ;EXIT ROUTINE RESETS SYSTEM STACK AND RETURNS TO CP/M
  241. ;
  242. EXIT:    LHLD    OLDSP
  243.     SPHL
  244.     RET
  245. ;
  246. GETFL:    LXI    H,FLIST        ;FLPTR = FWA OF FILELIST
  247.     SHLD    FLPTR
  248.     XRA    A        ;FLCNT = 0
  249.     STA    FLCNT
  250.     PUSH    D
  251. GETFL1:    CALL    SRCHF        ;SEARCH FOR FIRST OCCURRENCE
  252.     CPI    255        ;JUMP IF NONE FOUND
  253.     JZ    GETFL3
  254. GETFL2:    ANI    03H        ;DE = DBUF + 32 * (A AND 3)
  255.     ADD    A
  256.     ADD    A
  257.     ADD    A
  258.     ADD    A
  259.     ADD    A
  260.     MOV    L,A
  261.     MVI    H,0
  262.     LXI    D,DBUF
  263.     DAD    D
  264.     XCHG
  265.     LHLD    FLPTR        ;HL = FILE LIST PTR
  266.     XCHG
  267.     MVI    B,16        ;B = # OF BYTES TO MOVE
  268.     CALL    MOVE
  269.     XCHG
  270.     SHLD    FLPTR        ;UPDATE FILELIST POINTER
  271.     LXI    H,FLCNT        ;INCREMENT FILELIST COUNT
  272.     INR    M
  273.     POP    D
  274.     PUSH    D
  275.     CALL    SRCHN        ;SEARCH FOR NEXT OCCURRENCE
  276.     CPI    255        ;LOOP IF ANOTHER FOUND
  277.     JNZ    GETFL2
  278. GETFL3:    POP    D
  279.     LXI    H,FLIST        ;RESET FILELIST POINTER
  280.     SHLD    FLPTR
  281.     RET
  282. ;
  283. MOVE:    MOV    A,M        ;move B bytes from HL to DE
  284.     INX    H
  285.     STAX    D
  286.     INX    D
  287.     DCR    B
  288.     JNZ    MOVE
  289.     RET
  290. ;
  291. ;SEARCH FOR FIRST OCCURRENCE OF FILE
  292. ;ON ENTRY DE POINTS TO FCB
  293. ;RETURNS 0, 1, 2 OR 3 IF FOUND, 255 IF NOT FOUND
  294. ;
  295. SRCHF:    PUSH    H
  296.     PUSH    D
  297.     PUSH    B
  298.     MVI    C,SRFFC
  299.     CALL    BDOS
  300.     POP    B
  301.     POP    D
  302.     POP    H
  303.     RET
  304.  
  305. ;SEARCH FOR NEXT OCCURRENCE OF FILE
  306. ;
  307. SRCHN:    PUSH    H
  308.     PUSH    D
  309.     PUSH    B
  310.     MVI    C,SRNFC
  311.     CALL    BDOS
  312.     POP    B
  313.     POP    D
  314.     POP    H
  315.     RET
  316. ;
  317. ;READ CONSOLE CHARACTER
  318. ;EXIT: CHARACTER IN ACCUM.
  319. ;
  320. RACC:    PUSH    H
  321.     PUSH    D
  322.     PUSH    B
  323.     MOV    E,A
  324.     MVI    C,RCCFC
  325.     CALL    BDOS
  326.     POP    B
  327.     POP    D
  328.     POP    H
  329.     RET
  330. ;
  331. ;WASC - WRITE BUFFER TO CONSOLE
  332. ;ENTRY - DE POINTS TO MESSAGE BUFFER
  333. ;MSG MUST END IN '$'
  334. ;
  335. WASC:    PUSH    H
  336.     PUSH    D
  337.     PUSH    B
  338.     MVI    C,WCBFC
  339.     CALL    BDOS
  340.     POP    B
  341.     POP    D
  342.     POP    H
  343.     RET
  344. ;
  345. ;WEOLC - WRITE END OF LINE (CR,LF)
  346. ;
  347. WEOLC:    MVI    A,CR
  348.     CALL    WACC
  349.     MVI    A,LF
  350. ;
  351. ;WRITE CONSOLE CHARACTER
  352. ;ENTRY: CHARACTER IN ACCUM.
  353. ;
  354. WACC:    PUSH    H
  355.     PUSH    D
  356.     PUSH    B
  357.     MOV    E,A
  358.     MVI    C,WCCFC
  359.     CALL    BDOS
  360.     POP    B
  361.     POP    D
  362.     POP    H
  363.     RET
  364. ;
  365. PMSG:    MOV    A,M        ;prints B characters
  366.     CALL    WACC        ;pointed at by HL
  367.     INX    H
  368.     DCR    B
  369.     JNZ    PMSG
  370.     RET
  371. ;
  372. ;
  373. ;
  374. ;MESSAGE AND STORAGE AREA
  375. ;
  376. MSG0:
  377.     IF (ADDS OR IMSAI OR TVI OR KAYPRO)
  378.     DB    CLR
  379.     ENDIF
  380. ;
  381.     IF    HEATH
  382.     DB    ESC,'E'
  383.     ENDIF
  384. ;
  385.     IF    KAYPRO        ;fancy underlining
  386.     DB    ESC,'B3',' Compare DIRectories  -  Ver 1.2kp '
  387.     DB    ESC,'C3',CR,LF,EOS
  388.     ENDIF
  389. ;
  390.     DB    'CDIR  -  Ver 1.2',CR,LF,EOS
  391. MSG1:
  392.     IF    (ADDS OR TVI)
  393.     DB    ESC,'=! ',ESC,'Y'
  394.     ENDIF
  395. ;
  396.     IF    KAYPRO
  397.     DB    ESC,'=! ',17H
  398.     ENDIF
  399. ;
  400.     IF    HEATH
  401.     DB    ESC,'Y! ',ESC,'J'
  402.     ENDIF
  403. ;
  404.     IF    IMSAI
  405.     DB    ESC,'=! ',NAK
  406.     ENDIF
  407. ;
  408.     DB    CR,LF,'DIR of drive A:,  Files also found on B: are '
  409. ;
  410.     IF    OTHER
  411.     DB    'indicated by "*".'
  412.     ENDIF
  413. ;
  414.     IF    ADDS
  415.     DB    ESC,')','Reversed.'
  416.     DB    ESC,'(',ESC,'0P'
  417.     ENDIF
  418. ;
  419.     IF    KAYPRO
  420.     DB    ESC,'B0','Reversed.'
  421.     DB    ESC,'C0'
  422.     ENDIF
  423. ;
  424.     IF    HEATH
  425.     DB    ESC,'p','Reversed.'
  426.     DB    ESC,'q'
  427.     ENDIF
  428. ;
  429.     IF    IMSAI
  430.     DB    ESC,'V','Reversed.'
  431.     DB    ESC,'V'
  432.     ENDIF
  433. ;
  434.     IF    TVI
  435.     DB    ESC,')','Lo-Intensity.'
  436.     DB    ESC,'('
  437.     ENDIF
  438. ;
  439.     DB    CR,LF,LF,EOS
  440. ;
  441. MSG2:    DB    CR,LF
  442.     DB    'Place one disk in drive A and the other in drive B',CR,LF,LF
  443.     DB    '   Press:      <RETURN>      to start',cr,lf
  444.     DB    '               <SPACE-BAR>   to quit   > ',EOS
  445. MSG3:    DB    'there are no files on drive A:',EOS
  446. MSG4:    DB    cr,lf,'Replace system disk in A: then press <RETURN>: ',EOS
  447. ;
  448.     IF    (ADDS OR TVI)
  449. MSG5:    DB    VT,ESC,'Y',EOS
  450.     ENDIF
  451. ;
  452.     IF    KAYPRO
  453. MSG5:    DB    VT,17H,EOS
  454.     ENDIF
  455. ;
  456.     IF    IMSAI
  457. MSG5:    DB    VT,NAK
  458.     ENDIF
  459. ;
  460.     IF    HEATH
  461. MSG5:    DB    ESC,'A',ESC,'J'
  462.     ENDIF
  463. ;
  464.     IF    (ADDS OR TVI)
  465. MSG6:    DB    ESC,')',EOS
  466. MSG7:    DB    ESC,'(',EOS
  467.     ENDIF
  468. ;
  469.     IF    KAYPRO
  470. MSG6:    DB    ESC,'B0',EOS
  471. MSG7:    DB    ESC,'C0',EOS
  472.     ENDIF
  473. ;
  474.     IF    HEATH
  475. MSG6:    DB    ESC,'p',EOS
  476. MSG7:    DB    ESC,'q',EOS
  477.     ENDIF
  478. ;
  479.     IF    IMSAI
  480. MSG6:    EQU    ESC,'V',EOS
  481. MSG7:    DB    ESC,'V',EOS
  482.     ENDIF
  483. ;
  484.     IF    OTHER
  485. MSG7:    DB    '*',EOS
  486.     ENDIF
  487. ;
  488. HELPMSG:
  489.     DB    CR,LF
  490.     DB    'CDIR - Displays the directory of disk A:, files which',cr,lf
  491.     DB    '       also exist on disk B: are shown in  '
  492. ;
  493.     IF    ADDS
  494.     DB    ESC,')','Reverse'
  495.     DB    ESC,'(',ESC,'0P'
  496.     ENDIF
  497. ;
  498.     IF    KAYPRO
  499.     DB    ESC,'B0','Reverse'
  500.     DB    ESC,'C0'
  501.     ENDIF
  502. ;
  503.     IF    HEATH
  504.     DB    ESC,'p','Reverse'
  505.     DB    ESC,'q'
  506.     ENDIF
  507. ;
  508.     IF    IMSAI
  509.     DB    ESC,'V','Reverse'
  510.     DB    ESC,'V'
  511.     ENDIF
  512. ;
  513.     IF     TVI
  514.     DB    ESC,')','Lo-Intensity'
  515.     DB    ESC,'('
  516.     ENDIF
  517. ;
  518.     IF    OTHER
  519.     DB    '"*".'
  520.     ENDIF
  521. ;
  522.     IF    NOT OTHER
  523.     DB    '  video.'
  524.     ENDIF
  525. ;
  526.     DB    cr,lf,lf,lf
  527.     DB    'Usage:    CDIR<CR>',CR,LF
  528.     DB    '    CDIR *.*<CR>',CR,LF
  529.     DB    '    CDIR *.COM<CR>',CR,LF
  530.     DB    '    CDIR AB??.??Z<CR>',CR,LF
  531.     DB    '    etc.',CR,LF,LF,LF
  532.     DB    EOS
  533. SPACES:    DB    '  |  ',EOS
  534. FCBA:    DB    1,'???????????',0,0,0,0    ;ambig file name
  535. OLDSP:    DS    2            ;SYSTEM SP
  536. STACK:    DS    64            ;LOCAL STACK
  537. ;
  538. FLCNT:    DS    1        ;file list count
  539. FLPTR:    DS    2        ;file list pointer
  540. PCOUNT:    DS    1        ;print counter
  541. FLIST:    EQU    $        ;file list starts here
  542. ;
  543.     END    START
  544.  
  545.