.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: ; ; F. BORGER TO BECOME ABSZAP ; ; ; **-ABSZAP- 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 COMMAND FORMAT IS: ; ; AZP
[:]/ ; ;
= THE 22BIT 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=...AZP ; ASG=TI:1 ;ONE LUN ONLY ; UNITS=1 ; " ; PRI=220 ; UIC=[1,1] ; ;- ; ; LOCAL DATA AREA ; $ADDR: .WORD 0,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 /AZP - SYNTAX ERROR/ SYNLEN= .-SYNTAX VERIFY: .ASCII /AZP - VERIFICATION ERROR/ VERLEN= .-VERIFY ADDRES: .ASCII /AZP - ADDRESS RANGE ERROR/ ADDLEN= .-ADDRES PRVMES: .ASCII /AZP - 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+6,R2 ;POINT TO 1ST CHAR AFTER 'AZP' IN BUFFER ADD #MCR+2,R5 ;POINT TO END OF RETURNED DATA MOV R5,-(SP) ;SAVE IT CLR MCR+80. ;INSURE AGAINST A BUFFER OVERRUN. CLR $VFLG ;RESET THE VERIFY FLAG 12$: CMPB (R2)+,#'/ ;FIND END OF ADDRESS STRING BEQ 15$ CMPB -1(R2),#': ;COULD BE VERIFY ALSO BEQ 15$ TSTB (R2) ;END OF COMMAND ? BEQ SYNERR ;IF SO, SYNTAX ERROR BR 12$ ;IF NOT, KEEP LOOKING FOR / OR : 15$: DEC R2 ;BACK UP R2 TO / OR : MOV R2,R4 ;CALC LENGTH OF ADDRESS STRING SUB #MCR+6,R4 ;FOR SYSTEM CALL MOV #MCR+6,R5 ;POINT R5 TO START OF STRING MOV #$ADDR,R3 ;POINT R3 TO OUTPUT CONVERSION AREA CALL .OD2CT ;CONVERT TO DOUBLE PRECISION OCTAL BIC #1,$ADDR+2 ;MAKE SURE WORD BOUNDARY MOV (SP)+,R5 ;RESTORE END OF DATA FLAG CMP R2,R5 ;HAVE WE OVERRUN THE END OF THE DATA BHIS SYNERR ;YES - TELL THE USER MOV R2,R0 ;RESTORE POINTER FOR COTB CALLS INC R0 ;BUMP PAST TERMINATOR 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 ; MOV $ADDR+2,R1 ;LOW ORDER ADDRESS -> R1 MOV $ADDR,R0 ;HIGH ORDER ADDRESS -> R0 ASHC #3,R0 ;SHIFT PAR PART OF ADDRESS TO R1 ASH #-3,R1 ;RESET LOWER 13 BITS OF ADDRESS BIC #160000,R1 ;CLEAR BITS CARRIED FROM BIT 15 ASH #7,R0 ;PUT UPPER ADDRESS IN RIGHT BITS BIS #60000,R1 ;MAP R1 TO USE PAR/PDR 3 MOV #77406,-(SP) ;A 4K READ/WRITE PDR -> STACK MOV R0,-(SP) ;NEW PAR -> STACK CALL ..SPD3 ;SWAP PAR/PDR 3 TST $VFLG ;VERIFY DESIRED? BEQ 60$ ;NO - CONTINUE CMP $VFY,@R1 ;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,@R1 ;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 ; .END CORZAP