Twenex Muddle.
[pdp10-muddle.git] / <mdl.int> / mudsqu.mid.28
1
2 TITLE SQUOZE TABLE HANDLER FOR MUDDLE
3
4 RELOCATABLE
5
6 XJRST==JRST 5,
7
8 .INSRT MUDDLE >
9
10 SYSQ
11
12 .GLOBAL SQUPNT,ATOSQ,SQUTOA,GETSQU,CSQUTA,MPOPJ,SAT,SQUKIL,SQKIL
13 .GLOBAL MULTSG
14
15 ; ROUTINE TO KILL FIXUP TABLE SOMETIMES
16
17 SQUKIL: PUSH    P,0                     ; SAVE ACS
18         HRRZ    0,SQUPNT                ; SEE IF IN INTERPRETER
19         CAIG    0,HIBOT
20         JRST    POPJ0
21         PUSH    P,A
22         PUSH    P,B
23         PUSH    P,C
24         PUSH    P,D
25         PUSH    P,E
26         PUSHJ   P,SQKIL                 ; KILL THE BUFFER AND RESTORE INTERPRETER
27         POP     P,E
28         POP     P,D
29         POP     P,C                     ; RESTORE AC'S
30         POP     P,B
31         POP     P,A
32 POPJ0:  POP     P,0
33         POPJ    P,
34
35
36 ; POINTER TO TABLE FILLED IN BY INITM
37
38 ; SUBR TO INTERFACE TO MUDDLE SQUOZE TABLE.
39 ; IT TAKES AN ARGUMENT OF PRIMTYPE WORD AND RETURNS A FIX GIVING THE
40 ; LOCATION IF IT IS IN THE SQUOZE TABLE AND OTHERWISE RETURNS FALSE
41
42         MFUNCTION SQUOTA,SUBR
43         ENTRY 1
44
45         GETYP   A,(AB)
46         PUSHJ   P,SAT           ; GET SAT OF ARGUMENT
47         CAIE    A,S1WORD        ; BETTER BE OF PRIMTYPE WORD
48         JRST    WTYP1
49         MOVE    A,1(AB)         ; GET ARGUMENT INTO A
50         PUSHJ   P,CSQUTA
51         JFCL
52         JRST    FINIS
53
54
55 ; COMPILER ENTRY TAKES ARGUMENT IN A
56
57 CSQUTA: SUBM    M,(P)           ; RELATAVIZE P
58         MOVE    E,A             ; ARG TO SQUOTA
59         TLZ     E,740000        ; FLUSH EXTRA BITS FOR LOOKUP
60         PUSHJ   P,SQUTOA
61         JRST    GTFALS
62         SOS     (P)             ; AND SKIP RETURN
63         PUSHJ   P,SQUKIL
64         MOVSI   A,TFIX          ; RETURN FIX
65         MOVE    B,E
66         JRST    MPOPJ
67 GTFALS: PUSHJ   P,SQUKIL
68         MOVE    A,$TFALSE
69         MOVEI   B,0
70         JRST    MPOPJ           ; RETURN A FALSE
71
72
73 ; GIVEN LOCN OF SUBR RET SQUO NAME ARG AND VAL IN E
74
75 ATOSQ:  PUSH    P,B
76         PUSH    P,A
77         PUSHJ   P,GETSQU
78 IFE ITS,[
79         SKIPE   MULTSG
80          PUSHJ  P,@[.+1]        ; RUN IN 0
81         MOVE    A,SQUPNT        ; GET TABLE POINTER
82         MOVE    B,[2,,2]
83         CAMN    E,1(A)
84         JRST    ATOSQ1
85         ADD     A,B
86         JUMPL   A,.-3
87 POPABJ: PUSH    P,E                     ; SAVE RESULT
88         PUSHJ   P,SQUKIL
89         POP     P,E
90 IFE ITS,[
91         SKIPN   MULTSG
92          JRST   GOON
93         POP     P,B                     ; GET PC
94         MOVEI   A,0
95         HRRI    B,GOON                  ; RUN IN CALLERS SECTIO
96         XJRST   A
97 ]
98 GOON:   POP     P,B
99         POP     P,A
100         POPJ    P,
101
102 ATOSQ1: MOVE    E,(A)
103 IFE ITS,[
104         SKIPN   MULTSG
105          AOS    -2(P)
106         SKIPE   MULTSG
107          AOS    -3(P)
108 ]
109 IFN ITS,[
110         AOS     -2(P)
111 ]
112         JRST    POPABJ
113
114 ; BINARY SEARCH FOR SQUOZE SYMBOL ARG IN E
115
116 SQUTOA: PUSH    P,A
117         PUSH    P,B
118         PUSH    P,C
119         PUSH    P,E
120         PUSHJ   P,GETSQU
121         POP     P,E
122
123 IFE ITS,[
124         SKIPE   MULTSG
125          PUSHJ  P,@[.+1]        ; RUN IN SEC 0
126 ]
127         MOVE    A,SQUPNT                ; POINTER TO TABLE
128         HLRE    B,SQUPNT
129         MOVNS   B
130         HRLI    B,(B)           ; B IS CURRENT OFFSET
131
132 UP:     ASH     B,-1            ; HALVE TABLE
133         AND     B,[-2,,-2]      ; FORCE DIVIS BY 2
134         MOVE    C,A             ; COPY POINTER
135         JUMPLE  B,LSTHLV        ; CANT GET SMALLER
136         ADD     C,B
137         CAMLE   E,(C)           ; SKIP IF EITHER FOUND OR IN TOP
138         MOVE    A,C             ; POINT TO SECOND HALF
139         CAMN    E,(C)           ; SKIP IF NOT FOUND
140         JRST    WON
141         CAML    E,(C)           ; SKIP IF IN TOP HALF
142         JRST    UP
143         HLLZS   C               ; FIX UP OINTER
144         SUB     A,C
145         JRST    UP
146
147 WON:    MOVE    E,1(C)          ; RET VAL IN E
148 IFE ITS,[
149         SKIPN   MULTSG
150          AOS    -3(P)
151         SKIPE   MULTSG
152          AOS    -4(P)
153 ]
154 IFN ITS,        AOS     -3(P)           ; SKIP RET
155 WON1:
156 IFE ITS,[
157         SKIPN   MULTSG
158          JRST   GOON1
159         POP     P,B                     ; GET PC
160         MOVEI   A,0
161         HRRI    B,GOON1                 ; RUN IN CALLERS SECTIO
162         XJRST   A
163 ]
164 GOON1:  POP     P,C
165         POP     P,B
166         POP     P,A
167         POPJ    P,
168
169 LSTHLV: CAMN    E,(C)           ; LINEAR SERCH REST
170         JRST    WON
171         ADD     C,[2,,2]
172         JUMPL   C,.-3
173         JRST    WON1            ; ALL GONE, LOSE
174
175
176 IMPURE
177 SQUPNT: 0
178
179 PURE
180 END
181 \f