Split up files.
[pdp10-muddle.git] / sumex / mudsqu.mcr004
diff --git a/sumex/mudsqu.mcr004 b/sumex/mudsqu.mcr004
new file mode 100644 (file)
index 0000000..93a8569
--- /dev/null
@@ -0,0 +1,71 @@
+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