ADJUST.MAR .TITLE ADJUST Adjust Compute-bound Process Priority ; based on CPU time when system is saturated. $JPIDEF ; GETJPI return value definitions $DVIDEF ; GETDVI return value definitions $PRVDEF ; priv defs, also from GETJPI $LNMDEF ; logical name service definitions $SSDEF ; system service return value definition $OPCDEF ; operator message values definition $PCBDEF ; PCB format definition .MACRO $ADJDEF,$GBL $DEFINI ADJ,$GBL $DEF ADJ$L_PID .BLKL 1 $DEF ADJ$L_IMAGECOUNT .BLKL 1 $DEF ADJ$L_CPUTIM .BLKL 1 $DEF ADJ$L_BUFIO .BLKL 1 $DEF ADJ$L_DIRIO .BLKL 1 $DEF ADJ$L_PRIO .BLKL 1 $DEF ADJ$L_STATUS .BLKL 1 $DEF ADJ$C_SIZE $DEFEND ADJ,$GBL,DEF .ENDM $ADJDEF ; adjust list structure ; ; ; .PAGE ; ; ; ADJUST_LIST: .BLKB 300 * ADJ$C_SIZE ADJUST_LIST_SIZE=.-ADJUST_LIST ADJUST_STATUS: .BLKL 1 ; WILDCARD: .LONG -1 NULL_PID: .BLKL 1 NULL_CPU_ITMLST: .WORD 4,JPI$_CPUTIM .ADDRESS NULL_CPU,0 .LONG 0 ; terminator NULL_CPU: .BLKL 1 NULL_IOSB: .BLKQ 1 LOGICAL_NAME_TABLE: .ASCID /LNM$SYSTEM/ ; MIN_NULL_LOGICAL: .ASCID /ADJ$NULL_INTERVAL/ MIN_NULL_ITMLST: .WORD MIN_NULL_BUF_LEN,LNM$_STRING .ADDRESS MIN_NULL_BUF,MIN_NULL_DESC .LONG 0 ; terminator MIN_NULL_DESC: .LONG MIN_NULL_BUF_LEN .ADDRESS MIN_NULL_BUF MIN_NULL_BUF: .BLKB 4 MIN_NULL_BUF_LEN=.-MIN_NULL_BUF ; MIN_NULL_CPU: .LONG 50 ; ==> 500 ms in five seconds or 10% null ; ; ; MAX_CPU_LOGICAL: .ASCID /ADJ$PROCESS_CPU/ MAX_CPU_ITMLST: .WORD MAX_CPU_BUF_LEN,LNM$_STRING .ADDRESS MAX_CPU_BUF,MAX_CPU_DESC .LONG 0 ; terminator MAX_CPU_DESC: .LONG MAX_CPU_BUF_LEN .ADDRESS MAX_CPU_BUF MAX_CPU_BUF: .BLKB 4 MAX_CPU_BUF_LEN=.-MAX_CPU_BUF ; ADJUST_MAX_CPU: .LONG 50 ; ==> 500 ms in five seconds or 10% null ; ; ; ; MIN_IO_LOGICAL: .ASCID /ADJ$PROCESS_IO/ MIN_IO_ITMLST: .WORD MIN_IO_BUF_LEN,LNM$_STRING .ADDRESS MIN_IO_BUF,MIN_IO_DESC .LONG 0 ; terminator MIN_IO_DESC: .LONG MIN_IO_BUF_LEN .ADDRESS MIN_IO_BUF MIN_IO_BUF: .BLKB 4 MIN_IO_BUF_LEN=.-MIN_IO_BUF ; ADJUST_MIN_IO: .LONG 50 ; ==> 500 ms in five seconds or 10% null ; ; ; ; BATCH_PRIO_LOGICAL: .ASCID /ADJ$BATCH_PRIO/ BATCH_PRIO_ITMLST: .WORD BATCH_PRIO_BUF_LEN,LNM$_STRING .ADDRESS BATCH_PRIO_BUF,BATCH_PRIO_DESC .LONG 0 ; terminator BATCH_PRIO_DESC: .LONG BATCH_PRIO_BUF_LEN .ADDRESS BATCH_PRIO_BUF BATCH_PRIO_BUF: .BLKB 4 BATCH_PRIO_BUF_LEN=.-BATCH_PRIO_BUF ; BATCH_PRIO: .LONG 50 ; ==> 500 ms in five seconds or 10% null ; ; ; INTERACTIVE_PRIO_LOGICAL: .ASCID /ADJ$INTERACTIVE_PRIO/ INTERACTIVE_PRIO_ITMLST: .WORD INTERACTIVE_PRIO_BUF_LEN,LNM$_STRING .ADDRESS INTERACTIVE_PRIO_BUF,INTERACTIVE_PRIO_DESC .LONG 0 ; terminator INTERACTIVE_PRIO_DESC: .LONG INTERACTIVE_PRIO_BUF_LEN .ADDRESS INTERACTIVE_PRIO_BUF INTERACTIVE_PRIO_BUF: .BLKB 4 INTERACTIVE_PRIO_BUF_LEN=.-INTERACTIVE_PRIO_BUF ; INTERACTIVE_PRIO: .LONG 50 ; ==> 500 ms in five seconds or 10% null ; ; ; ; SLEEP_TIME_LOGICAL: .ASCID /ADJ$SCAN_INTERVAL/ ; SLEEP_TIME_ITMLST: .WORD SLEEP_TIME_BUF_LEN,LNM$_STRING .ADDRESS SLEEP_TIME_BUF,SLEEP_ASCII_TIME .LONG 0 ; SLEEP_ASCII_TIME: .LONG SLEEP_TIME_BUF_LEN .ADDRESS SLEEP_TIME_BUF SLEEP_TIME_BUF: .ASCII /0 00:00:05.00/ SLEEP_TIME_BUF_LEN=.-SLEEP_TIME_BUF ; SLEEP_TIME: .BLKQ 1 ; ; ; ADJUSTED_MESSAGE_DESC: .LONG ADJUSTED_MESSAGE_LEN .ADDRESS ADJUSTED_MESSAGE ADJUSTED_MESSAGE: .BYTE OPC$_RQ_RQST .WORD OPC$M_NM_OPER2 .BYTE 0 .LONG 0 .ASCII /Interactive process / ADJUSTED_PID: .ASCII /XXXXXXXX priority adjusted due to CPU saturation./ ADJUSTED_MESSAGE_LEN=.-ADJUSTED_MESSAGE ; ; ; CHECKING_ITMLST: .WORD 4,JPI$_PROC_INDEX .ADDRESS CHK_ITEM_PROC_INDEX,0 .WORD 4,JPI$_PID .ADDRESS CHK_ITEM_PID,0 .WORD 4,JPI$_IMAGECOUNT .ADDRESS CHK_ITEM_IMAGECOUNT,0 .WORD 4,JPI$_CPUTIM .ADDRESS CHK_ITEM_CPUTIM,0 .WORD 4,JPI$_BUFIO .ADDRESS CHK_ITEM_BUFIO,0 .WORD 4,JPI$_DIRIO .ADDRESS CHK_ITEM_DIRIO,0 .WORD 4,JPI$_GRP .ADDRESS CHK_ITEM_GRP,0 .WORD 4,JPI$_MODE .ADDRESS CHK_ITEM_MODE,0 .WORD 4,JPI$_PRIB .ADDRESS CHK_ITEM_PRIB,0 .LONG 0 ; terminator CHK_ITEM_PROC_INDEX: .BLKL 1 CHK_ITEM_PID: .BLKL 1 CHK_ITEM_IMAGECOUNT: .BLKL 1 CHK_ITEM_CPUTIM: .BLKL 1 CHK_ITEM_BUFIO: .BLKL 1 CHK_ITEM_DIRIO: .BLKL 1 CHK_ITEM_GRP: .BLKL 1 CHK_ITEM_MODE: .BLKL 1 CHK_ITEM_PRIB: .BLKL 1 ; ; ; OTHER_LIST: .WORD 8,JPI$_CURPRIV .ADDRESS OTHER_ITEM_PRIVS,0 .WORD 128,JPI$_IMAGNAME .ADDRESS OTHER_ITEM_IMAGE_TEXT,OTHER_ITEM_IMAGE_DESC .WORD 12,JPI$_USERNAME .ADDRESS OTHER_ITEM_USERNAME,0 .LONG 0 OTHER_ITEM_PRIVS: .BLKQ OTHER_ITEM_IMAGE_DESC: .BLKL 1 .ADDRESS OTHER_ITEM_IMAGE_TEXT OTHER_ITEM_IMAGE_TEXT: .BLKB 128 OTHER_ITEM_USERNAME: .BLKB 12 ; ; TEST_DIMWIT: .ASCII /TCOMEAUX / FIRST_DIMWIT: ;123456789012; .ASCII /TACOS / SECOND_DIMWIT: .ASCII /DSIMONTON / FIRST_DEANZA: .ASCID /EPA0:/ SECOND_DEANZA: .ASCID /EPB0:/ THIRD_DEANZA: .ASCID /EPC0:/ FIRST_TERM: .ASCID /TXE6:/ SECOND_TERM: .ASCID /TXE5:/ THIRD_TERM: .ASCID /TXB2:/ ; ; DEANZA_PID_LIST: .WORD 4,DVI$_PID .ADDRESS DEANZA_PID,0 .LONG 0 DEANZA_PID: .BLKL 1 ; SUCCESS_VEC: .LONG 7 .LONG ^X08028009 .LONG 5 .LONG 0 SUC_VEC_PID: .LONG 0 .LONG 12 .ADDRESS OTHER_ITEM_USERNAME .ADDRESS OTHER_ITEM_IMAGE_DESC DEANZA_VEC: .LONG 7 .LONG ^X08028013 .LONG 5 .LONG 0 DEA_VEC_PID: .LONG 0 .LONG 12 .ADDRESS OTHER_ITEM_USERNAME .ADDRESS OTHER_ITEM_IMAGE_DESC ; ; ; .SUBTITLE MAIN Adjust Routine Mainline - voluntary hibernate .PAGE ; ; ; .ENTRY ADJUST, ^M $TRNLNM_S - TABNAM=LOGICAL_NAME_TABLE,- LOGNAM=SLEEP_TIME_LOGICAL,- ITMLST=SLEEP_TIME_ITMLST BLBS R0,5$ $EXIT_S R0 5$: $BINTIM_S - TIMBUF=SLEEP_ASCII_TIME,- TIMADR=SLEEP_TIME BLBS R0,10$ $EXIT_S R0 10$: MOVL @SCH$GL_NULLPCB,R0 MOVL PCB$L_EPID(R0),NULL_PID $GETJPIW_S - PIDADR=NULL_PID,- ITMLST=NULL_CPU_ITMLST,- IOSB= NULL_IOSB BLBS R0,20$ $EXIT_S R0 20$: $SETIMR_S - DAYTIM=SLEEP_TIME,- ASTADR=CHECK_PASS BLBS R0,30$ $EXIT_S R0 30$: $HIBER_S BLBS R0,40$ $EXIT_S R0 40$: RET ; ; ; .SUBTITLE CHECK_PASS AST routine to make a pass of jobs .PAGE ; ; ; .ENTRY CHECK_PASS,^M MOVL NULL_CPU,R10 ; save null value from last pass $GETJPIW_S - PIDADR=NULL_PID,- ITMLST=NULL_CPU_ITMLST,- IOSB= NULL_IOSB BLBS R0,10$ $EXIT_S R0 10$: $TRNLNM_S - TABNAM=LOGICAL_NAME_TABLE,- LOGNAM=MIN_NULL_LOGICAL,- ITMLST=MIN_NULL_ITMLST BLBS R0,15$ $EXIT_S R0 15$: PUSHAL MIN_NULL_CPU PUSHL MIN_NULL_DESC+4 PUSHL MIN_NULL_DESC CALLS #3,G^LIB$CVT_DTB BLBS R0,28$ $EXIT_S R0 28$: ; SUBL3 R10,NULL_CPU,R9 CMPL R9,MIN_NULL_CPU BGTR 280$ 20$: CALLS #0,ADJUST_PASS BLBS R0,30$ $EXIT_S R0 30$: BRW 50$ 280$: MOVAB ADJUST_LIST,R8 ADDL3 #ADJUST_LIST_SIZE,R8,R7 282$: ; see if we've already pushed this guy down TSTL ADJ$L_STATUS(R8) ; if status is zero, we've done nothing BEQL 339$ ; if not, continue ; push back up to interactive priority $SETPRI_S - PIDADR=ADJ$L_PID(R8),- PRI= INTERACTIVE_PRIO BLBS R0,339$ $EXIT_S R0 339$: CLRL ADJ$L_STATUS(R8) CLRL ADJ$L_CPUTIM(R8) CLRL ADJ$L_BUFIO(R8) CLRL ADJ$L_DIRIO(R8) ADDL2 #ADJ$C_SIZE,R8 CMPL R7,R8 BGEQ 282$ 50$: ; $TRNLNM_S - TABNAM=LOGICAL_NAME_TABLE,- LOGNAM=SLEEP_TIME_LOGICAL,- ITMLST=SLEEP_TIME_ITMLST BLBS R0,55$ $EXIT_S R0 55$: $BINTIM_S - TIMBUF=SLEEP_ASCII_TIME,- TIMADR=SLEEP_TIME BLBS R0,60$ $EXIT_S R0 60$: 90$: $SETIMR_S - ; requeue yourself for five seconds DAYTIM=SLEEP_TIME,- ASTADR=CHECK_PASS BLBS R0,99$ $EXIT_S R0 99$: RET ; ; ; .SUBTITLE ADJUST_PASS AST routine to make adjustments to batch jobs .PAGE ; ; ; .ENTRY ADJUST_PASS,^M SETUP_ADJUST: $TRNLNM_S - TABNAM=LOGICAL_NAME_TABLE,- LOGNAM=MAX_CPU_LOGICAL,- ITMLST=MAX_CPU_ITMLST BLBS R0,10$ RET 10$: PUSHAL ADJUST_MAX_CPU PUSHL MAX_CPU_DESC+4 PUSHL MAX_CPU_DESC CALLS #3,G^LIB$CVT_DTB BLBS R0,20$ RET 20$: $TRNLNM_S - TABNAM=LOGICAL_NAME_TABLE,- LOGNAM=MIN_IO_LOGICAL,- ITMLST=MIN_IO_ITMLST BLBS R0,30$ RET 30$: PUSHAL ADJUST_MIN_IO PUSHL MIN_IO_DESC+4 PUSHL MIN_IO_DESC CALLS #3,G^LIB$CVT_DTB BLBS R0,40$ RET 40$: $TRNLNM_S - TABNAM=LOGICAL_NAME_TABLE,- LOGNAM=BATCH_PRIO_LOGICAL,- ITMLST=BATCH_PRIO_ITMLST BLBS R0,50$ RET 50$: PUSHAL BATCH_PRIO PUSHL BATCH_PRIO_DESC+4 PUSHL BATCH_PRIO_DESC CALLS #3,G^LIB$CVT_DTB BLBS R0,60$ RET 60$: $TRNLNM_S - TABNAM=LOGICAL_NAME_TABLE,- LOGNAM=INTERACTIVE_PRIO_LOGICAL,- ITMLST=INTERACTIVE_PRIO_ITMLST BLBS R0,70$ RET 70$: PUSHAL INTERACTIVE_PRIO PUSHL INTERACTIVE_PRIO_DESC+4 PUSHL INTERACTIVE_PRIO_DESC CALLS #3,G^LIB$CVT_DTB BLBS R0,80$ RET 80$: MOVL #1,ADJUST_STATUS ; be optomistic MOVAL ADJUST_LIST,R11 ; locate the list MOVL #-1,WILDCARD ; insure wilding ; ; ; .PAGE ; ; ; DO_ADJUST: 10$: $GETJPIW_S - PIDADR=WILDCARD,- ITMLST=CHECKING_ITMLST CMPL #SS$_NOMOREPROC,R0 BNEQ 19$ BRW 90$ 19$: BLBS R0,20$ RET 20$: MULL3 #ADJ$C_SIZE,CHK_ITEM_PROC_INDEX,R10 ADDL2 R11,R10 ; R10 points to process entry CMPL CHK_ITEM_PID,ADJ$L_PID(R10) BEQL 30$ ; seen this guy before... BRW 50$ ; never seen before, just load entry 30$: CMPL #JPI$K_INTERACTIVE,CHK_ITEM_MODE BEQL 310$ CMPL #JPI$K_DETACHED,CHK_ITEM_MODE BEQL 310$ BRW 50$ 310$: ; check list of reserved UIC groups CMPL #1,CHK_ITEM_GRP BEQL 320$ CMPL #10,CHK_ITEM_GRP BEQL 320$ BRW 330$ 320$: BRW 50$ 330$: ; see if we've already pushed this guy down TSTL ADJ$L_STATUS(R10) ; if status is zero, we've done nothing BEQL 340$ ; if not, continue CMPL ADJ$L_IMAGECOUNT(R10),CHK_ITEM_IMAGECOUNT ; if so, see ; if so, see if image exited BEQL 339$ ; no, leave him where he is. ; process was pushed down, but imagecount has changed: ; push back up to interactive priority $SETPRI_S - PIDADR=ADJ$L_PID(R10),- PRI= INTERACTIVE_PRIO BLBS R0,338$ RET 338$: CLRL ADJ$L_STATUS(R10) 339$: BRW 50$ 340$: ; compare cputim, bufio, dirio TSTL ADJ$L_CPUTIM(R10) BNEQ 342$ BRW 50$ 342$: SUBL3 ADJ$L_CPUTIM(R10),CHK_ITEM_CPUTIM,R9 SUBL3 ADJ$L_BUFIO(R10),CHK_ITEM_BUFIO,R8 SUBL3 ADJ$L_DIRIO(R10),CHK_ITEM_DIRIO,R7 ADDL3 R8,R7,R6 MOVL CHK_ITEM_PID,R5 ; DEBUG ; R9 contains CPUTIME, R6 contains IOCOUNT CMPL R9,ADJUST_MAX_CPU BGEQ 350$ BRW 50$ 350$: CMPL R6,ADJUST_MIN_IO BLSS 360$ BRW 50$ 360$: ; process has used more than the allowable CPU, while ; doing less than the expected IO, and is doing compute-intensive ; work from an interactive job. ; drop the user's priority to that of a batch job. 40$: CMPL BATCH_PRIO,CHK_ITEM_PRIB BNEQ 43$ BRW 50$ 43$: CMPL INTERACTIVE_PRIO,CHK_ITEM_PRIB BEQL 44$ BRW 50$ 44$: ; adjust if required and able BSBW CHECK_OTHER_STUFF BLBS R0,441$ BRW 50$ 441$: $SETPRI_S - PIDADR=ADJ$L_PID(R10),- PRI= BATCH_PRIO BLBS R0,49$ RET 49$: INCL ADJ$L_STATUS(R10) ; indicate we've fiddled. PUSHAB ADJUSTED_PID PUSHL ADJ$L_PID(R10) CALLS #2,CHANGE_TO_HEX BLBS R0,45$ RET 45$: $SNDOPR_S - MSGBUF=ADJUSTED_MESSAGE_DESC BLBS R0,50$ $EXIT_S R0 50$: MOVL CHK_ITEM_PID,ADJ$L_PID(R10) MOVL CHK_ITEM_IMAGECOUNT,ADJ$L_IMAGECOUNT(R10) MOVL CHK_ITEM_CPUTIM,ADJ$L_CPUTIM(R10) MOVL CHK_ITEM_BUFIO,ADJ$L_BUFIO(R10) MOVL CHK_ITEM_DIRIO,ADJ$L_DIRIO(R10) MOVL CHK_ITEM_PRIB,ADJ$L_PRIO(R10) BRW 10$ ; 90$: MOVL ADJUST_STATUS,R0 RET ; ; ; .SUBTITLE CHECK_OTHER_STUFF checks deanzas, privs, prints to log .PAGE ; ; ; CHECK_OTHER_STUFF: ; is a subroutine, called by BSBx or JSB. $GETJPIW_S - PIDADR=ADJ$L_PID(R10),- ITMLST=OTHER_LIST BLBS R0,10$ RSB ; hmmm... 10$: ; CMPC3 #12,TEST_DIMWIT,OTHER_ITEM_USERNAME ; BEQL 14$ ; CLRL R0 ; RSB 14$: ; CMPC3 #12,FIRST_DIMWIT,OTHER_ITEM_USERNAME ; BEQL 15$ ; CLRL R0 ; RSB ; TACOS gets out 15$: ; CMPC3 #12,SECOND_DIMWIT,OTHER_ITEM_USERNAME ; BEQL 16$ ; CLRL R0 ; RSB 16$: ; BBC #PRV$V_ALTPRI,OTHER_ITEM_PRIVS,20$ ; CLRL R0 ; RSB ; has altpri - don't adjust 20$: $GETDVIW_S - DEVNAM=FIRST_DEANZA,- ITMLST=DEANZA_PID_LIST BLBS R0,30$ MOVL ADJ$L_PID(R10),SUC_VEC_PID $PUTMSG_S - MSGVEC=SUCCESS_VEC ; assume putmsg works BLBS R0,29$ $EXIT_S R0 29$: RSB ; no such device - no deanzas on this node 30$: CMPL DEANZA_PID,ADJ$L_PID(R10) BNEQ 40$ MOVL ADJ$L_PID(R10),DEA_VEC_PID $PUTMSG_S - MSGVEC=DEANZA_VEC ; report Deanza BLBS R0,301$ $EXIT_S R0 301$: CLRL R0 ; has a deanza - don't adjust RSB 40$: $GETDVIW_S - DEVNAM=SECOND_DEANZA,- ITMLST=DEANZA_PID_LIST BLBS R0,50$ MOVL ADJ$L_PID(R10),SUC_VEC_PID $PUTMSG_S - MSGVEC=SUCCESS_VEC ; assume putmsg works BLBS R0,401$ $EXIT_S R0 401$: MOVZBL #1,R0 RSB ; no such device - no deanzas on this node 50$: CMPL DEANZA_PID,ADJ$L_PID(R10) BNEQ 60$ MOVL ADJ$L_PID(R10),DEA_VEC_PID $PUTMSG_S - MSGVEC=DEANZA_VEC ; report Deanza BLBS R0,501$ $EXIT_S R0 501$: CLRL R0 ; has a deanza - don't adjust RSB 60$: $GETDVIW_S - DEVNAM=THIRD_DEANZA,- ITMLST=DEANZA_PID_LIST BLBS R0,70$ MOVL ADJ$L_PID(R10),SUC_VEC_PID $PUTMSG_S - MSGVEC=SUCCESS_VEC ; assume putmsg works BLBS R0,601$ $EXIT_S R0 601$: MOVZBL #1,R0 RSB ; no such device - no deanzas on this node 70$: CMPL DEANZA_PID,ADJ$L_PID(R10) BNEQ 80$ MOVL ADJ$L_PID(R10),DEA_VEC_PID $PUTMSG_S - MSGVEC=DEANZA_VEC ; report Deanza BLBS R0,701$ $EXIT_S R0 701$: CLRL R0 ; has a deanza - don't adjust RSB 80$: $GETDVIW_S - DEVNAM=FIRST_TERM,- ITMLST=DEANZA_PID_LIST BLBS R0,90$ MOVL ADJ$L_PID(R10),SUC_VEC_PID $PUTMSG_S - MSGVEC=SUCCESS_VEC ; assume putmsg works BLBS R0,801$ $EXIT_S R0 801$: MOVZBL #1,R0 RSB ; no such device - no deanzas on this node 90$: CMPL DEANZA_PID,ADJ$L_PID(R10) BNEQ 100$ MOVL ADJ$L_PID(R10),DEA_VEC_PID $PUTMSG_S - MSGVEC=DEANZA_VEC ; report Deanza BLBS R0,901$ $EXIT_S R0 901$: CLRL R0 ; has a deanza - don't adjust RSB 100$: $GETDVIW_S - DEVNAM=SECOND_TERM,- ITMLST=DEANZA_PID_LIST BLBS R0,110$ MOVL ADJ$L_PID(R10),SUC_VEC_PID $PUTMSG_S - MSGVEC=SUCCESS_VEC ; assume putmsg works BLBS R0,1001$ $EXIT_S R0 1001$: MOVZBL #1,R0 RSB ; no such device - no deanzas on this node 110$: CMPL DEANZA_PID,ADJ$L_PID(R10) BNEQ 120$ MOVL ADJ$L_PID(R10),DEA_VEC_PID $PUTMSG_S - MSGVEC=DEANZA_VEC ; report Deanza BLBS R0,1101$ $EXIT_S R0 1101$: CLRL R0 ; has a deanza - don't adjust RSB 120$: $GETDVIW_S - DEVNAM=THIRD_TERM,- ITMLST=DEANZA_PID_LIST BLBS R0,130$ MOVL ADJ$L_PID(R10),SUC_VEC_PID $PUTMSG_S - MSGVEC=SUCCESS_VEC ; assume putmsg works BLBS R0,1201$ $EXIT_S R0 1201$: MOVZBL #1,R0 RSB ; no such device - no deanzas on this node 130$: CMPL DEANZA_PID,ADJ$L_PID(R10) BNEQ 140$ MOVL ADJ$L_PID(R10),DEA_VEC_PID $PUTMSG_S - MSGVEC=DEANZA_VEC ; report Deanza BLBS R0,1301$ $EXIT_S R0 1301$: CLRL R0 ; has a deanza - don't adjust RSB 140$: MOVL ADJ$L_PID(R10),SUC_VEC_PID $PUTMSG_S - MSGVEC=SUCCESS_VEC ; assume putmsg works BLBS R0,1401$ $EXIT_S R0 1401$: MOVZBL #1,R0 RSB ; ; ; .SUBTITLE CHANGE_TO_HEX does just what the name implies. .PAGE ; ; ; HEX_DATA: .ASCII /0123456789ABCDEF/ ; .ENTRY CHANGE_TO_HEX,^M MOVL 4(AP),R11 MOVL 8(AP),R10 MOVAL HEX_DATA,R9 ; R11 contains the longword to be converted, R10 the address of the ; eight byte destination string. MOVZBL #8,R6 ; convert eight nybles to bytes 10$: ROTL #4,R11,R11 ; move left four to get next nyble MOVL R11,R8 ; in low nyble, and copy to R8 BICL #^XFFFFFFF0,R8 ; get four bits ADDL3 R9,R8,R7 MOVB (R7),(R10)+ ; move character to string SOBGTR R6,10$ MOVL #SS$_NORMAL,R0 RET .END ADJUST