I think your "clever code" would look a lot less confusing if you posted the actual source code rather than a disassembly. All those hard to follow EQUs wouldn't be there; rather, there would probably just be a handful of ENTRY statements.
I don't think making code easy to disassemble is a particularly important goal of how one writes assembler code. Or maybe get a better disassembler... Tony H. On Tue, 17 Feb 2026 at 13:21, Martin Ward <[email protected]> wrote: > Some "clever code" for everyone to "celebrate". > When I saw it, I have to confess, I *didn't* think > "Why didn't I think of that?"(!) > > The module starts with a block of data, followed by some code > (do you think that this will be dead code therefore?): > > A00000 DC X'000047F0' > DC X'F01447F0' > DC X'F01047F0' > DC X'F00C47F0' > DC X'F00847F0' > DC X'F004' > STM 14,12,12(13) > L 0,0(0,1) > > The entry points, XXXX, YYYY, XXXX1, XXXX2 and YYYY1, are defined > as EQUates which are offsets into this data block: > > XXXX EQU A00000+2 > YYYY EQU XXXX+4 > XXXX1 EQU YYYY+4 > XXXX2 EQU XXXX1+4 > YYYY1 EQU XXXX2+4 > > So when you call "XXXX" you start executing the data two bytes > after the address A00000. This happens to be the hex data X'47F0F014' > which is, of course, the object code for a branch instruction. > The instruction will branch to the address at X'0014' off R15. > Since R15 is the address of the entry point, this will branch > to address X'00016' which is the STM instruction. > > It copies R15 to R1, does a BALR on R15 (to get a single base address > for the USING), then compares R1 with the address A00028 > to get an offset into a jump table, which it loads and branches to. > > The jump table code blocks just set R3 to 0, 1, 2, 3 or 4 and > branch to A00062. > > I mean, you could just copy the savearea chaining and set R3 > for each entry point, but that would be boring! > > To see if R3 equals 2, we could do CH R3,=H'2' but that is too boring! > > So we do: > > CH 3,A001EA > > where A001EA is defined as: > > A001EA EQU A001E8+2 > > and A001E8 is, naturally, a table of two halfwords: > > A001E8 DC X'00010002' > > Wasn't that clever! > > -- > Martin > > Dr Martin Ward | Email: [email protected] | http://www.gkc.org.uk > G.K.Chesterton site: http://www.gkc.org.uk/gkc | Erdos number: 4 >
