Split up files.
[pdp10-muddle.git] / sumex / mudsqu.mcr004
1 TITLE SQUOZE TABLE HANDLER FOR MUDDLE\r
2 \r
3 RELOCATABLE\r
4 \r
5 .INSRT MUDDLE >\r
6 \r
7 .GLOBAL SQUPNT,ATOSQ,SQUTOA\r
8 \r
9 ; POINTER TO TABLE FILLED IN BY INITM\r
10 \r
11 SQUPNT: 0\r
12 \r
13 ; GIVEN LOCN OF SUBR RET SQUO NAME ARG AND VAL IN E\r
14 \r
15 ATOSQ:  PUSH    P,B\r
16         PUSH    P,A\r
17         MOVE    A,SQUPNT                ; GET TABLE POINTER\r
18         MOVE    B,[2,,2]\r
19         CAMN    E,1(A)\r
20         JRST    ATOSQ1\r
21         ADD     A,B\r
22         JUMPL   A,.-3\r
23 POPABJ: POP     P,B\r
24         POP     P,A\r
25         POPJ    P,\r
26 \r
27 ATOSQ1: MOVE    E,(A)\r
28         AOS     -2(P)\r
29         JRST    POPABJ\r
30 \r
31 ; BINARY SEARCH FOR SQUOZE SYMBOL ARG IN E\r
32 \r
33 SQUTOA: PUSH    P,A\r
34         PUSH    P,B\r
35         PUSH    P,C\r
36 \r
37         MOVE    A,SQUPNT                ; POINTER TO TABLE\r
38         HLRE    B,SQUPNT\r
39         MOVNS   B\r
40         HRLI    B,(B)           ; B IS CURRENT OFFSET\r
41 \r
42 UP:     ASH     B,-1            ; HALVE TABLE\r
43         AND     B,[-2,,-2]      ; FORCE DIVIS BY 2\r
44         MOVE    C,A             ; COPY POINTER\r
45         JUMPLE  B,LSTHLV        ; CANT GET SMALLER\r
46         ADD     C,B\r
47         CAMLE   E,(C)           ; SKIP IF EITHER FOUND OR IN TOP\r
48         MOVE    A,C             ; POINT TO SECOND HALF\r
49         CAMN    E,(C)           ; SKIP IF NOT FOUND\r
50         JRST    WON\r
51         CAML    E,(C)           ; SKIP IF IN TOP HALF\r
52         JRST    UP\r
53         HLLZS   C               ; FIX UP OINTER\r
54         SUB     A,C\r
55         JRST    UP\r
56 \r
57 WON:    MOVE    E,1(C)          ; RET VAL IN E\r
58         AOS     -3(P)           ; SKIP RET\r
59 WON1:   POP     P,C\r
60         POP     P,B\r
61         POP     P,A\r
62         POPJ    P,\r
63 \r
64 LSTHLV: CAMN    E,(C)           ; LINEAR SERCH REST\r
65         JRST    WON\r
66         ADD     C,[2,,2]\r
67         JUMPL   C,.-3\r
68         JRST    WON1            ; ALL GONE, LOSE\r
69 \r
70 END\r
71 \f\r