.NLIST TOC .TITLE ENABLE - ENABLE ACP .SBTTL ENABLE - 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. * ; * ; ************************************************************************ ; ; ENABLE ACP TASK. THIS TASK SERVICES AS A VERY BASIC ACP ENABLING TASK ; AND IS PART OF THE EXAMPLE ACP PACKAGE. IT CAN BE CUSTOMIZED FOR ANY ; PARTICULAR APPLICATION. ; ; VERSION: 01.00 ; ; AUTHOR: R.W. STAMERJOHN MAPC 09-APR-80 ; ; MODIFICATION HISTORY: ; ; V01.00 RWS 09-APR-80 INITIAL VERSION .SBTTL ENABLE - DECLARATIONS .DSABL GBL ; ; MACRO LIBRARY CALLS: ; ; SYMBOLICS DEFINITIONS (EXEMC.MLB). ; .MCALL DCBDF$ ;DEFINE DCB OFFSETS DCBDF$ .MCALL HDRDF$ ;DEFINE HEADER OFFSETS HDRDF$ .MCALL PKTDF$ ;DEFINE I/O PACKET OFFSETS PKTDF$ .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 .MCALL WTSE$S ;WAIT FOR EVENT FLAG ; ; OTHER MACROS (RSXMAC.SML). ; .MCALL CALL,CALLR,RETURN ;SUBROUTINE MACROS .MCALL ISTAT$,STATE$,TRAN$ ;TPARS STATE TABLE MACROS ; ; GLOBAL DECLARATIONS: ; .GLOBL ENABLE ;TASK ENTRY ; ; GLOBAL REFERENCES: ; ; SYSTEM LIBRARY ROUTINES. ; .GLOBL .TPARS ;PARSING ROUTINE .GLOBL $CAT5B ;CONVERT ASCII TO RAD50 ; ; 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 $ALOCB ;(CORAL) ALLOCATE SYSTEM BUFFER .GLOBL $DEACB ;(CORAL) DEALLOCATE SYSTEM BUFFER .GLOBL $EXRQP ;(REQSB) QUEUE PACKET AND REQUEST TASK .GLOBL $RELOC ;(IOSUB) RELOCATE ADDRESS .GLOBL $SRSTD ;(REQSB) SEARCH FOR TASKNAME .GLOBL $DIV ;(IOSUB) FORCE $DIV .GLOBL $MUL ;(IOSUB) FORCE $MUL ; ; RSX11M VARIABLES. ; .GLOBL FE.MUP ;MULTIUSER PROTECTION MASK .GLOBL $FMASK ;FEATURE TEST MASK .GLOBL $HEADR ;CURRENT TASK HEADER ADDRESS .GLOBL $TKTCB ;CURRENT TASK TCB ADDRESS .SBTTL ENABLE - 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 ENABLE - 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 EV.TST = 2 ;TEST I/O ; ; OTHER SYMBOLS. ; IO.MOU = 2400 ;MOUNT I/O CODE ; ; LOCAL DATA: ; ; DIRECTIVES. ; GETCMD: GMCR$ ;GET COMMAND LINE SETSST: SVTK$ SSTTBL,7 ;SET SST VECTOR TABLE MAPDEV: ALUN$ TSTLUN,"XX,0 ;ASSIGN DIRECTIVE OUTDPB: QIOW$ IO.WVB,TTYLUN,EV.TTY,,,, ; ; GLOBAL (TKB PATCHABLE) VARIABLES. ; ACPGBL::.RAD50 /XXXXXX/ ;DEFAULT ACP TASK NAME VCBGBL::.WORD 2 ;DEFAULT VCB SIZE ; ; OTHER VARIABLES. ; INIPTR: ;START OF VARIABLES ACPNAM: .RAD50 /XXXXXX/ ;ACP TASK NAME VCBSIZ: .WORD 0 ;VCB SIZE PRMADR: .WORD 0 ;ADDRESS OF PARAMETER STRING PRMSIZ: .WORD 0 ;SIZE OF PARAMETER STRING VCBPTR: .WORD 0 ;VCB STRUCTURE ADDRESS .WORD 0 ;VCB STRUCTURE SIZE PRMPTR: .WORD 0 ;PARAMETER BUFFER ADDRESS .WORD 0 ;PARAMETER BUFFER SIZE IOSTAT: .BLKW 2 ;I/O STATUS BLOCK INISIZ = .-INIPTR ; ; ASCII STRINGS. ; ERR: .ASCII <15><12>/ENA -- / 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$ ENASTB,ENAKTB STATE$ ENACMD TRAN$ $STRNG STATE$ TRAN$ $ALPHA,,STDEV1 STATE$ TRAN$ $ALPHA,,STDEV2 STATE$ TRAN$ $NUMBR,ENDDEV,STUNIT TRAN$ $LAMDA STATE$ ENDDEV TRAN$ ':,OPTION STATE$ OPTION TRAN$ '/,SWITCH TRAN$ $EOS,$EXIT STATE$ SWITCH TRAN$ "ACP",ACPPRS TRAN$ "VCB",VCBPRS TRAN$ "PRM",PRMPRS STATE$ ACPPRS TRAN$ '= STATE$ TRAN$ $RAD50,OPTION,STTASK STATE$ VCBPRS TRAN$ '= STATE$ TRAN$ $NUMBR,OPTION,STNUMR STATE$ PRMPRS TRAN$ '= STATE$ TRAN$ '',NXTCH1,STSTRT TRAN$ '",NXTCH2,STSTRT STATE$ NXTCH1 TRAN$ '',OPTION,STENDS TRAN$ $ANY,NXTCH1 STATE$ NXTCH2 TRAN$ '",OPTION,STENDS TRAN$ $ANY,NXTCH2 STATE$ .SBTTL ENABLE * MAIN-LINE TASK CODE ; ;+ ; MAIN-LINE ENA TASK CODE. GET COMMAND LINE, PARSE, AND PROCESS ; ; INPUT: ; ; MCR COMMAND BUFFER QUEUED BY ...MCR. LEGAL COMMANDS ARE: ; ; >ENA DDNN:[/ACP=TASK/VCB=SIZE/PRM='.....'] ; ; OUTPUT: ; ; ACP ENABLED. ; ;- ; ENABLE:: ;REF. LABEL ; ; INITIALIZE WORKING VARIABLES SO ALL WILL BE WELL IF FIXED. ; MOV #INIPTR,R0 ;GET ADDRESS OF POINTERS MOV #INISIZ/2,R1 ;GET SIZE OF POINTERS 1000$: CLR (R0)+ ;CLEAR A POINTER SOB R1,1000$ ;LOOP TILL DONE MOV ACPGBL+0,ACPNAM+0 ;SET DEFAULT ACP NAME MOV ACPGBL+2,ACPNAM+2 ; BOTH WORDS MOV VCBGBL,VCBSIZ ;SET DEFAULT VCB SIZE ; ; 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 1100$ ; IF CC - COMMAND RECEIVED, CONTINUE FATAL ;DECLARE ERROR ; ; SETUP FOR COMMAND PARSING AND GO PARSE COMMAND. ; 1100$: MOV #3*400,R1 ;SET NO BLANK, THREE CHARACTERS MOV #ENAKTB,R2 ;GET ADDRESS OF KEYWORD TABLE MOV $DSW,R3 ;GET LENGTH OF COMMAND LINE MOV #GETCMD+G.MCRB,R4 ;GET START OF STRING MOV #ENACMD,R5 ;GET STARTING PARSING STATE CALL .TPARS ;PARSE STRING INTO ELEMENTS BCC 2000$ ; IF CC - STRING PARSED OK FATAL ;DECLARE ERROR ; ; ASSIGN DEVICE TO BE ENABLED. ; 2000$: DIR$ #MAPDEV ;ASSIGN TESTLUN TO DEVICE BCC 3000$ ; IF CC - ASSIGN GOOD FATAL ;DECLARE ERROR ; ; ENTER SYSTEM STATE AND CHECK THAT DEVICE CAN BE MOUNTED. IF ALL TEST ; ARE SUCCESSFUL, CONSTRUCT IO.MOU REQUEST AND QUEUE TO ACP. ; 3000$: SYSTEM 4000$ ;;ENTER SYSTEM STATE ; ; GET UCB OF DEVICE BY MAPPING OUR HEADER AND GETTING ASSIGN LUN ENTRY. ; MOV $HEADR,R5 ;;GET OUR HEADER ADDRESS MOV H.LUN+<*4>(R5),R5 ;;GET DEVICE UCB ADDRESS 3010$: MOV U.RED(R5),R5 ;;FOLLOW REDIRECTION CMP U.RED(R5),R5 ;;ARE WE DONE? BNE 3010$ ;; IF NE - NO, LOOP ; ; CHECK IF DEVICE IS MOUNTABLE? ; MOV #1,S.R0(SP) ;;PRESET "DEVICE NOT MOUNTABLE" BIT #DV.MNT,U.CW1(R5) ;;IS DEVICE MOUNTABLE? BEQ 3110$ ;; IF EQ - NO, ERROR ; ; CHECK IF DEVICE ALREADY MOUNTED? ; INC S.R0(SP) ;;PRESET "DEVICE ALREADY MOUNTED" BITB #US.MNT,U.STS(R5) ;;IS DEVICE MOUNTED? BEQ 3110$ ;; IF EQ - YES, ERROR ; ; CHECK IF DEVICE MARKED FOR DISMOUNT? ; INC S.R0(SP) ;;PRESET "DEVICE MARKED FOR DISMOUNT" BITB #US.MDM,U.STS(R5) ;;IS DEVICE MARKED FOR DISMOUNT? BNE 3110$ ;; IF NE - YES, ERROR ; ; CHECK IF DEVICE DRIVER LOADED? ; INC S.R0(SP) ;;PRESET "DEVICE DRIVER NOT LOADED" MOV U.DCB(R5),R0 ;;GET DCB ADDRESS TST D.DSP(R0) ;;IS DRIVER LOADED? BEQ 3110$ ;; IF EQ - NO, ERROR ; ; CHECK IF USER HAS PRIVILEGES NEEDED TO MOUNT DEVICE. ; INC S.R0(SP) ;;PRESET "PRIVILEGE VIOLATION" MOV $TKTCB,R0 ;;GET OUR TCB ADDRESS MOV T.UCB(R0),R0 ;;GET OUR TI: UCB BIT #FE.MUP,$FMASK ;;IS MULTIUSER SUPPORTED? BEQ 3100$ ;; IF EQ - NO, SKIP CHECKS CMP U.OWN(R5),R0 ;;IS DEVICE OWNED BY US? BEQ 3200$ ;; IF EQ - YES, MOUNT OK BITB #US.PUB,U.ST2(R5) ;;IS DEVICE PUBLIC? BNE 3200$ ;; IF NE - YES, MOUNT OK TST U.OWN(R5) ;;IS DEVICE OWNED BY SOMEONE ELSE? BNE 3110$ ;; IF NE - YES, ERROR 3100$: BIT #U2.PRV,U.CW2(R0) ;;ARE WE PRIVILEGED? BNE 3200$ ;; IF NE - YES, MOUNT OK 3110$: JMP 3999$ ;;RETURN ERRORS ; ; CHECK IF ACP TASK INSTALLED? ; 3200$: INC S.R0(SP) ;;PRESET "ACP NOT INSTALLED" MOV #ACPNAM,R3 ;;GET ADDRESS OF TASK NAME CALL $SRSTD ;;SEARCH FOR TCB ADDRESS BCS 3110$ ;; IF CS - NO TASK, ERROR ; ; CHECK IF TASK IS AN ACP? ; INC S.R0(SP) ;;PRESET "TASK NOT AN ACP" BIT #T3.ACP,T.ST3(R0) ;;IS TASK AN ACP? BEQ 3110$ ;; IF EQ - NO, ERROR MOV R0,U.ACP(R5) ;;STORE ACP TCB ADDRESS ; ; ALLOCATE VCB FROM SYSTEM POOL. ; INC S.R0(SP) ;;PRESET "POOL FAILURE - VCB" MOV VCBSIZ,R1 ;;GET SIZE OF VCB WANTED CALL $ALOCB ;;ALLOCATE FROM SYSTEM POOL BCS 3920$ ;; IF CS - ALLOCATION FAILED MOV R0,U.VCB(R5) ;;STORE VCB ADDRESS MOV R0,VCBPTR+0 ;;STORE FOR OUR USE MOV R1,VCBPTR+2 ;;STORE SIZE ALLOCATED ; ; N.B. THE VCB IS NOW INITIALIZED TO ZERO. FOR A CUSTOM ACP, THIS CODE ; COULD BE USED TO INITIALIZE THE VCB IN ANY FASHION DESIRED. ; ASR R1 ;;GET SIZE IN WORDS 3300$: CLR (R0)+ ;;CLEAR OUT VCB SOB R1,3300$ ;;LOOP TILL DONE ; ; IF NEEDED, ALLOCATE PARAMETER BUFFER FROM SYSTEM POOL. ; INC S.R0(SP) ;;PRESET "POOL FAILURE - PARAMETERS" MOV PRMSIZ,R1 ;;GET SIZE OF PARAMETER STRING BEQ 3500$ ;; IF EQ - NO PARAMETERS CALL $ALOCB ;;ALLOCATE FROM SYSTEM POOL BCS 3910$ ;; IF CS - ALLOCATION FAILED MOV R0,PRMPTR+0 ;;STORE BUFFER ADDRESS MOV PRMSIZ,R1 ;;GET STRING SIZE AGAIN MOV R1,PRMPTR+2 ;;STORE BUFFER SIZE MOV PRMADR,R2 ;;GET STRING ADDRESS 3400$: MOVB (R2)+,(R0)+ ;;COPY STRING TO POOL SOB R1,3400$ ;;LOOP TILL DONE ; ; ALLOCATE I/O PACKET FOR IO.MOU REQUEST. ; 3500$: INC S.R0(SP) ;;PRESET "POOL FAILURE - I/O PACKET" MOV #I.LGTH,R1 ;;GET SIZE OF I/O PACKET CALL $ALOCB ;;ALLOCATE FROM SYSTEM POOL BCS 3900$ ;; IF CS - ALLOCATION FAILED MOV R0,-(SP) ;;SAVE PACKET ADDRESS ; ; ALL CHECKS DONE, FILL IN I/O PACKET. ; CLR (R0)+ ;;(I.LNK ) CLEAR LINK WORD MOVB #377,(R0)+ ;;(I.PRI ) SET PRIORITY MOVB #EV.TST,(R0)+ ;;(I.EFN ) SET EFN MOV $TKTCB,(R0)+ ;;(I.TCB ) SET OUR TCB ADDRESS CLR (R0)+ ;;(I.LN2 ) CLEAR LUT ENTRY MOV R5,(R0)+ ;;(I.UCB ) SET DEVICE UCB MOV #IO.MOU,(R0)+ ;;(I.FCN ) SET FUNCTION CODE MOV #IOSTAT,(R0)+ ;;(I.IOSB) SET STATUS BLOCK ADDRESS MOV R0,-(SP) ;;SAVE I/O PACKET MOV #IOSTAT,R0 ;;GET STATUS BLOCK ADDRESS CALL $RELOC ;;RELOCATE STATUS BLOCK ADDRESS MOV (SP)+,R0 ;;RESTORE I/O PACKET MOV R1,(R0)+ ;;(I.IOSB+2) STORE RELOCATION BIAS MOV R2,(R0)+ ;;(I.IOSB+4) STORE APR6 DISPLACEMENT CLR (R0)+ ;;(I.AST ) CLEAR AST ADDRESS MOV PRMPTR+0,(R0)+ ;;(I.PRM+00) STORE PARAMETER BUFFER MOV PRMPTR+2,(R0)+ ;;(I.PRM+02) STORE PARAMETER SIZE CLR (R0)+ ;;(I.PRM+04) CLEAR REMAINDER CLR (R0)+ ;;(I.PRM+06) ... CLR (R0)+ ;;(I.PRM+10) ... CLR (R0)+ ;;(I.PRM+12) ... CLR (R0)+ ;;(I.PRM+14) ... CLR (R0)+ ;;(I.PRM+16) ... ; ; QUEUE PACKET TO ACP, SCHEDULE ACP, AND ACT LIKE WE ISSUED I/O. ; INC @U.VCB(R5) ;;INCREMENT TRANSACTION COUNT MOV (SP)+,R1 ;;COPY PACKET TO R1 MOV U.ACP(R5),R0 ;;GET ACP TCB ADDRESS CALL $EXRQP ;;QUEUE PACKET TO ACP MOV $TKTCB,R0 ;;GET OUR TCB ADDRESS INCB T.IOC(R0) ;;INCREMENT OUR I/O COUNT CLR T.EFLG(R0) ;;CLEAR OUR EVENT FLAGS CLR S.R0(SP) ;;MARK NO ERROR OCCURED BR 3999$ ;;AND EXIT SYSTEM STATE ; ; CLEAN UP POOL ALLOCATIONS AND EXIT WITH ERROR. ; 3900$: MOV PRMPTR+0,R0 ;;GET PARAMETER BUFFER BEQ 3910$ ;; IF EQ - NO BUFFER MOV PRMPTR+2,R1 ;;GET PARAMETER SIZE CALL $DEACB ;;DEALLOCATE BUFFER 3910$: CLR U.VCB(R5) ;;MARK NO VCB MOV VCBPTR+0,R0 ;;GET VCB ADDRESS MOV VCBPTR+2,R1 ;;GET VCB SIZE CALL $DEACB ;;DEALLOCATE BUFFER 3920$: CLR U.ACP(R5) ;;MARK NO ACP 3999$: RETURN ;;EXIT SYSTEM STATE ; ; CHECK FOR ANY ERRORS AND DECLARE IF THEY OCCURED. ; 4000$: TST R0 ;DID ANY ERRORS OCCUR BNE 5000$ ; IF NE - YES, GO PROCESS ; ; WAIT FOR I/O TO COMPLETE AND CHECK ACP'S RESPONSE. ; WTSE$S #EV.TST ;WAIT FOR I/O COMPLETION TST IOSTAT ;WAS MOUNT SUCCESSFUL BPL 4100$ ; IF PL - YES ; ; DECLARE ACP ERROR. NOTE, ACP IS RESPONSIBLE FOR CLEANING UP ACP (RETURN ; VCB AND PARAMETER BLOCK). HOWEVER, WE WILL MAKE SURE ACP IS NOT MARKED ; AS MOUNTED. ; BISB #US.MNT,U.STS(R5) ;MARK ACP NOT MOUNTED FATAL ;DECLARE ERROR ; ; ALL DONE, EXIT TASK ; 4100$: EXIT$S ;EXIT TASK ; ; PROCESS ERROR FROM MOUNT PROCESSING. ; 5000$: DEC R0 ;IS THIS ERROR 1? BNE 5010$ ; IF NE - NO FATAL ;DECLARE ERROR 5010$: DEC R0 ;IS THIS ERROR 2? BNE 5020$ ; IF NE - NO FATAL ;DECLARE ERROR 5020$: DEC R0 ;IS THIS ERROR 3? BNE 5030$ ; IF NE - NO FATAL ;DECLARE ERROR 5030$: DEC R0 ;IS THIS ERROR 4? BNE 5040$ ; IF NE - NO FATAL ;DECLARE ERROR 5040$: DEC R0 ;IS THIS ERROR 5? BNE 5050$ ; IF NE - NO FATAL ;DECLARE ERROR 5050$: DEC R0 ;IS THIS ERROR 6? BNE 5060$ ; IF NE - NO FATAL ;DECLARE ERROR 5060$: DEC R0 ;IS THIS ERROR 7? BNE 5070$ ; IF NE - NO FATAL ;DECLARE ERROR 5070$: DEC R0 ;IS THIS ERROR 8? BNE 5080$ ; IF NE - NO FATAL ;DECLARE ERROR 5080$: DEC R0 ;IS THIS ERROR 9? BNE 5090$ ; IF NE - NO FATAL ;DECLARE ERROR 5090$: DEC R0 ;IS THIS ERROR 10? BNE 5100$ ; IF NE - NO FATAL ;DECLARE ERROR 5100$: FATAL ;DECLARE ERROR .SBTTL ST???? * ACTION ROUTINES ; ;+ ; THESE ROUTINES ARE THE .TPARS ACTION ROUTINES FOR STORING PARSED VALUES ; FOR LATER USE. ; ; 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 ACP TASK NAME IN ACPNAM. ; STTASK: 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,ACPNAM+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,ACPNAM+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 RETURN ;RETURN TO CALLER ; ; 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 ; ; STORE START OF PARAMETER STRING. ; STSTRT: MOV .PSTPT,PRMADR ;STORE START OF STRING INC PRMADR ;BUMP TO TRUE START RETURN ;RETURN SUCCESS ; ; STORE END OF PARAMETER STRING. ; STENDS: MOV .PSTPT,PRMSIZ ;GET CURRENT POSITION SUB PRMADR,PRMSIZ ;GET LENGTH FROM BEGINNING RETURN ;RETURN SUCCESS ; ; STORE VCB SIZE. ; STNUMR: MOV .PNUMB,VCBSIZ ;STORE SIZE 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 TASK. ; EXIT$S ;EXIT TASK .END ENABLE