The original post made no mention of what problem (if any was 
encountered).

There is no need to LLGTR or OILL. The value returned from LOAD is 
suitable for use by BASSM. Thus it has the low bit on when the module is 
AMODE 64.

But the right thing to do after the load is to save the 64-bit GR0 not the 
32-bit GR0. The LLGTR will be OK as long as the module is below 2G (it 
does not clear bit 63), but someday the module might be above 2G. You 
don't want to be clearing 33 bits of a 64-bit address.

When you want to call, assuming that you want to place the entry point 
address in register 15, set 64-bit GR15 and issue BASSM 14,15.

But of course you'd better make sure that any data that that target 
routine will rely on has also been set up properly (such as the high 
halves of parameter list address and save area address). Thus (adding the 
LLGTR for R1, and changing PROG64@ to be a doubleword and using LG)

LARL  R1,STRUCT31    31 Bit Structure
LLGTR R1,R1          Clear high bit in case it's an AMODE 64 target
LG    R15,PROG64@    Get 64-bit Target Routine Address from Load
BASSM R14,R15        Call PROG64 in whatever AMODE it is defined to be

Where PROG64@ is not "A" or even "2A" but "AD". It should be double-word 
aligned for best processing.

Peter Relson
z/OS Core Technology Design

Reply via email to