home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / help / help20.lbr / HELP20.AQM / HELP20.ASM
Encoding:
Assembly Source File  |  1985-06-17  |  38.3 KB  |  1,465 lines

  1. *  PROGRAM NAME:  HELP
  2. *  AUTHOR:  RICHARD CONN
  3. *  DATE:  30 OCT 81
  4. *  VERSION:  2.0
  5. *  PREVIOUS VERSIONS:  1.8 (18 OCT 81), 1.7 (10 SEP 81), 1.6 (9 SEP 81)
  6. *  PREVIOUS VERSIONS:  1.5 (9 SEP 81), 1.4 (8 SEP 81), 1.3 (8 SEP 81)
  7. *  PREVIOUS VERSIONS:  1.2 (7 SEP 81), 1.1 (6 OCT 80), 1.0 (18 NOV 79)
  8.  
  9. VERS    EQU    20    ; VERSION NUMBER
  10.  
  11. *****************************************************************
  12. *                                *
  13. *  HELP -- DISPLAY HELP FILE INFORMATION TO USER ON CON:    *
  14. *                                *
  15. *  -- Command Format --                        *
  16. *    THE HELP COMMAND IS OF THE GENERAL FORM:        *
  17. *        HELP <FILENAME>.<TYP>                *
  18. *                                *
  19. *    <FILENAME>.<TYP> IS OPTIONAL; IF OMITTED COMPLETELY,    *
  20. * 'HELP.HLP' IS ASSUMED; IF JUST <TYP> IS OMITTED, FILE TYPE    *
  21. * IS ASSUMED TO BE '.HLP'                    *
  22. *                                *
  23. *  -- Basic Background Information --                *
  24. *    THE HELP COMMAND DISPLAYS THE INFORMATION IN A HELP    *
  25. * FILE TO THE USER.  THERE ARE TWO BASIC TYPES OF HELP FILES --    *
  26. * (1) INDEXED AND (2) NON-INDEXED.  INDEXED HELP FILES ARE     *
  27. * THOSE WHICH CONTAIN SEVERAL SECTIONS; THE INDIVIDUAL MAY    *
  28. * READ ALL OF SUCH A HELP FILE OR JUST SELECTED SECTIONS OF    *
  29. * THIS FILE.  NON-INDEXED HELP FILES CONTAIN ONLY ONE SECTION.    *
  30. *    STRUCTURALLY SPEAKING, HELP FILES CONSIST OF TWO PARTS:    *
  31. * THE HEADER PART AND THE INFORMATION PART.  THE INFORMATION    *
  32. * PART OF A HELP FILE BEGINS WITH A LINE WHOSE FIRST CHARACTER    *
  33. * IS A COLON.  THE TITLE OF THE INFORMATION SECTION IS ON THIS    *
  34. * LINE.  THE INFORMATION SECTION CONTINUES UNTIL THE NEXT    *
  35. * INFORMATION SECTION (LINE STARTING WITH A COLON) OR THE END    *
  36. * OF THE FILE IS ENCOUNTERED.  THE HEADER PART CONSISTS OF A    *
  37. * GROUP OF LINES BEFORE THE FIRST INFORMATION SECTION.  IF THE    *
  38. * FIRST LINE OF A HELP FILE STARTS WITH A COLON, THEN THERE IS    *
  39. * NO HEADER PART, AND THE HELP FILE IS DUMPED AS ONE        *
  40. * INFORMATION SECTION.                        *
  41. *    THE INFORMATION SECTION IS ITSELF DIVIDED INTO PARTS,    *
  42. * CALLED FRAMES.  A FRAME IS ONE SCREEN DISPLAY, THE SIZE OF    *
  43. * WHICH IS SET BY AN EQUATE.  IF THE HELP FILE CONTAINS A FORM    *
  44. * FEED CHARACTER, THEN THE CURRENT FRAME IS ABRUPTLY TERMINATED    *
  45. * AND THE RESET OF THE SCREEN DISPLAY IS FILLED WITH BLANK    *
  46. * LINES.  OTHERWISE, WHEN THE INDICATED NUMBER OF LINES HAVE    *
  47. * BEEN DISPLAYED, THE HELP PROGRAM PAUSES TO ALLOW THE USER TO    *
  48. * VIEW THE INFORMATION AND SELECT THE NEXT DIRECTION IN WHICH    *
  49. * TO GO.                            *
  50. *                                *
  51. *  -- Traversing the HELP File --                *
  52. *    WHILE IN THE HELP SYSTEM, THE USER IS GIVEN SEVERAL    *
  53. * OPTIONS AT ALL TIMES AS TO WHAT HE CAN DO.            *
  54. *    AT THE MENU LEVEL OF INDEXED HELP FILES, THE USER CAN    *
  55. * MOVE IN THE FOLLOWING DIRECTIONS:                *
  56. *        1. SELECTION OF A MENU ITEM, IN WHICH CASE    *
  57. * HE ENTERS THAT INFORMATION SECTION                *
  58. *        2. MOVE UP TO THE PREVIOUS LEVEL.  IF THE HELP    *
  59. * FILE THE USER IS IN WAS REACHED THROUGH ANOTHER HELP FILE,    *
  60. * THE USER CAN RETURN TO THAT HELP FILE (MOVE UP A LEVEL).    *
  61. * IF THE USER WAS IN THE "SELECT ALL ITEMS" MODE, HE CONTINUES    *
  62. * WITH THE PREVIOUS HELP FILE WHERE HE LEFT OFF; IF THE USER    *
  63. * WAS LOOKING AT A SPECIFIC MENU ITEM (WHICH CALLED THE HELP    *
  64. * FILE HE IS IN NOW), HE IS RETURNED TO THE MENU OF THE CALLING    *
  65. * HELP FILE.                            *
  66. *        3. EXIT TO CP/M.  AT ALL TIMES, THE USER IS    *
  67. * ALLOWED TO RETURN TO CP/M.                    *
  68. *    WHILE IN AN INFORMATION SECTION, THE USER MAY        *
  69. * MOVE IN THE FOLLOWING DIRECTIONS:                *
  70. *        1. FORWARD TO THE NEXT FRAME.  IF AT THE END    *
  71. * OF THE INFORMATION SECTION, THIS RETURNS THE USER TO THE    *
  72. * MENU IF IT IS AN INDEXED HELP FILE, TO CP/M IF THE USER IS    *
  73. * IN A NON-INDEXED HELP FILE AT LEVEL 0 (NOT CALLED BY ANOTHER    *
  74. * HELP FILE), OR TO THE CALLING HELP FILE IF NOT AT LEVEL 0.    *
  75. *        2. BACKWARD TO THE PREVIOUS FRAME.  IF AT THE    *
  76. * BEGINNING OF AN INFORMATION SECTION, AN ERROR MESSAGE IS    *
  77. * PRINTED.                            *
  78. *        3. TO THE MENU IF IN AN INDEXED HELP FILE.    *
  79. *        4. TO THE START OF THE CURRENT INFORMATION    *
  80. * SECTION DIRECTLY.                        *
  81. *        5. TO THE PREVIOUS LEVEL (CALLING HELP FILE).    *
  82. *                                *
  83. *  -- Nodes and Help File Nesting --                *
  84. *    AN INFORMATION SECTION MAY BEGIN WITH A DOUBLE COLON    *
  85. * (::), AND THIS DESIGNATOR IS FOLLOWING BY THE FILE NAME OF A    *
  86. * HELP FILE WHICH IS TO BE LOADED AS A NODE.  NODES TO THE HELP    *
  87. * PROGRAM ARE COMPLETE HELP FILES IN THEMSELVES, AND THEY MAY    *
  88. * REFER TO OTHER NODES AS WELL.  IN THIS WAY, A TREE STRUCTURE    *
  89. * MAY BE DESIGNED BY THE AUTHOR OF A HELP FILE, EACH NODE OF    *
  90. * THE TREE BEING A HELP FILE IN ITS OWN RIGHT (WHICH MAY BE    *
  91. * ACCESSED INDEPENDENTLY).  NODES MAY BE NESTED A NUMBER OF    *
  92. * LEVELS, SPECIFIED BY THE HELP$MAX EQUATE.            *
  93. *    TO VIEW THIS CONCEPT MORE CLEARLY, THE FOLLOWING DIAGRAM*
  94. * IS OFFERED:                            *
  95. *        -- Basic HELP File --                *
  96. * :Info Sect 1    :Info Sect 2    :Info Sect 3    :Info Sect 4 :    *
  97. * : Text    : HELP File    : Text        : HELP File  :    *
  98. *           /      \               /    \    *
  99. *        -- SubHelp File 1 --        -- SubHelp File 2 --*
  100. *    :Info Sect 1 :Info Sect 2 :    :Info Sect 1 :Info Sect2*
  101. *    : Text         : HELP File  :    : Text         : Text    *
  102. *            /    \                    *
  103. *        -- SubSubHelp File 1 --                *
  104. *    :Info Sect 1 :Info Sect 2 :Info Sect 3 :        *
  105. *    : Text         : HELP File  : HELP File  :        *
  106. *            /  \         /    \            *
  107. *    -- Sub3Help File 1 --  -- Sub3Help File 2 --        *
  108. *    :Info Sect :        :Info Sect 1 :Info Sect 2:    *
  109. *    : Text     :        : Text         : HELP File :    *
  110. *                        /    \        *
  111. *                    -- Sub4Help File --    *
  112. *                :Info Sect 1 :Info Sect 2:    *
  113. *                : Text         : Text     :    *
  114. *                                *
  115. *    AS THE USER CAN SEE, TREE STRUCTURES ARE NOW POSSIBLE.    *
  116. * ONE HELP FILE CAN REFERENCE ANOTHER WHICH INTURN REFERENCES    *
  117. * ANOTHER AND SO ON.  THERE IS A LIMIT TO HOW DEEP THE NESTING    *
  118. * MAY GO, AND THAT IS SPECIFIED IN THE EQUATE FOR HELP$MAX.    *
  119. *                                *
  120. *  -- What Help Can Do --                    *
  121. *    SINCE A HELP FILE MUST BE MEMORY RESIDENT, THIS IS    *
  122. * CONVENIENT IN TWO WAYS:  (1) "MASTER" HELP FILES MAY BE    *
  123. * CREATED WHICH REFERENCE OTHER HELP FILES, AND THE INFORMATION    *
  124. * ACCESSED FROM A MASTER HELP FILE MAY ENCOMPASS ALL OF THE    *
  125. * USER'S HELP FILE AND (2) IF THE USER NEEDS INFORMATION    *
  126. * IN A SPECIFIC SUBJECT AREA AND KNOWS WHICH HELP FILE REFERS    *
  127. * TO THE INFORMATION HE NEEDS, HE NEED NOT LOAD THE MASTER    *
  128. * AND THEN TRAVERSE THE TREE TO THE INFORMATION HE NEEDS; HE    *
  129. * MAY SPECIFY THE SPECIFIC HELP FILE DIRECTLY.            *
  130. *                                *
  131. *  -- Command-Search Hierarchy --                *
  132. *    ONE OTHER POINT TO NOTE IS THAT THE HELP PROGRAM NOW    *
  133. * EMPLOYS A COMMAND-SEARCH HIERARCHY IN LOCATING A REFERENCED    *
  134. * HELP FILE.  ONCE A FILE SPECIFICATION IS GIVEN, THE HELP    *
  135. * PROGRAM SEARCHES THE CURRENT USER AREA ON THE CURRENT DISK FOR*
  136. * THE FILE; IF NOT FOUND, IT DROPS TO USER AREA 0 (MAY BE    *
  137. * CHANGED) ON THE CURRENT DISK IF THE USER IS NOT ALREADY THERE    *
  138. * AND LOOKS FOR THE FILE; IF NOT FOUND THIS TIME, IT DROPS TO    *
  139. * USER AREA 0 OF THE DISK ON DRIVE A: AND SEARCHES FOR THE FILE.*
  140. * IF NOT FOUND AT THIS POINT, HELP CHECKS TO SEE IF THE REFER-    *
  141. * ENCED FILE WAS HELP.HLP, IN WHICH CASE IT PRESENTS THE BUILT-    *
  142. * IN DOCUMENTATION (SEE END OF PROGRAM); FINALLY, IF NONE OF THE*
  143. * ABOVE ARE TRUE, HELP ABORTS WITH AN ERROR MESSAGE.        *
  144. *                                *
  145. *  -- HELP File Structure Warning --                *
  146. *    THERE MUST BE THE SAME NUMBER OF LINES IN THE HEADER    *
  147. * PART AS THERE ARE INFORMATION SECTIONS.  IF NOT, A HELP    *
  148. * FILE ERROR WILL BE ISSUED IF THE HELP COMMAND ATTEMPTS TO    *
  149. * READ BEYOND THE END OF THE HELP FILE IN ITS SEARCH FOR AN    *
  150. * INFORMATION SECTION.                        *
  151. *                                *
  152. *****************************************************************
  153.  
  154.  
  155. *****************************************************************
  156. *                                *
  157. *  THE HELP PROGRAM IS COMPLETELY TRANSPORTABLE BETWEEN CP/M    *
  158. *  SYSTEMS.                            *
  159. *                                *
  160. *****************************************************************
  161.  
  162.  
  163.  
  164. *****************************************************************
  165. *  CP/M AND BASIC CHARACTER DEFINITIONS                *
  166. *****************************************************************
  167.  
  168. FALSE        EQU    0
  169. TRUE        EQU    NOT FALSE
  170.  
  171. BDOS        EQU    5    ; ADDRESS OF BDOS ENTRY POINT
  172. FCB        EQU    5CH    ; ADDRESS OF FILE CONTROL BLOCK
  173. BUFF        EQU    80H    ; ADDRESS OF DMA BUFFER
  174.  
  175. CR        EQU    0DH    ; <CR>
  176. LF        EQU    0AH    ; <LF>
  177. FF        EQU    'L'-40H    ; CTRL-L = FORM FEED
  178. CTRLZ        EQU    'Z'-40H    ; CTRL-Z
  179. CTRLC        EQU    'C'-40H    ; CTRL-C
  180.  
  181. *****************************************************************
  182. *  SPECIAL CONTROL CHARACTERS WHICH MAY BE RESET BY USER    *
  183. *****************************************************************
  184.  
  185. SECT$CHAR    EQU    ':'    ; DEFINED TO BE COLON
  186. BACKUP$CHAR    EQU    'L'    ; BACK UP TO PREVIOUS FRAME CHAR
  187. START$CHAR    EQU    'S'    ; JUMP TO START OF INFORMATION CHAR
  188. MENU$CHAR    EQU    'M'    ; CHAR TO ABORT TO MENU
  189. CPM$ABORT$CHAR    EQU    CTRLC    ; CHAR TO ABORT TO CP/M
  190. LEVEL$RET$CHAR    EQU    '^'    ; RETURN TO PREVIOUS HELP LEVEL
  191. ROOT$CHAR    EQU    '.'    ; RETURN TO ROOT OF HELP
  192.  
  193. *****************************************************************
  194. *  USER CUSTOMIZATION -- LINES PER SCREEN DISPLAY        *
  195. *****************************************************************
  196.  
  197. LINES$PER$SCREEN    EQU    24    ; ASSUME 24 LINES/SCREEN
  198.  
  199. *******************************************************************
  200. *  USER CUSTOMIZATION -- NUMBER OF FILES NAMES PER LINE ON SCREEN *
  201. *******************************************************************
  202.  
  203. NAMES$PER$LINE        EQU    6    ; 6 NAMES (SPACE = 6*11 COLS)
  204.  
  205. *****************************************************************
  206. *  USER CUSTOMIZATION -- DEFAULT USER NUMBER            *
  207. *****************************************************************
  208.  
  209. DEFAULT$USER        EQU    0    ; DEFAULT USER NUMBER = 0
  210.  
  211. *****************************************************************
  212. *  USER CUSTOMIZATION -- DEFAULT DISK                *
  213. *****************************************************************
  214.  
  215. DEFAULT$DISK        EQU    'A'    ; DEFAULT DISK = A:
  216.  
  217. *****************************************************************
  218. *  USER CUSTOMIZATION -- ALL HELP FILES MUST BE OF TYPE 'HLP'    *
  219. *****************************************************************
  220.  
  221. FORCE$HLP        EQU    TRUE     ; TRUE IF FILES MUST BE OF TYPE HLP
  222.  
  223. *********************************************************************
  224. *  USER CUSTOMIZATION -- IF NO HELP FILE GIVEN, SEARCH FOR HELP.HLP *
  225. *********************************************************************
  226.  
  227. DEFAULT$HELP$HLP    EQU    FALSE    ; TRUE IF SEARCH FOR HELP.HLP
  228.  
  229. *****************************************************************
  230. *  USER CUSTOMIZATION -- NUMBER OF NODES (LEVELS) IN HELP TREE    *
  231. *****************************************************************
  232.  
  233. HELP$MAX        EQU    10    ; DEFAULT = 10 (SPACE=11*HELP$MAX)
  234.  
  235.  
  236.  
  237. *****************************************************************
  238. *  START OF PROGRAM                        *
  239. *****************************************************************
  240.  
  241.     ORG    100H
  242.  
  243. START:
  244.     LXI    H,0    ; GET SP
  245.     DAD    SP
  246.     SHLD    STACK
  247.     LXI    SP,STACK    ; NEW STACK
  248.     MVI    A,0FFH    ; SET NO CHANGE
  249.     STA    CUR$DISK    ; TO CALLING DISK
  250.     STA    CUR$USER    ; OR TO CALLING USER
  251.     LXI    D,BUFF        ; SET DMA ADDRESS
  252.     MVI    C,26
  253.     CALL    BDOS
  254.     LDA    BDOS+2    ; BASE PAGE OF BDOS
  255.     SUI    10    ; 2K + 2 PAGES
  256.     STA    TPA$END
  257.     XRA    A    ; A=0
  258.     STA    DFFLG    ; TURN OFF DEFAULT FILE FLAG
  259.     STA    HELP$LEVEL    ; SET HELP LEVEL TO 0 (NO RETURN FILE)
  260.     LXI    D,HELPMS    ; PRINT OPENING MSG
  261.     CALL    PRINT$MESSAGE
  262.     LXI    H,FCB+1    ; CHECK FOR FILE NAME
  263.     MOV    A,M
  264.     CPI    ' '    ; NONE?
  265.     JZ    DEFAULT$FN
  266.     ORA    A    ; ALSO NONE
  267.     JNZ    START1
  268.  
  269. *  INSERT 'HELP.HLP' INTO FCB OR CLEAR FCB
  270. DEFAULT$FN:
  271.  
  272.     IF    DEFAULT$HELP$HLP    ; IF SEARCH FOR DEFAULT HELP.HLP ON
  273.     DCX    H    ; PT TO FCB
  274.     LXI    D,DEFFN
  275.     MVI    B,12    ; 12 BYTES
  276.     XCHG
  277.     CALL    MOVE    ; MOVE (HL) TO (DE) FOR (B) BYTES
  278.     ENDIF
  279.  
  280.     IF    NOT DEFAULT$HELP$HLP    ; IF NO SEARCH FOR DEFAULT HELP.HLP
  281.     MVI    A,' '    ; <SP> FILL
  282.     MVI    B,11    ; 11 BYTES
  283. FILL:
  284.     MOV    M,A    ; STORE <SP>
  285.     INX    H    ; PT TO NEXT
  286.     DCR    B    ; COUNT DOWN
  287.     JNZ    FILL
  288.     ENDIF
  289.  
  290.     MVI    A,1    ; TURN ON DEFAULT FILE FLAG
  291.     STA    DFFLG
  292.  
  293. *  START/RESTART HELP PROGRAM (START ON INITIAL ENTRY, RESTART ON NODE LOAD)
  294. START1:
  295.     LXI    SP,STACK    ; SET STACK POINTER
  296.  
  297. *  CLEAR NON-NAME/TYPE BYTES IN FCB
  298.     LXI    H,FCB    ; INITIAL ZERO
  299.     MVI    M,0    ; STORE 0 FOR DRIVE (CURRENT LOGGED-IN)
  300.     LXI    D,12    ; SKIP TO EXTENT
  301.     DAD    D
  302.     MVI    B,24    ; FILL 24 BYTES
  303. FCB$FILL:
  304.     MVI    M,0    ; ZERO FILL
  305.     INX    H    ; PT TO NEXT
  306.     DCR    B    ; COUNT DOWN
  307.     JNZ    FCB$FILL
  308.  
  309. *  CHECK FOR WILD CARDS IN FILE NAME -- ERROR IF SO
  310.     LXI    H,FCB+1    ; PT TO FIRST BYTE OF FILE NAME
  311.     MVI    B,11    ; 11 BYTES
  312. FCB$WILD$CK:
  313.     MOV    A,M    ; GET BYTE
  314.     ANI    7FH    ; MASK
  315.     CPI    '?'    ; WILD?
  316.     JZ    FCB$WILD$ERROR
  317.     INX    H    ; PT TO NEXT
  318.     DCR    B    ; COUNT DOWN
  319.     JNZ    FCB$WILD$CK
  320.  
  321. *  CHECK FOR FILE TYPE
  322.     LXI    H,FCB+9    ; CHECK FOR FILE TYPE
  323.  
  324.     IF    NOT FORCE$HLP    ; IF FILE TYPE MAY NOT BE HLP
  325.     MOV    A,M    ; CHECK FOR FILE TYPE SPECIFIED
  326.     CPI    ' '    ; NONE?
  327.     JZ    DEFAULT$EXT
  328.     ORA    A    ; NONE ALSO
  329.     JNZ    START2
  330.     ENDIF
  331.  
  332. *  PLACE DEFAULT FILE TYPE OF '.HLP' IN FCB
  333. DEFAULT$EXT:
  334.     LXI    D,DEFTYP
  335.     MVI    B,3
  336.     XCHG
  337.     CALL    MOVE    ; MOVE (HL) TO (DE) FOR (B) BYTES
  338.  
  339. *  OPEN FILE
  340. START2:
  341.     LDA    FCB+1    ; CHECK FOR FILE NAME
  342.     CPI    ' '    ; NONE?
  343.     JZ    HELP$DEF    ; DISPLAY DEFAULT HELP INFO WITH FILE NAMES
  344.     MVI    A,0FFH    ; SET NO CHANGE FLAG
  345.     STA    CUR$USER    ; SET NO USER CHANGE
  346.     STA    CUR$DISK    ; SET NO DISK CHANGE
  347.  
  348. *  OPTION 1:  TRY TO OPEN FILE IN CURRENT USER NUMBER ON CURRENT DISK
  349.     LXI    D,FCB    ; PT TO FCB
  350.     MVI    C,15    ; OPEN FILE
  351.     CALL    BDOS
  352.     CPI    255    ; NOT PRESENT?
  353.     JNZ    START3
  354.     MVI    C,12    ; GET VERSION NUMBER
  355.     CALL    BDOS
  356.     MOV    A,H    ; CP/M 1.X?
  357.     ORA    L
  358.     JZ    START2$DISK    ; CHECK FOR DEFAULT DISK IF SO
  359.  
  360. *  OPTION 2:  TRY TO OPEN FILE IN USER 0 ON CURRENT DISK
  361.     MVI    E,0FFH    ; GET CURRENT USER NUMBER
  362.     MVI    C,32    ; GET/SET USER CODE
  363.     CALL    BDOS
  364.     CPI    DEFAULT$USER    ; CHECK IF AT USER 0 (OR DEFAULT USER)
  365.     JZ    START2$DISK    ; DON'T TRY IF AT USER 0
  366.     STA    CUR$USER    ; SAVE FOR LATER
  367.     MVI    E,DEFAULT$USER    ; SET USER 0 (OR DEFAULT USER)
  368.     MVI    C,32    ; GET/SET USER CODE
  369.     CALL    BDOS
  370.     LXI    D,FCB    ; TRY TO OPEN FILE AGAIN
  371.     MVI    C,15    ; OPEN FILE
  372.     CALL    BDOS
  373.     CPI    255    ; NOT PRESENT?
  374.     JNZ    START3
  375.  
  376. *  OPTION 3:  TRY TO OPEN FILE IN USER 0 ON DEFAULT DISK IF NOT CURRENT DISK
  377. START2$DISK:
  378.     MVI    C,25    ; DETERMINE CURRENT DISK
  379.     CALL    BDOS
  380.     CPI    DEFAULT$DISK-'A'    ; ON DEFAULT DISK?
  381.     JZ    START2$DEFAULT
  382.     STA    CUR$DISK    ; SAVE DISK NUMBER IN BYTE
  383.     MVI    E,DEFAULT$DISK-'A'    ; SELECT DISK A:
  384.     MVI    C,14    ; SELECT DISK
  385.     CALL    BDOS
  386.     LXI    D,FCB    ; TRY TO OPEN FILE ONE LAST TIME
  387.     MVI    C,15    ; OPEN FILE
  388.     CALL    BDOS
  389.     CPI    255    ; NOT PRESENT?
  390.     JNZ    START3
  391.  
  392. *  CHECK FOR DEFAULT FILE SEARCH
  393. START2$DEFAULT:
  394.     CALL    RESET$SYSTEM    ; RESTORE CURRENT DISK AND USER IF CHANGED
  395.     LDA    DFFLG    ; GET DEFAULT FILE FLAG
  396.     ORA    A    ; 1=YES, SEARCH FOR DEFAULT FAILED
  397.     JNZ    HELP$DEF    ; DISPLAY DEFAULT HELP FILE INFORMATION
  398.  
  399. *  FILE NOT FOUND -- FATAL ERROR
  400.     LXI    D,ERR1    ; FILE NOT FOUND
  401.     CALL    PRINT$MESSAGE
  402.     JMP    HELP$EXIT
  403.  
  404. *  FILE CONTAINS WILD CARDS -- FATAL ERROR
  405. FCB$WILD$ERROR:
  406.     LXI    D,WILD$ERR    ; WILD CARD
  407.     CALL    PRINT$MESSAGE
  408.     JMP    HELP$EXIT
  409.  
  410. *
  411. *  DISPLAY DEFAULT HELP FILE INFORMATION
  412. *
  413. HELP$DEF:
  414.     CALL    RESET$SYSTEM    ; RESET CALLING DISK/USER
  415.     LXI    D,HELP$DEF$MSG    ; PRINT MESSAGE
  416.     CALL    PRINT$MESSAGE
  417.     CALL    SET$COUNT    ; SET COUNTER
  418.     CALL    PRINT$HELP$FILES
  419.     MVI    C,12    ; GET VERSION NUMBER
  420.     CALL    BDOS
  421.     MOV    A,H    ; CP/M 1.X?
  422.     ORA    L
  423.     JZ    HELP$DEF1    ; CHECK FOR DEFAULT DISK IF SO
  424.  
  425. *  TRY TO OPEN FILE IN USER 0 ON CURRENT DISK
  426.     MVI    E,0FFH    ; GET CURRENT USER NUMBER
  427.     MVI    C,32    ; GET/SET USER CODE
  428.     CALL    BDOS
  429.     CPI    DEFAULT$USER    ; CHECK IF AT USER 0 (OR DEFAULT USER)
  430.     JZ    HELP$DEF1    ; DON'T TRY IF AT USER 0
  431.     STA    CUR$USER    ; SAVE FOR LATER
  432.     MVI    E,DEFAULT$USER    ; SET USER 0 (OR DEFAULT USER)
  433.     MVI    C,32    ; GET/SET USER CODE
  434.     CALL    BDOS
  435.     CALL    PRINT$HELP$FILES
  436.  
  437. *  SEARCH DEFAULT DISK IN DEFAULT USER FOR FILE NAMES
  438. HELP$DEF1:
  439.     MVI    C,25    ; DETERMINE CURRENT DISK
  440.     CALL    BDOS
  441.     CPI    DEFAULT$DISK-'A'    ; ON DEFAULT DISK?
  442.     JZ    HELP$DEF2
  443.     STA    CUR$DISK    ; SAVE DISK NUMBER IN BYTE
  444.     MVI    E,DEFAULT$DISK-'A'    ; SELECT DISK A:
  445.     MVI    C,14    ; SELECT DISK
  446.     CALL    BDOS
  447.     CALL    PRINT$HELP$FILES
  448.  
  449. *  DONE WITH SEARCH
  450. HELP$DEF2:
  451.     CALL    RESET$SYSTEM    ; RESET CALLING DISK/USER NUMBER
  452.     LXI    D,HELP$DEF$MSG1    ; PRINT END MESSAGE
  453.     CALL    PRINT$MESSAGE
  454.     CALL    CHAR$IN        ; GET ANY CHAR FOR RESPONSE
  455.     CPI    CTRLC        ; ABORT?
  456.     JZ    HELP$EXIT
  457.     JMP    HELP        ; PROCESS DEFAULT HELP FILE
  458.  
  459. *
  460. *  SET FILE NAME COUNTER
  461. *
  462. SET$COUNT:
  463.     MVI    A,NAMES$PER$LINE    ; NUMBER OF FILE NAMES/LINE
  464.     STA    NAME$COUNT
  465.     RET
  466.  
  467. *
  468. *  PRINT NAMES OF HELP FILES
  469. *
  470. PRINT$HELP$FILES:
  471.     LXI    H,FCB        ; MAKE FCB = *.HLP
  472.     MVI    M,0        ; BEGINNING 0 FOR DEFAULT DISK
  473.     MVI    B,8        ; FILL 8 ?'S
  474.     INX    H        ; PT TO FIRST CHAR
  475. PHF1:
  476.     MVI    M,'?'        ; '?' FILL
  477.     INX    H        ; PT TO NEXT
  478.     DCR    B        ; COUNT DOWN
  479.     JNZ    PHF1
  480.     LXI    D,DEFTYP    ; COPY DEFAULT FILE TYPE
  481.     MVI    B,3        ; 3 BYTES
  482.     XCHG            ; EXCHANGE
  483.     CALL    MOVE        ; COPY
  484.     XCHG            ; RESTORE PTR
  485.     MVI    B,24        ; FILL REST WITH 0'S
  486. PHF2:
  487.     MVI    M,0        ; 0 FILL
  488.     INX    H        ; PT TO NEXT
  489.     DCR    B        ; COUNT DOWN
  490.     JNZ    PHF2
  491.  
  492. *  SEARCH FOR FIRST FILE
  493.     LXI    D,FCB        ; PT TO FCB
  494.     MVI    C,17        ; SEARCH FOR FIRST
  495.     CALL    BDOS
  496.     CPI    0FFH        ; NONE?
  497.     RZ            ; DONE IF SO
  498.  
  499. *  PRINT CURRENT AND SEARCH FOR NEXT
  500. PHF3:
  501.     CALL    PRINT$HFN    ; PRINT HELP FILE NAME
  502.     LXI    D,FCB        ; PT TO FCB
  503.     MVI    C,18        ; SEARCH FOR NEXT
  504.     CALL    BDOS
  505.     CPI    0FFH        ; DONE?
  506.     JNZ    PHF3
  507.     RET
  508.  
  509. *
  510. *  PRINT NAME OF FILE WHOSE BUFF OFFSET IS IN A
  511. *
  512. PRINT$HFN:
  513.     RRC            ; A=A*32
  514.     RRC
  515.     RRC            ; RATHER THAN 5 LEFT, I DO 3 RIGHT (NEAT, HUH?)
  516.     ANI    60H        ; MASK ALL BUT INTERESTING PART
  517.     LXI    H,BUFF        ; PT TO BUFFER
  518.     ADD    L        ; PT TO ENTRY
  519.     MOV    L,A
  520.     MOV    A,H
  521.     ACI    0
  522.     MOV    H,A        ; HL PTS TO ENTRY
  523.     INX    H        ; HL PTS TO HELP FILE NAME
  524.     MVI    B,8        ; 8 CHARS
  525. PHFN1:
  526.     MOV    A,M        ; GET CHAR
  527.     ANI    7FH        ; MASK
  528.     INX    H        ; PT TO NEXT
  529.     CALL    CHAR$OUT    ; PRINT IT
  530.     DCR    B        ; COUNT DOWN
  531.     JNZ    PHFN1
  532.     MVI    A,' '        ; TRAILING SPACES
  533.     CALL    CHAR$OUT    ; 3 OF THEM
  534.     CALL    CHAR$OUT
  535.     CALL    CHAR$OUT
  536.     LDA    NAME$COUNT    ; COUNT DOWN
  537.     DCR    A
  538.     STA    NAME$COUNT
  539.     RNZ
  540.     CALL    SET$COUNT    ; RESET COUNT
  541.     CALL    CRLF        ; NEW LINE
  542.     RET
  543.  
  544. *
  545. *  LOAD HELP FILE INFORMATION
  546. *
  547. START3:
  548.     LXI    H,HELP$BUF    ; PT TO BUFFER
  549.     SHLD    NEXT$ADR    ; SET PTR
  550.  
  551. *  READ RECORDS UNTIL EOF
  552. START4:
  553.     CALL    READ$RECORD    ; READ INFO
  554.     ORA    A    ; DONE? 0=NO
  555.     JZ    START4
  556.     LXI    D,FCB    ; CLOSE FILE
  557.     MVI    C,16    ; CLOSE
  558.     CALL    BDOS
  559.     CALL    RESET$SYSTEM    ; RESTORE CURRENT DISK AND USER IF CHANGED
  560.  
  561. *
  562. *  START OF HELP PROGRAM
  563. *
  564. HELP:
  565.     LXI    SP,STACK    ; RESET STACK
  566.     MVI    A,0    ; SET NO FRAME
  567.     STA    FRAME$NUMBER
  568.     LXI    H,HELP$BUF    ; PT TO BUFFER
  569.     MOV    A,M    ; NO HEADER SECTION?
  570.     ANI    7FH    ; MASK OUT MSB
  571.     CPI    SECT$CHAR
  572.     JNZ    HELP1    ; HEADER SECTION EXISTS
  573.     CALL    PRINT$INFO    ; PRINT HELP INFO PTED TO BY HL
  574.     LDA    HELP$LEVEL    ; CHECK TO SEE IF WE ARE NOT AT LEVEL 0
  575.     ORA    A    ; 0=LEVEL 0
  576.     JZ    HELP$EXIT    ; ABORT IF SO
  577.     JMP    LEVEL$RETURN    ; GO TO PREVIOUS LEVEL IF NOT
  578.  
  579. *  EXIT POINT FOR ANY EXIT FROM THE REST OF THE HELP PROGRAM
  580. HELP$EXIT:
  581.     CALL    RESET$SYSTEM    ; RESET CALLING DISK/USER NUMBER
  582.     LHLD    STACK    ; GET CP/M SP
  583.     SPHL
  584.     RET        ; DONE
  585.  
  586. *  PRINT HEADER INFORMATION AND SELECT AN OPTION
  587. HELP1:
  588.     CALL    PRINT$HEADER    ; PRINT HEADER
  589.     PUSH    B    ; SAVE C (NUMBER OF VALID SELECTIONS)
  590.     CALL    CRLF1    ; NEW LINE
  591.     CALL    PR$LEVEL    ; PRINT LEVEL NUMBER
  592.     LXI    D,PROMPT1$MESSAGE    ; PRINT PROMPT
  593.     CALL    PRINT$MESSAGE
  594.     LXI    D,PROMPT2$MESSAGE    ; LEVEL COMMAND
  595.     LDA    HELP$LEVEL    ; CURRENT LEVEL = 0?
  596.     ORA    A    ; SET FLAGS
  597.     JZ    HELP1A
  598.     CALL    PRINT$MESSAGE
  599. HELP1A:
  600.     LXI    D,PROMPT3$MESSAGE
  601.     CALL    PRINT$MESSAGE
  602.     POP    B    ; GET C
  603.     CALL    CHAR$IN        ; GET RESPONSE
  604.     CPI    CTRLC        ; RETURN TO CP/M
  605.     JZ    HELP$EXIT
  606.     CPI    ROOT$CHAR    ; GO TO ROOT
  607.     JZ    GO$ROOT
  608.     CPI    LEVEL$RET$CHAR    ; RETURN TO PREVIOUS LEVEL
  609.     JZ    LEVEL$RETURN
  610.     PUSH    PSW    ; SAVE CHAR
  611.     CALL    CRLF1
  612.     POP    PSW    ; GET CHAR
  613.     SUI    'A'-1        ; ADJUST FOR COUNT
  614.     MOV    B,A        ; SAVE COUNT
  615.     JZ    BAD$RESPONSE
  616.     JNC    HELP2
  617.  
  618. *  INVALID RESPONSE
  619. BAD$RESPONSE:
  620.     LXI    D,ERR2    ; INVALID RESPONSE
  621.     CALL    PRINT$MESSAGE
  622.     JMP    HELP1
  623.  
  624. *  VALID RESPONSE -- LOOK FOR AND PRINT INFORMATION SECTION
  625. HELP2:
  626.     INR    C    ; 1 MORE THAN NUMBER OF POSSIBLE SELECTIONS
  627.     CMP    C    ; GREATER THAN NUMBER OF POSSIBLE SELECTIONS?
  628.     JNC    BAD$RESPONSE
  629.     LHLD    FIRST$ENTRY    ; GET PTR TO FIRST ENTRY
  630.  
  631. *  PRINT INFORMATION WHEN COUNT IS ZERO
  632. HELP3:
  633.     DCR    B    ; COUNT DOWN
  634.     JNZ    HELP4
  635.     CALL    PRINT$INFO    ; PRINT INFO PTED TO BY HL
  636.     JMP    HELP1
  637.  
  638. *  LOCATE NEXT INFORMATION SECTION
  639. HELP4:
  640.     MOV    A,M    ; <CTRL-Z>?
  641.     ANI    7FH    ; MASK OUT MSB
  642.     INX    H    ; PT TO NEXT BYTE
  643.     CPI    CTRLZ
  644.     JZ    HELP$ERR    ; HELP FILE FORMAT ERROR
  645.     CPI    LF    ; LINE FEED (WS FILE)?
  646.     JZ    HELP5
  647.     CPI    CR    ; <CR>?
  648.     JNZ    HELP4
  649.     INX    H    ; 1ST BYTE OF NEXT LINE
  650. HELP5:
  651.     MOV    A,M    ; GET CHAR
  652.     ANI    7FH    ; MASK OUT MSB
  653.     CPI    SECT$CHAR    ; NEW SECTION?
  654.     JZ    HELP3    ; CONTINUE LOOP IF SO
  655.     CPI    CTRLZ    ; EOF?
  656.     JNZ    HELP4    ; CONTINUE IF NOT
  657.  
  658. *  ERROR -- REACHED END OF HELP FILE
  659. HELP$ERR:
  660.     LXI    D,ERR3    ; FORMAT ERROR
  661.     CALL    PRINT$MESSAGE
  662.     JMP    HELP1
  663.  
  664.  
  665. *********************************************************
  666. *                            *
  667. *  HELP SUPPORT ROUTINE SECTION                *
  668. *                            *
  669. *********************************************************
  670.  
  671. *
  672. *  RESTORE CURRENT DISK AND CURRENT USER IF CHANGED
  673. *
  674. RESET$SYSTEM:
  675.     LDA    CUR$DISK    ; CHECK DISK
  676.     CPI    0FFH    ; 0FFH=NO CHANGE
  677.     JZ    RESET$SYS1
  678.     MOV    E,A    ; DISK IN E
  679.     MVI    C,14    ; SELECT DISK
  680.     CALL    BDOS
  681.     MVI    A,0FFH    ; SET NO CHANGE
  682.     STA    CUR$DISK
  683. RESET$SYS1:
  684.     LDA    CUR$USER    ; CHECK USER
  685.     CPI    0FFH    ; 0FFH=NO CHANGE
  686.     RZ
  687.     MOV    E,A    ; USER IN E
  688.     MVI    C,32    ; GET/SET USER CODE
  689.     CALL    BDOS
  690.     MVI    A,0FFH    ; SET NO CHANGE
  691.     STA    CUR$USER
  692.     RET
  693.  
  694. *
  695. *  INPUT CHAR; CHAR IS IN A
  696. *
  697. CHAR$IN:
  698.     PUSH B ! PUSH D ! PUSH H
  699.     MVI    C,1    ; READ CHAR
  700.     CALL    BDOS
  701.     POP H ! POP D ! POP B
  702.     PUSH    PSW    ; SAVE CHAR
  703.     CALL    CRLF1
  704.     POP    PSW    ; RESTORE CHAR
  705. *
  706. *  CAPITALIZE CHAR IN A
  707. *
  708. CAPS:
  709.     ANI    7FH    ; MASK OUT MSB
  710.     CPI    61H    ; LESS THAN SMALL A?
  711.     RC
  712.     CPI    7BH    ; LESS THAN LEFT BRACE?
  713.     RNC
  714.     ANI    5FH    ; CAPITALIZE
  715.     RET
  716.  
  717. *
  718. *  PRINT CHAR IN A ON CON:
  719. *
  720. CHAR$OUT:
  721.     PUSH PSW ! PUSH B ! PUSH D ! PUSH H
  722.     MVI    C,2    ; WRITE
  723.     MOV    E,A    ; CHAR IN E
  724.     CALL    BDOS
  725.     POP H ! POP D ! POP B ! POP PSW
  726.     RET
  727.  
  728. *
  729. *  PRINT ERROR MSG PTED TO BY DE; ENDS IN '$'
  730. *
  731. PRINT$MESSAGE:
  732.     PUSH B ! PUSH D ! PUSH H
  733.     MVI    C,9    ; PRINT BUFFER
  734.     CALL    BDOS
  735.     POP H ! POP D ! POP B
  736.     RET
  737.  
  738. *
  739. *  MOVE BYTES PTED TO BY HL TO AREA PTED TO BY DE; B BYTES TO MOVE
  740. *
  741. MOVE:
  742.     MOV    A,M    ; GET BYTE
  743.     ANI    7FH    ; MASK OFF MSB -- IN CASE A WS FILE
  744.     STAX    D    ; PUT BYTE
  745.     INX    H    ; PT TO NEXT
  746.     INX    D
  747.     DCR    B    ; COUNT DOWN
  748.     JNZ    MOVE
  749.     RET
  750.  
  751. *
  752. *  READ RECORD FROM DISK; NEXT$ADR CONTAINS ADDRESS TO READ TO
  753. *    ON RETURN, BDOS ERROR CODE IS IN A (0=NO ERROR)
  754. *
  755. READ$RECORD:
  756.     MVI    C,20    ; READ NEXT RECORD
  757.     LXI    D,FCB    ; PT TO FCB
  758.     CALL    BDOS
  759.     PUSH    PSW    ; SAVE RETURN CODE
  760.     LHLD    NEXT$ADR    ; PT TO LOAD ADDRESS
  761.     LDA    TPA$END    ; CHECK AGAINST END PAGE OF TPA
  762.     CMP    H    ; IF AT SAME PAGE, YES
  763.     JZ    READ$ERROR
  764.     LXI    D,BUFF    ; PT TO BUFFER TO LOAD FROM
  765.     MVI    B,128    ; NUMBER OF BYTES TO MOVE
  766.     XCHG
  767.     CALL    MOVE
  768.     XCHG
  769.     POP    PSW    ; GET RETURN CODE
  770.     ORA    A    ; DONE?
  771.     JZ    READ$DONE    ; RETURN IF NOT
  772.  
  773. *  CHECK FOR CTRLZ
  774.     PUSH    H    ; SAVE PTR TO NEXT ADDRESS
  775.     LHLD    NEXT$ADR    ; PT TO BEGINNING OF BLOCK
  776.     MVI    B,128    ; CHECK 128 BYTES
  777. CTRLZ$CHECK:
  778.     MOV    A,M    ; GET BYTE
  779.     ANI    7FH    ; MASK OUT MSB
  780.     INX    H    ; PT TO NEXT
  781.     CPI    CTRLZ    ; EOF?
  782.     JZ    CTRLZ$FOUND
  783.     DCR    B    ; COUNT DOWN
  784.     JNZ    CTRLZ$CHECK
  785.     LXI    D,CTRLZERR
  786.     CALL    PRINT$MESSAGE    ; NO CTRLZ ERROR
  787.     JMP    HELP$EXIT
  788.  
  789. *  FILL REST OF BLOCK WITH CTRLZ
  790. CTRLZ$FOUND:
  791.     DCR    B    ; COUNT DOWN
  792.     JZ    CTRLZ$DONE
  793.     MVI    M,CTRLZ    ; FILL REST OF BLOCK WITH CTRLZ
  794.     INX    H    ; PT TO NEXT
  795.     JMP    CTRLZ$FOUND
  796. CTRLZ$DONE:
  797.     POP    H    ; PT TO NEXT BLOCK ADDRESS
  798.  
  799. *  READ OK -- SAVE PTR TO NEXT BLOCK
  800. READ$DONE:
  801.     SHLD    NEXT$ADR    ; SET NEXT ADDRESS
  802.     RET
  803.  
  804. READ$ERROR:
  805.     LXI    D,READERR
  806.     CALL    PRINT$MESSAGE
  807.     JMP    HELP$EXIT
  808.  
  809. *
  810. *  PRINT ONE LINE OF INFO SECTION; HL PTS TO LINE UPON ENTRY;
  811. *    HL PTS TO FIRST CHAR OF NEXT LINE UPON EXIT
  812. *
  813. PRINT$LINE:
  814.     MOV    A,M    ; GET CHAR
  815.     ANI    7FH    ; MASK OUT MSB
  816.     CPI    CR    ; EOL?
  817.     JZ    CRLF
  818.     CPI    LF    ; LINE FEED? (WS FILE)
  819.     JZ    CRLF0
  820.     CPI    CTRLZ    ; END OF FILE?
  821.     JZ    CRLFC    ; DONE IF SO
  822.     CALL    CHAR$OUT    ; PRINT CHAR
  823.     INX    H    ; PT TO NEXT
  824.     JMP    PRINT$LINE
  825.  
  826. *
  827. *  PRINT CRLF, PT TO FIRST CHAR OF NEXT LINE, AND PAGE IF NECESSARY
  828. *
  829. CRLF:
  830.     INX    H    ; PT TO LF
  831. CRLF0:
  832.     INX    H    ; PT TO 1ST CHAR OF NEXT LINE
  833. CRLFC:
  834.     CALL    CRLF1    ; PRINT CRLF
  835.     LDA    LINE$CNT    ; GET LINE COUNT
  836.     DCR    A
  837.     STA    LINE$CNT
  838.     RNZ        ; OK -- CONTINUE
  839.     MOV    A,M    ; SET MSB OF FIRST CHAR OF NEXT LINE
  840.     ORI    80H
  841.     MOV    M,A    ; MSB IS SET FOR LATER BACKUP
  842. FRAME$PAUSE:
  843.     CALL    PR$LEVEL    ; PRINT LEVEL NUMBER
  844.     LDA    FRAME$NUMBER    ; INCREMENT FRAME NUMBER
  845.     INR    A
  846.     STA    FRAME$NUMBER
  847.     LXI    D,PAGEMS
  848.     CALL    PRINT$MESSAGE    ; PRINT PAGE MESSAGE
  849.     LXI    D,PAGE1MS    ; NOT LEVEL 0?
  850.     LDA    HELP$LEVEL    ; GET LEVEL NUMBER
  851.     ORA    A    ; SET FLAGS
  852.     JZ    FP1
  853.     CALL    PRINT$MESSAGE
  854. FP1:
  855.     LXI    D,PAGE2MS
  856.     CALL    PRINT$MESSAGE
  857.     CALL    CHAR$IN    ; GET RESPONSE
  858.     CPI    MENU$CHAR    ; ABORT?
  859.     JZ    HELP    ; START OVER IF SO
  860.     CPI    CPM$ABORT$CHAR    ; CP/M ABORT
  861.     JZ    HELP$EXIT
  862.     CPI    ROOT$CHAR    ; GO TO ROOT
  863.     JZ    GO$ROOT
  864.     CPI    LEVEL$RET$CHAR    ; RETURN TO HIGHER LEVEL
  865.     JZ    LEVEL$RETURN
  866.     CPI    BACKUP$CHAR    ; BACK UP?
  867.     JZ    FRAME$BACKUP
  868.     CPI    START$CHAR    ; JUMP TO START OF INFO
  869.     JZ    INFO$START
  870. FRAME$RESUME:
  871.     SHLD    START$OF$FRAME
  872.     CALL    SET$LINE$CNT
  873.     CALL    CRLF1    ; NEW LINE
  874.     RET
  875.  
  876. *  JUMP TO START OF INFORMATION
  877. INFO$START:
  878.     LHLD    START$OF$INFO    ; PT TO START OF INFO
  879.     MVI    A,1        ; RESET FRAME COUNT
  880.     STA    FRAME$NUMBER
  881.     JMP    FRAME$RESUME    ; CONTINUE PROCESSING
  882.  
  883. *  BACK UP TO PREVIOUS FRAME
  884. FRAME$BACKUP:
  885.     CALL    BOI$CHECK    ; AT BEGINNING OF INFORMATION?
  886.     JNZ    FB1        ; CONTINUE IF NOT
  887.     JMP    FRAME$PAUSE
  888. FB1:
  889.     DCX    H    ; BACK UP UNTIL BYTE WITH MSB SET IS FOUND
  890.     MOV    A,M    ; GET BYTE
  891.     ANI    80H
  892.     JZ    FB1
  893.     LDA    FRAME$NUMBER    ; DECREMENT FRAME NUMBER
  894.     DCR    A        ; BACK UP TO CURRENT FRAME NUMBER
  895.     DCR    A        ; BACK UP TO PREVIOUS FRAME NUMBER
  896.     STA    FRAME$NUMBER
  897.     JMP    FRAME$RESUME    ; CONTINUE PROCESSING
  898. *
  899. *  PRINT CR AND LF ONLY
  900. *
  901. CRLF1:
  902.     MVI    A,CR    ; PRINT CR
  903.     CALL    CHAR$OUT
  904.     MVI    A,LF    ; PRINT LF
  905.     CALL    CHAR$OUT
  906.     RET
  907.  
  908. *
  909. *  SET LINE$CNT VARIABLE TO SCREEN SIZE
  910. *
  911. SET$LINE$CNT:
  912.     MVI    A,LINES$PER$SCREEN-1
  913.     STA    LINE$CNT
  914.     RET
  915.  
  916. *
  917. *  PRINT THE HEADER SECTION AND LOAD FIRST$ENTRY PTR
  918. *    ON RETURN, C=NUMBER OF POSSIBLE SELECTIONS
  919. *
  920. PRINT$HEADER:
  921.     MVI    A,0    ; SET NO FRAME
  922.     STA    FRAME$NUMBER
  923.     LXI    H,HELP$BUF
  924.     CALL    SET$LINE$CNT
  925.     MVI    A,'A'    ; INIT SELECTION CHAR
  926.     STA    SEL$CHAR
  927.     LXI    D,SELECTMS
  928.     CALL    PRINT$MESSAGE
  929.     MVI    C,0    ; COUNT NUMBER OF SELECTIONS
  930.  
  931. * PRINT LINE UNTIL FIRST INFORMATION SECTION FOUND
  932. PH1:
  933.     MOV    A,M    ; GET CHAR
  934.     ANI    7FH    ; MASK OUT MSB
  935.     CPI    SECT$CHAR
  936.     JZ    PH2
  937.     CPI    CTRLZ    ; EOF? -- ABORT
  938.     JZ    HELP$EXIT
  939.     INR    C    ; INCREMENT SELECTION COUNT
  940.     LDA    SEL$CHAR    ; DISPLAY SELECTION CHAR
  941.     CALL    CHAR$OUT
  942.     INR    A    ; INCR CHAR
  943.     STA    SEL$CHAR
  944.     MVI    A,'.'
  945.     CALL    CHAR$OUT
  946.     MVI    A,' '
  947.     CALL    CHAR$OUT
  948.     CALL    PRINT$LINE    ; PRINT HEADER LINE
  949.     JMP    PH1
  950.  
  951. *  SAVE PTR TO FIRST ENTRY
  952. PH2:
  953.     SHLD    FIRST$ENTRY
  954.     RET
  955.  
  956. *
  957. *  PRINT AN INFORMATION SECTION
  958. *    INFORMATION SECTION IS PTED TO BY HL
  959. *
  960. PRINT$INFO:
  961.     SHLD    START$OF$INFO    ; SET START OF INFORMATION POINTER
  962.     CALL    LOAD$NODE    ; LOAD NEW NODE IF DUAL SECT$CHAR
  963.     SHLD    START$OF$FRAME    ; SET FRAME POINTER
  964.     MOV    A,M    ; SET MSB
  965.     ORI    80H
  966.     MOV    M,A
  967.     CALL    SET$LINE$CNT
  968.     MVI    A,1        ; A=1
  969.     STA    FRAME$NUMBER    ; SET FRAME NUMBER
  970. PI1:
  971.     CALL    PRINT$LINE    ; PRINT LINE FROM INFO FILE
  972.     MOV    A,M    ; DONE?
  973.     ANI    7FH    ; MASK OUT MSB
  974.     CPI    CTRLZ    ; EOF?
  975.     JZ    PI2
  976.     CPI    SECT$CHAR    ; NEXT SECTION
  977.     JZ    PI2
  978.     CPI    FF    ; FORM FEED?
  979.     JNZ    PI1
  980.     INX    H    ; PT TO CHAR AFTER FORM FEED
  981.     CALL    FORM$FEED    ; FEED SCREEN
  982.     JMP    PI1
  983.  
  984. *  FORM FEED SCREEN
  985. FORM$FEED:
  986.     LDA    LINE$CNT    ; GET LINE COUNT
  987.     MOV    B,A    ; ... IN B
  988. FEED$LOOP:
  989.     PUSH    B    ; SAVE B
  990.     CALL    CRLFC    ; NEW LINE
  991.     POP    B    ; GET B
  992.     DCR    B    ; COUNT DOWN
  993.     JNZ    FEED$LOOP
  994.     RET
  995.  
  996. *  END OF INFO
  997. PI2:
  998.     MOV    A,M    ; SET MSB OF NEXT BYTE
  999.     ORI    80H
  1000.     MOV    M,A
  1001. PI2A:
  1002.     CALL    CRLF1    ; NEW LINE
  1003.     LDA    LINE$CNT    ; COUNT DOWN
  1004.     DCR    A
  1005.     STA    LINE$CNT
  1006.     JNZ    PI2A
  1007. PI2$MSG:
  1008.     CALL    PR$LEVEL    ; PRINT LEVEL NUMBER
  1009.     LDA    FRAME$NUMBER    ; INCREMENT FRAME NUMBER
  1010.     INR    A
  1011.     STA    FRAME$NUMBER
  1012.     LXI    D,ENDMS        ; PRINT END OF INFORMATION MSG
  1013.     CALL    PRINT$MESSAGE
  1014.     LXI    D,PAGE1MS    ; PRINT LEVEL UP MESSAGE OPTIONALLY
  1015.     LDA    HELP$LEVEL    ; GET CURRENT HELP LEVEL
  1016.     ORA    A    ; SET FLAGS
  1017.     JZ    PI2$MSG1
  1018.     CALL    PRINT$MESSAGE
  1019. PI2$MSG1:
  1020.     LXI    D,PAGE2MS    ; PRINT REST OF INFO MESSAGE
  1021.     CALL    PRINT$MESSAGE
  1022.     CALL    CHAR$IN    ; GET ANY CHAR
  1023.     CPI    MENU$CHAR    ; MENU ABORT
  1024.     JZ    HELP
  1025.     CPI    CPM$ABORT$CHAR    ; CP/M ABORT
  1026.     JZ    HELP$EXIT
  1027.     CPI    ROOT$CHAR    ; GO TO ROOT
  1028.     JZ    GO$ROOT
  1029.     CPI    LEVEL$RET$CHAR    ; RETURN TO HIGHER LEVEL
  1030.     JZ    LEVEL$RETURN
  1031.     CPI    BACKUP$CHAR    ; BACK UP FROM EOI?
  1032.     JZ    PI2$BACKUP
  1033.     CPI    START$CHAR    ; START OF INFO?
  1034.     JZ    PI2$START
  1035.     CALL    SET$LINE$CNT    ; RESET LINE COUNT IN CASE OF ALL
  1036.     RET
  1037.  
  1038. *  JUMP TO START OF INFO
  1039. PI2$START:
  1040.     LHLD    START$OF$INFO    ; PT TO START OF INFO
  1041.     CALL    FRAME$RESUME    ; RESET POINTERS
  1042.     MVI    A,1        ; RESET FRAME COUNT
  1043.     STA    FRAME$NUMBER
  1044.     JMP    PI1    ; CONTINUE PROCESSING
  1045.  
  1046. *  BACK UP TO PREVIOUS FRAME
  1047. PI2$BACKUP:
  1048.     CALL    BOI$CHECK    ; AT BEGINNING OF INFORMATION?
  1049.     JNZ    PI2$BACK    ; CONTINUE IF NOT
  1050.     JMP    PI2$MSG
  1051. PI2$BACK:
  1052.     CALL    FB1    ; BACK UP TO PREVIOUS FRAME
  1053.     JMP    PI1    ; CONTINUE PROCESSING
  1054.  
  1055. *
  1056. *  CHECK FOR POSITION AT BEGINNING OF INFORMATION SECTION
  1057. *    IF SO, PRINT BACKUP ERROR MESSAGE AND RETURN W/ZERO SET
  1058. *
  1059. BOI$CHECK:
  1060.     LHLD    START$OF$INFO    ; START ADDRESS
  1061.     XCHG            ; ... IN DE
  1062.     LHLD    START$OF$FRAME    ; FRAME ADDRESS
  1063.     MOV    A,D        ; EQUAL?
  1064.     CMP    H
  1065.     RNZ
  1066.     MOV    A,E
  1067.     CMP    L
  1068.     RNZ
  1069.     LXI    D,BACKERR    ; BACKUP ERROR
  1070.     CALL    PRINT$MESSAGE
  1071.     XRA    A        ; ZERO FLAG SET
  1072.     STA    FRAME$NUMBER    ; SET FRAME NUMBER
  1073.     RET
  1074.  
  1075. *
  1076. *  AT THE BEGINNING OF AN INFORMATION SECTION (HL PTS TO FIRST CHAR)
  1077. *    CHECK TO SEE IF ANOTHER SECT$CHAR FOLLOWS, AND, IF SO, LOAD THE
  1078. *    SPECIFIED FILE AS A NEW NODE AND BEGIN PROCESSING IT
  1079. *
  1080. LOAD$NODE:
  1081.     INX    H    ; PT TO POSSIBLE 2ND SECT$CHAR
  1082.     MOV    A,M    ; GET IT
  1083.     DCX    H    ; PREP FOR RETURN
  1084.     ANI    7FH    ; MASK MSB
  1085.     CPI    SECT$CHAR    ; ANOTHER ONE?
  1086.     RNZ        ; PROCESS NORMALLY IF NOT
  1087.  
  1088. *  WE HAVE A NEW NODE -- CHECK TO SEE IF WE CAN NEST AGAIN
  1089.     LDA    HELP$LEVEL    ; GET CURRENT HELP LEVEL
  1090.     CPI    HELP$MAX    ; AT MAXIMUM?
  1091.     JNZ    LOAD$NODE1
  1092.     LXI    D,LEVELERR    ; LEVEL ERROR MESSAGE
  1093.     CALL    PRINT$MESSAGE
  1094.     JMP    HELP$EXIT
  1095.  
  1096. *  WE HAVE NOT REACHED LEVEL LIMIT, SO CONTINUE
  1097. *  AT THIS TIME, A=HELP LEVEL INDEX AND HL = PTR TO CURRENT SECTION (::)
  1098. LOAD$NODE1:
  1099.  
  1100. *  SAVE CURRENT HELP FILE NAME FOR RETURN
  1101.     INX    H    ; PT TO SECTION SECT$CHAR
  1102.     INX    H    ; NOW POINTING TO FILE NAME
  1103.     PUSH    H    ; SAVE PTR
  1104.     CALL    COMP$HELP$NAME$PTR    ; HL=POINTER TO STACK ELT INDEXED BY A
  1105.     XCHG        ; DE=ADDRESS OF NEXT ELEMENT
  1106.  
  1107. *  COPY CURRENT NODE ELEMENT NAME INTO NEXT STACK ELEMENT
  1108.     LXI    H,FCB+1    ; PT TO FILE NAME
  1109.     MVI    B,11    ; 11 BYTES
  1110.     CALL    MOVE
  1111.  
  1112. *  INCREMENT HELP LEVEL
  1113.     LDA    HELP$LEVEL    ; GET OLD LEVEL
  1114.     INR    A    ; SET NEW LEVEL
  1115.     STA    HELP$LEVEL
  1116.  
  1117. *  SET UP FCB FOR NEW FILE
  1118.     LXI    D,LOADING$MSG
  1119.     CALL    PRINT$MESSAGE
  1120.     POP    H    ; GET PTR TO NEW FILE NAME
  1121.     LXI    D,FCB+1    ; PT TO FCB NAME
  1122.     MVI    B,8    ; 8 CHARS MAX
  1123.     CALL    LOAD$FCB    ; PLACE INTO FCB WITH ERROR CHECKING
  1124.     MVI    A,'.'    ; DECIMAL BETWEEN FILE NAME AND TYPE
  1125.     CALL    CHAR$OUT
  1126.     MVI    B,3    ; 3 CHARS MAX FOR TYPE
  1127.     CALL    LOAD$FCB    ; PLACE INTO FCB WITH ERROR CHECKING
  1128.     CALL    CRLF1    ; NEW LINE
  1129.     JMP    START1    ; LOAD NEW HELP FILE
  1130.  
  1131. *
  1132. *  LOAD FCB PTED TO BY DE WITH "NORMAL" FILE NAME PTED TO BY HL FOR B BYTES
  1133. *
  1134. LOAD$FCB:
  1135.     MOV    A,M    ; GET CHAR
  1136.     INX    H    ; PT TO NEXT
  1137.     CPI    '.'    ; DONE IF DECIMAL
  1138.     JZ    LOAD$FCB$FILL
  1139.     CPI    ' '+1    ; DONE IF < <SP>
  1140.     JC    LOAD$FCB$FILL
  1141.     CALL    CAPS    ; CAPITALIZE
  1142.     CALL    CHAR$OUT    ; PRINT FILE NAME AND TYPE
  1143.     STAX    D    ; STORE CHAR
  1144.     INX    D    ; PT TO NEXT
  1145.     DCR    B    ; COUNT DOWN
  1146.     JNZ    LOAD$FCB
  1147.     MOV    A,M    ; CHECK FOR ERROR
  1148.     ANI    7FH    ; MASK MSB
  1149.     INX    H    ; PT TO NEXT CHAR
  1150.     CPI    '.'    ; OK IF '.'
  1151.     RZ
  1152.     CPI    ' '+1    ; OK IF <SP>
  1153.     RC
  1154.     LXI    D,LOADERR
  1155.     CALL    PRINT$MESSAGE
  1156.     JMP    HELP$EXIT
  1157. LOAD$FCB$FILL:
  1158.     MOV    C,A    ; SAVE CHAR THAT TERMINATED STRING
  1159. LOAD$FCB$LOOP:
  1160.     MVI    A,' '    ; <SP> FILL REST OF FCB
  1161.     STAX    D    ; STORE <SP>
  1162.     INX    D    ; PT TO NEXT
  1163.     DCR    B    ; COUNT DOWN
  1164.     JNZ    LOAD$FCB$LOOP
  1165.     MOV    A,C    ; GET CHAR THAT TERMINATED STRING
  1166.     RET
  1167.  
  1168. *
  1169. *  GO TO ROOT
  1170. *
  1171. GO$ROOT:
  1172.     LDA    HELP$LEVEL    ; AT ROOT?
  1173.     ORA    A    ; 0=YES
  1174.     JZ    HELP    ; RETURN TO HELP
  1175.     MVI    A,0    ; SET ROOT INDEX
  1176.     JMP    GORET
  1177.  
  1178. *
  1179. *  RETURN TO PREVIOUS HELP LEVEL
  1180. *
  1181. LEVEL$RETURN:
  1182.     LDA    HELP$LEVEL    ; ARE WE AT THE LOWEST LEVEL?
  1183.     ORA    A    ; 0=YES
  1184.     JNZ    LRET
  1185.     LXI    D,LRETERR
  1186.     CALL    PRINT$MESSAGE
  1187.     JMP    HELP
  1188.  
  1189. *  SET NEW HELP LEVEL
  1190. LRET:
  1191.     DCR    A    ; DOWN 1
  1192.  
  1193. *  GO TO HELP LEVEL INDEXED IN A
  1194. GORET:
  1195.     STA    HELP$LEVEL    ; SET NEW HELP LEVEL
  1196.     CALL    COMP$HELP$NAME$PTR    ; HL=POINTER TO TARGET HELP FILE NAME
  1197.     PUSH    H    ; SAVE PTR TO FILE NAME
  1198.     LXI    D,LOADING$MSG    ; PRINT NAME OF FILE TO BE LOADED
  1199.     CALL    PRINT$MESSAGE
  1200.     MVI    B,8    ; 8 CHARS TO FILE NAME
  1201. GORET$NAME:
  1202.     MOV    A,M    ; GET CHAR
  1203.     CPI    ' '    ; END OF NAME?
  1204.     INX    H    ; PT TO NEXT
  1205.     JZ    GORET$NAME0
  1206.     CALL    CHAR$OUT    ; PRINT FILE NAME
  1207.     DCR    B    ; DONE?
  1208.     JNZ    GORET$NAME
  1209.     JMP    GORET$NAME1
  1210. GORET$NAME0:
  1211.     DCR    B    ; COUNT DOWN
  1212.     JZ    GORET$NAME1
  1213.     INX    H    ; SKIP NEXT SPACE
  1214.     JMP    GORET$NAME0
  1215. GORET$NAME1:
  1216.     MVI    A,'.'    ; PRINT DECIMAL
  1217.     CALL    CHAR$OUT
  1218.     MVI    B,3    ; PRINT FILE TYPE
  1219. GORET$NAME2:
  1220.     MOV    A,M    ; GET CHAR
  1221.     INX    H    ; PT TO NEXT
  1222.     CALL    CHAR$OUT    ; PRINT IT
  1223.     DCR    B    ; COUNT DOWN
  1224.     JNZ    GORET$NAME2
  1225.     CALL    CRLF1    ; NEW LINE
  1226.     POP    H    ; GET PTR TO FILE NAME
  1227.     LXI    D,FCB+1    ; COPY ELEMENT INTO FCB
  1228.     MVI    B,11    ; 11 BYTES
  1229.     CALL    MOVE
  1230.     JMP    START1    ; LOAD ENTRY
  1231.  
  1232. *
  1233. *  COMPUTE POINTER TO HELP NAME ENTRY INDEXED BY HELP LEVEL IN A
  1234. *
  1235. COMP$HELP$NAME$PTR:
  1236.     CALL    COMP$OFFSET    ; COMPUTE OFFSET IN TABLE
  1237.     LXI    D,HELP$NAME$STACK    ; PT TO BASE OF HELP NAMES
  1238.     DAD    D    ; ADD IN OFFSET
  1239.     RET
  1240.  
  1241. *
  1242. *  COMPUTE OFFSET INTO TABLE BASED ON INDEX A
  1243. *    OFFSET = A * 11
  1244. *
  1245. COMP$OFFSET:
  1246.     MOV    L,A    ; VALUE IN HL
  1247.     MVI    H,0
  1248.     MOV    E,L    ; DE=HL
  1249.     MOV    D,H
  1250.  
  1251.     DAD    H    ; *2
  1252.     DAD    H    ; *4
  1253.     DAD    H    ; *8
  1254.     DAD    D    ; *9
  1255.     DAD    D    ; *10
  1256.     DAD    D    ; *11
  1257.     RET
  1258.  
  1259. *
  1260. *  PRINT LEVEL NUMBER
  1261. *
  1262. PR$LEVEL:
  1263.     LDA    HELP$LEVEL    ; DON'T PRINT LEVEL 0
  1264.     ORA    A    ; 0?
  1265.     JZ    PR$FRAME
  1266.     LXI    D,LEVEL$MESSAGE    ; PRINT HEADER
  1267.     CALL    PRINT$MESSAGE
  1268.     LDA    HELP$LEVEL    ; GET NUMBER
  1269.     CALL    PR$DEC        ; PRINT AS DECIMAL
  1270.     LXI    D,LEVEL2$MESSAGE    ; PRINT END HEADER
  1271.     CALL    PRINT$MESSAGE
  1272. PR$FRAME:
  1273.     LDA    FRAME$NUMBER    ; GET CURRENT FRAME NUMBER
  1274.     ORA    A    ; SET FLAGS
  1275.     RZ        ; NO FRAME?
  1276.     CALL    PR$DEC    ; PRINT AS DECIMAL
  1277.     LXI    D,LEVEL3$MESSAGE
  1278.     CALL    PRINT$MESSAGE
  1279.     RET
  1280. *  PRINT A AS DECIMAL
  1281. PR$DEC:
  1282.     PUSH    PSW    ; SAVE VALUE
  1283.     XRA    A
  1284.     STA    LD$SPACE
  1285.     POP    PSW    ; GET VALUE
  1286.     MVI    B,100    ; PRINT 100'S
  1287.     CALL    PDEC
  1288.     MVI    B,10    ; PRINT 10'S
  1289.     CALL    PDEC
  1290.     ADI    '0'    ; PRINT 1'S
  1291.     JMP    CHAR$OUT
  1292. PDEC:
  1293.     MVI    C,0    ; SET VALUE
  1294. PDEC1:
  1295.     SUB    B    ; SUBTRACT POWER
  1296.     JC    PDEC2
  1297.     INR    C    ; INCREMENT VALUE
  1298.     JMP    PDEC1
  1299. PDEC2:
  1300.     ADD    B    ; ADD POWER BACK IN
  1301.     MOV    B,A    ; SAVE A IN B
  1302.     LDA    LD$SPACE    ; GET LEADING <SP> FLAG
  1303.     ORA    A    ; NON-ZERO=PRINT
  1304.     JNZ    PDEC3
  1305.     MOV    A,C    ; GET DIGIT
  1306.     STA    LD$SPACE    ; NEW FLAG
  1307.     ORA    A    ; ZERO?
  1308.     JNZ    PDEC3    ; PRINT BYTE IN C
  1309.     MVI    A,' '    ; PRINT LEADING SPACE
  1310.     JMP    PDEC4
  1311. PDEC3:
  1312.     MOV    A,C    ; GET VALUE
  1313.     ADI    '0'    ; CONVERT TO ASCII
  1314. PDEC4:
  1315.     CALL    CHAR$OUT    ; PRINT CHAR
  1316.     MOV    A,B    ; RESTORE A
  1317.     RET
  1318.  
  1319. *********************************************************
  1320. *  MESSAGE AND BUFFER SECTION                *
  1321. *********************************************************
  1322.  
  1323. HELPMS:
  1324.     DB    'HELP  Version ',(VERS/10)+'0','.',(VERS MOD 10)+'0',CR,LF,'$'
  1325. SELECTMS:
  1326.     DB    CR,LF,'  HELP File Selections are --',CR,LF,'$'
  1327. DEFFN:
  1328.     DB    0,'HELP    '
  1329. DEFTYP:
  1330.     DB    'HLP'
  1331. ENDMS:
  1332.     DB    'EOI '
  1333. PAGEMS:
  1334.     DB    '^C=CP/M $'        ; ABORT TO CP/M CHAR
  1335. PAGE1MS:
  1336.     DB    LEVEL$RET$CHAR,'=Level '    ; RETURN TO HIGHER NODE
  1337.     DB    ROOT$CHAR,'=Root $'        ; RETURN TO ROOT
  1338. PAGE2MS:
  1339.     DB    MENU$CHAR,'=Menu '    ; ABORT TO MENU CHAR
  1340.     DB    START$CHAR,'=Start '    ; JUMP TO START OF INFORMATION CHAR
  1341.     DB    BACKUP$CHAR,'=Last '    ; BACK UP TO PREVIOUS FRAME CHAR
  1342.     DB    'CR=Next $'
  1343. WILD$ERR:
  1344.     DB    CR,LF,'HELP FATAL ERROR -- File Name Contains Wild Card$'
  1345. ERR1:
  1346.     DB    CR,LF,'HELP FATAL ERROR -- File not Found$'
  1347. ERR2:
  1348.     DB    CR,LF,'HELP ERROR -- Invalid Response',CR,LF,'$'
  1349. ERR3:
  1350.     DB    CR,LF,'HELP ERROR -- EOF on HELP File',CR,LF,'$'
  1351. BACKERR:
  1352.     DB    CR,LF,'HELP ERROR -- Not Possible to Backup Before Start of '
  1353.     DB    'Info',CR,LF,'$'
  1354. LEVELERR:
  1355.     DB    CR,LF,'HELP ERROR -- Node Level Limit Reached -- Aborting'
  1356.     DB    CR,LF,'$'
  1357. LOADERR:
  1358.     DB    CR,LF,'HELP ERROR -- Invalid File Name in Load',CR,LF,'$'
  1359. LRETERR:
  1360.     DB    CR,LF,'HELP ERROR -- No Higher Level to Return to',CR,LF,'$'
  1361. READERR:
  1362.     DB    CR,LF,'HELP ERROR -- Not Enough Room for HELP File',CR,LF,'$'
  1363. CTRLZERR:
  1364.     DB    CR,LF,'HELP ERROR -- HELP File NOT Terminated by ^Z',CR,LF,'$'
  1365. LEVEL$MESSAGE:
  1366.     DB    'Level $'
  1367. LEVEL2$MESSAGE:
  1368.     DB    '/ $'
  1369. LEVEL3$MESSAGE:
  1370.     DB    ': $'
  1371. PROMPT1$MESSAGE:
  1372.     DB    'Type  ^C=CP/M$'
  1373. PROMPT2$MESSAGE:
  1374.     DB    ' ',LEVEL$RET$CHAR,'=Level '
  1375.     DB    ROOT$CHAR,'=Root$'
  1376. PROMPT3$MESSAGE:
  1377.     DB    ' or Enter Selection $'
  1378. LOADING$MSG:
  1379.     DB    CR,LF,'Loading HELP File $'
  1380.  
  1381. CUR$DISK:
  1382.     DS    1    ; NUMBER OF CURRENT DISK IF CHANGED OR 0FFH=NO CHANGE
  1383. CUR$USER:
  1384.     DS    1    ; NUMBER OF CURRENT USER IF CHANGED OR 0FFH=NO CHANGE
  1385. TPA$END:
  1386.     DS    1    ; END PAGE ADDRESS OF TPA
  1387. START$OF$INFO:
  1388.     DS    2    ; PTR TO START OF CURRENT INFORMATION BLOCK
  1389. START$OF$FRAME:
  1390.     DS    2    ; PTR TO START OF CURRENT FRAME
  1391. SEL$CHAR:
  1392.     DS    1    ; SELECTION TABLE OPTION CHAR
  1393. FIRST$ENTRY:
  1394.     DS    2    ; PTR TO FIRST ENTRY OF INFORMATION SECTION
  1395. LINE$CNT:
  1396.     DS    1    ; LINE COUNT BUFFER
  1397. NAME$COUNT:
  1398.     DS    1    ; COUNT OF FILE NAMES/LINE
  1399. DFFLG:
  1400.     DS    1    ; DEFAULT FILE FLAG (0=NOT SEARCH FOR, 1=YES)
  1401. NEXT$ADR:
  1402.     DS    2    ; NEXT LOAD ADDRESS
  1403. LD$SPACE:
  1404.     DS    1    ; LEADING SPACE FLAG FOR DECIMAL PRINT
  1405. HELP$LEVEL:
  1406.     DS    1    ; NUMBER OF HELP LEVEL CURRENT NODE IS AT (0=BOTTOM)
  1407. FRAME$NUMBER:
  1408.     DS    1    ; NUMBER OF CURRENT FRAME
  1409.  
  1410. HELP$NAME$STACK:
  1411.     DS    11*HELP$MAX    ; STACK OF HELP FILE NAMES OF EACH LEVEL
  1412.  
  1413.     DS    80    ; STACK SPACE
  1414. STACK:
  1415.     DS    2    ; CP/M STACK PTR
  1416.  
  1417.  
  1418. *
  1419. *  DEFAULT HELP MESSAGE
  1420. *
  1421. HELP$DEF$MSG:
  1422.     DB    CR,LF,'Default HELP Facility Invoked'
  1423.     DB    CR,LF,'  Names of Available HLP Files are --'
  1424.     DB    CR,LF,'$'
  1425. HELP$DEF$MSG1:
  1426.     DB    CR,LF,'Type Any Char for Default Information (^C=Abort) -- $'
  1427. HELP$BUF:
  1428.     DB    ':The HELP Subsystem for Online Documentation'
  1429.     DB    CR,LF,'     This is HELP, the Online Documentation Subsystem.'
  1430.     DB    CR,LF,'The purpose of HELP is to allow the user to '
  1431.     DB    'interactively'
  1432.     DB    CR,LF,'query the *.HLP files of the system in order to receive'
  1433.     DB    CR,LF,'information summaries on various aspects of the user''s'
  1434.     DB    CR,LF,'working environment, such as the language systems he is'
  1435.     DB    CR,LF,'using and certain subsystems available to him.'
  1436.  
  1437.     IF    DEFAULT$HELP$HLP    ; PRINT IF HELP.HLP SEARCHED FOR
  1438.     DB    CR,LF,LF,'    When the user types ''HELP'', a search is done'
  1439.     DB    CR,LF,'for the file ''HELP.HLP''.  If found, its contents are'
  1440.     DB    CR,LF,'to the user; if not found, this message is displayed.'
  1441.     ENDIF
  1442.  
  1443.     IF    NOT DEFAULT$HELP$HLP    ; PRINT IF HELP.HLP NOT SEARCHED FOR
  1444.     DB    CR,LF,LF,'     When the user types ''HELP'', a search is done'
  1445.     DB    CR,LF,'for the files ''*.HLP''.  The name of each HLP file'
  1446.     DB    CR,LF,'is displayed to the user followed by this text.'
  1447.     ENDIF
  1448.  
  1449.     DB    CR,LF,LF,'     If the user desires information on a specific'
  1450.     DB    CR,LF,'topic and he has a HELP File of that name (ie, CPM.HLP'
  1451.     DB    CR,LF,'is a HELP File on CP/M), he may issue of HELP Command'
  1452.     DB    CR,LF,'of the form --'
  1453.     DB    CR,LF,'               HELP d:topic'
  1454.     DB    CR,LF,'where "d:" is the disk the HELP File resides on'
  1455.     DB    ' (optional)'
  1456.     DB    CR,LF,'and "topic" is the name of the HELP File (topic.HLP,'
  1457.     DB    CR,LF,'like CPM.HLP).'
  1458.     DB    CR,LF,'     Please refer to the HELP File "HELP.HLP" for'
  1459.     DB    ' more information.'
  1460.  
  1461.     DB    CR,LF,CTRLZ    ; END OF FILE
  1462.  
  1463.  
  1464.     END
  1465.