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