This trap simply converts addresses in A0 or A1 which are relative to A6 into absolute addresses for the next TRAP #2 or TRAP #3 call. Calling TRAP #4 corrupts D0 - all other registers are preserved.
Basically, bit 7 of JB_RELA6 is set in the job's header, don't try this for some other job, only the current one. When the next TRAP #2 or TRAP #3 system call is made, the value in A6 is added to A0 or A1 to make the addresses absolute rather than relative. A6 is not affected by this action.
When the TRAP #2 or TRAP #3 routine has finished, bit 7 of JB_RELA6 in this job's header is reset automatically unless the error ERR_NO (Channel not open) occurs after a TRAP #3. In this case, you are responsible for clearing the bit.
How do you find and reset bit 7 of JB_RELA6 ? As follows :
This translates to the following code :
clear moveq #0,d0 ; MT_INF trap #1 ; Get system variables address into A0 move.l $64(a0),a0 ; Get current job entry in QDOS job table into A0 move.l (a0),a0 ; Get start of this job's header = JB_LEN bclr #7,$16(a0) ; Clear bit 7 of JB_RELA6