home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol016 / mlist42.asm < prev    next >
Assembly Source File  |  1984-04-29  |  12KB  |  489 lines

  1. ;            MLIST.ASM - V4.2
  2. ;           MULTIPLE FILE LIST UTILITY
  3. ;        by Keith Petersen, W8SDZ
  4. ;           (revised 1/12/81)
  5. ;
  6. ;NOTE: REQUIRES 'MAC' AND SEQIO.LIB TO ASSEMBLE
  7. ;
  8. ;This program lists any size ASCII file by name, reading
  9. ;up to 16k of the file into memory at one time, in order
  10. ;to minimize disk activity during printout.  The output
  11. ;is "filtered" to trap out all control characters other
  12. ;than CR, LF, and TAB.  If optional 'P' command used,
  13. ;output also goes to list device (this is especially
  14. ;useful under submit).  Any form feeds in the file are
  15. ;passed on to the list device.
  16. ;
  17. ;Allows listing of multiple files by using normal CP/M
  18. ;ambiguous file names.  Before each file is printed, the
  19. ;FILENAME.TYPE is displayed.  If a non-printable file is
  20. ;encountered (such as .COM or .OBJ), skips to next file.
  21. ;
  22. ;Commands: MLIST B:MYFILE.DOC    ;lists specified file
  23. ;       MLIST *.ASM        ;lists all ASM files
  24. ;       MLIST *.ASM P    ;same, also goes to list device
  25. ;
  26. ;Use CTL-S to pause, CTL-X to skip to next file, CTL-C to abort.
  27. ;Other characters are ignored.
  28. ;
  29. ;This program allows CP/M 1.4 users to have protected
  30. ;ASCII files on a remote system, provided that the CCP
  31. ;'REN' (rename) and 'TYPE' functions have been changed
  32. ;to some other characters and MLIST.COM has been renamed
  33. ;to TYPE.COM.  To protect a file, rename it so the last
  34. ;character of the file type is #.  Example: MYFILE.AS#
  35. ;
  36. ;CP/M 2.x users may use 'TAG.COM' to set the f1' attribute
  37. ;of a file, which will prevent this program from listing it.
  38. ;
  39. ;Modifications/revisions, listed in reverse order
  40. ;to minimize reading time:
  41. ;
  42. ;01/12/81 Added code to allow passing form feeds to list
  43. ;      output.  Added trap for DEL (RUBOUT). (KBP)
  44. ;
  45. ;01/10/81 Added 'P' option so files can be printed on the
  46. ;      list device.  This now allows selective printing
  47. ;      of hard copy while running under submit.  (KBP)
  48. ;
  49. ;01/01/81 Added CTL-X skip to next file, direct console
  50. ;      output with tab expansion and control character
  51. ;      filter.  (KBP)
  52. ;
  53. ;09/21/80 Added test for SYS files, moved TAG test,
  54. ;      removed extra OPEN of file. (KBP)
  55. ;
  56. ;09/20/80 Added ILPRT routine, revised messages, added new
  57. ;      abort routine, added CP/M 2.x f1' protect test,
  58. ;      cleaned up file. (KBP)
  59. ;
  60. ;09/09/80 Revised check for '.COM' and '.OBJ' files so
  61. ;      during attempt to list multiple files these
  62. ;      would not abort the routine. Modified to
  63. ;      issue an error message and continue with the
  64. ;      next valid file. Added check for '#' character
  65. ;      as the last character in the file type indicat-
  66. ;      ing the file was not for distribution. Routine
  67. ;      issues an error message and continues. Added
  68. ;      check for 'first time flag' to exit routine so
  69. ;      if no file is found meeting the requested
  70. ;      parameters, '++NOT FOUND++' is issued to the
  71. ;      console. NOTE: This required modifying the manner
  72. ;      in which 'MFFLG1' was handled.  By Jim Seymour
  73. ;
  74. ;05/27/80 Revised to abort on attempting to
  75. ;      list a CP/M .COM file.  By Thomas Churbuck
  76. ;
  77. FORMF    EQU    0CH    ;FORM FEED CHAR.
  78. ;
  79.     ORG    100H
  80. ;
  81.     MACLIB    SEQIO    ;DEFINE MACRO LIBRARY
  82. ;
  83. START:    JMP    START2    ;JMP AROUND IDENT
  84.     DB    'MLIST.COM ver 4.2 01/12/81'
  85. ;
  86. START2:    LXI    H,0
  87.     DAD    SP    ;GET OLD STACK
  88.     SHLD    STACK    ;SAVE IT
  89.     LXI    SP,STACK ;SET NEW STACK
  90.     LHLD    1    ;POINT TO CP/M'S JMP TABLE
  91.     LXI    D,3    ;READY FOR ADD
  92.     DAD    D    ;HL=CONSTAT
  93.     SHLD    CSTSC+1    ;MODIFY CALL ADRS
  94.     DAD    D    ;HL=CONIN
  95.     SHLD    CIC+1    ;MODIFY CALL ADRS
  96.     DAD    D    ;HL=CONOUT
  97.     SHLD    VCONOT+1 ;MODIFY CALL ADRS
  98.     DAD    D    ;HL=LISTOUT
  99.     SHLD    VLIST+1    ;MODIFY CALL ADRS
  100.     CALL    ILPRT    ;PRINT:
  101.     DB    'MLIST ver 4.2 - Multiple file lister',CR,LF
  102.     DB    'CTL-S pauses, CTL-X skips to next file, CTL-C aborts',0
  103.     LDA    FCB2+1    ;GET OPTION, IF ANY
  104.     STA    PFLAG    ;SAVE FOR LATER
  105.     LDA    FCB+1
  106.     CPI    ' '    ;FILENAME THERE?
  107.     JNZ    MORE    ;YES, SKIP ERROR EXIT
  108.     CALL    ILPRT    ;PRINT:
  109.     DB    'Usage: MLIST [drive:]<filename.type> [P]'
  110.     DB    CR,LF,CR,LF
  111.     DB    '       < > = required, [ ] = optional, P = printer'
  112.     DB    CR,LF
  113.     DB    '       Ambiguous file names may be used.',0
  114.     JMP    EXIT
  115. ;
  116. ;Get file name
  117. ;
  118. MORE:    LXI    SP,STACK ;ASSURE VALID STACK
  119.     XRA    A    ;ZERO
  120.     STA    TABCOL    ;..THE COLUMN COUNTER
  121.     CALL    MFNAME    ;GET NEXT FILE NAME
  122.     JNC    CKFIL    ;ANOTHER FILE FOUND, PRINT IT
  123.     LDA    MFFLG1    ;NOTHING FOUND, CHECK...
  124.     ORA    A    ;... FIRST TIME FLAG
  125.     JZ    DONE    ;AT LEAST ONE WAS FOUND
  126.     CALL    ILPRT    ;PRINT:
  127.     DB    '++FILE NOT FOUND++',0
  128.     JMP    EXIT
  129. ;
  130. DONE:    CALL    ILPRT    ;PRINT:
  131.     DB    'DONE',0
  132.     JMP    EXIT
  133. ;
  134. ;Check for file protected by CP/M 2.x f1' attribute
  135. ;
  136. CKFIL:    LDA    MFCUR+1    ;POINT TO TAG FILE ATTR
  137.     ANI    80H    ;IS IT TAGGED?
  138.     JZ    CKFIL2    ;IF NOT, CONTINUE
  139. ;
  140. PROXIT:    CALL    ILPRT    ;PRINT:
  141.     DB    '++FILE NOT FOR DISTRIBUTION, SORRY++',0
  142.     JMP    MORE    ;SEE IF ANOTHER
  143. ;
  144. CKFIL2:    LDA    MFCUR+10 ;POINT TO SYS FILE ATTR
  145.     ANI    80H    ;IS IT SYS?
  146.     JZ    MOVNAM    ;IF NOT, CONTINUE
  147.     JMP    PROXIT    ;SYS FILE, CAN'T PRINT IT
  148. ;
  149. ;Move filename from FCB+1 to FNAME
  150. MOVNAM:    LXI    H,FCB+1
  151.     LXI    D,FNAME
  152.     MVI    B,8
  153.     CALL    MOVER
  154. ;Move filetype from FCB+9 to FNAME+9
  155.     LXI    H,FCB+9
  156.     LXI    D,FNAME+9
  157.     MVI    B,3
  158.     CALL    MOVER
  159. ;Print name of file being listed
  160.     CALL    ILPRT    ;PRINT:
  161.     DB    CR,LF,'--> LISTING FILE: '
  162. FNAME:    DB    'XXXXXXXX.XXX'
  163.     DB    CR,LF,0
  164. ;
  165. ;Define source file:
  166. ;
  167. ;    INFILE    = Input file mode
  168. ;    DISKIN = Internal name
  169. ;    (NUL)    = Default disk drive
  170. ;    1    = First default name (TFCB)
  171. ;    (NUL)    =   "      "    type
  172. ;    16384    = Buffer size
  173. ;    DSKBUF    = Disk buffer area
  174. ;
  175.     FILE    INFILE,DISKIN,,1,,16384,DSKBUF
  176. ;
  177. ;Check for file protected by a '#' as the last
  178. ;character in the filetype (i.e. MYFILE.AS#).
  179. ;
  180.     LXI    H,FCB+11 ;POINT TO LAST CHAR IN FCB
  181.     MOV    A,M    ;GET IT
  182.     ANI    7FH    ;STRIP CP/M 2.x ATTR
  183.     CPI    '#'    ;PROTECTED FILE?
  184.     JZ    PROXIT    ;PROTECTED FILE, EXIT WITH MSG
  185. ;
  186. ;Check for .COM file, which can't be printed
  187. ;
  188.     CPI    'M'    ;WAS LAST CHAR AN 'M'?
  189.     JNZ    OBJCHK    ;IF NOT, CHK FOR '.OBJ' TYPE
  190.     DCX    H
  191.     MOV    A,M    ;CHK NEXT
  192.     ANI    7FH    ;STRIP CP/M 2.x ATTR
  193.     CPI    'O'    ;AN 'O'?
  194.     JNZ    READLP    ;IF NOT IT'S OK TO PRINT
  195.     DCX    H
  196.     MOV    A,M    ;WAS 'O', CHK NEXT CHAR
  197.     ANI    7FH    ;STRIP CP/M 2.x ATTR
  198.     CPI    'C'    ;'C' AS IN '.COM'?
  199.     JNZ    READLP    ;IF NOT, IT'S OK TO PRINT
  200.     CALL    ILPRT    ;PRINT:
  201.     DB    '++CAN''T LIST A .COM FILE++',0
  202.     JMP    MORE    ;MORE TO PRINT?
  203. ;
  204. ;Check for .OBJ file, which can't be printed
  205. ;
  206. OBJCHK:    CPI    'J'    ;WAS LAST CHAR AN 'J' ?
  207.     JNZ    READLP    ;IF NOT, OK TO LIST
  208.     DCX    H
  209.     MOV    A,M    ;MIGHT BE '.OBJ', CHK NEXT CHR
  210.     ANI    7FH    ;STRIP CP/M 2.x ATTR
  211.     CPI    'B'    ;IS IT A 'B'?
  212.     JNZ    READLP    ;IF NOT, LIST
  213.     DCX    H
  214.     MOV    A,M    ;WAS, CHK FIRST CHAR
  215.     ANI    7FH    ;STRIP CP/M 2.x ATTR
  216.     CPI    'O'    ;'O' AS IN '.OBJ'?
  217.     JNZ    READLP    ;IF NOT, PRINT THE FILE, IF SO
  218.     CALL    ILPRT    ;PRINT:
  219.     DB    '++CAN''T LIST AN .OBJ FILE++',0
  220.     JMP    MORE    ;MORE TO PRINT?
  221. ;
  222. ;Write the file to console
  223. ;
  224. READLP:    GET    DISKIN    ;GET CHARACTER FROM FILE
  225.     CPI    EOF    ;END OF FILE?
  226.     JZ    MORE    ;YES, MORE FILES TO PRINT?
  227.     CALL    TYPE    ;SEND CHAR TO CONSOLE
  228.     CALL    CSTS    ;KEY PRESSED?
  229.     ORA    A
  230.     CNZ    CKKB    ;CHECK WHAT KEY
  231.     JMP    READLP
  232. ;
  233. ;Get keyboard character and check for command
  234. ;
  235. CKKB:    CALL    CI    ;GET CHAR
  236.     CPI    'S'-40H    ;PAUSE?
  237.     CZ    CI    ;YES, GET NEXT CHAR
  238.     CPI    'C'-40H    ;ABORT?
  239.     JZ    EXITA    ;YES, PRINT ABORT MSG, EXIT
  240.     CPI    'X'-40H    ;SKIP?
  241.     RNZ        ;NO, CONTINUE LISTING
  242.     CALL    ILPRT    ;PRINT:
  243.     DB    CR,LF,'++SKIPPING TO NEXT FILE++',0
  244.     JMP    MORE    ;SKIP TO NEXT FILE
  245. ;
  246. ;Get console status from CBIOS
  247. ;
  248. CSTS:    PUSH    B
  249.     PUSH    D
  250.     PUSH    H
  251. CSTSC:    CALL    $-$    ;CHANGED BY INIT
  252.     POP    H
  253.     POP    D
  254.     POP    B
  255.     RET        ;FROM "CSTS"
  256. ;
  257. ;Get console input from CBIOS
  258. ;
  259. CI:    PUSH    B
  260.     PUSH    D
  261.     PUSH    H
  262. CIC:    CALL    $-$    ;CHANGED BY INIT
  263.     POP    H
  264.     POP    D
  265.     POP    B
  266.     RET        ;FROM "CI"
  267. ;
  268. ;Inline print routine
  269. ;
  270. ILPRT:    CALL    CRLF    ;TURN UP A NEW LINE
  271.     XTHL        ;SAVE HL, GET MSG
  272. ;
  273. ILPLP:    MOV    A,M    ;GET CHAR
  274.     CALL    TYPE    ;OUTPUT IT
  275.     INX    H    ;POINT TO NEXT
  276.     MOV    A,M    ;TEST
  277.     ORA    A    ;..FOR END
  278.     JNZ    ILPLP
  279.     CALL    CRLF    ;TURN UP A NEW LINE
  280.     XTHL        ;RESTORE HL, RET ADDR
  281.     RET        ;RET PAST MSG
  282. ;
  283. ;Turn up a new line
  284. ;
  285. CRLF:    MVI    A,CR    ;GET A CARRIAGE RETURN
  286.     CALL    TYPE
  287.     MVI    A,LF    ;GET A LINE FEED AND FALL INTO 'TYPE'
  288. ;
  289. ;Type character in A to console (with tab expansion).
  290. ;This is done via direct CBIOS call to prevent CP/M
  291. ;from evaluating input commands.  Output also goes to
  292. ;list device if 'P' option was specified.
  293. ;
  294. TYPE:    PUSH    B
  295.     PUSH    D
  296.     PUSH    H
  297.     ANI    7FH    ;STRIP PARITY BIT OF CHAR
  298.     CPI    7FH    ;DEL (RUBOUT) ?
  299.     JZ    TYPRET    ;YES, IGNORE IT
  300.     MOV    C,A    ;CHAR TO C FOR OUTPUT ROUTINE
  301.     CPI    TAB    ;TAB CHAR?
  302.     JNZ    TYPE2    ;NO, SKIP TAB STUFF
  303. ;
  304. TYPTAB:    MVI    A,' '    ;GET A SPACE
  305.     CALL    TYPE    ;PRINT IT
  306.     LDA    TABCOL    ;GET PRESENT COLUMN
  307.     ANI    7    ;8 CHAR BOUNDRY?
  308.     JNZ    TYPTAB    ;NO, OUTPUT ANOTHER SPACE
  309.     JMP    TYPRET    ;DONE WITH TAB EXPANSION
  310. ;
  311. ;Filter out control characters to
  312. ;prevent garbage during view of file
  313. ;
  314. TYPE2:    CPI    ' '    ;SPACE OR ABOVE?
  315.     JNC    CONOUT    ;YES, GO OUTPUT IT
  316.     CPI    FORMF    ;FORM FEED?
  317.     JZ    TYPLST    ;YES, SEND TO LIST ONLY
  318.     CPI    CR    ;CARRIAGE RETURN?
  319.     JZ    CONOUT    ;YES, GO OUTPUT IT
  320.     CPI    LF    ;LINE FEED?
  321.     JNZ    TYPRET    ;NO, IGNORE CHARACTER
  322. ;
  323. ;Call direct to CBIOS console output
  324. ;
  325. CONOUT:    PUSH    B    ;IN CASE CBIOS CLOBBERS IT
  326. VCONOT:    CALL    $-$    ;ADDR FILLED IN BY 'INIT'
  327.     POP    B    ;GET CHAR BACK
  328. ;
  329. ;Update column used in tab expansion
  330.     MOV    A,C    ;GET CHAR
  331.     CPI    CR    ;CARRIAGE RETURN?
  332.     JNZ    TYPNCR    ;NO, SKIP COLUMN ZERO STUFF
  333.     XRA    A    ;GET A ZERO
  334.     STA    TABCOL    ;RESET COLUMN NR.
  335.     JMP    TYPLST    ;EXIT
  336. ;
  337. TYPNCR:    CPI    ' '    ;CTL CHAR?
  338.     JC    TYPLST    ;..NO CHANGE IN COL
  339.     LDA    TABCOL    ;GET COLUMN NR.
  340.     INR    A    ;ADD ONE
  341.     STA    TABCOL    ;SAVE NEW COUNT
  342. ;
  343. TYPLST:    LDA    PFLAG    ;GET PRINT FLAG
  344.     CPI    'P'    ;PRINT REQUESTED?
  345.     CZ    LIST    ;FROM C REG
  346. ;
  347. TYPRET:    POP    H
  348.     POP    D
  349.     POP    B
  350.     RET
  351. ;
  352. LIST:    PUSH    B    ;SAVE REGS
  353.     PUSH    D
  354.     PUSH    H
  355. VLIST:    CALL    $-$    ;MODIFIED BY INIT
  356.     POP    H
  357.     POP    D
  358.     POP    B
  359.     RET
  360. ;
  361. ;Move (B) bytes from (HL) to (DE)
  362. ;
  363. MOVER:    MOV    A,M
  364.     STAX    D
  365.     INX    H
  366.     INX    D
  367.     DCR    B
  368.     JNZ    MOVER
  369.     RET
  370. ;
  371. EXITA:    CALL    ILPRT    ;PRINT:
  372.     DB    CR,LF,'++ABORTED++',0
  373. ;
  374. EXIT:    LXI    D,80H    ;SET DMA ADDRESS TO NORMAL
  375.     MVI    C,STDMA
  376.     CALL    BDOS
  377.     LHLD    STACK    ;GET OLD STACK
  378.     SPHL        ;RESTORE IT
  379.     RET        ;RETURN TO CP/M
  380. ;
  381. ;Multi-file access subroutine.  Allows processing
  382. ;of multiple files (i.e. *.ASM) from disk.  This
  383. ;routine builds the proper name in the FCB each
  384. ;time it is called. Carry is set if no more names
  385. ;can be found. The routine is commented in Pseudo
  386. ;Code, each Pseudo Code statement is in <<...>>
  387. ;
  388. ;<<Init DMA addrress and FCB>>
  389. MFNAME:    MVI    C,STDMA
  390.     LXI    D,80H
  391.     CALL    BDOS
  392.     XRA    A
  393.     STA    FCBEXT
  394.     STA    FCBRNO
  395. ;<<IF first time>>
  396.     LDA    MFFLG1
  397.     ORA    A
  398.     JZ    MFN01
  399. ;<<Save the requested name>>
  400.     LXI    H,FCB
  401.     LXI    D,MFREQ
  402.     MVI    B,12
  403.     CALL    MOVER
  404.     LDA    FCB
  405.     STA    MFCUR    ;SAVE DISK IN CURR FCB
  406. ;<<Searchfirst requested name>>
  407.     MVI    C,SRCHF
  408.     LXI    D,FCB
  409.     CALL    BDOS
  410.     JMP    MFN02
  411. ;
  412. ;<<ELSE>>
  413. ;<<Searchfirst current name>>
  414. MFN01:    LXI    H,MFCUR
  415.     LXI    D,FCB
  416.     MVI    B,12
  417.     CALL    MOVER
  418.     MVI    C,SRCHF
  419.     LXI    D,FCB
  420.     CALL    BDOS
  421. ;<<Searchnext requested name>>
  422.     LXI    H,MFREQ
  423.     LXI    D,FCB
  424.     MVI    B,12
  425.     CALL    MOVER
  426.     MVI    C,SRCHN
  427.     LXI    D,FCB
  428.     CALL    BDOS
  429. ;<<ENDIF>>
  430. ;
  431. ;<<Return carry if not found>>
  432. MFN02:    INR    A
  433.     STC
  434.     RZ
  435. ;<<Move name found to CURR>>
  436.     DCR    A
  437.     ANI    3
  438.     ADD    A
  439.     ADD    A
  440.     ADD    A
  441.     ADD    A
  442.     ADD    A
  443.     ADI    81H
  444.     MOV    L,A
  445.     MVI    H,0
  446.     PUSH    H    ;SAVE NAME POINTER
  447.     LXI    D,MFCUR+1
  448.     MVI    B,11
  449.     CALL    MOVER
  450. ;<<Move name found to FCB>>
  451.     POP    H    ;RESTORE NAME POINTER
  452.     LXI    D,FCB+1
  453.     MVI    B,11
  454.     CALL    MOVER
  455. ;<<Setup FCB>>
  456.     XRA    A
  457.     STA    FCBEXT
  458.     STA    FCBRNO
  459.     STA    MFFLG1    ;TURN OFF 1ST TIME SW
  460. ;<<Return>>
  461.     RET
  462. ;
  463. ;Temporary storage area
  464. ;
  465. TABCOL:    DB    0    ;COLUMN COUNTER
  466. PFLAG:    DB    0    ;PRINT REQUEST FLAG
  467. MFFLG1:    DB    1    ;1ST TIME SW
  468. MFREQ:    DS    12    ;REQUESTED NAME
  469. MFCUR:    DS    12    ;CURRENT NAME
  470. ;
  471.     DS    64    ;ROOM FOR STACK
  472. STACK:    DS    2    ;OLD STACK POINTER SAVED HERE
  473. ;
  474. DSKBUF:    DS    16384    ;16K BUFFER
  475. ;
  476. ;BDOS equates
  477. ;
  478. OPEN    EQU    15
  479. SRCHF    EQU    17
  480. SRCHN    EQU    18
  481. STDMA    EQU    26
  482. BDOS    EQU    5
  483. FCB    EQU    5CH 
  484. FCB2    EQU    6CH
  485. FCBEXT    EQU    FCB+12
  486. FCBRNO    EQU    FCB+32
  487. ;
  488.     END
  489.