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

Reply via email to