/ TABLE-DRIVEN COMMAND PROCESSOR / TABLE-DRIVEN COMMAND PROCESSOR WITH MENU-ON-DEMAND. / LAST EDIT: 07-NOV-1988 02:00:00 CJL / DEFINITIONS. ALT1= 175 / ALT2= 176 / CBFFLD= 10 /COMMAND BUFFER FIELD CNTRLG= "G&37 / CNTRLH= "H&37 / CNTRLI= "I&37 / CNTRLJ= "J&37 / CNTRLM= "M&37 / CNTRLO= "O&37 /<^O> CNTRLP= "P&37 /<^P> CNTRLQ= "Q&37 / CNTRLR= "R&37 /<^R> CNTRLS= "S&37 / CNTRLU= "U&37 /<^U> CNTRLW= "W&77 /^W> COMBADR=200 /COMMAND BUFFER ADDRESS ESC= 033 / LC= 140 /BASE LOWER-CASE CODE MSGFLD= 10 /MESSAGE BUFFER FIELD NL0001= CLA IAC /LOAD AC WITH 0001 NL2000= CLA CLL CML RTR /LOAD AC WITH 2000 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 NL7777= CLA CMA /LOAD AC WITH 7777 QFLIP= "?&37 / PRGFLD= 00 /PROGRAM FIELD RUBOUT= 177 / SBOOT= 7600 /MONITOR EXIT TBLFLD= 10 /COMMAND TABLE FIELD UC= 100 /BASE UPPER-CASE CODE / KEYBOARD DEFINITIONS. IFNDEF KEY /KEYBOARD DEVICE CODE KCCIOT= KEY^10+6002 /CLEAR CONSOLE KEYBOARD FLAG, AC KRBIOT= KEY^10+6006 /READ CONSOLE KEYBOARD BUFFER, CLEAR FLAG KRSIOT= KEY^10+6004 /READ CONSOLE KEYBOARD BUFFER STATIC KSFIOT= KEY^10+6001 /SKIP ON CONSOLE KEYBOARD FLAG / TELEPRINTER DEFINITIONS. IFNDEF TTY /TELEPRINTER DEVICE CODE TLSIOT= TTY^10+6006 /PRINT CHARACTER, CLEAR FLAG TSFIOT= TTY^10+6001 /SKIP ON TELEPRINTER FLAG / DEFINITIONS. / SETTING ESC033= 1 ENABLES 033 AS . / SETTING ESC176= 1 ENABLES 176 AS . / SETTING ESC177= 1 ENABLES 177 AS . IFNDEF ESC033 /DEFAULT IS 033 IS IFNDEF ESC175 /DEFAULT IS 175 IS NOT IFNDEF ESC176 /DEFAULT IS 176 IS NOT / LOWER-CASE DEFINITIONS. / SETTING LOWER= 0 ALLOWS LOWER-CASE INPUT / SETTING LOWER= -40 FOLDS LOWER-CASE TO UPPER CASE IFNDEF LOWER /LOWER-CASE IS ALLOWED AS IS / IFNDEF LOWER /LOWER-CASE IS FOLDED TO UPPER-CASE *0 /START AT THE BEGINNING *20 /GET PAST AUTO-INDEX AREA BCOUNT, .-. /BACKSPACE COLUMN COUNTER BUFPTR, .-. /BUFFER POINTER COLUMN, .-. /COLUMN COUNTER ECHOSW, 0 /0=ECHO, 4000=DON'T ECHO GBTEMP, .-. /GET BUFFER TEMPORARY GETADR, .-. /GET HALF-WORD ADDRESS GETBASE,.-. /GET HALF-WORD BASE GETINDE,.-. /GET HALF-WORD INDEX INCHAR, .-. /LATEST KEYBOARD INPUT CHARACTER MSGOUT, .-. /OUTPUT ROUTINE POINTER PCOUNT, .-. /PROMPT COLUMN COUNTER PMCOUNT,.-. /PARTIAL MATCH COUNTER PMPOINT,.-. /PARTIAL MATCH GUIDE-WORD POINTER P7TEMP, .-. /OUTPUT ROUTINE TEMPORARY QSWITCH,.-. /"?" HELP SWITCH; 0=HELP, 4000=DON'T HELP SCRCASE,.-. /CURRENT MESSAGE CASE SCRCHAR,.-. /LATEST MESSAGE CHARACTER SCRPTR, .-. /MESSAGE POINTER TABPTR, .-. /SUB-OPTION TABLE POINTER TERMSW, .-. /BUFFER TERMINATOR TYPE; -1= ?, 0= , +1= UPONLY, LOWER /0=UPPER/LOWER-CASE, -40=UPPER-CASE ONLY WRKPTR, .-. /SCAN ROUTINE POINTER PAGE /START AT THE USUAL PLACE START, TLSIOT /RAISE OUTPUT FLAG TAD [COMBUFFER] /POINT TO DCA BUFPTR /COMMAND BUFFER DCA QSWITCH /ENABLE HELP VIA "?" JMS I (GETBUFFER) /GET INPUT BUFFER TAD [COMBUFFER] /POINT TO DCA BUFPTR /COMMAND BUFFER JMS I (SCAN) /SCAN FOR COMTABLE /KEYWORD MATCH HLT /DISPLAY RETURN CODE JMP I [SBOOT] /GOODBYE! PAGE / SCAN ROUTINE / CALLING SEQUENCE: / (AC MUST BE CLEAR, LINK UNIMPORTANT) / JMS I (SCAN) /CALL SCAN ROUTINE / TABLE /POINTER TO KEYWORD COMMAND TABLE / ALWAYS RETURNS HERE WITH RETURN CODE IN AC, LINK. / RETURN CODE BREAKDOWN: / LINK AC MEANING / 0 0000 NOTHING SCANNED; CODE (000) ENCOUNTERED. / 1 0000 NOTHING SCANNED; SPACE OR ENCOUNTERED. / 0 0001 PERFECT MATCH OCCURRED. / 1 0001 PERFECT MATCH WITH EMBELLISHMENT OCCURRED. / 0 2000 UNIQUE PARTIAL MATCH OCCURRED. / 1 2000 ANOMOLOUS PARTIAL MATCH OCCURRED. / 1 7777 SCANNED CHARACTERS DO NOT MATCH ANY TABLE ENTRY. / TABPTR WILL POINT TO THE SUB-OPTION LIST OF THE MATCHING TOKEN IF A UNIQUE / MATCH OCCURRED (WHETHER PERFECT, EMBELLISHED OR PARTIAL). / THE SCANNED CHARACTERS WILL ACCOUNT FOR THE DIFFERENCE BETWEEN BUFPTR (WHICH / POINTS TO THE FIRST CHARACTER SCANNED) AND WRKPTR WHICH POINTS TO THE FINAL / CHARACTER SCANNED (GENERALLY A DELIMITER). / TABLES MUST BE IN STANDARD COMMAND FORMAT. SCAN, .-. /KEYWORD SCAN ROUTINE TAD I SCAN /GET ARGUMENT POINTER DCA GETBASE /STASH THE TABLE POINTER NL7776/TAD (-SCANTYPE)/SET TEST VALUE CDF TBLFLD /GOTO TABLE FIELD TAD I GETBASE /COMPARE TO HEAD OF TABLE CDF PRGFLD /BACK TO OUR FIELD SZA /SKIP IF CORRECT HLT /ELSE BARF ISZ GETBASE /BUMP TO FIRST STRING DCA GETINDEX /CLEAR INPUT INDEX DCA PMCOUNT /CLEAR PARTIAL MATCH COUNT / SCAN THE BUFFER FOR A KEYWORD MATCH WITH THE LATEST TABLE ELEMENT. SCNLP1, NL7777 /INDICATE NO PARTIAL MATCH DCA GOTPARTIAL /HAS BEEN COUNTED FOR THIS TRIAL (IF ANY) TAD BUFPTR /GET CURRENT COMMAND BUFFER POINTER VALUE DCA WRKPTR /SETUP FOR SCANNING JMS GETCHAR /GET A COMMAND CHARACTER CLL /CLEAR LINK IN CASE WE LEAVE NOW SNA CLA /SKIP IF NOT JMP SCANEXT /RETURN IF NULL INPUT; L=0, AC=0000 SCNLP2, JMS CHKTERMINATOR /GET LATEST COMMAND CHARACTER AND TEST IF A TERMINATOR JMP MATEST /IT WAS A TERMINATOR; CHECK FURTHER CIA /IT WAS NOT A TERMINATOR; INVERT FOR TESTING LATER DCA TSTCHAR /STASH IT FOR NOW JMS I (GETC) /GET A TABLE STRING CHARACTER SNA /SKIP IF NOT AT END OF THE TEST STRING JMP TOOMUCH /COMMAND IS EMBELLISHED, SO THROW AWAY EXCESS THERE TAD TSTCHAR /COMPARE TABLE CHARACTER TO COMMAND CHARACTER SZA CLA /SKIP IF IT MATCHES JMP NXTSCAN /JUMP IF NOT ISZ GOTPARTIAL /SHOULD WE COUNT THIS STRING AS A PARTIAL MATCH? SKP /SKIP IF WE ALREADY DID ISZ PMCOUNT /COUNT THIS ONE AS (AT LEAST) A PARTIAL MATCH ISZ GETINDEX /BUMP INDEX INTO TABLE STRING ISZ WRKPTR /BUMP COMMAND BUFFER POINTER JMP SCNLP2 /KEEP GOING / COMES HERE IF COMMAND IS (APPARENTLY) EMBELLISHED. CHECK FOR ILLEGAL SINGLE / CHARACTER COMMAND WITH ATTEMPTED EMBELLISHMENT. TOOMUCH,NL7777 /SET -1 TAD GETINDEX /CHECK IF SHORT KEYWORD SZA CLA /SKIP IF ONE CHARACTER COMMAND JMP TOSSIT /GO THERE TO THROW AWAY VALID EMBELLISHMENT / ONE CHARACTER COMMANDS MUST NOT BE EMBELLISHED; WE HAVE ERRONEOUSLY COUNTED / THIS COMMAND AS A PARTIAL MATCH; UNDO THE DAMAGE. NL7777 /BACKUP TAD PMCOUNT /THE PARTIAL MATCH COUNT DCA PMCOUNT /STORE BACK / NOW FALL INTO THE NON-MATCH ROUTINE. / COMES HERE TO RESET TO BEGINNING OF NEXT COMMAND TABLE ENTRY. NXTSCAN,JMS I (GETC) /GET A TABLE CHARACTER SNA CLA /SKIP IF NOT AT END OF STRING JMP TABNEXT /JUMP IF AT END OF STRING ISZ GETINDEX /BUMP TO NEXT CHARACTER JMP NXTSCAN /KEEP TOSSING CHARACTERS / AT THIS POINT, ALL STRING CHARACTERS ARE TOSSED. TABNEXT,TAD GETADR /GET ADDRESS OF STRING DELIMITER TAD (3) /BUMP TO NEXT ENTRY DCA GETBASE /STASH THE POINTER DCA GETINDEX /CLEAR INPUT INDEX JMS I (GETC) /GET FIRST CHARACTER OF NEXT STRING SZA CLA /SKIP IF AT END OF SCAN TABLE JMP SCNLP1 /TRY TO MATCH NEXT STRING THERE / WE'RE AT THE END OF THE TABLE. WERE THERE ANY PARTIAL MATCHES? NL7777 /SET -1 TAD PMCOUNT /COMPARE TO PARTIAL MATCH COUNT SZA /SKIP IF EXACTLY ONE JMP MANYSCN /JUMP IF OTHERWISE TAD PMPOINTER /GET PARTIAL MATCH POINTER DCA TABPTR /POINT TO SUB-OPTION LIST NL2000 /SET GOOD PARTIAL MATCH RETURN VALUE SCANEXT,ISZ SCAN /BUMP PAST ARGUMENT JMP I SCAN /RETURN TO CALLER / COMES HERE TO CHECK FOR MULTIPLE (OR NO) PARTIAL MATCHES. MANYSCN,SMA /SKIP IF NO PARTIAL MATCHES NL2000 /SET MULTIPLE PARTIAL MATCH VALUE FNDTERM,STL /LINK IS SET FOR ALL THESE CASES JMP SCANEXT /EXIT THERE / COMES HERE IF MULTI-CHARACTER KEYWORD IS EMBELLISHED ACCEPTABLY. TOSSIT, ISZ WRKPTR /BUMP TO NEXT KEYWORD CHARACTER JMS CHKTERMINATOR /CHECK IF LATEST CHARACTER IS A DELIMITER SKP /SKIP IF A TERMINATOR JMP TOSSIT /ELSE KEEP GOING NL7777 /INDICATE EMBELLISHED KEYWORD FOR LATER / COMES HERE TO TEST IF PARTIAL OR COMPLETE MATCH. MATEST, DCA TSTCHAR /SAVE INDICATOR TAD GETINDEX /GET STRING INDEX SNA CLA /SKIP IF ANY CHARACTERS MATCH JMP FNDTERM /MUST HAVE FOUND ONLY A DELIMITER JMS I (GETC) /GET NEXT STRING CHARACTER SZA CLA /SKIP IF AT END OF TABLE STRING JMP PARMATCH /JUMP IF PARTIAL MATCH NL0001 /SET INCREMENT TAD GETADR /POINT TO SUB-OPTION LIST (FOLLOWED BY GUIDE-WORD) DCA TABPTR /STASH THE POINTER CLL /CLEAR LINK FOR EXIT ISZ TSTCHAR /EMBELLISHED KEYWORD? SKP /SKIP IF NOT STL /SET LINK FOR EMBELLISHED KEYWORD EXIT NL0001 /SET GOOD MATCH VALUE JMP SCANEXT /FINISH IT THERE / COMES HERE IF A PARTIAL MATCH. PARMATC,ISZ GETINDEX /BUMP STRING INDEX JMS I (GETC) /GET NEXT STRING CHARACTER SZA CLA /END OF STRING? JMP PARMATCH /NO, KEEP TOSSING NL0001 /SET INCREMENT TAD GETADR /POINT TO SUB-OPTION LIST (FOLLOWED BY GUIDE-WORD) DCA PMPOINTER /SAVE FOR LATER JMP TABNEXT /CONTINUE THERE CHKTERM,.-. /GET AND CHECK IF LATEST IS A TERMINATOR JMS GETCHAR /GET LATEST CHARACTER SZA /SKIP IF TAD [-CNTRLI] /ELSE COMPARE TO SZA /SKIP IF EITHER OR TAD [-" !200+CNTRLI]/ELSE COMPARE TO SNA /SKIP IF NEITHER JMP I CHKTERMINATOR /TAKE IMMEDIATE RETURN IF A TERMINATOR TAD [" &177] /RESTORE THE CHARACTER ISZ CHKTERMINATOR /BUMP RETURN ADDRESS JMP I CHKTERMINATOR /TAKE SKIP RETURN GETCHAR,.-. /GET A BUFFER CHARACTER ROUTINE CLA /JUST IN CASE CDF CBFFLD /GOTO BUFFER FIELD TAD I WRKPTR /GET A CHARACTER CDF PRGFLD /BACK TO OUR FIELD AND [177] /REMOVE PARITY BIT TAD [-140] /CHECK IF LOWER-CASE CHARACTER SMA /SKIP IF BELOW LIMIT TAD [-40] /ELSE MAKE IT UPPER-CASE TAD [140] /RESTORE THE CHARACTER JMP I GETCHAR /RETURN GOTPART,.-. /PARTIAL MATCH COUNT FLAG TSTCHAR,.-. /LATEST TEST CHARACTER PAGE GETBUFF,.-. /GET A BUFFER ROUTINE GRESTAR,JMS I [PPRINT] /PRINT PROMPTING MESSAGE TAD COLUMN /GET CURRENT COLUMN DCA PCOUNT /SAVE IT FOR OTHERS GETINPU,JMS I [INPUT] /GET A CHARACTER GOTINPU,JMS I [CMDSUB] /TRY TO FIND CHTBL-1 /SPECIAL CHARACTERS TAD [-40] /COMPARE LATEST TO CONTROL CHARACTER SPA CLA /SKIP IF GREATER JMP GCMBEEP /IGNORE BAD CONTROL CHARACTERS QUENTRY,TAD INCHAR /GET THE CHARACTER TAD [-140] /COMPARE TO LOWER-CASE LIMIT SMA /SKIP IF BELOW LIMIT TAD UPONLY /ELSE REMOVE CASE TAD [140] /RESTORE THE CHARACTER EITHER WAY SKP /DON'T DO STUFF! GOTHT, TAD [CNTRLI] /INSERT DCA GBTEMP /SAVE IT TAD BUFPTR /GET OUTPUT POINTER TAD (-COMBEND) /COMPARE TO BUFFER LIMIT SMA CLA /SKIP IF NOT AT END YET JMP GCMBEEP /JUMP IF IT IS TAD GBTEMP /GET THE CHARACTER CDF CBFFLD /GOTO BUFFER FIELD DCA I BUFPTR /STORE IN THE BUFFER CDF PRGFLD /BACK TO OUR FIELD ISZ BUFPTR /BUMP THE POINTER TAD GBTEMP /GET THE CHARACTER SKP /PRINT IT, DON'T BEEP / COMES HERE ON BAD INPUT OR FULL BUFFER. GCMBEEP,TAD [CNTRLG] /GET A JMS I [P7ECHO] /RING OR PRINT LATEST CHARACTER JMP GETINPUT /KEEP GOING / COMES HERE ON <^W>. GOTUW, TAD BUFPTR /GET CURRENT POINTER DCA I (UWTEM1) /SAVE IT FOR LATER JMS I [RUBCHK] /CHECK IF AT LEAST ONE CHARACTER CAN BE DELETED JMP GCMBEEP /COMPLAIN IF TOO FAR BACK DCA INCHAR /INDICATE NO NON-DELIMITERS FOUND YET UWLOOP, JMS I (RUBCHK) /ATTEMPT TO DELETE ANOTHER CHARACTER JMP UWZAP /NO MORE TO DELETE JMS I (GET1) /GET NEW PREVIOUS CHARACTER TAD [-CNTRLI] /COMPARE TO SZA /SKIP IF IT MATCHES TAD [-" !200+CNTRLI]/ELSE COMPARE TO SZA /SKIP IF EITHER DELIMITER ISZ INCHAR /COUNT THIS NON-DELIMITER SNA CLA /SKIP IF NON-DELIMITER TAD INCHAR /LOOK AT NON-DELIMITER COUNT IF DELIMITER SNA CLA /SKIP IF DELIMITER AFTER PREVIOUS NON-DELIMITER JMP UWLOOP /KEEP GOING / COMES HERE WHEN A DELIMITER IS FOUND. UWEND, ISZ BUFPTR /ADJUST POINTER UWZAP, JMP I (BKSPLP) /**** /B **** 0000 JMS I (PBKSLSH) /PRINT "\" TAD BUFPTR /GET CURRENT (BACKED-UP) POINTER DCA I (UWTEM2) /SAVE IT FOR LATER TAD I (UWTEM1) /GET ORIGINAL POINTER VALUE DCA BUFPTR /RESTORE IT UWDLUP, JMS I (RUBCHK) /BACKUP POINTER JMP UWFINISH /TOO FAR, WE'RE DONE JMS I (GET1) /GET THE LATEST CHARACTER JMS I [P7ECHO] /PRINT IT TAD GBTEMP /GET CURRENT POINTER CIA /INVERT FOR COMPARISON TAD I (UWTEM2) /COMPARE TO LIMIT SZA CLA /SKIP IF NO MORE TO DELETE JMP UWDLUP /KEEP GOING UWFINIS,JMS I (PBKSLSH) /PRINT "\" JMP GETINPUT /KEEP GOING / COMES HERE ON <^R>. GOTUR, TAD [ALTBUFFER] /SETUP THE DCA GBTEMP /ALTERNATE POINTER URLOOK, CDF CBFFLD /GOTO BUFFER FIELD TAD I GBTEMP /GET A CHARACTER FROM ALTERNATE BUFFER CDF PRGFLD /BACK TO OUR FIELD SNA CLA /SKIP IF NOT END OF BUFFER JMP GCMBEEP /FORGET IT, PREVIOUS COMMAND TOO SHORT TAD GBTEMP /GET THE POINTER TAD [COMBUFF-ALTBUF]/ADJUST RELATIVE TO MAIN BUFFER CIA /INVERT FOR TEST TAD BUFPTR /COMPARE TO MAIN POINTER SNA CLA /SKIP IF NOT THERE YET JMP FILLIT /JUMP IF AT SAME BUFFER POSITION ISZ GBTEMP /BUMP TO NEXT JMP URLOOK /KEEP GOING FILLIT, CDF CBFFLD /GOTO BUFFER FIELD TAD I GBTEMP /GET AN ALTERNATE CHARACTER DCA I BUFPTR /FILL MAIN BUFFER TAD I BUFPTR /GET IT BACK CDF PRGFLD /BACK TO OUR FIELD SNA /SKIP IF NOT END OF BUFFER JMP GETINPUT /WE'RE DONE ON END OF BUFFER JMS I [P7ECHO] /ECHO THE CHARACTER ISZ GBTEMP /BUMP TO NEXT ISZ BUFPTR /BUMP TO NEXT JMP FILLIT /KEEP GOING / COMES HERE ON "?". GOTQUES,TAD QSWITCH /GET HELP MODE SWITCH SZA CLA /SKIP IF HELP IS ENABLED JMP QUENTRY /JUMP IF NOT NL0001 /SET -1 (EVENTUALLY) VALUE / COMES HERE ON . GOTCR, CMA /SET 0 (EVENTUALLY) VALUE / COMES HERE ON . GOTESC, DCA TERMSW /SAVE TERMINATOR TYPE FOR NOW CDF CBFFLD /GOTO BUFFER FIELD DCA I BUFPTR /DELIMIT THE END OF THE BUFFER CDF PRGFLD /BACK TO OUR FIELD ISZ TERMSW /WAS TERMINATOR ? JMP I GETBUFFER /NO, RETURN ON ? OR TERMINATOR TAD [COMBUFFER] /POINT TO DCA BCOUNT /COMMAND BUFFER TAD [ALTBUFFER] /POINT TO DCA PCOUNT /ALTERNATE BUFFER CDF CBFFLD /GOTO BUFFER FIELD TAD I BCOUNT /GET FIRST BUFFER CHARACTER SNA CLA /SKIP IF BUFFER ISN'T EMPTY JMP DNTSAVE /JUMP IF BUFFER IS EMPTY CMVLUP, CDF CBFFLD /GOTO BUFFER FIELD TAD I BCOUNT /GET A CHARACTER DCA I PCOUNT /PUT A CHARACTER TAD I PCOUNT /GET IT BACK DNTSAVE,CDF PRGFLD /BACK TO OUR FIELD SNA CLA /IS IT THE DELIMITER? JMP I GETBUFFER /YES, RETURN ISZ BCOUNT /BUMP TO NEXT ISZ PCOUNT /BUMP TO NEXT JMP CMVLUP /KEEP GOING PAGE / COMES HERE ON ANY BACKSPACING CHARACTER. BACKSP, JMS I (RUBCHK) /CHECK WHERE WE ARE IN BUFFER JMP I (GCMBEEP) /COMPLAIN IF TOO FAR BACK BZAP, JMP HARDRUBOUT /**** NOT /B **** 0000 BKSPLP, TAD [CNTRLH] /GET JMS I [P7ECHO] /PRINT IT TAD [" &177] /GET A JMS I [P7ECHO] /PRINT IT TAD [CNTRLH] /GET JMS I [P7ECHO] /PRINT IT TAD [COMBUFFER] /SETUP THE DCA GBTEMP /REVIEWING POINTER TAD PCOUNT /GET PROMPT COLUMN COUNT DCA BCOUNT /INITIALIZE BACKSPACE COLUMN COUNT BKLOOP, JMS I [VIEWNXT] /GET A BUFFER CHARACTER JMP BKPEND /WE'RE AT THE END OF THE BUFFER TAD [-CNTRLI] /COMPARE LATEST TO SNA CLA /SKIP IF OTHER JMP CNTTAB /JUMP IF IT MATCHES ISZ BCOUNT /COUNT THIS CHARACTER JMP BKLOOP /KEEP GOING CNTTAB, TAD BCOUNT /GET CURRENT COUNT AND [7770] /JUST TAB BITS TAD [10] /BUMP TO NEXT TAB STOP DCA BCOUNT /STORE BACK JMP BKLOOP /KEEP GOING BKPEND, TAD COLUMN /GET LATEST COLUMN CIA /INVERT FOR TESTING TAD BCOUNT /COMPARE TO CALCULATED POSITION SPA CLA /SKIP IF BACKSPACED ENOUGH JMP BKSPLP /ELSE DO IT AGAIN JMP I (GETINPUT) /KEEP GOING / COMES HERE IF BACKSPACING ON HARD-COPY TERMINAL. HARDRUB,JMS PBKSLSH /PRINT "\" ISZ BUFPTR /COMPENSATE FOR REDUNDANT CHECK RUBAGN, JMS RUBCHK /CHECK WHERE WE ARE IN BUFFER JMP RUBDONE /JUMP IF TOO FAR JMS GET1 /GET THE OLD CHARACTER JMS I [P7ECHO] /PRINT IT JMS I [INPUT] /GET FURTHER INPUT HERE JMS I [CMDSUB] /CHECK IF A RUBTBL-1 /BACKSPACING CHARACTER RUBDONE,DCA GBTEMP /STORE LATEST OR JMS PBKSLSH /PRINT "\" TAD GBTEMP /GET THE LATEST (OR ) DCA INCHAR /APPEAR TO HAVE INPUT JMP I (GOTINPUT) /GO USE IT THERE / COMES HERE ON <^U>. DELETL, DCA ECHOSW /ENSURE ECHO IS ON TAD [COMBUFFER] /RESET THE DCA BUFPTR /BUFFER POINTER TAD ["^&177] /GET AN "^" JMS I [P7ECHO] /PRINT IT TAD ("U&177) /GET A "U" JMS I [P7ECHO] /PRINT IT JMP I (GRESTART) /RESTART / COMES HERE ON . LFVIEW, JMS I [PPRINT] /PRINT OUT PROMPTING MESSAGE AGAIN TAD [COMBUFFER] /SETUP THE DCA GBTEMP /REVIEWING POINTER PRBLUP, JMS I [VIEWNXT] /GET NEXT CHARACTER IN BUFFER JMP I (GETINPUT) /WE'RE AT THE END OF THE BUFFER JMS I [P7ECHO] /PRINT LATEST CHARACTER JMP PRBLUP /KEEP GOING / COMES HERE ON . GOTUS, NL4000 /SET INVERSION BIT TAD QSWITCH /INVERT VALUE DCA QSWITCH /STORE BACK JMP I (GETINPUT) /KEEP GOING RUBCHK, .-. /RUBOUT CHECK ROUTINE NL7777 /-1 TAD BUFPTR /BACKUP THE POINTER DCA GBTEMP /SAVE FOR NOW TAD GBTEMP /GET IT BACK TAD [-COMBUFFER] /COMPARE TO LOWER LIMIT SPA CLA /SKIP IF OK JMP I RUBCHK /RETURN IMMEDIATE IF NOT TAD GBTEMP /GET UPDATED VALUE DCA BUFPTR /USE IT IN POINTER ISZ RUBCHK /BUMP RETURN ADDRESS JMP I RUBCHK /TAKE SKIP RETURN UWTEM1, /<^W> TEMPORARY VIEWNXT,.-. /GET NEXT CHARACTER FOR VIEWING, ETC. ROUTINE TAD GBTEMP /GET OUR POINTER CIA /INVERT FOR TESTING TAD BUFPTR /COMPARE TO BUFFER POINTER SNA CLA /SKIP IF NOT AT END OF BUFFER JMP I VIEWNXT /TAKE IMMEDIATE RETURN JMS GET1 /GET LATEST CHARACTER ISZ GBTEMP /BUMP TO NEXT ISZ VIEWNXT /BUMP RETURN ADDRESS JMP I VIEWNXT /TAKE SKIP RETURN UWTEM2, /<^W> TEMPORARY PBKSLSH,.-. /PRINT "\" ROUTINE TAD ("\&177) /GET "\" JMS I [P7ECHO] /PRINT IT JMP I PBKSLSH /RETURN GET1, .-. /GET LATEST BUFFER CHARACTER ROUTINE CDF CBFFLD /GOTO BUFFER FIELD TAD I GBTEMP /GET THE CHARACTER CDF PRGFLD /BACK TO OUR FIELD JMP I GET1 /RETURN GETC, .-. /GET A TABLE (SIX-BIT) CHARACTER ROUTINE TAD GETINDEX /GET INDEX CLL RAR /%2 TAD GETBASE /ADD ON BASE DCA GETADR /FORM CHARACTER ADDRESS CDF TBLFLD /GOTO TABLE FIELD TAD I GETADR /GET THE WORD CDF PRGFLD /BACK TO OUR FIELD SZL /SKIP IF HIGH-ORDER HALF WANTED JMP GETCLOWER /JUMP IF LOW-ORDER HALF WANTED RTR;RTR;RTR /MOVE DOWN HIGH-ORDER HALF GETCLOW,AND [77] /JUST SIX-BIT SNA /END OF STRING? JMP I GETC /YES, RETURN WITH CLEAR AC TAD [40] /NO, INVERT IT AND [77] /REMOVE CARRY TAD [40] /INVERT AGAIN TO SEVEN-BIT JMP I GETC /RETURN PAGE / SUPPORT ROUTINES. INPUT, .-. /INPUT ROUTINE JMS CHKUP /TRY TO GET A CHARACTER TAD INCHAR /GET THE CHARACTER SNA /SKIP IF ANYTHING CAME IN JMP .-3 /WAIT FOR SOMETHING JMP I INPUT /RETURN WITH IT CHKUP, .-. /CHECK FOR <^C>, ETC. ROUTINE JMS CTLCTST /CALL LOW-LEVEL INPUT CHECK ROUTINE SNA /SKIP IF ANYTHING CAME BACK JMP CHKCLR /ELSE FORGET IT TAD (-CNTRLP) /COMPARE TO <^P> SNA /SKIP IF OTHER JMP DOUP /GO HANDLE <^P> THERE IAC /TAD (-CNTRLO+CNTRLP)/COMPARE TO <^O> SNA /SKIP IF OTHER JMP DOUO /GO HANDLER <^O> THERE TAD (-CNTRLS+CNTRLO) /COMPARE TO <^S> SZA CLA /SKIP IF IT MATCHES JMP I CHKUP /RETURN ON UNIMPORTANT CHARACTERS UQWAIT, JMS CTLCTST /CALL LOW-LEVEL INPUT CHECK ROUTINE TAD (-CNTRLQ) /COMPARE TO <^Q> SZA CLA /SKIP IF IT MATCHES JMP UQWAIT /ELSE WAIT FOR <^Q> FOREVER CHKCLR, DCA INCHAR /OBLITERATE INPUT CHARACTER JMP I CHKUP /RETURN / COMES HERE TO HANDLE <^P>. DOUP, TAD ("P&177) /GET A "P" JMS UPRINT /PRINT "^P" JMP I UPADDRESS /GO WHERE YOU SHOULD / COMES HERE TO HANDLE <^O>. DOUO, TAD ("O&177) /GET AN "O" JMS UPRINT /PRINT "^O" NL4000 /SET REVERSING BIT TAD ECHOSW /REVERSE THE ECHO STATE DCA ECHOSW /STORE BACK JMP CHKCLR /OBLITERATE <^O> AND RETURN / COMES HERE TO HANDLE <^C> IF SO ENABLED. UPCPRT, TAD ("C&177) /GET A "C" JMS UPRINT /PRINT "^C" KCCZP2, KCCIOT /**** 6120 **** 0000 JMP I [SBOOT] /GOODBYE! / JMP I [CLOOP] /RESTART UPRINT, .-. /"^" PRINTING ROUTINE DCA UPRTEMP /SAVE PASSED VALUE TAD ("^&177) /GET AN "^" JMS P7OUT /OUTPUT IT JMP .-1 /WAIT FOR IT TAD UPRTEMP /GET PASSED VALUE JMS P7OUT /OUTPUT IT JMP .-1 /WAIT FOR IT JMP I UPRINT /RETURN P7CHAR, .-. /CONSOLE OUTPUT ROUTINE DCA P7TEMP /SAVE PASSED VALUE P7AGN, JMS CHKUP /CHECK FOR <^C>, ETC. TAD ECHOSW /GET CURRENT ECHO STATUS SPA CLA /SKIP IF ECHO ON JMP P7OFF /JUMP IF ECHO OFF TAD P7TEMP /GET THE PASSED VALUE JMS P7OUT /TRY TO OUTPUT IT JMP P7AGN /DIDN'T OUTPUT P7OFF, JMS CHKUP /CHECK FOR <^C>, ETC. TAD P7TEMP /GET THE CHARACTER BACK AND [140] /JUST QUADRANT BITS SZA CLA /SKIP IF CONTROL CHARACTER ISZ COLUMN /BUMP COLUMN FOR PRINTING CHARACTER NOP /JUST IN CASE TAD P7TEMP /GET THE CHARACTER AGAIN TAD (-CNTRLM) /COMPARE TO SNA CLA /SKIP IF NOT DCA COLUMN /CLEAR COLUMN COUNT ON TAD P7TEMP /GET THE CHARACTER AGAIN TAD (-CNTRLH) /COMPARE TO SNA CLA /SKIP IF OTHER NL7777 /SET BACKUP VALUE TAD COLUMN /UPDATE COLUMN COUNT DCA COLUMN /STORE BACK JMP I P7CHAR /RETURN P7OUT, .-. /LOW-LEVEL CONSOLE OUTPUT ROUTINE TSFIOT /FLAG UP? JMP I P7OUT /NO, TAKE IMMEDIATE RETURN WITH AC INTACT TLSIOT /YES, OUTPUT IT CLA /CLEAN UP ISZ P7OUT /BUMP RETURN ADDRESS JMP I P7OUT /TAKE SKIP RETURN TO CALLER P7CH, .-. /OUTPUT (WITH SPECIAL ) ROUTINE TAD [-CNTRLI] /COMPARE TO SNA /SKIP IF OTHER JMP DOTAB /JUMP IF TAD [CNTRLI] /RESTORE THE CHARACTER JMS P7CHAR /PRINT IT (UPDATING COLUMN COUNT) JMP I P7CH /RETURN DOTAB, TAD [" &177] /GET A JMS P7CHAR /PRINT IT TAD COLUMN /GET LATEST COLUMN AND [7] /JUST TAB BITS SZA CLA /SKIP IF AT NEW TAB POSITION JMP DOTAB /ELSE KEEP GOING JMP I P7CH /RETURN P7ECHO, .-. /PRINT (WITH ECHO FORCED ON) ROUTINE DCA P7TEMP /SAVE PASSED VALUE DCA ECHOSW /FORCE ECHO ON TAD P7TEMP /GET THE VALUE BACK JMS I [P7CH] /PRINT IT JMP I P7ECHO /RETURN CTLCTST,.-. /LOW-LEVEL <^C> TEST ROUTINE CLA /CLEAN UP KSFIOT /FLAG UP? JMP I CTLCTST /NO, JUST RETURN KRSZAP, KRSIOT /**** 6120 **** KRBIOT AND [177] /JUST SEVEN-BIT DCA INCHAR /SAVE THE CHARACTER NL7775 /SET -<^C> VALUE TAD INCHAR /COMPARE TO CHARACTER SNA CLA /SKIP IF OTHER THAN <^C> JMP I UCADDRESS /JUMP IF <^C> KCCZAP, KCCIOT /**** 6120 **** 0000 TAD INCHAR /GET THE CHARACTER JMP I CTLCTST /RETURN UPRTEMP,.-. /UPRINT ROUTINE TEMPORARY UCADDRE,SBOOT /<^C> ADDRESS SHOULD BE SET AS NECESSARY UPADDRE,CHKCLR /<^P> ADDRESS SHOULD BE SET AS NECESSARY PAGE SCRIBE, .-. /CONSOLE MESSAGE PRINT ROUTINE CLA /CLEAN UP TAD [P7CH] /POINT TO SCRBENT,DCA MSGOUT /CONSOLE PRINT ROUTINE TAD I SCRIBE /GET IN-LINE POINTER ARGUMENT DCA SCRPTR /STASH THE POINTER ISZ SCRIBE /BUMP PAST ARGUMENT TAD UPONLY /GET UPPER-ONLY VALUE TAD [LC] /ADD ON LOWER-CASE VALUE DCA SCRCASE /STORE INITIAL CASE VALUE SCRLUP, CDF MSGFLD /GOTO MESSAGE FIELD TAD I SCRPTR /GET LEFT HALF-WORD RTR;RTR;RTR /MOVE OVER JMS SCRPRNT /PRINT IT CDF MSGFLD /GOTO MESSAGE FIELD TAD I SCRPTR /GET RIGHT HALF-WORD JMS SCRPRNT /PRINT IT ISZ SCRPTR /BUMP TO NEXT PAIR JMP SCRLUP /KEEP GOING SCRPRNT,.-. /CHARACTER PRINT ROUTINE CDF PRGFLD /BACK TO OUR FIELD AND [77] /JUST SIX BITS SNA /END OF MESSAGE? JMP I SCRIBE /YES, RETURN TO ORIGINAL CALLER DCA SCRCHAR /NO, SAVE FOR NOW TAD SCRCHAR /GET IT BACK TAD (-"%!200) /IS IT "%"? SNA /SKIP IF NOT JMP SCRCRLF /JUMP IF IT MATCHES TAD [-"^+100+"%] /IS IT "^" SNA CLA /SKIP IF NOT JMP SCRFLIP /JUMP IF IT MATCHES TAD SCRCHAR /GET THE CHARACTER AND [40] /DOES CASE MATTER? SNA CLA /SKIP IF NOT TAD SCRCASE /ELSE GET PREVAILING CASE TAD SCRCHAR /GET THE CHARACTER SCRPRLF,JMS I MSGOUT /PRINT THE CHARACTER JMP I SCRPRNT /RETURN SCRCRLF,TAD [CNTRLM] /GET A JMS I MSGOUT /PRINT IT TAD [CNTRLJ] /GET A JMP SCRPRLF /CONTINUE THERE SCRFLIP,TAD UPONLY /GET UPPER-ONLY FLAG SZA CLA /SKIP IF OFF JMP I SCRPRNT /RETURN IF ON TAD SCRCASE /GET CURRENT CASE CIA /INVERT IT TAD (LC+UC) /ADD SUM OF POSSIBLE VALUES DCA SCRCASE /STORE NEW INVERTED CASE JMP I SCRPRNT /RETURN PPRINT, .-. /PROMPT PRINT ROUTINE DCA ECHOSW /ENSURE ECHO IS ON JMS I [SCRIBE] /GIVE THEM CRLF /A , JMS I [SCRIBE] /GIVE THEM THE PRMTMSG /CURRENT PROMPT STRING JMP I PPRINT /RETURN CMDSUB, .-. /COMMAND TABLE SEARCH ROUTINE CLA /CLEAN UP TAD I CMDSUB /GET THE INLINE POINTER DCA GBTEMP /STASH IT ISZ CMDSUB /BUMP PAST POINTER CDF CBFFLD /GOTO BUFFER FIELD GCMLUP, ISZ GBTEMP /BUMP TO NEXT TAD I GBTEMP /GET AN ENTRY ISZ GBTEMP /BUMP TO NEXT SNA /END OF TABLE? JMP GCMEND /YES, FORGET IT TAD INCHAR /COMPARE TO LATEST SZA CLA /SKIP IF IT MATCHES JMP GCMLUP /JUMP IF NOT TAD I GBTEMP /GET THE ADDRESS DCA GBTEMP /STASH IT CDF PRGFLD /BACK TO OUR FIELD JMP I GBTEMP /GO THERE GCMEND, CDF PRGFLD /BACK TO OUR FIELD TAD INCHAR /GET THE CHARACTER BACK JMP I CMDSUB /RETURN PAGE FIELD PRGFLD%10 /DUMP THE LITERALS NOW FIELD CBFFLD%10 /COMMAND BUFFER FIELD *COMBADR /COMMAND BUFFER IS HERE COMBUFF,ZBLOCK 77 /COMMAND BUFFER COMBEND,ZBLOCK 1 /DEFINITE END OF COMMAND BUFFER ALTBUFF,ZBLOCK 100 /ALTERNATE COMMAND BUFFER / SPECIAL CHARACTER TABLE. CHTBL, -RUBOUT; BACKSP / ESC176^I-I-ALT2;GOTESC /176 ESC176^I-I-ALT1;GOTESC /175 / -137; BACKSP /UNDERSCORE -"?!200; GOTQUEST/? -QFLIP; GOTUS / ESC033^I-I-ESC; GOTESC / -CNTRLW; GOTUW /<^W> -CNTRLU; DELETL /<^U> -CNTRLR; GOTUR /<^R> -CNTRLM; GOTCR / -CNTRLJ; LFVIEW / -CNTRLI; GOTHT / -CNTRLH; BACKSP / 0 /THIS ENDS THE LIST / SPECIAL RUBOUT CHARACTER TABLE. RUBTBL, -RUBOUT; RUBAGN / / -137; RUBAGN /UNDERSCORE -CNTRLH; RUBAGN / 0 /THIS ENDS THE LIST HERE= . /WHERE WE ARE FIELD MSGFLD%10 /MESSAGE FIELD *HERE /RESET ORIGIN CRLF, TEXT "%" /, MESSAGE PRMTMSG,TEXT "^K^ERMIT-^" /STATIC PORTION OF PROMPT MESSAGE PROMID, ZBLOCK 23 /MODIFIED PORTION OF PROMPT MESSAGE HERE= . /WHERE WE ARE *PROMID /FOR NOW TEXT "8/E>^" /MAKE IT WORK! FIELD TBLFLD%10 /COMMAND TABLE FIELD *HERE /RESET ORIGIN / TABLE TYPES. SCANTYP=2 /KEYWORD TABLE TO BE SCANNED FOR A STRING MATCH / KEYWORD TABLE FORMAT: /TABLE, SCANTYPE /FIRST WORD IS TABLE TYPE / "STRING";SUBLIST;GUIDEPOINTER /THREE ITEMS PER ENTRY / ... /REPEAT AS NECESSARY / 0 /END OF TABLE / EACH ENTRY CONSISTS OF THE KEYWORD STRING WITH A ZERO HALF-WORD DELIMITER / (EVEN COUNT STRINGS HAVE A WHOLE-WORD ZERO DELIMITER) FOLLOWED BY THE POINTER / TO THE NEXT (SUB-OPTION) TABLE FOLLOWED BY A POINTER TO THE GUIDE-WORD TEXT / (ZERO IF NONE). COMTABL,SCANTYPE /TABLE TYPE TEXT "RECEIVE";RECTABLE;INTOGUIDE /TABLE ENTRY 0 /THIS ENDS THE TABLE INTOGUI,TEXT " (INTO FILE) " / RECEIVE COMMAND TABLE. RECTABL,SBOOT /FOR NOW $ /THAT'S ALL FOLK!