I did this long ago for a COBOL program. Excerpts below.
... save ...
MAINLINE DS 0H
L R15,=A(DO31BIT+X'80000000') JM0803
BASSM R14,R15 FORCE 31 BIT MODE JM0803
* JM0803
* THE PREVIOUS TWO INSTRUCTIONS FORCE THE CPU INTO 31 BIT MODE
* WHILE BRANCHING TO THE LABEL 'DO31BIT'.
* JM0803
DO31BIT DS 0H JM0803
ST R14,MODE SAVE CURRENT MODE JM0803
NC MODE,=X'80000000' CLEAR BITS JM0803
* JM0803
* THE BASSM INSTRUCTION PLACED THE CURRENT PSW ADDRESS INTO R14.
* THIS INCLUDES THE THEN-CURRENT ADDRESSING MODE. IF THE HIGH BIT
* OF REG 14 IS 1, THEN THE CPU WAS ALREADY IN 31 BIT MODE. IF IT
* WAS ZERO, THEN THE CPU WAS IN 24 BIT MODE. IN EITHER CASE, THE
* CPU WILL BE IN 31-BIT MODE AFTER THE BASSM.
* WE SAVE THE HIGH-BIT OF R14 SO THAT WE CAN RETURN TO THE
* ORIGINAL CALLER IN HIS ORIGINAL ADDRESSING MODE.
* JM0803
...
... code
...
... return
* LET'S GO BACK TO THE CALLER. SINCE WE MAY NEED TO CHANGE BACK
* TO 24 BIT MODE, WE CAN'T USE THE RETURN MACRO. SO LET'S JUST
* ISSUE THE INSTRUCTIONS OURSELVES. THE MAIN DIFFERENCE BELOW
* IS THE USE OF THE BSM INSTRUCTION INSTEAD OF THE BR INSTRUCTION.
* THE BSM INSTRUCTION WILL CHANGE THE MODE AS APPROPRIATE.
* JM0803
LR R1,R13 SAVE REGISTER 13 JM0803
L R13,4(,R13) GET CALLER'S R13 JM0803
L R14,12(,R13) GET RETURN ADDRESS JM0803
O R14,MODE SET ORIGINAL JM0803
* ADDRESSING MODE JM0803
LM R0,R12,20(R13) RELOAD REGISTERS JM0803
SLR R15,R15 ZERO COND CODE JM0803
OI 15(R13),X'01' SET FLAG JM0803
BSM R0,R14 RETURN TO CALLER JM0803
* WHILE SETTING THE JM0803
* ADDRESS MODE JM0803
That is directly from my code.
--
"Pessimism is a admirable quality in an engineer. Pessimistic people check
their work three times, because they're sure that something won't be right.
Optimistic people check once, trust in Solis-de to keep the ship safe, then
blow everyone up."
"I think you're mistaking the word optimistic for inept."
"They've got a similar ring to my ear."
From "Star Nomad" by Lindsay Buroker:
Maranatha! <><
John McKown