.TITLE SPROV - SET MCR COMMAND PARSER OVERLAY .IDENT /03.4/ ; ; COPYRIGHT (C) 1974, 1976, 1977 ; 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 DOCUMENT 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. ; ; VERSION: 02 ; BY: H.LEV ; DATE: 11/9/73 ; MODIFIED: 12/10/74 ADD /WCHK KEYWORD FOR ENABLING WRITE ; CHECKING OF DISKS ; 3/5/75 ADD /LOWER TO PASS LOWER CASE CHARACTERS ; 4/24/75 ADD SYSTEM CONTROLLED PARTITIONS ; 6/13/75 ALLOW TI: AS DEVICE SPECIFIER ; 6/21/75 ADD 11/70 EXTENDED MEMORY SUPPORT ; ; HJL002 9/16/75 ADD PUBLIC/PRIVTAE DEVICE SUPPORT ; 1/20/76 ADD MULTI-USER SUPPORT ; ; HJL020 1/20/76 ADD EXTENDED EXECUTIVE ADDRESS SPACE SUPPORT ; ; HJL025 8/25/76 ADD SUPPORT FOR NEW PCB FORMAT ; ; HJL033 6/15/76 ADD DZ11 AND NEW TERMINAL DRIVER FEATURE ; SUPPORT. ; ; HJL036 7/15/76 ADD /SYSUIC, /MAXPKT, /MAXEXT, AND /LOGON ; ; HJL050 14-JAN-77 ADD SUPPORT FOR U.CLI ; ; HJL055 8-FEB-77 INSIST ON EOL AS LAST CHARACTER OF KEYWORD ; ; EB028 8-MAR-77 ALLOW /SET PUB ON PSEUDO DEVICES ; ; EB031 23-MAR-77 ALLOW SET /WCHK ON NEW DEVICES ; ; BLS036 23-NOV-77 DO NOT ALLOW NON-PRIV USER TO "SET /NOMAIN" ; ; ; THIS MODULE PARSES THE SET MCR COMMAND ; .MCALL PCBDF$,DIR$,WTSE$S .SBTTL EQUATED SYMBOLS AND LOCAL DATA ; ; EQUATED SYMBOLS ; SPA = 40 ; SPACE ESC = 33 ; ESCAPE CR = 15 ; CARRIAGE RETURN LUN1 = 1 ; LOGICAL UNIT NUMBER FOR "TI" EFN1 = 1 ; EVENT FLAG NEGFLG = 22 ; NEGATE FLAG, SET TO NON-ZERO IF ; "NO" PARSED WITH KEYWORD. THIS ; IS AN OFFSET INTO $MPARS. PCBDF$ ; DEFINE PARTITION CONTROL BLOCK OFFSETS ; ; LOCAL DATA ; ;*************************** ; ; TRANSFER VECTOR TABLE ; ; THIS TABLE MUST BE LOCATED AT ADDRESS ZERO OF THIS OVERLAY MODULE ; SINCE THE DISPATCHER PASSES CONTROL TO THIS OVERLAY VIA AN INDIRECT ; INDEXED JUMP THROUGH THIS TABLE. .WORD $SPREP ; ; ;**************************** ; ; KEYWORD TABLE - IT CONTAINS ALL VALID KEYWORDS PROCESSED BY ; THE SET COMMAND ; EACH ENTRY IS ENDED BY A ZERO BYTE AND ; THE TABLE ITSELF IS ENDED BY A ZERO BYTE ; KEYTAB: .ASCIZ /MAIN/ ; MAIN PARTITION .ASCIZ /SUB/ ; SUBPARTITION .ASCIZ /SPEED/ ; DH11 RCV AND XMIT SPEED .ASCIZ /UIC/ ; USER ID CODE .ASCIZ /BUF/ ; BUFFER SIZE .ASCIZ /POOL/ ; DYNAMIC POOL LIMIT .ASCIZ /WCHK/ ; WRITE CHECK .ASCIZ /PUB/ ; PUBLIC DEVICE .ASCIZ /SYSUIC/ ; DEFAULT SYSTEM UIC .ASCIZ /MAXPKT/ ; MAXIMUM RETAINED I/O PACKETS .IF DF M$$MGE .ASCIZ /MAXEXT/ ; MAXIMUM SIZE TASK MAY EXTEND TO .ENDC .ASCIZ /LOGON/ ; ENABLE/DISABLE LOGONS .IF DF C$$LIS ;HJL050 ;HJL050 .ASCIZ /CLI/ ; SET TO DCLS ;HJL050 .ASCIZ /MCR/ ; SET TO MCR ;HJL050 ;HJL050 .ENDC ;HJL050 ;HJL050 .ASCIZ /LA30S/ ; SERIAL DECWRITER .ASCIZ /VT05B/ ; VT05B 2400 BAUD SCOPE .ASCIZ /SLAVE/ ; SLAVE STATUS .ASCIZ /PRIV/ ; PRIVILEDGED STATUS .ASCIZ /LOWER/ ; PASS LOWER CASE CHARACTERS .ASCIZ /CRT/ ; CRT RUBOUT SUPPORT .ASCIZ /ESCSEQ/ ; ESCAPE SEQUENCES .ASCIZ /LA180S/ ; LA180S SUPPORT .ASCIZ /HOLD/ ; HOLD SCREEN MODE .ASCIZ /REMOTE/ ; REMOTE (DIAL UP) TERMINAL .BYTE 0 ; END OF KEYWORD TABLE ; ; PARTITION TYPES ; TASK: .ASCIZ /TASK/ ; TASK PARTITION COM: .ASCIZ /COM/ ; COMMON PARTITION DEV: .ASCIZ /DEV/ ; DEVICE REGISTER PARTITION SYS: .ASCIZ /SYS/ ; SYSTEM CONTROLLED PARTITION ; ; ERROR TABLE ; ERRTAB: .BYTE 2. ; SYNTAX ERROR .BYTE 29. ; INVALID KEYWORD .BYTE 41. ; DEVICE NOT IN SYSTEM .BYTE 38. ; DEVICE NOT TERMINAL .BYTE 39. ; ILLEGAL UIC .BYTE 43. ; PRIVILEDGED COMMAND .BYTE 45. ; DEVICE NOT VARIABLE SPEED MPX .BYTE 46. ; ILLEGAL KEYWORD VALUE .BYTE 36. ; NON-EXISTENT MEMORY .BYTE 35. ; SPACE USED .BYTE 47. ; WRITE CHECK NOT SUPPORTED .BYTE 56. ; PSEUDO DEVICE ERROR .BYTE 61. ; INVALID SPEED .BYTE 62. ; FEATURE NOT SUPPORTED .BYTE 63. ; LINE NOT DZ11 .BYTE 6. ; TASK NOT IN SYSTEM ;HJL050 .EVEN ; ; EB031 ; A DEVICE SUPPORTS WRITE CHECK IF IT IS FILES-11, MOUNTABLE, ; EB031 ; AND ITS DEVICE MNEMONIC APPEARS IN THIS TABLE. CHANGES TO THOSE ; EB031 ; CONDITIONS SHOULD ALSO BE REFLECTED IN SDSOV. ; EB031 ; ; EB031 WCKDEV: .ASCII /DB/ ; ; EB031 .ASCII /DF/ ; ; EB031 .ASCII /DK/ ; ; EB031 .ASCII /DM/ ; ; EB031 .ASCII /DP/ ; ; EB031 .ASCII /DR/ ; ; EB031 .ASCII /DS/ ; ; EB031 .WORD 0 ; END OF WRITE CHECK DEVICES TABLE ; EB031 ; ; KEYWORD PROCESSING ROUTINE ADDRESS TABLE ; KEYPRO: .WORD SETMAN ; SET MAIN PARTITION .WORD SETSUB ; SET SUBPARTITION .WORD SETSPD ; SET MPX SPEED .WORD SETUIC ; SET AND DISPLAY UIC .WORD SETBUF ; SET BUFFER SIZE .WORD SETPOL ; SET DYNAMIC POOL LIMIT .WORD SETWCK ; SET WRITE CHECK MODE .WORD SETPUB ; SET PUBLIC DEVICE SYOFST = .-KEYPRO ; OFFSET TO SYSUIC .WORD SETSYS ; SET DEFAULT SYSTEM UIC .WORD SETPKT ; SET MAXIMUN RETAINED I/O PACKETS .IF DF M$$MGE .WORD SETEXT ; MAXIMUM SIZE TASK MAY EXTEND TO .ENDC .WORD SETLOG ; ENABLE/DISABLE LOGONS .IF DF C$$LIS ;HJL050 ;HJL050 .WORD SETCLI ; ;HJL050 .WORD SETMCR ; ;HJL050 ;HJL050 .ENDC ;HJL050 ;HJL050 BOFSET = .-KEYPRO ; OFFSET TO BIT FLAG PROCESSING .WORD SETL3S ; SET U2.L3S LA30S .WORD SETVT5 ; SET U2.VT5 VT05B .WORD SETSLV ; SET U2.SLV SLAVE TERMINAL .WORD SETPRV ; SET U2.PRV PRIVILEGED TERMINAL .WORD SETLWC ; SET U2.LWC PASS LOWER CASE .WORD SETCRT ; SET U2.CRT RUBOUT MODE .WORD SETESC ; SET U2.ESC ESCAPE SEQUENCES .WORD SETL8S ; SET U2.L8S LA180S SUPPORT .WORD SETHLD ; SET U2.HLD - HOLD SCREEN MODE .WORD SETRMT ; SET U2.RMT FOR DZ11 REMOTE LINE ; ; TABLE OF BITS TO SET IN U.CW2 ; BITTAB: .WORD U2.L3S ; .WORD U2.VT5 ; .WORD U2.SLV ; .WORD U2.PRV ; .WORD U2.LWC ; .WORD U2.CRT ; .WORD U2.ESC ; .WORD U2.L8S ; .WORD U2.HLD ; .WORD U2.RMT ; SPEEDS: .WORD 0 ; ADDRESS OF SPEED TABLE ; ; TABLE OF VALID BAUD RATES FOR DH11 ; DHSPD: .ASCIZ /0/ ; .ASCIZ /0/ ; .ASCIZ /0/ ; .ASCIZ /110/ ; .ASCIZ /0/ ; .ASCIZ /150/ ; .ASCIZ /200/ ; .ASCIZ /300/ ; .ASCIZ /600/ ; .ASCIZ /1200/ ; .ASCIZ /1800/ ; .ASCIZ /2400/ ; .ASCIZ /4800/ ; .ASCIZ /9600/ ; .ASCIZ /A/ ; .ASCIZ /B/ ; .BYTE 0 ; END OF TABLE ; ; TABLE OF VALID BAUD RATES FOR DZ11 ; DZSPD: .ASCIZ /0/ ; .ASCIZ /0/ ; .ASCIZ /110/ ; .ASCIZ /0/ ; .ASCIZ /150/ ; .ASCIZ /300/ ; .ASCIZ /600/ ; .ASCIZ /1200/ ; .ASCIZ /1800/ ; .ASCIZ /2000/ ; .ASCIZ /2400/ ; .ASCIZ /3600/ ; .ASCIZ /4800/ ; .ASCIZ /7200/ ; .ASCIZ /9600/ ; .ASCIZ /0/ ; .BYTE 0 ; END OF TABLE HOLDSC: .BYTE 33,110,33,112,33,133,0 ; HOLD SCREEN ESCAPE SEQUENCE .EVEN .SBTTL PARSE COMMAND ;+ ; *** - $SPREP - SET COMMAND PARSER ENTRY POINT ; THIS OVERLAY PARSES THE SET COMMAND WHICH IS USED ; TO SET VARIOUS PARAMETER IN THE RSX11M SYSTEM ; THE COMMAND FORMAT PARSED IS ; ; SET /KEYWORD=VALUE ; ; WHERE KEYWORD=VALUE MAY BE : ; ; UIC=[P,P]:DEV: - SET USER ID CODE DEFAULT FOR ALL COMMANDS FROM ; DEVICE "TI" OR SPECIFIED TERMINAL ; WHERE [P,P] IS THE PROJECT AND PROGRAMMER NUMBERS ; :DEV: - IS OPTIONAL TERMINAL SPECIFICATION AS DEDSCRIBED ; IN /BUF BELOW. IT SPECIFIES THE TERMINAL ; EXPLICITLY WHOSE DEFAULT UIC IS TO BE SET ; IF "=[P,P]" IS NOT GIVEN, THE CURRENT TI UIC IS DISPLAYED ; BUF=DEV:SIZE - SET DEVICE BUFFER SIZE ; WHERE DEV: IS DDNN: ; DD - DEVICE MNEMONIC ; NN - IS UNIT NUMBER ; SIZE - THE BUFFER SIZE IN BYTES ; IF SIZE IS NOT GIVEN, THE CURRENT SIZE IS DISPLAYED ; ; ; LA30S=DEV: SET DEVICE AS LA30S ; VT05B=DEV: SET DEVICE AS A 2400 BAUD VT05 SCOPE ; SLAVE=DEV: SET DEVICE TO SLAVE STATUS ; PRIV=DEV: SET DEVICE TO PRIVILEDGED STATUS ; LOWER=DEV: SET DEVICE TO PASS LOWER CASE CHARACTERS ; CRT=DEV: SET DEVICE AS CRT WITH BACKSPACE ; ESCSEQ=DEV: SET DEVICE AS SENDING ESCAPE SEQUENCES ; LA180S=DEV: SET DEVICE AS AN LA180S ; HOLD=DEV: SET DEVICE TO HOLD SCREEN MODE ; REMOTE=DEV: SET DZ11 LINE AS DIAL UP ; CLI=DEV: SET DEVICE AS DCLS TERMINAL ;HJL050 ; MCR=DEV: SET DEVICE AS MCR TERMINAL ;HJL050 ; ; WHERE DEV: IS SAME FORMAT AS IN BUF ABOVE ; IF "NO" PREFIXES THE ABOVE 3 KEYWORDS, THE STATUS IS ; CLEARED INSTEAD OF BEING SET. E.G. ; NOSLAVE = TT1: (REMOVE SLAVE STATUS FROM TT1:) ; IF "=DEV:" IS NOT GIVEN, THEN ALL TERMINALS WITH ; THE SELECTED CHARACTERISTIC WILL BE LISTED. ; ; ; MAIN=PNAME:BASE:SIZE:TYPE - SET MAIN PARTITION PARAMETERS ; SUB=MNAME:PNAME:BASE:SIZE - SET SUB PARTITION PARAMETERS ; WHERE: ; PNAME - 1-6 CHARACTER PARTITION NAME ; :MNAME - 1-6 CAHRACTER MAIN PARTITION NAME ; :BASE - BASE ADDRESS OF PARTITION IN BYTES/64. ; :SIZE - SIZE OF PARTITION IN BYTES/64. ; :TYPE - "TASK" TASK PARTITION ; "COM" COMMON PARTITION ; "DEV" DEVICE PARTITION ; "SYS" SYSTEM CONTROLLED PARTITION ; IF "NO" PRECEDES EITHER "MAIN" OR "SUB", THE PARTITION ; SPECIFIED WILL BE ELIMINATED FROM THE LIST OF PARTITIONS ; AND NO TASK WILL BE ABLE TO BE INSTALLED IN THE ; SPECIFIED PARTITION. IF TASKS ARE CURRENTLY INSTALLED ; IN THE PARTITION, IT WILL NOT BE ABLE TO BE ELIMINATED. ; E.G. SET /NOMAIN=XYZPAR ; WILL ELIMINATE PARTITION "XYZPAR" ; IF A MAIN PARTITION HAS SUB PARTITIONS AND THE MAIN IS ; ELIMINATED, ALL IT'S SUBPARTITIONS WILL BE ELIMINATED TOO. ; IF A SUB PARTITION IS BEING ELIMINATED, ONLY THE SPECIFIED ; PARTITION WILL BE ELIMINATED. A MAIN PARTITION THAT ; HAS SUBPARTITIONS WITH TASKS INSTALLED WILL NOT BE ; ALLOWED TO BE ELIMINATED UNTIL THOSE TASKS ARE REMOVED. ; ; WHEN DEFINING A PARTITION, THE NAME MUST NOT ALREADY EXIST ; A MAIN PARTITION MAY NOT OVERLAP ANOTHER MAIN PARTITION ; AND A SUBPARTITION MAY NOT OVERLAP ANOTHER SUBPARTITION ; ; IF BASE, SIZE, AND TYPE ARE NOT SPECIFIED, THE CURRENT ; VALUES OF THE PARAMETERS WILL BE DISPLAYED. IN ADDITION ; IF THE PARTITION IN QUESTION IS A MAIN PARTITION, ; THE PARAMETERS OF ALL IT'S SUBPARTITIONS WILL BE DISPLAYED. ; ; FORMAT FOR BASE AND SIZE: ; NNNN - OCTAL WORDS*40 ; NNNN. - DECIMAL WORDS*32. ; NNNK - OCTAL * 2000 WORDS ; NNN.K - DECIMAL * 1024. WORDS ; ; VALID RANGES OF VALUES ARE: ; ; OCTAL 0+2,R1 ; SET COUNT OF WORDS 2$: CLR (R5)+ ; ZERO IT DEC R1 ; DONE? BGT 2$ ; NO, LOOP MOVB (R0)+,R2 ; GET NEXT CHARACTER CALL TERM ; SCAN FOR NEXT FIELD BCS 4$ ; EOL, ERROR CMPB R2,#'/ ; KEYWORD INDICATOR ? BEQ 6$ ; YES 4$: JMP SETER1 ; NO, SYNTAX ERROR ; ; SEARCH KEYWORD TABLE FOR VALID KEYWORD ; 6$: CMPB (R0),#'N ; IS "NO" PREFIX SPECIFIED? BNE 7$ ; NO CMPB 1(R0),#'O ; MAYBE BNE 7$ ; NO CMPB (R0)+,(R0)+ ; YES, SKIP OVER IT INC NEGFLG+$MPARS ; SET NEGATE FUNCTION FLAG 7$: MOV #KEYTAB,R1 ; POINT TO FIRST KEYWORD CLR R4 ; ZERO PROCESSING ROUTINE INDEX MOV #$MPARS+2,R5 ; SET PARAMETER ADDRESS 10$: MOV R4,-2(R5) ; SET FUNCTION CODE CALL .KEYWD ; TEST THIS KEYWORD BCC 30$ ; GOOD KEYWORD 20$: TSTB (R1)+ ; NO MATCH, SCAN TO END OF THIS KEYWORD BNE 20$ ; TST (R4)+ ; BUMP PROCESSING ROUTINE INDEX TSTB (R1) ; END OF KEYWORD TABLE ? BNE 10$ ; NO, TRY NEXT ONE JMP SETER2 ; YES, INVALID KEYWORD ; ; EXECUTE KEYWORD PROCESSING ROUTINE ; 30$: JMP @KEYPRO(R4) ; JUMP TO PROCESSING ROUTINE .SBTTL PARTITION PARAMETERS ; PARSE SET PARTITION PARAMETERS COMMAND ; ; AND PUT PARMS IN $MPARS AS FOLLOWS ; $MPARS+00 - REQUEST TYPE 0-MAIN , 2-SUB PARTITION ; +2, +4 - PARTITION NAME IN RAD50 ; +6 - BASE ADDRESS IN 32 WORD BLOCKS ; +10 - SIZE IN 32 WORD BLOCKS ; +12 - PARTITION TYPE, 0=TASK, 1=COMMON ; +14, +16 - MAIN PARTITION NAME ; +20 - UNDEFINED ; +22 - NEGATE FLAG SET TO 1 IF "NO" PRECEDES ; "MAIN" OR "SUB" ; SETSUB: ; SUB PARTITON SETMAN: ; MAIN PARTITION BVS 35$ ; OVERFLOW MEANS NO EQUALS SEEN, ERROR! MOV R5,R3 ; GET POINTER TO AREA FOR PARTITION NAME CALL PNAME ; GET PARTITION NAME MOV (R5),12(R5) ; SET IT IN MAIN NAME AREA MOV 2(R5),14(R5) ; TST (R5) ; IS PARTITION NAME SPECIFIED BEQ 35$ ; NO, SYNTAX ERROR TST $MPARS ; IS /SUB SPECIFIED ? BEQ 12$ ; NO CALL TERM ; GET NEXT NON-BLANK BCS 35$ ; SYNTAX ERROR CMPB R2,#': ; GOOD TERMINATOR? BNE 35$ ; NO, SYNTAX ERROR CALL PNAME ; GET SUB PARTITION NAME TST (R3) ; DID WE GET A NAME? BEQ 35$ ; NO, SYNTAX ERROR 12$: CALL TERM ; GET NEXT NON-BLANK BCC 15$ ; NO EOL TST NEGFLG+$MPARS ; ELIMINATE PARTITION? BEQ 13$ ; NO MOV $MUCB,R1 ; YES--GET UCB ADDRESS ;BLS036 BIT #U2.PRV,U.CW2(R1) ; MUST BE PRIV TO ELIMINATE PARTITION ;BLS036 BEQ SETER7 ; IF EQ ERROR ;BLS036 JMP SET ; YES, GO DO IT 13$: JMP DISPLY ; EOL, GO DISPLAY PARTITION PARMS 15$: CMPB R2,#': ; TERMINATOR FOUND ? BNE 35$ ; NO, SYNTAX ERROR ; ; GET PARTITION BASE ; MOV $MUCB,R1 ; POINT TO UCB BIT #U2.PRV,U.CW2(R1) ; IS THIS PRIVILEDGED TERMINAL ? BEQ SETER7 ; NO, ERROR CMP (R5)+,(R5)+ ; ADVANCE PAST PARTITION NAME CALL BYTES ; GET BASE ADDRESS BCS SETER1 ; SYNTAX ERROR MOV R1,(R5)+ ; STORE BASE ADDRESS BEQ SETER1 ; ZERO IS AN ERROR 30$: CALL TERM ; GET NEXT NON-BLANK BCS SETER1 ; EOL IS SYNTAX ERROR CMPB R2,#': ; COLON? BEQ 40$ ; YES 35$: BR SETER1 ; NO, SYNTAX ERROR ; ; GET SIZE ; 40$: CALL BYTES ; GET SIZE BCS SETER1 ; SYNTAX ERROR MOV R1,(R5)+ ; STORE SIZE BEQ SETER1 ; ZERO, ERROR ; ; GET PARTITION TYPE ; TST $MPARS ; /SUB SPECIFIED? BNE 62$ ; YES CALL TERM ; GET NEXT NON-BLANK BCS SETER1 ; EOL IS SYNTAX ERROR 45$: CMPB R2,#': ; COLON IS NEEDED BNE SETER1 ; SYNTAX ERROR MOV #TASK,R2 ; POINT TO "TASK" MOV R0,$MPARS+20 ; SAVE BUFFER POINTER CLR (R5) ; SET TASK PARTITION TYPE CALL COMPAR ; COMPARE TYPE BCC 60$ ; IT'S TASK INC (R5) ; SET COMMON PARTITION TYPE MOV #COM,R2 ; POINT "COM" MOV $MPARS+20,R0 ; GET BUFFER POINTER CALL COMPAR ; COMPARE TYPE BCC 60$ ; ITS COMMON INC (R5) ; SET DEVICE PARTITION MOV #DEV,R2 ; POINT TO "DEV" MOV $MPARS+20,R0 ; POINT TO BUFFER CALL COMPAR ; COMPARE TYPE .IF DF M$$MGE BCC 60$ ; IT'S DEVICE PARTITION INC (R5) ; SET SYSTEM CONTROLLED PARTITION MOV #SYS,R2 ; POINT TO "SYS" MOV $MPARS+20,R0 ; GET BUFFER POINTER CALL COMPAR ; COMPARE TYPE .ENDC BCS SETER1 ; SYNTAX ERROR 60$: MOVB (R0)+,R2 ; GET NEXT CHARACTER 62$: CALL TERM ; GET NEXT NON-BLANK BCC SETER1 ; SHOULD BE EOL, OTHER IS ERROR 65$: JMP SET ; GO CALL IN EXECUTOR OVERLAY .SBTTL ERROR PROCESSING SETE17: INC $MERRN ; 16 - TASK NOT IN SYSTEM ;HJL050 SETE16: INC $MERRN ; 15 - LINE NOT DZ11 SETE15: INC $MERRN ; 14 - FEATURE NOT SUPPORTED SETE14: INC $MERRN ; 13 - INVALID SPEED SETE13: INC $MERRN ; 12 - PSEUDO DEVICE ERROR SETE12: INC $MERRN ; 11 - WRITE CHECK NOT SUPPORTED SETE11: INC $MERRN ; 10 - SPACE USED SETE10: INC $MERRN ; 9 - NON-EXISTENT MEMORY SETER9: INC $MERRN ; 8 - ILLEGAL KEYWORD VALUE SETER8: INC $MERRN ; 7 - DEVICE NOT VARIABLE SPEED MPX SETER7: INC $MERRN ; 6 - PRIVILEDGED COMMAND SETER6: INC $MERRN ; 5 - ILLEGAL UIC SETER5: INC $MERRN ; 4 - DEVICE NOT TERMINAL SETER3: INC $MERRN ; 3 - DEVICE NOT IN SYSTEM SETER2: INC $MERRN ; 2 - INVALID KEYWORD SETER1: MOV $MERRN,R0 ; 1 - SYNTAX ERROR MOVB ERRTAB(R0),$MERRN ; SET ERROR CODE JMP $MERLD ; BRING ERROR OVERLAY .SBTTL UIC AND SYSUIC PROCESSOR SETSYS: SETUIC: BVS 40$ ; NO EQUALS SIGN MEANS DISPLAY CURRENT VALUE TST $MPARS+NEGFLG ; NEGATE FLAG ON? BNE SETER1 ; YES, SYNTAX ERROR MOVB (R0)+,R2 ; GET NEXT CHARACTER CALL TERM ; GET NEXT NON-BLANK CHARACTER BCS SETER1 ; SYNTAX ERROR, EOL CMPB R2,#'[ ; BRACKET ? BEQ 2$ ; YES DEC R0 ; NO, BACK UP POINTER BR 5$ ; GO GET UCB ADDRESS 2$: CALL $GTNUM ; CONVERT GROUP CODE TO BINARY MOVB R1,1(R5) ; AND STORE IT BEQ SETER6 ; INVALID UIC CMPB R2,#', ; COMMA NEXT ? BNE SETER1 ; NO, SYNTAX ERROR CALL $GTNUM ; CONVERT PROGRAMER CODE MOVB R1,(R5) ; AND STORE IT BEQ SETER6 ; INVALID UIC CMPB R2,#'] ; BRACKET NEXT ? BNE SETER1 ; NO,SYNTAX ERROR MOVB (R0)+,R2 ; GET NEXT NON-BLANK CMP $MPARS,#SYOFST ; SET SYSTEM DEFAULT UIC? BNE 4$ ; NO CALL TERM ; YES, GET TERMINATOR BCC SETER1 ; SYNTAX ERROR MOV $MUCB,R0 ; GET OUR UCB ADDRESS BIT #U2.PRV,U.CW2(R0) ; IS IT PRIVILEGED? BEQ SETER7 ; NO, ERROR MOV (R5),$SYUIC ; YES, SET SYSTEM DEFAULT UIC JMP SETCM1 ; 4$: CALL TERM ; GET NEXT NON-BLANK CHARACTER BCS 20$ ; EOL CMPB R2,#': ; TERMINAL SPECIFIER NEXT? BNE SETER1 ; NO, SYNTAX ERROR 5$: MOV #$MPARS+4,R3 ; SET POINTER TO PARAM AREA CALL GETDEV ; DEVICE UCB ADDRESS 10$: MOVB (R0)+,R2 ; GET TERMINATOR MOV $MUCB,R0 ; GET TI UCB ADDRESS BIT #U2.PRV,U.CW2(R0) ; IS TI PRIVILEGED? BEQ SETER7 ; NO, ERROR BR 30$ ; 20$: MOV $MUCB,R0 ; GET "TI" UCB ADDRESS MOV R0,R1 ; COPY FOR UCB TO SET UIC FOR 30$: MOV U.RED(R1),R1 ; FOLLOW REDIRECT POINTER CMP R1,U.RED(R1) ; END OF LIST? BNE 30$ ; NO, LOOP 35$: BIT #DV.TTY,U.CW1(R1) ; YES, IS DEVICE A TERMINAL? BEQ SETER5 ; NO, ERROR MOV R1,2(R5) ; YES, SAVE UCB ADDRESS TST (R5) ; UIC SPECIFIED? BEQ 40$ ; NO, DISPLAY IT FOR THIS DEVICE CMP R1,R0 ; CHANGING TI'S UIC? BEQ 36$ ; YES BIT #U2.PRV,U.CW2(R0) ; NO, PRIVILEGED TERMINAL? BEQ SETER7 ; NO, PRIV. ERROR BR 38$ ; YES, OKAY 36$: BIT #FE.MUP,$FMASK ; MULTI-USER PROTECTION SUPPORT? BEQ 38$ ; NO BIT #U2.PRV,U.CW2(R1) ; YES, PRIVILEGED USER? BEQ 38$ ; NO MOV (R5),U.LUIC(R1) ; YES, SET LOGIN UIC 38$: MOV (R5),U.UIC(R1) ; SET DEFAULT UIC JMP $MCR ; 40$: JMP DSPLY ; ;HJL055 .SBTTL BUF PROCESSOR SETBUF: BVC 20$ ; IS THERE AN EQUALS SIGN? 10$: JMP SETER1 ; NO, SYNTAX ERROR 20$: TST $MPARS+NEGFLG ; NEGATE FLAG ON? BNE 10$ ; YES, SYNTAX ERROR MOV R5,R3 ; SET PARAM ADDRESS CALL GETDEV ; PARSE DEVICE NAME AND GET UCB ADDRESS BIT #DV.PSE,U.CW1(R1) ; IS IT A PSEUDO DEVICE? BEQ 50$ ; NO 40$: MOV U.RED(R1),R1 ; YES, FOLLOW REDIRECT POINTER TO END CMP R1,U.RED(R1) ; OF LIST BNE 40$ ; 50$: MOV R1,$MPARS+6 ; SAVE UCB ADDRESS MOVB (R0)+,R2 ; GET NEXT CHARACTER CALL TERM ; SEARCH FOR NEXT NON-BLANK BCS SETCM2 ; EOL, DISPLAY BUFFER SIZE MOV $MUCB,R3 ; GET REQUESTING TERMINAL UCB ADDRESS BIT #U2.PRV,U.CW2(R3) ; IS IT A PRIVILEDGED TERMINAL ? BNE 80$ ; YES BIT #FE.MUP,$FMASK ; NO, MULTI-USER PROTECTION SUPPORTED? BNE 70$ ; YES 60$: JMP SETER7 ; NO, ERROR 70$: CMP R3,$MPARS+6 ; IS THIS TI:? BNE 60$ ; NO, ERROR 80$: DEC R0 ; POINT TO FIRST CHARACTER CALL $GTNUM ; GET NUMBER MOV $MPARS+6,R3 ; GET UCB ADDRESS BIT #DV.TTY,U.CW1(R3) ; IS THIS A TERMINAL? BEQ 90$ ; NO CMP R1,#2. ; YES, IS IT < 2? BLT 10$ ; YES, ERROR CMP R1,#255. ; NO, IS IT > 255.? BGT 10$ ; YES, ERROR 90$: MOV R1,U.CW4(R3) ; NO, SET NEW BUFFER SIZE BR SETCM1 ; .SBTTL STATUS FLAG SET ROUTINE SETL3S: SETVT5: SETSLV: SETPRV: SETLWC: SETCRT: SETESC: SETL8S: SETHLD: SETRMT: BVS SETCM2 ; SKIP IF NO EQUALS SIGN MOV R5,R3 ; SET PARM ADDRESS CALL GETDEV ; PARSE DEVICE NAME AND GET UCB ADDRESS 5$: MOV R1,R5 ; COPY UCB ADDRESS MOVB (R0)+,R2 ; GET NEXT CHAR CALL TERM ; GET NEXT NON-BLANK BCC SETCM5 ; ERROR MOV $MUCB,R3 ; GET "TI" UCB ADDRESS BIT #U2.PRV,U.CW2(R3) ; IS THIS A PRIVILEDGED TERMINAL? BNE 10$ ; YES BIT BITTAB-BOFSET(R4),#U2.PRV ; SETTING PRIV? BNE SETCM3 ; YES, ERROR CMP R3,R5 ; NO, ALTERING TI'S CHARACTERISTICS? BNE SETCM3 ; NO, ERROR 10$: BIT #DV.TTY,U.CW1(R5) ; IS THIS A TERMINAL UCB ? BEQ SETCM4 ; NO, ERROR BIT BITTAB-BOFSET(R4),#U2.RMT ; IS THIS SET REMOTE? BEQ 15$ ; NO BIT #U2.DZ1,U.CW2(R5) ; YES, IS LINE DZ11? BEQ SETCM7 ; NO, ERROR 15$: TST NEGFLG+$MPARS ; CLEAR THE REQUESTED FLAG? BEQ 20$ ; NO BIC BITTAB-BOFSET(R4),U.CW2(R5) ; YES, DO IT BR 30$ ; 20$: BIS BITTAB-BOFSET(R4),U.CW2(R5) ; NO, SET IT 30$: CMP BITTAB-BOFSET(R4),#U2.HLD ; HOLD SCREEN MODE? BNE SETCM1 ; NO, SKIP CALL DPBSET ; YES, SET UP DPB TST $MPARS+NEGFLG ; SET /NOHOLD? BNE 40$ ; YES MOV #HOLDSC,R1 ; NO, GET HOLD SCREEN ESCAPE SEQ. 35$: MOVB (R1)+,(R0)+ ; MOVE NEXT CHARACTER BNE 35$ ; DEC R0 ; CORRECT FOR ZERO BYTE BR 50$ ; 40$: MOVB #33,(R0)+ ; MOVE IN ESCAPE MOVB #'\,(R0)+ ; DISABLE HOLD SCREEN MODE 50$: MOV #IO.WAL,$MDPB+2 ; SET WRITE PASS ALL MOV $TKTCB,R1 ; GET OUR TCB ADDRESS MOV R5,T.UCB(R1) ; SET TI TO REQUESTED TERMINAL CALL WRITE ; WRITE OUT ESCAPE SEQUENCE MOV #IO.WVB,$MDPB+2 ; RESET FUNCTION CODE MOV $MUCB,T.UCB(R1) ; RESET TI MOV #40,$MDPB+20 ; RESET CARRIAGE CONTROL SETCM1: JMP $MCR ; CALL IN MCR DISPATCHER SETCM2: JMP DSPLY ; ;HJL055 SETCM3: JMP SETER7 ; PRIVILEGED TERMINAL ;**-1 SETCM4: JMP SETER5 ; NOT A TERMINAL SETCM5: JMP SETER1 ; SYNTAX ERROR SETCM6: JMP SETE14 ; INVALID SPEED SETCM7: JMP SETE16 ; LINE NOT DZ11 .SBTTL SPEED PROCESSOR SETSPD: BVS SETCM5 ; ERROR IF NO EQUALS TST $MPARS+NEGFLG ; NEGATE FLAG ON? BNE SETCM5 ; YES, SYNTAX ERROR MOV R5,R3 ; POINT TO PARAM AREA CALL GETDEV ; PARSE DEVICE NAME AND GET UCB ADDRESS 30$: MOV U.RED(R1),R1 ; FOLLOW REDIRECT POINTER CMP R1,U.RED(R1) ; END OF LIST? BNE 30$ ; NO, CONTINUE DOWN LIST MOV R1,$MPARS+6 ; SAVE UCB ADDRESS BIT #DV.TTY,U.CW1(R1) ; IS THIS A TERMINAL? BEQ SETCM4 ; NO, ERROR 40$: BIT #U2.DH1,U.CW2(R1) ; IS THIS A MULTIPLEXOR BEQ 55$ ; NO, ERROR BIT #U2.DJ1,U.CW2(R1) ; YES, IS IT DJ11? BNE 55$ ; YES, ERROR MOV #DHSPD,SPEEDS ; SET SPEED TABLE FOR DH11 BIT #U2.DZ1,U.CW2(R1) ; IS THIS DZ11? BEQ 45$ ; NO MOV #DZSPD,SPEEDS ; YES, SET SPEED TABLE FOR DZ11 45$: MOVB (R0)+,R2 ; GET NEXT CALL TERM ; NON-BLANK CHARACTER BCS SETCM2 ; EOL, DIPLAY SPEEDS MOV $MUCB,R3 ; GET TI: UCB ADDRESS BIT #U2.PRV,U.CW2(R3) ; IS TI PRIVILEGED? BNE 50$ ; YES CMP R3,$MPARS+6 ; NO, IS TI THE ONE WE'RE CHANGING? BNE SETCM3 ; NO, PRIVILEGED COMMAND 50$: DEC R0 ; POINT TO FIRST CHARACTER OF SPEED CALL SPDTST ; SEARCH FOR SPEED MATCH BCC 60$ ; FOUND IT 53$: JMP SETE14 ; INVALID SPEED 55$: JMP SETER8 ; DEVICE NOT VARIABLE SPEED MPX 60$: MOV R3,$MPARS+10 ; SAVE RECIEVER SPEED MOVB (R0)+,R2 ; GET NEXT CALL TERM ; NON-BLANK BCS SETCM5 ; SYNTAX ERROR CMPB R2,#': ; GOOD TERMINATOR? BNE SETCM5 ; NO, SYNTAX ERROR CALL SPDTST ; GET TRANSMIT SPEED BCS 53$ ; ERROR MOV R3,$MPARS+12 ; SAVE TRANSMIT SPEED INDEX MOVB (R0)+,R2 ; GET NEXT NON-BLANK CALL TERM ; CHARACTER BCC SETCM5 ; SYNTAX ERROR MOV $MPARS+6,R1 ; GET UCB ADDRESS BIT #U2.DZ1,U.CW2(R1) ; IS IT DZ11? BEQ 70$ ; NO CMP $MPARS+10,$MPARS+12 ; IS REC SPEED = SEND SPEED? BNE SETCM6 ; NO, ERROR MUST BE SAME FOR DZ11 70$: JMP SET ; .SBTTL SET POOL SPACE TOP LIMIT SETPOL: BVS SETCM2 ; NO EQUALS SIGN MEANS DISPLAY TST $MPARS+NEGFLG ; IS NEGATE FLAG ON? BNE 5$ ; YES, SYNTAX ERROR CALL $GTNUM ; GET LIMIT IN 32 WORD BLOCKS MOV R1,R3 ; SAVE LIMIT CALL TERM ; GET TERMINATOR BCS 10$ ; EOL, IS GOOD! 5$: JMP SETER1 ; ANY THING ELSE IS SYNTAX ERROR 10$: MOV $EXSIZ,R2 ; GET EXEC SIZE ADD #77,R2 ; ROUND UP TO NEXT 32. WORD BLOCK MOV R3,R1 ; COPY TOP LIMIT ASR R2 ; CONVERT EXEC SIZE TO 32 WORD BLOCKS BIC #100000,R2 ; ASL R3 ; CONVERT TOP LIMIT TO BYTE ADDRESS MOV #5.,R0 ; 20$: ASR R2 ; ASL R3 ; DEC R0 ; BNE 20$ ; CMP R1,$SYSIZ ; IS TOP ABOVE REAL MEMORY? BHIS 70$ ; YES, NON-EXISTENT MEMORY CMP R3,$EXSIZ ; NO, IS IT ABOVE EXEC? BLOS 80$ ; NO, SPACE USED CMP R1,#1000 ; SPACE ABOVE 16K? BLOS 25$ ; NO BIT #FE.EXV,$FMASK ; YES, EXTENDED EXEC SUPPORT? BEQ 80$ ; NO CMP R1,#1200 ; YES, ABOVE 20K? BHI 80$ ; YES, ERROR 25$: MOV $PARHD,R0 ; GET ADDRESS OF FIRST PARTITION 30$: .IF DF M$$MGE .IFF CMP P.REL(R0),$EXSIZ ; IS PARTITION ABOVE EXEC? .IFT CMP P.REL(R0),R2 ; .IFTF BHIS 40$ ; YES MOV P.LNK(R0),R0 ; NO, POINT TO NEXT PCB BNE 30$ ; LOOP BR 50$ ; END OF PCBS 40$: .IFF CMP R3,P.REL(R0) ; IS NEW TOP ABOVE NEXT PARTITION? .IFT CMP R1,P.REL(R0) ; .ENDC BHI 80$ ; YES, SPACE USED 50$: SUB $EXSIZ,R3 ; COMPUTE SPACE AVAILABLE ASR R3 ; ROUND OFF TO NEAREST MULTIPLE OF 4 BYTES ASR R3 ; ASL R3 ; ASL R3 ; BEQ 65$ ; ZERO CALL $SWSTK,65$ ; SWITCH TO SYSTEM STATE MOV $EXSIZ,R0 ; GET TOP OF EXEC MOV R3,R1 ; GET ADDITIONAL SPACE TO PUT IN POOL ADD R3,$EXSIZ ; UPDATE TOP OF POOL CALLR $DEACB ; RELEASE THE SPACE INTO THE POOL 65$: JMP $MCR ; 70$: JMP SETE10 ; NON-EXISTENT MEMORY 80$: JMP SETE11 ; SPACED USED .SBTTL WRITE CHECK PROCESSOR SETWCK: BVS 50$ ; NO EQUALS MEANS DISPLAY WRITE CHECK DEVICES MOV R5,R3 ; SET PARAMETER ADDRESS CALL GETDEV ; PARSE DEVICE NAME AND GET UCB ADDRESS 20$: MOV $MUCB,R3 ; GET REQUESTING TERMINAL UCB ADDRESS BIT #U2.PRV,U.CW2(R3) ; IS IT A PRIVILEGED TERMINAL? BEQ 70$ ; NO BIT #DV.F11,U.CW1(R1) ; IS IT A FILES -11 DEVICE? BEQ 60$ ; NO BIT #DV.MNT,U.CW1(R1) ; YES, IS IT MOUNTABLE? BEQ 60$ ; NO MOV #WCKDEV,R3 ; POINT AT WRITE CHECK DEVICE TABLE ; EB031 23$: TST (R3) ; ANY MORE MNEMONICS TO CHECK ; EB031 BEQ 60$ ; NO, DEVICE DOESN'T SUPPORT WRITE CHECK ; EB031 CMP (R3)+,D.NAM(R2) ; CAN DEVICE SUPPORT WRITE CHECK? ; EB031 BNE 23$ ; MAYBE ; EB031 CALL $SWSTK,45$ ; YES, SWITCH TO SYSTEM STATE ; EB031 TST $MPARS+NEGFLG ; DISABLE WRITE CHECK MODE? ;**-9 BNE 30$ ; YES BISB #US.WCK,U.STS(R1) ; NO, ENABLE WRITE CHECK MODE BR 40$ ; 30$: BICB #US.WCK,U.STS(R1) ; DISABLE WRITE CHECK MODE 40$: RETURN ; RETURN TO USER STATE 45$: JMP $MCR ; BRING IN DISPATCHER 50$: JMP DSPLY ; ;HJL055 60$: JMP SETE12 ; WRITE CHECK NOT SUPPORTED ;**-1 70$: JMP SETER7 ; PRIVILEGED COMMAND .SBTTL SET PUBLIC DEVICE SETPUB: BVC 10$ ; EQUALS SEEN BIT #FE.MUP,$FMASK ; MULTI-USER PROTECTION SUPPORT? BNE 5$ ; YES 3$: JMP SETER2 ; NO, ILLEGAL KEYWORD 5$: JMP DSPLY ; ;HJL055 10$: BIT #FE.MUP,$FMASK ; MULTI-USER PROTECTION SUPPORT? ;**-1 BEQ 3$ ; NO MOV R5,R3 ; GET PARAMETER AREA ADDRESS CALL GETDEV ; PARSE DEVICE NAME, GET UCB ADDRESS BIT #DV.PSE,U.CW1(R1) ; PSEUDO DEVICE? BEQ 15$ ; NO ; EB028 13$: MOV U.RED(R1),R1 ; CHASE REDIRECT POINTER TO ; EB028 CMP R1,U.RED(R1) ; THE REAL DEVICE ; EB028 BNE 13$ ; ; EB028 15$: ; REF LABEL ; EB028 MOV $MUCB,R3 ; GET TI UCB ADDRESS ;**-1 BIT #U2.PRV,U.CW2(R3) ; PRIVILEGED TERMINAL? BNE 20$ ; YES CMP U.OWN(R1),R3 ; NO, ALLOCATED TO THIS TI? BNE 50$ ; NO 20$: TST $MPARS+NEGFLG ; YES, SET PRIVATE? BNE 30$ ; YES BISB #US.PUB,U.ST2(R1) ; NO, SET DEVICE AS PUBLIC BR 40$ ; 30$: BICB #US.PUB,U.ST2(R1) ; SET DEVICE AS PRIVATE 40$: JMP $MCR ; BRING IN DISPATCHER 50$: JMP SETER7 ; PRIVILEGED COMMAND .SBTTL MAXIMUM I/O PACKET PROCESSOR .ENABL LSB SETPKT: BVS 45$ ; NO EQUALS MEANS DISPLAY ;HJL050 BIT #FE.PKT,$FMASK ; IS MAXPKT SUPPORTED? ;**-1 BEQ 40$ ; NO TST $MPARS+NEGFLG ; NEGATE FLAG SET? BNE 10$ ; YES, SYNTAX ERROR CALL $GTNUM ; GET NUMBER OF PACKETS TO KEEP CMP R1,#15. ; IS TOO BIG? BHI 20$ ; YES MOV R1,R3 ; COPY IT CALL TERM ; GET NEXT CHARACTER BCC 10$ ; ANYTHING BUT EOL IS ERROR MOV $MUCB,R0 ; GET OUR UCB ADDRESS BIT #U2.PRV,U.CW2(R0) ; IS IT PRIVILEGED? BEQ 30$ ; NO, ERROR MOVB R3,$PKMAX ; SET MAXIMUM I/O PACKETS TO RETAIN 5$: JMP $MCR ; 10$: JMP SETER1 ; SYNTAX ERROR 20$: JMP SETER9 ; INVALID KEYWORD VALUE 30$: JMP SETER7 ; PRIVILEGED COMMAND 40$: JMP SETE15 ; FEATURE NOT SUPPORTED 45$: JMP DSPLY ; DISPLAY ;HJL050 .SBTTL SET MAXIMUM SIZE A TASK MAY EXTEND TO .IF DF M$$MGE SETEXT: BVS DSPLY ; ;HJL055 BIT #FE.EXP,$FMASK ; IS MAXEXT SUPPORTED? ;**-1 BEQ 40$ ; NO TST $MPARS+NEGFLG ; YES, PREFIXED BY NO? BNE 10$ ; YES, SYNTAX ERROR CALL BYTES ; CONVERT SIZE TO 32WD BLOCKS MOV R1,R3 ; COPY IT CALL TERM ; GET TERMINATOR BCC 10$ ; EOL MUST BE NEXT MOV $MUCB,R0 ; GET TI UCB ADDRESS BIT #U2.PRV,U.CW2(R0) ; PRIVILEGED TERMINAL? BEQ 30$ ; NO, ERROR BIT #FE.PLA,$FMASK ; YES, PLAS SUPPORTED? BNE 50$ ; YES CMP R3,#1777 ; NO, VALID TASK SIZE? (<32K) BGT 20$ ; NO, ERROR 50$: MOV R3,$MXEXT ; YES, SET MAXIMUM SIZE TASK MAY EXTEND TO BR 5$ ; .ENDC .SBTTL ENABLE/DISABLE LOGONS SETLOG: BVC 10$ ; EQUALS IS A SYNTAX ERROR MOV $MUCB,R1 ; GET OUR UCB ADDRESS BIT #U2.PRV,U.CW2(R1) ; IS IT PRIVILEGED? BEQ 30$ ; NO, ERROR BIT #FE.MUP,$FMASK ; MULTI-USER PROTECTION SUPPORTED? BEQ 40$ ; NO, FEATURE NOT SUPPORTED TST $MPARS+NEGFLG ; SET /NOLOGON? BNE 60$ ; YES BIC #FE.NLG,$FMASK ; NO, ENABLE LOGONS BR 5$ ; 60$: BIS #FE.NLG,$FMASK ; DISABLE LOGONS BR 5$ ; .SBTTL SET TERMINAL COMMAND PROCESSOR ;HJL050 .IF DF C$$LIS ;HJL050 ;HJL050 SETCLI: BVS DISPLY ; NO EQUALS ;HJL050 MOV #$CLIPT,R4 ; SET TO DCLS ;HJL050 BR 70$ ; ;HJL050 SETMCR: BVS DISPLY ; NO EQUALS MEANS DISPLAY ;HJL050 MOV #$MCRPT,R4 ; SET TO MCR ;HJL050 70$: TST $MPARS+NEGFLG ; PREFIXED WITH NO? ;HJL050 BNE 20$ ; YES, SYNTAX ERROR ;HJL050 BIT #FE.MUP,$FMASK ; NO, IS OPTION SUPPORTED? ;HJL050 BEQ 40$ ; NO, FEATURE NOT SUPPORTED ;HJL050 MOV R5,R3 ; COPY PARAM ADDRESS ;HJL050 CALL GETDEV ; GET DEVICE ADDRESS ;HJL050 MOV R1,R5 ; SAVE IT ;HJL050 MOVB (R0)+,R2 ; GET NEXT CHARACTER ;HJL050 CALL TERM ; GET NEXT NON-BLANK ;HJL050 BCC 10$ ; SYNTAX ERROR ;HJL050 MOV $MUCB,R3 ; GET OUR UCB ADDRESS ;HJL050 BIT #U2.PRV,U.CW2(R3) ; ARE WE PRIVILEGED? ;HJL050 BNE 80$ ; YES ;HJL050 CMP R3,R5 ; NO, CHANGING OUR OWN TERMINAL? ;HJL050 BNE 30$ ; NO, PRIVILEGED COMMAND ;HJL050 80$: BIT #DV.TTY,U.CW1(R5) ; IS IT A TERMINAL? ;HJL050 BEQ 90$ ; NO, ERROR ;HJL050 TST (R4) ; YES, IS POINTER SET TO NULL? ;HJL050 BEQ 100$ ; YES ;HJL050 MOV R4,U.CLI(R5) ; NO, SET COMMAND PROCESSOR ;HJL050 BR 5$ ; ;HJL050 90$: JMP SETER5 ; DEVICE NOT TERMINAL ;HJL050 100$: JMP SETE17 ; TASK NOT IN SYSTEM ;HJL050 ;HJL050 .ENDC ;HJL050 ;HJL050 .DSABL LSB .SBTTL CALL SET AND DISPLAY OVERLAYS DSPLY: CALL $NNBLK ; GET NEXT NON-BLANK ;HJL055 BCS DISPLY ; EOL IS GOOD ;HJL055 JMP SETER1 ; ANYTHING ELSE IS AN ERROR ;HJL055 DISPLY: MOV #$MCOV,R0 ; SET UP TO CALL IN COMMON OVERLAY JMP $MLDOV ; LOAD IN DISPLAY OVERLAY SET: MOV #$MCMD,R0 ; SET UP TO CALL EXECUTOR JMP $MLDOV ; BRING IN THE OVERLAY .SBTTL SUBROUTINES ;+ ; *** - TERM - SEARCH FOR VALID TERMINATOR ; ; INPUT: ; ; R2 - CURRENT CHARACTER TO BE TESTED ; R0 - BUFFER POINTER TO NEXT CHARACTER ; ; OUTPUT: ; ; R2 - TERMINATING CHAR - NONE SPACE ; R0 - ADDRESS OF TERMINATING CHAR ; CARRY CLEAR ; NO EOL FOUND ( CR OR ESC) ; R1 - COUNT OF SPACES SEEN ; CARRY SET ; EOL FOUND ; ONLY R0 AND R2 ARE USED ; ;- TERM: CLR R1 ; ZERO SPACE COUNT 5$: CMPB R2,#SPA ; NEXT CHAR A SPACE BNE 10$ ; NO MOVB (R0)+,R2 ; GET NEXT CHAR INC R1 ; INCREMENT SPACE COUNT 10$: CMPB R2,#CR ; IS IT CARRIAGE RETURN? BNE 30$ ; NO SEC ; YES, SET FLAG TO INDICATE EOL BR 40$ ; 30$: CLC ; SET NO EOL FLAG 40$: RETURN ; ;+ ; *** - BYTES - CONVERT A NUMBER IN ONE OF THE FOLLOWING FORMATS TO BINARY ; NNNNNN - OCTAL ; NNNNN. - DECIMAL ; NNNK - NNN*2048 ; ; INPUT: ; ; R0 - BUFFER POINTER ; ; OUTPUT: ; ; R0 - UPDATED ; R1 - NUMBER CONVERTED TO BINARY ; R2 - TERMINATING NON-BLANK CHARACTER ; CARRY CLEAR - GOOD NUMBER ; CARRY SET - ERROR ; ;- BYTES: CALL $GTNUM ; GET A NUMBER CMPB R2,#'K ; MULTIPLY BY 1024 WORDS? BNE 5$ ; NO CMP R1,#2048. ; NUMBER TO BIG? BHI 20$ ; YES, ERROR ASL R1 ; MULTIPLY BY 1024./32. ASL R1 ; TO CONVERT TO NUMBER ASL R1 ; OF 32. WORD BLOCKS ASL R1 ; ASL R1 ; MOVB (R0)+,R2 ; GET NEXT CHARACTER 5$: CMPB R2,#SPA ; BNE 10$ ; MOVB (R0)+,R2 ; 10$: CMP R1,#177777 ; IS NUMBER TOO BIG? BHI 20$ ; YES, SET IT AS ERROR CLC ; BR 30$ ; 20$: SEC ; 30$: RETURN ; ;+ ; *** - COMPAR - COMPARE TWO STRINGS ; ; INPUT: ; R0 - BUFFER CONTAINING STRING ; R2 - STRING TO BE COMPARED WITH ; ENDS IN ZERO BYTE ; ; OUTPUT: ; CARRY CLEAR - STRINGS MATCH ; R0 - UPDATED BEYOND LAST CHAR OF STRING ; R2 - POINTS TO END OF STRING (ZER0) ; CARRY SET - NO MATCH ; R0, R2 UNPREDICTABLE ; ;- COMPAR: CMPB (R0)+,(R2)+ ; NEXT CHAR MATCH ? BNE 10$ ; NO TSTB (R2) ; END OF STRING ? BNE COMPAR ; NO, LOOP BR 20$ ; 10$: SEC ; 20$: RETURN ; ;+ ; *** - PNAME - GET PARTITION NAME AND CONVERT TO RAD50 ; ; INPUT: ; R0 - BUFFER POINTER ; R3 - PARAMETER AREA ADDRESS ; ; OUTPUT: ; R0 - UPDATED ; R1 - LAST 3 CHARS FOUND ; R2 - NEXT CHARACTER AFTER NAME ; R3 - UNCHANGED ; ;- PNAME: MOV PC,R1 ; SET TO ALLOW PERIODS CLR 2(R3) ; ZERO SECOND HALF OF PARTITION NAME CALL $CAT5 ; CONVERT TO RAD50 MOV R1,(R3) ; AND STORE FIRST 3 CHARS BCS 10$ ; SKIP IF LESS THAN THREE CHARS CALL $CAT5 ; CONVERT TO RAD50 MOV R1,2(R3) ; AND STORE SECOND 3 CHARS BCS 10$ ; SKIP IF LESS THAN 3 MOVB (R0)+,R2 ; GET NEXT CHARACTER 10$: RETURN ; ;+ ; *** - SPDTST - SEARCH FOR VALID DH11 SPEED ; ; INPUT: ; R0 - POINTER TO SPEED REQUESTED ; SPEEDS - VALID SPEED TABLE ADDRESS ; ; OUTPUT: ; CARRY CLEAR - SPEED FOUND IN TABLE ; R0 - UPDATED BEYOND SPEED ; R2 - ZERO ; R3 - DH11 SPEED CODE ; ; CARRY SET - NO MATCH ; R0, R2 UNPREDICTABLE ; ; REGISTERS USED - R0, R1, R2, R3 ; ;- SPDTST: CLR R3 ; ZERO SPEED CODE (0 BAUD) MOV R0,R1 ; COPY BUFFER POINTER MOV SPEEDS,R2 ; GET SPEED TABLE ADDRESS 10$: MOV R1,R0 ; RESET BUFFER POINTER CALL COMPAR ; STRINGS MATCH? BCC 40$ ; YES 20$: TSTB (R2)+ ; END OF STRING? BNE 20$ ; NO, LOOP TSTB (R2) ; END OF TABLE? BEQ 30$ ; YES INC R3 ; NO, INCREMENT SPEED CODE BR 10$ ; TRY NEXT STRING 30$: SEC ; SET ERROR INDICATOR 40$: RETURN ; ;+ ; *** - GETDEV - GET DEVICE UCB ADDRESS ; ; INPUT: ; R0 - BUFFER POINTER ; ; OUTPUT: ; R0 - UPDATED ; R1 - UCB ADDRESS ; R2 - DCB ADDRESS ; IF ERROR IS DETECTED, CONTROL IS PASSED DIRECTLY TO ERROR ; MESSAGE ROUTINE. ; ;- GETDEV: CALL $FDLOG ; PARSE DEVICE NAME AND LOCATE UCB ADDRESS BCC 20$ ; GOT IT TST (SP)+ ; POP RETURN ADDRESS TST R3 ; SYNTAX ERROR? BEQ 10$ ; YES JMP SETER3 ; NO, DEVICE NOT IN SYSTEM 10$: JMP SETER1 ; SYNTAX ERROR 20$: CMP D.NAM(R2),#"TI ; IS THIS "TI" PSUEDO DEVICE? BNE 30$ ; NO MOV $MUCB,R1 ; YES, SET REAL TI UCB 30$: RETURN ; ;+ ; *** - DPBSET - SET UP $MDPB FOR WRITE TO "TI" USING ; INPUT BUFFER AS OUTPUT BUFFER ; ; INPUT: ; NONE ; ; OUTPUT: ; R0 - BUFFER ADDRESS ; ;- DPBSET: MOV #$MDPB+4,R1 ; GET MDPB ADDRESS MOV $MBUF,R0 ; SET BUFFER ADDRESS MOV #LUN1,(R1)+ ; SET LOGICAL UNIT TO "TI" MOV #EFN1,(R1)+ ; SET EVENT FLAG CLR (R1)+ ; ZERO I/STATUS CLR (R1)+ ; AND AST ADDRESSES MOV R0,(R1)+ ; SET BUFFER ADDRESS CLR (R1)+ ; ZERO BUFFER LENGTH RETURN ; ;+ ; *** - WRITE - WRITE OUT A LINE TO "TI" ; THIS ROUTINE COMPUTES THE LENGTH OF A BUFFER ; SETS IT IN $MDPB+16 AND ISSUES THE QIO AND WAIT ; ; INPUT: ; R0 - END OF BUFFER ; $MDPB - QIO DPB SET UP ; $MDPB+14 - ADDRESS OF START OF BUFFER ; ; OUTPUT: ; $MDPB+16 - BUFFER LENGTH ;- WRITE: SUB $MDPB+14,R0 ; COMPUTE LENGTH OF BUFFER MOV R0,$MDPB+16 ; SET BUFFER LENGTH DIR$ #$MDPB ; ISSUE QIO BCS 10$ ; ERROR WTSE$S #EFN1 ; ISSUE WAIT 10$: RETURN ; EXIT .END