--- /dev/null
+
+TITLE SQUOZE TABLE HANDLER FOR MUDDLE
+
+RELOCATABLE
+
+.INSRT MUDDLE >
+
+.GLOBAL SQUPNT,ATOSQ,SQUTOA,GETSQU,CSQUTA,MPOPJ,SAT,SQUKIL,SQKIL
+
+; ROUTINE TO KILL FIXUP TABLE SOMETIMES
+
+SQUKIL: PUSH P,0 ; SAVE ACS
+ HRRZ 0,SQUPNT ; SEE IF IN INTERPRETER
+ CAIG 0,HIBOT
+ JRST POPJ0
+ PUSH P,A
+ PUSH P,B
+ PUSH P,C
+ PUSH P,D
+ PUSH P,E
+ PUSHJ P,SQKIL ; KILL THE BUFFER AND RESTORE INTERPRETER
+ POP P,E
+ POP P,D
+ POP P,C ; RESTORE AC'S
+ POP P,B
+ POP P,A
+POPJ0: POP P,0
+ POPJ P,
+
+
+; POINTER TO TABLE FILLED IN BY INITM
+
+; SUBR TO INTERFACE TO MUDDLE SQUOZE TABLE.
+; IT TAKES AN ARGUMENT OF PRIMTYPE WORD AND RETURNS A FIX GIVING THE
+; LOCATION IF IT IS IN THE SQUOZE TABLE AND OTHERWISE RETURNS FALSE
+
+ MFUNCTION SQUOTA,SUBR
+ ENTRY 1
+
+ GETYP A,(AB)
+ PUSHJ P,SAT ; GET SAT OF ARGUMENT
+ CAIE A,S1WORD ; BETTER BE OF PRIMTYPE WORD
+ JRST WTYP1
+ MOVE A,1(AB) ; GET ARGUMENT INTO A
+ PUSHJ P,CSQUTA
+ JFCL
+ JRST FINIS
+
+
+; COMPILER ENTRY TAKES ARGUMENT IN A
+
+CSQUTA: SUBM M,(P) ; RELATAVIZE P
+ MOVE E,A ; ARG TO SQUOTA
+ TLZ E,740000 ; FLUSH EXTRA BITS FOR LOOKUP
+ PUSHJ P,SQUTOA
+ JRST GTFALS
+ SOS (P) ; AND SKIP RETURN
+ PUSHJ P,SQUKIL
+ MOVSI A,TFIX ; RETURN FIX
+ MOVE B,E
+ JRST MPOPJ
+GTFALS: PUSHJ P,SQUKIL
+ MOVE A,$TFALSE
+ MOVEI B,0
+ JRST MPOPJ ; RETURN A FALSE
+
+
+; GIVEN LOCN OF SUBR RET SQUO NAME ARG AND VAL IN E
+
+ATOSQ: PUSH P,B
+ PUSH P,A
+ PUSHJ P,GETSQU
+ MOVE A,SQUPNT ; GET TABLE POINTER
+ MOVE B,[2,,2]
+ CAMN E,1(A)
+ JRST ATOSQ1
+ ADD A,B
+ JUMPL A,.-3
+POPABJ: PUSH P,E ; SAVE RESULT
+ PUSHJ P,SQUKIL
+ POP P,E
+ POP P,B
+ POP P,A
+ POPJ P,
+
+ATOSQ1: MOVE E,(A)
+ AOS -2(P)
+ JRST POPABJ
+
+; BINARY SEARCH FOR SQUOZE SYMBOL ARG IN E
+
+SQUTOA: PUSH P,A
+ PUSH P,B
+ PUSH P,C
+ PUSH P,E
+ PUSHJ P,GETSQU
+ POP P,E
+
+ MOVE A,SQUPNT ; POINTER TO TABLE
+ HLRE B,SQUPNT
+ MOVNS B
+ HRLI B,(B) ; B IS CURRENT OFFSET
+
+UP: ASH B,-1 ; HALVE TABLE
+ AND B,[-2,,-2] ; FORCE DIVIS BY 2
+ MOVE C,A ; COPY POINTER
+ JUMPLE B,LSTHLV ; CANT GET SMALLER
+ ADD C,B
+ CAMLE E,(C) ; SKIP IF EITHER FOUND OR IN TOP
+ MOVE A,C ; POINT TO SECOND HALF
+ CAMN E,(C) ; SKIP IF NOT FOUND
+ JRST WON
+ CAML E,(C) ; SKIP IF IN TOP HALF
+ JRST UP
+ HLLZS C ; FIX UP OINTER
+ SUB A,C
+ JRST UP
+
+WON: MOVE E,1(C) ; RET VAL IN E
+ AOS -3(P) ; SKIP RET
+WON1: POP P,C
+ POP P,B
+ POP P,A
+ POPJ P,
+
+LSTHLV: CAMN E,(C) ; LINEAR SERCH REST
+ JRST WON
+ ADD C,[2,,2]
+ JUMPL C,.-3
+ JRST WON1 ; ALL GONE, LOSE
+
+
+IMPURE
+SQUPNT: 0
+
+PURE
+END
+\f
\ No newline at end of file