.TITLE TER -- SET TERMINALS .IDENT /V0101A/ ; ; THIS PROGRAM SETS THE TERMINAL CHARACTERISTICS ON AN IAS OR ; RSX11D SYSTEM, USING THE 'SET CHARACTERISTICS' FUNCTION OF THE ; TERMINAL HANDLER. ; ; ; COPYRIGHT (C) 1976 ; DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS ; ; 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 DEC. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ; SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; ; ; AUTHOR : JOHN HARPER ; DATE : 4-JUN-76 ; ; EDIT AUTHOR DATE REASON ; ---- ------ ---- ------ ; 001 JOHN HARPER 19-AUG-76 FIX BUG IN ERROR REPORTING ; 002 JOHN HARPER 20-AUG-76 ADD /COMPATIBLE OPTION ; 003 JOHN HARPER 06-AUG-76 ADD USER CHARACTERISTICS ; AND TERMINAL TYPES ; 004 JOHN HARPER 20-JAN-77 ADD 'FULL DUPLEX' ; 005 JOHN HARPER 03-MAY-77 PICK UP UIC FROM TASK HEADER ; CHANGE /TERMINAL TO /NAME ; ALLOW /DEFAULT ON ITS OWN ; 006 JOHN HARPER 25-FEB-78 ADD /BINARY ; 007 F. BORGER 12-MAR-79 ADD L180,V100,L120,SORO & BEEH .SBTTL DESCRIPTION ;+ ; THIS PROGRAM IS AN MCR TASK WHICH WILL TRANSLATE A REQUEST TO CHANGE ; THE CHARACTERISTICS OF A TERMINAL INTO THE QIO REQUIRED BY THE ; TERMINAL HANDLER, AND CHANGE THE CHARACTERISTICS ACCORDINGLY. ; ; THE FORMAT OF A COMMAND IS: ; ; TER [TERMINAL LIST][OPTIONS] ; ; THE TERMINAL LIST MAY BE OMITTED, IN WHICH CASE THE USER'S CURRENT ; TERMINAL IS SET, OR IT MAY BE A LIST OF TERMINALS OF THE FORM: ; TT1:TT2:TT3: (THE FINAL COLON IS OPTIONAL). THE LATTER FORM IS ; ONLY ALLOWED FOR A USER RUNNING UNDER [1,1]. ; ; THE OPTIONS MAY BE DIVIDED INTO TWO CLASSES - SETTING INDIVIDUAL ; CHARACTERISTICS, AND SETTING THE TERMINAL TYPE. FOR THE FORMER, ; THE OPTIONS AVILABLE ARE DESCRIBED BELOW: ; ; THERE ARE TWO TYPES OF OPTION, THOSE WHICH REPRESENT A BINARY ; CHARACTERISTIC (E.G. 'SCOPE'), WHICH HAVE NO ASSOCIATED VALUE ; AND MAY BE PRECEDED BY 'NO' TO NEGATE THEM, AND THOSE WHICH HAVE A ; VALUE, WHICH MAY BE A KEYWORD OR A NUMBER, E.G. 'FILL'. ; KEYWORDS WHICH ARE A CONCATENATION OF MORE THAN ONE ENGLISH ; WORD MAY BE ABBREVIATED BY THEIR INITIAL LETTERS, E.G. 'LOWERCASEINPUT' ; AS 'LCI'. ALL KEYWORDS MAY BE ABBREVIATED BY THE MINIMUM ; NUMBER OF LETTERS NEEDED FOR UNIQUNESS. IN THE SUMMARY BELOW ; ACCEPTABLE ABBREVIATIONS ARE ENCLOSED IN SQUARE BRACKETS. THESE ; TOO MAY BE ABBREVIATED TO THE MINIMUM REQUIRED FOR UNIQUENESS. ; ; THE NON-VALUED OPTIONS AVAILABLE ARE: ; ; /TWOSTOPBITS TERMINAL REQUIRES TWO STOP BITS - NORMALLY ; [TSB] REQUIRED FOR MECHANICAL PRINTERS, E.G. ASR33 ; /SCOPE TERMINAL IS A SCOPE (VDU) AND REQUIRES ; RUBOUT TO BE ECHOED SO AS TO PHYSICALLY ; ERASE THE RUBBED OUT CHARACTERS FROM THE SCREEN. ; /BINARY TERMINAL IS TO BE USED EXCLUSIVELY FOR ; READ-PASS-ALL - DO NOT RECOGNIZE 'INTERRUPT' ; CHARACTERS ; /VERTICALFILL TERMINAL REQUIRES VT05-TYPE VERTICAL FILL ; [VFILL] ; /NEWLINE TERMINAL SENDS 'NEWLINE' WHEN 'THE BIG KEY ON ; THE RIGHT' IS PRESSED, RATHER THAN 'CARRIAGE RETURN'. ; /SIMULATEFORMFEED THE CHARACTERS FORMFEED AND VERTICAL-TAB ARE ; [SFF] TO BE SIMULATED IN SOFTWARE TO START A ; NEW PAGE AND SKIP TO THE NEXT SIX-LINE BOUNDARY ; RESPECTIVELY. ; /HARDWAREFORMFEED THE CHARACTERS FORMFEED AND VERTICAL-TAB ARE ; [HFF] RECOGNISED BY THE TERMINAL, AND NO SOFTWARE ; SIMULATION NEEDS TO BE PERFORMED. ; /LVF LA36 VERTICAL FILL IS REQUIRED FOR FORMFEED ; AND VERTICAL-TAB (I.E. 66 NULLS) ; /HARDWARETAB THE TERMINAL RECOGNIZES THE CHARACTER ; [HTAB] HORIZONTAL-TAB ; [TAB] ; /NONSTANDARDTAB WHEN THE TAB CHARACTER IS SENT TO THE ; [NSTAB] TERMINAL IT DOES NOT SPACE TO THE ; NEXT EIGHT-CHARACTER BOUNDARY. ; /BACKSPACE TERMINAL RESPONDS TO THE BACKSPACE CHARACTER. ; /CARRIAGERETURN IF A LINE IS TOO LONG TO FIT ON THE WIDTH OF THE SCREEN ; [CR] OF THE PAPER IT SHOULD BE SPLIT ACROSS MORE THAN ; ONE LINE ; /LOWERCASEKEYBOARD LOWER CASE CHARACTERS ARE TO BE ACCEPTED ; [LCKEYBOARD] FROM THE KEYBOARD AND NOT AUTOMATICALLY TRANSLATED ; INTO UPPER CASE (THIS ONLY AFFECTS THE READ-PASS-ALL ; AND READ-NO-CASE-CONVERSION REQUESTS - TO FORCE ; LOWER CASE INPUT TO MOST PROGRAMS THE ; /LOWERCASEINPUT OPTION MUST BE USED) ; /LOWERCASEINPUT LOWER CASE CHARACTERS ARE TO BE PASSED ; [LCINPUT] TO A PROGRAM DOING INPUT EVEN IF IT ASKS FOR CASE ; CONVERSION TO BE PERFORMED (REQUIRED, FOR EXAMPLE, ; IF USING EDI). ; /LOWERCASEOUTPUT THE TERMINAL CAN PRINT LOWERCASE CHARACTERS. ; /LOWERCASEPRINTER ; [LCOUTPUT] ; [LCPRINTER] ; /CONTROLCFLUSH FLUSH TYPE-AHEAD WHEN CONTROL-C IS TYPED ; [CCF] ; /ESCAPESEQUENCE THE TERMINAL REQUIRES ESCAPE SEQUENCE RECOGNITION ; /LOCALCOPY THE TERMINAL ECHOES ALL CHARACTERS AS THEY ARE ; TYPED, SO THE HANDLER SHOULD NOT NORMALLY ECHO ; /ALTMODE TERMINAL REQUIRES ALTERNATIVE ALTMODE RECOGNITION ; /TAPE TERMINAL HAS LOW SPEED PAPER TAPE READER ; AND INTERPRETS ^R AND ^T DIFFERENTLY ; /HOLD TERMINAL IS A SCOPE AND SHOULD OPERATE IN ; HOLD SCREEN MODE ; /BLOCKMODE TERMINAL IS A VT61 AND IS TO BE USED IN BLOCK MODE ; /FORMSMODE TERMINAL IS A VT61 AND IS TO BE USED IN FORMS MODE ; /KEYBOARD TERMINAL IS CAPABLE OF INPUT ; /PRINTER TERMINAL IS CAPABLE OF OUTPUT ; /MESSAGES MESSAGES FROM OTHER TERMINALS ALLOWED ; /COMPATIBLE RSX11M COMPATIBLE ESCAPE SEQUENCE HANDLING ;++002 ; /UC0 - /UC9 USER CHARACTERISTICS 0 - 9, PROVIDED ;++003 ; FOR USER EXTENSIONS TO HANDLER ;++003 ; /FULLDUPLEX FULL DUPLEX OPERATION, I.E. WRITE AND READ ; ARE INDEPENDENT ; ; NOTE THAT ANY OF THE ABOVE CAN BE NEGATED BY A 'NO' PREFIX, WHETHER ; OR NOT THE INITIAL-LETTER ABBREVIATION IS BEING USED. ; ; THE VALUED OPTIONS ARE: ; ; /SPEED:N SET LINE SPEED. APART FROM A NUMERIC ; VALUES, THE SPEED MAY BE ONE OF: 134 (134.5 BAUD), ; EXTA (DH11 EXTERNAL SPEED A) OR EXTB (DH11 EXTERNAL ; SPEED B) ; /SPEED:(M:N) SET SPLIT-SPEED LINE. 'M' IS THE KEYBOARD ; (LOWER) SPEED, AND 'N' IS THE PRINTER (HIGHER) ; SPEED. ; /READAHEAD:TYPE SET TYPE FOR READ-AHEAD PROCESSING. 'TYPE' MAY BE ; ONE OF: ; ; NONE READ-AHEAD IS NOT ALLOWED ; DEFERREDPROCESSING [DP] ; READ-AHEAD IS ACCEPTED BUT IS NOT EXAMINED ; UNTIL A READ IS PROCESSED WHICH USES IT ; IMMEDIATEPROCESSING [IP] ; THESE ARE EQUIVALENT. READ-AHEAD IS PROCESEED ; AS IT IS TYPED BUT NOT ECHOED UNTIL ; IT IS READ ; IMMEDIATEECHO [IE] ; READ-AHEAD IS ECHOED AS IT IS TYPED ; /NAME:TYPE SET TERMINAL TYPE. THE LIST OF TYPES IF THE ; SAME AS FOR THE 'SET TERMINAL TYPE' VERSION OF ; THE COMMAND, BELOW, BUT THIS FORM DOES ; NOT IMPLICITLY SET THE CHARACTERISTICS FOR THE ; TERMINAL. ; /FILL:N SET FILL FOR CARRIAGE-RETURN. IF N IS 7, LA30S ; TYPE FILL IS SUPPLIED ; /WIDTH:N SET PAGE WIDTH ; /LENGTH:N SET PAGE LENGTH ; /HANGUP HANG UP DIALUP LINE ; /PARITY:[EVEN!ODD] SET PARITY TYPE FOR LINE ; /NOPARITY DISABLE PARITY GENERATION AND CHECKING ; ; THE ALTERNATIVE TO A SPECIFIC CHARACTERISTIC IS A TERMINAL TYPE, E.G. ; /ASR33. THE AVAILABLE TERMINAL TYPES ARE: ASR33, KSR33, ASR35, ; LA30S, LA30P, LA36, VT05, VT50, VT52, VT61. THIS IMPLICITLY ; SETS ALL THE CHARACTERISTICS TO MATCH THE TERMINAL, EXCEPT THE SPEED. ; IF THE SPEED IS TO BE CHANGED TO THE DEFAULT FOR THE TERMINAL ; TYPE /DS MUST BE SPECIFIED AS WELL, E.G.: ; ; MCR>TER TT3:/VT05/DS ; ; IN ADDITION TO THE DEC TERMINAL TYPES, THERE ARE FIVE TERMINAL TYPES ; OF THE FORM '/USR0' - '/USR4' FOR USER SPECIFIED TERMINAL TYPES. ; ; AN ADDITIONALY QUALIFIER WHICH MAY APPEAR WITH EITHER OF THE ABOVE IS ; '/DEFAULT'. NORMALLY, THE TERMINAL CHARACTERISTICS SPECIFIED AT ; SYSTEM GENERATION ARE REMEMBERED AND WILL BE RESTORED ON LOGOUT OR, ; FOR A DIALUP LINE, ON HANGUP. HOWEVER A [1,1] USER MAY CHANGE THE DEFAULT ; SO THAT A PERMANENT CHANGE CAN BE MADE. THE CURRENT DEFAULTS ARE AUTOMATICALLY ; RESTORED BEFORE A DEFAULT CHANGE IS MADE. ; ; IF '/DEFAULT' APPEARS ALONE, THE CHARACTERISTICS ARE RESTORED TO THEIR ; DEFAULT VALUE. USED ALONE, /DEFAULT DOES NOT REQUIRE [1,1] PRIVILEGE. ; ; EXAMPLES OF THE COMMAND ARE: ; ; TER /LCP/NOLCI SET LOWER CASE OUTPUT, BUT DO ; NOT FORCE LOWER CASE INPUT ; TER TT1:TT2:TT3:/VT05/DS SET THREE TERMINALS TO BE VT05'S WITH ; THE CORRESPONDING DEFAULT SPEED ; TER /SPEED:(150:9600) SET TERMINAL SPEED TO 150 BAUD KEYBOARD ; AND 9600 BAUD PRINTER (OR SCREEN) ; TER TT4:/READAHEAD:IE/DEFAULT SET THE DEFAULT CHARACTERISTICS FOR TT4 ; TO A READAHEAD TYPE OF 'IMMEDIATE ECHO' ; ; THE COMMAND MAY EITHER BE ON THE SAME LINE AS THE MCR PROMPT, OR IF JUST ; 'TER' IS TYPED TO THE MCR PROMPT SEVERAL COMMANDS MAY BE ; GIVEN WITHOUT RE-INVOKING MCR. INDIRECT FILES ARE ACCEPTED TO A DEPTH OF 2. ;- .SBTTL MACROS AND DATA AREAS .MCALL QIOW$,ALUN$S,GTSK$S,EXIT$S,CALL,RETURN,DIR$,GLUN$S .MCALL GCML$,GCMLB$,FSRSZ$ .MCALL TTSYM$ ;USE NEW REESE SYMBOLS TTSYM$ ;CAUSE SORO AND BEEH NOT DEFINED ;+ ; ERROR - DECLARE ERROR. ERROR HANDLING IS VERY SIMPLE, SINCE ALL ERRORS ARE ; FATAL TO THE CURRENT COMMAND. THIS MACRO SETS UP THE ERROR ; CODE AND JUMPS TO 'ERROR' WHICH WILL PRINT AN APPROPRIATE ERROR ; MESSAGE AND READ ANOTHER COMMAND. IF NO ARGUMENT IS SPECIFIED ; THE ERROR CODE MUST BE IN R0. ;- .MACRO ERROR CODE .IF NB,CODE MOV #EE.'CODE,R0 .ENDC JMP ERROR .ENDM ERROR ;+ ; KEY - ENTER KEYWORD IN TABLE. AS WELL THE ASCIZ KEYWORD, A WORD ; OR TWO BYTES CAN BE PLANTED AT THE START OF THE ENTRY, AS ; SPECIFIED BY THE EXTRA ARGUMENTS OF THIS MACRO. IF THERE ; IS JUST ONE, IT IS ASSUMED TO BE A WORD, OTHERWISE THE ; TWO ITEMS ARE TREATED AS BYTES. ;- .MACRO KEY STRING,DAT1,DAT2 .IF B,DAT2 .WORD DAT1 .IFF .BYTE DAT1,DAT2 .ENDC .ASCIZ %STRING% .EVEN .ENDM KEY ;+ ; ENDKEY - SET END OF KEYWORD TABLE MARKER ;- .MACRO ENDKEY .BYTE 0,0,0,0 .ENDM ENDKEY .SBTTL MISCELLANEOUS DATA AND DEFINITIONS FLAGS: .WORD 0 ; FLAGS WORD (SEE BELOW FOR FLAG BITS) KEYSTT: .WORD 0 ; START IN BUFFER OF CURRENT KEYWORD SOFAR: .WORD 0 ; ADDRESS OF FIRST CHAR BEYOND KEYWORD SPSAV: .WORD 0 ; INITIAL VALUE OF SP TRMPTR: .WORD 0 ; POINTER TO FIRST FREE ENTRY IN TERMINAL LIST TRMLST: .BLKW 32. ; LIST OF TERMINALS TO SET TRMLSE: ; AND THE END CHRLST: .BLKW 16. ; LIST OF CHARACTERISTICS TO SET CHRLSE: ; AND THE END RUNUIC: .BLKW ;++005 RUN UIC FOR TASK LUNBUF: .BLKW 6. ; BUFFER FOR GLUN$ ERRBUF: .BLKB 80. ; BUFFER FOR FORMING ERROR MESSAGES CMDBUF: .BLKB 84. ; GCML BUFFER WITH ONE BYTE OVER AT END IOSB: .BLKW 2 ; I/O STATUS BLOCK FOR SET FUNCTIONS TTLUN =1 ; LUN FOR SET CHARACTERISTICS QIO GMLLUN =2 ; GET COMMAND LINE LUN ERRLUN =3 ; LUN FOR ERROR REPORTING ;+ ; FLAG BITS FOR 'FLAGS' ;- FL.TER =000001 ; TERMINAL NAME SEEN FL.CHR =000002 ; CHARACTERISTIC SEEN FL.SPD =000004 ; '/DS' SEEN ON TERMINAL NAME FL.DEF =000010 ; '/DEFAULT' SEEN FL.EXP =000020 ; EXPLICIT TERMINAL NAME SEEN FL.HNG =000040 ; '/HANGUP' SWITCH SEEN .SBTTL DIRECTIVE PARAMETER BLOCKS, ETC GCMLB: GCMLB$ 2,TER,CMDBUF,GMLLUN ; GCML CONTROL BLOCK: ; DEPTH OF @ NESTING = 2, PROMPT 'TER>' FSRSZ$ 1 ; ONE FILE OPEN AT A TIME CHKQIO: QIOW$ -1,TTLUN,1 ; SILLY QIO TO ENSURE HANDLER RESIDENT SMCDPB: QIOW$ SF.SMC,TTLUN,1,,IOSB,, ; SET MULTIPLE CHARACTERISTICS QIO STTDPB: QIOW$ SF.STT,TTLUN,1,,IOSB,,<.-.> TERTYP=STTDPB+Q.IOPL ; SET TERMINAL TYPE QIO RDFDPB: QIOW$ SF.RDF,TTLUN,1,,IOSB ;++005 RESTORE TERMINAL DEFAULTS HNGDPB: QIOW$ IO.HNG,TTLUN,1,,IOSB ERRDPB: QIOW$ IO.WLB,ERRLUN,1,,,, ; DPB TO WRITE ERROR MESSAGE CMDDPB: QIOW$ IO.WLB,ERRLUN,1,,,, ;++001 ; DPB TO WRITE OFFENDING COMMAND LINE .SBTTL ERROR MESSAGES ;+ ; ERROR MESSAGES ARE ENTERED INTO THE MESSAGE TABLE USING THE ; FOLLOWING MACRO. THE MESSAGE TABLE IS A LIST OF ITEMS OF THE ; FORM: ; ; .BYTE ERROR CODE ; .BYTE NUMBER OF BYTES TO SKIP TO NEXT MESSAGE ; .BYTE FLAGS: ; EF.KWD MESSAGE SHOULD BE ACCOMPANIED BY CURRENT KEYWORD OR ITEM ; EF.TTN MESSAGE SHOULD BE ACCOMPANIED BY TERMINAL ID ; IF FL.EXP SET ; .ASCII MESSAGE ; ; IF THE ERROR CODE SPECIFIED TO THE MACRO IS JUST THREE LETTERS, A NEW ERROR ; COPDE; CODE OF THE FORM 'EE.XXX' IS DEFINED. OTHERWISE, THE ERROR IS ASSUMED TO BE ; ONE GENERATED BY THE HANDLER, OF THE FORM 'SE.XXX'. ; THESE NUMBERS START AT 64., TO AVOID CONFLICT WITH QIO ERROR ; RETURNS (NEGATIVE) OR IE.ABO SUB-ERROR CODES (1<=N<=63) ;- .MACRO ERR NAME,FLAGS,STRING .NCHR $$$,NAME .IF EQ,$$$-3 EE.'NAME=$$$ECD $$$ECD=$$$ECD+1 .BYTE EE.'NAME .IFF .BYTE NAME .ENDC $$$=. .BYTE 0 $$$FLG=0 .IRP XXX, $$$FLG=$$$FLG ! EF.'XXX .ENDR .BYTE $$$FLG .ENABL LC .ASCII %STRING% .DSABL LC $$$1=. .=$$$ .BYTE $$$1-. .=$$$1 .ENDM ERR $$$ECD=64. EF.KWD =001 EF.TTN =002 .ENABL LC ERRTBL: ERR TMT, , ERR ITN, , ERR TMS,KWD, ERR DFP, , ERR NPR, , ERR SYN, , ERR FSE, , ERR ITC,KWD, ERR CNN,KWD,<'NO' prefix not allowed for this characteristic> ERR CLE, , ERR NTD, , ERR MTT, , ERR TMC, , ERR AMK,KWD, ERR TNS,KWD, ERR TTP,KWD, ERR BNM,KWD, ERR SPD,KWD, ERR RAT,KWD, ERR PAR,KWD, ERR IE.PRI,TTN, ERR IE.OFL,TTN, ERR IE.DNR,TTN, ERR IE.IFC,TTN, ERR SE.VAL,TTN, ERR SE.SPD,TTN, ERR SE.SPL,TTN, ERR SE.LPR,TTN, ERR SE.NSC,TTN, ERR SE.UPN,TTN, ERR SE.NIH, , ERRTBE: .DSABL LC .EVEN .SBTTL KEYWORD TABLES ;+ ; FIRST WE HAVE THE 'PRIMARY' KEYWORD TABLE, DRIVEN FROM ; THE KEYWORDS INTRODUCED BY A SLASH ;- PRIKEY: KEY TWOSTOPBITS, 1,TC.STB KEY TSB, 1,TC.STB KEY SCOPE, 1,TC.SCP KEY BINARY, 1,TC.BIN ;++006 KEY VERTICALFILL, 1,TC.VFL KEY VFILL, 1,TC.VFL KEY NEWLINE, 1,TC.NL KEY SIMULATEFORMFEED, 1,TC.SFF KEY SFF, 1,TC.SFF KEY HARDWAREFORMFEED, 1,TC.HFF KEY HFF, 1,TC.HFF KEY LVF, 1,TC.LVF KEY HARDWARETAB, 1,TC.HHT KEY HTAB, 1,TC.HHT KEY TAB, 1,TC.HHT KEY NONSTANDARDTAB, 1,TC.NST KEY NSTAB, 1,TC.NST KEY BACKSPACE, 1,TC.BSP KEY CARRIAGERETURN, 1,TC.ACR KEY CR, 1,TC.ACR KEY LOWERCASEKEYBOARD, 1,TC.SMR KEY LCKEYBOARD, 1,TC.SMR KEY LOWERCASEINPUT, 1,TC.SMP KEY LCINPUT, 1,TC.SMP KEY LOWERCASEOUTPUT, 1,TC.SMO KEY LCOUTPUT, 1,TC.SMO KEY LOWERCASEPRINTER, 1,TC.SMO KEY LCPRINTER, 1,TC.SMO KEY CONTROLCFLUSH, 1,TC.CCF KEY CCFLUSH, 1,TC.CCF KEY ESCAPESEQUENCE, 1,TC.ESQ KEY LOCALCOPY, 1,TC.LCP KEY ALTMODE, 1,TC.ALT KEY TAPE, 1,TC.TAP KEY HOLD, 1,TC.HLD KEY BLOCKMODE, 1,TC.BLK KEY FORMSMODE, 1,TC.FRM KEY MESSAGES, 5,TC.IMG KEY KEYBOARD, 5,TC.NKB KEY PRINTER, 5,TC.NPR KEY COMPATIBLE, 1,TC.CEQ KEY FULLDUPLEX, 1,TC.FDX ;++004 KEY UC0, 1,TC.UC0 ;++003 KEY UC1, 1,TC.UC1 ;++003 KEY UC2, 1,TC.UC2 ;++003 KEY UC3, 1,TC.UC3 ;++003 KEY UC4, 1,TC.UC4 ;++003 KEY UC5, 1,TC.UC5 ;++003 KEY UC6, 1,TC.UC6 ;++003 KEY UC7, 1,TC.UC7 ;++003 KEY UC8, 1,TC.UC8 ;++003 KEY UC9, 1,TC.UC9 ;++003 ;ADDED BY F.BORGER KEY NOECHO, 1,TC.NEC KEY SLAVE, 1,TC.SLV KEY PRIVILEGED, 1,TC.PRI KEY PRI, 1,TC.PRI KEY 8BC, 1,TC.8BC KEY P8B, 1,TC.P8B ;009FB ADDED CHARACTERISTICS KEY ANSISEQUENCE, 3,TC.ANS KEY ANS, 3,TC.ANS KEY CSQ, 3,TC.CSQ KEY CONTROLS, 3,TC.CSQ KEY ANSICRT, 3,TC.ANI KEY ANI, 3,TC.ANI KEY ADVANCEDVIDEO, 3,TC.AVO KEY AVO, 3,TC.AVO KEY DECCRT, 3,TC.DEC KEY DEC, 3,TC.DEC KEY EDIT, 3,TC.EDT KEY REGIS, 3,TC.RGS KEY AUTO, 3,TC.ABD KEY AUTOBAUD, 3,TC.ABD KEY ASR33, 3,T.AS33 KEY KSR33, 3,T.KS33 KEY ASR35, 3,T.AS35 KEY LA30S, 3,T.L30S KEY LA30P, 3,T.L30P KEY LA36, 3,T.LA36 KEY VT05, 3,T.VT05 KEY VT50, 3,T.VT50 KEY VT52, 3,T.VT52 KEY VT55, 3,T.VT55 KEY VT61, 3,T.VT61 KEY L180, 3,T.L180 KEY V100, 3,T.V100 KEY L120, 3,T.L120 KEY SCR0, 3,T.SCR0 ;ADDED TYPES F.BORGER KEY LA12, 3,T.LA12 KEY L100, 3,T.L100 KEY LA34, 3,T.LA34 KEY LA38, 3,T.LA38 KEY V101, 3,T.V101 KEY V102, 3,T.V102 KEY V105, 3,T.V105 KEY V125, 3,T.V125 KEY V131, 3,T.V131 KEY V132, 3,T.V132 KEY LA50, 3,T.LA50 KEY LQP1, 3,T.LQP1 KEY KQP2, 3,T.LQP2 KEY BMP1, 3,T.BMP1 KEY V2XX, 3,T.V2XX KEY SORO, 3,T.SORO KEY BEEH, 3,T.BEEH ;F. BORGER KEY USR0, 3,T.USR0 ;++003 KEY USR1, 3,T.USR1 ;++003 KEY USR2, 3,T.USR2 ;++003 KEY USR3, 3,T.USR3 ;++003 KEY USR4, 3,T.USR4 ;++003 KEY SPEED, SETSPD KEY READAHEAD, SETRAT KEY NAME, SETTER KEY FILL, SETFIL KEY WIDTH, SETWID KEY LENGTH, SETLEN KEY HANGUP, SETHNG KEY PARITY, SETPAR KEY NOPARITY, SETNPA KEY DEFAULT, SETDEF KEY DS, SETDS ENDKEY ;+ ; NOW THE SECONDARY KEYWORD TABLE FOR READ-AHEAD TYPE ;- RATKEY: KEY NONE, 0 KEY DEFERREDPROCESSING, 1 KEY DP, 1 KEY IMMEDIATEPROCESSING, 2 KEY IP, 2 KEY IMMEDIATEECHO, 3 KEY IE, 3 ENDKEY ;+ ; TABLE FOR PARITY TYPES ;- PARKEY: KEY EVEN, 1 KEY ODD, 0 ENDKEY ;+ ; NOW THE DH11 EXTERNAL SPEEDS ;- SPDKEY: KEY EXTA, S.EXTA KEY EXTB, S.EXTB ENDKEY ;+ ; NOW THE NUMERIC => SYMBOL MAPPING FOR LINE SPEED ;- .MACRO SPDKEY SPEED .WORD ^D,S.'SPEED .ENDM SPDKEY SPDTBL: SPDKEY 0 SPDKEY 50 SPDKEY 75 SPDKEY 100 SPDKEY 110 SPDKEY 134 SPDKEY 150 SPDKEY 200 SPDKEY 300 SPDKEY 600 SPDKEY 1200 SPDKEY 1800 SPDKEY 2000 SPDKEY 2400 SPDKEY 3600 SPDKEY 4800 SPDKEY 7200 SPDKEY 9600 SPDTBE: .SBTTL MAIN CODE ;+ ; THE LOGIC OF THIS PROGRAM IS VERY SIMPLE. IT CAN BE BROKEN DOWN ; INTO THE FOLLOWING STEPS: ; ; 1. GET COMMAND LINE, USING GCML$, AND CHECK FOR NULL LINE, ; GCML ERRORS AND SO ON ; 2. LOOK FOR AN EXPLICIT TERMINAL SPECIFICATION. IF THERE IS NOT ; ONE, PUT THE SINGLE TERMINAL 'TI' IN THE LIST, OTHERWISE CHECK ; THAT THE USER IS UNDER [1,1] AND PROCESS A LIST OF TERMINAL ; SPECIFICATIONS. ; 3. PROCESS THE LIST OF OPTIONS REQUIRED, PUTTING THEM INTO A ; LIST OF NAME/VALUE PAIRS ; 4. FOR EACH TERMINAL IN THE LIST PERFORM THE QIO. IF AN ERROR ; IS RETURNED ANALYSE IT. ; 5. COME BACK FOR MORE. ;- TER:: MOV #77402,-(SP) ;++005 SET UP FOR R-O ACCESS TO HEADER MOV .CRTSK,R0 ;++005 GET MY ATL NODE MOV A.HA(R0),-(SP) ;++005 GET HEADER ADDRESS CALL @#..SPD3 ;++005 MAP ONTO HEADER MOV H.UIC+60000,RUNUIC ;++005 REMEMBER THE RUN UIC CALL @#..SPD3 ;++005 RESTORE MAPPING CMP (SP)+,(SP)+ ;++005 AND CLEAN THE STACK MOV SP,SPSAV ; REMEMBER THE BASE OF THE STACK LOOP: MOV SPSAV,SP ; RESTORE THE STACK GCML$ #GCMLB ; GET A COMMAND LINE BCC 10$ ; SKIP IF NO ERROR CMPB G.ERR(R0),#GE.EOF ; END OF INPUT STREAM? BEQ 5$ ; ERROR IF NOT ERROR CLE ; COMMAND LINE ERROR 5$: EXIT$S ; GO AWAY 10$: TST G.CMLD(R0) ; ANY INPUT? BEQ LOOP ; LOOK AGAIN IF NOT MOV G.CMLD+2(R0),R5 ; GET START OF LINE MOV R5,R1 ; COPY IT ADD G.CMLD(R0),R1 ; POINT PAST END MOVB #15,(R1) ; AND PLANT A STOPPER MOV #TRMLST,R4 ; GET START OF TERMINAL LIST MOV #"TI,(R4)+ ; ASSUME DEVICE WILL BE TI0: CLR (R4)+ ; ... CLR FLAGS ; START WITH NO FLAGS SET CMPB (R5),#'/ ; START WITH OPTIONS? BEQ 70$ ; J IF SO, USE IMPLICIT TERMINAL MOV R5,KEYSTT ; REMEMBER START OF TERMINAL LIST MOV #TRMLST,R4 ; SET TERMINAL POINTER CMP RUNUIC,#401 ;++005 RUNNING UNDER [1,1]? BNE 35$ ; ILLEGAL IF NOT BIS #FL.EXP,FLAGS ; SHOW EXPLICIT TERMINALS 20$: CMPB (R5)+,#'T ; FIRST DEVICE NAME LETTER 'T'? BNE 40$ ; ERROR IF NOT CMPB (R5)+,#'T ; HOW ABOUT THE SECOND ONE? BNE 40$ ; J IF NOT MOV #"TT,(R4)+ ; YES, SO PLANT DEVICE NAME MOV R5,R0 ; COPY BUFFER POINTER CALL $COTB ; GET UNIT NUMBER MOV R0,R5 ; RETRIEVE BUFFER POINTER DEC R5 ; BACK UP TO TERMINATOR CMP R1,#63. ; NUMBER IN RANGE? BHI 50$ ; J IF NOT ALUN$S #TTLUN,#"TT,R1 ; TRY TO ASSIGN A LUN BCS 60$ ; J IF FAILED - NOT SYSGENED IN DIR$ #CHKQIO ; TRY A QUICK QIO BCS 60$ ; J IF FAILED - PROBABLY HANDLER NOT RESIDENT MOV R1,(R4)+ ; IT'S THERE - REMEMBER IT CMPB (R5),#': ; GOT A COLON? BNE 30$ ; J IF NOT, THAT'S OK ANYWAY INC R5 ; SKIP IT 30$: CMPB (R5),#'/ ; FINISHED WITH THE TERMINALS? BEQ 70$ ; J IF SO CMP R4,#TRMLSE ; RUN OUT OF BUFFER SPACE YET? BLO 20$ ; LOOP IF NOT ERROR TMT ; TOO MANY TERMINALS 35$: ERROR NPR ; NOT PRIVILEGED 40$: ERROR SYN ; BAD SYNTAX 50$: ERROR ITN ; BAD TERMINAL NUMBER 60$: ERROR TNS ; TERMINAL NOT IN SYSTEM 70$: MOV R4,TRMPTR ; REMEMBER HOW MANY TERMINALS PROCMD: MOV #CHRLST,R4 ; SET UP SET CHAR BUFFER POINTER 10$: INC R5 ; SKIP THE SLASH CALL PRITEM ; PROCESS A SINGLE OPTION ITEM CMPB (R5),#'/ ; GOT ANOTHER ONE? BEQ 10$ ; YES - GO PROCESS CMPB (R5)+,#15 ; AT THE TERMINATOR YET? BEQ 20$ ; YES - GO DO THE WORK ERROR SYN ; SAY SYNTAX ERROR 20$: SUB #CHRLST,R4 ; GET LENGTH OF SET LIST MOV R4,SMCDPB+Q.IOPL+2 ; SAVE IN DPB 30$: BIT #FL.DEF,FLAGS ;++005 /DEFAULT SPECIFIED? BEQ 35$ ;++005 J IF NOT BIT #FL.TER!FL.CHR,FLAGS ;++005 TERMINAL TYPE OR CHARACTERISTICS? BEQ 32$ ;++005 J IF NOT CMP RUNUIC,#401 ;++005 RUNNING UNDER [1,1] BEQ 35$ ;++005 OK IF SO ERROR DFP ;++005 ELSE NOT ALLOWED 32$: MOV #RDFDPB,R0 ;++005 JUST /DEEFAULT, SO RESTORE DEFAULTS CALL DOQIO ;++005 DO THE OPERATION BR 80$ ;++005 NO NEED TO BOTHER WITH THE REST 35$: BIT #FL.TER,FLAGS ; TERMINAL TYPE SET? BEQ 60$ ; J IF NOT MOVB #SF.STT,STTDPB+Q.IOFN ; ASSUME JUST TERMINAL TYPE BIT #FL.SPD,FLAGS ; SPEED TOO? BEQ 40$ ; J IF NOT MOVB #SF.STS,STTDPB+Q.IOFN ; ELSE SAY SO 40$: BIT #FL.DEF,FLAGS ; SET DEFAULT AS WELL? BEQ 50$ ; J IF NOT BISB #SF.DEF,STTDPB+Q.IOFN ; ELSE SAY SO 50$: MOV #STTDPB,R0 ; GET DPB ADDRESS CALL DOQIO ; DO THE DIRECTIVE BCS 100$ ; J IF NOT GOOD 60$: BIT #FL.CHR,FLAGS ; ANY CHARACTERISTICS TO SET? BEQ 80$ ; J IF NOT MOVB #SF.SMC,SMCDPB+Q.IOFN ; SET UP SET FUNCTION BIT #FL.DEF,FLAGS ; SET DEFAULT TOO? BEQ 70$ ; J IF NOT BISB #SF.DEF,SMCDPB+Q.IOFN ; ELSE SAY SO 70$: MOV #SMCDPB,R0 ; GET DPB ADDRESS CALL DOQIO ; DO THE WORK BCS 100$ ; J IF NOT GOOD 80$: BIT #FL.HNG,FLAGS ; ANY HANGUP REQUEST? BEQ 85$ ; J IF NOT MOV #HNGDPB,R0 ; ELSE GET THE DPB CALL DOQIO ; AND DO THE WORK BCS 100$ ; J IF ERROR 85$: BIT #FL.TER!FL.CHR!FL.HNG!FL.DEF,FLAGS ;++005 DID WE DO ANYTHING AT ALL? BNE 90$ ; J IF SO ERROR NTD ; ELSE SAY WE DID NOTHING 90$: JMP LOOP ; DO SOME MORE WORK 100$: JMP ERROR ; GO PROCESS ERROR .SBTTL PRITEM -- PROCESS SINGLE OPTION ITEM ;+ ; THIS PROCESSES THE NEXT OPTION KEYWORD ON THE LINE AND PERFORMS THE ; APPROPRIATE ACTION. IT FIRST TRIES TO MATCH THE KEYWORD AS IT ; STANDS, THEN IF THAT FAILS TRIES TO REMOVE 'NO' FROM THE FRONT ; AND HAS ANOTHER GO. THE MEANING OF A KEYWORD IS DETERMINED FROM ; THE 'SEMANTICS' WORD IN THE KEYWORD TABLE, RETURNED BY 'FNDKEY', AS ; FOLLOWS: ; ; 1. IF THE WORD IS EVEN, IT IS THE ADDRESS OF A ROUTINE TO DISPATCH ; TO TO DO THE WORK ; 2. IF THE LOW BYTE IS 1, THE HIGH BYTE IS THE NUMBER OF A BINARY ; CHARACTERISTIC TO BE SET OR CLEARED. ; 3. IF THE LOW BYTE IS 3, THE HIGH BYTE IS A TERMINAL TYPE. ; 4. IF THE LOW BYTE IS 5, THE HIGH BYTE IS THE NAME OF A BINARY ; CHARACTERISTIC WITH NEGATIVE SENSE, I.E. IT IS TO BE CLEARED ; IF THE UN-NEGATED ARGUMENT IS SPECIFIED AND SET IF THE NEGATED ; FORM IS SPECIFIED. ;- PRITEM: MOV R5,KEYSTT ; REMEMBER START OF KEYWORD MOV #PRIKEY,R0 ; GET ADDRESS OF PRIMARY KEYWORD TABLE CALL FNDKEY ; TRY TO MATCH THE KEYWORD BCC 40$ ; J IF MATCHED OK CMPB (R5)+,#'N ; FIRST LETTER 'N'? BNE 10$ ; BAD KEYWORD IF NOT CMPB (R5)+,#'O ; SECOND LETTER 'O'? BNE 10$ ; BAD KEYWORD IF NOT MOV #PRIKEY,R0 ; GET KEYWORD TABLE AGAIN CALL FNDKEY ; TRY TO MATCH BCC 20$ ; J IF MATCHED THIS TIME 10$: ERROR ITC ; UNKNOWN KEYWORD 20$: CMPB (R0),#1 ; BINARY CHARACTERISTIC? BEQ 43$ ; J IF SO CMPB (R0),#5 ; NEGATED BINARY CHARACTERISTIC? BEQ 42$ ; YES, GO SET IT ERROR CNN ; ELSE SAY NOT NEGATABLE 40$: CMPB (R0),#5 ; IS THIS A NEGATED BINARY CHARACTERISTIC? BEQ 43$ ; YES, GO CLEAR THE VALUE CMPB (R0),#1 ; UN-NEGATED KEYWORD MATCH - IS IT BINARY? BNE 70$ ; J IF NOT 42$: MOVB 1(R0),(R4)+ ; ELSE STORE THE NAME MOVB #1,(R4)+ ; AND THE NEW VALUE BR 50$ ; SKIP 43$: MOVB 1(R0),(R4)+ ; SET CHARACTERISTIC NAME CLRB (R4)+ ; SHOW VALUE OF ZERO 50$: BIS #FL.CHR,FLAGS ; SHOW CHARACTERISTIC SEEN BR 100$ ; AND GO AWAY 70$: CMPB (R0),#3 ; TERMINAL TYPE? BNE 90$ ; J IF NOT BIT #FL.TER,FLAGS ; TERMINAL TYPE ALREADY SET? BEQ 80$ ; J IF NOT ERROR MTT ; ELSE SAY MULTIPLE TERMINAL TYPES 80$: MOVB 1(R0),TERTYP ; REMEMBER THE TERMINAL TYPE BIS #FL.TER,FLAGS ; SHOW TERMINAL TYPE SEEN BR 100$ ; GO AWAY 90$: CALL @(R0) ; LET SOMEONE ELSE DO THE WORK 100$: RETURN ; GO AWAY .SBTTL DOQIO -- SEND QIO TO ALL REQUIRED TERMINALS ;+ ; THIS ROUTINE WILL TAKE A DPB AND PERFORM THE APPROPRIATE REQUEST ; TO EVERY TERMINAL IN THE LIST SET UP DURING COMMAND PROCESSING. ; IF ANY TERMINAL FAILS IT WILL REPORT AN APPROPRIATE ERROR AND ; GIVE UP. ; ; INPUTS: ; ; R0 DPB ADDRESS ;- DOQIO: MOV #TRMLST,R1 ; GET ADDRESS OF LIST 5$: ALUN$S #TTLUN,(R1),2(R1) ; ASSIGN THE LUN BCC 10$ ; J IF OK ERROR TNS ; SHOULD NEVER HAPPEN, BUT STILL 10$: DIR$ R0 ; DO THE DIRECTIVE BCC 20$ ; J IF NO QIO ERROR ERROR TNS ; THIS SHOULDN'T HAPPEN EITHER 20$: CMP IOSB,#IS.SUC ; OK? BEQ 40$ ; J IF SO CMPB IOSB,#IE.ABO ; SUB-CODED ERROR? BNE 25$ ; J IF NOT MOVB IOSB+1,R0 ; ELSE GET IT SEC ; SAY BAD BR 50$ ; AND GET OUT 25$: MOVB IOSB,R0 ; GET ERROR CODE SEC ; SHOW BAD BR 50$ ; AND GET OUT 30$: MOVB IOSB+1,R0 ; GET SUB CODE ERROR ; REPORT THE ERROR 40$: ADD #4,R1 ; GET NEXT TERMINAL IN LIST CMP R1,TRMPTR ; AT END OF LIST YET? BLO 5$ ; LOOP IF NOT CLC ; SHOW GOOD 50$: RETURN ; GO AWAY .SBTTL GETNUM -- GET A DECIMAL NUMBER ;+ ; THIS ROUTINE READS A DECIMAL NUMBER IF THERE IS ONE, OTHERWISE ; IT SAYS THERE WASN'T ONE. ; ; INPUTS: ; ; R5 BUFFER POINTER ; ; OUTPUTS: ; ; R0 NUMBER ; R5 BUFFER POINTER ; CC-C SET IF NOT POINTING AT DIGIT WHEN CALLED ;- GETNUM: CMPB (R5),#'0 ; TOO SMALL FOR NUMBER? BLO 10$ ; J IF SO CMPB (R5),#'9 ; TOO BIG? BHI 10$ ; J IF SO MOV R5,R0 ; ELSE COPY THE POINTER CALL $CDTB ; READ THE NUMBER MOV R0,R5 ; GET THE POINTER BACK DEC R5 ; BACK UP TO TERMINATOR MOV R1,R0 ; GET RESULT TO RIGHT PLACE CLC ; SHOW OOD BR 20$ ; AND GET OUT 10$: SEC ; SHOW BAD 20$: RETURN ; GO AWAY .SBTTL GETSPD -- GET SPEED SPECIFICATION ;+ ; THIS ROUTINE FIRST TRIES TO READ A DECIMAL NUMBER; IF IT SUCCEEDS ; IT LOOKS IT UP IN THE TABLE TO CONVERT IT TO A SPEED SYMBOL. ; IF IT FAILS IT TRIES FOR ONE OF THE DH11 EXTERNAL SPEED KEYWORDS. ; ; INPUTS: ; ; R5 BUFFER POINTER ; ; OUTPUTS: ; ; R0 SPEED VALUE ; R5 FIRST CHARACTER PAST SPEED ;- GETSPD: CALL GETNUM ; TRY FOR A NUMBER BCC 5$ ; J IF GOT ONE MOV #SPDKEY,R0 ; GET KEYWORD TABLE CALL FNDKEY ; AND LOOK IT UP BCS 20$ ; J IF BAD BR 30$ ; ELSE GO AWAY 5$: MOV #SPDTBL,R1 ; GET CONVERSION TABLE 10$: CMP R0,(R1)+ ; THIS ONE MATCH? BEQ 30$ ; J IF SO TST (R1)+ ; SKIP SECOND TABLE WORD CMP R1,#SPDTBE ; END OF TABLE YET? BLO 10$ ; J IF NOT 20$: ERROR SPD ; BAD SPEED 30$: MOV (R1),R0 ; PICK UP TRANSLATED FORM RETURN ; AND GO AWAY .SBTTL CHKCOL -- CHECK FOR PRESENCE OF COLON ;+ ; THIS ROUTINE CHECKS THAT THE CURRENT CHARACTER IN THE COMMAND ; LINE IS A COLON. IF NOT, IT DIAGNOSES A SYNTAX ERROR. ;- CHKCOL: CMPB (R5)+,#': ; POINTING AT A COLON? BEQ 10$ ; OK IF SO ERROR SYN ; ELSE SAY SYNTAX ERROR 10$: RETURN ; GO AWAY .SBTTL FNDKEY -- TRY TO MATCH KEYWORD ;+ ; THIS ROUTINE WILL TAKE A KEYWORD TABLE AND SCAN IT TRYING TO MATCH ; THE KEYWORD AT THE CURRENT CHARACTER POSITION. IF IT SUCCEEDS, ; IT RETURNS WITH R0 POINTING AT THE FIRST WORD OF THE ENTRY IN THE ; TABLE (WHICH IS AVAILABLE TO THE CALLER), OTHERWISE IT RETURNS ; CARRY SET IF IT FAILS TO FIND A MATCH OR JUST REPORTS AN ERROR ; IF IT SEES AN AMBIGUOUS ABBREVIATION. IT WILL ACCEPT ANY KEYWORD ; WHICH WILL MATCH OVER ALL ITS LENGTH AND IS NOT AMBIGOUS - NOTE ; THAT EVEN WHEN A MATCH IS FOUND WE MUST SCAN THE REST OF THE TABLE ; TO CHECK THAT THERE ARE NO AMBIGUITY PROBLEMS. THE FORMAT OF ; THE KEYWORD TABLE IS: ; ; .WORD USER INFORMATION - NOT USED BY FNDKEY ; .ASCIZ KEYWORD ; .BYTE PADDING IF REQUIRED TO BRING TO A WORD BOUNDARY ; ; INPUTS: ; ; R0 ADDRESS OF KEYWORD ; R5 INPUT BUFFER POINTER ; ; OUTPUTS: ; ; R0 POINTER TO USER INFORMATION WORD IF MATCH FOUND ; R5 POINTS PAST KEYWORD IF MATCH FOUND, ELSE UNCHANGED ; CC-C SET IF NO MATCH ;- FNDKEY: CLR R1 ; ASSUME NO MATCH MOV R5,R3 ; REMEMBER STARTING ADDRESS 10$: MOV R0,R2 ; REMEMBER START OF THIS ENTRY TST (R0)+ ; SKIP USER WORD TSTB (R0) ; END OF TABLE? BEQ 60$ ; STRAIGHT OUT IF SO 20$: CMPB (R0)+,(R5)+ ; MATCH FIRST CHARACTER? BNE 40$ ; J IF NOT 22$: CMPB (R5),#'A ; NEXT CHAR A LETTER? BHIS 25$ ; J IF MAYBE CMPB (R5),#'0 ; HOW ABOUT A DIGIT? BLO 30$ ; J IF NOT CMPB (R5),#'9 ; TOO BIG? BHI 30$ ; J IF SO BR 27$ ; ELSE KEEP ON TRUCKIN' 25$: CMPB (R5),#'Z ; IS IT A LETTER THEN? BHI 30$ ; J IF NOT 27$: TSTB (R0) ; AT END OF KEYWORD? BNE 20$ ; LOOP IF NOT BR 50$ ; ELSE SAY NO MATCH 30$: CMPB (R5),#'_ ; NO MORE ALPHANUMERIC - IS IT UNDERSCORE? BNE 35$ ; J IF NOT - END OF KEYWORD INC R5 ; ELSE SKIP IT BR 22$ ; AND LOOK SOME MORE 35$: TST R1 ; MATCH - IS THERE ALREADY ONE? BNE 70$ ; YES - SAY AMBIGUOUS MOV R2,R1 ; ELSE REMEMBER THIS ONE MOV R5,SOFAR ; REMEMBER WHERE THE END WAS 40$: TSTB (R0) ; NOW SKIP TO END OF THIS KEYWORD BEQ 50$ ; J IF GOT IT INC R0 ; ELSE BUMP POINTER BR 40$ ; AND KEEP LOOKING 50$: ADD #2,R0 ; ROUND POINTER TO WORD BOUNDARY BIC #1,R0 ; ... MOV R3,R5 ; GET KEYWORD POINTER BACK BR 10$ ; AND LOOP 60$: MOV SOFAR,R5 ; GET END OF KEYWORD, IF ANY MOV R1,R0 ; GET ANSWER CLC ; AND EVEN SAY SO BNE 80$ ; J IF SO MOV R3,R5 ; RESET LINE POINTER SEC ; ELSE SAY BAD BR 80$ ; ... 70$: ERROR AMK ; SAY AMBIGOUS KEYWORD 80$: RETURN ; GET OUT .SBTTL ACTION ROUTINES FOR KEYWORDS ;+ ; HERE ARE THE ACTION ROUTINES TO DEAL WITH WHAT FOLLOWS INDIVIDUAL ; KEYWORDS ;- .SBTTL SETFIL -- /FILL SETFIL: CALL CHKCOL ; CHECK FOR AND SKIP A COLON CALL GETNUM ; TRY FOR A DECIMAL NUMBER BCC 10$ ; J IF OK ERROR BNM ; ELSE SAY BAD NUMBER 10$: MOVB #TC.HFL,(R4)+ ; SET CHAR NAME MOVB R0,(R4)+ ; AND VALUE BIS #FL.CHR,FLAGS ; SHOW CHARACTERISTIC SEEN RETURN ; AND GO AWAY .SBTTL SETRAT -- /READAHEAD SETRAT: CALL CHKCOL ; CHECK FOR AND SKIP COLON MOV #RATKEY,R0 ; GET KEYWORD TABLE ADDRESS CALL FNDKEY ; LOOK FOR A KEYWORD BCC 10$ ; J IF OK ERROR RAT ; ELSE COMPLAIN 10$: MOVB #TC.RAT,(R4)+ ; GET CHAR NAME MOVB (R0),(R4)+ ; AND VALUE FROM TABLE BIS #FL.CHR,FLAGS ; SHOW SOMETHING SEEN RETURN ; AND GO AWAY .SBTTL SETTER -- SET TERMINAL TYPE ;+ ; WE SCAN THE PRIMARY KEYWORD TABLE AND CHECK THAT IF WE GET A ; KEYWORD MATCH IT IS A TYPE 3 (TERMINAL TYPE) ENTRY. NOTE ; THAT THIS DOES NOT DO AN IMPLICIT 'SET RELEVANT CHARACTERISTICS' ;- SETTER: CALL CHKCOL ; CHECK FOR AND SKIP COLON MOV #PRIKEY,R0 ; GET PRIMARY TABLE ADDRESS CALL FNDKEY ; TRY FOR A MATCH BCS 10$ ; J IF NONE CMPB (R0)+,#3 ; TERMINAL NAME? BEQ 20$ ; J IF SO 10$: ERROR TTP ; SAY BAD IF NOT 20$: MOVB #TC.TTP,(R4)+ ; MOVE THE NAME MOVB (R0),(R4)+ ; AND VALUE BIS #FL.CHR,FLAGS ; SHOW SOMETHING SEEN RETURN ; AND GO AWAY .SBTTL SETSPD -- SET LINE SPEED ;+ ; BECAUSE WE ALLOW TWO SYNTACTIC FORMS HERE, WE FIRST FIRST CHECK ; FOR AN OPEN PARENTHESIS AND BEHAVE DIFFERENTLY IF WE SEE ONE. ;- SETSPD: CALL CHKCOL ; CHECK FOR AND SKIP COLON CMPB (R5),#'( ; OPEN PAREN BEQ 10$ ; J IF SO - MUST BE SPLIT SPEED CALL GETSPD ; READ A SPEED MOVB #TC.RSP,(R4)+ ; MUST SET READ SPEED MOVB R0,(R4)+ ; ... MOVB #TC.XSP,(R4)+ ; AND WRITE SPEED MOVB R0,(R4)+ ; ... BR 50$ ; NOW GO AWAY 10$: INC R5 ; SKIP THE PARENTHESIS CALL GETSPD ; GET THE FIRST SPEED MOVB #TC.RSP,(R4)+ ; SET UP READ... MOVB R0,(R4)+ ; ... CMPB (R5)+,#': ; FOLLOWED BY COLON? BNE 45$ ; J IF NOT CALL GETSPD ; NOW GET TRANSMIT SPEED MOVB #TC.XSP,(R4)+ ; SET UP IN LIST MOVB R0,(R4)+ ; ... CMPB (R5)+,#') ; CHECK FOR CLOSING PAREN BEQ 50$ ; J IF OK 45$: ERROR SYN ; SYNTAX ERROR 50$: BIS #FL.CHR,FLAGS ; SHOW SOMETHING SEEN RETURN ; GO AWAY .SBTTL SETWID -- SET PAGE WIDTH ;+ ; JUST READ THE NUMBER, ADD ONE AS REQUIRED BY THE HANDLER, ; AND SET UP. ;- SETWID: CALL CHKCOL ; CHECK FOR AND SKIP COLON CALL GETNUM ; READ THE NEW WIDTH BCC 10$ ; J IF OK ERROR BNM ; ELSE SAY BAD NUMBER 10$: INC R0 ; BUMP THE WIDTH MOVB #TC.WID,(R4)+ ; SET UP IN BUFFER MOVB R0,(R4)+ ; ... BIS #FL.CHR,FLAGS ; SHOW WE SAW SOMETHING RETURN ; AND GO AWAY .SBTTL SETLEN -- SET PAGE LENGTH ;+ ; THIS IS EVEN EASIER - JUST READ THE NUMBER AND ; SET UP THE PARAMETERS ;- SETLEN: CALL CHKCOL ; CHECK FOR COLON CALL GETNUM ; READ THE NUMBER BCC 10$ ; J IF OK ERROR BNM ; ELSE SAY BAD NUMBER 10$: MOVB #TC.LPP,(R4)+ ; SET UP PARAMETER MOVB R0,(R4)+ ; AND VALUE BIS #FL.CHR,FLAGS ; SHOW SOMETHING SEEN RETURN ; AND GO AWAY .SBTTL SETHNG -- /HANGUP, HANG UP MODEM LINE SETHNG: BIS #FL.HNG,FLAGS ; SHOW WE SAW IT RETURN ; AND GO AWAY .SBTTL SETDS -- /DS, SET DEFAULT SPEED SETDS: BIS #FL.SPD,FLAGS ; SHOW THIS SWITCH SEEN RETURN ; AND GO AWAY .SBTTL SETDEF -- /DEFAULT ;+ ; BEFORE ALLOWING THIS WE MUST CHECK THAT THE USER IS RUNNING ; UNDER [1,1]. ;- SETDEF: BIS #FL.DEF,FLAGS ;++005 SHOW /DEFAULT SEEN RETURN ; AND GO AWAY .SBTTL SETPAR -- SET PARITY CHECKING TYPE ;+ ; JUST READ THE PARITY TYPE AND SET THE CHARACTERISTICS 'PARITY ; REQUIRED' AND THE APPROPRIATE TYPE ;- SETPAR: CALL CHKCOL ; CHECK FOR COLON MOV #PARKEY,R0 ; GET KEYWORD TABLE ADDRESS CALL FNDKEY ; GO LOOK IT UP BCC 10$ ; J IF FOUND ERROR PAR ; ELSE SAY BAD PARITY TYPE 10$: MOVB #TC.PAR,(R4)+ ; GET 'PARITY REQUIRED' CHARACTERISTIC MOVB #1,(R4)+ ; AND SHOW WANTED MOVB #TC.EPA,(R4)+ ; GET TYPE CHAR MOVB (R0),(R4)+ ; AND SET AS REQUIRED BIS #FL.CHR,FLAGS ; SHOW SOMETHING SEEN RETURN ; AND GO AWAY .SBTTL SETNPA -- SET NO PARITY REQUIRED SETNPA: MOVB #TC.PAR,(R4)+ ; GET CHARACTERISTIC NAME CLRB (R4)+ ; SHOW NOT WANTED BIS #FL.CHR,FLAGS ; SHOW SOMETHING SEEN RETURN ; AND GO AWAY .SBTTL ERROR -- REPORT AN ERROR ;+ ; THIS ROUTINE IS INVOKED BY THE 'ERROR' MACRO. ON ENTRY THERE ; IS AN ERROR CODE IN R0. THE ERROR TABLE IS SCANNED LOOKING FOR ; THE CORRESPONDING MESSAGE, THEN WHEN IT IS FOUND IT IS PRINTED ; WITH ANY APPROPRIATE TRIMMINGS. THE FORMAT OF THE ERROR TABLE ; IS DESCRIBED UNDER THE 'MACROS AND DATA AREAS' SECTION. ; IF THE CURRENT COMMAND LINE DIDN'T COME FROM A TERMINAL, THE ; OFFENDING COMMAND LINE IS PRINTED AS WELL AS THE ERROR MESSAGE. ; ; INPUTS: ; ; R0 ERROR CODE ; ; OUTPUTS: ; ; *** THIS ROUTINE DOES NOT RETURN TO ITS CALLER. INSTEAD ; *** IT JUMPS TO 'LOOP' TO PROCESS ANOTHER COMMAND ;- ERROR: MOV #ERRTBL,R1 ; GET START OF MESSAGES 10$: CMPB R0,(R1)+ ; THIS ONE MATCH? BEQ 20$ ; J IF SO MOVB (R1),R2 ; ELSE GET # BYTES TO SKIP ADD R2,R1 ; DO SO CMP R1,#ERRTBE ; PAST LEGAL MESSAGES YET? BLO 10$ ; J IF NOT ERROR FSE ; ELSE IT'S AN ILLEGAL ERROR CODE 20$: MOV #ERRBUF,R4 ; GET OUTPUT BUFFER ADR MOVB (R1)+,R2 ; GET LENGTH OF MESSAGE SUB #2,R2 ; ALLOW FOR FLAGS BITB #EF.TTN,(R1) ; TERMINAL NAME WANTED? BEQ 30$ ; J IF NOT BIT #FL.EXP,FLAGS ; ANY TERMINAL NAME GIVEN? BEQ 30$ ; J IF NOT MOV #LUNBUF,R3 ; GET BUFFER FOR LUN INFO GLUN$S #TTLUN,R3 ; GET THE INFO MOVB (R3)+,(R4)+ ; COPY NAME MOVB (R3)+,(R4)+ ; ... MOVB (R3),R3 ; GET THE UNIT NUMBER MOV R2,-(SP) ; SAVE MESSAGE LENGTH CLR R2 ; CLEAR HIGH ORDER FOR DIVIDE DIV #10,R2 ; FORM TWO-DIGIT OCTAL NUMBER TSTB R2 ; ANY HIGH DIGIT? BEQ 25$ ; J IF NOT ADD #'0,R2 ; YES, SO MAKE ASCII MOVB R2,(R4)+ ; PUT IT IN THE BUFFER 25$: ADD #'0,R3 ; MAKE UNITS DIGIT ASCII MOVB R3,(R4)+ ; AND PUT IN BUFFER MOVB #':,(R4)+ ; NOW PLANT A COLON MOVB #40,(R4)+ ; AND A DELIMITER... MOVB #'-,(R4)+ ; ... MOVB #'-,(R4)+ ; ... MOVB #40,(R4)+ ; ... MOV (SP)+,R2 ; RETRIEVE R2 30$: BITB #EF.KWD,(R1)+ ; KEYWORD WANTED TOO? BEQ 50$ ; J IF NOT INC R5 ; MAKE SURE WE GET THE OFFENDING CHARACTER MOV KEYSTT,R3 ; GET KEYWORD START ADDRESS 40$: MOVB (R3)+,(R4) ; COPY A BYTE CMPB (R4),#15 ; WAS IT A CARRIAGE RETURN BEQ 45$ ; J IF SO INC R4 ; BUMP OVER LEGAL CHARACTER CMP R3,R5 ; DONE YET? BLOS 40$ ; J IF NOT 42$: CMPB (R3),#'0 ; STILL ON AN ALPHANUMERIC? BLO 45$ ; J IF NOT CMPB (R3),#'9 ; VALID DIGIT? BLOS 43$ ; J IF SO CMPB (R3),#'A ; MAYBE A LETTER? BLO 45$ ; J IF DEFINITELY NOT CMPB (R3),#'Z ; WELL? BHI 45$ ; J IF NOT 43$: MOVB (R3)+,(R4)+ ; COPY THIS ALPHANUMERIC BR 42$ ; AND LOOP 45$: MOVB #40,(R4)+ ; NOW A SPACE MOVB #'-,(R4)+ ; A COUPLE OF DASHES MOVB #'-,(R4)+ ; ... MOVB #40,(R4)+ ; ANOTHER SPACE 50$: MOVB (R1)+,(R4)+ ; COPY THE MESSAGE TEXT SOB R2,50$ ; LOOP TIL DONE SUB #ERRBUF,R4 ; GET MESSAGE LENGTH MOV R4,ERRDPB+Q.IOPL+2 ; SET UP LENGTH IN MESSAGE DIR$ #ERRDPB ; AND PRINT IT BITB #FD.TTY,GCMLB+F.RCTL ; TERMINAL INPUT? BNE 60$ ; J IF SO MOV GCMLB+G.CMLD,CMDDPB+Q.IOPL+2 ; SET UP LENGTH IN DPB DIR$ #CMDDPB ; PRINT THE LINE 60$: JMP LOOP ; RESTART THE PROGRAM .END TER .SBTTL GETNUM -- READ AN OCTAL NUMBER