1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-16 16:28:40 +00:00
PDP-10.its/src/mudsys/mudsqu.29

182 lines
2.8 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

TITLE SQUOZE TABLE HANDLER FOR MUDDLE
RELOCATABLE
XJRST==JRST 5,
.INSRT MUDDLE >
SYSQ
.GLOBAL SQUPNT,ATOSQ,SQUTOA,GETSQU,CSQUTA,MPOPJ,SAT,SQUKIL,SQKIL
.GLOBAL MULTSG
; 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
IFE ITS,[
SKIPE MULTSG
PUSHJ P,@[.+1] ; RUN IN 0
]
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
IFE ITS,[
SKIPN MULTSG
JRST GOON
POP P,B ; GET PC
MOVEI A,0
HRRI B,GOON ; RUN IN CALLERS SECTIO
XJRST A
]
GOON: POP P,B
POP P,A
POPJ P,
ATOSQ1: MOVE E,(A)
IFE ITS,[
SKIPN MULTSG
AOS -2(P)
SKIPE MULTSG
AOS -3(P)
]
IFN ITS,[
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
IFE ITS,[
SKIPE MULTSG
PUSHJ P,@[.+1] ; RUN IN SEC 0
]
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
IFE ITS,[
SKIPN MULTSG
AOS -3(P)
SKIPE MULTSG
AOS -4(P)
]
IFN ITS, AOS -3(P) ; SKIP RET
WON1:
IFE ITS,[
SKIPN MULTSG
JRST GOON1
POP P,B ; GET PC
MOVEI A,0
HRRI B,GOON1 ; RUN IN CALLERS SECTIO
XJRST A
]
GOON1: 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