.TITLE CORZAP - ZAP CORE (SCOM) ROUTINE .IDENT /V01/ .MCALL GMCR$,EXIT$S,QIOW$,DIR$ .NLIST BEX ;+ ; VERSION 01 ; ; REID L BROWN 25-JAN-77 ; ; MODIFIED BY: ; ; NO MODIFICATIONS ; ; ; **-CORZAP- ZAP CORE LOCATION WITH VALUE ; ; THIS ROUTINE OPERATES MUCH LIKE THE OPEN COMMAND, BUT IS INVOKABLE AS A ONE ; LINE COMMAND. THIS ALLOWS ITS USE IN INDIRECT COMMAND FILES AND ANYWHERE ; ELSE A ONE LINE COMMAND IS DESIRED. IT IS A PRIVILEDGED FUNCTION, AND CAN ; ONLY BE RUN FROM PRIVILEDGED TERMINALS. THE ONLY AREA OF MEMORY OPERATED ; UPON IS SCOM. ADDRESSES MUST BE WITHIN THE LEGAL KERNAL LIMITS FOR SCOM: ; 100000 TO 160000. ; ; THE COMMAND FORMAT IS: ; ; COR
[:]/ ; ;
= THE SCOM ADDRESS OF THE WORD ; = A VERIFICATION VALUE FOR THE CURRENT CONTENTS OF THAT ; MEMORY CELL. THE OPERATION IS ABORTED IF THIS VALUE ; DOES NOT MATCH THE CURRENT CONTENTS OF THE CELL. ; = THE NEW DATA VALUE TO BE PLACED IN THE CELL. ; ; NOTE: ALL VALUES ARE EXPRESSED AS UNSIGNED OCTAL NUMBERS ; ; ; TASKBUILD ATTRIBUTES: -CP/-FX/PR/-FP ; STACK=32 ; TASK=...COR ; ASG=TI:1 ;ONE LUN ONLY ; UNITS=1 ; " ; PRI=220 ; UIC=[1,1] ; ;- ; ; LOCAL DATA AREA ; $ADDR: .WORD 0 ;THE ADDRESS OF THE CELL TO BE MODIFIED $VFY: .WORD 0 ;AN OPTIONAL VERIFICATION VALUE $VFLG: .WORD 0 ;IF <> 0, VERIFICATION IS DESIRED $VAL: .WORD 0 ;THE NEW VALUE TO BE PLACED IN THE CELL MCR: GMCR$ ;DEFINE THE GET MCR COMMAND LINE DIRECTIVE OUT: QIOW$ IO.WVB,1,1,,,,<.-.,.-.,40> ;DEFINE THE QIO DPB OUTBUF= OUT+Q.IOPL ;QIO BUFFER ADDRESS PARAMETER OUTLEN= OUT+Q.IOPL+2 ;QIO BUFFER LENGTH PARAMETER ; ; ERROR MESSAGES ; SYNTAX: .ASCII /COR - SYNTAX ERROR/ SYNLEN= .-SYNTAX VERIFY: .ASCII /COR - VERIFICATION ERROR/ VERLEN= .-VERIFY ADDRES: .ASCII /COR - ADDRESS RANGE ERROR/ ADDLEN= .-ADDRES PRVMES: .ASCII /COR - PRIVILEDGE VIOLATION/ PRVLEN= .-PRVMES .EVEN ; ; **-CORZAP- ; ; GET COMMAND LINE AND CHECK FOR SYNTAX ERRORS ; CORZAP::DIR$ #MCR,EXIT ;TRY TO GET AN MCR BUFFER, EXIT IF CAN'T MOV $DSW,R5 ;SAVE THE RETURNED LENGTH IN R5 CALL PRIVCK ;IS THE CALLER PRIVILEDGED FOR THIS? BCC 10$ ;YES, CONTINUE ; ; PRIVILEDGE VIOLATION - EXIT ; MOV #PRVMES,OUTBUF ;SET UP THE QIO MOV #PRVLEN,OUTLEN ;... DIR$ #OUT ;AND TELL HIM ABOUT IT JMP EXIT ;AND EXIT ; ; SCAN FOR OCTAL NUMBERS & SEPARATORS. ; ; $ADDR <= THE ADDRESS VALUE ; $VFY <= THE VERIFICATION VALUE ; $VFLG <= <>0 IF VERIFICATION DESIRED (FLAG) ; $VAL <= THE NEW VALUE ; 10$: MOV #MCR+5,R0 ;POINT TO 1ST CHAR AFTER 'COR' IN BUFFER ADD #MCR+2,R5 ;POINT TO END OF RETURNED DATA CLR MCR+80. ;INSURE AGAINST A BUFFER OVERRUN. CLR $VFLG ;RESET THE VERIFY FLAG CALL $COTB ;GET ADDRESS & CONVERT IT TO BINARY BIC #1,R1 ;FORCE TO A WORD BOUNDARY MOV R1,$ADDR ;AND STORE IT FOR FUTURE REFERENCE CMP R0,R5 ;HAVE WE OVERRUN THE END OF THE DATA? BHIS SYNERR ;YES - TELL THE USER CMPB #'/,R2 ;DID THE FIELD TERMINATE WITH A SLASH? BEQ 40$ ;YES - GO PROCESS THE VALUE FIELD CMPB #':,R2 ;NO - IS VERIFICATION SUPPORTED? BNE SYNERR ;NO - ??? CRAZY USER. SYNTAX ERROR ; ; GET VERIFICATION VALUE & SET VERIFY FLAG ; CALL $COTB ;CONVERT THE VERIFY VALUE TO BINARY CMP R0,R5 ;HAVE WE OVERRUN THE RETURNED DATA? BHIS SYNERR ;SYNTAX ERROR CMPB #'/,R2 ;TERMINATOR MUST BE A SLASH BNE SYNERR ;SYNTAX ERROR INC $VFLG ;INDICATE VERIFY IS TO BE DONE MOV R1,$VFY ;SAVE THE VALUE ; ; EVALUATE THE REPLACEMENT VALUE ; 40$: CALL $COTB ;CONVERT THE VALUE TO BINARY MOV R1,$VAL ;SAVE THE VALUE ; ; VALIDATE THE ADDRESS, VERIFY OLD CONTENTS (IF SPECIFIED) AND UPDATE ; THE LOCATION TO ITS NEW VALUE ; CMP $ADDR,#100000 ;GREATER OR EQUALL TO APR 4? (SCOM BASE) BLO ADRERR ;NO ADDRESS RANGE ERROR CMP $ADDR,#160000 ;LESS THAN APR 7? (SCOM TOP) BHIS ADRERR ;ERROR IF GREATER TST $VFLG ;VERIFY DESIRED? BEQ 60$ ;NO - CONTINUE CMP $VFY,@$ADDR ;COMPARE TO EXISTING DATA BEQ 60$ ;IT CHECKS, CONTINUE MOV #VERIFY,OUTBUF ;DOESN'T CHECK - LOAD BUFFER ADR MOV #VERLEN,OUTLEN ; AND LENGTH DIR$ #OUT ;TELL THE USER HE BLEW IT BR EXIT ;AND EXIT 60$: MOV $VAL,@$ADDR ;UPDATE THE DATA ITEM EXIT: EXIT$S ;AND EXIT ; ; SYNTAX ERROR ; SYNERR: MOV #SYNTAX,OUTBUF ;LOAD MESSAGE ADDR MOV #SYNLEN,OUTLEN ;AND ITS LENGTH DIR$ #OUT ;TELL THE USER BR EXIT ;AND EXIT ; ; **-PRIVCK-CHECK USERS PRIVILEDGE BASED ON THE PUD BITS ; ; RETURNS: CC-CLEAR IF PRIVILEDGED ; CC-SET IF NOT PRIVILEDGED ; MODIFIES R0. ; PRIVCK: CLC ;RESET THE CARRY FLAG BIT MOV .CRTSK,R0 ;GET MY ATL ADDRESS MOV A.TI(R0),R0 ;AND USE IT TO GET MY PUD ADDRESS BITB #UT.PR,U.TF(R0) ;IS MY TI PRIVILEDGE BIT SET? BNE 10$ ;YES - OK SEC ;NO - ERROR 10$: RETURN ; ; **-ADRERR- ADDRESS RANGE ERROR ; ADRERR: MOV #ADDRES,OUTBUF ;SETUP MESSAGE ADDR MOV #ADDLEN,OUTLEN ;AND ITS LENGTH DIR$ #OUT ;OUTPUT THE MESSAGE BR EXIT ;DONE .END CORZAP