1 TITLE INITIALIZATION FOR MUDDLE
5 HTVLNT==3000 ; GUESS OF TVP LENGTH
7 LAST==1 ;POSSIBLE CHECKS DONE LATER
22 OBSIZE==151. ;DEFAULT OBLIST SIZE
24 .LIFL <TVBASE+TVLNT-TVLOC>
28 .GLOBAL SHRRM,SHRLM,SMOVEM,SSETZM,SXBLT,SHLRZ
29 .GLOBAL SETUP,TPBAS,GCPDL,GCPVP,PVBASE,PVLNT,PARNEW,AAGC,ICR,SWAP,OBLNT,MSGTYP,POPUNW
30 .GLOBAL ICLOS,OCLOS,GLOBASE,GLOBSP,PARBOT,PARTOP,CODTOP,START,BEGIN,VECBOT,VECTOP,TPBASE
31 .GLOBAL LISTEN,ROOT,INITIAL,TBINIT,TOPLEV,INTOBL,ERROBL,MUDOBL,TTYOPE,RESFUN,QUITTER
32 .GLOBAL IOINS,BUFRIN,IOIN2,ECHO,MTYI,MTYO,IMTYO,MUDSTR,P.TOP,TTICHN,TTOCHN,TYPVEC,SQDIR
33 .GLOBAL PDLBUF,PHIBOT,%UNAM,PURVEC,STOSTR,ISTOST,TD.LNT,TD.PUT,TD.GET,CAFRE1
34 .GLOBAL FRETOP,LPUR,SQBLK,REALGC,INTDIR,AGCLD,PAGEGC,TD.AGC,TVSTRT,REALTV,PVSTOR
35 .GLOBAL GCSTOP,SPSTOR,DSTORE,SQBYTE,INBYTE,GCBYTE,FRSTCH,OPSYS,IJFNS,GETJS
38 LPUR==.LPUR ; SET UP SO LPUR WORKS
40 ; INIITAL AMOUNT OF AFREE SPACE
44 ISTOST: TVSTRT-STOSTR,,0
48 SETUP: MOVEI 0,0 ; ZERO ACS
52 IFN ITS, .SUSET [.RUNAM,,%UNAM] ; FOR AGC'S BENFIT
53 MOVE P,GCPDL ;GET A PUSH DOWN STACK
54 IFN ITS, .SUSET [.SMASK,,[200000]] ; ENABLE PDL OVFL
55 MOVE 0,[TVBASE,,TVSTRT]
56 BLT 0,TVSTRT+HTVLNT-3 ; BLT OVER TVP
57 IFE ITS, PUSHJ P,TWENTY ; FIND OUT WHETHER IT IS TOPS20 OR NOT
58 PUSHJ P,TTYOPE ;OPEN THE TTY
59 AOS A,20 ; TOP OF LOW SEGG
61 SOSN A ; IF NOTHING YET
62 IFN ITS, .SUSET [.RMEMT,,P.TOP]
65 SUB A,FRETOP ; SETUP FOR GETTING NEEDED CORE
74 .CALL HIGET ; GET THEM
75 FATAL INITM--CORE NOT AVAILABLE FOR INITIALIZATION
78 SUBI A,2000 ; WHERE FRETOP IS
87 HRRE A,P.TOP ; CHECK TOP
88 TRNE A,377777 ; SKIP IF ALL LOW SEG
89 JUMPL A,PAGLOS ; COMPLAIN
90 MOVE A,HITOP ; FIND HI SEG TOP
93 MOVEM A,RHITOP ; SAVE IT
103 HIBOK: MOVEI B,[ASCIZ /MUDDLE INITIALIZATION.
105 PUSHJ P,MSGTYP ;PRINT IT
106 MOVE A,CODTOP ;CHECK FOR A WINNING LOAD
107 CAML A,VECBOT ;IT BETTER BE LESS
108 JRST DEATH1 ;LOSE COMPLETELY
109 SETTV: MOVE PVP,[-PVLNT*2,,GCPVP] ;AND A PROCESS VECTOR
111 MOVEM PVP,PVSTOR+1-TVSTRT+TVBASE
112 MOVEI A,(PVP) ;SET UP A BLT
113 HRLI A,PVBASE ;FROM PROTOTYPE
114 BLT A,PVLNT*2-1(PVP) ;INITIALIZE
115 MOVE TP,[-ITPLNT,,TPBAS] ;GET A STACK FOR THIS PROCCESS
116 MOVEI TB,(TP) ;AND A BASE
118 IFE ITS, HRLI TB,400001 ; FOR MULTI SEG HACKING
119 SUB TP,[1,,1] ;POP ONCE
121 ; FIRST BUILD MOBY HASH TABLE
123 MOVEI A,1023. ; TRY THIS OUT FOR SIZE
125 MOVEM B,HASHTB+1-TVSTRT+TVBASE ; STORE IN TVP POINTER
131 ; ALLOCATE SOME OBLISTS FOR INITIAL ATOMS
133 PUSH P,[5] ;COUNT INITIAL OBLISTS
135 PUSH P,OBLNT ;SAVE CURRENT OBLIST DEFAULT SIZE
140 MCALL 0,MOBLIST ;GOBBLE AN OBLIST
141 PUSH TP,$TOBLS ;AND SAVE THEM
143 MOVE A,(P)-1 ;COUNT DOWN
144 MOVEM B,@OBTBL(A) ;STORE
147 POP P,OBLNT ;RESTORE DEFAULT OBLIST SIZE
149 MOVE C,[-TVLNT+2,,TVBASE]
150 MOVE D,[-HTVLNT+2,,TVSTRT]
152 ;MAIN INITIALIZE LOOP - SCAN XFER VECTOR FOR ATOMS, UPDATE
153 ;OFFSETS IN CODE, UNIQUIFY ATOMS AND COMPACT XFER VECTOR
155 ILOOP: HLRZ A,(C) ;FIRST TYPE
156 JUMPE A,TVEXAU ;USEFUL STUFF EXHAUSTED
157 CAIN A,TCHSTR ;CHARACTER STRING?
158 JRST CHACK ;YES, GO HACK IT
160 JRST ATOMHK ;YES, CHECK IT OUT
161 MOVE A,(C) ;MOVE TO NEW HOME (MAY BE SAME)
165 SETLP: AOS (P) ;COUNT NUMBER OF PAIRS IN XFER VECTOR
166 ADD D,[2,,2] ;OUT COUNTER
167 SETLP1: ADD C,[2,,2] ;AND IN COUNTER
168 JUMPL C,ILOOP ;JUMP IF MORE TO DO
170 ;NEW XFER VECTOR FINISHED, NOW GIVE AWAY THE REST
172 TVEXAU: HLRE B,D ; LEFT HALF OF AOBJN
173 MOVNI TVP,HTVLNT-2 ; CALCULATE LENGTH OF TVP
174 SUB TVP,B ; GET -LENGTH OF TVP IN TVP
176 HRRI TVP,TVSTRT ; BUILD A TASTEFUL TVP POINTER
177 MOVNI C,TVLNT-HTVLNT+2(B) ; SMASH IN LENGTH INTO END DOPE WORDS
178 HRLM C,TVSTRT+HTVLNT-1
180 MOVEM E,TVSTRT+HTVLNT-2
182 MOVNI C,-2(C) ; CLOBBER LENGTH INTO REAL TVP
186 HRLM C,1(B) ; PUT IN LENGTH
188 MOVEM TVP,REALTV+1(PVP)
193 MOVE A,TYPVEC+1 ;GET POINTER
194 MOVEI 0,0 ;FOR POSSIBLE NULL SLOTS
195 MOVSI B,TATOM ;SET TYPE TO ATOM
196 MOVEI D,400000 ; TYPE CODE HACKS
198 TYPLP: HLLM B,(A) ;CHANGE TYPE TO ATOM
199 MOVE C,@1(A) ;GET ATOM
200 HLRE E,C ; FIND DOPE WORD
202 HRRM D,(E) ; STUFF INTO ATOM
208 \f; CLOSE TTY CHANNELS
215 ;GENERAT THE LOGICAL TTY IN AND OUT CHANNELS
217 ;SETUP CALL TO OPEN OUTPUT TTY CHANNNEL
219 IRP A,,[[PRINT,TCHSTR],[TTY:,TCHSTR]]
227 MCALL 2,FOPEN ;OPEN THE OUT PUT CHANNEL
228 MOVEM B,TTOCHN+1 ;SAVE IT
230 ;ASSIGN AS GLOBAL VALUE
233 PUSH TP,IMQUOTE OUTCHAN
236 MOVE A,[PUSHJ P,MTYO] ;MORE WINNING INS
237 MOVEM A,IOINS(B) ;CLOBBER
240 ;SETUP A CALL TO OPEN THE TTY CHANNEL
242 IRP A,,[[READ,TCHSTR],[TTY:,TCHSTR]]
250 MCALL 2,FOPEN ;OPEN INPUTCHANNEL
251 MOVEM B,TTICHN+1 ;SAVE IT
252 PUSH TP,$TATOM ;ASSIGN AS A GLOBAL VALUE
253 PUSH TP,IMQUOTE INCHAN
256 MOVE C,BUFRIN(B) ;GET AUX BUFFER PTR
257 MOVE A,[PUSHJ P,MTYI]
258 MOVEM A,IOIN2(C) ;MORE OF A WINNER
259 MOVE A,[PUSHJ P,IMTYO]
260 MOVEM A,ECHO(C) ;ECHO INS
262 MOVEI A,3 ;FIRST CHANNEL AFTER INIT HAPPENS
265 ;GENERATE AN INITIAL PROCESS AND SWAP IT IN
267 MOVEI A,TPLNT ;STACK PARAMETERS
269 PUSHJ P,ICR ;CREATE IT
274 MOVEM 0,REALTV+1(B) ; STUFF IN TRANSFER VECTOR POINTER
277 MOVE D,B ;SET UP TO CALL SWAP
278 JSP C,SWAP ;AND SWAP IN
279 MOVEM PVP,MAINPR" ;SAVE AS THE MAIN PROCESS
280 PUSH TP,[TENTRY,,TOPLEV] ;BUILD DUMMY FRAME
288 PUSH TP,C ;TPSAV PUSHED
290 HRRI TB,(TP) ;SETUP TB
292 IFE ITS, HRLI TB,400002
295 MOVEM TB,TBINIT+1(PVP)
299 MOVEM A,RESFUN+1(PVP)
301 PUSH TP,IMQUOTE THIS-PROCESS
306 ; FIND TVP OFFSET FOR THE ATOM 'T' FOR TEMPLATE
316 PUSH TP,IMQUOTE TVTOFF,,MUDDLE
321 ; HERE TO SETUP SQUOZE TABLE IN PURE CORE
323 PUSHJ P,SQSETU ; GO TO ROUTINE
326 MOVEI A,400000 ; FENCE POST PURE SR VECTOR
330 SUBI A,-PDLBUF(B) ;POINT TO DOPE WORDS
331 MOVEI B,12 ;GROWTH SPEC
338 IFE ITS, PUSHJ P,GETJS
344 MOVEM A,TPBASE+1(PVP)
346 ; CREATE LIST OF ROOT AND NEW OBLIST
351 NAMOBL: PUSH TP,$TATOM
352 PUSH TP,@OBNAM-1(A) ; NAME
354 PUSH TP,IMQUOTE OBLIST
357 MCALL 3,PUT ; NAME IT
362 PUSH TP,IMQUOTE OBLIST
370 ;Define MUDDLE version number
372 MOVEI B,0 ;Initialize result
373 MOVE C,[440700,,MUDSTR+2]
374 VERLP: ILDB D,C ;Get next charcter digit
375 CAIG D,"9 ;Non-digit ?
378 SUBI D,"0 ;Convert to number
380 ADD B,D ;Include number into result
381 SOJG A,VERLP ;Finished ?
384 PUSH TP,IMQUOTE MUDDLE
387 MCALL 2,SETG ;Make definition
393 PUSH TP,MQUOTE IPC-HANDLER
403 ; Allocate inital template tables
411 ADD B,[10,,10] ; REST IT OFF
415 MOVEI 0,TUVEC ; SETUP UTYPE
424 MOVEI 0,TUVEC ; SETUP UTYPE
433 MOVEI 0,TUVEC ; SETUP UTYPE
441 PTSTRT: MOVEI A,SETUP
443 SUB A,PARBOT ;FIND WHERE PAIRS SHOULD GO
446 ; PURIFY/IMPURIFY THE WORLD (PDL)
449 PURIMP: MOVE A,FRETOP
455 DOTCAL CORBLK,[[1000,,310000],[1000,,-1],A]
456 FATAL INITM -- CAN'T IMPURIFY LOW CORE
462 DOTCAL CORBLK,[[1000,,0],[1000,,-1],B]
463 FATAL INITM -- CAN'T FLUSH MIDDLE CORE
471 ;FIXME Disabled because this doesn't succeed...
472 ; DOTCAL CORBLK,[[1000,,210000],[1000,,-1],A]
473 ; FATAL INITM -- CAN'T PURIFY HIGH CORE
481 PUSH P,[15.,,15.] ;PUSH A SMALL PRGRM ONTO P
482 MOVEI A,1(P) ;POINT TO ITS START
483 PUSH P,[JRST AAGC] ;GO TO AGC
484 PUSH P,[MOVE PVP,PVSTOR+1]
485 PUSH P,[MOVE B,PSTO+1(PVP)] ;GET SAVED P
486 PUSH P,[SUB B,-14.(P)] ;FUDGE TO POP OFF PROGRAM
487 PUSH P,[MOVEM B,PSAV(TB)] ;INTO FRAME
488 PUSH P,[MOVE B,TPSTO+1(PVP)] ;GET TP
489 PUSH P,[MOVEM B,TPSAV(TB)] ;STORE IT
490 PUSH P,[MOVE B,SPSTOR+1] ;SP
491 PUSH P,[MOVEM B,SPSAV(TB)]
492 PUSH P,[MOVEI B,TOPLEV] ;WHERE TO GO
493 PUSH P,[MOVEM B,PCSAV(TB)]
494 IFN ITS, PUSH P,[MOVSI B,(.VALUE )]
495 IFE ITS, PUSH P,[MOVSI B,(JRST)]
497 PUSH P,[JRST B] ;GO DO VALRET
499 PUSH P,A ; PUSH START ADDR
500 MOVE B,[JRST -12.(P)]
502 IFE ITS, MOVE C,[HALTF]
504 MOVE C,[ASCII \
\170/
\e9\]
505 MOVE D,[ASCII \B/
\e1Q\]
506 MOVE E,[ASCIZ \
\r\16*
\r\] ;TERMINATE
514 DEATH1: MOVEI B,[ASCIZ /LOSSAGE--CODE AND DATA OVERLAP
519 ;CHARACTER STRING HACKER
521 CHACK: MOVE A,(C) ;GET TYPE
522 HLLZM A,(D) ;STORE IN NEW HOME
523 MOVE B,1(C) ;GET POINTER
526 PUSH P,E+1 ; IDIVI WILL CLOBBER
527 ADDI E,4+5*2 ; ROUND AND ACCOUNT FOR DOPE WORDS
528 IDIVI E,5 ; E/ WORDS LONG
529 PUSHJ P,EBPUR ; MAKE A PURIFIED COPY
531 HRLI B,010700 ;MAKE POINT BYTER
533 MOVEM B,1(D) ;AND STORE IT
534 ANDI A,-1 ;CLEAR LH OF A
535 JUMPE A,SETLP ;JUMP IF NO REF
536 HRRZ B,-1(A) ;SEE IF PREVIOUS INSTRUCTION REFERS TO $TCHSTR
537 CAIE B,$TCHSTR ;SKIP IF IT DOES
538 JRST CHACK1 ;NO, JUST DO CHQUOTE PART
539 HRRM D,-1(A) ;CLOBBER
541 HRRM E,(A) ;STORE INTO REFERENCE
546 ; SUBROUTINE TO COPY A HUNK OF STRUCTURE TO THE HIGH SEGMENT
550 ADD E,HITOP ; GET NEW TOP
551 CAMG E,RHITOP ; SKIP IF TOO BIG
554 ; CODE TO GROW HI SEG
557 ADDB A,RHITOP ; NEW TOP
561 ASH A,-10. ; NUM OF BLOCKS
562 SUBI A,1 ; BLOCK TO GET
567 EBPUR1: MOVEI A,-1(E) ; NEEDED TO TERMINATE BLT
590 ; PROCESS AN ATOM AND ADD IT TO AN APPROPRIATE OBLIST IF IT ISN'T
593 ATOMHK: PUSH TP,$TOBLS ; SAVE OBLIST
594 PUSH TP,[0] ; FILLED IN LATER
595 PUSH TP,$TVEC ;SAVE TV POINTERS
599 MOVE C,1(C) ;GET THE ATOM
600 PUSH TP,$TATOM ;AND SAVE
604 HRRZ B,(C) ;GET OBLIST SPEC FROM ATOM
606 ADDI B,1(TB) ;POINT TO ITS HOME
609 MOVEM B,-10(TP) ; CLOBBER
611 SETZM 2(C) ; FLUSH CURRENT OBLIST SPEC
627 ;HERE IF THIS ATOM MUST BE PUT ON OBLIST
629 USEATM: MOVE B,-2(TP) ; GET ATOM
630 HLRZ E,(B) ; SEE IF PURE OR NOT
631 TRNN E,400000 ; SKIP IF IMPURE
639 PUSHJ P,VALMAK ;MAKE A GLOBAL VALUE FOR THIS LOSER
640 PURAT2: MOVE C,-6(TP) ;RESET POINTERS
643 MOVE B,(C) ;MOVE THE ENTRY
644 HLLZM B,(D) ;DON'T WANT REF POINTER STORED
645 MOVE A,1(C) ;AND MOVE ATOM
648 ANDI B,-1 ;CHECK FOR REAL REF
649 JUMPE B,SETLP1 ;DON'T SAVE THIS ATOM ON TVP
650 HRRM A,(B) ;CLOBBER CODE
652 DPB A,[220400,,(B)] ; CLOBBER TVP PORTION
656 ; HERE TO MAKE A PURE ATOM
658 PURATM: HRRZ B,-2(TP) ; POINT TO IT
659 HLRE E,-2(TP) ; - LNTH
662 PUSHJ P,EBPUR ; PURE COPY
663 HRRM B,-2(TP) ; AND STORE BACK
672 FATAL INITM--PURE IMPURE LOSSAGE
676 MOVE D,-2(TP) ; GET ATOM BACK
677 HRRZ 0,(D) ; GET OBLIST CODE
683 CAILE D,HIBOT ; IF NEXT PURE & I AM ROOT
684 JUMPE 0,PURAT8 ; TAKES ADVANTAGE OF SYSTEM=0
699 PURAT9: HLRE A,-2(TP)
703 PURAT6: MOVE B,-10(TP) ; GET BUCKET BACK
706 HRRM 0,2(C) ; STORE OBLIST IN ATOM
707 PURAT1: HRRZ C,(B) ; GET CONTENTS
708 JUMPE C,HICONS ; AT END, OK
709 CAIL C,HIBOT ; SKIP IF IMPURE
710 JRST HICONS ; CONS IT ON
720 PUSHJ P,EBPUR ; MAKE PURE LIST CELL
724 HRRM B,(C) ; STORE IT
725 MOVE B,1(B) ; ATOM BACK
726 MOVE C,-6(TP) ; GET TVP SLOT
727 HRRM B,1(C) ; AND STORE
728 HLRZ 0,(B) ; TYPE OF VAL
730 CAIN 0,TUNBOU ; NOT UNBOUND?
731 JRST PURAT3 ; UNBOUND, NO VAL
732 MOVEI E,2 ; COUNT AGAIN
733 PUSHJ P,EBPUR ; VALUE CELL
734 MOVE C,-2(TP) ; ATOM BACK
740 HRRZ A,(C) ; GET OBLIST CODE
742 HRRM A,2(C) ; STORE OBLIST SLOT
746 ; A POSSIBLE MATCH ARRIVES HERE
748 CHCKD: MOVE D,(TP) ;THEY MATCH!, GET EXISTING ATOM
749 MOVEI A,(D) ;GET TYPE OF IT
750 MOVE B,-2(TP) ;GET NEW ATOM
752 TRZ A,377777 ; SAVE ONLY 400000 BIT
754 CAIN 0,(A) ; SKIP IF WIN
761 MOVE A,(B) ;MOVE VALUE
765 MOVE B,D ;EXISTING ATOM TO B
769 PUSHJ P,VALMAK ;MAKE A VALUE
773 ;NOW FIND ATOMS OCCURENCE IN XFER VECTOR
775 OFFIND: MOVE D,-4(TP) ;GET CURRENT POINTER INTO TP
776 MOVE C,[-TVLNT,,TVSTRT] ;AND A COPY OF TVP
777 MOVEI A,0 ;INITIALIZE COUNTER
778 ALOOP: CAMN B,1(C) ;IS THIS IT?
780 ADD C,[2,,2] ;BUMP COUNTER
782 AOJA A,ALOOP ;NO, KEEP LOOKING
784 MOVEI B,[ASCIZ /LOSSAGE--ATOM DISAPPEARED
786 TYPIT: PUSHJ P,MSGTYP
789 AFOUND: LSH A,1 ;FOUND ATOM, GET REAL OFFSET
792 MOVE C,-6(TP) ;GET TV POINTER TO NEW ATOM
793 HRRZ B,(C) ;POINT TO REFERENCE
795 HRRM A,(B) ;YES, CLOBBER AWAY
798 DPB A,[220400,,(B)] ; KILL TVP POINTER
799 JRST SETLP1 ;AND GO ON
801 A1VAL: HLRZ C,(B) ;GET VALUE'S TYPE
802 MOVE B,D ;NOW PUT EXISTING ATOM IN B
803 CAIN C,TUNBOU ;UNBOUND?
804 JRST OFFIND ;YES, WINNER
806 MOVEI B,[ASCIZ /LOSSAGE--ATOM TRIES TO HAVE 2 VALUES
811 IM.PUR: MOVEI B,[ASCIZ /LOSSAG--ATOM TRIES TO BE BOTH PURE AND IMPURE
815 PAGLOS: MOVEI B,[ASCIZ /LOSSAGE--IMPURE CORE EXTENDS INTO HIGH SEGMENT
819 HIFUL: MOVEI B,[ASCIZ /LOSSAGE--HI SEG FULL
824 ;MAKE A VALUE IN SLOT ON GLOBAL SP
826 VALMAK: HLRZ A,(B) ;TYPE OF VALUE
828 CAIN A,TUNBOU ;VALUE?
830 MOVE A,GLOBSP+1 ;GET POINTER TO GLOBAL SP
831 SUB A,[4,,4] ;ALLOCATE SPACE
832 CAMG A,GLOBAS+1 ;CHECK FOR OVERFLOW
834 MOVEM A,GLOBSP+1 ;STORE IT BACK
835 MOVE C,(B) ;GET TYPE CELL
837 HLLZM C,2(A) ;INTO TYPE CELL
838 MOVE C,1(B) ;GET VALUE
839 MOVEM C,3(A) ;INTO VALUE SLOT
840 MOVSI C,TGATOM ;GET TATOM,,0
842 MOVEM B,1(A) ;AND POINTER TO ATOM
843 MOVSI C,TLOCI ;NOW CLOBBER THE ATOM
844 MOVEM C,(B) ;INTO TYPE CELL
845 ADD A,[2,,2] ;POINT TO VALUE
852 SPOVFL: MOVEI B,[ASCIZ /LOSSAGE--GLOBAL SP OVERFLOW
870 \f;SET UP LIST OF INTERNAL NAMES AND ADDRESS NEEDED BY COMPILER
874 IRP A,,[FINIS,SPECBIND,WNA,WRONGT,$TLOSE,CALER1,POPUNW
875 ILOC,IGLOC,IDVAL,IDVAL1,ILVAL,IGVAL,INTFLG,LCKINT,ONINT,TYPLOO,TDEFER
876 IFALSE,UNAS,UNBOU,RCALL,SEGMNT,SEGLST,NUMPRI,OPSYS,SSPEC1,COMPERR
877 MAKACT,MAKENV,BFRAME,TTP,TTB,$TTP,$TTB,MAKTUP,TPALOC,IBIND,SSPECS
878 CILVAL,CISET,CIGVAL,CSETG,IBLOK1,IBLOCK,CLLOC,CGLOC,CASSQ,CGASSQ
879 CILNT,CILNQ,CILEGQ,CEMPTY,CIEQUA,CIREST,CINTH,CIAT,CSETLO,CIN
880 CIPUT,CIGET,CIGETL,CIMON,CISTRU,CIMEMQ,CIMEMB,CITOP,CIBACK,TYPSEG
881 C1CONS,CICONS,CIUVEC,CIVEC,IIFORM,IILIST,CISTNG,HITOP,INCR1,TYPG,VALG,TESTR
882 OTBSAV,CITYPE,CFRAME,CARGS,CFUNCT,CUTYPE,CPTYPE,CTYPEP,CTYPEQ,CCHUTY
883 CIREMA,RTFALS,CIPUTP,CIGETP,CIGTPR,MPOPJ,TAB,$TAB,ICONS,CSTO,DSTO,NTPALO
884 CPLUS,CTIMES,CTIME,CDIVID,CMINUS,CLQ,CLEQ,CGQ,CGEQ,CLOG,CSIN,CCOS,CATAN,CSQRT
885 CFIX,CFLOAT,CEXP,CRAND,CINEQU,SPECBND,PGGIVE,PGFIND,MTYO,CMIN,CMAX,RCL,R1C,W1C
886 CALLTY,CTYPEC,CTYPEW,NOTTY,CHKAB,CTMPLT,IUNWIN,UNWIN2,NOSHUF,ROOT,ERROBL,INTOBL
887 CINSER,CIRMV,CLOOKU,CATOM,CIPNAM,ISTRCM,CITERP,CIPRIN,CIPRN1,CIPRNC,CGFALS
888 CPATM,CP1ATM,CPCATM,CPSTR,CP1STR,CPCSTR,CPCH,CREADC,CNXTCH,CREDC1,CNXTC1
889 CGBOUN,IIGLOC,MAKTU2,CIFLTZ,CIUPRS,SAT,TFA,WTYP,NAPT,PTYPE,APLQ,PURBOT,GCSBOT
890 GLOTOP,TYPVEC,1STEPR,LSTRES,NODES,MAINPR,CVTYPE,CSPNAM,CSBSTR,INTBCK,CICRLF
891 CERR1,CERR2,CERR3,CANDP,CORP,CSQUTA,CIMAGE,ATOSQ,CFILLE,CPRTYC,FMPOPJ
892 TD.PUT,TD.GET,TD.LNT,CBYTES,MARK,MARK2G,TD.AGC,DSTORE,RCLV,NUMSAT,RMCALL,NPRFLG
893 NSPOPJ,NFPOPJ,PURCLN,FRETOP,PURVEC,SWAPGC,VECBOT]
898 IRP A,,[NTTYPE,CLRSTR]
906 ; ROUTINE TO SORT AND PURIFY SQUOZE TABLE
908 SQSETU: MOVE A,[SQUTBL-SQULOC+2,,SQUTBL]
923 STSQU: MOVE B,[440700,,SQBLK]
928 FATAL CANT MAKE FIXUP FILE
930 MOVE B,[440000,,100000]
932 FATAL CANT OPEN FIXUP FILE
933 MOVE B,[444400,,SQUTBL]
934 MOVNI C,SQULOC-SQUTBL
939 MOVE A,[SQUTBL-SQULOC,,SQUTBL]
944 STSQU: MOVE C,MUDSTR+2 ; CALCULATE SECOND FILE NAME FOR SQUOZE TABLE
946 HRRI C,(SIXBIT/TAB/) ; TABxxx IS SECOND NAME OF FILE
948 MOVEM C,SQBLK+2 ; STORE IN APPROPRIATE BLOCKS
950 .SUSET [.SSNAM,,SQDIR]
951 .OPEN GCHN,SQWBLK ; OPEN FILE
952 FATAL CAN'T CREATE SQUOZE FILE
953 MOVE A,[SQUTBL-SQULOC,,SQUTBL]
956 .CLOSE GCHN ; CLOSE THE CHANNEL
974 OBTBL: INITIAL+1-TVSTRT+TVBASE
975 MUDOBL+1-TVSTRT+TVBASE
976 INTOBL+1-TVSTRT+TVBASE
977 ERROBL+1-TVSTRT+TVBASE
979 OBNAM: MQUOTE INITIAL
993 SQWBLK: SIXBIT / 'DSK/
998 MNGNAM: MOVE A,[440700,,MUDSTR+2] ; FOR NAME HACKING
999 ILDB 0,A ; SEE IF IT IS A VERSION
1004 CAIN 0,"X ; LOOK FOR X'S
1009 MOVE A,[440700,,MUDSTR+2]
1020 .GLOBAL VCREATE,MUDSTR
1022 DEBUG: MOVE E,[440600,,[SIXBIT /EXPERIMENTAL/]]
1026 VCREATE: .SUSET [.SSNAM,,[SIXBIT /MUDSYS/]]
1029 MOVEI 0,0 ; SET 0 TO DO THE .RCHST
1036 STUFF: MOVE D,[440700,,MUDSTR+2]
1037 STUFF1: ILDB A,E ; GET A CHAR
1038 CAIN A,0 ;SUPRESS SPACES
1039 MOVEI A,137 ;RUBOUT'S DON'T TYPE OUT
1040 ADDI A,40 ; TO ASCII
1048 OP%: 1,,(SIXBIT /DSK/)
1060 .GLOBAL GCDIR,ILDBLK,TILDBL,GCLDBK,LENGC,SLENGC,SGCLBK,RLENGC
1061 .GLOBAL SECBLK,SECLEN,RSLENG,DECBLK
1063 ; ROUTINE TO DUMP OUT THE GARBAGE-COLLECTOR
1067 .SUSET [.SSNAM,,GCDIR] ; SET SNAME
1068 MOVE C,MUDSTR+2 ; CREATE SECOND NAMES
1070 HRRI C,(SIXBIT /MUD/)
1071 MOVS A,C ; MUDxx IS SECOND NAME
1075 MOVEM A,GCDBLK+2 ; SMASH IN SECOND NAMES
1078 .OPEN 0,GCDBLK ; OPEN GC FILE
1079 FATAL CANT CREATE AGC FILE
1080 MOVNI A,LENGC ; CALCULATE IOT POINTER
1084 .IOT 0,A ; SEND IT OUT
1085 .CLOSE 0, ; CLOSE THE CHANNEL
1086 .OPEN 0,SGCDBK ; OPEN GC FILE
1087 FATAL CANT CREATE AGC FILE
1088 MOVNI A,SLENGC ; CALCULATE IOT POINTER
1091 HRRI A,REALGC+RLENGC
1092 .IOT 0,A ; SEND IT OUT
1093 .CLOSE 0, ; CLOSE THE CHANNEL
1096 ; ROUTINE TO DUMP THE INTERPRETER
1098 .SUSET [.SSNAM,,INTDIR]
1099 .OPEN 0,ILDBLK ; OPEN FILE TO INTERPRETER BLOCK
1100 FATAL CANT FIXUP INTERPRETER
1101 HLRE B,TP ; MAKE SURE BIG ENOUGJ
1102 MOVNS B ; SEE IF WE WIN
1103 CAIGE B,400 ; SKIP IF WINNING
1104 FATAL NO ROOM FOR PAGE MAP
1108 .IOT 0,A ; GET IN PAGE MAP
1111 FATAL CANT FIXUP INTERPRETER
1112 MOVEI A,1 ; INITIALIZE FILE PAGE COUNT
1113 MOVEI B,0 ; CORE PAGE COUNT
1116 JUMPE 0,NOPAG ; IF 0 FORGET IT
1117 ADDI A,1 ; AOS FILE MAP
1118 NOPAG: ADDI B,1 ; AOS PAGE MAP
1119 CAIE B,PAGEGC ; SKIP IF DONE
1121 ASH A,10. ; TO WORDS
1124 ASH B,10. ; TO WORDS
1131 GCDBLK: SIXBIT / 'DSK/
1135 SGCDBK: SIXBIT / 'DSK/
1139 INTDBK: 100007,,(SIXBIT /DSK/)
1145 MOVE B,[440700,,GCLDBK]
1146 PUSHJ P,MNGNAM ; VERSION TO NAME IF NECESSARY
1150 FATAL CANT WRITE OUT GC
1152 MOVE B,[440000,,100000]
1154 FATAL CANT OPEN GC FILE
1157 MOVE B,[444400,,REALGC]
1173 MOVE B,[440700,,SGCLBK]
1174 PUSHJ P,MNGNAM ; VERSION TO NAME IF NECESSARY
1178 FATAL CANT WRITE OUT GC
1180 MOVE B,[440000,,100000]
1182 FATAL CANT OPEN GC FILE
1185 MOVE B,[444400,,REALGC+RLENGC]
1191 MOVEI D,SLENGC+SLENGC
1193 MOVEI B,REALGC+RLENGC
1201 MOVE B,[440700,,SECBLK]
1202 PUSHJ P,MNGNAM ; VERSION TO NAME IF NECESSARY
1206 FATAL CANT WRITE OUT GC
1208 MOVE B,[440000,,100000]
1210 FATAL CANT OPEN GC FILE
1213 MOVE B,[444400,,REALGC+RLENGC+RSLENG]
1220 ; NOW MUNG THE THING TO BE DIFFERENT TO USE UUOS FOR DEBUGGING VERSION
1222 .GLOBAL %FXUPS,%FXEND
1228 LDB 0,[331100,,(A)] ; GET INS
1233 CAIN B,<<(XBLT)>_<-9.>>
1240 MOVE B,[440700,,DECBLK]
1241 PUSHJ P,MNGNAM ; VERSION TO NAME IF NECESSARY
1245 FATAL CANT WRITE OUT GC
1247 MOVE B,[440000,,100000]
1249 FATAL CANT OPEN GC FILE
1252 MOVE B,[444400,,REALGC+RLENGC+RSLENG]
1258 MOVEI D,SECLEN+SECLEN
1260 MOVEI B,REALGC+RLENGC
1268 MOVE B,[440700,,ILDBLK]
1270 MOVE B,[440700,,TILDBL]
1276 TLNN B,400 ; SKIP IF NOT PRIVATE
1285 FATAL CANT CLOSE STUFF
1289 FATAL GARBAGE COLLECTOR IS MISSING
1290 HRRZS E,A ; SAVE JFN
1291 MOVE B,[440000,,300000]
1293 FATAL CANT OPEN GC FILE
1294 MOVEI A,(E) ; FIND OUT LENGTH OF MAP
1295 BIN ; GET LENGTH WORD
1297 CAIE 0,1776 ; TOPS20 SSAVE FILE FORMAT
1298 CAIN 0,1000 ; TENEX SSAVE FILE FORMAT
1300 FATAL NOT AN SSAVE FILE
1301 MOVEI A,(B) ; ISOLATE SIZE OF MAP
1302 HLRE B,TP ; MUST BE SPACE FOR CRUFT
1305 FATAL NO ROOM FOR PAGE MAP (GULP)
1307 MOVEI A,(E) ; READY TO READ IN MAP
1308 MOVEI B,1(TP) ; ONTO TP STACK
1312 MOVEI A,1(TP) ; POINT TO MAP
1314 JRST RPA1 ; GO TO THE TOPS20 CODE
1315 LDB 0,[221100,,(A)] ; GET FORK PAGE
1316 CAIE 0,PAGEGC+PAGEGC ; GOT IT?
1320 RPA1: ADDI A,1 ; POINT TO PROCESS PAGE NUMBER
1321 LDB 0,[331100,,(A)] ; REPEAT COUNT IN 0
1322 LDB B,[3300,,(A)] ; FIRST PAGE NUMBER IN B
1323 ADD 0,B ; LARGEST PAGE NUMBER
1324 CAIL 0,PAGEGC+PAGEGC
1325 CAILE B,PAGEGC+PAGEGC
1326 AOJA A,RPA1 ; NEXT PAIR OF WORDS PLEASE
1327 SUBI A,1 ; POINT TO FILE PAGE NUMBER
1328 SUBI B,PAGEGC+PAGEGC
1330 ADDM B,(A) ; SET UP THE PAGE
1332 RPA2: HRRZ B,(A) ; GET PAGE
1333 MOVEI A,(E) ; GET JFN
1336 FATAL ACCESS OF FILE FAILED
1338 MOVE B,[444400,,AGCLD]
1347 ; CODE TO DISTINGUISH BETWEEN TOPS20 AND TENEX AT SETUP TIME
1349 TWENTY: HRROI A,C ; RESULTS KEPT HERE
1351 MOVEI C,0 ; CLEAN C UP
1354 MOVEI A,1 ; TENEX HAS OPSYS = 1
1355 CAME C,[ASCII/NUL/] ; TOPS20 GIVES "NUL"
1356 MOVEM A,OPSYS ; TENEX GIVES "NIL"
1358 %TBL: IRP A,,[HRRM,HRLM,MOVEM,SETZM,HLRZ,XBLT]
1362 GCLDBK: ASCIZ /MDLXXX.AGC/
1363 SGCLBK: ASCIZ /MDLXXX.SGC/
1364 SECBLK: ASCIZ /MDLXXX.SEC/
1365 ILDBLK: ASCIZ /MDLXXX.EXE/
1366 TILDBL: ASCIZ /MDLXXX.SAV/
1367 DECBLK: ASCIZ /MDLXXX.DEC/