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

  1. ;
  2. ;            MLIST.ASM - V3.4
  3. ;        by Keith Petersen, W8SDZ
  4. ;            (revised 9/21/80)
  5. ;
  6. ; This program lists any size ASCII file by name, reading
  7. ; up to 16k of the file into memory at one time, in order
  8. ; to minimize disk activity during printout.
  9. ;
  10. ; Allows listing of multiple files by using
  11. ; normal CP/M ambiguous file names (i.e.,
  12. ; MLIST *.ASM).  Before each file is printed,
  13. ; the FILENAME.TYPE is displayed.
  14. ;
  15. ; Use CTL-S to pause, CTL-C to abort.
  16. ; Other characters are ignored.
  17. ;
  18. ; This program allows CP/M 1.4 users to have protected
  19. ; ASCII files on a remote system, provided that the CCP
  20. ; 'REN' (rename) and 'TYPE' functions have been changed
  21. ; to some other characters and MLIST.COM has been renamed
  22. ; to TYPE.COM.  To protect a file, rename it so the last
  23. ; character of the file type is #.  Example: MYFILE.AS#
  24. ;
  25. ; CP/M 2.x users may use 'TAG.COM' to set the f1' attribute
  26. ; of a file, which will prevent this program from listing it.
  27. ;
  28. ;
  29. ;05/27/80 Revised to abort on attempting to
  30. ;      list a CP/M .COM file.  TVC
  31. ;
  32. ;09/09/80 Revised check for '.COM' and '.OBJ' files so
  33. ;      during attempt to list multiple files these
  34. ;      would not abort the routine. Modified to
  35. ;      issue an error message and continue with the
  36. ;      next valid file. Added check for '#' character
  37. ;      as the last character in the file type indicat-
  38. ;      ing the file was not for distribution. Routine
  39. ;      issues an error message and continues. Added
  40. ;      check for 'first time flag' to exit routine so
  41. ;      if no file is found meeting the requested
  42. ;      parameters, '++NOT FOUND++' is issued to the
  43. ;      console. NOTE: This required modifying the manner
  44. ;      in which 'MFFLG1' was handled.   J. Seymour
  45. ;
  46. ;09/20/80 Added ILPRT routine, revised messages, added new
  47. ;      abort routine, added CP/M 2.x f1' protect test,
  48. ;      cleaned up file. (KBP)
  49. ;
  50. ;09/21/80 Added test for SYS files, moved TAG test,
  51. ;      removed extra OPEN of file. (KBP)
  52. ;
  53. ; NOTE: REQUIRES 'MAC' AND SEQIO.LIB TO ASSEMBLE
  54. ;
  55.     ORG    100H
  56. ;
  57.     MACLIB    SEQIO    ;DEFINE MACRO LIBRARY
  58. ;
  59. START:    JMP    START2    ;JMP AROUND IDENT
  60.     DB    'MLIST.COM ver 3.4  9/21/80'
  61. ;
  62. START2:    LXI    H,0
  63.     DAD    SP    ;GET OLD STACK
  64.     SHLD    OLDSTK    ;SAVE IT
  65.     LXI    SP,STACK;SET NEW STACK
  66.     LHLD    1    ;POINT TO CP/M'S JMP TABLE
  67.     LXI    D,3    ;READY FOR ADD
  68.     DAD    D    ;POINT TO CONSOLE STATUS
  69.     SHLD    CSTSC+1    ;MODIFY CALL ADDRESS
  70.     DAD    D    ;POINT TO CONSOLE INPUT
  71.     SHLD    CIC+1    ;MODIFY CALL ADDRESS
  72.     CALL    ILPRT    ;PRINT:
  73.     DB    'MLIST ver 3.4',CR,LF
  74.     DB    'CTL-S pauses, CTL-C aborts',0
  75.     LDA    FCB+1
  76.     CPI    ' '    ;SEE IF FILENAME THERE
  77.     JNZ    MORE
  78.     CALL    ILPRT    ;PRINT:
  79.     DB    '++NO FILE NAME SPECIFIED++',0
  80.     JMP    EXIT
  81. ;
  82. MORE:    CALL    MFNAME
  83.     JNC    CKFIL    ;ANOTHER FILE FOUND, PRINT IT
  84.     LDA    MFFLG1    ;NOTHING FOUND, CHECK...
  85.     ORA    A    ;... FIRST TIME FLAG
  86.     JZ    DONE    ;AT LEAST ONE WAS FOUND
  87.     CALL    ILPRT    ;PRINT:
  88.     DB    '++FILE NOT FOUND++',0
  89.     JMP    EXIT
  90. ;
  91. DONE    CALL    ILPRT    ;PRINT:
  92.     DB    'DONE',0
  93.     JMP    EXIT
  94. ;
  95. ;CHECK HERE FOR FILE PROTECTED BY CP/M 2.x f1' ATTRIBUTE
  96. ;
  97. CKFIL    LDA    MFCUR+1    ;POINT TO TAG FILE ATTR
  98.     ANI    80H    ;IS IT TAGGED?
  99.     JZ    CKFIL2    ;IF NOT, CONTINUE
  100. ;
  101. PROXIT    CALL    ILPRT    ;PRINT:
  102.     DB    '++FILE NOT FOR DISTRIBUTION, SORRY++',0
  103.     JMP    MORE    ;SEE IF ANOTHER
  104. ;
  105. CKFIL2    LDA    MFCUR+10 ;POINT TO SYS FILE ATTR
  106.     ANI    80H    ;IS IT SYS?
  107.     JZ    MOVNAM    ;IF NOT, CONTINUE
  108.     JMP    PROXIT    ;SYS FILE, CAN'T PRINT IT
  109. ;
  110. ;MOVE FILENAME FROM FCB+1 TO FNAME
  111. MOVNAM    LXI    H,FCB+1
  112.     LXI    D,FNAME
  113.     LXI    B,8
  114.     CALL    MOVER
  115. ;MOVE FILETYPE FROM FCB+9 TO FNAME+9
  116.     LXI    H,FCB+9
  117.     LXI    D,FNAME+9
  118.     LXI    B,3
  119.     CALL    MOVER
  120.     CALL    ILPRT    ;PRINT:
  121.     DB    CR,LF,'--> FILE: '
  122. FNAME    DB    'XXXXXXXX.XXX'
  123.     DB    CR,LF,0
  124. ;
  125. ; DEFINE SOURCE FILE:
  126. ;
  127. ;    INFILE    = INPUT FILE MODE
  128. ;    DISKIN = INTERNAL NAME
  129. ;    (NUL)    = DEFAULT DISK DRIVE
  130. ;    1    = FIRST DEFAULT NAME (TFCB)
  131. ;    (NUL)    =   "      "    TYPE
  132. ;    16384    = BUFFER SIZE
  133. ;    DSKBUF    = DISK BUFFER AREA
  134. ;
  135.     FILE    INFILE,DISKIN,,1,,16384,DSKBUF
  136. ;
  137. ;CHECK HERE FOR FILE PROTECTED BY A '#' AS THE LAST
  138. ;CHARACTER IN THE FILETYPE (EG. MLIST.AS#).
  139. ;
  140.     LXI    H,FCB+11 ;POINT TO LAST CHAR IN FCB
  141.     MOV    A,M    ;GET IT
  142.     ANI    7FH    ;STRIP CP/M 2.x ATTR
  143.     CPI    '#'    ;PROTECTED FILE?
  144.     JZ    PROXIT    ;PROTECTED FILE, EXIT WITH MSG
  145. ;
  146. ;CHECK HERE FOR .COM FILE, WHICH CAN'T BE PRINTED
  147. ;EITHER
  148. ;
  149.     CPI    'M'    ;WAS LAST CHAR AN 'M'?
  150.     JNZ    OBJCHK    ;IF NOT, CHK FOR '.OBJ' TYPE
  151.     DCX    H
  152.     MOV    A,M    ;CHK NEXT
  153.     ANI    7FH    ;STRIP CP/M 2.x ATTR
  154.     CPI    'O'    ;AN 'O'?
  155.     JNZ    READLP    ;IF NOT IT'S OK TO PRINT
  156.     DCX    H
  157.     MOV    A,M    ;WAS 'O', CHK NEXT CHAR
  158.     ANI    7FH    ;STRIP CP/M 2.x ATTR
  159.     CPI    'C'    ; 'C' AS IN '.COM'?
  160.     JNZ    READLP    ;IF NOT, IT'S OK TO PRINT
  161.     CALL    ILPRT    ;PRINT:
  162.     DB    '++CAN''T LIST A .COM FILE++',0
  163.     JMP    MORE    ;MORE TO PRINT?
  164. ;
  165. ;HERE WE CHECK FOR AN ATTEMPT TO LIST AN OBJECT FILE
  166. ;
  167. OBJCHK    CPI    'J'    ;WAS LAST CHAR AN 'J' THEN?
  168.     JNZ    READLP    ;IF NOT, OK TO LIST
  169.     DCX    H
  170.     MOV    A,M    ;MIGHT BE '.OBJ', CHK NEXT CHR
  171.     ANI    7FH    ;STRIP CP/M 2.x ATTR
  172.     CPI    'B'    ;IS IT A 'B'?
  173.     JNZ    READLP    ;IF NOT, LIST
  174.     DCX    H
  175.     MOV    A,M    ;WAS, CHK FIRST CHAR
  176.     ANI    7FH    ;STRIP CP/M 2.x ATTR
  177.     CPI    'O'    ; 'O' AS IN '.OBJ'?
  178.     JNZ    READLP    ;IF NOT, PRINT THE FILE, IF SO
  179.     CALL    ILPRT    ;PRINT:
  180.     DB    '++CAN''T LIST AN .OBJ FILE++',0
  181.     JMP    MORE    ;MORE TO PRINT?
  182. ;
  183. ;WRITE THE FILE TO CONSOLE
  184. ;
  185. READLP:    GET    DISKIN
  186.     CPI    EOF    ;END OF FILE?
  187.     JZ    MORE    ;YES, MORE FILES TO PRINT?
  188.     CALL    TYPE    ;SEND CHAR TO CONSOLE
  189.     CALL    CSTS    ;KEY PRESSED?
  190.     ORA    A
  191.     CNZ    CKKB    ;CHECK WHAT KEY
  192.     JMP    READLP
  193. ;
  194. CKKB    CALL    CI    ;SEE WHAT CHAR
  195.     CPI    'S'-40H    ;CTL-S?
  196.     CZ    CI    ;YES, GET VALUE
  197.     CPI    'C'-40H    ;ABORT?
  198.     JZ    EXITA    ;YES, PRINT ABORT MSG, EXIT
  199.     RET
  200. ;
  201. CSTS    PUSH    B
  202.     PUSH    D
  203.     PUSH    H
  204. CSTSC    CALL    $-$    ;CHANGED BY INIT
  205.     POP    H
  206.     POP    D
  207.     POP    B
  208.     RET        ;FROM "CSTS"
  209. ;
  210. CI    PUSH    B
  211.     PUSH    D
  212.     PUSH    H
  213. CIC    CALL    $-$    ;CHANGED BY INIT
  214.     POP    H
  215.     POP    D
  216.     POP    B
  217.     RET        ;FROM "CI"
  218. ;
  219. ;
  220. ;INLINE PRINT ROUTINE
  221. ;    CALL    ILPRT
  222. ;    DB    'MSG',0
  223. ;
  224. ILPRT    MVI    A,CR
  225.     CALL    TYPE
  226.     MVI    A,LF
  227.     CALL    TYPE
  228.     XTHL        ;SAVE HL, GET MSG
  229. ;
  230. ILPLP    MOV    A,M    ;GET CHAR
  231.     CALL    TYPE    ;OUTPUT IT
  232.     INX    H    ;POINT TO NEXT
  233.     MOV    A,M    ;TEST
  234.     ORA    A    ;..FOR END
  235.     JNZ    ILPLP
  236.     MVI    A,CR
  237.     CALL    TYPE
  238.     MVI    A,LF
  239.     CALL    TYPE
  240.     XTHL        ;RESTORE HL, RET ADDR
  241.     RET        ;RET PAST MSG
  242. ;
  243. ;TYPE CHAR IN A
  244. ;
  245. TYPE:    PUSH    B
  246.     PUSH    D
  247.     PUSH    H
  248.     ANI    7FH    ;STRIP PARITY BIT
  249.     MOV    E,A    ;CHARACTER TO E FOR CP/M
  250.     MVI    C,WRCON
  251.     CALL    BDOS
  252.     POP    H
  253.     POP    D
  254.     POP    B
  255.     RET
  256. ;
  257. EXITA    MVI    C,CSTAT    ;GET CONSOLE STATUS
  258.     CALL    BDOS
  259.     ORA    A    ;CHARACTER WAITING?
  260.     MVI    C,RDCON
  261.     CNZ    BDOS    ;YES, CLEAR CHARACTER FROM CP/M
  262.     CALL    ILPRT    ;PRINT:
  263.     DB    CR,LF,'++ABORTED++',0
  264. ;
  265. EXIT    LXI    D,80H    ;SET DMA ADDRESS TO NORMAL
  266.     MVI    C,STDMA    ;FUNCTION NUMBER TO DO IT
  267.     CALL    BDOS    ;DO IT
  268.     LHLD    OLDSTK    ;GET OLD STACK
  269.     SPHL        ;RESTORE IT
  270.     RET        ;RETURN TO CP/M
  271. ;
  272. ;MULTI-FILE ACCESS SUBROUTINE.  ALLOWS PROCESSING
  273. ;OF MULTIPLE FILES (I.E. *.ASM) FROM DISK.  THIS
  274. ;ROUTINE BUILDS THE PROPER NAME IN THE FCB EACH
  275. ;TIME IT IS CALLED. CARRY IS SET IF NO MORE NAMES
  276. ;CAN BE FOUND. THE ROUTINE IS COMMENTED IN PSEUDO
  277. ;CODE, EACH PSEUDO CODE STATEMENT IS IN <<...>>
  278. ;
  279. MFNAME:    ;<<INIT DMA ADDR, FCB>>
  280.     MVI    C,STDMA
  281.     LXI    D,80H
  282.     CALL    BDOS
  283.     XRA    A
  284.     STA    FCBEXT
  285.     STA    FCBRNO
  286. ;<<IF FIRST TIME>>
  287.     LDA    MFFLG1
  288.     ORA    A
  289.     JZ    MFN01
  290. ;<<SAVE THE REQUESTED NAME>>
  291. ;SAVE ORIG REQ
  292.     LXI    H,FCB
  293.     LXI    D,MFREQ
  294.     LXI    B,12
  295.     CALL    MOVER
  296.     LDA    FCB
  297.     STA    MFCUR    ;SAVE DISK IN CURR FCB
  298. ;<<SRCHF REQ NAME>>
  299.     LXI    H,MFREQ
  300.     LXI    D,FCB
  301.     LXI    B,12
  302.     CALL    MOVER
  303.     MVI    C,SRCHF
  304.     LXI    D,FCB
  305.     CALL    BDOS
  306. ;<<ELSE>>
  307.     JMP    MFN02
  308. ;
  309. MFN01:    ;<<SRCHF CURR NAME>>
  310.     LXI    H,MFCUR
  311.     LXI    D,FCB
  312.     LXI    B,12
  313.     CALL    MOVER
  314.     MVI    C,SRCHF
  315.     LXI    D,FCB
  316.     CALL    BDOS
  317. ;<<SRCHN REQ NAME>>
  318.     LXI    H,MFREQ
  319.     LXI    D,FCB
  320.     LXI    B,12
  321.     CALL    MOVER
  322.     MVI    C,SRCHN
  323.     LXI    D,FCB
  324.     CALL    BDOS
  325. ;<<ENDIF>>
  326. MFN02:    ;<<RETURN CARRY IF NOT FOUND>>
  327.     INR    A
  328.     STC
  329.     RZ
  330. ;<<MOVE NAME FOUND TO CURR>>
  331.     DCR    A
  332.     ANI    3
  333.     ADD    A
  334.     ADD    A
  335.     ADD    A
  336.     ADD    A
  337.     ADD    A
  338.     ADI    81H
  339.     MOV    L,A
  340.     MVI    H,0
  341.     PUSH    H    ;SAVE NAME POINTER
  342.     LXI    D,MFCUR+1
  343.     LXI    B,11
  344.     CALL    MOVER
  345. ;<<MOVE NAME FOUND TO FCB>>
  346.     POP    H
  347.     LXI    D,FCB+1
  348.     LXI    B,11
  349.     CALL    MOVER
  350. ;<<SETUP FCB>>
  351.     XRA    A
  352.     STA    FCBEXT
  353.     STA    FCBRNO
  354.     STA    MFFLG1    ;TURN OFF 1ST TIME SW
  355. ;<<RETURN>>
  356.     RET
  357. ;------------------------------------------------
  358. ;
  359. ;MOVE SUBROUTINE
  360. ;
  361. MOVER    MOV    A,M
  362.     STAX    D
  363.     INX    H
  364.     INX    D
  365.     DCX    B
  366.     MOV    A,B
  367.     ORA    C
  368.     JNZ    MOVER
  369.     RET
  370. ;
  371. ;MULTI-FILE ACCESS WORK AREA
  372. ;
  373. MFFLG1    DB    1    ;1ST TIME SW
  374. MFREQ    DS    12    ;REQ NAME
  375. MFCUR    DS    12    ;CURR NAME
  376. ;
  377.     DS    60    ;STACK AREA
  378. STACK:    EQU    $
  379. OLDSTK:    DS    2    ;OLD STACK POINTER SAVED HERE
  380. ;
  381. DSKBUF:    DS    16384    ;16K BUFFER
  382. ;
  383. ;BDOS/CBIOS EQUATES
  384. ;
  385. RDCON    EQU    1
  386. WRCON    EQU    2
  387. PRINT    EQU    9
  388. CSTAT    EQU    11
  389. OPEN    EQU    15
  390. SRCHF    EQU    17
  391. SRCHN    EQU    18
  392. STDMA    EQU    26
  393. BDOS    EQU    5
  394. FCB    EQU    5CH 
  395. FCBEXT    EQU    FCB+12
  396. FCBRNO    EQU    FCB+32
  397. ;
  398.     END
  399.