HLP.MAC;1/-AU=IN:[12,10]HELLO.MAC;1 -;THIS SLP COMMAND FILE EXTRACTS THE HELP CODE FROM THE SYSTEM HELLO PROGRAM -; ASSUMED TO BE LOCATED IN IN:[12,10]HELP.MAC - NOTE THAT YOU MUST ASSIGN -; IN: BEFORE INVOKING THIS SLP COMMAND FILE -;WE WILL ALWAYS USE VERSION 1 OF THE SYSTEM SOURCE CODE SO THAT THE LINE -; NUMBERS ARE INDEPENDENT OF PATCHES BY DEC AND USERS. -1,2 ;REPLACE DEC'S TITLE & VERSION ;JN3.2A .TITLE HLP - HELP SUBROUTINE .IDENT /JN3.2B/ -22,, ;INSERT STUFF AFTER DEC'S COPYRIGHT ;JN3.2A ;THIS IS NOW A FORTRAN-CALLABLE SUBROUTINE TO PROCESS HELP FILES ;JN3.2A ;USAGE: ;JN3.2A ; CALL NHELP(LUNTI,LUNFIL,FILSTG,HLPSTG) ;JN3.2A ; OR: IERR=NHELP(....) ;JN3.2A ;WHERE: ;JN3.2A ; LUNTI =LUN FOR TI: OUTPUT FROM HELP FILE ;JN3.2A ; LUNFIL=LUN FOR READING FROM HELP FILE ;JN3.2A ; FILSTG=STRING CONTAINING HELP FILE NAME, TERMINATED WITH A NULL ;JN3.2A ; HLPSTG=STRING OF USER'S HELP ENQUIRY, TERMINATED WITH A NULL ;JN3.2A ;VALUE RETURNED IS +1 FOR SUCCESS, ELSE I/O ERROR CODE ;JN3.2A ; ;JN3.2A ;MODIFICATION HISTORY ;JN3.2A ; JN3.2A - 810428. MADE CHANGE TO CONVERT HELLO TO HLP SUBROUTINE ; JN3.2B - 810507. ADDED JIM DOWNWARD'S HELP ENHANCEMENTS ; ;JN3.2A .MCALL DIR$,QIOW$ ;NECESSARY SYSTEM MACROS ;JN3.2A .MCALL OPEN$R,GET$,CLOSE$,CSI$,CSI$1,CSI$2 ;REQUIRED FCS MACROS;JN3.2A .MCALL NMBLK$,FDOP$R,FDBDF$ ;JN3.2A .MACRO CALLR X ;MACRO SO DON'T NEED RSXMC.MAC PREFIX ;JN3.2A JMP X ;JN3.2A .ENDM ;JN3.2A -;THE FOLLOWING ARE REPLACEMENTS FOR DEC'S ERROR MESSAGES ;JN3.2A .ENABL LC ;LOWER-CASE MESSAGES ARE MUCH NICER ;JN3.2A .NLIST BEX ;JN3.2A MS1: .BYTE 12,15 ;+ ;JN3.2A ER1: .ASCIZ /HLP - Syntax error./ ;JN3.2A ER8: .ASCII /HLP - Message file error # / ;JN3.2A ER8NUM: .ASCIZ /-NNNNN/ ;JN3.2A ER9: .ASCIZ /HLP - Ambiguous qualifier./ ;JN3.2A ER10: .ASCIZ /HLP - Improper HELP file format./ ;JN3.2A ER11: .ASCIZ /HLP - NO information available on that subject./ ;JN3.2A ER17: .ASCIZ /HLP - Indirect file syntax error./ ;JN3.2A ER18: .ASCII /HLP - Indirect file open error # / ;JN3.2A ER18NM: .ASCIZ /-NNNNN/ ;JN3.2A ER19: .ASCIZ /HLP - Synonym NOT found./ ;JN3.2A ER20: .ASCIZ /HLP - Ambiguous synonym./ ;JN3.2A .EVEN ;JN3.2A .LIST BEX ;JN3.2A -; THE FOLLOWING IS A REPLACEMENT FOR DEC'S ODPB ;JN3.2A ODPB: QIOW$ IO.WVB,,5,,IOSB,, ;JN3.2A IOSB: .BLKW 2 ;I/O STATUS FOR ABOVE QIO ONLY ;JN3.2A ATTSTS: .BLKW 1 ;STATUS AFTER ATTACH TO DETECT IE.DAA ;JN3.2A STKPTR: .BLKW 1 ;SAVED STACK POINTER FOR UNWIND ;JN3.2A MTCHAL: .WORD 0 ;IF = 1, MATCHES ALL KEYWORDS, ALL LVLS ;JN3.2B ENDFLG: .WORD 0 ;IF = 0, MAKE 1 VALIANT TRY TO FIND ;JN3.2B ; MATCHAL, SEARCHING TO END OF FILE. ;JN3.2B ;IF = 1, PRINT UNKNOWN QUALIFIER MSG ;JN3.2B ; (NO MATCHAL AT END OF FILE) ;JN3.2B $ACTFL: FDBDF$ ;ESTABLISH LOCAL FDB FOR HELP FILE ;JN3.2A -23,247 ;REMOVE ALL LEADING JUNK BEFORE CSI DEFINITION ;JN3.2A -;KEEP MISC. VARIABLE LOCATIONS ;JN3.2A -255,295 ;KEEP FILOPN FLAG WORD ;JN3.2A -297,302 ;JN3.2A -314,324 ;JN3.2A BUF: ;REF. LABEL ;JN3.2A -325 ;NEED ANOTHER BUFFER ;JN3.2A HLPTXT: .BLKB 134. ;BUFFER FOR HELP LINE FROM CALLER ;JN3.2A -326,332 ;JN3.2A -335,, ;JN3.2A .BLKB 40. ;EQUIVALENT AMOUNT OF ROOM TO ORIGINAL ;JN3.2A -336,340 ;JN3.2A -342,382 ;JN3.2A -;MAKE ATTACH STUFF INTO SUBROUTINE ;JN3.2A -386,386 ;NEED ENTRY LABEL HERE ;JN3.2A ATTACH: MOV #ODPB,R4 ; GET OUTPUT DPB ADDRESS ;JN3.2A -388,388 ;NEED TO ADD A LABEL ;JN3.2A QIORST: CALL QIO ; TO TI: ;JN3.2A -389,, ;JN3.2A MOV IOSB,ATTSTS ;SAVE STATUS TO LATER CHECK FOR IE.DAA ;JN3.2A RETURN ;JN3.2A -391,906; KEEP DETACH SUBROUTINE ;JN3.2A ;+ ;JN3.2A ; DETACH SUBROUTINE ;JN3.2A ;- ;JN3.2A DETACH: CMPB #IE.DAA,ATTSTS ;WAS TI: ALREADY ATTACHED ON ENTRY? ;JN3.2A BEQ 10$ ;BR IF YES ;JN3.2A MOV #ODPB,R4 ; GET OUTPUT DPB ADDRESS ;JN3.2A -908,908 ;CHANGE PATH TO RESTORE Q.IOFN FOR REUSE ;JN3.2A CALLR QIORST ; DETACH TERMINAL ;JN3.2A ; ;JN3.2A 10$: RETURN ;RETURN IF TI: WAS ATTACHED ON ENTRY ;JN3.2A -909,922 ;REMOVE MORE STUFF, UP TO WRIT SUBROUTINE ;JN3.2A -939,1108 ;REMOVE MORE STUFF UP TO QIO SUBROUTINE ;JN3.2A -1116,1118 ;DON'T NEED SEPARATE WTSE ANYMORE ;JN3.2A -;REMOVE STUFF UP TO FILERR CODE ;JN3.2A -1121,1454 ;JN3.2A ;+ ;JN3.2A ;FILE ERROR TYPE CHECK ;JN3.2A ;- ;JN3.2A -1455 ;JN3.2A -1463,1463 ;DON'T CALL ERR8 - DO IT OURSELVES ;JN3.2A MOV #ER8,R0 ;GET ERROR MESSAGE ADDRESS ;JN3.2A CALL WRIT ;OUTPUT IT ;JN3.2A -1465 ;RETURN AN ERROR CODE ;JN3.2A FERXIT: MOV #$ACTFL,R1 ;GET FDB ADDRESS ;JN3.2A MOVB F.ERR(R1),R0 ;GET FCS ERROR CODE ;JN3.2A JMP CLNXIT ;GO DO CLEANUP BEFORE RETURN ;JN3.2A -1468,1472 ;REMOVE ALL STUFF UP TO HELP SUBROUTINE ITSELF ;JN3.2A -1623,1626 ;CHANGE SO DOES NOT CALL FINIT$ OR DO FILE OPEN ;JN3.2A NHELP:: ;REF LABEL ;JN3.2A MOV SP,STKPTR ;SAVE STACK POINTER FOR UNWIND ;JN3.2A CMP (R5)+,#4 ;DO WE HAVE ENOUGH PARAMETERS? ;JN3.2A BGE 2$ ;SKIP IF YES ;JN3.2A MOV #IE.BAD,R0 ; ELSE RETURN SHOWING 'BAD PARAMETERS' ;JN3.2A RETURN ;JN3.2A 2$: MOV @(R5)+,ODPB+Q.IOLU ;COPY OVER THE LUN # FOR TI: ;JN3.2A FDOP$R #$ACTFL,@(R5)+ ;SAME FOR HELP-FILE LUN ;JN3.2A CALL ATTACH ;ATTACH TI: FOR OUTPUT (FOR CNTL-O) ;JN3.2A MOV (R5)+,R0 ;GET ADDRESS OF FILENAME STRING ;JN3.2A MOV #HLPBUF,R1 ;SET POINTER TO OUTPUT AREA ;JN3.2A MOVB #'@,(R1)+ ;INSERT '@' TO FAKE A LOWER-LEVEL FILE ;JN3.2A 4$: MOVB (R0)+,(R1)+ ;THEN COPY OVER FILENAME ;JN3.2A BNE 4$ ; UNTIL NULL FOUND AT END ;JN3.2A MOV #HLPBUF,R0 ;GET OUTPUT ADDRESS AGAIN ;JN3.2A SUB R0,R1 ;CALC. LENGTH OF FILENAME STRING ;JN3.2A DEC R1 ;ADJUST FOR TRAILING NULL ;JN3.2A INC INDFLG ;SET FLAG SO WE CAN DO AN INDIRECT OPEN ;JN3.2A MOV (R5),R4 ;GET ADDRESS OF USER'S HELP STRING NOW ;JN3.2A ; R5 IS DESTROYED IN NEXT CALL ;JN3.2A CALL ISINDR ;GOSUB TO DO THE FILE PARSING AND OPEN ;JN3.2A BCC FERXIT ;EXIT W/ ERROR CODE IF IT DIDN'T WORK ;JN3.2A MOV #HLPTXT,R1 ;SET UP TO COPY TO LOCAL BUFFER ;JN3.2A MOV #132.,R3 ;SET UP CHARACTER COUNT LIMIT ;JN3.2A MOV #-1,R5 ;SET FLAG FOR START OF SCAN ;JN3.2A MOVB #40,(R1)+ ;INSERT LEADING BLANK TO MAKE SCAN HAPPY;JN3.2A 6$: TSTB (R4) ;AT END OF USER'S STRING? ;JN3.2A BEQ 72$ ;SKIP IF YES ;JN3.2A CMPB (R4),#40 ;IS IT A SPACE? ;JN3.2A BEQ 71$ ;SKIP IF YES ;JN3.2A CMPB (R4),#9. ;IS IT A TAB? ;JN3.2A BEQ 71$ ;IF YES, TREAT JUST AS A SPACE ;JN3.2A CLR R5 ;IF NOT, CLEAR SPACE-SEEN FLAG ;JN3.2A MOVB (R4)+,(R1) ;COPY CHARACTER ;JN3.2A CMPB (R1),#'a ;IS IT LOWER-CASE? ;JN3.2A BLO 64$ ;SKIP IF NOT ;JN3.2A CMPB (R1),#'z ;CHECK UPPER LIMIT ALSO ;JN3.2A BHI 64$ ;SKIP IF BEYOND ;JN3.2A BICB #40,(R1) ;CHANGE LOWER TO UPPER CASE ;JN3.2A 64$: INC R1 ;ADVANCE OUTPUT BUFFER POINTER ;JN3.2A BR 712$ ; AND GO FOR NEXT ONE ;JN3.2A ; ;JN3.2A 71$: TST R5 ;WHAT STATE ARE WE IN NOW? ;JN3.2A BNE 711$ ;SKIP CHAR IF NO NON-BLANK/TABS SEEN ;JN3.2A ; OR IF SEEING MULTIPLE SPACES ;JN3.2A INC R5 ;SET FLAG FOR A SPACE SEEN ;JN3.2A MOVB #40,(R1)+ ;MOVE SAME TO OUTPUT BUFFER ;JN3.2A 711$: INC R4 ;BUMP INPUT POINTER TO NEXT CHAR ;JN3.2A 712$: SOB R3,6$ ;BACK FOR NEXT UNLESS COUNT RUNS OUT ;JN3.2A 72$: TST R5 ;DO WE SHOW A BLANK LAST SEEN? ;JN3.2A BEQ 721$ ;SKIP IF NOT ;JN3.2A DEC R1 ;ELSE REMOVE IT ;JN3.2A 721$: MOVB #15,(R1) ;PUT A AT END OF REC. FOR SCAN CODE;JN3.2A MOV #HLPTXT,R4 ;SET UP POINTER FOR REST OF CODE -1640,1640 ;CHANGE BUFFER NAME ;JN3.2A MOV #HLPTXT,R0 ; PRINT THE LINE UP TO THE PLACE ;JN3.2A -1643,1643 ;CHANGE TO 'SUCCESS' FOR NO MATCH ;JN3.2A CALL WRIT2 ;PRINT LINE IN ERROR ;JN3.2A JMP GETEOF ;RETURN 'OK', JUST NO INFO FOUND ;JN3.2A -1647,1647 ;JN3.2B BCC 45$ ;MAYBE, LET'S COMPARE STRINGS ;JN3.2B TST ENDFLG ;ONLY LOOK FOR MATCHAL ONCE ;JN3.2B BGT 90$ ;WE'VE BEEN THIS WAY BEFORE, SAY NO MTCH;JN3.2B INC ENDFLG ;IF =0, WE'LL TRY ONCE TO FIND MATCHAL ;JN3.2B MOV #10.,DEPTH ;ABSOLUTELY NOT, SO CHK IF MATCHALL @END;JN3.2B BR 40$ ;GO GET NEXT RECORD, SEE IF FIND MTCHAL ;JN3.2B 45$: ;REF. LABEL ;JN3.2B -1667,1667 ;JN3.2B BCS 55$ ;NO, KEYWORD IS NOT AMBIGUOUS ;JN3.2B TST MTCHAL ;IS IT AMBIGUOUS BUT NOT MATCHALL? ;JN3.2B BEQ 100$ ;IF =0, JUST AMBIGUOUS ;JN3.2B 55$: ;REF. LABEL ;JN3.2B -1702,1702 ;REMOVE EXTRA CALL TO DETACH ;JN3.2A -1705,1705 ;LEAVE C.C. THE NORMAL WAY ;JN3.2A -1707,1709 ;SO DON'T OUTPUT OUR OWN ANY MORE ;JN3.2A -1713,1714 ;CHNG SO WE DO OUTPUT NOW IF ZRO-LNGTH LINE ;JN3.2A BNE 25$ ;SKIP IF NON-ZERO LENGTH ;JN3.2A CLR ODPB+Q.IOPL+4 ;CHANGE TO NO C.C. ;JN3.2A MOV #MS1,R0 ;SET TO OUTPUT JUST + ;JN3.2A MOV #2,R1 ;JN3.2A CALL WRIT2 ;DO IT ;JN3.2A MOV #40,ODPB+Q.IOPL+4 ;RESTORE NORMAL C.C. ;JN3.2A BR 20$ ;NOW GO GET A NEW RECORD ;JN3.2A ; ;JN3.2A 25$: MOV F.NRBD+2(R0),R0 ; POINT AT FIRST CHARACTER OF RECORD ;JN3.2A -1720,1720 ;CHANGE BRANCH LABEL - 10$: IS NOW GONE ;JN3.2A BCC 20$ ; IF EVERYTHING WENT OKAY, SEE IF ;JN3.2A -1722,1723 ;REMOVE RETURN AND ALLOW TO FALL THRU TO GETEOF ;JN3.2A 40$: ;REF. LABEL ;JN3.2A -1724,1724 ;CHANGE TO SHOW SUCCESS ON EXIT ;JN3.2A GETEOF: MOV #1,R0 ;SUCCESSFUL EXIT ;JN3.2A BR CLNXIT ;USE COMMON CLEANUP CODE ;JN3.2A EXIT: MOV #IE.BTP,R0 ;RETURN BAD-RECORD-TYPE ERROR CODE ;JN3.2A CLNXIT: MOV STKPTR,SP ;RESTORE SP FOR CLEAN EXIT ;JN3.2A CALL DETACH ;RELEASE TERMINAL ;JN3.2A MOV R0,-(SP) ;SAVE EXIT STATUS FOR A MOMENT ;JN3.2A CLOSE$ #$ACTFL ;MAKE SURE FILE IS CLOSED ;JN3.2A MOV (SP)+,R0 ;GET BACK EXIT STATUS ;JN3.2A -1758,, ;JN3.2B TST MTCHAL ;IS IT THE ULTIMATE MATCH? ;JN3.2B BGT 20$ ;IF >0, YES ;JN3.2B -1788,1788 ;REMOVE EXTRANEOUS CALL TO DETACH ;JN3.2A -1796,1796 ;JN3.2B COMPAR: ;REF. LABEL ;JN3.2B TST MTCHAL ;IS IT THE ULTIMATE MATCH ;JN3.2B BEQ 25$ ;IF =0, NO, CONTINUE ;JN3.2B INC INDFLG ;ASSUME INDIRECT FILE ;JN3.2B BR 70$ ; AND EXIT ;JN3.2B 25$: MOV R4,-(SP) ;SAVE R4 ;JN3.2B -1828,1829 ;JN3.2B 70$: RETURN ;JN3.2B -1943,1943 ;JN3.2B ISREC: ;REF. LABEL ;JN3.2B CMPB (R0),#'# ;IS IT A MATCHALL? ;JN3.2B BNE 10$ ;IF NE, NO ;JN3.2B INC MTCHAL ;SHOW A MATCH ;JN3.2B BR 20$ ; AND EXIT ;JN3.2B 10$: ;REF. LABEL ;JN3.2B CMPB (R0),#'1 ; IS THE FIRST CHARACTER A DIGIT? ;JN3.2B -2025,2026 ;NO LONGER NEED TO INSERT & ;JN3.2A -2032,2032 ;CHANGE EXIT PATH TO RETURN ERROR CODE ;JN3.2A CALL WRIT2 ;OUTPUT OFFENDING FILE SPEC ;JN3.2A JMP FERXIT ; & RETURN FCS ERROR CODE ;JN3.2A -2033,, ;JN3.2B CLR MTCHAL ;RESET MATCHALL ;JN3.2B -2119,2119 ;REMOVE EXTRANEOUS CALL TO EXIT ;JN3.2A -2121,2258 ;REMOVE ALL TRAILING JUNK ;JN3.2A .END ;FINAL .END FOR PROPER ASSEMBLY ;JN3.2A /