.MCALL .MODULE .MODULE HELP,VERSION=11,COMMENT=,AUDIT=YES ; Copyright (c) 1998 by Mentec, Inc., Nashua, NH. ; All rights reserved ; ; This software is furnished under a license for use only on a ; single computer system and may be copied only with the ; inclusion of the above copyright notice. This software, or ; any other copies thereof, may not be provided or otherwise ; made available to any other person except for use on such ; system and to one who agrees to these license terms. Title ; to and ownership of the software shall at all times remain ; in Mentec, Inc. ; ; The information in this document is subject to change without ; notice and should not be construed as a commitment by Digital ; Equipment Corporation, or Mentec, Inc. ; ; Digital and Mentec assume no responsibility for the use or ; reliability of its software on equipment which is not supplied ; by Digital or Mentec, and listed in the Software Product ; Description. ; Edit History: ; ; 001 28-Aug-80 03:07 PM Parent, Les (75450) [240,95] ; FIX 2 BUGS ; 1. HELP didn't recognize LS handler (wrong device code) ; ; 2. HELP didn't output last line of text (i.e. if 4 examples, only ; 3 were output). ; (001) ; 002 15-FEB-83 C.A. Y05.00 ; 1- .READW on subroutine HLPALL had same register for block ; and buffer arguments. ; ; 2- The macro library extension is .MLB and the test file is .TXT ; (They use to be the oppositte in v4) ; ; 003 21-Feb-85 JFW ; 1- Fix the RUN HELP problem ; 2- Allow SP to be /PRINTER output ; ; 25-FEB-85 George Thissell Jr. ; Allow for possible date rollover ; ; 31-JUL-85 George Thissell Jr. ; Fix Help/Print from hanging system ; ; 12-AUG-85 George Thissell Jr. ; Allow help.txt to retain copyright statement ; when help file is split ; ; 10-FEB-89 L. Banche ; Fix byte count algorithm in GOTITM to process ; negative byte counts correctly ; ;010 01-Nov-1990 JFW ; bracket error messages in ;+/;ERROR/.../;- ; ;011 20-JUN-1992 Don Bridgewater ; Add suptopicsubitem capability for LINK /IDSPACE option variants ; .SBTTL GENERAL COMMENTS .ENABL LC ;+ ;Author: Anton Chernoff 8-MAR-79 ; ;Updates: V5 - L. Parent 18-JAN-82 (Added pagination of screen output) ; ; THIS UTILITY RESPONDS TO THE KMON 'HELP' COMMAND. ; IT INTERPRETS THE REST OF THE KMON LINE (AFTER THE WORD 'HELP') ; AS THE TOPIC, SUBTOPIC, AND ITEM TO DESCRIBE. ; ; TO INVOKE THIS UTILITY: ; 1. KMON 'HELP' COMMAND: ; HELP OPTION-LINE ; MONITOR PASSES OPTION-LINE TO HELP IN LOCATION 600 ; AS FUNNY FORMAT STRING FOR TECO OR AS ASCIZ STRING ; 2. RUN THIS PROGRAM (.R HELP) AND RESPOND TO THE PROMPT WITH ; OPTION-LINE ; OPTION-LINE TYPED AT TERMINAL OR FROM INDIRECT COMMAND FILE ; 3. CHAIN TO HELP FROM USER PROGRAM, PASSING OPTION LINE AS ASCIZ STRING ; IN LOCATION 600 ; ; AN OPTION LINE HAS THE FORMAT ; [TOPIC [SUBITEM] ...] ; IF THE OPTION-LINE IS COMPLETELY NULL, THE COMMAND 'HELP HELP' IS ASSUMED. ; A TOPIC IS ANY VALID RT-11 COMMAND NAME. THE TOPIC CAN BE ABBREVIATED ; TO ANY NUMBER OF CHARACTERS; IF IT IS NOT UNIQUE, THE FIRST COMMAND ; MATCHING THE GIVEN NAME IS USED. THE SPECIAL TOPIC '*' GIVES A LIST ; OF THE TOPICS THAT ARE VALID. IF THERE IS NO SUBITEM, ALL INFORMATION ; ABOUT THE TOPIC IS PRINTED. ; ; A SUBITEM IS ONE OF THE FOLLOWING: ; SUBTOPIC[:OPT-NAME] ... ; /OPT-NAME ; ; THERE ARE FOUR SUBTOPICS IN THE STANDARD RT-11 HELP FILE: ; SYNTAX, SEMANTICS, OPTIONS, AND EXAMPLES ; THE SUBTOPIC CAN BE ABBREVIATED TO ANY NUMBER OF CHARACTERS; ; IF IT IS NOT UNIQUE, THE FIRST SUBTOPIC MATCHING THE GIVEN ; STRING IS USED. (IF YOU CREATE YOUR OWN ENTRIES IN THE HELP FILE, ; YOU CAN INCLUDE OTHER SUBTOPICS.) IF THERE IS NO OPT-NAME, ; ALL INFORMATION ABOUT THE SUBTOPIC IS PRINTED. ; ; IN THE SUPPLIED HELP.MLB FILE, ; ONLY THE SUBTOPIC 'OPTIONS' CAN TAKE THE :OPT-NAME ARGUMENT, WHICH ; IS THE NAME OF AN OPTION (SWITCH). ; RATHER THAN TYPING 'OPTIONS:OPT-NAME', YOU MAY USE SIMPLY '/OPT-NAME'. ; (THE SLASH IS AN ABBREVIATION FOR ' OPTIONS:') ; IF THE OPT-NAME IS ABBREVIATED, HELP PRINTS INFORMATION ABOUT ; ALL OPTIONS THAT BEGIN WITH THE OPT-NAME TYPED ; (IF YOU CREATE YOUR OWN ENTRIES IN THE HELP FILE, YOU CAN INCLUDE ; OPT-NAME ITEMS UNDER ANY SUBTOPIC, AS DESCRIBED BELOW. HOWEVER, ; THE SLASH FORM CAN BE USED ONLY WITH SUBTOPIC 'OPTIONS'.) ; ; THUS, THE FOLLOWING ARE VALID USES OF THE 'HELP' COMMAND: ; HELP ; PRINTS INFORMATION ON THE HELP COMMAND ; HELP * ; PRINTS A LIST OF TOPICS ; HELP COPY ; PRINTS HELP ON THE 'COPY' COMMAND, INCLUDING ALL SUBTOPICS ; HELP COPY SYNTAX [OR HELP COP SY] ; PRINTS HELP ON THE COPY COMMAND SYNTAX ; HELP COPY SYNTAX SEM OPTI:BOOT ; PRINTS HELP ON THE SYNTAX AND SEMANTICS OF COPY, AND ON ; THE BOOT OPTION OF COPY ; HE COP SY SEM /BOO ; SAME AS ABOVE ; HE COPY/BOOT/DEVICE ; PRINTS HELP ON THE BOOT AND DEVICE OPTIONS OF THE COPY COMMAND ; HE COPY/BOOT EX ; PRINTS HELP ON THE BOOT OPTION OF COPY, AND PRINTS THE ; EXAMPLES OF THE COPY COMMAND ; HELP COPY OPTION:BOOT EXAMP ; SAME AS ABOVE ; HELP COPY/A ; PRINTS HELP ON ALL OPTIONS OF COPY THAT START WITH THE ; LETTER A ; ; FILE FORMATS: ; ; THERE ARE THREE FILES SUPPLIED ON THE RT-11 V04 KIT THAT MAKE UP THE ; HELP PACKAGE. THE FIRST, HELP.SAV, IS THE ONLY FILE YOU NEED ON A V04 ; SYSTEM IF YOU DO NOT WANT TO MODIFY THE HELP TEXT SUPPLIED BY DIGITAL. ; IT CONTAINS THE HELP PROGRAM AND THE TEXT LIBRARY MERGED INTO ONE FILE. ; ; YOU MUST USE THE OTHER TWO FILES IF YOU WANT TO CHANGE THE HELP TEXT ; SUPPLIED BY DIGITAL. THE FILE HELP.EXE CONTAINS THE HELP PROGRAM ITSELF. ; TO RUN, YOUR MUST EITHER CREATE A SEPARATE HELP TEXT MACRO LIBRARY FILE ; AND LEAVE IT ON YOUR SYSTEM VOLUME, OR YOU MUST CREATE SUCH A FILE AND ; MERGE IT WITH THE HELP.EXE PROGRAM. THE FILE HELP.TXT CONTAINS THE ; HELP TEXT. YOU MUST PASS THIS FILE THROUGH THE LIBRARIAN BEFORE THE ; HELP PROGRAM CAN USE IT. ; ; IF YOU DO NOT WANT TO CHANGE THE HELP TEXT WHEN YOU INSTALL YOUR SYSTEM, ; YOU MAY SIMPLY DELETE HELP.EXE AND HELP.TXT FROM YOUR SYSTEM DISK. ; (BE SURE YOU HAVE COPIES OF THEM IN CASE YOU WISH TO CHANGE THE TEXT ; LATER.) ; ; IF YOU WANT TO CHANGE THE HELP TEXT, YOU CAN DO SO BY EDITING THE FILE ; HELP.TXT ACCORDING TO THE GUIDELINES GIVEN BELOW. WHEN YOU HAVE ; MADE THE APPROPRIATE CHANGES TO HELP.TXT, YOU CREATE THE HELP.TXT ; TEXT LIBRARY FILE WITH THE FOLLOWING COMMAND: ; ; LIBR/MACRO HELP.MLB HELP.TXT ; ; YOU CAN NOW CHOOSE EITHER TO LEAVE THE HELP.MLB FILE AS A SEPARATE FILE ; OR TO MERGE THE HELP PROGRAM AND TEXT LIBRARY. IF YOU LEAVE HELP.TXT ; AS A SEPARATE FILE, THE HELP COMMAND WILL BE SLIGHTLY SLOWER (VERY MUCH ; SLOWER IF YOUR SYSTEM DEVICE IS TU58 OR FLOPPY DISK) BUT THE TEXT WILL ; BE EASY TO MODIFY. DO THIS IF YOU MODIFY THE HELP TEXT FREQUENTLY. ; IF YOU MERGE THE HELP PROGRAM WITH THE TEXT LIBRARY, IT WILL RUN FASTER ; BUT WILL BE SLIGHTLY LESS FLEXIBLE. DIGITAL RECOMMENDS THAT YOU MERGE ; THE FILES. ; ; TO RUN WITH SEPARATE PROGRAM AND TEXT LIBRARY FILES, SIMPLY COPY ; THE PROGRAM FILE HELP.EXE TO YOUR SYSTEM VOLUME, GIVING IT THE FILE NAME ; HELP.SAV. BE SURE THAT THE FILE HELP.MLB IS ON THE SYSTEM VOLUME ALSO. ; YOU CAN COPY HELP.TXT AND HELP.EXE TO A BACKUP VOLUME AND DELETE THEM ; IF YOU ARE LOW ON SPACE. ; ; TO MERGE THE PROGRAM AND TEXT LIBRARY FILES, USE THE FOLLOWING COMMAND: ; ; COPY HELP.(EXE+TXT) HELP.SAV ; ; YOU CAN COPY HELP.TXT AND HELP.EXE TO A BACKUP VOLUME AND DELETE THEM ; FROM YOU SYSTEM VOLUME IF YOU ARE LOW ON SPACE. YOU CAN DELETE THE FILE ; HELP.TXT, SINCE YOU CAN RECREATE IT ANY TIME FROM HELP.TXT. ; ; THE HELP TEXT FILE IS SUPPLIED WITH RT-11 AS THE FILE 'HELP.TXT'. ; THE FORMAT OF THIS FILE IS DESCRIBED BELOW; ANY CHANGES MUST CONFORM ; TO THIS FORMAT: ; ; 1. EACH TOPIC IN THE FILE MUST HAVE AN ALPHABETIC NAME ; 2. THE NAME OF THE TOPIC MUST BE UNIQUE WITHIN THE FIRST SIX CHARACTERS ; 3. THE TOPIC MUST BE INCLUDED IN THE FILE IN ALPHABETICAL ORDER! ; 4. THE TOPIC MUST BE ON A PAGE (DELIMITED BY FORM FEEDS) WITH THE ; FOLLOWING FORMAT: ; ; ; .MACROTOPICNAME ; TOPICNAMEONE LINE DESCRIPTION OF THE TOPIC ; ; SUBTOPICNAME ; TEXT ABOUT THE SUBTOPIC ; MORE TEXT (ANY NUMBER OF LINES) ; SUBTOPICITEMNAME ; DESCRIPTION OF SUBTOPIC ITEM (USUALLY ONLY FOR ; THE SUBTOPIC 'OPTION'), ANY NUMBER OF LINES ; [SUBTOPICSUBITEMNAME ; DESCRIPTION OF SUBTOPIC ITEM (USUALLY ONLY FOR ; THE SUBTOPIC 'OPTION'), ANY NUMBER OF LINES ; [ANOTHER SUBTOPICSUBITEM, BEGINNING: ]] ; [ANOTHER SUBTOPICITEM, BEGINNING: ] ; [ANOTHER SUBTOPIC, BEGINNING FROM THE BLANK LINE ABOVE] ; .ENDM ; ; ; 5. THE FILE ENDS WITH THE DUMMY TOPIC '999999'; LEAVE THIS. ; ; ASSEMBLY AND LINK INSTRUCTIONS: ; ; TO ASSEMBLE AND LINK HELP: ; MACRO HELP ; LINK HELP [REQUIRES SYSLIB] ;- .SBTTL MACRO CALLS AND DEFINITIONS ; INCLUDE SYSMAC MACROS .MCALL .CLOSE, .DSTATU,.EXIT, .FETCH, .GTLIN, .GVAL .MCALL .LOOKUP,.PRINT, .PURGE, .RCTRLO,.READW, .REGDEF .MCALL .REOPEN,.SAVEST,.SETTOP,.SRESET,.TTYIN, .WRITW .MCALL .ENTER, .GTIM ; INCLUDE SYSLIB ROUTINES .GLOBL IRAD50, R50ASC .MACRO ERROR SEV,TXT,TOP=0 .PSECT ERRTXT .NLIST BEX $$$$$$ = . .ASCII "SEV-"TXT .LIST BEX .IF IDN ,0 .BYTE 0 .IFF .BYTE 200 .ENDC .PSECT HELP JSR R5,ERROR .WORD $$$$$$,TOP .ENDM ERROR .SBTTL CONSTANT DEFINITIONS ; ASCII DEFINITIONS TAB = 11 ;TAB LF = 12 ;LINE FEED CR = 15 ;CARRIAGE RETURN ESCAPE = 33 ;ESCAPE (ALT MODE) SPACE = 40 ;SPACE ; SYSTEM DEFINITIONS CODELP = 3 ;LP DSTATUS CODE IS 3 CODELS = 41 ;LS DSTATUS CODE IS 41 ;001 ;001 EMTVEC = 30 ;EMT VECTOR ;V5 JSW = 44 ;JOB STATUS WORD ;**-2 CHAIN$ = 400 ;CHAIN ENTRY ERRBYT = 52 ;RETURN ERROR BYTE USERRB = 53 ;ERROR STATUS BYTE ON EXIT SYSPTR = 54 ;POINTER TO RMON IN SYSCOM REGION ARGADR = 600 ;ADDRESS OF STRING PASSED BY 'HELP' KMON COMMAND TTCNFG = 424 ;Offset to console terminal config word pointer ;V5 ; BITS IN JSW OVLY$ = 1000 ;OVERLAID PROGRAM (CHANNEL 17 STAYS OPEN) ; STATUS BITS IN USERRB TO SET UPON EXIT SUCCS$ = 1 ;SUCCESS WARN$ = 2 ;WARNING ERROR$ = 4 ;ERROR FATAL$ = 10 ;FATAL ; CHANNEL DEFINITIONS CH.TXT = 13 ;CHANNEL FOR HELP.MLB INPUT CH.LP = 14 ;CHANNEL FOR LINE PRINTER OUTPUT CH.OVR = 17 ;CHANNEL FOR HELP.SAV (MAY INCLUDE TEXT PORTION) .SBTTL ORDER THE PSECTS .PSECT HELP,RO,I,CON ;PURE CODE .PSECT TEXT,RO,D,CON ;PURE TEXT DATA .PSECT DATA,RO,D,CON ;PURE OTHER DATA .PSECT IMPURE,RW,D,CON ;IMPURE STORAGE .PSECT PATCH,RW,D,CON ;PATCH AREA .BLKW 64. ;LEAVE ROOM FOR PATCHES .ASECT . = JSW .WORD OVLY$ .SBTTL PURE TEXT .PSECT TEXT TECHLP: .ASCIZ "@^UA!" ;PREFIX THAT KMON MAY PASS A.HELP: .ASCIZ "HELP" ;DEFAULT TOPIC IF NULL STRING GIVEN A.ENDM: .ASCIZ ".ENDM" ;MATCH STRING FOR FINDING END OF TOPIC TEXT A.OPTN: .ASCIZ "OPTION" ;MATCH STRING FOR OPTION SUBITEM IF '/' A.MORE: .ASCIZ "Press for more..."<200> ERRMSG: .ASCII "?HELP-"<200> ;START OF ERROR REPORT ASKMSG: .ASCII "What topic do you want help with? "<200> O.TERM: .BYTE 'T,'E+200,'R+200,'M+200,'I+200,'N+200,'A+200,'L+200,0 O.PRIN: .BYTE 'P,'R+200,'I+200,'N+200,'T+200,'E+200,'R+200,0 .SBTTL PURE STORAGE .PSECT DATA HLPMLB: .BYTE CH.TXT,1 ;LOOKUP BLOCK FOR SY:HELP.MLB .WORD .+4,0 ;POINTER TO FILE NAME IN RAD50 .RAD50 "SY HELP MLB" ;FILE NAME FOR HELP TEXT HLPDK: .BYTE CH.TXT,1 ;LOOKUP BLOCK FOR DK:HELP.MLB .WORD .+4,0 ;POINTER TO FILE NAME IN RAD50 .RAD50 "DK HELP MLB" ;FILE NAME FOR ALTERNATE HELP TEXT .LIMIT ;GET PROGRAM LOW AND HIGH LIMITS PGMEND = .-2 ;SECOND WORD IS HIGH LINKED LIMIT OPTLST: .WORD O.TERM ;POINTERS TO HELP OPTION NAMES .WORD O.PRIN .WORD 0 ;END OF LIST R50LST: .WORD 3 ;3 ARGUMENTS FOR ASCII -> RAD50 CONVERT .WORD SIX ;LENGTH .WORD TOPIC ;POINTER TO ASCII STRING .WORD TOPBUF ;POINTER TO AREA FOR 2 WORDS OUTPUT SIX: .WORD 6 ;CONSTANT FOR SYSLIB CALL PGSIZE::.WORD 23. ;# of lines on a "page" of text ;V5 .SBTTL IMPURE STORAGE .PSECT IMPURE LP: .BYTE CH.LP,2 ;ENTER BLOCK FOR LINE PRINTER .WORD .+6,0,0 ;POINTER TO FILE NAME IN RAD50, LENGTH LPNAME: .RAD50 "LP HELP LST" ;FILE NAME FOR LINE PRINTER OUTPUT AREA: .BLKW 6 ;GENERAL PURPOSE EMT AREA BUFFER: .WORD 0 ;ADDRESS OF TEXT INPUT BUFFER BUFWDS: .WORD 0 ;SIZE OF TEXT BUFFER IN WORDS BUFEND: .WORD 0 ;END OF TEXT BUFFER INPBLK: .WORD 0 ;NEXT BLOCK TO READ FROM HELP.MLB BLKADD: .WORD 0 ;ADDITIVE FACTOR FOR READING LPBUFR: .WORD 0 ;LINE PRINTER BUFFER ADDRESS (0 IF NONE) LPBUFF: .WORD 0 ;LINE PRINTER BUFFER POINTER LPBLOK: .WORD 0 ;NEXT BLOCK TO OUTPUT DIRBLK: .WORD 0 ;DIRECTORY BLOCK NUMBER CHANNL: .BLKW 5 ;SAVESTATUS AREA CHNTXT: .WORD 0 ;CHANNEL TO USE FOR TEXT FILE TXTBEG: .WORD 0 ;POINTER TO START OF TOPIC TEXT TXTEND: .WORD 0 ;POINTER TO END OF TOPIC TEXT TOPIC: .BLKB 80. ;BUFFER FOR TOPIC NAME SUBTOP: .WORD 0 ;POINTER TO SUBTOPIC TEXT .ODD SUBTX3: .BYTE 40 ;SUBTOPIC ITEMS START WITH 3 BLANKS SUBTXT: .BYTE 40,40 ;SUBTOPICS START WITH 2 BLANKS SUBBUF: .BLKB 80. ;BUFFER FOR SUBTOPIC NAME TOPGT6: .WORD 0 ;FLAG IF TYPED TOPIC >= 6 CHARACTERS LONG TOPBUF: .BLKW 3 ;AREA FOR TOPIC NAME IN RAD50 OR ASCII .WORD 0 ;6 character string must still be .ASCIZ! ASCLST: .WORD 3 ;3 ARGUMENTS FOR RAD50 -> ASCII CONVERT .WORD SIX ;LENGTH TOPPTR: .WORD 0 ;POINTER TO 2 WORDS OF RAD50 .WORD TOPBUF ;AREA FOR OUTPUT LNCNT:: .WORD 0 ;# of lines left on a "page" ;V5 TTSETS: .WORD 0 ;Console terminal configuration word ;V5 CRLF: .BYTE CR,LF,200 ;END OF LINE FOR PRINTER CRLFE: INBUF: .BLKB 128. ;Area for input command .EVEN .SBTTL MAIN ENTRY .PSECT HELP .ENABL LSB START: .SRESET ;CLEAR OUT CHANNELS, HANDLERS .RCTRLO ;SPEAK .GTIM #AREA,#AREA ;CHECK FOR POSSIBLE DATE ROLLOVER MOV PGSIZE,LNCNT ;Initialize line counter ;V5+ MOV @#SYSPTR,R5 ;R5 => RMON MOV @TTCNFG(R5),TTSETS ;Get console terminal config word ;V5- MOV PGMEND,BUFEND ;SET UP FOR MEMORY ALLOCATION .SAVEST #AREA,#CH.OVR,#CHANNL ;SAVE THE OVERLAY CHANNEL BCS 1$ ;NOT OPEN, MUST GO ELSEWHERE TO FIND TEXT MOV PGMEND,R0 ;GET HIGH LIMIT OF PROGRAM ROR R0 ;SHIFT IT CLRB R0 ;ROUND IT DOWN SWAB R0 ;MAKE IT BLOCKS INC R0 ; AND ROUND UPWARD CMP R0,CHANNL+4 ;IS THE PROGRAM SHORTER THAN THE SAV FILE? BHIS 1$ ;YES, NO TEXT APPENDED HERE MOV R0,BLKADD ;NO, SET ADDITIVE FACTO TO FIND TEXT MOV #CH.OVR,CHNTXT ;SET CHANNEL TO USE FOR TEXT .REOPEN #AREA,#CH.OVR,#CHANNL ;OPEN SAVE IMAGE AS TEXT BCC 2$ ;OK 1$: CLR BLKADD ;NO ADDITIVE FACTOR MOV #CH.TXT,CHNTXT ;USE TEXT FILE AS TEXT .LOOKUP #HLPMLB ;OPEN THE HELP TEXT FILE BCC 2$ ;GOT IT .LOOKUP #HLPDK ;NOT THERE, TRY FOR DK:HELP.MLB BCC 2$ ;GOT ON THE DK DEVICE ;+ ;ERROR ERROR F,<"File not found HELP.MLB"> ;- 2$: MOV #ARGADR,R5 ;POINT TO HELP COMMAND JSR R4,EQU$$ ;IS THIS THE TECO FORMAT OF HELP? .WORD TECHLP ; THAT STARTS WITH "@^UA!" BNE 4$ ;NO, TEXT IS OTHERWISE MOV R5,R0 ;YES, COPY POINTER 3$: CMP R0,SP ;UP TO THE STACK YET? BHIS 5$ ;YES, QUIT TRYING CMPB (R0)+,#'! ;LOOK FOR AN EXCLAMATION POINT BNE 3$ ; (IT'S GOTTA BE THERE) CLRB -(R0) ;MAKE AN ASCIZ STRING BR CHKLIN ;DONE 4$: TSTB @R5 ;IS THERE ANY TEXT HERE (NEW FORMAT KMON)? BNE CHKLIN ;YES, THERE'S SOMETHING TO LOOK FOR BIT #CHAIN$,@#JSW ;IS THIS THE 'HELP' ENTRY? BNE CHKLIN ;YES, GIVE 'HELP HELP' 5$: TST @SYSPTR ;MUST GET LINE FROM USER. RSTS OR RT-11? BEQ 6$ ;IF RSTS, DO TTYIN'S .GTLIN R5,#ASKMSG ;IF RT-11, GET THE LINE QUICKLY BR CHKLIN ; AND GO PROCESS IT 6$: .PRINT #ASKMSG ;ASK HIM WHAT HE WANTS MOV R5,R1 ;COPY LINE POINTER 7$: .TTYIN ;GET A BYTE MOVB R0,(R1)+ ;STOW IT CMPB R0,#LF ;LINE FEED? BEQ 8$ ;YES, END OF LINE CMPB R0,#ESCAPE ;ESCAPE? BNE 7$ ;NO, LOOK FOR MORE 8$: CLRB @R1 ;MAKE AN ASCIZ STRING ;BR CHKLIN ;CHECK THE LINE .DSABL LSB .SBTTL TRIM THE INPUT LINE AND CHECK FOR TOPIC .ENABL LSB CHKLIN: MOV #INBUF,R0 ;Point to input buffer MOV R0,-(SP) ;Save beginning pointer MOV R5,-(SP) ;Save chain area pointer 12$: MOVB (R5)+,(R0)+ ;Copy Asciz String BNE 12$ ;Up to and including null MOV (SP)+,R5 ;Restore chain area pointer CLRB @R5 ;Make it empty MOV (SP)+,R5 ;Now point to buffer area JSR PC,CVT$$ ;TRIM THE INPUT STRING CMPB @R5,#'/ ;IS THERE AN OPTION TO THE COMMAND HERE? BNE 9$ ;NO, NO COMMAND OPTION, WE POINT TO TOPIC INC R5 ;ADVANCE PAST THE SLASH MOV R5,R0 ;SAVE THE TEXT POINTER MOV #OPTLST,R1 ;POINT TO LIST OF OPTION POINTERS 1$: MOV (R1)+,R2 ;GET POINTER TO NEXT OPTION BNE 2$ ;IF PRESENT, TRY IT ;+ ;ERROR ERROR F,<"Invalid option, type 'HELP'"> ;- 2$: MOV R0,R5 ;POINT TO START OF OPTION NAME 3$: MOVB (R2)+,R3 ;GET AN OPTION BYTE BEQ 4$ ;IF NULL, WHOLE NAME IS A MATCH BICB #200,R3 ;TRIM POSSIBLE PARITY CMPB R3,(R5)+ ;DOES IT MATCH? BEQ 3$ ;YES, KEEP TRYING DEC R5 ;POINT TO UNMATCHING BYTE TST R3 ;WERE WE AT THE UNIQUE POINT? BPL 1$ ;NO, TRY ANOTHER OPTION 4$: CMPB (R5)+,#SPACE ;OPTION END WITH A BLANK? BEQ 5$ ;IF SO, WE NOW POINT AT THE TOPIC TSTB -(R5) ;OTHERWISE, WE MUST BE AT EOL BEQ 5$ ;AND WE ARE ;+ ;ERROR ERROR F,<"Syntax error in command, type 'HELP'"> ;- 5$: SUB #OPTLST+2,R1 ;GET OPTION INDEX * 2 BEQ 9$ ;/TERMINAL. NO LINE PRINTER OUTPUT CLR LPBLOK ;/PRINTER. SET FIRST OUTPUT BLOCK TO ZERO MOV #AREA,R1 ;GET POINTER TO DSTATUS RETURN AREA MOV #LPNAME,R2 ;GET POINTER TO PRINTER NAME MOV #^RLP,@R2 ;FIRST TRY FOR THE REGULAR LINE PRINTER .DSTAT R1,R2 ;GET STATUS OF LINE PRINTER BCC 6$ ;IT IS A VALID DEVICE MOV #^RLS,@R2 ;TRY FOR THE SERIAL VERSION NEXT .DSTAT R1,R2 ;DOES THAT EXIST? BCS 8$ ;NO, CAN'T USE LINE PRINTER 6$: ;;; MOV (R1)+,R0 ;GET DEVICE CODE FROM RETURN AREA ;;; CMPB R0,#CODELP ;IS IT REALLY A LINE PRINTER? ;;; BEQ 7$ ;YES ;;; CMPB R0,#CODELS ;IS IT A SERIAL ONE? ;;; BNE 8$ ;NO, CAN'T USE THIS DEVICE! 7$: MOV #512.,R0 ; A BUFFER SIZE TST 4(R1) ;HANDLER LOADED? BNE 11$ ;IF NE YES ADD 2(R1),R0 ;GET LENGTH OF LINE PRINTER HANDLER 11$: JSR PC,MORMEM ;ALLOCATE MEMORY FOR HANDLER AND BUFFER MOV BUFFER,R0 ;R0->START OF BUFFER .FETCH BUFFER,R2 ;FETCH THE HANDLER BCS 8$ ;ERROR HERE? MOV R0,LPBUFF ;SET START OF BUFFER = END OF HANDLER MOV R0,LPBUFR ;SET BUFFER RESET ADDRESS .ENTER #LP ;FINALLY, OPEN THE PRINTER BCC 10$ ;ALL SET TO GO 8$: .PURGE #CH.LP ;SHUT OFF THE CHANNEL ;+ ;ERROR ERROR W,<"Line printer not available - using terminal"> ;- 9$: CLR LPBUFF ;CAN'T USE THE PRINTER .PRINT #CRLF ;PUT OUT A NEW LINE 10$: TSTB @R5 ;AFTER THE OPTION, IS THERE ANYTHING? BNE SCHTXT ;YES, SEARCH FO THE TOPIC MOV #A.HELP,R5 ;NO HELP ITEM, SO FORCE TOPIC 'HELP' .DSABL LSB .SBTTL SEARCH HELP.MLB FOR THE TOPIC .ENABL LSB SCHTXT: MOV #3*512.,R0 ;GET A 3 BLOCK BUFFER FOR THE DIRECTORY JSR PC,MORMEM ;ALLOCATE IT, SETTING READ AMOUNT MOV #TOPIC,R0 ;POINT TO BUFFER TO ASSEMBLE IT 1$: MOVB (R5)+,R1 ;GET A BYTE MOVB R1,(R0)+ ;MOVE IT INTO TOPIC BUFFER BEQ 2$ ;DONE CMPB R1,#SPACE ;ARE WE AT A BLANK NOW? BEQ 3$ ;YES, DONE WITH MAIN TOPIC CMPB R1,#'/ ;ARE WE AT A SLASH? BNE 1$ ;NO, GET MORE TOPIC NAME 2$: DEC R5 ;FIX POINTER TO SUBTOPIC 3$: CLRB -(R0) ;MAKE THE TOPIC AN ASCIZ STRING MOV R5,SUBTOP ;REMEMBER POINTER TO SUBTOPIC SUB #TOPIC,R0 ;COMPUTE TOPIC NAME LENGTH CLR TOPGT6 ;ASSUME HE TYPED A SHORT NAME CMP R0,#6 ;MORE THAN 6 CHARACTERS? BLO 4$ ;NO, SHORT NAME MEANS REVERSE COMPARISON COM TOPGT6 ;SET FLAG FOR LONG TYPED STRING MOV #R50LST,R5 ;POINT TO LIST TO CONVERT JSR PC,IRAD50 ;CONVERT TO RAD50 4$: CLR INPBLK ;START READING FILE AT BLOCK 0 JSR PC,FILLBF ;FILL UP THE INPUT BUFFER CMP @R1,#1001 ;IS THIS REALLY A LIBRARY? BNE E.NOLB ;NOPE, THIS IS A BAD HELP FILE MOV 36(R1),R2 ;GET THE NUMBER OF DIRECTORY ENTRIES HERE DEC R2 ; MINUS 1 FOR THE DUMMY END ADD #1000,R1 ;POINT TO THE FIRST BLOCK OF THE DIRECTORY CMP TOPIC,#'* ;IS THE TOPIC A SIMPLE STAR? BEQ HLPALL ;YES, GIVE TOTAL HELP CMPB TOPIC,#'? ;IS THE TOPIC A "?" ? BEQ 10$ ;YES, BRANCH CMPB TOPIC,#'. ;IS THE TOPIC A "." ? BEQ 10$ ;YES, BRANCH 5$: CMP R1,R0 ;ARE WE PAST THE END OF THE BUFFER? BLO 6$ ;NOT YET ADD #3,INPBLK ;BUMP INPUT BLOCK NUMBER FOR BIG DIRECTORY JSR PC,FILLBF ;FILL UP THE BUFFER WITH MORE DIRECTORY BCS E.NOLB ;OOPS, END OF FILE INSIDE DIRECTORY 6$: MOV R1,TOPPTR ;SAVE POINTER TO TOPIC IN RAD50 TST TOPGT6 ;WHICH WAY IS THE COMPARISON? BNE 7$ ;WITH 6 TYPED BY HIM, JUST COMPARE RAD50 MOV #ASCLST,R5 ;POINT TO LIST TO CONVERT RAD50 TO ASCII MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ;SAVE R2 JSR PC,R50ASC ;CONVERT MOV (SP)+,R2 ;RESTORE R2 MOV (SP)+,R1 ;RESTORE R1 MOV (SP)+,R0 ; AND R0 MOV #TOPBUF,R5 ;POINT TO TOPIC NAME JSR R4,EQU$$ ;IS HIS TYPED STRING .WORD TOPIC ; A PREFIX OF THE REAL NAME? BR 8$ ;GO CHECK IT OUT 7$: CMP @R1,TOPBUF ;FIRST WORD OF NAME MATCHES? BNE 9$ ;NO, LOOK SOME MORE CMP 2(R1),TOPBUF+2 ;YES, BOTH WORDS MATCH? 8$: BEQ GOTITM ;VOILA, WE FOUND IT 9$: ADD #10,R1 ;POINT TO NEXT DIRECTORY ENTRY DEC R2 ;ANY MORE? BNE 5$ ;YES, KEEP LOOKING E.NOTP: MOV #TOPIC,R5 ;POINT TO TOPIC CMP (R5)+,#"ME ;CHECK BNE 10$ ;NOPE TSTB @R5 ;MAYBE? BNE 10$ ;NOPE MOV #'U+40,@R5 ;CHANGE MOV #'O+40*400+'Y+40,-(R5) ; THE TEXT ;+ ;ERROR 10$: ERROR F,<"Help not available for ">,TOPIC E.NOLB: ERROR F,<"File not a valid library HELP.MLB"> ;- .DSABL LSB .SBTTL PROCESS 'HELP *' .ENABL LSB HLPALL: MOV R1,R4 ;COPY POINTER TO DIRECTORY DATA MOV R1,R3 ;THIS IS ALSO THE TOP OF THE TEXT BLOCK MOV #256.,BUFWDS ;READ SINGLE BLOCKS NOW MOV #3-2,DIRBLK ;NEXT DIRECTORY CHUNK BEGINS AT BLOCK 3 1$: CMP (R3)+,(R3)+ ;SKIP THE TOPIC NAME MOV (R3)+,R1 ;GET BLOCK NUMBER MOV (R3)+,R5 ; AND OFFSET INTO BLOCK CMP R3,BUFEND ;OFF THE END OF THE DIRECTORY? BLO 2$ ;NOPE ADD #2,DIRBLK ;READ THE NEXT BLOCKS MOV DIRBLK,R3 ;GET DIRECTORY BLOCK NUMBER ADD BLKADD,R3 ;BIAS IT IN CASE OVERLAY HACK .READW #AREA,CHNTXT,R4,#256.*2,R3 MOV R4,R3 ;YES, BACK UP TO DIRECTORY BUFFER BCC 2$ ;GOOD, CARRY ON WITH BIG DIRECTORY JMP INPERR ;ERROR! 2$: CMP @R3,#-1 ;NEXT ENTRY AN EMPTY? BEQ 7$ ;YES, WE ARE DONE BIC #^C<777>,R5 ;ISOLATE THE OFFSET CMP R1,INPBLK ;IS THE RIGHT BLOCK ALREADY HERE? BEQ 3$ ;YES, THAT'S EASY MOV R1,INPBLK ;NO, GET IT JSR PC,FILLBF ; INTO THE BUFFER 3$: ADD BUFFER,R5 ;POINT TO TEXT WITHIN BUFFER 4$: JSR PC,NXTLIN ;POINT TO THE LINE AFTER THE .MACRO CMPB -1(R5),#LF ;RUN OFF THE END OF THE BUFFER? BEQ 6$ ;NO, WE NOW POINT TO THE HELP LINE JSR PC,NEXTBF ;YES, GET THE NEXT BLOCK IN BR 4$ ; AND KEEP LOOKING FOR START OF NEXT LINE 5$: JSR PC,NEXTBF ;GET MORE OF THE FIRST LINE 6$: MOV R5,R1 ;SAVE START OF TEXT LINE JSR PC,NXTLIN ;FIND END OF THIS LINE JSR PC,XMIT15 ;PRINT IT WITHOUT CMPB -1(R5),#LF ;WAS THAT THE WHOLE LINE? BNE 5$ ;NO, TRY FOR MORE ..NPG1 == . ;***PATCH*** (for no pagination) ;V5+ ; BR 66$ ;Skip pagination checks... TST LPBUFF ;Output to printer? BNE 66$ ;Yes...skip pagination check TST TTSETS ;Console SET SCOPE? BPL 66$ ;Nope...skip pagination stuff DEC LNCNT ;Filled a page? BGT 66$ ;Not yet... CALL PROMPT ;Freeze screen & prompt for ;V5- 66$: DEC R2 ;MORE TOPIC TO DO? BNE 1$ ;YES, DO THEM 7$: JMP EXIT ;DONE AT LAST .DSABL LSB .SBTTL SCAN DIRECTORY FOR TOPIC .ENABL LSB GOTITM: CMP (R1)+,(R1)+ ;POINT TO LOCATION INFORMATION MOV (R1)+,R2 ;GET THE BLOCK NUMBER OF THE HELP TEXT MOV (R1)+,R5 ; AND THE OFFSET WITHIN THE BLOCK BIC #^C<777>,R5 ;ISOLATE THE OFFSET MOV R2,INPBLK ;SET TO START THE READ FROM THE RIGHT BLOCK MOV 4(R1),R0 ;GET NEXT START BLOCK SUB R2,R0 ;COMPUTE BLOCK DIFFERENCE BGE 1$ ;BR IF POSITIVE RESULT COM R0 ;MAKE RESULT POSITIVE 1$: INC R0 ; + 1 FOR NUMBER OF BLOCKS TO READ SWAB R0 ;MAKE IT WORD COUNT ASL R0 ;NOW A BYTE COUNT JSR PC,GETMEM ;ENSURE THAT THE BUFFER IS BIG ENOUGH JSR PC,FILLBF ;FILL UP THE BUFFER ADD R1,R5 ;POINT TO THE HELP TEXT WITHIN THE BUFFER MOV R0,R4 ;SAVE POINTER TO END OF TEXT JSR PC,NXTLIN ;FIND THE NEXT LINE, SKIPPING .MACRO BLOS E.BADL ;(MAYBE FILL MORE???) MOV R5,TXTBEG ;SAVE POINTER TO BEGINNING OF TEXT JSR R4,EQU$$ ;CHECK TO SEE THAT THE WHOLE TOPIC NAME IS OK .WORD TOPIC BEQ 2$ ;TOPIC OK... JMP E.NOTP ;NO SUCH TOPIC (JMP DUE TO RANGE) 2$: JSR PC,NXTLIN ;POINT TO THE NEXT LINE ;001 BLOS E.BADL ;WE DIDN'T GET IT ALL IN MEMORY ;**-2 MOV R5,R1 ;COPY POINTER TO BEGINNING OF LINE ;001 JSR R4,EQU$$ ;LOOK FOR ".ENDM" .WORD A.ENDM BNE 2$ ;NOT YET, KEEP LOOKING CMP R4,R5 ;DID THE COMPARISON RUN PAST THE END? BLO E.BADL ;YES, NOT ALL IN MEMORY MOV R1,TXTEND ;SAVE END OF TEXT FOR THIS TOPIC MOV SUBTOP,R2 ;POINT TO THE SUBTOPIC NAME TSTB @R2 ;IS THERE A SUBTOPIC TO LOCATE? BNE GETSUB ;YES, GO DO SO MOV R1,R5 ;SET END OF TEXT POINTER MOV TXTBEG,R1 ;GET BEGINNING OF TEXT POINTER JSR PC,EMIT15 ;EMIT THE WHOLE HELP TEXT FOR THE TOPIC JMP EXIT ;+ ;ERROR E.BADL: ERROR F,<"HELP.MLB has invalid format"> ;- .DSABL LSB .SBTTL FIND A SUBTOPIC .ENABL LSB GETSUB: CMPB @R2,#'/ ;SPECIAL SLASH TO INDICATE OPTION? BNE 2$ ;NO, A REAL SUBTOPIC NAME MOVB #':,@R2 ;YES, CHANGE TO SUBTOPIC ITEM MARKER MOV #SUBBUF,R0 ;POINT TO BUFFER FOR ACCUMULATING SUBTOPIC MOV #A.OPTN,R3 ;POINT TO "OPTION" 1$: MOVB (R3)+,(R0)+ ;COPY THE SUBTOPIC NAME TO THE BUFFER BNE 1$ ; UNTIL DONE BR 3$ ;NOW FIND IT 2$: JSR PC,CPYITM ;COPY THE ITEM NAME TO SUBBUF 3$: MOV TXTBEG,R5 ;GET POINTER TO START OF TOPIC TEXT MOV TXTEND,R4 ; AND END OF TOPIC TEXT 4$: JSR PC,NXTLIN ;ADVANCE TO THE NEXT LINE BLOS 8$ ;NO MORE LINES, SO NO SUCH SUBTOPIC MOV R5,R1 ;SAVE POINTER TO START OF THIS LINE JSR R4,EQU$$ ;TRY TO FIND THIS SUBTOPIC NAME .WORD SUBTXT BNE 4$ ;NOT HERE, TRY THE NEXT LINE MOV R1,R5 ;RESTORE POINTER TO START OF SUBTOPIC TEXT 5$: JSR PC,NXTLIN ;ADVANCE A LINE BLOS 6$ ;NO MORE, END OF SUBTOPIC = END OF TOPIC CMPB @R5,#SPACE ;NEXT LINE START WITH A BLANK? BNE 5$ ;NO, CAN'T BE NEXT SUBTOPIC CMPB (R5)+,@R5 ;TWO BLANKS? BNE 5$ ;NOPE CMPB (R5)+,@R5 ;THREE BLANKS? BEQ 5$ ;THAT'S TOO MANY, A SUBTOPIC IS " XXXX" CMPB -(R5),-(R5) ;BACK OFF TO FIRST BYTE OF NEXT SUBTOPIC 6$: CMPB @R2,#': ;IS THERE A SUBTOPIC ITEM COMING? BEQ SUBITM ;YES, GO SCAN FOR IT JSR PC,EMIT15 ;EMIT THE TEXT FROM R1 TO R5 NXTSUB: TSTB @R2 ;IS THERE ANOTHER SUBTOPIC? BNE GETSUB ;IF SO, TRY FOR IT 7$: JMP EXIT ;NO, QUIT ;+ ;ERROR 8$: ERROR W,<"Help not available for subtopic ">,SUBBUF ;- CMPB @R2,#': ;IS THERE A SUBTOPIC ITEM COMING? BNE NXTSUB ;NO, ANOTHER TOPIC OR THE END 9$: TSTB @R2 ;SCAN FOR BLANK, SLASH, OR END OF COMMAND BEQ 7$ ;QUIT IF END OF COMMAND CMPB @R2,#'/ ;OPTION ITEM COMING? BEQ GETSUB ;PROCESS IT CMPB (R2)+,#SPACE ;BLANK HERE? BNE 9$ ;IF NOT, SKIP SOME MORE BR GETSUB ;YES, PROCESS NEXT SUBTOPIC .DSABL LSB .SBTTL SCAN SUBTOPIC FOR ITEM .ENABL LSB SUBITM: MOV R1,R3 ;SAVE POINTER TO START OF SUBTOPIC TEXT MOV R5,R4 ; AND END OF SUBTOPIC TEXT 1$: INC R2 ;POINT INPUT SCANNER PAST THE COLON JSR PC,CPYITM ;COPY AN ITEM NAME INTO SUBBUF MOV R3,R5 ;COPY POINTER TO START OF SUBTOPIC TEXT CLR -(SP) ;SET NO ITEMS FOUND YET CMP SUBBUF,#'* ;SUBITEM IS ONLY AN ASTERISK? BNE 2$ ;NO, REAL SUBITEM HERE SWAB SUBBUF ;YES, SET NULL TO MATCH ALL, SAVE THE STAR 2$: JSR PC,NXTLIN ;FIND NEXT LINE BLOS 6$ ;NO MORE 3$: MOV R5,R1 ;SAVE POINTER TO THIS LINE JSR R4,EQU$$ ;IS THIS THE SUBTOPIC ITEM? .WORD SUBTX3 BNE 2$ ;NOPE MOV R1,R5 ;YES, RESTORE POINTER TO ITEM TEXT 4$: JSR PC,NXTLIN ;POINT TO NEXT LINE BLOS 5$ ;END OF SUBTOPIC IS END OF ITEM CMP SUBBUF,#'**400 ;WILD CARD SUBITEM? BEQ 5$ ;YES, DON'T PRINT DESCRIPTIVE PART CMPB @R5,#TAB ;TAB HERE? BEQ 4$ ;YES, STILL PART OF THIS ITEM CMPB @R5,#SPACE ;NEXT LINE START WITH A BLANK? BNE 5$ ;NO, CAN'T BE MORE OF THIS ITEM CMPB 1(R5),@R5 ;TWO BLANKS? BNE 5$ ;NOPE CMPB 2(R5),@R5 ;THREE BLANKS? BNE 5$ ;NOPE CMPB 3(R5),@R5 ;FOUR BLANKS? BEQ 4$ ;YES! SO ITEM CONTINUES! 5$: JSR PC,XMIT15 ;TELL HIM ABOUT THIS SUBTOPIC ITEM INC @SP ;COUNT ONE MORE ITEM FOUND BR 3$ ;LOOK FOR MORE MATCHING ITEMS 6$: TST (SP)+ ;DID WE PRINT ANYTHING? BNE 7$ ;YES, NO ERROR MESSAGE ;+ ;ERROR ERROR W,<"Help not available for subtopic item ">,SUBBUF ;- 7$: CMPB @R2,#': ;IS THERE ANOTHER SUBTOPIC ITEM COMING? BEQ 1$ ;IF SO, FIND IT MOV #CRLF,R1 ;POINT TO NEW LINE MOV #CRLFE,R5 ; AND END OF IT JSR PC,XMIT15 ;PUT OUT A BLANK BR NXTSUB ;CHECK FOR ANOTHER SUBTOPIC .DSABL LSB .SBTTL ERROR AND EXIT HANDLING .ENABL LSB ERROR: MOV R0,-(SP) ;SAVE A REGISTER MOV R1,-(SP) ; OR TWO .PRINT #ERRMSG ;PRINT "?HELP-" MOV (R5)+,R1 ;GET ERROR TEXT POINTER .PRINT R1 ;PRINT IT MOV (R5)+,R0 ;GET POINTER TO THE FILL-IN, IF ANY BEQ 1$ ;NONE .PRINT ;PRINT THAT, TOO 1$: MOV #WARN$,R0 ;GET ERROR CODE VALUE CMPB @R1,#'F ;SEVERE ERROR? BEQ 2$ ;YES, DIE NOW CMPB @R1,#'E ;ERROR? BEQ 3$ ;YES, DIE BISB R0,@#USERRB ;SET WARNING STATUS MOV (SP)+,R1 ;RESTORE MOV (SP)+,R0 ; REGISTERS RTS R5 ;CARRY ON 2$: ASL R0 ;SHIFT ERROR BIT 3$: ASL R0 ;SHIFT ERROR BIT BISB R0,@#USERRB ;SET EXIT STATUS CODE .PURGE #CH.LP ;STOP THE PRINTER, I WANT TO GET OFF CLR LPBUFF ;DON'T DO A THING EXIT: MOV LPBUFF,R2 ;GET PRINTER BUFFER POINTER BEQ 6$ ;NONE MOV R2,R1 ;COPY POINTER SUB LPBUFR,R1 ;COMPUTE LENGTH BEQ 5$ ;NOTHING TO FLUSH ROR R1 ;COMPUTE WORDS BCC 4$ ;WAS EVEN CLRB (R2)+ ;ODD, SO CLEAR OUT LAST WORD INC R1 ; AND FIX COUNT 4$: .WRITW #AREA,#CH.LP,LPBUFR,R1,LPBLOK BCS 7$ ; 5$: .CLOSE #CH.LP ;CLOSE THE PRINTER 6$: CLRB @#ARGADR ;FORGET TOPIC IF RESTARTED BISB #SUCCS$,@#USERRB ;SET SUCCESSFUL EXIT MOV PGMEND,R0 ;LOWER OUR TOP .SETTOP ; TO AVOID SWAPPING OUT .EXIT ;LEAVE 7$: JMP LPERR ;OUTPUT ERROR TO PRINTER .DSABL LSB .SBTTL TEXT MANIPULATION SUBROUTINES ;+ ; NXTLIN - ADVANCE TEXT POINTER TO NEXT LINE ; ; R4 -> TOP OF TEXT AREA BEING CONSIDERED ; R5 -> TEXT ; ; JSR PC,NXTLIN ; ; R5 -> NEXT LINE (JUST AFTER LF) ; CONDITIONS SET TO 'LOS' IF POINTER IS NOW BEYOND EOT ;- NXTLIN: CMP R4,R5 ;AT OR BEYOND END OF BUFFER YET? BLOS 1$ ;IF SO, QUIT CMPB (R5)+,#LF ;LINE FEED? BNE NXTLIN ;IF NO, LOOK MORE CMP R4,R5 ;IF SO, CHECK FOR PAST THE END AGAIN 1$: RTS PC ;+ ; CPYITM - COPY AN ITEM OF TEXT TO SUBBUF ; ; R2 -> COMMAND LINE (ASCIZ STRING) ; ; JSR PC,CPYITM ; ; R0 -> NULL BYTE TERMINATING SUBBUF ; R1 = RANDOM ; R2 -> DELIMITER BYTE (PAST IT IF BLANK) ; SUBBUF CONTAINS ASCIZ STRING PARSED, ENDING WITH 2 NULLS ;- CPYITM: MOV #SUBBUF,R0 ;POINT TO BUFFER TO GET ITEM 1$: MOVB (R2)+,R1 ;GET A BYTE MOVB R1,(R0)+ ;STASH IT BEQ 2$ ;END OF BUFFER MEANS DONE CMPB R1,#SPACE ;BLANK? BEQ 3$ ;YES, END OF ITEM CMPB R1,#': ;ANOTHER ITEM? BEQ 2$ ;YES, END OF THIS ONE CMPB R1,#'/ ;AN OPTION? BNE 1$ ;NO, SCAN FOR MORE 2$: DEC R2 ;FIND THE DELIMITER NEXT TIME 3$: CLRB @R0 ;END THE ITEM WITH TWO NULLS CLRB -(R0) ;END THE ITEM NAME RTS PC ;DONE ;+ ; EQU$$ - COMPARE STRINGS FOR EQUALITY ; ; R5 -> SOURCE STRING ; ; JSR R4,EQU$$ ; .WORD POINTER TO ASCIZ COMPARISON STRING ; ; IF SOURCE STRING MATCHES COMPARISON STRING UP TO (BUT NO INCLUDING) ; THE ZERO BYTE, R5 IS ADVANCED PAST THE STRING AND ; Z=1 (I.E. BEQ FOUND) ; OTHERWISE, R5 IS UNCHANGED AND Z=0 (BNE NOTFOUND) ;- EQU$$: MOV R5,-(SP) ;SAVE A REGISTER MOV R0,-(SP) ; OR TWO MOV (R4)+,R0 ;POINT TO MODEL 1$: TSTB @R0 ;END OF MODEL? BEQ 2$ ;YES, IT'S A HIT CMPB (R0)+,(R5)+ ;TEXT MATCH MODEL? BEQ 1$ ;YES, LOOK FOR MORE MOV (SP)+,R0 ;RESTORE REGISTER MOV (SP)+,R5 ;RESTORE OLD TEXT POINTER (NOTE: <>0) RTS R4 ;RETURN 2$: MOV (SP)+,R0 ;RESTORE REGISTER CLR (SP)+ ;DUMP OLD POINTER, SET Z BIT RTS R4 ;DONE .SBTTL CVT$$ - TRIM A STRING ;+ ; CVT$$ - TRIM A STRING ; ; R5 -> ASCIZ STRING TO TRIM ; ; JSR PC,CVT$$ ; ; R5 -> RESULT STRING (TRIMMED IN PLACE) ; ; REMOVES PARITY BITS, LEADING AND TRAILING BLANKS, REDUCES MULTIPLE ; SPACES/TABS TO A SINGLE SPACE, REMOVES CONTROL CHARACTERS, ; CONVERTS LOWER CASE TO UPPER CASE ;- CVT$$: MOV R0,-(SP) ;SAVE A REGISTER MOV R1,-(SP) ; OR TWO MOV R5,-(SP) ;SAVE TEXT POINTER MOV R5,R0 ;COPY TEXT POINTER 1$: MOVB (R5)+,R1 ;GET A TEXT BYTE BIC #^C<177>,R1 ;TRIM PARITY BEQ 6$ ;COMPLETELY NULL STRING CMPB R1,#SPACE ;LEADING SPACE OR CONTROL CHARACTER? BLOS 1$ ;YES, TRASH IT 2$: CMPB R1,#'A+40 ;IS IT A LOWER CASE LETTER? BLO 3$ ;NO CMPB R1,#'Z+40 ;MAYBE? BHI 3$ ;NOT LOWER CASE BIC #40,R1 ;MAKE IT UPPER CASE 3$: MOVB R1,(R0)+ ;STASH A BYTE 4$: MOVB (R5)+,R1 ;GET ANOTHER BYTE BIC #^C<177>,R1 ;TRIM IT BEQ 6$ ;END OF STRING CMPB R1,#TAB ;IS IT A TAB? BNE 5$ ;NO MOV #SPACE,R1 ;YES, CHANGE TO A SPACE 5$: CMPB R1,#SPACE ;SPACE OR CONTROL CHARACTER? BLO 4$ ;YES, DISCARD IT BNE 2$ ;NO, ACCEPT IT CMPB R1,-1(R0) ;SPACE. WAS THE PREVIOUS CHARACTER A SPACE? BEQ 4$ ;YES, DISCARD THIS ONE BR 2$ ;NO, INSERT THE SPACE 6$: MOV (SP)+,R5 ;RESTORE BUFFER POINTER 7$: CLRB @R0 ;MAKE STRING ASCIZ CMP R0,R5 ;NULL STRING? BEQ 8$ ;YES CMPB -(R0),#SPACE ;NO, TRAILING SPACE? BEQ 7$ ;YES, DELETE IT 8$: MOV (SP)+,R1 ;RESTORE MOV (SP)+,R0 ; REGISTERS RTS PC ;DONE .SBTTL FILL BUFFER WITH TEXT ;+ ; NEXTBF - FILL ONE BLOCK BUFFER WITH NEXT BLOCK OF TEXT ; FILLBF - FILL BUFFER WITH TEXT ; ; INPBLK = BLOCK TO START AT [-1 IF NEXTBF] ; ; JSR PC,FILLBF ; ; R0 -> END OF BUFFER ; R1 -> BUFFER ; R5 -> BUFFER [IF NEXTBF] ;- NEXTBF: INC INPBLK ;INCREMENT BLOCK NUMBER MOV BUFFER,R5 ;RESET TEXT POINTER FILLBF: MOV BUFFER,R1 ;GET BUFFER POINTER MOV INPBLK,-(SP) ;STACK THE BLOCK NUMBER ADD BLKADD,@SP ;BIAS IT .READW #AREA,CHNTXT,R1,BUFWDS,(SP)+ BCS INPERR ;ERROR ASL R0 ;NOW BYTES ADD R1,R0 ;MAKE IT END OF TEXT POINTER RTS PC ;+ ;ERROR INPERR: ERROR F,<"Read error on HELP.MLB"> ;- .SBTTL OUTPUT A BLOCK OF TEXT ;+ ; XMIT15 - OUTPUT A BLOCK OF TEXT WITH NO ; EMIT15 - OUTPUT A BLOCK OF TEXT WITH ; ; R1 -> START OF TEXT ; R5 -> END OF TEXT (PAST LAST BYTE) ; ; JST PC,?MIT15 ;- .ENABL LSB XMIT15: MOVB @R5,-(SP) ;SAVE BYTE AT END OF TEXT MOVB #200,@R5 ;MARK END OF TEXT WITHOUT NEW LINE MOV R0,-(SP) ;Save a register ;V5+ TST LPBUFF ;Output to printer? BNE 4$ ;Yes...go do it! 11$: .PRINT R1 ;Output to terminal BR 2$ ;Merge with common code... ;V5- EMIT15: MOVB @R5,-(SP) ;SAVE BYTE AT END OF TEXT CLRB @R5 ;CLEAR IT TO MARK END OF TEXT 1$: MOV R0,-(SP) ;SAVE A REGISTER TST LPBUFF ;OUTPUT TO THE PRINTER? BNE 4$ ;YES, DO IT TST TTSETS ;Is console SET SCOPE? ;V5+ BPL 11$ ;Nope...skip pagination stuff ..NPG2 == . ;***PATCH*** (no pagination) ; MOV R1,R0 ;Set up R0 ; .PRINT ;Print it... CALL PRPAGE ;Output to terminal 1 page at a time ;V5- 2$: MOV (SP)+,R0 ;RESTORE R0 MOVB (SP)+,@R5 ;RESTORE END BYTE 3$: RTS PC ;DONE 4$: MOV R1,-(SP) ;SAVE MOV R2,-(SP) ; MORE MOV R5,-(SP) ; REGISTERS MOV LPBUFF,R2 ;POINT TO LINE PRINTER BUFFER 5$: CMP R2,BUFFER ;OFF THE END OF THE PRINTER BUFFER? BLO 6$ ;NOPE JSR PC,LPPRNT ;YES, PRINT THE BUFFER LOAD 6$: MOVB (R1)+,(R2)+ ;MOVE A BYTE BGT 5$ ;POSITIVE MEANS MORE TO COME TSTB -(R2) ;BACK UP THE PRINTER BUFFER POINTER BMI 7$ ;NEGATIVE BYTE MEANS NO NEW LINE MOV #CRLF,R1 ;POINT TO TEXT TO ADD MOV #CRLFE,R5 ; AND END OF IT BR 6$ ;EMIT THE NEW LINE 7$: MOV R2,LPBUFF ;SAVE BUFFER POINTER FOR NEXT TIME MOV (SP)+,R5 ;RESTORE MOV (SP)+,R2 ; SOME MOV (SP)+,R1 ; REGISTERS BR 2$ ;FINISH UP LPPRNT: MOV LPBUFR,R2 ;RESET BUFFER POINTER .WRITW #AREA,#CH.LP,R2,#256.,LPBLOK ;OUTPUT INC LPBLOK ;NEXT BLOCK NUMBER BCC 3$ ;DONE IF NO ERROR ;+ ;ERROR LPERR: ERROR F,<"Write error on LP:"> ;- .DSABL LSB .SBTTL OUTPUT TEXT TO TERMINAL .ENABL LSB ;+ ;V5+ ;PRPAGE - OUTPUT HELP TEXT TO TERMINAL, 1 LINE AT A TIME, WITH PAGINATION ; ; R1 => BEGINNING OF TEXT BUFFER ; R5 => PAST END OF BUFFER ; ;- PRPAGE: MOV R1,-(SP) ;Save register 1$: MOV R1,-(SP) ;Save start addr of line 2$: CMP R5,R1 ;End of text? BLOS 4$ ;Yup...go finish up CMPB #LF,(R1)+ ;End of line? BNE 2$ ;Nope...keep going DEC LNCNT ;Decrement line count BGT 2$ ;Not a full page yet - do more 3$: CLRB -(R1) ;Replace it with terminator 4$: MOV (SP)+,R0 ;Get start addr of line .PRINT ;Output to terminal INC R1 ;Point to start of next line CMP R5,R1 ;End of text? BLOS 5$ ;Yup...time to leave CALL PROMPT ;Freeze screen & prompt user... BR 1$ ;Then go do some more 5$: MOV (SP)+,R1 ;Leave R1 the way we found it RETURN ;Back to caller PROMPT: .PRINT #A.MORE ;Prompt for a response 6$: .TTYIN ;Get a character... CMPB R0,#LF ;Is it a LF? BNE 6$ ;No...keep eating characters till we get one! MOV PGSIZE,LNCNT ;Re-initialize line counter RETURN ;Back to caller ;V5- .DSABL LSB .SBTTL ALLOCATE MEMORY ;+ ; MORMEM - GET BUFFER SPACE BEYOND CURRENT BUFFER ; GETMEM - GET BUFFER SPACE INCLUDING CURRENT BUFFER ; ; R0 = SPACE TO GET (IN BYTES) ; BUFFER -> CURRENT BUFFER SPACE [IF GETMEM] ; BUFEND -> TOP OF OLD BUFFER SPACE [IF MORMEM] ; ; JSR PC,???MEM ; ; R0 = SIZE OF BUFFER IN WORDS ; BUFEND, BUFWDS SET ACCORDINGLY ;- MORMEM: MOV BUFEND,BUFFER ;DON'T EXTEND CURRENT, GET NEW STUFF GETMEM: ADD BUFFER,R0 ;GET HIGHEST ADDRESS WANTED BCS 1$ ;CAN'T DO IT SUB #2,R0 ;ROUND DOWN TO HIGHEST ADDRESS USED MOV R0,-(SP) ;STACK IT .SETTOP ;TRY FOR IT CMP R0,(SP)+ ;DID WE GET WHAT WE WANTED? BNE 1$ ;NO TST (R0)+ ;YES, GET FIRST UNUSED ADDRESS MOV R0,BUFEND ;SAVE TOP OF MEMORY POINTER SUB BUFFER,R0 ;COMPUTE SIZE IN BYTES ROR R0 ;MAKE IT WORDS MOV R0,BUFWDS ;SAVE IT RTS PC ;+ ;ERROR 1$: ERROR F,<"Insufficient memory"> ;- .END START