mirror of
https://github.com/PDP-10/its.git
synced 2026-01-25 03:37:00 +00:00
The PURIMP routine splits the page map into three parts: writable data at the bottom, a large gap in the middle (which the GC will manage later), and read-only code/data at the top. There's one CORBLK call for each of these. The final call, which gave pages BOT/2000 to 400 as the range, failed with %EROPG when it hit the first unmapped page after the end of the pure data. Experimentation shows that, at least with current ITS, this is how CORBLK normally behaves. Fix by calculating the final page from RHITOP rather than assuming 400.
1374 lines
27 KiB
Plaintext
1374 lines
27 KiB
Plaintext
TITLE INITIALIZATION FOR MUDDLE
|
||
|
||
RELOCATABLE
|
||
|
||
HTVLNT==3000 ; GUESS OF TVP LENGTH
|
||
|
||
LAST==1 ;POSSIBLE CHECKS DONE LATER
|
||
|
||
.INSRT MUDDLE >
|
||
|
||
SYSQ
|
||
XBLT==123000,,
|
||
GCHN==0
|
||
IFE ITS,[
|
||
EXPUNGE .FATAL
|
||
FATINS==.FATAL"
|
||
SEVEC==104000,,204
|
||
.INSRT STENEX >
|
||
]
|
||
|
||
IMPURE
|
||
|
||
OBSIZE==151. ;DEFAULT OBLIST SIZE
|
||
|
||
.LIFL <TVBASE+TVLNT-TVLOC>
|
||
.LOP .VALUE
|
||
.ELDC
|
||
|
||
.GLOBAL SHRRM,SHRLM,SMOVEM,SSETZM,SXBLT,SHLRZ
|
||
.GLOBAL SETUP,TPBAS,GCPDL,GCPVP,PVBASE,PVLNT,PARNEW,AAGC,ICR,SWAP,OBLNT,MSGTYP,POPUNW
|
||
.GLOBAL ICLOS,OCLOS,GLOBASE,GLOBSP,PARBOT,PARTOP,CODTOP,START,BEGIN,VECBOT,VECTOP,TPBASE
|
||
.GLOBAL LISTEN,ROOT,INITIAL,TBINIT,TOPLEV,INTOBL,ERROBL,MUDOBL,TTYOPE,RESFUN,QUITTER
|
||
.GLOBAL IOINS,BUFRIN,IOIN2,ECHO,MTYI,MTYO,IMTYO,MUDSTR,P.TOP,TTICHN,TTOCHN,TYPVEC,SQDIR
|
||
.GLOBAL PDLBUF,PHIBOT,%UNAM,PURVEC,STOSTR,ISTOST,TD.LNT,TD.PUT,TD.GET,CAFRE1
|
||
.GLOBAL FRETOP,LPUR,SQBLK,REALGC,INTDIR,AGCLD,PAGEGC,TD.AGC,TVSTRT,REALTV,PVSTOR
|
||
.GLOBAL GCSTOP,SPSTOR,DSTORE,SQBYTE,INBYTE,GCBYTE,FRSTCH,OPSYS,IJFNS,GETJS
|
||
.GLOBAL HASHTB,ILOOKC
|
||
|
||
LPUR==.LPUR ; SET UP SO LPUR WORKS
|
||
|
||
; INIITAL AMOUNT OF AFREE SPACE
|
||
|
||
STOSTR:
|
||
LOC TVSTRT-1
|
||
ISTOST: TVSTRT-STOSTR,,0
|
||
|
||
BLOCK HTVLNT ; TVP
|
||
|
||
SETUP: MOVEI 0,0 ; ZERO ACS
|
||
MOVEI 17,1
|
||
BLT 17,17
|
||
|
||
IFN ITS, .SUSET [.RUNAM,,%UNAM] ; FOR AGC'S BENFIT
|
||
MOVE P,GCPDL ;GET A PUSH DOWN STACK
|
||
IFN ITS, .SUSET [.SMASK,,[200000]] ; ENABLE PDL OVFL
|
||
MOVE 0,[TVBASE,,TVSTRT]
|
||
BLT 0,TVSTRT+HTVLNT-3 ; BLT OVER TVP
|
||
IFE ITS, PUSHJ P,TWENTY ; FIND OUT WHETHER IT IS TOPS20 OR NOT
|
||
PUSHJ P,TTYOPE ;OPEN THE TTY
|
||
AOS A,20 ; TOP OF LOW SEGG
|
||
HRRZM A,P.TOP
|
||
SOSN A ; IF NOTHING YET
|
||
IFN ITS, .SUSET [.RMEMT,,P.TOP]
|
||
IFE ITS, JRST 4,
|
||
MOVE A,P.TOP
|
||
SUB A,FRETOP ; SETUP FOR GETTING NEEDED CORE
|
||
SUBI A,3777
|
||
ASH A,-10. ; TO PAGES
|
||
HRLS A ; SET UP AOBJN
|
||
HRRZ 0,P.TOP
|
||
ASH 0,-10.
|
||
SUBI 0,1
|
||
HRR A,0
|
||
IFN ITS,[
|
||
.CALL HIGET ; GET THEM
|
||
FATAL INITM--CORE NOT AVAILABLE FOR INITIALIZATION
|
||
ASH A,10. ; TO WORDS
|
||
MOVEM A,P.TOP
|
||
SUBI A,2000 ; WHERE FRETOP IS
|
||
MOVEM A,FRETOP
|
||
|
||
]
|
||
IFE ITS,[
|
||
MOVE A,FRETOP
|
||
ADDI A,2000
|
||
MOVEM A,P.TOP
|
||
]
|
||
HRRE A,P.TOP ; CHECK TOP
|
||
TRNE A,377777 ; SKIP IF ALL LOW SEG
|
||
JUMPL A,PAGLOS ; COMPLAIN
|
||
MOVE A,HITOP ; FIND HI SEG TOP
|
||
ADDI A,1777
|
||
ANDCMI A,1777
|
||
MOVEM A,RHITOP ; SAVE IT
|
||
MOVEI A,200
|
||
SUBI A,PHIBOT
|
||
JUMPE A,HIBOK
|
||
MOVSI A,(A)
|
||
HRRI A,200
|
||
IFN ITS,[
|
||
.CALL GIVCOR
|
||
.VALUE
|
||
]
|
||
HIBOK: MOVEI B,[ASCIZ /MUDDLE INITIALIZATION.
|
||
/]
|
||
PUSHJ P,MSGTYP ;PRINT IT
|
||
MOVE A,CODTOP ;CHECK FOR A WINNING LOAD
|
||
CAML A,VECBOT ;IT BETTER BE LESS
|
||
JRST DEATH1 ;LOSE COMPLETELY
|
||
SETTV: MOVE PVP,[-PVLNT*2,,GCPVP] ;AND A PROCESS VECTOR
|
||
MOVEM PVP,PVSTOR+1
|
||
MOVEM PVP,PVSTOR+1-TVSTRT+TVBASE
|
||
MOVEI A,(PVP) ;SET UP A BLT
|
||
HRLI A,PVBASE ;FROM PROTOTYPE
|
||
BLT A,PVLNT*2-1(PVP) ;INITIALIZE
|
||
MOVE TP,[-ITPLNT,,TPBAS] ;GET A STACK FOR THIS PROCCESS
|
||
MOVEI TB,(TP) ;AND A BASE
|
||
IFN ITS, HRLI TB,1
|
||
IFE ITS, HRLI TB,400001 ; FOR MULTI SEG HACKING
|
||
SUB TP,[1,,1] ;POP ONCE
|
||
|
||
; FIRST BUILD MOBY HASH TABLE
|
||
|
||
MOVEI A,1023. ; TRY THIS OUT FOR SIZE
|
||
PUSHJ P,IBLOCK
|
||
MOVEM B,HASHTB+1-TVSTRT+TVBASE ; STORE IN TVP POINTER
|
||
HLRE A,B
|
||
SUB B,A
|
||
MOVEI A,TATOM+.VECT.
|
||
HRLM A,(B)
|
||
|
||
; ALLOCATE SOME OBLISTS FOR INITIAL ATOMS
|
||
|
||
PUSH P,[5] ;COUNT INITIAL OBLISTS
|
||
|
||
PUSH P,OBLNT ;SAVE CURRENT OBLIST DEFAULT SIZE
|
||
|
||
MAKEOB: SOS A,-1(P)
|
||
MOVE A,OBSZ(A)
|
||
MOVEM A,OBLNT
|
||
MCALL 0,MOBLIST ;GOBBLE AN OBLIST
|
||
PUSH TP,$TOBLS ;AND SAVE THEM
|
||
PUSH TP,B
|
||
MOVE A,(P)-1 ;COUNT DOWN
|
||
MOVEM B,@OBTBL(A) ;STORE
|
||
JUMPN A,MAKEOB
|
||
|
||
POP P,OBLNT ;RESTORE DEFAULT OBLIST SIZE
|
||
|
||
MOVE C,[-TVLNT+2,,TVBASE]
|
||
MOVE D,[-HTVLNT+2,,TVSTRT]
|
||
|
||
;MAIN INITIALIZE LOOP - SCAN XFER VECTOR FOR ATOMS, UPDATE
|
||
;OFFSETS IN CODE, UNIQUIFY ATOMS AND COMPACT XFER VECTOR
|
||
|
||
ILOOP: HLRZ A,(C) ;FIRST TYPE
|
||
JUMPE A,TVEXAU ;USEFUL STUFF EXHAUSTED
|
||
CAIN A,TCHSTR ;CHARACTER STRING?
|
||
JRST CHACK ;YES, GO HACK IT
|
||
CAIN A,TATOM ;ATOM?
|
||
JRST ATOMHK ;YES, CHECK IT OUT
|
||
MOVE A,(C) ;MOVE TO NEW HOME (MAY BE SAME)
|
||
MOVEM A,(D)
|
||
MOVE A,1(C)
|
||
MOVEM A,1(D)
|
||
SETLP: AOS (P) ;COUNT NUMBER OF PAIRS IN XFER VECTOR
|
||
ADD D,[2,,2] ;OUT COUNTER
|
||
SETLP1: ADD C,[2,,2] ;AND IN COUNTER
|
||
JUMPL C,ILOOP ;JUMP IF MORE TO DO
|
||
|
||
;NEW XFER VECTOR FINISHED, NOW GIVE AWAY THE REST
|
||
|
||
TVEXAU: HLRE B,D ; LEFT HALF OF AOBJN
|
||
MOVNI TVP,HTVLNT-2 ; CALCULATE LENGTH OF TVP
|
||
SUB TVP,B ; GET -LENGTH OF TVP IN TVP
|
||
HRLS TVP
|
||
HRRI TVP,TVSTRT ; BUILD A TASTEFUL TVP POINTER
|
||
MOVNI C,TVLNT-HTVLNT+2(B) ; SMASH IN LENGTH INTO END DOPE WORDS
|
||
HRLM C,TVSTRT+HTVLNT-1
|
||
MOVSI E,400000
|
||
MOVEM E,TVSTRT+HTVLNT-2
|
||
HLRE C,TVP
|
||
MOVNI C,-2(C) ; CLOBBER LENGTH INTO REAL TVP
|
||
HLRE B,TVP
|
||
SUBM TVP,B
|
||
MOVEM E,(B)
|
||
HRLM C,1(B) ; PUT IN LENGTH
|
||
MOVE PVP,PVSTOR+1
|
||
MOVEM TVP,REALTV+1(PVP)
|
||
|
||
|
||
; FIX UP TYPE VECTOR
|
||
|
||
MOVE A,TYPVEC+1 ;GET POINTER
|
||
MOVEI 0,0 ;FOR POSSIBLE NULL SLOTS
|
||
MOVSI B,TATOM ;SET TYPE TO ATOM
|
||
MOVEI D,400000 ; TYPE CODE HACKS
|
||
|
||
TYPLP: HLLM B,(A) ;CHANGE TYPE TO ATOM
|
||
MOVE C,@1(A) ;GET ATOM
|
||
HLRE E,C ; FIND DOPE WORD
|
||
SUBM C,E
|
||
HRRM D,(E) ; STUFF INTO ATOM
|
||
MOVEM C,1(A)
|
||
ADDI D,1
|
||
ADD A,[2,,2] ;BUMP
|
||
JUMPL A,TYPLP
|
||
|
||
; CLOSE TTY CHANNELS
|
||
IFN ITS,[
|
||
|
||
.CLOSE 1,
|
||
.CLOSE 2,
|
||
]
|
||
|
||
;GENERAT THE LOGICAL TTY IN AND OUT CHANNELS
|
||
|
||
;SETUP CALL TO OPEN OUTPUT TTY CHANNNEL
|
||
|
||
IRP A,,[[PRINT,TCHSTR],[TTY:,TCHSTR]]
|
||
IRP B,C,[A]
|
||
PUSH TP,$!C
|
||
PUSH TP,CHQUOTE B
|
||
.ISTOP
|
||
TERMIN
|
||
TERMIN
|
||
|
||
MCALL 2,FOPEN ;OPEN THE OUT PUT CHANNEL
|
||
MOVEM B,TTOCHN+1 ;SAVE IT
|
||
|
||
;ASSIGN AS GLOBAL VALUE
|
||
|
||
PUSH TP,$TATOM
|
||
PUSH TP,IMQUOTE OUTCHAN
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MOVE A,[PUSHJ P,MTYO] ;MORE WINNING INS
|
||
MOVEM A,IOINS(B) ;CLOBBER
|
||
MCALL 2,SETG
|
||
|
||
;SETUP A CALL TO OPEN THE TTY CHANNEL
|
||
|
||
IRP A,,[[READ,TCHSTR],[TTY:,TCHSTR]]
|
||
IRP B,C,[A]
|
||
PUSH TP,$!C
|
||
PUSH TP,CHQUOTE B
|
||
.ISTOP
|
||
TERMIN
|
||
TERMIN
|
||
|
||
MCALL 2,FOPEN ;OPEN INPUTCHANNEL
|
||
MOVEM B,TTICHN+1 ;SAVE IT
|
||
PUSH TP,$TATOM ;ASSIGN AS A GLOBAL VALUE
|
||
PUSH TP,IMQUOTE INCHAN
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
MOVE C,BUFRIN(B) ;GET AUX BUFFER PTR
|
||
MOVE A,[PUSHJ P,MTYI]
|
||
MOVEM A,IOIN2(C) ;MORE OF A WINNER
|
||
MOVE A,[PUSHJ P,IMTYO]
|
||
MOVEM A,ECHO(C) ;ECHO INS
|
||
MCALL 2,SETG
|
||
MOVEI A,3 ;FIRST CHANNEL AFTER INIT HAPPENS
|
||
MOVEM A,FRSTCH
|
||
|
||
;GENERATE AN INITIAL PROCESS AND SWAP IT IN
|
||
|
||
MOVEI A,TPLNT ;STACK PARAMETERS
|
||
MOVEI B,PLNT
|
||
PUSHJ P,ICR ;CREATE IT
|
||
MOVE PVP,PVSTOR+1
|
||
MOVE 0,SPSTO+1(B)
|
||
MOVEM 0,SPSTOR+1
|
||
MOVE 0,REALTV+1(PVP)
|
||
MOVEM 0,REALTV+1(B) ; STUFF IN TRANSFER VECTOR POINTER
|
||
MOVEI 0,RUNING
|
||
MOVEM 0,PSTAT"+1(B)
|
||
MOVE D,B ;SET UP TO CALL SWAP
|
||
JSP C,SWAP ;AND SWAP IN
|
||
MOVEM PVP,MAINPR" ;SAVE AS THE MAIN PROCESS
|
||
PUSH TP,[TENTRY,,TOPLEV] ;BUILD DUMMY FRAME
|
||
PUSH TP,[1,,0]
|
||
MOVEI A,-1(TP)
|
||
PUSH TP,A
|
||
PUSH TP,SPSTOR+1
|
||
PUSH TP,P
|
||
MOVE C,TP ;COPY TP
|
||
ADD C,[3,,3] ;FUDGE
|
||
PUSH TP,C ;TPSAV PUSHED
|
||
PUSH TP,[TOPLEV]
|
||
HRRI TB,(TP) ;SETUP TB
|
||
IFN ITS, HRLI TB,2
|
||
IFE ITS, HRLI TB,400002
|
||
ADD TB,[1,,1]
|
||
MOVE PVP,PVSTOR+1
|
||
MOVEM TB,TBINIT+1(PVP)
|
||
MOVSI A,TSUBR
|
||
MOVEM A,RESFUN(PVP)
|
||
MOVEI A,LISTEN"
|
||
MOVEM A,RESFUN+1(PVP)
|
||
PUSH TP,$TATOM
|
||
PUSH TP,IMQUOTE THIS-PROCESS
|
||
PUSH TP,$TPVP
|
||
PUSH TP,PVP
|
||
MCALL 2,SETG
|
||
|
||
; FIND TVP OFFSET FOR THE ATOM 'T' FOR TEMPLATE
|
||
|
||
MOVEI A,IMQUOTE T
|
||
SUBI A,
|
||
TVTOFF==0
|
||
ADDSQU TVTOFF
|
||
|
||
MOVEM A,SQULOC-1
|
||
|
||
PUSH TP,$TATOM
|
||
PUSH TP,IMQUOTE TVTOFF,,MUDDLE
|
||
PUSH TP,$TFIX
|
||
PUSH TP,A
|
||
MCALL 2,SETG
|
||
|
||
; HERE TO SETUP SQUOZE TABLE IN PURE CORE
|
||
|
||
PUSHJ P,SQSETU ; GO TO ROUTINE
|
||
|
||
PUSHJ P,DUMPGC
|
||
MOVEI A,400000 ; FENCE POST PURE SR VECTOR
|
||
HRRM A,PURVEC
|
||
MOVE A,TP
|
||
HLRE B,A
|
||
SUBI A,-PDLBUF(B) ;POINT TO DOPE WORDS
|
||
MOVEI B,12 ;GROWTH SPEC
|
||
IORM B,(A)
|
||
MOVE PVP,PVSTOR+1
|
||
MOVE 0,REALTV+1(PVP)
|
||
HLRE E,0
|
||
SUBI 0,-1(E)
|
||
HRRZM 0,CODTOP
|
||
IFE ITS, PUSHJ P,GETJS
|
||
PUSHJ P,AAGC ;DO IT
|
||
AOJL A,.-1
|
||
MOVE PVP,PVSTOR+1
|
||
MOVE A,TPBASE+1(PVP)
|
||
SUB A,[640.,,640.]
|
||
MOVEM A,TPBASE+1(PVP)
|
||
|
||
; CREATE LIST OF ROOT AND NEW OBLIST
|
||
|
||
MOVEI A,5
|
||
PUSH P,A
|
||
|
||
NAMOBL: PUSH TP,$TATOM
|
||
PUSH TP,@OBNAM-1(A) ; NAME
|
||
PUSH TP,$TATOM
|
||
PUSH TP,IMQUOTE OBLIST
|
||
PUSH TP,$TOBLS
|
||
PUSH TP,@OBTBL1-1(A)
|
||
MCALL 3,PUT ; NAME IT
|
||
SOS A,(P)
|
||
PUSH TP,$TOBLS
|
||
PUSH TP,@OBTBL1(A)
|
||
PUSH TP,$TATOM
|
||
PUSH TP,IMQUOTE OBLIST
|
||
PUSH TP,$TATOM
|
||
PUSH TP,@OBNAM(A)
|
||
MCALL 3,PUT
|
||
SKIPE A,(P)
|
||
JRST NAMOBL
|
||
SUB P,[1,,1]
|
||
|
||
;Define MUDDLE version number
|
||
MOVEI A,5
|
||
MOVEI B,0 ;Initialize result
|
||
MOVE C,[440700,,MUDSTR+2]
|
||
VERLP: ILDB D,C ;Get next charcter digit
|
||
CAIG D,"9 ;Non-digit ?
|
||
CAIGE D,"0
|
||
JRST VERDEF
|
||
SUBI D,"0 ;Convert to number
|
||
IMULI B,10.
|
||
ADD B,D ;Include number into result
|
||
SOJG A,VERLP ;Finished ?
|
||
VERDEF:
|
||
PUSH TP,$TATOM
|
||
PUSH TP,IMQUOTE MUDDLE
|
||
PUSH TP,$TFIX
|
||
PUSH TP,B
|
||
MCALL 2,SETG ;Make definition
|
||
OPIPC:
|
||
IFN ITS,[
|
||
PUSH TP,$TCHSTR
|
||
PUSH TP,CHQUOTE IPC
|
||
PUSH TP,$TATOM
|
||
PUSH TP,MQUOTE IPC-HANDLER
|
||
MCALL 1,GVAL
|
||
PUSH TP,A
|
||
PUSH TP,B
|
||
PUSH TP,$TFIX
|
||
PUSH TP,[1]
|
||
MCALL 3,ON
|
||
MCALL 0,IPCON
|
||
]
|
||
|
||
; Allocate inital template tables
|
||
|
||
MOVEI A,10
|
||
PUSHJ P,CAFRE1
|
||
MOVSI A,(B)
|
||
HRRI A,1(B)
|
||
SETZM (B)
|
||
BLT A,7(B)
|
||
ADD B,[10,,10] ; REST IT OFF
|
||
MOVEM B,TD.LNT+1
|
||
MOVEI A,10
|
||
PUSHJ P,CAFRE1
|
||
MOVEI 0,TUVEC ; SETUP UTYPE
|
||
HRLM 0,10(B)
|
||
MOVEM B,TD.GET+1
|
||
MOVSI A,(B)
|
||
HRRI A,1(B)
|
||
SETZM (B)
|
||
BLT A,7(B)
|
||
MOVEI A,10
|
||
PUSHJ P,CAFRE1
|
||
MOVEI 0,TUVEC ; SETUP UTYPE
|
||
HRLM 0,10(B)
|
||
MOVEM B,TD.PUT+1
|
||
MOVSI A,(B)
|
||
HRRI A,1(B)
|
||
SETZM (B)
|
||
BLT A,7(B)
|
||
MOVEI A,10
|
||
PUSHJ P,CAFRE1
|
||
MOVEI 0,TUVEC ; SETUP UTYPE
|
||
HRLM 0,10(B)
|
||
MOVEM B,TD.AGC+1
|
||
MOVSI A,(B)
|
||
HRRI A,1(B)
|
||
SETZM (B)
|
||
BLT A,7(B)
|
||
|
||
PTSTRT: MOVEI A,SETUP
|
||
ADDI A,1
|
||
SUB A,PARBOT ;FIND WHERE PAIRS SHOULD GO
|
||
MOVEM A,PARNEW
|
||
|
||
; PURIFY/IMPURIFY THE WORLD (PDL)
|
||
|
||
IFN ITS,[
|
||
PURIMP: MOVE A,FRETOP
|
||
SUBI A,1
|
||
LSH A,-12
|
||
MOVE B,A
|
||
MOVNI A,1(A)
|
||
HRLZ A,A
|
||
DOTCAL CORBLK,[[1000,,310000],[1000,,-1],A]
|
||
FATAL INITM -- CAN'T IMPURIFY LOW CORE
|
||
MOVEI A,PHIBOT
|
||
ADDI B,1
|
||
SUB A,B
|
||
MOVNS A
|
||
HRL B,A
|
||
DOTCAL CORBLK,[[1000,,0],[1000,,-1],B]
|
||
FATAL INITM -- CAN'T FLUSH MIDDLE CORE
|
||
MOVE B,RHITOP
|
||
SUBI B,1
|
||
ASH B,-10.
|
||
MOVEI A,PHIBOT
|
||
SUB A,B
|
||
SUBI A,1
|
||
HRLS A
|
||
HRRI A,PHIBOT
|
||
DOTCAL CORBLK,[[1000,,210000],[1000,,-1],A]
|
||
FATAL INITM -- CAN'T PURIFY HIGH CORE
|
||
]
|
||
|
||
IFE ITS,[
|
||
MOVEI A,400000
|
||
MOVE B,[1,,START]
|
||
SEVEC
|
||
]
|
||
PUSH P,[15.,,15.] ;PUSH A SMALL PRGRM ONTO P
|
||
MOVEI A,1(P) ;POINT TO ITS START
|
||
PUSH P,[JRST AAGC] ;GO TO AGC
|
||
PUSH P,[MOVE PVP,PVSTOR+1]
|
||
PUSH P,[MOVE B,PSTO+1(PVP)] ;GET SAVED P
|
||
PUSH P,[SUB B,-14.(P)] ;FUDGE TO POP OFF PROGRAM
|
||
PUSH P,[MOVEM B,PSAV(TB)] ;INTO FRAME
|
||
PUSH P,[MOVE B,TPSTO+1(PVP)] ;GET TP
|
||
PUSH P,[MOVEM B,TPSAV(TB)] ;STORE IT
|
||
PUSH P,[MOVE B,SPSTOR+1] ;SP
|
||
PUSH P,[MOVEM B,SPSAV(TB)]
|
||
PUSH P,[MOVEI B,TOPLEV] ;WHERE TO GO
|
||
PUSH P,[MOVEM B,PCSAV(TB)]
|
||
IFN ITS, PUSH P,[MOVSI B,(.VALUE )]
|
||
IFE ITS, PUSH P,[MOVSI B,(JRST)]
|
||
PUSH P,[HRRI B,C]
|
||
PUSH P,[JRST B] ;GO DO VALRET
|
||
PUSH P,[B]
|
||
PUSH P,A ; PUSH START ADDR
|
||
MOVE B,[JRST -12.(P)]
|
||
MOVE 0,[JUMPA START]
|
||
IFE ITS, MOVE C,[HALTF]
|
||
IFE ITS, SKIPE OPSYS
|
||
MOVE C,[ASCII \0/9\]
|
||
MOVE D,[ASCII \B/1Q\]
|
||
MOVE E,[ASCIZ \
|
||
*
|
||
\] ;TERMINATE
|
||
POPJ P, ; GO
|
||
|
||
; CHECK PAIR SPACE
|
||
|
||
PAIRCH: CAMG A,B
|
||
JRST SETTV ;O.K.
|
||
|
||
DEATH1: MOVEI B,[ASCIZ /LOSSAGE--CODE AND DATA OVERLAP
|
||
/]
|
||
PUSHJ P,MSGTYP
|
||
.VALUE
|
||
|
||
;CHARACTER STRING HACKER
|
||
|
||
CHACK: MOVE A,(C) ;GET TYPE
|
||
HLLZM A,(D) ;STORE IN NEW HOME
|
||
MOVE B,1(C) ;GET POINTER
|
||
HLRZ E,B ;-LENGHT
|
||
HRRM E,(D)
|
||
PUSH P,E+1 ; IDIVI WILL CLOBBER
|
||
ADDI E,4+5*2 ; ROUND AND ACCOUNT FOR DOPE WORDS
|
||
IDIVI E,5 ; E/ WORDS LONG
|
||
PUSHJ P,EBPUR ; MAKE A PURIFIED COPY
|
||
POP P,E+1
|
||
HRLI B,010700 ;MAKE POINT BYTER
|
||
SUBI B,1
|
||
MOVEM B,1(D) ;AND STORE IT
|
||
ANDI A,-1 ;CLEAR LH OF A
|
||
JUMPE A,SETLP ;JUMP IF NO REF
|
||
HRRZ B,-1(A) ;SEE IF PREVIOUS INSTRUCTION REFERS TO $TCHSTR
|
||
CAIE B,$TCHSTR ;SKIP IF IT DOES
|
||
JRST CHACK1 ;NO, JUST DO CHQUOTE PART
|
||
HRRM D,-1(A) ;CLOBBER
|
||
CHACK1: MOVEI E,1(D)
|
||
HRRM E,(A) ;STORE INTO REFERENCE
|
||
MOVEI E,0
|
||
DPB E,[220400,,(A)]
|
||
JRST SETLP
|
||
|
||
; SUBROUTINE TO COPY A HUNK OF STRUCTURE TO THE HIGH SEGMENT
|
||
|
||
EBPUR: PUSH P,E
|
||
PUSH P,A
|
||
ADD E,HITOP ; GET NEW TOP
|
||
CAMG E,RHITOP ; SKIP IF TOO BIG
|
||
JRST EBPUR1
|
||
|
||
; CODE TO GROW HI SEG
|
||
|
||
MOVEI A,2000
|
||
ADDB A,RHITOP ; NEW TOP
|
||
TLNE A,777776
|
||
JRST HIFUL
|
||
IFN ITS,[
|
||
ASH A,-10. ; NUM OF BLOCKS
|
||
SUBI A,1 ; BLOCK TO GET
|
||
.CALL HIGET
|
||
.VALUE
|
||
]
|
||
|
||
EBPUR1: MOVEI A,-1(E) ; NEEDED TO TERMINATE BLT
|
||
EXCH E,HITOP
|
||
HRLI E,(B)
|
||
MOVEI B,(E)
|
||
BLT E,(A)
|
||
POP P,A
|
||
POP P,E
|
||
POPJ P,
|
||
|
||
GIVCOR: SETZ
|
||
SIXBIT /CORBLK/
|
||
1000,,0
|
||
1000,,-1
|
||
SETZ A
|
||
|
||
HIGET: SETZ
|
||
SIXBIT /CORBLK/
|
||
1000,,100000
|
||
1000,,-1
|
||
A
|
||
401000,,400001
|
||
|
||
|
||
; PROCESS AN ATOM AND ADD IT TO AN APPROPRIATE OBLIST IF IT ISN'T
|
||
; ALREADY THERE
|
||
|
||
ATOMHK: PUSH TP,$TOBLS ; SAVE OBLIST
|
||
PUSH TP,[0] ; FILLED IN LATER
|
||
PUSH TP,$TVEC ;SAVE TV POINTERS
|
||
PUSH TP,C
|
||
PUSH TP,$TVEC
|
||
PUSH TP,D
|
||
MOVE C,1(C) ;GET THE ATOM
|
||
PUSH TP,$TATOM ;AND SAVE
|
||
PUSH TP,C
|
||
PUSH TP,$TATOM
|
||
PUSH TP,[0]
|
||
HRRZ B,(C) ;GET OBLIST SPEC FROM ATOM
|
||
LSH B,1
|
||
ADDI B,1(TB) ;POINT TO ITS HOME
|
||
HRRM B,-9(TP)
|
||
MOVE B,(B)
|
||
MOVEM B,-10(TP) ; CLOBBER
|
||
|
||
SETZM 2(C) ; FLUSH CURRENT OBLIST SPEC
|
||
MOVEI E,0
|
||
MOVE D,C
|
||
PUSH P,[LOOKCR]
|
||
ADD D,[3,,3]
|
||
JUMPGE D,.+4
|
||
PUSH P,(D)
|
||
ADDI E,1
|
||
AOBJN D,.-2
|
||
PUSH P,E
|
||
MOVSI A,TOBLS
|
||
JRST ILOOKC
|
||
LOOKCR:
|
||
MOVEM B,(TP)
|
||
JUMPN B,CHCKD
|
||
|
||
;HERE IF THIS ATOM MUST BE PUT ON OBLIST
|
||
|
||
USEATM: MOVE B,-2(TP) ; GET ATOM
|
||
HLRZ E,(B) ; SEE IF PURE OR NOT
|
||
TRNN E,400000 ; SKIP IF IMPURE
|
||
JRST PURATM
|
||
PUSH TP,$TATOM
|
||
PUSH TP,B
|
||
PUSH TP,$TOBLS
|
||
PUSH TP,-13(TP)
|
||
MCALL 2,INSERT
|
||
|
||
PUSHJ P,VALMAK ;MAKE A GLOBAL VALUE FOR THIS LOSER
|
||
PURAT2: MOVE C,-6(TP) ;RESET POINTERS
|
||
MOVE D,-4(TP)
|
||
SUB TP,[12,,12]
|
||
MOVE B,(C) ;MOVE THE ENTRY
|
||
HLLZM B,(D) ;DON'T WANT REF POINTER STORED
|
||
MOVE A,1(C) ;AND MOVE ATOM
|
||
MOVEM A,1(D)
|
||
MOVEI A,1(D)
|
||
ANDI B,-1 ;CHECK FOR REAL REF
|
||
JUMPE B,SETLP1 ;DON'T SAVE THIS ATOM ON TVP
|
||
HRRM A,(B) ;CLOBBER CODE
|
||
MOVEI A,0
|
||
DPB A,[220400,,(B)] ; CLOBBER TVP PORTION
|
||
JRST SETLP
|
||
|
||
|
||
; HERE TO MAKE A PURE ATOM
|
||
|
||
PURATM: HRRZ B,-2(TP) ; POINT TO IT
|
||
HLRE E,-2(TP) ; - LNTH
|
||
MOVNS E
|
||
ADDI E,2
|
||
PUSHJ P,EBPUR ; PURE COPY
|
||
HRRM B,-2(TP) ; AND STORE BACK
|
||
MOVE B,-2(TP)
|
||
JUMPE 0,PURAT0
|
||
HRRZ D,0
|
||
HLRE E,0
|
||
SUBM D,E
|
||
HLRZ 0,2(D)
|
||
JUMPE 0,PURAT8
|
||
CAIG 0,HIBOT
|
||
FATAL INITM--PURE IMPURE LOSSAGE
|
||
JRST PURAT8
|
||
|
||
PURAT0: HRRZ E,(C)
|
||
MOVE D,-2(TP) ; GET ATOM BACK
|
||
HRRZ 0,(D) ; GET OBLIST CODE
|
||
JUMPE E,PURAT9
|
||
PURAT7: HLRZ D,1(E)
|
||
MOVEI D,-2(D)
|
||
SUBM E,D
|
||
HLRZ D,2(D)
|
||
CAILE D,HIBOT ; IF NEXT PURE & I AM ROOT
|
||
JUMPE 0,PURAT8 ; TAKES ADVANTAGE OF SYSTEM=0
|
||
JUMPE D,PURAT8
|
||
MOVE E,D
|
||
JRST PURAT7
|
||
|
||
PURAT8: HLRZ D,1(E)
|
||
SUBI D,2
|
||
SUBM E,D
|
||
HLRE C,B
|
||
SUBM B,C
|
||
HLRZ E,2(D)
|
||
HRLM E,2(B)
|
||
HRLM C,2(D)
|
||
JRST PURAT6
|
||
|
||
PURAT9: HLRE A,-2(TP)
|
||
SUBM B,A
|
||
HRRZM A,(C)
|
||
|
||
PURAT6: MOVE B,-10(TP) ; GET BUCKET BACK
|
||
MOVE C,-2(TP)
|
||
HRRZ 0,-9(TP)
|
||
HRRM 0,2(C) ; STORE OBLIST IN ATOM
|
||
PURAT1: HRRZ C,(B) ; GET CONTENTS
|
||
JUMPE C,HICONS ; AT END, OK
|
||
CAIL C,HIBOT ; SKIP IF IMPURE
|
||
JRST HICONS ; CONS IT ON
|
||
MOVEI B,(C)
|
||
JRST PURAT1
|
||
|
||
HICONS: HRLI C,TATOM
|
||
PUSH P,C
|
||
PUSH P,-2(TP)
|
||
PUSH P,B
|
||
MOVEI B,-2(P)
|
||
MOVEI E,2
|
||
PUSHJ P,EBPUR ; MAKE PURE LIST CELL
|
||
|
||
MOVE C,(P)
|
||
SUB P,[3,,3]
|
||
HRRM B,(C) ; STORE IT
|
||
MOVE B,1(B) ; ATOM BACK
|
||
MOVE C,-6(TP) ; GET TVP SLOT
|
||
HRRM B,1(C) ; AND STORE
|
||
HLRZ 0,(B) ; TYPE OF VAL
|
||
MOVE C,B
|
||
CAIN 0,TUNBOU ; NOT UNBOUND?
|
||
JRST PURAT3 ; UNBOUND, NO VAL
|
||
MOVEI E,2 ; COUNT AGAIN
|
||
PUSHJ P,EBPUR ; VALUE CELL
|
||
MOVE C,-2(TP) ; ATOM BACK
|
||
HLLZS (B) ; CLEAR LH
|
||
MOVSI 0,TLOCI
|
||
MOVEM B,1(C)
|
||
SKIPA
|
||
PURAT3: MOVEI 0,0
|
||
HRRZ A,(C) ; GET OBLIST CODE
|
||
MOVE A,OBTBL2(A)
|
||
HRRM A,2(C) ; STORE OBLIST SLOT
|
||
MOVEM 0,(C)
|
||
JRST PURAT2
|
||
|
||
; A POSSIBLE MATCH ARRIVES HERE
|
||
|
||
CHCKD: MOVE D,(TP) ;THEY MATCH!, GET EXISTING ATOM
|
||
MOVEI A,(D) ;GET TYPE OF IT
|
||
MOVE B,-2(TP) ;GET NEW ATOM
|
||
HLRZ 0,(B)
|
||
TRZ A,377777 ; SAVE ONLY 400000 BIT
|
||
TRZ 0,377777
|
||
CAIN 0,(A) ; SKIP IF WIN
|
||
JRST IM.PUR
|
||
MOVSI 0,400000
|
||
ANDCAM 0,(B)
|
||
ANDCAM 0,(D)
|
||
HLRZ A,(D)
|
||
JUMPN A,A1VAL
|
||
MOVE A,(B) ;MOVE VALUE
|
||
MOVEM A,(D)
|
||
MOVE A,1(B)
|
||
MOVEM A,1(D)
|
||
MOVE B,D ;EXISTING ATOM TO B
|
||
MOVEI 0,(B)
|
||
CAIL 0,HIBOT
|
||
JRST .+3
|
||
PUSHJ P,VALMAK ;MAKE A VALUE
|
||
JRST .+2
|
||
PUSHJ P,PVALM
|
||
|
||
;NOW FIND ATOMS OCCURENCE IN XFER VECTOR
|
||
|
||
OFFIND: MOVE D,-4(TP) ;GET CURRENT POINTER INTO TP
|
||
MOVE C,[-TVLNT,,TVSTRT] ;AND A COPY OF TVP
|
||
MOVEI A,0 ;INITIALIZE COUNTER
|
||
ALOOP: CAMN B,1(C) ;IS THIS IT?
|
||
JRST AFOUND
|
||
ADD C,[2,,2] ;BUMP COUNTER
|
||
CAMG C,D
|
||
AOJA A,ALOOP ;NO, KEEP LOOKING
|
||
|
||
MOVEI B,[ASCIZ /LOSSAGE--ATOM DISAPPEARED
|
||
/]
|
||
TYPIT: PUSHJ P,MSGTYP
|
||
.VALUE
|
||
|
||
AFOUND: LSH A,1 ;FOUND ATOM, GET REAL OFFSET
|
||
ADDI A,1
|
||
ADDI A,TVSTRT
|
||
MOVE C,-6(TP) ;GET TV POINTER TO NEW ATOM
|
||
HRRZ B,(C) ;POINT TO REFERENCE
|
||
SKIPE B ;ANY THERE?
|
||
HRRM A,(B) ;YES, CLOBBER AWAY
|
||
SUB TP,[12,,12]
|
||
MOVEI A,0
|
||
DPB A,[220400,,(B)] ; KILL TVP POINTER
|
||
JRST SETLP1 ;AND GO ON
|
||
|
||
A1VAL: HLRZ C,(B) ;GET VALUE'S TYPE
|
||
MOVE B,D ;NOW PUT EXISTING ATOM IN B
|
||
CAIN C,TUNBOU ;UNBOUND?
|
||
JRST OFFIND ;YES, WINNER
|
||
|
||
MOVEI B,[ASCIZ /LOSSAGE--ATOM TRIES TO HAVE 2 VALUES
|
||
/]
|
||
JRST TYPIT
|
||
|
||
|
||
IM.PUR: MOVEI B,[ASCIZ /LOSSAG--ATOM TRIES TO BE BOTH PURE AND IMPURE
|
||
/]
|
||
JRST TYPIT
|
||
|
||
PAGLOS: MOVEI B,[ASCIZ /LOSSAGE--IMPURE CORE EXTENDS INTO HIGH SEGMENT
|
||
/]
|
||
JRST TYPIT
|
||
|
||
HIFUL: MOVEI B,[ASCIZ /LOSSAGE--HI SEG FULL
|
||
/]
|
||
JRST TYPIT
|
||
|
||
|
||
;MAKE A VALUE IN SLOT ON GLOBAL SP
|
||
|
||
VALMAK: HLRZ A,(B) ;TYPE OF VALUE
|
||
CAIE A,400000+TUNBOU
|
||
CAIN A,TUNBOU ;VALUE?
|
||
JRST VALMA1
|
||
MOVE A,GLOBSP+1 ;GET POINTER TO GLOBAL SP
|
||
SUB A,[4,,4] ;ALLOCATE SPACE
|
||
CAMG A,GLOBAS+1 ;CHECK FOR OVERFLOW
|
||
JRST SPOVFL
|
||
MOVEM A,GLOBSP+1 ;STORE IT BACK
|
||
MOVE C,(B) ;GET TYPE CELL
|
||
TLZ C,400000
|
||
HLLZM C,2(A) ;INTO TYPE CELL
|
||
MOVE C,1(B) ;GET VALUE
|
||
MOVEM C,3(A) ;INTO VALUE SLOT
|
||
MOVSI C,TGATOM ;GET TATOM,,0
|
||
MOVEM C,(A)
|
||
MOVEM B,1(A) ;AND POINTER TO ATOM
|
||
MOVSI C,TLOCI ;NOW CLOBBER THE ATOM
|
||
MOVEM C,(B) ;INTO TYPE CELL
|
||
ADD A,[2,,2] ;POINT TO VALUE
|
||
MOVEM A,1(B)
|
||
POPJ P,
|
||
|
||
VALMA1: SETZM (B)
|
||
POPJ P,
|
||
|
||
SPOVFL: MOVEI B,[ASCIZ /LOSSAGE--GLOBAL SP OVERFLOW
|
||
/]
|
||
JRST TYPIT
|
||
|
||
|
||
PVALM: HLRZ 0,(B)
|
||
CAIE 0,400000+TUNBOU
|
||
CAIN 0,TUNBOU
|
||
JRST VALMA1
|
||
MOVEI E,2
|
||
PUSH P,B
|
||
PUSHJ P,EBPUR
|
||
POP P,C
|
||
MOVEM B,1(C)
|
||
MOVSI 0,TLOCI
|
||
MOVEM 0,(C)
|
||
MOVE B,C
|
||
POPJ P,
|
||
;SET UP LIST OF INTERNAL NAMES AND ADDRESS NEEDED BY COMPILER
|
||
|
||
VECTGO DUMMY1
|
||
|
||
IRP A,,[FINIS,SPECBIND,WNA,WRONGT,$TLOSE,CALER1,POPUNW
|
||
ILOC,IGLOC,IDVAL,IDVAL1,ILVAL,IGVAL,INTFLG,LCKINT,ONINT,TYPLOO,TDEFER
|
||
IFALSE,UNAS,UNBOU,RCALL,SEGMNT,SEGLST,NUMPRI,OPSYS,SSPEC1,COMPERR
|
||
MAKACT,MAKENV,BFRAME,TTP,TTB,$TTP,$TTB,MAKTUP,TPALOC,IBIND,SSPECS
|
||
CILVAL,CISET,CIGVAL,CSETG,IBLOK1,IBLOCK,CLLOC,CGLOC,CASSQ,CGASSQ
|
||
CILNT,CILNQ,CILEGQ,CEMPTY,CIEQUA,CIREST,CINTH,CIAT,CSETLO,CIN
|
||
CIPUT,CIGET,CIGETL,CIMON,CISTRU,CIMEMQ,CIMEMB,CITOP,CIBACK,TYPSEG
|
||
C1CONS,CICONS,CIUVEC,CIVEC,IIFORM,IILIST,CISTNG,HITOP,INCR1,TYPG,VALG,TESTR
|
||
OTBSAV,CITYPE,CFRAME,CARGS,CFUNCT,CUTYPE,CPTYPE,CTYPEP,CTYPEQ,CCHUTY
|
||
CIREMA,RTFALS,CIPUTP,CIGETP,CIGTPR,MPOPJ,TAB,$TAB,ICONS,CSTO,DSTO,NTPALO
|
||
CPLUS,CTIMES,CTIME,CDIVID,CMINUS,CLQ,CLEQ,CGQ,CGEQ,CLOG,CSIN,CCOS,CATAN,CSQRT
|
||
CFIX,CFLOAT,CEXP,CRAND,CINEQU,SPECBND,PGGIVE,PGFIND,MTYO,CMIN,CMAX,RCL,R1C,W1C
|
||
CALLTY,CTYPEC,CTYPEW,NOTTY,CHKAB,CTMPLT,IUNWIN,UNWIN2,NOSHUF,ROOT,ERROBL,INTOBL
|
||
CINSER,CIRMV,CLOOKU,CATOM,CIPNAM,ISTRCM,CITERP,CIPRIN,CIPRN1,CIPRNC,CGFALS
|
||
CPATM,CP1ATM,CPCATM,CPSTR,CP1STR,CPCSTR,CPCH,CREADC,CNXTCH,CREDC1,CNXTC1
|
||
CGBOUN,IIGLOC,MAKTU2,CIFLTZ,CIUPRS,SAT,TFA,WTYP,NAPT,PTYPE,APLQ,PURBOT,GCSBOT
|
||
GLOTOP,TYPVEC,1STEPR,LSTRES,NODES,MAINPR,CVTYPE,CSPNAM,CSBSTR,INTBCK,CICRLF
|
||
CERR1,CERR2,CERR3,CANDP,CORP,CSQUTA,CIMAGE,ATOSQ,CFILLE,CPRTYC,FMPOPJ
|
||
TD.PUT,TD.GET,TD.LNT,CBYTES,MARK,MARK2G,TD.AGC,DSTORE,RCLV,NUMSAT,RMCALL,NPRFLG
|
||
NSPOPJ,NFPOPJ,PURCLN,FRETOP,PURVEC,SWAPGC,VECBOT]
|
||
.GLOBAL A
|
||
ADDSQU A
|
||
TERMIN
|
||
IFE ITS,[
|
||
IRP A,,[NTTYPE,CLRSTR]
|
||
.GLOBAL A
|
||
ADDSQU A
|
||
TERMIN
|
||
]
|
||
|
||
VECRET
|
||
|
||
; ROUTINE TO SORT AND PURIFY SQUOZE TABLE
|
||
|
||
SQSETU: MOVE A,[SQUTBL-SQULOC+2,,SQUTBL]
|
||
MOVEI 0,1
|
||
SQ2: MOVE B,(A)
|
||
CAMG B,2(A)
|
||
JRST SQ1
|
||
MOVEI 0,0
|
||
EXCH B,2(A)
|
||
MOVEM B,(A)
|
||
MOVE B,1(A)
|
||
EXCH B,3(A)
|
||
MOVEM B,1(A)
|
||
SQ1: ADD A,[2,,2]
|
||
JUMPL A,SQ2
|
||
JUMPE 0,SQSETU
|
||
IFE ITS,[
|
||
STSQU: MOVE B,[440700,,SQBLK]
|
||
PUSHJ P,MNGNAM
|
||
HRROI B,SQBLK
|
||
MOVSI A,600001
|
||
GTJFN
|
||
FATAL CANT MAKE FIXUP FILE
|
||
MOVEI E,(A)
|
||
MOVE B,[440000,,100000]
|
||
OPENF
|
||
FATAL CANT OPEN FIXUP FILE
|
||
MOVE B,[444400,,SQUTBL]
|
||
MOVNI C,SQULOC-SQUTBL
|
||
SOUT
|
||
MOVEI A,(E)
|
||
CLOSF
|
||
JFCL
|
||
MOVE A,[SQUTBL-SQULOC,,SQUTBL]
|
||
MOVEM A,SQUPNT"
|
||
]
|
||
IFN ITS,[
|
||
.GLOBAL CSIXBT
|
||
STSQU: MOVE C,MUDSTR+2 ; CALCULATE SECOND FILE NAME FOR SQUOZE TABLE
|
||
PUSHJ P,CSIXBT
|
||
HRRI C,(SIXBIT/TAB/) ; TABxxx IS SECOND NAME OF FILE
|
||
MOVSS C
|
||
MOVEM C,SQBLK+2 ; STORE IN APPROPRIATE BLOCKS
|
||
MOVEM C,SQWBLK+2
|
||
.SUSET [.SSNAM,,SQDIR]
|
||
.OPEN GCHN,SQWBLK ; OPEN FILE
|
||
FATAL CAN'T CREATE SQUOZE FILE
|
||
MOVE A,[SQUTBL-SQULOC,,SQUTBL]
|
||
MOVEM A,SQUPNT"
|
||
.IOT GCHN,A
|
||
.CLOSE GCHN ; CLOSE THE CHANNEL
|
||
]
|
||
POPJ P,
|
||
|
||
RHITOP: 0
|
||
|
||
OBSZ: 151.
|
||
13.
|
||
151.
|
||
151.
|
||
317.
|
||
|
||
OBTBL2: ROOT+1
|
||
ERROBL+1
|
||
INTOBL+1
|
||
MUDOBL+1
|
||
INITIAL+1
|
||
|
||
OBTBL: INITIAL+1-TVSTRT+TVBASE
|
||
MUDOBL+1-TVSTRT+TVBASE
|
||
INTOBL+1-TVSTRT+TVBASE
|
||
ERROBL+1-TVSTRT+TVBASE
|
||
ROOT+1-TVSTRT+TVBASE
|
||
OBNAM: MQUOTE INITIAL
|
||
IMQUOTE MUDDLE
|
||
MQUOTE INTERRUPTS
|
||
MQUOTE ERRORS
|
||
MQUOTE ROOT
|
||
|
||
OBTBL1: INITIAL+1
|
||
MUDOBL+1
|
||
INTOBL+1
|
||
ERROBL+1
|
||
ROOT+1
|
||
|
||
|
||
IFN ITS,[
|
||
SQWBLK: SIXBIT / 'DSK/
|
||
SIXBIT /SQUOZE/
|
||
SIXBIT /TABLE/
|
||
]
|
||
IFE ITS,[
|
||
MNGNAM: MOVE A,[440700,,MUDSTR+2] ; FOR NAME HACKING
|
||
ILDB 0,A ; SEE IF IT IS A VERSION
|
||
CAIN 0,177
|
||
POPJ P,
|
||
MOVE A,B
|
||
ILDB 0,A
|
||
CAIN 0,"X ; LOOK FOR X'S
|
||
JRST .+3
|
||
MOVE B,A
|
||
JRST .-4
|
||
|
||
MOVE A,[440700,,MUDSTR+2]
|
||
ILDB 0,A
|
||
IDPB 0,B
|
||
ILDB 0,A
|
||
IDPB 0,B
|
||
ILDB 0,A
|
||
IDPB 0,B
|
||
POPJ P,
|
||
]
|
||
|
||
IFN ITS,[
|
||
.GLOBAL VCREATE,MUDSTR
|
||
|
||
DEBUG: MOVE E,[440600,,[SIXBIT /EXPERIMENTAL/]]
|
||
MOVEI 0,12.
|
||
JRST STUFF
|
||
|
||
VCREATE: .SUSET [.SSNAM,,[SIXBIT /MUDSYS/]]
|
||
.OPEN 0,OP%
|
||
.VALUE
|
||
MOVEI 0,0 ; SET 0 TO DO THE .RCHST
|
||
.RCHST 0
|
||
.CLOSE 0
|
||
.FDELE DB%
|
||
.VALUE
|
||
MOVE E,[440600,,B]
|
||
MOVEI 0,6
|
||
STUFF: MOVE D,[440700,,MUDSTR+2]
|
||
STUFF1: ILDB A,E ; GET A CHAR
|
||
CAIN A,0 ;SUPRESS SPACES
|
||
MOVEI A,137 ;RUBOUT'S DON'T TYPE OUT
|
||
ADDI A,40 ; TO ASCII
|
||
IDPB A,D ; STORE
|
||
SOJN 0,STUFF1
|
||
SETZM 34
|
||
SETZM 35
|
||
SETZM 36
|
||
.VALUE
|
||
|
||
OP%: 1,,(SIXBIT /DSK/)
|
||
SIXBIT /MUD%/
|
||
SIXBIT />/
|
||
|
||
DB%: (SIXBIT /DSK/)
|
||
SIXBIT /MUD%/
|
||
SIXBIT /</
|
||
0
|
||
0
|
||
]
|
||
|
||
|
||
.GLOBAL GCDIR,ILDBLK,TILDBL,GCLDBK,LENGC,SLENGC,SGCLBK,RLENGC
|
||
.GLOBAL SECBLK,SECLEN,RSLENG,DECBLK
|
||
|
||
; ROUTINE TO DUMP OUT THE GARBAGE-COLLECTOR
|
||
|
||
DUMPGC:
|
||
IFN ITS,[
|
||
.SUSET [.SSNAM,,GCDIR] ; SET SNAME
|
||
MOVE C,MUDSTR+2 ; CREATE SECOND NAMES
|
||
PUSHJ P,CSIXBT
|
||
HRRI C,(SIXBIT /MUD/)
|
||
MOVS A,C ; MUDxx IS SECOND NAME
|
||
MOVEM A,GCLDBK+2
|
||
MOVEM A,SGCLBK+2
|
||
MOVEM A,ILDBLK+2
|
||
MOVEM A,GCDBLK+2 ; SMASH IN SECOND NAMES
|
||
MOVEM A,SGCDBK+2
|
||
MOVEM A,INTDBK+2
|
||
.OPEN 0,GCDBLK ; OPEN GC FILE
|
||
FATAL CANT CREATE AGC FILE
|
||
MOVNI A,LENGC ; CALCULATE IOT POINTER
|
||
ASH A,10.
|
||
HRLZS A
|
||
HRRI A,REALGC
|
||
.IOT 0,A ; SEND IT OUT
|
||
.CLOSE 0, ; CLOSE THE CHANNEL
|
||
.OPEN 0,SGCDBK ; OPEN GC FILE
|
||
FATAL CANT CREATE AGC FILE
|
||
MOVNI A,SLENGC ; CALCULATE IOT POINTER
|
||
ASH A,10.
|
||
HRLZS A
|
||
HRRI A,REALGC+RLENGC
|
||
.IOT 0,A ; SEND IT OUT
|
||
.CLOSE 0, ; CLOSE THE CHANNEL
|
||
|
||
|
||
; ROUTINE TO DUMP THE INTERPRETER
|
||
|
||
.SUSET [.SSNAM,,INTDIR]
|
||
.OPEN 0,ILDBLK ; OPEN FILE TO INTERPRETER BLOCK
|
||
FATAL CANT FIXUP INTERPRETER
|
||
HLRE B,TP ; MAKE SURE BIG ENOUGJ
|
||
MOVNS B ; SEE IF WE WIN
|
||
CAIGE B,400 ; SKIP IF WINNING
|
||
FATAL NO ROOM FOR PAGE MAP
|
||
MOVSI A,-400
|
||
HRRI A,1(TP)
|
||
.ACCES 0,[1]
|
||
.IOT 0,A ; GET IN PAGE MAP
|
||
.CLOSE 0,
|
||
.OPEN 0,INTDBK
|
||
FATAL CANT FIXUP INTERPRETER
|
||
MOVEI A,1 ; INITIALIZE FILE PAGE COUNT
|
||
MOVEI B,0 ; CORE PAGE COUNT
|
||
MOVEI E,1(TP)
|
||
LOPFND: HRRZ 0,(E)
|
||
JUMPE 0,NOPAG ; IF 0 FORGET IT
|
||
ADDI A,1 ; AOS FILE MAP
|
||
NOPAG: ADDI B,1 ; AOS PAGE MAP
|
||
CAIE B,PAGEGC ; SKIP IF DONE
|
||
AOJA E,LOPFND
|
||
ASH A,10. ; TO WORDS
|
||
.ACCES 0,A
|
||
MOVNI B,LENGC
|
||
ASH B,10. ; TO WORDS
|
||
HRLZS B ; SWAP
|
||
HRRI B,AGCLD
|
||
.IOT 0,B
|
||
.CLOSE 0,
|
||
POPJ P, ; DONE
|
||
|
||
GCDBLK: SIXBIT / 'DSK/
|
||
SIXBIT /AGC/
|
||
SIXBIT /MUD /
|
||
|
||
SGCDBK: SIXBIT / 'DSK/
|
||
SIXBIT /SGC/
|
||
SIXBIT /MUD /
|
||
|
||
INTDBK: 100007,,(SIXBIT /DSK/)
|
||
SIXBIT /TS/
|
||
SIXBIT /MUD/
|
||
|
||
]
|
||
IFE ITS,[
|
||
MOVE B,[440700,,GCLDBK]
|
||
PUSHJ P,MNGNAM ; VERSION TO NAME IF NECESSARY
|
||
HRROI B,GCLDBK
|
||
MOVSI A,600001
|
||
GTJFN
|
||
FATAL CANT WRITE OUT GC
|
||
MOVEI E,(A)
|
||
MOVE B,[440000,,100000]
|
||
OPENF
|
||
FATAL CANT OPEN GC FILE
|
||
MOVNI C,LENGC
|
||
ASH C,10.
|
||
MOVE B,[444400,,REALGC]
|
||
MOVEI A,(E)
|
||
SOUT
|
||
MOVEI A,(E)
|
||
CLOSF
|
||
JFCL
|
||
MOVEI D,LENGC+LENGC
|
||
MOVNI A,1
|
||
MOVEI B,REALGC
|
||
ASH B,-9.
|
||
HRLI B,400000
|
||
|
||
PMAP
|
||
ADDI B,1
|
||
SOJG D,.-2
|
||
|
||
MOVE B,[440700,,SGCLBK]
|
||
PUSHJ P,MNGNAM ; VERSION TO NAME IF NECESSARY
|
||
HRROI B,SGCLBK
|
||
MOVSI A,600001
|
||
GTJFN
|
||
FATAL CANT WRITE OUT GC
|
||
MOVEI E,(A)
|
||
MOVE B,[440000,,100000]
|
||
OPENF
|
||
FATAL CANT OPEN GC FILE
|
||
MOVNI C,SLENGC
|
||
ASH C,10.
|
||
MOVE B,[444400,,REALGC+RLENGC]
|
||
MOVEI A,(E)
|
||
SOUT
|
||
MOVEI A,(E)
|
||
CLOSF
|
||
JFCL
|
||
MOVEI D,SLENGC+SLENGC
|
||
MOVNI A,1
|
||
MOVEI B,REALGC+RLENGC
|
||
ASH B,-9.
|
||
HRLI B,400000
|
||
|
||
PMAP
|
||
ADDI B,1
|
||
SOJG D,.-2
|
||
|
||
MOVE B,[440700,,SECBLK]
|
||
PUSHJ P,MNGNAM ; VERSION TO NAME IF NECESSARY
|
||
HRROI B,SECBLK
|
||
MOVSI A,600001
|
||
GTJFN
|
||
FATAL CANT WRITE OUT GC
|
||
MOVEI E,(A)
|
||
MOVE B,[440000,,100000]
|
||
OPENF
|
||
FATAL CANT OPEN GC FILE
|
||
MOVNI C,SECLEN
|
||
ASH C,10.
|
||
MOVE B,[444400,,REALGC+RLENGC+RSLENG]
|
||
MOVEI A,(E)
|
||
SOUT
|
||
MOVEI A,(E)
|
||
CLOSF
|
||
JFCL
|
||
|
||
; NOW MUNG THE THING TO BE DIFFERENT TO USE UUOS FOR DEBUGGING VERSION
|
||
|
||
.GLOBAL %FXUPS,%FXEND
|
||
|
||
MOVEI A,%FXUPS
|
||
|
||
%DBG1: HLRZ D,(A)
|
||
HRRZ A,(A)
|
||
LDB 0,[331100,,(A)] ; GET INS
|
||
MOVEI C,%TBL
|
||
HRRZ B,(C)
|
||
CAME B,0
|
||
AOJA C,.-2
|
||
CAIN B,<<(XBLT)>_<-9.>>
|
||
HLLZS (A)
|
||
LDB B,[331100,,(C)]
|
||
DPB B,[331100,,(A)]
|
||
MOVE A,D
|
||
JUMPN A,%DBG1
|
||
%DBG2:
|
||
MOVE B,[440700,,DECBLK]
|
||
PUSHJ P,MNGNAM ; VERSION TO NAME IF NECESSARY
|
||
HRROI B,DECBLK
|
||
MOVSI A,600001
|
||
GTJFN
|
||
FATAL CANT WRITE OUT GC
|
||
MOVEI E,(A)
|
||
MOVE B,[440000,,100000]
|
||
OPENF
|
||
FATAL CANT OPEN GC FILE
|
||
MOVNI C,SECLEN
|
||
ASH C,10.
|
||
MOVE B,[444400,,REALGC+RLENGC+RSLENG]
|
||
MOVEI A,(E)
|
||
SOUT
|
||
MOVEI A,(E)
|
||
CLOSF
|
||
JFCL
|
||
MOVEI D,SECLEN+SECLEN
|
||
MOVNI A,1
|
||
MOVEI B,REALGC+RLENGC
|
||
ASH B,-9.
|
||
HRLI B,400000
|
||
|
||
PMAP
|
||
ADDI B,1
|
||
SOJG D,.-2
|
||
|
||
MOVE B,[440700,,ILDBLK]
|
||
SKIPE OPSYS
|
||
MOVE B,[440700,,TILDBL]
|
||
PUSHJ P,MNGNAM
|
||
MOVSI C,-1000
|
||
MOVSI A,400000
|
||
RPA: RPACS
|
||
TLNE B,10000
|
||
TLNN B,400 ; SKIP IF NOT PRIVATE
|
||
SKIPA
|
||
MOVES (C)
|
||
ADDI C,777
|
||
ADDI A,1
|
||
AOBJN C,RPA
|
||
|
||
MOVNI A,1
|
||
CLOSF
|
||
FATAL CANT CLOSE STUFF
|
||
HRROI B,ILDBLK
|
||
MOVSI A,100001
|
||
GTJFN ; GET A JFN
|
||
FATAL GARBAGE COLLECTOR IS MISSING
|
||
HRRZS E,A ; SAVE JFN
|
||
MOVE B,[440000,,300000]
|
||
OPENF
|
||
FATAL CANT OPEN GC FILE
|
||
MOVEI A,(E) ; FIND OUT LENGTH OF MAP
|
||
BIN ; GET LENGTH WORD
|
||
HLRZ 0,B
|
||
CAIE 0,1776 ; TOPS20 SSAVE FILE FORMAT
|
||
CAIN 0,1000 ; TENEX SSAVE FILE FORMAT
|
||
JRST .+2
|
||
FATAL NOT AN SSAVE FILE
|
||
MOVEI A,(B) ; ISOLATE SIZE OF MAP
|
||
HLRE B,TP ; MUST BE SPACE FOR CRUFT
|
||
MOVNS B
|
||
CAIGE B,(A) ; ROOM?
|
||
FATAL NO ROOM FOR PAGE MAP (GULP)
|
||
MOVN C,A
|
||
MOVEI A,(E) ; READY TO READ IN MAP
|
||
MOVEI B,1(TP) ; ONTO TP STACK
|
||
HRLI B,444400
|
||
SIN ; SNARF IT IN
|
||
|
||
MOVEI A,1(TP) ; POINT TO MAP
|
||
CAIE 0,1000
|
||
JRST RPA1 ; GO TO THE TOPS20 CODE
|
||
LDB 0,[221100,,(A)] ; GET FORK PAGE
|
||
CAIE 0,PAGEGC+PAGEGC ; GOT IT?
|
||
AOJA A,.-2
|
||
JRST RPA2
|
||
|
||
RPA1: ADDI A,1 ; POINT TO PROCESS PAGE NUMBER
|
||
LDB 0,[331100,,(A)] ; REPEAT COUNT IN 0
|
||
LDB B,[3300,,(A)] ; FIRST PAGE NUMBER IN B
|
||
ADD 0,B ; LARGEST PAGE NUMBER
|
||
CAIL 0,PAGEGC+PAGEGC
|
||
CAILE B,PAGEGC+PAGEGC
|
||
AOJA A,RPA1 ; NEXT PAIR OF WORDS PLEASE
|
||
SUBI A,1 ; POINT TO FILE PAGE NUMBER
|
||
SUBI B,PAGEGC+PAGEGC
|
||
MOVN B,B
|
||
ADDM B,(A) ; SET UP THE PAGE
|
||
|
||
RPA2: HRRZ B,(A) ; GET PAGE
|
||
MOVEI A,(E) ; GET JFN
|
||
ASH B,9.
|
||
SFPTR
|
||
FATAL ACCESS OF FILE FAILED
|
||
MOVEI A,(E)
|
||
MOVE B,[444400,,AGCLD]
|
||
MOVNI C,LENGC
|
||
ASH C,10.
|
||
SOUT
|
||
MOVEI A,(E)
|
||
CLOSF
|
||
JFCL
|
||
POPJ P,
|
||
|
||
; CODE TO DISTINGUISH BETWEEN TOPS20 AND TENEX AT SETUP TIME
|
||
|
||
TWENTY: HRROI A,C ; RESULTS KEPT HERE
|
||
HRLOI B,600015
|
||
MOVEI C,0 ; CLEAN C UP
|
||
DEVST
|
||
JFCL
|
||
MOVEI A,1 ; TENEX HAS OPSYS = 1
|
||
CAME C,[ASCII/NUL/] ; TOPS20 GIVES "NUL"
|
||
MOVEM A,OPSYS ; TENEX GIVES "NIL"
|
||
POPJ P,
|
||
%TBL: IRP A,,[HRRM,HRLM,MOVEM,SETZM,HLRZ,XBLT]
|
||
S!A <<(A)>_<-9.>>
|
||
TERMIN
|
||
|
||
GCLDBK: ASCIZ /MDLXXX.AGC/
|
||
SGCLBK: ASCIZ /MDLXXX.SGC/
|
||
SECBLK: ASCIZ /MDLXXX.SEC/
|
||
ILDBLK: ASCIZ /MDLXXX.EXE/
|
||
TILDBL: ASCIZ /MDLXXX.SAV/
|
||
DECBLK: ASCIZ /MDLXXX.DEC/
|
||
]
|
||
|
||
|
||
|
||
END SETUP
|
||
|