.TITLE RLD2 .IDENT /hah015/ .PSECT CODE,RO ; ; VERSION 01 ; ; TOM GETZINGER 30-MAY-80 ; ; Modified: 07-Nov-83 hah002 ; Add support for library base additive relocation ; 27-Jul-85 hah010 ; Convert SELECT subroutine to support DOB as a I&D space task. ; 07-Aug-85 hah012 ; Add additional error messages. ; 17-Aug-85 hah015 ; Call new routine to allocate block and extend task if needed. ; ; THIS MODULE PROCESSES "RLD" RECORDS IN PASS 2 ; ; MACROs ;hah010 ; ;hah010 .macro select table ;hah010 mov r0,-(sp) ;Save R0 (restored by SELECT) ;hah010 mov table, r0 ;hah010 call select ;hah010 .endm ;hah010 ; ; LOCAL DATA ; .PSECT RWDATA,RW,D BYTMOD: .BLKB 1 ; SET IF BYTE MODIFICATION CMD: .BLKB 1 ; CURRENT RELOCATION COMMAND VAL: ; CURRENT RELOCATION VALUE MODADR: .BLKW 1 ; CURRENT MODIFICATION ADDRESS NAME: .BLKW 2 ; CURRENT RELOCATION NAME .PSECT RODATA,RO,D table: ;hah010 .BYTE RT.I,RT.max ;hah010 .WORD illopc ; ILLEGAL ;hah010 .WORD intrel ; INTERNAL ;hah010 .WORD skip ; GLOBAL ;hah010 .WORD skip ; INTERNAL DISPLACED ;hah010 .WORD skip ; GLOBAL DISPLACED ;hah010 .WORD skip ; GLOBAL ADDITIVE ;hah010 .WORD skip ; GLOBAL ADDITIVE DISPLACED ;hah010 .WORD illopc ; LOCATION COUNTER DEFINITION ;hah010 .WORD illopc ; LOCATION COUNTER MODIFICATION ;hah010 .WORD limt ; .LIMIT ;hah010 .WORD psct ; PSECT ;hah010 .WORD illopc ; ILLEGAL ;hah010 .WORD psct ; PSECT DISPLACED ;hah010 .WORD psctad ; PSECT ADDITIVE ;hah010 .WORD psctad ; PSECT ADDITIVE DISPLACED ;hah010 .WORD cmplx ; COMPLEX ;hah010 .word skip ;Library base additive ;hah010 table1: ;hah010 .BYTE CT.STR,CT.ABS ;hah010 .WORD cmplx ; OUT OF RANGE ;hah010 .WORD skip ; STORE ;hah010 .WORD skip ; STORE DISPLACED ;hah010 .WORD illopc ; ILLEGAL ;hah010 .WORD illopc ; ILLEGAL ;hah010 .WORD ftcgbl ; FETCH GLOBAL ;hah010 .WORD ftcrel ; FETCH RELOCATABLE VALUE ;hah010 .WORD ftcabs ; FETCH ABS VALUE ;hah010 .PSECT CODE .enabl lsb ;hah010 RLD2:: MOV R2,-(SP) ; SAVE R2 skip: SUB #2,R4 ; ANY MORE RELOCATION ENTRIES? BMI 45$ ; NO CLRB BYTMOD ; ASSUME WORD MODIFICATION MOVB (R3)+,CMD ; GET RELOCATION COMMAND BPL 20$ ; OUR ASSUMPTION WAS CORRECT INCB BYTMOD ; NO IT WASN'T, SO SET BYTE MOD FLAG BICB #200,CMD ; CLEAR MODIFICATION FLAG 20$: MOVB (R3)+,R0 ; GET DISPLACEMENT ADD LSTADR,R0 ; CONVERT TO ADDRESS MOV R0,MODADR ; AND SAVE IT CMPB CMD,#RT.LCD ; LOCATION COUNTER DEFINITION? BEQ 30$ ; YES CMPB CMD,#RT.LCM ; NO, LOCATION COUNTER MODIFICATION? BNE 50$ ; NO 30$: CALL DASM2 ; DISASSEMBLE ANY PREVIOUS TEXT MOV R4,-(SP) ; SAVE R4 CLR R4 CALL RLSTXT ; RELEASE REMAINING TEXT MOV (SP)+,R4 ; RESTORE R4 CMPB CMD,#RT.LCD ; LOCATION COUNTER DEFINITION? BNE 40$ ; NO MOV #CRNPSC,R0 CALL GETR50 ; GET CURRENT PSECT NAME CALL PSCNUM ; GET CURRENT PSECT NUMBER MOV R0,CRNPSN ; AND SAVE IT 40$: CALL GETWRD ; GET CURRENT ADDRESS MOV R0,CRNADR ; AND SAVE IT TST R4 ; ANY RLD ENTRIES LEFT? beq 45$ ;No, we are done. BR wont reach ;hah012 trap relsiz ;hah012 45$: JMP 210$ ; NO, SO WE'RE DONE 50$: BIC #1,R0 ; CALCULATE WORD MOD ADDR MOV #FRSTXT,R2 ; GET FIRST LINK 60$: MOV (R2),R2 ; LINK TO NEXT TEXT bne 62$ ;Have some ;hah012 trap reltxt ;No text to left relocate ;hah012 62$: ;hah012 CMP T.ADDR(R2),MODADR ; DO THE ADDRESSES MATCH? BNE 70$ ; NO CMPB T.FLAG(R2),BYTMOD ; ARE THEY THE SAME LENGTH? BEQ 90$ ; YES TST BYTMOD ; NO, ARE WE MODIFYING A WORD? bne 80$ ;No, so split the text word ;hah012 trap wrdrel ;Trying to relocate word @ odd address ;hah012 70$: CMP R0,T.ADDR(R2) ; DO WORD ADDRESSES MATCH? BNE 60$ ; NO, KEEP LOOKING TSTB T.FLAG(R2) ; IS TEXT A WORD? BNE 60$ ; NO, SO KEEP LOOKING TSTB BYTMOD ; BYTE MODIFICATION? BNE 80$ ; YES, SO SPLIT THE TEXT WORD trap wrdrel ;Trying to relocate word @ odd address ;hah012 80$: MOV #FREEHD,R0 ; ALLOCATE A MEMORY BLOCK MOV #-T.LEN,R1 ; FOR THE TEXT BYTE MOV R2,-(SP) ; SAVE POINTER ; CALL $RQCB ; ALLOCATE A TEXT BLOCK ;hah015 ; BCC 85$ ; WE GOT IT OKAY ;hah015 ; TRAP NOMEM ; "NO DYNAMIC MEMORY" ;hah015 ; JMP 220$ ;hah015 call getblk ;Allocate a text block ;hah015 85$: MOV (SP)+,R2 ; RESTORE POINTER MOV T.NEXT(R2),T.NEXT(R0) ; LINK NEW TEXT IN MOV R0,T.NEXT(R2) MOVB #TF.BYT,T.FLAG(R2) ; CHANGE WORD TO BYTE MOV #TF.BYT,T.FLAG(R0) ; AND MAKE NEW TEXT A BYTE MOVB T.VAL+1(R2),T.VAL(R0) ; SET VALUE CLRB T.VAL+1(R2) ; REMOVE UPPER BYTE FROM OLD TEXT CLRB T.VAL+1(R0) ; AND ENSURE IT'S CLEARED ON NEW TEXT MOV T.ADDR(R2),T.ADDR(R0) ; GET ADDRESS INC T.ADDR(R0) BIT #1,MODADR ; ARE WE POINTING TO THE RIGHT BYTE BEQ 90$ ; YES MOV (R2),R2 ; NO, SO GO TO IT 90$: BIT #TF.REL,T.FLAG(R2) ; HAS TEXT ALREADY BEEN RELOCATED? beq 92$ ;No, continue ;hah012 trap relrel ;Can't relocate relocated record ;hah012 92$: ;hah012 BIS #TF.REL,T.FLAG(R2) ; NO, BUT IT IS NOW MOVB CMD,R1 ; GET RELOCATION COMMAND CMP R1,#RT.max ; IS THE COMMAND TOO BIG? ;hah002 BHI illopc ; YES MOVB CMDFLG(R1),R1 ; GET THE FLAGS BIT #CF.NAM,R1 ; DOES CMD NEED A NAME? BEQ 100$ ; NO MOV #NAME,R0 ; YES, SO GET IT CALL GETR50 100$: BIT #CF.VAL,R1 ; DOES CMD NEED A VALUE? BEQ 105$ ; NO CALL GETWRD ; YES, SO GET IT MOV R0,VAL ; AND SAVE IT 105$: BIT #CF.DSP,R1 ; IS THE TEXT DIPLACED? BEQ 110$ ; NO BIS #TF.DSP,T.FLAG(R2) ; YES, SO INDICATE IT 110$: MOVB CMD,R1 ; GET CMD select #table ;hah010 intrel: MOV CRNPSN,R0 ; GET CURRENT PSECT NUMBER MOV VAL,R1 ; GET OFFSET BR 155$ psct: CLR R1 ; CLEAR OFFSET BR 150$ psctad: MOV VAL,R1 ; GET OFFSET 150$: MOV #NAME,R0 ; GET PSECT NUMBER CALL PSCNUM 155$: CALL SETREF ; SET A REFERENCE 156$: JMP skip limt: MOV (R2),R0 ; GET LINK TO NEXT WORD OF TEXT bne 162$ ;Got some ;hah012 trap lmt2nd ;No second word for .LIMIT ;hah012 162$: ;hah012 MOV (R0),(R2) ; REMOVE THIS TEXT FROM THE LINKED LIST MOV R0,R2 TST T.FLAG(R2) ; IS THIS A NORMAL WORD IF TEXT? beq 164$ ;Yes ;hah012 trap lmtrel ;Relocated record is target of .LIMIT ;hah012 164$: ;hah012 MOV #FREEHD,R0 MOV #T.LEN,R1 CALL $RLCB ; RELEASE THE TEXT BR 156$ ; AND WE'RE DONE cmplx: DEC R4 ; ANY RLD BYTES LEFT? bpl 165$ ;Yes, continue ;hah012 trap relsiz ;Bad record length ;hah012 165$: MOVB (R3)+,R1 ; GET COMPLEX COMMAND select #table1 ;hah010 ftcgbl: SUB #5,R4 ; ARE THERE ENOUGH RLD BYTES FOR THE GLOBAL? bpl 175$ ;Yes, continue ;hah012 trap relsiz ;Bad record length ;hah012 175$: ;hah012 ADD #4,R3 ; YES, SO SKIP IT BR 165$ ; AND CONTINUE PROCESSING ftcabs: SUB #3,R4 ; ARE THERE ENOUGH RLD BYTES FOR THE ABS VALUE? bpl 185$ ;Yes, continue ;hah012 trap relsiz ;Bad record length ;hah012 185$: ;hah012 ADD #2,R3 ; YES, SO SKIP IT BR 165$ ; AND CONTINUE PROCESSING ftcrel: SUB #4,R4 ; ARE THERE ENOUGH RLD BYTES FOR THE REL VALUE? bpl 195$ ;Yes, continue ;hah012 trap relsiz ;Bad record length ;hah012 195$: ;hah012 CLR R0 ; GET PSECT NUMBER BISB (R3)+,R0 CLR R1 ; GET OFFSET BISB (R3)+,R1 SWAB R1 BISB (R3)+,R1 SWAB R1 CALL SETREF ; SET A REFERENCE BR 165$ ; AND CONTINUE PROCESSING illopc: TRAP OBJFMT ; OBJECT FORMAT ERROR BR 220$ 210$: CLC ; CLEAR ERROR FLAG 220$: MOV (SP)+,R2 ; RESTORE R2 RETURN ; AND WE'RE DONE .END