home *** CD-ROM | disk | FTP | other *** search
- * PROGRAM NAME: HELP
- * AUTHOR: RICHARD CONN
- * DATE: 30 OCT 81
- * VERSION: 2.0
- * PREVIOUS VERSIONS: 1.8 (18 OCT 81), 1.7 (10 SEP 81), 1.6 (9 SEP 81)
- * PREVIOUS VERSIONS: 1.5 (9 SEP 81), 1.4 (8 SEP 81), 1.3 (8 SEP 81)
- * PREVIOUS VERSIONS: 1.2 (7 SEP 81), 1.1 (6 OCT 80), 1.0 (18 NOV 79)
-
- VERS EQU 20 ; VERSION NUMBER
-
- *****************************************************************
- * *
- * HELP -- DISPLAY HELP FILE INFORMATION TO USER ON CON: *
- * *
- * -- Command Format -- *
- * THE HELP COMMAND IS OF THE GENERAL FORM: *
- * HELP <FILENAME>.<TYP> *
- * *
- * <FILENAME>.<TYP> IS OPTIONAL; IF OMITTED COMPLETELY, *
- * 'HELP.HLP' IS ASSUMED; IF JUST <TYP> IS OMITTED, FILE TYPE *
- * IS ASSUMED TO BE '.HLP' *
- * *
- * -- Basic Background Information -- *
- * THE HELP COMMAND DISPLAYS THE INFORMATION IN A HELP *
- * FILE TO THE USER. THERE ARE TWO BASIC TYPES OF HELP FILES -- *
- * (1) INDEXED AND (2) NON-INDEXED. INDEXED HELP FILES ARE *
- * THOSE WHICH CONTAIN SEVERAL SECTIONS; THE INDIVIDUAL MAY *
- * READ ALL OF SUCH A HELP FILE OR JUST SELECTED SECTIONS OF *
- * THIS FILE. NON-INDEXED HELP FILES CONTAIN ONLY ONE SECTION. *
- * STRUCTURALLY SPEAKING, HELP FILES CONSIST OF TWO PARTS: *
- * THE HEADER PART AND THE INFORMATION PART. THE INFORMATION *
- * PART OF A HELP FILE BEGINS WITH A LINE WHOSE FIRST CHARACTER *
- * IS A COLON. THE TITLE OF THE INFORMATION SECTION IS ON THIS *
- * LINE. THE INFORMATION SECTION CONTINUES UNTIL THE NEXT *
- * INFORMATION SECTION (LINE STARTING WITH A COLON) OR THE END *
- * OF THE FILE IS ENCOUNTERED. THE HEADER PART CONSISTS OF A *
- * GROUP OF LINES BEFORE THE FIRST INFORMATION SECTION. IF THE *
- * FIRST LINE OF A HELP FILE STARTS WITH A COLON, THEN THERE IS *
- * NO HEADER PART, AND THE HELP FILE IS DUMPED AS ONE *
- * INFORMATION SECTION. *
- * THE INFORMATION SECTION IS ITSELF DIVIDED INTO PARTS, *
- * CALLED FRAMES. A FRAME IS ONE SCREEN DISPLAY, THE SIZE OF *
- * WHICH IS SET BY AN EQUATE. IF THE HELP FILE CONTAINS A FORM *
- * FEED CHARACTER, THEN THE CURRENT FRAME IS ABRUPTLY TERMINATED *
- * AND THE RESET OF THE SCREEN DISPLAY IS FILLED WITH BLANK *
- * LINES. OTHERWISE, WHEN THE INDICATED NUMBER OF LINES HAVE *
- * BEEN DISPLAYED, THE HELP PROGRAM PAUSES TO ALLOW THE USER TO *
- * VIEW THE INFORMATION AND SELECT THE NEXT DIRECTION IN WHICH *
- * TO GO. *
- * *
- * -- Traversing the HELP File -- *
- * WHILE IN THE HELP SYSTEM, THE USER IS GIVEN SEVERAL *
- * OPTIONS AT ALL TIMES AS TO WHAT HE CAN DO. *
- * AT THE MENU LEVEL OF INDEXED HELP FILES, THE USER CAN *
- * MOVE IN THE FOLLOWING DIRECTIONS: *
- * 1. SELECTION OF A MENU ITEM, IN WHICH CASE *
- * HE ENTERS THAT INFORMATION SECTION *
- * 2. MOVE UP TO THE PREVIOUS LEVEL. IF THE HELP *
- * FILE THE USER IS IN WAS REACHED THROUGH ANOTHER HELP FILE, *
- * THE USER CAN RETURN TO THAT HELP FILE (MOVE UP A LEVEL). *
- * IF THE USER WAS IN THE "SELECT ALL ITEMS" MODE, HE CONTINUES *
- * WITH THE PREVIOUS HELP FILE WHERE HE LEFT OFF; IF THE USER *
- * WAS LOOKING AT A SPECIFIC MENU ITEM (WHICH CALLED THE HELP *
- * FILE HE IS IN NOW), HE IS RETURNED TO THE MENU OF THE CALLING *
- * HELP FILE. *
- * 3. EXIT TO CP/M. AT ALL TIMES, THE USER IS *
- * ALLOWED TO RETURN TO CP/M. *
- * WHILE IN AN INFORMATION SECTION, THE USER MAY *
- * MOVE IN THE FOLLOWING DIRECTIONS: *
- * 1. FORWARD TO THE NEXT FRAME. IF AT THE END *
- * OF THE INFORMATION SECTION, THIS RETURNS THE USER TO THE *
- * MENU IF IT IS AN INDEXED HELP FILE, TO CP/M IF THE USER IS *
- * IN A NON-INDEXED HELP FILE AT LEVEL 0 (NOT CALLED BY ANOTHER *
- * HELP FILE), OR TO THE CALLING HELP FILE IF NOT AT LEVEL 0. *
- * 2. BACKWARD TO THE PREVIOUS FRAME. IF AT THE *
- * BEGINNING OF AN INFORMATION SECTION, AN ERROR MESSAGE IS *
- * PRINTED. *
- * 3. TO THE MENU IF IN AN INDEXED HELP FILE. *
- * 4. TO THE START OF THE CURRENT INFORMATION *
- * SECTION DIRECTLY. *
- * 5. TO THE PREVIOUS LEVEL (CALLING HELP FILE). *
- * *
- * -- Nodes and Help File Nesting -- *
- * AN INFORMATION SECTION MAY BEGIN WITH A DOUBLE COLON *
- * (::), AND THIS DESIGNATOR IS FOLLOWING BY THE FILE NAME OF A *
- * HELP FILE WHICH IS TO BE LOADED AS A NODE. NODES TO THE HELP *
- * PROGRAM ARE COMPLETE HELP FILES IN THEMSELVES, AND THEY MAY *
- * REFER TO OTHER NODES AS WELL. IN THIS WAY, A TREE STRUCTURE *
- * MAY BE DESIGNED BY THE AUTHOR OF A HELP FILE, EACH NODE OF *
- * THE TREE BEING A HELP FILE IN ITS OWN RIGHT (WHICH MAY BE *
- * ACCESSED INDEPENDENTLY). NODES MAY BE NESTED A NUMBER OF *
- * LEVELS, SPECIFIED BY THE HELP$MAX EQUATE. *
- * TO VIEW THIS CONCEPT MORE CLEARLY, THE FOLLOWING DIAGRAM*
- * IS OFFERED: *
- * -- Basic HELP File -- *
- * :Info Sect 1 :Info Sect 2 :Info Sect 3 :Info Sect 4 : *
- * : Text : HELP File : Text : HELP File : *
- * / \ / \ *
- * -- SubHelp File 1 -- -- SubHelp File 2 --*
- * :Info Sect 1 :Info Sect 2 : :Info Sect 1 :Info Sect2*
- * : Text : HELP File : : Text : Text *
- * / \ *
- * -- SubSubHelp File 1 -- *
- * :Info Sect 1 :Info Sect 2 :Info Sect 3 : *
- * : Text : HELP File : HELP File : *
- * / \ / \ *
- * -- Sub3Help File 1 -- -- Sub3Help File 2 -- *
- * :Info Sect : :Info Sect 1 :Info Sect 2: *
- * : Text : : Text : HELP File : *
- * / \ *
- * -- Sub4Help File -- *
- * :Info Sect 1 :Info Sect 2: *
- * : Text : Text : *
- * *
- * AS THE USER CAN SEE, TREE STRUCTURES ARE NOW POSSIBLE. *
- * ONE HELP FILE CAN REFERENCE ANOTHER WHICH INTURN REFERENCES *
- * ANOTHER AND SO ON. THERE IS A LIMIT TO HOW DEEP THE NESTING *
- * MAY GO, AND THAT IS SPECIFIED IN THE EQUATE FOR HELP$MAX. *
- * *
- * -- What Help Can Do -- *
- * SINCE A HELP FILE MUST BE MEMORY RESIDENT, THIS IS *
- * CONVENIENT IN TWO WAYS: (1) "MASTER" HELP FILES MAY BE *
- * CREATED WHICH REFERENCE OTHER HELP FILES, AND THE INFORMATION *
- * ACCESSED FROM A MASTER HELP FILE MAY ENCOMPASS ALL OF THE *
- * USER'S HELP FILE AND (2) IF THE USER NEEDS INFORMATION *
- * IN A SPECIFIC SUBJECT AREA AND KNOWS WHICH HELP FILE REFERS *
- * TO THE INFORMATION HE NEEDS, HE NEED NOT LOAD THE MASTER *
- * AND THEN TRAVERSE THE TREE TO THE INFORMATION HE NEEDS; HE *
- * MAY SPECIFY THE SPECIFIC HELP FILE DIRECTLY. *
- * *
- * -- Command-Search Hierarchy -- *
- * ONE OTHER POINT TO NOTE IS THAT THE HELP PROGRAM NOW *
- * EMPLOYS A COMMAND-SEARCH HIERARCHY IN LOCATING A REFERENCED *
- * HELP FILE. ONCE A FILE SPECIFICATION IS GIVEN, THE HELP *
- * PROGRAM SEARCHES THE CURRENT USER AREA ON THE CURRENT DISK FOR*
- * THE FILE; IF NOT FOUND, IT DROPS TO USER AREA 0 (MAY BE *
- * CHANGED) ON THE CURRENT DISK IF THE USER IS NOT ALREADY THERE *
- * AND LOOKS FOR THE FILE; IF NOT FOUND THIS TIME, IT DROPS TO *
- * USER AREA 0 OF THE DISK ON DRIVE A: AND SEARCHES FOR THE FILE.*
- * IF NOT FOUND AT THIS POINT, HELP CHECKS TO SEE IF THE REFER- *
- * ENCED FILE WAS HELP.HLP, IN WHICH CASE IT PRESENTS THE BUILT- *
- * IN DOCUMENTATION (SEE END OF PROGRAM); FINALLY, IF NONE OF THE*
- * ABOVE ARE TRUE, HELP ABORTS WITH AN ERROR MESSAGE. *
- * *
- * -- HELP File Structure Warning -- *
- * THERE MUST BE THE SAME NUMBER OF LINES IN THE HEADER *
- * PART AS THERE ARE INFORMATION SECTIONS. IF NOT, A HELP *
- * FILE ERROR WILL BE ISSUED IF THE HELP COMMAND ATTEMPTS TO *
- * READ BEYOND THE END OF THE HELP FILE IN ITS SEARCH FOR AN *
- * INFORMATION SECTION. *
- * *
- *****************************************************************
-
-
- *****************************************************************
- * *
- * THE HELP PROGRAM IS COMPLETELY TRANSPORTABLE BETWEEN CP/M *
- * SYSTEMS. *
- * *
- *****************************************************************
-
-
-
- *****************************************************************
- * CP/M AND BASIC CHARACTER DEFINITIONS *
- *****************************************************************
-
- FALSE EQU 0
- TRUE EQU NOT FALSE
-
- BDOS EQU 5 ; ADDRESS OF BDOS ENTRY POINT
- FCB EQU 5CH ; ADDRESS OF FILE CONTROL BLOCK
- BUFF EQU 80H ; ADDRESS OF DMA BUFFER
-
- CR EQU 0DH ; <CR>
- LF EQU 0AH ; <LF>
- FF EQU 'L'-40H ; CTRL-L = FORM FEED
- CTRLZ EQU 'Z'-40H ; CTRL-Z
- CTRLC EQU 'C'-40H ; CTRL-C
-
- *****************************************************************
- * SPECIAL CONTROL CHARACTERS WHICH MAY BE RESET BY USER *
- *****************************************************************
-
- SECT$CHAR EQU ':' ; DEFINED TO BE COLON
- BACKUP$CHAR EQU 'L' ; BACK UP TO PREVIOUS FRAME CHAR
- START$CHAR EQU 'S' ; JUMP TO START OF INFORMATION CHAR
- MENU$CHAR EQU 'M' ; CHAR TO ABORT TO MENU
- CPM$ABORT$CHAR EQU CTRLC ; CHAR TO ABORT TO CP/M
- LEVEL$RET$CHAR EQU '^' ; RETURN TO PREVIOUS HELP LEVEL
- ROOT$CHAR EQU '.' ; RETURN TO ROOT OF HELP
-
- *****************************************************************
- * USER CUSTOMIZATION -- LINES PER SCREEN DISPLAY *
- *****************************************************************
-
- LINES$PER$SCREEN EQU 24 ; ASSUME 24 LINES/SCREEN
-
- *******************************************************************
- * USER CUSTOMIZATION -- NUMBER OF FILES NAMES PER LINE ON SCREEN *
- *******************************************************************
-
- NAMES$PER$LINE EQU 6 ; 6 NAMES (SPACE = 6*11 COLS)
-
- *****************************************************************
- * USER CUSTOMIZATION -- DEFAULT USER NUMBER *
- *****************************************************************
-
- DEFAULT$USER EQU 0 ; DEFAULT USER NUMBER = 0
-
- *****************************************************************
- * USER CUSTOMIZATION -- DEFAULT DISK *
- *****************************************************************
-
- DEFAULT$DISK EQU 'A' ; DEFAULT DISK = A:
-
- *****************************************************************
- * USER CUSTOMIZATION -- ALL HELP FILES MUST BE OF TYPE 'HLP' *
- *****************************************************************
-
- FORCE$HLP EQU TRUE ; TRUE IF FILES MUST BE OF TYPE HLP
-
- *********************************************************************
- * USER CUSTOMIZATION -- IF NO HELP FILE GIVEN, SEARCH FOR HELP.HLP *
- *********************************************************************
-
- DEFAULT$HELP$HLP EQU FALSE ; TRUE IF SEARCH FOR HELP.HLP
-
- *****************************************************************
- * USER CUSTOMIZATION -- NUMBER OF NODES (LEVELS) IN HELP TREE *
- *****************************************************************
-
- HELP$MAX EQU 10 ; DEFAULT = 10 (SPACE=11*HELP$MAX)
-
-
-
- *****************************************************************
- * START OF PROGRAM *
- *****************************************************************
-
- ORG 100H
-
- START:
- LXI H,0 ; GET SP
- DAD SP
- SHLD STACK
- LXI SP,STACK ; NEW STACK
- MVI A,0FFH ; SET NO CHANGE
- STA CUR$DISK ; TO CALLING DISK
- STA CUR$USER ; OR TO CALLING USER
- LXI D,BUFF ; SET DMA ADDRESS
- MVI C,26
- CALL BDOS
- LDA BDOS+2 ; BASE PAGE OF BDOS
- SUI 10 ; 2K + 2 PAGES
- STA TPA$END
- XRA A ; A=0
- STA DFFLG ; TURN OFF DEFAULT FILE FLAG
- STA HELP$LEVEL ; SET HELP LEVEL TO 0 (NO RETURN FILE)
- LXI D,HELPMS ; PRINT OPENING MSG
- CALL PRINT$MESSAGE
- LXI H,FCB+1 ; CHECK FOR FILE NAME
- MOV A,M
- CPI ' ' ; NONE?
- JZ DEFAULT$FN
- ORA A ; ALSO NONE
- JNZ START1
-
- * INSERT 'HELP.HLP' INTO FCB OR CLEAR FCB
- DEFAULT$FN:
-
- IF DEFAULT$HELP$HLP ; IF SEARCH FOR DEFAULT HELP.HLP ON
- DCX H ; PT TO FCB
- LXI D,DEFFN
- MVI B,12 ; 12 BYTES
- XCHG
- CALL MOVE ; MOVE (HL) TO (DE) FOR (B) BYTES
- ENDIF
-
- IF NOT DEFAULT$HELP$HLP ; IF NO SEARCH FOR DEFAULT HELP.HLP
- MVI A,' ' ; <SP> FILL
- MVI B,11 ; 11 BYTES
- FILL:
- MOV M,A ; STORE <SP>
- INX H ; PT TO NEXT
- DCR B ; COUNT DOWN
- JNZ FILL
- ENDIF
-
- MVI A,1 ; TURN ON DEFAULT FILE FLAG
- STA DFFLG
-
- * START/RESTART HELP PROGRAM (START ON INITIAL ENTRY, RESTART ON NODE LOAD)
- START1:
- LXI SP,STACK ; SET STACK POINTER
-
- * CLEAR NON-NAME/TYPE BYTES IN FCB
- LXI H,FCB ; INITIAL ZERO
- MVI M,0 ; STORE 0 FOR DRIVE (CURRENT LOGGED-IN)
- LXI D,12 ; SKIP TO EXTENT
- DAD D
- MVI B,24 ; FILL 24 BYTES
- FCB$FILL:
- MVI M,0 ; ZERO FILL
- INX H ; PT TO NEXT
- DCR B ; COUNT DOWN
- JNZ FCB$FILL
-
- * CHECK FOR WILD CARDS IN FILE NAME -- ERROR IF SO
- LXI H,FCB+1 ; PT TO FIRST BYTE OF FILE NAME
- MVI B,11 ; 11 BYTES
- FCB$WILD$CK:
- MOV A,M ; GET BYTE
- ANI 7FH ; MASK
- CPI '?' ; WILD?
- JZ FCB$WILD$ERROR
- INX H ; PT TO NEXT
- DCR B ; COUNT DOWN
- JNZ FCB$WILD$CK
-
- * CHECK FOR FILE TYPE
- LXI H,FCB+9 ; CHECK FOR FILE TYPE
-
- IF NOT FORCE$HLP ; IF FILE TYPE MAY NOT BE HLP
- MOV A,M ; CHECK FOR FILE TYPE SPECIFIED
- CPI ' ' ; NONE?
- JZ DEFAULT$EXT
- ORA A ; NONE ALSO
- JNZ START2
- ENDIF
-
- * PLACE DEFAULT FILE TYPE OF '.HLP' IN FCB
- DEFAULT$EXT:
- LXI D,DEFTYP
- MVI B,3
- XCHG
- CALL MOVE ; MOVE (HL) TO (DE) FOR (B) BYTES
-
- * OPEN FILE
- START2:
- LDA FCB+1 ; CHECK FOR FILE NAME
- CPI ' ' ; NONE?
- JZ HELP$DEF ; DISPLAY DEFAULT HELP INFO WITH FILE NAMES
- MVI A,0FFH ; SET NO CHANGE FLAG
- STA CUR$USER ; SET NO USER CHANGE
- STA CUR$DISK ; SET NO DISK CHANGE
-
- * OPTION 1: TRY TO OPEN FILE IN CURRENT USER NUMBER ON CURRENT DISK
- LXI D,FCB ; PT TO FCB
- MVI C,15 ; OPEN FILE
- CALL BDOS
- CPI 255 ; NOT PRESENT?
- JNZ START3
- MVI C,12 ; GET VERSION NUMBER
- CALL BDOS
- MOV A,H ; CP/M 1.X?
- ORA L
- JZ START2$DISK ; CHECK FOR DEFAULT DISK IF SO
-
- * OPTION 2: TRY TO OPEN FILE IN USER 0 ON CURRENT DISK
- MVI E,0FFH ; GET CURRENT USER NUMBER
- MVI C,32 ; GET/SET USER CODE
- CALL BDOS
- CPI DEFAULT$USER ; CHECK IF AT USER 0 (OR DEFAULT USER)
- JZ START2$DISK ; DON'T TRY IF AT USER 0
- STA CUR$USER ; SAVE FOR LATER
- MVI E,DEFAULT$USER ; SET USER 0 (OR DEFAULT USER)
- MVI C,32 ; GET/SET USER CODE
- CALL BDOS
- LXI D,FCB ; TRY TO OPEN FILE AGAIN
- MVI C,15 ; OPEN FILE
- CALL BDOS
- CPI 255 ; NOT PRESENT?
- JNZ START3
-
- * OPTION 3: TRY TO OPEN FILE IN USER 0 ON DEFAULT DISK IF NOT CURRENT DISK
- START2$DISK:
- MVI C,25 ; DETERMINE CURRENT DISK
- CALL BDOS
- CPI DEFAULT$DISK-'A' ; ON DEFAULT DISK?
- JZ START2$DEFAULT
- STA CUR$DISK ; SAVE DISK NUMBER IN BYTE
- MVI E,DEFAULT$DISK-'A' ; SELECT DISK A:
- MVI C,14 ; SELECT DISK
- CALL BDOS
- LXI D,FCB ; TRY TO OPEN FILE ONE LAST TIME
- MVI C,15 ; OPEN FILE
- CALL BDOS
- CPI 255 ; NOT PRESENT?
- JNZ START3
-
- * CHECK FOR DEFAULT FILE SEARCH
- START2$DEFAULT:
- CALL RESET$SYSTEM ; RESTORE CURRENT DISK AND USER IF CHANGED
- LDA DFFLG ; GET DEFAULT FILE FLAG
- ORA A ; 1=YES, SEARCH FOR DEFAULT FAILED
- JNZ HELP$DEF ; DISPLAY DEFAULT HELP FILE INFORMATION
-
- * FILE NOT FOUND -- FATAL ERROR
- LXI D,ERR1 ; FILE NOT FOUND
- CALL PRINT$MESSAGE
- JMP HELP$EXIT
-
- * FILE CONTAINS WILD CARDS -- FATAL ERROR
- FCB$WILD$ERROR:
- LXI D,WILD$ERR ; WILD CARD
- CALL PRINT$MESSAGE
- JMP HELP$EXIT
-
- *
- * DISPLAY DEFAULT HELP FILE INFORMATION
- *
- HELP$DEF:
- CALL RESET$SYSTEM ; RESET CALLING DISK/USER
- LXI D,HELP$DEF$MSG ; PRINT MESSAGE
- CALL PRINT$MESSAGE
- CALL SET$COUNT ; SET COUNTER
- CALL PRINT$HELP$FILES
- MVI C,12 ; GET VERSION NUMBER
- CALL BDOS
- MOV A,H ; CP/M 1.X?
- ORA L
- JZ HELP$DEF1 ; CHECK FOR DEFAULT DISK IF SO
-
- * TRY TO OPEN FILE IN USER 0 ON CURRENT DISK
- MVI E,0FFH ; GET CURRENT USER NUMBER
- MVI C,32 ; GET/SET USER CODE
- CALL BDOS
- CPI DEFAULT$USER ; CHECK IF AT USER 0 (OR DEFAULT USER)
- JZ HELP$DEF1 ; DON'T TRY IF AT USER 0
- STA CUR$USER ; SAVE FOR LATER
- MVI E,DEFAULT$USER ; SET USER 0 (OR DEFAULT USER)
- MVI C,32 ; GET/SET USER CODE
- CALL BDOS
- CALL PRINT$HELP$FILES
-
- * SEARCH DEFAULT DISK IN DEFAULT USER FOR FILE NAMES
- HELP$DEF1:
- MVI C,25 ; DETERMINE CURRENT DISK
- CALL BDOS
- CPI DEFAULT$DISK-'A' ; ON DEFAULT DISK?
- JZ HELP$DEF2
- STA CUR$DISK ; SAVE DISK NUMBER IN BYTE
- MVI E,DEFAULT$DISK-'A' ; SELECT DISK A:
- MVI C,14 ; SELECT DISK
- CALL BDOS
- CALL PRINT$HELP$FILES
-
- * DONE WITH SEARCH
- HELP$DEF2:
- CALL RESET$SYSTEM ; RESET CALLING DISK/USER NUMBER
- LXI D,HELP$DEF$MSG1 ; PRINT END MESSAGE
- CALL PRINT$MESSAGE
- CALL CHAR$IN ; GET ANY CHAR FOR RESPONSE
- CPI CTRLC ; ABORT?
- JZ HELP$EXIT
- JMP HELP ; PROCESS DEFAULT HELP FILE
-
- *
- * SET FILE NAME COUNTER
- *
- SET$COUNT:
- MVI A,NAMES$PER$LINE ; NUMBER OF FILE NAMES/LINE
- STA NAME$COUNT
- RET
-
- *
- * PRINT NAMES OF HELP FILES
- *
- PRINT$HELP$FILES:
- LXI H,FCB ; MAKE FCB = *.HLP
- MVI M,0 ; BEGINNING 0 FOR DEFAULT DISK
- MVI B,8 ; FILL 8 ?'S
- INX H ; PT TO FIRST CHAR
- PHF1:
- MVI M,'?' ; '?' FILL
- INX H ; PT TO NEXT
- DCR B ; COUNT DOWN
- JNZ PHF1
- LXI D,DEFTYP ; COPY DEFAULT FILE TYPE
- MVI B,3 ; 3 BYTES
- XCHG ; EXCHANGE
- CALL MOVE ; COPY
- XCHG ; RESTORE PTR
- MVI B,24 ; FILL REST WITH 0'S
- PHF2:
- MVI M,0 ; 0 FILL
- INX H ; PT TO NEXT
- DCR B ; COUNT DOWN
- JNZ PHF2
-
- * SEARCH FOR FIRST FILE
- LXI D,FCB ; PT TO FCB
- MVI C,17 ; SEARCH FOR FIRST
- CALL BDOS
- CPI 0FFH ; NONE?
- RZ ; DONE IF SO
-
- * PRINT CURRENT AND SEARCH FOR NEXT
- PHF3:
- CALL PRINT$HFN ; PRINT HELP FILE NAME
- LXI D,FCB ; PT TO FCB
- MVI C,18 ; SEARCH FOR NEXT
- CALL BDOS
- CPI 0FFH ; DONE?
- JNZ PHF3
- RET
-
- *
- * PRINT NAME OF FILE WHOSE BUFF OFFSET IS IN A
- *
- PRINT$HFN:
- RRC ; A=A*32
- RRC
- RRC ; RATHER THAN 5 LEFT, I DO 3 RIGHT (NEAT, HUH?)
- ANI 60H ; MASK ALL BUT INTERESTING PART
- LXI H,BUFF ; PT TO BUFFER
- ADD L ; PT TO ENTRY
- MOV L,A
- MOV A,H
- ACI 0
- MOV H,A ; HL PTS TO ENTRY
- INX H ; HL PTS TO HELP FILE NAME
- MVI B,8 ; 8 CHARS
- PHFN1:
- MOV A,M ; GET CHAR
- ANI 7FH ; MASK
- INX H ; PT TO NEXT
- CALL CHAR$OUT ; PRINT IT
- DCR B ; COUNT DOWN
- JNZ PHFN1
- MVI A,' ' ; TRAILING SPACES
- CALL CHAR$OUT ; 3 OF THEM
- CALL CHAR$OUT
- CALL CHAR$OUT
- LDA NAME$COUNT ; COUNT DOWN
- DCR A
- STA NAME$COUNT
- RNZ
- CALL SET$COUNT ; RESET COUNT
- CALL CRLF ; NEW LINE
- RET
-
- *
- * LOAD HELP FILE INFORMATION
- *
- START3:
- LXI H,HELP$BUF ; PT TO BUFFER
- SHLD NEXT$ADR ; SET PTR
-
- * READ RECORDS UNTIL EOF
- START4:
- CALL READ$RECORD ; READ INFO
- ORA A ; DONE? 0=NO
- JZ START4
- LXI D,FCB ; CLOSE FILE
- MVI C,16 ; CLOSE
- CALL BDOS
- CALL RESET$SYSTEM ; RESTORE CURRENT DISK AND USER IF CHANGED
-
- *
- * START OF HELP PROGRAM
- *
- HELP:
- LXI SP,STACK ; RESET STACK
- MVI A,0 ; SET NO FRAME
- STA FRAME$NUMBER
- LXI H,HELP$BUF ; PT TO BUFFER
- MOV A,M ; NO HEADER SECTION?
- ANI 7FH ; MASK OUT MSB
- CPI SECT$CHAR
- JNZ HELP1 ; HEADER SECTION EXISTS
- CALL PRINT$INFO ; PRINT HELP INFO PTED TO BY HL
- LDA HELP$LEVEL ; CHECK TO SEE IF WE ARE NOT AT LEVEL 0
- ORA A ; 0=LEVEL 0
- JZ HELP$EXIT ; ABORT IF SO
- JMP LEVEL$RETURN ; GO TO PREVIOUS LEVEL IF NOT
-
- * EXIT POINT FOR ANY EXIT FROM THE REST OF THE HELP PROGRAM
- HELP$EXIT:
- CALL RESET$SYSTEM ; RESET CALLING DISK/USER NUMBER
- LHLD STACK ; GET CP/M SP
- SPHL
- RET ; DONE
-
- * PRINT HEADER INFORMATION AND SELECT AN OPTION
- HELP1:
- CALL PRINT$HEADER ; PRINT HEADER
- PUSH B ; SAVE C (NUMBER OF VALID SELECTIONS)
- CALL CRLF1 ; NEW LINE
- CALL PR$LEVEL ; PRINT LEVEL NUMBER
- LXI D,PROMPT1$MESSAGE ; PRINT PROMPT
- CALL PRINT$MESSAGE
- LXI D,PROMPT2$MESSAGE ; LEVEL COMMAND
- LDA HELP$LEVEL ; CURRENT LEVEL = 0?
- ORA A ; SET FLAGS
- JZ HELP1A
- CALL PRINT$MESSAGE
- HELP1A:
- LXI D,PROMPT3$MESSAGE
- CALL PRINT$MESSAGE
- POP B ; GET C
- CALL CHAR$IN ; GET RESPONSE
- CPI CTRLC ; RETURN TO CP/M
- JZ HELP$EXIT
- CPI ROOT$CHAR ; GO TO ROOT
- JZ GO$ROOT
- CPI LEVEL$RET$CHAR ; RETURN TO PREVIOUS LEVEL
- JZ LEVEL$RETURN
- PUSH PSW ; SAVE CHAR
- CALL CRLF1
- POP PSW ; GET CHAR
- SUI 'A'-1 ; ADJUST FOR COUNT
- MOV B,A ; SAVE COUNT
- JZ BAD$RESPONSE
- JNC HELP2
-
- * INVALID RESPONSE
- BAD$RESPONSE:
- LXI D,ERR2 ; INVALID RESPONSE
- CALL PRINT$MESSAGE
- JMP HELP1
-
- * VALID RESPONSE -- LOOK FOR AND PRINT INFORMATION SECTION
- HELP2:
- INR C ; 1 MORE THAN NUMBER OF POSSIBLE SELECTIONS
- CMP C ; GREATER THAN NUMBER OF POSSIBLE SELECTIONS?
- JNC BAD$RESPONSE
- LHLD FIRST$ENTRY ; GET PTR TO FIRST ENTRY
-
- * PRINT INFORMATION WHEN COUNT IS ZERO
- HELP3:
- DCR B ; COUNT DOWN
- JNZ HELP4
- CALL PRINT$INFO ; PRINT INFO PTED TO BY HL
- JMP HELP1
-
- * LOCATE NEXT INFORMATION SECTION
- HELP4:
- MOV A,M ; <CTRL-Z>?
- ANI 7FH ; MASK OUT MSB
- INX H ; PT TO NEXT BYTE
- CPI CTRLZ
- JZ HELP$ERR ; HELP FILE FORMAT ERROR
- CPI LF ; LINE FEED (WS FILE)?
- JZ HELP5
- CPI CR ; <CR>?
- JNZ HELP4
- INX H ; 1ST BYTE OF NEXT LINE
- HELP5:
- MOV A,M ; GET CHAR
- ANI 7FH ; MASK OUT MSB
- CPI SECT$CHAR ; NEW SECTION?
- JZ HELP3 ; CONTINUE LOOP IF SO
- CPI CTRLZ ; EOF?
- JNZ HELP4 ; CONTINUE IF NOT
-
- * ERROR -- REACHED END OF HELP FILE
- HELP$ERR:
- LXI D,ERR3 ; FORMAT ERROR
- CALL PRINT$MESSAGE
- JMP HELP1
-
-
- *********************************************************
- * *
- * HELP SUPPORT ROUTINE SECTION *
- * *
- *********************************************************
-
- *
- * RESTORE CURRENT DISK AND CURRENT USER IF CHANGED
- *
- RESET$SYSTEM:
- LDA CUR$DISK ; CHECK DISK
- CPI 0FFH ; 0FFH=NO CHANGE
- JZ RESET$SYS1
- MOV E,A ; DISK IN E
- MVI C,14 ; SELECT DISK
- CALL BDOS
- MVI A,0FFH ; SET NO CHANGE
- STA CUR$DISK
- RESET$SYS1:
- LDA CUR$USER ; CHECK USER
- CPI 0FFH ; 0FFH=NO CHANGE
- RZ
- MOV E,A ; USER IN E
- MVI C,32 ; GET/SET USER CODE
- CALL BDOS
- MVI A,0FFH ; SET NO CHANGE
- STA CUR$USER
- RET
-
- *
- * INPUT CHAR; CHAR IS IN A
- *
- CHAR$IN:
- PUSH B ! PUSH D ! PUSH H
- MVI C,1 ; READ CHAR
- CALL BDOS
- POP H ! POP D ! POP B
- PUSH PSW ; SAVE CHAR
- CALL CRLF1
- POP PSW ; RESTORE CHAR
- *
- * CAPITALIZE CHAR IN A
- *
- CAPS:
- ANI 7FH ; MASK OUT MSB
- CPI 61H ; LESS THAN SMALL A?
- RC
- CPI 7BH ; LESS THAN LEFT BRACE?
- RNC
- ANI 5FH ; CAPITALIZE
- RET
-
- *
- * PRINT CHAR IN A ON CON:
- *
- CHAR$OUT:
- PUSH PSW ! PUSH B ! PUSH D ! PUSH H
- MVI C,2 ; WRITE
- MOV E,A ; CHAR IN E
- CALL BDOS
- POP H ! POP D ! POP B ! POP PSW
- RET
-
- *
- * PRINT ERROR MSG PTED TO BY DE; ENDS IN '$'
- *
- PRINT$MESSAGE:
- PUSH B ! PUSH D ! PUSH H
- MVI C,9 ; PRINT BUFFER
- CALL BDOS
- POP H ! POP D ! POP B
- RET
-
- *
- * MOVE BYTES PTED TO BY HL TO AREA PTED TO BY DE; B BYTES TO MOVE
- *
- MOVE:
- MOV A,M ; GET BYTE
- ANI 7FH ; MASK OFF MSB -- IN CASE A WS FILE
- STAX D ; PUT BYTE
- INX H ; PT TO NEXT
- INX D
- DCR B ; COUNT DOWN
- JNZ MOVE
- RET
-
- *
- * READ RECORD FROM DISK; NEXT$ADR CONTAINS ADDRESS TO READ TO
- * ON RETURN, BDOS ERROR CODE IS IN A (0=NO ERROR)
- *
- READ$RECORD:
- MVI C,20 ; READ NEXT RECORD
- LXI D,FCB ; PT TO FCB
- CALL BDOS
- PUSH PSW ; SAVE RETURN CODE
- LHLD NEXT$ADR ; PT TO LOAD ADDRESS
- LDA TPA$END ; CHECK AGAINST END PAGE OF TPA
- CMP H ; IF AT SAME PAGE, YES
- JZ READ$ERROR
- LXI D,BUFF ; PT TO BUFFER TO LOAD FROM
- MVI B,128 ; NUMBER OF BYTES TO MOVE
- XCHG
- CALL MOVE
- XCHG
- POP PSW ; GET RETURN CODE
- ORA A ; DONE?
- JZ READ$DONE ; RETURN IF NOT
-
- * CHECK FOR CTRLZ
- PUSH H ; SAVE PTR TO NEXT ADDRESS
- LHLD NEXT$ADR ; PT TO BEGINNING OF BLOCK
- MVI B,128 ; CHECK 128 BYTES
- CTRLZ$CHECK:
- MOV A,M ; GET BYTE
- ANI 7FH ; MASK OUT MSB
- INX H ; PT TO NEXT
- CPI CTRLZ ; EOF?
- JZ CTRLZ$FOUND
- DCR B ; COUNT DOWN
- JNZ CTRLZ$CHECK
- LXI D,CTRLZERR
- CALL PRINT$MESSAGE ; NO CTRLZ ERROR
- JMP HELP$EXIT
-
- * FILL REST OF BLOCK WITH CTRLZ
- CTRLZ$FOUND:
- DCR B ; COUNT DOWN
- JZ CTRLZ$DONE
- MVI M,CTRLZ ; FILL REST OF BLOCK WITH CTRLZ
- INX H ; PT TO NEXT
- JMP CTRLZ$FOUND
- CTRLZ$DONE:
- POP H ; PT TO NEXT BLOCK ADDRESS
-
- * READ OK -- SAVE PTR TO NEXT BLOCK
- READ$DONE:
- SHLD NEXT$ADR ; SET NEXT ADDRESS
- RET
-
- READ$ERROR:
- LXI D,READERR
- CALL PRINT$MESSAGE
- JMP HELP$EXIT
-
- *
- * PRINT ONE LINE OF INFO SECTION; HL PTS TO LINE UPON ENTRY;
- * HL PTS TO FIRST CHAR OF NEXT LINE UPON EXIT
- *
- PRINT$LINE:
- MOV A,M ; GET CHAR
- ANI 7FH ; MASK OUT MSB
- CPI CR ; EOL?
- JZ CRLF
- CPI LF ; LINE FEED? (WS FILE)
- JZ CRLF0
- CPI CTRLZ ; END OF FILE?
- JZ CRLFC ; DONE IF SO
- CALL CHAR$OUT ; PRINT CHAR
- INX H ; PT TO NEXT
- JMP PRINT$LINE
-
- *
- * PRINT CRLF, PT TO FIRST CHAR OF NEXT LINE, AND PAGE IF NECESSARY
- *
- CRLF:
- INX H ; PT TO LF
- CRLF0:
- INX H ; PT TO 1ST CHAR OF NEXT LINE
- CRLFC:
- CALL CRLF1 ; PRINT CRLF
- LDA LINE$CNT ; GET LINE COUNT
- DCR A
- STA LINE$CNT
- RNZ ; OK -- CONTINUE
- MOV A,M ; SET MSB OF FIRST CHAR OF NEXT LINE
- ORI 80H
- MOV M,A ; MSB IS SET FOR LATER BACKUP
- FRAME$PAUSE:
- CALL PR$LEVEL ; PRINT LEVEL NUMBER
- LDA FRAME$NUMBER ; INCREMENT FRAME NUMBER
- INR A
- STA FRAME$NUMBER
- LXI D,PAGEMS
- CALL PRINT$MESSAGE ; PRINT PAGE MESSAGE
- LXI D,PAGE1MS ; NOT LEVEL 0?
- LDA HELP$LEVEL ; GET LEVEL NUMBER
- ORA A ; SET FLAGS
- JZ FP1
- CALL PRINT$MESSAGE
- FP1:
- LXI D,PAGE2MS
- CALL PRINT$MESSAGE
- CALL CHAR$IN ; GET RESPONSE
- CPI MENU$CHAR ; ABORT?
- JZ HELP ; START OVER IF SO
- CPI CPM$ABORT$CHAR ; CP/M ABORT
- JZ HELP$EXIT
- CPI ROOT$CHAR ; GO TO ROOT
- JZ GO$ROOT
- CPI LEVEL$RET$CHAR ; RETURN TO HIGHER LEVEL
- JZ LEVEL$RETURN
- CPI BACKUP$CHAR ; BACK UP?
- JZ FRAME$BACKUP
- CPI START$CHAR ; JUMP TO START OF INFO
- JZ INFO$START
- FRAME$RESUME:
- SHLD START$OF$FRAME
- CALL SET$LINE$CNT
- CALL CRLF1 ; NEW LINE
- RET
-
- * JUMP TO START OF INFORMATION
- INFO$START:
- LHLD START$OF$INFO ; PT TO START OF INFO
- MVI A,1 ; RESET FRAME COUNT
- STA FRAME$NUMBER
- JMP FRAME$RESUME ; CONTINUE PROCESSING
-
- * BACK UP TO PREVIOUS FRAME
- FRAME$BACKUP:
- CALL BOI$CHECK ; AT BEGINNING OF INFORMATION?
- JNZ FB1 ; CONTINUE IF NOT
- JMP FRAME$PAUSE
- FB1:
- DCX H ; BACK UP UNTIL BYTE WITH MSB SET IS FOUND
- MOV A,M ; GET BYTE
- ANI 80H
- JZ FB1
- LDA FRAME$NUMBER ; DECREMENT FRAME NUMBER
- DCR A ; BACK UP TO CURRENT FRAME NUMBER
- DCR A ; BACK UP TO PREVIOUS FRAME NUMBER
- STA FRAME$NUMBER
- JMP FRAME$RESUME ; CONTINUE PROCESSING
- *
- * PRINT CR AND LF ONLY
- *
- CRLF1:
- MVI A,CR ; PRINT CR
- CALL CHAR$OUT
- MVI A,LF ; PRINT LF
- CALL CHAR$OUT
- RET
-
- *
- * SET LINE$CNT VARIABLE TO SCREEN SIZE
- *
- SET$LINE$CNT:
- MVI A,LINES$PER$SCREEN-1
- STA LINE$CNT
- RET
-
- *
- * PRINT THE HEADER SECTION AND LOAD FIRST$ENTRY PTR
- * ON RETURN, C=NUMBER OF POSSIBLE SELECTIONS
- *
- PRINT$HEADER:
- MVI A,0 ; SET NO FRAME
- STA FRAME$NUMBER
- LXI H,HELP$BUF
- CALL SET$LINE$CNT
- MVI A,'A' ; INIT SELECTION CHAR
- STA SEL$CHAR
- LXI D,SELECTMS
- CALL PRINT$MESSAGE
- MVI C,0 ; COUNT NUMBER OF SELECTIONS
-
- * PRINT LINE UNTIL FIRST INFORMATION SECTION FOUND
- PH1:
- MOV A,M ; GET CHAR
- ANI 7FH ; MASK OUT MSB
- CPI SECT$CHAR
- JZ PH2
- CPI CTRLZ ; EOF? -- ABORT
- JZ HELP$EXIT
- INR C ; INCREMENT SELECTION COUNT
- LDA SEL$CHAR ; DISPLAY SELECTION CHAR
- CALL CHAR$OUT
- INR A ; INCR CHAR
- STA SEL$CHAR
- MVI A,'.'
- CALL CHAR$OUT
- MVI A,' '
- CALL CHAR$OUT
- CALL PRINT$LINE ; PRINT HEADER LINE
- JMP PH1
-
- * SAVE PTR TO FIRST ENTRY
- PH2:
- SHLD FIRST$ENTRY
- RET
-
- *
- * PRINT AN INFORMATION SECTION
- * INFORMATION SECTION IS PTED TO BY HL
- *
- PRINT$INFO:
- SHLD START$OF$INFO ; SET START OF INFORMATION POINTER
- CALL LOAD$NODE ; LOAD NEW NODE IF DUAL SECT$CHAR
- SHLD START$OF$FRAME ; SET FRAME POINTER
- MOV A,M ; SET MSB
- ORI 80H
- MOV M,A
- CALL SET$LINE$CNT
- MVI A,1 ; A=1
- STA FRAME$NUMBER ; SET FRAME NUMBER
- PI1:
- CALL PRINT$LINE ; PRINT LINE FROM INFO FILE
- MOV A,M ; DONE?
- ANI 7FH ; MASK OUT MSB
- CPI CTRLZ ; EOF?
- JZ PI2
- CPI SECT$CHAR ; NEXT SECTION
- JZ PI2
- CPI FF ; FORM FEED?
- JNZ PI1
- INX H ; PT TO CHAR AFTER FORM FEED
- CALL FORM$FEED ; FEED SCREEN
- JMP PI1
-
- * FORM FEED SCREEN
- FORM$FEED:
- LDA LINE$CNT ; GET LINE COUNT
- MOV B,A ; ... IN B
- FEED$LOOP:
- PUSH B ; SAVE B
- CALL CRLFC ; NEW LINE
- POP B ; GET B
- DCR B ; COUNT DOWN
- JNZ FEED$LOOP
- RET
-
- * END OF INFO
- PI2:
- MOV A,M ; SET MSB OF NEXT BYTE
- ORI 80H
- MOV M,A
- PI2A:
- CALL CRLF1 ; NEW LINE
- LDA LINE$CNT ; COUNT DOWN
- DCR A
- STA LINE$CNT
- JNZ PI2A
- PI2$MSG:
- CALL PR$LEVEL ; PRINT LEVEL NUMBER
- LDA FRAME$NUMBER ; INCREMENT FRAME NUMBER
- INR A
- STA FRAME$NUMBER
- LXI D,ENDMS ; PRINT END OF INFORMATION MSG
- CALL PRINT$MESSAGE
- LXI D,PAGE1MS ; PRINT LEVEL UP MESSAGE OPTIONALLY
- LDA HELP$LEVEL ; GET CURRENT HELP LEVEL
- ORA A ; SET FLAGS
- JZ PI2$MSG1
- CALL PRINT$MESSAGE
- PI2$MSG1:
- LXI D,PAGE2MS ; PRINT REST OF INFO MESSAGE
- CALL PRINT$MESSAGE
- CALL CHAR$IN ; GET ANY CHAR
- CPI MENU$CHAR ; MENU ABORT
- JZ HELP
- CPI CPM$ABORT$CHAR ; CP/M ABORT
- JZ HELP$EXIT
- CPI ROOT$CHAR ; GO TO ROOT
- JZ GO$ROOT
- CPI LEVEL$RET$CHAR ; RETURN TO HIGHER LEVEL
- JZ LEVEL$RETURN
- CPI BACKUP$CHAR ; BACK UP FROM EOI?
- JZ PI2$BACKUP
- CPI START$CHAR ; START OF INFO?
- JZ PI2$START
- CALL SET$LINE$CNT ; RESET LINE COUNT IN CASE OF ALL
- RET
-
- * JUMP TO START OF INFO
- PI2$START:
- LHLD START$OF$INFO ; PT TO START OF INFO
- CALL FRAME$RESUME ; RESET POINTERS
- MVI A,1 ; RESET FRAME COUNT
- STA FRAME$NUMBER
- JMP PI1 ; CONTINUE PROCESSING
-
- * BACK UP TO PREVIOUS FRAME
- PI2$BACKUP:
- CALL BOI$CHECK ; AT BEGINNING OF INFORMATION?
- JNZ PI2$BACK ; CONTINUE IF NOT
- JMP PI2$MSG
- PI2$BACK:
- CALL FB1 ; BACK UP TO PREVIOUS FRAME
- JMP PI1 ; CONTINUE PROCESSING
-
- *
- * CHECK FOR POSITION AT BEGINNING OF INFORMATION SECTION
- * IF SO, PRINT BACKUP ERROR MESSAGE AND RETURN W/ZERO SET
- *
- BOI$CHECK:
- LHLD START$OF$INFO ; START ADDRESS
- XCHG ; ... IN DE
- LHLD START$OF$FRAME ; FRAME ADDRESS
- MOV A,D ; EQUAL?
- CMP H
- RNZ
- MOV A,E
- CMP L
- RNZ
- LXI D,BACKERR ; BACKUP ERROR
- CALL PRINT$MESSAGE
- XRA A ; ZERO FLAG SET
- STA FRAME$NUMBER ; SET FRAME NUMBER
- RET
-
- *
- * AT THE BEGINNING OF AN INFORMATION SECTION (HL PTS TO FIRST CHAR)
- * CHECK TO SEE IF ANOTHER SECT$CHAR FOLLOWS, AND, IF SO, LOAD THE
- * SPECIFIED FILE AS A NEW NODE AND BEGIN PROCESSING IT
- *
- LOAD$NODE:
- INX H ; PT TO POSSIBLE 2ND SECT$CHAR
- MOV A,M ; GET IT
- DCX H ; PREP FOR RETURN
- ANI 7FH ; MASK MSB
- CPI SECT$CHAR ; ANOTHER ONE?
- RNZ ; PROCESS NORMALLY IF NOT
-
- * WE HAVE A NEW NODE -- CHECK TO SEE IF WE CAN NEST AGAIN
- LDA HELP$LEVEL ; GET CURRENT HELP LEVEL
- CPI HELP$MAX ; AT MAXIMUM?
- JNZ LOAD$NODE1
- LXI D,LEVELERR ; LEVEL ERROR MESSAGE
- CALL PRINT$MESSAGE
- JMP HELP$EXIT
-
- * WE HAVE NOT REACHED LEVEL LIMIT, SO CONTINUE
- * AT THIS TIME, A=HELP LEVEL INDEX AND HL = PTR TO CURRENT SECTION (::)
- LOAD$NODE1:
-
- * SAVE CURRENT HELP FILE NAME FOR RETURN
- INX H ; PT TO SECTION SECT$CHAR
- INX H ; NOW POINTING TO FILE NAME
- PUSH H ; SAVE PTR
- CALL COMP$HELP$NAME$PTR ; HL=POINTER TO STACK ELT INDEXED BY A
- XCHG ; DE=ADDRESS OF NEXT ELEMENT
-
- * COPY CURRENT NODE ELEMENT NAME INTO NEXT STACK ELEMENT
- LXI H,FCB+1 ; PT TO FILE NAME
- MVI B,11 ; 11 BYTES
- CALL MOVE
-
- * INCREMENT HELP LEVEL
- LDA HELP$LEVEL ; GET OLD LEVEL
- INR A ; SET NEW LEVEL
- STA HELP$LEVEL
-
- * SET UP FCB FOR NEW FILE
- LXI D,LOADING$MSG
- CALL PRINT$MESSAGE
- POP H ; GET PTR TO NEW FILE NAME
- LXI D,FCB+1 ; PT TO FCB NAME
- MVI B,8 ; 8 CHARS MAX
- CALL LOAD$FCB ; PLACE INTO FCB WITH ERROR CHECKING
- MVI A,'.' ; DECIMAL BETWEEN FILE NAME AND TYPE
- CALL CHAR$OUT
- MVI B,3 ; 3 CHARS MAX FOR TYPE
- CALL LOAD$FCB ; PLACE INTO FCB WITH ERROR CHECKING
- CALL CRLF1 ; NEW LINE
- JMP START1 ; LOAD NEW HELP FILE
-
- *
- * LOAD FCB PTED TO BY DE WITH "NORMAL" FILE NAME PTED TO BY HL FOR B BYTES
- *
- LOAD$FCB:
- MOV A,M ; GET CHAR
- INX H ; PT TO NEXT
- CPI '.' ; DONE IF DECIMAL
- JZ LOAD$FCB$FILL
- CPI ' '+1 ; DONE IF < <SP>
- JC LOAD$FCB$FILL
- CALL CAPS ; CAPITALIZE
- CALL CHAR$OUT ; PRINT FILE NAME AND TYPE
- STAX D ; STORE CHAR
- INX D ; PT TO NEXT
- DCR B ; COUNT DOWN
- JNZ LOAD$FCB
- MOV A,M ; CHECK FOR ERROR
- ANI 7FH ; MASK MSB
- INX H ; PT TO NEXT CHAR
- CPI '.' ; OK IF '.'
- RZ
- CPI ' '+1 ; OK IF <SP>
- RC
- LXI D,LOADERR
- CALL PRINT$MESSAGE
- JMP HELP$EXIT
- LOAD$FCB$FILL:
- MOV C,A ; SAVE CHAR THAT TERMINATED STRING
- LOAD$FCB$LOOP:
- MVI A,' ' ; <SP> FILL REST OF FCB
- STAX D ; STORE <SP>
- INX D ; PT TO NEXT
- DCR B ; COUNT DOWN
- JNZ LOAD$FCB$LOOP
- MOV A,C ; GET CHAR THAT TERMINATED STRING
- RET
-
- *
- * GO TO ROOT
- *
- GO$ROOT:
- LDA HELP$LEVEL ; AT ROOT?
- ORA A ; 0=YES
- JZ HELP ; RETURN TO HELP
- MVI A,0 ; SET ROOT INDEX
- JMP GORET
-
- *
- * RETURN TO PREVIOUS HELP LEVEL
- *
- LEVEL$RETURN:
- LDA HELP$LEVEL ; ARE WE AT THE LOWEST LEVEL?
- ORA A ; 0=YES
- JNZ LRET
- LXI D,LRETERR
- CALL PRINT$MESSAGE
- JMP HELP
-
- * SET NEW HELP LEVEL
- LRET:
- DCR A ; DOWN 1
-
- * GO TO HELP LEVEL INDEXED IN A
- GORET:
- STA HELP$LEVEL ; SET NEW HELP LEVEL
- CALL COMP$HELP$NAME$PTR ; HL=POINTER TO TARGET HELP FILE NAME
- PUSH H ; SAVE PTR TO FILE NAME
- LXI D,LOADING$MSG ; PRINT NAME OF FILE TO BE LOADED
- CALL PRINT$MESSAGE
- MVI B,8 ; 8 CHARS TO FILE NAME
- GORET$NAME:
- MOV A,M ; GET CHAR
- CPI ' ' ; END OF NAME?
- INX H ; PT TO NEXT
- JZ GORET$NAME0
- CALL CHAR$OUT ; PRINT FILE NAME
- DCR B ; DONE?
- JNZ GORET$NAME
- JMP GORET$NAME1
- GORET$NAME0:
- DCR B ; COUNT DOWN
- JZ GORET$NAME1
- INX H ; SKIP NEXT SPACE
- JMP GORET$NAME0
- GORET$NAME1:
- MVI A,'.' ; PRINT DECIMAL
- CALL CHAR$OUT
- MVI B,3 ; PRINT FILE TYPE
- GORET$NAME2:
- MOV A,M ; GET CHAR
- INX H ; PT TO NEXT
- CALL CHAR$OUT ; PRINT IT
- DCR B ; COUNT DOWN
- JNZ GORET$NAME2
- CALL CRLF1 ; NEW LINE
- POP H ; GET PTR TO FILE NAME
- LXI D,FCB+1 ; COPY ELEMENT INTO FCB
- MVI B,11 ; 11 BYTES
- CALL MOVE
- JMP START1 ; LOAD ENTRY
-
- *
- * COMPUTE POINTER TO HELP NAME ENTRY INDEXED BY HELP LEVEL IN A
- *
- COMP$HELP$NAME$PTR:
- CALL COMP$OFFSET ; COMPUTE OFFSET IN TABLE
- LXI D,HELP$NAME$STACK ; PT TO BASE OF HELP NAMES
- DAD D ; ADD IN OFFSET
- RET
-
- *
- * COMPUTE OFFSET INTO TABLE BASED ON INDEX A
- * OFFSET = A * 11
- *
- COMP$OFFSET:
- MOV L,A ; VALUE IN HL
- MVI H,0
- MOV E,L ; DE=HL
- MOV D,H
-
- DAD H ; *2
- DAD H ; *4
- DAD H ; *8
- DAD D ; *9
- DAD D ; *10
- DAD D ; *11
- RET
-
- *
- * PRINT LEVEL NUMBER
- *
- PR$LEVEL:
- LDA HELP$LEVEL ; DON'T PRINT LEVEL 0
- ORA A ; 0?
- JZ PR$FRAME
- LXI D,LEVEL$MESSAGE ; PRINT HEADER
- CALL PRINT$MESSAGE
- LDA HELP$LEVEL ; GET NUMBER
- CALL PR$DEC ; PRINT AS DECIMAL
- LXI D,LEVEL2$MESSAGE ; PRINT END HEADER
- CALL PRINT$MESSAGE
- PR$FRAME:
- LDA FRAME$NUMBER ; GET CURRENT FRAME NUMBER
- ORA A ; SET FLAGS
- RZ ; NO FRAME?
- CALL PR$DEC ; PRINT AS DECIMAL
- LXI D,LEVEL3$MESSAGE
- CALL PRINT$MESSAGE
- RET
- * PRINT A AS DECIMAL
- PR$DEC:
- PUSH PSW ; SAVE VALUE
- XRA A
- STA LD$SPACE
- POP PSW ; GET VALUE
- MVI B,100 ; PRINT 100'S
- CALL PDEC
- MVI B,10 ; PRINT 10'S
- CALL PDEC
- ADI '0' ; PRINT 1'S
- JMP CHAR$OUT
- PDEC:
- MVI C,0 ; SET VALUE
- PDEC1:
- SUB B ; SUBTRACT POWER
- JC PDEC2
- INR C ; INCREMENT VALUE
- JMP PDEC1
- PDEC2:
- ADD B ; ADD POWER BACK IN
- MOV B,A ; SAVE A IN B
- LDA LD$SPACE ; GET LEADING <SP> FLAG
- ORA A ; NON-ZERO=PRINT
- JNZ PDEC3
- MOV A,C ; GET DIGIT
- STA LD$SPACE ; NEW FLAG
- ORA A ; ZERO?
- JNZ PDEC3 ; PRINT BYTE IN C
- MVI A,' ' ; PRINT LEADING SPACE
- JMP PDEC4
- PDEC3:
- MOV A,C ; GET VALUE
- ADI '0' ; CONVERT TO ASCII
- PDEC4:
- CALL CHAR$OUT ; PRINT CHAR
- MOV A,B ; RESTORE A
- RET
-
- *********************************************************
- * MESSAGE AND BUFFER SECTION *
- *********************************************************
-
- HELPMS:
- DB 'HELP Version ',(VERS/10)+'0','.',(VERS MOD 10)+'0',CR,LF,'$'
- SELECTMS:
- DB CR,LF,' HELP File Selections are --',CR,LF,'$'
- DEFFN:
- DB 0,'HELP '
- DEFTYP:
- DB 'HLP'
- ENDMS:
- DB 'EOI '
- PAGEMS:
- DB '^C=CP/M $' ; ABORT TO CP/M CHAR
- PAGE1MS:
- DB LEVEL$RET$CHAR,'=Level ' ; RETURN TO HIGHER NODE
- DB ROOT$CHAR,'=Root $' ; RETURN TO ROOT
- PAGE2MS:
- DB MENU$CHAR,'=Menu ' ; ABORT TO MENU CHAR
- DB START$CHAR,'=Start ' ; JUMP TO START OF INFORMATION CHAR
- DB BACKUP$CHAR,'=Last ' ; BACK UP TO PREVIOUS FRAME CHAR
- DB 'CR=Next $'
- WILD$ERR:
- DB CR,LF,'HELP FATAL ERROR -- File Name Contains Wild Card$'
- ERR1:
- DB CR,LF,'HELP FATAL ERROR -- File not Found$'
- ERR2:
- DB CR,LF,'HELP ERROR -- Invalid Response',CR,LF,'$'
- ERR3:
- DB CR,LF,'HELP ERROR -- EOF on HELP File',CR,LF,'$'
- BACKERR:
- DB CR,LF,'HELP ERROR -- Not Possible to Backup Before Start of '
- DB 'Info',CR,LF,'$'
- LEVELERR:
- DB CR,LF,'HELP ERROR -- Node Level Limit Reached -- Aborting'
- DB CR,LF,'$'
- LOADERR:
- DB CR,LF,'HELP ERROR -- Invalid File Name in Load',CR,LF,'$'
- LRETERR:
- DB CR,LF,'HELP ERROR -- No Higher Level to Return to',CR,LF,'$'
- READERR:
- DB CR,LF,'HELP ERROR -- Not Enough Room for HELP File',CR,LF,'$'
- CTRLZERR:
- DB CR,LF,'HELP ERROR -- HELP File NOT Terminated by ^Z',CR,LF,'$'
- LEVEL$MESSAGE:
- DB 'Level $'
- LEVEL2$MESSAGE:
- DB '/ $'
- LEVEL3$MESSAGE:
- DB ': $'
- PROMPT1$MESSAGE:
- DB 'Type ^C=CP/M$'
- PROMPT2$MESSAGE:
- DB ' ',LEVEL$RET$CHAR,'=Level '
- DB ROOT$CHAR,'=Root$'
- PROMPT3$MESSAGE:
- DB ' or Enter Selection $'
- LOADING$MSG:
- DB CR,LF,'Loading HELP File $'
-
- CUR$DISK:
- DS 1 ; NUMBER OF CURRENT DISK IF CHANGED OR 0FFH=NO CHANGE
- CUR$USER:
- DS 1 ; NUMBER OF CURRENT USER IF CHANGED OR 0FFH=NO CHANGE
- TPA$END:
- DS 1 ; END PAGE ADDRESS OF TPA
- START$OF$INFO:
- DS 2 ; PTR TO START OF CURRENT INFORMATION BLOCK
- START$OF$FRAME:
- DS 2 ; PTR TO START OF CURRENT FRAME
- SEL$CHAR:
- DS 1 ; SELECTION TABLE OPTION CHAR
- FIRST$ENTRY:
- DS 2 ; PTR TO FIRST ENTRY OF INFORMATION SECTION
- LINE$CNT:
- DS 1 ; LINE COUNT BUFFER
- NAME$COUNT:
- DS 1 ; COUNT OF FILE NAMES/LINE
- DFFLG:
- DS 1 ; DEFAULT FILE FLAG (0=NOT SEARCH FOR, 1=YES)
- NEXT$ADR:
- DS 2 ; NEXT LOAD ADDRESS
- LD$SPACE:
- DS 1 ; LEADING SPACE FLAG FOR DECIMAL PRINT
- HELP$LEVEL:
- DS 1 ; NUMBER OF HELP LEVEL CURRENT NODE IS AT (0=BOTTOM)
- FRAME$NUMBER:
- DS 1 ; NUMBER OF CURRENT FRAME
-
- HELP$NAME$STACK:
- DS 11*HELP$MAX ; STACK OF HELP FILE NAMES OF EACH LEVEL
-
- DS 80 ; STACK SPACE
- STACK:
- DS 2 ; CP/M STACK PTR
-
-
- *
- * DEFAULT HELP MESSAGE
- *
- HELP$DEF$MSG:
- DB CR,LF,'Default HELP Facility Invoked'
- DB CR,LF,' Names of Available HLP Files are --'
- DB CR,LF,'$'
- HELP$DEF$MSG1:
- DB CR,LF,'Type Any Char for Default Information (^C=Abort) -- $'
- HELP$BUF:
- DB ':The HELP Subsystem for Online Documentation'
- DB CR,LF,' This is HELP, the Online Documentation Subsystem.'
- DB CR,LF,'The purpose of HELP is to allow the user to '
- DB 'interactively'
- DB CR,LF,'query the *.HLP files of the system in order to receive'
- DB CR,LF,'information summaries on various aspects of the user''s'
- DB CR,LF,'working environment, such as the language systems he is'
- DB CR,LF,'using and certain subsystems available to him.'
-
- IF DEFAULT$HELP$HLP ; PRINT IF HELP.HLP SEARCHED FOR
- DB CR,LF,LF,' When the user types ''HELP'', a search is done'
- DB CR,LF,'for the file ''HELP.HLP''. If found, its contents are'
- DB CR,LF,'to the user; if not found, this message is displayed.'
- ENDIF
-
- IF NOT DEFAULT$HELP$HLP ; PRINT IF HELP.HLP NOT SEARCHED FOR
- DB CR,LF,LF,' When the user types ''HELP'', a search is done'
- DB CR,LF,'for the files ''*.HLP''. The name of each HLP file'
- DB CR,LF,'is displayed to the user followed by this text.'
- ENDIF
-
- DB CR,LF,LF,' If the user desires information on a specific'
- DB CR,LF,'topic and he has a HELP File of that name (ie, CPM.HLP'
- DB CR,LF,'is a HELP File on CP/M), he may issue of HELP Command'
- DB CR,LF,'of the form --'
- DB CR,LF,' HELP d:topic'
- DB CR,LF,'where "d:" is the disk the HELP File resides on'
- DB ' (optional)'
- DB CR,LF,'and "topic" is the name of the HELP File (topic.HLP,'
- DB CR,LF,'like CPM.HLP).'
- DB CR,LF,' Please refer to the HELP File "HELP.HLP" for'
- DB ' more information.'
-
- DB CR,LF,CTRLZ ; END OF FILE
-
-
- END