Here is a binary search routine for a static table that might be helpful
as an example.
The routine comes from the Jol Computer Language. Jol is a free format
scripting language based on PL/1. It makes JCL as easy to use as
Windows on a PC. It can replace JCL.
I have other code for inserting and finding Symbolic Symbol Names using
a sort of Linked List, if people are interested. It uses offsets to
table entries so that insertion can be done by using a simple MVCL to
make a hole in the table when inserting new Symbol names.
Clement Clarke,
Author of Jol - the Universal Command Language,
370 to Intel Assembly Language Convertor and other programs.
___________________
(Note - each table entry is 12 bytes. Multiply is not used to decrease
the CPU required. These days, perhaps not necessary?)
* JOLSAVE CSECT=C03FKEY,BASE=R10 86210
C03FKEY CSECT 86210
USING C03FKEY,R10 86210
SAVE (14,12) 86210
LR R10,R15 86210
* BINARY SEARCH ROUTINE, JULY, 1986 BY C. V. CLARKE.
*
* THE TABLE IS NOT A MULTIPLE OF TWO, AND THEREFORE WE WILL ASSUME
* THE TABLE HAS A MAXIMUM OF 256 ENTRIES, AND THAT THE MIDPOINT IS 128.
*
LA R1,128 BINARY MIDPOINT OF TABLE 86210
LR R6,R1 COPY TO R6 86210
AR R6,R1 DOUBLE IT BECAUSE WE MISS 1ST ENTRY87150
L R8,CTBLEND GET THE REAL END OF THE TABLE 86210
L R0,=V(UJC03KWD) LOAD ADDRESS OF TABLE TO REGISTER 86210
BINLOOP SRL R6,1 SET NEXT HALF POINT (DIV BY 2) 86210
LR R7,R1 COPY CURRENT POINT IN TABLE TO R7 86210
SLL R7,2 MULT BY 4 86210
LR R14,R7 SAVE 86210
SLL R7,1 MULT BY 2 (NOW 8 TIMES) 86210
AR R7,R14 NOW R7 CONTAINS 12 TIMES R6 86210
AR R7,R0 POINT TO REAL ADDRESS IN TABLE 86210
CR R7,R8 OVER THE END OF THE REAL TABLE ? 86210
BNL BINHIGH TOO HIGH, NOT FOUND 87150
CLC 0(8,R7),DBL HAVE WE GOT THE KEYWORD? 86210
BE BINFOUND YES 86210
BH BINHIGH TOO HIGH 86210
BINLOW SR R15,R15 SET 'TOOHIGH_IND' OFF 86210
AR R1,R6 PREPARE TO LOOK HIGHER IN TABLE 86210
B BINTEND CHECK IF END OF SEARCH 86210
BINHIGH LA R15,1 SET 'TOOHIGH_IND' ON 86210
SR R1,R6 PREPARE TO LOOK LOWER IN TABLE 86210
BINTEND LTR R6,R6 IF 0, END OF SEARCH, NOT FOUND 86210
BNZ BINLOOP GO ROUND AGAIN .... 86210
RETURN (14,12),,RC=0 DIDN'T FIND THE REQUIRED TOKEN 86210
BINFOUND LR R15,R7 GOT THE REQUIRED TOKEN 86210
RETURN (14,12),,RC=(15) GOT IT 86210
B JRETN *********************** 86210
CTBLEND DC A(UJCKEYE) END OF THE TABLE ADDRESS 86210
LTORG
DC S(*),S(*),S(*),S(*)
Here is part of the table it searches:
PRINT DATA
UJC03KWD CSECT
* TABLE OF KEYWORDS FOR UJC03DS, NOW IN ORDER OF USE FOR BINARY
* SEARCH. C. CLARKE, JULY 27, 1986
USING UJC03KWD,15
UJC03KWD CSECT
DC CL8'&& ',AL1(2+8),AL1(0),S(DSDSN)
DC CL8'ABE ',AL1(2),AL1(0),S(C) IGNORE 75311
DC CL8'ABEND ',AL1(2),AL1(0),S(C) IGNORE 75311
DC CL8'ABSTR ',AL1(1),AL1(0),S(DSABSTR)
DC CL8'ACC ',AL1(2),AL1(0),S(DSACCEPT) 75311
DC CL8'ACCEPT ',AL1(2),AL1(0),S(DSACCEPT)
DC CL8'AL ',AL1(2+8),AL1(0),S(DSAL)
DC CL8'ALIGN ',AL1(2+4),AL1(0),S(DSALIGN)
DC CL8'ALX ',AL1(2),AL1(0),S(DSALX)
DC CL8'ASCII ',AL1(2),AL1(0),S(DSASCII)
DC CL8'AUL ',AL1(2+8),AL1(0),S(DSAUL)
DC CL8'B ',AL1(1),AL1(0),S(DSBLOCK)
DC CL8'BLKSIZE ',AL1(1),AL1(0),S(DSBLOCK)
DC CL8'BLOCK ',AL1(1),AL1(0),S(DSBLOCK)
DC CL8'BLOCKSIZE ',AL1(1),AL1(0),S(DSBLOCK)
DC CL8'BLP ',AL1(2+8),AL1(0),S(DSBLP)
DC CL8'BUFFER ',AL1(1),AL1(0),S(DSBUFNO)
DC CL8'BUFFERS ',AL1(1),AL1(0),S(DSBUFNO)
DC CL8'BUFFNO ',AL1(1),AL1(0),S(DSBUFNO) 75311
... many lines deleted ....
DC CL8'VSAMTXT ',AL1(1+8),AL1(0),S(DSVSAMXT) J52
DC CL8'VSEQ ',AL1(1+8),AL1(0),S(DSVOLSEQ) 75128
DC CL8'VST ',AL1(2),AL1(0),S(ISARECFM) 75311
DC CL8'VT ',AL1(2),AL1(0),S(ISARECFM)
UJCKEYE EQU * END OF KEYWORD TABLE 86200
DC XL8'FFFFFFFFFF',AL1(2),AL1(0),S(0) 87150
END