.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