home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / list / mlist50.lbr / MLIST50.AQM / MLIST50.ASM
Assembly Source File  |  1985-06-17  |  12KB  |  506 lines

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