.title k11hlp .ident /2.0.01/ ; Copyright (C) 1986 Brian Nelson ; ; 26-Mar-86 18:41:25 ; ; This is a complete rewrite of Kermit-11's help. It is a bit more ; intelligent, in that it understands wildcarding (ie, HELP SET *) ; and can build subtopic prompting strings and process accordingly. ; I had not planned to rewrite it, but after a few requests it was ; only about half a days work to do. This version also happens to ; be a lot more readable. Alas, it's probably larger. This does not ; hurt anything as far as overlays go, but I have no idea at this ; time how I'm going to get the RT11 FB version to fit on a PDT150 ; RX01 system disk. .if ndf, K11INC .ift .include /IN:K11MAC.MAC/ .endc .enabl gbl cvtarg = 4 ! 10 ! 20 ! 40 .psect $code ,ro,i,lcl,rel,con .save .psect rwdata ,rw,d,lcl,rel,con .even ptopic: .asciz / Topic ? / ; For promtping .even fill5: .byte 40,40,40,40,40,0 ; More filler filler: .byte 40,0 ; For formatting topics: .blkw 20 ; List of topic/subtopic addresses topbuf: .blkb 200 ; Pointers in TOPICS point into here hlpbuf: .blkb 200 ; A read/write buffer for the file htopic: .blkb 200 ; The current topic toplev: .blkw 1 ; Level of current topic wild: .blkw 1 ; If topic wildcarded idxbuf: .blkb 200 ; Private buffer for HINDEX ttbuff: .blkb 200 ; Terminal read buffer idxdmp: .word 0 ; Index was dumped prbuff: .blkb 200 ; Prompting buffer .restore .sbttl the HELP command .psect $code ,ro,i,lcl,rel,con .enabl lsb ; Main loop is here. ; ; (1) Try to open help file; failure --> print internal overlayed help ; (2) Parse the command line, filling in the pointer array 'TOPICS'. ; (3) Find and print (if found) the requested help topic+[subtopic(s)] ; (4) If not found, build a new command line from the 'TOPICS' pointer ; array, prompt and concatenate the requested topic. ; (5) Go back to (2). ; (6) When done, close help file as we don't have the buffer space to ; keep it open. c$help::call hlpopn ; Locate and open the help file tst r0 ; Did we ever find the help file? beq 10$ ; Yes, process the command ; Error. MESSAGE ; opened. Sleep a moment and then MESSAGE ,cr CALLS suspend ,<#4,#0> ; Print some default text call defhlp ; Simple to do jmp 100$ ; Exit now 10$: mov argbuf ,r5 ; Parse the help line clr idxdmp ; Index has not been dumped yet clr wild ; Clear the wildcarding flag next clr topics ; Clear out the pointers tstb @r5 ; Anything passed on line? beq 60$ ; No, dump root index call parse ; And do so, setting up pointers clr cccnt ; Clear the control C count flag call hfind ; Now locate the desired text. tst r0 ; Did we find anything help text? bmi 100$ ; We got a fatal RMS read error. beq 20$ ; Yes, let's go and dump the text dec r0 ; Ok, was it a code of 1 or 2? beq 50$ ; It returned 1, which means not found mov sp ,wild ; It returned 2, which means it found ; something, and it was wildcarded. 20$: call hprint ; Dump the help text out now br 70$ ; Exit 50$: MESSAGE ,cr clr topics ; Clear out arg pointers 60$: MESSAGE ; An extra cr/lf mov #'1 ,-(sp) ; Dump the index out now call hindex ; Print it and return 70$: tst idxdmp ; Did we ever print topic/subtopic list beq 100$ ; No, just exit mov #prbuff ,r3 ; Prompt buffer address mov argbuf ,r4 ; Yes, construct a prompt/parse buffer mov #topics ,r5 ; Pointers into the parse pointers clrb @r3 ; Start off with an asciz string 75$: mov (r5)+ ,r2 ; Get the parsed argument beq 80$ ; All done, exit cmpb (r2) ,#'* ; Wildcard argument ? If so, we are done beq 80$ ; Done STRCAT r3 ,r2 ; Add in the previous topic/subtopic STRCAT r3 ,#filler ; Add in a delimiter now. br 75$ ; Next please 80$: STRCPY r4 ,r3 ; Copy the new command line STRCAT r3 ,#ptopic ; Finish creating the prompt MESSAGE ; A cr/lf PRINT r3 ; Dump the prompt out now CALLS kbread ,<#ttbuff> ; Read a line from KB: tst r0 ; Successful terminal read? bne 100$ ; No, exit asap CALLS cvt$$ ,<#ttbuff,r1,#CVTARG> ; Remove garbage, LC to UC. tst r0 ; Anything left over ? beq 100$ ; No, exit please clrb ttbuff(r0) ; It was successfull, insure .ASCIZ STRCAT r4 ,#ttbuff ; Append the data just read please. jmp 10$ ; And parse the command all over again ; ; 100$: call hlpclo ; Close up the file and exit return .dsabl lsb .sbttl Parse HELP's command line ; PARSE ; ; Passed: r5 Command line, minus 'HELP', assumed to be .asciz ; Return: In topics, addresses to each topic/subtopic ; ; Extra imbedded spaces are removed parse: save ; Save temp please mov #topbuf ,r4 ; Where to copy the text to mov #topics ,r3 ; Where to place the pointers clr @r3 ; Assume nothing was passed ; 10$: tstb @r5 ; All done ? beq 100$ ; Yes, exit this routine cmpb @r5 ,#40 ; While (*ch && *ch == 40) ch++ ; bne 15$ ; Not a space, exit inc r5 ; A space found, check next one br 10$ ; Next 15$: mov r4 ,(r3)+ ; Insert current address clr @r3 ; Insure NEXT is cleared out 20$: tstb @r5 ; All done with this line ? beq 30$ ; Yes, exit cmpb @r5 ,#40 ; Space delimiter found ? beq 30$ ; Yes, setup for next one movb (r5)+ ,(r4)+ ; No, copy some data over br 20$ ; Next please 30$: clrb (r4)+ ; Insure .asciz please br 10$ ; Next subtopic 100$: unsave ; Pop registers and exit return .sbttl find the topic in the help file .enabl lsb ; Input: topics list of addresses of text to match ; Return: R0 zero for success, 1 for not found, else RMS error code ; two for match and wildcarded topic/subtopic hfind: save ; Save registers we may trash here CALLS rewind ,<#LUN.IN> ; Rewind to start of the file mov #topics ,r5 ; Point to the help topic list mov #'1 ,r2 ; Current topic level clrb htopic ; Clear header out ; 10$: tst @r5 ; Anything to look for ? beq 100$ ; No, just leave pointing at beginning mov #hlpbuf ,r4 ; Pointer to buffer to use tst cccnt ; Control C typed? bne 90$ ; Yes, please exit this loop clrb @r4 ; Preset to a null string CALLS getrec , ; Read a record from the file tst r0 ; Errors on the read ? beq 20$ ; no cmp r0 ,#ER$EOF ; End of file reached ? beq 90$ ; Yes, return(1) 20$: clrb hlpbuf(r1) ; Insure .asciz please cmpb @r4 ,r2 ; Topic levels match up? bne 80$ ; No, read another record then inc r4 ; Skip over the level flag now 30$: tstb @r4 ; End of the line beq 80$ ; Yes, read another record cmpb @r4 ,#40 ; No, skip over spaces now bne 40$ ; No more spaces, time to check topic inc r4 ; Spaces, skip over please br 30$ ; Next please 40$: mov (r5) ,r3 ; Get pointer to text to match up cmpb (r3) ,#'* ; Wildcarding ? beq 85$ ; Yes, return(2) ; 50$: tstb (r3) ; Found the end of the desired topic? beq 70$ ; Yes, check for next level topic needed tstb (r4) ; End of the line yet ? beq 80$ ; Yes. movb (r4)+ ,r0 ; Convert to upper case cmpb r0 ,#'a!40 ; Is this a lower case letter blo 55$ ; No cmpb r0 ,#'z!40 ; Keep checking... bhi 55$ ; No bicb #40 ,r0 ; Convert to upper case 55$: cmpb (r3)+ ,r0 ; No, do the characters match up? beq 50$ ; Yes, keep checking them br 80$ ; No, read another record. ; 70$: inc r2 ; Match, increment level number and read tst (r5)+ ; another record from the help file. STRCAT #htopic ,#hlpbuf+1 ; Build up a header record 80$: br 10$ ; Next please 85$: mov #2 ,r0 ; Match with wildcarding mov r2 ,toplev ; Save the topic level and exit br 110$ ; Exit ; 90$: mov #1 ,r0 ; Not found (reached end of file) br 110$ ; Exit ; 100$: mov r2 ,toplev ; Save topic level dec toplev ; It will be off by one clr r0 ; Found the topic 110$: unsave ; Pop registers and exit return ; Bye .dsabl lsb .sbttl print help text already found by HFIND .enabl lsb ; Return: <0 Failure, the RMS error code ; 0 Success ; 1 Found subtopics to print out ; ; Assumes: That both PARSE and HFIND have been called already. hprint: save ; Save these registers please STRCPY #ttbuff ,#htopic ; Get the default header string made ; 30$: tst cccnt ; Control C interupt ? bne 90$ ; Yes, exit please mov #hlpbuf ,r4 ; Point to the buffer now CALLS getrec , ; Read the next record tst r0 ; Error ? bne 90$ ; Yes, exit clrb hlpbuf(r1) ; Insure it's .asciz please cmpb (r4) ,#40 ; Leading space ? blos 60$ ; Yes, a normal line to print cmpb (r4) ,toplev ; Is this a lower, higher or same? blo 90$ ; Lower level, thus we must exit. beq 50$ ; Same level movb (r4) ,-(sp) ; Pass the level number please call hindex ; And print out whats leftover. tst wild ; If not wildcarded then exit. beq 80$ ; Exit ; 50$: tst wild ; Same level, wildcarded? beq 90$ ; No, we must exit then. inc r4 ; Skip past the leading number in line STRCPY #ttbuff ,#htopic ; Build a header string up STRCAT #ttbuff ,r4 ; Copy over the topic name. dec r4 ; Reset the pointer clrb @r4 ; Don't print this line. ; 60$: tstb ttbuff ; Do we need to print the next topic? beq 70$ ; No MESSAGE ; CrLf PRINT #ttbuff ; Yes, dump it please MESSAGE ; Ditto... clrb ttbuff ; Clear topic name out now 70$: tstb @r4 ; Don't print if NULL beq 75$ ; ... PRINT r4 ; Ok to print, dump the text now 75$: MESSAGE ; A cr/lf please br 30$ ; Next please 80$: mov #1 ,r0 ; Return(Sub_topic_found) br 100$ ; Exit ; 90$: clr r0 ; Return(Success) br 100$ ; Exit ; 100$: unsave ; Pop registers and exit return ; And finally exit .dsabl lsb .sbttl print index out .enabl lsb ; Passed: 2(sp) Level to look for ; ; Assumption: HLPBUF is already loaded with the current record hindex: save ; We may overwrite these here clr -(sp) ; Allocate some buffers clr -(sp) ; Allocate some buffers mov sp ,idxdmp ; Flag that we have been here mov sp ,r5 ; And a pointer to such movb 2+<6*2>(sp),2(r5) ; Get the topic level passed. mov #idxbuf ,r3 ; Get a buffer to store names in mov #hlpbuf ,r4 ; Point to the help buffer now cmpb 2(r5) ,#'1 ; Is this the MAIN menu today? bhi 10$ ; No, don't reposition the file CALLS rewind ,<#LUN.IN> ; It is the main, reset the file clrb hlpbuf ; Flag that nothings there 10$: Message < Additional information is available on:>,cr Message ; An extra CR/LF Message ; CRLF please STRCPY r3 ,#fill5 ; Move over a bit mov #4 ,(r5) ; Number of topic names per line clr cccnt ; Insure control C count is zapped ; 30$: tstb @r4 ; Do we need to load the buffer? bne 40$ ; No CALLS getrec , ; Yes, preload the buffer now. tst r0 ; Did we reach end of file? bne 80$ ; Yes, exit please clrb hlpbuf(r1) ; Always .asciz please 40$: tst cccnt ; If control C then exit bne 90$ ; Exit then cmpb @r4 ,#40 ; Is this a null line or a text line? blos 60$ ; If so, ignore it. cmpb @r4 ,2(r5) ; Must be a topic line, check the level bhi 60$ ; Higher level, ignore it blo 80$ ; Lower level, we need to exit clrb 21(r4) ; Insure no more than 16 characters inc r4 ; Skip the level number on the line STRCAT r3 ,r4 ; Add on the current topic now strlen r4 ; Now compute the number of spaces dec r4 ; Fix the pointer up to startofline mov #22 ,r2 ; Assume worst case of 18 spaces needed sub r0 ,r2 ; We now have the number of spaces. 50$: STRCAT r3 ,#filler ; Loop adding the spaces in sob r2 ,50$ ; Terribly inefficient, but so what. dec (r5) ; Is there room left for the next one? bne 60$ ; Yes, go and get some more PRINT r3 ; No, we have to dump and reset things MESSAGE ; A cr/lf mov #4 ,(r5) ; Reset the counter now STRCPY r3 ,#fill5 ; Reset the line buffer ; 60$: clrb @r4 ; Force a read next time br 30$ ; Next please 80$: PRINT r3 ; End of file, dump whats left over MESSAGE ; And exit. clr r0 ; Success br 100$ ; Bye ; 90$: mov #-1 ,r0 ; Failure exit ; 100$: cmp (sp)+ ,(sp)+ ; Pop some local buffers... unsave ; Pop registers and exit mov (sp)+ ,(sp) ; Pop return address up and exit return ; Exit now .dsabl lsb .sbttl open and close the kermit-11 help file up .enabl lsb ; This code was taken verbatim from the old K11HLP.MAC hlpclo: CALLS close ,<#lun.in> return hlpopn: call getprv ; seems to be needed mov #hnames ,r1 ; the list of help file names call getsys ; if this is RT11 use something cmpb r0 ,#sy$rt ; reasonable please bne 10$ ; not RT mov #rtname ,r1 ; RT11, try DK: and SY: 10$: mov r1 ,r2 ; Save it 20$: tst @r1 ; end of the list as of yet ? beq 70$ ; yes, can't find the help file CALLS fopen ,<@r1,#lun.in,#text,#$HBUFS>; try to open help file tst r0 ; did it work ? beq 100$ ; yes tst (r1)+ ; no, try the next help filename br 20$ ; next please 70$: MESSAGE <%Kermit-11-W Cannot find the Kermit-11 help files or>,cr MESSAGE ,cr MESSAGE ,cr MESSAGE ; 80$: tst @r2 ; Any more left beq 90$ ; No PRINT @r2 ; Yes, print the name of the file MESSAGE ; A crlf tst (r2)+ ; Point to next br 80$ ; Next please 90$: mov #ER$FNF ,r0 ; return file not found 100$: call drpprv ; please no more privs return ; return with it open or not found .dsabl lsb .save .psect rodata ,ro,d,lcl,rel,con hnames::.word 10$,20$,30$,40$,0 10$: .asciz /LB:[1,2]K11HLP.HLP/ 20$: .asciz /SY:[1,2]K11HLP.HLP/ 30$: .asciz /KERMIT:K11HLP.HLP/ 40$: .asciz /HELP:K11HLP.HLP/ .even rtname: .word 10$,20$,0 10$: .asciz /DK:K11HLP.HLP/ 20$: .asciz /SY:K11HLP.HLP/ .even .restore global global <$HBUFS> .end