.TITLE XDTROT - LOADABLE XDT .SBTTL XDTROT - TITLE PAGE .IDENT /V01.00/ ; ; ************************************************************************ ; * ; THIS PROGRAM IS PROVIDED ON AN "AS IS" BASIS ONLY. DIGITAL EQUIPMENT * ; COMPUTER USER'S SOCIETY, DIGITAL EQUIPMENT CORPORATION, MONSANTO, AND * ; THE AUTHOR DISCLAIM ALL WARRANTIES ON THE PROGRAM, INCLUDING WITHOUT * ; LIMITATION, ALL IMPLIED WARRANTIES OF MERCHANTABLITY AND FITNESS. * ; * ; FULL PERMISSION AND CONSENT IS HEREBY GIVEN TO DECUS AND TO THE DECUS * ; SPECIAL INTEREST GROUPS TO REPRODUCE, DISTRIBUTE, AND PUBLISH AND * ; PERMIT OTHERS TO REPRODUCE IN WHOLE OR IN PART, IN ANY FORM AND * ; WITHOUT RESTRICTION, THIS PROGRAM AND ANY INFORMATION RELATING TO IT. * ; * ; ************************************************************************ ; ; THIS TASK LOADS AND UNLOADS XDT INTO A RSX-11M PARTITION. ; ; VERSION: 01.00 ; ; AUTHOR: R.W. STAMERJOHN MAPC 10-MAR-80 ; ; MODIFICATION HISTORY: ; ; V01.00 RWS 10-MAR-80 INITIAL VERSION .IF NDF M$$MGE .ERROR ;NOT SUPPORTED ON UNMAPPED SYSTEMS; .ENDC .SBTTL XDTROT - DECLARATIONS .DSABL GBL ; ; MACRO LIBRARY CALLS: ; ; SYMBOLICS DEFINITIONS (EXEMC.MLB). ; .MCALL HDRDF$ ;DEFINE TASK HEADER HDRDF$ .MCALL SCBDF$ ;DEFINE SCB OFFSETS SCBDF$ .MCALL TCBDF$ ;DEFINE TCB OFFSETS TCBDF$ .MCALL UCBDF$ ;DEFINE UCB OFFSETS UCBDF$ ; ; DIRECTIVE MACROS (RSXMAC.SML). ; .MCALL DIR$ ;ISSUE DIRECTIVE .MCALL ALUN$ ;ASSIGN LUN .MCALL GMCR$ ;GET MCR COMMAND LINE .MCALL EXIT$S ;EXIT TASK .MCALL QIOW$ ;ISSUE I/O REQUEST .MCALL SVTK$ ;SETUP SST VECTOR TABLE ; ; OTHER MACROS (RSXMAC.SML). ; .MCALL CALL,CALLR,RETURN ;SUBROUTINE MACROS .MCALL ISTAT$,STATE$,TRAN$ ;TPARS STATE TABLE MACROS ; ; GLOBAL DECLARATIONS: ; .GLOBL XDTROT ;TASK ENTRY ; ; GLOBAL REFERENCES: ; ; XDT REFERENCES ; .GLOBL XDTBEG ;START OF XDT CODE .GLOBL XDTLOA ;LOAD XDT ROUTINE .GLOBL XDTUNL ;UNLOAD XDT ROUTINE ; ; SYSTEM LIBRARY ROUTINES. ; .GLOBL .TPARS ;PARSING ROUTINE .GLOBL $CAT5B ;CONVERT ASCII TO RAD50 (WITH BLANKS) ; ; I/O AND OTHER SYMBOLICS. ; .GLOBL $DSW ;DIRECTIVE STATUS WORD .GLOBL IO.WVB ;WRITE VIRTUAL BLOCK ; ; .TPARS VARIABLES. ; .GLOBL .PCHAR ;CHARACTER MATCHED BY $ALPHA .GLOBL .PNUMB ;LOW PART OF CONVERTED NUMBER .GLOBL .PSTCN ;COUNT OF PARSED STRING .GLOBL .PSTPT ;START OF PARSED STRING ; ; RSX11M ROUTINES. ; .GLOBL $DIV ;(IOSUB) FORCE $DIV .GLOBL $MUL ;(IOSUB) FORCE $MUL ; ; RSX11M VARIABLES. ; .GLOBL $HEADR ;CURRENT TASK HEADER ADDRESS .GLOBL $TKTCB ;CURRENT TASK TCB ADDRESS .SBTTL XDTROT - MACRO DEFINITIONS ; ; DEFINE SYSTEM STATE MACRO. ; .MACRO SYSTEM ADDR EMT 376 .WORD ADDR S.R0 = 2 S.R1 = 4 S.R2 = 6 S.R3 = 10 .ENDM SYSTEM ; ; DEFINE FATAL ERROR MACRO. ; .MACRO FATAL MSG TRAP 1 .ASCIZ #MSG# .EVEN .ENDM FATAL .SBTTL XDTROT - LOCAL DATA ; ; LOCAL SYMBOLS: ; ; LOGICAL UNIT'S. ; TTYLUN = 1 ;TERMINAL I/O LUN TSTLUN = 2 ;TEST LUN ; ; EVENT FLAGS. ; EV.TTY = 1 ;TERMINAL I/O ; ; SYNTAX BIT FLAGS. ; FL.LOA = 1 ;COMMAND IS LOAD FORM FL.UNL = 2 ;COMMAND IS UNLOAD FORM FL.TRM = 4 ;/TERM SWITCH SPECIFIED FL.PAR = 10 ;/PART SWITCH SPECIFIED ; ; LOCAL DATA: ; ; DIRECTIVES. ; GETCMD: GMCR$ ;GET COMMAND LINE SETSST: SVTK$ SSTTBL,7 ;SET SST VECTOR TABLE MAPDEV: ALUN$ TSTLUN,"TT,0 ;TTY MAP DIRECTIVE OUTDPB: QIOW$ IO.WVB,TTYLUN,EV.TTY,,,, ; ; VARIABLES. ; FLGWRD: .WORD 0 ;BIT FLAGS PARNAM: .RAD50 /GEN / ;PARTITION NAME ; ; ASCII STRINGS. ; ERR: .ASCII <15><12>/XDT -- / MSG: .BLKB 82. .EVEN ; ; SST VECTOR TABLE. ; SSTTBL: .WORD 0 ;ODD ADDRESS .WORD 0 ;MEMORY PROTECTION .WORD 0 ;T-BIT TRAP OR BPT .WORD 0 ;IOT INSTRUCTION .WORD 0 ;RESERVED INSTRUCTION .WORD 0 ;NON-RSX EMT INSTRUCTION .WORD ERRSRV ;TRAP INSTRUCTION ; ; SYNTAX TABLES. ; ISTAT$ XDTSTB,XDTKTB STATE$ XDTCMD TRAN$ "XDT" STATE$ OPTION TRAN$ '/,SWITCH TRAN$ $EOS,$EXIT STATE$ SWITCH TRAN$ "TERM",TERMSW,,FL.TRM,FLGWRD TRAN$ "PART",PARTNM,,FL.PAR,FLGWRD TRAN$ "LOAD",OPTION,,FL.LOA,FLGWRD TRAN$ "UNLOAD",OPTION,,FL.UNL,FLGWRD STATE$ TERMSW TRAN$ '= STATE$ TRAN$ $ALPHA,,STDEV1 STATE$ TRAN$ $ALPHA,,STDEV2 STATE$ TRAN$ $NUMBR,ENDDEV,STUNIT TRAN$ $LAMDA STATE$ ENDDEV TRAN$ ':,OPTION STATE$ PARTNM TRAN$ '= STATE$ TRAN$ $RAD50,OPTION,STPART STATE$ .SBTTL XDTROT * MAIN-LINE TASK CODE ; ;+ ; MAIN-LINE XDT TASK CODE. GET COMMAND LINE, PARSE, AND DISPATCH. ; ; INPUT: ; ; MCR COMMAND BUFFER QUEUED BY ...MCR. LEGAL COMMANDS ARE: ; ; >XDT /LOAD[/PART=name/TERM=ttnn:] ; >XDT /UNLOAD ; ; OUTPUT: ; ; XDT LOADED/UNLOADED. ; ; NOTES: ; ; THE TASK IS NOT FIXABLE, I.E., CERTAIN VARIABLES HAVE ASSUME LOADED ; VALUES. ;- ; XDTROT:: ;REF. LABEL ; ; SETUP SST VECTOR TABLE FOR ERROR PROCESSING. ; DIR$ #SETSST ;DECLARE SST VECTOR TABLE ; ; GET COMMAND LINE, ERROR IF NONE AVAILABLE. ; DIR$ #GETCMD ;GET MCR COMMAND BUFFER BCC 1000$ ; IF CC - COMMAND RECEIVED, CONTINUE FATAL ;DECLARE ERROR ; ; SETUP FOR COMMAND PARSING AND GO PARSE COMMAND. ; 1000$: MOV #3*400,R1 ;SET NO BLANK, THREE CHARACTERS MOV #XDTKTB,R2 ;GET ADDRESS OF KEYWORD TABLE MOV $DSW,R3 ;GET LENGTH OF COMMAND LINE MOV #GETCMD+G.MCRB,R4 ;GET START OF STRING MOV #XDTCMD,R5 ;GET STARTING PARSING STATE CALL .TPARS ;PARSE STRING INTO ELEMENTS BCC 2000$ ; IF CC - STRING PARSED OK FATAL ;DECLARE ERROR ; ; CHECK FOR PRIVILEGE TERMINAL. ; 2000$: MOV $TKTCB,R0 ;GET OUR TCB ADDRESS MOV T.UCB(R0),R0 ;GET OUR UCB ADDRESS BIT #U2.PRV,U.CW2(R0) ;IS TERMINAL PRIVILEGED? BNE 2100$ ; IF NE - YES, OK FATAL ;DECLARE ERROR ; ; CHECK FOR PROPER TASK BUILD ; 2100$: CMP #XDTBEG,#140000 ;IS XDT PROPERLY POSITIONED? BEQ 3000$ ; IF EQ - YES, CONTINUE FATAL ;DECLARE FATAL ERROR ; ; CHECK COMMAND FOR LOGICAL SWITCH CONSISTENCY. ; 3000$: BIT #FL.LOA,FLGWRD ;WAS /LOAD SPECIFIED? BEQ 3100$ ; IF EQ - NO, CHECK FOR /UNLOAD BIT #FL.UNL,FLGWRD ;WAS /UNLOAD SPECIFIED? BNE 3200$ ; IF NE - YES, ILLEGAL BEQ 4000$ ;GO PROCESS LOAD REQUEST 3100$: BIT #FL.UNL,FLGWRD ;WAS /UNLOAD SPECIFIED? BEQ 3200$ ; IF EQ - NO, ILLEGAL BIT #FL.TRM!FL.PAR,FLGWRD ;WAS /TERM OR /PART SPECIFIED BEQ 5000$ ; IF EQ - NO, CONTINUE 3200$: FATAL ;DECLARE FATAL ERROR ; ; IF TERMINAL SPECIFIED, ASSIGN DEVICE AND GET DL11 CSR. ; 4000$: MOV #177560,R5 ;SET DEFAULT TERMINAL BIT #FL.TRM,FLGWRD ;WAS /TERM SPECIFIED? BEQ 4100$ ; IF EQ - NO, ERRROR DIR$ #MAPDEV ;MAP DEVICE SPECIFIED BCS 4050$ ; IF CS - BAD DEVICE SYSTEM 4040$ ;;ENTER SYSTEM STATE MOV $HEADR,R0 ;;GET OUR TASK HEADER MOV H.LUN+<*4>(R0),R0 ;;GET UCB ADDRESS 4010$: CMP U.RED(R0),R0 ;;IS UNIT REDIRECTED? BEQ 4020$ ;; IF EQ - NO, SKIP MOV U.RED(R0),R0 ;;GET REDIRECT UCB BR 4010$ ;; AND LOOP 4020$: CLR R1 ;;CLEAR CSR RETURN BIT #DV.TTY,U.CW1(R0) ;;IS UNIT A TERMINAL? BEQ 4030$ ;; IF EQ - NO, ERROR BIT #U2.DH1,U.CW2(R0) ;;IS UNIT A DL11? BNE 4030$ ;; IF NE - NO, ERROR MOV U.SCB(R0),R0 ;;GET SCB ADDRESS MOV S.CSR(R0),R1 ;;GET CSR ADDRESS 4030$: MOV R1,S.R0(SP) ;;RETURN CSR IN R0 RETURN ;;RETURN TO TASK STATE 4040$: MOV R0,R5 ;COPY CSR VALUE BNE 4100$ ; IF NE - DEVICE LEGAL 4050$: FATAL ;DECLARE FATAL ERROR ; ; CALL XDT LOAD MODULE. ; 4100$: MOV #PARNAM,R4 ;SET ADDRESS OF PARTITION NAME CALL XDTLOA ;GO LOAD XDT BR 6000$ ;CONTINUE WHEN DONE ; ; CALL XDT UNLOAD MODULE. ; 5000$: CALL XDTUNL ;GO UNLOAD XDT ; ; EXIT TASK. ; 6000$: EXIT$S ;EXIT TASK .SBTTL ST???? * ACTION ROUTINES ; ;+ ; THESE ROUTINES ARE THE .TPARS ACTION ROUTINES FOR STORING PARSED VALUES ; FOR LATER USE. STRD50 IS ALSO USED TO CONVERT AND STORE THE PROMPTED ; PASSWORD. ; ; INPUTS: ; ; .TPARS BUILD-IN VARIABLES SETUP. ; ; OUTPUTS: ; ; SYNTAX ELEMENT CONVERTED AND STORED IN APPROPRIATE ELEMENT. IF ; OUT-OF-RANGE ELEMENT DETECTED, ERROR RETURN BY EXITING TO CALL+4. ; ; REGISTERS: USES R0-R2 SAVES R3-R5 ; ; CALLS $CAT5B ;- ; ; CONVERT AND STORE PARTITION NAME IN PARNAM. ; STPART: MOV .PSTPT,R0 ;GET START OF STRING MOV .PSTCN,R1 ;GET LENGTH OF STRING ; ; CONVERT AND STORE STRING. CHECK THAT LENGTH IS 1-6 CHARACTERS. ; BLE REJECT ; IF LE - REJECT STRING CMP R1,#6 ;IS STRING TOO LONG? BGT REJECT ; IF GT - YES, REJECT MOV #" ,-(SP) ;BLANK FILL TEMP BUFFER MOV #" ,-(SP) ; MOV #" ,-(SP) ; MOV SP,R2 ;SET ADDRESS OF BUFFER 1000$: MOVB (R0)+,(R2)+ ;MOVE STRING TO BUFFER SOB R1,1000$ ;LOOP TILL DONE 1010$: MOV SP,R0 ;SET BUFFER ADDRESS MOV #1,R1 ;SET TO CONVERT PERIODS CALL $CAT5B ;CONVERT FIRST RAD50 WORD BCS REJCT1 ; IF CS - ERROR, REJECT TRANSACTION MOV R1,PARNAM+0 ;SAVE CONVERTED VALUE MOV #1,R1 ;SET TO CONVERT PERIODS CALL $CAT5B ;CONVERT SECOND RAD50 WORD BCS REJCT1 ; IF CS - ERROR, REJECT TRANSACTION MOV R1,PARNAM+2 ;STORE CONVERTED VALUE ADD #6,SP ;DELETE BUFFER RETURN ;RETURN TO CALLER ; ; CHECK AND STORE DEVICE UNIT. ; STUNIT: CMP .PNUMB,#77 ;IS NUMBER TOO LARGE? BHI REJECT ; IF HI - YES, REJECT MOV .PNUMB,MAPDEV+A.LUNU ;STORE UNIT NUMBER ; ; STORE DEVICE NAME. ; STDEV1: MOVB .PCHAR,MAPDEV+A.LUNA+0 ;STORE FIRST CHARACTER RETURN ;RETURN STDEV2: MOVB .PCHAR,MAPDEV+A.LUNA+1 ;STORE SECOND CHARACTER RETURN ;RETURN SUCCESS ; ; REJECT TRANSACTION. ; REJCT1: ADD #6,SP ;CLEAN STACK REJECT: ADD #2,(SP) ;RETURN TO CALLER+4 RETURN ;RETURN FAILURE .SBTTL ERRSRV * ERROR MESSAGE PROCESSING ; ;+ ; THIS ROUTINE IS ENTERED BY AN SST TRAP FOR THE TRAP INSTRUCTION. ; IT OUTPUTS THE ERROR MESSAGE AND EXITS THE TASK. ; ; INPUTS: ; ; THE TRAP CAUSED BY THE FATAL MACRO. THE STACK SHOULD BE ; SETUP AS SHOWN BELOW: ; ; SP+04 PS ; SP+02 PC OF TRAP INSTRUCTION+2 ; SP+00 TRAP OPERAND TIMES 2 ; ; THE TRAP INSTRUCTION IS FOLLOWD BY THE ASCIZ ERROR MESSAGE. ; ; OUTPUTS: ; ; THE ERROR MESSAGE IS OUTPUT TO THE USER'S TERMINAL AND THE TASK EXIT. ; ; REGISTERS: USES R0-R5 SAVES NONE ; ; CALLS: NONE ;- ; ERRSRV: MOV #MSG,R0 ;GET OUTPUT BUFFER ADDRESS MOV 2(SP),R1 ;GET START OF ERROR MESSAGE 1000$: MOVB (R1)+,(R0)+ ;MOVE TO OUTPUT BUFFER BNE 1000$ ; MOVE TILL ZERO SEEN MOVB #15,-1(R0) ;MOVE IN EXTRA MOVB #12,(R0)+ ;MOVE IN EXTRA SUB #ERR,R0 ;GET BUFFER SIZE MOV R0,OUTDPB+Q.IOPL+2 ;STORE IN DPB DIR$ #OUTDPB ;OUTPUT ERROR MESSAGE EXIT$S ;EXIT TASK .END XDTROT