.TITLE IMGGST Image GST handling routines .IDENT /MXB-01-01/ ;++ ; ############################################################### ; # (C) Copyright 1985 Auto-trol Technology Corporation # ; # # ; # This program is the sole property of Auto-trol Technology # ; # Corporation and is considered a trade secret and/or a # ; # proprietary product of Auto-trol Technology Corporation. # ; # Use or disclosure of this program by other than Auto-trol # ; # Technology Corporation and its assigned licensees and # ; # customers is strictly forbidden by law. # ; # # ; # Use, duplication or disclosure by the Government is subject # ; # to restrictions as set forth in subdivision (b)(3)(ii) of # ; # the Rights in Technical Data and Computer Software clause # ; # at 252.227.7013. # ; ############################################################### ; ; /BEGIN MODULE HEADER/ AUOSI /STANDARD MODULE HEADER/ ; ; NAME -- IMGGST, IMGGSR, IMGGRC ; ; PURPOSE -- Access the Image GST table, access GST sub-record ; ; KEYWORDS -- ; ; RESTRICTIONS -- ; ; CALLING SEQUENCE -- ; Call IMGGST(ADR,CTX) ; Logical Function IMGGSR (CTX,TYP,NAM,SIZ,VAL,FLAGS) ; ; INPUTS -- ; ; OUTPUTS -- ; IMGGST = 0 No more sub-records ; = 1 Valid subrecord info returned ; ; COMMON REFERENCES -- none ; ; ERRORS DETECTED -- none ; ; EXTERNAL REFERENCES -- none ; ; INTERNAL DESCRIPTION AND DESIGN CONSIDERATIONS -- ; ; NOTES -- ; ; HISTORY -- ; MM/DD/YY,SDRC,functional spec number,initials,comments ; 12/15/85,,,MXB, Initial code ; ; /END MODULE HEADER/ AUOSI /STANDARD MODULE HEADER/ ; ***************************************************************** ;-- ; ; ARGUMENTS -- ; symbol offset ; parameter description, passing mechanism ; ; COMMON -- ; ; LOCAL VARIABLES -- ; ; /END DECLARATIONS/ AUOSI /STANDARD MODULE HEADER/ ; ***************************************************************** ; ; START OF EXECUTABLE CODE -- ; .PSECT $CODE,PIC,CON,REL,LCL,SHR,EXE,RD,NOWRT ; .LIBRARY /sys$library:LIB.MLB/ $OBJDEF ; Define object language $IHDDEF ; Define image library $IHSDEF ; Image Header Symbol Table ; R_NEX = 0 ; Next record's count field R_RCC = 4 ; Records count R_LEN = 8 ; Current record length R_EOR = 12 ; Current record end pointer (past last byte) R_SUB = 16 ; Subrecord pointer ; ; Get the GST range ; ; Call IMGGST (ADR,CTX) P_ADR = 4 ; Image start pointer (for a mapped image file) P_CTX = 8 ; Context array pointer ; .ENTRY IMGGST,^M MOVL @P_ADR(AP),R2 ; Get starting image address in VA MOVZWL IHD$W_SYMDBGOFF(R2),R0 ; pick offset to IHS info ADDL2 R2,R0 ; Get pointer to IHD Symbol Table DSC MOVZWL IHS$W_GSTRECS(R0),R1 ; Get GST records count MOVL IHS$L_GSTVBN(R0),R0 ; Get the GST VBN DECL R0 ; VBN-1 ASHL #9,R0,R0 ; Make it byte offset ADDL2 R2,R0 ; Add starting addr making it pointer MOVL P_CTX(AP),R2 ; Get the context array pointer MOVL R0,R_NEX(R2) ; Load the "Next GST record" pointer MOVL R1,R_RCC(R2) ; Load the records count RET ; ; Get the next GST RECORD pointer (and size) ; iptr = IMGGRC (CTX) ; .ENTRY IMGGRC,^M MOVL 4(AP),R2 ; Get the context array PTR DECL R_RCC(R2) ; Update records count BGEQ 10$ ; GEQ = we still got a record CLRL R0 ; Set invalid record pointer RET 10$: MOVL R_NEX(R2),R0 ; Get the next record count field ptr ADDL2 #2,R0 ; The record starts past count field MOVZWL -2(R0),R1 ; Get this record length MOVL R1,R_LEN(R2) ; and load it ADDL2 #2,R1 ; Add the count field ADDL3 R1,R_NEX(R2),R_EOR(R2) ; Update End Of Record addr BLBC R1,20$ ; LBC = even length INCL R1 ; Bump to next word boundary 20$: ADDL2 R1,R_NEX(R2) ; Update the next count field ptr CLRL R_SUB(R2) ; Invalidate sub-record field RET ; ; Logical Function IMGGSR (CNTX,TYP,NAM,SIZ,VAL,FLG) ; P_CNTX = 4 P_TYP = 8 P_NAM = 12 P_SIZ = 16 P_VAL = 20 P_FLG = 24 ; .ENTRY IMGGSR,^M ; MOVL P_CNTX(AP),R11 ; Get the context array ptr MOVL R_SUB(R11),R10 ; Get the subrecord pointer BEQL 10$ ; EQL = no subrecord CMPL R_EOR(R11),R10 ; Next record start above us ? BGTR 100$ ; GTR = yes 10$: PUSHL R11 ; Push CNTX array address CALLS #1,IMGGRC ; Get next record pointer MOVL R0,R10 ; Load pointer BNEQ 20$ ; and proceed RET ; return with 0 = false 20$: CMPB #OBJ$C_GSD,GSD$B_RECTYP(R10) ; Is it GSD record ? BNEQ 10$ ; NOEQ = no, try next MOVAL 1(R10),R10 ; Get subrecord pointer MOVL R10,R_SUB(R11) ; and remember it ; ; Dispatch according to subrecord type, note, we support only ; image file GST records here ; 100$: MOVZBL (R10),@P_TYP(AP) ; Get subrec type CLRL @P_FLG(AP) CLRL @P_SIZ(AP) CLRL @P_VAL(AP) CMPB #GSD$C_PSC,(R10) ; Is it PSECT definiton ? BEQL 110$ CMPB #GSD$C_SYM,(R10) ; Is it symbol def ? BEQL 120$ CMPB #GSD$C_SPSC,(R10) ; Is it Shareable PSECT def? BEQL 130$ CMPB #GSD$C_EPM,(R10) ; Is it Entry Point Mask ? BEQL 140$ CMPB #GSD$C_PRO,(R10) ; Is it Procedure ? BEQL 150$ HALT BRB 10$ ; Skip remainder of GST rec. ; ; PSC subrecord 110$: MOVZWL GPS$W_FLAGS(R10),@P_FLG(AP); Get flags MOVL GPS$L_ALLOC(R10),@P_SIZ(AP) MOVZBL GPS$B_NAMLNG(R10),R9 MOVAL GPS$T_NAME(R10),R8 BRB 300$ ; ; SYM subrecord 120$: MOVZWL SDF$W_FLAGS(r10),@P_FLG(AP) MOVL SDF$L_VALUE(R10),@P_VAL(AP) ; Symbol value MOVZBL SDF$B_NAMLNG(R10),R9 ; Name length MOVAL SDF$T_NAME(R10),R8 BRB 300$ ; ; SPSC subrecord 130$: MOVZWL SGPS$W_FLAGS(R10),@P_FLG(AP) MOVL SGPS$L_ALLOC(R10),@P_SIZ(AP) MOVL SGPS$L_BASE(R10),@P_VAL(AP) MOVZBL SGPS$B_NAMLNG(R10),R9 MOVAL SGPS$T_NAME(R10),R8 BRB 300$ ; ; EPM subrecord 140$: MOVZWL EPM$W_FLAGS(R10),@P_FLG(AP) ; MOVL EPM$L_PSINDX(R10),@P_SIZ(AP) ; Return PSET Index in Size MOVL EPM$L_ADDRS(R10),@P_VAL(AP) MOVZBL EPM$B_NAMLNG(R10),R9 MOVAL EPM$T_NAME(R10),R8 BRB 300$ ; ; PRO subrecord (this is difficult, poorly defined in LINKer manual) 150$: MOVZWL PRO$W_FLAGS(R10),@P_FLG(AP) ; MOVL PRO$L_PSINDX(R10),@P_SIZ(AP) ; Return PSET Index in Size MOVL PRO$L_ADDRS(R10),@P_VAL(AP) MOVZBL PRO$B_NAMLNG(R10),R9 MOVAL PRO$T_NAME(R10),R8 MOVC5 R9,(R8),#^A/ /,#32,@P_NAM(AP) ; Load the name ADDL3 R8,R9,R10 ; Update sub-record TSTB (R10)+ ; Skip B_MINARGS MOVZBL (R10)+,R2 ; Get B_MAXARGS BEQL 350$ ; None = done 160$: TSTB (R10)+ ; Skip ARG$B_VALCTL MOVZBL (R10)+,R1 ; Get ARG$B_BYTECNT ADDL2 R1,R10 ; Move to next arg SOBGTR R2,160$ BRB 350$ ; ; Common final 300$: MOVC5 R9,(R8),#^A/ /,#32,@P_NAM(AP) ; Load the name ADDL3 R8,R9,R10 ; Update sub-record 350$: MOVL R10,R_SUB(R11) ; remember next sub-record MOVL #-1,R0 ; Logical TRUE RET ; .END