I cheated a bit. I looked at the IEABRCX macro to see what IBM did. I then looked to see what other instructions have a relative variant. Suppose you have IBM macros with the LA in them. At the beginning of your program put the instruction:
_LA_ OPSYN LA before invoking the macro, do: LA OPSYN LALR to use the Load Address Long Relative. after the macro do: LA OPSYN _LA_ to put LA back to "normal". Of course, this only works if the hardware you're supporting implements the required relative instruction. Assuming there is one. On Fri, Apr 5, 2013 at 2:39 PM, Bernd Oppolzer <[email protected]>wrote: > Hello all, > > since some weeks now, I am in charge to support our inhouse ASSEMBLER > macros > which support our remaining ASSEMBLER developers. These are a special > flavour > of structured programming macros and other macros to do everyday > standard work. > It's because the only fellow worker who did this before me has just > retired and he > handed this task over to me. > > We also have two macros to support the construction of subroutines > inside of large > programs. They establish a base register (or two), save some registers > and restore > them on return, but they don't do save area chaining. > > Because the USING point is at the start of the subroutine and the > literals are at the > end (using LTORG), and the number of base registers is limited to two, > the size of > every individual subroutine is limited to 8k. > > Now I thought about getting rid of this limit by moving the USING point > to the end of > the subroutine and move all the code in between to baseless coding. This > should be > possible, because the SP macros already generate J instructions. > > When I did this, I realized that some of our other macros generated > inline definitions > and LA instructions, for example - that is, they didn't work without a > base register. > I corrected that by using BAS etc., or in some cases, by establishing > temporary > base registers, using R15, for example. For some old programs and embedded > IBM macros like LOAD, I used IEABRCX DEFINE, which could be included > by a keyword parameter on the central overall start macro (RELB=YES). > > Now (almost) everything works fine; I can write very large subroutines. > I already migrated some very large programs, and it worked without > problems; > the programs had always addressibility issues in the past, and now it's > all fine. > And: the programs do the same things as before :-) > > But there are some annoying exceptions: > > - normal IBM CALL generates inline definitions and LA instructions > > - IBM GETMAIN RC,LV=(R1) generates inline definitions and LA etc. > > How can I fix this? I have the old macros still at hand; fortunately I > gave new names > to the new macros, so I can mix old and new ones. I can also establish a > temporary > base register around the GETMAIN, for example, but that's not very nice. > > Are there any parameter which I'm possibly not aware of, or: should I > get rid of > those GETMAIN calls in favor of more modern calls, like STORAGE OBTAIN? > What is the right way to go? > > Sorry, if this is too obvious for you ... I've had not much time in the > last years to > deal with those ASSEMBLER topics and had no time to really take over the > task from my former co-worker, so I feel a little bit like a beginner. > But it's much fun :-) > > Kind regards > > Bernd > -- This is a test of the Emergency Broadcast System. If this had been an actual emergency, do you really think we'd stick around to tell you? Maranatha! <>< John McKown
