home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol122 / help8080.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  32.7 KB  |  1,562 lines

  1. *
  2. *  PROGRAM NAME:  HELP2
  3. *  AUTHOR:  RICHARD CONN
  4. *  DATE:  23 MAY 83
  5. *  VERSION:  4.1
  6. *  PREVIOUS VERSIONS:  4.0 (14 JAN 83), 3.2 (6 JAN 83)
  7. *  PREVIOUS VERSIONS:  3.1 (8 DEC 82), 3.0 (11 OCT 82), 2.0 (30 OCT 81)
  8. *  PREVIOUS VERSIONS:  1.8 (18 OCT 81), 1.7 (10 SEP 81), 1.6 (9 SEP 81)
  9. *  PREVIOUS VERSIONS:  1.5 (9 SEP 81), 1.4 (8 SEP 81), 1.3 (8 SEP 81)
  10. *  PREVIOUS VERSIONS:  1.2 (7 SEP 81), 1.1 (6 OCT 80), 1.0 (18 NOV 79)
  11. *  NOTE:  FOR USE WITH ZCPR 2.0 AND LATER
  12. *
  13. VERS    EQU    41
  14.  
  15. *  NOTE: Converted to all 8080 code by Charles H. Strom - May 29, 1983
  16.  
  17. ;
  18. ;    This program is Copyright (c) 1982, 1983 by Richard Conn
  19. ;    All Rights Reserved
  20. ;
  21. ;    ZCPR2 and its utilities, including this one, are released
  22. ; to the public domain.  Anyone who wishes to USE them may do so with
  23. ; no strings attached.  The author assumes no responsibility or
  24. ; liability for the use of ZCPR2 and its utilities.
  25. ;
  26. ;    The author, Richard Conn, has sole rights to this program.
  27. ; ZCPR2 and its utilities may not be sold without the express,
  28. ; written permission of the author.
  29. ;
  30.  
  31. ;
  32. ;    HELP supports an online documentation system under ZCPR2.  Refer
  33. ; to the file HELP.HLP for more details.
  34. ;
  35.  
  36. ;
  37. ;  CP/M Constants
  38. ;
  39. FALSE        EQU    0
  40. TRUE        EQU    NOT FALSE
  41.  
  42. UDFLAG        EQU    4    ; ADDRESS OF USER/DISK FLAG
  43. BDOS        EQU    5    ; ADDRESS OF BDOS ENTRY POINT
  44. FCB        EQU    5CH    ; ADDRESS OF FILE CONTROL BLOCK
  45. BUFF        EQU    80H    ; ADDRESS OF DMA BUFFER
  46.  
  47. CR        EQU    0DH    ; <CR>
  48. LF        EQU    0AH    ; <LF>
  49. FF        EQU    'L'-40H    ; CTRL-L = FORM FEED
  50. CTRLZ        EQU    'Z'-40H    ; CTRL-Z
  51. CTRLC        EQU    'C'-40H    ; CTRL-C
  52.  
  53. ;
  54. ;  HELP Control Characters
  55. ;
  56. SECT$CHAR    EQU    ':'    ; DEFINED TO BE COLON
  57. BACKUP$CHAR    EQU    'L'    ; BACK UP TO PREVIOUS FRAME CHAR
  58. START$CHAR    EQU    'S'    ; JUMP TO START OF INFORMATION CHAR
  59. MENU$CHAR    EQU    'M'    ; CHAR TO ABORT TO MENU
  60. CPM$ABORT$CHAR    EQU    CTRLC    ; CHAR TO EXIT
  61. LEVEL$RET$CHAR    EQU    '^'    ; RETURN TO PREVIOUS HELP LEVEL
  62. ROOT$CHAR    EQU    '.'    ; RETURN TO ROOT OF HELP
  63. PRINT$CHAR    EQU    'P'    ; PRINT CURRENT INFORMATION SECTION
  64.  
  65. ;
  66. ;  Lines/Screen on CRT
  67. ;
  68. LINES$PER$SCREEN    EQU    24    ; ASSUME 24 LINES/SCREEN
  69.  
  70. ;
  71. ;  Number of File Names per Line
  72. ;
  73. NAMES$PER$LINE        EQU    6    ; 6 NAMES (SPACE = 6*11 COLS)
  74.  
  75. ;
  76. ;  Set this to TRUE if all files must be of type HLP
  77. ;
  78. FORCE$HLP        EQU    TRUE     ; TRUE IF FILES MUST BE OF TYPE HLP
  79.  
  80. ;
  81. ;  Number of Nodes (Levels) in Help File Tree
  82. ;
  83. HELP$MAX        EQU    10    ; DEFAULT = 10 (SPACE=11*HELP$MAX)
  84.  
  85. ;
  86.     ORG    100H
  87.  
  88. ;
  89. ;  Branch to Start of Program
  90. ;
  91.     jmp    start
  92.  
  93. ;
  94. ;******************************************************************
  95. ;
  96. ;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
  97. ;
  98. ;    This data block precisely defines the data format for
  99. ; initial features of a ZCPR2 system which are required for proper
  100. ; initialization of the ZCPR2-Specific Routines in SYSLIB.
  101. ;
  102.  
  103. ;
  104. ;  EXTERNAL PATH DATA
  105. ;
  106. EPAVAIL:
  107.     DB    0FFH    ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
  108. EPADR:
  109.     DW    40H    ; ADDRESS OF EXTERNAL PATH IF AVAILABLE
  110.  
  111. ;
  112. ;  INTERNAL PATH DATA
  113. ;
  114. INTPATH:
  115.     DB    0,0    ; DISK, USER FOR FIRST PATH ELEMENT
  116.             ; DISK = 1 FOR A, '$' FOR CURRENT
  117.             ; USER = NUMBER, '$' FOR CURRENT
  118.     DB    0,0
  119.     DB    0,0
  120.     DB    0,0
  121.     DB    0,0
  122.     DB    0,0
  123.     DB    0,0
  124.     DB    0,0    ; DISK, USER FOR 8TH PATH ELEMENT
  125.     DB    0    ; END OF PATH
  126.  
  127. ;
  128. ;  MULTIPLE COMMAND LINE BUFFER DATA
  129. ;
  130. MCAVAIL:
  131.     DB    0FFH    ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
  132. MCADR:
  133.     DW    0FF00H    ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE
  134.  
  135. ;
  136. ;  DISK/USER LIMITS
  137. ;
  138. MDISK:
  139.     DB    4    ; MAXIMUM NUMBER OF DISKS
  140. MUSER:
  141.     DB    31    ; MAXIMUM USER NUMBER
  142.  
  143. ;
  144. ;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
  145. ;
  146. DOK:
  147.     DB    0FFH    ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
  148. UOK:
  149.     DB    0FFH    ; ALLOW USER CHANGE? (0=NO, 0FFH=YES)
  150.  
  151. ;
  152. ;  PRIVILEGED USER DATA
  153. ;
  154. PUSER:
  155.     DB    10    ; BEGINNING OF PRIVILEGED USER AREAS
  156. PPASS:
  157.     DB    'chdir',0    ; PASSWORD FOR MOVING INTO PRIV USER AREAS
  158.     DS    41-($-PPASS)    ; 40 CHARS MAX IN BUFFER + 1 for ending NULL
  159.  
  160. ;
  161. ;  CURRENT USER/DISK INDICATOR
  162. ;
  163. CINDIC:
  164.     DB    '$'    ; USUAL VALUE (FOR PATH EXPRESSIONS)
  165.  
  166. ;
  167. ;  DMA ADDRESS FOR DISK TRANSFERS
  168. ;
  169. DMADR:
  170.     DW    80H    ; TBUFF AREA
  171.  
  172. ;
  173. ;  NAMED DIRECTORY INFORMATION
  174. ;
  175. NDRADR:
  176.     DW    00000H    ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
  177. NDNAMES:
  178.     DB    64    ; MAX NUMBER OF DIRECTORY NAMES
  179. DNFILE:
  180.     DB    'NAMES   '    ; NAME OF DISK NAME FILE
  181.     DB    'DIR'        ; TYPE OF DISK NAME FILE
  182.  
  183. ;
  184. ;  REQUIREMENTS FLAGS
  185. ;
  186. EPREQD:
  187.     DB    0FFH    ; EXTERNAL PATH?
  188. MCREQD:
  189.     DB    000H    ; MULTIPLE COMMAND LINE?
  190. MXREQD:
  191.     DB    000H    ; MAX USER/DISK?
  192. UDREQD:
  193.     DB    000H    ; ALLOW USER/DISK CHANGE?
  194. PUREQD:
  195.     DB    000H    ; PRIVILEGED USER?
  196. CDREQD:
  197.     DB    000H    ; CURRENT INDIC AND DMA?
  198. NDREQD:
  199.     DB    000H    ; NAMED DIRECTORIES?
  200. Z2CLASS:
  201.     DB    5    ; CLASS 5
  202.     DB    'ZCPR2'
  203.     DS    10    ; RESERVED
  204.  
  205. ;
  206. ;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
  207. ;
  208. ;******************************************************************
  209. ;
  210.  
  211. ;
  212. ;  DEFAULT FILE NAME
  213. ;
  214. DEFFN:
  215.     DB    'HELP    '
  216. DEFTYP:
  217.     DB    'HLP'
  218.  
  219. ;
  220. ;  Start of Program
  221. ;
  222. START:
  223.     LXI    H,0    ; GET SP
  224.     DAD    SP
  225.     SHLD    STACK
  226.     LXI    SP,STACK    ; NEW STACK
  227.     MVI    E,0FFH        ; GET CURRENT USER NUMBER
  228.     MVI    C,32
  229.     CALL    BDOS
  230.     STA    CUR$USER    ; CURRENT USER NUMBER
  231.     LDA    BDOS+2    ; BASE PAGE OF BDOS
  232.     SUI    10    ; 2K + 2 PAGES
  233.     STA    TPA$END
  234.     XRA    A    ; A=0
  235.     STA    DFFLG    ; TURN OFF DEFAULT FILE FLAG
  236.     STA    HELP$LEVEL    ; SET HELP LEVEL TO 0 (NO RETURN FILE)
  237.     LXI    D,HELPMS    ; PRINT OPENING MSG
  238.     CALL    PRINT$MESSAGE
  239.     LXI    H,FCB+1    ; CHECK FOR FILE NAME
  240.     MOV    A,M
  241.     CPI    ' '    ; NONE?
  242.     JNZ    START1
  243.  
  244. *  INSERT 'HELP.HLP' INTO FCB OR CLEAR FCB
  245.     LXI    D,DEFFN    ; PT TO DEFAULT NAME
  246.     MVI    B,11    ; 11 BYTES
  247.     XCHG
  248.     CALL    MOVE    ; MOVE (HL) TO (DE) FOR (B) BYTES
  249.     MVI    A,1    ; TURN ON DEFAULT FILE FLAG
  250.     STA    DFFLG
  251.  
  252. *  START/RESTART HELP PROGRAM (START ON INITIAL ENTRY, RESTART ON NODE LOAD)
  253. START1:
  254.     LXI    SP,STACK    ; SET STACK POINTER
  255.  
  256. *  CLEAR NON-NAME/TYPE BYTES IN FCB
  257.     LXI    H,FCB    ; INITIAL ZERO
  258.     MVI    M,0    ; STORE 0 FOR DRIVE (CURRENT LOGGED-IN)
  259.     LXI    D,12    ; SKIP TO EXTENT
  260.     DAD    D
  261.     MVI    B,24    ; FILL 24 BYTES
  262. FCB$FILL:
  263.     MVI    M,0    ; ZERO FILL
  264.     INX    H    ; PT TO NEXT
  265.     DCR    B
  266.     JNZ    FCB$FILL
  267.  
  268. *  CHECK FOR WILD CARDS IN FILE NAME -- ERROR IF SO
  269.     LXI    H,FCB+1    ; PT TO FIRST BYTE OF FILE NAME
  270.     MVI    B,11    ; 11 BYTES
  271. FCB$WILD$CK:
  272.     MOV    A,M    ; GET BYTE
  273.     ANI    7FH    ; MASK
  274.     CPI    '?'    ; WILD?
  275.     JZ    FCB$WILD$ERROR
  276.     INX    H    ; PT TO NEXT
  277.     DCR    B
  278.     JNZ    FCB$WILD$CK
  279.  
  280. *  CHECK FOR FILE TYPE
  281.     LXI    H,FCB+9    ; CHECK FOR FILE TYPE
  282.  
  283.     IF    NOT FORCE$HLP    ; IF FILE TYPE MAY NOT BE HLP
  284.     MOV    A,M    ; CHECK FOR FILE TYPE SPECIFIED
  285.     CPI    ' '    ; NONE?
  286.     JNZ    START2
  287.     ENDIF
  288.  
  289. *  PLACE DEFAULT FILE TYPE OF '.HLP' IN FCB
  290. DEFAULT$EXT:
  291.     LXI    D,DEFTYP    ; DEFAULT FILE TYPE
  292.     MVI    B,3
  293.     XCHG
  294.     CALL    MOVE    ; MOVE (HL) TO (DE) FOR (B) BYTES
  295.  
  296. *  OPEN FILE
  297. START2:
  298.     LDA    DFFLG    ; CHECK FOR DEFAULT
  299.     ORA    A    ; 0=NO
  300.     JNZ    HELP$DEF    ; DISPLAY DEFAULT HELP INFO WITH FILE NAMES
  301.     LXI    H,INTPATH    ; SET BASE ADDRESS OF PATH
  302.     LDA    EPAVAIL        ; EXTERNAL PATH AVAILABLE
  303.     ORA    A        ; 0=NO
  304.     JZ    START2A
  305.     LHLD    EPADR        ; GET ADDRESS OF EXTERNAL PATH
  306. START2A:
  307.     LXI    D,FCB        ; PT TO FCB
  308.     CALL    FNDFILE        ; SEARCH FOR FILE
  309.     JNZ    START3        ; FILE FOUND, SO PROCESS
  310.     LDA    EPAVAIL        ; SEARCH ALONG EXTERNAL PATH?
  311.     ORA    A        ; 0=NO
  312.     JZ    START2B
  313.     LXI    H,INTPATH    ; SELECT INTERNAL PATH THEN
  314.     LXI    D,FCB        ; PT TO FCB
  315.     CALL    FNDFILE        ; SEARCH
  316.     JNZ    START3        ; FILE FOUND
  317.  
  318. *  FILE NOT FOUND -- FATAL ERROR
  319. START2B:
  320.     LXI    D,ERR1    ; FILE NOT FOUND
  321.     CALL    PRINT$MESSAGE
  322.     JMP    HELP$EXIT
  323.  
  324. *  FILE CONTAINS WILD CARDS -- FATAL ERROR
  325. FCB$WILD$ERROR:
  326.     LXI    D,WILD$ERR    ; WILD CARD
  327.     CALL    PRINT$MESSAGE
  328.     JMP    HELP$EXIT
  329.  
  330. *
  331. *  DISPLAY DEFAULT HELP FILE INFORMATION
  332. *
  333. HELP$DEF:
  334.     LXI    D,HELP$DEF$MSG    ; PRINT MESSAGE
  335.     CALL    PRINT$MESSAGE
  336.     CALL    SET$COUNT    ; SET COUNTER
  337.     CALL    RESET$SYSTEM    ; RETURN HOME
  338.     CALL    PRINT$HELP$FILES    ; PRINT HELP FILES AT HOME
  339.     LDA    EPAVAIL        ; EXTERNAL PATH?
  340.     LHLD    EPADR        ; EXTERNAL PATH ADDRESS
  341.     ORA    A        ; 0=NO EXTERNAL PATH
  342.     CNZ    HDFF1
  343.     CALL    RESET$SYSTEM    ; RETURN HOME
  344.     LXI    H,INTPATH    ; FOLLOW INTERNAL PATH
  345.     CALL    HDFF1        ; SEARCH IT
  346.     CALL    RESET$SYSTEM    ; RESET CALLING DISK/USER NUMBER
  347.     LXI    D,HELP$EDEF$MSG    ; PRINT END MESSAGE
  348.     CALL    PRINT$MESSAGE
  349.     CALL    CHAR$IN        ; GET ANY CHAR FOR RESPONSE
  350.     CPI    CTRLC        ; ABORT?
  351.     JZ    HELP$EXIT
  352.     XRA    A        ; TURN OFF DEFAULT
  353.     STA    DFFLG
  354.     LXI    H,DEFFN        ; SET DEFAULT FILE NAME
  355.     LXI    D,FCB+1
  356.     MVI    B,11        ; 11 BYTES
  357.     CALL    MOVE
  358.     JMP    START2        ; PROCESS DEFAULT HELP FILE
  359.  
  360. ;
  361. ; MAIN SEARCH LOOP
  362. ;
  363. HDFF1:
  364.     LDA    CINDIC        ;GET CURRENT DISK INDICATOR
  365.     MOV    B,A        ;... IN B
  366.     MOV    A,M        ;GET DRIVE
  367.     ANI    7FH        ;MASK MSB
  368.     ORA    A        ;0=DONE=COMMAND NOT FOUND
  369.     RZ            ;END OF PATH?
  370. ;
  371. ; LOOK FOR COMMAND IN DIRECTORY PTED TO BY HL; DRIVE IN A
  372. ;
  373.     CMP    B
  374.     JNZ    HDFF2        ;SKIP DEFAULT DRIVE SELECTION IF SO
  375.     LDA    UDFLAG        ;GET DEFAULT USER/DISK
  376.     ANI    0FH        ;MASK FOR DEFAULT DISK
  377.     INR    A        ;PREP FOR FOLLOWING DCR A
  378. HDFF2:
  379.     DCR    A        ;ADJUST PATH 1 TO 0 FOR A, ETC
  380.     MOV    E,A        ;DISK NUMBER IN E
  381.     MVI    C,14        ;SELECT DISK FCT
  382.     CALL    BENTRY        ;SELECT DRIVE
  383.     INX    H        ;PT TO USER NUMBER
  384.     MOV    A,M        ;GET USER NUMBER
  385.     INX    H        ;PT TO NEXT PATH ELEMENT
  386.     ANI    7FH        ;MASK OUT MSB
  387.     CMP    B
  388.     JNZ    HDFF3        ;DO NOT SELECT CURRENT USER IF SO
  389.     LDA    CUR$USER    ;GET ORIGINAL USER NUMBER
  390. HDFF3:
  391.     MOV    E,A        ;SELECT USER
  392.     MVI    C,32
  393.     CALL    BENTRY
  394.     PUSH    H        ;SAVE PATH PTR
  395.     CALL    PRINT$HELP$FILES
  396.     POP    H        ;GET PATH PTR
  397.     JMP    HDFF1
  398.  
  399. *
  400. *  SET FILE NAME COUNTER
  401. *
  402. SET$COUNT:
  403.     MVI    A,NAMES$PER$LINE    ; NUMBER OF FILE NAMES/LINE
  404.     STA    NAME$COUNT
  405.     RET
  406.  
  407. *
  408. *  PRINT NAMES OF HELP FILES
  409. *
  410. PRINT$HELP$FILES:
  411.     LXI    H,FCB        ; MAKE FCB = *.HLP
  412.     MVI    M,0        ; BEGINNING 0 FOR DEFAULT DISK
  413.     MVI    B,8        ; FILL 8 ?'S
  414.     INX    H        ; PT TO FIRST CHAR
  415. PHF1:
  416.     MVI    M,'?'        ; '?' FILL
  417.     INX    H        ; PT TO NEXT
  418.     DCR    B
  419.     JNZ    PHF1
  420.     LXI    D,DEFTYP    ; COPY DEFAULT FILE TYPE
  421.     MVI    B,3        ; 3 BYTES
  422.     XCHG            ; EXCHANGE
  423.     CALL    MOVE        ; COPY
  424.     XCHG            ; RESTORE PTR
  425.     MVI    B,24        ; FILL REST WITH 0'S
  426. PHF2:
  427.     MVI    M,0        ; 0 FILL
  428.     INX    H        ; PT TO NEXT
  429.     DCR    B
  430.     JNZ    PHF2
  431.  
  432. *  SEARCH FOR FIRST FILE
  433.     LXI    D,FCB        ; PT TO FCB
  434.     MVI    C,17        ; SEARCH FOR FIRST
  435.     CALL    BDOS
  436.     CPI    0FFH        ; NONE?
  437.     RZ            ; DONE IF SO
  438.  
  439. *  PRINT CURRENT AND SEARCH FOR NEXT
  440. PHF3:
  441.     CALL    PRINT$HFN    ; PRINT HELP FILE NAME
  442.     LXI    D,FCB        ; PT TO FCB
  443.     MVI    C,18        ; SEARCH FOR NEXT
  444.     CALL    BDOS
  445.     CPI    0FFH        ; DONE?
  446.     JNZ    PHF3
  447.     RET
  448.  
  449. *
  450. *  PRINT NAME OF FILE WHOSE BUFF OFFSET IS IN A
  451. *
  452. PRINT$HFN:
  453.     RRC            ; A=A*32
  454.     RRC
  455.     RRC            ; RATHER THAN 5 LEFT, I DO 3 RIGHT (NEAT, HUH?)
  456.     ANI    60H        ; MASK ALL BUT INTERESTING PART
  457.     LXI    H,BUFF        ; PT TO BUFFER
  458.     ADD    L        ; PT TO ENTRY
  459.     MOV    L,A
  460.     MOV    A,H
  461.     ACI    0
  462.     MOV    H,A        ; HL PTS TO ENTRY
  463.     INX    H        ; HL PTS TO HELP FILE NAME
  464.     MVI    B,8        ; 8 CHARS
  465. PHFN1:
  466.     MOV    A,M        ; GET CHAR
  467.     ANI    7FH        ; MASK
  468.     INX    H        ; PT TO NEXT
  469.     CALL    CHAR$OUT    ; PRINT IT
  470.     DCR    B
  471.     JNZ    PHFN1
  472.     MVI    A,' '        ; TRAILING SPACES
  473.     CALL    CHAR$OUT    ; 3 OF THEM
  474.     CALL    CHAR$OUT
  475.     CALL    CHAR$OUT
  476.     LDA    NAME$COUNT    ; COUNT DOWN
  477.     DCR    A
  478.     STA    NAME$COUNT
  479.     RNZ
  480.     CALL    SET$COUNT    ; RESET COUNT
  481.     CALL    CRLF        ; NEW LINE
  482.     RET
  483.  
  484. *
  485. *  LOAD HELP FILE INFORMATION
  486. *
  487. START3:
  488.     LXI    D,FCB        ; OPEN FILE
  489.     MVI    C,15        ; BDOS FILE OPEN
  490.     CALL    BDOS
  491.     LXI    H,HELP$BUF    ; PT TO BUFFER
  492.     SHLD    NEXT$ADR    ; SET PTR
  493.  
  494. *  READ RECORDS UNTIL EOF
  495. START4:
  496.     CALL    READ$RECORD    ; READ INFO
  497.     JZ    START4    ; NOT DONE IF ZERO RETURN
  498.     LXI    D,FCB    ; CLOSE FILE
  499.     MVI    C,16    ; CLOSE
  500.     CALL    BDOS
  501.     CALL    RESET$SYSTEM    ; RESTORE CURRENT DISK AND USER IF CHANGED
  502.  
  503. *
  504. *  START OF HELP PROGRAM
  505. *
  506. HELP:
  507.     LXI    SP,STACK    ; RESET STACK
  508.     MVI    A,0    ; SET NO FRAME
  509.     STA    FRAME$NUMBER
  510.     LXI    H,HELP$BUF    ; PT TO BUFFER
  511.     MOV    A,M    ; NO HEADER SECTION?
  512.     ANI    7FH    ; MASK OUT MSB
  513.     CPI    SECT$CHAR
  514.     JNZ    HELP1    ; HEADER SECTION EXISTS
  515.     CALL    PRINT$INFO    ; PRINT HELP INFO PTED TO BY HL
  516.     LDA    HELP$LEVEL    ; CHECK TO SEE IF WE ARE NOT AT LEVEL 0
  517.     ORA    A    ; 0=LEVEL 0
  518.     JZ    HELP$EXIT    ; ABORT IF SO
  519.     JMP    LEVEL$RETURN    ; GO TO PREVIOUS LEVEL IF NOT
  520.  
  521. *  EXIT POINT FOR ANY EXIT FROM THE REST OF THE HELP PROGRAM
  522. HELP$EXIT:
  523.     CALL    RESET$SYSTEM    ; RESET CALLING DISK/USER NUMBER
  524.     LHLD    STACK    ; GET CP/M SP
  525.     SPHL
  526.     RET        ; DONE
  527.  
  528. *  PRINT HEADER INFORMATION AND SELECT AN OPTION
  529. HELP1:
  530.     CALL    PRINT$HEADER    ; PRINT HEADER
  531.     PUSH    B    ; SAVE C (NUMBER OF VALID SELECTIONS)
  532.     CALL    CRLF1    ; NEW LINE
  533.     CALL    PR$LEVEL    ; PRINT LEVEL NUMBER
  534.     LXI    D,PROMPT1$MESSAGE    ; PRINT PROMPT
  535.     CALL    PRINT$MESSAGE
  536.     LXI    D,PROMPT2$MESSAGE    ; LEVEL COMMAND
  537.     LDA    HELP$LEVEL    ; CURRENT LEVEL = 0?
  538.     ORA    A    ; SET FLAGS
  539.     JZ    HELP1A
  540.     CALL    PRINT$MESSAGE
  541. HELP1A:
  542.     LXI    D,PROMPT3$MESSAGE
  543.     CALL    PRINT$MESSAGE
  544.     POP    B    ; GET C
  545.     CALL    CHAR$IN        ; GET RESPONSE
  546.     CPI    CTRLC        ; EXIT
  547.     JZ    HELP$EXIT
  548.     CPI    ROOT$CHAR    ; GO TO ROOT
  549.     JZ    GO$ROOT
  550.     CPI    LEVEL$RET$CHAR    ; RETURN TO PREVIOUS LEVEL
  551.     JZ    LEVEL$RETURN
  552.     PUSH    PSW    ; SAVE CHAR
  553.     CALL    CRLF1
  554.     POP    PSW    ; GET CHAR
  555.     SUI    'A'-1        ; ADJUST FOR COUNT
  556.     MOV    B,A        ; SAVE COUNT
  557.     JZ    BAD$RESPONSE
  558.     JNC    HELP2
  559.  
  560. *  INVALID RESPONSE
  561. BAD$RESPONSE:
  562.     LXI    D,ERR2    ; INVALID RESPONSE
  563.     CALL    PRINT$MESSAGE
  564.     JMP    HELP1
  565.  
  566. *  VALID RESPONSE -- LOOK FOR AND PRINT INFORMATION SECTION
  567. HELP2:
  568.     INR    C    ; 1 MORE THAN NUMBER OF POSSIBLE SELECTIONS
  569.     CMP    C    ; GREATER THAN NUMBER OF POSSIBLE SELECTIONS?
  570.     JNC    BAD$RESPONSE
  571.     LHLD    FIRST$ENTRY    ; GET PTR TO FIRST ENTRY
  572.  
  573. *  PRINT INFORMATION WHEN COUNT IS ZERO
  574. HELP3:
  575.     DCR    B
  576.     JNZ    HELP4
  577.     CALL    PRINT$INFO    ; PRINT INFO PTED TO BY HL
  578.     JMP    HELP1
  579.  
  580. *  LOCATE NEXT INFORMATION SECTION
  581. HELP4:
  582.     MOV    A,M    ; <CTRL-Z>?
  583.     ANI    7FH    ; MASK OUT MSB
  584.     INX    H    ; PT TO NEXT BYTE
  585.     CPI    CTRLZ
  586.     JZ    HELP$ERR    ; HELP FILE FORMAT ERROR
  587.     CPI    LF    ; LINE FEED (WS FILE)?
  588.     JZ    HELP5
  589.     CPI    CR    ; <CR>?
  590.     JNZ    HELP4
  591.     INX    H    ; 1ST BYTE OF NEXT LINE
  592. HELP5:
  593.     MOV    A,M    ; GET CHAR
  594.     ANI    7FH    ; MASK OUT MSB
  595.     CPI    SECT$CHAR    ; NEW SECTION?
  596.     JZ    HELP3    ; CONTINUE LOOP IF SO
  597.     CPI    CTRLZ    ; EOF?
  598.     JNZ    HELP4    ; CONTINUE IF NOT
  599.  
  600. *  ERROR -- REACHED END OF HELP FILE
  601. HELP$ERR:
  602.     LXI    D,ERR3    ; FORMAT ERROR
  603.     CALL    PRINT$MESSAGE
  604.     JMP    HELP1
  605.  
  606.  
  607. *********************************************************
  608. *                            *
  609. *  HELP SUPPORT ROUTINE SECTION                *
  610. *                            *
  611. *********************************************************
  612.  
  613. *
  614. *  RESTORE CURRENT DISK AND CURRENT USER
  615. *
  616. RESET$SYSTEM:
  617.     LDA    UDFLAG    ; GET DISK
  618.     ANI    0FH    ; GET DISK NUMBER
  619.     MOV    E,A    ; DISK IN E
  620.     MVI    C,14    ; SELECT DISK
  621.     CALL    BDOS
  622.     LDA    CUR$USER    ; SET USER
  623.     MOV    E,A    ; USER IN E
  624.     MVI    C,32    ; SET USER CODE
  625.     CALL    BDOS
  626.     RET
  627.  
  628. *
  629. *  FNDFILE -- LOOK FOR FILE ALONG ZCPR2 PATH
  630. *  INPUT PARAMETERS:  HL = BASE ADDRESS OF PATH, DE = PTR TO FCB OF FILE
  631. *  OUTPUT PARAMETERS:  A=0 AND ZERO FLAG SET IF NOT FOUND, NZ IF FOUND
  632. *
  633. FNDFILE:
  634.     SHLD    PATH        ;SAVE PATH BASE ADDRESS
  635.     MVI    C,17        ;SEARCH FOR FIRST
  636.     CALL    BENTRY        ;LOOK FOR FILE
  637.     INR    A        ;SET FLAG
  638.     JNZ    FF5        ;FOUND IT -- RETURN FOUND FLAG
  639.     XCHG            ;HL=FCB PTR
  640.     SHLD    FCBPTR        ;SAVE IT
  641.     LHLD    PATH        ;PT TO PATH FOR FAILURE POSSIBILITY
  642. ;
  643. ; MAIN SEARCH LOOP
  644. ;
  645. FF1:
  646.     LDA    CINDIC        ;GET CURRENT USER/DISK INDICATOR
  647.     MOV    B,A        ;... IN B
  648.     MOV    A,M        ;GET DRIVE
  649.     ANI    7FH        ;MASK MSB
  650.     ORA    A        ;0=DONE=COMMAND NOT FOUND
  651.     JNZ    FF2        ;NO ERROR ABORT?
  652. ;
  653. ; FILE NOT FOUND ERROR
  654. ;
  655.     XRA    A        ;ZERO FLAG MEANS NOT FOUND
  656.     RET
  657. ;
  658. ; LOOK FOR COMMAND IN DIRECTORY PTED TO BY HL; DRIVE IN A
  659. ;
  660. FF2:
  661.     CMP    B        ;CURRENT DISK?
  662.     JNZ    FF3        ;SKIP DEFAULT DRIVE SELECTION IF SO
  663.     LDA    UDFLAG        ;GET DEFAULT USER/DISK
  664.     ANI    0FH        ;MASK FOR DEFAULT DISK
  665.     INR    A        ;PREP FOR FOLLOWING DCR A
  666. FF3:
  667.     DCR    A        ;ADJUST PATH 1 TO 0 FOR A, ETC
  668.     MOV    E,A        ;DISK NUMBER IN E
  669.     MVI    C,14        ;SELECT DISK FCT
  670.     CALL    BENTRY        ;SELECT DRIVE
  671.     INX    H        ;PT TO USER NUMBER
  672.     MOV    A,M        ;GET USER NUMBER
  673.     ANI    7FH        ;MASK OUT MSB
  674.     INX    H        ;PT TO NEXT ENTRY IN PATH
  675.     CMP    B        ;CURRENT USER?
  676.     JNZ    FF4        ;DO NOT SELECT CURRENT USER IF SO
  677.     LDA    CUR$USER    ;GET ORIGINAL USER NUMBER
  678. FF4:
  679.     MOV    E,A        ;SELECT USER
  680.     MVI    C,32
  681.     CALL    BENTRY
  682.     XCHG            ;SAVE PTR TO NEXT PATH ELEMENT IN DE
  683.     LHLD    FCBPTR        ;GET PTR TO FCB
  684.     XCHG            ;... IN DE, PATH PTR IN HL
  685.     MVI    C,17        ;SEARCH FOR FIRST
  686.     CALL    BENTRY        ;LOOK FOR FILE
  687.     INR    A        ;SET FLAG
  688.     JZ    FF1        ;CONTINUE PATH SEARCH IF SEARCH FAILED
  689. ;
  690. ; FILE FOUND -- PERFORM SYSTEM TEST AND PROCEED IF APPROVED
  691. ;
  692. FF5:
  693.     MVI    A,0FFH        ;SET OK RETURN
  694.     ORA    A
  695.     RET
  696.  
  697. ;
  698. ;  BDOS ROUTINE
  699. ;
  700. BENTRY:
  701.     PUSH    H    ;SAVE REGS
  702.     PUSH    D
  703.     PUSH    B
  704.     CALL    BDOS
  705.     POP    B    ;GET REGS
  706.     POP    D
  707.     POP    H
  708.     RET
  709.  
  710. * BUFFERS
  711. FCBPTR:
  712.     DS    2    ;POINTER TO FCB FOR FILE SEARCH
  713. PATH:
  714.     DS    2    ;BASE ADDRESS OF PATH
  715.  
  716. *
  717. *  INPUT CHAR; CHAR IS IN A
  718. *
  719. CHAR$IN:
  720.     PUSH B ! PUSH D ! PUSH H
  721.     MVI    C,1    ; READ CHAR
  722.     CALL    BDOS
  723.     POP H ! POP D ! POP B
  724.     PUSH    PSW    ; SAVE CHAR
  725.     CALL    CRLF1
  726.     POP    PSW    ; RESTORE CHAR
  727. *
  728. *  CAPITALIZE CHAR IN A
  729. *
  730. CAPS:
  731.     ANI    7FH    ; MASK OUT MSB
  732.     CPI    61H    ; LESS THAN SMALL A?
  733.     RC
  734.     CPI    7BH    ; LESS THAN LEFT BRACE?
  735.     RNC
  736.     ANI    5FH    ; CAPITALIZE
  737.     RET
  738.  
  739. *
  740. *  PRINT CHAR IN A ON CON:
  741. *
  742. CHAR$OUT:
  743.     PUSH PSW ! PUSH B ! PUSH D ! PUSH H
  744.     MVI    C,2    ; WRITE
  745.     MOV    E,A    ; CHAR IN E
  746.     CALL    BDOS
  747.     POP H ! POP D ! POP B ! POP PSW
  748.     RET
  749.  
  750. *
  751. *  PRINT ERROR MSG PTED TO BY DE; ENDS IN '$'
  752. *
  753. PRINT$MESSAGE:
  754.     PUSH B ! PUSH D ! PUSH H
  755.     MVI    C,9    ; PRINT BUFFER
  756.     CALL    BDOS
  757.     POP H ! POP D ! POP B
  758.     RET
  759.  
  760. *
  761. *  MOVE BYTES PTED TO BY HL TO AREA PTED TO BY DE; B BYTES TO MOVE
  762. *
  763. MOVE:
  764.     MOV    A,M    ; GET BYTE
  765.     ANI    7FH    ; MASK OFF MSB -- IN CASE A WS FILE
  766.     STAX    D    ; PUT BYTE
  767.     INX    H    ; PT TO NEXT
  768.     INX    D
  769.     DCR    B
  770.     JNZ    MOVE
  771.     RET
  772.  
  773. *
  774. *  READ RECORD FROM DISK; NEXT$ADR CONTAINS ADDRESS TO READ TO
  775. *    ON RETURN, BDOS ERROR CODE IS IN A (0=NO ERROR)
  776. *
  777. READ$RECORD:
  778.     MVI    C,20    ; READ NEXT RECORD
  779.     LXI    D,FCB    ; PT TO FCB
  780.     CALL    BDOS
  781.     PUSH    PSW    ; SAVE RETURN CODE
  782.     LHLD    NEXT$ADR    ; PT TO LOAD ADDRESS
  783.     LDA    TPA$END    ; CHECK AGAINST END PAGE OF TPA
  784.     CMP    H    ; IF AT SAME PAGE, YES
  785.     JZ    READ$ERROR
  786.     LXI    D,BUFF    ; PT TO BUFFER TO LOAD FROM
  787.     MVI    B,128    ; NUMBER OF BYTES TO MOVE
  788.     XCHG
  789.     CALL    MOVE
  790.     XCHG
  791.     MVI    M,CTRLZ    ; STORE ENDING CTRLZ IN CASE OF EOF
  792.     POP    PSW    ; GET RETURN CODE
  793.     ORA    A    ; DONE?  <>0 IF SO
  794.  
  795. *  READ DONE -- SAVE PTR TO NEXT BLOCK
  796.     SHLD    NEXT$ADR    ; SET NEXT ADDRESS
  797.     RET
  798.  
  799. READ$ERROR:
  800.     LXI    D,READERR
  801.     CALL    PRINT$MESSAGE
  802.     JMP    HELP$EXIT
  803.  
  804. *
  805. *  PRINT ONE LINE OF INFO SECTION; HL PTS TO LINE UPON ENTRY;
  806. *    HL PTS TO FIRST CHAR OF NEXT LINE UPON EXIT
  807. *
  808. PRINT$LINE:
  809.     MOV    A,M    ; GET CHAR
  810.     ANI    7FH    ; MASK OUT MSB
  811.     CPI    CR    ; EOL?
  812.     JZ    CRLF
  813.     CPI    LF    ; LINE FEED? (WS FILE)
  814.     JZ    CRLF0
  815.     CPI    CTRLZ    ; END OF FILE?
  816.     JZ    CRLFC    ; DONE IF SO
  817.     CALL    CHAR$OUT    ; PRINT CHAR
  818.     INX    H    ; PT TO NEXT
  819.     JMP    PRINT$LINE
  820.  
  821. *
  822. *  PRINT CRLF, PT TO FIRST CHAR OF NEXT LINE, AND PAGE IF NECESSARY
  823. *
  824. CRLF:
  825.     INX    H    ; PT TO LF
  826. CRLF0:
  827.     INX    H    ; PT TO 1ST CHAR OF NEXT LINE
  828. CRLFC:
  829.     CALL    CRLF1    ; PRINT CRLF
  830.     LDA    LINE$CNT    ; GET LINE COUNT
  831.     DCR    A
  832.     STA    LINE$CNT
  833.     RNZ        ; OK -- CONTINUE
  834.     MOV    A,M    ; SET MSB OF FIRST CHAR OF NEXT LINE
  835.     ORI    80H
  836.     MOV    M,A    ; MSB IS SET FOR LATER BACKUP
  837. FRAME$PAUSE:
  838.     CALL    PR$LEVEL    ; PRINT LEVEL NUMBER
  839.     LDA    FRAME$NUMBER    ; INCREMENT FRAME NUMBER
  840.     INR    A
  841.     STA    FRAME$NUMBER
  842.     LXI    D,PAGEMS
  843.     CALL    PRINT$MESSAGE    ; PRINT PAGE MESSAGE
  844.     LXI    D,PAGE1MS    ; NOT LEVEL 0?
  845.     LDA    HELP$LEVEL    ; GET LEVEL NUMBER
  846.     ORA    A    ; SET FLAGS
  847.     JZ    FP1
  848.     CALL    PRINT$MESSAGE
  849. FP1:
  850.     LXI    D,PAGE2MS
  851.     CALL    PRINT$MESSAGE
  852.     CALL    CHAR$IN    ; GET RESPONSE
  853.     CPI    MENU$CHAR    ; ABORT?
  854.     JZ    HELP    ; START OVER IF SO
  855.     CPI    CPM$ABORT$CHAR    ; ABORT TO OS
  856.     JZ    HELP$EXIT
  857.     CPI    PRINT$CHAR    ; PRINT INFO SECTION?
  858.     JZ    LIST1$INFO
  859.     CPI    ROOT$CHAR    ; GO TO ROOT
  860.     JZ    GO$ROOT
  861.     CPI    LEVEL$RET$CHAR    ; RETURN TO HIGHER LEVEL
  862.     JZ    LEVEL$RETURN
  863.     CPI    BACKUP$CHAR    ; BACK UP?
  864.     JZ    FRAME$BACKUP
  865.     CPI    START$CHAR    ; JUMP TO START OF INFO
  866.     JZ    INFO$START
  867. FRAME$RESUME:
  868.     SHLD    START$OF$FRAME
  869.     CALL    SET$LINE$CNT
  870.     CALL    CRLF1    ; NEW LINE
  871.     RET
  872.  
  873. *  JUMP TO START OF INFORMATION
  874. INFO$START:
  875.     LHLD    START$OF$INFO    ; PT TO START OF INFO
  876.     MVI    A,1        ; RESET FRAME COUNT
  877.     STA    FRAME$NUMBER
  878.     JMP    FRAME$RESUME    ; CONTINUE PROCESSING
  879.  
  880. *  BACK UP TO PREVIOUS FRAME
  881. FRAME$BACKUP:
  882.     CALL    BOI$CHECK    ; AT BEGINNING OF INFORMATION?
  883.     JNZ    FB1        ; CONTINUE IF NOT
  884.     JMP    FRAME$PAUSE
  885. FB1:
  886.     DCX    H    ; BACK UP UNTIL BYTE WITH MSB SET IS FOUND
  887.     MOV    A,M    ; GET BYTE
  888.     ANI    80H
  889.     JZ    FB1
  890.     LDA    FRAME$NUMBER    ; DECREMENT FRAME NUMBER
  891.     DCR    A        ; BACK UP TO CURRENT FRAME NUMBER
  892.     DCR    A        ; BACK UP TO PREVIOUS FRAME NUMBER
  893.     STA    FRAME$NUMBER
  894.     JMP    FRAME$RESUME    ; CONTINUE PROCESSING
  895. *
  896. *  PRINT CR AND LF ONLY
  897. *
  898. CRLF1:
  899.     MVI    A,CR    ; PRINT CR
  900.     CALL    CHAR$OUT
  901.     MVI    A,LF    ; PRINT LF
  902.     JMP    CHAR$OUT
  903.  
  904. *
  905. *  SET LINE$CNT VARIABLE TO SCREEN SIZE
  906. *
  907. SET$LINE$CNT:
  908.     MVI    A,LINES$PER$SCREEN-1
  909.     STA    LINE$CNT
  910.     RET
  911.  
  912. *
  913. *  PRINT THE HEADER SECTION AND LOAD FIRST$ENTRY PTR
  914. *    ON RETURN, C=NUMBER OF POSSIBLE SELECTIONS
  915. *
  916. PRINT$HEADER:
  917.     MVI    A,0    ; SET NO FRAME
  918.     STA    FRAME$NUMBER
  919.     LXI    H,HELP$BUF
  920.     CALL    SET$LINE$CNT
  921.     LDA    LINE$CNT
  922.     DCR    A
  923.     STA    LINE$CNT
  924.     MVI    A,'A'    ; INIT SELECTION CHAR
  925.     STA    SEL$CHAR
  926.     LXI    D,SELECTMS
  927.     CALL    PRINT$MESSAGE
  928.     MVI    C,0    ; COUNT NUMBER OF SELECTIONS
  929.  
  930. * PRINT LINE UNTIL FIRST INFORMATION SECTION FOUND
  931. PH1:
  932.     MOV    A,M    ; GET CHAR
  933.     ANI    7FH    ; MASK OUT MSB
  934.     CPI    SECT$CHAR
  935.     JZ    PH2
  936.     CPI    CTRLZ    ; EOF? -- ABORT
  937.     JZ    HELP$EXIT
  938.     INR    C    ; INCREMENT SELECTION COUNT
  939.     LDA    SEL$CHAR    ; DISPLAY SELECTION CHAR
  940.     CALL    CHAR$OUT
  941.     INR    A    ; INCR CHAR
  942.     STA    SEL$CHAR
  943.     MVI    A,'.'
  944.     CALL    CHAR$OUT
  945.     MVI    A,' '
  946.     CALL    CHAR$OUT
  947.     CALL    PRINT$LINE    ; PRINT HEADER LINE
  948.     JMP    PH1
  949.  
  950. *  SAVE PTR TO FIRST ENTRY
  951. PH2:
  952.     SHLD    FIRST$ENTRY
  953.     LDA    LINE$CNT    ; GET COUNT OF REMAINING LINES
  954.     MOV    B,A        ; ... IN B
  955.     ORA    A        ; ANY LEFT?
  956.     RZ
  957. PH3:
  958.     CALL    CRLF1        ; NEW LINE
  959.     DCR    B
  960.     JNZ    PH3
  961.     RET
  962.  
  963. *
  964. *  PRINT AN INFORMATION SECTION
  965. *    INFORMATION SECTION IS PTED TO BY HL
  966. *
  967. PRINT$INFO:
  968.     SHLD    START$OF$INFO    ; SET START OF INFORMATION POINTER
  969.     CALL    LOAD$NODE    ; LOAD NEW NODE IF DUAL SECT$CHAR
  970.     SHLD    START$OF$FRAME    ; SET FRAME POINTER
  971.     MOV    A,M    ; SET MSB
  972.     ORI    80H
  973.     MOV    M,A
  974.     CALL    SET$LINE$CNT
  975.     MVI    A,1        ; A=1
  976.     STA    FRAME$NUMBER    ; SET FRAME NUMBER
  977. PI1:
  978.     CALL    PRINT$LINE    ; PRINT LINE FROM INFO FILE
  979.     MOV    A,M    ; DONE?
  980.     ANI    7FH    ; MASK OUT MSB
  981.     CPI    CTRLZ    ; EOF?
  982.     JZ    PI2
  983.     CPI    SECT$CHAR    ; NEXT SECTION
  984.     JZ    PI2
  985.     CPI    FF    ; FORM FEED?
  986.     JNZ    PI1
  987.     INX    H    ; PT TO CHAR AFTER FORM FEED
  988.     CALL    FORM$FEED    ; FEED SCREEN
  989.     JMP    PI1
  990.  
  991. *  FORM FEED SCREEN
  992. FORM$FEED:
  993.     LDA    LINE$CNT    ; GET LINE COUNT
  994.     MOV    B,A    ; ... IN B
  995. FEED$LOOP:
  996.     PUSH    B    ; SAVE B
  997.     CALL    CRLFC    ; NEW LINE
  998.     POP    B    ; GET B
  999.     DCR    B
  1000.     JNZ    FEED$LOOP
  1001.     RET
  1002.  
  1003. *  END OF INFO
  1004. PI2:
  1005.     MOV    A,M    ; SET MSB OF NEXT BYTE
  1006.     ORI    80H
  1007.     MOV    M,A
  1008. PI2A:
  1009.     CALL    CRLF1    ; NEW LINE
  1010.     LDA    LINE$CNT    ; COUNT DOWN
  1011.     DCR    A
  1012.     STA    LINE$CNT
  1013.     JNZ    PI2A
  1014. PI2$MSG:
  1015.     CALL    PR$LEVEL    ; PRINT LEVEL NUMBER
  1016.     LDA    FRAME$NUMBER    ; INCREMENT FRAME NUMBER
  1017.     INR    A
  1018.     STA    FRAME$NUMBER
  1019.     LXI    D,ENDMS        ; PRINT END OF INFORMATION MSG
  1020.     CALL    PRINT$MESSAGE
  1021.     LXI    D,PAGE1MS    ; PRINT LEVEL UP MESSAGE OPTIONALLY
  1022.     LDA    HELP$LEVEL    ; GET CURRENT HELP LEVEL
  1023.     ORA    A    ; SET FLAGS
  1024.     JZ    PI2$MSG1
  1025.     CALL    PRINT$MESSAGE
  1026. PI2$MSG1:
  1027.     LXI    D,PAGE2MS    ; PRINT REST OF INFO MESSAGE
  1028.     CALL    PRINT$MESSAGE
  1029.     CALL    CHAR$IN    ; GET ANY CHAR
  1030.     CPI    MENU$CHAR    ; MENU ABORT
  1031.     JZ    HELP
  1032.     CPI    CPM$ABORT$CHAR    ; ABORT TO OS
  1033.     JZ    HELP$EXIT
  1034.     CPI    PRINT$CHAR    ; PRINT INFORMATION SECTION?
  1035.     JZ    LIST1$INFO
  1036.     CPI    ROOT$CHAR    ; GO TO ROOT
  1037.     JZ    GO$ROOT
  1038.     CPI    LEVEL$RET$CHAR    ; RETURN TO HIGHER LEVEL
  1039.     JZ    LEVEL$RETURN
  1040.     CPI    BACKUP$CHAR    ; BACK UP FROM EOI?
  1041.     JZ    PI2$BACKUP
  1042.     CPI    START$CHAR    ; START OF INFO?
  1043.     JZ    PI2$START
  1044.     JMP    SET$LINE$CNT    ; RESET LINE COUNT IN CASE OF ALL
  1045.  
  1046. *  JUMP TO START OF INFO
  1047. PI2$START:
  1048.     LHLD    START$OF$INFO    ; PT TO START OF INFO
  1049.     CALL    FRAME$RESUME    ; RESET POINTERS
  1050.     MVI    A,1        ; RESET FRAME COUNT
  1051.     STA    FRAME$NUMBER
  1052.     JMP    PI1    ; CONTINUE PROCESSING
  1053.  
  1054. *  BACK UP TO PREVIOUS FRAME
  1055. PI2$BACKUP:
  1056.     CALL    BOI$CHECK    ; AT BEGINNING OF INFORMATION?
  1057.     JZ    PI2$MSG
  1058. PI2$BACK:
  1059.     CALL    FB1    ; BACK UP TO PREVIOUS FRAME
  1060.     JMP    PI1    ; CONTINUE PROCESSING
  1061.  
  1062. *
  1063. *  CHECK FOR POSITION AT BEGINNING OF INFORMATION SECTION
  1064. *    IF SO, PRINT BACKUP ERROR MESSAGE AND RETURN W/ZERO SET
  1065. *
  1066. BOI$CHECK:
  1067.     LHLD    START$OF$INFO    ; START ADDRESS
  1068.     XCHG            ; ... IN DE
  1069.     LHLD    START$OF$FRAME    ; FRAME ADDRESS
  1070.     MOV    A,D        ; EQUAL?
  1071.     CMP    H
  1072.     RNZ
  1073.     MOV    A,E
  1074.     CMP    L
  1075.     RNZ
  1076.     LXI    D,BACKERR    ; BACKUP ERROR
  1077.     CALL    PRINT$MESSAGE
  1078.     XRA    A        ; ZERO FLAG SET
  1079.     STA    FRAME$NUMBER    ; SET FRAME NUMBER
  1080.     RET
  1081.  
  1082. **************************************************************
  1083. *  THIS BODY OF CODE LISTS INFORMATION FROM HELP2 TO THE
  1084. *  PRINTER
  1085. **************************************************************
  1086.  
  1087. *
  1088. *  LIST ONE LINE OF INFO SECTION; HL PTS TO LINE UPON ENTRY;
  1089. *    HL PTS TO FIRST CHAR OF NEXT LINE UPON EXIT
  1090. *
  1091. LIST$LINE:
  1092.     MOV    A,M    ; GET CHAR
  1093.     ANI    7FH    ; MASK OUT MSB
  1094.     CPI    CR    ; EOL?
  1095.     JZ    LCRLF
  1096.     CPI    LF    ; LINE FEED? (WS FILE)
  1097.     JZ    LCRLF0
  1098.     CPI    CTRLZ    ; END OF FILE?
  1099.     JZ    LCRLFC    ; DONE IF SO
  1100.     CALL    LST$OUT    ; PRINT CHAR
  1101.     RZ        ; ABORT
  1102.     INX    H    ; PT TO NEXT
  1103.     JMP    LIST$LINE
  1104.  
  1105. *
  1106. *  LIST CRLF, PT TO FIRST CHAR OF NEXT LINE, AND PAGE IF NECESSARY
  1107. *
  1108. LCRLF:
  1109.     INX    H    ; PT TO LF
  1110. LCRLF0:
  1111.     INX    H    ; PT TO 1ST CHAR OF NEXT LINE
  1112. LCRLFC:
  1113.     CALL    LCRLF1    ; PRINT CRLF
  1114.     LDA    LINE$CNT    ; GET LINE COUNT
  1115.     DCR    A
  1116.     STA    LINE$CNT
  1117.     JNZ    LNOABT    ; OK -- CONTINUE
  1118. LCRLF1:
  1119.     MVI    A,CR    ; SEND <CRLF> TO PRINTER
  1120.     CALL    LST$OUT
  1121.     RZ        ; ABORT
  1122.     MVI    A,LF    ; FALL THRU TO LST$OUT
  1123.  
  1124. *  PRINT CHARACTER IN A ON PRINTER; AFFECT NO REGISTERS
  1125. LST$OUT:
  1126.     PUSH    H    ; SAVE REGS
  1127.     PUSH    D
  1128.     PUSH    B
  1129.     MOV    E,A    ; CHAR IN E
  1130.     MVI    C,5    ; BDOS PRINTER OUTPUT ROUTINE
  1131.     CALL    BDOS
  1132.     MVI    E,0FFH    ; CONDITIONAL INPUT
  1133.     MVI    C,6    ; DIRECT CONSOLE I/O
  1134.     CALL    BDOS
  1135.     POP    B    ; RESTORE REGS
  1136.     POP    D
  1137.     POP    H
  1138.     CPI    CTRLC    ; ABORT?
  1139.     RET
  1140. LNOABT:
  1141.     MVI    A,0FFH    ; SET NO ABORT RETURN
  1142.     ORA    A    ; SET FLAGS
  1143.     RET
  1144.  
  1145. *
  1146. *  LIST THE CURRENT INFORMATION SECTION
  1147. *    INFORMATION SECTION IS PTED TO BY START$OF$INFO
  1148. *
  1149. LIST1$INFO:
  1150.     LXI    D,PRINT$WAIT$MSG
  1151.     CALL    PRINT$MESSAGE
  1152.     LHLD    START$OF$INFO    ; PREPARE TO LIST ENTIRE INFO SECTION
  1153.     XRA    A        ; CLEAR FRAME LIST FLAG
  1154.     STA    LFR$FLAG
  1155.     CALL    CHAR$IN        ; GET USER INPUT
  1156.     CPI    'S'        ; SCREEN DISPLAY ONLY
  1157.     JNZ    LIST2$INFO
  1158.     LHLD    START$OF$FRAME    ; LIST CURRENT FRAME ONLY
  1159.     MVI    A,0FFH        ; SET FLAG
  1160.     STA    LFR$FLAG    ; LIST FRAME ONLY
  1161. LIST2$INFO:
  1162.     CPI    CTRLC        ; CHECK FOR ^C TO ABORT
  1163.     CNZ    LIST$INFO    ; DO PRINTOUT
  1164.     LHLD    START$OF$FRAME    ; RETURN TO FRAME WE WERE ON
  1165.     CALL    FRAME$RESUME
  1166.     LDA    FRAME$NUMBER    ; ADJUST FRAME NUMBERING
  1167.     DCR    A
  1168.     STA    FRAME$NUMBER
  1169.     JMP    PI1        ; RESUME AT PI1
  1170. *
  1171. LIST$INFO:
  1172.     LXI    D,PRINT$LMSG    ; PRINT ABORT OPTION MESSAGE
  1173.     CALL    PRINT$MESSAGE
  1174.     CALL    SET$LINE$CNT
  1175. LI1:
  1176.     CALL    LIST$LINE    ; LIST LINE FROM INFO FILE
  1177.     CPI    CTRLC    ; ABORT?
  1178.     RZ
  1179.     MOV    A,M    ; DONE?
  1180.     ANI    7FH    ; MASK OUT MSB
  1181.     CPI    CTRLZ    ; EOF?
  1182.     RZ        ; RESUME IF AT END OF INFO
  1183.     CPI    SECT$CHAR    ; NEXT SECTION
  1184.     RZ        ; RESUME IF AT END OF INFO
  1185.     CPI    FF    ; FORM FEED?
  1186.     JNZ    LI1
  1187.     INX    H    ; PT TO CHAR AFTER FORM FEED
  1188.     CALL    LFORM$FEED    ; FEED PRINTER
  1189.     LDA    LFR$FLAG    ; LIST FRAME ONLY?
  1190.     ORA    A        ; 0=NO
  1191.     RNZ
  1192.     JMP    LI1
  1193.  
  1194. *  FORM FEED SCREEN
  1195. LFORM$FEED:
  1196.     CALL    LCRLFC    ; NEW LINE
  1197.     RET
  1198.  
  1199. **************************************************************
  1200. *  END OF BODY OF CODE WHICH LISTS INFORMATION FROM HELP2 TO
  1201. *  THE PRINTER
  1202. **************************************************************
  1203.  
  1204. *
  1205. *  AT THE BEGINNING OF AN INFORMATION SECTION (HL PTS TO FIRST CHAR)
  1206. *    CHECK TO SEE IF ANOTHER SECT$CHAR FOLLOWS, AND, IF SO, LOAD THE
  1207. *    SPECIFIED FILE AS A NEW NODE AND BEGIN PROCESSING IT
  1208. *
  1209. LOAD$NODE:
  1210.     INX    H    ; PT TO POSSIBLE 2ND SECT$CHAR
  1211.     MOV    A,M    ; GET IT
  1212.     DCX    H    ; PREP FOR RETURN
  1213.     ANI    7FH    ; MASK MSB
  1214.     CPI    SECT$CHAR    ; ANOTHER ONE?
  1215.     RNZ        ; PROCESS NORMALLY IF NOT
  1216.  
  1217. *  WE HAVE A NEW NODE -- CHECK TO SEE IF WE CAN NEST AGAIN
  1218.     LDA    HELP$LEVEL    ; GET CURRENT HELP LEVEL
  1219.     CPI    HELP$MAX    ; AT MAXIMUM?
  1220.     JNZ    LOAD$NODE1
  1221.     LXI    D,LEVELERR    ; LEVEL ERROR MESSAGE
  1222.     CALL    PRINT$MESSAGE
  1223.     JMP    HELP$EXIT
  1224.  
  1225. *  WE HAVE NOT REACHED LEVEL LIMIT, SO CONTINUE
  1226. *  AT THIS TIME, A=HELP LEVEL INDEX AND HL = PTR TO CURRENT SECTION (::)
  1227. LOAD$NODE1:
  1228.  
  1229. *  SAVE CURRENT HELP FILE NAME FOR RETURN
  1230.     INX    H    ; PT TO SECTION SECT$CHAR
  1231.     INX    H    ; NOW POINTING TO FILE NAME
  1232.     PUSH    H    ; SAVE PTR
  1233.     CALL    COMP$HELP$NAME$PTR    ; HL=POINTER TO STACK ELT INDEXED BY A
  1234.     XCHG        ; DE=ADDRESS OF NEXT ELEMENT
  1235.  
  1236. *  COPY CURRENT NODE ELEMENT NAME INTO NEXT STACK ELEMENT
  1237.     LXI    H,FCB+1    ; PT TO FILE NAME
  1238.     MVI    B,11    ; 11 BYTES
  1239.     CALL    MOVE
  1240.  
  1241. *  INCREMENT HELP LEVEL
  1242.     LDA    HELP$LEVEL    ; GET OLD LEVEL
  1243.     INR    A    ; SET NEW LEVEL
  1244.     STA    HELP$LEVEL
  1245.  
  1246. *  SET UP FCB FOR NEW FILE
  1247.     LXI    D,LOADING$MSG
  1248.     CALL    PRINT$MESSAGE
  1249.     POP    H    ; GET PTR TO NEW FILE NAME
  1250.     LXI    D,FCB+1    ; PT TO FCB NAME
  1251.     MVI    B,8    ; 8 CHARS MAX
  1252.     CALL    LOAD$FCB    ; PLACE INTO FCB WITH ERROR CHECKING
  1253.     MVI    A,'.'    ; DECIMAL BETWEEN FILE NAME AND TYPE
  1254.     CALL    CHAR$OUT
  1255.     MVI    B,3    ; 3 CHARS MAX FOR TYPE
  1256.     CALL    LOAD$FCB    ; PLACE INTO FCB WITH ERROR CHECKING
  1257.     CALL    CRLF1    ; NEW LINE
  1258.     JMP    START1    ; LOAD NEW HELP FILE
  1259.  
  1260. *
  1261. *  LOAD FCB PTED TO BY DE WITH "NORMAL" FILE NAME PTED TO BY HL FOR B BYTES
  1262. *
  1263. LOAD$FCB:
  1264.     MOV    A,M    ; GET CHAR
  1265.     INX    H    ; PT TO NEXT
  1266.     CPI    '.'    ; DONE IF DECIMAL
  1267.     JZ    LOAD$FCB$FILL
  1268.     CPI    ' '+1    ; DONE IF < <SP>
  1269.     JC    LOAD$FCB$FILL
  1270.     CALL    CAPS    ; CAPITALIZE
  1271.     CALL    CHAR$OUT    ; PRINT FILE NAME AND TYPE
  1272.     STAX    D    ; STORE CHAR
  1273.     INX    D    ; PT TO NEXT
  1274.     DCR    B
  1275.     JNZ    LOAD$FCB
  1276.     MOV    A,M    ; CHECK FOR ERROR
  1277.     ANI    7FH    ; MASK MSB
  1278.     INX    H    ; PT TO NEXT CHAR
  1279.     CPI    '.'    ; OK IF '.'
  1280.     RZ
  1281.     CPI    ' '+1    ; OK IF <SP>
  1282.     RC
  1283.     LXI    D,LOADERR
  1284.     CALL    PRINT$MESSAGE
  1285.     JMP    HELP$EXIT
  1286. LOAD$FCB$FILL:
  1287.     MOV    C,A    ; SAVE CHAR THAT TERMINATED STRING
  1288. LOAD$FCB$LOOP:
  1289.     MVI    A,' '    ; <SP> FILL REST OF FCB
  1290.     STAX    D    ; STORE <SP>
  1291.     INX    D    ; PT TO NEXT
  1292.     DCR    B
  1293.     JNZ    LOAD$FCB$LOOP
  1294.     MOV    A,C    ; GET CHAR THAT TERMINATED STRING
  1295.     RET
  1296.  
  1297. *
  1298. *  GO TO ROOT
  1299. *
  1300. GO$ROOT:
  1301.     LDA    HELP$LEVEL    ; AT ROOT?
  1302.     ORA    A    ; 0=YES
  1303.     JZ    HELP    ; RETURN TO HELP
  1304.     MVI    A,0    ; SET ROOT INDEX
  1305.     JMP    GORET
  1306.  
  1307. *
  1308. *  RETURN TO PREVIOUS HELP LEVEL
  1309. *
  1310. LEVEL$RETURN:
  1311.     LDA    HELP$LEVEL    ; ARE WE AT THE LOWEST LEVEL?
  1312.     ORA    A    ; 0=YES
  1313.     JNZ    LRET
  1314.     LXI    D,LRETERR
  1315.     CALL    PRINT$MESSAGE
  1316.     JMP    HELP
  1317.  
  1318. *  SET NEW HELP LEVEL
  1319. LRET:
  1320.     DCR    A    ; DOWN 1
  1321.  
  1322. *  GO TO HELP LEVEL INDEXED IN A
  1323. GORET:
  1324.     STA    HELP$LEVEL    ; SET NEW HELP LEVEL
  1325.     CALL    COMP$HELP$NAME$PTR    ; HL=POINTER TO TARGET HELP FILE NAME
  1326.     PUSH    H    ; SAVE PTR TO FILE NAME
  1327.     LXI    D,LOADING$MSG    ; PRINT NAME OF FILE TO BE LOADED
  1328.     CALL    PRINT$MESSAGE
  1329.     MVI    B,8    ; 8 CHARS TO FILE NAME
  1330. GORET$NAME:
  1331.     MOV    A,M    ; GET CHAR
  1332.     CPI    ' '    ; END OF NAME?
  1333.     INX    H    ; PT TO NEXT
  1334.     JZ    GORET$NAME0
  1335.     CALL    CHAR$OUT    ; PRINT FILE NAME
  1336.     DCR    B
  1337.     JNZ    GORET$NAME
  1338.     JMP    GORET$NAME1
  1339. GORET$NAME0:
  1340.     DCR    B    ; COUNT DOWN
  1341.     JZ    GORET$NAME1
  1342.     INX    H    ; SKIP NEXT SPACE
  1343.     JMP    GORET$NAME0
  1344. GORET$NAME1:
  1345.     MVI    A,'.'    ; PRINT DECIMAL
  1346.     CALL    CHAR$OUT
  1347.     MVI    B,3    ; PRINT FILE TYPE
  1348. GORET$NAME2:
  1349.     MOV    A,M    ; GET CHAR
  1350.     INX    H    ; PT TO NEXT
  1351.     CALL    CHAR$OUT    ; PRINT IT
  1352.     DCR    B
  1353.     JNZ    GORET$NAME2
  1354.     CALL    CRLF1    ; NEW LINE
  1355.     POP    H    ; GET PTR TO FILE NAME
  1356.     LXI    D,FCB+1    ; COPY ELEMENT INTO FCB
  1357.     MVI    B,11    ; 11 BYTES
  1358.     CALL    MOVE
  1359.     JMP    START1    ; LOAD ENTRY
  1360.  
  1361. *
  1362. *  COMPUTE POINTER TO HELP NAME ENTRY INDEXED BY HELP LEVEL IN A
  1363. *
  1364. COMP$HELP$NAME$PTR:
  1365.     CALL    COMP$OFFSET    ; COMPUTE OFFSET IN TABLE
  1366.     LXI    D,HELP$NAME$STACK    ; PT TO BASE OF HELP NAMES
  1367.     DAD    D    ; ADD IN OFFSET
  1368.     RET
  1369.  
  1370. *
  1371. *  COMPUTE OFFSET INTO TABLE BASED ON INDEX A
  1372. *    OFFSET = A * 11
  1373. *
  1374. COMP$OFFSET:
  1375.     MOV    L,A    ; VALUE IN HL
  1376.     MVI    H,0
  1377.     MOV    E,L    ; DE=HL
  1378.     MOV    D,H
  1379.  
  1380.     DAD    H    ; *2
  1381.     DAD    H    ; *4
  1382.     DAD    H    ; *8
  1383.     DAD    D    ; *9
  1384.     DAD    D    ; *10
  1385.     DAD    D    ; *11
  1386.     RET
  1387.  
  1388. *
  1389. *  PRINT LEVEL NUMBER
  1390. *
  1391. PR$LEVEL:
  1392.     LDA    HELP$LEVEL    ; DON'T PRINT LEVEL 0
  1393.     ORA    A    ; 0?
  1394.     JZ    PR$FRAME
  1395.     LXI    D,LEVEL$MESSAGE    ; PRINT HEADER
  1396.     CALL    PRINT$MESSAGE
  1397.     LDA    HELP$LEVEL    ; GET NUMBER
  1398.     CALL    PR$DEC        ; PRINT AS DECIMAL
  1399.     LXI    D,LEVEL2$MESSAGE    ; PRINT END HEADER
  1400.     CALL    PRINT$MESSAGE
  1401. PR$FRAME:
  1402.     LDA    FRAME$NUMBER    ; GET CURRENT FRAME NUMBER
  1403.     ORA    A    ; SET FLAGS
  1404.     RZ        ; NO FRAME?
  1405.     CALL    PR$DEC    ; PRINT AS DECIMAL
  1406.     LXI    D,LEVEL3$MESSAGE
  1407.     CALL    PRINT$MESSAGE
  1408.     RET
  1409. *  PRINT A AS DECIMAL
  1410. PR$DEC:
  1411.     PUSH    PSW    ; SAVE VALUE
  1412.     XRA    A
  1413.     STA    LD$SPACE
  1414.     POP    PSW    ; GET VALUE
  1415.     MVI    B,100    ; PRINT 100'S
  1416.     CALL    PDEC
  1417.     MVI    B,10    ; PRINT 10'S
  1418.     CALL    PDEC
  1419.     ADI    '0'    ; PRINT 1'S
  1420.     JMP    CHAR$OUT
  1421. PDEC:
  1422.     MVI    C,0    ; SET VALUE
  1423. PDEC1:
  1424.     SUB    B    ; SUBTRACT POWER
  1425.     JC    PDEC2
  1426.     INR    C    ; INCREMENT VALUE
  1427.     JMP    PDEC1
  1428. PDEC2:
  1429.     ADD    B    ; ADD POWER BACK IN
  1430.     MOV    B,A    ; SAVE A IN B
  1431.     LDA    LD$SPACE    ; GET LEADING <SP> FLAG
  1432.     ORA    A    ; NON-ZERO=PRINT
  1433.     JNZ    PDEC3
  1434.     MOV    A,C    ; GET DIGIT
  1435.     STA    LD$SPACE    ; NEW FLAG
  1436.     ORA    A    ; ZERO?
  1437.     JNZ    PDEC3    ; PRINT BYTE IN C
  1438.     MVI    A,' '    ; PRINT LEADING SPACE
  1439.     JMP    PDEC4
  1440. PDEC3:
  1441.     MOV    A,C    ; GET VALUE
  1442.     ADI    '0'    ; CONVERT TO ASCII
  1443. PDEC4:
  1444.     CALL    CHAR$OUT    ; PRINT CHAR
  1445.     MOV    A,B    ; RESTORE A
  1446.     RET
  1447.  
  1448. *********************************************************
  1449. *  MESSAGE AND BUFFER SECTION                *
  1450. *********************************************************
  1451.  
  1452. HELPMS:
  1453.     DB    'HELP for ZCPR2, Version '
  1454.     DB    (VERS/10)+'0','.',(VERS MOD 10)+'0',CR,LF,'$'
  1455. HELP$DEF$MSG:
  1456.     DB    CR,LF,'Default HELP Facility Invoked'
  1457.     DB    CR,LF,'    Available HELP Files are --',CR,LF,'$'
  1458. HELP$EDEF$MSG:
  1459.     DB    CR,LF,'    Type Any Character for Default Info (^C to Abort) - $'
  1460. SELECTMS:
  1461.     DB    CR,LF,'  HELP File Selections are --',CR,LF,'$'
  1462. ENDMS:
  1463.     DB    'EOI '
  1464. PAGEMS:
  1465.     DB    '^C=Exit $'        ; ABORT TO CP/M CHAR
  1466. PAGE1MS:
  1467.     DB    LEVEL$RET$CHAR,'=Level '    ; RETURN TO HIGHER NODE
  1468.     DB    ROOT$CHAR,'=Root $'        ; RETURN TO ROOT
  1469. PAGE2MS:
  1470.     DB    MENU$CHAR,'=Menu '    ; ABORT TO MENU CHAR
  1471.     DB    START$CHAR,'=Start '    ; JUMP TO START OF INFORMATION CHAR
  1472.     DB    BACKUP$CHAR,'=Last '    ; BACK UP TO PREVIOUS FRAME CHAR
  1473.     DB    PRINT$CHAR,'=Print '    ; PRINT CURRENT INFO SECTION
  1474. ;    DB    'CR=Next '
  1475.     DB    '$'
  1476. PRINT$LMSG:
  1477.     DB    'Printing in Progress -- Strike ^C to Abort $'
  1478. PRINT$WAIT$MSG:
  1479.     DB    'Please Set Top-of-Form on Printer'
  1480.     DB    CR,LF,'  Strike S to Print this Screen Only, ^C to Abort, or'
  1481.     DB    CR,LF,'Any Other Char to Print Entire Information Section - $'
  1482. WILD$ERR:
  1483.     DB    CR,LF,'HELP FATAL ERROR -- File Name Contains Wild Card$'
  1484. ERR1:
  1485.     DB    CR,LF,'HELP FATAL ERROR -- File not Found$'
  1486. ERR2:
  1487.     DB    CR,LF,'HELP ERROR -- Invalid Response',CR,LF,'$'
  1488. ERR3:
  1489.     DB    CR,LF,'HELP ERROR -- EOF on HELP File',CR,LF,'$'
  1490. BACKERR:
  1491.     DB    CR,LF,'HELP ERROR -- Not Possible to Backup Before Start of '
  1492.     DB    'Info',CR,LF,'$'
  1493. LEVELERR:
  1494.     DB    CR,LF,'HELP ERROR -- Node Level Limit Reached -- Aborting'
  1495.     DB    CR,LF,'$'
  1496. LOADERR:
  1497.     DB    CR,LF,'HELP ERROR -- Invalid File Name in Load',CR,LF,'$'
  1498. LRETERR:
  1499.     DB    CR,LF,'HELP ERROR -- No Higher Level to Return to',CR,LF,'$'
  1500. READERR:
  1501.     DB    CR,LF,'HELP ERROR -- Not Enough Room for HELP File',CR,LF,'$'
  1502. LEVEL$MESSAGE:
  1503.     DB    'Level $'
  1504. LEVEL2$MESSAGE:
  1505.     DB    '/ $'
  1506. LEVEL3$MESSAGE:
  1507.     DB    ': $'
  1508. PROMPT1$MESSAGE:
  1509.     DB    'Type  ^C=Exit$'
  1510. PROMPT2$MESSAGE:
  1511.     DB    ' ',LEVEL$RET$CHAR,'=Level '
  1512.     DB    ROOT$CHAR,'=Root$'
  1513. PROMPT3$MESSAGE:
  1514.     DB    ' or Enter Selection $'
  1515. LOADING$MSG:
  1516.     DB    CR,LF,'Loading HELP File $'
  1517.  
  1518. LFR$FLAG:
  1519.     DS    1    ; LIST FRAME ONLY FLAG (FOR PRINT FUNCTION)
  1520. CUR$USER:
  1521.     DS    1    ; NUMBER OF CURRENT USER
  1522. TPA$END:
  1523.     DS    1    ; END PAGE ADDRESS OF TPA
  1524. START$OF$INFO:
  1525.     DS    2    ; PTR TO START OF CURRENT INFORMATION BLOCK
  1526. START$OF$FRAME:
  1527.     DS    2    ; PTR TO START OF CURRENT FRAME
  1528. SEL$CHAR:
  1529.     DS    1    ; SELECTION TABLE OPTION CHAR
  1530. FIRST$ENTRY:
  1531.     DS    2    ; PTR TO FIRST ENTRY OF INFORMATION SECTION
  1532. LINE$CNT:
  1533.     DS    1    ; LINE COUNT BUFFER
  1534. NAME$COUNT:
  1535.     DS    1    ; COUNT OF FILE NAMES/LINE
  1536. DFFLG:
  1537.     DS    1    ; DEFAULT FILE FLAG (0=NOT SEARCH FOR, 1=YES)
  1538. NEXT$ADR:
  1539.     DS    2    ; NEXT LOAD ADDRESS
  1540. LD$SPACE:
  1541.     DS    1    ; LEADING SPACE FLAG FOR DECIMAL PRINT
  1542. HELP$LEVEL:
  1543.     DS    1    ; NUMBER OF HELP LEVEL CURRENT NODE IS AT (0=BOTTOM)
  1544. FRAME$NUMBER:
  1545.     DS    1    ; NUMBER OF CURRENT FRAME
  1546.  
  1547. HELP$NAME$STACK:
  1548.     DS    11*HELP$MAX    ; STACK OF HELP FILE NAMES OF EACH LEVEL
  1549.  
  1550.     DS    80    ; STACK SPACE
  1551. STACK:
  1552.     DS    2    ; CP/M STACK PTR
  1553.  
  1554. *
  1555. *  Help Files are Loaded Here
  1556. *
  1557. HELP$BUF    equ    $
  1558.  
  1559.     END
  1560.  
  1561.  
  1562.