2 TITLE SQUOZE TABLE HANDLER FOR MUDDLE
8 .GLOBAL SQUPNT,ATOSQ,SQUTOA,GETSQU,CSQUTA,MPOPJ,SAT,SQUKIL,SQKIL
10 ; ROUTINE TO KILL FIXUP TABLE SOMETIMES
12 SQUKIL: PUSH P,0 ; SAVE ACS
13 HRRZ 0,SQUPNT ; SEE IF IN INTERPRETER
21 PUSHJ P,SQKIL ; KILL THE BUFFER AND RESTORE INTERPRETER
24 POP P,C ; RESTORE AC'S
31 ; POINTER TO TABLE FILLED IN BY INITM
33 ; SUBR TO INTERFACE TO MUDDLE SQUOZE TABLE.
34 ; IT TAKES AN ARGUMENT OF PRIMTYPE WORD AND RETURNS A FIX GIVING THE
35 ; LOCATION IF IT IS IN THE SQUOZE TABLE AND OTHERWISE RETURNS FALSE
41 PUSHJ P,SAT ; GET SAT OF ARGUMENT
42 CAIE A,S1WORD ; BETTER BE OF PRIMTYPE WORD
44 MOVE A,1(AB) ; GET ARGUMENT INTO A
50 ; COMPILER ENTRY TAKES ARGUMENT IN A
52 CSQUTA: SUBM M,(P) ; RELATAVIZE P
53 MOVE E,A ; ARG TO SQUOTA
54 TLZ E,740000 ; FLUSH EXTRA BITS FOR LOOKUP
57 SOS (P) ; AND SKIP RETURN
59 MOVSI A,TFIX ; RETURN FIX
62 GTFALS: PUSHJ P,SQUKIL
65 JRST MPOPJ ; RETURN A FALSE
68 ; GIVEN LOCN OF SUBR RET SQUO NAME ARG AND VAL IN E
73 MOVE A,SQUPNT ; GET TABLE POINTER
79 POPABJ: PUSH P,E ; SAVE RESULT
90 ; BINARY SEARCH FOR SQUOZE SYMBOL ARG IN E
99 MOVE A,SQUPNT ; POINTER TO TABLE
102 HRLI B,(B) ; B IS CURRENT OFFSET
104 UP: ASH B,-1 ; HALVE TABLE
105 AND B,[-2,,-2] ; FORCE DIVIS BY 2
106 MOVE C,A ; COPY POINTER
107 JUMPLE B,LSTHLV ; CANT GET SMALLER
109 CAMLE E,(C) ; SKIP IF EITHER FOUND OR IN TOP
110 MOVE A,C ; POINT TO SECOND HALF
111 CAMN E,(C) ; SKIP IF NOT FOUND
113 CAML E,(C) ; SKIP IF IN TOP HALF
115 HLLZS C ; FIX UP OINTER
119 WON: MOVE E,1(C) ; RET VAL IN E
126 LSTHLV: CAMN E,(C) ; LINEAR SERCH REST
130 JRST WON1 ; ALL GONE, LOSE