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 / ZSYS / SIMTEL20 / ZCPR3 / HELPPR.MQC / HELPPR.MAC
Text File  |  2000-06-30  |  28KB  |  1,381 lines

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