--- /dev/null
+TITLE SQUOZE TABLE HANDLER FOR MUDDLE\r
+\r
+RELOCATABLE\r
+\r
+.INSRT MUDDLE >\r
+\r
+.GLOBAL SQUPNT,ATOSQ,SQUTOA\r
+\r
+; POINTER TO TABLE FILLED IN BY INITM\r
+\r
+SQUPNT: 0\r
+\r
+; GIVEN LOCN OF SUBR RET SQUO NAME ARG AND VAL IN E\r
+\r
+ATOSQ: PUSH P,B\r
+ PUSH P,A\r
+ MOVE A,SQUPNT ; GET TABLE POINTER\r
+ MOVE B,[2,,2]\r
+ CAMN E,1(A)\r
+ JRST ATOSQ1\r
+ ADD A,B\r
+ JUMPL A,.-3\r
+POPABJ: POP P,B\r
+ POP P,A\r
+ POPJ P,\r
+\r
+ATOSQ1: MOVE E,(A)\r
+ AOS -2(P)\r
+ JRST POPABJ\r
+\r
+; BINARY SEARCH FOR SQUOZE SYMBOL ARG IN E\r
+\r
+SQUTOA: PUSH P,A\r
+ PUSH P,B\r
+ PUSH P,C\r
+\r
+ MOVE A,SQUPNT ; POINTER TO TABLE\r
+ HLRE B,SQUPNT\r
+ MOVNS B\r
+ HRLI B,(B) ; B IS CURRENT OFFSET\r
+\r
+UP: ASH B,-1 ; HALVE TABLE\r
+ AND B,[-2,,-2] ; FORCE DIVIS BY 2\r
+ MOVE C,A ; COPY POINTER\r
+ JUMPLE B,LSTHLV ; CANT GET SMALLER\r
+ ADD C,B\r
+ CAMLE E,(C) ; SKIP IF EITHER FOUND OR IN TOP\r
+ MOVE A,C ; POINT TO SECOND HALF\r
+ CAMN E,(C) ; SKIP IF NOT FOUND\r
+ JRST WON\r
+ CAML E,(C) ; SKIP IF IN TOP HALF\r
+ JRST UP\r
+ HLLZS C ; FIX UP OINTER\r
+ SUB A,C\r
+ JRST UP\r
+\r
+WON: MOVE E,1(C) ; RET VAL IN E\r
+ AOS -3(P) ; SKIP RET\r
+WON1: POP P,C\r
+ POP P,B\r
+ POP P,A\r
+ POPJ P,\r
+\r
+LSTHLV: CAMN E,(C) ; LINEAR SERCH REST\r
+ JRST WON\r
+ ADD C,[2,,2]\r
+ JUMPL C,.-3\r
+ JRST WON1 ; ALL GONE, LOSE\r
+\r
+END\r
+\f\r