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 / CAT.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  5KB  |  303 lines

  1. ;V2.0
  2. ;CAT.ASM - PERFORMS DIR FUNCTION ON MAST.CAT
  3. ;11/??/77 WRITTEN BY WARD CHRISTENSEN
  4. ;01/07/78 MODIFY FOR NON-BASIC MASTER CAT
  5. ;01/08/78 MODIFY TO SKIP IGNORE FILENAMES
  6. ;TO EXECUTE:
  7. ;    CAT FILENAME.FILETYPE DISKNAME.DISKTYPE
  8. ;COMMAND MAY BE FOLLOWED BY COMMENTS (TITLE)
  9. ;MAST.CAT M-U-S-T HAVE IGNORE FILENAMES FIRST
  10. ;EG:    (NAME.TYPE
  11. ;    NAME.TYPE
  12. ;    LASTNAME.TYPE)
  13.     ORG    100H
  14.     CALL    START
  15.     DB    'CAT.COM 1/8/78'
  16.     DB    0DH,0AH,'$'
  17. ;PRINT ID MESSAGE
  18. START    POP    D
  19.     MVI    C,PRINT
  20.     CALL    BDOS
  21. ;INIT LOCAL STACK
  22.     LXI    H,0
  23.     DAD    SP
  24.     SHLD    STACK
  25.     LXI    SP,STACK
  26. ;SAVE THE NAMES
  27.     LXI    D,FCB+1
  28.     LXI    H,FNAME
  29.     MVI    B,8
  30.     CALL    MOVER
  31.     MVI    B,3
  32.     CALL    MOVER
  33.     LXI    D,FCB+17 ;DISK NAME
  34.     LXI    H,DNAME
  35.     MVI    B,8
  36.     CALL    MOVER
  37.     MVI    B,3
  38.     CALL    MOVER
  39. ;MOVE 'MAST.CAT' TO FCB
  40.     LXI    D,FCBNAME
  41.     LXI    H,FCB+1
  42.     MVI    B,8+3+1
  43.     CALL    MOVE
  44. ;SAVE THE COMMAND LINE AS THE TITLE
  45. ;ALLOWS 'CAT *.* *.* MM/DD/YY' TYPE TITLE
  46. ;FOR HARD COPY LISTINGS
  47.     LXI    D,80H
  48.     LXI    H,TTL0+6
  49.     LDAX    D    ;GET LENGTH
  50.     ORA    A    ;NO OPERANDS ON CAT?
  51.     JZ    NOOP
  52.     INX    D
  53.     MOV    B,A    ;SET FOR MOVE
  54.     CALL    MOVE
  55. NOOP    MVI    M,'$'    ;END OF TITLE
  56. ;OPEN MAST.CAT
  57.     LXI    D,FCB
  58.     MVI    C,OPEN
  59.     CALL    BDOS
  60.     INR    A
  61.     JNZ    SKPIGN    ;SKIP THE 'TO BE IGNORED' NAMES
  62. ;OPEN FAILED
  63.     CALL    ERXIT
  64.     DB    '++UNABLE TO OPEN MAST.CAT$'
  65. ;EXIT PRINTING MSG ON TOP OF STACK
  66. ERXIT    POP    D    ;GET ERR MSG
  67.     MVI    C,PRINT
  68.     CALL    BDOS
  69. ;RESTORE STACK, EXIT
  70. EXIT    LHLD    STACK
  71.     SPHL
  72.     RET
  73. ;
  74. ;SKIP THE IGNORE FILENAMES AT THE HEAD OF MAST.CAT
  75. ;
  76. SKPIGN    CALL    RDCHR
  77.     CPI    ')'    ;END OF IGNORE?
  78.     JNZ    SKPIGN
  79.     CALL    RDCHR    ;GET CR
  80.     CALL    RDCHR    ;GET LF
  81.     JMP    NEWPG1
  82. ;
  83. NEWPG    MVI    A,'L'-40H ;FORMS FEED
  84.     CALL    TYPE    ;EJECT
  85. ;PRINT TITLE
  86. NEWPG1    LXI    D,TTL0
  87.     MVI    C,PRINT
  88.     CALL    BDOS
  89.     CALL    CRLF
  90.     CALL    CRLF
  91.     LXI    D,TTL
  92.     MVI    C,PRINT
  93.     CALL    BDOS
  94.     CALL    CRLF
  95. ;RESET LINECOUNT
  96.     MVI    A,5
  97.     STA    LINECT
  98. ;MATCH A LINE, PRINT IF IT MATCHES
  99. ;EXIT IF KEY PRESSED
  100. LOOP    MVI    C,KSTAT
  101.     CALL    BDOS
  102.     DCR    A
  103.     JZ    EXIT
  104. ;MATCH FILENAME
  105.     LXI    D,BUFF    ;WHERE TO STORE NAME READ
  106.     LXI    H,FNAME
  107.     MVI    B,8
  108.     CALL    MATCH
  109.     JC    SKIP    ;NAME/TYPE DIDN'T MATCH
  110.     INX    D    ;ALLOW FOR '.'
  111. ;MATCH FILETYPE
  112.     MVI    B,3    ;TYPE
  113.     CALL    MATCH
  114.     JC    SKIP
  115. ;SKIP PAST COMMA
  116. ;MATCH DISK'S FILENAME
  117.     LXI    D,BUFF+15
  118.     LXI    H,DNAME
  119.     MVI    B,8
  120.     CALL    MATCH
  121.     JC    SKIP
  122.     INX    D    ;ALLOW FOR '.'
  123. ;MATCH DISK'S FILETYPE (NUMBER)
  124.     MVI    B,3
  125.     CALL    MATCH    ;TYPE
  126.     JC    SKIP
  127. ;
  128. ;GOT MATCHING NAME
  129. ;
  130.     LXI    H,BUFF
  131. ;PRINT MESSAGE UP TO BINARY 0
  132. PRBUF    MOV    A,M
  133.     ORA    A    ;END OF BUFF?
  134.     JZ    EOBUF
  135.     CALL    TYPE
  136.     INX    H
  137.     JMP    PRBUF
  138. EOBUF    LDA    ENTRY
  139.     INR    A
  140.     ANI    1
  141.     STA    ENTRY
  142.     JNZ    SKIP
  143.     CALL    CRLF
  144.     LDA    LINECT
  145.     INR    A
  146.     STA    LINECT
  147.     CPI    58
  148.     JC    SKIP
  149.     CALL    SKIPLF
  150.     JMP    NEWPG
  151. ;
  152. SKIP    CALL    SKIPLF
  153.     JMP    LOOP
  154. ;SKIP TO END OF LINE (L/F)
  155. SKIPLF    CALL    RDCHR
  156.     CPI    0AH    ;SKIP TO END
  157.     JNZ    SKIPLF    ;OF LINE
  158.     RET
  159. ;
  160. ;MATCH ENTRY BY READING CHARS
  161. ;STORE IN BUFFER POINTED TO BY DE
  162. ;MATCH NAME POINTED TO BY HL
  163. ;
  164. MATCH    CALL    RDCHR
  165.     STAX    D
  166.     CMP    M
  167.     JNZ    MAT50    ;CHECK '?'
  168. MAT25    INX    D
  169.     INX    H
  170.     DCR    B    ;MORE?
  171.     JNZ    MATCH
  172.     CALL    RDCHR    ;DELETE '.' OR '"'
  173.     ORA    A    ;CARRY OFF, SHOWS OK
  174.     RET
  175. MAT50    CPI    '.'    ;END OF NAME?
  176.     JZ    MAT100
  177.     CPI    ','    ;END OF NAME?
  178.     JZ    MAT100
  179.     MOV    A,M    ;MATCHING '?'
  180.     CPI    '?'
  181.     JZ    MAT25
  182. MAT75    MVI    A,' '    ;PAD
  183.     STAX    D
  184.     INX    D
  185.     INX    H
  186.     DCR    B
  187.     JNZ    MAT75
  188.     STC        ;SHOW BAD
  189.     RET
  190. MAT100    MOV    A,M
  191.     CPI    '?'
  192.     JZ    MAT200
  193.     CPI    ' '
  194.     JNZ    MAT75
  195. MAT200    MVI    A,' '
  196.     STAX    D
  197.     INX    D
  198.     INX    H
  199.     DCR    B
  200.     JNZ    MAT100
  201.     ORA    A    ;MATCH
  202.     RET
  203. ;
  204. ;READ CHAR FROM DISK
  205. ;
  206. RDCHR    PUSH    B
  207.     PUSH    D
  208.     PUSH    H
  209.     LHLD    BUFAD
  210.     MOV    A,H    ;TIME TO READ?
  211.     DCR    A
  212.     JNZ    NOREAD
  213.     LXI    D,FCB
  214.     MVI    C,READ
  215.     CALL    BDOS
  216.     ORA    A
  217.     JZ    RDOK
  218.     CALL    ERXIT
  219.     DB    '++READ ERROR OR EARLY EOF$'
  220. RDOK    LXI    H,80H
  221. NOREAD    MOV    A,M    ;GET CHAR
  222.     INX    H
  223.     SHLD    BUFAD
  224.     POP    H
  225.     POP    D
  226.     POP    B
  227.     CPI    'Z'-40H    ;EOF?
  228.     JZ    EOF
  229.     RET
  230. ;
  231. CRLF    MVI    A,0DH
  232.     CALL    TYPE
  233.     MVI    A,0AH
  234. ;
  235. TYPE    PUSH    B
  236.     PUSH    D
  237.     PUSH    H
  238.     MOV    E,A
  239.     MVI    C,WRCON
  240.     CALL    BDOS
  241.     POP    H
  242.     POP    D
  243.     POP    B
  244.     RET
  245. ;
  246. ;MOVER - MOVE CHARS FROM (DE) TO (HL), LENGTH IN (B)
  247. ;    IF FIRST CHAR = ' ', MOVE ALL '?'
  248. ;
  249. MOVER    LDAX    D
  250.     CPI    ' '
  251.     JZ    QUEST
  252. ;
  253. ;MOVE CHARS FROM (DE) TO (HL) FOR LENGTH IN (B)
  254. ;
  255. MOVE    LDAX    D    ;GET A CHAR
  256.     MOV    M,A
  257.     INX    D
  258.     INX    H
  259.     DCR    B
  260.     JNZ    MOVE
  261.     RET
  262. ;
  263. ;PAD FILENAME OR TYPE WITH ALL '?'
  264. ;
  265. QUEST    MVI    M,'?'
  266.     INX    H
  267.     INX    D
  268.     DCR    B
  269.     JNZ    QUEST
  270.     RET
  271. ;
  272. EOF    CALL    ERXIT
  273.     DB    0DH,0AH,'L'-40H,'$'
  274.     DS    50    ;STACK
  275. STACK    DW    0
  276. FNAME    DS    8
  277. FTYPE    DS    3
  278. DNAME    DS    8
  279. DTYPE    DS    3
  280. FCBNAME    DB    'MAST    CAT',0 ;0 = EXTENT #
  281. ENTRY    DB    0    ;0/1 = LEFT, RIGHT
  282. BUFAD    DW    100H    ;BUFFER PONTER
  283. TTL    DB    '  NAME           DISK         '
  284.     DB    '  NAME           DISK'
  285.     DB    0DH,0AH,'$'
  286. BUFF    DB    '............   ............   ',0
  287. LINECT    DB    0
  288. TTL0    DB    'FILES:'
  289. ;        (COMMAND TITLE MOVED HERE)
  290. ; * * * * * * * * * * * * * * * * * * * * * * * *
  291. ;                        *
  292. ;BDOS/CBIOS EQUATES (VERSION 5)            *
  293. ;(WITH UNREFERENCED EQUATES EDITED OUT)        *
  294. ;                        *
  295. WRCON    EQU    2    ;            *
  296. PRINT    EQU    9    ;            *
  297. KSTAT    EQU    11    ;1=KEY PRESSED        *
  298. OPEN    EQU    15    ;0FFH=NOT FOUND        *
  299. READ    EQU    20    ;0=OK, 1=EOF        *
  300. BDOS    EQU    5    ;            *
  301. FCB    EQU    5CH     ;            *
  302. ; * * * * * * * * * * * * * * * * * * * * * * * *
  303.