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 / CPMUG046.ARK / MLIST3.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  5KB  |  306 lines

  1. ;
  2. ;            MLIST.ASM - V3.0
  3. ;        by Keith Petersen, W8SDZ
  4. ;            (revised 5/20/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. ; NOTE: REQUIRES 'MAC' AND SEQIO.LIB TO ASSEMBLE
  19. ;
  20.     ORG    100H
  21. ;
  22.     MACLIB    SEQIO    ;DEFINE MACRO LIBRARY
  23. ;
  24. START:    JMP    START2    ;JMP AROUND IDENT
  25.     DB    'MLIST.COM ver 3.0 5/20/80 '
  26. ;
  27. START2:    LXI    H,0
  28.     DAD    SP    ;GET OLD STACK
  29.     SHLD    OLDSTK    ;SAVE IT
  30.     LXI    SP,STACK  ;SET NEW STACK
  31.     LHLD    1    ;POINT TO CP/M'S JMP TABLE
  32.     LXI    D,3    ;READY FOR ADD
  33.     DAD    D    ;POINT TO CONSOLE STATUS
  34.     SHLD    CSTSC+1    ;MODIFY CALL ADDRESS
  35.     DAD    D    ;POINT TO CONSOLE INPUT
  36.     SHLD    CIC+1    ;MODIFY CALL ADDRESS
  37.     CALL    SIGNON    ;PRINT SIGNON MSG
  38.     DB    'MLIST ver 3.0',CR,LF
  39.     DB    'CTL-S to pause, CTL-C to abort'
  40.     DB    CR,LF,'$'
  41. ;
  42. SIGNON:    POP    D    ;GET MESSAGE POINTER
  43.     MVI    C,PRINT
  44.     CALL    BDOS    ;PRINT IT
  45.     LDA    FCB+1
  46.     CPI    ' '    ;SEE IF FILENAME THERE
  47.     JNZ    MORE
  48.     CALL    MSGEXIT
  49.     DB    '++NO FILE NAME SPECIFIED++',CR,LF,'$'
  50. ;
  51. MORE:    CALL    MFNAME
  52.     JC    EXIT
  53. ;MOVE FILENAME FROM FCB+1 TO FNAME
  54.     LXI    H,FCB+1
  55.     LXI    D,FNAME
  56.     LXI    B,8
  57.     CALL    MOVER
  58. ;MOVE FILETYPE FROM FCB+9 TO FNAME+9
  59.     LXI    H,FCB+9
  60.     LXI    D,FNAME+9
  61.     LXI    B,3
  62.     CALL    MOVER
  63.     CALL    MORE2    ;GO PRINT FILENAME.TYP
  64.     DB    CR,LF,CR,LF,'--> FILE:  '
  65. FNAME:    DB    'XXXXXXXX.XXX'
  66.     DB    CR,LF,CR,LF,'$'
  67. ;
  68. MORE2:    POP    D    ;GET MSG ADRS
  69.     MVI    C,PRINT    ;PRINT IT
  70.     CALL    BDOS
  71. ;
  72. ; DEFINE SOURCE FILE:
  73. ;
  74. ;    INFILE    = INPUT FILE MODE
  75. ;    DISK$IN = INTERNAL NAME
  76. ;    (NUL)    = DEFAULT DISK DRIVE
  77. ;    1    = FIRST DEFAULT NAME (TFCB)
  78. ;    (NUL)    =   "      "    TYPE
  79. ;    16384    = BUFFER SIZE
  80. ;    DSK$BUF    = DISK BUFFER AREA
  81. ;
  82.     FILE    INFILE,DISK$IN,,1,,16384,DSK$BUF
  83. ;
  84. ;WRITE THE FILE TO CONSOLE
  85. ;
  86. READLP:    GET    DISK$IN
  87.     CPI    EOF    ;END OF FILE?
  88.     JZ    MORE    ;YES, MORE FILES TO PRINT?
  89.     CALL    TYPE    ;SEND CHAR TO CONSOLE
  90.     CALL    CSTS    ;KEY PRESSED?
  91.     ORA    A
  92.     CNZ    CKKB    ;CHECK WHAT KEY
  93.     JMP    READLP
  94. ;
  95. CKKB    CALL    CI    ;SEE WHAT CHAR
  96.     CPI    'S'-40H    ;CTL-S?
  97.     CZ    CI    ;YES, GET VALUE
  98.     CPI    'C'-40H    ;ABORT?
  99.     JZ    EXIT
  100.     RET
  101. ;
  102. CSTS    PUSH    B
  103.     PUSH    D
  104.     PUSH    H
  105. CSTSC    CALL    $-$    ;CHANGED BY INIT
  106.     POP    H
  107.     POP    D
  108.     POP    B
  109.     RET        ;FROM "CSTS"
  110. ;
  111. CI    PUSH    B
  112.     PUSH    D
  113.     PUSH    H
  114. CIC    CALL    $-$    ;CHANGED BY INIT
  115.     POP    H
  116.     POP    D
  117.     POP    B
  118.     RET        ;FROM "CI"
  119. ;
  120. ;TYPE CHAR IN A
  121. ;
  122. TYPE:    PUSH    B
  123.     PUSH    D
  124.     PUSH    H
  125.     MOV    E,A    ;GET CHARACTER
  126.     MVI    C,WRCON
  127.     CALL    BDOS
  128.     POP    H
  129.     POP    D
  130.     POP    B
  131.     RET
  132. ;
  133. ;EXIT WITH ERROR MESSAGE
  134. ;
  135. MSGEXIT:
  136.     MVI    A,CR
  137.     CALL    TYPE
  138.     MVI    A,LF
  139.     CALL    TYPE
  140.     POP    D    ;GET MSG
  141.     MVI    C,PRINT    ;PRINT IT
  142.     CALL    BDOS
  143. ;
  144. EXIT:    MVI    C,STDMA    ;SET DMA ADR TO NORMAL
  145.     LXI    D,80H
  146.     CALL    BDOS
  147.     LXI    D,DONEMS ;POINT TO DONE MSG
  148.     MVI    C,PRINT
  149.     CALL    BDOS    ;PRINT IT
  150.     LHLD    OLDSTK    ;GET OLD STACK
  151.     SPHL        ;RESTORE IT
  152.     RET        ;RETURN TO CP/M
  153. ;
  154. DONEMS:    DB    CR,LF,CR,LF,'DONE$'
  155. ;
  156. ;MULTI-FILE ACCESS SUBROUTINE.  ALLOWS PROCESSING
  157. ;OF MULTIPLE FILES (I.E. *.ASM) FROM DISK.  THIS
  158. ;ROUTINE BUILDS THE PROPER NAME IN THE FCB EACH
  159. ;TIME IT IS CALLED. CARRY IS SET IF NO MORE NAMES
  160. ;CAN BE FOUND. THE ROUTINE IS COMMENTED IN PSEUDO
  161. ;CODE, EACH PSEUDO CODE STATEMENT IS IN <<...>>
  162. ;
  163. MFNAME:    ;<<INIT DMA ADDR, FCB>>
  164.     PUSH    B
  165.     PUSH    D
  166.     PUSH    H
  167.     MVI    C,STDMA
  168.     LXI    D,80H
  169.     CALL    BDOS
  170.     POP    H
  171.     POP    D
  172.     POP    B
  173.     XRA    A
  174.     STA    FCBEXT
  175.     STA    FCBRNO
  176. ;<<IF FIRST TIME>>
  177.     LDA    MFFLG1
  178.     ORA    A
  179.     JNZ    MFN01
  180. ;<<TURN OFF 1ST TIME SW>>
  181.     MVI    A,1
  182.     STA    MFFLG1
  183. ;<<SAVE THE REQUESTED NAME>>
  184. ;SAVE ORIG REQ
  185.     LXI    H,FCB
  186.     LXI    D,MFREQ
  187.     LXI    B,12
  188.     CALL    MOVER
  189.     LDA    FCB
  190.     STA    MFCUR    ;SAVE DISK IN CURR FCB
  191. ;<<SRCHF REQ NAME>>
  192.     LXI    H,MFREQ
  193.     LXI    D,FCB
  194.     LXI    B,12
  195.     CALL    MOVER
  196.     PUSH    B
  197.     PUSH    D
  198.     PUSH    H
  199.     MVI    C,SRCHF
  200.     LXI    D,FCB
  201.     CALL    BDOS
  202.     POP    H
  203.     POP    D
  204.     POP    B
  205. ;<<ELSE>>
  206.     JMP    MFN02
  207. ;
  208. MFN01:    ;<<SRCHF CURR NAME>>
  209.     LXI    H,MFCUR
  210.     LXI    D,FCB
  211.     LXI    B,12
  212.     CALL    MOVER
  213.     PUSH    B
  214.     PUSH    D
  215.     PUSH    H
  216.     MVI    C,SRCHF
  217.     LXI    D,FCB
  218.     CALL    BDOS
  219.     POP    H
  220.     POP    D
  221.     POP    B
  222. ;<<SRCHN REQ NAME>>
  223.     LXI    H,MFREQ
  224.     LXI    D,FCB
  225.     LXI    B,12
  226.     CALL    MOVER
  227.     PUSH    B
  228.     PUSH    D
  229.     PUSH    H
  230.     MVI    C,SRCHN
  231.     LXI    D,FCB
  232.     CALL    BDOS
  233.     POP    H
  234.     POP    D
  235.     POP    B
  236. ;<<ENDIF>>
  237. MFN02:    ;<<RETURN CARRY IF NOT FOUND>>
  238.     INR    A
  239.     STC
  240.     RZ
  241. ;<<MOVE NAME FOUND TO CURR>>
  242.     DCR    A
  243.     ANI    3
  244.     ADD    A
  245.     ADD    A
  246.     ADD    A
  247.     ADD    A
  248.     ADD    A
  249.     ADI    81H
  250.     MOV    L,A
  251.     MVI    H,0
  252.     PUSH    H    ;SAVE NAME POINTER
  253.     LXI    D,MFCUR+1
  254.     LXI    B,11
  255.     CALL    MOVER
  256. ;<<MOVE NAME FOUND TO FCB>>
  257.     POP    H
  258.     LXI    D,FCB+1
  259.     LXI    B,11
  260.     CALL    MOVER
  261. ;<<SETUP FCB>>
  262.     XRA    A
  263.     STA    FCBEXT
  264.     STA    FCBRNO
  265. ;<<RETURN>>
  266.     RET
  267. ;------------------------------------------------
  268. ;
  269. ;MOVE SUBROUTINE
  270. ;
  271. MOVER    MOV    A,M
  272.     STAX    D
  273.     INX    H
  274.     INX    D
  275.     DCX    B
  276.     MOV    A,B
  277.     ORA    C
  278.     JNZ    MOVER
  279.     RET
  280. ;
  281. ;MULTI-FILE ACCESS WORK AREA
  282. ;
  283. MFFLG1    DB    0    ;1ST TIME SW
  284. MFREQ    DS    12    ;REQ NAME
  285. MFCUR    DS    12    ;CURR NAME
  286. ;
  287.     DS    60    ;STACK AREA
  288. STACK:    EQU    $
  289. OLDSTK:    DS    2    ;OLD STACK POINTER SAVED HERE
  290. ;
  291. DSK$BUF:DS    16384    ;16K BUFFER
  292. ;
  293. ;BDOS/CBIOS EQUATES
  294. ;
  295. WRCON    EQU    2
  296. PRINT    EQU    9
  297. SRCHF    EQU    17
  298. SRCHN    EQU    18
  299. STDMA    EQU    26
  300. BDOS    EQU    5
  301. FCB    EQU    5CH 
  302. FCBEXT    EQU    FCB+12
  303. FCBRNO    EQU    FCB+32
  304. ;
  305.     END
  306.