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 / CPM / ZCPR33 / S-Z / VFILER43.LBR / VFCMDS4.LZB / VFCMDS4.LIB
Text File  |  2000-06-30  |  9KB  |  377 lines

  1. ;===========================================================================
  2. ;
  3. ; VFCMDS4.Z80 - Print and View Commands and Code (P, V)
  4. ;
  5. ;===========================================================================
  6.  
  7.  
  8. ; * * * COMMAND: V
  9.  
  10. ; Type file to console with pagination set to 'lps' from ENV
  11. ;    <space>        single-line scroll using
  12. ;    <ctrl-C>    cancel operation
  13. ;    <ctrl-X>    go to next file
  14. ;    other        scroll one page
  15.  
  16. fview:
  17.     xor    a        ; Set flags
  18.     ld    (first$m),a    ; First view
  19.     ld    (mflag),a    ; Not a mass view
  20.     call    view        ; View file at ringpos
  21.     jp    runsh4        ; Rebuild screen and continue user input
  22.  
  23.  
  24. ;  VIEW - View file at RINGPOS
  25.  
  26. view:
  27.     call    vcls
  28.     call    vprint
  29.     db    cr,lf,dim,'<CTRL-X> Skips, <CTRL-C> Cancels, '
  30.     db    '<SP> Turns Up One Line, '
  31.     db    'Others Page',bright,cr,lf,lf,0
  32.     ld    a,3        ; Initialize..
  33.     ld    (lpscnt),a    ; Lines-per-screen counter
  34.     ld    a,wrcon        ; Get conout bdos function
  35.     jr    current        ; To common i/o processing
  36.  
  37.  
  38. ; * * * COMMAND: P
  39.  
  40. ; Send file to logical list device (any keypress cancels)
  41.  
  42. flist:
  43.     xor    a        ; Set flags
  44.     ld    (first$m),a    ; Set for prompt for print
  45.     ld    (mflag),a    ; Not a mass print
  46.     call    lstfile        ; Print file at ringpos
  47.     call    erclr        ; Clear error message line.
  48.     jp    loop        ; Return for next command.
  49.  
  50.  
  51. ; LISTFILE - Print file at RINGPOS
  52.  
  53. lstfile:
  54.     ld    a,(first$m)    ; Bypass prompt if already issued.
  55.     or    a
  56.     jr    nz,lstskip
  57.  
  58.     call    cprmpt
  59.     db    'Print (Y/N)? ',0
  60.     call    keyin        ; Get response
  61.     cp    'Y'
  62.     jp    nz,loop        ; Refresh screen & continue
  63.     ld    (first$m),a    ; Bypass prompt next file print.
  64.  
  65. lstskip:
  66.     ld    hl,0        ; Initialize page number
  67.     ld    (pagenum),hl
  68.     call    ermsg
  69.     db    'Printing ',0
  70.     ld    hl,(ringpos)    ; Pt to file name
  71.     inc    hl
  72.     call    prfnskip    ; Print it
  73.     xor    a
  74.     ld    (eoflag),a    ; File not completed yet.
  75.     ld    a,2        ; Initialize lines-per-page counter
  76.     ld    (lpscnt),a
  77.     ld    a,list        ; Get listout bdos function and fall thru
  78.  
  79. ; output character for console/list processing
  80.  
  81. current:
  82.     ld    (con$lst),a    ; Save bdos function
  83.  
  84. ; output file to console/list
  85.  
  86.     call    ringfcb        ; Position name to 'fcb'
  87.     call    fi0$close    ; Close input file if previously opened.
  88.     ld    de,s$fcb    ; Get fcb with file id.
  89.     call    fi0$open    ; Open file for byte i/o.
  90.     jr    z,zerocr    ; If okay, bypass error message.
  91.  
  92. endfnf:
  93.     cp    4        ; See if fi0$open end-of-file.
  94.     jr    nz,fnf        ; Br if not. assume file not found.
  95.  
  96. ;  Empty File Error
  97.  
  98. endf:
  99.     call    endf1        ; Print 'empty file' message.
  100.     jr    fnfxit        ; Exit after user prompt.
  101.  
  102. ;  File Not Found Error
  103.  
  104. fnf:
  105.     call    fnf1        ; Print 'file not found' message
  106. fnfxit:
  107.     call    bottom        ; Wait for user to respond.
  108.     ld    a,(mflag)    ; Mass operation?
  109.     or    a
  110.     ret    nz        ; Group operation - continue.
  111.     jp    runsh4a        ; Single file - refresh screen & continue
  112.  
  113. ;  Print File Not Found Message
  114.  
  115. fnf1:
  116.     call    ermsg
  117.     db    'File NOT Found',0
  118.     ret
  119.  
  120. ;  Print Empty File Message
  121.  
  122. endf1:
  123.     call    ermsg
  124.     db    'Empty File',0
  125.     ret
  126.  
  127. ; Continue
  128.  
  129. zerocr:
  130.     xor    a
  131.     ld    (s$fcb+32),a    ; Zero file 'current record' field
  132.      if    exptab
  133.     ld    (charcnt),a    ; Zero char count for tabbing
  134.      endif
  135.     call    usqhdr        ; Check for squeezed file.
  136.     call    phead        ; Print heading
  137.  
  138. readlp:        ; Get next character (squeezed or not)
  139.  
  140.     ld    a,(usqflg)    ; Squeezed file?
  141.     or    a
  142.     jr    nz,rdlp1    ; Br if not.
  143.     call    usqnxt        ; Unsqueeze next char.
  144.     jr    rdlp2        ; Continue.
  145. rdlp1:
  146.     call    f0$get        ; Get a character
  147.  
  148. rdlp2:
  149.     jr    nz,curdone    ; Finished on physical eof.
  150.  
  151.     and    7fh        ; Force to ascii
  152.     cp    eofchar        ; See if end-of-file
  153.     jr    z,curdone    ; Back to ring loop if 'eof'
  154.  
  155.     call    dspchr        ; Output to list/console (char in E on return)
  156.     call    pager        ; Check for 'lf'.
  157.     ld    e,get        ; Get status or char
  158.     ld    c,dircon    ; Console status function
  159.     call    bdos        ; Status?
  160.     and    7fh        ; If character there, then abort..
  161.     call    nz,canview    ; Already got char
  162.     jr    readlp        ; If not, continue with next character.
  163.  
  164. ; EOF reached (if 'view', wait for user before returning to command mode)
  165.  
  166. curdone:
  167.     ld    a,(con$lst)    ; Console?
  168.     cp    wrcon
  169.     jp    z,bottom    ; Prompt for user
  170.     ld    (eoflag),a    ; Force final form feed
  171.     jr    formfd        ; Complete processing this file.
  172.  
  173. pager:
  174.     ld    a,e        ; (character in e-reg)
  175.     cp    lf
  176.     ret    nz
  177.      if    exptab
  178.     xor    a        ; Zero char count
  179.     ld    (charcnt),a
  180.      endif
  181.     ld    a,(con$lst)    ; Printer or console?
  182.     cp    list        ; Check for printer
  183.     jr    z,pagep
  184.     ld    a,(ctpp)    ; Get number of lines of text per screen
  185.     ld    b,a        ; ..in B
  186.     ld    a,(lpscnt)    ; Check for lines-per-screen limit
  187.     inc    a
  188.     ld    (lpscnt),a
  189.     cp    b
  190.     ret    c        ; If not, return
  191.     xor    a        ; Else, initialize for next screenful
  192.     ld    (lpscnt),a
  193.     call    vprint
  194.     db    '  ',dim,'[View More...]',bright,cr,0 ; Show msg line
  195.     call    dkeyin        ; Wait for keyboard input
  196.     cp    ' '        ; See if <space> bar..
  197.     push    af
  198.     ld    b,16        ; Print 16 spaces and CR
  199.     call    prtspac        ;   to clear above msg line
  200.     ld    a,cr
  201.     call    cout
  202.     pop    af
  203.     jr    nz,canview    ; If not, see if cancel.
  204.     ld    a,(ctpp)    ; Set for single line
  205.     dec    a
  206.     ld    (lpscnt),a    ; Scroll and..
  207.     ret            ; Return for one more line.
  208.  
  209. ; Check for new page on printer
  210.  
  211. pagep:
  212.     ld    a,(ltpp)    ; Get number of lines of text per page
  213.     ld    b,a        ; ..in B
  214.     ld    a,(lpscnt)    ; Is counter at limit of lines-per-page
  215.     inc    a
  216.     ld    (lpscnt),a
  217.     cp    b
  218.     ret    c        ; If not, return; else, fall thru to formfd
  219.  
  220. ; Print Form Feed
  221.  
  222. formfd:
  223.     ld    a,(lpscnt)    ; Get lines printed already into B
  224.     ld    b,a
  225.     ld    a,(lppp)    ; Get total lines per physical page
  226.     sub    b        ; Compute lines to skip
  227.     ret    z        ; If zero, we are done already
  228.     ld    b,a        ; Else, move count into B
  229.     ld    a,2        ; Reinitialize lines-per-screen counter
  230.     ld    (lpscnt),a
  231.     ld    a,(lffeed)    ; Form feed available?
  232.     or    a        ; 0=no
  233.     jr    nz,prfeed
  234.  
  235.         ; No formfeed capability available in printer
  236.  
  237.     ld    c,list        ; Lst output
  238. pagelst:
  239.     call    lcrlf        ; New line on lst
  240.     djnz    pagelst
  241.     jr    ffhdrck        ; Print heading and continue.
  242.  
  243.         ; Printer has formfeed capability
  244.  
  245. prfeed:
  246.     call    lcrlf        ; New line
  247.     ld    a,ff        ; Send form feed char
  248.     call    lout
  249.  
  250. ffhdrck:
  251.     ld    a,(eoflag)    ; End of current file?
  252.     or    a
  253.     ret    nz        ; No heading after final form feed.
  254.     jr    phead        ; Print header and done
  255.  
  256. canview:
  257.     cp    ctrlc        ; ^c?
  258.     jp    z,runsh4    ; Quit to command prompt
  259.     cp    ctrlx        ; Cancel this file
  260.     ret    nz        ; No. return for next page
  261.     pop    bc        ; Yes. return one level higher
  262.     ret
  263.  
  264. ;    Print Heading
  265.  
  266. phead:
  267.     ld    hl,headmsg    ; Pt to heading
  268.     ld    b,6        ; Get length.
  269.     call    phead3a        ; Print string.
  270.  
  271.     ld    hl,s$fcb+1    ; Pt to file name
  272.     call    pheadfn        ; Print file name in heading
  273.  
  274.     ld    a,(usqflg)    ; Squeezed file?
  275.     or    a
  276.     jr    nz,phead2    ; Br if not.
  277.  
  278.     ld    hl,usqsep    ; Pt to usq file name separator.
  279.     ld    b,5        ; Get length.
  280.     call    phead3a        ; Print string.
  281.  
  282.     ld    hl,d$fcb+1    ; Pt to original file name
  283.     call    pheadfn        ; Print file name in heading
  284.  
  285. phead2:
  286.     ld    a,(con$lst)
  287.     cp    list
  288.     jr    nz,phead2a    ; If not printing, skip page number display
  289.  
  290.     ld    hl,pagehdr    ; Print 'Page' header
  291.     ld    b,8
  292.     call    phead3a
  293.     ld    hl,(pagenum)    ; Get last page number
  294.     inc    hl        ; Increment to current page
  295.     ld    (pagenum),hl    ; Save it
  296.     ld    a,80h        ; Select printer output
  297.     ld    (sctlfl),a    ; ..for 'switched' output routine
  298.     call    shlfdc        ; Print current page number
  299.     ld    a,1        ; Restore selection of console output
  300.     ld    (sctlfl),a    ; ..for 'switched' output
  301.  
  302. phead2a:
  303.     ld    hl,headskp    ; New line, blank line
  304.     ld    b,4        ; 4 chars
  305.  
  306. phead3a:
  307.     ld    c,0        ; Display all chars
  308.     jr    phead3
  309. phead3b:
  310.     ld    c,' '        ; Skip spaces
  311. phead3:
  312.     ld    a,(hl)        ; Get char
  313.     push    bc
  314.     cp    c        ; Is it char to skip?
  315.     call    nz,dspchr    ; If not, output to list/console
  316.     pop    bc        ; Restore regs.
  317.     inc    hl        ; Pt to next
  318.     djnz    phead3
  319.     ret
  320.  
  321. ; Print a file name in heading, suppressing imbedded spaces.  Called with
  322. ; HL pointing to name in FCB.
  323.  
  324. pheadfn:
  325.     ld    b,8        ; 8 chars
  326.     call    phead3b
  327.     ld    a,'.'        ; Dot
  328.     call    dspchr
  329.     ld    b,3        ; 3 more chars
  330.     jr    phead3b
  331.  
  332. ; Output character to list/console (return character in E register)
  333.  
  334. dspchr:
  335.     push    hl
  336.     ld    e,a        ; Put character for 'bdos' call in E reg
  337.     push    de
  338.     ld    a,(con$lst)    ; Get function for list/console output
  339.     ld    c,a
  340.  
  341.      if    exptab
  342.  
  343.     ld    a,e        ; Check char
  344.     cp    tab        ; Tabulate?
  345.     jr    nz,notab
  346.  
  347.     ld    e,' '        ; Space over
  348. tabl:
  349.     push    bc        ; Save key regs
  350.     push    de
  351.     call    bdos
  352.     pop    de        ; Get key regs
  353.     pop    bc
  354.     ld    hl,charcnt    ; Increment char count
  355.     inc    (hl)
  356.     ld    a,(hl)        ; Get new count
  357.     and    7        ; Check for done at every 8
  358.     jr    nz,tabl
  359.     jr    tabdn
  360. notab:
  361.     call    bdos        ; Send character
  362.     ld    hl,charcnt    ; Increment char count
  363.     inc    (hl)
  364. tabdn:
  365.     pop    de        ; Get char in e in case pager is called
  366.     pop    hl
  367.     ret
  368.  
  369.      else    ; not exptab
  370.  
  371.     call    bdos        ; Send character
  372.     pop    de        ; Get char in e in case pager is called
  373.     pop    hl
  374.     ret
  375.  
  376.      endif    ; exptab
  377.