.TITLE RLD2 .IDENT /hah002/ .PSECT CODE,RO ; ; VERSION 01 ; ; TOM GETZINGER 30-MAY-80 ; ; Modified: 07-Nov-83 hah002 ; Add support for library base additive relocation ; ; THIS MODULE PROCESSES "RLD" RECORDS IN PASS 2 ; ; 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 CODE RLD2:: MOV R2,-(SP) ; SAVE R2 10$: 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? BNE 75$ ; YES, SOMETHING'S WRONG 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 BEQ 75$ ; THERE IS NONE 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? BEQ 75$ ; YES, SO SOMETHING'S WRONG BR 80$ ; NO, SO SPLIT THE TEXT WORD 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 75$: JMP 200$ ; NO, SOMETHING'S WRONG 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 BCC 85$ ; WE GOT IT OKAY TRAP NOMEM ; "NO DYNAMIC MEMORY" JMP 220$ 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? BNE 200$ ; YES, SO SOMETHING'S WRONG BIS #TF.REL,T.FLAG(R2) ; NO, BUT IT IS NOW MOVB CMD,R1 ; GET RELOCATION COMMAND ; CMP R1,#RT.COM ; IS THE COMMAND TOO BIG? ;hah002 CMP R1,#RT.max ; IS THE COMMAND TOO BIG? ;hah002 BHI 200$ ; 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 CALL SELECT ; GO PROCESS IT ; .BYTE RT.I,RT.COM ;hah002 .BYTE RT.I,RT.max ;hah002 .WORD 200$ ; ILLEGAL .WORD 120$ ; INTERNAL .WORD 10$ ; GLOBAL .WORD 10$ ; INTERNAL DISPLACED .WORD 10$ ; GLOBAL DISPLACED .WORD 10$ ; GLOBAL ADDITIVE .WORD 10$ ; GLOBAL ADDITIVE DISPLACED .WORD 200$ ; LOCATION COUNTER DEFINITION .WORD 200$ ; LOCATION COUNTER MODIFICATION .WORD 158$ ; .LIMIT .WORD 130$ ; PSECT .WORD 200$ ; ILLEGAL .WORD 130$ ; PSECT DISPLACED .WORD 140$ ; PSECT ADDITIVE .WORD 140$ ; PSECT ADDITIVE DISPLACED .WORD 160$ ; COMPLEX .word 10$ ;Library base additive ;hah002 120$: MOV CRNPSN,R0 ; GET CURRENT PSECT NUMBER MOV VAL,R1 ; GET OFFSET BR 155$ 130$: CLR R1 ; CLEAR OFFSET BR 150$ 140$: MOV VAL,R1 ; GET OFFSET 150$: MOV #NAME,R0 ; GET PSECT NUMBER CALL PSCNUM 155$: CALL SETREF ; SET A REFERENCE 156$: JMP 10$ 158$: MOV (R2),R0 ; GET LINK TO NEXT WORD OF TEXT BEQ 200$ ; THERE IS NONE MOV (R0),(R2) ; REMOVE THIS TEXT FROM THE LINKED LIST MOV R0,R2 TST T.FLAG(R2) ; IS THIS A NORMAL WORD IF TEXT? BNE 200$ ; NO, SO SOMETHING'S WRONG MOV #FREEHD,R0 MOV #T.LEN,R1 CALL $RLCB ; RELEASE THE TEXT BR 156$ ; AND WE'RE DONE 160$: DEC R4 ; ANY RLD BYTES LEFT? BMI 200$ ; NO, SOMETHING'S WRONG 165$: MOVB (R3)+,R1 ; GET COMPLEX COMMAND CALL SELECT ; AND PROCESS IT .BYTE CT.STR,CT.ABS .WORD 160$ ; OUT OF RANGE .WORD 10$ ; STORE .WORD 10$ ; STORE DISPLACED .WORD 200$ ; ILLEGAL .WORD 200$ ; ILLEGAL .WORD 170$ ; FETCH GLOBAL .WORD 190$ ; FETCH RELOCATABLE VALUE .WORD 180$ ; FETCH ABS VALUE 170$: SUB #5,R4 ; ARE THERE ENOUGH RLD BYTES FOR THE GLOBAL? BMI 200$ ; NO, SOMETHING'S WRONG ADD #4,R3 ; YES, SO SKIP IT BR 165$ ; AND CONTINUE PROCESSING 180$: SUB #3,R4 ; ARE THERE ENOUGH RLD BYTES FOR THE ABS VALUE? BMI 200$ ; NO, SOMETHING'S WRONG ADD #2,R3 ; YES, SO SKIP IT BR 165$ ; AND CONTINUE PROCESSING 190$: SUB #4,R4 ; ARE THERE ENOUGH RLD BYTES FOR THE REL VALUE? BMI 200$ ; NO, SOMETHING'S WRONG 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 200$: TRAP OBJFMT ; OBJECT FORMAT ERROR BR 220$ 210$: CLC ; CLEAR ERROR FLAG 220$: MOV (SP)+,R2 ; RESTORE R2 RETURN ; AND WE'RE DONE .END