.TITLE ETHERMON_FASTCALL Interface to "Fast $QIO" Routines .IDENT /ETHERMON-V2.4 #2/ FASTSHR_VERSION = 2 ; expected patch level of FASTSHR $CHFDEF $FSCNDEF $JPIDEF $SSDEF .PSECT $ABS$,EXE,RD,WRT,NOSHR,NOPIC,ABS NLV_IOSB: .BLKQ 1 DSC_IMGFIL: .BLKQ 1 CLV_IMGFIL: .BLKB 256 LEN_CLV_IMGFIL = .-CLV_IMGFIL STACK_SPACE = <<.+3>/4>*4 .PSECT FASTCALL_LOCAL,NOEXE,RD,WRT,LCL,NOSHR,PIC,LONG L_INIT_FAST_$QIO: .BLKL 1 L_FAST_BUFIO_READ_$QIO: .BLKL 1 L_FAST_$QIO_D_LINE: .BLKL 1 .PSECT $CODE,EXE,RD,NOWRT,LCL,SHR,PIC,QUAD .ENTRY START_FAST_INTERFACE_EXCPTHDLR,^M MOVL CHF$L_SIGARGLST(AP),R2 CMPZV #STS$V_FAC_NO,#STS$S_FAC_NO,- ; is signal a LIB$_xxx code? CHF$L_SIG_NAME(R2),#LIB$_FACILITY BNEQ 80$ ; no, return this code unmodified. SUBL3 #4,CHF$L_SIG_ARGS(R2),R1 ; yes, see if there is a 2nd code, CMPL R1,CHF$L_SIG_ARG1(R2) BLEQ 80$ ; no, just use this code. MOVL CHF$L_SIG_ARG1(R2),R0 ; yes, get index to next condition code, MOVL CHF$L_SIG_ARG1+4(R2)[R0],R0 ; get next code. BRB 81$ 80$: MOVL CHF$L_SIG_NAME(R2),R0 81$: MOVL CHF$L_MCHARGLST(AP),R1 ; get pointer to mechanism args, MOVL R0,CHF$L_MCH_SAVR0(R1) ; replace saved R0 with arglist code, $UNWIND_S DEPADR=CHF$L_MCH_DEPTH(R1) ; cause unwind to establisher, RET DSC_FASTSHR_VERSION: .ASCID /FASTSHR_VERSION/ DSC_ETHERMON_FASTSHR: .ASCID /ETHERMON_FASTSHR/ DSC_INIT_FAST_$QIO: .ASCID /P_INIT_FAST_$QIO/ DSC_FAST_BUFIO_READ_$QIO: .ASCID /P_FAST_BUFIO_READ_$QIO/ DSC_FAST_$QIO_D_LINE: .ASCID /P_FAST_$QIO_D_LINE/ .ALIGN LONG .ENTRY START_FAST_INTERFACE,^M SUBL2 #STACK_SPACE,SP MOVL SP,R11 CLRL DSC_IMGFIL(R11) ; find where the ETHERMON image is CLRL -(SP) ; located on disk, PUSHAW DSC_IMGFIL(R11) PUSHAB CLV_IMGFIL(R11) PUSHL #<+LEN_CLV_IMGFIL> MOVL SP,R0 $GETJPIW_S ITMLST=(R0),IOSB=NLV_IOSB(R11) ADDL2 #16,SP BLBS R0,1$ PUSHL R0 CALLS #1,G^LIB$SIGNAL BRB 2$ 1$: BLBS NLV_IOSB(R11),2$ MOVZWL NLV_IOSB(R11),-(SP) CALLS #1,G^LIB$SIGNAL 2$: CLRQ -(SP) ; extract only the device/directory PUSHL # ; prefix, MOVL SP,R2 MOVAB CLV_IMGFIL(R11),DSC_IMGFIL+4(R11) $FILESCAN_S SRCSTR=DSC_IMGFIL(R11),VALUELST=(R2) MOVAB CLV_IMGFIL(R11),R0 SUBL3 R0,4(R2),DSC_IMGFIL(R11) MOVL #^A/.EXE/,@4(R2) ; add .EXE filetype after dev/dir, ADDL2 #4,DSC_IMGFIL(R11) MOVAB START_FAST_INTERFACE_EXCPTHDLR,(FP) ; set up handler to trap RTL errors, CLRL -(SP) ; create a temporary variable, PUSHAQ DSC_IMGFIL(R11) ; get shareable image version number, PUSHAL 4(SP) ; adding the shareable image to the PUSHAQ DSC_FASTSHR_VERSION ; virtual address space as needed, PUSHAQ DSC_ETHERMON_FASTSHR CALLS #4,G^LIB$FIND_IMAGE_SYMBOL BLBC R0,99$ ; abort if activation error, MOVZWL #SS$_SHRIDMISMAT,R0 ; assume error, CMPL (SP)+,#FASTSHR_VERSION ; see if patch levels match, BNEQ 99$ ; abort if not, PUSHAQ DSC_IMGFIL(R11) ; get address of fast init routine, PUSHAL L_INIT_FAST_$QIO ; adding the shareable image to the PUSHAQ DSC_INIT_FAST_$QIO ; virtual address space as needed, PUSHAQ DSC_ETHERMON_FASTSHR CALLS #4,G^LIB$FIND_IMAGE_SYMBOL BLBC R0,99$ ; abort if activation error, PUSHAQ DSC_IMGFIL(R11) ; get address of "$QIO" routine, PUSHAL L_FAST_BUFIO_READ_$QIO ; adding the shareable image to the PUSHAQ DSC_FAST_BUFIO_READ_$QIO ; virtual address space as needed, PUSHAQ DSC_ETHERMON_FASTSHR CALLS #4,G^LIB$FIND_IMAGE_SYMBOL BLBC R0,99$ ; abort if activation error, PUSHAQ DSC_IMGFIL(R11) ; get address of /D_LINE routine, PUSHAL L_FAST_$QIO_D_LINE ; adding the shareable image to the PUSHAQ DSC_FAST_$QIO_D_LINE ; virtual address space as needed, PUSHAQ DSC_ETHERMON_FASTSHR CALLS #4,G^LIB$FIND_IMAGE_SYMBOL BLBC R0,99$ ; abort if activation error, CALLS #0,@L_INIT_FAST_$QIO ; attempt to call initialization code, 99$: RET .ALIGN LONG .ENTRY FAST_$QIO,^M<> CALLG (AP),@L_FAST_BUFIO_READ_$QIO RET .ALIGN LONG .ENTRY FAST_$QIO_D_LINE,^M<> CALLG (AP),@L_FAST_$QIO_D_LINE RET .END