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 / ZCPR2 / PHELP.MAC < prev    next >
Text File  |  2000-06-30  |  30KB  |  1,420 lines

  1. ;
  2. ;  PROGRAM:  PHELP
  3. ;  AUTHOR:  Richard Conn
  4. ;  VERSION:  2.0
  5. ;  DATE:  28 Apr 83
  6. ;  PREVIOUS VERSIONS:  None
  7. ;  DERIVATION:  PHELP 1.2 (12 July 80)
  8. ;
  9. VERS    equ    20
  10.  
  11. FALSE    EQU    0
  12. TRUE    EQU    NOT FALSE
  13.  
  14. timeok    equ    FALSE    ;TRUE if TIME enabled, FALSE if not
  15.  
  16. ;
  17. ;    PHELP is used to print out a HLP file.  It breaks pages on each
  18. ; information section and ignores form feeds, so the data is presented
  19. ; in a sequential fashion.  It is very convenient to provide online
  20. ; documentation in the form of HLP files, and this utility allows the user
  21. ; to readily print out this documentation.  PHELP is preferred over PRINT3
  22. ; for printing HLP files because of its knowledge of their structure and
  23. ; its special way of handling them.
  24. ;
  25. ;    PHELP is invoked by a command line of the following form:
  26. ;        PHELP file1,file2,...,filen o...
  27. ; where each "filen" is an ambiguous file name and "o" is zero or more of
  28. ; the following options:
  29. ;    H@head@    Heading Text
  30. ;            The user may specify the text of the heading to
  31. ;            appear at the top of every page
  32. ;    I    Inspect Files
  33. ;            The user approves each file to be printed
  34. ;            before the printing process begins
  35. ;    L    Toggle Line Numbering
  36. ;            Each line may or may not begin with a line number
  37. ;    Snnnn    Skip to Specified Page
  38. ;            Printing begins at the indicated page
  39. ;    T    Toggle Time Display
  40. ;            Time/Date information is optionally included
  41. ;            in the page header
  42. ;
  43.  
  44. ;
  45. ;    This program is Copyright (c) 1983 by Richard Conn
  46. ;    All Rights Reserved
  47. ;
  48. ;    ZCPR2 and its utilities, including this one, are released
  49. ; to the public domain.  Anyone who wishes to USE them may do so with
  50. ; no strings attached.  The author assumes no responsibility or
  51. ; liability for the use of ZCPR2 and its utilities.
  52. ;
  53. ;    The author, Richard Conn, has sole rights to this program.
  54. ; ZCPR2 and its utilities may not be sold without the express,
  55. ; written permission of the author.
  56. ;
  57.  
  58. ;
  59. ;  BASIC SYSLIB ROUTINES NEEDED BY TEMPLATE
  60. ;
  61. C$ESIZE    EQU    16    ; SIZE OF DIR ENTRY (FROM SYSLIB DIRF ROUTINE)
  62.  
  63.     EXT    DIRFS    ; DIRECTORY PROCESSOR
  64.     EXT    DIRPACK    ; PACK DIRECTORY
  65.  
  66.     EXT    ZGPINS    ; INIT BUFFERS
  67.     EXT    ZFNAME    ; FILE NAME PROCESSOR
  68.  
  69.     EXT    INITFCB    ; INIT FCB
  70.     EXT    RETUD    ; RETURN CURRENT USER/DISK
  71.     EXT    PUTUD    ; SAVE CURRENT USER/DISK
  72.     EXT    GETUD    ; RESTORE CURRENT USER/DISK
  73.     EXT    LOGUD    ; LOG INTO USER/DISK
  74.     EXT    PRINT    ; PRINT STRING PTED TO BY RET ADR
  75.     EXT    PADC    ; PRINT A AS DECIMAL CHARS
  76.     EXT    COUT    ; CONSOLE OUTPUT ROUTINE
  77.     EXT    CST    ; CONSOLE STATUS ROUTINE
  78.     EXT    CIN    ; CONSOLE INPUT ROUTINE
  79.     EXT    CAPS    ; CAPITALIZE ROUTINE
  80.     EXT    CRLF    ; NEW LINE ROUTINE
  81.     EXT    CLINE    ; COMMAND LINE STRING SAVE ROUTINE
  82.     EXT    CODEND    ; CODE END COMPUTATION ROUTINE
  83.  
  84.     EXT    F$OPEN    ; FILE OPEN
  85.     EXT    F$READ    ; BLOCK READ
  86.     EXT    F$CLOSE    ; FILE CLOSE
  87.  
  88.     ext    eval10
  89.     ext    lcrlf
  90.     ext    lpstr
  91.     ext    lprint
  92.     ext    lout
  93.     ext    lhldc
  94.     ext    condin
  95.     ext    moveb
  96. ;
  97.     if    timeok
  98.     ext    time
  99.     endif
  100. ;
  101.  
  102. ;
  103. ;  Insert Function-Required Library References Here
  104. ;
  105.  
  106. ;
  107. ;  CP/M EQUATES
  108. ;
  109. CPM    EQU    0    ; WARM BOOT
  110. BDOSE    EQU    CPM+5    ; BDOS ENTRY
  111. FCB    EQU    CPM+5CH    ; FCB
  112. TBUFF    EQU    CPM+80H    ; INPUT LINE BUFFER
  113. DEL    EQU    7FH    ; <DEL>
  114. CR    EQU    13    ; <CR>
  115. FF    EQU    12    ; <FF>
  116. LF    EQU    10    ; <LF>
  117. CTRLC    EQU    'C'-'@'    ; ^C
  118. CTRLG    EQU    'G'-'@'
  119. CTRLH    EQU    'H'-'@'
  120. CTRLI    EQU    'I'-'@'
  121. CTRLS    EQU    'S'-'@'
  122. CTRLX    EQU    'X'-'@'
  123. CTRLZ    EQU    'Z'-'@'
  124. eold    equ    0FFH    ;End of Load Indicator
  125.  
  126. ;
  127. ;  Branch to Start of Program
  128. ;
  129.     JMP    T$START
  130.  
  131. ;
  132. ;******************************************************************
  133. ;
  134. ;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
  135. ;
  136. ;    This data block precisely defines the data format for
  137. ; initial features of a ZCPR2 system which are required for proper
  138. ; initialization of the ZCPR2-Specific Routines in SYSLIB.
  139. ;
  140.  
  141. ;
  142. ;  EXTERNAL PATH DATA
  143. ;
  144. EPAVAIL:
  145.     DB    0FFH    ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
  146. EPADR:
  147.     DW    40H    ; ADDRESS OF EXTERNAL PATH IF AVAILABLE
  148.  
  149. ;
  150. ;  INTERNAL PATH DATA
  151. ;
  152. INTPATH:
  153.     DB    0,0    ; DISK, USER FOR FIRST PATH ELEMENT
  154.             ; DISK = 1 FOR A, '$' FOR CURRENT
  155.             ; USER = NUMBER, '$' FOR CURRENT
  156.     DB    0,0
  157.     DB    0,0
  158.     DB    0,0
  159.     DB    0,0
  160.     DB    0,0
  161.     DB    0,0
  162.     DB    0,0    ; DISK, USER FOR 8TH PATH ELEMENT
  163.     DB    0    ; END OF PATH
  164.  
  165. ;
  166. ;  MULTIPLE COMMAND LINE BUFFER DATA
  167. ;
  168. MCAVAIL:
  169.     DB    0FFH    ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
  170. MCADR:
  171.     DW    0FF00H    ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE
  172.  
  173. ;
  174. ;  DISK/USER LIMITS
  175. ;
  176. MDISK:
  177.     DB    4    ; MAXIMUM NUMBER OF DISKS
  178. MUSER:
  179.     DB    31    ; MAXIMUM USER NUMBER
  180.  
  181. ;
  182. ;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
  183. ;
  184. DOK:
  185.     DB    0FFH    ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
  186. UOK:
  187.     DB    0FFH    ; ALLOW USER CHANGE? (0=NO, 0FFH=YES)
  188.  
  189. ;
  190. ;  PRIVILEGED USER DATA
  191. ;
  192. PUSER:
  193.     DB    10    ; BEGINNING OF PRIVILEGED USER AREAS
  194. PPASS:
  195.     DB    'chdir',0    ; PASSWORD FOR MOVING INTO PRIV USER AREAS
  196.     DS    41-($-PPASS)    ; 40 CHARS MAX IN BUFFER + 1 for ending NULL
  197.  
  198. ;
  199. ;  CURRENT USER/DISK INDICATOR
  200. ;
  201. CINDIC:
  202.     DB    '$'    ; USUAL VALUE (FOR PATH EXPRESSIONS)
  203.  
  204. ;
  205. ;  DMA ADDRESS FOR DISK TRANSFERS
  206. ;
  207. DMADR:
  208.     DW    80H    ; TBUFF AREA
  209.  
  210. ;
  211. ;  NAMED DIRECTORY INFORMATION
  212. ;
  213. NDRADR:
  214.     DW    00000H    ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
  215. NDNAMES:
  216.     DB    64    ; MAX NUMBER OF DIRECTORY NAMES
  217. DNFILE:
  218.     DB    'NAMES   '    ; NAME OF DISK NAME FILE
  219.     DB    'DIR'        ; TYPE OF DISK NAME FILE
  220.  
  221. ;
  222. ;  REQUIREMENTS FLAGS
  223. ;
  224. EPREQD:
  225.     DB    0FFH    ; EXTERNAL PATH?
  226. MCREQD:
  227.     DB    000H    ; MULTIPLE COMMAND LINE?
  228. MXREQD:
  229.     DB    0FFH    ; MAX USER/DISK?
  230. UDREQD:
  231.     DB    000H    ; ALLOW USER/DISK CHANGE?
  232. PUREQD:
  233.     DB    000H    ; PRIVILEGED USER?
  234. CDREQD:
  235.     DB    0FFH    ; CURRENT INDIC AND DMA?
  236. NDREQD:
  237.     DB    0FFH    ; NAMED DIRECTORIES?
  238. Z2CLASS:
  239.     DB    11    ; CLASS 11
  240.     DB    'ZCPR2'
  241.     DS    10    ; RESERVED
  242.  
  243. ;
  244. ;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
  245. ;
  246. ;******************************************************************
  247. ;
  248.  
  249. ;
  250. ;  **** Special Initial Value Area for GENINS
  251. ;
  252. LWIDTH:
  253.     DB    132    ; PRINTER LINE WIDTH
  254. LTPP:
  255.     DB    44    ; LINES OF TEXT PER PAGE
  256. LSPP:
  257.     DB    5    ; LINES TO SKIP PER PAGE
  258. CWIDTH:
  259.     DB    80    ; WIDTH OF SCREEN
  260. CTPP:
  261.     DB    22    ; LINES OF TEXT PER SCREEN
  262. CSPP:
  263.     DB    1    ; LINES TO SKIP PER SCREEN
  264. ;
  265. ;  NOTE:  LTPP + LSPP + 2 (HEADER SIZE) = TOTAL LINES PER PAGE ON PRINTER
  266. ;
  267. DLNUMFL:
  268.     DB    0    ; LINE NUMBER FLAG (DEFAULT TO NO)
  269. DTIMEPFL:
  270.     DB    0FFH    ; TIME PRINT FLAG (DEFAULT TO YES)
  271. DINSPECT:
  272.     DB    0    ; INSPECT FILES (DEFAULT TO NO)
  273. ;
  274. ;  WORKING BUFFERS
  275. ;
  276. LNUMFL:
  277.     DB    0    ; LINE NUMBER FLAG
  278. TIMEPFL:
  279.     DB    0FFH    ; TIME PRINT FLAG
  280. INSPECT:
  281.     DB    0    ; INSPECT FLAG
  282. SKIPFL:
  283.     DB    0    ; SKIP FLAG (DEFAULT TO NO)
  284. SKIPNUM:
  285.     DS    2    ; PAGE NUMBER TO SKIP TO
  286. LNUM:
  287.     DS    2    ; CURRENT LINE NUMBER
  288. PNUM:
  289.     DS    2    ; CURRENT PAGE NUMBER
  290. HBUF:
  291.     DS    100    ; BUFFER FOR HEADING
  292. ;
  293.     if    timeok
  294. TIMEBF:
  295.     DS    100    ; BUFFER FOR TIME STAMP
  296.     endif
  297. ;
  298. ;  Start of Program
  299. ;
  300. T$START:
  301.     LXI    H,0    ; GET STACK PTR
  302.     DAD    SP
  303.     SHLD    V$STACK    ; SAVE IT
  304.     LXI    SP,V$STACK    ; SET SP
  305.     XRA    A    ; A=0
  306.     STA    V$INSPECT    ; TURN OFF FILE INSPECTION
  307.     CALL    PUTUD    ; SAVE CURRENT USER/DISK AWAY
  308.     CALL    RETUD    ; GET CURRENT USER/DISK
  309.     MOV    A,B    ; SAVE DISK
  310.     STA    V$DISK
  311.     MOV    A,C    ; SAVE USER
  312.     STA    V$USER
  313.  
  314.     CALL    ZGPINS    ; INIT BUFFERS
  315.  
  316.     LXI    H,TBUFF    ; SAVE COMMAND LINE
  317.     CALL    CLINE
  318.     SHLD    V$CMDLNE    ; SAVE PTR
  319.  
  320. ;
  321. ;  Banner of Program
  322. ;
  323.     CALL    BANNER    ; PRINT BANNER PROVIDED BY USER
  324. ;
  325. ;  Check for Help Request
  326. ;
  327.     LDA    FCB+1    ; GET FIRST CHAR OF FILE NAME
  328.     CPI    ' '    ; NO FILE SPEC?
  329.     JZ    T$HELPENT
  330.     CPI    '/'    ; OPTION CAUGHT?
  331.     JNZ    T$ECONT
  332.  
  333. ;
  334. ;  Print Help Information
  335. ;
  336. T$HELPENT:
  337.     CALL    HELP    ; PRINT PROGRAM'S HELP MESSAGE
  338.  
  339. ;
  340. ;  RETURN TO OS
  341. ;
  342. T$RETURN:
  343.     CALL    DINIT    ; DEINIT PROGRAM
  344.     LHLD    V$STACK    ; GET OLD STACK
  345.     SPHL        ; SET IT
  346.     RET
  347.  
  348. ;
  349. ;  PROGRAM'S INIT ROUTINE
  350. ;
  351. T$ECONT:
  352.     CALL    INIT    ; PROG INIT ROUTINE
  353. ;
  354. ;  EXTRACT FLAGS IF PRESENT
  355. ;
  356.     LXI    H,0    ; SET FILE COUNT
  357.     SHLD    V$FILECNT
  358.     LHLD    V$CMDLNE    ; PT TO BUFFER
  359. ;
  360. ;  SKIP TO FILE NAME STRING
  361. ;
  362.     CALL    T$SBLANK    ; SKIP OVER BLANKS
  363. ;
  364. ;  SKIP TO END OF FILE NAME STRING
  365. ;
  366.     CALL    T$SNBLANK    ; SKIP OVER NON-BLANKS
  367. ;
  368. ;  CHECK FOR LEADING SLASH ON OPTION AND SKIP IT IF SO
  369. ;
  370. T$OPT:
  371.     CPI    '/'    ; OPTION CHAR?
  372.     JNZ    T$OPTION
  373.     INX    H    ; SKIP SLASH
  374. ;
  375. ;  PROCESS LIST OF OPTIONS
  376. ;
  377. T$OPTION:
  378.     MOV    A,M    ; GET BYTE
  379.     ORA    A    ; DONE?
  380.     JZ    T$DSPEC
  381.     INX    H    ; PT TO NEXT CHAR
  382.     CPI    ' '    ; SKIP OVER SPACES
  383.     JZ    T$OPTION
  384.     MOV    C,A    ; COMMAND IN C
  385.     LXI    D,OPTAB    ; PT TO OPTION TABLE
  386. T$OPTL:
  387.     LDAX    D    ; GET OPTION LETTER
  388.     ORA    A    ; END OF TABLE?
  389.     JZ    T$HELPENT    ; HELP IF SO
  390.     CMP    C    ; MATCH?
  391.     JZ    T$OPTM    ; PROCESS IF SO
  392.     INX    D    ; PT TO NEXT ENTRY
  393.     INX    D
  394.     INX    D
  395.     JMP    T$OPTL
  396. ;
  397. ;  PROCESS OPTION
  398. ;
  399. T$OPTM:
  400.     PUSH    H    ; SAVE HL ON STACK
  401.     LXI    H,T$OPTION    ; GET RETURN ADDRESS
  402.     XTHL        ; ... ON STACK AND RESTORE HL
  403.     INX    D    ; PT TO ADDRESS
  404.     LDAX    D    ; GET ADDRESS LOW
  405.     MOV    B,A    ; ... IN B
  406.     INX    D
  407.     LDAX    D    ; GET ADDRESS HIGH
  408.     MOV    D,A    ; ... IN D
  409.     MOV    E,B    ; LOW IN E
  410.     PUSH    D    ; PUT ADDRESS ON STACK
  411.     MOV    A,C    ; COMMAND IN A
  412.     RET        ; "CALL" OPTION ROUTINE
  413. ;
  414. ;  BEGIN MOVING THROUGH FILE NAMES, SEPARATED BY COMMAS
  415. ;
  416. T$DSPEC:
  417.     LHLD    V$CMDLNE    ; PT TO FIRST BYTE
  418.     CALL    T$SBLANK    ; SKIP TO NON-BLANK
  419. ;
  420. ;  MAJOR REENTRY POINT WHEN FILE SPECS ARE SEPARATED BY COMMAS
  421. ;    HL PTS TO FIRST BYTE OF NEXT FILE SPEC
  422. ;
  423. T$DSPEC1:
  424.     LXI    SP,V$STACK    ; RESET STACK
  425.     CALL    GETUD    ; RESET USER IF NECESSARY
  426.     LXI    D,V$NTFCB    ; PT TO FCB IN DE, PT TO 1ST CHAR OF FN IN HL
  427.  
  428.     CALL    ZFNAME    ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER
  429.     JZ    T$DERR    ; ERROR HANDLER
  430.  
  431.     push    b    ;save disk/user
  432.     push    h    ;save others
  433.     push    d
  434.     lxi    h,hlptyp    ;optionally set default HLP type
  435.     lxi    d,V$NTFCB+9    ;check for any specified
  436.     ldax    d    ;' ' means none
  437.     cpi    ' '
  438.     jnz    hlpskp
  439.     mvi    b,3    ;3 chars
  440.     call    moveb
  441. hlpskp:
  442.     pop    d    ;restore others
  443.     pop    h
  444.     pop    b    ;restore disk/user
  445.     SHLD    V$NEXTCH    ; SAVE PTR TO DELIMITER WHICH ENDED SCAN
  446.     MOV    A,B    ; SAVE POSSIBLE DRIVE SPEC
  447.     CPI    0FFH    ; CURRENT DISK?
  448.     JZ    T$DSPEC2
  449.     LDA    MDISK    ; GET MAX DISK NUMBER
  450.     DCR    B    ; ADJUST TO WITHIN BOUNDS 0-15
  451.     CMP    B    ; WITHIN BOUNDS?
  452.     MOV    A,B    ; GET DISK NUMBER IN A
  453.     JNC    T$USPEC
  454. T$DERR:
  455.     CALL    PRINT
  456.     DB    CR,LF,'Invalid Disk Specification',0
  457.     JMP    T$RETURN
  458.  
  459. ;
  460. ;  SET CURRENT DISK
  461. ;
  462. T$DSPEC2:
  463.     LDA    V$DISK    ;GET CURRENT DISK
  464.     MOV    B,A    ;... IN B
  465.  
  466. ;  CHECK FOR USER NUMBER
  467. T$USPEC:
  468.     MOV    A,C    ; GET NEW USER NUMBER
  469.     CPI    0FFH    ; DEFAULT USER?
  470.     JZ    T$USPEC1
  471.     CPI    '?'    ; ALL USERS NOT ALLOWED?
  472.     JZ    T$UERR
  473.     LDA    MUSER    ; GET MAX USER NUMBER
  474.     CMP    C
  475.     MOV    A,C    ; USER NUMBER IN A
  476.     JNC    T$FCT
  477. T$UERR:
  478.     CALL    PRINT
  479.     DB    CR,LF,'Invalid User Number',0
  480.     JMP    T$RETURN
  481. T$USPEC1:
  482.     LDA    V$USER    ;GET CURRENT USER
  483.     MOV    C,A    ;... IN C
  484.  
  485. ;
  486. ;  LOAD DIRECTORY AND PERFORM FUNCTION
  487. ;
  488. T$FCT:
  489.     MOV    A,B    ; SAVE NEW DISK/USER AWAY
  490.     STA    V$CDISK    ; CURRENT DISK
  491.     MOV    A,C
  492.     STA    V$CUSER    ; CURRENT USER
  493.     CALL    LOGUD    ; LOG INTO ACCOUNT
  494.     CALL    CODEND    ; PT TO END OF CODE
  495.     CALL    RETUD    ; GET USER NUMBER FOR DIRFS
  496.     MVI    A,11000000B    ; SELECT SYS AND NON-SYS FILES
  497.     ORA    C    ; OR IN USER NUMBER
  498.     LXI    D,V$NTFCB    ; PT TO FCB
  499.     CALL    INITFCB    ; INIT THE FCB
  500.     CALL    DIRFS    ; LOAD DIR, SELECT FILES, PACK, AND ALPHABETIZE
  501. ;
  502. ;  DETERMINE BEGINNING OF SCRATCH AREA (SCRATCH) AND SIZE IN PAGES (BCNT)
  503. ;
  504.     PUSH    H    ; SAVE PTR AND COUNT
  505.     PUSH    B
  506.     LXI    D,C$ESIZE    ; SET PTR TO NEXT FREE BLOCK
  507. T$FCTFRE:
  508.     MOV    A,B    ; DONE?
  509.     ORA    C
  510.     JZ    T$FCTFR1
  511.     DAD    D    ; PT TO NEXT
  512.     DCX    B    ; COUNT DOWN
  513.     JMP    T$FCTFRE
  514. T$FCTFR1:
  515.     INR    H    ; NEXT PAGE
  516.     MVI    L,0
  517.     SHLD    V$SCRATCH    ; SET PTR TO SCRATCH AREA
  518.     XCHG        ; PTR IN DE
  519.     LHLD    BDOSE+1    ; COMPUTE BLOCK BUFFER SIZE
  520.     MOV    A,H    ; ADJUST FOR ZCPR2
  521.     SUI    10
  522.     SUB    D    ; A=SIZE IN BLOCKS
  523.     STA    V$BCNT    ; SET BLOCK COUNT
  524.     POP    B    ; RESTORE AND SAVE REGS
  525.     POP    H
  526. ;
  527. ;  ALLOW USER TO INSPECT FILES
  528. ;
  529.     PUSH    H
  530.     PUSH    B
  531.     CALL    T$ICHECK    ; CHECK FOR INSPECT OPTION AND INSPECT IF SET
  532.     POP    B    ; RESTORE COUNT AND PTR
  533.     POP    H
  534.  
  535. ;
  536. ;  PERFORM FUNCTION; HL PTS TO FILE AND BC CONTAINS NUMBER OF FILES
  537. ;
  538. T$FCTL:
  539.     MOV    A,B        ; CHECK FOR COMPLETION (COUNT = 0)
  540.     ORA    C
  541.     JZ    T$FCTL1
  542.     DCX    B        ; COUNT DOWN
  543.     LXI    SP,V$STACK    ; RESET STACK
  544.     PUSH    B        ; SAVE COUNT AND PTR
  545.     PUSH    H
  546.     MOV    A,M        ; SELECTED FILE?
  547.     ORA    A        ; 0=YES
  548.     CZ    FUNCTION    ; PERFORM FUNCTION
  549. ;
  550. ;  ENTRY POINT TO SKIP TO NEXT FILE IN LIST
  551. ;
  552. E$FCTLNXT:
  553.     LXI    SP,V$STACK-4    ; RESTORE STACK
  554.     POP    H        ; RESTORE PTR
  555.     POP    B        ; RESTORE COUNT
  556.     LXI    D,C$ESIZE    ; PT TO NEXT ENTRY
  557.     DAD    D
  558.     JMP    T$FCTL
  559.  
  560. ;
  561. ;  CHECK FOR NEXT FILE SPEC
  562. ;
  563. T$FCTL1:
  564.     CALL    GETUD    ; RETURN TO BASE USER/DISK
  565.     LHLD    V$NEXTCH    ; GET PTR
  566.     MOV    A,M    ; GET DELIM
  567.     CPI    ','    ; ANOTHER FILE?
  568.     JNZ    T$RETURN
  569.     INX    H    ; PT TO CHAR AFTER COMMA
  570.     JMP    T$DSPEC1    ; CONTINUE PROCESSING
  571. ;
  572. ;  INSPECT FILES -- THIS ROUTINE IS TO PERFORM A FILE INSPECTION
  573. ;    ON INPUT, HL PTS TO FIRST 16-BYTE ENTRY AND BC=NUMBER OF ENTRIES
  574. ;
  575. T$ICHECK:
  576.     MOV    A,B    ;ANY FILES?
  577.     ORA    C    ;0=NO
  578.     RZ
  579.     PUSH    H    ;SAVE PTRS
  580.     PUSH    B
  581.     LXI    D,C$ESIZE    ;SIZE OF ENTRY
  582. T$ICHK1:
  583.     MVI    M,0    ;CLEAR MSBYTES
  584.     DAD    D    ;PT TO NEXT
  585.     DCX    B    ;COUNT DOWN
  586.     MOV    A,B    ;DONE?
  587.     ORA    C
  588.     JNZ    T$ICHK1
  589.     POP    B    ;RESTORE PTRS
  590.     POP    H
  591.     LDA    V$INSPECT    ;INSPECT?
  592.     ORA    A    ;0=NO
  593.     RZ
  594.     CALL    PRINT
  595.     DB    CR,LF,'File Inspect Mode',0
  596. T$ICHK2:
  597.     CALL    PRINT
  598.     DB    CR,LF,'Select ',0
  599.     CALL    E$PRFN    ;PRINT FILE NAME
  600.     CALL    PRINT
  601.     DB    ' -- (Y/N/Q=Select Rest/S=Skip Rest/other=Y)? '
  602.     DB    0
  603.     CALL    CIN    ;GET RESPONSE
  604.     CALL    CAPS    ;CAPITALIZE
  605.     CALL    COUT    ;ECHO
  606.     CPI    'Q'    ;SELECT REST?
  607.     JZ    T$ICHKYR
  608.     CPI    'S'    ;SKIP REST
  609.     JZ    T$ICHKNR
  610.     CPI    'N'    ;NO TO THIS ONE?
  611.     JNZ    T$ICHK3
  612.     MVI    M,0FFH    ;SET NO FLAG IN FILE FCB
  613. T$ICHK3:
  614.     DAD    D    ;PT TO NEXT ONE
  615.     DCX    B    ;COUNT DOWN
  616.     MOV    A,B    ;DONE?
  617.     ORA    C
  618.     JNZ    T$ICHK2
  619.     RET
  620. ;  CHECK REST OF FILES AS SELECTED
  621. T$ICHKYR:
  622.     CALL    PRINT
  623.     DB    CR,LF,'    Rest of Files Selected',0
  624.     RET
  625. ;  CHECK REST OF FILES AS NOT SELECTED
  626. T$ICHKNR:
  627.     MVI    M,0FFH    ;SET NO FLAG
  628.     DAD    D    ;PT TO NEXT
  629.     DCX    B    ;COUNT DOWN
  630.     MOV    A,B    ;DONE?
  631.     ORA    C
  632.     JNZ    T$ICHKNR
  633.     CALL    PRINT
  634.     DB    CR,LF,'    Rest of Files NOT Selected',0
  635.     RET
  636. ;
  637. ;  UTILITIES
  638. ;    T$SBLANK  -- SKIP BLANKS PTED TO BY HL UNTIL NON-BLANK ENCOUNTERED; HL
  639. ;    T$SNBLANK -- SKIP NON-BLANKS PTED TO BY HL UNTIL BLANK OR EOL; HL
  640. ;    E$PRFN    -- PRINT FILE NAME PTED TO BY HL; AFFECT NOTHING
  641.  
  642. ;
  643. ;  SKIP UNTIL NON-BLANK
  644. ;
  645. T$SBLANK:
  646.     MOV    A,M    ; LOOK FOR BLANK
  647.     INX    H    ; PT TO NEXT
  648.     CPI    ' '    ; BLANK?
  649.     JZ    T$SBLANK
  650.     DCX    H    ; BACK UP
  651.     RET
  652.  
  653. ;
  654. ;  SKIP UNTIL BLANK OR EOL
  655. ;
  656. T$SNBLANK:
  657.     MOV    A,M    ; GET CHAR
  658.     INX    H    ; PT TO NEXT
  659.     CPI    ' '    ; BLANK?
  660.     JZ    T$SNB1
  661.     ORA    A    ; EOL?
  662.     JNZ    T$SNBLANK
  663. T$SNB1:
  664.     DCX    H    ; BACK UP
  665.     RET
  666.  
  667. ;
  668. ;  PRINT FILE NAME PTED TO BY HL
  669. ;    OUTPUT TO CON:
  670. ;
  671. E$PRFN:
  672.     PUSH    H    ; SAVE REGS
  673.     PUSH    B
  674.     CALL    RETUD    ; GET CURRENT USER/DISK
  675.     MOV    A,B    ; GET DISK NUMBER
  676.     ADI    'A'    ; CONVERT TO LETTER
  677.     CALL    COUT    ; PRINT LETTER
  678.     MOV    A,C    ; GET USER NUMBER
  679.     CALL    PADC    ; PRINT USER NUMBER
  680.     CALL    PRINT
  681.     DB    ': ',0
  682.     INX    H    ; PT TO FILE NAME
  683.     MVI    B,8    ; PRINT NAME
  684.     CALL    T$PRNT
  685.     MVI    A,'.'    ; DECIMAL
  686.     CALL    COUT
  687.     MVI    B,3    ; PRINT TYPE
  688.     CALL    T$PRNT
  689.     POP    B    ; GET REGS
  690.     POP    H
  691.     RET
  692.  
  693. ;
  694. ;  PRINT CHARS PTED TO BY HL FOR B BYTES
  695. ;    OUTPUT TO CON:
  696. ;
  697. T$PRNT:
  698.     MOV    A,M    ; GET CHAR
  699.     CALL    COUT
  700.     INX    H    ; PT TO NEXT
  701.     DCR    B    ; COUNT DOWN
  702.     JNZ    T$PRNT
  703.     RET
  704.  
  705. ;***********************************************
  706. ;*  Application-Specific Section
  707. ;***********************************************
  708.  
  709. ;****************************************************
  710. ;*
  711. ;*  Function-Specific Routines
  712. ;*    These routines need to be customized for the
  713. ;* specific function being performed.  These, in
  714. ;* effect, implement the function.  Other Entry Points
  715. ;* useful to the programmer are:
  716. ;*        E$FCTLNXT -- Clean Abort of Current
  717. ;*                Processing and Skip
  718. ;*                to Next File in List;
  719. ;*                This is a Clean Way to
  720. ;*                Abort FUNCTION for the
  721. ;*                Next File
  722. ;*        E$PRFN    -- Print File Name Pted to
  723. ;*                by HL; No Regs Affected
  724. ;*
  725. ;****************************************************
  726.  
  727. ;
  728. ;  **** EMERGENCY ABORT
  729. ;
  730. ABORT:
  731.     CALL    PRINT
  732.     db    cr,lf,'** PHELP Abort **'
  733.     DB    0
  734.     CALL    GETUD    ; RETURN HOME
  735.     JMP    T$RETURN
  736. ;
  737. ;  **** BANNER -- PRINT BANNER FOR PROGRAM (PROGRAM NAME ET AL)
  738. ;
  739. BANNER:
  740.     CALL    PRINT
  741.     db    'PHELP  Version '
  742.     db    (vers/10)+'0','.',(vers mod 10)+'0'
  743.     DB    0
  744.     RET
  745. ;
  746. ;  **** HELP -- PRINT PROGRAM'S HELP MESSAGE
  747. ;
  748. HELP:
  749.     CALL    PRINT
  750.     db    cr,lf,'    PHELP is used to print out HLP Files.  It is invoked'
  751.     db    cr,lf,'by a command line of the following form: '
  752.     db    cr,lf,'        PHELP file1,file2,...,filen o...'
  753.     db    cr,lf,'where "filen" is an ambiguous file name and "o" is zero'
  754.     db    cr,lf,'or more of the following options:'
  755.     db    cr,lf,'    H@head@    -- Use "head" as header on every page'
  756.     db    cr,lf,'           (@ is any character, used as a delimiter)'
  757.     db    cr,lf,'    I    -- Inspect Files for Printing'
  758.     db    cr,lf,'    L    -- Number Each Line'
  759.     db    cr,lf,'    Snn    -- Skip to Page nn and Start Printing'
  760.     db    cr,lf,'    T    -- Toggle Time Display'
  761.     db    cr,lf
  762.     db    cr,lf,'    PHELP assumes HLP to be the file type if none is given'
  763.     DB    0
  764.     RET
  765. ;
  766. ;  **** PROGRAM INIT ROUTINE
  767. ;    THIS ROUTINE IS USED BY THE PROGRAM TO PERFORM ANY NECESSARY
  768. ;    INITIALIZATIONS
  769. ;
  770. INIT:
  771.     lxi    h,dlnumfl    ;copy defaults into buffers
  772.     lxi    d,lnumfl
  773.     mvi    b,3    ;3 bytes
  774.     call    moveb
  775.     xra    a    ;A=0
  776.     sta    skipfl    ;set no skip
  777.     sta    hbuf    ;set no heading
  778. ;
  779.     if    timeok
  780.     call    time    ;get time string
  781.     lxi    d,timebf    ;store in buffer
  782. initt:
  783.     mov    a,m    ;get byte
  784.     stax    d
  785.     inx    h    ;pt to next
  786.     inx    d
  787.     ora    a    ;done?
  788.     jnz    initt
  789.     endif
  790. ;
  791.     RET
  792. ;
  793. ;  **** FUNCTION COMPLETE -- CLEANUP AND EXIT
  794. ;    FILL THIS IN WITH CLEANUP CODE FOR EXIT
  795. ;
  796. DINIT:
  797.     RET
  798. ;
  799. ;  **** OPTION TABLE USED TO PROCESS COMMAND LINE
  800. ;    EACH OPTION IS A CAPITAL LETTER OR SPECIAL CHAR FOLLOWED BY
  801. ;        AN ADDRESS; THE TABLE IS TERMINATED BY A BINARY ZERO
  802. ;
  803. OPTAB:
  804.     DB    'I'    ; FILE INSPECTION OPTION
  805.     DW    OPTINSP    ; REMOVE THESE TWO LINES AND THE FOLLOWING ROUTINE
  806.             ;   IF YOU DO NOT WANT FILE INSPECTION OPTION IN
  807.             ;   COMMAND LINE
  808.     db    'H'    ;heading
  809.     dw    opthead
  810.     db    'L'    ;line numbers
  811.     dw    optln
  812.     db    'S'    ;skip
  813.     dw    optskip
  814. ;
  815.     if    timeok
  816.     db    'T'    ;time display
  817.     dw    opttime
  818.     endif
  819. ;
  820.     DB    0    ; END OF TABLE
  821. ;
  822. ;  **** OPTION ROUTINES
  823. ;    EACH ROUTINE IS PROVIDED THE OPTION CHARACTER IN THE A REGISTER
  824. ;    AND A POINTER TO THE NEXT CHARACTER IN THE COMMAND LINE IN THE
  825. ;    HL REGISTER PAIR; ONLY HL NEED TO BE PRESERVED (WITH OPTIONAL
  826. ;    ADVANCEMENT TO THE NEXT OPTION) ON EXIT
  827. ;
  828. OPTINSP:
  829.     MVI    A,0FFH    ; TURN ON FILE INSPECTION OPTION
  830.     STA    V$INSPECT    ; THIS IS PROVIDED AS A SAMPLE ROUTINE
  831.                 ;   AND FOR THE INDICATED FUNCTION
  832.     RET
  833. ;
  834. ;  Option:  H (Set Heading)
  835. ;
  836. opthead:
  837.     lxi    d,hbuf    ;pt to heading buffer
  838.     mov    a,m    ;get delim
  839.     ora    a    ;none?
  840.     rz
  841.     mov    b,a    ;delim in B
  842.     inx    h    ;pt to next char
  843. opthd1:
  844.     mov    a,m    ;get next char
  845.     ora    a    ;done?
  846.     jz    opthd3
  847.     cmp    b    ;done?
  848.     jz    opthd2
  849.     stax    d    ;save char
  850.     inx    h    ;pt to next
  851.     inx    d
  852.     jmp    opthd1
  853. opthd2:
  854.     inx    h    ;skip over delim
  855. opthd3:
  856.     xra    a    ;store ending 0
  857.     stax    d
  858.     ret
  859. ;
  860. ;  Option:  L (Set Line Numbering)
  861. ;
  862. optln:
  863.     lda    lnumfl    ;flip flag
  864.     cma
  865.     sta    lnumfl
  866.     ret
  867. ;
  868. ;  Option:  S (Skip Lines)
  869. ;
  870. optskip:
  871.     mvi    a,0ffh    ;set flag
  872.     sta    skipfl
  873.     call    eval10    ;get number
  874.     xchg
  875.     shld    skipnum    ;set page number to skip to
  876.     xchg        ;HL pts to next char
  877.     mov    a,d    ;see if page number was zero
  878.     ora    e
  879.     rnz
  880.     xra    a    ;if zero, turn off skip flag
  881.     sta    skipfl
  882.     ret
  883. ;
  884.     if    timeok
  885. ;
  886. ;  Set Time Flag
  887. ;
  888. opttime:
  889.     lda    timepfl    ;flip flag
  890.     cma
  891.     sta    timepfl
  892.     ret
  893. ;
  894.     endif
  895. ;
  896. ;  **** FUNCTION -- MAIN FUNCTION OF TEMPLATE
  897. ;    ON ENTRY, HL PTS TO NAME OF FILE (16 BYTES) AND USER IS LOGGED INTO
  898. ;        DIRECTORY CONTAINING INDICATED FILE
  899. ;
  900. FUNCTION:
  901. ;
  902. ;  HELP FILE PRINT Routine -- Print the Help File Whose Name is Pointed to by
  903. ;    HL; we are already logged into the correct directory
  904. ;
  905.     call    prinit    ;init print buffers
  906.     call    fload    ;load buffer initially
  907.     call    prhead    ;print heading line
  908.     lhld    V$SCRATCH    ;pt to first char in file
  909.     shld    nxtln    ;set pointer to next line
  910.     mvi    a,0ffh    ;first line
  911.     sta    firstf
  912.     call    prline    ;print first line (special case)
  913.     xra    a    ;not first line now
  914.     sta    firstf
  915. fprloop:
  916.     call    prline    ;print line of file
  917.     jnz    fprloop    ;done if EOF
  918.     call    page    ;advance to top of next page
  919.     ret
  920. ;
  921. ;  Init Print Buffers and Print File Name
  922. ;
  923. prinit:
  924.     lxi    d,tfcb    ;set up FCB
  925.     mvi    b,12    ;12 bytes
  926.     call    moveb
  927.     lxi    h,0    ;HL=0
  928.     shld    lnum    ;set line number
  929.     inx    h    ;HL=1
  930.     shld    pnum    ;set page number
  931.     lda    ltpp    ;set line count
  932.     sta    lcount
  933.     call    print
  934.     db    cr,lf,'Printing Help File ',0
  935.     lxi    h,tfcb    ;pt to FCB
  936.     call    e$prfn    ;print file name
  937.     ret
  938. ;
  939. ;  FILE LOAD (FLOAD) Routine -- Initial Load of memory buffer
  940. ;
  941. fload:
  942.     lxi    d,tfcb    ;pt to file fcb
  943.     call    initfcb    ;init file's fcb
  944.     call    f$open    ;open file for input
  945.     jz    fload1    ;open was OK
  946.     call    print
  947.     db    cr,lf,'File ',0
  948.     xchg        ;HL pts to FCB
  949.     call    e$prfn    ;print file name
  950.     call    print
  951.     db    ' NOT Found',0
  952.     pop    d    ;clear return address
  953.     ret        ;abort printout of this file
  954. ;
  955. ;  This is an entry point for further memory loads of the file
  956. ;
  957. fload1:
  958.     lda    V$BCNT    ;get number of blocks to load
  959.     mov    c,a    ;... in C
  960.     lhld    V$SCRATCH    ;get address of first block to load into
  961.     shld    nxtblk    ;set pointer to next block to load
  962. fload2:
  963.     call    rdblk    ;read a block (128 bytes)
  964.     jnz    eof    ;eof encountered?
  965.     call    rdblk    ;read another block (128 bytes)
  966.     jnz    eof    ;eof encountered?
  967.     dcr    c    ;count down
  968.     jnz    fload2
  969.     lhld    nxtblk    ;pt to next byte to load
  970.     mvi    m,eold    ;mark end of load
  971.     ret
  972. eof:
  973.     lxi    d,tfcb    ;close file
  974.     call    f$close
  975.     lhld    nxtblk    ;ensure ^Z
  976.     mvi    m,ctrlz
  977.     ret
  978. rdblk:
  979.     lxi    d,tfcb    ;pt to FCB
  980.     call    f$read    ;read next block
  981.     ora    a    ;error?
  982.     rnz
  983.     lhld    nxtblk    ;get ptr to next block
  984.     xchg        ; as dest
  985.     lxi    h,tbuff    ;ptr to DMA address
  986.     mvi    b,128    ;copy 128 bytes
  987. rdblk1:
  988.     mov    a,m    ;get byte
  989.     ani    7fh    ;mask out msb
  990.     stax    d    ;put byte
  991.     inx    h    ;pt to next
  992.     inx    d
  993.     dcr    b    ;count down
  994.     jnz    rdblk1
  995.     xchg        ;new nxtblock
  996.     shld    nxtblk
  997.     ret
  998.  
  999. ;
  1000. ;  Line Print Routine
  1001. ;    Print Next Line with Optional Disk Load
  1002. ;    Input Parameter is NXTLN, which is the address of the first char
  1003. ; on the next line
  1004. ;    Output Parameter is Zero Flag, with Z meaning done with print, NZ
  1005. ; meaning more yet to print
  1006. ;
  1007. prline:
  1008.     lhld    lnum    ;increment line number
  1009.     inx    h
  1010.     shld    lnum
  1011.     lhld    nxtln    ;pt to first char of next line
  1012.     mvi    c,0    ;init char count
  1013.     mov    a,m    ;get first char of line
  1014.     cpi    ctrlz    ;EOF?
  1015.     cnz    prlnum    ;print line number (optional)
  1016.     lda    firstf    ;first char?
  1017.     ora    a    ;0=no
  1018.     jnz    prl1
  1019.     mov    a,m    ;get first char of line
  1020.     cpi    ':'    ;new information section?
  1021.     jz    prff    ;set it as such
  1022. prl1:
  1023.     mov    a,m    ;get char
  1024.     cpi    eold    ;end of load?
  1025.     jz    prload
  1026.     cpi    ctrlz    ;eof?
  1027.     jz    prexit
  1028.     inx    h    ;pt to next char
  1029.     cpi    ctrli    ;tab?
  1030.     jz    prtab
  1031.     cpi    cr    ;<CR>?
  1032.     jz    prldn
  1033.     cpi    ff    ;form feed?
  1034.     jz    prldn
  1035.     cpi    lf    ;end of line?
  1036.     jz    prl1
  1037.     cpi    ctrlh    ;back space?
  1038.     jz    prbs
  1039.     cpi    ctrlg    ;ring bell?
  1040.     jz    prbell
  1041.     cpi    del    ;delete char?
  1042.     jz    prl1    ;skip it
  1043.     cpi    ' '    ;other control char?
  1044.     jc    prl1    ;skip if other control char
  1045.     call    prout    ;print char
  1046.     inr    c    ;increment char count
  1047.     call    eoltest    ;check to see if at end of line and newline if so
  1048.     jmp    prl1
  1049. ;
  1050. ;  End of Load Reached -- Load More of File from Disk
  1051. ;
  1052. prload:
  1053.     push    b    ;save char count
  1054.     call    fload1    ;use load routine
  1055.     pop    b    ;get char count
  1056.     lhld    V$SCRATCH    ;next byte is here
  1057.     jmp    prl1    ;continue processing
  1058. ;
  1059. ;  Tabulate
  1060. ;
  1061. prtab:
  1062.     mvi    a,' '    ;space
  1063.     call    prout
  1064.     inr    c    ;new char
  1065.     call    eoltest    ;process EOL
  1066.     mov    a,c    ;done?
  1067.     ani    7
  1068.     jnz    prtab    ;continue tabulation
  1069.     jmp    prl1    ;continue processing
  1070. ;
  1071. ;  Exit with Zero Flag Set if Done
  1072. ;
  1073. prexit:
  1074.     xra    a    ;set zero flag
  1075.     ret
  1076. ;
  1077. ;  Form Feed -- Advance to Top of Next Page
  1078. ;
  1079. prff:
  1080.     call    page    ;page eject with heading
  1081.     mvi    c,0    ;reset char count
  1082.     jmp    prl1    ;continue processing
  1083. ;
  1084. ;  Carriage Return -- End of Routine
  1085. ;
  1086. prldn:
  1087.     mov    a,m    ;skip to non-LF
  1088.     cpi    lf
  1089.     jnz    prldn1
  1090.     inx    h    ;skip to first char of next line
  1091. prldn1:
  1092.     mvi    a,cr    ;output <CR>
  1093.     call    prout
  1094.     mvi    a,lf    ;output <LF>
  1095.     call    prout    ;echo LF to printer
  1096.     shld    nxtln    ;set ptr to first char of next line
  1097.     mvi    a,0ffh    ;set not done
  1098.     ora    a    ;set flags
  1099.     ret
  1100. ;
  1101. ;  Backspace on Printer
  1102. ;
  1103. prbs:
  1104.     mov    a,c    ;check for beginning of line
  1105.     ora    a
  1106.     jz    prl1    ;continue if at BOL
  1107.     mvi    a,ctrlh    ;backspace
  1108.     call    prout
  1109.     dcr    c    ;back up char position
  1110.     jmp    prl1    ;continue
  1111. ;
  1112. ;  Ring Bell on Printer
  1113. ;
  1114. prbell:
  1115.     call    prout    ;ring the bell
  1116.     jmp    prl1    ;continue without advancing char position
  1117. ;
  1118. ;  Test for End of Line and Process if so
  1119. ;
  1120. eoltest:
  1121.     lda    lwidth    ;get line width
  1122.     sui    4    ;4 chars less for continuation mark
  1123.     mov    b,a    ;result in B
  1124.     lda    lnumfl    ;line numbering (lines are 7 chars shorter if so)
  1125.     ora    a    ;0=no
  1126.     jz    eolt1
  1127.     mov    a,b    ;reduce by 7 for line numbers
  1128.     sui    7
  1129.     mov    b,a
  1130. eolt1:
  1131.     mov    a,b    ;get line width
  1132.     cmp    c    ;there?
  1133.     rnz        ;continue if not
  1134.     mov    a,m    ;get next char
  1135.     cpi    cr    ;new line next?
  1136.     rz        ;continue if so
  1137.     cpi    ctrlh    ;backspace next?
  1138.     rz        ;continue if so
  1139.     mvi    a,' '    ;print continuation chars
  1140.     call    prout
  1141.     mvi    a,'<'
  1142.     call    prout
  1143.     mvi    a,'<'
  1144.     call    prout
  1145.     mvi    a,cr    ;new line
  1146.     call    prout
  1147.     mvi    a,lf
  1148.     call    prout
  1149.     mvi    c,0    ;reset char position
  1150.     lda    skipfl    ;skipping?
  1151.     ora    a    ;0=no
  1152.     rnz
  1153.     lda    lnumfl    ;printing line numbers?
  1154.     ora    a    ;0=no
  1155.     rz
  1156.     call    lprint
  1157.     db    '     : ',0
  1158.     ret
  1159. ;
  1160. ;  Output a character to the printer
  1161. ;    A = Character
  1162. ;
  1163. prout:
  1164.     mov    b,a    ;char in B
  1165.     call    condin    ;check for abort
  1166.     jz    prout1
  1167.     cpi    ctrlc    ;abort?
  1168.     jz    abort
  1169.     cpi    ctrlx    ;abort this one file?
  1170.     jz    cxabort
  1171. prout1:
  1172.     lda    skipfl    ;skipping?
  1173.     ora    a    ;set flags (Z=no skip=print char)
  1174.     mov    a,b    ;restore char
  1175.     cz    lout    ;send character to printer
  1176.     cpi    lf    ;special tests if it is a line feed
  1177.     rnz        ;done if non-LF char
  1178.     lda    lcount    ;decrement line counter
  1179.     dcr    a
  1180.     sta    lcount
  1181.     rnz
  1182. ;
  1183. ;  Paging Required
  1184. ;    Skip to top of next page; reset LCOUNT (Lines Left on Page Count);
  1185. ;    print header
  1186. ;
  1187. prout0:
  1188.     lda    ltpp    ;get number of text lines per page
  1189.     sta    lcount    ;set as new line count
  1190.     push    h    ;save ptr
  1191.     lhld    pnum    ;increment page number
  1192.     inx    h
  1193.     shld    pnum
  1194.     lda    lspp    ;get number of lines to skip per page
  1195.     call    lineskp    ;skip lines
  1196.     pop    h    ;restore ptr
  1197.     mov    a,m    ;check next character
  1198.     cpi    ctrlz    ;EOF?
  1199.     cnz    prhead    ;print 2-line heading if NOT EOF
  1200.     ret
  1201. ;
  1202. ;  Abort current file with final page eject
  1203. ;
  1204. cxabort:
  1205.     lda    lcount    ;get count of remaining lines
  1206.     call    lineskp    ;skip lines
  1207.     lda    lspp    ;number of lines to skip per page
  1208.     call    lineskp    ;skip lines
  1209.     jmp    e$fctlnxt    ;continue with next file
  1210. ;
  1211. ;  Skip out rest of page
  1212. ;    Form Feed Function
  1213. ;
  1214. page:
  1215.     lda    lcount    ;get count of remaining lines
  1216.     call    lineskp    ;skip lines
  1217.     jmp    prout0    ;process top of new page
  1218. ;
  1219. ;  Skip out lines on page
  1220. ;    A = number of lines to skip
  1221. ;
  1222. lineskp:
  1223.     mov    b,a    ;line count in B
  1224.     ora    a    ;any?
  1225.     rz
  1226.     lda    skipfl    ;skipping?
  1227.     ora    a
  1228.     rnz
  1229. lines1:
  1230.     mvi    a,cr    ;output new line to printer
  1231.     call    lout
  1232.     mvi    a,lf
  1233.     call    lout
  1234.     dcr    b    ;count down
  1235.     jnz    lines1
  1236.     ret
  1237. ;
  1238. ;  Print Line Number (optional)
  1239. ;
  1240. prlnum:
  1241.     lda    skipfl    ;skipping?
  1242.     ora    a    ;0=no
  1243.     rnz
  1244.     lda    lnumfl    ;get flag
  1245.     ora    a    ;0=don't number lines
  1246.     rz
  1247.     push    h    ;save ptr
  1248.     lhld    lnum    ;get line number
  1249.     call    lhldc    ;print line number
  1250.     call    lprint    ;print separator
  1251.     db    ': ',0
  1252.     pop    h    ;restore ptr
  1253.     ret
  1254. ;
  1255. ;  Print 2-line heading and control skipping
  1256. ;
  1257. prhead:
  1258.     push    h    ;save ptr
  1259.     lda    skipfl    ;currently skipping?
  1260.     ora    a    ;0=no
  1261.     cnz    skiptst    ;test for shut off
  1262.     call    prpnum    ;print page heading and number
  1263.     call    e$prfname    ;print file name
  1264. ;
  1265.     if    timeok    ;time available?
  1266.     lda    timepfl    ;print time?
  1267.     ora    a    ;0=no
  1268.     cnz    prtime    ;print time
  1269.     endif
  1270. ;
  1271.     lda    hbuf    ;print heading?
  1272.     ora    a    ;0=no
  1273.     cnz    prhdg    ;print heading
  1274.     pop    h    ;restore ptr
  1275.     lda    skipfl    ;skipping?
  1276.     ora    a
  1277.     rnz
  1278.     call    lcrlf    ;new line
  1279.     jmp    lcrlf
  1280. ;
  1281. ;  Test for completion of skipping
  1282. ;
  1283. skiptst:
  1284.     lhld    pnum    ;get page number
  1285.     xchg        ;... in DE
  1286.     lhld    skipnum    ;get page to skip to
  1287.     mov    a,h    ;compare them
  1288.     cmp    d
  1289.     rnz
  1290.     mov    a,l
  1291.     cmp    e
  1292.     rnz
  1293.     xra    a    ;A=0 to stop skipping
  1294.     sta    skipfl    ;set flag
  1295.     ret
  1296. ;
  1297. ;  Print Page Number
  1298. ;
  1299. prpnum:
  1300.     lda    skipfl    ;skipping?
  1301.     ora    a
  1302.     rnz
  1303.     call    lprint    ;print header
  1304.     db    'Page ',0
  1305.     lhld    pnum    ;print current page number
  1306.     call    lhldc    ;print as decimal
  1307.     ret
  1308. ;
  1309. ;  Print File Name
  1310. ;
  1311. e$prfname:
  1312.     lda    skipfl    ;skipping?
  1313.     ora    a
  1314.     rnz
  1315.     call    lprint    ;print separator
  1316.     db    ' -- Help File: ',0
  1317.     lxi    h,tfcb+1    ;pt to first char
  1318.     mvi    b,8    ;8 chars
  1319.     call    lfn1
  1320.     mvi    a,'.'
  1321.     call    lout
  1322.     mvi    b,3    ;3 chars
  1323.     call    lfn1
  1324.     ret
  1325. lfn1:
  1326.     mov    a,m    ;get char
  1327.     ani    7fh    ;mask
  1328.     call    lout    ;send to printer
  1329.     inx    h    ;pt to next
  1330.     dcr    b    ;count down
  1331.     jnz    lfn1
  1332.     ret
  1333. ;
  1334. ;  Print Separator
  1335. ;
  1336. prdash:
  1337.     call    lprint
  1338.     db    ' -- ',0
  1339.     ret
  1340. ;
  1341.     if    timeok
  1342. ;
  1343. ;  Print Time
  1344. ;
  1345. prtime:
  1346.     lda    skipfl    ;skipping?
  1347.     ora    a
  1348.     rnz
  1349.     call    prdash    ;print separator
  1350.     lxi    h,timebf    ;pt to time stamp
  1351.     call    lpstr    ;print
  1352.     ret
  1353. ;
  1354.     endif
  1355. ;
  1356. ;  Print Header
  1357. ;
  1358. prhdg:
  1359.     lda    skipfl    ;skipping?
  1360.     ora    a
  1361.     rnz
  1362.     call    prdash    ;print separator
  1363.     lxi    h,hbuf    ;pt to heading
  1364.     call    lpstr    ;print
  1365.     ret
  1366.     RET
  1367. ;
  1368. ;  **** BUFFERS -- PLACE APPLICATION-SPECIFIC BUFFERS HERE
  1369. ;
  1370. firstf:
  1371.     ds    1    ;first line in file flag
  1372. tfcb:
  1373.     ds    36    ;FCB for current file
  1374. nxtblk:
  1375.     ds    2    ;ptr to next block to load
  1376. nxtln:
  1377.     ds    2    ;ptr to next line to read
  1378. lcount:
  1379.     ds    1    ;count of text lines left on page
  1380. hlptyp:
  1381.     db    'HLP'    ;file type of HLP file
  1382.  
  1383. ;***********************************************
  1384. ;*  End of Application-Specific Section
  1385. ;***********************************************
  1386.  
  1387. ;
  1388. ;  BUFFERS
  1389. ;
  1390. V$DISK:
  1391.     DS    1    ; HOME DISK NUMBER
  1392. V$USER:
  1393.     DS    1    ; HOME USER NUMBER
  1394. V$CDISK:
  1395.     DS    1    ; CURRENT DISK NUMBER
  1396. V$CUSER:
  1397.     DS    1    ; CURRENT USER NUMBER
  1398. V$CMDLNE:
  1399.     DS    2    ; PTR TO COMMAND LINE STRING
  1400. V$NEXTCH:
  1401.     DS    2    ; PTR TO NEXT CHAR IN MULTIFILE COMMAND LINE
  1402. V$FILECNT:
  1403.     DS    2    ; COUNT OF NUMBER OF FILES RENAMED
  1404. V$SCRATCH:
  1405.     DS    2    ; ADDRESS OF FIRST BYTE OF SCRATCH AREA
  1406. V$BCNT:
  1407.     DS    1    ; NUMBER OF PAGES IN SCRATCH AREA
  1408. V$INSPECT:
  1409.     DS    1    ; INSPECT FLAG
  1410. V$NTFCB:
  1411.     DS    36    ; FCB FOR NEW FILE
  1412. ;
  1413. ;  Stack
  1414. ;
  1415.     DS    100    ; STACK AREA
  1416. V$STACK:
  1417.     DS    2    ; OLD STACK PTR
  1418.  
  1419.     END
  1420.