home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv013.ark / HELP.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  13KB  |  536 lines

  1. *  PROGRAM NAME:  HELP
  2. *  AUTHOR:  RICHARD CONN
  3. *  DATE:  6 OCT 80
  4. *  VERSION:  1.1
  5. *  PREVIOUS VERSIONS:  1.0 (18 NOV 79)
  6.  
  7. *****************************************************************
  8. *                                *
  9. *  HELP -- DISPLAY HELP FILE INFORMATION TO USER ON CON:    *
  10. *                                *
  11. *    THE HELP COMMAND IS OF THE GENERAL FORM:        *
  12. *        HELP <FILENAME>.<EXT>                *
  13. *                                *
  14. *    <FILENAME>.<EXT> IS OPTIONAL; IF OMITTED COMPLETELY,    *
  15. * 'HELP.HLP' IS ASSUMED; IF JUST <EXT> IS OMITTED, EXTENSION    *
  16. * IS ASSUMED TO BE '.HLP'                    *
  17. *                                *
  18. *    THE HELP COMMAND DISPLAYS THE INFORMATION IN A HELP    *
  19. * FILE TO THE USER.  THERE ARE TWO BASIC TYPES OF HELP FILES --    *
  20. * (1) INDEXED AND (2) NON-INDEXED.  INDEXED HELP FILES ARE     *
  21. * THOSE WHICH CONTAIN SEVERAL SECTIONS; THE INDIVIDUAL MAY    *
  22. * READ ALL OF SUCH A HELP FILE OR JUST SELECTED SECTIONS OF    *
  23. * THIS FILE.  NON-INDEXED HELP FILES CONTAIN ONLY ONE SECTION.    *
  24. *    STRUCTURALLY SPEAKING, HELP FILES CONSIST OF TWO PARTS:    *
  25. * THE HEADER PART AND THE INFORMATION PART.  THE INFORMATION    *
  26. * PART OF A HELP FILE BEGINS WITH A LINE WHOSE FIRST CHARACTER    *
  27. * IS A COLON.  THE TITLE OF THE INFORMATION SECTION IS ON THIS    *
  28. * LINE.  THE INFORMATION SECTION CONTINUES UNTIL THE NEXT    *
  29. * INFORMATION SECTION (LINE STARTING WITH A COLON) OR THE END    *
  30. * OF THE FILE IS ENCOUNTERED.  THE HEADER PART CONSISTS OF A    *
  31. * GROUP OF LINES BEFORE THE FIRST INFORMATION SECTION.  IF THE    *
  32. * FIRST LINE OF A HELP FILE STARTS WITH A COLON, THEN THERE IS    *
  33. * NO HEADER PART, AND THE HELP FILE IS DUMPED AS ONE        *
  34. * INFORMATION SECTION.                        *
  35. *    THERE MUST BE THE SAME NUMBER OF LINES IN THE HEADER    *
  36. * PART AS THERE ARE INFORMATION SECTIONS.  IF NOT, A HELP    *
  37. * FILE ERROR WILL BE ISSUED IF THE HELP COMMAND ATTEMPTS TO    *
  38. * READ BEYOND THE END OF THE HELP FILE IN ITS SEARCH FOR AN    *
  39. * INFORMATION SECTION.                        *
  40. *                                *
  41. *****************************************************************
  42.  
  43.  
  44. *****************************************************************
  45. *                                *
  46. *  THE HELP PROGRAM IS COMPLETELY TRANSPORTABLE BETWEEN CP/M    *
  47. *  SYSTEMS.                            *
  48. *                                *
  49. *****************************************************************
  50.  
  51.  
  52.  
  53. *****************************************************************
  54. *  CP/M AND BASIC CHARACTER DEFINITIONS                *
  55. *****************************************************************
  56.  
  57. BDOS        EQU    5    ; ADDRESS OF BDOS ENTRY POINT
  58. FCB        EQU    5CH    ; ADDRESS OF FILE CONTROL BLOCK
  59. BUFF        EQU    80H    ; ADDRESS OF DMA BUFFER
  60.  
  61. CR        EQU    0DH    ; <CR>
  62. LF        EQU    0AH    ; <LF>
  63. FF        EQU    'L'-40H    ; CTRL-L = FORM FEED
  64. CTRLZ        EQU    'Z'-40H    ; CTRL-Z
  65. CTRLC        EQU    'C'-40H    ; CTRL-C
  66.  
  67. *****************************************************************
  68. *  CHARACTER WHICH MARKS START OF INFORMATION SECTION        *
  69. *****************************************************************
  70.  
  71. SECT$CHAR    EQU    ':'    ; DEFINED TO BE COLON
  72. ALL$CHAR    EQU    '*'    ; ALL OF HELP FILE DESIGNATOR
  73.  
  74. *****************************************************************
  75. *  USER CUSTOMIZATION -- LINES PER SCREEN DISPLAY        *
  76. *****************************************************************
  77.  
  78. LINES$PER$SCREEN    EQU    24    ; ASSUME 24 LINES/SCREEN
  79.  
  80.  
  81. *****************************************************************
  82. *  START OF PROGRAM                        *
  83. *****************************************************************
  84.  
  85.     ORG    100H
  86.  
  87. START:
  88.     LXI    H,0    ; GET SP
  89.     DAD    SP
  90.     SHLD    STACK
  91.     XRA    A    ; TURN OFF DEFAULT FILE FLAG
  92.     STA    DFFLG
  93.     LXI    D,HELPMS    ; PRINT OPENING MSG
  94.     CALL    PRINT$MESSAGE
  95.     LXI    H,FCB+1    ; CHECK FOR FILE NAME
  96.     MOV    A,M
  97.     CPI    ' '    ; NONE?
  98.     JZ    DEFAULT$FN
  99.     ORA    A    ; ALSO NONE
  100.     JNZ    START1
  101.  
  102. *  INSERT 'HELP.HLP' INTO FCB
  103. DEFAULT$FN:
  104.     DCX    H    ; PT TO FCB
  105.     LXI    D,DEFFN
  106.     MVI    B,12    ; 12 BYTES
  107.     XCHG
  108.     CALL    MOVE    ; MOVE (HL) TO (DE) FOR (B) BYTES
  109.     MVI    A,1    ; TURN ON DEFAULT FILE FLAG
  110.     STA    DFFLG
  111.     JMP    START2
  112.  
  113. *  CHECK FOR EXTENSION TO FILE NAME
  114. START1:
  115.     LXI    H,FCB+9    ; CHECK FOR EXTENSION
  116.     MOV    A,M
  117.     CPI    ' '    ; NONE?
  118.     JZ    DEFAULT$EXT
  119.     ORA    A    ; NONE ALSO
  120.     JNZ    START2
  121.  
  122. *  PLACE DEFAULT EXTENSION OF '.HLP' IN FCB
  123. DEFAULT$EXT:
  124.     LXI    D,DEFEXT
  125.     MVI    B,3
  126.     XCHG
  127.     CALL    MOVE    ; MOVE (HL) TO (DE) FOR (B) BYTES
  128.  
  129. *  OPEN FILE
  130. START2:
  131.     LXI    D,FCB    ; PT TO FCB
  132.     MVI    C,15    ; OPEN FILE
  133.     CALL    BDOS
  134.     CPI    255    ; NOT PRESENT?
  135.     JNZ    START3
  136.  
  137. *  CHECK FOR DEFAULT FILE SEARCH
  138.     LDA    DFFLG    ; GET DEFAULT FILE FLAG
  139.     ORA    A    ; 1=YES, SEARCH FOR DEFAULT FAILED
  140.     JNZ    HELP    ; DISPLAY DEFAULT HELP FILE INFORMATION
  141.  
  142. *  FILE NOT FOUND -- FATAL ERROR
  143.     LXI    D,ERR1    ; FILE NOT FOUND
  144.     CALL    PRINT$MESSAGE
  145.     RET
  146.  
  147. *  LOAD HELP FILE INFORMATION
  148. START3:
  149.     LXI    H,HELP$BUF    ; PT TO BUFFER
  150.     SHLD    NEXT$ADR    ; SET PTR
  151.  
  152. *  READ RECORDS UNTIL EOF
  153. START4:
  154.     CALL    READ$RECORD    ; READ INFO
  155.     ORA    A    ; DONE? 0=NO
  156.     JZ    START4
  157.  
  158. *
  159. *  START OF HELP PROGRAM
  160. *
  161. HELP:
  162.     LXI    SP,STACK    ; RESET STACK
  163.     LXI    H,HELP$BUF    ; PT TO BUFFER
  164.     MOV    A,M    ; NO HEADER SECTION?
  165.     CPI    SECT$CHAR
  166.     JNZ    HELP1    ; HEADER SECTION EXISTS
  167.     CALL    PRINT$INFO    ; PRINT HELP INFO PTED TO BY HL
  168.  
  169. *  EXIT POINT FOR ANY EXIT FROM THE REST OF THE HELP PROGRAM
  170. HELP$EXIT:
  171.     LHLD    STACK    ; GET CP/M SP
  172.     SPHL
  173.     RET        ; DONE
  174.  
  175. *  PRINT HEADER INFORMATION AND SELECT AN OPTION
  176. HELP1:
  177.     CALL    PRINT$HEADER    ; PRINT HEADER
  178.     LXI    D,PROMPT$MESSAGE    ; PRINT PROMPT
  179.     CALL    PRINT$MESSAGE
  180.     CALL    CHAR$IN        ; GET RESPONSE
  181.     CPI    CTRLC        ; RETURN TO CP/M
  182.     JZ    HELP$EXIT
  183.     CPI    ALL$CHAR    ; ALL OF HELP FILE?
  184.     JZ    HELP$ALL
  185.     ANI    0DFH    ; CAPITALIZE
  186.     PUSH    PSW    ; SAVE CHAR
  187.     CALL    CRLF1
  188.     POP    PSW    ; GET CHAR
  189.     SUI    'A'-1        ; ADJUST FOR COUNT
  190.     MOV    B,A        ; SAVE COUNT
  191.     JZ    BAD$RESPONSE
  192.     JNC    HELP2
  193.  
  194. *  INVALID RESPONSE
  195. BAD$RESPONSE:
  196.     LXI    D,ERR2    ; INVALID RESPONSE
  197.     CALL    PRINT$MESSAGE
  198.     JMP    HELP1
  199.  
  200. *  VALID RESPONSE -- LOOK FOR AND PRINT INFORMATION SECTION
  201. HELP2:
  202.     INR    C    ; 1 MORE THAN NUMBER OF POSSIBLE SELECTIONS
  203.     CMP    C    ; GREATER THAN NUMBER OF POSSIBLE SELECTIONS?
  204.     JNC    BAD$RESPONSE
  205.     LHLD    FIRST$ENTRY    ; GET PTR TO FIRST ENTRY
  206.  
  207. *  PRINT INFORMATION WHEN COUNT IS ZERO
  208. HELP3:
  209.     DCR    B    ; COUNT DOWN
  210.     JNZ    HELP4
  211.     INX    H    ; SKIP OVER COLON
  212.     CALL    PRINT$INFO    ; PRINT INFO PTED TO BY HL
  213.     JMP    HELP1
  214.  
  215. *  LOCATE NEXT INFORMATION SECTION
  216. HELP4:
  217.     MOV    A,M    ; <CTRL-Z>?
  218.     INX    H    ; PT TO NEXT BYTE
  219.     CPI    CTRLZ
  220.     JZ    HELP$ERR    ; HELP FILE FORMAT ERROR
  221.     CPI    LF    ; LINE FEED (WS FILE)?
  222.     JZ    HELP5
  223.     CPI    CR    ; <CR>?
  224.     JNZ    HELP4
  225.     INX    H    ; 1ST BYTE OF NEXT LINE
  226. HELP5    MOV    A,M    ; GET CHAR
  227.     CPI    SECT$CHAR    ; NEW SECTION?
  228.     JZ    HELP3    ; CONTINUE LOOP IF SO
  229.     CPI    CTRLZ    ; EOF?
  230.     JNZ    HELP4    ; CONTINUE IF NOT
  231.  
  232. *  ERROR -- REACHED END OF HELP FILE
  233. HELP$ERR:
  234.     LXI    D,ERR3    ; FORMAT ERROR
  235.     CALL    PRINT$MESSAGE
  236.     JMP    HELP1
  237.  
  238. *  PRINT ALL OF HELP FILE
  239. HELP$ALL:
  240.     LHLD    FIRST$ENTRY    ; PT TO FIRST ENTRY
  241.     CALL    SET$LINE$CNT    ; SET LINE COUNT
  242. *  EXECUTE UNTIL A CTRL-Z IS ENCOUNTERED
  243. HA1:
  244.     INX    H    ; SKIP OVER COLON
  245.     CALL    PI1    ; PRINT INFO W/OUT LINE CNT INFO
  246.     MOV    A,M    ; GET LAST CHAR
  247.     CPI    CTRLZ
  248.     JNZ    HA1
  249.     JMP    HELP
  250.  
  251.  
  252.  
  253. *********************************************************
  254. *                            *
  255. *  HELP SUPPORT ROUTINE SECTION                *
  256. *                            *
  257. *********************************************************
  258.  
  259. *
  260. *  INPUT CHAR; CHAR IS IN A
  261. *
  262. CHAR$IN:
  263.     PUSH B ! PUSH D ! PUSH H
  264.     MVI    C,1    ; READ CHAR
  265.     CALL    BDOS
  266.     POP H ! POP D ! POP B
  267.     PUSH    PSW    ; SAVE CHAR
  268.     CALL    CRLF1
  269.     POP    PSW    ; RESTORE CHAR
  270.     RET
  271.  
  272. *
  273. *  PRINT CHAR IN A ON CON:
  274. *
  275. CHAR$OUT:
  276.     PUSH PSW ! PUSH B ! PUSH D ! PUSH H
  277.     MVI    C,2    ; WRITE
  278.     MOV    E,A    ; CHAR IN E
  279.     CALL    BDOS
  280.     POP H ! POP D ! POP B ! POP PSW
  281.     RET
  282.  
  283. *
  284. *  PRINT ERROR MSG PTED TO BY DE; ENDS IN '$'
  285. *
  286. PRINT$MESSAGE:
  287.     PUSH B ! PUSH D ! PUSH H
  288.     MVI    C,9    ; PRINT BUFFER
  289.     CALL    BDOS
  290.     POP H ! POP D ! POP B
  291.     RET
  292.  
  293. *
  294. *  MOVE BYTES PTED TO BY HL TO AREA PTED TO BY DE; B BYTES TO MOVE
  295. *
  296. MOVE:
  297.     MOV    A,M    ; GET BYTE
  298.     ANI    7FH    ; MASK OFF MSB -- IN CASE A WS FILE
  299.     STAX    D    ; PUT BYTE
  300.     INX    H    ; PT TO NEXT
  301.     INX    D
  302.     DCR    B    ; COUNT DOWN
  303.     JNZ    MOVE
  304.     RET
  305.  
  306. *
  307. *  READ RECORD FROM DISK; NEXT$ADR CONTAINS ADDRESS TO READ TO
  308. *    ON RETURN, BDOS ERROR CODE IS IN A (0=NO ERROR)
  309. *
  310. READ$RECORD:
  311.     MVI    C,20    ; READ NEXT RECORD
  312.     LXI    D,FCB    ; PT TO FCB
  313.     CALL    BDOS
  314.     PUSH    PSW    ; SAVE RETURN CODE
  315.     LHLD    NEXT$ADR    ; PT TO LOAD ADDRESS
  316.     LXI    D,BUFF    ; PT TO BUFFER TO LOAD FROM
  317.     MVI    B,128    ; NUMBER OF BYTES TO MOVE
  318.     XCHG
  319.     CALL    MOVE
  320.     XCHG
  321.     SHLD    NEXT$ADR    ; PT TO NEXT LOAD ADDRESS
  322.     POP    PSW    ; GET RETURN CODE
  323.     RET
  324.  
  325. *
  326. *  PRINT ONE LINE OF INFO SECTION; HL PTS TO LINE UPON ENTRY;
  327. *    HL PTS TO FIRST CHAR OF NEXT LINE UPON EXIT
  328. *
  329. PRINT$LINE:
  330.     MOV    A,M    ; GET CHAR
  331.     CPI    CR    ; EOL?
  332.     JZ    CRLF
  333.     CPI    LF    ; LINE FEED? (WS FILE)
  334.     JZ    CRLF0
  335.     CALL    CHAR$OUT    ; PRINT CHAR
  336.     INX    H    ; PT TO NEXT
  337.     JMP    PRINT$LINE
  338.  
  339. *
  340. *  PRINT CRLF, PT TO FIRST CHAR OF NEXT LINE, AND PAGE IF NECESSARY
  341. *
  342. CRLF:
  343.     INX    H    ; PT TO LF
  344. CRLF0:
  345.     INX    H    ; PT TO 1ST CHAR OF NEXT LINE
  346. CRLFC:
  347.     CALL    CRLF1    ; PRINT CRLF
  348.     LDA    LINE$CNT    ; GET LINE COUNT
  349.     DCR    A
  350.     STA    LINE$CNT
  351.     RNZ        ; OK -- CONTINUE
  352.     LXI    D,PAGEMS
  353.     CALL    PRINT$MESSAGE    ; PRINT PAGE MESSAGE
  354.     CALL    CHAR$IN    ; GET RESPONSE
  355.     ANI    0DFH    ; CAPITALIZE
  356.     CPI    'A'    ; ABORT?
  357.     JZ    HELP    ; START OVER IF SO
  358.     CPI    CTRLC    ; CP/M ABORT
  359.     JZ    HELP$EXIT
  360.     CALL    SET$LINE$CNT
  361.     CALL    CRLF1    ; NEW LINE
  362.     RET
  363.  
  364. *
  365. *  PRINT CR AND LF ONLY
  366. *
  367. CRLF1:
  368.     MVI    A,CR    ; PRINT CR
  369.     CALL    CHAR$OUT
  370.     MVI    A,LF    ; PRINT LF
  371.     CALL    CHAR$OUT
  372.     RET
  373.  
  374. *
  375. *  SET LINE$CNT VARIABLE TO SCREEN SIZE
  376. *
  377. SET$LINE$CNT:
  378.     MVI    A,LINES$PER$SCREEN-1
  379.     STA    LINE$CNT
  380.     RET
  381.  
  382. *
  383. *  PRINT THE HEADER SECTION AND LOAD FIRST$ENTRY PTR
  384. *
  385. PRINT$HEADER:
  386.     LXI    H,HELP$BUF
  387.     CALL    SET$LINE$CNT
  388.     MVI    A,'A'    ; INIT SELECTION CHAR
  389.     STA    SEL$CHAR
  390.     LXI    D,SELECTMS
  391.     CALL    PRINT$MESSAGE
  392.     MVI    C,0    ; COUNT NUMBER OF SELECTIONS
  393.  
  394. * PRINT LINE UNTIL FIRST INFORMATION SECTION FOUND
  395. PH1:
  396.     MOV    A,M    ; GET CHAR
  397.     CPI    SECT$CHAR
  398.     JZ    PH2
  399.     CPI    CTRLZ    ; EOF? -- ABORT
  400.     JZ    HELP$EXIT
  401.     INR    C    ; INCREMENT SELECTION COUNT
  402.     LDA    SEL$CHAR    ; DISPLAY SELECTION CHAR
  403.     CALL    CHAR$OUT
  404.     INR    A    ; INCR CHAR
  405.     STA    SEL$CHAR
  406.     MVI    A,'.'
  407.     CALL    CHAR$OUT
  408.     MVI    A,' '
  409.     CALL    CHAR$OUT
  410.     CALL    PRINT$LINE    ; PRINT HEADER LINE
  411.     JMP    PH1
  412.  
  413. *  SAVE PTR TO FIRST ENTRY
  414. PH2:
  415.     SHLD    FIRST$ENTRY
  416.     RET
  417.  
  418. *
  419. *  PRINT AN INFORMATION SECTION
  420. *
  421. PRINT$INFO:
  422.     CALL    SET$LINE$CNT
  423. PI1:
  424.     CALL    PRINT$LINE    ; PRINT LINE FROM INFO FILE
  425.     MOV    A,M    ; DONE?
  426.     CPI    CTRLZ    ; EOF?
  427.     JZ    PI2
  428.     CPI    SECT$CHAR    ; NEXT SECTION
  429.     JZ    PI2
  430.     CPI    FF    ; FORM FEED?
  431.     JNZ    PI1
  432.     CALL    FORM$FEED    ; FEED SCREEN
  433.     JMP    PI1
  434.  
  435. *  FORM FEED SCREEN
  436. FORM$FEED:
  437.     LDA    LINE$CNT    ; GET LINE COUNT
  438.     MOV    B,A    ; ... IN B
  439. FEED$LOOP:
  440.     PUSH    B    ; SAVE B
  441.     CALL    CRLFC    ; NEW LINE
  442.     POP    B    ; GET B
  443.     DCR    B    ; COUNT DOWN
  444.     JNZ    FEED$LOOP
  445.     RET
  446.  
  447. *  END OF INFO
  448. PI2:
  449.     CALL    CRLF1    ; NEW LINE
  450.     LDA    LINE$CNT    ; COUNT DOWN
  451.     DCR    A
  452.     STA    LINE$CNT
  453.     JNZ    PI2
  454.     LXI    D,ENDMS        ; PRINT END OF INFORMATION MSG
  455.     CALL    PRINT$MESSAGE
  456.     CALL    CHAR$IN    ; GET ANY CHAR
  457.     CPI    CTRLC    ; CP/M ABORT
  458.     JZ    HELP$EXIT
  459.     CALL    SET$LINE$CNT    ; RESET LINE COUNT IN CASE OF ALL
  460.     RET
  461.  
  462. *********************************************************
  463. *  MESSAGE AND BUFFER SECTION                *
  464. *********************************************************
  465.  
  466. HELPMS:
  467.     DB    'HELP V1.1',CR,LF,'$'
  468. ENDMS:
  469.     DB    '   ++ EOI ++'
  470.     DB    '    Type CTRL-C to return to CP/M, <CR> to continue -$'
  471. SELECTMS:
  472.     DB    CR,LF,'  HELP File Selections are --',CR,LF,'$'
  473. DEFFN:
  474.     DB    0,'HELP    '
  475. DEFEXT:
  476.     DB    'HLP'
  477. PAGEMS:
  478.     DB    '   Type "A"=Abort, CTRL-C=CP/M, <CR>=Cont -$'
  479. ERR1:
  480.     DB    CR,LF,'HELP FATAL ERROR -- File not Found$'
  481. ERR2:
  482.     DB    CR,LF,'HELP ERROR -- Invalid Response',CR,LF,'$'
  483. ERR3:
  484.     DB    CR,LF,'HELP ERROR -- EOF on HELP File',CR,LF,'$'
  485. PROMPT$MESSAGE:
  486.     DB    CR,LF,'  Type CTRL-C to return to CP/M, "*" to select'
  487.     DB    ' all, or enter selection - $'
  488.  
  489. SEL$CHAR:
  490.     DS    1    ; SELECTION TABLE OPTION CHAR
  491. FIRST$ENTRY:
  492.     DS    2    ; PTR TO FIRST ENTRY OF INFORMATION SECTION
  493. LINE$CNT:
  494.     DS    1    ; LINE COUNT BUFFER
  495. DFFLG:
  496.     DS    1    ; DEFAULT FILE FLAG (0=NOT SEARCH FOR, 1=YES)
  497. NEXT$ADR:
  498.     DS    2    ; NEXT LOAD ADDRESS
  499.     DS    80    ; STACK SPACE
  500. STACK:
  501.     DS    2    ; CP/M STACK PTR
  502.  
  503.  
  504. *
  505. *  DEFAULT HELP MESSAGE
  506. *
  507. HELP$BUF:
  508.     DB    ':The HELP Subsystem for Online Documentation'
  509.     DB    CR,LF,'     This is HELP, the Online Documentation Subsystem.'
  510.     DB    CR,LF,'The purpose of HELP is to allow the user to '
  511.     DB    'interactively'
  512.     DB    CR,LF,'query the *.HLP files of the system in order to receive'
  513.     DB    CR,LF,'information summaries on various aspects of the user''s'
  514.     DB    CR,LF,'working environment, such as the language systems he is'
  515.     DB    CR,LF,'using and certain subsystems available to him.'
  516.     DB    CR,LF,LF,'     When the user types ''HELP'', a search is done'
  517.     DB    CR,LF,'for the file ''HELP.HLP''.  If found, the contents of'
  518.     DB    CR,LF,'this HELP File is displayed to the user; if not found,'
  519.     DB    CR,LF,'the HELP Information you are now reading is displayed.'
  520.     DB    CR,LF,LF,'     If the user desires information on a specific'
  521.     DB    CR,LF,'topic and he has a HELP File of that name (ie, CPM.HLP'
  522.     DB    CR,LF,'is a HELP File on CP/M), he may issue of HELP Command'
  523.     DB    CR,LF,'of the form --'
  524.     DB    CR,LF,'               HELP d:topic'
  525.     DB    CR,LF,'where "d:" is the disk the HELP File resides on'
  526.     DB    ' (optional)'
  527.     DB    CR,LF,'and "topic" is the name of the HELP File (topic.HLP,'
  528.     DB    CR,LF,'like CPM.HLP).'
  529.     DB    CR,LF,'     Please refer to the HELP File "HELP.HLP" for'
  530.     DB    ' more information.'
  531.  
  532.     DB    CR,LF,CTRLZ    ; END OF FILE
  533.  
  534.  
  535.     END
  536.