home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv009.ark / VLIST11.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  7.7 KB  |  402 lines

  1. ;
  2. ;            VLIST.ASM - V1.1
  3. ;            by Charles Strom
  4. ;           (revised 10/16/80)
  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 scrolling
  11. ; speed may be set from the console.
  12. ;
  13. ; Allows listing of multiple files by using normal CP/M
  14. ; ambiguous file names (i.e., VLIST *.ASM).  Before each
  15. ; file is printed, the FILENAME.TYPE is displayed.
  16. ;
  17. ; Use CTL-S to pause, CTL-C to abort.  To vary scrolling
  18. ; speed, type CTL-H (fastest, default), CTL-J, CTL-K,
  19. ; CTL-L (slowest).  Other characters are ignored.
  20. ;
  21. ; This program is based on 'MLIST' by Keith Petersen, W8SDZ.
  22. ;
  23. ;PROGRAM HISTORY (in reverse order to minimize read time):
  24. ;
  25. ;10/16/80 Modified to optimize delay routine code (Keith
  26. ;      Petersen, W8SDZ)
  27. ;
  28. ;10/15/80 First written by Charles Strom.
  29. ;
  30. ; THE FOLLOWING DELAYS MAY BE MODIFIED TO SUIT TASTE
  31. ; AND CLOCK SPEED.
  32. ;
  33. D1    EQU    0300H    ;SHORT DELAY
  34. D2    EQU    0600H    ;MEDIUM DELAY
  35. D3    EQU    1200H    ;LONG DELAY
  36. ;
  37.     ORG    100H
  38. ;
  39.     MACLIB    SEQIO    ;DEFINE MACRO LIBRARY
  40. ;
  41. START:    JMP    START2    ;JMP AROUND IDENT
  42.     DB    'VLIST.COM ver 1.1  10/16/80'
  43. ;
  44. START2:    LXI    H,0
  45.     DAD    SP    ;GET OLD STACK
  46.     SHLD    OLDSTK    ;SAVE IT
  47.     LXI    SP,STACK;SET NEW STACK
  48.     LHLD    1    ;POINT TO CP/M'S JMP TABLE
  49.     LXI    D,3    ;READY FOR ADD
  50.     DAD    D    ;POINT TO CONSOLE STATUS
  51.     SHLD    CSTSC+1    ;MODIFY CALL ADDRESS
  52.     DAD    D    ;POINT TO CONSOLE INPUT
  53.     SHLD    CIC+1    ;MODIFY CALL ADDRESS
  54.     CALL    ILPRT    ;PRINT:
  55.     DB    'VLIST ver 1.1',CR,LF
  56.     DB    'CTL-S pauses, CTL-C aborts',CR,LF
  57.     DB    'Type ^H,^J,^K,^L to vary speed',0
  58.     LDA    FCB+1
  59.     CPI    ' '    ;SEE IF FILENAME THERE
  60.     JNZ    MORE
  61.     CALL    ILPRT    ;PRINT:
  62.     DB    '++NO FILE NAME SPECIFIED++',0
  63.     JMP    EXIT
  64. ;
  65. MORE:    CALL    MFNAME
  66.     JNC    MOVNAM    ;ANOTHER FILE FOUND, PRINT IT
  67.     LDA    MFFLG1    ;NOTHING FOUND, CHECK...
  68.     ORA    A    ;... FIRST TIME FLAG
  69.     JZ    DONE    ;AT LEAST ONE WAS FOUND
  70.     CALL    ILPRT    ;PRINT:
  71.     DB    '++FILE NOT FOUND++',0
  72.     JMP    EXIT
  73. ;
  74. DONE    CALL    ILPRT    ;PRINT:
  75.     DB    'DONE',0
  76.     JMP    EXIT
  77. ;
  78. ;MOVE FILENAME FROM FCB+1 TO FNAME
  79. MOVNAM    LXI    H,FCB+1
  80.     LXI    D,FNAME
  81.     LXI    B,8
  82.     CALL    MOVER
  83. ;MOVE FILETYPE FROM FCB+9 TO FNAME+9
  84.     LXI    H,FCB+9
  85.     LXI    D,FNAME+9
  86.     LXI    B,3
  87.     CALL    MOVER
  88.     CALL    ILPRT    ;PRINT:
  89.     DB    CR,LF,'--> FILE: '
  90. FNAME    DB    'XXXXXXXX.XXX'
  91.     DB    CR,LF,0
  92. ;
  93. ; DEFINE SOURCE FILE:
  94. ;
  95. ;    INFILE    = INPUT FILE MODE
  96. ;    DISKIN = INTERNAL NAME
  97. ;    (NUL)    = DEFAULT DISK DRIVE
  98. ;    1    = FIRST DEFAULT NAME (TFCB)
  99. ;    (NUL)    =   "      "    TYPE
  100. ;    16384    = BUFFER SIZE
  101. ;    DSKBUF    = DISK BUFFER AREA
  102. ;
  103.     FILE    INFILE,DISKIN,,1,,16384,DSKBUF
  104. ;
  105. ;CHECK HERE FOR .COM FILE, WHICH CAN'T BE PRINTED
  106. ;
  107.     LXI    H,FCB+11 ;POINT TO LAST CHAR IN FCB
  108.     MOV    A,M    ;GET IT
  109.     CPI    'M'    ;WAS LAST CHAR AN 'M'?
  110.     JNZ    OBJCHK    ;IF NOT, CHK FOR '.OBJ' TYPE
  111.     DCX    H
  112.     MOV    A,M    ;CHK NEXT
  113.     ANI    7FH    ;STRIP CP/M 2.x ATTR
  114.     CPI    'O'    ;AN 'O'?
  115.     JNZ    READLP    ;IF NOT IT'S OK TO PRINT
  116.     DCX    H
  117.     MOV    A,M    ;WAS 'O', CHK NEXT CHAR
  118.     ANI    7FH    ;STRIP CP/M 2.x ATTR
  119.     CPI    'C'    ; 'C' AS IN '.COM'?
  120.     JNZ    READLP    ;IF NOT, IT'S OK TO PRINT
  121.     CALL    ILPRT    ;PRINT:
  122.     DB    '++CAN''T LIST A .COM FILE++',0
  123.     JMP    MORE    ;MORE TO PRINT?
  124. ;
  125. ;HERE WE CHECK FOR AN ATTEMPT TO LIST AN OBJECT FILE
  126. ;
  127. OBJCHK    CPI    'J'    ;WAS LAST CHAR AN 'J' THEN?
  128.     JNZ    READLP    ;IF NOT, OK TO LIST
  129.     DCX    H
  130.     MOV    A,M    ;MIGHT BE '.OBJ', CHK NEXT CHR
  131.     ANI    7FH    ;STRIP CP/M 2.x ATTR
  132.     CPI    'B'    ;IS IT A 'B'?
  133.     JNZ    READLP    ;IF NOT, LIST
  134.     DCX    H
  135.     MOV    A,M    ;WAS, CHK FIRST CHAR
  136.     ANI    7FH    ;STRIP CP/M 2.x ATTR
  137.     CPI    'O'    ; 'O' AS IN '.OBJ'?
  138.     JNZ    READLP    ;IF NOT, PRINT THE FILE, IF SO
  139.     CALL    ILPRT    ;PRINT:
  140.     DB    '++CAN''T LIST AN .OBJ FILE++',0
  141.     JMP    MORE    ;MORE TO PRINT?
  142. ;
  143. ;WRITE THE FILE TO CONSOLE
  144. ;
  145. READLP:    GET    DISKIN
  146.     CPI    EOF    ;END OF FILE?
  147.     JZ    MORE    ;YES, MORE FILES TO PRINT?
  148.     CALL    TYPE    ;SEND CHAR TO CONSOLE
  149.     CALL    CSTS    ;KEY PRESSED?
  150.     ORA    A
  151.     CNZ    CKKB    ;CHECK WHAT KEY
  152.     JMP    READLP
  153. ;
  154. CKKB    CALL    CI    ;SEE WHAT CHAR
  155.     CPI    'S'-40H    ;CTL-S?
  156.     CZ    CI    ;YES, GET VALUE
  157.     CPI    'C'-40H    ;ABORT?
  158.     JZ    EXITA    ;YES, PRINT ABORT MSG, EXIT
  159.     CPI    'H'-40H    ;IS IT A CTL-H?
  160.     JNZ    CK1
  161.     MVI    A,0    ;YES, SO PUT A 0
  162.     JMP    CKR    ;INTO DELVAL
  163. ;
  164. CK1    CPI    'J'-40H    ;IS IT A CTL-J?
  165.     JNZ    CK2
  166.     MVI    A,1    ;YES, SO PUT A 1
  167.     JMP    CKR    ;INTO DELVAL
  168. ;
  169. CK2    CPI    'K'-40H    ;IS IT A CTL-K?
  170.     JNZ    CK3
  171.     MVI    A,2    ;YES, SO PUT A 2
  172.     JMP    CKR    ;INTO DELVAL
  173. ;
  174. CK3    CPI    'L'-40H    ;IS IT A CTL-L?
  175.     RNZ        ;IGNORE IF NONE OF THE ABOVE
  176.     MVI    A,3    ;YES, SO PUT A 3 INTO DELVAL
  177. ;
  178. CKR    STA    DELVAL    ;SAVE DELAY VALUE
  179.     RET
  180. ;
  181. CSTS    PUSH    B
  182.     PUSH    D
  183.     PUSH    H
  184. CSTSC    CALL    $-$    ;CHANGED BY INIT
  185.     POP    H
  186.     POP    D
  187.     POP    B
  188.     RET        ;FROM "CSTS"
  189. ;
  190. CI    PUSH    B
  191.     PUSH    D
  192.     PUSH    H
  193. CIC    CALL    $-$    ;CHANGED BY INIT
  194.     POP    H
  195.     POP    D
  196.     POP    B
  197.     RET        ;FROM "CI"
  198. ;
  199. ;
  200. ;INLINE PRINT ROUTINE
  201. ;    CALL    ILPRT
  202. ;    DB    'MSG',0
  203. ;
  204. ILPRT    MVI    A,CR
  205.     CALL    TYPE
  206.     MVI    A,LF
  207.     CALL    TYPE
  208.     XTHL        ;SAVE HL, GET MSG
  209. ;
  210. ILPLP    MOV    A,M    ;GET CHAR
  211.     CALL    TYPE    ;OUTPUT IT
  212.     INX    H    ;POINT TO NEXT
  213.     MOV    A,M    ;TEST
  214.     ORA    A    ;..FOR END
  215.     JNZ    ILPLP
  216.     MVI    A,CR
  217.     CALL    TYPE
  218.     MVI    A,LF
  219.     CALL    TYPE
  220.     XTHL        ;RESTORE HL, RET ADDR
  221.     RET        ;RET PAST MSG
  222. ;
  223. ;TYPE CHAR IN A
  224. ;
  225. TYPE:    PUSH    B
  226.     PUSH    D
  227.     PUSH    H
  228.     PUSH    PSW
  229.     LDA    DELVAL    ;GET DELAY VALUE
  230.     ORA    A    ;IS IT A 0?
  231.     JZ    TYPE2    ;YES, SO JUMP AROUND DELAY
  232.     LXI    D,D1    ;SHORT DELAY VALUE
  233.     CPI    1    ;IS IT A 1?
  234.     JZ    DELAY
  235.     LXI    D,D2    ;MEDIUM DELAY VALUE
  236.     CPI    2    ;IS IT A 2?
  237.     JZ    DELAY
  238.     LXI    D,D3    ;LONG DELAY VALUE
  239. ;
  240. DELAY    DCX    D
  241.     ORA    D
  242.     JP    DELAY
  243. ;
  244. TYPE2    POP    PSW
  245.     ANI    7FH    ;STRIP PARITY BIT
  246.     MOV    E,A    ;CHARACTER TO E FOR CP/M
  247.     MVI    C,WRCON
  248.     CALL    BDOS
  249.     POP    H
  250.     POP    D
  251.     POP    B
  252.     RET
  253. ;
  254. EXITA    MVI    C,CSTAT    ;GET CONSOLE STATUS
  255.     CALL    BDOS
  256.     ORA    A    ;CHARACTER WAITING?
  257.     MVI    C,RDCON
  258.     CNZ    BDOS    ;YES, CLEAR CHARACTER FROM CP/M
  259.     CALL    ILPRT    ;PRINT:
  260.     DB    CR,LF,'++ABORTED++',0
  261. ;
  262. EXIT    MVI    C,CSTAT
  263.     CALL    BDOS
  264.     ORA    A
  265.     MVI    C,RDCON
  266.     CNZ    BDOS
  267.     LXI    D,80H    ;SET DMA ADDRESS TO NORMAL
  268.     MVI    C,STDMA    ;FUNCTION NUMBER TO DO IT
  269.     CALL    BDOS    ;DO IT
  270.     LHLD    OLDSTK    ;GET OLD STACK
  271.     SPHL        ;RESTORE IT
  272.     RET        ;RETURN TO CP/M
  273. ;
  274. ;MULTI-FILE ACCESS SUBROUTINE.  ALLOWS PROCESSING
  275. ;OF MULTIPLE FILES (I.E. *.ASM) FROM DISK.  THIS
  276. ;ROUTINE BUILDS THE PROPER NAME IN THE FCB EACH
  277. ;TIME IT IS CALLED. CARRY IS SET IF NO MORE NAMES
  278. ;CAN BE FOUND. THE ROUTINE IS COMMENTED IN PSEUDO
  279. ;CODE, EACH PSEUDO CODE STATEMENT IS IN <<...>>
  280. ;
  281. MFNAME:    ;<<INIT DMA ADDR, FCB>>
  282.     MVI    C,STDMA
  283.     LXI    D,80H
  284.     CALL    BDOS
  285.     XRA    A
  286.     STA    FCBEXT
  287.     STA    FCBRNO
  288. ;<<IF FIRST TIME>>
  289.     LDA    MFFLG1
  290.     ORA    A
  291.     JZ    MFN01
  292. ;<<SAVE THE REQUESTED NAME>>
  293. ;SAVE ORIG REQ
  294.     LXI    H,FCB
  295.     LXI    D,MFREQ
  296.     LXI    B,12
  297.     CALL    MOVER
  298.     LDA    FCB
  299.     STA    MFCUR    ;SAVE DISK IN CURR FCB
  300. ;<<SRCHF REQ NAME>>
  301.     LXI    H,MFREQ
  302.     LXI    D,FCB
  303.     LXI    B,12
  304.     CALL    MOVER
  305.     MVI    C,SRCHF
  306.     LXI    D,FCB
  307.     CALL    BDOS
  308. ;<<ELSE>>
  309.     JMP    MFN02
  310. ;
  311. MFN01:    ;<<SRCHF CURR NAME>>
  312.     LXI    H,MFCUR
  313.     LXI    D,FCB
  314.     LXI    B,12
  315.     CALL    MOVER
  316.     MVI    C,SRCHF
  317.     LXI    D,FCB
  318.     CALL    BDOS
  319. ;<<SRCHN REQ NAME>>
  320.     LXI    H,MFREQ
  321.     LXI    D,FCB
  322.     LXI    B,12
  323.     CALL    MOVER
  324.     MVI    C,SRCHN
  325.     LXI    D,FCB
  326.     CALL    BDOS
  327. ;<<ENDIF>>
  328. MFN02:    ;<<RETURN CARRY IF NOT FOUND>>
  329.     INR    A
  330.     STC
  331.     RZ
  332. ;<<MOVE NAME FOUND TO CURR>>
  333.     DCR    A
  334.     ANI    3
  335.     ADD    A
  336.     ADD    A
  337.     ADD    A
  338.     ADD    A
  339.     ADD    A
  340.     ADI    81H
  341.     MOV    L,A
  342.     MVI    H,0
  343.     PUSH    H    ;SAVE NAME POINTER
  344.     LXI    D,MFCUR+1
  345.     LXI    B,11
  346.     CALL    MOVER
  347. ;<<MOVE NAME FOUND TO FCB>>
  348.     POP    H
  349.     LXI    D,FCB+1
  350.     LXI    B,11
  351.     CALL    MOVER
  352. ;<<SETUP FCB>>
  353.     XRA    A
  354.     STA    FCBEXT
  355.     STA    FCBRNO
  356.     STA    MFFLG1    ;TURN OFF 1ST TIME SW
  357. ;<<RETURN>>
  358.     RET
  359. ;------------------------------------------------
  360. ;
  361. ;MOVE SUBROUTINE
  362. ;
  363. MOVER    MOV    A,M
  364.     STAX    D
  365.     INX    H
  366.     INX    D
  367.     DCX    B
  368.     MOV    A,B
  369.     ORA    C
  370.     JNZ    MOVER
  371.     RET
  372. ;
  373. ;MULTI-FILE ACCESS WORK AREA
  374. ;
  375. MFFLG1    DB    1    ;1ST TIME SW
  376. MFREQ    DS    12    ;REQ NAME
  377. MFCUR    DS    12    ;CURR NAME
  378. DELVAL    DB    0    ;DELAY VALUE 
  379. ;
  380.     DS    60    ;STACK AREA
  381. STACK:    EQU    $
  382. OLDSTK:    DS    2    ;OLD STACK POINTER SAVED HERE
  383. ;
  384. DSKBUF:    DS    16384    ;16K BUFFER
  385. ;
  386. ;BDOS/CBIOS EQUATES
  387. ;
  388. RDCON    EQU    1
  389. WRCON    EQU    2
  390. PRINT    EQU    9
  391. CSTAT    EQU    11
  392. OPEN    EQU    15
  393. SRCHF    EQU    17
  394. SRCHN    EQU    18
  395. STDMA    EQU    26
  396. BDOS    EQU    5
  397. FCB    EQU    5CH 
  398. FCBEXT    EQU    FCB+12
  399. FCBRNO    EQU    FCB+32
  400. ;
  401.     END
  402.