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 / HELP.MQC / HELP.MAC
Text File  |  2000-06-30  |  25KB  |  1,208 lines

  1. ;
  2. ;  PROGRAM NAME:  HELP
  3. ;  AUTHOR:  RICHARD CONN
  4. ;  DATE:  18 MAY 84
  5. ;  VERSION:  5.0
  6. ;  PREVIOUS VERSIONS:  None
  7. ;  DERIVATION:  HELP2.ASM 4.1 (23 MAY 83)
  8. ;  NOTE:  FOR USE WITH ZCPR3 ONLY
  9. ;
  10. VERS    EQU    50
  11. Z3ENV    SET    0F400H
  12.  
  13. ;
  14. ;    HELP supports an online documentation system under ZCPR3.  Refer
  15. ; to the file HELP.HLP for more details.
  16. ;
  17.  
  18. FALSE        EQU    0
  19. TRUE        EQU    NOT FALSE
  20.  
  21. ;
  22. ; USER EQUATES:
  23. ;  Set this to TRUE if all files must be of type HLP
  24. ;
  25. FORCEHLP        EQU    TRUE     ; TRUE IF FILES MUST BE OF TYPE HLP
  26.  
  27. ;
  28. ;  Directory of Help Files if HELP Directory not found
  29. ;
  30. HDISK            EQU    'A'-'A'    ; DISK
  31. HUSER            EQU    15    ; USER
  32.  
  33. ;
  34. ;  Enter/Exit Standout Mode (Recommended that these values not be changed)
  35. ;
  36. DIM            EQU    'A'-'@'    ; ^A TO ENTER STANDOUT
  37. NOTDIM            EQU    'B'-'@'    ; ^B TO EXIT STANDOUT
  38.  
  39. ;
  40. ;  SYSLIB ROUTINES
  41. ;
  42.     EXT    Z3VINIT,CLS,STNDOUT,STNDEND
  43.     EXT    GETCRT,GETPRT,PFIND,Z3LOG,DIRTDU
  44.     EXT    CODEND
  45.     EXT    LOGUD,RETUD,PUTUD,GETUD
  46.     EXT    EPSTR,EPRINT,COUT,CIN,CAPS,PFN2,PAFDC
  47.     EXT    INITFCB,F$EXIST,F$OPEN,F$READ,F$CLOSE
  48.  
  49. ;
  50. ;  CP/M Constants
  51. ;
  52. UDFLAG        EQU    4    ; ADDRESS OF USER/DISK FLAG
  53. BDOS        EQU    5    ; ADDRESS OF BDOS ENTRY POINT
  54. FCB        EQU    5CH    ; ADDRESS OF FILE CONTROL BLOCK
  55. BUFF        EQU    80H    ; ADDRESS OF DMA BUFFER
  56.  
  57. CR        EQU    0DH    ; <CR>
  58. LF        EQU    0AH    ; <LF>
  59. BEL        EQU    'G'-'@'    ; ^G
  60. FF        EQU    'L'-'@'    ; ^L = FORM FEED
  61. CTRLZ        EQU    'Z'-'@'    ; ^Z
  62. CTRLC        EQU    'C'-'@'    ; ^C
  63.  
  64. ;
  65. ;  HELP Control Characters
  66. ;
  67. IHCHAR        EQU    ';'    ; FLAG INDICATING INDEXED BY USER
  68. SECTCHAR    EQU    ':'    ; DEFINED TO BE COLON
  69. BACKUPCHAR    EQU    'L'    ; BACK UP TO PREVIOUS FRAME CHAR
  70. STRTCHAR    EQU    'S'    ; JUMP TO START OF INFORMATION CHAR
  71. MENUCHAR    EQU    'M'    ; CHAR TO ABORT TO MENU
  72. CPMABORTCHAR    EQU    CTRLC    ; CHAR TO EXIT
  73. LRCHAR        EQU    '^'    ; RETURN TO PREVIOUS HELP LEVEL
  74. ROOTCHAR    EQU    '.'    ; RETURN TO ROOT OF HELP
  75. PRCHAR        EQU    'P'    ; PRINT CURRENT FRAME
  76. CPRCHAR        EQU    'P'-'@'    ; PRINT CURRENT INFORMATION SECTION
  77.  
  78. ;
  79. ; Environment Definition
  80. ;
  81.     if    z3env ne 0
  82. ;
  83. ; External ZCPR3 Environment Descriptor
  84. ;
  85.     jmp    start
  86.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  87.     db    1    ;External Environment Descriptor
  88. z3eadr:
  89.     dw    z3env
  90. start:
  91.     lhld    z3eadr    ;pt to ZCPR3 environment
  92. ;
  93.     else
  94. ;
  95. ; Internal ZCPR3 Environment Descriptor
  96. ;
  97.     MACLIB    Z3BASE.LIB
  98.     MACLIB    SYSENV.LIB
  99. z3eadr:
  100.     jmp    start
  101.     SYSENV
  102. start:
  103.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  104.     endif
  105.  
  106. ;
  107. ; Start of Program -- Initialize ZCPR3 Environment
  108. ;
  109.     call    z3vinit    ;initialize the ZCPR3 Env and the VLIB Env
  110.     jmp    startx
  111. ;
  112. ;  DEFAULT FILE NAME
  113. ;
  114. HELPDIR:
  115. DEFFN:
  116.     DB    'HELP    '    ; BOTH HELP FILE AND HELP DIR SAME NAME
  117. DEFTYP:
  118.     DB    'HLP'
  119.  
  120. ;
  121. ;  Start of Program
  122. ;
  123. STARTX:
  124.     LXI    H,0    ; GET SP
  125.     DAD    SP
  126.     SHLD    STACK
  127.     CALL    CODEND    ; DETERMINE FREE MEMORY SPACE
  128.     SHLD    HLPNSTK    ; SET PTR TO HELP NAME STACK
  129.     LXI    D,200H    ; ALLOW 25+ ELEMENT HELP NAME STACK AND LARGE STACK
  130.     DAD    D
  131.     SHLD    HLPBUF
  132.     SPHL        ; SET STACK
  133.  
  134.     LDA    BDOS+2    ; BASE PAGE OF BDOS
  135.     SUI    10    ; 2K + 2 PAGES
  136.     STA    TPAEND
  137.  
  138.     XRA    A    ; A=0
  139.     STA    HLPLVL    ; SET HELP LEVEL TO 0 (NO RETURN FILE)
  140.  
  141.     LXI    D,FCB    ; PT TO FCB
  142.     CALL    Z3LOG    ; LOG INTO IT FOR DEFAULT
  143.     CALL    PUTUD    ; SAVE HOME
  144.  
  145.     LXI    H,FCB+1    ; CHECK FOR FILE NAME
  146.     MOV    A,M
  147.     CPI    '/'    ; OPTION CAUGHT?
  148.     JZ    STRT0
  149.     CPI    ' '    ; NONE?
  150.     JNZ    STRT1
  151. ;
  152. ;  INSERT 'HELP.HLP' INTO FCB OR CLEAR FCB
  153. ;
  154. STRT0:
  155.     LXI    D,DEFFN    ; PT TO DEFAULT NAME
  156.     MVI    B,11    ; 11 BYTES
  157.     XCHG
  158.     CALL    MOVE    ; MOVE (HL) TO (DE) FOR (B) BYTES
  159.  
  160. ;
  161. ;  START/RESTART HELP PROGRAM (START ON INITIAL ENTRY, RESTART ON NODE LOAD)
  162. ;
  163. STRT1:
  164.     LHLD    HLPBUF    ; RESET STACK
  165.     SPHL
  166. ;
  167. ;  CHECK FOR WILD CARDS IN FILE NAME -- ERROR IF SO
  168. ;
  169.     LXI    H,FCB+1    ; PT TO FIRST BYTE OF FILE NAME
  170.     MVI    B,11    ; 11 BYTES
  171. FCBWCK:
  172.     MOV    A,M    ; GET BYTE
  173.     ANI    7FH    ; MASK
  174.     CPI    '?'    ; WILD?
  175.     JZ    FCBWERR
  176.     INX    H    ; PT TO NEXT
  177.     DCR    B
  178.     JNZ    FCBWCK
  179. ;
  180. ;  CHECK FOR FILE TYPE
  181. ;
  182.     LXI    H,FCB+9    ; CHECK FOR FILE TYPE
  183.  
  184.     IF    NOT FORCEHLP
  185.     MOV    A,M    ; CHECK FOR FILE TYPE SPECIFIED
  186.     CPI    ' '    ; NONE?
  187.     JNZ    STRT2
  188.     ENDIF
  189. ;
  190. ;  PLACE DEFAULT FILE TYPE OF '.HLP' IN FCB
  191. ;
  192.     LXI    D,DEFTYP    ; DEFAULT FILE TYPE
  193.     MVI    B,3
  194.     XCHG
  195.     CALL    MOVE    ; MOVE (HL) TO (DE) FOR (B) BYTES
  196.  
  197. ;
  198. ;  FIND FILE
  199. ;
  200. STRT2:
  201. ;
  202. ;  LOOK INTO DIRECTORY PTED TO BY USER (OR CURRENT IF USER DID NOT SPEC ONE)
  203. ;
  204.     LXI    D,FCB        ; PT TO FCB
  205. ;    CALL    Z3LOG        ; LOG INTO DIRECTORY
  206.     CALL    INITFCB        ; RESET FCB
  207.     CALL    RETUD        ; GET HOME LOCATION
  208.     CALL    F$EXIST        ; IS FILE THERE?
  209.     JNZ    STRT3
  210. ;
  211. ;  LOOK ALONG PATH FROM CURRENT DIR (NOT INCLUDING CURRENT)
  212. ;
  213.     CALL    GETUD        ; RETURN HOME
  214.     LXI    D,FCB        ; PT TO FCB
  215.     MVI    A,0        ; DON'T SEARCH CURRENT DIR ALSO
  216.     CALL    PFIND        ; SEARCH FOR FILE
  217.     JNZ    STRT3        ; FILE FOUND, SO PROCESS
  218. ;
  219. ;  LOOK IN HELP FILE DIRECTORY
  220. ;
  221.     LXI    H,HELPDIR    ; LOOK FOR HELP DIRECTORY
  222.     CALL    DIRTDU        ; CONVERT TO DU IN BC
  223.     JNZ    LOGHLP        ; LOG INTO DU IN BC IF FOUND
  224.     MVI    B,HDISK        ; LOG INTO HELP DIRECTORY
  225.     MVI    C,HUSER
  226. LOGHLP:
  227.     CALL    LOGUD
  228.     LXI    D,FCB        ; PT TO FCB
  229.     CALL    F$EXIST        ; LOOK FOR FILE
  230.     JNZ    STRT3        ; FILE FOUND
  231. ;
  232. ;  FILE NOT FOUND
  233. ;
  234.     CALL    EPRINT
  235.     DB    CR,LF,' File Not Found',0
  236.     JMP    HLPEXIT
  237.  
  238. ;
  239. ;  FILE CONTAINS WILD CARDS
  240. ;
  241. FCBWERR:
  242.     CALL    EPRINT
  243.     DB    CR,LF,' AFN Not Allowed',0
  244.     JMP    HLPEXIT
  245.  
  246. ;
  247. ;  LOAD HELP FILE INFORMATION
  248. ;    ON INPUT, BC=DIRECTORY
  249. ;
  250. STRT3:
  251.     CALL    LOGUD        ; LOG INTO DIRECTORY
  252.     LXI    D,FCB        ; OPEN FILE
  253.     CALL    F$OPEN
  254.     LHLD    HLPBUF    ; PT TO BUFFER
  255.     SHLD    NEXTADR    ; SET PTR
  256. ;
  257. ;  READ RECORDS UNTIL EOF
  258. ;
  259. STRT4:
  260.     CALL    READ    ; READ INFO
  261.     JZ    STRT4    ; NOT DONE IF ZERO RETURN
  262.     LXI    D,FCB    ; CLOSE FILE
  263.     CALL    F$CLOSE
  264.     CALL    GETUD    ; RESTORE CURRENT DISK AND USER IF CHANGED
  265.  
  266. ;
  267. ;  START OF HELP PROGRAM
  268. ;
  269. HELP:
  270.     LHLD    HLPBUF    ; PT TO BUFFER
  271.     SPHL        ; SET STACK
  272.     MVI    A,0    ; SET NO FRAME
  273.     STA    FRNUM
  274.     MOV    A,M    ; NO HEADER SECTION?
  275.     ANI    7FH    ; MASK OUT MSB
  276.     CPI    SECTCHAR
  277.     JNZ    HELP1    ; HEADER SECTION EXISTS
  278.     CALL    CLS    ; NEW SCREEN
  279.     CALL    PRINFO    ; PRINT HELP INFO PTED TO BY HL
  280.     LDA    HLPLVL    ; CHECK TO SEE IF WE ARE NOT AT LEVEL 0
  281.     ORA    A    ; 0=LEVEL 0
  282.     JZ    HLPEXIT    ; ABORT IF SO
  283.     JMP    LRURN    ; GO TO PREVIOUS LEVEL IF NOT
  284.  
  285. ;
  286. ;  EXIT POINT FOR ANY EXIT FROM THE REST OF THE HELP PROGRAM
  287. ;
  288. HLPEXIT:
  289.     CALL    GETUD    ; RESET CALLING DISK/USER NUMBER
  290.     LHLD    STACK    ; GET CP/M SP
  291.     SPHL
  292.     RET        ; DONE
  293.  
  294. ;
  295. ;  PRINT HEADER INFORMATION AND SELECT AN OPTION
  296. ;
  297. HELP1:
  298.     CALL    PRHEADER    ; PRINT HEADER
  299.     PUSH    B        ; SAVE C (NUMBER OF VALID SELECTIONS)
  300.     CALL    CRLF1        ; NEW LINE
  301.     CALL    STNDOUT        ; GOTO DIM
  302.     CALL    PRLEVEL        ; PRINT LEVEL NUMBER
  303.     CALL    EPRINT
  304.     DB    'Enter Selection  ',0
  305.     CALL    PRP1        ; PRINT LEVEL MOVEMENT PROMPT
  306.     CALL    STNDEND        ; GOTO BRIGHT
  307.     POP    B        ; GET C
  308.     CALL    CIN        ; GET RESPONSE
  309.     CALL    CAPS        ; CAPITALIZE
  310.     PUSH    PSW
  311.     CALL    CLS        ; CLEAR SCREEN
  312.     POP    PSW
  313.     CPI    CTRLC        ; EXIT
  314.     JZ    HLPEXIT
  315.     CPI    ROOTCHAR    ; GO TO ROOT
  316.     JZ    GOROOT
  317.     CPI    LRCHAR        ; RETURN TO PREVIOUS LEVEL
  318.     JZ    LRURN
  319.     MOV    B,A        ; USER INPUT IN B
  320.     LDA    HTYPE        ; TYPE OF HELP FILE
  321.     CPI    IHCHAR        ; INDEXED BY USER?
  322.     JZ    HELP5        ; FIND INFORMATION SECTION VIA INDEX SCAN
  323.     MOV    A,B        ; FIND INFORMATION SECITON VIA COUNT
  324.     SUI    'A'-1        ; ADJUST FOR COUNT
  325.     MOV    B,A        ; SAVE COUNT
  326.     JZ    BADRESPONSE
  327.     JNC    HELP2
  328. ;
  329. ;  INVALID RESPONSE
  330. ;
  331. BADRESPONSE:
  332.     CALL    SAK        ; RING BELL
  333.     JMP    HELP1
  334.  
  335. ;
  336. ;  VALID RESPONSE -- LOOK FOR AND PRINT INFORMATION SECTION
  337. ;
  338. HELP2:
  339.     INR    C        ; 1 MORE THAN NUMBER OF POSSIBLE SELECTIONS
  340.     CMP    C        ; GREATER THAN NUMBER OF POSSIBLE SELECTIONS?
  341.     JNC    BADRESPONSE
  342.     LHLD    FIRSTENTRY    ; GET PTR TO FIRST ENTRY
  343.  
  344. ;
  345. ;  PRINT INFORMATION WHEN COUNT IS ZERO
  346. ;
  347. HELP3:
  348.     DCR    B    ; COUNT DOWN SELECTIONS
  349.     JNZ    HELP4
  350.     CALL    PRINFO    ; PRINT INFO PTED TO BY HL
  351.     JMP    HELP1
  352. ;
  353. ;  LOCATE NEXT INFORMATION SECTION
  354. ;
  355. HELP4:
  356.     CALL    FINDI    ; SKIP TO NEXT INFORMATION SECTION
  357.     CPI    CTRLZ    ; END OF FILE?
  358.     JNZ    HELP3    ; CONTINUE LOOPING IF NOT ELSE FALL THRU TO HELPERR
  359. ;
  360. ;  ERROR -- REACHED END OF HELP FILE
  361. ;
  362. HELPERR:
  363.     CALL    EPRINT
  364.     DB    CR,LF,' EOF on Help File',0
  365.     JMP    HELP1
  366.  
  367. ;
  368. ;  LOCATE NEXT INFORMATION SECTION VIA INDEX SCAN
  369. ;
  370. HELP5:
  371.     LHLD    FIRSTENTRY    ; PT TO FIRST ENTRY
  372. ;
  373. ;  LOOK FOR USER INDEX
  374. ;
  375. HELP6:
  376.     PUSH    H        ; SAVE PTR TO THIS LINE
  377. HELP7:
  378.     INX    H        ; SKIP OVER SECTION CHAR
  379.     MOV    A,M        ; GET CHAR
  380.     ANI    7FH        ; MASK OUT MSB
  381.     CALL    CAPS        ; CAPITALIZE
  382.     CPI    ' '        ; SKIP SPACES
  383.     JZ    HELP7
  384.     CPI    SECTCHAR    ; NEW SECTION?
  385.     JZ    HELP8        ; FIND NEXT SECTION
  386.     CPI    CR        ; END OF LINE?
  387.     JZ    HELP8        ; FIND NEXT SECTION
  388.     CPI    CTRLZ        ; EOF?
  389.     JZ    HELP8
  390.     CMP    B        ; CHECK FOR USER INPUT
  391.     JNZ    HELP7
  392.     POP    H        ; FOUND IT -- PRINT IT
  393.     INX    H        ; SKIP OVER SECTION CHAR
  394. HELP7A:
  395.     MOV    A,M        ; SKIP TO BEGINNING FOR 1ST LINE
  396.     INX    H        ; PT TO NEXT
  397.     ANI    7FH
  398.     CPI    CTRLZ        ; TRAP EOF
  399.     JZ    BADRESPONSE
  400.     CPI    SECTCHAR    ; FILE SPECIFIED?
  401.     JZ    HELP7B        ; PROCESS IT
  402.     CPI    LF        ; BEGIN NEW LINE
  403.     JZ    HELP7C
  404.     CPI    CR        ; AT END OF INDEX LINE?
  405.     JNZ    HELP7A
  406.     MOV    A,M        ; GET LF
  407.     ANI    7FH
  408.     CPI    LF        ; SKIP FOLLOWING LF IF ANY
  409.     JNZ    HELP7C
  410.     INX    H        ; SKIP LF
  411.     JMP    HELP7C
  412. ;
  413. ;  LOAD NEXT HELP LEVEL
  414. ;
  415. HELP7B:
  416.     DCX    H        ; PT TO SECTION CHAR
  417.     DCX    H        ; PT TO BEFORE SECTION CHAR FOR PRINFO
  418. ;
  419. ;  PROCESS HELP LEVEL OR LOAD AND PROCESS NEXT LEVEL PTED TO BY HL
  420. ;
  421. HELP7C:
  422.     CALL    PRINFO        ; PRINT INFORMATION SECTION
  423.     JMP    HELP1        ; RESUME
  424. HELP8:
  425.     POP    H        ; PT TO INFO SECTION
  426.     CALL    FINDI        ; FIND NEXT INFO SECTION
  427.     CPI    CTRLZ        ; EOF?
  428.     JNZ    HELP6        ; KEEP LOOKING
  429.     JMP    BADRESPONSE
  430.  
  431. ;
  432. ;  SKIP TO NEXT INFORMATION SECTIONS
  433. ;    RETURN WITH A=SECTCHAR IF FOUND OR A=^Z IF NOT
  434. ;
  435. FINDI:
  436.     MOV    A,M    ; <CTRL-Z>?
  437.     ANI    7FH    ; MASK OUT MSB
  438.     INX    H    ; PT TO NEXT BYTE
  439.     CPI    CTRLZ
  440.     RZ
  441.     CPI    LF    ; LINE FEED?
  442.     JZ    FINDI1
  443.     CPI    CR    ; <CR>?
  444.     JNZ    FINDI
  445.     MOV    A,M    ; MAKE SURE LF
  446.     ANI    7FH
  447.     CPI    LF
  448.     JNZ    FINDI1
  449.     INX    H    ; SKIP OVER LF
  450. FINDI1:
  451.     MOV    A,M    ; GET CHAR
  452.     ANI    7FH    ; MASK OUT MSB
  453.     CPI    SECTCHAR    ; NEW SECTION?
  454.     JNZ    FINDI    ; CONTINUE LOOPING
  455.     RET
  456.  
  457. ;
  458. ;  HELP SUPPORT ROUTINE SECTION
  459. ;
  460.  
  461. ;
  462. ;  PRINT ERROR MSG PTED TO BY DE; ENDS IN 0
  463. ;
  464. PRMSG:
  465.     XCHG        ; MSG PTED TO BY HL
  466.     CALL    EPSTR
  467.     XCHG
  468.     RET
  469.  
  470. ;
  471. ;  MOVE BYTES PTED TO BY HL TO AREA PTED TO BY DE; B BYTES TO MOVE
  472. ;
  473. MOVE:
  474.     MOV    A,M    ; GET BYTE
  475.     ANI    7FH    ; MASK OFF MSB -- IN CASE A WS FILE
  476.     STAX    D    ; PUT BYTE
  477.     INX    H    ; PT TO NEXT
  478.     INX    D
  479.     DCR    B
  480.     JNZ    MOVE
  481.     RET
  482.  
  483. ;
  484. ;  READ RECORD FROM DISK; NEXTADR CONTAINS ADDRESS TO READ TO
  485. ;    ON RETURN, BDOS ERROR CODE IS IN A (0=NO ERROR)
  486. ;
  487. READ:
  488.     LXI    D,FCB    ; PT TO FCB
  489.     CALL    F$READ    ; READ NEXT RECORD
  490.     PUSH    PSW    ; SAVE RETURN CODE
  491.     LHLD    NEXTADR    ; PT TO LOAD ADDRESS
  492.     LDA    TPAEND    ; CHECK AGAINST END PAGE OF TPA
  493.     CMP    H    ; IF AT SAME PAGE, YES
  494.     JZ    READERROR
  495.     LXI    D,BUFF    ; PT TO BUFFER TO LOAD FROM
  496.     MVI    B,128    ; NUMBER OF BYTES TO MOVE
  497.     XCHG
  498.     CALL    MOVE
  499.     XCHG
  500.     MVI    M,CTRLZ    ; STORE ENDING CTRLZ IN CASE OF EOF
  501.     POP    PSW    ; GET RETURN CODE
  502.     ORA    A    ; DONE?  <>0 IF SO
  503. ;
  504. ;  READ DONE -- SAVE PTR TO NEXT BLOCK
  505. ;
  506.     SHLD    NEXTADR    ; SET NEXT ADDRESS
  507.     RET
  508.  
  509. READERROR:
  510.     CALL    EPRINT
  511.     DB    CR,LF,' Mem Full',0
  512.     JMP    HLPEXIT
  513.  
  514. ;
  515. ;  PRINT ONE LINE OF INFO SECTION; HL PTS TO LINE UPON ENTRY;
  516. ;    HL PTS TO FIRST CHAR OF NEXT LINE UPON EXIT
  517. ;
  518. PRLINE:
  519.     MOV    A,M    ; GET CHAR
  520.     ANI    7FH    ; MASK OUT MSB
  521.     CPI    CR    ; EOL?
  522.     JZ    CRLF
  523.     CPI    LF    ; LINE FEED? (WS FILE)
  524.     JZ    CRLF0
  525.     CPI    CTRLZ    ; END OF FILE?
  526.     JZ    CRLFC    ; DONE IF SO
  527.     INX    H    ; PT TO NEXT
  528.     CPI    DIM    ; GOTO STANDOUT MODE?
  529.     JZ    PRLDIM
  530.     CPI    NOTDIM    ; GOTO NORMAL MODE?
  531.     JZ    PRLNDIM
  532.     CALL    COUT    ; PRINT CHAR
  533.     JMP    PRLINE
  534. PRLDIM:
  535.     CALL    STNDOUT    ; ENTER STANDOUT MODE
  536.     JMP    PRLINE
  537. PRLNDIM:
  538.     CALL    STNDEND    ; END STANDOUT MODE
  539.     JMP    PRLINE
  540. ;
  541. ;  PRINT CRLF, PT TO FIRST CHAR OF NEXT LINE, AND PAGE IF NECESSARY
  542. ;
  543. CRLF:
  544.     INX    H    ; PT TO LF
  545. CRLF0:
  546.     INX    H    ; PT TO 1ST CHAR OF NEXT LINE
  547. CRLFC:
  548.     CALL    CRLF1    ; PRINT CRLF
  549.     LDA    LCOUNT    ; GET LINE COUNT
  550.     DCR    A
  551.     STA    LCOUNT
  552.     RNZ        ; OK -- CONTINUE
  553.     MOV    A,M    ; SET MSB OF FIRST CHAR OF NEXT LINE
  554.     ORI    80H
  555.     MOV    M,A    ; MSB IS SET FOR LATER BACKUP
  556.     CALL    PRPROMPT    ; PRINT PROMPT AND PROCESS COMMON OPTIONS
  557.     CPI    BACKUPCHAR    ; BACK UP?
  558.     JZ    FBACKUP
  559.     CPI    STRTCHAR    ; JUMP TO START OF INFO
  560.     JZ    INFOSTRT
  561. FRESUME:
  562.     SHLD    STRTFRAME
  563.     JMP    SETLCOUNT
  564. ;
  565. ;  PRINT PROMPT AND PROCESS COMMON OPTIONS
  566. ;
  567. PRPROMPT:
  568.     CALL    STNDOUT    ; GOTO DIM
  569.     CALL    PRLEVEL    ; PRINT LEVEL NUMBER
  570.     LDA    FRNUM    ; INCREMENT FRAME NUMBER
  571.     INR    A
  572.     STA    FRNUM
  573.     CALL    PRP1    ; PRINT FUNDAMENTAL LEVEL DATA PROMPT
  574.     CALL    EPRINT
  575.     DB    MENUCHAR,'=Menu '    ; ABORT TO MENU CHAR
  576.     DB    STRTCHAR,'=Start '    ; JUMP TO START OF INFORMATION CHAR
  577.     DB    BACKUPCHAR,'=Last '    ; BACK UP TO PREVIOUS FRAME CHAR
  578.     DB    PRCHAR,'=Print '    ; PRINT CURRENT FRAME
  579.     DB    0
  580.     CALL    STNDEND    ; GOTO BRIGHT
  581.     CALL    CIN    ; GET RESPONSE
  582.     CALL    CAPS
  583.     PUSH    PSW
  584.     CALL    CLS        ; CLEAR SCREEN
  585.     POP    PSW
  586.     POP    D        ; CLEAR STACK
  587.     CPI    MENUCHAR    ; ABORT?
  588.     JZ    HELP        ; START OVER IF SO
  589.     CPI    CPMABORTCHAR    ; ABORT TO OS
  590.     JZ    HLPEXIT
  591.     CPI    PRCHAR        ; PRINT FRAME?
  592.     JZ    LIST0INFO
  593.     CPI    CPRCHAR        ; PRINT INFORMATION SECTION?
  594.     JZ    LIST1INFO
  595.     CPI    ROOTCHAR    ; GO TO ROOT
  596.     JZ    GOROOT
  597.     CPI    LRCHAR        ; RETURN TO HIGHER LEVEL
  598.     JZ    LRURN
  599.     PUSH    D        ; RESTORE STACK
  600.     RET
  601.  
  602. ;
  603. ;  PRINT FUNDAMENTAL LEVEL PROMPT
  604. ;
  605. PRP1:
  606.     LDA    HLPLVL        ; DON'T PRINT IF AT LEVEL 0
  607.     ORA    A
  608.     RZ
  609.     CALL    EPRINT
  610.     DB    LRCHAR,'=Level '    ; RETURN TO HIGHER NODE
  611.     DB    ROOTCHAR,'=Root '        ; RETURN TO ROOT
  612.     DB    0
  613.     RET
  614.  
  615. ;
  616. ;  JUMP TO START OF INFORMATION
  617. ;
  618. INFOSTRT:
  619.     LHLD    STRTINFO    ; PT TO START OF INFO
  620.     MVI    A,1        ; RESET FRAME COUNT
  621.     STA    FRNUM
  622.     JMP    FRESUME    ; CONTINUE PROCESSING
  623.  
  624. ;
  625. ;  BACK UP TO PREVIOUS FRAME
  626. ;
  627. FBACKUP:
  628.     CALL    BOICHECK    ; AT BEGINNING OF INFORMATION?
  629.     JZ    INFOSTRT
  630. FB1:
  631.     DCX    H    ; BACK UP UNTIL BYTE WITH MSB SET IS FOUND
  632.     MOV    A,M    ; GET BYTE
  633.     ANI    80H
  634.     JZ    FB1
  635.     LDA    FRNUM    ; DECREMENT FRAME NUMBER
  636.     DCR    A        ; BACK UP TO CURRENT FRAME NUMBER
  637.     DCR    A        ; BACK UP TO PREVIOUS FRAME NUMBER
  638.     STA    FRNUM
  639.     JMP    FRESUME    ; CONTINUE PROCESSING
  640. ;
  641. ;  PRINT CR AND LF ONLY
  642. ;
  643. CRLF1:
  644.     MVI    A,CR    ; PRINT CR
  645.     CALL    COUT
  646.     MVI    A,LF    ; PRINT LF
  647.     JMP    COUT
  648.  
  649. ;
  650. ;  SET LCOUNT VARIABLE TO SCREEN SIZE
  651. ;
  652. SETLCOUNT:
  653.     PUSH    H    ; SAVE HL
  654.     CALL    GETCRT    ; GET CRT DATA
  655.     INX    H    ; PT TO LINE COUNT
  656.     MOV    A,M    ; GET LINE COUNT
  657.     POP    H    ; RESTORE HL
  658.     DCR    A    ; 1 LESS FOR PROMPT
  659.     STA    LCOUNT
  660.     RET
  661.  
  662. ;
  663. ;  PRINT THE HEADER SECTION AND LOAD FIRSTENTRY PTR
  664. ;    ON RETURN, C=NUMBER OF POSSIBLE SELECTIONS
  665. ;
  666. PRHEADER:
  667.     MVI    A,0    ; SET NO FRAME
  668.     STA    FRNUM
  669.     CALL    SETLCOUNT
  670.     LDA    LCOUNT
  671.     SUI    3    ; -3 lines for top and bottom
  672.     STA    LCOUNT
  673.     MVI    A,'A'    ; INIT SELECTION CHAR
  674.     STA    SELCHAR
  675.     CALL    CLS    ; CLEAR SCREEN
  676.     CALL    EPRINT
  677.     DB    'HELP '
  678.     db    (vers/10)+'0','.',(vers mod 10)+'0'
  679.     DB    '    ',0
  680.     LXI    D,FCB+1    ; PT TO FCB
  681.     CALL    PFN2    ; PRINT WITH NO SPACES
  682.     CALL    EPRINT
  683.     db    ' Index',CR,LF,CR,LF,0
  684.     MVI    C,0    ; COUNT NUMBER OF SELECTIONS
  685.     LHLD    HLPBUF    ; PT TO BUFFER
  686.     MOV    A,M    ; GET FIRST CHAR
  687.     STA    HTYPE    ; SET TYPE OF HELP FILE
  688.     CPI    IHCHAR    ; INDEXED HELP TYPE?
  689.     JNZ    PH1
  690.     INX    H    ; SKIP OVER INDEX HELP TYPE FLAG
  691. ;
  692. ; PRINT LINE UNTIL FIRST INFORMATION SECTION FOUND
  693. ;
  694. PH1:
  695.     MOV    A,M    ; GET CHAR
  696.     ANI    7FH    ; MASK OUT MSB
  697.     CPI    SECTCHAR
  698.     JZ    PH2
  699.     CPI    CTRLZ    ; EOF? -- ABORT
  700.     JZ    HLPEXIT
  701.     INR    C    ; INCREMENT SELECTION COUNT
  702.     LDA    HTYPE    ; CHECK FOR INDEX
  703.     CPI    IHCHAR
  704.     JZ    PH1A    ; SKIP LETTERS IF INDEXED
  705.     LDA    SELCHAR    ; DISPLAY SELECTION CHAR
  706.     CALL    COUT
  707.     INR    A    ; INCR CHAR
  708.     STA    SELCHAR
  709.     CALL    EPRINT
  710.     DB    '. ',0
  711. PH1A:
  712.     CALL    PRLINE    ; PRINT HEADER LINE
  713.     JMP    PH1
  714. ;
  715. ;  SAVE PTR TO FIRST ENTRY
  716. ;
  717. PH2:
  718.     SHLD    FIRSTENTRY
  719.     LDA    LCOUNT        ; GET COUNT OF REMAINING LINES
  720.     MOV    B,A        ; ... IN B
  721.     ORA    A        ; ANY LEFT?
  722.     RZ
  723. PH3:
  724.     CALL    CRLF1        ; NEW LINE
  725.     DCR    B
  726.     JNZ    PH3
  727.     RET
  728.  
  729. ;
  730. ;  PRINT AN INFORMATION SECTION
  731. ;    INFORMATION SECTION IS PTED TO BY HL
  732. ;
  733. PRINFO:
  734.     SHLD    STRTINFO    ; SET START OF INFORMATION POINTER
  735.     CALL    LDNOD    ; LOAD NEW NODE IF DUAL SECTCHAR
  736.     SHLD    STRTFRAME    ; SET FRAME POINTER
  737.     MOV    A,M    ; SET MSB
  738.     ORI    80H
  739.     MOV    M,A
  740.     CALL    SETLCOUNT
  741.     MVI    A,1        ; A=1
  742.     STA    FRNUM    ; SET FRAME NUMBER
  743. PI1:
  744.     CALL    PRLINE    ; PRINT LINE FROM INFO FILE
  745.     MOV    A,M    ; DONE?
  746.     ANI    7FH    ; MASK OUT MSB
  747.     CPI    CTRLZ    ; EOF?
  748.     JZ    PI2
  749.     CPI    SECTCHAR    ; NEXT SECTION
  750.     JZ    PI2
  751.     CPI    FF    ; FORM FEED?
  752.     JNZ    PI1
  753.     INX    H    ; PT TO CHAR AFTER FORM FEED
  754.     CALL    FORMFEED    ; FEED SCREEN
  755.     JMP    PI1
  756. ;
  757. ;  FORM FEED SCREEN
  758. ;
  759. FORMFEED:
  760.     LDA    LCOUNT    ; GET LINE COUNT
  761.     MOV    B,A    ; ... IN B
  762. FEEDLOOP:
  763.     PUSH    B    ; SAVE B
  764.     CALL    CRLFC    ; NEW LINE
  765.     POP    B    ; GET B
  766.     DCR    B
  767.     JNZ    FEEDLOOP
  768.     RET
  769.  
  770. ;
  771. ;  END OF INFO
  772. ;
  773. PI2:
  774.     MOV    A,M    ; SET MSB OF NEXT BYTE
  775.     ORI    80H
  776.     MOV    M,A
  777. PI2A:
  778.     CALL    CRLF1    ; NEW LINE
  779.     LDA    LCOUNT        ; COUNT DOWN
  780.     DCR    A
  781.     STA    LCOUNT
  782.     JNZ    PI2A
  783. PI2MSG:
  784.     CALL    EPRINT        ; PRINT END OF INFORMATION INDICATOR
  785.     DB    'EOI ',0
  786.     CALL    PRPROMPT    ; PRINT PROMPT AND PROCESS COMMON OPTIONS
  787.     CPI    BACKUPCHAR    ; BACK UP FROM EOI?
  788.     JZ    PI2BACKUP
  789.     CPI    STRTCHAR    ; START OF INFO?
  790.     JZ    PI2STRT
  791.     JMP    SETLCOUNT    ; RESET LINE COUNT IN CASE OF ALL
  792.  
  793. ;
  794. ;  JUMP TO START OF INFO FROM EOI
  795. ;
  796. PI2STRT:
  797.     LHLD    STRTINFO    ; PT TO START OF INFO
  798.     CALL    FRESUME    ; RESET POINTERS
  799.     MVI    A,1        ; RESET FRAME COUNT
  800.     STA    FRNUM
  801.     JMP    PI1        ; CONTINUE PROCESSING
  802.  
  803. ;
  804. ;  BACK UP TO PREVIOUS FRAME FROM EOI
  805. ;
  806. PI2BACKUP:
  807.     CALL    BOICHECK    ; AT BEGINNING OF INFORMATION?
  808.     JZ    PI2STRT
  809. PI2BACK:
  810.     CALL    FB1        ; BACK UP TO PREVIOUS FRAME
  811.     JMP    PI1        ; CONTINUE PROCESSING
  812.  
  813. ;
  814. ;  CHECK FOR POSITION AT BEGINNING OF INFORMATION SECTION
  815. ;    IF SO, PRINT BACKUP ERROR MSG AND RETURN W/ZERO SET
  816. ;
  817. BOICHECK:
  818.     LHLD    STRTINFO    ; START ADDRESS
  819.     XCHG            ; ... IN DE
  820.     LHLD    STRTFRAME    ; FRAME ADDRESS
  821.     MOV    A,D        ; EQUAL?
  822.     CMP    H
  823.     RNZ
  824.     MOV    A,E
  825.     CMP    L
  826.     RNZ
  827.     CALL    SAK        ; ERROR BELL
  828.     XRA    A        ; ZERO FLAG SET
  829.     STA    FRNUM        ; SET FRAME NUMBER
  830.     RET
  831.  
  832. ;
  833. ;  THIS BODY OF CODE LISTS INFORMATION FROM HELP2 TO THE
  834. ;  PRINTER
  835. ;
  836.  
  837. ;
  838. ;  LIST ONE LINE OF INFO SECTION; HL PTS TO LINE UPON ENTRY;
  839. ;    HL PTS TO FIRST CHAR OF NEXT LINE UPON EXIT
  840. ;
  841. LISTLINE:
  842.     MOV    A,M    ; GET CHAR
  843.     ANI    7FH    ; MASK OUT MSB
  844.     CPI    CR    ; EOL?
  845.     JZ    LCRLF
  846.     CPI    LF    ; LINE FEED? (WS FILE)
  847.     JZ    LCRLF0
  848.     CPI    CTRLZ    ; END OF FILE?
  849.     JZ    LCRLFC    ; DONE IF SO
  850.     CALL    LSTOUT    ; PRINT CHAR
  851.     RZ        ; ABORT
  852.     INX    H    ; PT TO NEXT
  853.     JMP    LISTLINE
  854.  
  855. ;
  856. ;  LIST CRLF, PT TO FIRST CHAR OF NEXT LINE, AND PAGE IF NECESSARY
  857. ;
  858. LCRLF:
  859.     INX    H    ; PT TO LF
  860. LCRLF0:
  861.     INX    H    ; PT TO 1ST CHAR OF NEXT LINE
  862. LCRLFC:
  863.     CALL    LCRLF1    ; PRINT CRLF
  864.     LDA    LCOUNT    ; GET LINE COUNT
  865.     DCR    A
  866.     STA    LCOUNT
  867.     JNZ    LNOABT    ; OK -- CONTINUE
  868.     CALL    LFORMFEED    ; ADVANCE TO NEXT PAGE
  869. SETPLC:
  870.     PUSH    H    ; SAVE HL
  871.     CALL    GETPRT    ; GET PRINTER DATA
  872.     INX    H    ; PT TO TEXT LINE COUNT
  873.     INX    H
  874.     MOV    A,M    ; GET TEXT LINE COUNT
  875.     STA    LCOUNT    ; SET LINE COUNT
  876.     POP    H    ; RESTORE HL
  877.     RET
  878. LCRLF1:
  879.     MVI    A,CR    ; SEND <CRLF> TO PRINTER
  880.     CALL    LSTOUT
  881.     RZ        ; ABORT
  882.     MVI    A,LF    ; FALL THRU TO LSTOUT
  883.  
  884. ;
  885. ;  PRINT CHARACTER IN A ON PRINTER; AFFECT NO REGISTERS
  886. ;
  887. LSTOUT:
  888.     PUSH    H    ; SAVE REGS
  889.     PUSH    D
  890.     PUSH    B
  891.     MOV    E,A    ; CHAR IN E
  892.     MVI    C,5    ; BDOS PRER OUTPUT ROUTINE
  893.     CALL    BDOS
  894.     MVI    E,0FFH    ; CONDITIONAL INPUT
  895.     MVI    C,6    ; DIRECT CONSOLE I/O
  896.     CALL    BDOS
  897.     POP    B    ; RESTORE REGS
  898.     POP    D
  899.     POP    H
  900.     CPI    CTRLC    ; ABORT?
  901.     RET
  902. LNOABT:
  903.     MVI    A,0FFH    ; SET NO ABORT RETURN
  904.     ORA    A    ; SET FLAGS
  905.     RET
  906.  
  907. ;
  908. ;  LIST THE CURRENT INFORMATION SECTION
  909. ;    INFORMATION SECTION IS PTED TO BY STRTINFO
  910. ;
  911. ;  LIST0INFO -- LIST CURRENT FRAME ONLY
  912. ;  LIST1INFO -- LIST CURRENT INFORMATION SECTION
  913. ;
  914. LIST0INFO:
  915.     LHLD    STRTFRAME    ; LIST CURRENT FRAME ONLY
  916.     MVI    A,0FFH        ; SET FLAG
  917.     STA    LFRFLAG        ; LIST FRAME ONLY
  918.     JMP    LIST2INFO
  919. LIST1INFO:
  920.     LHLD    STRTINFO    ; PREPARE TO LIST ENTIRE INFO SECTION
  921.     XRA    A        ; CLEAR FRAME LIST FLAG
  922.     STA    LFRFLAG
  923. LIST2INFO:
  924.     CALL    LISTINFO    ; DO PRINT
  925.     CALL    CLS        ; CLEAR SCREEN
  926.     CALL    LFORMFEED    ; FORM FEED PRINTER
  927.     LHLD    STRTFRAME    ; RETURN TO FRAME WE WERE ON
  928.     CALL    FRESUME
  929.     LDA    FRNUM        ; ADJUST FRAME NUMBERING
  930.     DCR    A
  931.     STA    FRNUM
  932.     JMP    PI1        ; RESUME AT PI1
  933. ;
  934. ;  MAIN PRINT ROUTINE
  935. ;
  936. LISTINFO:
  937.     CALL    CLS        ; PRINT FRAME OR INFO SECTION
  938.     CALL    EPRINT
  939.     DB    CR,LF,' Printing ',0
  940.     CALL    SETPLC        ; SET PRINTER LINE COUNT
  941. LI1:
  942.     CALL    LISTLINE    ; LIST LINE FROM INFO FILE
  943.     CPI    CTRLC        ; ABORT?
  944.     RZ            ; FEED PRINTER AND EXIT
  945.     MOV    A,M        ; DONE?
  946.     ANI    7FH        ; MASK OUT MSB
  947.     CPI    CTRLZ        ; EOF?
  948.     RZ            ; RESUME IF AT END OF INFO
  949.     CPI    SECTCHAR    ; NEXT SECTION
  950.     RZ            ; RESUME IF AT END OF INFO
  951.     CPI    FF        ; FORM FEED?
  952.     JNZ    LI1
  953.     LDA    LFRFLAG        ; LIST FRAME ONLY?
  954.     ORA    A        ; 0=NO
  955.     RNZ
  956.     INX    H        ; PT TO CHAR AFTER FORM FEED
  957.     CALL    LCRLFC        ; NEW LINE
  958.     MVI    B,10        ; PRINT SEPARATOR
  959. LI2:
  960.     MVI    A,'-'        ; DASHES
  961.     CALL    LSTOUT
  962.     RZ            ; ABORT?
  963.     DCR    B        ; COUNT DOWN
  964.     JNZ    LI2
  965.     CALL    LCRLFC        ; 2 NEW LINES
  966.     CALL    LCRLFC
  967.     JMP    LI1
  968.  
  969. ;
  970. ;  FORM FEED PRINTER
  971. ;
  972. LFORMFEED:
  973.     CALL    LCRLF1    ; NEW LINE
  974.     MVI    A,FF    ; OUTPUT FORM FEED
  975.     CALL    LSTOUT
  976.     JMP    SETPLC    ; RESET LINE COUNT
  977.  
  978. ;
  979. ;  END OF BODY OF CODE WHICH LISTS INFORMATION FROM HELP2 TO
  980. ;  THE PRINTER
  981. ;
  982.  
  983. ;
  984. ;  AT THE BEGINNING OF AN INFORMATION SECTION (HL PTS TO FIRST CHAR)
  985. ;    CHECK TO SEE IF ANOTHER SECTCHAR FOLLOWS, AND, IF SO, LOAD THE
  986. ;    SPECIFIED FILE AS A NEW NODE AND BEGIN PROCESSING IT
  987. ;
  988. LDNOD:
  989.     INX    H    ; PT TO POSSIBLE 2ND SECTCHAR
  990.     MOV    A,M    ; GET IT
  991.     DCX    H    ; PREP FOR RETURN
  992.     ANI    7FH    ; MASK MSB
  993.     CPI    SECTCHAR    ; ANOTHER ONE?
  994.     RNZ        ; PROCESS NORMALLY IF NOT
  995. ;
  996. ;  WE HAVE A NEW NODE -- CHECK TO SEE IF WE CAN NEST AGAIN
  997. ;
  998.     LDA    HLPLVL    ; GET CURRENT HELP LEVEL
  999.     CPI    25    ; AT MAXIMUM?
  1000.     JNZ    LDNOD1
  1001.     CALL    CLS    ; NEW SCREEN
  1002.     CALL    EPRINT
  1003.     db    cr,lf,' Node Level Limit',0
  1004.     JMP    HLPEXIT
  1005.  
  1006. ;
  1007. ;  WE HAVE NOT REACHED LEVEL LIMIT, SO CONTINUE
  1008. ;  AT THIS TIME, A=HELP LEVEL INDEX AND HL = PTR TO CURRENT SECTION (::)
  1009. ;
  1010. LDNOD1:
  1011. ;
  1012. ;  SAVE CURRENT HELP FILE NAME FOR RETURN
  1013. ;
  1014.     INX    H    ; PT TO SECTION SECTCHAR
  1015.     INX    H    ; NOW POINTING TO FILE NAME
  1016.     PUSH    H    ; SAVE PTR
  1017.     CALL    COMPTR    ; HL=POINTER TO STACK ELT INDEXED BY A
  1018.     XCHG        ; DE=ADDRESS OF NEXT ELEMENT
  1019. ;
  1020. ;  COPY CURRENT NODE ELEMENT NAME INTO NEXT STACK ELEMENT
  1021. ;
  1022.     LXI    H,FCB+1    ; PT TO FILE NAME
  1023.     MVI    B,11    ; 11 BYTES
  1024.     CALL    MOVE
  1025. ;
  1026. ;  INCREMENT HELP LEVEL
  1027. ;
  1028.     LDA    HLPLVL    ; GET OLD LEVEL
  1029.     INR    A    ; SET NEW LEVEL
  1030.     STA    HLPLVL
  1031. ;
  1032. ;  SET UP FCB FOR NEW FILE
  1033. ;
  1034.     POP    H    ; GET PTR TO NEW FILE NAME
  1035.     LXI    D,FCB+1    ; PT TO FCB NAME
  1036.     MVI    B,8    ; 8 CHARS MAX
  1037.     CALL    LDFCB    ; PLACE INTO FCB WITH ERROR CHECKING
  1038.     MVI    B,3    ; 3 CHARS MAX FOR TYPE
  1039.     CPI    '.'    ; CONTINUE IF FILE TYPE PRESENT
  1040.     CZ    LDFCB    ; PLACE INTO FCB WITH ERROR CHECKING
  1041. ;
  1042. ;  PRINT LOADING HELP FILE MESSAGE
  1043. ;
  1044. PLHFM:
  1045.     CALL    EPRINT
  1046.     DB    CR,LF,' Loading HELP File ',0
  1047.     LXI    D,FCB+1    ; PRINT FILE NAME
  1048.     CALL    PFN2
  1049.     JMP    STRT1    ; LOAD NEW HELP FILE
  1050.  
  1051. ;
  1052. ;  LOAD FCB PTED TO BY DE WITH "NORMAL" FILE NAME PTED TO BY HL FOR B BYTES
  1053. ;
  1054. LDFCB:
  1055.     MOV    A,M    ; GET CHAR
  1056.     INX    H    ; PT TO NEXT
  1057.     CPI    '.'    ; DONE IF DECIMAL
  1058.     JZ    LDFCB2
  1059.     CPI    ' '+1    ; DONE IF <= <SP>
  1060.     JC    LDFCB2
  1061.     CALL    CAPS    ; CAPITALIZE
  1062.     STAX    D    ; STORE CHAR
  1063.     INX    D    ; PT TO NEXT
  1064.     DCR    B
  1065.     JNZ    LDFCB
  1066. LDFCB1:
  1067.     MOV    A,M    ; CHECK FOR ERROR
  1068.     ANI    7FH    ; MASK MSB
  1069.     INX    H    ; PT TO NEXT CHAR
  1070.     CPI    '.'    ; OK IF '.'
  1071.     RZ
  1072.     CPI    ' '+1    ; OK IF <= <SP>
  1073.     RC
  1074.     JMP    LDFCB1
  1075. LDFCB2:
  1076.     MOV    C,A    ; SAVE CHAR THAT TERMINATED STRING
  1077. LDFCB3:
  1078.     MVI    A,' '    ; <SP> FILL REST OF FCB
  1079.     STAX    D    ; STORE <SP>
  1080.     INX    D    ; PT TO NEXT
  1081.     DCR    B
  1082.     JNZ    LDFCB3
  1083.     MOV    A,C    ; GET CHAR THAT TERMINATED STRING
  1084.     RET
  1085.  
  1086. ;
  1087. ;  GO TO ROOT
  1088. ;
  1089. GOROOT:
  1090.     LDA    HLPLVL    ; AT ROOT?
  1091.     ORA    A    ; 0=YES
  1092.     JZ    HELP    ; RETURN TO HELP
  1093.     MVI    A,0    ; SET ROOT INDEX
  1094.     JMP    GORET
  1095.  
  1096. ;
  1097. ;  RETURN TO PREVIOUS HELP LEVEL
  1098. ;
  1099. LRURN:
  1100.     LDA    HLPLVL    ; ARE WE AT THE LOWEST LEVEL?
  1101.     ORA    A    ; 0=YES
  1102.     JNZ    LRET
  1103.     CALL    SAK    ; ERROR BELL
  1104.     JMP    HELP
  1105.  
  1106. ;
  1107. ;  SET NEW HELP LEVEL
  1108. ;
  1109. LRET:
  1110.     DCR    A    ; DOWN 1 AND FALL THRU TO GORET
  1111.  
  1112. ;
  1113. ;  GO TO HELP LEVEL INDEXED IN A
  1114. ;
  1115. GORET:
  1116.     STA    HLPLVL    ; SET NEW HELP LEVEL
  1117.     CALL    COMPTR    ; HL=POINTER TO TARGET HELP FILE NAME
  1118.     LXI    D,FCB+1    ; COPY ELEMENT INTO FCB
  1119.     MVI    B,11    ; 11 BYTES
  1120.     CALL    MOVE
  1121.     JMP    PLHFM    ; PRINT LOADING MESSAGE AND LOAD
  1122.  
  1123. ;
  1124. ;  COMPUTE POINTER TO HELP NAME ENTRY INDEXED BY HELP LEVEL IN A
  1125. ;
  1126. COMPTR:
  1127.     MOV    L,A    ; VALUE IN HL
  1128.     MVI    H,0    ; COMPUTE OFFSET AS INDEX*11
  1129.     MOV    E,L    ; DE=HL
  1130.     MOV    D,H
  1131.     DAD    H    ; *2
  1132.     DAD    H    ; *4
  1133.     DAD    H    ; *8
  1134.     DAD    D    ; *9
  1135.     DAD    D    ; *10
  1136.     DAD    D    ; *11
  1137.     XCHG        ; RESULT IN DE
  1138.     LHLD    HLPNSTK    ; PT TO BASE OF HELP NAMES
  1139.     DAD    D    ; ADD IN OFFSET
  1140.     RET
  1141.  
  1142. ;
  1143. ;  PRINT LEVEL NUMBER
  1144. ;
  1145. PRLEVEL:
  1146.     LDA    HLPLVL    ; DON'T PRINT LEVEL 0
  1147.     ORA    A    ; 0?
  1148.     JZ    PRFRAME
  1149.     CALL    EPRINT
  1150.     DB    'Level ',0
  1151.     LDA    HLPLVL    ; GET NUMBER
  1152.     CALL    PAFDC        ; PRINT AS DECIMAL
  1153.     LDA    FRNUM    ; GET FRAME NUMBER
  1154.     ORA    A    ; SET FLAGS
  1155.     MVI    A,'/'    ; PREP TO PRINT SLASH
  1156.     CNZ    COUT    ; PRINT SLASH IF FRAME IS NON-ZERO
  1157. PRFRAME:
  1158.     LDA    FRNUM    ; GET NUMBER
  1159.     ORA    A
  1160.     MVI    A,' '    ; PREP TO PRINT SPACE ON EXIT
  1161.     JZ    COUT
  1162.     LDA    FRNUM    ; GET FRAME NUMBER AGAIN
  1163.     CALL    PAFDC    ; PRINT AS DECIMAL
  1164.     CALL    EPRINT
  1165.     DB    ': ',0
  1166.     RET
  1167.  
  1168. ;
  1169. ;  RING ERROR BELL
  1170. ;
  1171. SAK:
  1172.     MVI    A,BEL
  1173.     JMP    COUT
  1174.  
  1175. ;
  1176. ;  BUFFER SECTION
  1177. ;
  1178. HTYPE:
  1179.     DS    1    ; TYPE OF HELP FILE (IF = IHCHAR, IT IS INDEXED BY USR)
  1180. LFRFLAG:
  1181.     DS    1    ; LIST FRAME ONLY FLAG (FOR PRINT FUNCTION)
  1182. TPAEND:
  1183.     DS    1    ; END PAGE ADDRESS OF TPA
  1184. STRTINFO:
  1185.     DS    2    ; PTR TO START OF CURRENT INFORMATION BLOCK
  1186. STRTFRAME:
  1187.     DS    2    ; PTR TO START OF CURRENT FRAME
  1188. SELCHAR:
  1189.     DS    1    ; SELECTION TABLE OPTION CHAR
  1190. FIRSTENTRY:
  1191.     DS    2    ; PTR TO FIRST ENTRY OF INFORMATION SECTION
  1192. LCOUNT:
  1193.     DS    1    ; LINE COUNT BUFFER
  1194. NEXTADR:
  1195.     DS    2    ; NEXT LOAD ADDRESS
  1196. HLPLVL:
  1197.     DS    1    ; NUMBER OF HELP LEVEL CURRENT NODE IS AT (0=BOTTOM)
  1198. FRNUM:
  1199.     DS    1    ; NUMBER OF CURRENT FRAME
  1200. HLPNSTK:
  1201.     DS    2    ; PTR TO STACK OF HELP FILE NAMES OF EACH LEVEL
  1202. HLPBUF:
  1203.     DS    2    ; PTR TO HELP BUFFER
  1204. STACK:
  1205.     DS    2    ; OPSYS STACK PTR
  1206.  
  1207.     END
  1208.