From 39c5769144e7f2a58076bdb973d2c80fa603345c Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Sun, 18 Feb 2018 08:14:53 +0100 Subject: [PATCH] ITS Muddle. --- MUDDLE/_test.plannr | 14 + MUDDLE/actor.45 | 524 ++++++++ MUDDLE/agc.168 | 1834 ++++++++++++++++++++++++++ MUDDLE/arith.58 | 626 +++++++++ MUDDLE/atomhk.27 | Bin 0 -> 9080 bytes MUDDLE/book.3 | 481 +++++++ MUDDLE/book.4 | 532 ++++++++ MUDDLE/c.ubd026 | 390 ++++++ MUDDLE/comp.envr | Bin 0 -> 156852 bytes MUDDLE/create.14 | 109 ++ MUDDLE/editor.8 | 140 ++ MUDDLE/eval.234 | 2054 +++++++++++++++++++++++++++++ MUDDLE/filtrn.5 | 121 ++ MUDDLE/flodyn.1 | 89 ++ MUDDLE/fopen.63 | 545 ++++++++ MUDDLE/graphs.ura001 | 227 ++++ MUDDLE/initm.42 | 423 ++++++ MUDDLE/mapper.9 | 80 ++ MUDDLE/match.18 | 216 +++ MUDDLE/medcom.2 | 41 + MUDDLE/meddle.3 | 370 ++++++ MUDDLE/medpp.1 | 81 ++ MUDDLE/microm.1 | 165 +++ MUDDLE/mproc.save | 208 +++ MUDDLE/muddle.196 | 916 +++++++++++++ MUDDLE/muddle.init | 40 + MUDDLE/muddle.old | 899 +++++++++++++ MUDDLE/multi.test | 12 + MUDDLE/nactor.1 | 524 ++++++++ MUDDLE/nagc.17 | 1835 ++++++++++++++++++++++++++ MUDDLE/neval.222 | 2966 ++++++++++++++++++++++++++++++++++++++++++ MUDDLE/neval.nostac | 2875 ++++++++++++++++++++++++++++++++++++++++ MUDDLE/ninter.4 | 668 ++++++++++ MUDDLE/nmain.14 | 791 +++++++++++ MUDDLE/nmatch.1 | 216 +++ MUDDLE/nprint.8 | 799 ++++++++++++ MUDDLE/nptest.4 | 35 + MUDDLE/nread.14 | Bin 0 -> 25094 bytes MUDDLE/nuprm.8 | 532 ++++++++ MUDDLE/nutil.1 | 230 ++++ MUDDLE/nuuoh.12 | 158 +++ MUDDLE/omatch.1 | 456 +++++++ MUDDLE/pfunct.12 | 26 + MUDDLE/pprint.1 | 401 ++++++ MUDDLE/ptest.13 | 49 + MUDDLE/ptrace.7 | 114 ++ MUDDLE/putget.21 | 259 ++++ MUDDLE/readch.10 | 240 ++++ MUDDLE/reader.117 | Bin 0 -> 23533 bytes MUDDLE/revtes.4 | 10 + MUDDLE/sptest.6 | 1 + MUDDLE/stctst.2 | 43 + MUDDLE/tentab.1 | 193 +++ MUDDLE/tester.putget | 93 ++ MUDDLE/testsp.4 | 18 + MUDDLE/ts.midas | Bin 0 -> 53774 bytes MUDDLE/ts.muddle | Bin 0 -> 145895 bytes MUDDLE/ts.nplnnr | Bin 0 -> 199398 bytes MUDDLE/ts.omuddl | Bin 0 -> 91083 bytes MUDDLE/ts.plannr | Bin 0 -> 193985 bytes MUDDLE/ts.stink | Bin 0 -> 9586 bytes MUDDLE/util.21 | 230 ++++ MUDDLE/vers.2 | 17 + MUDDLE/}msgs}.muddle | 0 README.md | 5 +- 65 files changed, 24920 insertions(+), 1 deletion(-) create mode 100644 MUDDLE/_test.plannr create mode 100644 MUDDLE/actor.45 create mode 100644 MUDDLE/agc.168 create mode 100644 MUDDLE/arith.58 create mode 100644 MUDDLE/atomhk.27 create mode 100644 MUDDLE/book.3 create mode 100644 MUDDLE/book.4 create mode 100644 MUDDLE/c.ubd026 create mode 100644 MUDDLE/comp.envr create mode 100644 MUDDLE/create.14 create mode 100644 MUDDLE/editor.8 create mode 100644 MUDDLE/eval.234 create mode 100644 MUDDLE/filtrn.5 create mode 100644 MUDDLE/flodyn.1 create mode 100644 MUDDLE/fopen.63 create mode 100644 MUDDLE/graphs.ura001 create mode 100644 MUDDLE/initm.42 create mode 100644 MUDDLE/mapper.9 create mode 100644 MUDDLE/match.18 create mode 100644 MUDDLE/medcom.2 create mode 100644 MUDDLE/meddle.3 create mode 100644 MUDDLE/medpp.1 create mode 100644 MUDDLE/microm.1 create mode 100644 MUDDLE/mproc.save create mode 100644 MUDDLE/muddle.196 create mode 100644 MUDDLE/muddle.init create mode 100644 MUDDLE/muddle.old create mode 100644 MUDDLE/multi.test create mode 100644 MUDDLE/nactor.1 create mode 100644 MUDDLE/nagc.17 create mode 100644 MUDDLE/neval.222 create mode 100644 MUDDLE/neval.nostac create mode 100644 MUDDLE/ninter.4 create mode 100644 MUDDLE/nmain.14 create mode 100644 MUDDLE/nmatch.1 create mode 100644 MUDDLE/nprint.8 create mode 100644 MUDDLE/nptest.4 create mode 100644 MUDDLE/nread.14 create mode 100644 MUDDLE/nuprm.8 create mode 100644 MUDDLE/nutil.1 create mode 100644 MUDDLE/nuuoh.12 create mode 100644 MUDDLE/omatch.1 create mode 100644 MUDDLE/pfunct.12 create mode 100644 MUDDLE/pprint.1 create mode 100644 MUDDLE/ptest.13 create mode 100644 MUDDLE/ptrace.7 create mode 100644 MUDDLE/putget.21 create mode 100644 MUDDLE/readch.10 create mode 100644 MUDDLE/reader.117 create mode 100644 MUDDLE/revtes.4 create mode 100644 MUDDLE/sptest.6 create mode 100644 MUDDLE/stctst.2 create mode 100644 MUDDLE/tentab.1 create mode 100644 MUDDLE/tester.putget create mode 100644 MUDDLE/testsp.4 create mode 100644 MUDDLE/ts.midas create mode 100644 MUDDLE/ts.muddle create mode 100644 MUDDLE/ts.nplnnr create mode 100644 MUDDLE/ts.omuddl create mode 100644 MUDDLE/ts.plannr create mode 100644 MUDDLE/ts.stink create mode 100644 MUDDLE/util.21 create mode 100644 MUDDLE/vers.2 create mode 100644 MUDDLE/}msgs}.muddle diff --git a/MUDDLE/_test.plannr b/MUDDLE/_test.plannr new file mode 100644 index 0000000..0c9b385 --- /dev/null +++ b/MUDDLE/_test.plannr @@ -0,0 +1,14 @@ +STINK +0MNLOAD >$ +$9B/JUMPA SETUP +$Y PLANNR LOSS +$G + $9B/JUMPA START +$Y PLANNR WIN +$G + +"> + + +"> +  \ No newline at end of file diff --git a/MUDDLE/actor.45 b/MUDDLE/actor.45 new file mode 100644 index 0000000..4a9b75c --- /dev/null +++ b/MUDDLE/actor.45 @@ -0,0 +1,524 @@ + >> + + >> + + >> + '(ACTOR ACTOR-FUNCTION)> + .EXP> >> + + '(FORM SEGMENT)> + > + >> >> + + + 0> >> + + +) + (OBL T) (ENV <>) (OBJENV <>) (PURE? T) + (UV1 ) + "AUX" (UV2 ())) + > + FACTOR>> + <.INVOKER >) + (.PURE? + >) >) + (.OBL + FORM> + >> + FACTOR>> + <.INVOKER T <> .OBJENV .ENV .UV2>>) >) + (T >) >) + (T .OBJENV >>) > + > + .BOUND >> >>>> + > + > + .BOUND) + (T .OBJECT .BOUND>) >) + (.OBL + .BOUND>) + (T .BOUND <>>) >) + (<==? ACTOR-FUNCTION> + + + '.OBJECT '.BOUND '.OBL '.PURE? ' + ' !>>) + (<==? ACTOR> + + + ((BODY > 2) (1) >>)) + + (.OBJECT .BOUND .OBL .PURE? .OBJENV !.BODY)> >) + (T ) > >> ) RS (VALRS ()) (UV ()) PURESOFAR NEWVAL + NEWBOUND (VARLOC ) VARFORM RS2) + + >) + (T T .BOUNDARY>) > + <.GA .BOUNDARY>) + (.PURE? + <.GA .OBJECT .BOUNDARY>>) + (T <.GA .BOUND <>>>) >) > + LIST>> + + > + + <.GA .BOUNDARY>) > + >> + <==? .VARLOC + 2 .VAR> .OBJENV>>> + <.GA .BOUNDARY>) + (> + ) + (T + + <.CHECK <>>> + > > + ) + (<==? <1 .RS1> PATTERN> + .OBJECT <3 .RS1> .BOUNDARY .OBLIGATORY>) + (T + .OBJECT <3 .RS1> .OBJENV + > .BOUNDARY + .OBLIGATORY>) >> + + + + <.GA .BOUNDARY>) + (> + LIST> + .RS>> + ) >) + (T ) >>) > + >> + +
.OBJECT .BOUND .OBL? + .PURE? .ENV .OBJENV> >> + + + + +>> >> + + + + + >> + + + + +) + "AUX" UV) + + <==? .N > + >) + (> + .UV> + >> + <==? .N > >) + ( ) + (T > .OBJECT + <> .OBJENV .FORM1 .BOUND>) > + .BOUND) + (.PURE? + > ) + (T ) >) + (T ) >) + (T + .OBJENV>> + > >) > + .BOUND) > >> + + + <.ACTITER ) + (T ) >>) > + .OBJECT .ENV .BOUND .OBL?>) + (T + .OBJECT + .ENV + .OBJENV + > + .BOUND + .OBL?>) >> + + > > >> + + + + + +)) + .BOUND .OBL?>) + (T .OBJENV .BOUND .OBL?>) > >> + + + + +>>) + (T .OBJENV>) >> > + ) + (T .OBJENV>) > + .NAY-SAYER>> + () + <.NAY-SAYER .BOUND> >>> + + ) NEWBOUND) + ) + (.PURE? .OBJECT <> .BOUND .OBL?>) + (T .OBJECT <> .OBJENV + > .BOUND .OBL?>) >> + () .WA>> + + (.OBJECT .NEWBOUND T .PURE? .ENV .OBJENV !)> + .NEWBOUND >> + + >>) + (> + .PURE?> + >) + + (> + .VARFORM .ENV> + ) + (T ) >) + (.PURE? + >>>) + ( .OBJENV >> + .PURE?> + >) + (T ) > + .BOUND >> + + +> + ) + (T ) > >> + + + LIST>) + UNASSIGNED>> >> <==? .L1 .TERM1>> + ) + (<==? .L2 .TERM2> )> + <1 .L2>> > + > > + >> + + + +) + (PURELOC <>) + "AUX" V P (LP ) (CONSTRUCT >) + (BOUND )) + + > + + + () + ) + (<==? > SEGMENT> + .LP>> + + > + ) > + .BOUNDLOC>> + >>) + (.EV? P>> + >>> + >> + >) + (T >>> + >>> + > + >>>>) >>> >> ) (BOUND ) + "AUX" V P (LP )) + + ) + (<==? > SEGMENT> + .LP>> + + > + ) > + >>>) + (T >>) > >>> ) (ENV <>) + (LUV )) + + FORM> + ) + ( + + .EXP) + (T ) >>> + + +) + "AUX" (RESULT ()) (P ()) P1 (LP1 ) EXP1) + + <.INSTLP >>>) + (<==? >> SEGMENT> + ,CONSL> + !.RESULT)>) + (T !.RESULT)>) > + >> + > + >> + + +>> + > + .F) + ( >>>> + + ) + (> + > + .F) + (<==? .A1 ,ALTER> + >> ?()> + > + ) + (<==? .A1 ,GIVEN> + >>> + + ) + (T > + .F) >) + (T > + .F) >>> ) (ENV <>) + "AUX" UA ACTR VAR) + + FORM> + >> .UA) + ( 2> + >>> + + >>>> + > + (.VAR)) >) + (<==? .ACTR ,ALTER> + >> ?()> + (.VAR)) >) >) + (<==? .EXP .BOUND> ()) + (T > .BOUND>>) >>> + + +) + "AUX" VAR) + + + '(FORM SEGMENT)> + <==? <1 .F> LVAL> + >> + > >> + (.VAR)) + (T ) >) > >> + + + FORM> + <==? 2> + <==? <1 .OBJECT> GIVEN> + >>> + .RES> >> + + + FORM> + + SEGMENT> <.UNC T>>) + .OBJECT> + <>>> >> .OBJECT) + (T + >>) > >> + + + .RES) + (T !.RES)> + > + ) >>> + + +)) + .PAT) + ( .BEG) + (T > + !) + >>> + > + .PAT) >>> + + + .RESULT) + (T !.RESULT)> + > + ) >>> + + + T) + ( <>) + (T > + ) >>> )) + >> + >>) + (<==? <1 .RS1> PATTERN> + .OBJECT <3 .RS1> .BOUNDARY>) + () > + > > + >> + > + VALUE> + > + )) + >> + >> UNASSIGNED> + >>>) > + > > + <3 .VALRS1> <4 .VALRS1> <5 .VALRS1> + <6 .VALRS1> <7 .VALRS1>> + > > >> + + + >> + > + > + <==? <1 .R1> PATTERN> + <==? .ENV <3 .R1>> + <=UPTO? <2 .R1> .EXP .BOUND>> + <.CHECK T>) > + > > >> + + + > + <=? .EXP1 .EXP2>) + ( > <>) + ( <==? .EXP2 .BOUND>) + (<==? .EXP2 .BOUND> <>) + (<=? <1 .EXP1> <1 .EXP2>> + > > + ) >>) >>> ) (BOUND2 ) + "AUX" (LOCS + >)) + <.LINKER .LOCS>> + + > LIST>) UNASSIGNED>> + > > >> + + + ()) + (T + > !.LOCS)> + > + <.GEN .LOCS>> >) >>>  \ No newline at end of file diff --git a/MUDDLE/agc.168 b/MUDDLE/agc.168 new file mode 100644 index 0000000..0182add --- /dev/null +++ b/MUDDLE/agc.168 @@ -0,0 +1,1834 @@ +TITLE AGC MUDDLE GARBAGE COLLECTOR +;SYSTEM WIDE DEFINITIONS GO HERE +.GLOBAL PDLBUF,VECTOP,VECBOT,PDLEX,PDLEXP,GCFLG,GCPDL,GETNUM,PARNEW,WRONGT +.GLOBAL PGROW,TPGROW,TIMOUT,MAINPR,TMA,TFA,PPGROW + +; GLOBALS ASSOCIATE WITH THE ASSOCIATION VECTOR + +.GLOBAL ASOVEC,ASOLNT,ITEM,INDIC,VAL,NWORDT,NODPNT,PNTRS + + +PDLBUF=100 +TPMAX==5000 ;PDLS LARGER THAN THIS WILL BE SHRUNK +PMAX==1000 ;MAXIMUM PSTACK SIZE +TPMIN==100 ;MINIMUM PDL SIZES +PMIN==100 +TPGOOD==2000 ; A GOOD STACK SIZE +PGOOD==1000 + +RELOCATABLE +.INSRT MUDDLE > + +TYPNT=AB ;SPECIAL AC USAGE DURING GC +F=TP ;ALSO SPECIAL DURING GC +LPVP=SP ;SPECIAL FOR GC, HOLDS POINTER TO PROCESS CHAIN + +;FUNCTION TO CONSTRUCT A LIST +MFUNCTION CONS,SUBR + ENTRY 2 + HLRZ A,2(AB) ;GET TYPE OF 2ND ARG + CAIE A,TLIST ;LIST? + JRST BADTYP ;NO , COMPLAIN + HLRZ A,(AB) ;GET TYPE OF FIRST + PUSHJ P,NWORDT ;GET NO. OF WORDS NEEDED FOR DATUM + SOJN A,CDEFER ;GREATER THAN 1, MUST MAKE DEFERRED POINTER + MOVEI A,2 ;SET UP CALL TO CELL + PUSHJ P,CELL + HLLZ A,(AB) ;TYPE OF FIRST ARG + MOVE C,1(AB) ;GET DATUM +CFINIS: PUSHJ P,CLOBIT ;STORE + JRST FINIS + +;HERE TO STORE IN PAIR + +CLOBIT: HRR A,3(AB) ;GET CDR +CLOBT1: MOVEM A,(B) ;STORE FIRST + MOVEM C,1(B) ;AND SECOND + MOVSI A,TLIST ;GET FINAL TYPE + POPJ P, + +;HERE FOR A DEFERRED CONS + +CDEFER: MOVEI A,4 ;NEED 4 CELLS + PUSHJ P,CELL + MOVE A,(AB) ;GET COMPLETE 1ST WORD + MOVE C,1(AB) ;AND SECOND + PUSHJ P,CLOBT1 ;STORE + MOVE C,B ;POINT TO DEFERRED PAIR WITH C + ADDI B,2 ;POINT TO OTHER PAIR + MOVSI A,TDEFER ;GET TYPE + JRST CFINIS + + +;THIS ROUTINE ALLOCATES A CELL +CELL: MOVE B,PARTOP ;GET TOP OF PAIRS + ADD B,A ;FIND PROPOSED NEW TOP + CAMLE B,VECBOT ;CROSSING INTO VECTORS? + JRST FULL ;YES, GO COLLECT GARBAGE + EXCH B,PARTOP ;NO, SET NEW TOP AND RETURN POINTER + POPJ P, + +FULL: MOVEM A,GETNUM ;STORE WORDS NEEDED + SETZM PARNEW ;NO MOVEMENT NEEDED + PUSHJ P,AGC ;COLLECT GARBAGE + JRST CELL ;AND TRY AGAIN + + +;SUBROUTINES TO RETURN WORDS NEEDED BASED ON TYPE OR SAT + +NWORDT: PUSHJ P,SAT ;GET STORAGE ALLOC TYPE +NWORDS: SKIPL MKTBS(A) ;-ENTRY IN TABLE MEANS 2 NEEDED + SKIPA A,[1] ;NEED ONLY 1 + MOVEI A,2 ;NEED 2 + POPJ P, + + +;FUNCTION TO BUILD A LIST OF MANY ELEMENTS + +MFUNCTION LIST,SUBR + ENTRY + + HLRE A,AB ;GET -NUM OF ARGS + MOVNS A ;MAKE IT + + JUMPE A,LISTN ;JUMP IF 0 + PUSHJ P,CELL ;GET NUMBER OF CELLS + PUSH TP,$TLIST ;SAVE IT + PUSH TP,B + LSH A,-1 ;NUMBER OF REAL LIST ELEMENTS + +CHAINL: ADDI B,2 ;LOOP TO CHAIN ELEMENTS + HRRZM B,-2(B) ;CHAIN LAST ONE TO NEXT ONE + SOJG A,.-2 ;LOOP TIL ALL DONE + CLEARM B,-2(B) ;SET THE LAST CDR TO NIL + +; NOW LOBEER THE DATA IN TO THE LIST + + MOVE B,(TP) ;RESTORE LIS POINTER +LISTLP: HLRZ A,(AB) ;GET TYPE + PUSHJ P,NWORDT ;GET NUMBER OF WORDS + SOJN A,LDEFER ;NEED TO DEFER POINTER + HLLZ A,(AB) ;NOW CLOBBER ELEMENTS + HLLM A,(B) + MOVE A,1(AB) ;AND VALUE.. + MOVEM A,1(B) +LISTL2: ADDI B,2 ;STEP B + ADD AB,[2,,2] ;STEP ARGS + JUMPL AB,LISTLP + + POP TP,B + POP TP,A + JRST FINIS + +; MAKE A DEFERRED POINTER + +LDEFER: PUSH TP,$TLIST ;SAVE CURRENT POINTER + PUSH TP,B + MOVEI A,2 ; SET UP TO GET CELLS + PUSHJ P,CELL + MOVE A,(AB) ;GET FULL DATA + MOVE C,1(AB) + PUSHJ P,CLOBT1 + MOVE C,(TP) ;RESTORE LIST POINTER + MOVEM B,1(C) ;AND MAKE THIS BE THE VALUE + MOVSI A,TDEFER + HLLM A,(C) ;AND STORE IT + MOVE B,C + SUB TP,[2,,2] + JRST LISTL2 + +LISTN: MOVEI B,0 + MOVSI A,TLIST + JRST FINIS + BADTYP: PUSH TP,$TATOM ;ARGUMENT OF TYPE ATOM + PUSH TP,MQUOTE 2ND-ARGUMENT-NOT-A-LIST + JRST CALER1 ;OFF TO ERROR HANDLER + + + ;FUNCTION WHICH CONSES ITS ARGUMENT WITH NIL +MFUNCTION NCONS,SUBR + ENTRY 1 + PUSH TP,(AB) ;SET UP CONS CALL + PUSH TP,1(AB) + PUSH TP,$TLIST + PUSH TP,[0] + MCALL 2,CONS + JRST FINIS + + ;FUNCTION TO GENERATE A VECTOR IN VECTOR SPACE +;CALLED WITH ONE FIXNUM ARGUMENT, WHICH IS THE NUMBER OF ELEMENTS DESIRED. + +MFUNCTION VECTOR,SUBR + ENTRY + MOVEI C,1 ;THIS IS A GENERAL VECTOR +VECTO3: JUMPGE AB,TFA ;TOO FEW ARGS + CAMGE AB,[-4,,0] ;ASSURE NOT TOO MANY + JRST TMA + HLRZ A,(AB) ;GET TYPE OF ARGUMENT + CAIE A,TFIX ;IS IT A FIXED NUMBER? + JRST BDTYPV ;NO, GO COMPLAIN + SKIPGE A,1(AB) ;GET LENGTH + JRST BADNUM ;LOSING NUMBER + ASH A,(C) ;TIMES TWO FOR NUMBER OF WORDS IF GENERAL + ADDI A,2 ;PLUS TWO FOR DOPEWDS +VECTO2: MOVE B,VECBOT ;GET CURRENT BOTTOM OF VECTORS + SUB B,A ;AND SUBTRACT THE WORDS IN THIS VECTOR + CAMGE B,PARTOP ;HAVE WE BUMPED INTO PAIR SPACE? + JRST VECTO1 ;YES, GO GARBAGE COLLECT + EXCH B,VECBOT ;UPDATE VECBOT, GET OLD POINTER + HRLZM A,-1(B) ;PUT LENGTH IN DOPE WORD FIELD. + MOVSI D,400000 ;PREPARE TO SET NONUNIFORM BIT + JUMPE C,.+2 ;DONT SET IF UNIFORM + MOVEM D,-2(B) ;CLOBBER IT IN + HRRO B,VECBOT ;AND GET TOP OF VECTOR IN RH, -1 IN LH. + TLC B,-3(A) ;SET LH OF ANSWER TO NEGATIVE COUNT + MOVSI A,TVEC ;AND GET TYPE VECTOR TO MARK B AS AN AOBJN POINTER TO A VECTOR + CAML AB,[-2,,0] ;SKIP IF 2 ARGS SUPPLIED + JRST VFINIS ;ONLY ONE, LEAVE + JUMPE C,UINIT ;JUMP IF NOT GENERAL VECTOR + + JUMPGE B,FINIS ;ZERO LENGTH, DONT INIT + PUSH TP,A + PUSH TP,B + PUSH TP,A + PUSH TP,B ;SAVE THE VECTOR + +INLP: PUSH TP,2(AB) + PUSH TP,3(AB) ;PUSH FORM TO BE EVALLED + MCALL 1,EVAL + MOVE C,(TP) ;RESTORE VECTOR + MOVEM A,(C) + MOVEM B,1(C) ;CLOBBER + ADD C,[2,,2] + MOVEM C,(TP) + JUMPL C,INLP ;JUMP TO DO NEXT + +GETVEC: MOVE A,-3(TP) + MOVE B,-2(TP) + SUB TP,[4,,4] ;GC TP + JRST FINIS + +UINIT: PUSH TP,$TUVEC + PUSH TP,B + PUSH TP,$TUVEC + PUSH TP,B + PUSH P,[-1] ;WILL HOLD TYPE + +UINLP: PUSH TP,2(AB) + PUSH TP,3(AB) + MCALL 1,EVAL + HLRZS A ;TYPE TO RH + SKIPGE (P) ;SKIP IF 1ST SEEN + JRST SET1ST + CAME A,(P) + JRST WRNGUT +UINLP1: MOVE C,(TP) + MOVEM B,(C) + AOBJP C,.+3 + MOVEM C,(TP) + JRST UINLP ;AND CONTINUE + + POP P,A ;RESTORE TYPE + HRLZM A,(C) ;CLOBBER UNIFORM TYPE + JRST GETVEC + +SET1ST: MOVEM A,(P) + PUSHJ P,NWORDT + SOJN A,CANTUN + JRST UINLP1 + +VFINIS: JUMPN C,FINIS + MOVSI A,TUVEC + JRST FINIS + + +;FUNCTION TO GENERATE A UNIFOM VECTOR + +MFUNCTION UVECTOR,SUBR + + MOVEI C,0 ;SET FOR A UNIFORM HACK + JRST VECTO3 + +BADNUM: PUSH TP,$TATOM ;COMPLAIN + PUSH TP,MQUOTE NEGATIVE-ARGUMENT + JRST CALER1 + BDTYPV: PUSH TP,$TATOM + PUSH TP,MQUOTE NON-INTEGER-ARGUMENT + JRST CALER1 + +VECTO1: SETZM PARNEW ;CLEAR RELOCATION OF PAIR SPACE + MOVEM A,GETNUM ;SAVE NUMBER OF WORDS TO GET + PUSHJ P,AGC ;GARBAGE COLLECT + JRST VECTO3 ;AND TRY AGAIN + +MFUNCTION EVECTOR,SUBR + ENTRY + HLRE A,AB + MOVNS A + PUSH P,A ;SAVE NUMBER OF WORDS + ASH A,-1 ;FOR VECTOR TO WIN NEED NO. OF ELEMENTS + PUSH TP,$TFIX + PUSH TP,A + MCALL 1,VECTOR + + POP P,D ;RESTORE NUMBER OF WORDS + HRLI C,(AB) ;START BUILDING BLT POINTER + HRRI C,(B) ;TO ADDRESS + ADDI D,(B)-1 ;SET D TO FINAL ADDRESS + BLT C,(D) + JRST FINIS + +;EXPLICIT VECTORS FOR THE UNIFORM CSE + +MFUNCTION EUVECTOR,SUBR + + ENTRY + HLRE A,AB ;-NUM OF ARGS + MOVNS A + ASH A,-1 ;NEED HALF AS MANY WORDS + PUSH TP,$TFIX + PUSH TP,A + GETYP A,(AB) ;GET FIRST ARG + PUSHJ P,NWORDT ;SEE IF NEEDS EXTRA WORDS + SOJN A,CANTUN + MCALL 1,UVECTOR ;GET THE VECTOR + + GETYP C,(AB) ;GET THE FIRST TYPE + MOVE D,AB ;COPY THE ARG POINTER + MOVE E,B ;COPY OF RESULT + +EUVLP: GETYP 0,(D) ;GET A TYPE + CAIE 0,(C) ;SAME? + JRST WRNGUT ;NO , LOSE + MOVE 0,1(D) ;GET GOODIE + MOVEM 0,(E) ;CLOBBER + ADD D,[2,,2] ;BUMP ARGS POINTER + AOBJN E,EUVLP + + HRLM C,(E) ;CLOBBER UNIFORM TYPE IN + JRST FINIS + +WRNGUT: PUSH TP,$TATOM + PUSH TP,MQUOTE TYPES-DIFFER-IN-UNIFORM-VECTOR + JRST CALER1 + +CANTUN: PUSH TP,$TATOM + PUSH TP,MQUOTE DATA-CANT-GO-IN-UNIFORM-VECTOR + JRST CALER1 + + +; FUNCTION TO GROW A VECTOR + +MFUNCTION GROW,SUBR + + ENTRY 3 + + MOVEI D,0 ;STACK HACKING FLAG + HLRZ A,(AB) ;FIRST TYPE + PUSHJ P,SAT ;GET STORAGE TYPE + HLRZ B,2(AB) ;2ND ARG + CAIE A,STPSTK ;IS IT ASTACK + CAIN A,SPSTK + AOJA D,GRSTCK ;YES, WIN + CAIE A,SNWORD ;UNIFORM VECTOR + CAIN A,S2NWORD ;OR GENERAL +GRSTCK: CAIE B,TFIX ;IS 2ND FIXED + JRST WRONGT ;COMPLAIN + HLRZ B,4(AB) + CAIE B,TFIX ;3RD ARG + JRST WRONGT ;LOSE + + MOVEI E,1 ;UNIFORM/GENERAL FLAG + CAIE A,SNWORD ;SKIP IF UNIFORM + CAIN A,SPSTK ;DONT SKIP IF UNIFORM PDL + MOVEI E,0 + + HRRZ B,1(AB) ;POINT TO START + HLRE A,1(AB) ;GET -LENGTH + SUB B,A ;POINT TO DOPE WORD + SKIPE D ;SKIP IF NOT STACK + ADDI B,PDLBUF ;FUDGE FOR PDL + HLLZS (B) ;ZERO OUT GROWTH SPECS + SKIPN A,3(AB) ;ANY TOP GROWTH? + JRST GROW1 ;NO, LOOK FOR BOTTOM GROWTH + ASH A,(E) ;MULT BY 2 IF GENERAL + ADDI A,77 ;ROUND TO NEAREST BLOCK + ANDCMI A,77 ;CLEAR LOW ORDER BITS + ASH A,9-6 ;DIVIDE BY 100 AND SHIFT TO POSTION + TRZE A,400000 ;CONVERT TO SIGN MAGNITUDE + MOVNS A + TLNE A,-1 ;SKIP IF NOT TOO BIG + JRST GTOBIG ;ERROR +GROW1: SKIPN C,5(AB) ;CHECK LOW GROWTH + JRST GROW4 ;NONE, SKIP + ASH C,(E) ;GENRAL FUDGE + ADDI C,77 ;ROUND + ANDCMI C,77 ;FUDGE FOR VALUE RETURN + PUSH P,C ;AND SAVE + ASH C,-6 ;DIVIDE BY 100 + TRZE C,400 ;CONVERT TO SIGN MAGNITUDE + MOVNS C + TDNE C,[-1,,777000] ;CHECK FOR OVERFLOW + JRST GTOBIG +GROW2: HLRZ E,1(B) ;GET TOTAL LENGTH OF VECTOR + SUBI E,2 ;FUDGE FOR DOPE WORDS + MOVNS E + HRLI E,-1(E) ;TO BOTH HALVES + ADDI E,(B) ;POINTS TO TOP + SKIPE D ;STACK? + ADD E,[PDLBUF,,0] ;YES, FUDGE LENGTH + SKIPL D,(P) ;SHRINKAGE? + JRST GROW3 ;NO, CONTINUE + MOVNS D ;PLUSIFY + HRLI D,(D) ;TO BOTH HALVES + ADD E,D ;POINT TO NEW LOW ADDR +GROW3: IORI A,(C) ;OR TOGETHER + HRRM A,(B) ;DEPOSIT INTO DOPEWORD + PUSH TP,(AB) ;PUSH TYPE + PUSH TP,E ;AND VALUE + SKIPE A ;DON'T GC FOR NOTHING + PUSHJ P,AGC + POP P,C ;RESTORE GROWTH + HRLI C,(C) + POP TP,B ;GET VECTOR POINTER + SUB B,C ;POINT TO NEW TOP + POP TP,A + JRST FINIS + +GTOBIG: PUSH TP,$TATOM + PUSH TP,MQUOTE ATTEMPT-TO-GROW-VECTOR-TOO-MUCH + JRST CALER1 +GROW4: PUSH P,[0] ;0 BOTTOM GROWTH + JRST GROW2 + +; SUBROUTINE TO BUILD CHARACTER STRING GOODIES + +MFUNCTION STRING,SUBR + + ENTRY + + MOVE B,AB ;COPY ARG POINTER + MOVEI C,0 ;INITIALIZE COUNTER + PUSH TP,$TAB ;SAVE A COPY + PUSH TP,B + JUMPGE B,MAKSTR ;ZERO LENGTH + +STRIN2: GETYP D,(B) ;GET TYPE CODE + CAIN D,TCHRS ;SINGLE CHARACTER? + AOJA C,STRIN1 + CAIE D,TCHSTR ;OR STRING + JRST WRONGT ;NEITHER + + MOVEM B,(TP) ;SAVE CURRENT POINTER + PUSH TP,(B) + PUSH TP,1(B) + PUSH P,C ;SAVE CURRENT COUNT + MCALL 1,LENGTH ;FIND THE LENGTH + POP P,C + ADDI C,(B) ;BUMP COUNT + MOVE B,(TP) ;RESTORE + +STRIN1: ADD B,[2,,2] + JUMPL B,STRIN2 + +; NOW GET THE NECESSARY VECTOR + +MAKSTR: PUSH TP,$TFIX + ADDI C,4 ;COMPUTE NEEDED WORDS + IDIVI C,5 + PUSH TP,C + MCALL 1,UVECTOR ;GET THE VECTOR + + HRLI B,440700 ;CONVERT B TO A BYTE POINTER + SKIPL C,AB ;ANY ARGS? + JRST DONEC + +NXTRG1: GETYP D,(C) ;GET AN ARG + CAIE D,TCHRS + JRST TRYSTR + LDB D,[350700,,1(C)] ;GET IT + IDPB D,B ;AND DEPOSIT IT + JRST NXTARG + +TRYSTR: MOVE E,1(C) ;GET BYTER + HRRZ 0,(C) ;AND DOPE WORD POINTER + LDB D,E ;GET 1ST CHAR +NXTCHR: CAIG 0,1(E) ;STILL WINNING? + JRST NXTARG ;NO, GET NEXT ARG + JUMPE D,NXTARG ;HIT 0, QUIT + IDPB D,B ;INSERT + ILDB D,E ;AND GET NEXT + JRST NXTCHR + +NXTARG: ADD C,[2,,2] ;BUMP ARG POINTER + JUMPL C,NXTRG1 + ADDI B,1 + +DONEC: MOVSI C,TCHRS + HLLM C,(B) ;AND CLOBBER AWAY + HLRZ C,1(B) ;GET LENGTH BACK + MOVEI A,1(B) ;POINT TO DOPE WORD + HRLI A,TCHSTR + SUBI B,-2(C) + HRLI B,350700 ;MAKE A BYTE POINTER + JRST FINIS + +AGC": +;SET FLAG FOR INTERRUPT HANDLER + + SETOM GCFLG + +;SAVE AC'S + IRP AC,,[0,A,B,C,D,E,P,SP,TP,TB,AB,TVP,PP,PVP] + MOVEM AC,AC!STO"+1(PVP) + TERMIN + +;SET UP E TO POINT TO TYPE VECTOR + HLRZ E,TYPVEC(TVP) + CAIE E,TVEC + JRST AGCE1 + HRRZ TYPNT,TYPVEC+1(TVP) + HRLI TYPNT,B + +;DECIDE WHETHER TO SWITCH TO GC PDL + + MOVEI A,(P) ;POINNT TO PDL + HRRZ B,GCPDL ;POINT TO BASE OF GC PDL + CAIG A,(B) ;SKIP IF MUST CHANGE + JRST CHPDL + HLRE C,GCPDL ;-LENGTH OF GC'S PDL + SUB B,C ;POINT TO END OF GC'S PDL + CAILE A,(B) ;SKIP IF WITHIN GCPDL +CHPDL: MOVE P,GCPDL ;GET GC'S PDL + +;FENCE POST PDLS AND CHECK IF ANY SHOULD BE SHRUNK + + MOVEI A,(TB) ;POINT TO CURRENT FRAME IN PROCESS + PUSHJ P,FRMUNG ;AND MUNG IT + MOVE A,TP ;THEN TEMPORARY PDL + PUSHJ P,PDLCHK + MOVE A,PP ;GET PLANNER PDL + PUSHJ P,PDLCHK ;AND CHECK IT FOR GROWTH + MOVE A,PSTO+1(PVP) ;AND UNMARKED P STACK + CAMN P,GCPDL ;DID PDLS CHANGE + PUSHJ P,PDLCHP + ;MARK PHASE: MARK ALL LISTS AND VECTORS +;POINTED TO WITH ONE BIT IN SIGN BIT +;START AT TRANSFER VECTOR + + SETZB LPVP,VECNUM ;CLEAR NUMBER OF VECTOR WORDS + SETZM PARNUM ;CLEAR NUMBER OF PAIRS + MOVSI D,400000 ;SIGN BIT FOR MARKING + MOVE A,ASOVEC+1(TVP) ;MARK ASSOC. VECTOR NOW + HLRE B,A + SUBI A,(B) ;POINT TO DOPE WORD + IORM D,1(A) ;AND MARK + MOVE A,PVP ;START AT PROCESS VECTOR + MOVEI B,TPVP ;IT IS A PROCESS VECTOR + PUSHJ P,MARK ;AND MARK THIS VECTOR + +; ASSOCIATION FLUSHING PHASE + + MOVE A,ASOVEC+1(TVP) ;GET POINTER TO VECTOR + PUSHJ P,ASOMRK ;MARK AND FLUSH + +;OPTIONAL RETIMING PHASE + + SKIPE A,TIMOUT ;ANY TIME OVERFLOWS + PUSHJ P,RETIME ;YES, RE-CALIBRATE THEM + +;CORE ADJUSTMENT PHASE + SETZM CORSET ;CLEAR LATER CORE SETTING + PUSHJ P,CORADJ ;AND MAKE CORE ADJUSTMENTS + +;RELOCATION ESTABLISHMENT PHASE +;1 -- IN PAIR SPACE, SWAP LOW GARBAGE WITH HIGHER NON GARBAGE + MOVE A,PARBOT" ;ONE POINTER TO BOTTOM OF PAIR SPACE + MOVE B,PARTOP" ;AND ANOTHER TO TOP. + PUSHJ P,PARREL ;AND ESTABLISH THE PAIR RELOCATION + MOVEM B,PARTOP ;ESTABLISH NEW TOP OF PAIRS HERE + +;2 -- IN VECTOR SPACE, ESTABLISH POINTERS TO TOP OF CORE + MOVE A,VECTOP" ;START AT TOP OF VECTOR SPACE + MOVE B,VECNEW" ;AND SET TO INITIAL OFFSET + SUBI A,1 ;POINT TO DOPE WORDS + PUSHJ P,VECREL ;AND ESTABLISH RELOCATION FOR VECTORS + MOVEM B,VECNEW ;SAVE FINAL OFFSET + + ;POINTER UPDATE PHASE +;1 -- UPDATE ALL PAIR POINTERS + MOVE A,PARBOT ;START AT BOTTOM OF PAIR SPACE + PUSHJ P,PARUPD ;AND UPDATE ALL PAIR POINTERS + +;2 -- UPDATE ALL VECTORS + MOVE A,VECTOP ;START AT TOP OF VECTOR SPACE + PUSHJ P,VECUPD ;AND UPDATE THE POINTERS + +;3 -- UPDATE THE PVP AC + MOVEI A,PVP-1 ;SET LOC TO POINT TO PVP + MOVE C,PVP ;GET THE DATUM + PUSHJ P,NWRDUP ;AND UPDATE THIS VALUE +;4 -- UPDATE THE MAIN PROCESS POINTER + MOVEI A,MAINPR-1 ;POINT TO MAIN PROCESS POINTER + MOVE C,MAINPR ;GET CONTENTS IN C + PUSHJ P,NWRDUP ;AND UPDATE IT +;DATA MOVEMMENT ANDCLEANUP PHASE + +;1 -- ADJUST FOR SHRINKING VECTORS + MOVE A,VECTOP ;VECTOR SHRINKING PHASE + PUSHJ P,VECSH ;GO SHRINK ANY SHRINKERS + +;2 -- MOVE VECTORS (AND LIST ELEMENTS) + MOVE A,VECTOP ;START AT TOP OF VECTOR SPACE + PUSHJ P,VECMOVE ;AND MOVE THE VECTORS + MOVE A,VECNEW ;GET FINAL CHANGE TO VECBOT + ADDM A,VECBOT ;OFFSET VECBOT TO ITS NEW PLACE + MOVE A,CORTOP ;GET NEW VALUE FOR TOP OF VECTOR SPACE + MOVEM A,VECTOP ;AND UPDATE VECTOP + +;3 -- CLEANUP VECTORS (NOTE A CONTAINS NEW VECTOP) + + PUSHJ P,VECZER ; + +;GARBAGE ZEROING PHASE +GARZER: MOVE A,PARTOP ;FIRST WORD OF GARBAGE IS AFTER PAIR SPACE + HRLS A ;GET FIRST ADDRESS IN LEFT HALF + MOVE B,VECBOT ;LAST ADDRESS OF GARBAGE + 1 + CLEARM (A) ;ZERO THE FIRST WORD + ADDI A,1 ;MAKE A A BLT POINTER + BLT A,-1(B) ;AND COPY ZEROES INTO REST OF AREA + +;FINAL CORE ADJUSTMENT + SKIPE A,CORSET ;IFLESS CORE NEEDED + PUSHJ P,CORADL ;GIVE SOME AWAY. + +;NOW REHASH THE ASSOCIATIONS BASED ON NEW VALUES + + PUSHJ P,REHASH + +;RESTORE AC'S + IRP AC,,[0,A,B,C,D,E,P,SP,TP,TB,AB,PP,PVP,TVP] + MOVE AC,AC!STO+1(PVP) + TERMIN + + SETZM PARNEW ;CLEAR FOR NEXT AGC CALL + SETZM GETNUM ;ALSO CLEAR THIS + SETZM GCFLG + + +CPOPJ: POPJ P, + + +AGCE1: MOVEI B,[ASCIZ /TYPVEC IS NOT OF TYPE VECTOR +/] +TYPSTP: PUSHJ P,MSGTYP" ;TYPE OUT A HOPELESSMESSAGE + .VALUE ;AND GIVE UP + + + +; SUBROUTINE TO CHECK SIZE OF PDLS AND DO FENCEPOSTING + +PDLCHK: JUMPGE A,CPOPJ + HLRE B,A ;GET NEGATIVE COUNT + MOVE C,A ;SAVE A COPY OF PDL POINTER + SUBI A,-1(B) ;LOCATE DOPE WORD PAIR + HRRZS A ; ISOLATE POINTER + CAME A,TPGROW ;GROWING? + CAMN A,PPGROW ;OR PLANNER PDL + JRST .+2 + ADDI A,PDLBUF ;NO, POINT TO REAL DOPE WORD + HLRZ D,(A) ;GET COUNT FROM DOPE WORD + MOVNS B ;GET POSITIVE AMOUNT LEFT + SUBI D,2(B) ; PDL FULL? + JUMPE D,NOFENC ;YES NO FENCE POSTING + SETOM 1(C) ;CLOBBER TOP WORD + SOJE D,NOFENC ;STILL MORE? + MOVSI D,1(C) ;YES, SET UP TO BLT FENCE POSTS + HRRI D,2(C) + BLT D,-2(A) ;FENCE POST ALL EXCEPT DOPE WORDS + + +NOFENC: CAIG B,TPMAX ;NOW CHECK SIZE + CAIG B,TPMIN + JRST MUNGTP ;TOO BIG OR TOO SMALL + POPJ P, + +MUNGTP: SUBI B,TPGOOD ;FIND DELTA TP +MUNG3: MOVE C,-1(A) ;IS GROWTH ALREADY SPECIFIED + TRNE C,777000 ;SKIP IF NOT + POPJ P, ;ASSUME GROWTH GIVEN WILL WIN + + ASH B,-6 ;CONVERT TO NUMBER OF BLOCKS + JUMPL B,MUNGT1 + TRO B,400 ;TURN ON SHRINK BIT + JRST MUNGT2 +MUNGT1: MOVMS B + ANDI B,377 +MUNGT2: DPB B,[111100,,-1(A)] ;STORE IN DOPE WORD + POPJ P, + +; CHECK UNMARKED STACK (NO NEED TO FENCE POST) + +PDLCHP: HLRE B,A ;-LENGTH TO B + SUBI A,-1(B) ;POINT TO DOPE WORD + HRRZS A ;ISOLATE POINTER + CAME A,PGROW ;GROWING? + ADDI A,PDLBUF ;NO, POINT TO REAL DOPE WORD + MOVMS B ;PLUS LENGTH + + CAIG B,PMAX ;TOO BIG? + CAIG B,PMIN ;OR TOO LITTLE + JRST .+2 ;YES, MUNG IT + POPJ P, + SUBI B,PGOOD + JRST MUNG3 + +;THIS ROUTINE CLOBBERS USELESS STUFF IN CURRENT FRAME + +FRMUNG: SETZM PCSAV(A) + SETZM PSAV(A) + SETZM SPSAV(A) + SETZM PPSAV(A) + MOVEM TP,TPSAV(A) ;SAVE FOR MARKING + POPJ P, + +;GENERAL MARK SUBROUTINE. CALLED TO MARK ALL THINGS +; A/ GOODIE TO MARK FROM +; B/ TYPE OF A (IN RH) +; C/ TYPE,DATUM PAIR POINTER + +MARK2: HLRZ B,(C) ;GET TYPE +MARK1: MOVE A,1(C) ;GET GOODIE +MARK: JUMPE A,CPOPJ ; NEVER MARK 0 + PUSH P,A ;SAVE GOODIE + HRLM C,-1(P) ;AND POINTER TO IT + LSH B,1 ;TIMES 2 TO GET SAT + HRRZ B,@TYPNT ;GET SAT + JRST @MKTBS(B) ;AND GO MARK + +; DISPATCH TABLE FOR MARK PHASE ("SETZ'D" ENTRIES MUST BE DEFERRED) + +DISTBS MKTBS,GCRET,[[S2WORD,PAIRMK],[S2DEFR,DEFMK],[SNWORD,VECTMK] +[STPSTK,TPMK],[SARGS,],[S2NWORD,VECTMK],[SPSTK,TPMK] +[SFRAME,],[SBYTE,],[SATOM,ATOMK],[SPVP,VECTMK] +[SLOCID,],[SCHSTR,],[SASOC,ASMRK]] + + +;HERE TO MARK THAT WHICH IS POINTED TO BY A DEFERRED POINTER + +DEFMK: TLOA TYPNT,400000 ;USE SIGN BIT AS FLAG + +;HERE TO MARK LIST ELEMENTS + +PAIRMK: TLZ TYPNT,400000 ;TURN OF DEFER BIT + MOVEI C,(A) ;POINT TO LIST +PAIRM1: CAMGE C,PARTOP ;CHECK FOR BEING IN BOUNDS + CAMGE C,PARBOT + JRST BDPAIR ;OUT OF BOUNDS,COMPLAIN + SKIPGE B,(C) ;SKIP IF NOT MARKED + JRST GCRET ;ALREADY MARKED, RETURN + IORM D,(C) ;MARK IT + AOS PARNUM + HLRZS B ;TYPE TO RH OF B + MOVE A,1(C) ;DATUM TO A + JUMPL TYPNT,DEFDO ;GO HANDLE DEFERRED POINTER + PUSHJ P,MARK ;MARK THIS DATUM + HRRZ C,(C) ;GET CDR OF LIST + JUMPN C,PAIRM1 ;IF NOT NIL, MARK IT + +GCRET: TLZ TYPNT,400000 ;FOR PAIRMKS BENEFIT + HLRZ C,-1(P) ;RESTORE C + POP P,A + POPJ P, ;AND RETURN TO CALLER + +;HERE TO SQUAWK WHEN A PAIR POINTER IS BAD + +BDPAIR: MOVEI B,[ASCIZ /AGC -- MARKED PAIR POINTS OUTSIDE PAIR SPACE +/] + + PUSHJ P,MSGTYP + .VALUE 0 + +;HERE TO MARK DEFERRED POINTER + +DEFDO: PUSHJ P,MARK ;MARK THE DATUM + JRST GCRET ;AND RETURN + + +; VECTOR AND TP MARKER, SIGN OF TYPNT IS SET BASED ON WHICH ONE + +TPMK: TLOA TYPNT,400000 ;SET TP MARK FLAG +VECTMK: TLZ TYPNT,400000 + MOVEI E,(A) ;SAVE A POINTER TO THE VECTOR + HLRE B,A ;GET -LNTH + SUB A,B ;LOCATE DOPE WORD + MOVEI A,1(A) ;ZERO LH AND POINT TO 2ND DOPE WORD + CAMGE A,VECTOP ;CHECK BOUNDS + CAMGE A,VECBOT + JRST VECTB1 ;LOSE, COMPLAIN + + JUMPGE TYPNT,NOBUFR ;IF A VECTOR, NO BUFFER CHECK + CAMN A,PPGROW ;CHECK PLANNER PDL + JRST NOBUFR + CAME A,PGROW ;IS THIS THE BLOWN P + CAMN A,TPGROW ;IS THIS THE GROWING PDL + JRST NOBUFR ;YES, DONT ADD BUFFER + ADDI A,PDLBUF ;POINT TO REAL DOPE WORD + MOVSI 0,-PDLBUF ;ALSO FIX UP POINTER + ADDM 0,1(C) + +NOBUFR: HLRZ B,(A) ;GET LENGTH FROM DOPE WORD + ANDI B,377777 ;CLOBBER POSSIBLE MARK BIT + MOVEI F,(A) ;SAVE A POINTER TO DOPE WORD + SUBI F,1(B) ;F POINTS TO START OF VECTOR + HRRZ 0,-1(A) ;SEE IF GROWTH SPECIFIED + JUMPE 0,NOCHNG ;NONE, JUST CHECK CURRENT SIZES + + LDB B,[001100,,0] ;GET GROWTH FACTOR + TRZE B,400 ;KILL SIGN BIT AND SKIP IF + + MOVNS B ;NEGATE + ASH B,6 ;CONVERT TO NUMBER OF WORDS + SUB F,B ;BOTTOM IS LOWER IN CORE + LDB 0,[111100,,0] ;GET TOP GROWTH + TRZE 0,400 ;HACK SIGN BIT + MOVNS 0 + ASH 0,6 ;CONVERT TO WORDS + ADD B,0 ;TOTAL GROWTH TO B + ADD A,0 ;DOPE WORD IS HIGHER +NOCHNG: SKIPGE TYPNT ;IS THIS A PDL? + SUBI F,1 ;YES, POINTER MAY POINT OUTSIDE + + CAIG E,(A) ;IS E IN BOUNDS? + CAIG E,(F) + JRST VECLOS ;NO, CLOBBER POINTER TO IT + +VECOK: SUB A,0 ;A POINTS TO DOPW WORD AGAIN + HLRE E,(A) ;GET LENGTH AND MARKING + MOVEI F,(E) ;SAVE A COPY + ADD F,B ;ADD GROWTH + SUBI E,2 ;- DOPE WORD LENGTH + IORM D,(A) ;MAKE SURE NOW MARKED + JUMPLE E,GCRET ;ALREADY MARKED OR ZERO LENGTH, LEAVE + + SKIPGE B,-1(A) ;SKIP IF UNIFORM + TLNE B,377777 ;SKIP IF NOT SPECIAL + JUMPGE TYPNT,NOTGEN ;JUMP IF NOT A GENERAL VECTOR + +GENRAL: HLRZ 0,B ;CHECK FOR PSTACK + JUMPE 0,NOTGEN ;IT ISN'T GENERAL + SUBI A,1(E) ;POINT TO FIRST ELEMENT + ADDM F,VECNUM ;AND UPDATE VECNUM + MOVEI C,(A) ;POINT TO FIRST ELEMENT WITH C + +; LOOP TO MARK ELEMENTS IN A GENRAL VECTOR + +VECTM2: HLRE B,(C) ;GET TYPE AND MARKING + JUMPL B,GCRET ;RETURN, (EITHER DOPE WORD OR FENCE POST) + MOVE A,1(C) ;DATUM TO A + CAIN B,TENTRY ;IS THIS A STACK FRAME + JRST MFRAME ;YES, MARK IT + CAIN B,TBIND ;OR A BINDING BLOCK + JRST MBIND + +VECTM3: PUSHJ P,MARK ;MARK DATUM + ADDI C,2 + JRST VECTM2 + +MFRAME: HRROI C,FRAMLN+SPSAV-1(C) ;POINT TO SAVED SP + MOVEI B,TSP + PUSHJ P,MARK1 ;MARK THE GOODIE + HRROI C,PSAV-SPSAV(C) ;POINT TO SAVED P + MOVEI B,TPDL + PUSHJ P,MARK1 ;AND MARK IT + HRROI C,TPSAV-PSAV(C) ;POINT TO SAVED TP + MOVEI B,TTP + PUSHJ P,MARK1 ;MARK IT ALS + MOVEI C,PPSAV-TPSAV(C) ;POINT SAVED PP + MOVEI B,TPP + PUSHJ P,MARK1 + MOVEI C,-PPSAV+1(C) ;POINT PAST THE FRAME + JRST VECTM2 ;AND DO MORE MARKING + + +MBIND: MOVEI B,TATOM ;FIRST MARK ATOM + JRST VECTM3 + +VECLOS: JUMPL C,CCRET ;JUMP IF CAN'T MUNG TYPE + HLLZ 0,(C) ;GET TYPE + MOVEI B,TILLEG ;GET ILLEGAL TYPE + HRLM B,(C) + MOVEM 0,1(C) ;AND STORE OLD TYPE AS VALUE + JRST GCRET ;RETURN WITHOUT MARKING VECTOR + +CCRET: CLEARM 1(C) ;CLOBBER THE DATUM + JRST GCRET + +; SUBROUTINE TO CHECK THE TIME FOR LOCIDS,ARGS AND FRAMES +; A/ POINT TO FRAME C/GOODIE B/ITS TIME + +TIMECH: HLRZ 0,OTBSAV(A) ;GET THE FRAMES TIME + CAIN 0,(B) ;SAME? + POPJ P, ;YES, WIN + SUB P,[1,,1] ;NO, REMOVE RETLOC +BADARG: +TIMLOS: HLLZ 0,(C) ;GET OLD TYPE + MOVSI B,TILLEG ;ILLEGAL TYPE + MOVEM B,(C) ;AND STORE IT + MOVEM 0,1(C) ;USE OLD TYPE AS DATUM + JRST GCRET ;AND STOP MARKING FROM THE LOSER + +; MARK ARG POINTERS (SABASE AND SARGS) + +ARGMK: HLRE B,A ;-LENGTH TO B + SUBI A,(B) ;POINT TO FRAME OR FRAME POINTER + HLRZ E,(A) ;GET TYPE + CAIE E,TENTRY ;IS TJHIS A FRAME + JRST ARGMK2 ;NO, CHECK OTHER + MOVEI A,FRAMLN(A) ;POINT ABOVE FRAME +ARGMK3: HRRZ B,(C) ;GET TIME + PUSHJ P,TIMECH + JRST GCRET ;DONE + + +ARGMK2: CAIE E,TTB ;BASE POINTER? + JRST BADARG ;LOSE + HRRZ A,1(A) ;POINT TO FRAME + JRST ARGMK3 ;AND MARK IT AS SUCH + +; MARK FRAME POINTERS + +FRMK: HLRZ B,A ;GET TIME IN B + PUSHJ P,TIMECH ;CHECK ITS TIME + SUBI C,1 ;PREPARE TO MARK PROCESS VECTOR + HRRZ A,1(C) ;USE AS DATUM + SUBI A,1 ;FUDGE FOR VECTMK + MOVEI B,TPVP ;IT IS A VECTRO + PUSHJ P,MARK ;MARK IT + JRST GCRET + +; MARK BYTE POINTER + +BYTMK: HRRZ A,(C) ;POINT TO DOPE WD + SOJG A,VECTMK ;FUDGE DOPE WORD POINTER FOR VECTMK + + + MOVEI B,[ASCIZ /AGC -- BYTE POINTER WITH ZERO DOPE WORD POINTER +/] + PUSHJ P,MSGTYP + .VALUE + + +; MARK ATOMS + +ATOMK: PUSHJ P,GETLNT ;GET LENGTH AND CHECK BOUNDS + MOVEI C,(A) + HLRZ B,(C) ;GET TYPE + MOVE A,1(C) ;AND VALUE +;******FUDGE UNTIL MIRE WINNAGE****** + + HRRZ E,(C) ;GOBBLE PROCESS ID + CAIN B,TUNBOUND ;IF NOT UNBOUND + JRST GCRET ;IS UNVOUND, IGNORE + SKIPN E ;SKIP IF NOT GLOBAL PROCESS + MOVEI B,TVEC ;IS GLOBAL, MARK AS A VECTOR + PUSHJ P,MARK ;AND MARK IT + JRST GCRET ;AND LEAVE + +GETLNT: HLRE B,A ;GET -LNTH + SUB A,B ;POINT TO 1ST DOPE WORD + MOVEI A,1(A) ;POINT TO 2ND DOPE WORD + CAMGE A,VECTOP ;CHECK BOUNDS + CAMGE A,VECBOT + JRST VECTB1 ;BAD VECTOR, COMPLAIN + + HLRE B,(A) ;GET LENGTH AND MARKING + IORM D,(A) ;MAKE SURE MARKED + JUMPL B,GCRET1 ;MARKED ALREADY, QUIT + SUBI A,-1(B) ;POINT TO TOP OF ATOM + ADDM B,VECNUM ;UPDATE VECNUM + POPJ P, ;AND RETURN + +GCRET1: SUB P,[1,,1] ;FLUSH RETURN ADDRESS + JRST GCRET + +; MARK NON-GENERAL VECTORS + +NOTGEN: CAMN B,[GENERAL+] ;PROCESS VECTOR? + JRST GENRAL ;YES, MARK AS A VECTOR + JUMPL B,SPECLS ; COMPLAIN IF A SPECIAL HACK + SUBI A,1(E) ;POINT TO TOP OF A UNIFORM VECTOR + ADDM F,VECNUM ;INCREASE VECNUM + HLRZS B ;ISOLATE TYPE + MOVE F,B ; AND COPY IT + LSH B,1 ;FIND OUT WHERE IT WILL GO + HRRZ B,@TYPNT ;GET SAT IN B + MOVEI C,@MKTBS(B) ;POINT TO MARK SR + CAIN C,GCRET ;IF NOT A MARKED FROM GOODIE, IGNORE + JRST GCRET + MOVEI C,-1(A) ;POINT 1 PRIOR TO VECTOR START + PUSH P,E ;SAVE NUMBER OF ELEMENTS + PUSH P,F ;AND UNIFORM TYPE + +UNLOOP: MOVE B,(P) ;GET TYPE + MOVE A,1(C) ;AND GOODIE + TLO C,400000 ;CAN'T MUNG TYPE + PUSHJ P,MARK ;MARK THIS ONE + SOSE -1(P) ;COUNT + AOJA C,UNLOOP ;IF MORE, DO NEXT + + SUB P,[2,,2] ;REMOVE STACK CRAP + JRST GCRET + + +SPECLS: MOVEI B,[ASCIZ /AGC -- UNRECOGNIZED SPECIAL VECTOR +/] + PUSHJ P,MSGTYP + .VALUE + +;MARK LOCID TYPE GOODIES + +LOCMK: HRRZ B,(C) ;GET TIME + JUMPE B,GLBSP ;IF TIME IS 0, THIS IS THE GLOBAL SP + HRRZ 0,2(A) ;GET TIME + CAIE 0,(B) ;EQUAL? + JRST TIMLOS ;NO, LOSE + MOVE A,3(A) ;GOBBLE SP POINTER + JRST TPMK + + +GLBSP: MOVE A,1(C) ;MARK LIKE A VECTOR + JRST VECTMK + + +; MARK ASSOCIATION BLOCKS + +ASMRK: HRLI A,-ASOLNT ;LOOK LIKE A VECTOR POINTER + PUSHJ P,GETLNT ;GET LENGTH AND CHECK BOUNDS + GETYP B,(A) ;CHECK TYPE OF FIRST + CAIN B,TTP + JRST GCRET ;THIS IS THE DUMMY + MOVEI C,(A) ;COPY POINTER + PUSHJ P,MARK2 ;MARK ITEM CELL + ADDI C,INDIC-ITEM ;POINT TO INDICATOR + PUSHJ P,MARK2 + ADDI C,VAL-INDIC + PUSHJ P,MARK2 + ADDI C,NODPNT-VAL-1 ;POINT TO NODE CHAIN + HRRZ A,1(C) ;DOES IT EXIST + JUMPE A,GCRET + MOVEI B,TASOC + PUSHJ P,MARK ;AND MARK IT + JRST GCRET + + ;HERE WHEN A VECTOR POINTER IS BAD + +VECTB1: MOVEI B,[ASCIZ /AGC -- VECTOR POINTS OUTSIDE VECTOR SPACE +/] + PUSHJ P,MSGTYP + .VALUE 0 + + + +; THIS PHASE REMOVES ANY UNWANTED ASSOCIATIONS ALSO PRESERVES DATA POINTED TO ONLY BY ASSOCIATIONS +; RECEIVES POINTER TO ASSOCIATION VECTOR IN A + +ASOMRK: SKIPN C,(A) ;DOES BUCKET CONTAIN ANYTHING + JRST ASOM3 ;NO, ;IGNORE + +ASOM2: HRRE 0,ASOLNT+1(C) ;CHECK FOR CIRCULARITY + AOJE 0,ASOM6 ;ALREADY MARKED, LOSE + HLLOS ASOLNT+1(C) + + SKIPGE ASOLNT+1(C) ;IS THIS ONE POINTED AT? + JRST ASOM4 ;YES, GOODIES ALREADY MARKED + PUSHJ P,MARKQ ;SEE IF ITS ITEM IS MARKED + JRST ASOFLS ;NO, FLUSH THIS ASSOCIATION + MOVEI E,MARKQ ;POINT TO QUESTIONER + SKIPE NODPNT(C) ;SKIP IF NOT ON A CHAIN + MOVEI E,MARK23 ;ON CHAIN, MARK THE INDICATOR + MOVEI C,INDIC(C) ;POINT TO INDICATOR + PUSHJ P,(E) + JRST ASOFL7 ;INDICATOR NOT MARKED + MOVEI C,-INDIC(C) ;POINT BACK TO START + +ASOM1: PUSH P,C ;ITEM IS MARKED, MARK INDIC AND VAL AND ASSOC + PUSH P,A + ADDI C,VAL ;POINT TO VAL + PUSHJ P,MARK2 + IORM D,ASOLNT+1-VAL(C) ;MARK THE ASSOCIATION BLOCK + POP P,A + POP P,C + +ASOM4: MOVEI E,(C) ;INCASE NEED TO FLUSH CIRCULARITY + HRRZ C,ASOLNT-1(C) ;POINT TO NEXT IN CHAIN + JUMPN C,ASOM2 ;GO MARKK IT + + +ASOM3: AOBJN A,ASOMRK ;GO ONTO NEXT BUCKET + POPJ P, ;ALL MARKED, QUIT + +;HERE TO FLUSH AN ASSOCIATION + +ASOFLS: HRRZ B,ASOLNT-1(C) ;GET FORWARD AND BACKWARD POINTERS + HLRZ E,ASOLNT-1(C) + JUMPN E,ASOFL1 ;JUMP IF PREV EXISTS + HRRZM B,(A) ;CLOBBER VECTOR ENTRY + JRST .+2 + +ASOFL1: HRRM B,ASOLNT-1(E) ;CLOBBER PREVIOUS BLOCKKS NEXT + JUMPE B,ASOM4 ;IF NEXT IS 0, DONE + HRLM E,ASOLNT-1(B) ;ELSE CLOBBER NEXT'S PREVIOUS + JRST ASOM4 + +ASOM6: HLLZS (E) ;FORCE CIRCULARITY AWAY + HRRZS (C) ;AND THE OTHERS PREV + JRST ASOM3 ;AND FINISH THIS BUCKET + +MARK23: PUSH P,A + PUSHJ P,MARK2 ;MARK IT + POP P,A ;RESTORE A + JRST MKD ;MUST SKIP + +ASOFL7: MOVEI C,ITEM-INDIC(C) ;RESET C + JRST ASOFLS ;AND FLUSH + +;SUBROUTINE TO SEE IF A GOODIE IS MARKED +;RECEIVES POINTER IN C +;SKIPS IF MARKED NOT OTHERWISE + +MARKQ: MOVE E,1(C) ;DATUM TO C + HLRZ B,(C) ;TYPE TO B + LSH B,1 + HRRZ B,@TYPNT ;GOBBLE SAT + JRST @MQTBS(B) ;DISPATCH + + +DISTBS MQTBS,MKD,[[S2WORD,PAIRMQ],[S2DEFR,PAIRMQ],[SNWORD,VECMQ],[S2NWORD,VECMQ] +[STPSTK,VECMQ],[SARGS,ARGMQ],[SPSTK,VECMQ],[SFRAME,FRMQ],[SBYTE,BYTMK] +[SATOM,VECMQ],[SPVP,VECMQ],[SLOCID,VECMQ],[SCHSTR,BYTMQ]] + +PAIRMQ: SKIPGE (E) ;SKIP IF NOT MARKED +MKD: AOS (P) + POPJ P, + +BYTMQ: HRRZ E,(C) ;GET DOPE WORD POINTER + SOJA E,VECMQ1 ;TREAT LIKE VECTOR + +ARGMQ: HLRE F,E ;CHECK AM ARG POINTER + SUB E,F ;POINT TO END OF ARG BLOCK + HLRZ B,(E) ;GET TYPE + CAIN B,TENTRY ;IS IT AN ENTRY + MOVEI E,FRAMLN+1(E) ;MAKE INTO FRAME POINTER + CAIN B,TTB ;IS IT A FRAME POINTER + HRRZ E,1(E) ;PICK IT UP + +FRMQ: MOVE E,TPSAV(E) ;PICK UP A STACK POINTER + +VECMQ: HLRE F,E ;GET LENGTH + SUB E,F ;POINT TO DOPE WORDS + +VECMQ1: SKIPGE 1(E) ;SKIP IF NOT MARKED + AOS (P) ;MARKED, CAUSE SKIP RETURN + POPJ P, + + + + + +;RETIME PHASE -- CALLED IFF A FRAME TIME HAS OVERFLOWED +;RECEIVES POINTER TO STACK TO BE RECALIBRATED IN A +;LEAVES HIGHEST TIME IN TIMOUT + +RETIME: HLRE B,A ;GET LENGTH IN B + SUB A,B ;COMPUTE DOPE WORD LOCATION + MOVEI A,1(A) ;POINT TO 2D DOPE WORD AND CLEAR LH + CAME A,TPGROW ;IS THIS ONE BLOWN? + ADDI A,PDLBUF ;NO, POINT TO DOPE WORD + LDB B,[222100,,(A)] ;GET LENGTH FIELD (IGNOREING MARK BIT + SUBI A,-1(B) ;POINT TO PDLS BASE + MOVEI C,1 ;INITIALIZE NEW TIMES + +RETIM1: SKIPGE B,(A) ;IF <0, HIT DOPE WORD OR FENCE POST + JRST RETIM3 + HLRZS B ;ISOLATE TYPE + CAIE B,TENTRY ;FRAME START? + AOJA A,RETIM2 ;NO, TRY BINDING + HRLM C,FRAMLN+OTBSAV(A) ;STORE NEW TIME + ADDI A,FRAMLN ;POINT TO NEXT ELEMENT + AOJA C,RETIM1 ;BUMP TIME AND MOVE ON + +RETIM2: CAIN B,TBIND ;BINDING? + HRRM C,3(A) ;YES, STORE CURRENT TIME + AOJA A,RETIM1 ;AND GO ON + +RETIM3: MOVEM C,TIMOUT ;SAVE TIME + POPJ P, ;RETURN + + ;CORE ADJUSTMENT PHASE -- SETS TOP OF CORE +;AND TOP OF VECTOR SPACE TO SIZE NEEDED FOR SUFFICIENT FREE SPACE TO BE ADDED TO +;ALLOW FOR "EFFICIENT" PROCESSING + +CORADJ: .SUSET [.RMEMT,,CORTOP] ;SET CORTOP FROM SYSTEM + MOVE A,PARBOT ;GET ADDRESS OF BOTTOM OF MOVABLE CORE + ADD A,PARNEW ;AND ADDJUST TO WHERE IT WILL BE + ADD A,PARNUM ;ADD NUMBER OF PAIRS + ADD A,PARNUM ;TWICE TO GET TOP OF PAIR SPACE. + ADD A,VECNUM ;ADD NUMBER OF VECTOR WORDS + ADD A,GETNUM ;AND NUMBER OF WORDS TO BE GOTTEN THIS TIME + ADD A,FREMIN ;AND NUMBER OF FREE WORDS MINIMUM + SUB A,CORTOP ;LESS CURRENT TOP OF CORE + JUMPG A,CORAD2 ;IF GREATER THAN ZERO, MORE CORE NEEDED + ADD A,FREDIF ;ADD IN DIFFERENCE BETWEEEN FREE AND GOT + ADDI A,1777 ;ROUND UP TO NEXT BLOCK + ANDCMI A,1777 ;AND DOWN TO A BLOCK BOUNDARY + JUMPGE A,CORAD1 ;IF POSITIVE, NO CORE ADJUSTMENT NEEDED + ADDB A,CORTOP ;CALCULATE NEG TOP OF CORE + ASH A,-10. ;CONVERT TO BLOCKS + MOVEM A,CORSET ;AND SET NUMBER OF BLOCKS +CORAD1: MOVE A,CORTOP ;CALCU;ATE NEW TOP OF CORE + SUB A,VECTOP ;FIND OFFSET FROM CURRENT VECTOR TOP + MOVEM A,VECNEW ;AND SAVE AS NEW HOME OF VECTORS + POPJ P, + + ;HERE IF MORE CORE NEEDED, NO OF WDS IN A + +CORAD2: ADD A,CORTOP ;FIND TOP OF CORE + ADDI A,1777 ;AND ROUND UPWARDS + ASH A,-10. ;AND CONVERT TO NUMBER OF BLOCKS + CAMLE A,SYSMAX ;COMPARE TO MAXIMUM ALLOWED + PUSHJ P,CORAD3 + .CORE (A) ;ASK OFR THE NEW SIZE + PUSHJ P,CORAD4 ;FAILURE, GO COMPLAIN + JRST CORADJ ;OK TRY AGAIN + + +CORAD3: SKIPA B,[[ASCIZ /ATTEMPT TO EXPAND PAST MUDDLE LIMIT/]] +CORAD4: MOVEI B,[ASCIZ /NO CORE AVAILABLE/] + PUSH P,A ;SAVE AMOUNT ASKED FOR + PUSHJ P,MSGTYP + MOVEI B,[ASCIZ /PROCEED?/] + PUSHJ P,MSGTYP + PUSHJ P,TYI" + CAIN A,"Y + JRST .+2 + .VALUE + POP P,A ;RESTORE AMOUNT + POPJ P, ;AND GO BACK + + +CORADL: .CORE (A) ;SET TO NEW CORE VALUE + .VALUE + POPJ P, + +;PARREL -- PAIR RELOCATION ESTABLISMENT +;ESTABLISH PAIR RELOCATION. CALLED WITH +;BOTTOM IN AC A, AND TOP IN AC B. + +PARRE0: SUBI B,2 ;MOVE POINTER BACK + IORM D,(B) ;MARK THIS PAIR AS JUNK +PARREL: CAIG B,(A) ;HAVE THE POINTERS MET? + POPJ P, ;YES -- RETURN WITH NEW PARTOP IN B + SKIPL C,-2(B) ;MARKED PAIR ON BOTTOM? + JRST PARRE0 ;NO -- MOVE TOWARD BOTTOM +PARRE1: SKIPGE (A) ;JUNK ON BOTTOM? + JRST PARRE2 ;NO -- MOVE FORWARD + MOVEM C,(A) ;STORE PAIR IN NEW LOCATION + MOVE C,-1(B) ;GET DATUM + MOVEM C,1(A) ;AND STORE IN NEW HOME + HRROM A,-2(B) ;SET "BROKEN HEART" TO NEW HOME + JRST PARRE0 ;AND CONTINUE +PARRE2: ANDCAM D,(A) ;UNMARK PAIR + ADDI A,2 ;GO ON TO NEXT PAIR + CAIG B,(A) ;TEST TO SEE IF POINTERS MET + POPJ P, ;YES -- DONE + JRST PARRE1 ;KEEP LOOKING FORWARD + + ;VECTOR RELOCATE --GETS VECTOP IN A +;AND VECNEW IN B +;FILLS IN RELOCATION FIELDS OF MARKED VECTORS +;AND REUTRNS FINAL VECNEW IN B + +VECREL: CAMG A,VECBOT ;PROCESSED TO BOTTOM OF VECTOR SPACE? + POPJ P, ;YES, RETURN + HLRE C,(A) ;GET COUNT FROM DOPE WD, EXTEND MARK BIT + JUMPL C,VECRE1 ;IF MARKED GO PROCESS + HLLZS (A) ;CLEAR RELOC FIELD + ADDI B,(C) ;INCREMENT OFFSET + SUBI A,(C) ;MOVE ON TO NEXT VECTOR + SOJG C,VECREL ;AND KEEP SCANNING + JSP D,VCMLOS ;LOSER, LEAVE TRACKS AS TO WHO LOST + +VECRE1: HRRZ E,-1(A) ;GOBBLE THE GROWTH FILEDS + HRRM B,(A) ;STORE RELOCATION + JUMPE E,VECRE2 ;NO GROWTH (OR SHRINKAGE), GO AWAY + LDB F,[111100,,E] ;GET TOP GROWTH IN F + TRZN F,400 ;CHECK AND FLUSH SIGN + MOVNS F ;WAS ON, NEGATE + ASH F,6 ;CONVERT TO WORDS + ADD B,F ;UPDATE RELOCATION + HRRM B,(A) ;AND STORE IT + ANDI E,777 ;ISOLATE BOTTOM GROWTH + TRZN E,400 ;CHECK AND CLEAR SIGN + MOVNS E + ASH E,6 ;CONVERT TO WORDS + ADD B,E ;UPDATE FUTURE RELOCATIONS +VECRE2: SUBI A,400000(C) ;AND MOVE ON TO NEXT VECTOR + ANDI C,377777 ;KILL MARK + SOJG C,VECREL ;AND KEEP GOING + JSP D,VCMLOS ;LOSES, LEAVE TRACKS + +;PAIR SPACE UPDATE + +;GETS PARBOT IN AC A +;UPDATES VALUES AND CDRS UP TO PARTOP + +PARUPD: CAML A,PARTOP ;ARE THERE MORE PAIRS TO PROCESS + POPJ P, ;NO -- RETURN + HRRZ C,(A) ;GET CURRENT CDR + HLRZ B,(A) ;GET TYPE + LSH B,1 ;TIMES 2 + HRRZ B,@TYPNT ;NOW GET SAT + SKIPGE MKTBS(B) ;SKIP IF IT HAS A CDR + JRST PARUP1 ;NO CDR, DON'T UPDATE IT + JUMPE C,PARUP1 ;IF NIL, DON'T UPDATE + SKIPGE B,(C) ;GET POINTER UPDATE AND SKIP IF THIS IS NOT A BROKEN HEART + HRRM B,(A) ;IT WAS, STORE NEW POINTER + SKIPE B,PARNEW ;IF LIST SPACE IS MOVING, + ADDM B,(A) ;THEN ADD OFFSET TO CDR + +;UPDATE VALUE CELL +PARUP1: HLRZ B,(A) ;SET RH OF B TO TYPE + MOVE C,1(A) ;SET C TO VALUE + PUSHJ P,VALUPD ;UPDATE THIS VALUE + ADDI A,2 ;MOVE ON TO NEXT PAIR + JRST PARUPD ;AND CONTINUE + + ;VECTOR SPACE UPDATE +;GETS VECTOP IN A +;UPDATES ALL VALUE CELLS IN MARKED VECTORS +;ESCAPES WHEN IT GETS TO VECBOT + +VECUPD: SUBI A,1 ;MAKE A POINT TO LAST DOPE WD +VECUP1: CAMG A,VECBOT ;ANY MORE VECTORS TO PROCESS? + JRST ENHACK ;PROCESS ALL ENTRY BLOCKS NOW + SKIPGE B,(A) ;IS DOPE WORD MARKED? + JRST VECUP2 ;YES -- GO PROCESS VALUES IN THIS VECTOR + HLLZS -1(A) ;MAKE SURE NO GROWTH ATTEMPTS + HLRZS B ;NO -- SET RH OF B TO SIZE OF VECTOR +VECUP5: SUB A,B ;SET A TO POINT TO DOPE WD OF NEXT VECTOR + JRST VECUP1 ;AND CONTINUE + +VECUP2: PUSH P,A ;SAVE DOPE WORD POINTER + HLRZ B,(A) ;GET LENGTH OF THIS VECTOR +VECU11: ANDI B,377777 ;TURN OFF MARK BIT + SKIPGE E,-1(A) ;CHECK FOR UNIFORM OR SPECIAL + TLNE E,377777 ;SKIP IF GENERAL + JRST VECUP6 ;UNIFORM OR SPECIAL, GO DO IT +VECU10: SUB A,B ;SET AC A TO NEXT DOPE WORD + ADDI A,1 ;AND ADVANCE TO FIRST ELEMENT OF THIS VECTOR +VECUP3: HLRZ B,(A) ;GET TYPE + TRNE B,400000 ;IF MARK BIT SET + JRST VECUP4 ;DONE WITH THIS VECTOR + CAIN B,TENTRY ;SPECIAL HACK FOR ENTRY + JRST ENTRUP + CAIE B,TBVL ;VECTOR BINDING? + CAIN B,TBIND ;AND BINDING BLOCK + JRST BINDUP +VECU15: MOVE C,1(A) ;GET VALUE + PUSHJ P,VALUPD ;UPDATE THIS VALUE +VECU12: ADDI A,2 ;GO ON TO NEXT VECTOR + JRST VECUP3 ;AND CONTINUE + +VECUP4: POP P,A ;SET TO OLD DOPE WORD + ANDCAM D,(A) ;TURN OFF MARK BIT + HLRZ B,(A) ;GET LENGTH + JRST VECUP5 ;GO ON TO NEXT VECTOR + + +; ENTRY PART OF THE STACK UPDATER + +ENTRUP: ADDI A,FRAMLN-2 ;POINT PAST FRAME + JRST VECU12 ;NOW REJOIN VECTOR UPDATE + +; UPDATE A BINDING BLOCK + +BINDUP: HRRZ C,(A) ;POINT TO CHAIN + JUMPE C,NONEXT ;JUMP IF NO NEXT BINDING IN CHAIN + ADD C,@(P) ;ADD RELOCATION OF SELF + HRRM C,(A) ;AND STORE IT BACK +NONEXT: CAIE B,TBIND ;SKIP IF VAR BINDING + JRST VECU14 ;NO, MUST BE A VECTOR BIND + MOVEI B,TATOM ;UPDATE ATOM POINTER + PUSHJ P,VALPD1 + ADDI A,2 + HLRZ B,(A) ;TYPE OF VALUE + PUSHJ P,VALPD1 + ADDI A,2 ;POINT TO LOCATIVE POINTER + HLRZ B,(A) ;GET TYPE + PUSHJ P,VALPD1 + JRST VECU12 + +VECU14: MOVEI B,TVEC ;NOW TREAT LIKE A VECTOR + JRST VECU15 + +; NOW SAFE TO UPDATE ALL ENTRY BLOCKS + +ENHACK: HRRZ F,TBSTO(LPVP) ;GET POINTER TO TOP FRAME + HLLZS TBSTO(LPVP) ;CLEAR FIELD + JUMPE F,LSTFRM ;FINISHED + +ENHCK1: MOVEI A,OTBSAV-1(F) ;POINT PRIOR TO SAVED TB + HRRZ F,1(A) ;POINT TO PRIOR FRAME + MOVEI B,TTB ;MARK SAVED TB + PUSHJ P,VALPD1 + MOVEI B,TAB ;MARK ARG POINTER + PUSHJ P,[AOJA A,VALPD1] + MOVEI B,TSP ;SAVED SP + PUSHJ P,[AOJA A,VALPD1] + MOVEI B,TPDL ;SAVED P STACK + PUSHJ P,[AOJA A,VALPD1] + MOVEI B,TTP ;SAVED TP + PUSHJ P,[AOJA A,VALPD1] + MOVEI B,TPP + PUSHJ P,[AOJA A,VALPD1] ;MARK THE PP + JUMPN F,ENHCK1 ;MARK NEXT ONE IF IT EXISTS + +LSTFRM: HRRZ A,PROCID(LPVP) ;NEXT PROCESS + HLLZS PROCID(LPVP) ;CLOBBER + MOVEI LPVP,(A) + JUMPN LPVP,ENHACK ;DO NEXT PROCESS + POPJ P, ;ALL DONE + +; UPDATE ELEMENTS IN UNIFROM AND SPECIAL VECTORS + +VECUP6: JUMPL E,VECUP7 ;JUMP IF SPECIAL + HLRZS E ;ISOLATE TYPE + EXCH E,B ;TYPE TO B AND LENGTH TO E + SUBI A,(E) ;POINT TO NEXT DOPE WORD + LSH B,1 ;FIND SAT + HRRZ B,@TYPNT + MOVE B,UPDTBS(B) ;FIND WHERE POINTS + CAIN B,CPOPJ ;UNMARKED? + JRST VECUP4 ;YES, GO ON TO NEXT VECTOR + PUSH P,B ;SAVE SR POINTER + SUBI E,2 ;DON'T COUNT DOPE WORDS + +VECUP8: SKIPE C,1(A) ;GET GOODIE + PUSHJ P,@(P) ;CALL UPDATE ROUTINE + ADDI A,1 + SOJG E,VECUP8 ;LOOP FOR ALL ELEMNTS + + SUB P,[1,,1] ;REMOVE RANDOMNESS + JRST VECUP4 + +; SPECIAL VECTOR UPDATE + +VECUP7: HLRZS E ;ISOLATE SPECIAL TYPE + CAIN E,SATOM+400000 ;ATOM? + JRST ATOMUP ;YES, GO DO IT + CAIN E,STPSTK+400000 ;STACK + JRST VECU10 ;TREAT LIKE A VECTOR + CAIN E,SPVP+400000 ;PROCESS VECTOR + JRST PVPUP ;DO SPECIAL STUFF + CAIN E,SASOC+400000 + JRST ASOUP ;UPDATE ASSOCIATION BLOCK + + MOVEI B,[ASCIZ /VECTOR UPDATE, ENCOUNTERED FUNNY SPECIAL VECTOR +/] + PUSHJ P,MSGTYP + .VALUE + +; UPDATE ATOM VALUE CELLS + +ATOMUP: SUBI A,-1(B) ; POINT TO VALUE CELL + HLRZ B,(A) + HRRZ 0,(A) ;GOBBLE PROCID + JUMPN 0,.+3 ;NOT GLOBAL + CAIN B,TLOCI ;IS IT A LOCATIVE? + MOVEI B,TVEC ;MARK AS A VECTOR + PUSHJ P,VALPD1 ;UPDATE IT + JRST VECUP4 + +; UPDATE PROCESS VECTOR + +PVPUP: SUBI A,-1(B) ;POINT TO TOP + HRRM LPVP,PROCID(A) ;CHAIN ALL PROCESSES TOGETHER + MOVEI LPVP,(A) + HRRZ 0,TBSTO+1(A) ;POINT TO CURRENT FRAME + HRRM 0,TBSTO(A) ;SAVE + JRST VECUP3 + + +;THIS SUBROUTINE TAKES CARE OF UPDATING ASSOCIATION BLOCKS + +ASOUP: SUBI A,-1(B) ;POINT TO START OF BLOCK + HRRZ B,ASOLNT-1(A) ;POINT TO NEXT + JUMPE B,ASOUP1 + HRRE C,ASOLNT+1(B) ;AND GET ITS RELOC IN C + ADDM C,ASOLNT-1(A) ;C NOW HAS UPDATED PONTER +ASOUP1: HLRZ B,ASOLNT-1(A) ;GET PREV BLOCK POINTER + JUMPE B,ASOUP2 + HRLZ F,ASOLNT+1(B) ;AND ITS RELOCATION + ADDM F,ASOLNT-1(A) ;RELOCATE +ASOUP2: HRRZ B,NODPNT(A) ;UPDATE NODE CHAIN + JUMPE B,ASOUP4 + HRRE C,ASOLNT+1(B) ;GET RELOC + ADDM C,NODPNT(A) ;ANID UPDATE +ASOUP4: HLRZ B,NODPNT(A) ;GET PREV POINTER + JUMPE B,ASOUP5 + HRLZ F,ASOLNT+1(B) ;RELOC + ADDM F,NODPNT(A) +ASOUP5: HRLI A,-3 ;SET TO UPDATE OTHER CONTENTS + +ASOUP3: HLRZ B,(A) ;GET TYPE + PUSHJ P,VALPD1 ;UPDATE + ADD A,[1,,2] ;MOVE POINTER + JUMPL A,ASOUP3 + JRST VECUP4 ;AND QUIT + + ;VALUPD UPDATES A SINLE VALUE FROM EITHER PAIR SPACE OR VECTOR SPACE +;GETS POINTER TO TYPE CELL IN RH OF A +;TYPE IN RH OF B (LH MUST BE 0) +;VALUE IN C + +VALPD1: MOVE C,1(A) ;GET VALUE TO UPDATE +VALUPD: TRNN C,-1 ;ANY POINTER PART? + JRST CPOPJ ;NO, LEAVE + LSH B,1 ;SET TYPE TIMES 2 + HRRZ B,@TYPNT ;GET STORAGE ALLOCATION TYPE + JRST @UPDTBS(B) ;AND DISPATCH THROUGH STORAGE ALLOCATION DISPATCH TABLE + +;SAT DISPATCH TABLE + +DISTBS UPDTBS,CPOPJ,[[S2WORD,2WDUP],[S2DEFR,2WDUP],[SNWORD,NWRDUP],[STPSTK,STCKUP] +[SFRAME,FRAMUP],[STBASE,TBUP],[SARGS,ARGUP],[SBYTE,BYTUP],[SATOM,NWRDUP],[SPSTK,STCKUP] +[SLOCID,LOCUP],[SPVP,NWRDUP],[S2NWORD,NWRDUP],[SABASE,ABUP],[SCHSTR,BYTUP],[SASOC,ASUP]] + + + + +;PAIR POINTER UPDATE +2WDUP: TRNN C,-1 ;POINT TO NIL? + POPJ P, ;YES -- NO UPDATE NEEDED + SKIPGE B,(C) ;NO -- IS THIS A BROKEN HEART + HRRM B,1(A) ;YESS -- STORE NEW VALUE + SKIPE B,PARNEW ;IF LIST SPACE IS MOVING + ADDM B,1(A) ;THEN ADD OFFSET TO VALUE + POPJ P, ;FINISHED + + +; HERE TO UPDATE ASSOCIATIONS + +ASUP: HRLI C,-ASOLNT ;MAKE INTO VECTOR POINTER + JRST NWRDUP + ;VECTOR, ATOM, STACK, AND BASE POINTER UPDATE + +LOCUP: HRRZ B,(A) ;CHECK IF IT IS TIMED + JUMPN B,LOCUP1 ;JUMP IF TIMED, OTHERWISE TREAT LIKE VECTORE + +NWRDUP: HLRE B,C ;EXTEND COUNT IN B + SUBI C,-1(B) ;SET C TO POINT TO DOPE WORD + HRRE B,(C) ;EXTEND RELOCATION IN B + ADDM B,1(A) ;AND ADD RELOCATION TO STORED DATUM + HRRZ C,-1(C) ;GET GROWTH SPECS + JUMPE C,CPOPJ ;NO GROWTH, LEAVE + LDB C,[111100,,C] ;GET UPWORD GROWTH + TRZN C,400 ;FLUSH SIGN AN NEGATR DIRECTION + MOVNS C + ASH C,6+18. ;TO LH AND TIMES 100(8) + ADDM C,1(A) ;UPDATE POINTER + POPJ P, + + +LOCUP1: HRRZ B,2(C) ;GET TIME FROM STACK + HRRM B,(A) ;AND USE IT + +STCKUP: MOVSI B,PDLBUF ;GET OFFSET FOR PDLS + ADDM B,1(A) ;AND ADD TO COUNT + JRST NWRDUP ;NOW TREAT LIKE VECTOR + +BYTUP: HRRZ C,(A) ;SET C TO POINT TO DOPE WD + HRRE B,(C) ;SET B TO RELOCATION FOR THIS VEC + ADDM B,(A) ;UPDATE DOPE WD POINTER + ADDM B,1(A) ;AND UPDATE VALUE + POPJ P, ;DONE WITH UPDATE + +ARGUP: TLOA TYPNT,400000 ;FLAG AS AN ARGS POINTER +ABUP: TLZ TYPNT,400000 ;FLAG AS NOT ARGS POINTER + HLRE B,C ;GET LENGTH + SUB C,B ;POINT TO FRAME + HLRZ B,(C) ;GET TYPE OF NEXT GOODIE + CAIE B,TENTRY ;IS IT A FRAME + HRRZ C,1(C) ;NO, POINT TO FRAME + CAIN B,TENTRY ;IF IT IS A FRAME + ADDI C,FRAMLN ;POINT TO ITS BASE + TLZN TYPNT,400000 ;SKIP IF ARGS BLOCK + JRST TBUP ;NO, JUST AN AB + HLRZ B,OTBSAV(C) ;GET TIME + HRRM B,(A) ;AND CLOBBER IT AWAY +TBUP: MOVE C,TPSAV(C) ;GET A ASTACK POINTER TO FIND DOPE WORD + HLRE B,C ;UPDATE BASED ON THIS POINTER + SUBI C,(B) + HRRE B,1(C) ;GET RELOCATION + ADDM B,1(A) ;AND MUNG POINTER + POPJ P, + +FRAMUP: HRRZ B,(A) ;GET PROCESS POINTER + HRRE B,(B) ;GET ITS RELOCATION + ADDM B,(A) + HLLZ B,OTBSAV(C) ;GET FRAMES TIME + HLLM B,1(A) ;AND STORE IN FRAME POINTER + JRST TBUP ;AND CONTINUE UPDATING + +;VECTOR SHRINKING PHASE + +VECSH: SUBI A,1 ;POOINT TO 1ST DOPE WORD +VECSH1: CAMGE A,VECBOT ;FINISHED + POPJ P, ;YES, QUIT + HRRZ B,-1(A) ;GET A SPEC + JUMPE B,NXTSHN ;IGNORE IF NONE + PUSHJ P,GETGRO ;GET THE SPECS + JUMPGE C,SHRNBT ;SHRINKIGN AT BOTTOM + MOVEI E,(A) ;COPY POINTER + ADD A,C ;POINT TO NEW DOPE LOCATION WITH E + MOVE F,-1(E) ;GET OLD DOPE + ANDCMI F,777000 ;KILL THIS SPEC + MOVEM F,-1(A) ;STORE + MOVE F,(E) ;OTHER DOPE WORD + HRLZI C,(C) ;TO LH + ADD F,C ;CHANGE LENGTH + MOVEM F,(A) ;AND STORE + MOVMS C ;PLUSIFY + HLLZM C,(E) ;AND STORE + SETZM -1(E) +SHRNBT: JUMPGE B,NXTSHN ;GROWTH, IGNOORE + MOVM E,B ;GET A POSITIVE COPY + HRLZI B,(B) ;TO LH + ADDM B,(A) ;ADD INTO DOPE WORD + MOVEI 0,777 ;SET TO CLOBBER GROWTH + ANDCAM 0,-1(A) ;CLOBBER + HLRZ B,(A) ;GET NEW LENGTH + SUBI A,(B) ;POINT TO LOW END + HRLZM E,(A) ;STORE + SETZM -1(A) + +NXTSHN: HLRZ B,(A) ;GET LENGTH + JUMPE B,VCMLOS ;LOOSE + SUBI A,(B) ;STEP + JRST VECSH1 + +GETGRO: LDB C,[111100,,B] ;GET UPWARD GROWTH + TRZE C,400 ;CHECK AND MUNG SIGN + MOVNS C + ASH C,6 ;?IMES 100 + ANDI B,777 ;AND GET DOWN GROWTH + TRZE B,400 ;CHECK AND MUNG SIGN + MOVNS B + ASH B,6 + POPJ P, + ;VECMOV -- MOVES VECTOR DATA TO WHERE RELOC FIELDS OF +;VECTORS INDICATE. MOVES DOPEWDS UP FOR VECTORS GROWING AT +;THE END. +;CALLED WITH VECTOP IN A. CALLS PARMOV TO MOVE PAIRS + +VECMOV: SUBI A,1 ;SET A TO ADDR OF TOP DOPE WD + MOVSI D,400000 ;NEGATIVE D MARKS END OF BACK CHAIN + MOVEI TYPNT,0 ;CLEAR ON GOING ADDRESS FOR FORWARD RESUME +VECMO1: CAMGE A,VECBOT ;GOT TO BOTTOM OF VECTORS + JRST PARMOV ;YES, MOVE LIST ELEMENTS AND RETURN + MOVEI C,(A) ;NO, COPY ADDR OF THIS DOPEWD + HRRE B,(A) ;GET RELOCATION OF THIS VECTOR + JUMPL B,VECMO5 ;IF MOVING DOWNWARD, MAKE BACK CHAIN + JUMPE B,VECMO4 ;IF NON MOVER, JUST ADJUST DOPW AND MOVE ON + + ADDI C,(B) ;SET ADDR OF LAST DESTINATION WD + HRLI B,A ;MAKE B INDEX ON A + HLL A,(A) ;COUNT TO A LEFT HALF + + POP A,@B ;MOVE A WORD + TLNE A,-1 ;REACHED END OF MOVING + JRST .-2 ;NO, REPEAT + ;YES, NOTE A HAS ADDR OF NEXT DOPEWD +;HERE TO ADJUST LOCATION OF DOPEWDS FOR GROWTH (FORWARDLY) +VECMO2: LDB B,[111100,,-1(C)] ;GET HIGH GROWTH FIELD + JUMPE B,VECMO3 ;IF NO GROWTH, DONT MOVE + ASH B,6 ;EXPRESS GROWTH IN WORDS + HRLI C,2 ;SET COUNT FOR POPPING 2 DOPEWDS + HRLI B,C ;MAKE B INDEX ON C + POP C,@B ;MOVE PRIME DOPEWD + POP C,@B ;MOVE AUX DOPEWD +VECMO3: JUMPL D,VECMO1 ;IF NO BACK CHAIN THEN MOVE ON + JRST VECMO6 ;YES, BACKCHAINING, CONTINUE SAME + +;HERE TO SKIP OVER STILL VECTORS (FORWARDLY) +VECMO4: HLRZ B,(A) ;GET SIZE OF UNMOVER + SUBI A,(B) ;UPDATE A TO NEXT VECTOR + JRST VECMO2 ;AND GO CLEAN UP GROWTH + ;HERE TO ESTABLISH A BACKWARDS CHAIN +VECMO5: EXCH D,(A) ;CHAIN FORWARD + HLRZ B,D ;GET SIZE + SUBI A,(B) ;GO ON TO NEXT VECOTR + CAMGE A,VECBOT ;HAVE WE GOT TO END OF VECTORS? + JRST VECMO7 ;YES, GO MOVE PAIRS AND UNCHAIN + HRRE B,(A) ;GET RELOCATION OF THIS VECTOR + JUMPLE B,VECMO5 ;IF NOT POSITIVE, CONTINUE CHAINING + MOVEM A,TYPNT ;SAVE ADDR FOR FORWARD RESUME + +;HERE TO UNCHAIN A VECTOR, MOVE IT, AND ADJUST DOPEWDS +VECMO6: HLRZ B,D ;GET SIZE + MOVEI F,1(A) ;GET A COPY OF BEGINNING OF VECTOR + ADDI A,(B) ;SET TO POINT TO ADDR OF DOPEWD CURRENTLY IN D + EXCH D,(A) ;AND UNCHAIN + HRRE B,(A) ;GET RELOCATION FOR THIS VECTOR + MOVEI C,(A) ;COPY A POINTER TO DOPEW + SKIPGE D ;HAVE WE REACHED THE TOP OF THE CHAIN? + MOVE A,TYPNT ;YES, RESTORE FORWARD MOVE RESUME ADDR + JUMPE B,VECMO2 ;IF STILL VECTOR,GO ADJUST DOPEWDS + ADDI C,(B) ;MAKE C POINT TO NEW DOPEW ADDR + ADDI B,(F) ;B RH NEW 1ST WORD + HRLI B,(F) ;B LH OLD 1ST WD ADDR + BLT B,(C) ;COPY THE DATA + JRST VECMO2 ;AND GO ADJUST DOPEWDS + +;HERE TO STOP CHAINING BECAUSE OF BOTTOM OF VECTOR SPACE +VECMO7: MOVEM A,TYPNT + PUSH P,D + PUSHJ P,PARMOV + POP P,D + MOVE A,TYPNT + JRST VECMO6 + ;PAIR MOVEMENT PHASE -- USES PARNEW,PARBOT, AND PARTOP TO MOVE PAIRS +;TO NEW HOMES + +PARMOV: SKIPN A,PARNEW ;IS THERE ANY PAIR MOVEMENT? + POPJ P, ;NO, RETURN + JUMPL A,PARMO2 ;YES -- IF MOVING DOWNWARDS, GO DO A BLT + HRLI A,B ;MOVING UPWARDS SETAC A TO INDEX OFF AC B + MOVE B,PARTOP ;GET HIGH PAIR ADDREESS + SUB B,PARBOT ;AND SUBTRACT BOTTOM TO GET NUMBER OF PAIRS + HRLZS B ;PUT COUNT IN LEFT HALF + HRR B,PARTOP ;GET HIGH ADDRESS PLUS ONE IN RH + SUBI B,1 ;AND SUBTRACT ONE TO POINT TO LAST WORD TO BE MOVED + +PARMO1: TLNN B,-1 ;HAS COUNT REACHED ZERO? + JRST PARMO3 ;YES -- FINISH UP + POP B,@A ;NO -- TRANSFER2YU NEXT WORD + JRST PARMO1 ;AND REPEAT + +PARMO2: MOVE B,PARBOT ;GET ADDRESS OF FIRST SOURCE WD + HRLS B ;IN BOTH HALVES OF AC B + ADD B,A ;MAKE RH OF B POINT TO FIRST DESTINATION WORD + ADD A,PARTOP ;MAKE RH OF A POINT TO LAST DESTINATION WORD PLUS ONE + BLT B,-1(A) ;AND TRANSFER THE BLOCK OF PAIRS + +PARMO3: MOVE A,PARNEW ;GET OFFSET FOR PAIR SPACE + ADDM A,PARBOT ;AND CORRECT BOTTOM + ADDM A,PARTOP ;AND CORRECT TOP. + SETZM PARNEW ;CLEAR SO IF CALLED TWICE, NO LOSSAGE + POPJ P, + ;VECZER -- CLEARS DATA IN AREAS JUST GROWN +;UPDATES SIZE OF VECTORS +;CLEARS RELOCATION AND GROWTH FIELDS IN DOPEWDS +;CALLED WITH NEW VECTOP IN A (VECBOT SHOULD BE NEW TOO) + +VECZER: SUBI A,1 ;MAKE A POINT TO HIGH VECTORS +VECZE1: CAMGE A,VECBOT ;REACHED BOTTOM OF VECTORS? + POPJ P, ;YES, RETURN + HLLZS F,(A) ;NO, CLEAR RELOCATION GET SIZE + HLRZS F ;AND PUT SIZE IN RH OF F + HRRZ B,-1(A) ;GET GROWTH INTO B + JUMPN B,VECZE3 ;IF THERE IS SOME GROWTH, GO DO IT +VECZE2: SUBI A,(F) ;GROWTH DONE, MOVE ON TO NEXT VECTOR + JRST VECZE1 ;AND REPEAT + +VECZE3: HLLZS -1(A) ;CLEAR GROWTH IN THE VECTOR + LDB C,[111100,,B] ;GET HIGH ORDER GROWTH IN C + ANDI B,777 ;AND LIMIT B TO LOW SIDE + ASHC B,6 ;EXPRESS GROWTH IN WORDS + JUMPE C,VECZE4 ;IF NO HIGH GROWTH SKIP TO LOW GROWTH + ADDI F,(C) ;ADD HIGH GROWTH TO SIZE + SUBM A,C ;GET ADDR OF 2ND WD TO BE ZEROED + SETZM -1(C) ;CLEAR 1ST WORD + HRLI C,-1(C) ;MAKE C A CLEARING BLT POINTER + BLT C,-2(A) ;AND CLEAR HIGH END DATA + VECZE4: JUMPE B,VECZE5 ;IF NO LOW GROWTH SKIP TO SIZE UPDATE + MOVNI C,(F) ;GET NEGATIVE SIZE SO FAR + ADDI C,(A) ;AND MAKE C POINT TO LAST WORD OF STUFF TO BE CLEARED + ADDI F,(B) ;UPDATE SIZE + SUBM C,B ;MAKE B POINT TO LAST WD OF NEXT VECT + ADDI B,2 ;AND NOW TO 2ND DATA WD TO BE CLEARED + SETZM -1(B) ;CLEAR 1ST DATA WD + HRLI B,-1(B) ;MAKE B A CLEARING BLT POINTER + BLT B,(C) ;AND CLEAR THE LOW DATA + VECZE5: HRLZM F,(A) ;STORE THE NEW SIZE IN DOPEWD + JRST VECZE2 + +;SUBROUTINE TO REBUILD THE NOW DEFUNCT HASH TABLE + +REHASH: MOVE TVP,TVPSTO+1(PVP) ;RESTORE TV POINTER + MOVE D,ASOVEC+1(TVP) ;GET POINTER TO VECTOR + MOVEI E,(D) + PUSH P,E ;PUSH A POINTER + HLRE A,D ;GET -LENGTH + MOVMS A ;AND PLUSIFY + PUSH P,A ;PUSH IT ALSO + +REH3: HRRZ C,(D) ;POINT TO FIRST BUCKKET + HLRZS (D) ;MAKE SURE NEW POINTER IS IN RH + JUMPE C,REH1 ;BUCKET EMPTY, QUIT + +REH2: MOVEI E,(C) ;MAKE A COPY OF THE POINTER + MOVE A,ITEM(C) ;START HASHING + XOR A,ITEM+1(C) + XOR A,INDIC(C) + XOR A,INDIC+1(C) + MOVMS A ;MAKE SURE FINAL HASH IS + + IDIV A,(P) ;DIVIDE BY TOTAL LENGTH + ADD B,-1(P) ;POINT TO WINNING BUCKET + + MOVE C,[002200,,(B)] ;BYTE POINTER TO RH + CAILE B,(D) ;IF PAST CURRENT POINT + MOVE C,[222200,,(B)] ;USE LH + LDB A,C ;GET OLD VALUE + DPB E,C ;STORE NEW VALUE + HRRZ B,ASOLNT-1(E) ;GET NEXT POINTER + HRRZM A,ASOLNT-1(E) ;AND CLOBBER IN NEW NEXT + SKIPE A ;SKKIP IF NOTHING PREVIOUSLY IN BUCKET + HRLM E,ASOLNT-1(A) ;OTHERWISE CLOBBER + SKIPE C,B ;SKIP IF END OF CHAIN + JRST REH2 +REH1: AOBJN D,REH3 + + SUB P,[2,,2] ;FLUSH THE JUNK + POPJ P, + VCMLOS: MOVEI B,[ASCIZ /AGC -- VECTOR WITH ZERO IN DOPE WORD LENGTH +/] + PUSHJ P,MSGTYP + .VALUE +;LOCAL VARIABLES + +GETNUM: 0 ;NO OF WORDS TO GET +PARNUM: 0 ;NO OF PAIRS MARKED +VECNUM: 0 ;NO OF WORDS IN MARKED VECTORS +CORSET: 0 ;NO OF BLOCKS OF CORE, IF GIVING CORE AWAY +CORTOP: 0 ;CURRENT TOP OF CORE, EXCLUDING ANY TO BE GIVEN AWAY + +;VARIABLES WHICH DETERMIN WHEN MUDDLE WILL ASK FOR MORE CORE, +;AND WHEN IT WILL GET UNHAPPY + +SYSMAX: 50. ;MAXIMUM SIZE OF MUDDLE +FREMIN: 1000 ;MINIMUM FREE WORDS +FREDIF: 10000 ;DIFFERENCE BETWEEN FREMIN AND MAXIMUM NUMBER OF FREE WORDS +;POINTER TO GROWING PDL + +TPGROW: 0 ;POINTS TO A BLOWN TP +PPGROW: 0 ;POINTS TO A BLOWN PP +TIMOUT: 0 ;POINTS TO TIMED OUT PDL +PGROW: 0 ;POINTS TO A BLOWN P + +;IN GC FLAG + +GCFLG: 0 + + +END +  \ No newline at end of file diff --git a/MUDDLE/arith.58 b/MUDDLE/arith.58 new file mode 100644 index 0000000..1e1e933 --- /dev/null +++ b/MUDDLE/arith.58 @@ -0,0 +1,626 @@ +TITLE ARITHMETIC PRIMITIVES FOR MUDDLE + +;BKD + +;DEFINES MUDDLE PRIMITIVES: FIX,FLOAT,ATAN,IEXP,LOG, +; G?,L?,0?,1?,+,-,*,/,MAX,MIN,ABS,SIN,COS,SQRT,RANDOM, +; TIME,SORT. + +RELOCATABLE + +.INSRT MUDDLE > + +O=0 + + +DEFINE TYP1 + (AB) TERMIN +DEFINE VAL1 + (AB)+1 TERMIN + +DEFINE TYP2 + (AB)+2 TERMIN +DEFINE VAL2 + (AB)+3 TERMIN + +DEFINE TYP3 + (AB)+4 TERMIN +DEFINE VAL3 + (AB)+5 TERMIN + +DEFINE TYPN + (D) TERMIN +DEFINE VALN + (D)+1 TERMIN + + +YES: MOVSI A,TATOM ;RETURN PATH FOR 'TRUE' + MOVE B,MQUOTE T + JRST FINIS + +NO: MOVSI A,TFALSE ;RETURN PATH FOR 'FALSE' + MOVEI B,NIL + JRST FINIS + + ;ERROR RETURNS AND OTHER UTILITY ROUTINES + +OVRFLW==10 +OVRFLD: PUSH TP,$TATOM + PUSH TP,MQUOTE OVERFLOW + JRST CALER1 + +ARGCHK: ;CHECK FOR SINGLE FIXED OR FLOATING + ;ARGUMENT IF FIXED CONVERT TO FLOATING + ;RETURN FLOATING ARGRUMENT IN B ALWAYS + ENTRY 1 + HLRZ C,TYP1 + MOVE B,VAL1 + CAIN C,TFLOAT ;FLOATING? + POPJ P, ;YES, RETURN + CAIE C,TFIX ;FIXED? + JRST WTYP ;NO, ERROR + JSP A,BFLOAT ;YES, CONVERT TO FLOATING AND RETURN + POPJ P, + +OUTRNG: PUSH TP,$TATOM + PUSH TP,MQUOTE ARGUMENT-OUT-OF-RANGE + JRST CALER1 + +NSQRT: PUSH TP,$TATOM + PUSH TP,MQUOTE NEGATIVE-ARGUMENT + JRST CALER1" + +WTYP: PUSH TP,$TATOM + PUSH TP,MQUOTE WRONG-TYPE + JRST CALER1 + +DEFINE MFLOAT AC + IDIVI AC, 400000 + FSC AC+1,233 + FSC AC,254 + FADR AC,AC+1 + TERMIN + +BFLOAT: MFLOAT B + JRST (A) + +OFLOAT: MFLOAT O + JRST (C) + +BFIX: MULI B,400 + TSC B,B + ASH C,(B)-243 + MOVE B,C + JRST (A) + + ;DISPATCH TABLES USED TO CONTROL THE FLOW OF THE VARIOUS PRIMITIVES + +TABLE2: NO ;TABLE2 (0) +TABLE3: YES ;TABLE2 (1) & TABLE3 (0) + NO ;TABLE2 (2) + + +FUNC: JSP A,BFIX + JSP A,BFLOAT + SUB B,VALN + IDIV B,VALN + ADD B,VALN + IMUL B,VALN + JSP C,SWITCH + JSP C,SWITCH + +FLFUNC==.-2 + FSBR B,O + FDVR B,O + FADR B,O + FMPR B,O + JSP C,FLSWCH + JSP C,FLSWCH + ;PRIMITIVES FLOAT AND FIX + +MFUNCTION FIX,SUBR + MOVEI E,0 + JRST TRANS + +MFUNCTION FLOAT,SUBR + MOVEI E,1 + +TRANS: ENTRY 1 + MOVE A,TYP1 + MOVE B,VAL1 + CAMN A,TYPS(E)+1 ;SAME TYPE ARGUMENT? + JRST FINIS + CAME A,TYPS(E) ;correct type argument ? + JRST WTYP + XCT FUNC(E) ;perform appropriate operation + MOVE A,TYPS(E)+1 ;save this new type +JRST FINIS + +TYPS: TFLOAT,,0 + TFIX,,0 + TFLOAT,,0 + +MFUNCTION ABS,SUBR + ENTRY 1 + MOVE A,TYP1 + CAME A,$TFIX + CAMN A,$TFLOAT + JRST MOVIT + JRST WTYP +MOVIT: MOVM B,VAL1 ;GET ABSOLUTE VALUE OF ARGUMENT + JRST FINIS + +MFUNCTION MOD,SUBR + ENTRY 2 + MOVSI A,TFIX + CAME A,TYP1 ;FIRST ARG FIXED ? + JRST WTYP + CAME A,TYP2 ;SECOND ARG FIXED ? + JRST WTYP + MOVE B,VAL1 + IDIV B,VAL2 ;FORM QUOTIENT & REMAINDER + JUMPGE C,.+2 ;Only return positive remainders + ADD C,VAL2 + MOVE B,C ;RETURN REMAINDER + JRST FINIS + ;PRIMITIVES PLUS, DIFFERENCE, TIMES, DIVIDE, MIN, AND MAX + +MFUNCTION MIN,SUBR + MOVEI E,6 + JRST GOPT + + MFUNCTION MAX,SUBR + MOVEI E,7 +GOPT: ENTRY + MOVE D,AB ;ARGUMENT POINTER + JUMPL D,MINMAX ;ANY ARGUMENTS AT ALL ? + MOVSI A,TFLOAT ;DEFAULT TYPE + MOVE B,INFIN(E) ;DEFAULT VALUE + OR - "LARGE NUMBER" + JRST FINIS +INFIN==.-6 + 377777,,-1 + 400000,,1 + +MFUNCTION DIVIDE,SUBR,[/] + MOVEI E,3 + JRST ARITH0 + +MFUNCTION DIFFERENCE,SUBR,[-] + MOVEI E,2 + JRST ARITH0 + +MFUNCTION TIMES,SUBR,[*] + MOVEI E,5 + JRST ARITH0 + +MFUNCTION PLUS,SUBR,[+] + MOVEI E,4 + +ARITH0: ENTRY + MOVE D,AB ;argument pointer + CAMGE D,[-2,,0] ;LESS THAN TWO ARGUMENTS ? + JRST MINMAX + MOVSI A,TFIX ;initial type of result + MOVE B,E ;initial accumulator contents for zero & one argument + TRZ B,-2 + JRST MINMAX+3 +MINMAX: MOVE A,TYP1 + MOVE B,VAL1 ;initial value of accumulator for more than one argument is first value + ADD D,[2,,2] ;UPDATE ARGUMENT POINTER + JUMPGE D,FINIS ;ANY MORE ARGUMENTS ? + JFCL OVRFLW,.+1 + CAME A,$TFIX ;WAS THE FIRST ARGUMENT FIXED ? + JRST ARITH3 +ARITH1: CAME A,TYPN ;next argument fixed ? + JRST ARITH2 + XCT FUNC(E) ;PERFORM APPROPRIATE OPERATION + ADD D,[2,,2] ;UPDATE ARGUMENT POINTER + JUMPL D,ARITH1 ;repeat for next argument if any + JFCL OVRFLW,OVRFLD + JRST FINIS + ;CONTINUATION OF PLUS,TIMES, ETC. + +ARITH3: CAME A,$TFLOAT ;was the first argument floating ? + JRST WTYP + SKIPA + +ARITH2: JSP A,BFLOAT ;float accumulator contents + MOVE C,TYPN ;get next argument's type + MOVE O,VALN ;get next argument's value + CAMN C,$TFLOAT ;floating ? + JRST OPERATE + CAME C,$TFIX ;fixed ? + JRST WTYP + JSP C,OFLOAT ;go float this fixed argument +OPERATE: XCT FLFUNC(E) ;perform appropriate operation + ADD D,[2,,2] ;UPDATE ARGUMENT POINTER + JUMPL D,ARITH2+1 ;repeat for next argument if any + JFCL OVRFLW,OVRFLD + MOVSI A,TFLOAT + JRST FINIS + +SWITCH: XCT COMPAR(E) ;FOR MAX & MIN TESTING + MOVE B,VALN + JRST (C) +COMPAR==.-6 + CAMLE B,VALN + CAMGE B,VALN + +FLSWCH: XCT FLCMPR(E) + MOVE B,O + JRST (C) +FLCMPR==.-6 + CAMLE B,O + CAMGE B,O + ;PRIMITIVES ONEP AND ZEROP + +MFUNCTION ONEP,SUBR,[1?] + MOVEI E,1 + JRST JOIN + +MFUNCTION ZEROP,SUBR,[0?] + MOVEI E, + +JOIN: ENTRY 1 + MOVE A,TYP1 + CAMN A,$TFIX ;fixed ? + JRST TESTFX + CAME A,$TFLOAT ;floating ? + JRST WTYP + MOVE B,VAL1 + CAMN B,NUMBR(E) ;equal to correct value ? + JRST YES + JRST NO + +TESTFX: CAMN E,VAL1 ;equal to correct value ? + JRST YES + JRST NO + +NUMBR: 0 ;FLOATING PT ZERO + 201400,,0 ;FLOATING PT ONE + ;PRIMITIVES LESSP AND GREATERP + + +MFUNCTION LESSP,SUBR,[L?] + MOVEI E,1 + JRST ARGS + +MFUNCTION GREATERP,SUBR,[G?] + MOVEI E,0 + +ARGS: ENTRY 2 + MOVE O,VAL1 + MOVE A,TYP1 + MOVE B,VAL2 + SETO D, ;used for flow of control in this routine + CAMN A,$TFLOAT + AOJA D,CONT + CAME A,$TFIX + JUMPL D,WTYP +CONT: MOVE A,TYP2 + CAMN A,$TFIX + AOJE D,FIXFIX ;are both arguments fixed + CAME A,$TFLOAT + JRST FLTFIX + JUMPE D,FLTFLT ;are both arguments floating ? + JSP C,OFLOAT ;go float the first argument +FLTFLT: FSBR O,B ;both arguments are floating here +TEST: JUMPL O,@TABLE2(E) + JUMPG O,@TABLE3(E) + JRST NO + +FLTFIX: JUMPLE D,WTYP + JSP A,BFLOAT ;go float the second argument + JRST FLTFLT + +FIXFIX: SUB O,B ;both arguments are fixed here + JRST TEST + +MFUNCTION RANDOM,SUBR + ENTRY + HLRE A,AB + CAMGE A,[-4] ;At most two arguments to random to set seeds + JRST WNA + JRST RANDGO(A) + MOVE B,VAL2 ;Set second seed + MOVEM B,RLOW + MOVE A,VAL1 ;Set first seed + MOVEM A,RHI +RANDGO: MOVE B,RLOW ;FREDKIN'S RANDOM NUMBER GENERATOR. + MOVE A,RHI + MOVEM A,RLOW + LSHC A,-43 + XORB B,RHI + MOVSI A,TFIX + JRST FINIS +RHI: 267762113337 +RLOW: 155256071112 + MFUNCTION SQRT,SUBR + ENTRY 1 + MOVE B,1(AB) + HLRZ A,(AB) + CAIN A,TFLOAT + JRST SQ1 + CAIE A,TFIX + JRST WTYP + JSP A,BFLOAT +SQ1: JUMPL B,NSQRT + + MOVE A,B + ASH B,-1 + FSC B,100 +SQ2: MOVE C,B ;NEWTON'S METHOD, SPECINER'S HACK. + FDVRM A,B + FADRM C,B + FSC B,-1 + CAME C,B + JRST SQ2 + MOVSI A,TFLOAT + JRST FINIS + + +MFUNCTION COS,SUBR + ENTRY 1 + MOVE B,1(AB) + HLRZ A,(AB) + CAIN A,TFLOAT + JRST COS1 + CAIE A,TFIX + JRST WTYP + JSP A,BFLOAT +COS1: FADR B,[1.570796326] ;COS(X)=SIN (X+PI/2) + PUSHJ P,.SIN + MOVSI A,TFLOAT + JRST FINIS + +MFUNCTION SIN,SUBR + ENTRY 1 + MOVE B,1(AB) + HLRZ A,(AB) + CAIN A,TFLOAT + JRST SIN1 + CAIE A,TFIX + JRST WTYP + JSP A,BFLOAT +SIN1: PUSHJ P,.SIN + MOVSI A,TFLOAT + JRST FINIS + +.SIN: MOVM A,B + CAMG A,[.0001] + POPJ P, ;GOSPER'S RECURSIVE SIN. + FDVR B,[-3.0] ;SIN(X)=4*SIN(X/-3)**3-3*SIN(X/-3) + PUSHJ P,.SIN + FSC A,1 + FMPR A,A + FADR A,[-3.0] + FMPRB A,B + POPJ P, +MFUNCTION LOG,SUBR + PUSHJ P,ARGCHK ;LEAVES ARGUMENT IN B + JUMPLE B,OUTRNG + LDB D,[331100,,B] ;GRAB EXPONENT + SUBI D,201 ;REMOVE BIAS + TLZ B,777000 ;SET EXPONENT + TLO B,201000 ; TO 1 + MOVE A,B + FSBR A,RT2 + FADR B,RT2 + FDVB A,B + FMPR B,B + MOVE C,[0.434259751] + FMPR C,B + FADR C,[0.576584342] + FMPR C,B + FADR C,[0.961800762] + FMPR C,B + FADR C,[2.88539007] + FMPR C,A + FADR C,[0.5] + + MOVE B,D + FSC B,233 + FADR B,C + FMPR B,[0.693147180] ;LOG E OF 2 + MOVSI A,TFLOAT + JRST FINIS +RT2: 1.41421356 + MFUNCTION ATAN,SUBR + PUSHJ P,ARGCHK + MOVM D,B + CAMG D,[0.4^-8] ;SMALL ENOUGH SO ATAN(X)=X? + JRST ATAN3 ;YES + CAML D,[7.0^7] ;LARGE ENOUGH SO THAT ATAN(X)=PI/2? + JRST ATAN1 ;YES + MOVN C,[1.0] + CAMLE D,[1.0] ;IS ABS(X)<1.0? + FDVM C,D ;NO,SCALE IT DOWN + MOVE B,D + FMPR B,B + MOVE C,[1.44863154] + FADR C,B + MOVE A,[-0.264768620] + FDVM A,C + FADR C,B + FADR C,[3.31633543] + MOVE A,[-7.10676005] + FDVM A,C + FADR C,B + FADR C,[6.76213924] + MOVE B,[3.70925626] + FDVR B,C + FADR B,[0.174655439] + FMPR B,D ; + JUMPG D,ATAN2 ;WAS ARG SCALED? + FADR B,PI2 ;YES, ATAN(X)=PI/2-ATAN(1/X) + JRST ATAN2 +ATAN1: MOVE B,PI2 +ATAN2: SKIPGE 1(AB) ;WAS INPUT NEGATIVE? + MOVNS B ;YES,COMPLEMENT +ATAN3: MOVSI A,TFLOAT + JRST FINIS +PI2: 1.57079632 + MFUNCTION IEXP,SUBR,[EXP] + PUSHJ P,ARGCHK ;LEAVE FLOATING POINT ARG IN B + MOVM A,B + SETZM B + FMPR A,[0.434294481] ;LOG BASE 10 OF E + MOVE D,[1.0] + CAMG A,D + JRST RATEX + MULI A,400 + ASHC B,-243(A) + CAILE B,43 + JRST OUTRNG + CAILE B,7 + JRST EXPR2 +EXPR1: FMPR D,FLOAP1(B) + LDB A,[103300,,C] + SKIPE A + TLO A,177000 + FADR A,A +RATEX: MOVEI B,7 + SETZM C +RATEY: FADR C,COEF2-1(B) + FMPR C,A + SOJN B,RATEY + FADR C,[1.0] + FMPR C,C + FMPR D,C + MOVE B,[1.0] + SKIPL 1(AB) ;SKIP IF INPUT NEGATIVE + SKIPN B,D + FDVR B,D + MOVSI A,TFLOAT + JRST FINIS +EXPR2: LDB E,[030300,,B] + ANDI B,7 + MOVE D,FLOAP1(E) + FMPR D,D ;TO THE 8TH POWER + FMPR D,D + FMPR D,D + JRST EXPR1 + +COEF2: 1.15129278 + 0.662730884 + 0.254393575 + 0.0729517367 + 0.0174211199 + 2.55491796^-3 + 9.3264267^-4 + +FLOAP1: 1.0 + 10.0 + 100.0 + 1000.0 + 10000.0 + 100000.0 + 1000000.0 + 10000000.0 + ;routine to sort lists or vectors of either fixed point or floating numbers +;the components are interchanged repeatedly to acheive the sort +;first arg: the structure to be sorted +;if no second arg sort in descending order +;second arg: if false then sort in ascending order +; else sort in descending order + +MFUNCTION SORT,SUBR + ENTRY + HLRZ A,AB + CAIGE A,-4 ;Only two arguments allowed + JRST WNA + MOVE O,DESCEND ;Set up "O" to test for descending order as default condition + CAIE A,-4 ;Optional second argument? + JRST .+4 + HLRZ B,TYP2 ;See if it is other than false + CAIN B,TFALSE + MOVE O,ASCEND ;Set up "O" to test for ascending order + HLRZ A,TYP1 ;CHECK TYPE OF FIRST ARGUMENT + CAIN A,TLIST + JRST LSORT + CAIN A,TVEC + JRST VSORT + JRST WTYP + + + + +GOBACK: MOVE A,TYP1 ;RETURN THE SORTED ARGUMENT AS VALUE + MOVE B,VAL1 + JRST FINIS + +DESCEND: CAMG C,(A)+1 +ASCEND: CAML C,(A)+1 + ;ROUTINE TO SORT LISTS IN NUMERICAL ORDER + +LSORT: MOVE A,VAL1 + JUMPE A,GOBACK ;EMPTY LIST? + HLRZ B,(A) ;TYPE OF FIRST COMPONENT + CAIE B,TFIX + CAIN B,TFLOAT + SKIPA + JRST WTYP + MOVEI E,0 ;FOR COUNT OF LENGTH OF LIST +LCOUNT: JUMPE A,LLSORT ;REACHED END OF LIST? + MOVE A,(A) ;NEXT COMPONENT + TLZ A,(B) ;SAME TYPE AS FIRST COMPONENT? + TLNE A,-1 + JRST WTYP + AOJA E,LCOUNT ;INCREMENT COUNT AND CONTINUE + +LLSORT: SOJE E,GOBACK ;FINISHED WITH SORTING? + HRRZ A,VAL1 ;START THIS LOOP OF SORTING AT THE BEGINNING + MOVEM E,(P)+1 ;Save the iteration depth +CLSORT: HRRZ B,(A) ;NEXT COMPONENT + MOVE C,(B)+1 ;ITS VALUE + XCT O ;ARE THESE TWO COMPONENTS IN ORDER? + JRST .+4 + MOVE D,(A)+1 ;INTERCHANGE THEM + MOVEM D,(B)+1 + MOVEM C,(A)+1 + MOVE A,B ;MAKE THE COMPONENT IN "B" THE CURRENT ONE + SOJG E,CLSORT + MOVE E,(P)+1 ;Restore the iteration depth + JRST LLSORT + ;ROUTINE TO SORT VECTORS IN NUMERICAL ORDER + +VSORT: HLRE D,VAL1 ;GET COUNT FIELD OF VECTOR + IDIV D,[-2] ;LENGTH + JUMPE D,GOBACK ;EMPTY VECTOR? + MOVE E,D ;SAVE LENGTH IN "E" + HRRZ A,VAL1 ;POINTER TO VECTOR + MOVE B,(A) ;TYPE OF FIRST COMPONENT + CAME B,$TFIX + CAMN B,$TFLOAT + SKIPA + JRST WTYP + SOJLE D,GOBACK ;IF ONLY ONE COMPONENT THEN FINISHED +VCOUNT: ADDI A,2 ;CHECK NEXT COMPONENT + CAME B,(A) ;SAME TYPE AS FIRST COMPONENT? + JRST WTYP + SOJG D,VCOUNT ;CONTINUE WITH NEXT COMPONENT + +VVSORT: SOJE E,GOBACK ;FINISHED SORTING? + HRRZ A,VAL1 ;START THIS LOOP OF SORTING AT THE BEGINNING + MOVEM E,(P)+1 ;Save the iteration depth +CVSORT: MOVE C,(A)+3 ;VALUE OF NEXT COMPONENT + XCT O ;ARE THESE TWO COMPONENTS IN ORDER? + JRST .+4 + MOVE D,(A)+1 ;INTERCHANGE THEM + MOVEM D,(A)+3 + MOVEM C,(A)+1 + ADDI A,2 ;UPDATE THE CURRENT COMPONENT + SOJG E,CVSORT + MOVE E,(P)+1 ;Restore the iteration depth + JRST VVSORT + + +MFUNCTION TIME,SUBR + ENTRY 0 + .RDTIME B, ;Get time since SYSTEM up + MOVSI A,TFIX + JRST FINIS + + +END +  \ No newline at end of file diff --git a/MUDDLE/atomhk.27 b/MUDDLE/atomhk.27 new file mode 100644 index 0000000000000000000000000000000000000000..4e5f9ef0fa45b784daafd576d12e1fbda23203f4 GIT binary patch literal 9080 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 SQ}NKN<;ceQPx$YzKm8kw1X*+d literal 0 HcmV?d00001 diff --git a/MUDDLE/book.3 b/MUDDLE/book.3 new file mode 100644 index 0000000..5ade565 --- /dev/null +++ b/MUDDLE/book.3 @@ -0,0 +1,481 @@ +V ORG P-K4 V KP P-K4 V 2W1 N-KB3 V 2B1 N-KB3 V 3W1 P-Q4 V 3B1 NXP +V 4W1 B-Q3 V 4B1 P-Q4 V 5W1 NXP V 5B1 B-Q3 V 6W1 O-O V 6B1 O-O +V 7W1 N-Q2 B-KB4 R-K1 BXN PXB B-N3 N-B3 E Q-K2 R-K1 E E E E E E +P-QB4 BXN PXB NXBP E E E E E NXN BXN N-Q2 NXN E E E E +N-KB3 QN-B3 N-B3 P-B3 E E N-K5 P-B4 L 7W1 P-QB4 BXN PXB +N-QB3 P-B4 B-B4 P-KN4 PXP E E E E B-KB4 B-K3 E E +PXP QXP Q-B3 B-B4 QXB QXB N-B3 N-B4 +QXQ NXQ L 7W1 N-QB3 NXN PXN N-Q2 P-KB4 +P-QB4 E E R-K1 Q-R5 P-N3 Q-R6 B-B1 Q-B4 N-N4 N-N3 +N-K3 Q-B3 B-Q3 P-KR3 N-N4 BXN QXB QR-K1 +L 7W1 R-K1 BXN PXB N-QB3 B-KB4 N-B4 N-B3 N-N5 +B-KB1 P-Q5 N-K4 NXN L 7W1 P-KB3 N-B4 L 6B1 +N-QB3 NXN PXN P-QB4 O-O P-B5 B-K2 N-B3 L 6B1 +BXN PXB N-B4 N-B3 L 6W1 Q-K2 BXN PXB N-B4 +L 6W1 N-QB3 NXN PXN O-O O-O N-Q2 P-KB4 P-QB4 L 5B1 B-K3 +Q-K2 N-Q3 O-O B-K2 R-K1 O-O NXP E E Q-B1 N-QB3 O-O Q-R5 P-KB4 +N-K2 E E E E E E N-Q2 B-KB4 NXN BXN O-O N-Q2 B-B3 +Q-R5 P-KN3 Q-R6 BXB PXB N-B4 BXN BXB N-B3 +P-KB3 N-Q4 PXP RXP L 5B1 N-QB3 NXN PXN Q-K2 +V 7B10 P-KB4 P-KB3 B-Q3 O-O O-O +PXN BPXP RXR QXR BXKP PXB Q-QB4 E E E E E E E E +Q-K2 PXN BPXP Q-R5 P-N3 Q-R6 PXB B-N5 Q-K5 B-B6 +L 7B10 Q-K2 O-O V 8B10 N-Q3 R-K1 QXQ RXQ +K-Q1 N-Q2 B-KB4 N-N3 BXB PXB L 8B10 P-N3 +BXN PXB R-K1 P-KB4 P-KB3 E E E E QXB Q-Q2 L 5B1 N-Q2 +Q-K2 NXN BXN E E Q-K2 BXN PXB B-B4 NXN BXN +P-KB3 B-N3 P-KB4 N-B3 P-B3 O-O-O B-K3 P-Q5 E E +Q-KN4 K-N1 B-N5 N-N5 P-B5 N-B7 K-B1 QXP B-KB4 Q-K5 + L 5B1 B-K2 O-O O-O +P-QB4 B-K3 N-QB3 N-KB3 P-B5 E E E E N-KB3 N-QB3 PXP BXBP E E E E +P-QB3 PXP PXP BXN PXB N-QB3 L 5W1 PXP N-B4 O-O B-K2 +N-B3 P-QB3 N-K2 NXB QXN P-B3 E E E E +N-Q4 NXB QXN O-O P-B4 P-B3 B-Q2 N-R3 L 4W1 PXP P-Q4 QN-Q2 +N-B4 N-N3 NXN RPXN N-B3 P-R3 B-K2 L 3B1 +P-Q3 N-B3 E E P-Q4 PXQP PXP B-QN5 P-B3 PXP Q-R4 N-B3 PXP NXP PXB +Q-B3 E E E E E E PXP B-QB4 Q-K2 B-K2 P-B4 P-B3 L 3B1 PXP P-K5 +N-K5 QXP P-Q4 PXG NXQP B-Q3 N-B3 Q-KB4 V 8B2 Q-K2 B-K3 P-KN3 +N-B3 B-K3 O-O B-N2 KR-K1 O-O QB-B5 L 8B2 P-KN3 O-O B-N2 N-B3 +O-O B-K3 B-K3 B-QB5 P-N3 B-R3 N-K2 QR-Q1 L 3W1 B-B4 NXP N-B3 +NXN QPXN P-QB3 NXP P-Q4 O-O B-Q3 R-K1 B-K3 B-Q3 N-Q2 +L 3W1 N-B3 B-N5 V 4W2 B-B4 N-B3 N-Q5 NXP Q-K2 +N-B3 NXKP O-O E E E E E E O-O +O-O N-Q5 NXN BXN P-Q3 P-B3 B-R4 E E E E E E +P-Q3 BXN PXB P-Q4 PXP NXP Q-K1 N-N3 E E B-Q2 B-N5 +R-K1 Q-Q3 Q-K2 QR-K1 E E R-N1 N-N3 B-QN5 QR-K1 BXN PXB +P-B4 BXN QXB NXP L 4W2 NXP O-O N-Q3 BXN QPXB NXP +B-K2 P-Q3 E E E E E E N-B3 BXN QPXB NXP B-Q3 P-Q4 +P-KR3 N-QB3 E E E E E E E E P-Q3 P-Q4 P-QR3 BXN +PXB R-K1 P-KB4 PXP E E E E E E E E B-K2 +R-K1 N-Q3 BXN QPXB NXP O-O P-Q4 B-B4 N-QB3 P-B3 +N-B3 Q-Q2 B-B4 E E E E E E B-K3 N-Q2 N-B4 QN-B3 +P-B4 PXP E E E E E E N-B4 P-QB3 B-K3 N-Q3 B-Q3 B-B4 +L 3W1 NXP P-Q3 V 4W3 N-KB3 NXP V 5W2 P-Q4 P-Q4 B-Q3 B-K2 V 7W2 +P-B4 B-QN5 QN-Q2 BXN BXB O-O O-O B-N5 B-B4 N-QB3 R-K1 +NXQP BXN PXB QXN PXN QXQ KRXQ BXP R-Q7 L 7W2 O-O N-QB3 V 8W2 P-B4 +N-N5 B-K2 PXP BXP O-O E E E E PXP NXB QXN QXP R-K1 B-KB4 +N-K5 P-KR3 E E N-B3 NXN QXN P-QB3 B-Q2 B-K3 +R-K5 Q-B5 Q-K3 Q-B7 E E E E E E R-K5 Q-Q2 P-Q5 +O-O PXP PXP L 8W2 R-K1 B-KN5 V 9W2 BXN PXB RXP BXN PXB P-KB4 E E +QXB NXP Q-Q3 N-K3 L 9W2 P-B3 P-B4 P-B4 B-R5 V 11WA P-KN3 + B-B3 PXP NXQP BXN O-O E E Q-R4 Q-Q2 QXQ KXQ +NXN BXN BXN QR-K1 L 11WA B-K3 O-O PXP N-N5 N-B3 BXN PXB +N-N4 E E E E P-Q6 NXB QXN BXN PXB NXQP E E E E E E E E +P-KN3 P-KB5 PXBP NXBP BXN BXB KXB RXP QN-Q2 Q-R5 K-N1 BXN NXB +Q-N5 K-B2 QR-KB1 R-K3 NXP B-K2 Q-R5 K-N2 R-KN5 K-R1 Q-B7 + L 11WA R-B1 PXP BXP Q-B3 +V 13WA Q-K1 O-O-O NXB QXN P-B3 QXQ RXQ NXP PXB N-QB7 +R-B1 NXR N-R3 N-Q7 BXN RXB RXN PXP L 13WA B-K2 O-O-O B-K3 P-B5 NXB +BXB QXB QXN P-KN3 Q-R6 BXP KR-K1 L 13WA N-B3 O-O-O N-Q5 +BXN NXQ BXQ NXN NXP L 11WA PXP BXBP K-B1 BXR PXN BXN V 14WA +PXB QXP Q-K2 O-O-O PXP K-N1 KXB KR-K1 PXN RXP BXR Q-N8 Q-B1 +R-Q8 L 14WA QXQB QXP PXP R-Q1 B-QN5 P-B3 BXP K-K2 BXN PXB +B-N5 K-K1 Q-K3 R-KB1 L 11WA BXN QPXB P-Q5 N-K4 Q-R4 + P-QN4 QXNP P-B3 PXP NXN PXN KBXP KXB +Q-R5 K-B1 O-O PXB Q-R6 L 11WA R-K2 NXQP NXN BXP E E E +E E E P-KR3 B-R4 P-B4 B-R5 L 9W2 +P-B4 N-B3 N-B3 PXP E E PXP QXP N-B3 BXN NXQ BXQ NXB NXN RXB O-O-O +B-QB4 N/B3-Q4 L 5W2 Q-K2 Q-K2 P-Q3 N-KB3 +V 7W5 N-B3 QXQ BXQ P-KN3 O-O B-N2 E E B-K3 P-B3 O-O B-N2 +E E B-Q4 B-N2 E E B-B4 P-Q4 E E O-O-O B-N2 KR-K1 O-O +E E E E E E N-QN5 N-R3 E E B-N5 B-N2 O-O-O P-B3 KR-K1 O-O +L 7W5 B-N5 QN-Q2 QXQ BXQ N-B3 P-B3 O-O-O O-O E E E E E E N-B3 QXQ BXQ +P-KR3 B-R4 P-KN4 B-N3 B-N2 E E E E BXN NXB N-QN5 K-Q1 E E E E +B-Q2 P-KN3 O-O-O B-N2 E E E E B-B4 P-KN3 O-O-O B-N2 P-KR3 +N-N3 L 5W2 N-B3 NXN QPXN B-K2 B-Q3 N-B3 B-KB4 B-N5 P-KR3 B-R4 +P-KN4 B-N3 L 5W2 P-Q3 N-KB3 P-Q4 B-K2 L 5W2 P-B4 B-K2 P-Q4 O-O +B-Q3 P-Q4 O-O N-QB3 L 4W3 N-B4 NXP V 5W3 N-B3 NXN NPXN P-KN3 +B-K2 B-N2 O-O O-O P-Q4 N-Q2 N-K3 N-N3 P-QB4 B-K3 P-QB3 P-KB4 +L 5W3 P-Q3 N-KB3 P-Q4 B-K2 B-Q3 O-O O-O N-B3 P-QB3 R-K1 B-N5 +P-Q4 N-K3 N-K5 BXB NXB + + L 2B1 N-QB3 B-N5 V 3B2 P-QR3 B-R4 V 4B7 N-B3 O-O V 5B8 NXP P-Q4 +P-QN4 B-N3 P-Q4 PXP V 8BJ B-K3 P-QB3 V 9B4 B-K2 QN-Q2 V 10BH O-O Q-K2 V 11B2 +NXN QXN Q-Q2 Q-Q3 E E N-QR4 B-B2 V 13B1 N-B5 Q-Q3 P-KN3 N-Q4 NXKP Q-KN3 +B-Q3 P-KB4 N-B5 NXB PXN BXP PXB QXNP K-R1 Q-R6 L 11B2 N-QR4 B-B2 +NXN QXN T 13B1 L 11B2 B-KB4 R-Q1 N-B4 N-Q4 NXN PXN B-Q6 Q-N4 NXB +NXN B-B7 B-R6 B-N3 B-K3 L 11B2 N-B4 N-Q4 NXN PXN NXB NXN QR-B1 B-Q2 +E E E E E E NXB N/Q2XN NXN PXN QR-B1 B-Q2 E E E E Q-Q2 NXN QXN B-K3 +P-KB3 PXP BXP B-Q4 E E E E B-KB4 KR-Q1 KR-Q1 P-KB3 B-KB1 Q-KB2 +P-QR4 QR-B1 P-R5 N-Q4 Q-Q2 P-KN4 E E E E E E E E E E Q-KN3 P-KB3 P-QB3 +KR-K1 KR-K1 Q-KB2 P-KB3 PXP BXP B-Q4 BXB PXB +L 10BH N-B4 B-B2 P-Q5 N-K4 E E O-O N-Q4 Q-Q2 P-KB4 E E +NXKP Q-R5 N-N3 P-KB4 B-Q2 P-B5 N-R1 P-B6 +L 9B4 B-QB4 QN-Q2 O-O B-B2 V 11BH NXN QXN V 12BH R-K1 Q-B4 P-N3 N-N5 B-KB1 +Q-N3 B-N2 P-KB4 L 12BH B-K2 Q-Q3 P-N3 B-R6 R-K1 Q-K3 Q-Q2 +Q-B4 QR-Q1 QR-Q1 L 12BH N-K2 P-QN4 B-N3 N-N5 B-KB4 BXB NXB Q-Q3 P-KN3 Q-KR3 P-KR4 R-Q1 +L 12BH P-KB3 P-QN4 B-N3 Q-Q3 P-N3 B-R6 R-B2 PXP B-KB4 Q-Q2 BXB QXB +L 11BH B-B4 N-N3 B-QN3 KN-Q4 E E B-KN5 NXB NXN R-K1 R-K1 +B-K3 N-K3 Q-Q3 P-KN3 B-R6 E E E E E E B-R4 B-N5 BXN QXB QXB QXQP +E E E E Q-Q2 B-K3 N-K3 BXRP KXB N-N5 +NXN QXB E E K-N3 P-KN4 NXN PXB K-R3 P-KR4 E E K-B4 Q-Q3 N-K5 P-KB3 +L 11BH NXKBP RXN P-B3 PXP QXP N-B1 BXR KXB +N-K4 B-K3 E E E E E E BXR KXB QXP K-N1 QR-K1 N-B1 N-K4 B-K3 +NXN QXN QXQ PXQ B-R6 K-B2 E E RXP B-B2 QR-KB1 B-QB5 QR-B3 R-K1 +E E E E B-R6 N-N3 P-N3 P-QR4 L 11BH P-KB4 N-N3 V 12BM B-R2 KN-Q4 NXN NXN +BXN PXB V 15B1 P-B5 P-B3 N-N4 P-KR4 N-B2 BXBP QXP Q-Q2 E E E E E E +N-N6 PXN PXP Q-Q3 Q-R5 QXRP QXQ BXQ KXB B-Q2 E E E E E E +B-B4 QXB RXQ BXR Q-R5 B-R3 QXQP K-R1 QXKP B-Q2 V 23B1 QXNP B-B4 +P-QB4 B-K6 K-R1 BXQP QR-Q1 QR-Q1 P-B5 BXNP E E E E E E E E P-Q5 +BXNP P-Q6 QR-Q1 Q-QB7 B-K6 K-R1 B-N3 E E E E +P-Q7 R-B2 R-Q1 B-B4 QXRP KRXP RXR RXR Q-R8 K-R2 P-B4 R-Q5 L 23B1 +P-QB4 B-B3 P-Q5 QR-K1 Q-B3 B-R5 E E Q-Q3 B-Q2 L 12BM B-N3 KN-Q4 NXN NXN +BXN PXB T 15B1 L 9B4 N-B4 B-B2 B-N5 R-K1 V 11BJ P-Q5 P-KR3 B-R4 P-K6 +NXKP B-K4 Q-Q2 PXP E E E E PXKP PXP BXN QXB NXQP Q-R5 P-N3 BXP +PXB QXR N-B7 B-R6 Q-K2 N-B3 L 11BJ N-K3 P-QR4 N-R4 PXP PXP Q-Q3 P-QB3 N-Q4 +L 11BJ Q-Q2 QN-Q2 P-Q5 N-K4 NXN BXN PXP Q-B2 L 11BJ B-K2 QN-Q2 V 12BJ O-O +N-N3 N-K3 Q-Q3 P-N3 QN-Q4 E E E E N-K5 B-B4 P-KB4 PXG NXP/KB3 Q-Q3 +N-K5 BXBP QXB QXQP E E E E E E E E E E Q-Q2 NXN BXQN Q-Q3 P-N3 B-KN5 B-K2 BXB +L 12BJ Q-Q2 N-B1 R-Q1 N-K3 B-R4 N-B5 N-K3 P-QR4 E E E E +BXN QXB NXKP Q-KN3 N-N3 N-B5 E E E E E E O-O NXB QXN B-K3 L 12BJ +P-Q5 N-N3 PXP NXN BXQN B-K4 Q-Q2 Q-N3 BXN PXB E E E E E E E E P-Q6 B-N1 +NXN PXN B-KB4 B-K3 Q-Q4 N-Q4 NXN PXN B-QN5 R-KB1 Q-K5 Q-B1 O-O R-Q1 +E E E E E E E E E E O-O N-Q4 NXN PXN B-QN5 R-KB1 P-QB4 BXQP PXP +B-KB4 BXB QXB Q-Q4 L 8BJ N-K2 P-QR4 R-QN1 PXP PXP N-Q4 N-QB4 B-KN5 Q-Q2 +N-QB3 P-QB3 BXN BXB P-KB4 +L 5B8 B-K2 BXN NPXB P-Q4 E E QPXB P-Q3 V 7BF B-Q3 QN-Q2 O-O N-B4 E E E E +B-KN5 P-KR3 BXN QXB O-O N-Q2 N-Q2 N-B4 E E E E Q-Q3 N-Q2 O-O-O N-B4 +E E Q-K3 N-B4 E E E E E E B-R4 P-KN4 B-N3 NXP E E NXNP PXN BXP +K-R2 Q-Q3 R-KN1 Q-N3 R-N3 B-R5 NXB E E Q-R4 K-N2 B-R5 Q-R1 BXR QXQ BXQ PXB +L 7BF N-Q2 QN-Q2 V 8BF P-QB4 N-B4 V 9BF B-B3 P-QN3 O-O B-N2 R-K1 +V 12WF P-KR3 P-QN4 N-K3 N-N3 P-QR4 B-Q2 P-R5 E E PXP PXP P-QR4 +Q-Q2 B-Q2 B-B3 E E P-B5 B-B3 PXP PXP B-Q2 BXRP NXP N-Q5 N-N3 +BXN RXR RXR PXB R-R6 R-K3 Q-R2 R-B3 Q-R3 P-KR3 R-R8 R-B1 RXR BXR Q-R8 +K-R2 Q-QN8 P-QN4 NXKP L 9BF +P-KB3 N-R4 O-O V 11WF P-KB4 PXP BXP R-B2 N-B5 E E P-KN4 +N-B5 PXB Q-KN4 K-B2 N-R6 K-K1 Q-R5 R-B2 QXR +L 8BF O-O N-B4 V 9BG B-B3 P-QN3 R-K1 B-N2 P-QB4 T 12WF +E E P-QB4 B-N2 R-K1 T 12WF L 9BG P-B3 N-R4 V 10BF P-QB4 +T 11WF L 10BF R-B2 N-B5 E E P-KN3 B-R6 R-B2 P-KB4 PXP RXP P-KN4 +N-B5 PXR Q-N4 K-R1 B-N7 K-N1 N-R6 L 10BF N-B4 N-B5 BXN PXB +R-K1 B-K3 P-K5 P-Q4 N-R5 P-QB3 E E E E Q-Q4 N-Q2 QR-Q1 Q-N4 K-R1 P-QN3 R-KN1 +QR-K1 P-KN3 P-KB3 Q-Q2 PXP QXQ PXQ PXP R-B3 +L 3B2 P-KB4 N-B3 V 4B3 N-B3 PXP B-B4 O-O O-O NXP V 7B4 N-Q5 +V 8W3 N-B3 P-B3 NXN BXN B-R4 P-Q4 N-K2 B-N3 P-Q4 BXBP +B-B4 N-R4 B-K5 Q-R5 N-N3 L 7B4 NXN P-Q4 BXP QXB P-Q3 B-Q3 P-B4 +Q-K3 KN-N5 Q-R3 NXB QXN/Q3 BXP Q-Q5 K-R1 B-B4 L 4B3 N-Q5 NXP +N-KB3 PXP B-B4 O-O O-O T 8W3 L 4B3 PXP QNXP P-Q4 N-N3 B-Q3 NXP +BXN BXN PXB Q-R5 E E E E E E B-KN5 P-KR3 BXN QXB N-B3 O-O B-K2 +Q-K2 B-Q3 P-Q4 P-K5 P-QB4 BXN PXB O-O BXN PXB P-B5 E E E E E E +E E E E E E B-Q3 N-R5 NXN QXN P-KN3 Q-B3 P-QR3 B-R4 L 3B2 B-B4 +P-B3 V 4B4 N-B3 P-Q4 V 5B3 PXP P-K5 N-Q4 O-O E E N-K5 O-O +PXP Q-Q5 PXP BXP BXP K-R1 P-KB4 PXG NXBP Q-N5 +E E E E E E E E E E O-O PXP B-N3 P-Q5 E E E E P-Q4 PXG O-O +PXBP QXP PXP R-Q1 Q-B2 E E E E Q-B3 BXN PXB PXP B-N3 R-K1 +B-KB4 N-B3 KR-K1 NXN BXN B-N5 BXN RXR RXR QXB QXB QXQBP R-QB1 +Q-Q7 L 5B3 B-N3 NXP NXN PXN NXP Q-N4 BXP K-Q1 Q-R5 QXNP R-B1 +P-QN4 P-KB3 P-K6 E E Q-R4 K-B2 B-R5 B-KR6 B-K2 N-Q2 NXN KXN +L 4B4 KN-K2 O-O O-O P-Q4 PXP PXP B-N3 P-Q5 N-N1 P-Q6 +E E E E E E E E B-N3 P-Q4 PXP PXP P-Q4 PXP KNXP R-K1 B-K3 +B-N5 Q-Q3 QN-Q2 Q-N5 B-QR4 E E O-O N-B4 Q-N5 P-QR4 E E E E +P-KR3 N-K4 Q-N5 BXN NPXB Q-B2 PXB QXP K-K2 P-QR3 QXNP +QNXP N-B5 Q-K4 L 4B4 P-KB4 PXP P-K5 P-Q4 B-N3 B-N5 N-B3 N-K5 +O-O N-N4 L 3B2 N-B3 O-O V 4B5 B-B4 N-B3 O-O NXP E E P-Q3 P-Q4 PXP +NXP B-Q2 N-B5 O-O B-N5 BXN PXB N-Q5 B-Q3 L 4B5 B-K2 N-B3 P-Q3 +P-Q4 B-Q2 R-K1 L 4B5 P-Q3 P-Q4 B-Q2 N-B3 B-K2 R-K1 L 4B5 NXP +P-Q4 V 5B4 N-Q3 BXN QPXB PXP N-B4 QXQ KXQ N-B3 L 5B4 PXP R-K1 +L 5B4 P-QR3 BXN QPXB R-K1 N-B3 NXP B-K2 Q-K2 O-O NXQBP E E +B-K3 N-QB3 O-O NXKBP L 5B4 B-K2 Q-K2 P-KB4 PXP E E N-Q3 BXN +QPXB PXP N-B4 R-Q1 B-Q2 P-K6 PXP N-K5 B-Q3 Q-R5 E E E E E +E E E E E NPXB PXP N-B4 Q-K4 E E N-N2 N-B3 N-B4 N-Q4 B-R3 +Q-N4 BXR QXNP E E E E E E O-O N-Q4 B-B4 R-Q1 L 3B2 P-Q3 +P-Q4 PXP NXP E E B-Q2 N-B3 N-B3 O-O B-K2 R-K1 O-O BXN +BXB PXP PXP QXQ QRXQ NXP BXP NXB NXN N-Q3 P-KB4 P-KB3 B-B4 +NXB NXN B-N5 R-Q4 B-K7 L 3B2 N-Q5 +NXN PXN O-O P-QB3 B-R4 E E N-K2 P-QB3 N-B3 Q-R4 B-B4 N-R3 +O-O N-B2 R-K1 P-Q3 E E E E P-QR3 N-B2 N-R2 B-K2 P-QN4 Q-N3 +L 3B2 P-KN3 P-Q4 PXP NXP NXN QXN Q-B3 P-K5 Q-N3 Q-Q3 P-QB3 +B-QB4 Q-R4 N-B3 QXKP B-K3 P-Q4 NXP PXN B-QN5 L 3B2 KN-K2 +P-Q4 PXP NXP P-KN3 NXN NXN BXN QPXB QXQ KXQ B-KN5 B-K2 BXB KXB +N-B3 L 3B2 P-KN4 P-Q4 L 3B2 Q-B3 N-B3 L 3B2 P-B3 O-O KN-K2 +P-Q4 N-N3 P-QR3 B-K2 B-QB4 L 3B2 B-N5 P-B3 B-R4 N-R3 P-Q3 +N-B4 B-N3 P-Q4 + L 2B1 P-KB4 NXP PXP Q-R5 E E N-QB3 NXN E E Q-B3 N-B4 PXP N-B3 +V 5B5 Q-K3 P-Q3 PXP N-K3 PXP QXBP P-B3 B-Q3 E E E E E E N-KB3 +PXP B-N5 N-K3 NXP B-B4 NXN PXN BXP B-Q2 Q-KB3 QR-N1 L 5B5 +N-K2 N-K3 Q-K4 P-Q4 L 5B5 Q-KN3 P-Q3 PXP BXP QXP Q-R5 P-KN3 +Q-K5 B-K2 B-K4 Q-R6 QXR E E E E E E E E E E B-N5 PXP QXKP N-K3 +BXN PXB N-KB3 B-B4 P-Q3 O-O E E E E N-K2 B-B4 P-Q3 O-O B-K3 +Q-R5 K-Q2 BXB QXB P-QB4 + + L 2B1 P-Q4 PXP P-K5 Q-K2 N-KB3 P-Q3 +QXP KN-Q2 E E E E Q-K2 N-Q4 Q-K4 N-N5 B-Q3 P-Q4 Q-K2 P-QB4 + + L 2B1 P-Q3 P-Q4 V 3B3 N-Q2 B-QB4 KN-B3 N-N5 E E B-K2 PXP PXP Q-Q5 +E E NXP NXN PXN Q-R5 E E E E E E P-KR3 PXP PXP BXBP KXB NXKP K-B3 +Q-Q4 E E E E E E E E P-QB3 N-B3 B-K2 PXP PXP N-KN5 BXN Q-R5 +E E N-KR3 N-K6 PXN BXN PXB Q-R5 K-B1 BXP E E E E N-N3 Q-R5 P-N3 +Q-K2 E E K-B1 B-N3 PXB R-Q1 Q-K1 QXRP K-B2 R-Q3 B-B3 R-B3 N-Q2 +P-KN4 L 3B3 N-KB3 N-B3 QN-Q2 B-QB4 B-K2 PXP QNXP B-K2 O-O +N-Q4 E E E E PXP BXBP KXB N-KN5 K-N3 P-B4 PXP N-K6 Q-N1 +NXQBP R-N1 BXP E E E E E E E E K-N1 N-K6 Q-K1 NXBP Q-N3 +NXR QXNP R-B1 N-B4 Q-K2 B-R6 B-K3 L 3B3 P-KB4 KPXP P-K5 +N-N5 BXP N-QB3 N-KB3 P-B3 P-Q4 PXP + + L 2W1 N-QB3 N-KB3 V 3W2 P-KN3 P-Q4 PXP NXP B-N2 NXN NPXN B-Q3 +N-K2 O-O O-O N-B3 P-Q4 Q-B3 L 3W2 N-B3 B-N5 T 4W2 L 3W2 B-B4 +NXKP V 4W4 NXN P-Q4 E E BXP KXB NXN P-Q4 L 4W4 N-B3 NXN QPXN P-QB3 +NXP P-Q4 L 4W4 Q-R5 N-Q3 QXKP Q-K2 QXQ BXQ B-N3 N-B4 N-B3 P-QB3 +O-O P-Q4 E E E E E E E E E E B-N3 B-K2 V 6W2 QXKP O-O P-Q4 N-B3 +Q-B4 P-QN4 N-B3 B-N2 B-K3 N-R4 O-O-O P-N5 N-K2 N/Q3-B5 L 6W2 +N-B3 N-B3 NXP O-O N-Q5 N-Q5 O-O NXB RPXN N-K1 P-Q4 P-Q3 N-KB3 +B-K3 L 3W2 P-B4 P-Q4 PXQP NXP NXN QXN PXP N-B3 N-B3 B-KN5 B-K2 +NXP E E E E E E E E E E PXKP NXP P-Q3 NXN E E Q-B3 N-QB3 NXN +N-Q5 Q-B4 PXN E E E E E E N-B3 B-K2 P-Q4 B-QN5 Q-Q3 P-QB4 E E +B-Q2 N-QB3 B-Q3 NXB QXN B-N5 Q-B4 Q-Q2 + + L 2W1 B-B4 N-KB3 V 3W3 +N-QB3 NXP T 4W4 L 3W3 N-KB3 NXP N-B3 NXN QPXN P-QB3 NXP P-Q4 +L 3W3 P-B4 NXP P-Q3 N-Q3 B-N3 N-B3 L 3W3 P-Q3 P-B3 P-B4 PXP QBXP +P-Q4 PXP NXP E E E E E E Q-K2 B-K2 P-B4 P-Q4 KPXP KPXP BXP +O-O E E E E BPXP NXP E E E E E E N-KB3 P-Q4 PXP PXP B-QN5 B-Q2 +L 3W3 P-Q4 PXP N-KB3 P-Q4 PXP B-QN5 P-B3 Q-K2 + + L 2W1 P-KB4 PXP B-B4 P-Q4 BXP N-KB3 N-QB3 B-QN5 E E E E E E Q-B3 +N-QB3 P-B3 N-B3 P-Q4 P-Q4 E E E E E E N-QB3 Q-R5 K-K2 P-Q4 NXP B-Q3 +E E E E E E N-KB3 P-Q4 P-K5 P-KN4 P-KR3 N-KR3 P-Q4 N-B4 +E E E E E E PXP N-KB3 V 5WZ B-N5 P-B3 PXP NXP P-Q4 B-Q3 P-Q5 +NXP E E Q-K2 B-K3 N-K5 O-O BXN PXB BXP N-Q4 B-N3 P-B3 NXP BXB PXB Q-Q2 +N-R5 B-N5 L 5WZ B-B4 B-Q3 N-B3 O-O O-O QN-Q2 P-QR3 N-N3 B-R2 +B-KN5 P-Q4 Q-Q2 N-K2 QNXP P-B4 N-K6 L 5WZ B-K2 NXP N-B3 V 6BZ +NXN NPXN B-Q3 P-Q4 O-O O-O N-B3 P-B4 P-QN3 P-B3 B-KN5 N-K1 BXB QXB +L 5WZ P-B4 P-B3 PXP NXP P-Q4 B-KN5 E E E E P-Q4 B-QN5 N-B3 +O-O B-K2 PXP O-O PXP QBXP N-B3 L 5WZ N-B3 NXP B-K2 T 6BZ NXN QXN +P-Q4 N-B3 B-K2 B-KN5 BXP O-O-O P-B3 Q-K5 Q-Q2 BXN PXB Q-Q4 +R-KN1 P-KN3 P-N3 B-N2 + + L 2W1 P-Q4 PXP N-KB3 B-B4 NXP + N-KB3 N-QB3 P-Q4 P-K5 Q-K2 E E PXP O-O + E E E E E E E E P-QB3 PXP B-QB4 PXP BXNP P-Q4 +BXQP N-KB3 BXBP KXB QXQ B-QN5 Q-Q2 BXQ NXB P-B4 + + L KP P-QB4 N-KB3 V 2B2 P-Q3 P-Q4 N-KB3 N-B3 E E PXP NXP N-KB3 +N-QB3 V 5B6 P-KN3 B-K2 B-N2 O-O V 7B5 O-O B-K3 N-B3 +Q-Q2 V 9B3 N-KN5 BXN BXB N-Q5 R-B1 P-QB4 NXN BXN RXP BXB KXB +N-K3 RXP P-B3 E E E E E E E E B-K3 P-QN3 E E E E B-Q2 P-QB4 +N-K4 P-QN3 L 9B3 P-Q4 PXP NXP KR-Q1 NXB NXN QXQ NXKP E E E E +NXQN QXN NXN BXN BXB RXB L 7B5 N-B3 B-K3 O-O Q-Q2 T 9B3 L 5B6 +P-K4 B-QN5 E E P-K3 B-K2 B-K2 B-K3 E E N-B3 B-K3 E E P-QR3 +B-K3 L 5B6 N-B3 B-K2 P-K4 N-N3 E E P-K3 B-K3 L 5B6 P-QR3 B-K2 +P-K3 B-K3 E E N-B3 B-K3 E E P-K4 N-N3 V 7B7 B-K3 O-O QN-Q2 +P-QR4 R-B1 P-B3 E E B-K2 B-K3 O-O P-B3 V 11B4 Q-B2 N-Q5 +E E R-B1 R-B2 Q-B2 B-KB1 N-N3 R-Q2 N-B5 BXN L 11B4 N-N3 +P-R5 N-B5 BXN BXB R-B2 Q-B2 R-Q2 QR-B1 N-B1 P-R3 B-N6 Q-N1 N/QB1-R2 +N-Q2 B-K3 P-QN3 PXP NXP N-N4 L 7B7 B-K2 O-O V 8B4 O-O B-K3 V 9B6 +B-K3 V 10W4 P-B3 QN-Q2 P-QR4 T 11B4 E Q-B2 N-Q5 E E P-Q4 PXP NXP +NXN BXN P-QB4 E E E E E E P-QN4 P-QR4 P-N5 N-Q5 NXN PXN B-B4 P-R5 L 9B6 +QN-Q2 P-B3 P-QN4 P-QR4 P-N5 N-Q5 NXN QXN N-N3 Q-R5 E E QR-N1 KR-Q1 B-N2 Q-R5 +E E E E E E E E E E Q-B2 P-QR4 P-QN3 Q-Q2 B-N2 V 13W2 KR-Q1 +V 13B2 QR-B1 B-B1 E E KR-Q1 B-B1 E E B-B3 Q-K1 P-R3 Q-B1 Q-N2 B-QB4 KR-B1 +R-Q2 N-B1 N-B1 +N-N3 N/QB1-R2 P-QN4 PXP PXP BXNP BXB QXB QXQ NXQ R-R4 N/QN5-QB3 KR-R1 +P-QN3 P-Q4 PXP B-N5 NXB RXR K-B2 L 13B2 KR-B1 N-B1 B-B3 N/QB1-R2 +L 9B6 Q-B2 P-QR4 V 10B3 P-QN3 Q-Q2 V 11B5 B-N2 P-B3 QN-Q2 T 13W2 B-B3 KR-Q1 +Q-N2 B-QB4 QN-Q2 Q-K2 KR-K1 R-Q2 B-B1 QR-Q1 N-B4 NXN QPXN B-KN5 L 11B5 +B-K3 KR-Q1 R-B1 N-B1 E E QN-Q2 N-B1 KR-Q1 N/QB1-R2 N-B4 P-B3 +Q-N2 N-N4 P-QR4 N/QN4-Q5 NXN NXN BXN QXB QXQ RXQ +L 10B3 B-K3 P-R5 Q-B3 B-B3 QN-Q2 N-Q5 BXN PXB Q-N4 Q-Q3 +E E E E E E R-B1 Q-Q2 QN-Q2 KR-B1 E E E E E E QN-Q2 N-Q5 NXN PXN +B-B4 P-QB4 B-N3 R-B1 N-B4 NXN PXN P-QN4 PXP B-N6 Q-Q2 P-B5 L 10B3 +QN-Q2 P-R5 P-QN4 PXG NXNP N-R5 +L 9B6 P-QN4 P-QR4 P-N5 N-Q5 NXKP B-B3 L 8B4 B-K3 B-K3 O-O T 10W4 + + L 2B2 P-QR3 N-B3 P-Q3 P-Q4 E E E E P-K3 N-B3 P-QR3 P-Q4 E E +N-QB3 P-Q4 E E P-Q3 P-Q4 + + L 2B2 N-KB3 P-K5 N-Q4 N-B3 NXN QPXN +E E N-B2 P-Q4 E E P-K3 NXN PXN P-Q4 P-Q3 B-QN5 E E N-B3 PXP +BXP QXP Q-N3 B-QB4 BXP K-K2 O-O R-Q1 E E E E E E P-Q3 PXP +Q-N3 B-K3 QXP B-QB4 B-K3 P-Q7 E E E E BXB PXB QXKP B-K2 B-K3 Q-KN5 + + L 2B2 N-QB3 P-Q4 PXP NXP N-KB3 N-QB3 E E P-KN3 P-QB4 V 5B7 N-B3 +N-QB3 NXN QXN P-Q3 B-K2 B-N2 O-O O-O Q-K3 B-K3 R-N1 P-QR3 +B-Q2 P-QN4 PXP PXP BXP BXP NXB RXN B-B4 R-R1 P-QN4 P-Q4 +PXP NXP Q-QN3 P-K3 KR-Q1 L 5B7 + B-N2 B-K3 N-R3 N-QB3 O-O B-K2 E E E E N-B3 N-QB3 O-O +B-K2 E E N-KN5 QXN BXN BXB NXB O-O-O E E E E NXN Q-Q1 N-K3 Q-Q2 +P-Q3 B-K2 E E E E P-K4 N-QN5 O-O Q-Q2 Q-R5 B-Q3 P-Q4 BPXP NXN +BXN QXKP O-O R-Q1 KR-Q1 B-K3 PXB E E E E E E E E E E E E E E +Q-R4 B-Q2 Q-N3 P-B5 QXP R-B1 + + L 2B2 P-KN3 P-Q4 B-N2 N-B3 PXP +NXP N-QB3 B-K3 N-B3 NXN NPXN P-K5 + + L KP P-K3 P-Q4 P-Q4 PXP PXP +B-Q3 V 4B6 N-KB3 N-KB3 N-B3 O-O E E B-KN5 O-O E E P-QB3 O-O E E +P-QB4 Q-K2 E E B-Q3 O-O O-O B-KN5 B-KN5 QN-Q2 QN-Q2 P-B3 +P-B3 Q-B2 Q-B2 KR-K1 KR-K1 B-R4 L 4B6 B-Q3 N-KB3 N-KB3 O-O +L 4B6 P-QB3 N-KB3 B-Q3 O-O L 4B6 P-QB4 Q-K2 B-K2 PXP E E +Q-K2 PXP E E B-K3 N-KB3 L 4B6 N-QB3 P-QB3 N-KB3 N-KB3 B-Q3 O-O +E E E E B-Q3 N-K2 Q-R5 N-R3 P-QR3 Q-Q2 KN-K2 N-B2 B-KB4 +BXB NXB Q-N5 + + L KP P-QB3 P-Q4 P-Q4 PXP PXP B-Q3 N-QB3 P-QB3 +N-B3 B-KB4 B-N5 N-B3 P-K3 Q-N3 Q-B1 QN-Q2 B-K2 O-O O-O P-KR3 B-R4 +Q-B2 B-N3 BXB + + L KP N-KB3 P-K5 N-Q4 P-Q4 P-Q3 P-QB4 N-N3 PXP KPXP +B-Q3 E E BPXP B-Q3 + + L KP P-Q3 P-Q4 E E P-KN3 P-Q4 E E P-Q4 PXP +N-KB3 P-Q4 NXP N-KB3 + + L KP N-QB3 N-KB3 P-K4 B-N5 T 3B2 + + L ORG P-Q4 P-Q4 V 2W2 P-QB4 P-K3 V 3W4 N-QB3 P-QB3 V 4W5 P-K4 +PXKP NXP B-N5 V 6W3 N-QB3 P-QB4 B-K3 N-KB3 N-KB3 N-B3 E E KN-K2 +N-N5 E E P-QR3 BXN PXB Q-R4 B-Q2 N-K5 Q-N4 NXB QXNP QXBP QXR +K-Q2 E E E E E E Q-B2 NXB QXN PXP PXP QXQ KXQ N-B3 L 6W3 B-Q2 +QXP BXB QXN V 8W4 N-K2 N-Q2 Q-Q6 P-QB4 B-B3 N-K2 E E BXP NXB QXN +B-Q2 P-B3 P-QN3 E E E E E E E E Q-Q2 QXBP N-B4 Q-K5 B-K2 P-QB4 +B-QB3 KN-B3 L 8W4 B-K2 P-QB4 B-QB3 N-K2 BXP R-N1 B-B6 N-Q2 BXN +KXB E E E E E E E E BXP QXNP V 10W2 Q-Q4 N-Q2 B-B3 Q-N4 B-Q6 +N-K2 E E B-QN4 Q-K4 N-K2 QXQ NXQ N-K4 O-O-O P-QR3 E E B-K2 B-Q2 +R-KN1 N-K2 B-Q6 N/K4-N3 R-Q1 P-K4 L 10W2 Q-Q6 N-Q2 O-O-O Q-B3 +L 10W2 B-B3 Q-N4 B-K3 Q-QR4 B-Q2 Q-B2 N-K2 N-QB3 B-B3 N-K4 N-Q4 +B-Q2 E E E E E E E E E E Q-Q6 N-Q2 B-K3 Q-QR4 P-QN4 Q-K4 +E E E E E E B-Q6 N-K2 N-K2 N-B4 R-KN1 Q-Q1 L 4W5 N-B3 N-B3 V 5W4 +B-N5 PXP V 6WM P-K3 P-QN4 P-QR4 B-N5 L 6WM P-QR4 B-N5 P-K4 BXN PXB +Q-R4 P-K5 N-K5 B-Q2 Q-Q4 E E R-QB1 N-Q2 BXP NXB NXN NXP E E E E B-K3 N-N3 Q-B2 +P-KB4 PXG NXP/KB3 R-R1 QN-Q4 B-Q2 P-QN4 L 6WM P-K4 P-QN4 V 7WM P-QR4 +P-N5 N-QN1 P-KR3 BXN QXB BXP Q-N3 QN-Q2 QXNP R-KN1 Q-R6 Q-N3 P-QR4 O-O-O +L 7WM Q-B2 P-KR3 B-R4 P-KN4 B-N3 P-KN5 N-K5 QXQP B-K2 B-QN5 O-O BXN PXB QXKP Q-Q2 QN-Q2 +L 7WM P-K5 P-KR3 V 8WM PXN PXB PXP BXP L 8WM BXN PXB P-QR4 B-N5 KPXP QXBP + N-K5 P-B4 B-K2 N-Q2 O-O BPXP N-N4 Q-N2 NXNP P-KR4 L 8WM B-R4 P-N4 +V 9WM B-N3 N-Q4 N-Q2 N-Q2 KN-K4 Q-R4 L 9WM KNXP PXN BXNP QN-Q2 V 11WM Q-B3 +B-QN2 NXP Q-R4 E E N-K4 B-N5 K-K2 NXN BXQ P-QB4 E E E E E E PXN Q-R4 +B-Q2 Q-N3 B-K3 P-QB4 PXP BXBP BXB NXB Q-K3 O-O-O E E E E E E E E E E E E +B-K2 Q-N3 PXN P-QB4 P-Q5 P-N5 E E E E BXN P-QB4 V 14WM +P-Q5 NXB QXN R-R3 Q-B3 P-N5 N-K4 PXP N-B6 RXN QXR QXQ PXQ O-O-O +L 14WM PXP NXBP Q-N3 P-N5 BXR PXN PXP N-K5 Q-B4 B-KR3 E E E E +QXP N-K5 Q-K3 B-B4 L 14WM N-K4 KR-N1 Q-B4 PXP B-R5 N-B4 NXN QXN E E +BXBP K-Q2 NXN BXN BXR B-QN5 E E O-O-O RXP L 11WM P-KN3 Q-N3 PXN B-QN2 B-N2 +V 13BM O-O-O O-O N-K4 PXN RXQ KRXR P-QB4 E E QRXR P-QB4 E E E E +Q-K2 QXP QR-Q1 N-Q6 E E KR-Q1 N-Q6 E E B-K3 Q-Q6 KR-Q1 QXQ V 18WM +RXR KXR NXQ K-B1 BXRP P-QB4 P-QR4 N-B6 E E E E R-Q1 P-QB4 BXB KXB +R-Q8 B-N2 RXR BXR N-B3 K-B3 E E BXP BXP B-N4 N-B3 B-B3 P-K4 +K-B1 P-N5 B-Q2 P-QR4 P-KR4 P-K5 B-B1 N-K4 P-QR3 N-Q6 PXP PXP B-K3 +BXNP B-Q4 BXB NXB P-N6 N-N5 K-N3 N-B3 K-R4 K-K2 K-N5 N-Q5 K-R6 P-R5 +P-N7 N-B3 K-N6 K-Q2 NXP P-R6 P-K6 K-K2 KXN E E KXP N-N5 K-Q4 NXP +L 18WM NXQ RXR RXR P-QB4 BXB KXB R-Q8 B-N2 RXR BXR N-B3 K-B3 E E BXP BXP +B-N4 N-B3 B-B3 P-K4 L 11WM PXN B-QN2 P-KN3 Q-N3 B-N2 T 13BM E E B-K2 Q-N3 +O-O O-O-O P-QR4 P-N5 N-K4 P-B4 Q-N1 Q-B2 E E E E E E E E +P-QR4 O-O-O O-O P-N5 N-K4 P-B4 Q-N1 Q-B2 E E E E E E P-R5 Q-B2 P-R6 B-R1 O-O +Q-N3 E E E E O-O P-R3 L 9WM PXN PXB NXRP B-QN2 P-KN3 N-Q2 B-N2 Q-N3 P-R4 P-QR4 +E E E E E E E E N-K5 QXBP V 11WMM P-KN3 N-Q2 P-B4 B-QN2 E E Q-K2 +NXN PXN Q-Q1 B-N2 B-QN2 NXP PXN BXB B-N5 K-B1 R-QN1 B-B6 K-B1 R-Q1 Q-B2 +L 11WM P-QR4 P-N5 N-K4 Q-B5 L 11WM B-K2 N-Q2 V 12WMM +NXP/QB6 B-QN2 B-B3 P-R3 Q-K2 R-B1 N-K5 BXB NXB Q-B5 P-Q5 N-B4 E E E E E E E E +O-O B-N2 V 15WMM P-Q5 BXN PXB N-K4 B-K4 O-O Q-K2 QR-B1 P-R4 NXP PXP N-Q5 +L 15WMM P-R4 P-N5 N-K4 Q-B5 P-KN3 PXP RPXP Q-B2 NXNP R-Q1 +Q-K2 BXP QR-Q1 N-K4 N-KB6 K-B1 E E RXB NXB QXN RXR Q-B6 RXN +QXR K-K2 R-Q1 Q-Q3 RXQ R-K8 K-R2 R-KR8 L 12WMM O-O +NXN PXN QXKP B-B3 B-QN2 R-K1 Q-Q3 NXP QXQ QRXQ B-N5 R-K2 K-K2 + L 5W4 PXP KPXP V 6W4 B-B4 B-K2 P-K3 B-KB4 E E Q-B2 P-KN3 P-K3 +B-KB4 L 6W4 B-N5 V 6B3 B-K2 P-K3 B-KB4 E E Q-B2 P-KN3 +P-K3 B-KB4 B-Q3 BXB QXB QN-Q2 B-R6 N-N5 E E O-O O-O P-QR3 P-QR4 +E E QR-B1 R-K1 N-Q2 K-N2 N-N3 B-Q3 P-KR3 P-KR3 L 5W4 Q-N3 +QN-Q2 PXP KPXP E E B-N5 B-K2 PXP KPXP E E P-K3 O-O PXP KPXP E E +B-K2 PXP QXBP N-Q4 BXB QXB O-O KN-N3 Q-Q3 P-K4 L 5W4 P-K3 QN-Q2 +V 6W5 PXP KPXP B-Q3 B-Q3 O-O O-O Q-B2 R-K1 L 6W5 B-Q2 B-Q3 +PXP KPXP E E B-Q3 O-O PXP KPXP E E O-O PXP BXBP P-K4 L 6W5 +P-QN3 B-N5 B-N2 N-K5 E E B-Q2 O-O P-QR3 B-Q3 E E B-K2 Q-K2 +O-O B-Q3 PXP KPXP E E Q-B2 PXP PXP P-K4 N-KN5 R-K1 L 6W5 P-QR3 +B-Q3 L 6W5 N-K5 NXN PXN N-Q2 P-KB4 B-QB4 P-QR3 Q-K2 P-QN4 B-N3 +B-K2 O-O O-O P-B3 P-QB5 B-B2 PXP NXKBP P-KN4 P-K4 L 6W5 Q-B2 +B-Q3 V 7W4 P-K4 PXKP NXP NXN QXN P-K4 PXP NXP NXN Q-QR4 E E +B-KB4 O-O NXN BXN BXB R-K1 E E E E BXN BXB NXB R-K1 E E E E E E E E +B-Q3 P-KB4 QXKBP N-B3 Q-N5 P-K5 BXP NXB QXNP Q-B3 E E E E E E E E E E +P-B5 B-K2 NXP NXN QXN O-O L 7W4 P-QN3 O-O B-K2 PXP PXP P-K4 +O-O R-K1 B-N2 PXP PXP N-B1 QR-Q1 N-N3 L 7W4 PXP KPXP L 7W4 +B-Q2 O-O PXP KPXP E E O-O-O P-QB4 P-K4 BPXP KNXP PXBP BXP + +N-N3 B-K2 B-Q2 E E E E E E E E PXQP KPXP B-K1 P-B5 P-KN4 N-N3 +E E E E K-N1 P-QR3 B-B1 P-B5 P-KN4 N-N3 P-KR3 R-K1 B-N2 B-QN5 +L 6W5 B-Q3 PXP BXBP P-QN4 B-K2 B-K2 O-O P-QR3 P-K4 P-N5 E E E E E E +B-N3 P-N5 N-QR4 B-R3 E E N-K2 B-N2 O-O B-K2 N-B4 O-O E E N-N3 +O-O P-K4 P-QB4 E E E E E E E E E E B-Q3 P-N5 N-QR4 P-QB4 +PXP NXP B-N5 B-Q2 BXB KNXB E E E E E E E E N-K2 P-QB4 O-O +B-N2 N-K5 B-Q3 P-KB4 O-O E E E E E E E E N-K4 NXN BXN B-N2 +Q-R4 Q-N3 O-O B-K2 N-Q2 R-QB1 E E E E E E Q-B2 R-B1 BXRP P-QB4 +E E E E B-Q2 B-K2 P-QR3 P-QR4 Q-R4 Q-N3 E E E E E E O-O B-K2 +Q-R4 O-O B-Q2 Q-N3 E E BXBP N-N3 E E E E P-QN3 O-O B-N2 N-B3 B-Q3 +P-QB4 PXP BXP R-QB1 B-K2 N-K5 Q-Q4 E E E E E E R-QB1 R-QB1 Q-K2 +N-K5 B-R6 Q-N3 BXB QXB PXP BXP N-K5 B-K2 N-B4 KR-Q1 L 4W5 P-K3 +N-KB3 N-B3 QN-Q2 T 6W5 E PXP KPXP L 4W5 PXP KPXP V 5W5 N-B3 B-KB4 B-B4 +B-Q3 BXB QXB P-K3 N-B3 B-Q3 BXB QXB QN-Q2 O-O O-O QR-N1 KR-K1 +P-QN4 P-QR3 P-QR4 N-K5 L 3W4 PXP PXP N-QB3 P-QB3 T 5W5 L 3W4 +N-KB3 N-KB3 V 4W6 PXP KPXP N-QB3 P-QB3 T 6W4 E E E N-B3 P-B3 T 5W4 +E B-N5 P-KR3 B-R4 PXP E E BXN QXB N-B3 P-QB3 +V 7W3 P-K3 N-Q2 PXP KPXP E E B-Q3 B-Q3 PXP KPXP E E O-O +Q-K2 P-K4 PXBP BXP P-K4 E E E E PXP KPXP P-K4 PXP NXP O-O +R-K1 N-B3 N-K5 NXN BXN B-K3 B-B2 BXN PXB KR-Q1 Q-K2 R-Q5 +QR-Q1 QR-Q1 P-QR3 Q-N4 RXR RXR R-Q1 B-B5 Q-K1 B-Q4 P-KN3 +RXR BXR Q-B8 E E QXR QXKP B-N3 QXQNP BXB PXB QXP Q-B8 K-N2 +Q-B3 L 7W3 Q-N3 PXP QXBP N-Q2 P-K4 P-K4 P-Q5 N-N3 E E E E +R-Q1 B-K2 P-KN3 O-O B-N2 P-K4 E E E E P-K3 O-O B-Q3 P-KN3 +L 7W3 PXP KPXP P-K3 N-Q2 E E E E P-K4 PXKP NXP B-N5 +K-K2 Q-B5 E E N-B3 P-B4 R-B1 O-O PXP P-K4 E E E E E E QN-Q2 +P-B4 P-QR3 BXN QXB PXP QXQP N-B3 QXQ PXQ P-B5 B-Q2 B-N5 K-K2 + + L 2W2 N-KB3 +N-KB3 V 3WY P-QB4 P-K3 T 4W6 E P-KN3 P-QB4 PXP P-K3 P-QN4 P-QR4 P-B3 +PXP PXP P-QN3 E E E E E E E E B-N2 P-K3 O-O N-B3 L 3WY P-K3 V 3BZ +P-KN3 B-Q3 B-N2 O-O O-O QN-Q2 P-B4 P-B3 KN-Q2 Q-K2 N-QB3 P-KR3 R-K1 B-N5 P-QR3 B-R4 +P-QN4 B-B2 B-N2 L 3WY B-B4 V 3BJ P-B4 P-K3 N-B3 P-B3 Q-N3 Q-B1 B-B4 PXP QXBP QN-Q2 R-B1 N-N3 Q-N3 +Q-Q2 P-K3 B-Q3 B-K5 E E E E E E N-Q4 NXN KPXN Q-N3 P-QR4 P-QR3 P-R5 Q-B3 +L 3WY N-B3 P-KN3 B-B4 B-N2 P-K3 O-O P-KR3 P-B4 B-K2 P-N3 O-O B-N2 N-K5 QN-Q2 +L 3WY B-N5 N-K5 V 4WJ B-B4 P-QB4 PXP N-QB3 P-K3 P-B3 P-B4 P-K4 B-N3 B-K3 +QN-Q2 NXN NXN BXP P-QR3 P-Q5 N-N3 B-N3 L 4WJ B-R4 P-QB4 PXP N-QB3 P-K3 +P-KN3 QN-Q2 NXQBP B-K2 B-N2 P-B3 O-O O-O P-QR4 + + L 2W2 P-K3 N-KB3 +V 3WZ N-KB3 T 3BZ P-KB4 P-QB4 P-B3 Q-B2 N-B3 P-KN3 B-Q3 B-N2 E E E E B-Q3 P-KN3 +N-B3 B-N2 L 3WZ B-Q3 N-B3 P-QB3 P-K4 E E P-KB4 N-QN5 B-K2 B-B4 E E N-KB3 NXB QXN P-KN3 +O-O B-N2 E E E E PXN P-KN3 O-O B-N2 N-B3 O-O B-Q2 P-QN3 +N-K5 P-QB4 + + L 2W2 P-K4 PXP P-KB3 P-K4 QPXP QXQ KXQ N-QB3 B-QN5 B-Q2 E E +B-KB4 KN-K2 PXP N-N3 + + L 2W2 B-B4 N-KB3 N-KB3 T 3BJ + + L ORG P-QB4 V ENG P-K4 N-QB3 N-KB3 V 3W5 P-KN3 P-B3 V 4W7 P-Q4 +PXP QXP P-Q4 PXP PXP E E B-N5 B-K2 N-B3 O-O B-N2 P-KR3 B-B4 P-B4 +Q-Q3 P-Q5 N-QN5 N-B3 B-B7 Q-K1 O-O B-N5 L 4W7 B-N2 P-Q4 PXP PXP +Q-N3 N-B3 NXP N-Q5 E E E E P-Q3 N-B3 N-B3 B-K2 O-O O-O P-Q4 +P-K5 N-K5 B-K3 E E E E E E E E P-B4 P-Q5 PXP N-KN5 N-K4 B-QN5 +K-B1 KNXKP N-R3 O-O N-B4 K-R1 L 4W7 N-B3 P-K5 N-Q4 P-Q4 PXP PXP +P-Q3 Q-N3 N-N3 N-N5 P-Q4 B-K3 P-B3 PXP PXP N-KB3 B-K3 N-B3 E E E +E E E E E E E PXP B-QB4 P-K3 PXP B-N2 O-O O-O B-KN5 E E NXP NXN +BXN R-K1 L 3W5 N-B3 N-B3 V 4W8 P-Q4 PXP NXP B-B4 NXN NPXN +P-KN3 O-O L 4W8 P-K4 B-N5 P-Q3 P-Q3 B-K2 O-O O-O BXN PXB +Q-K2 N-K1 N-K1 N-B2 P-B4 PXP BXP L 4W8 P-KN3 P-KN3 B-N2 B-N2 +O-O O-O R-N1 P-Q3 P-QN4 P-K5 N-K1 B-B4 P-Q3 P-Q4 PXQP NXQP E E +P-N5 N-K2 PXQP QNXP NXN NXN PXP N-B6 E E E E B-N2 NXN BXN R-K1 +L 4W8 P-QR3 P-Q4 E E P-K3 B-N5 N-Q5 P-K5 NXB NXN N-Q4 O-O P-QR3 +N-R3 B-K2 P-Q4 L 4W8 P-Q3 P-Q4 PXP NXP P-KN3 B-K3 B-N2 B-K2 +O-O O-O P-QR3 Q-Q2 B-Q2 QR-Q1 P-QN4 NXN BXN B-B3 + + L ORG N-KB3 N-KB3 P-Q4 P-Q4 P-QB4 P-K3 T 4W6 E E E P-QB4 +P-K3 P-Q4 P-Q4 T 4W6 E N-B3 P-Q4 PXP PXP P-Q4 P-B3 T 6W4 +E E E E E E E P-QN3 P-Q4 B-N2 B-B4 P-K3 P-K3 B-K2 P-KR3 E E +E E E E E E P-KN3 P-Q4 B-N2 V 3B4 P-B4 O-O P-K3 P-Q4 B-K2 E E +P-Q3 N-B3 QN-Q2 B-K2 P-K4 O-O +V 8W5 P-K5 N-KN5 Q-K2 P-B3 PXP BXP P-B3 Q-Q3 P-Q4 PXP +NXP P-K4 L 8W5 Q-K2 Q-B2 P-K5 N-Q2 R-K1 V 10B1 P-QN4 +P-KR4 P-QR4 N-B1 B-R3 N/B1-R2 P-N5 P-R5 P-R5 P-R6 +P-N3 N-N4 P-B5 L 8W5 R-K1 Q-B2 P-K5 N-Q2 Q-K2 T 10B1 +L 8W5 P-B3 PXP PXP Q-B2 Q-B2 P-K4 R-K1 B-K3 N-N5 B-Q2 +N-B1 P-KR3 N-B3 B-K3 + + L ORG P-KN3 N-KB3 B-N2 P-Q4 N-KB3 T 3B4 + + L ORG P-KB4 P-Q4 P-K3 N-KB3 +P-QN3 P-Q5 E E N-KB3 B-N5 P-KR3 BXN E E P-B4 P-K3 N-B3 +P-B3 E E E E P-QN3 P-K3 B-N2 B-K2 E E E E B-K2 BXN BXB QN-Q2 +P-B4 P-K3 PXP PXP N-B3 P-B3 O-O B-K2 P-Q3 N-N3 P-K4 PXP PXP +B-B4 + + +  \ No newline at end of file diff --git a/MUDDLE/book.4 b/MUDDLE/book.4 new file mode 100644 index 0000000..7484f8a --- /dev/null +++ b/MUDDLE/book.4 @@ -0,0 +1,532 @@ +P-K4 V KP P-K4 V 2W1 N-KB3 V 2B1 N-KB3 V 3W1 P-Q4 V 3B1 NXP V 4W1 B-Q3 V 4B1 P-Q4 V 5W1 NXP V 5B1 B-Q3 V 6W1 O-O V 6B1 O-OV 7W1 N-Q2 B-KB4 R-K1 BXN PXB B-N3 N-B3 +E Q-K2 R-K1 +E E E E E E P-QB4 BXN PXB NXBP +E E E E E NXN BXN N-Q2 NXN +E E E E N-KB3 QN-B3 N-B3 P-B3 +E E N-K5 P-B4 +L 7W1 P-QB4 BXN PXB N-QB3 P-B4 B-B4 P-KN4 PXP +E E E E B-KB4 B-K3 +E E PXP QXP Q-B3 B-B4 QXB QXB N-B3 N-B4 QXQ NXQ +L 7W1 N-QB3 NXN PXN N-Q2 P-KB4 P-QB4 +E E R-K1 Q-R5 P-N3 Q-R6 B-B1 Q-B4 N-N4 N-N3 N-K3 Q-B3 B-Q3 P-KR3 N-N4 BXN QXB QR-K1 +L 7W1 R-K1 BXN PXB N-QB3 B-KB4 N-B4 N-B3 N-N5 B-KB1 P-Q5 N-K4 NXN +L 7W1 P-KB3 N-B4 +L 6B1 N-QB3 NXN PXN P-QB4 O-O P-B5 B-K2 N-B3 +L 6B1 BXN PXB N-B4 N-B3 +L 6W1 Q-K2 BXN PXB N-B4 +L 6W1 N-QB3 NXN PXN O-O O-O N-Q2 P-KB4 P-QB4 +L 5B1 B-K3 Q-K2 N-Q3 O-O B-K2 R-K1 O-O NXP +E E Q-B1 N-QB3 O-O Q-R5 P-KB4 N-K2 +E E E E E E N-Q2 B-KB4 NXN BXN O-O N-Q2 B-B3 Q-R5 P-KN3 Q-R6 BXB PXB N-B4 BXN BXB N-B3 P-KB3 N-Q4 PXP RXP +L 5B1 N-QB3 NXN PXN Q-K2 V 7B10 P-KB4 P-KB3 B-Q3 O-O O-O PXN BPXP RXR QXR BXKP PXB Q-QB4 +E E E E E E E E Q-K2 PXN BPXP Q-R5 P-N3 Q-R6 PXB B-N5 Q-K5 B-B6 +L 7B10 Q-K2 O-O V 8B10 N-Q3 R-K1 QXQ RXQ K-Q1 N-Q2 B-KB4 N-N3 BXB PXB +L 8B10 P-N3 BXN PXB R-K1 P-KB4 P-KB3 +E E E E QXB Q-Q2 +L 5B1 N-Q2 Q-K2 NXN BXN +E E Q-K2 BXN PXB B-B4 NXN BXN P-KB3 B-N3 P-KB4 N-B3 P-B3 O-O-O B-K3 P-Q5 +E E Q-KN4 K-N1 B-N5 N-N5 P-B5 N-B7 K-B1 QXP B-KB4 Q-K5 +L 5B1 B-K2 O-O O-O P-QB4 B-K3 N-QB3 N-KB3 P-B5 +E E E E N-KB3 N-QB3 PXP BXBP +E E E E P-QB3 PXP PXP BXN PXB N-QB3 +L 5W1 PXP N-B4 O-O B-K2 N-B3 P-QB3 N-K2 NXB QXN P-B3 +E E E E N-Q4 NXB QXN O-O P-B4 P-B3 B-Q2 N-R3 +L 4W1 PXP P-Q4 QN-Q2 N-B4 N-N3 NXN RPXN N-B3 P-R3 B-K2 +L 3B1 P-Q3 N-B3 +E E P-Q4 PXQP PXP B-QN5 P-B3 PXP Q-R4 N-B3 PXP NXP PXB Q-B3 +E E E E E E PXP B-QB4 Q-K2 B-K2 P-B4 P-B3 +L 3B1 PXP P-K5 N-K5 QXP P-Q4 PXG NXQP B-Q3 N-B3 Q-KB4 V 8B2 Q-K2 B-K3 P-KN3 N-B3 B-K3 O-O B-N2 KR-K1 O-O QB-B5 +L 8B2 P-KN3 O-O B-N2 N-B3 O-O B-K3 B-K3 B-QB5 P-N3 B-R3 N-K2 QR-Q1 +L 3W1 B-B4 NXP N-B3NXN QPXN P-QB3 NXP P-Q4 O-O B-Q3 R-K1 B-K3 B-Q3 N-Q2 +L 3W1 N-B3 B-N5 V 4W2 B-B4 N-B3 N-Q5 NXP Q-K2 N-B3 NXKP O-O +E E E E E E O-O O-O N-Q5 NXN BXN P-Q3 P-B3 B-R4 +E E E E E E P-Q3 BXN PXB P-Q4 PXP NXP Q-K1 N-N3 +E E B-Q2 B-N5 R-K1 Q-Q3 Q-K2 QR-K1 +E E R-N1 N-N3 B-QN5 QR-K1 BXN PXB P-B4 BXN QXB NXP +L 4W2 NXP O-O N-Q3 BXN QPXB NXP B-K2 P-Q3 +E E E E E E N-B3 BXN QPXB NXP B-Q3 P-Q4 P-KR3 N-QB3 +E E E E E E E E P-Q3 P-Q4 P-QR3 BXN PXB R-K1 P-KB4 PXP +E E E E E E E E B-K2 R-K1 N-Q3 BXN QPXB NXP O-O P-Q4 B-B4 N-QB3 P-B3 N-B3 Q-Q2 B-B4 +E E E E E E B-K3 N-Q2 N-B4 QN-B3 P-B4 PXP +E E E E E E N-B4 P-QB3 B-K3 N-Q3 B-Q3 B-B4 +L 3W1 NXP P-Q3 V 4W3 N-KB3 NXP V 5W2 P-Q4 P-Q4 B-Q3 B-K2 V 7W2 P-B4 B-QN5 QN-Q2 BXN BXB O-O O-O B-N5 B-B4 N-QB3 R-K1 NXQP BXN PXB QXN PXN QXQ KRXQ BXP R-Q7 +L 7W2 O-O N-QB3 V 8W2 P-B4 N-N5 B-K2 PXP BXP O-O +E E E E PXP NXB QXN QXP R-K1 B-KB4N-K5 P-KR3 +E E N-B3 NXN QXN P-QB3 B-Q2 B-K3 R-K5 Q-B5 Q-K3 Q-B7 +E E E E E E R-K5 Q-Q2 P-Q5 O-O PXP PXP +L 8W2 R-K1 B-KN5 V 9W2 BXN PXB RXP BXN PXB P-KB4 +E E QXB NXP Q-Q3 N-K3 +L 9W2 P-B3 P-B4 P-B4 B-R5 V 11WA P-KN3 B-B3 PXP NXQP BXN O-O +E E Q-R4 Q-Q2 QXQ KXQ NXN BXN BXN QR-K1 +L 11WA B-K3 O-O PXP N-N5 N-B3 BXN PXB N-N4 +E E E E P-Q6 NXB QXN BXN PXB NXQP +E E E E E E E E P-KN3 P-KB5 PXBP NXBP BXN BXB KXB RXP QN-Q2 Q-R5 K-N1 BXN NXB Q-N5 K-B2 QR-KB1 R-K3 NXP B-K2 Q-R5 K-N2 R-KN5 K-R1 Q-B7 +L 11WA R-B1 PXP BXP Q-B3 V 13WA Q-K1 O-O-O NXB QXN P-B3 QXQ RXQ NXP PXB N-QB7 R-B1 NXR N-R3 N-Q7 BXN RXB RXN PXP +L 13WA B-K2 O-O-O B-K3 P-B5 NXB BXB QXB QXN P-KN3 Q-R6 BXP KR-K1 +L 13WA N-B3 O-O-O N-Q5 BXN NXQ BXQ NXN NXP +L 11WA PXP BXBP K-B1 BXR PXN BXN V 14WA PXB QXP Q-K2 O-O-O PXP K-N1 KXB KR-K1 PXN RXP BXR Q-N8 Q-B1 R-Q8 +L 14WA QXQB QXP PXP R-Q1 B-QN5 P-B3 BXP K-K2 BXN PXB B-N5 K-K1 Q-K3 R-KB1 +L 11WA BXN QPXB P-Q5 N-K4 Q-R4 P-QN4 QXNP P-B3 PXP NXN PXN KBXP KXB Q-R5 K-B1 O-O PXB Q-R6 +L 11WA R-K2 NXQP NXN BXP +E E E +E E E P-KR3 B-R4 P-B4 B-R5 +L 9W2 P-B4 N-B3 N-B3 PXP +E E PXP QXP N-B3 BXN NXQ BXQ NXB NXN RXB O-O-O B-QB4 N/B3-Q4 +L 5W2 Q-K2 Q-K2 P-Q3 N-KB3 V 7W5 N-B3 QXQ BXQ P-KN3 O-O B-N2 +E E B-K3 P-B3 O-O B-N2 +E E B-Q4 B-N2 +E E B-B4 P-Q4 +E E O-O-O B-N2 KR-K1 O-O +E E E E E E N-QN5 N-R3 +E E B-N5 B-N2 O-O-O P-B3 KR-K1 O-O +L 7W5 B-N5 QN-Q2 QXQ BXQ N-B3 P-B3 O-O-O O-O +E E E E E E N-B3 QXQ BXQ P-KR3 B-R4 P-KN4 B-N3 B-N2 +E E E E BXN NXB N-QN5 K-Q1 +E E E E B-Q2 P-KN3 O-O-O B-N2 +E E E E B-B4 P-KN3 O-O-O B-N2 P-KR3 N-N3 +L 5W2 N-B3 NXN QPXN B-K2 B-Q3 N-B3 B-KB4 B-N5 P-KR3 B-R4 P-KN4 B-N3 +L 5W2 P-Q3 N-KB3 P-Q4 B-K2 +L 5W2 P-B4 B-K2 P-Q4 O-O B-Q3 P-Q4 O-O N-QB3 +L 4W3 N-B4 NXP V 5W3 N-B3 NXN NPXN P-KN3 B-K2 B-N2 O-O O-O P-Q4 N-Q2 N-K3 N-N3 P-QB4 B-K3 P-QB3 P-KB4 +L 5W3 P-Q3 N-KB3 P-Q4 B-K2 B-Q3 O-O O-O N-B3 P-QB3 R-K1 B-N5 P-Q4 N-K3 N-K5 BXB NXB + P-K4 P-K4 N-KB3 N-QB3 B-N5 V 3B2 P-QR3 B-R4 V 4B7 N-B3 O-O V 5B8 NXP P-Q4P-QN4 B-N3 P-Q4 PXP V 8BJ B-K3 P-QB3 V 9B4 B-K2 QN-Q2 V 10BH O-O Q-K2 V 11B2 NXN QXN Q-Q2 Q-Q3 +E E N-QR4 B-B2 V 13B1 N-B5 Q-Q3 P-KN3 N-Q4 NXKP Q-KN3 B-Q3 P-KB4 N-B5 NXB PXN BXP PXB QXNP K-R1 Q-R6 +L 11B2 N-QR4 B-B2 NXN QXN T 13B1 +L 11B2 B-KB4 R-Q1 N-B4 N-Q4 NXN PXN B-Q6 Q-N4 NXB NXN B-B7 B-R6 B-N3 B-K3 +L 11B2 N-B4 N-Q4 NXN PXN NXB NXN QR-B1 B-Q2 +E E E E E E NXB N/Q2XN NXN PXN QR-B1 B-Q2 +E E E E Q-Q2 NXN QXN B-K3 P-KB3 PXP BXP B-Q4 +E E E E B-KB4 KR-Q1 KR-Q1 P-KB3 B-KB1 Q-KB2 P-QR4 QR-B1 P-R5 N-Q4 Q-Q2 P-KN4 +E E E E E E E E E E Q-KN3 P-KB3 P-QB3 KR-K1 KR-K1 Q-KB2 P-KB3 PXP BXP B-Q4 BXB PXB +L 10BH N-B4 B-B2 P-Q5 N-K4 +E E O-O N-Q4 Q-Q2 P-KB4 +E E NXKP Q-R5 N-N3 P-KB4 B-Q2 P-B5 N-R1 P-B6 +L 9B4 B-QB4 QN-Q2 O-O B-B2 V 11BH NXN QXN V 12BH R-K1 Q-B4 P-N3 N-N5 B-KB1 Q-N3 B-N2 P-KB4 +L 12BH B-K2 Q-Q3 P-N3 B-R6 R-K1 Q-K3 Q-Q2 Q-B4 QR-Q1 QR-Q1 +L 12BH N-K2 P-QN4 B-N3 N-N5 B-KB4 BXB NXB Q-Q3 P-KN3 Q-KR3 P-KR4 R-Q1 +L 12BH P-KB3 P-QN4 B-N3 Q-Q3 P-N3 B-R6 R-B2 PXP B-KB4 Q-Q2 BXB QXB +L 11BH B-B4 N-N3 B-QN3 KN-Q4 +E E B-KN5 NXB NXN R-K1 R-K1 B-K3 N-K3 Q-Q3 P-KN3 B-R6 +E E E E E E B-R4 B-N5 BXN QXB QXB QXQP +E E E E Q-Q2 B-K3 N-K3 BXRP KXB N-N5NXN QXB +E E K-N3 P-KN4 NXN PXB K-R3 P-KR4 +E E K-B4 Q-Q3 N-K5 P-KB3 +L 11BH NXKBP RXN P-B3 PXP QXP N-B1 BXR KXB N-K4 B-K3 +E E E E E E BXR KXB QXP K-N1 QR-K1 N-B1 N-K4 B-K3 NXN QXN QXQ PXQ B-R6 K-B2 +E E RXP B-B2 QR-KB1 B-QB5 QR-B3 R-K1 +E E E E B-R6 N-N3 P-N3 P-QR4 +L 11BH P-KB4 N-N3 V 12BM B-R2 KN-Q4 NXN NXN BXN PXB V 15B1 P-B5 P-B3 N-N4 P-KR4 N-B2 BXBP QXP Q-Q2 +E E E E E E N-N6 PXN PXP Q-Q3 Q-R5 QXRP QXQ BXQ KXB B-Q2 +E E E E E E B-B4 QXB RXQ BXR Q-R5 B-R3 QXQP K-R1 QXKP B-Q2 V 23B1 QXNP B-B4 P-QB4 B-K6 K-R1 BXQP QR-Q1 QR-Q1 P-B5 BXNP +E E E E E E E E P-Q5 BXNP P-Q6 QR-Q1 Q-QB7 B-K6 K-R1 B-N3 +E E E E P-Q7 R-B2 R-Q1 B-B4 QXRP KRXP RXR RXR Q-R8 K-R2 P-B4 R-Q5 +L 23B1 P-QB4 B-B3 P-Q5 QR-K1 Q-B3 B-R5 +E E Q-Q3 B-Q2 +L 12BM B-N3 KN-Q4 NXN NXN BXN PXB T 15B1 +L 9B4 N-B4 B-B2 B-N5 R-K1 V 11BJ P-Q5 P-KR3 B-R4 P-K6 NXKP B-K4 Q-Q2 PXP +E E E E PXKP PXP BXN QXB NXQP Q-R5 P-N3 BXP PXB QXR N-B7 B-R6 Q-K2 N-B3 +L 11BJ N-K3 P-QR4 N-R4 PXP PXP Q-Q3 P-QB3 N-Q4 +L 11BJ Q-Q2 QN-Q2 P-Q5 N-K4 NXN BXN PXP Q-B2 +L 11BJ B-K2 QN-Q2 V 12BJ O-O N-N3 N-K3 Q-Q3 P-N3 QN-Q4 +E E E E N-K5 B-B4 P-KB4 PXG NXP/KB3 Q-Q3 N-K5 BXBP QXB QXQP +E E E E E E E E E E Q-Q2 NXN BXQN Q-Q3 P-N3 B-KN5 B-K2 BXB +L 12BJ Q-Q2 N-B1 R-Q1 N-K3 B-R4 N-B5 N-K3 P-QR4 +E E E E BXN QXB NXKP Q-KN3 N-N3 N-B5 +E E E E E E O-O NXB QXN B-K3 +L 12BJ P-Q5 N-N3 PXP NXN BXQN B-K4 Q-Q2 Q-N3 BXN PXB +E E E E E E E E P-Q6 B-N1 NXN PXN B-KB4 B-K3 Q-Q4 N-Q4 NXN PXN B-QN5 R-KB1 Q-K5 Q-B1 O-O R-Q1 +E E E E E E E E E E O-O N-Q4 NXN PXN B-QN5 R-KB1 P-QB4 BXQP PXP B-KB4 BXB QXB Q-Q4 +L 8BJ N-K2 P-QR4 R-QN1 PXP PXP N-Q4 N-QB4 B-KN5 Q-Q2 N-QB3 P-QB3 BXN BXB P-KB4 +L 5B8 B-K2 BXN NPXB P-Q4 +E E QPXB P-Q3 V 7BF B-Q3 QN-Q2 O-O N-B4 +E E E E B-KN5 P-KR3 BXN QXB O-O N-Q2 N-Q2 N-B4 +E E E E Q-Q3 N-Q2 O-O-O N-B4 +E E Q-K3 N-B4 +E E E E E E B-R4 P-KN4 B-N3 NXP +E E NXNP PXN BXP K-R2 Q-Q3 R-KN1 Q-N3 R-N3 B-R5 NXB +E E Q-R4 K-N2 B-R5 Q-R1 BXR QXQ BXQ PXB +L 7BF N-Q2 QN-Q2 V 8BF P-QB4 N-B4 V 9BF B-B3 P-QN3 O-O B-N2 R-K1 V 12WF P-KR3 P-QN4 N-K3 N-N3 P-QR4 B-Q2 P-R5 +E E PXP PXP P-QR4 Q-Q2 B-Q2 B-B3 +E E P-B5 B-B3 PXP PXP B-Q2 BXRP NXP N-Q5 N-N3 BXN RXR RXR PXB R-R6 R-K3 Q-R2 R-B3 Q-R3 P-KR3 R-R8 R-B1 RXR BXR Q-R8 K-R2 Q-QN8 P-QN4 NXKP +L 9BFP-KB3 N-R4 O-O V 11WF P-KB4 PXP BXP R-B2 N-B5 +E E P-KN4 N-B5 PXB Q-KN4 K-B2 N-R6 K-K1 Q-R5 R-B2 QXR +L 8BF O-O N-B4 V 9BG B-B3 P-QN3 R-K1 B-N2 P-QB4 T 12WF +E E P-QB4 B-N2 R-K1 T 12WF +L 9BG P-B3 N-R4 V 10BF P-QB4T 11WF +L 10BF R-B2 N-B5 +E E P-KN3 B-R6 R-B2 P-KB4 PXP RXP P-KN4 N-B5 PXR Q-N4 K-R1 B-N7 K-N1 N-R6 +L 10BF N-B4 N-B5 BXN PXB R-K1 B-K3 P-K5 P-Q4 N-R5 P-QB3 +E E E E Q-Q4 N-Q2 QR-Q1 Q-N4 K-R1 P-QN3 R-KN1 QR-K1 P-KN3 P-KB3 Q-Q2 PXP QXQ PXQ PXP R-B3 +L 3B2 P-KB4 N-B3 V 4B3 N-B3 PXP B-B4 O-O O-O NXP V 7B4 N-Q5 V 8W3 N-B3 P-B3 NXN BXN B-R4 P-Q4 N-K2 B-N3 P-Q4 BXBP B-B4 N-R4 B-K5 Q-R5 N-N3 +L 7B4 NXN P-Q4 BXP QXB P-Q3 B-Q3 P-B4 Q-K3 KN-N5 Q-R3 NXB QXN/Q3 BXP Q-Q5 K-R1 B-B4 +L 4B3 N-Q5 NXP N-KB3 PXP B-B4 O-O O-O T 8W3 +L 4B3 PXP QNXP P-Q4 N-N3 B-Q3 NXP BXN BXN PXB Q-R5 +E E E E E E B-KN5 P-KR3 BXN QXB N-B3 O-O B-K2 Q-K2 B-Q3 P-Q4 P-K5 P-QB4 BXN PXB O-O BXN PXB P-B5 +E E E E E E +E E E E E E B-Q3 N-R5 NXN QXN P-KN3 Q-B3 P-QR3 B-R4 +L 3B2 B-B4 P-B3 V 4B4 N-B3 P-Q4 V 5B3 PXP P-K5 N-Q4 O-O +E E N-K5 O-O PXP Q-Q5 PXP BXP BXP K-R1 P-KB4 PXG NXBP Q-N5 +E E E E E E E E E E O-O PXP B-N3 P-Q5 +E E E E P-Q4 PXG O-O PXBP QXP PXP R-Q1 Q-B2 +E E E E Q-B3 BXN PXB PXP B-N3 R-K1 B-KB4 N-B3 KR-K1 NXN BXN B-N5 BXN RXR RXR QXB QXB QXQBP R-QB1 Q-Q7 +L 5B3 B-N3 NXP NXN PXN NXP Q-N4 BXP K-Q1 Q-R5 QXNP R-B1 P-QN4 P-KB3 P-K6 +E E Q-R4 K-B2 B-R5 B-KR6 B-K2 N-Q2 NXN KXN +L 4B4 KN-K2 O-O O-O P-Q4 PXP PXP B-N3 P-Q5 N-N1 P-Q6 +E E E E E E E E B-N3 P-Q4 PXP PXP P-Q4 PXP KNXP R-K1 B-K3 B-N5 Q-Q3 QN-Q2 Q-N5 B-QR4 +E E O-O N-B4 Q-N5 P-QR4 +E E E E P-KR3 N-K4 Q-N5 BXN NPXB Q-B2 PXB QXP K-K2 P-QR3 QXNP QNXP N-B5 Q-K4 +L 4B4 P-KB4 PXP P-K5 P-Q4 B-N3 B-N5 N-B3 N-K5 O-O N-N4 +L 3B2 N-B3 O-O V 4B5 B-B4 N-B3 O-O NXP +E E P-Q3 P-Q4 PXP NXP B-Q2 N-B5 O-O B-N5 BXN PXB N-Q5 B-Q3 +L 4B5 B-K2 N-B3 P-Q3 P-Q4 B-Q2 R-K1 +L 4B5 P-Q3 P-Q4 B-Q2 N-B3 B-K2 R-K1 +L 4B5 NXP P-Q4 V 5B4 N-Q3 BXN QPXB PXP N-B4 QXQ KXQ N-B3 +L 5B4 PXP R-K1 +L 5B4 P-QR3 BXN QPXB R-K1 N-B3 NXP B-K2 Q-K2 O-O NXQBP +E E B-K3 N-QB3 O-O NXKBP +L 5B4 B-K2 Q-K2 P-KB4 PXP +E E N-Q3 BXN QPXB PXP N-B4 R-Q1 B-Q2 P-K6 PXP N-K5 B-Q3 Q-R5 +E E E E E +E E E E E NPXB PXP N-B4 Q-K4 +E E N-N2 N-B3 N-B4 N-Q4 B-R3 Q-N4 BXR QXNP +E E E E E E O-O N-Q4 B-B4 R-Q1 +L 3B2 P-Q3 P-Q4 PXP NXP +E E B-Q2 N-B3 N-B3 O-O B-K2 R-K1 O-O BXN BXB PXP PXP QXQ QRXQ NXP BXP NXB NXN N-Q3 P-KB4 P-KB3 B-B4 NXB NXN B-N5 R-Q4 B-K7 +L 3B2 N-Q5 NXN PXN O-O P-QB3 B-R4 +E E N-K2 P-QB3 N-B3 Q-R4 B-B4 N-R3 O-O N-B2 R-K1 P-Q3 +E E E E P-QR3 N-B2 N-R2 B-K2 P-QN4 Q-N3 +L 3B2 P-KN3 P-Q4 PXP NXP NXN QXN Q-B3 P-K5 Q-N3 Q-Q3 P-QB3 B-QB4 Q-R4 N-B3 QXKP B-K3 P-Q4 NXP PXN B-QN5 +L 3B2 KN-K2 P-Q4 PXP NXP P-KN3 NXN NXN BXN QPXB QXQ KXQ B-KN5 B-K2 BXB KXB N-B3 +L 3B2 P-KN4 P-Q4 +L 3B2 Q-B3 N-B3 +L 3B2 P-B3 O-O KN-K2 P-Q4 N-N3 P-QR3 B-K2 B-QB4 +L 3B2 B-N5 P-B3 B-R4 N-R3 P-Q3 N-B4 B-N3 P-Q4 +L 2B1 P-KB4 NXP PXP Q-R5 +E E N-QB3 NXN +E E Q-B3 N-B4 PXP N-B3 V 5B5 Q-K3 P-Q3 PXP N-K3 PXP QXBP P-B3 B-Q3 +E E E E E E N-KB3 PXP B-N5 N-K3 NXP B-B4 NXN PXN BXP B-Q2 Q-KB3 QR-N1 +L 5B5 N-K2 N-K3 Q-K4 P-Q4 +L 5B5 Q-KN3 P-Q3 PXP BXP QXP Q-R5 P-KN3 Q-K5 B-K2 B-K4 Q-R6 QXR +E E E E E E E E E E B-N5 PXP QXKP N-K3 BXN PXB N-KB3 B-B4 P-Q3 O-O +E E E E N-K2 B-B4 P-Q3 O-O B-K3 Q-R5 K-Q2 BXB QXB P-QB4 + +L 2B1 P-Q4 PXP P-K5 Q-K2 N-KB3 P-Q3 QXP KN-Q2 +E E E E Q-K2 N-Q4 Q-K4 N-N5 B-Q3 P-Q4 Q-K2 P-QB4 + +L 2B1 P-Q3 P-Q4 V 3B3 N-Q2 B-QB4 KN-B3 N-N5 +E E B-K2 PXP PXP Q-Q5 +E E NXP NXN PXN Q-R5 +E E E E E E P-KR3 PXP PXP BXBP KXB NXKP K-B3 Q-Q4 +E E E E E E E E P-QB3 N-B3 B-K2 PXP PXP N-KN5 BXN Q-R5 +E E N-KR3 N-K6 PXN BXN PXB Q-R5 K-B1 BXP +E E E E N-N3 Q-R5 P-N3 Q-K2 +E E K-B1 B-N3 PXB R-Q1 Q-K1 QXRP K-B2 R-Q3 B-B3 R-B3 N-Q2 P-KN4 +L 3B3 N-KB3 N-B3 QN-Q2 B-QB4 B-K2 PXP QNXP B-K2 O-O N-Q4 +E E E E PXP BXBP KXB N-KN5 K-N3 P-B4 PXP N-K6 Q-N1 NXQBP R-N1 BXP +E E E E E E E E K-N1 N-K6 Q-K1 NXBP Q-N3 NXR QXNP R-B1 N-B4 Q-K2 B-R6 B-K3 +L 3B3 P-KB4 KPXP P-K5 N-N5 BXP N-QB3 N-KB3 P-B3 P-Q4 PXP + +L 2W1 N-QB3 N-KB3 V 3W2 P-KN3 P-Q4 PXP NXP B-N2 NXN NPXN B-Q3 N-K2 O-O O-O N-B3 P-Q4 Q-B3 +L 3W2 N-B3 B-N5 T 4W2 +L 3W2 B-B4 NXKP V 4W4 NXN P-Q4 +E E BXP KXB NXN P-Q4 +L 4W4 N-B3 NXN QPXN P-QB3 NXP P-Q4 +L 4W4 Q-R5 N-Q3 QXKP Q-K2 QXQ BXQ B-N3 N-B4 N-B3 P-QB3 O-O P-Q4 +E E E E E E E E E E B-N3 B-K2 V 6W2 QXKP O-O P-Q4 N-B3 Q-B4 P-QN4 N-B3 B-N2 B-K3 N-R4 O-O-O P-N5 N-K2 N/Q3-B5 +L 6W2 N-B3 N-B3 NXP O-O N-Q5 N-Q5 O-O NXB RPXN N-K1 P-Q4 P-Q3 N-KB3 B-K3 +L 3W2 P-B4 P-Q4 PXQP NXP NXN QXN PXP N-B3 N-B3 B-KN5 B-K2 NXP +E E E E E E E E E E PXKP NXP P-Q3 NXN +E E Q-B3 N-QB3 NXN N-Q5 Q-B4 PXN +E E E E E E N-B3 B-K2 P-Q4 B-QN5 Q-Q3 P-QB4 +E E B-Q2 N-QB3 B-Q3 NXB QXN B-N5 Q-B4 Q-Q2 + +L 2W1 B-B4 N-KB3 V 3W3 N-QB3 NXP T 4W4 +L 3W3 N-KB3 NXP N-B3 NXN QPXN P-QB3 NXP P-Q4 +L 3W3 P-B4 NXP P-Q3 N-Q3 B-N3 N-B3 +L 3W3 P-Q3 P-B3 P-B4 PXP QBXP P-Q4 PXP NXP +E E E E E E Q-K2 B-K2 P-B4 P-Q4 KPXP KPXP BXP O-O +E E E E BPXP NXP +E E E E E E N-KB3 P-Q4 PXP PXP B-QN5 B-Q2 +L 3W3 P-Q4 PXP N-KB3 P-Q4 PXP B-QN5 P-B3 Q-K2 + +L 2W1 P-KB4 PXP B-B4 P-Q4 BXP N-KB3 N-QB3 B-QN5 +E E E E E E Q-B3 N-QB3 P-B3 N-B3 P-Q4 P-Q4 +E E E E E E N-QB3 Q-R5 K-K2 P-Q4 NXP B-Q3 +E E E E E E N-KB3 P-Q4 P-K5 P-KN4 P-KR3 N-KR3 P-Q4 N-B4 +E E E E E E PXP N-KB3 V 5WZ B-N5 P-B3 PXP NXP P-Q4 B-Q3 P-Q5 NXP +E E Q-K2 B-K3 N-K5 O-O BXN PXB BXP N-Q4 B-N3 P-B3 NXP BXB PXB Q-Q2 N-R5 B-N5 +L 5WZ B-B4 B-Q3 N-B3 O-O O-O QN-Q2 P-QR3 N-N3 B-R2 B-KN5 P-Q4 Q-Q2 N-K2 QNXP P-B4 N-K6 +L 5WZ B-K2 NXP N-B3 V 6BZ NXN NPXN B-Q3 P-Q4 O-O O-O N-B3 P-B4 P-QN3 P-B3 B-KN5 N-K1 BXB QXB +L 5WZ P-B4 P-B3 PXP NXP P-Q4 B-KN5 +E E E E P-Q4 B-QN5 N-B3 O-O B-K2 PXP O-O PXP QBXP N-B3 +L 5WZ N-B3 NXP B-K2 T 6BZ NXN QXN P-Q4 N-B3 B-K2 B-KN5 BXP O-O-O P-B3 Q-K5 Q-Q2 BXN PXB Q-Q4 R-KN1 P-KN3 P-N3 B-N2 + +L 2W1 P-Q4 PXP N-KB3 B-B4 NXP N-KB3 N-QB3 P-Q4 P-K5 Q-K2 +E E PXP O-O +E E E E E E E E P-QB3 PXP B-QB4 PXP BXNP P-Q4 BXQP N-KB3 BXBP KXB QXQ B-QN5 Q-Q2 BXQ NXB P-B4 + +L KP P-QB4 N-KB3 V 2B2 P-Q3 P-Q4 N-KB3 N-B3 +E E PXP NXP N-KB3 N-QB3 V 5B6 P-KN3 B-K2 B-N2 O-O V 7B5 O-O B-K3 N-B3 Q-Q2 V 9B3 N-KN5 BXN BXB N-Q5 R-B1 P-QB4 NXN BXN RXP BXB KXB N-K3 RXP P-B3 +E E E E E E E E B-K3 P-QN3 +E E E E B-Q2 P-QB4 N-K4 P-QN3 +L 9B3 P-Q4 PXP NXP KR-Q1 NXB NXN QXQ NXKP +E E E E NXQN QXN NXN BXN BXB RXB +L 7B5 N-B3 B-K3 O-O Q-Q2 T 9B3 +L 5B6 P-K4 B-QN5 +E E P-K3 B-K2 B-K2 B-K3 +E E N-B3 B-K3 +E E P-QR3 B-K3 +L 5B6 N-B3 B-K2 P-K4 N-N3 +E E P-K3 B-K3 +L 5B6 P-QR3 B-K2 P-K3 B-K3 +E E N-B3 B-K3 +E E P-K4 N-N3 V 7B7 B-K3 O-O QN-Q2P-QR4 R-B1 P-B3 +E E B-K2 B-K3 O-O P-B3 V 11B4 Q-B2 N-Q5 +E E R-B1 R-B2 Q-B2 B-KB1 N-N3 R-Q2 N-B5 BXN +L 11B4 N-N3 P-R5 N-B5 BXN BXB R-B2 Q-B2 R-Q2 QR-B1 N-B1 P-R3 B-N6 Q-N1 N/QB1-R2 N-Q2 B-K3 P-QN3 PXP NXP N-N4 +L 7B7 B-K2 O-O V 8B4 O-O B-K3 V 9B6 B-K3 V 10W4 P-B3 QN-Q2 P-QR4 T 11B4 +E Q-B2 N-Q5 +E E P-Q4 PXP NXP NXN BXN P-QB4 +E E E E E E P-QN4 P-QR4 P-N5 N-Q5 NXN PXN B-B4 P-R5 +L 9B6 QN-Q2 P-B3 P-QN4 P-QR4 P-N5 N-Q5 NXN QXN N-N3 Q-R5 +E E QR-N1 KR-Q1 B-N2 Q-R5 +E E E E E E E E E E Q-B2 P-QR4 P-QN3 Q-Q2 B-N2 V 13W2 KR-Q1V 13B2 QR-B1 B-B1 +E E KR-Q1 B-B1 +E E B-B3 Q-K1 P-R3 Q-B1 Q-N2 B-QB4 KR-B1 R-Q2 N-B1 N-B1N-N3 N/QB1-R2 P-QN4 PXP PXP BXNP BXB QXB QXQ NXQ R-R4 N/QN5-QB3 KR-R1 P-QN3 P-Q4 PXP B-N5 NXB RXR K-B2 +L 13B2 KR-B1 N-B1 B-B3 N/QB1-R2 +L 9B6 Q-B2 P-QR4 V 10B3 P-QN3 Q-Q2 V 11B5 B-N2 P-B3 QN-Q2 T 13W2 B-B3 KR-Q1 Q-N2 B-QB4 QN-Q2 Q-K2 KR-K1 R-Q2 B-B1 QR-Q1 N-B4 NXN QPXN B-KN5 +L 11B5 B-K3 KR-Q1 R-B1 N-B1 +E E QN-Q2 N-B1 KR-Q1 N/QB1-R2 N-B4 P-B3 Q-N2 N-N4 P-QR4 N/QN4-Q5 NXN NXN BXN QXB QXQ RXQ +L 10B3 B-K3 P-R5 Q-B3 B-B3 QN-Q2 N-Q5 BXN PXB Q-N4 Q-Q3 +E E E E E E R-B1 Q-Q2 QN-Q2 KR-B1 +E E E E E E QN-Q2 N-Q5 NXN PXN B-B4 P-QB4 B-N3 R-B1 N-B4 NXN PXN P-QN4 PXP B-N6 Q-Q2 P-B5 +L 10B3 QN-Q2 P-R5 P-QN4 PXG NXNP N-R5 +L 9B6 P-QN4 P-QR4 P-N5 N-Q5 NXKP B-B3 +L 8B4 B-K3 B-K3 O-O T 10W4 + +L 2B2 P-QR3 N-B3 P-Q3 P-Q4 +E E E E P-K3 N-B3 P-QR3 P-Q4 +E E N-QB3 P-Q4 +E E P-Q3 P-Q4 + +L 2B2 N-KB3 P-K5 N-Q4 N-B3 NXN QPXN +E E N-B2 P-Q4 +E E P-K3 NXN PXN P-Q4 P-Q3 B-QN5 +E E N-B3 PXP BXP QXP Q-N3 B-QB4 BXP K-K2 O-O R-Q1 +E E E E E E P-Q3 PXP Q-N3 B-K3 QXP B-QB4 B-K3 P-Q7 +E E E E BXB PXB QXKP B-K2 B-K3 Q-KN5 + +L 2B2 N-QB3 P-Q4 PXP NXP N-KB3 N-QB3 +E E P-KN3 P-QB4 V 5B7 N-B3 N-QB3 NXN QXN P-Q3 B-K2 B-N2 O-O O-O Q-K3 B-K3 R-N1 P-QR3 B-Q2 P-QN4 PXP PXP BXP BXP NXB RXN B-B4 R-R1 P-QN4 P-Q4 PXP NXP Q-QN3 P-K3 KR-Q1 +L 5B7 B-N2 B-K3 N-R3 N-QB3 O-O B-K2 +E E E E N-B3 N-QB3 O-O B-K2 +E E N-KN5 QXN BXN BXB NXB O-O-O +E E E E NXN Q-Q1 N-K3 Q-Q2 P-Q3 B-K2 +E E E E P-K4 N-QN5 O-O Q-Q2 Q-R5 B-Q3 P-Q4 BPXP NXN BXN QXKP O-O R-Q1 KR-Q1 B-K3 PXB +E E E E E E E E E E E E E E Q-R4 B-Q2 Q-N3 P-B5 QXP R-B1 + +L 2B2 P-KN3 P-Q4 B-N2 N-B3 PXP NXP N-QB3 B-K3 N-B3 NXN NPXN P-K5 + +L KP P-K3 P-Q4 P-Q4 PXP PXP B-Q3 V 4B6 N-KB3 N-KB3 N-B3 O-O +E E B-KN5 O-O +E E P-QB3 O-O +E E P-QB4 Q-K2 +E E B-Q3 O-O O-O B-KN5 B-KN5 QN-Q2 QN-Q2 P-B3 P-B3 Q-B2 Q-B2 KR-K1 KR-K1 B-R4 +L 4B6 B-Q3 N-KB3 N-KB3 O-O +L 4B6 P-QB3 N-KB3 B-Q3 O-O +L 4B6 P-QB4 Q-K2 B-K2 PXP +E E Q-K2 PXP +E E B-K3 N-KB3 +L 4B6 N-QB3 P-QB3 N-KB3 N-KB3 B-Q3 O-O +E E E E B-Q3 N-K2 Q-R5 N-R3 P-QR3 Q-Q2 KN-K2 N-B2 B-KB4 BXB NXB Q-N5 + +L KP P-QB3 P-Q4 P-Q4 PXP PXP B-Q3 N-QB3 P-QB3 N-B3 B-KB4 B-N5 N-B3 P-K3 Q-N3 Q-B1 QN-Q2 B-K2 O-O O-O P-KR3 B-R4 Q-B2 B-N3 BXB + +L KP N-KB3 P-K5 N-Q4 P-Q4 P-Q3 P-QB4 N-N3 PXP KPXP B-Q3 +E E BPXP B-Q3 + +L KP P-Q3 P-Q4 +E E P-KN3 P-Q4 +E E P-Q4 PXP N-KB3 P-Q4 NXP N-KB3 + +L KP N-QB3 N-KB3 P-K4 B-N5 T 3B2 + +L ORG P-Q4 P-Q4 V 2W2 P-QB4 P-K3 V 3W4 N-QB3 P-QB3 V 4W5 P-K4 PXKP NXP B-N5 V 6W3 N-QB3 P-QB4 B-K3 N-KB3 N-KB3 N-B3 +E E KN-K2 N-N5 +E E P-QR3 BXN PXB Q-R4 B-Q2 N-K5 Q-N4 NXB QXNP QXBP QXR K-Q2 +E E E E E E Q-B2 NXB QXN PXP PXP QXQ KXQ N-B3 +L 6W3 B-Q2 QXP BXB QXN V 8W4 N-K2 N-Q2 Q-Q6 P-QB4 B-B3 N-K2 +E E BXP NXB QXN B-Q2 P-B3 P-QN3 +E E E E E E E E Q-Q2 QXBP N-B4 Q-K5 B-K2 P-QB4 B-QB3 KN-B3 +L 8W4 B-K2 P-QB4 B-QB3 N-K2 BXP R-N1 B-B6 N-Q2 BXN KXB +E E E E E E E E BXP QXNP V 10W2 Q-Q4 N-Q2 B-B3 Q-N4 B-Q6 N-K2 +E E B-QN4 Q-K4 N-K2 QXQ NXQ N-K4 O-O-O P-QR3 +E E B-K2 B-Q2 R-KN1 N-K2 B-Q6 N/K4-N3 R-Q1 P-K4 +L 10W2 Q-Q6 N-Q2 O-O-O Q-B3 +L 10W2 B-B3 Q-N4 B-K3 Q-QR4 B-Q2 Q-B2 N-K2 N-QB3 B-B3 N-K4 N-Q4 B-Q2 +E E E E E E E E E E Q-Q6 N-Q2 B-K3 Q-QR4 P-QN4 Q-K4 +E E E E E E B-Q6 N-K2 N-K2 N-B4 R-KN1 Q-Q1 +L 4W5 N-B3 N-B3 V 5W4 B-N5 PXP V 6WM P-K3 P-QN4 P-QR4 B-N5 +L 6WM P-QR4 B-N5 P-K4 BXN PXB Q-R4 P-K5 N-K5 B-Q2 Q-Q4 +E E R-QB1 N-Q2 BXP NXB NXN NXP +E E E E B-K3 N-N3 Q-B2 P-KB4 PXG NXP/KB3 R-R1 QN-Q4 B-Q2 P-QN4 +L 6WM P-K4 P-QN4 V 7WM P-QR4 P-N5 N-QN1 P-KR3 BXN QXB BXP Q-N3 QN-Q2 QXNP R-KN1 Q-R6 Q-N3 P-QR4 O-O-O +L 7WM Q-B2 P-KR3 B-R4 P-KN4 B-N3 P-KN5 N-K5 QXQP B-K2 B-QN5 O-O BXN PXB QXKP Q-Q2 QN-Q2 +L 7WM P-K5 P-KR3 V 8WM PXN PXB PXP BXP +L 8WM BXN PXB P-QR4 B-N5 KPXP QXBP N-K5 P-B4 B-K2 N-Q2 O-O BPXP N-N4 Q-N2 NXNP P-KR4 +L 8WM B-R4 P-N4 V 9WM B-N3 N-Q4 N-Q2 N-Q2 KN-K4 Q-R4 +L 9WM KNXP PXN BXNP QN-Q2 V 11WM Q-B3 B-QN2 NXP Q-R4 +E E N-K4 B-N5 K-K2 NXN BXQ P-QB4 +E E E E E E PXN Q-R4 B-Q2 Q-N3 B-K3 P-QB4 PXP BXBP BXB NXB Q-K3 O-O-O +E E E E E E E E E E E E B-K2 Q-N3 PXN P-QB4 P-Q5 P-N5 +E E E E BXN P-QB4 V 14WM P-Q5 NXB QXN R-R3 Q-B3 P-N5 N-K4 PXP N-B6 RXN QXR QXQ PXQ O-O-O +L 14WM PXP NXBP Q-N3 P-N5 BXR PXN PXP N-K5 Q-B4 B-KR3 +E E E E QXP N-K5 Q-K3 B-B4 +L 14WM N-K4 KR-N1 Q-B4 PXP B-R5 N-B4 NXN QXN +E E BXBP K-Q2 NXN BXN BXR B-QN5 +E E O-O-O RXP +L 11WM P-KN3 Q-N3 PXN B-QN2 B-N2 V 13BM O-O-O O-O N-K4 PXN RXQ KRXR P-QB4 +E E QRXR P-QB4 +E E E E Q-K2 QXP QR-Q1 N-Q6 +E E KR-Q1 N-Q6 +E E B-K3 Q-Q6 KR-Q1 QXQ V 18WM RXR KXR NXQ K-B1 BXRP P-QB4 P-QR4 N-B6 +E E E E R-Q1 P-QB4 BXB KXB R-Q8 B-N2 RXR BXR N-B3 K-B3 +E E BXP BXP B-N4 N-B3 B-B3 P-K4 K-B1 P-N5 B-Q2 P-QR4 P-KR4 P-K5 B-B1 N-K4 P-QR3 N-Q6 PXP PXP B-K3 BXNP B-Q4 BXB NXB P-N6 N-N5 K-N3 N-B3 K-R4 K-K2 K-N5 N-Q5 K-R6 P-R5 P-N7 N-B3 K-N6 K-Q2 NXP P-R6 P-K6 K-K2 KXN +E E KXP N-N5 K-Q4 NXP +L 18WM NXQ RXR RXR P-QB4 BXB KXB R-Q8 B-N2 RXR BXR N-B3 K-B3 +E E BXP BXP B-N4 N-B3 B-B3 P-K4 +L 11WM PXN B-QN2 P-KN3 Q-N3 B-N2 T 13BM +E E B-K2 Q-N3 O-O O-O-O P-QR4 P-N5 N-K4 P-B4 Q-N1 Q-B2 +E E E E E E E E P-QR4 O-O-O O-O P-N5 N-K4 P-B4 Q-N1 Q-B2 +E E E E E E P-R5 Q-B2 P-R6 B-R1 O-O Q-N3 +E E E E O-O P-R3 +L 9WM PXN PXB NXRP B-QN2 P-KN3 N-Q2 B-N2 Q-N3 P-R4 P-QR4 +E E E E E E E E N-K5 QXBP V 11WMM P-KN3 N-Q2 P-B4 B-QN2 +E E Q-K2 NXN PXN Q-Q1 B-N2 B-QN2 NXP PXN BXB B-N5 K-B1 R-QN1 B-B6 K-B1 R-Q1 Q-B2 +L 11WM P-QR4 P-N5 N-K4 Q-B5 +L 11WM B-K2 N-Q2 V 12WMM NXP/QB6 B-QN2 B-B3 P-R3 Q-K2 R-B1 N-K5 BXB NXB Q-B5 P-Q5 N-B4 +E E E E E E E E O-O B-N2 V 15WMM P-Q5 BXN PXB N-K4 B-K4 O-O Q-K2 QR-B1 P-R4 NXP PXP N-Q5 +L 15WMM P-R4 P-N5 N-K4 Q-B5 P-KN3 PXP RPXP Q-B2 NXNP R-Q1 Q-K2 BXP QR-Q1 N-K4 N-KB6 K-B1 +E E RXB NXB QXN RXR Q-B6 RXN QXR K-K2 R-Q1 Q-Q3 RXQ R-K8 K-R2 R-KR8 +L 12WMM O-O NXN PXN QXKP B-B3 B-QN2 R-K1 Q-Q3 NXP QXQ QRXQ B-N5 R-K2 K-K2 L 5W4 PXP KPXP V 6W4 B-B4 B-K2 P-K3 B-KB4 +E E Q-B2 P-KN3 P-K3 B-KB4 +L 6W4 B-N5 V 6B3 B-K2 P-K3 B-KB4 +E E Q-B2 P-KN3 P-K3 B-KB4 B-Q3 BXB QXB QN-Q2 B-R6 N-N5 +E E O-O O-O P-QR3 P-QR4 +E E QR-B1 R-K1 N-Q2 K-N2 N-N3 B-Q3 P-KR3 P-KR3 +L 5W4 Q-N3 QN-Q2 PXP KPXP +E E B-N5 B-K2 PXP KPXP +E E P-K3 O-O PXP KPXP +E E B-K2 PXP QXBP N-Q4 BXB QXB O-O KN-N3 Q-Q3 P-K4 +L 5W4 P-K3 QN-Q2 V 6W5 PXP KPXP B-Q3 B-Q3 O-O O-O Q-B2 R-K1 +L 6W5 B-Q2 B-Q3 PXP KPXP +E E B-Q3 O-O PXP KPXP +E E O-O PXP BXBP P-K4 +L 6W5 P-QN3 B-N5 B-N2 N-K5 +E E B-Q2 O-O P-QR3 B-Q3 +E E B-K2 Q-K2 O-O B-Q3 PXP KPXP +E E Q-B2 PXP PXP P-K4 N-KN5 R-K1 +L 6W5 P-QR3 B-Q3 +L 6W5 N-K5 NXN PXN N-Q2 P-KB4 B-QB4 P-QR3 Q-K2 P-QN4 B-N3 B-K2 O-O O-O P-B3 P-QB5 B-B2 PXP NXKBP P-KN4 P-K4 +L 6W5 Q-B2 B-Q3 V 7W4 P-K4 PXKP NXP NXN QXN P-K4 PXP NXP NXN Q-QR4 +E E B-KB4 O-O NXN BXN BXB R-K1 +E E E E BXN BXB NXB R-K1 +E E E E E E E E B-Q3 P-KB4 QXKBP N-B3 Q-N5 P-K5 BXP NXB QXNP Q-B3 +E E E E E E E E E E P-B5 B-K2 NXP NXN QXN O-O +L 7W4 P-QN3 O-O B-K2 PXP PXP P-K4 O-O R-K1 B-N2 PXP PXP N-B1 QR-Q1 N-N3 +L 7W4 PXP KPXP +L 7W4 B-Q2 O-O PXP KPXP +E E O-O-O P-QB4 P-K4 BPXP KNXP PXBP BXP N-N3 B-K2 B-Q2 +E E E E E E E E PXQP KPXP B-K1 P-B5 P-KN4 N-N3 +E E E E K-N1 P-QR3 B-B1 P-B5 P-KN4 N-N3 P-KR3 R-K1 B-N2 B-QN5 +L 6W5 B-Q3 PXP BXBP P-QN4 B-K2 B-K2 O-O P-QR3 P-K4 P-N5 +E E E E E E B-N3 P-N5 N-QR4 B-R3 +E E N-K2 B-N2 O-O B-K2 N-B4 O-O +E E N-N3 O-O P-K4 P-QB4 +E E E E E E E E E E B-Q3 P-N5 N-QR4 P-QB4 PXP NXP B-N5 B-Q2 BXB KNXB +E E E E E E E E N-K2 P-QB4 O-O B-N2 N-K5 B-Q3 P-KB4 O-O +E E E E E E E E N-K4 NXN BXN B-N2 Q-R4 Q-N3 O-O B-K2 N-Q2 R-QB1 +E E E E E E Q-B2 R-B1 BXRP P-QB4 +E E E E B-Q2 B-K2 P-QR3 P-QR4 Q-R4 Q-N3 +E E E E E E O-O B-K2 Q-R4 O-O B-Q2 Q-N3 +E E BXBP N-N3 +E E E E P-QN3 O-O B-N2 N-B3 B-Q3 P-QB4 PXP BXP R-QB1 B-K2 N-K5 Q-Q4 +E E E E E E R-QB1 R-QB1 Q-K2 N-K5 B-R6 Q-N3 BXB QXB PXP BXP N-K5 B-K2 N-B4 KR-Q1 +L 4W5 P-K3 N-KB3 N-B3 QN-Q2 T 6W5 +E PXP KPXP +L 4W5 PXP KPXP V 5W5 N-B3 B-KB4 B-B4 B-Q3 BXB QXB P-K3 N-B3 B-Q3 BXB QXB QN-Q2 O-O O-O QR-N1 KR-K1 P-QN4 P-QR3 P-QR4 N-K5 +L 3W4 PXP PXP N-QB3 P-QB3 T 5W5 +L 3W4 N-KB3 N-KB3 V 4W6 PXP KPXP N-QB3 P-QB3 T 6W4 +E E E N-B3 P-B3 T 5W4 +E B-N5 P-KR3 B-R4 PXP +E E BXN QXB N-B3 P-QB3 V 7W3 P-K3 N-Q2 PXP KPXP +E E B-Q3 B-Q3 PXP KPXP +E E O-O Q-K2 P-K4 PXBP BXP P-K4 +E E E E PXP KPXP P-K4 PXP NXP O-O R-K1 N-B3 N-K5 NXN BXN B-K3 B-B2 BXN PXB KR-Q1 Q-K2 R-Q5 QR-Q1 QR-Q1 P-QR3 Q-N4 RXR RXR R-Q1 B-B5 Q-K1 B-Q4 P-KN3 RXR BXR Q-B8 +E E QXR QXKP B-N3 QXQNP BXB PXB QXP Q-B8 K-N2 Q-B3 +L 7W3 Q-N3 PXP QXBP N-Q2 P-K4 P-K4 P-Q5 N-N3 +E E E E R-Q1 B-K2 P-KN3 O-O B-N2 P-K4 +E E E E P-K3 O-O B-Q3 P-KN3 +L 7W3 PXP KPXP P-K3 N-Q2 +E E E E P-K4 PXKP NXP B-N5 K-K2 Q-B5 +E E N-B3 P-B4 R-B1 O-O PXP P-K4 +E E E E E E QN-Q2 P-B4 P-QR3 BXN QXB PXP QXQP N-B3 QXQ PXQ P-B5 B-Q2 B-N5 K-K2 + +L 2W2 N-KB3 N-KB3 V 3WY P-QB4 P-K3 T 4W6 +E P-KN3 P-QB4 PXP P-K3 P-QN4 P-QR4 P-B3 PXP PXP P-QN3 +E E E E E E E E B-N2 P-K3 O-O N-B3 +L 3WY P-K3 V 3BZ P-KN3 B-Q3 B-N2 O-O O-O QN-Q2 P-B4 P-B3 KN-Q2 Q-K2 N-QB3 P-KR3 R-K1 B-N5 P-QR3 B-R4 P-QN4 B-B2 B-N2 +L 3WY B-B4 V 3BJ P-B4 P-K3 N-B3 P-B3 Q-N3 Q-B1 B-B4 PXP QXBP QN-Q2 R-B1 N-N3 Q-N3 Q-Q2 P-K3 B-Q3 B-K5 +E E E E E E N-Q4 NXN KPXN Q-N3 P-QR4 P-QR3 P-R5 Q-B3 +L 3WY N-B3 P-KN3 B-B4 B-N2 P-K3 O-O P-KR3 P-B4 B-K2 P-N3 O-O B-N2 N-K5 QN-Q2 +L 3WY B-N5 N-K5 V 4WJ B-B4 P-QB4 PXP N-QB3 P-K3 P-B3 P-B4 P-K4 B-N3 B-K3 QN-Q2 NXN NXN BXP P-QR3 P-Q5 N-N3 B-N3 +L 4WJ B-R4 P-QB4 PXP N-QB3 P-K3 P-KN3 QN-Q2 NXQBP B-K2 B-N2 P-B3 O-O O-O P-QR4 + +L 2W2 P-K3 N-KB3 V 3WZ N-KB3 T 3BZ P-KB4 P-QB4 P-B3 Q-B2 N-B3 P-KN3 B-Q3 B-N2 +E E E E B-Q3 P-KN3 N-B3 B-N2 +L 3WZ B-Q3 N-B3 P-QB3 P-K4 +E E P-KB4 N-QN5 B-K2 B-B4 +E E N-KB3 NXB QXN P-KN3 O-O B-N2 +E E E E PXN P-KN3 O-O B-N2 N-B3 O-O B-Q2 P-QN3 N-K5 P-QB4 A +L 2W2 P-K4 PXP P-KB3 P-K4 QPXP QXQ KXQ N-QB3 B-QN5 B-Q2 +E E B-KB4 KN-K2 PXP N-N3 +L 2W2 B-B4 N-KB3 N-KB3 T 3BJ + + +L ORG P-QB4 V ENG P-K4 N-QB3 N-KB3 V 3W5 P-KN3 P-B3 V 4W7 P-Q4 PXP QXP P-Q4 PXP PXP +E E B-N5 B-K2 N-B3 O-O B-N2 P-KR3 B-B4 P-B4 Q-Q3 P-Q5 N-QN5 N-B3 B-B7 Q-K1 O-O B-N5 +L 4W7 B-N2 P-Q4 PXP PXP Q-N3 N-B3 NXP N-Q5 +E E E E P-Q3 N-B3 N-B3 B-K2 O-O O-O P-Q4 P-K5 N-K5 B-K3 +E E E E E E E E P-B4 P-Q5 PXP N-KN5 N-K4 B-QN5 K-B1 KNXKP N-R3 O-O N-B4 K-R1 +L 4W7 N-B3 P-K5 N-Q4 P-Q4 PXP PXP P-Q3 Q-N3 N-N3 N-N5 P-Q4 B-K3 P-B3 PXP PXP N-KB3 B-K3 N-B3 +E E E +E E E E E E E PXP B-QB4 P-K3 PXP B-N2 O-O O-O B-KN5 +E E NXP NXN BXN R-K1 +L 3W5 N-B3 N-B3 V 4W8 P-Q4 PXP NXP B-B4 NXN NPXN P-KN3 O-O +L 4W8 P-K4 B-N5 P-Q3 P-Q3 B-K2 O-O O-O BXN PXB Q-K2 N-K1 N-K1 N-B2 P-B4 PXP BXP +L 4W8 P-KN3 P-KN3 B-N2 B-N2 O-O O-O R-N1 P-Q3 P-QN4 P-K5 N-K1 B-B4 P-Q3 P-Q4 PXQP NXQP +E E P-N5 N-K2 PXQP QNXP NXN NXN PXP N-B6 +E E E E B-N2 NXN BXN R-K1 +L 4W8 P-QR3 P-Q4 +E E P-K3 B-N5 N-Q5 P-K5 NXB NXN N-Q4 O-O P-QR3 N-R3 B-K2 P-Q4 +L 4W8 P-Q3 P-Q4 PXP NXP P-KN3 B-K3 B-N2 B-K2 O-O O-O P-QR3 Q-Q2 B-Q2 QR-Q1 P-QN4 NXN BXN B-B3 + +L ORG N-KB3 N-KB3 P-Q4 P-Q4 P-QB4 P-K3 T 4W6 +E E E P-QB4 P-K3 P-Q4 P-Q4 T 4W6 +E N-B3 P-Q4 PXP PXP P-Q4 P-B3 T 6W4 +E E E E E E E P-QN3 P-Q4 B-N2 B-B4 P-K3 P-K3 B-K2 P-KR3 +E E +E E E E E E P-KN3 P-Q4 B-N2 V 3B4 P-B4 O-O P-K3 P-Q4 B-K2 +E E P-Q3 N-B3 QN-Q2 B-K2 P-K4 O-O V 8W5 P-K5 N-KN5 Q-K2 P-B3 PXP BXP P-B3 Q-Q3 P-Q4 PXP NXP P-K4 +L 8W5 Q-K2 Q-B2 P-K5 N-Q2 R-K1 V 10B1 P-QN4 P-KR4 P-QR4 N-B1 B-R3 N/B1-R2 P-N5 P-R5 P-R5 P-R6 P-N3 N-N4 P-B5 +L 8W5 R-K1 Q-B2 P-K5 N-Q2 Q-K2 T 10B1 +L 8W5 P-B3 PXP PXP Q-B2 Q-B2 P-K4 R-K1 B-K3 N-N5 B-Q2 N-B1 P-KR3 N-B3 B-K3 + +L ORG P-KN3 N-KB3 B-N2 P-Q4 N-KB3 T 3B4 + +L ORG P-KB4 P-Q4 P-K3 N-KB3 P-QN3 P-Q5 +E E N-KB3 B-N5 P-KR3 BXN +E E P-B4 P-K3 N-B3 P-B3 +E E E E P-QN3 P-K3 B-N2 B-K2 +E E E E B-K2 BXN BXB QN-Q2 P-B4 P-K3 PXP PXP N-B3 P-B3 O-O B-K2 P-Q3 N-N3 P-K4 PXP PXP B-B4 +  \ No newline at end of file diff --git a/MUDDLE/c.ubd026 b/MUDDLE/c.ubd026 new file mode 100644 index 0000000..185ab52 --- /dev/null +++ b/MUDDLE/c.ubd026 @@ -0,0 +1,390 @@ + + + + + + (SEVERITY STR "TUPLE" TEXT) + + + + + + ) + (<==? > ATOM> >) + (ELSE >)> + ;"Space" + > + ) + (<==? .SEVERITY STOP> )>> + + + + + + + +>> + +>> + + + + + +> + > + >> + + + + + + + > + > + +>> + > + > >>> + + + +> + >> + +> + > + >> + +> + + + >> + +> + > + >> + >> + + WORD> + >> + >>> + > + >) + (ELSE + > + -1>> + >>)>> + +> + .PRINFLG >> + +> + +> + > + > + + 2>>> + 1>>>> + +> + > + >> + + + +>> + + + + > + + + + + + + (NAME "OPTIONAL" (PFLG <>) "NAME" COMPILER) + ATOM>> + ) + (> + ) + ( FUNCTION>> + )> + > ;"Recursive calls" + > + ;"Remove" + > + + + > + > + + + >>> + + + LIST> > + > + + > + ATOM> + + + + + + ) + (<==? .MODE EXTRA> + + + + ) + (<==? .MODE OPTIONAL> + > + > + + + + + + + + + + ) + (ELSE )>) + ( LIST> <==? 2>> + + + > + > + + ) + (<==? .MODE OPTIONAL> + > + > + + > + + + + + > + + + + ) + (ELSE + )>) + (<==? STRING> + ) + ( <=? .ITEM "AUX">> + ) + (ELSE + + )>) + (ELSE )> + > >> + > + + + > + > ATOM> ;"Activation name ?" + + > + > + > + > > + > ;"Go do the real compilation for this object" + ;"Next object in the body" + >> + > + +) AGAIN:TAG EXIT:TAG) + + > > + > ATOM> + + > + > + EXTRA> + > > + >> + > + > ATOM> >> + > + > >> + > + + > + +)) + ) + (ELSE + > + > > + + > + + )>> + + + ;"Is there some function to compile this object ?" + THIS:TYPE> + ;"Is there some function for this type ?" + ,REFERENCE!-SETUP> + .OBJECT>> + + + + + >> + THIS:OBJECT >> + )) + < + ;"Do we know how to apply this ?" + APPLY:TYPE> + ;"Apply this type ?" + APPLY:PRIMTYPE> + ;"This primtype ?" + + ;"Otherwise go to eval with form" + + >> + .OBJ>>>> + + ;"Try again with the global value if possible" + + ) + ( > + ;"Else with local value" + + + ) + (ELSE + + + ;"Otherwise go to EVAL with the form" + + )>>> + + > > + > + + >>>> + > ;"Get atomic name of RSUBR" + + + + > > + > + + >>>> + 2>> + > + > ;"Get the structure" + + ;"Get the indicator" + + >> + + + 2> + > + > + >> + > ) + (<==? 1> + > + + ) + (ELSE )>>> + 2>> + > + >>> + )) + > > + > + >> + > + > + + > > + >> + + + > >> + >> + ,TEST:TRUE!-SETUP T>>> + ,TEST:FALSE!-SETUP #FALSE ()>>>> + + + + +                                                                              \ No newline at end of file diff --git a/MUDDLE/comp.envr b/MUDDLE/comp.envr new file mode 100644 index 0000000000000000000000000000000000000000..01ade44658f58bb4b41e5e4193225b7db0f7907c GIT binary patch literal 156852 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

Zn8`Wto3mOZVpwmiW=e#n?7lTbuJ)ZHRSM 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 literal 0 HcmV?d00001 diff --git a/MUDDLE/create.14 b/MUDDLE/create.14 new file mode 100644 index 0000000..b16a28b --- /dev/null +++ b/MUDDLE/create.14 @@ -0,0 +1,109 @@ + +TITLE PROCESS-HACKER FOR MUDDLE + +RELOCATABLE + +.INSRT MUDDLE > + +.GLOBAL ICR,NAPT,IGVAL,CHKARG,RESFUN,RETPROC + +MFUNCTION CREATE,SUBR + + ENTRY 1 + GETYP A,(AB) ;GET TYPE OF ARG + ;MUST BE SOME APPLIABLE TYPE + CAIE A,TSUBR ;SUBR? + CAIN A,TEXPR ;EXPR? + JRST OKFUN + CAIE A,TFSUBR ;FSUBR? + CAIN A,TFUNARG ;FUNARG? + JRST OKFUN + CAIE A,TFIX ;CALL TO GET? (ALLOWING THIS IS QUESTIONABLE) + JRST NAPT ;NO, ERROR - NON-APPLIABLE TYPE +OKFUN: + + PUSHJ P,ICR ;CREATE A NEW PROCESS + MOVE C,TPSTO+1(B) ;GET ITS SRTACK + PUSH C,[TENTRY,,RETPROC] + PUSH C,[1,,0] ;TIME + PUSH C,[0] + PUSH C,SPSTO+1(B) + PUSH C,PSTO+1(B) + MOVE D,C + ADD D,[3,,3] + PUSH C,D ;SAVED STACK POINTER + PUSH C,PPSTO+1(B) ; + PUSH C,[RETPROC] + MOVEM C,TPSTO+1(B) ;STORE NEW TP + HRRI D,1(C) ;MAKE A TB + HRLI D,2 ;WITH A TIME + MOVEM D,TBINIT+1(B) + MOVEM D,TBSTO+1(B) ;SAVE ALSO FOR SIMULATED START + MOVE C,(AB) ;STORE ARG + MOVEM C,RESFUN(B) ;INTO PV + MOVE C,1(AB) + MOVEM C,RESFUN+1(B) + JRST FINIS + +MFUNCTION RETPROC,SUBR +; WHO KNOWS WHAT THIS SHOULD REALLY DO +;PROBABLY, JUST AN EXIT +;FOR NOW, PRINT OUT AN ERROR MESSAGE + PUSH TP,$TATOM + PUSH TP,MQUOTE ATTEMPT-TO-RETURN-OUT-OF-PROCESS + JRST CALER1 + + + + + + +MFUNCTION RESUME,FSUBR +;RESUME IS CALLED WITH TWO ARGS +;THE FIRST IS A PROCESS FORM OF THE PROCESS TO BE RESUMED +;THE SECOND IS A FUNCTION TO BE CALLED WHEN THIS PROCESS +; (THE PARENT) IS ITSELF RESUMED +;IF THE FUNCTION IS NOT GIVEN SOME STANDARD FUNCTION IS +;PLUGGED IN +; +; NOTE - TYPE AND NUMBER OF ARGS CHECKS MUST BE ADDED TO BOTH RESUME AND CREATE + + ENTRY 1 + HRRZ C,@1(AB) ;GET CDR ADDRESS + JUMPE C,NOFUN ;IF NO SECOND ARG, SUPPLY STANDARD + HLLZ A,(C) ;GET CDR TYPE + CAME A,$TATOM ;ATOMIC? + JRST RES2 ;NO, MUST EVAL TO GET FUNCTION + MOVE B,1(C) ;YES + PUSHJ P,IGVAL ;TRY TO GET GLOBAL VALUE + CAMN A,$TUNBOUND ;GLOBALLY UNBOUND? + JRST LFUN ;YES, TRY FOR LOCAL VALUE +RES1: MOVEM A,RESFUN(PVP) ;STORE IN THIS PROCESS + MOVEM B,RESFUN+1(PVP) + + HRRZ C,1(AB) ;GET CAR ADDRESS + PUSH TP,(C) ;PUSH PROCESS FORM + PUSH TP,1(C) + JSP E,CHKARG ;CHECK FOR DEFERED TYPE + ;INSERT CHECKS FOR PROCESS FORM + MCALL 1,EVAL ;EVAL PROCESS FORM WHICH WILL SWITCH + ; PROCESSES + JRST FINIS + +RES2: PUSH TP,(C) ;PUSH FUNCTION ARG + PUSH TP,1(C) + JSP E,CHKARG ;CHECK FOR DEFERED + MCALL 1,EVAL ;EVAL TO GET FUNCTION + JRST RES1 + +LFUN: HRRZ C,1(AB) ;GET CDR ADDRESS + PUSH TP,(C) + PUSH TP,1(C) + MCALL 1,VALUE ;GET LOCAL VALUE OF ATOM FOR FUNCTION + JRST RES1 + +NOFUN: MOVSI A,TUNBOUND ;MAKE RESUME FUNCTION UNBOUND + JRST RES1 + +END +  \ No newline at end of file diff --git a/MUDDLE/editor.8 b/MUDDLE/editor.8 new file mode 100644 index 0000000..d38f0cb --- /dev/null +++ b/MUDDLE/editor.8 @@ -0,0 +1,140 @@ +"MUDDLE EDITOR, PRETTY-PRINT, AND OTHER ASSORTED ROUTINES" + +%%)> +FRAMES +LINPOS +LINLNT +PAGPOS +PAGLNT +LPT +TPL +1+ +1- +INC +DEC +CHOP +DEFINE +PPRINT +EPPRINT +EDITOR +%% + "PAGE 2" +%% )>> + +) + (ELSE )>)> + > + .NAME >> + +)(SMALL 1)) + )> + > + + > + + > + > + >>> + + + + + + +>> +>> + +>>> + +>>> + +>>> + + +>> + +) + (.DEFAULT )>>> + "PAGE 3" + + + + + + + + +)) + + -1> .TABS>> + 8> -1> .SPACES>>)>>> + +)) + > + >>)> + + >>> + + + "PAGE 4" + .M>> + ) + + + + (<==? FORM> + > + + <+ .M 1>> + ">) + (<==? LIST> + > + ) + (<==? VECTOR> + > + ) + (<==? FUNCTION> + + > + " >) + ( ) + (ELSE + > + + > + )> +>> + "PAGE 5" + + + >) + ( + >) + (ELSE UNASSIGNED)>>> + + + + + + DONE>> + +%% + +  \ No newline at end of file diff --git a/MUDDLE/eval.234 b/MUDDLE/eval.234 new file mode 100644 index 0000000..ede3105 --- /dev/null +++ b/MUDDLE/eval.234 @@ -0,0 +1,2054 @@ +TITLE EVAL -- MUDDLE EVALUATOR + +RELOCATABLE + +; GERALD JAY SUSSMAN, 1971 + +.GLOBAL PROCID,LPROG,GLOBSP,GLOBASE,SPBASE,TPBASE,PTIME +.GLOBAL IGVAL,CHKARG,SWAP,NXTDCL,TPOVFL,CHFRM +.GLOBAL ILVAL,CALER,CALER1,ER1ARG,SPECBIND,SPECSTORE,WRONGT,ERRTMA +.GLOBAL IDVAL,EVECTO,EUVECT,CHARGS + +.INSRT MUDDLE > + + MFUNCTION EVAL,SUBR + INTGO + HLRZ A,AB ;GET NUMBER OF ARGS + CAIE A,-2 ;EXACTLY 1? + JRST AEVAL ;EVAL WITH AN ALIST + HLRZ A,(AB) ;GET TYPE OF ARG + CAILE A,NUMPRI ;PRIMITIVE? + JRST NONEVT ;NO + JRST @EVTYPT(A) ;YES-DISPATCH + +SELF: MOVE A,(AB) ;TYPES WHICH EVALUATE + MOVE B,1(AB) + JRST FINIS ;TO SELF-EG NUMBERS + +;EVALUATES A IDENTIFIER -- GETS LOCAL VALUE IF THERE IS ONE, OTHERWISE GLOBAL. + +MFUNCTION VALUE,SUBR + JSP E,CHKAT + PUSHJ P,IDVAL + JRST FINIS + +IDVAL: PUSH TP,A + PUSH TP,B ;SAVE ARG IN CASE NEED TO CHECK GLOBAL VALUE PUSHJ P,ILVAL ;LOCAL VALUE FINDER + CAME A,$TUNBOUND ;IF NOT UNBOUND OR UNASSIGNED + JRST RIDVAL ;DONE - CLEAN UP AND RETURN + JUMPN B,UNAS ;IF UNASSIGNED - ERROR + POP TP,B ;GET ARG BACK + POP TP,A + PUSHJ P,IGVAL + CAMN A,$TUNBOUND + JRST UNBOU + POPJ P, +RIDVAL: SUB TP,[2,,2] + POPJ P, + + +;GETS THE LOCAL VALUE OF AN IDENTIFIER + +MFUNCTION LVAL,SUBR + JSP E,CHKAT + PUSHJ P,ILVAL + CAME A,$TUNBOUND + JRST FINIS + JUMPN B,UNAS + JRST UNBOU + + +; GETS A LOCATIVE TO THE LOCAL VALUE OF AN IDENTIFIER. + +MFUNCTION LLOC,SUBR + JSP E,CHKAT + PUSHJ P,ILOC + CAMN A,$TUNBOUND + JRST UNBOU + MOVSI A,TLOCD + HRR A,2(B) + JRST FINIS + +;TESTS TO SEE IF AN IDENTIFIER IS LOCALLY BOUND + +MFUNCTION BOUND,SUBR,[BOUND?] + JSP E,CHKAT + PUSHJ P,ILVAL + CAMN A,$TUNBOUND + JUMPE B,IFALSE + JRST TRUTH + +;TESTS TO SEE IF AN IDENTIFIER IS LOCALLY ASSIGNED + +MFUNCTION ASSIGP,SUBR,[ASSIGNED?] + JSP E,CHKAT + PUSHJ P,ILVAL + CAME A,$TUNBOUND + JRST TRUTH + JUMPE B,UNBOU + JRST IFALSE + +;GETS THE GLOBAL VALUE OF AN IDENTIFIER + +MFUNCTION GVAL,SUBR + JSP E,CHKAT + PUSHJ P,IGVAL + CAMN A,$TUNBOUND + JRST UNAS + JRST FINIS + +;GETS A LOCATIVE TO THE GLOBAL VALUE OF AN IDENTIFIER + +MFUNCTION GLOC,SUBR + JSP E,CHKAT + PUSHJ P,IGLOC + CAMN A,$TUNBOUND + JRST UNAS + MOVSI A,TLOCD + JRST FINIS + +;TESTS TO SEE IF AN IDENTIFIER IS GLOBALLY ASSIGNED + +MFUNCTION GASSIG,SUBR,[GASSIGNED?] + JSP E,CHKAT + PUSHJ P,IGVAL + CAMN A,$TUNBOUND + JRST IFALSE + JRST TRUTH + + + +CHKAT: ENTRY 1 + HLLZ A,(AB) + CAME A,$TATOM + JRST NONATM + MOVE B,1(AB) + JRST 2,(E) + +;EVALUATE A FORM. IF CAR IS AN ATOM USE GLOBAL VALUE OVER LOCAL ONE. + +EVFORM: SKIPN C,1(AB) ;EMPTY? + JRST IFALSE + HLLZ A,(C) ;GET CAR TYPE + CAME A, $TATOM ;ATOMIC? + JRST EV0 ;NO -- CALCULATE IT + MOVE B,1(C) ;GET PTR TO ATOM + PUSHJ P,IGVAL + CAMN A,$TUNBOUND + JRST LFUN + PUSH TP,A + PUSH TP,B + JRST IAPPLY ;APPLY IT +EV0: PUSH TP,A ;SET UP CAR OF FORM AND + PUSH TP,1(C) + JSP E,CHKARG + MCALL 1,EVAL ;EVALUATE IT + PUSH TP,A ;APPLY THE RESULT + PUSH TP,B ;AS A FUNCTION + JRST IAPPLY + +LFUN: MOVE B,1(AB) + PUSH TP,$TATOM + PUSH TP,1(B) + MCALL 1,VALUE + PUSH TP,A + PUSH TP,B + JRST IAPPLY + +;DISPATCH TABLE FOR EVAL +DISTBL EVTYPT,SELF,[[TLIST,EVLIST],[TFORM,EVFORM],[TVEC,EVECT],[TSEG,ILLSEG],[TUVEC,EUVEC]] + + + +;WATCH FOR SUBTLE BUG 43 LERR,LPROG OR PROCID +AEVAL: + CAIE A,-4 ;EXACTLY 2 ARGS? + JRST WNA ;NO-ERROR + HLRZ A,2(AB) ;CHECK THAT WE HAVE A FRAME + CAIN A,TFRAME + JRST .+3 + CAIE A,TENV + JRST WTYP + MOVE A,3(AB) + HRRZ D,2(AB) ;GET POINTER TO PV DOPE WORD + PUSHJ P,SWAPQ ;SEE IF SWAP NECESSARY + PUSH TP,(D) + PUSH TP,1(D) + MCALL 1,EVAL ;NOW DO NORMAL EVALUATION +UNSWPQ: MOVE D,1(TB) ;GET SAVED PVP + CAMN D,PVP ;CHANGED? + JRST FINIS ;NO - RETURNî PUSHJ P,SPECSTORE ;CLEAN UP + MOVE D,1(TB) + JSP C,SWAP + JRST FINIS + + +; ROUTINE TO CHANGE PROCID AND POSSIBLY SWAP + +SWAPQ: HLRZ C,(D) ;GET LENGTH + SUBI D,-1(C) ;POINT TO START OF PV + MOVNS C ;NEGATE LENGTH + HRLI D,2(C) ;MAKE AOBJN POINTER + MOVE E,PVP ;COPY CURRENT PROCESS VECTOR + POP P,B ;GET RET ADR SO POPJ WINS IF SWAP OCCURS + CAME D,PVP ;IS THIS IT? + JSP C,SWAP ;NO, SWAP IN NEW PROCESS + PUSH P,B ;NOW, PUT IT BACK + PUSH TP,$TPVP ;SAVE PROCESS + PUSH TP,E + HLL B,OTBSAV(A) ;GET TIME FROM FRAME POINTED AT + HRR B,A + HRRZ C,A + CAIG C,1(TP) + CAME B,A ;CHECK THAT THE FRAME IS LEGIT + JRST ILLFRA + HLRZ C,FSAV(C) + CAIE C,TENTRY + JRST ILLFRA + CAMN SP,SPSAV(A) + JRST AEV1 + MOVE SP,SPSAV(A) ;LOAD UP OLD ENVIRONMENT + MOVE A,PVP + ADD A,[PROCID,,PROCID] ;GET LOCATIVE TO PROCESS ID + PUSH TP,BNDV ;BIND IT TO + PUSH TP,A + AOSN A,PTIME ;A UNIQUE NUMBER + .VALUE [ASCIZ /TIMEOUT/] + PUSH TP,$TFIX + PUSH TP,A + PUSHJ P,SPECBIND +AEV1: MOVE E,1(TB) ;GET SAVED PROCESS + MOVE D,AB ;COPY CURRENT ARG POINTER + CAME E,PVP ;HAS PROCESS CHANGED? + MOVE D,ABSTO+1(E) ;GET SAV AB + POPJ P, ;RETURN TO CALLER + + +; STACKFRAME FUNCTION (MUDDLE'S ANSWER TO APPLY) + + MQUOTE STACKFORM + +STFRM2: JRST NOENV ;FAKE OUT ENTRY + +MFUNCTION STACKFORM,FSUBR + + ENTRY 1 + + GETYP A,(AB) ;CHECK IT IS A LIST + CAIE A,TLIST + JRST WTYP ;NO, LOSE + + MOVEI A,3 ;CHECK ARG HAS AT LEAST 3 ELEMENTS + HRRZ B,1(AB) ;GET ARG + JUMPE B,TFA + HRRZ B,(B) ;CDR IT + SOJN A,.-2 ;AND COUNT + + JUMPE B,NOENV ;ENVIRONMENT NOT SUPPLIED + HRRZ A,(B) ;CHECK NOT TOO MANY + JUMPN A,TMA + + GETYP A,(B) ;GET TYPE OF LAST ARG + MOVSI A,(A) ;TYPE TO LH + PUSH TP,A + PUSH TP,1(B) ;PUSH THE ARG + JSP E,CHKARG ;CHECK FOR DEFERRED + MCALL 1,EVAL + HLRZ C,A ;ISOLATE TYPE IN C + CAIE C,TENV ;ENVIRONEMNT? + CAIN C,TFRAME ;OR FRAME? + JRST .+2 + JRST WTYP + + + MOVEI D,(A) ;IN B AND D + MOVE A,B ;AND TIME,,FRAME + PUSHJ P,SWAPQ ;AND CHECK FOR CHANGE + PUSH TP,$TLIST ;SAVE THE ARG + PUSH TP,1(D) ;ON TP + .MCALL 1,STFRM2 ;NOW CALL NON-ENV STACKFORM + JRST UNSWPQ ;AND POSSIBLY UNSWAP + +NOENV: HRRZ D,1(AB) ;GET POINTER TO FIRST + GETYP A,(D) ;GET TYPE + MOVSI A,(A) + PUSH TP,A + PUSH TP,1(D) ;PUSH THE ARG, (IT SHOULD BE A FUNCTION) + JSP E,CHKARG ;CHECK OUT DEFERRED + MCALL 1,EVAL ;EVAL IT + HRRZ C,1(AB) ;RESTORE ARG + HRRZ D,(C) ;POINT TO LIST OF FORMS + PUSH TP,A ;SAVE FUNCTION + PUSH TP,B + HLRZS A ;NOW DISPATCH ON TYPE + CAIN A,TSUBR;SUBR? + JRST STSUBR ;YES, HACK IT + CAIN A,TEXPR ;FUNCTION? + JRST STEXPR ;YES DO IT + CAIN A,TFUNARG ;FUNARG + JRST NOTIMP + JRST NAPT + + +; STACK FORM OF A SUBR + +STSUBR: PUSH P,[0] ;PUSH ARG COUNTER + +STLOO: PUSHJ P,EVALRG ;EVAL THE ARGUMENT + JRST MAKPTR ;DONE, FALL INTO EVAL CODE + AOS (P) ;COUNT + PUSH TP,A + PUSH TP,B ;SAVE THE ARGS + JRST STLOO + +; STACK FRAME OF EXPR + +STEXPR: MOVE C,(TP) ;GET FUNCTION + PUSHJ P,BINDRS ;BIND THE ARGS + JRST APEXP1 ;JOIN COMMON CODE + + + +IAPPLY: + HLRZ A,(TB) ;GET TYPE OF FUNCTION + CAIN A,TSUBR ;SUBR? + JRST APSUBR ;YES + CAIN A,TFSUBR ;NO -- FSUBR? + JRST APFSUBR ;YES + CAIN A,TEXPR ;NO -- EXPR? + JRST APEXPR ;YES + CAIN A,TFIX ;NO -- CALL TO NTH? + JRST APNUM ;YES + CAIN A,TFUNARG ;NO -- FUNARG? + JRST APFUNARG ;YES + CAIN A,TPVP ;NO -- PROCESS TO BE RESUMED? + JRST RESOMER ;YES + JRST NAPT ;NONE OF THE ABOVE + + +;APFSUBR CALLS FSUBRS + +APFSUBR: + PUSH TP,$TLIST ;GET THE + HRRZ A,@1(AB) + PUSH TP,A ;ARGUMENT LIST + MCALL 1,@1(TB) + JRST FINIS + +;APSUBR CALLS SUBRS + +APSUBR: + HRRZ A,@1(AB) ;GET CDR OF FORM -- ARGLIST + PUSH TP,$TLIST ;SAVE THE ARGLIST ON + PUSH TP,A ;THE TP + PUSH P,[0] ;MAKE SLOT FOR ARGCNT +TUPLUP: + SKIPN A,3(TB) ;IS IT NIL? + JRST MAKPTR ;YES -- DONE + PUSH TP,(A) ;NO -- GET CAR OF THE + HLLZS (TP) ;ARGLIST + PUSH TP,1(A) + JSP E,CHKARG + MCALL 1,EVAL ;AND EVAL IT. + PUSH TP,A ;SAVE THE RESULT IN + PUSH TP,B ;THE GROWING TUPLE + AOS (P) ;BUMP THE ARGCNT + HRRZ A,@3(TB) ;SET THE ARGLIST TO + MOVEM A,3(TB) ;CDR OF THE ARGLIST + JRST TUPLUP +MAKPTR: + POP P,A + ACALL A,@1(TB) + JRST FINIS + + + +;APNUM INTERPRETS NUMBERS AS CALL TO FUNCTION GET + +APNUM: + HRRZ A,@1(AB) ;GET ARGLIST + JUMPE A,ERRTFA ;NO ARGUMENT + PUSH TP,(A) ;GET CAR OF ARGL + HLLZS (TP) + PUSH TP,1(A) + HRRZ A,(A) ;MAKE SURE ONLY ONE ARG + JUMPN A,ERRTMA + JSP E,CHKARG ;HACK DEFERRED + MCALL 1,EVAL + PUSH TP,A + PUSH TP,B + PUSH TP,(TB) + PUSH TP,1(TB) + MCALL 2,NTH + JRST FINIS + +;APEXPR APPLIES EXPRS +;EXPRESSION IS IN 0(AB), FUNCTION IS IN 0(TB) + +APEXPR: + + SKIPN C,1(TB) ;BODY? + JRST NOBODY ;NO, ERROR + HRRZ 0,1(AB) ;GET EXPRESSION INTO 0 + HRRZ D,@0 ;AND ARGLIST INTO D + HLL 0,(AB) ;TYPE TO LH OF 0 + + PUSHJ P,BINDER ;DO THE BINDINGS + +APEXP1: HRRZ C,@1(TB) ;GET BODY BACK + JUMPE A,DOPROG ;NOW GO RUN IF NO ACTIVIATION + PUSH TP,$TLIST ;SAVE ANOTHER COPY FOR REACT + PUSH TP,C + SKIPL A ;SKIP IF NOT NAME ALA HEWITT + HRRZ C,(C) ;ELSE CDR AGAIN + JRST DOPROG + + + +RESOMER: +; 0,1(TB) IS PROCESS VECTOR POINTER TO PROCESS TO BE RESUMED +; 0,1(AB) IS A FORM CONTAINING ARGS TO SAVED FUNTION + + MOVE D,1(TB) ;GET PVP OF PROCESS TO BE RESUMED + GETYP A,RESFUN(D) ; GET TYPE OF FUNCTION + + CAIN A,TSUBR ;SUBR? + JRST RESSUBR ;YES + CAIN A,TFSUBR ;NO -- FSUBR? + JRST RESFSUBR ;YES + CAIN A,TEXPR ;NO -- EXPR? + JRST RESEXPR ;YES + CAIN A,TFIX ;NO -- CALL TO NTH? + JRST RESNUM ;YES + CAIN A,TFUNARG ;NO -- FUNARG? + JRST NOTIMP ;YES + JRST NAPT ;NONE OF THE ABOVE + + +;RESFSUBR RESUMES FSUBRS + +RESFSUBR: + HRRZ A,@1(AB) ;GET THE ARG LIST + SUB TP,[2,,2] ;CLEAN UP + JSP C,SWAP ;SWAP IN NEW PROCESS + PUSH TP,$TLIST + PUSH TP,A ; PUSH THE ARG LIST + MCALL 1,@RESFUN+1(PVP) ; RESUME WITH THE SAVED FUNCTION + JRST FINIS + +;RESSUBR RESUMES SUBRS + +RESSUBR: + HRRZ A,@1(AB) ;GET CDR OF FORM -- ARGLIST + PUSH TP,$TLIST ;SAVE THE ARGLIST ON + PUSH TP,A ;THE TP + PUSH P,[0] ;MAKE SLOT FOR ARGCNT +RESTUPLUP: + SKIPN A,3(TB) ;IS IT NIL? + JRST RESMAKPTR ;YES -- DONE + PUSH TP,(A) ;NO -- GET CAR OF THE + HLLZS (TP) ;ARGLIST + PUSH TP,1(A) + JSP E,CHKARG + MCALL 1,EVAL ;AND EVAL IT. + MOVE D,1(TB) ;GET PVP OF P.T.B.R. + MOVE C,TPSTO+1(D) ;GET TP OF P.T.B.R. + PUSH C,A ;SAVE THE RESULT IN THE GROWING + PUSH C,B ;TUPLE OF ARGS IN P.T.B.R. + MOVEM C,TPSTO+1(D) ;UPDATE TP OF P.T.B.R. + AOS (P) ;BUMP THE ARGCNT + HRRZ A,@3(TB) ;SET THE ARGLIST TO + MOVEM A,3(TB) ;CDR OF THE ARGLIST + JRST RESTUPLUP +RESMAKPTR: + POP P,A ;GET NUMBER OF ARGS IN A + MOVE D,1(TB) ;GET PVP OF P.T.B.R. + SUB TP,[4,,4] ;GET RID OF GARBAGE + JSP C,SWAP ;SWAP IN THE NEW PROCESS + ACALL A,RESFUN+1(PVP) ;CALL THE SAVED FUNCTION + JRST FINIS + + + +;RESNUM INTERPRETS NUMBERS AS CALL TO FUNCTION GET + +RESNUM: + HRRZ A,@1(AB) ;GET ARGLIST + JUMPE A,ERRTFA ;NO ARGUMENT + PUSH TP,(A) ;GET CAR OF ARGL + HLLZS (TP) + PUSH TP,1(A) + HRRZ A,(A) ;MAKE SURE ONLY ONE ARG + JUMPN A,ERRTMA + JSP E,CHKARG ;HACK DEFERRED + MCALL 1,EVAL + MOVE D,1(TB) ;GET PVP OF P.T.B.R. + MOVE C,TPSTO+1(D) ;GET TP OF P.T.B.R. + PUSH C,A ;PUSH ARG + PUSH C,B + SUB TP,[2,,2] ;CLEAN UP BEFORE LEAVING + JSP C,SWAP ;BRING IN NEW PROCESS + PUSH TP,RESFUN(PVP) ;PUSH NUMBER + PUSH TP,RESFUN+1(PVP) + MCALL 2,NTH + JRST FINIS + +;RESEXPR RESUMES EXPRS +;EXPRESSION IS IN 0(AB), FUNCTION IS IN RESFUN(PVP) +RESEXPR: + SKIPN C,RESFUN+1(D);BODY? + JRST NOBODY ;NO, ERROR + + MOVE C,TPSTO+1(D) ;GET TP OF P.T.B.R. + PUSH C,BNDA ;SPECIAL ATOM CROCK + PUSH C,MQUOTE [PPROC ]INTERR ;PPROC=PARENT PROCESS + MOVE B,OTBSAV(TB) + PUSHJ P,MAKENV ;MAKE ENVIRONMENT FOR THIS PROCESS + PUSH C,A + PUSH C,B + MOVEM C,TPSTO+1(D) ;UPDATE TP OF P.T.B.R. + HRRZ 0,1(AB) ;GET EXPRESSION INTO 0 + HRRZ A,@0 ;AND ARGLIST INTO A + HLL 0,(AB) ;TYPE TO LH OF 0 + SUB TP,[2,,2] ;CLEAN UP BEFORE LEAVING + JSP C,SWAP ;SWAP IN NEW PROCESS + PUSH P,0 ;SAVE 0 + PUSH P,A ;SAVE A=ARGLIST + PUSH TP,[0] + PUSH TP,[0] ;COMPLETE ARGS FOR PPROC BINDING + PUSHJ P,SPECBIND ;BIND THE PARENT PROCESS + POP P,D ;POP ARGLIST INTO D + POP P,0 ;POP CALL HACK INTO 0 + MOVE C,RESFUN+1(PVP) ;GET FUNCTION + PUSHJ P,BINDRR ;CALL BINDER FOR RESUMED EXPR HACKING + + HRRZ C,@RESFUN+1(PVP) ;GET BODY BACK + JUMPE A,DOPROG ;NOW GO RUN IF NO ACTIVIATION + PUSH TP,$TLIST ;SAVE ANOTHER COPY FOR REACT + PUSH TP,C + SKIPL A ;SKIP IF NOT NAME ALA HEWITT + HRRZ C,(C) ;ELSE CDR AGAIN + JRST DOPROG + + +; EVALUATE LISTS, VECTORS, UNIFROM VECTORS + +EVLIST: PUSH P,[-1] ;-1 -- THIS IS A LIST + JRST EVL1 ;GO TO HACKER + +EVECT: PUSH P,[0] ;0 -- THIS IS A GENERAL VECTOR + JRST EVL1 + +EUVEC: PUSH P,[1] ;1 -- THIS IS A UNIFORM VECTOR + +EVL1: PUSH P,[0] ;PUSH A COUNTER + GETYPF A,(AB) ;GET FULL TYPE + PUSH TP,A + PUSH TP,1(AB) ;AND VALUE + +EVL2: INTGO ;CHECK INTERRUPTS + SKIPN A,1(TB) ;ANYMORE + JRST EVL3 ;NO, QUIT + SKIPL -1(P) ;SKIP IF LIST + JUMPG A,EVL3 ;JUMP IF VECTOR EMPTY + GETYPF B,(A) ;GET FULL TYPE + SKIPGE C,-1(P) ;SKIP IF NOT LIST + HLLZS B ;CLOBBER CDR FIELD + JUMPG C,EVL7 ;HACK UNIFORM VECS +EVL8: PUSH P,B ;SAVE TYPE WORD ON P + CAMN B,$TSEG ;SEGMENT? + MOVSI B,TFORM ;FAKE OUT EVAL + PUSH TP,B ;PUSH TYPE + PUSH TP,1(A) ;AND VALUE + MCALL 1,EVAL ;AND EVAL IT + POP P,C ;AND RESTORE REAL TYPE + CAMN C,$TSEG ;SEGMENT? + JRST DOSEG ;YES, HACK IT + AOS (P) ;COUNT ELEMENT + PUSH TP,A ;AND PUSH IT + PUSH TP,B +EVL6: SKIPGE A,-1(P) ;DONT SKIP IF LIST + HRRZ B,@1(TB) ;CDR IT + JUMPL A,ASTOTB ;AND STORE IT + MOVE B,1(TB) ;GET VECTOR POINTER + ADD B,AMNT(A) ;INCR BY APPROPRIATE AMOUNT +ASTOTB: MOVEM B,1(TB) ;AND STORE BACK + JRST EVL2 ;AND LOOP BACK + +AMNT: 2,,2 ;INCR FOR GENERAL VECTOR + 1,,1 ;SAME FOR UNIFORM VECTOR + +CHKARG: GETYP A,-1(TP) + CAIE A,TDEFER + JRST (E) + HRRZS (TP) ;MAKE SURE INDIRECT WINS + MOVE A,@(TP) + MOVEM A,-1(TP) ;CLOBBER IN TYPE SLOT + MOVE A,(TP) ;NOW GET POINTER + MOVE A,1(A) ;GET VALUE + MOVEM A,(TP) ;CLOBBER IN + JRST (E) + + + +EVL7: HLRE C,A ;FIND TYPE OF UVECTOR + SUBM A,C ;C POINTS TO DOPE WORD + GETYP B,(C) ;GET TYPE + MOVSI B,(B) ;TO LH NOW + SOJA A,EVL8 ;AND RETURN TO DO EVAL + +EVL3: SKIPL -1(P) ;SKIP IF LIST + JRST EVL4 ;EITHER VECTOR OR UVECTOR + + MOVEI B,0 ;GET A NIL +EVL9: MOVSI A,TLIST ;MAKE TYPE WIN +EVL5: SOSGE (P) ;COUNT DOWN + JRST FINIS ;DONE, RETURN + PUSH TP,$TLIST ;SET TO CALL CONS + PUSH TP,B + MCALL 2,CONS + JRST EVL5 ;LOOP TIL DONE + + +EVL4: MOVEI B,EUVECT ;UNIFORM CASE + SKIPG -1(P) ;SKIP IF UNIFORM CASE + MOVEI B,EVECTO ;NO, GENERAL CASE + POP P,A ;GET COUNT + .ACALL A,(B) ;CALL CREATOR + JRST FINIS + +; PROCESS SEGMENTS FOR THESE HACKS + +DOSEG: MOVEM A,BSTO(PVP) ;WILL BECOME INTERRUPTABLE WITH GOODIE IN B + HLRZS A ;TYPE TO RH + PUSHJ P,SAT ;GET STORAGE TYPE + + CAIN A,S2WORD ;LIST? + JRST LSTSEG + CAIN A,S2NWORD ;GENERAL VECTOR? + JRST VECSEG + CAIN A,SNWORD ;UNIFORM VECTOR? + JRST UVCSEG + CAIE A,SARGS ;ARGS TUPLE? + JRST ILLSEG ;NO, ERROR + + PUSH TP,BSTO(PVP) ;PREPARE TO CHECK ARGS + PUSH TP,B + SETZM BSTO(PVP) ;TYPE NOT SPECIAL + MOVEI B,-1(TP) ;POINT TO SAVED COPY + PUSHJ P,CHARGS ;CHECK ARG POINTER + POP TP,B ;AND RESTORE WINNER + POP TP,BSTO(PVP) ;AND TYPE AND FALL INTO VECTOR CODE + +VECSEG: PUSH P,[2,,2] ;PUSH AMOUNT TO BUMP + JRST SEG1 ;AND JOIN COMMON CODE + +UVCSEG: PUSH P,[1,,1] ;AMOUNT FOR UVECTS + JRST SEG1 + + + +LSTSEG: SKIPL -1(P) ;SKIP IF IN A LIST + JRST SEG3 ;ELSE JOIN COMMON CODE + HRRZ C,@1(TB) ;CHECK FOR END OF LIST + JUMPN C,SEG3 ;NO, JOIN COMMON CODE + SETZM BSTO(PVP) ;CLOBBER SAVED GOODIES + JRST EVL9 ;AND FINISH UP + + + + +SEG3: PUSH P,[0] ;AMOUNT OF ADDING FOR LIST +SEG1: INTGO ;CHECK OUT INTERRUPTS + JUMPE B,SEG2 ;DONE? + SKIPE C,(P) ;CHECK IF LIST OR VECTOR + JUMPG B,SEG2 ;END OF VECTOR + CAMN C,[1,,1] ;SKIP IF NOT UNIFORM + JRST SEG5 ;HACK UNIFORM SEGMENT + GETYPF A,(B) ;GET NEXT TYPE + SKIPGE -2(P) ;SKIP IF NOT LIST + HLLZS A ;CLEAR CDR + MOVE C,1(B) ;GET VALUE +SEG4: PUSH TP,A ;PUSH TYPE + PUSH TP,C + PUSH P,B ;CAN USE P BECAUSE CHKARG NOT INTERRUPTABLE + JSP E,CHKARG ;CHECK OUT TDEFER + POP P,B ;RESTORE + SKIPG (P) ;SKIP IF NOT LIST + HRRZ B,(B) ;CDR THE LIST + ADD B,(P) ;AND BUMP IT + AOS -1(P) ;BUMP COUNT + JRST SEG1 ;AND DO IT AGAIN + +SEG2: SETZM BSTO(PVP) ;CLOBBER TYPE BACK + SUB P,[1,,1] ;POP OFF LOSSAGE + JRST EVL6 + +SEG5: HLRE C,B ;FIND TYPE + SUBM B,C ;POINT TO DOPE WORD + GETYP A,(C) ;GET TYPE + MOVSI A,(A) ;TO LH + MOVE C,(B) ;NOW GET VALUE + JRST SEG4 + + + +;APFUNARG APPLIES OBJECTS OF TYPE FUNARG + +APFUNARG: + HRRZ A,@1(TB) ;GET CDR OF FUNARG + JUMPE A,FUNERR ;NON -- NIL + HLRZ B,(A) ;GET TYPE OF CADR + CAIE B,TLIST ;BETTR BE LIST + JRST FUNERR + PUSH TP,$TLIST ;SAVE IT UP + PUSH TP,1(A) +FUNLP: + INTGO + SKIPN A,3(TB) ;ANY MORE + JRST DOF ;NO -- APPLY IT + HRRZ B,(A) + MOVEM B,3(TB) + HLRZ C,(A) + CAIE C,TLIST + JRST FUNERR + HRRZ A,1(A) + HLRZ C,(A) ;GET FIRST VAR + CAIE C,TATOM ;MAKE SURE IT IS ATOMIC + JRST FUNERR + PUSH TP,BNDA ;SET IT UP + PUSH TP,1(A) + HRRZ A,(A) + PUSH TP,(A) ;SET IT UP + PUSH TP,1(A) + JSP E,CHKARG + PUSH TP,[0] + PUSH TP,[0] + JRST FUNLP +DOF: + PUSHJ P,SPECBIND ;BIND THEM + MOVE A,1(TB) ;GET GOODIE + HLLZ B,(A) + PUSH TP,B + PUSH TP,1(A) + HRRZ A,@1(AB) + PUSH TP,$TLIST + PUSH TP,A + MCALL 2,CONS + PUSH TP,$TFORM + PUSH TP,B + MCALL 1,EVAL + JRST FINIS + + +;ILOC RETURNS IN A AND B A LOCATIVE TO THE LOCAL VALUE OF THE IDENTIFIER PASSED TO IT +;IN A AND B. IF THE IDENTIFIER IS LOCALLY UNBOUND IT RETURNS $TUNBOUND IN A AND 0 IN B, +; IT IS CALLED BY PUSHJ P,ILOC. + +ILOC: MOVSI A,TLOCI ;MAKE A LOCATIVE TYPE CELL + HRR A,PROCID+1(PVP) ;FOR THE CURRENT PROCESS + CAME A,(B) ;IS THERE ONE IN THE VALUE CELL? + JRST SCHSP ;NO -- SEARCH THE LOCAL BINDINGS + MOVE B,1(B) ;YES -- GET LOCATIVE POINTER + POPJ P, ;FROM THE VALUE CELL + +SCHSP: MOVE C,SP ;GET TOP OF BINDINGS +SCHLP: JUMPE C,UNPOPJ ;IF NO MORE -- LOSE + CAMN B,1(C) ;ARE WE POINTING AT THE WINNER? + JRST SCHFND ;YES + HRRZ C,(C) ;FOLLOW LINK + JRST SCHLP + +SCHFND: EXCH B,C ;SAVE THE ATOM PTR IN C + MOVEI B,2(B) ;MAKE UP THE LOCATIVE + SUBI B,(TP) + HRLI B,-1(B) + ADD B,TP + + MOVEM A,(C) ;CLOBBER IT AWAY INTO THE + MOVEM B,1(C) ;ATOM'S VALUE CELL + POPJ P, + +UNPOPJ: MOVSI A,TUNBOUND + MOVEI B,0 + POPJ P, + +;IGLOC RETURNS IN A AND B A LOCATIVE TO THE GLOBAL VALUE OF THE +;IDENTIFIER PASSED TO IT IN A AND B. IF THE IDENTIFIER IS GLOBALLY +;UNBPOUND IT RETURNS $TUNBOUND IN A AND 0 IN B. IT IS CALLED BY PUSHJ P,IGLOC. + + IGLOC: MOVSI A,TLOCI ;DO WE HAVE A LOCATIVE TO + CAME A,(B) ;A PROCESS #0 VALUE? + JRST SCHGSP ;NO -- SEARCH + MOVE B,1(B) ;YES -- GET VALUE CELL + POPJ P, + +SCHGSP: MOVE D,GLOBSP+1(TVP) ;GET GLOBAL SP PTR + +SCHG1: JUMPGE D,UNPOPJ ;IF NO MORE, LEAVE + CAMN B,1(D) ;ARE WE FOUND? + JRST GLOCFOUND ;YES + ADD D,[4,,4] ;NO -- TRY NEXT + JRST SCHG1 + +GLOCFOUND: EXCH B,D ;SAVE ATOM PTR + ADD B,[2,,2] ;MAKE LOCATIVE + MOVEM A,(D) ;CLOBBER IT AWAY + MOVEM B,1(D) + POPJ P, + + + + +;ILVAL RETURNS IN A AND B THE LOCAL VALUE OF THE IDENTIFIER PASSED TO IT IN A AND B +;IF THE IDENTIFIER IS UNBOUND ITS VALUE IS $TUNBOUND IN A AND 0 IN B. IF +;IT IS UNASSIGNED ITS VALUE IS $TUNBOUND IN A AND -1 IN B. CALL - PUSHJ P,IVAL + +ILVAL: + PUSHJ P,ILOC ;GET LOCATIVE TO VALUE +CHVAL: CAMN A,$TUNBOUND ;BOUND + POPJ P, ;NO -- RETURN + MOVE A,(B) ;GET THE TYPE OF THE VALUE + MOVE B,1(B) ;GET DATUM + POPJ P, + +;IGVAL -- LIKE ILVAL EXCEPT FOR GLOBAL VALUES + +IGVAL: PUSHJ P,IGLOC + JRST CHVAL + + + + +;BINDER - THIS SUBROUTINE PROCCESSES FUNCTION DECLARATIONS AND BINDS +; ARGUMENTS AND TEMPORARIES APPROPRIATELY. +; +; CALL: PUSHJ P,BINDER OR BINDRS +; +; BINDER - ASSUMES ARGS ARE ON A LIST +; +; BINDRS - ASSUMES FORMS SUPPLIED FOR GETTING ARGS +; BINDRR - RESUME HACK - ARGS ON A LIST TO BE +; EVALED IN PARENT PROCESS +; + +; C/ POINTS TO FUNCTION BEING HACKED +; D/ POINTS TO ARG LIST (IF <0, CALLED FROM A PROG) +; 0/ IF NON-ZERO POINTS TO EXPRESSION GENREATING CALL + +BINDER: MOVEI A,0 +TBINDR: PUSH P,[ARGCDR] ;PUSH POINTER TO ARG GETTER + JRST BIND1 + +BINDRR: MOVEI A,0 +TBNDRR: PUSH P,[RESARG] ; ARG GETTER FOR RESUMING FUNCTIONS + JRST BIND1 + + +BINDRS: MOVEI A,0 ;NO TOP TEMPS +TBNDRS: PUSH P,[SETZ EVALRG] ;FOR THE STACKFORM CASE +BIND1: PUSH P,[2] ;PUSH INITIAL STATE (NO DCLS PROCESSED) + PUSH P,A ;NUMBER OF TEMPS ON TP STACK + + JUMPE C,NOBODY ;NO BODY IN FUNCTION, ERROR + + GETYP A,(C) ;GET FIRST THING IN FUNCTION + CAIE A,TATOM ;ATOMIC? + JRST BIND2 ;NO, NO NAME ALA HEWITT GIVEN + PUSHJ P,TMPUP ;COUNT TEMPS ON TP + PUSH TP,[TATOM,,1] ;YES SAVE IT + PUSH TP,1(C) + HRRZ C,(C) ;CDR THE FUNCTION TO POINT + JUMPE C,NOBODY + +BIND2: PUSHJ P,CARLST ;MAKE SURE THE CAR IS A LIST + JRST BNDRET ;EXIT IMMEDIATELY + MOVEI A,(C) ;COPY FOR NXTDCL + JUMPL D,AUXDO ;PROG, HANDLE + + PUSHJ P,NXTDCL ;GET A DECLARATION + JRST BINDRG ;NONE THERE, GO BIND ARGS + + CAME B,[ASCII /BIND/] ;IS A BINDING NEEDED + JRST BIND3 ;NO MUST BE ANOTHER FLAVOR OF DCL + + HRRZ C,(A) ;CDR THE LIST + JUMPE C,MPD ;LOSER + + PUSHJ P,CARATM ;GET THE CAR MAKING SURE OF ATOM + JRST MPD + HRRZ B,OTBSAV(TB) ;BUILD AN ENVIRONEMNT FOR BINDING VAR + PUSHJ P,MAKENV + + PUSHJ P,PSHBND ;PUSH THE BINDING ON THE STACK + HRRZ C,(C) ;CDR THE DCL LIST + JRST BINDRG ;GO BIND AS AN ARG + + + +; MAIN BINDING LOOP, DISPATCH BASED ON DECLARATION + +BIND4: MOVEI A,(C) ;COPY THE LIST POINTER + PUSHJ P,NXTDCL ;AND LOOK FOR A DECLARATION + JRST CHLIST ;ILLEGAL +BIND3: TRZ B,1 ;FOR OPTIONAL TO WIN + MOVSI A,-DCLS ;NOW GET SET TO SEARCH TABLE + HRRZ C,(C) ;CDR THE DCL LIST + JUMPE C,MPD ;NO, CDR, ERROR + + CAMN B,DCLST(A) ;SKIP IF NOT FOUND + JRST @DCLGO(A) ;DISPATCH BASED ON DCL + AOBJN A,.-2 + + JRST MPD + +DCLS==0 + +DCLST: IRP A,,[ARGS,TUPLE,CALL,OPTIO,ACT,AUX,NAME,EXTRA] + DCLS==DCLS+1 + ASCII /A/ + TERMIN + +DCLS2==0 + DCLGO: IRP A,,[ARGDO,TUPLDO,CALDO,OPTDO,ACTDO,AUXDO,ACTDO,AUXDO] + A + DCLS2==DCLS2+1 + TERMIN + +IFN ,PRINTC /LOSSAGE AT DCLS +/ +EXPUNGE DCLS2 + +;HERE TO CHECK FOR LISTS WITHIN DECLARATIONS + +CHLIST: GETYP A,(C) ;GET TYPE + CAIE A,TLIST ;LIST? + JRST MPD ;NO, LOSER + SKIPN A,1(C) ;CHECK NON-NIL + JRST CALD1 ;IF NIL, IGNORE + PUSH TP,[TLIST,,1] ;SPECIAL TYPE + PUSH TP,C + MOVEI C,(A) ;LIST TO C + PUSHJ P,TMPUP ;COUNT TEMPS + JRST BINDRG + + + + +;HANDLER FOR CALL DECLARATION + +CALDO: SKIPL -2(P) ;SKIP IF IN STACK-FORM + SOSG -1(P) ;SKIP IF FIRST DECLARATION + JRST MPD ;OTHERWISE MEANINGLESS + + JUMPE 0,MPD ;ALSO MEANINGLESS IF NO CALLSITE GIVEN + PUSHJ P,CARATD ;GOBBLE THE ATOM + + HLLZ A,0 ;SET UP CALL TO PUSH THE BINDING + HRRZ B,0 +CALD2: PUSHJ P,PSHBND ;PUSH THAT BINDING ON TO STACK + +CALD1: PUSH TP,$TLIST ;SAVE THE DCL LIST + PUSH TP,C + MOVEI E,-2(TP) ;POINT TO DCLS + SUB E,(P) ;SUBTRACT TEMPS +CALD3: PUSHJ P,SPCBE ;DO THE BINDINGS NOW + MOVE C,(TP) ;RESTORE DCLS + SUB TP,[2,,2] ;AND POP + HRRZ C,(C) ;CDR THE LIST +CALD4: SETZM -1(P) ;NEXT MUST BE EITHER AUX OR ACT + JUMPN C,BIND4 ;LOOP AGAIN + + + +BNDRET: MOVEI A,0 ;SET SWITCH +BNDRT2: SKIPN (P) ;ANY TEMPS LEFT? + JRST BNDRT1 + MOVE B,-1(TP) ;GET TYPE + CAMN B,[TATOM,,1] ;SPECIAL + JRST BNDRT3 + CAME B,[TLIST,,1] ;STACKED LIST + JRST BNDRT1 ;NO, LEAVE + + PUSHJ P,TMPDWN ;TEMPS DOWN + HRRZ C,@(TP) ;CDR THE SAVED LIST + SUB TP,[2,,2] ;POP OFF CRAP + JRST CALD4 ;AND CONTINUE PROCESSING + +BNDRT3: PUSHJ P,TMPDWN + MOVE E,(TP) ;GET ATOM + SUB TP,[2,,2] + MOVEI C,0 ;FOR ACTDO TO WIN + PUSHJ P,ACTD1 + MOVEI A,1 ;SAY NAME EXISTS + +BNDRT1: SUB P,[3,,3] + POPJ P, + + + +; HERE TO ARGS DECLARATION + +ARGDO: SOSL -1(P) ;LOSE IF STATES ARE 0 OR 1 + SKIPGE -2(P) ;ALSO LOSE IN STACK-FRAME + JRST MPD + + PUSHJ P,CARATD ;FIND THE ATOM + + MOVSI A,TLIST + MOVEI B,(D) ;COPY ARGL + JRST CALD2 ;AND FALL INTO CALL CODE + +;HERE TO HANDLE THE TUPLE DCL + +TUPLDO: SOSGE -1(P) ;CHECK STATE + JRST MPD + + PUSHJ P,CARATD ;GET ATOM + PUSH TP,$TLIST ;SAVE DCL LIST + PUSH TP,C + PUSHJ P,TMPUP ;COUNT THE TEMPS + SETZB A,B + + PUSHJ P,PSHBND ;PUSH THE BINDING FOR THIS CHOMPER + PUSH P,[0] ;PUSH ARG COUNTER + +TUPLP: PUSHJ P,@-3(P) ;CALL ARG GOBBLING SUBROUTINE + JRST TUPDONE ;LEAVE IF ALL DONE + + PUSHJ P,PSHAB ;PUSH THE EVALED ARG + SOS (P) ;COUNT THE ARG + JRST TUPLP + +TUPDON: MOVSI A,TTB ;FENCE POST ARG BLOCK + MOVE B,TB ;WITH A FRAME POINTER + PUSHJ P,PSHAB ;ONTO THE STACK + POP P,B ;GET NUMBER OF ARGS + ASH B,1 ;TIMES TWO + SKIPE B ;WATCH FOR EMPTY TUPLE + HRLI B,-1(B) ;FOR ADDING TO TOA TP + ADDI B,-1(TP) ;FUDGE POINTER + SUB B,(P) ;SUBTRACT TEMPS + MOVEI E,-1(B) ;B WIIL GET CLOBBERED, SAVE + MOVSI A,TARGS ;GET THE RIGHT TYPE + HLR A,OTBSAV(TB) ;WITH THE TIME + MOVEM A,-4(B) ;CLOBBER IT AWAY + MOVEM B,-3(B) ;AND ARG POINTER + + PUSHJ P,TMPDWN + JRST CALD3 + +; HERE TO HANDLE OPTIONAL DECLARATION + +OPTDO: SKIPG -1(P) + JRST MPD ;NOT ALLOWED + SETZM -1(P) ;MUNG STATE + JRST BNDRGL ;JOIN BIND LOOP + +BINDRG: SKIPG -1(P) ;CHECK STATE + JRST MPD + +BNDRGL: JUMPE C,CHLST ;CHECK FOR LAST + PUSH TP,$TLIST ;SAVE DCLS + PUSH TP,C + PUSH TP,$TLIST ;SAVE SLOT + PUSH TP,D ;PUT ARGLIST THERE FOR AN INT CHECK + INTGO + MOVE D,(TP) ;INCASE INTERRUPT CLOBBERED IT + SETZM (TP) ;NOW CLEAR SLOT + + +BNDRG3: PUSHJ P,CARATM ;CHECK FOR ATOM + JRST OPTDFL ;NO, MAY BE LIST OR MAY BE QUOTED + + PUSH TP,$TATOM + PUSH TP,E ;AND ATOM + + PUSHJ P,@-2(P) ;GOBBLE DOWN NEXT ARG + JRST USEDF ;CHECK FOR DEFAULT OT ENOUGH + +BNDRG2: HRRZ C,-4(TP) ;RESTORE DCLS + MOVE E,(TP) ;AND ATOM + SUB TP,[6,,6] ;FLUSH CRAP + + PUSHJ P,PSHBND ;PUSH THE BINDING +BNDRG4: HRRZ C,(C) ;CDR THE DCL LIST + JUMPN C,BNDRGL + +CHLST: PUSHJ P,@-2(P) ;CHECK FOR LAST + JRST .+2 + JRST TMA + MOVEI E,(TP) ;PREPARE TO BIND + SUB E,(P) + PUSHJ P,SPCBE ;BIND IF STUFF EXISTS + JRST BNDRET ;AND RETURN + + + +CHQT: CAIE A,TFORM ;IST THE ARG A FORM? + JRST OPTDF2 ;NO, END OF ARGS + + SKIPN C,1(C) ;CHECK FOR NULL BODY + JRST MPD + + GETYP A,(C) ;TYPE OF 1ST OF FORM + MOVE B,1(C) ;AND VALUE + CAIN A,TATOM ;BETTER BE ATOM + CAME B,MQUOTE QUOTE + JRST MPD ;NAMED QUOTE OR LOSSAGE + HRRZ C,(C) ;CDR THE FORM + JUMPE C,MPD ;NO, ARG LOSE + GETYP A,(C) + CAIE A,TATOM ;ARG MUST BE ATOM + JRST MPD + HRRZ A,(C) ;AND CDR BETTER BE NIL + JUMPN A,MPD + PUSH TP,$TATOM ;AND SAVE SAME + PUSH TP,1(C) + SKIPGE A,-2(P) ;CHECK TYPE OF ARGS + JRST QUOTHK ;STACK FRAME HACK + + JUMPE D,USEDF ;IF NO MORE ARGS, QUIT + GETYP A,(D) ;GET TYPE + MOVSI A,(A) ;TO LH + PUSH TP,A ;PUSH IT UP + PUSH TP,1(D) ;FOR DEFER CHECK + JSP E,CHKARG + POP TP,B ;GET BACK + POP TP,A + HRRZ D,(D) ;CDR THE ARG LIST + JRST BNDRG2 + +QUOTHK: PUSHJ P,(A) ;CALL ROUTINE + JRST USEDF ;TOO FEW ARGS + + PUSH TP,$TATOM ;QUOTE THE GOODIE + PUSH TP,MQUOTE QUOTE + PUSH TP,A + PUSH TP,B + MCALL 2,LIST ;CONS IT UP + MOVSI A,TFORM + JRST BNDRG2 + + + + +OPTDFL: SKIPN -1(P) ;SKIP IF CANT BE DEFAULT + CAIE A,TLIST ;SHOULD BE A LIST + JRST CHQT ;NO MORE OPTIONALS + + SKIPE (TP) ;AVOID LIST OF LIST + JRST MPD + MOVE C,1(C) ;GET THE CAR + HRRZ A,(C) ;CDR THE LIST + JUMPE A,MPD ;LOSER + HRRZ B,(A) ;CHECK FOR NIL CDR + JUMPN B,MPD + MOVEM A,(TP) ;SAVE + JRST BNDRG3 + +OPTDF2: JUMPN D,OPTDF3 ;IF D NON-ZERO, DONT BIND + MOVEI E,-4(TP) ;PREPARE TO BIND + SUBI E,@(P) ;SUBTRACT TEMPS + PUSHJ P,SPCBE ;DO BINDINGS MAYBE + MOVEI D,0 ;RESET D TO 0 +OPTDF3: MOVE C,-2(TP) ;RESTORE DCLS + SUB TP,[4,,4] ;POP STACK + MOVEI A,1 ;CLOBBER IN A NEW STATE + MOVEM A,-1(P) + JRST BIND4 ;AND RE-ENTER THE LOOP + + +USEDF: SKIPE -1(P) ;SKIP IF OPTIONAL + JRST TFA ;ELSE TOO FEW ARGS + MOVEI E,-6(TP) ;SET TO DO SPECBIND + SUBI E,@(P) + PUSHJ P,SPCBE ;BIND IF THEY EXIST + MOVNI B,1 ;ASSUME UNASSIGNED AT FIRST + MOVSI A,TUNBOU + SKIPN C,-2(TP) ;IF A FORM TO EVAL + JRST OPTDF4 ;TREAT NORMALLY + GETYP A,(C) ;EVAL IT + MOVSI A,(A) + PUSH TP,A + PUSH TP,1(C) + JSP E,CHKARG ;CHECK FOR DEFERRED POINTERS + MCALL 1,EVAL ;EVAL IT +OPTDF4: MOVE E,(TP) ;GET ATOM + MOVE C,-4(TP) + SUB TP,[6,,6] ;FLUSH JUNK + PUSHJ P,PSHBND ;PUSH THE BINDING + MOVEI D,0 ;MUNG ARG LIST + JRST BNDRG4 + + + +AUXDO: SKIPGE -1(P) ;CHECK STATE + JRST MPD + SETOM -1(P) ;NOTHING BUT ACT MAY FOLLOW + +AUXBND: JUMPE C,BNDRET ;DONE + PUSHJ P,CARATM ;LOOK FOR ATOM + JRST AUXIN ;COULD BE LIST + + MOVSI A,TUNBOU + MOVNI B,1 +AUXB1: PUSHJ P,PSHBND ;PUSH THE BINDING UP + + MOVEI E,(TP) ;PREPARE TO BIND + PUSH TP,$TLIST ;SAVE DCLS + PUSH TP,C + SUB E,(P) ;FUDGE FOR TEMPS + PUSHJ P,SPCBE + + INTGO + HRRZ C,@(TP) ;CDR THE LIST + SUB TP,[2,,2] ;AND POP + JRST AUXBND + +AUXIN: CAIE A,TLIST ;IS IT A LIST + JRST BIND4 + PUSH TP,$TLIST ;SAVE DCLS + PUSH TP,C + SKIPN C,1(C) ;NIL? + JRST MPD ;YES, LOSE + PUSHJ P,CARATD ;MAKE SURE ITS AN ATOM + PUSH TP,$TATOM + PUSH TP,E + HRRZ C,(C) ;CDR + JUMPE C,MPD + HRRZ A,(C) ;GET NEXT CDR + JUMPN A,MPD ;BETTER BE NIL + GETYP A,(C) + MOVSI A,(A) ;TYPE TO LH + PUSH TP,A + PUSH TP,1(C) ;PREPARE TO EVAL + MCALL 1,EVAL + MOVE E,(TP) ;RESTORE ATOM + MOVE C,-2(TP) ;AND DCLS + SUB TP,[4,,4] + JRST AUXB1 + + + +ACTDO: PUSHJ P,CARATD ;MUST BE ATOMIC + HRRZ C,(C) ;MUST BE END OF DCLS + JUMPN C,MPD + PUSH P,CBNDRE ;PUSH THE RIGHT RETURN + +ACTD1: MOVE B,TB ;MAKE ENV + PUSHJ P,MAKENV + HRLI A,TACT ;AND CHANGE TO ACTIVATION + POP P,D ;RESTORE RET ADR, BECAUSE PSHBND NEEDS NICE STATE + PUSHJ P,PSHBND ;PUSH UP THE BINDING + PUSH P,D ;NOW PUT IT BACK + MOVEI E,(TP) + SUBI E,@-1(P) ;NOW READY TO BIND + PUSHJ P,SPCBE + MOVNI A,1 ;SET SW +CBNDRE: POPJ P,BNDRT2 + + +;INTERNAL ROUTINES FOR THE BINDER + +TMPUP: AOS -1(P) ;ADDS 2 TO TOP OF STACK + AOS -1(P) + POPJ P, + +TMPDWN: SOS -1(P) ;SUBTRACTS 2 FROM STACK + SOS -1(P) + POPJ P, + +CARATD: PUSHJ P,CARATM ;LOOK FOR ATOM + JRST MPD ;ERROR IF NONE + POPJ P, + +CARATM: GETYP A,(C) ;GETS ARG IN C, GET TYPE + CAIE A,TATOM ;ATOM? + POPJ P, ;NO, DONT SKIP + MOVE E,1(C) ;RETRUN ATOM IN E +CPOPJ1: AOS (P) ;SKIP RET +CPOPJ: POPJ P, + +CARLST: GETYP A,(C) ;GETS LIST IN CAR, POPS TO 2D ON STACK IF NIL + CAIE A,TLIST + JRST MPD ;NOT A LIST, FATAL + SKIPE C,1(C) + AOS (P) + POPJ P, + + +MAKENV: PUSH P,C ;SAVE AN AC + HLRE C,PVP ;GET -LNTH OF PROC VECTOR + MOVEI A,(PVP) ;COPY PVP + SUBI A,-1(C) ;POINT TO DOPWD WITH A + HRLI A,TENV ;MAKE INTO AN ENVIRONMENT + HLL B,OTBSAV(B) ;TIME TO B + POP P,C + POPJ P, + + + + +; ARGCDR - NORMAL ARG GETTER FOR OTHER THAN STACKFORM + +ARGCDR: JUMPE D,CPOPJ ;DONT SKIP IF NIL + PUSH TP,$TLIST + PUSH TP,D + GETYP A,(D) ;GET TYPE OF ARG + MOVSI A,(A) ;TO LH OF A + PUSH TP,A + PUSH TP,1(D) ;PUSH TYPE AND VALUE + JSP E,CHKARG ;CHECK FOR TDEFER + MCALL 1,EVAL + HRRZ D,@(TP) ;CDR THE LIST + SUB TP,[2,,2] ;POP STACK + JRST CPOPJ1 ;SKIP RETURN + +;EVALRG - USED TO EVAL ARGS IN STACKFORM HACK + +EVALRG: JUMPE D,CPOPJ ;LEAVE IMMEDIATELY + PUSH TP,$TLIST ;SAVE ARG LIST + PUSH TP,D + HRRZ C,(D) ;AND CDR IT + GETYP B,(C) ;GET TYPE OF CONDITIONAL FORM + MOVSI B,(B) ;TO LH + PUSH TP,B + PUSH TP,1(C) ;AND VALUE + JSP E,CHKARG ;CHECK DEFERRED + MCALL 1,EVAL ;AND EVAL IT + CAMN A,$TFALSE ;FALSE? + JRST EVALR2 ;YES, LEAVE + HRRZ D,(TP) ;GET ARGS BACK + GETYP A,(D) ;GET TYPE + MOVSI A,(A) ;TO LH + PUSH TP,A + PUSH TP,1(D) ;PUSH IT + JSP E,CHKARG ;CHECK DEFERRED + MCALL 1,EVAL + AOS (P) ;CAUSE A SKIP RETURN +EVALR2: MOVE D,(TP) ;RESTORE ARGS + SUB TP,[2,,2] ;POP STACK + POPJ P, ;AND RETURN + +;RESARG - USED TO GET ARGS FOR RESUMING FUNCTIONS + + +RESARG: + JUMPE D,CPOPJ ;DONT SKIP IF NIL - NO MORE ARGS + PUSH TP,$TLIST ; SAVE ARG LIST + PUSH TP,D + GETYP A,(D) ; GET TYPE OF ARG + MOVSI A,(A) ;TO LH + PUSH TP,A ;PUSH TYPE + PUSH TP,1(D) ;AND VALUE + JSP E,CHKARG ;CHECK FOR DEFERED TYPE + MOVE B,MQUOTE [PPROC ]INTERR + PUSHJ P,ILVAL ;GET ENV OF PARENT PROCESS + PUSH TP,A + PUSH TP,B ;SET UP FOR AEVAL CALL + MCALL 2,EVAL ;CALL EVAL WITH THE ENV + HRRZ D,@(TP) ;CDR ARG LIST + SUB TP,[2,,2] ;REMOVE SAVED ARG LIST + JRST CPOPJ1 ;SKIP 1 AND RETURN + + + +;SUBROUTINE TO PUSH A BINDING ON THE STACK +; E/ ATOM +; A/ TYPE +; B/ VALUE + +PSHBND: PUSH P,D ;SAVE TEMPS + PUSH P,E + MOVE D,-3(P) ;GOBBLE # OF TEMPS ON STACK + ADD TP,[6,,6] ;ALOCATE SPACE + JUMPGE TP,TPLOSE ;HACK IF OVERFLOW +PSHBN1: HRROI E,-6(TP) ;SET UP E + JUMPE D,NOBLT ;IF NO TEMPS, LESS WORK + POP E,6(E) ;USE POP TP MOVE THEM UP + SOJN D,.-1 +NOBLT: MOVSI D,TATOM ;SET UP BINDING + HLLOM D,1(E) ;CLOBBER + POP P,2(E) ;ATOM INTO SLOT + MOVEM A,3(E) + MOVEM B,4(E) + SETZM 5(E) ;CLEAR EXTRA SLOTS + SETZM 6(E) + POP P,D + POPJ P, + +TPLOSE: PUSHJ P,TPOVFL ;GO TO INT HANDLER + JRST PSHBN1 + +; DO A SPECBIND IF NEEDED + +SPCBE: MOVE A,-5(E) ;GET TYPE + CAME A,BNDA + POPJ P, + MOVEI A,(TP) ;COPY POINTER + SUBI A,(E) ;FIND DISTANCE TO TOP + MOVSI A,(A) ;TO LH + HLL E,TP + SUB E,A ;FIX UP POINTER + JRST SPECBE ;YES, GO DO IT + +;ROUTINE TO SQUEEZE A PAIR ON THE STACK + +PSHAB: PUSH P,D + PUSH P,E + PUSH TP,[0] ;ALLOCATE SPACE + PUSH TP,[0] + MOVE D,-4(P) ;GET TEMPS COUNT + HRROI E,-2(TP) ;POINT TO TOP + JUMPE D,NOBLT1 + POP E,2(E) + SOJN D,.-1 + +NOBLT1: MOVEM A,1(E) ;CLOBBER + MOVEM B,2(E) + POP P,E + POP P,D + POPJ P, + + + +;SPECBIND BINDS IDENTIFIERS. IT IS CALLED BY PUSHJ P,SPECBIND. +;SPECBIND IS PROVIDED WITH A CONTIGUOUS SET OF TRIPLETS ON TP. +;EACH TRIPLET IS AS FOLLOWS: +;THE FIRST ELEMENT IS THE IDENTIFIER TO BE BOUND, ITS TYPE WORD IS [TATOM,,-1], +;THE SECOND IS THE VALUE TO WHICH IT IS TO BE ASSIGNED, +;AND THE THIRD IS A PAIR OF ZEROES. + +BNDA: TATOM,,-1 +BNDV: TVEC,,-1 + +SPECBIND: MOVE E,TP ;GET THE POINTER TO TOP +SPECBE: ADD E,[1,,1] ;BUMP POINTER ONCE + SETZB 0,D ;CLEAR TEMPS + +BINDLP: MOVE A,-6(E) ;GET TYPE + CAME A,BNDA ;NORMAL ID BIND? + JRST NONID ;NO TRY BNDV + + SUB E,[6,,6] ;MOVE PTR + SKIPE D ;LINK? + HRRM E,(D) ;YES -- LOBBER + SKIPN 0 ;UPDATED? + MOVE 0,E ;NO -- DO IT + + MOVE A,0(E) ;GET ATOM PTR + MOVE B,1(E) + PUSHJ P,ILOC ;GET LAST BINDING + HLR A,OTBSAV (TB) ;GET TIME + MOVEM A,4(E) ;CLOBBER IT AWAY + MOVEM B,5(E) ;IN RESTORE CELLS + + HRRZ A,PROCID+1(PVP) ;GET PROCESS NUMBER + HRLI A,TLOCI ;MAKE LOC PTR + MOVE B,E ;TO NEW VALUE + ADD B,[2,,2] + MOVE C,1(E) ;GET ATOM PTR + MOVEM A,(C) ;CLOBBER ITS VALUE + MOVEM B,1(C) ;CELL + MOVEI A,TBIND + HRLM A,(E) ;IDENTIFY AS BIND BLOCK + MOVE D,E ;REMEMBER LINK + JRST BINDLP ;DO NEXT + +NONID: MOVE A,-4(E) ;TRY TYPE BEFORE + CAME A,BNDV ;IS IT A SPECIAL HACK? + JRST SPECBD ;NO -- DONE + SUB E,[4,,4] + SKIPE D + HRRM E,(D) + SKIPN 0 + MOVE 0,E + + MOVE D,1(E) ;GET PTR TO VECTOR + MOVE C,(D) ;EXCHANGE TYPES + EXCH C,2(E) + MOVEM C,(D) + + MOVE C,1(D) ;EXCHANGE DATUMS + EXCH C,3(E) + MOVEM C,1(D) + + MOVEI A,TBVL + HRLM A,(E) ;IDENTIFY BIND BLOCK + MOVE D,E ;REMEMBER LINK + JRST BINDLP + +SPECBD: SKIPE D + HRRM SP,(D) + MOVE SP,0 + POPJ P, + + + +;SPECSTORE RESTORES THE BINDINGS SP TO THE ENVIRONMENT POINTER IN +;SPSAV (TB). IT IS CALLED BY PUSHJ P,SPECSTORE. + +SPECSTORE: + HRRZ E,SPSAV (TB) ;GET TARGET POINTER + +STLOOP: + CAIL E,(SP) ;ARE WE DONE? + JRST STPOPJ + HLRZ C,(SP) ;GET TYPE OF BIND + CAIE C,TBIND ;NORMAL IDENTIFIER? + JRST ISTORE ;NO -- SPECIAL HACK + + + MOVE C,1(SP) ;GET TOP ATOM + MOVE D,4(SP) ;GET STORED LOCATIVE + HRR D,PROCID+1(PVP) ;STORE SIGNATURE + MOVEM D,(C) ;CLOBBER INTO ATOM + MOVE D,5(SP) + MOVEM D,1(C) + SETZM 4(SP) +SPLP: HRRZ SP,(SP) ;FOLOW LINK + JUMPN SP,STLOOP ;IF MORE + JUMPE E,STPOPJ ;ONLY OK IF E=0 + .VALUE [ASCIZ /SPOVERPOP/] + +ISTORE: CAIE C,TBVL + .VALUE [ASCIZ /BADSP/] + MOVE C,1(SP) + MOVE D,2(SP) + MOVEM D,(C) + MOVE D,3(SP) + MOVEM D,1(C) + JRST SPLP + +STPOPJ: + MOVE SP,SPSAV(TB) + POPJ P, + + + + +MFUNCTION REP,FSUBR,[REPEAT] + JRST PROG +MFUNCTION PROG,FSUBR + ENTRY 1 + GETYP A,(AB) ;GET ARG TYPE + CAIE A,TLIST ;IS IT A LIST? + JRST WTYP ;WRONG TYPE + SKIPN C,1(AB) ;GET AND CHECK ARGUMENT + JRST ERRTFA ;TOO FEW ARGS + PUSH TP,$TLIST ;PUSH GOODIE + PUSH TP,C + PUSH TP,BNDA ;BIND FUNNY ATOM + PUSH TP,MQUOTE [LPROG ]INTERR + PUSH TP,$TTB + PUSH TP,TB ;CURRENT TB POINTER + PUSH TP,[0] + PUSH TP,[0] + PUSHJ P,SPECBI ;BIND THE ATOM + MOVE C,1(AB) ;PROG BODY + MOVNI D,1 ;TELL BINDER WE ARE APROG + PUSHJ P,BINDER + HRRZ C,1(AB) ;RESTORE PROG + SKIPLE A ;SKIP IF NO NAME ALA HEWITT + HRRZ C,(C) + JUMPE C,NOBODY + PUSH TP,$TLIST + PUSH TP,C ;SAVE FOR REPEAT, AGAIN ETC. + HRRZ C,(C) ;SKIP DCLS + +; HERE TO RUN PROGS FUNCTIONS ETC. + +DOPROG: + HRRZM C,1(TB) ;CLOBBER AWAY BODY + PUSH TP,(C) ;EVALUATE THE + HLLZS (TP) + PUSH TP,1(C) ;STATEMENT + JSP E,CHKARG + MCALL 1,EVAL + HRRZ C,@1(TB) ;GET THE REST OF THE BODY + JUMPN C,DOPROG ;IF MORE -- DO IT +ENDPROG: + HRRZ C,FSAV(TB) + MOVE C,@-1(C) + CAME C,MQUOTE REP,REPEAT + JRST FINIS + SKIPN C,(TP) ;CHECK IT + JRST FINIS + MOVEM C,1(TB) + JRST CONTINUE + + + +MFUNCTION RETURN,SUBR + ENTRY 1 + PUSHJ P,PROGCH ;CKECK IN A PROG + HRR TB,B ;YES, SET TB + MOVE A,(AB) + MOVE B,1(AB) + JRST FINIS + + +MFUNCTION AGAIN,SUBR + ENTRY + HLRZ A,AB ;GET # OF ARGS + CAIN A,-2 ;1 ARG? + JRST NLCLA ;YES + JUMPN A,WNA ;0 ARGS? + PUSHJ P,PROGCH ;CHECK FOR IN A PROG + JRST AGAD +NLCLA: HLRZ A,(AB) + CAIE A,TACT + JRST WTYP + MOVE A,1(AB) + HRR B,A + HLL B,OTBSAV (B) + HRRZ C,A + CAIG C,1(TP) + CAME A,B + JRST ILLFRA + HLRZ C,FSAV (C) + CAIE C,TENTRY + JRST ILLFRA +AGAD: HRR TB,B + MOVE B,TPSAV(B) ;POINT TO TOP OF STACK + MOVE B,(B) + MOVEM B,1(TB) + JRST CONTIN + +MFUNCTION GO,SUBR + ENTRY 1 + PUSHJ P,PROGCH ;CHECK FOR A PROG + PUSH TP,A ;SAVE + PUSH TP,B + MOVE A,(AB) + CAME A,$TATOM + JRST NLCLGO + PUSH TP,A + PUSH TP,1(AB) + MOVE B,TPSAV(B) ;GET SAVED TOP OF STACK + PUSH TP,-1(B) + PUSH TP,(B) + MCALL 2,MEMQ ;DOES IT HAVE THIS TAG? + JUMPE B,NXTAG ;NO -- ERROR +FNDGO: MOVE TB,(TP) ;RE-GOBBLE + SUB TP,[2,,2] ;POP TP + MOVEM B,1(TB) + JRST GODON + +NLCLGO: CAME A,$TTAG ;CHECK TYPE + JRST WTYP + MOVE A,1(AB) ;GET ARG + HRR B,3(A) + HLL B,OTBSAV(B) + HRRZ C,B + CAIG C,1(TP) + CAME B,3(A) ;CHECK TIME + JRST ILLFRA + HLRZ C,FSAV(C) + CAIE C,TENTRY + JRST ILLFRA + HRR TB,3(A) ;GET NEW FRAME PTR + MOVE A,1(A) ;GET PLACE TO START + MOVEM A,1(TB) ;CLOBBER IT AWAY +GODON: MOVE A,(AB) + MOVE B,1(AB) + JRST CONTIN + + + + +MFUNCTION TAG,SUBR + ENTRY 1 + HLRZ A,(AB) ;GET TYPE OF ARGUMENT + CAIE A,TATOM ;CHECK THAT IT IS AN ATOM + JRST WTYP + PUSHJ P,PROGCH ;CHECK PROG + PUSH TP,A ;SAVE VAL + PUSH TP,B + MOVE A,TPSAV(B) ;GET STACK TOP + PUSH TP,0(AB) + PUSH TP,1(AB) + PUSH TP,-1(A) + PUSH TP,(A) + MCALL 2,MEMQ + JUMPE B,NXTAG ;IF NOT FOUND -- ERROR + MOVEM A,-1(TP) ;SAVE PLACE + EXCH B,(TP) + MOVEI A,1(PVP) + HLRE C,PVP + SUB A,C + HRLI A,TFRAME + PUSH TP,A + HLL B,OTBSAV (B) + PUSH TP,B + MCALL 2,EVECTOR + MOVSI A,TTAG + JRST FINIS + +PROGCH: MOVE B,MQUOTE [LPROG ]INTERR + PUSHJ P,ILVAL ;GET VALUE + CAME A,$TTB ;CHECK TYPE + JRST NXPRG + POPJ P, + +MFUNCTION EXIT,SUBR + ENTRY 2 + HLRZ A,(AB) + CAIE A,TACT + JRST WTYP + MOVE A,1(AB) + HRR B,A + HLL B,OTBSAV(B) + HRRZ C,A + CAIG C,1(TP) + CAME A,B + JRST ILLFRA + HLRZ C,FSAV(C) + CAIE C,TENTRY + JRST ILLFRA + HRR TB,A + MOVE A,2(AB) + MOVE B,3(AB) + JRST FINIS + +MFUNCTION COND,FSUBR + ENTRY 1 + HLRZ A,(AB) + CAIE A,TLIST + JRST WTYP +CLSLUP: SKIPN B,1(AB) ;IS THE CLAUSELIST NIL? + JRST IFALSE ;YES -- RETURN NIL + HLRZ A,(B) ;NO -- GET TYPE OF CAR + CAIE A,TLIST ;IS IT A LIST? + JRST BADCLS ; + MOVE A,1(B) ;YES -- GET CLAUSE + JUMPE A,BADCLS + PUSH TP,(A) ;EVALUATION OF + HLLZS (TP) + PUSH TP,1(A) ;THE PREDICATE + JSP E,CHKARG + MCALL 1,EVAL + CAMN A,$TFALSE ;IF THE RESULT IS + JRST NXTCLS ;FALSE TRY NEXT CLAUSE + MOVE C,1(AB) ;IF NOT, GET + MOVE C,1(C) ;THE CLAUSE + HRRZ C,(C) ;GET ITS REST + JUMPE C,FINIS ;IF ONLY A PREDICATE --- RETURN ITS VALUE + PUSH TP,$TLIST + PUSH TP,C ;EVALUATE THE REST OF THE CLAUSE + JRST DOPROG +NXTCLS: HRRZ A,@1(AB) ;SET THE CLAUSLIST + HRRZM A,1(AB) ;TO CDR OF THE CLAUSLIST + JRST CLSLUP + +IFALSE: + MOVSI A,TFALSE ;RETURN FALSE + MOVEI B,0 + JRST FINIS + + + + +;SETG IS USED TO SET THE GLOBAL VALUE OF ITS FIRST ARGUMENT, +;AN IDENTIFIER, TO THE VALUE OF ITS SECOND ARGUMENT. ITS VALUE IS +; ITS SECOND ARGUMENT. + +MFUNCTION SETG,SUBR + ENTRY 2 + HLLZ A,(AB) ;GET TYPE OF FIRST ARGUMENT + CAME A,$TATOM ;CHECK THAT IT IS AN ATOM + JRST NONATM ;IF NOT -- ERROR + MOVE B,1(AB) ;GET POINTER TO ATOM + PUSHJ P,IGLOC ;GET LOCATIVE TO VALUE + CAMN A,$TUNBOUND ;IF BOUND + PUSHJ P,BSETG ;IF NOT -- BIND IT + MOVE C,B ;SAVE PTR + MOVE A,2(AB) ;GET SECOND ARGUMENT + MOVE B,3(AB) ;INTO THE RETURN POSITION + MOVEM A,(C) ;DEPOSIT INTO THE + MOVEM B,1(C) ;INDICATED VALUE CELL + JRST FINIS + +BSETG: HRRZ A,GLOBASE+1(TVP) + HRRZ B,GLOBSP+1(TVP) + SUB B,A + CAIL B,6 + JRST SETGIT + PUSH TP,GLOBASE(TVP) + PUSH TP,GLOBASE+1 (TVP) + PUSH TP,$TFIX + PUSH TP,[0] + PUSH TP,$TFIX + PUSH TP,[100] + MCALL 3,GROW + MOVEM A,GLOBASE(TVP) + MOVEM B,GLOBASE+1(TVP) +SETGIT: + MOVE B,GLOBSP+1(TVP) + SUB B,[4,,4] + MOVE C,(AB) + MOVEM C,(B) + MOVE C,1(AB) + MOVEM C,1(B) + MOVEM B,GLOBSP+1(TVP) + ADD B,[2,,2] + MOVSI A,TLOCI + POPJ P, + + + + +;SET CLOBBERS THE LOCAL VALUE OF THE IDENTIFIER GIVEN BY ITS +;FIRST ARGUMENT TO THE SECOND ARG. ITS VALUE IS ITS SECOND ARGUMENT. + +MFUNCTION SET,SUBR + ENTRY 2 + HLLZ A,(AB) ;GET TYPE OF FIRST + CAME A,$TATOM ;ARGUMENT -- + JRST WTYP ;BETTER BE AN ATOM + MOVE B,1(AB) ;GET PTR TO IT + PUSHJ P,ILOC ;GET LOCATIVE TO VALUE + CAMN A,$TUNBOUND ;BOUND? + PUSHJ P, BSET ;BIND IT + MOVE C,B ;SAVE PTR + MOVE A,2(AB) ;GET SECOND ARG + MOVE B,3(AB) ;INTO RETURN VALUE + MOVEM A,(C) ;CLOBBER IDENTIFIER + MOVEM B,1(C) + JRST FINIS +BSET: + HRRZ A,TPBASE+1(PVP) ;GET ACTUAL STACK BASE + HRRZ B,SPBASE+1(PVP) ;AND FIRST BINDING + SUB B,A ;ARE THERE 6 + CAIL B,6 ;CELLS AVAILABLE? + JRST SETIT ;YES + PUSH TP,TPBASE(PVP) ;NO -- GROW THE TP + PUSH TP,TPBASE+1(PVP) ;AT THE BASE END + PUSH TP,$TFIX + PUSH TP,[0] + PUSH TP,$TFIX + PUSH TP,[100] + MCALL 3,GROW + MOVEM A,TPBASE(PVP) ;SAVE RESULT + MOVEM B,TPBASE+1(PVP) +SETIT: MOVE B,SPBASE+1(PVP) + MOVEI A,-6(B) ;MAKE UP BINDING + HRRM A,(B) ;LINK PREVIOUS BIND BLOCK + MOVSI A,TBIND + MOVEM A,-6(B) + MOVE A,1(AB) + MOVEM A,-5(B) + MOVSI A,TLOCI + HRR A,PROCID+1(PVP) + SUB B,[6,,6] + MOVEM B,SPBASE+1(PVP) + ADD B,[2,,2] + POPJ P, + + + +MFUNCTION NOT,SUBR + ENTRY 1 + HLRZ A,(AB) ; GET TYPE + CAIE A,TFALSE ;IS IT FALSE? + JRST IFALSE ;NO -- RETURN FALSE + +TRUTH: + MOVSI A,TATOM ;RETURN T (VERITAS) + MOVE B,MQUOTE T + JRST FINIS + +MFUNCTION ANDA,FSUBR,AND + ENTRY 1 + HLRZ A,(AB) + CAIE A,TLIST + JRST WTYP ;IF ARG DOESN'T CHECK OUT + SKIPN C,1(AB) ;IF NIL + JRST TRUTH ;RETURN TRUTH +ANDLP: + JUMPE C,FINIS ;ANY MORE ARGS? + MOVEM C,1(AB) ;STORE CRUFT + PUSH TP,(C) ;EVALUATE THE + HLLZS (TP) ;FIRST REMAINING + PUSH TP,1(C) ;ARGUMENT + JSP E,CHKARG + MCALL 1,EVAL + CAMN A,$TFALSE + JRST FINIS ;IF FALSE -- RETURN + HRRZ C,@1(AB) ;GET CDR OF ARGLIST + JRST ANDLP + +MFUNCTION OR,FSUBR + ENTRY 1 + HLRZ A,(AB) + CAIE A,TLIST ;CHECK OUT ARGUMENT + JRST WTYP + MOVE C,1(AB) ;PICK IT UP TO ENTER LOOP +ORLP: + JUMPE C,IFALSE ;IF NO MORE OPTIONS -- FALSE + MOVEM C,1(AB) ;CLOBBER IT AWAY + PUSH TP,(C) + HLLZS (TP) + PUSH TP,1(C) ;EVALUATE THE FIRST REMAINING + JSP E,CHKARG + MCALL 1,EVAL ;ARGUMENT + CAME A,$TFALSE ;IF NON-FALSE RETURN + JRST FINIS + HRRZ C,@1(AB) ;IF FALSE -- TRY AGAIN + JRST ORLP + +MFUNCTION FUNCTION,FSUBR + PUSH TP,(AB) + PUSH TP,1(AB) + PUSH TP,$TATOM + PUSH TP,MQUOTE FUNCTION + MCALL 2,CHTYPE + JRST FINIS + + + +MFUNCTION CLOSURE,SUBR + ENTRY + SKIPL A,AB ;ANY ARGS + JRST ERRTFA ;NO -- LOSE + ADD A,[2,,2] ;POINT AT IDS + PUSH TP,$TAB + PUSH TP,A + PUSH P,[0] ;MAKE COUNTER + +CLOLP: SKIPL A,1(TB) ;ANY MORE IDS? + JRST CLODON ;NO -- LOSE + PUSH TP,(A) ;SAVE ID + PUSH TP,1(A) + PUSH TP,(A) ;GET ITS VALUE + PUSH TP,1(A) + ADD A,[2,,2] ;BUMP POINTER + MOVEM A,1(TB) + AOS (P) + MCALL 1,VALUE + PUSH TP,A + PUSH TP,B + MCALL 2,LIST ;MAKE PAIR + PUSH TP,A + PUSH TP,B + JRST CLOLP + +CLODON: POP P,A + ACALL A,LIST ;MAKE UP LIST + PUSH TP,(AB) ;GET FUNCTION + PUSH TP,1(AB) + PUSH TP,A + PUSH TP,B + MCALL 2,LIST ;MAKE LIST + MOVSI A,TFUNARG + JRST FINIS + + +MFUNCTION FALSE,SUBR + ENTRY + JUMPGE AB,IFALSE + HLRZ A,(AB) + CAIE A,TLIST + JRST WTYP + MOVSI A,TFALSE + MOVE B,1(AB) + JRST FINIS + + +;ERROR COMMENTS FOR EVAL + +UNBOU: PUSH TP,$TATOM + PUSH TP,MQUOTE UNBOUND-VARIABLE + JRST ER1ARG + +UNAS: PUSH TP,$TATOM + PUSH TP,MQUOTE UNASSIGNED-VARIABLE + JRST ER1ARG + +TFA: +ERRTFA: PUSH TP,$TATOM + PUSH TP,MQUOTE TOO-FEW-ARGUMENTS-SUPPLIED + JRST CALER1 + +TMA: +ERRTMA: PUSH TP,$TATOM + PUSH TP,MQUOTE TOO-MANY-ARGUMENTS-SUPPLIED + JRST CALER1 + +BADENV: + PUSH TP,$TATOM + PUSH TP,MQUOTE BAD-ENVIRONMENT + JRST CALER1 + +FUNERR: + PUSH TP,$TATOM + PUSH TP,MQUOTE BAD-FUNARG + JRST CALER1 + +WRONGT: +WTYP: PUSH TP,$TATOM + PUSH TP,MQUOTE WRONG-TYPE + JRST CALER1 + +MPD: PUSH TP,$TATOM + PUSH TP,MQUOTE MEANINGLESS-PARAMETER-DECLARATION + JRST CALER1 + +NOBODY: PUSH TP,$TATOM + PUSH TP,MQUOTE HAS-EMPTY-BODY + JRST CALER1 + +BADCLS: PUSH TP,$TATOM + PUSH TP,MQUOTE BAD-CLAUSE + JRST CALER1 + +NXTAG: PUSH TP,$TATOM + PUSH TP,MQUOTE NON-EXISTENT-TAG + JRST CALER1 + +NXPRG: PUSH TP,$TATOM + PUSH TP,MQUOTE NOT-IN-PROG + JRST CALER1 + +NAPT: PUSH TP,$TATOM + PUSH TP,MQUOTE NON-APPLICABLE-TYPE + JRST CALER1 + +NONEVT: PUSH TP,$TATOM + PUSH TP,MQUOTE NON-EVALUATEABLE-TYPE + JRST CALER1 + + +NONATM: PUSH TP,$TATOM + PUSH TP,MQUOTE NON-ATOMIC-ARGUMENT + JRST CALER1 + + +ILLFRA: PUSH TP,$TATOM + PUSH TP,MQUOTE FRAME-NO-LONGER-EXISTS + JRST CALER1 + +NOTIMP: PUSH TP,$TATOM + PUSH TP,MQUOTE NOT-YEST-IMPLEMENTED + JRST CALER1 + +ILLSEG: PUSH TP,$TATOM + PUSH TP,MQUOTE ILLEGAL-SEGMENT + JRST CALER1 + +ER1ARG: PUSH TP,(AB) + PUSH TP,1(AB) + MOVEI A,2 + JRST CALER +CALER1: MOVEI A,1 +CALER: + HRRZ C,FSAV(TB) + PUSH TP,$TATOM + PUSH TP,@-1(C) + ADDI A,1 + ACALL A,ERROR + JRST FINIS + +END +***  \ No newline at end of file diff --git a/MUDDLE/filtrn.5 b/MUDDLE/filtrn.5 new file mode 100644 index 0000000..d78c405 --- /dev/null +++ b/MUDDLE/filtrn.5 @@ -0,0 +1,121 @@ + +TITLE FILTRN + +TYIC==1 +TYOC==2 +INC==3 + +A=1 +B=2 +C=3 +D=4 +E=5 +F=6 +G=7 +P=17 + +NCHRS==60. + +BFLNT==200 +LPDL==40 + + +FILTRN: MOVE P,[-LPDL,,PDL] ;GET A PDL + .OPEN TYIC,[SIXBIT / $TTY/] + .VALUE [ASCIZ /:LOGOUT /] + .OPEN TYOC,[SIXBIT / %TTY/] + .VALUE [ASCIZ /:LOGOUT /] + + .IOT TYOC,["\] ;ACKNOLEDGE + + MOVEI B,4*6 ;PREPARE TO READ FILE STUFF + MOVE A,[440600,,PTRF] ;GET POINT BYTER + +GETIF: .IOT TYIC,C + SUBI C,40 ;CONVERT TO SIXBIT + IDPB C,A ;INTO BUFFER + SOJN B,GETIF ;DO ALL CHARS + + SKIPE PTRF+3 ;SYSNAME GIVEN? + .SUSET [.SSNAM,,PTRF+3] ;NO USE CURRENT + MOVSI A,6 ;GET BLOCK IMAGE INPUT MODE + HLLM A,PTRF ;AND CLOBBER IN + + .OPEN INC,PTRF ;OPEN THE FILE + SKIPA A,["/] ;NEGATIVE ACK + MOVEI A,"\ ;POS ACKN + + .IOT TYOC,A ;SEND DOWN + CAIE A,"\ ;SKIP IF A WIINER + + .VALUE [ASCIZ /:LOGOUT +/] + + .IOT TYIC,A ;WAIT FOR HIM TO RE-ACK + CAIE A,"\ + .VALUE [ASCIZ /:LOGOUT /] + + +NXTBB: MOVE A,[-BFLNT,,BUFR] ;SETUP ITO POINTER + .IOT INC,A + MOVEI B,6*BFLNT ;NUMBER OF 6 BIT CHRS + JUMPGE A,GOTIT ;NOT EOF YET, JUMP + SETOM EOF ;AT END OF FILE + MOVEI B,(A) ;COMPUTE REMAINING + SUBI B,BUFR + IMULI B,6 ;CONVERT TO 6 BIT CHRS + +GOTIT: MOVE C,[440600,,BUFR] ;POINT TO BUFFER +NXTB: MOVEI G,NCHRS ;GET MAX MESSAGE LNT + CAIL G,(B) ;IF GRT THAN LEFT + MOVEI G,(B) ;USE REMAINS + SUBI B,(G) ;AND SHRINK TOTAL + ADDI G,40 ;CONVERT TO ASCII + .IOT TYOC,G + SUBI G,40 + + MOVEI D,0 ;INIT CHECKSUM + +LOOP: ILDB A,C ;READ A CHAR + ADDI D,(A) ;UPDATE CKS + ADDI A,40 ;CONV TO ASCII + .IOT TYOC,A ;TO NEXT MACHINE + SOJN G,LOOP ;COUNT DOWN + + ANDI D,77 ;CUT CKS + ADDI D,40 + .IOT TYOC,D ;SEND THE CKS + .IOT TYIC,D ;WAIT FOR ACK + + CAIE A,"\ + .VALUE [ASCIZ /:LOGOUT /] + + JUMPN B,NXTB ;STILL MORE IN BUFFER + + SKIPN EOF + JRST NXTBB ;MORE IN FILE, READ IT + + .IOT TYOC,[40] ;SEND EOF HACK + + SETZM EOF + .VALUE [ASCIZ /:LOGOUT /] + +PTRF: 0 + 0 + 0 + 0 + +BUFR: BLOCK BFLNT + +PDL: BLOCK LPDL + +EOF: 0 +FOO: +0 +PAT: +PATCH: BLOCK 30 + +END FILTRN + + +  \ No newline at end of file diff --git a/MUDDLE/flodyn.1 b/MUDDLE/flodyn.1 new file mode 100644 index 0000000..4afe42a --- /dev/null +++ b/MUDDLE/flodyn.1 @@ -0,0 +1,89 @@ + "DYNAMIC LOADER - USES 2 LIBRARY FILES AND RELATIVE ACCESS POINTERS" + +"Expects ERROR to have been SETGd to the proper thing. See FLODYN bootstrapper." + + + )>> + + +"Each library specification is a vector of four elements." + +>> + +"Library setup." + +)) + > + + > + <3 .LIBVEC>>> + > + <3 .LIBVEC>>> + >>)> + .LIBVEC> + +"Initializer." + + >>> >> + > + >>> >> + " "DSK" "MUDDLE")>> + "DONE"> + + + +"Error checker. Calls dynamic loader." + +> + <==? UNBOUND-VARIABLE!-ERRORS <1 .TR>> + <==? VALUE <3 .TR>> + >>) + (ELSE )>>> + + +"Real dynamic loader." + +) T1) + >> + > + >) + ( + > + + > + >> + ) + ( ) + (ELSE >)>)>> + +"Loader from directories." + +" !.WHERE>)) + >> + +"Loader from libraries" +"Expects USEROB to have been given a GVAL by BOOT." + + >>> >>> + + <+ <4 .LIBR> <<- > -1> <2 .LIBR>>>> + <3 .LIBR> .ROBL>>> + ATOM> ,.TLS) (ELSE .TLS)>)>> + + + +" "DSK" "MUDDLE") + ("LF" ">" "DSK" "MUDDLE") + ("FRAMES" ">" "DSK" "MUDDLE") + ("PPRINT" ">" "DSK" "MUDDLE")>> + +)) ,SPECF>>>> + + +  ð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒ \ No newline at end of file diff --git a/MUDDLE/fopen.63 b/MUDDLE/fopen.63 new file mode 100644 index 0000000..f1ae706 --- /dev/null +++ b/MUDDLE/fopen.63 @@ -0,0 +1,545 @@ +TITLE OPEN - CHANNEL OPENER FOR MUDDLE + +RELOCATABLE + +;C. REEVE JAN 1971 + +.INSRT MUDDLE > + +;THIS PROGRAM HAS TWO ENTRIES. FOPEN,FCLOSE AND FDELETE. +;THESE SUBROUTINES HANDLE I/O STREAMS FOR THE MUDDLE SYSTEM. + +; FOPEN - OPENS A FILE FOR EITHER READING OR WRITING. IT TAKES +; FIVE OPTINAL ARGUMENTS AS FOLLOWS: + +; FOPEN (

,,,,) +; +; - DIRECTION EITHER READ (INPUT) OR PRINT (OUPUT). DEFAULT IS READ + +; - FIRST FILE NAME. DEFAULT INPUT OR OUTPUT. + +; - SECOND FILE NAME. DEFAULT MUDDLE. + +; - DEVICE FROM WHICH TO OPEN. DEFAULT IS DSK. + +; - SYSTEM (DIRECTORY) NAME. DEFAULT UNAME. + +; FOPEN RETURNS AN OBJECT OF TYPE CHANNEL IF IT SUCCEEDS OTHERWISE NIL + + +; FCLOSE - CLOSES A FILE. TAKES A CHANNEL OBJECT AS ITS ARGUMENT. IT ALSO TAKES + + +;A CHANNEL OBJECT IS A VECTOR CONTAINIG THE FOLLOWING INFORMATION + +; CHANNO==1 ;ITS I/O CHANNEL NUMBER. 0 MEANS NOT A REAL CHANNEL. +; DIRECT==3 ;DIRECTION (EITHER READ OR PRINT) +; DEVICE==5 ;DEVICE UPON WHICH THE CHANNEL IS OPEN +; NAME1==7 ;FIRST NAME OF FILE AS OPENED. +; NAME2==11 ;SECOND NAME OF FILE +; SNAME==13 ;DIRECTORY NAME +; RDEVIC==15 ;REAL DEVICE +; RNAME1=17 ;REAL FIRST NAME (AS RETURNED BY READING CHANNEL STATUS) +; RNAME2==21 ;REAL SECOND NAME +; RSNAME==23 ;SYSTEM OR DIRECTORY NAME +; STATUS==25 ;VARIOUS STATUS BITS +; IOINS==27 ;INSTRUCTION EXECUTED TO INPUT OR OUTPUT ONE CHARACTER +; ACCESS==31 ;ACCESS POINTER FOR RAND ACCESS +; RADX==33 ;RADIX FOR CHANNELS NUMBER CONVERSION +; *** THE FOLLOWING FIELDS FOR OUTPUT ONLY *** + +; LINLN==35 ;LENGTH OF A LINE IN CHARACTERS FOR THIS DEVICE +; CHRPOS==37 ;CURRENT POSITION ON CURRENT LINE +; PAGLN==41 ;LENGTH OF A PAGE +; LINPOS==43 ;CURRENT LINE BEING WRITTEN ON +; *** THE FOLLOWING FILEDS FOR INPUT ONLY *** + +; EOFCND==35 ;GETS EVALUATED ON EOF +; LSTCHR==37 ;BACKUP CHARACTER +; BUFRIN==41 ;POINTER TO BUFFER FOR TTY FLAVOR DEVICES + + +;CHANLNT==42 ;LENGTH OF A CHANNEL OBJECT + +;THIS IRP DEFINES THE FIELDS AT ASSEMBLY TIME + + CHANLNT==1 ;INITIAL CHANNEL LENGTH + +; BUILD A PROTOTYPE CHANNEL AND DEFINE FILEDS + +PROCHN: + +IRP A,,[[CHANNO,FIX],[DIRECT,CHSTR],[DEVICE,CHSTR],[NAME1,CHSTR],[NAME2,CHSTR] +[SNAME,CHSTR],[RDEVIC,CHSTR],[RNAME1,CHSTR],[RNAME2,CHSTR],[RSNAME,CHSTR] +[STATUS,FIX],[IOINS,FIX],[LINLN,FIX],[CHRPOS,FIX],[PAGLN,FIX],[LINPOS,FIX] +[ACCESS,FIX],[RADX,FIX]] + + IRP B,C,[A] + B==CHANLNT + T!C,,0 + 0 + .ISTOP + TERMIN + CHANLNT==CHANLNT+2 +TERMIN + + +; EQUIVALANCES FOR INPUT CHANNELS + +EOFCND==LINLN +LSTCH==CHRPOS +BUFRIN==PAGLN + +;PRESET LINE LENGTH AND PAGE LENGTH + +ZZZ==. ;SAVE CURRENT LOCATION + +LOC PROCHN+RADX +10. + +LOC PROCHN+LINLN +TTYLNL ;USE TTY LINE LENGTH + +LOC PROCHN+PAGLN +TTYPGL ;USE TTY PAGE LENGTH + +LOC ZZZ ;RESET LOCATIN +CHANLNT==CHANLNT-1 + + +INBIT==0 ;LH BITS FOR INPUT +OUTBIT==1 ;AND FOR OUTPUT + +;PAGE AND LINE LENGTH FOR TTY + +TTYLNL==80. +TTYPGL==60. + +;DEFINE VARIABLES ASSOCIATED WITH TTY BUFFERS + +IRP A,,[IOIN2,ECHO,CHRCNT,ERASCH,KILLCH,BRKCH,ESCAP,SYSCHR,BRFCHR,BYTPTR] +A==.IRPCNT +TERMIN + +EXTBFR==BYTPTR+1+<100./5> ;LENGTH OF ADD'L BUFFER + + + + +.GLOBAL IPNAME,OPEN,CLOSE,IOT,ILOOKU,6TOCHS,ICLOS,OCLOS +.GLOBAL OPNCHN,CHMAK,READC,TYO,RADX,SYSCHR,BRFCHR,LSTCH +.GLOBAL CHRWRD + +.GLOBAL DISOPN,DISCLS,DCHAR,DISLNL,DISPGL,CHANL0,BUFRIN,IOIN2 +.GLOBAL ECHO,ERASCH,KILLCH,BRKCH,BYTPTR,SYSCHR,CHRCNT,ESCAP + + ;SUBROUTINE TO DO OPENING BEGINS HERE + +MFUNCTION FOPEN,SUBR,[OPEN] + + ENTRY + PUSHJ P,MAKCHN ;MAKE THE CHANNEL + PUSHJ P,OPNCHN ;NOW OPEN IT + JRST FINIS + +; SUBROUTINE TO JUST CREATE A CHANNEL + +MFUNCTION CHANNEL,SUBR + + ENTRY + PUSHJ P,MAKCHN + JRST FINIS +;INTERNAL CHANNEL CREATOR + + +MAKCHN: + +; CYCLE THROUGH THE GIVEN ARGUMENTS + + MOVSI A,-5 ;NUMBER OF ARGUMENTS INTO A +ARGLP: JUMPGE AB,ARGDON ;IF AB>=0, NO MORE ARGS + HLRZ C,(AB) ;CHECK THE TYPE + CAIN C,TCHRS ;MUST BE AN CHRS + JRST ARGWIN + CAIE C,TCHSTR + JRST WRONGT +ARGWIN: PUSH TP,(AB) ;NOW TO TEMPS + PUSH TP,1(AB) + ADD AB,[2,,2] ;BUMP ARGG POINTER + AOBJN A,ARGLP ;CYCLE + +;NOW PUSH ANY MORE GOODIES FOR DEFAULTS + +ARGDON: + MOVEI A,(A) ;GET NUMBER DONE + CAIN A,5 ;FINISHED? + JRST GETCHN ;YES + LSH A,1 + CAIE A,2 ;WASONLY DIRECTION GIVEN? + JRST DFLTAB(A) ;NO + MOVEI B,-1(TP) ;PICK UP DIRECTION + PUSHJ P,CHRWRD ;GET WORD + JRST WRONGT + CAMN B,CHQUOTE READ + JRST DFLTB1 ;YES,GO PUSH 'INPUT' + PUSH TP,$TCHSTR + PUSH TP,CHQUOTE OUTPUT + JRST DFLTB2 + +DFLTAB: PUSH TP,$TCHSTR ;DEFAULT DIRECTION + PUSH TP,CHQUOTE READ +DFLTB1: PUSH TP,$TCHSTR ;DEFAULT NAME1 + PUSH TP,CHQUOTE INPUT +DFLTB2: PUSH TP,$TCHSTR ;DEFAULT NAME2 + PUSH TP,CHQUOTE MUDDLE + PUSH TP,$TCHSTR ;DEFAULT DEVICE + PUSH TP,CHQUOTE DSK + .SUSET [.RSNAM,,A] + PUSHJ P,6TOCHS + PUSH TP,A + PUSH TP,B ;AND DEFAULT SYS NAME + +GETCHN: PUSH TP,$TFIX ;SETUP CALL TO VECTOR + PUSH TP,[CHANLN_-1] + MCALL 1,VECTOR ;GO GET STORAGE + HRLI C,PROCHN ;SETUP FOR BLT + HRRI C,(B) + BLT C,CHANLNT-1(B) ;BLT IN THE TYPES + MOVE A,(TB) ;GET TYPE + MOVEM A,DIRECT-1(B) ;AND CLOBBER + MOVE A,1(TB) ;GET THE DIRECTION + MOVEM A,DIRECT(B) ;STORE IT + MOVE A,2(TB) ;TYPE FIRST + MOVEM A,NAME1-1(B) + MOVEM A,RNAME1-1(B) + MOVE A,3(TB) ;GET NAME1 + MOVEM A,NAME1(B) + MOVEM A,RNAME1(B) ;ALSO REAL NAME 1 + MOVE A,4(TB) ;TYPE + MOVEM A,NAME2-1(B) + MOVEM A,RNAME2-1(B) + MOVE A,5(TB) ;MAME 2 + MOVEM A,NAME2(B) + MOVEM A,RNAME2(B) ;ALSO REAL NAME 2 + MOVE A,6(TB) + MOVEM A,DEVICE-1(B) + MOVEM A,RDEVICE-1(B) + MOVE A,7(TB) ;GET DEVICE NAME + MOVEM A,DEVICE(B) + MOVEM A,RDEVIC(B) + MOVE A,10(TB) + MOVEM A,SNAME-1(B) + MOVEM A,RSNAME-1(B) + MOVE A,11(TB) ;FINALLY UNAME + MOVEM A,SNAME(B) + MOVEM A,RSNAME(B) + SUB TP,[10.,,10.] ;GARBAGE COLLECT TP + MOVSI A,TCHAN ;MAKE TYPE INTO CHANNEL + POPJ P, ;RETURN + + ;OPEN THE CHANNEL POINTED TO BY B + +OPNCHN: PUSH TP,$TCHAN ;SAVE THE CHANNEL + PUSH TP,B + MOVEI B,DIRECT-1(B) ;POINT TO DIRECTION + PUSHJ P,CHRWRD ;PUT INTO A WORD + JFCL + MOVE E,B ;TO E + MOVE B,(TP) + MOVE A,DEVICE-1(B) ;GET DEVICE + MOVE B,DEVICE(B) + PUSHJ P,STRTO6 ;CONVERT TO 6-BIT + HLRZS A,(P) ;DEVICE TO RH + CAIN A,(SIXBIT /E&S/) ;DISPLAY HACK? + JRST DISCHK ;YES, GO HACK + MOVE B,(TP) ;RESTORE B + MOVE A,NAME1-1(B) ;TYPE OF NAME1 + MOVE B,NAME1(B) ;GET THE FIRST NAME + PUSHJ P,STRTO6 ;TO 6-BIT + MOVE B,(TP) ;RESTORE B + MOVE A,NAME2-1(B) + MOVE B,NAME2(B) ;SECOND NAME + PUSHJ P,STRTO6 ;ALSO TO 6 BIT + MOVE B,(TP) + MOVSI A,INBIT ;GET BIT FOR INPUT OPEN + CAME E,[ASCII /READ/] ;REALLY INPUT? + MOVSI A,OUTBIT ;NO GET OUTPUT BIT + IORM A,-2(P) ;INTO OPEN STUFF + MOVE A,SNAME-1(B) + MOVE B,SNAME(B) ;GOBBLE SNAME + PUSHJ P,STRTO6 ;6 BIT + POP P,A ;RESTORE RESULT + .SUSET [.SSNAM,,A] ;SET THE SYSTEM NAME + MOVEI A,-2(P) ;POINT TO OPEN BLOCK + PUSHJ P,OPEN ;DO THE OPEN + JRST OPNFAI ;OPEN FAILED, LOSE + MOVE B,(TP) ;RESTORE B + PUSHJ P,DOSTAT ;GOBBLE THE STATUS + LDB C,[600,,STATUS(B)] ;GOBBLE STATUS + CAMN E,[ASCII /PRINT/] + CAIE C,2 ;SKIP IF DATAPOINT CROCK + JRST OPNCH2 ;NOT SAME FOR OUTPUT + + PUSHJ P,CLOSE ;CLOSE THE FILE + MOVSI A,OUTBIT+20 ;AND RE-OPEN IN DISPLAY MODE + HLLM A,-2(P) + MOVEI A,-2(P) ;POINT TO OPEN BLOCK + PUSHJ P,OPEN ;NOW OPEN THE DEVICE + JRST OPNFAI ;CANT OPEN + +OPNCH2: SUB P,[3,,3] ;REMOVE OPEN BLOCK + MOVEM A,CHANNO(B) ;RESTORE CHANNEL NUMBER + MOVEI D,(A) ;COPY CHANNEL NO. + LSH D,1 + ADDI D,CHANL0+1(TVP) ;POINT TO THIS CHANNELS TV ENTRY + MOVEM B,(D) + HRLZS A ;CHANNEL NO. TO LH + MOVE C,A ;COPY TO C + ROT C,5 ;INTO C'S AC FILED + IOR C,[.IOT 0,A] ;AND AN I/O INSTRUCTION + MOVEM C,IOINS(B) ;SAVE IN CHANNEL +; THIS CODES SETS THE 'REAL' NAMES, DEVICES AND SNAMES + + HRRI A,1(P) ;POINT INTO P + MOVEI C,(A) ;C ALSO POINTS + ADD P,[5,,5] ;ALLOCATE SOME P + JUMPGE P,[.VALUE [ASCIZ 'P/']] ;DIE ON PDL LOSSAGE + .RCHST A, ;READ THE STATUS + HRLZS (C) ;FOR NOW KILL LH OF DEVICE + HRLI C,-5 ;5 GOODIES + PUSH P,C + PUSH P,[0] ;USED AS A COUNTER +NXTREL: MOVEM C,-1(P) ;SAVE C + SKIPN A,(C) ;WAS THIS ONE GIVEN? + JRST NXTLOK ;NO, SKIP CHANGE + PUSHJ P,6TOCHS ;YES, MAKE INTO ATOM + MOVEI C,RDTBL ;FIND OUT WHERE + ADD C,(P) ;FOR THIS ONE + MOVE C,(C) ;NOW HAVE TH OFFSET TO USE + ADD C,(TP) ;ADD TO POINTER + MOVEM A,-1(C) + MOVEM B,(C) ;CLOBBER THE NEW ATOM IN + MOVE C,-1(P) ;RESTORE C +NXTLOK: AOS (P) ;COUNT THE GOODIES + AOBJN C,NXTREL + + SUB P,[7,,7] ;GC ON P + +; DETERMIN EIF THIS IS A TTY FLAVOR DEVICE + + MOVE B,(TP) ;RESTORE CHANEL POINTER + MOVE A,STATUS(B) ;GET STATUS + ANDI A,77 ;ISOLATE DEVICE SPEC + CAMN E,[ASCIZ /READ/] + CAILE A,2 ;NOT A TTY, NO FURTHER ACTION + JRST OPNRET + + PUSH TP,$TFIX ;CALL UVECTOR FOR BUFFER + PUSH TP,[EXTBFR] + MCALL 1,UVECTOR ;GET VECTOR + MOVE C,[PUSHJ P,READC] ;GET NEW IOINS + MOVE D,(TP) ;RESTORE CHANNEL POINTER + EXCH C,IOINS(D) ;STORE NEW ONE AND GE OLD + MOVEM C,IOIN2(B) ;STORE + MOVEM B,BUFRIN(D) ;STORE IN CHANNEL + MOVSI A,TUVEC ;MAKE SURE TYPE IS UNIFORM VECTOR + MOVEM A,BUFRIN-1(D) + MOVEI A,177 ;SET ERASER TO RUBOUT + MOVEM A,ERASCH(B) + SETOM KILLCH(B) ;NO KILL CHARACTER NEEDED + MOVEI A,33 ;BREAKCHR TO C.R. + MOVEM A,BRKCH(B) + MOVEI A,"\ ;ESCAPER TO \ + MOVEM A,ESCAP(B) + MOVE A,[010700,,BYTPTR(B)] ;RELATIVE BYTE POINTER + MOVEM A,BYTPTR(B) + MOVEI A,14 ;BARF BACK CHARACTER FF + MOVEM A,BRFCHR(B) + +OPNRET: POP TP,B ;GET CHANNEL POINTER BACK + + POP TP,A ;RESTORE TYPE OF CHANNEL + POPJ P, + + +;TABLE USED TO DO THE 'REAL GOODIES' + +RDTBL: RDEVIC + RNAME1 + RNAME2 + RSNAME + ACCESS + + +;HERE TO DO STATUS FOR OPEN LOSSAGE ETC. + +DOSTAT: PUSH P,A ;SAVE CHANNEL + ROT A,23. ;INTO AC FILED + IOR A,[.STATUS STATUS(B)] ;GOBBLE THE STATUS + XCT A ;DO IT + POP P,A + POPJ P, + + +;MAKE THE DISPLAY DEVICE A PSEUDO DEVICE HANDLED BY "DCHAR" ROUTINE +DISCHK: SUB P,[1,,1] ;POP OFF JUNK + MOVE B,(TP) ;GET POINTER TO CHANNEL + SETZM CHANNO(B) ;A PSEUDO CHANNEL NUMBER + MOVE C,[PUSHJ P,DCHAR] + MOVEM C,IOINS(B) ;GO TO THIS ROUTINE TO HANDLE I/O + MOVEI C,DISLNL + MOVEM C,LINLN(B) + MOVEI C,DISPGL + MOVEM C,PAGLN(B) + PUSHJ P,DISOPN ;GO INITIALIZE THE DISPLAY + JRST OPNFAI + JRST OPNRET + +;ARRIVE HERE IF FOPEN CALLED WITH WRONG TYPES OF ARGUMENTS + +WRONGT: PUSH TP,$TATOM ;SET UP CALL TO ERROR + PUSH TP,MQUOTE WRONG-TYPE + JRST CALER1 + + +;THIS ROTINE CONVERTS MUDDLE CHARACTER STRINGS TO SIXBIT FILE NAMES +STRTO6: PUSH TP,A + PUSH TP,B + PUSH P,E ;SAVE USEFUL FROB + MOVEI E,-1(A) ;GET END+1 OF TCHSTR + HLRZS A ;CHECK THE TYPE(ONE WORD OR VECTOR) + CAIE A,TCHRS ; IS IT ONE WORD? + JRST CHREAD ;NO + MOVEI B,(TP) ;YES, CREATE DUMMY VECTOR POINTER + HRLI B,350700 + MOVEI E,1(TP) ;AND DUMMY VECTOR END+1 +CHREAD: MOVEI A,0 ;INITIALIZE OUTPUT WORD + MOVE D,[440600,,A] ;AND BYTE POINTER TO IT + LDB 0,B ;PICK UP FIRST CHARACTER +NEXCHR: + JUMPE 0,SIXDON ;IF NULL, WE ARE FINISHED + CAIL 0,141 ;IF IT IS GREATER OR EQUAL TO LOWER A + CAILE 0,172 ;BUT LESS THAN OR EQUAL TO LOWER Z + JRST .+2 ;THEN + SUBI 0,40 ;CONVERT TO UPPER CASE + SUBI 0,40 ;NOW TO SIX BIT + JUMPLE 0,BAD6 ;CHECK FOR A WINNER + CAILE 0,77 + JRST BAD6 + IDPB 0,D ;DEPOSIT INTO SIX BIT + TRNE A,77 ;IS OUTPUT FULL + JRST SIXDON ;YES, LEAVE + ILDB 0,B ;GET NEXT CHAR AND INC POINTER + HRRZ C,B ;GET ADDRESS PART OF BYTE POINTER + CAME C,E ;HAS POINTER REACHED LIMIT? + JRST NEXCHR ;NO, GOBBLE NEXT CHARACTER +SIXDON: SUB TP,[2,,2] ;FIX UP TP + POP P,E + EXCH A,(P) ;LEAVE RESULT ON P-STACK + JRST (A) ;NOW RETURN + + +;SUBROUTINE TO CONVERT SIXBIT TO ATOM + +6TOCHS: PUSH P,E + MOVEI B,6 ;MAX NUMBER OF CHARACTERS + PUSH P,[0] ;STRING WILL GO ON P SATCK + MOVEI E,-1(P) ;WILL BE BYTE POINTER + HRLI E,10700 ;SET IT UP + PUSH P,[0] ;SECOND POSSIBLE WORD + MOVE D,[440600,,A] ;INPUT BYTE POINTER +6LOOP: ILDB 0,D ;START CHAR GOBBLING + JUMPE 0,GETATM ;IF ZERO, FINISHED + ADDI 0,40 ;CHANGET TOASCII + IDPB 0,E ;AND STORE IT + SOJG B,6LOOP ;KEEP LOOKING + PUSH P,[2] ;IF ARRIVE HERE, STRING IS 2 WORDS + JRST .+2 +GETATM: AOS (P) ;SET STRING LENGTH=1 + PUSHJ P,CHMAK ;MAKE A MUDDLE STRING + POP P,E + POPJ P, + + +;HERE IF OPEN FAILS + +OPNFAI: MOVE B,(TP) ;RESTORE CHANNEL POINTER + SETOM STATUS(B) ;SET TO -1 + JUMPL A,.+2 ;A<0 MEANS NO CHANNELS + PUSHJ P,DOSTAT ;GOBBLE STATUS + SUB TP,[2,,2] ;PATCH UP TP + SUB P,[3,,3] ;REMOVE CRAP +RETNIL: MOVSI A,TFALSE ;RETURN A FALSE + MOVEI B,0 + POPJ P, + +;ERROR FOR BAD CHARACTER IN SIX BIT STRING + +BAD6: PUSH TP,$TATOM ;SETUP ERROR CALL + PUSH TP,MQUOTE FILE-NAME-NOT-6-BIT + JRST CALER1 + + +; FUNCTION TO LIST ALL CHANNELS + +MFUNCTION CHANLIST,SUBR + + ENTRY 0 + + MOVEI A,16. ;MAX # OF CHANNELS + MOVEI C,0 + MOVEI B,CHANL0(TVP) ;POINT TO FIRST + +CHNLP: SKIPN 1(B) ;OPEN? + JRST NXTCHN ;NO, SKIP + PUSH TP,(B) + PUSH TP,1(B) + ADDI C,1 ;COUNT WINNERS +NXTCHN: ADDI B,2 + SOJN A,CHNLP + + ACALL C,LIST + JRST FINIS + + +;THIS PROGRAM CLOSES THE SPECIFIED CHANNEL + +MFUNCTION FCLOSE,SUBR,[CLOSE] + + ENTRY 1 ;ONLY ONE ARG + HLRZ A,(AB) ;CHECK ARGS + CAIE A,TCHAN ;IS IT A CHANNEL + JRST WRONGT + MOVE B,1(AB) ;PICK UP THE CHANNEL + CLEARM IOINS(B) ;CLOBBER THE IO INS + MOVEI B,DEVICE-1(B) ;GE THE NAME OF THE DEVICE + PUSHJ P,CHRWRD + JFCL + MOVE A,B + MOVE B,1(AB) + CAMN A,[ASCIZ /TTY/] ;IS IT THE TTY? + JRST TTYCLS ;YES, DO SPECIAL HACK + CAMN A,[ASCIZ /DIS/] + PUSHJ P,DISCLS ;GO RELEASE THE DISPLAY SPACE + SKIPE A,CHANNO(B) ;IS THERE A CHANNEL NO.? + PUSHJ P,CLOSE ;YES, CLOSE IT +CFIN: SKIPN A,CHANNO(B) ;ANY CHANNEL? + JRST CFIN2 + LSH A,1 + ADDI A,CHANL0+1(TVP) ;POINT TO THIS CHANNELS LSOT + SETZM CHANNO(B) + SETZM (A) ;AND CLOBBER IT +CFIN2: MOVSI A,TCHAN ;RETURN THE CHANNEL + JRST FINIS + +TTYCLS: MOVE A,DIRECT(B) ;GET THE DIRECTION OF THE CHANNEL + CAMN A,CHQUOTE READ, ;IS IT READ + PUSHJ P,ICLOS ;YES, CLOSE THAT + CAMN A,CHQUOTE PRINT, ;IS IT PEINT + PUSHJ P,OCLOS ;YES CLOSE TTY OUT CHANNEL + JRST CFIN + + +END + +  \ No newline at end of file diff --git a/MUDDLE/graphs.ura001 b/MUDDLE/graphs.ura001 new file mode 100644 index 0000000..20a73fc --- /dev/null +++ b/MUDDLE/graphs.ura001 @@ -0,0 +1,227 @@ + + > .P>> + > + LFX + )> + > + > )> + 0>> + )> + > + > >)> + > <* 0.5 <+ !.YM>>)> + NAS + LSC <- <.N .X> <1 .HPTS> >> + 500>>> + <- <.N .Y> <2 .HPTS> >> + 400>>> + > + >> )> + + + <- 0.0 <1 .HPTS>>> 500>>> >> + > )> )> + + <- 0.0 <2 .HPTS>>> 400>>> >> + > )> )> + + " + YMAX + " <2 .YM> " + SCALE + " .SCALE )> + >>> + ) (BIG <1 .X>) (SMALL <1 .X>)) + .BIG> > )> + .SMALL> > )> + > + )> + >>> + + + + + + + + + + + + "MOBIUS TRANGLE" + >> + + .Y> + > + >>> + >>>> + SET Q <+ .Q .I>> + > )> + >>>> .Y> + > + >>> + >>>> + > + > )> + >>>> + >> )> + > )> + + + > + )> + )> + > + >)> + >>>> + >>>> + >>>> ) + >> + >> + )> + > + + + LOOP <.N .Y>> )> + > + + )> + + ZAP + + >>> + + >>>>> + )> > + >>> + + + + + >> + )> + >> + + > + >> + > + > + + LOOP <- .X 500>> 40>> + > + )> + > + + >>> + > + > + > + >>> + + LOOP <- .X 500>> 10>> + > + > + > + )> + > + + >>> + + LOOP 10>> + > + )> + > + + >>> + > + + > + >>> + > + + LOOP )> + ;"ALL GOOD FUNCTIONS RETURN SOMETHING + THEREFORE SEND RETURNS 1." + >> + > + + >>> + + >> + >> + >> + >> + >> + > + > + > + > + + >>> +  \ No newline at end of file diff --git a/MUDDLE/initm.42 b/MUDDLE/initm.42 new file mode 100644 index 0000000..72cacb1 --- /dev/null +++ b/MUDDLE/initm.42 @@ -0,0 +1,423 @@ + +TITLE INITIALIZATION FOR MUDDLE + +RELOCATABLE + +LAST==1 ;POSSIBLE CHECKS DONE LATER + +.INSRT MUDDLE > + +.LIFL +.LOP .VALUE +.ELDC + + +.GLOBAL SETUP,TPBAS,GCPDL,GCPVP,PVBASE,PVLNT,PARNEW,AGC,ICR,SWAP,OBLNT,MSGTYP +.GLOBAL ICLOS,OCLOS,GLOBASE,GLOBSP,PARBOT,PARTOP,CODTOP,START,VECBOT,VECTOP,TPBASE +.GLOBAL LISTEN,ROOT,TBINIT,TOPLEV,INTOBL,ERROBL,TTYOPE +.GLOBAL IOINS,BUFRIN,IOIN2,ECHO,TYI,TYO + +SETUP: MOVE P,GCPDL ;GET A PUSH DOWN STACK + MOVE TVP,[-TVLNT,,TVBASE] ;GET INITIAL TRANSFER VECTOR + PUSHJ P,TTYOPE ;OPEN THE TTY + 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 + MOVE B,PARBOT ;CHECK FOR ANY PAIRS + CAME B,PARTOP ;ANY LOAD/ASSEMBLE TIME PAIRS? + JRST PAIRCH ;YES CHECK THEM + ADDI A,1 ;BUMP UP + MOVEM A,PARBOT ;UPDATE PARBOT AND TOP + MOVEM A,PARTOP +SETTV: MOVE PVP,[-PVLNT*2,,GCPVP] ;AND A PROCESS VECTOR + 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 + HRLI TB,1 + SUB TP,[1,,1] ;POP ONCE + +; ALLOCATE SOME OBLISTS FOR INITIAL ATOMS + + PUSH P,[3] ;COUNT INITIAL OBLISTS + +MAKEOB: MCALL 0,MOBLIST ;GOBBLE AN OBLIST + PUSH TP,$TOBLS ;AND SAVE THEM + PUSH TP,B + SOS A,(P) ;COUNT DOWN + MOVEM B,@OBTBL(A) ;STORE + JUMPN A,MAKEOB + + MOVE C,TVP ;MAKE 2 COPIES OF XFER VECTOR POINTER + MOVE D,TVP + +;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,C ;GET -LENGTH + SUBI C,(B) ;POIT TO DOPE WORD + ANDI C,-1 ;NO LH + HLRZ A,1(C) ;INTIAL LENGTH TO A + MOVEI E,(C) ;COPY OF POINTER TO DOPW WD + SUBI E,(D) ;AMOUNT LEFT OVER TO E + HRLZM E,1(C) ;CLOBBER INTO DOPE WORD FOR GARBAGE + MOVSI E,(E) ;PREPARE TO UPDATE TVP + ADD TVP,E ;NOW POINTS TO THE RIGHT AMOUNT + HLRE B,D ;-AMOUNT LEFT TO B + ADD B,A ;AMOUNT OF GOOD STUFF + HRLZM B,1(D) ;STORE IT IN GODD DOPE WORD + MOVSI E,400000 ;CLOBBER TO GENERAL IN BOTH CASES + MOVEM E,(C) + MOVEM E,(D) + + +; FIX UP TYPE VECTOR + + MOVE A,TYPVEC+1(TVP) ;GET POINTER + MOVEI 0,0 ;FOR POSSIBLE NULL SLOTS + MOVSI B,TATOM ;SET TYPE TO ATOM + +TYPLP: HLLM B,(A) ;CHANGE TYPE TO ATOM + MOVE C,@1(A) ;GET ATOM + MOVEM C,1(A) + ADD A,[2,,2] ;BUMP + JUMPL A,TYPLP + +;GENERAT THE LOGICAL TTY IN AND OUT CHANNELS + +;SETUP CALL TO OPEN OUTPUT TTY CHANNNEL + + IRP A,,[[PRINT,TCHSTR],[OUTPUT,TCHSTR],[MUDDLE,TCHSTR],[TTY,TCHSTR]] + IRP B,C,[A] + PUSH TP,$!C + PUSH TP,CHQUOTE B + .ISTOP + TERMIN + TERMIN + + MCALL 4,FOPEN ;OPEN THE OUT PUT CHANNEL + MOVEM B,TTOCHN+1(TVP) ;SAVE IT + +;ASSIGN AS GLOBAL VALUE + + PUSH TP,$TATOM + PUSH TP,MQUOTE OUTCHAN + PUSH TP,A + PUSH TP,B + MOVE A,[PUSHJ P,TYO] ;MORE WINNING INS + MOVEM A,IOINS(B) ;CLOBBER + MCALL 2,SETG + +;SETUP A CALL TO OPEN THE TTY CHANNEL + + IRP A,,[[READ,TCHSTR],[INPUT,TCHSTR],[MUDDLE,TCHSTR],[TTY,TCHSTR]] + IRP B,C,[A] + PUSH TP,$!C + PUSH TP,CHQUOTE B + .ISTOP + TERMIN + TERMIN + + MCALL 4,FOPEN ;OPEN INPUTCHANNEL + MOVEM B,TTICHN+1(TVP) ;SAVE IT + PUSH TP,$TATOM ;ASSIGN AS A GLOBAL VALUE + PUSH TP,MQUOTE INCHAN + PUSH TP,A + PUSH TP,B + MOVE C,BUFRIN(B) ;GET AUX BUFFER PTR + MOVE A,[PUSHJ P,TYI] + MOVEM A,IOIN2(C) ;MORE OF A WINNER + MOVE A,[PUSHJ P,TYO] + MOVEM A,ECHO(C) ;ECHO INS + MCALL 2,SETG + +;GENERATE AN INITIAL PROCESS AND SWAP IT IN + + PUSHJ P,ICR ;CREATE IT + 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] + PUSH TP,[0] + PUSH TP,SP + PUSH TP,P + MOVE C,TP ;COPY TP + ADD C,[3,,3] ;FUDGE + PUSH TP,C ;TPSAV PUSHED + PUSH TP,PP + PUSH TP,[TOPLEV] + HRRI TB,(TP) ;SETUP TB + HRLI TB,2 + ADD TB,[1,,1] + MOVEM TB,TBINIT+1(PVP) + +; CREATE LIST OF ROOT AND NEW OBLIST + + MCALL 0,MOBLIST ;MAKE OBLIST + PUSH TP,A ;SAVE RESULTS + PUSH TP,B + PUSH TP,ROOT(TVP) + PUSH TP,ROOT+1(TVP) + MCALL 2,LIST ;MAKE LIST + MOVEM A,ROOT(TVP) + MOVEM B,ROOT+1(TVP) + PUSH TP,$TATOM ;ASSIGN TO GLOBAL VALUE + PUSH TP,MQUOTE OBLIST + PUSH TP,A + PUSH TP,B + MCALL 2,SETG + + + PUSH TP,$TATOM + PUSH TP,MQUOTE QUITTER + MCALL 1,LIST + PUSH TP,$TCHAN ;SET UP CNTL-G INT + PUSH TP,TTICHN+1(TVP) + PUSH TP,$TFORM + PUSH TP,B + MCALL 2,ONCHAR ;TURN ON INTERRUPT + MOVEI A,SETUP ;POINT TO START + MOVEM A,CODTOP + ADDI A,1 + SUB A,PARBOT ;FIND WHERE PAIRS SHOULD GO + MOVEM A,PARNEW + PUSH P,[14.,,14.] ;PUSH A SMALL PRGRM ONTO P + MOVEI A,1(P) ;POINT TO ITS START + PUSH P,[JRST AGC] ;GO TO AGC + PUSH P,[MOVE B,PSTO+1(PVP)] ;GET SAVED P + PUSH P,[SUB B,-13.(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,SPSTO+1(PVP)] ;SP + PUSH P,[MOVEM B,SPSAV(TB)] + PUSH P,[MOVEI B,TOPLEV] ;WHERE TO GO + PUSH P,[MOVEM B,PCSAV(TB)] + PUSH P,[MOVSI B,(.VALUE )] + PUSH P,[HRRI B,C] + PUSH P,[JRST B] ;GO DO VALRET + PUSH P,[A] ;RETURN ADDRESS FOR AGC + PUSH P,A ;SAVE A + MOVE A,[JRST -11.(P)] ;WHEER TO START + SUB P,[1,,1] ;REMOVE LOSSAGE + MOVE 0,[JUMPA START] + MOVE B,[.VALUE C] ;SETUP VALRET + MOVE C,[ASCII \0/9\] + MOVE D,[ASCII \B!Qî\] + MOVE E,[ASCIZ \*\] ;TERMINATE + JRST @1(P) ;GO DO IT + +; 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 + HLRE E,B ;-LENGHT + SUBM B,E ;E POINTS TO DOPE WORDS + ADDI E,1 ;POINT TO 2ND + HRRM E,(D) ;INTO PE CELL + HRLI B,350700 ;MAKE POINT BYTER + MOVEM B,1(D) ;AND STORE IT + ANDI A,-1 ;CLEAR LH OF A + JUMPE A,SETLP ;JUMP IF NO REF + MOVE E,(P) ;GET OFFSET + LSH E,1 + 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 E,-1(A) ;CLOBBER + MOVEI B,TVP + DPB B,[220400,,-1(A)] ;CLOBBER INDEX FIELD +CHACK1: ADDI E,1 + HRRM E,(A) ;STORE INTO REFERENCE + JRST SETLP + +; PROCESS AN ATOM AND ADD IT TO AN APPROPRIATE OBLIST IF IT ISN'T +; ALREADY THERE + +ATOMHK: PUSH TP,$TVEC ;SAVE TV POINTERS + PUSH TP,C + PUSH TP,$TVEC + PUSH TP,D + MOVE B,1(C) ;GET THE ATOM + PUSH TP,$TATOM ;AND SAVE + PUSH TP,B + HRRZ A,(B) ;GET OBLIST SPEC FROM ATOM + LSH A,1 + ADDI A,1(TB) ;POINT TO ITS HOME + PUSH TP,$TOBLS + PUSH TP,(A) ;AND SAV IT + + ADD B,[2,,2] ;POINT TO ATOM'S PNAME + MOVEI A,0 ;FOR HASHING + XOR A,(B) + AOBJN B,.-1 + MOVMS A ;FORCE POSITIVE RESULT + IDIV A,OBLNT + HRLS B ;REMAINDER IN B IS BUCKET + ADDB B,(TP) ;UPDATE POINTER + + SKIPN C,(B) ;GOBBLE BUCKET CONTENTS + JRST USEATM ;NONE, LEAVE AND USE THIS ATOM +OBLOO3: MOVE E,-2(TP) ;RE-GOBBLE ATOM + ADD E,[2,,2] ;POINT TO PNAME + SKIPN D,1(C) ;CHECK LIST ELEMNT + JRST NXTBCK ;0, CHECK NEXT IN THIS BUCKET + ADD D,[2,,2] ;POINT TO PNAME +OBLOO2: MOVE A,(D) ;GET A WORD + CAME A,(E) ;COMPARE + JRST NXTBCK ;THEY DIFFER, TRY NEX +OBLOOP: AOBJP E,CHCKD ;COULD BE A MATCH, GO CHECK + AOBJN D,OBLOO2 ;HAVEN'T LOST YET + +NXTBCK: HRRZ C,(C) ;CDR THE LIST + JUMPN C,OBLOO3 ;IF NOT NIL, KEEP TRYING + +;HERE IF THIS ATOM MUST BE PUT ON OBLIST + +USEATM: MOVE B,(TP) ;POINTER TO BUCKET + HRRZ C,(B) ;POINTER TO LIST IN THIS BUCKET + PUSH TP,$TATOM ;GENERATE CALL TO CONS + PUSH TP,-3(TP) + PUSH TP,$TLIST + PUSH TP,C + MCALL 2,CONS ;CONS IT UP + MOVE C,(TP) ;REGOBBLE BUCKET POINTER + HRRZM B,(C) ;CLOBBER + MOVE B,-2(TP) ;POINT TO ATOM + PUSHJ P,VALMAK ;MAKE A GLOBAL VALUE FOR THIS LOSER + MOVE C,-6(TP) ;RESET POINTERS + MOVE D,-4(TP) + SUB TP,[8,,8] + 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) + MOVE A,(P) ;GET CURRENT OFFSET + LSH A,1 + ADDI A,1 + ANDI B,-1 ;CHECKFOR REAL REF + JUMPE B,SETLP + HRRM A,(B) ;CLOBBER CODE + JRST SETLP + + +; A POSSIBLE MATCH ARRIVES HERE + +CHCKD: AOBJN D,NXTBCK ;SIZES DIFFER, JUMP + MOVE D,1(C) ;THEY MATCH!, GET EXISTING ATOM + HLRZ A,(D) ;GET TYPE OF IT + CAIE A,TUNBOU ;UNBOUND? + JRST A1VAL ;YES, CONTINUE + MOVE B,-2(TP) ;GET NEW ATOM + MOVE A,(B) ;MOVE VALUE + MOVEM A,(D) + MOVE A,1(B) + MOVEM A,1(D) + MOVE B,D ;EXISTING ATOM TO B + PUSHJ P,VALMAK ;MAKE A VALUE + +;NOW FIND ATOMS OCCURENCE IN XFER VECTOR + +OFFIND: MOVE D,-4(TP) ;GET CURRENT POINTER INTO TP + MOVE C,TVP ;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 + CAMGE C,D ;HAVE WE HIT END + 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 + 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,[8,,8] + JRST SETLP1 ;AND GO ON + +A1VAL: MOVE B,-2(TP) ;GET NEW ATOM POINTER + 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 + + +;MAKE A VALUE IN SLOT ON GLOBAL SP + +VALMAK: HLRZ A,(B) ;TYPE OF VALUE + CAIN A,TUNBOU ;VALUE? + POPJ P, ;NO, ALL DONE + MOVE A,GLOBSP+1(TVP) ;GET POINTER TO GLOBAL SP + SUB A,[4,,4] ;ALLOCATE SPACE + CAMG A,GLOBAS+1(TVP) ;CHECK FOR OVERFLOW + JRST SPOVFL + MOVEM A,GLOBSP+1(TVP) ;STORE IT BACK + MOVE C,(B) ;GET TYPE CELL + HLLZM C,2(A) ;INTO TYPE CELL + MOVE C,1(B) ;GET VALUE + MOVEM C,3(A) ;INTO VALUE SLOT + MOVSI C,TATOM ;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, + +SPOVFL: MOVEI B,[ASCIZ /LOSSAGE--GLOBAL SP OVERFLOW +/] + JRST TYPIT + + +OBTBL: INTOBL+1(TVP) + ERROBL+1(TVP) + ROOT+1(TVP) + +END SETUP + + +  \ No newline at end of file diff --git a/MUDDLE/mapper.9 b/MUDDLE/mapper.9 new file mode 100644 index 0000000..153fb0f --- /dev/null +++ b/MUDDLE/mapper.9 @@ -0,0 +1,80 @@ + + + + + +> + +"LIST SPLICER NCONC" + + .L2) + ( .L1) + (T 1>> + .L2> + .L1)>> + + +"MULTIPLE LIST SPLICER" + + ()) + (T ) (ANS <.T .L>)) + >> )> + .ANS>>>)>>> + + + + 'NONE-OF-YOUR-BUSINESS) + (<==? > FIX> <<1 .L> .L>) + (T < .L>)>> + +"GENERALIZED MAPPER FUNCTION ACCORDING TO THE GOSPEL OF SUSSMAN" + + + + >> + )> + <.INMAP .L1> + >> + > + )> + >> + >>> + >>>>> + + +"SPECIFIC INVOCATIONS OF *MAP" + +> + +> + +> + +> + +> + +> +  \ No newline at end of file diff --git a/MUDDLE/match.18 b/MUDDLE/match.18 new file mode 100644 index 0000000..f1810e5 --- /dev/null +++ b/MUDDLE/match.18 @@ -0,0 +1,216 @@ + + T >> + + + T> + () + <> >>> + + + + T >> + + + T> + () + <> >>> + + + .EXP> + () + >>> ) (BOUND ) + (OBLIGATORY T) (PBOUND ) + "AUX" PURE ENDP K BETA ENDE) + FORM> + <.S >) + ( + > + .BOUND) + ( + <.S >>) + ( + >) > + + + > + <.R >) + (<==? > SEGMENT> + .EXP .ENDE .OBLIGATORY>>>) + (<==? .EXP .ENDE> ) + (T <1 .EXP>> + >) > + > > + + <.S .EXP>) + (T <1 .EXP>>) > + > + > > >> ) (ENV2 <>) + (BOUND1 ) (BOUND2 ) + (OBL T)) + FORM> + FORM> + > >>> + <.MATCHER >>) > + <.MATCHER >>) + (<==? FORM> + <.MATCHER >>) + ( > + <.MATCHER >>) + ( > + ) + ( > + <.MATCHER .PAT2>) > + ALPHA1 SEG1> + ALPHA2 SEG2> + + + ) + (>>) >) + ( + > + ) + (>>) >) > + <.R <>>) + (T <1 .PAT2> .ENV1 .ENV2>) > + > + > > + END1 K1 BETA1 S1> + END2 K2 BETA2 S2> + + > + >>> + > + ) + ( + >>> + > + ) + (T > + >) >) > + <0? .K1>> + <0? .K2>> + FORM>> + .FORM1 .FORM1 T .ENV1 .ENV2 <>>) + (T .SEG2 .END2 T .ENV1 .ENV2 <>>) >) + ( <0? .K2>> + .SEG1 .END1 T .ENV1 .ENV2 <>>) + (<0? .S2> + ) + (T >) >) + (<0? .S1> + ) + () >) + (T <#FUNCTION ((UV1 UV2) + > + ) + + >) > + ) > + <1 .END2> .ENV1 .ENV2> + > + > > > >> ) + (BOUND2 ) (OBL T) + "AUX" FORM1) + + <.SMATCHER .PAT2>) + (<==? > SEGMENT> + .PAT2 .BOUND2 .BOUND1> .OBL> .ENV1 .ENV2 <>>>) + (<==? .PAT2 .BOUND2> ) + (T <1 .PAT2> .ENV1 .ENV2> + >) > + > > >> + + >) + (<==? > SEGMENT> + > + + >) + (T >)> + > > >> + + +)) + .KOUNT> + > + > >> + + + + .K) + (T > + > + )> >> + + + + + > + .EXP >> + <==? > SEGMENT>> + <.SOFTENER [.ALPHA .PAT]>) > + > + > > >> + + + + + <.HACKER [.END .K .BETA .S]>) + (<==? >> SEGMENT> + > + + >>>> + >) > + > + + >) + (T >) > + > > >> +  \ No newline at end of file diff --git a/MUDDLE/medcom.2 b/MUDDLE/medcom.2 new file mode 100644 index 0000000..33f861f --- /dev/null +++ b/MUDDLE/medcom.2 @@ -0,0 +1,41 @@ +Commands: +NAME ARGS MEANING +? none Type this summary out. +O 1 Open object; takes ATOM, LOCATIVE, or CURSOR. +HERE 1,ATOM save your current CURSOR as the LVAL of ARG. +UT none Up Top -- go to the place you were just after O. +& none "Ampersand print" (normally done automatically). + none (Empty command) equivalent to &. +Q none Quit -- return to MUDDLE. +^K 1 Exit from MUDDLE and VALRET arg (STRING or ATOM). +P none (P)PRINT the next object. +PA 1,FIX (P)PRINT the object arg levels above position. +PT none (P)PRINT the whole object open. +V none toggle Verbosity. +R 1,FIX move Right arg objects. +L 1,FIX move Left arg objects. +B none move to the Back of the object. +F none move to the Front of the object. +U 1,FIX move Up arg levels (and to the left). +D 1,FIX move Down arg levels (and to the right). +UR 1,FIX move Up arg levels (and to the right). +DL 1,FIX move Down arg levels (and to the left). +S 1,any Search -- tree-walk right until you find arg. +-S 1,any Search left -- tree-walk left until you find arg. +WR 1,FIX Walk Right arg positions. +WL 1,FIX Walk Left arg positions. +C 1,any Change the next object to arg. +I any,any Insert args to the left of the cursor. +K 1,FIX Kill (delete) the next arg objects. +K: none Remove the "brackets" around the next object. +I: 2 Make the next (arg 2) objects into a TYPE (arg 1). +C: 1,TYPE Change the Type of the next object to arg. +SC 1,any Put arg on next object as a comment. +PC none Print comment on next object. +BK any,any BreaKpoint on next object; args typed at break. +KB none Kill all Breakpoints in open object. +OB any,ATOM BLOCK to list of OBLISTs whose names are given. +EB none ENDBLOCK. +OB? none type names of OBLISTs in current list of OBLISTs. + returns you to MEDDLE from a higher level. +  \ No newline at end of file diff --git a/MUDDLE/meddle.3 b/MUDDLE/meddle.3 new file mode 100644 index 0000000..99c0a70 --- /dev/null +++ b/MUDDLE/meddle.3 @@ -0,0 +1,370 @@ +" "DSK" > + + +XMED!- +MMED!- +MEDDLE!- + + )> +O UT ? HERE OB EB OB? +P PA PT PC +S -S I C R L K U D UR DL WR WL B F +C: I: K: +SC V & Q +BK KB + + + )> + + + + + +) + (CLLN <- <13 .OUTCHAN> 4>) + (OBPDL ()) + (VERBSW #FALSE ())) + + )>> + +> + + O>)) + > + OBANDCURS> <==? CURSOR> >) + (ELSE .HOW)>) + (ELSE #FALSE ("BAD TYPE"))>> + +> + +> + +)) + + > + > + > > + !.LOBS)> + >> + > + > + >> + + > + > > + + >) + ( >) + (ELSE '#FALSE ("UNASSIGNED"))>> + + + > + > > + + 2>)) + + <1 .CO!-M>) (T .CO!-M)>) + ( 3>> ) + (ELSE <.RI .LST!-M>)>> + + > + + '#FALSE ("RIGHT-EDGE")) (ELSE <.CI!-M .CO!-M>)>> + > + + + >) + (T " "DSK" "MUDDLE">)> + + ) + (ELSE )>> + + + + >>) + (ELSE >>)>> + +>> + + > + + > + + > >> + + STRING> .ARG) (ELSE )>>> + +" "DSK" "MUDDLE">)) + .FIL>>> + + ) + (ELSE #FALSE("Where's my file???"))>> + + ATOM> + ) OBANDCURS>>) + (ELSE #FALSE ("ARG NOT ATOM"))>> + + > + > OBLIST> <1 .BLK>) + ( OBLIST>) + (ELSE )>> + > > + + .BLOK> '()) (ELSE ())>)> + + > + + > + + #FALSE ("NO MORE BLOCKS")) + (ELSE + > + > + > + > + + )>> + + > + + OBLIST>> + > >> + > T> + + > + + 5>> + 5>> + + + + > .CI!-M> + > + > + > + > + ) + (ELSE + > .CLLN) + (ELSE <- .CLLN 2 .CLLN>>)>)) + + >) + ( 4> >> + >) + (ELSE >> + >)> + >>> + .LLN> >>) + (ELSE + >> + .LLN> >>)> + ) (VIC .FSL)) + <1 .VIC>> ) + (>> + 1 + 1>>>> + -4>> + + )>> + >>>)>> + +)) + 1 + .LLN>) + (ELSE 1 .OBJ>> 4)>>> + > .STOP> >>>>> + + + + > + > + >)) + > + ) + ( > + + >) + (ELSE >)> + + >> + > + > + +>)) + ) + ( '![ATOM FIX FLOAT]>) + (<==? .WHICH CLOSEBRAK> !"?>>) + (ELSE + + > + + !"?>>)>> + + + > + + + + + "> + > + T> +) (T #FALSE ("RIGHT-EDGE"))>> +) (T #FALSE ("LEFT-EDGE"))>> +> +> + > >)> + > +> +> +> +> +> +> + +)) + ) + (>) + (ELSE )> + > >> + + >> +>> + +)) + ) + (ELSE #FALSE ("NOT-FOUND"))>> + + .NTYP>> T> + +)) + + )> + > + +) LINS) + > #FALSE ("NOT-STRUCTURED")) + (ELSE >> > )>> + + )> + !.OBJ> .NTYPE>> + + #FALSE ("RIGHT-EDGE")) + ( > COMMENT .COMM> "put.") + (T > COMMENT> "Removed.")>> + '#FALSE ("RIGHT-EDGE")) + (ELSE ) FORM>> + "busted")>> + + + > + ) + (ELSE )>> + + "DONE"> + + + + ) + (ELSE + > + > + +> + + + +> + +) + (ROB (.TOB !.NOB)) + (UTOP <1 .NOB>) + FRST CMND FLIST EFLIST) + ;"FLUSH THE CRETINOUS INITIAL ALTMODE." + > + P2GO + + P1GO <1 ,ALTGETTER>> + + + )> + >>>> + )) + > + > .UTOP> + >> + > + !"> > + ) + (> <1 .COB>> + >>>> + .TOB> .UTOP>> + + )> + .TOB> > + >> + ,SPECS>> + + >) + (ELSE )>>>)>> + >) + (ELSE )> + > + >> + + + + +> > ,XMED!-> )> +  \ No newline at end of file diff --git a/MUDDLE/medpp.1 b/MUDDLE/medpp.1 new file mode 100644 index 0000000..78c0eab --- /dev/null +++ b/MUDDLE/medpp.1 @@ -0,0 +1,81 @@ + +"File to convert a PPRINT with comments to a MEDPP." +"PPRINT MUST!!! be loaded FIRST!!!" + +"Add the ATOMs needed for intercommunication with MEDDLE." +)> +"Cursor arrangements." +MEDDLE_CURSOR +SPECBEF +SPECAFT +"Other." +PRINE + + "Now add and change things within PPRINT." + )> + +MEDSW ;"The existence of this atom in PP shows that MEDPP has been loaded." + + + + + + >> + +) (STOP 0)) + > ;"So cursor point can be recognized." + ) (M 0)) + > > + > + > + > + + >> <==? .L .STOP>> > + + >>> + + +) (STOP 0)) + ) + (ELSE + > ;"So cursor point can be recognized." + ) COM) + > + > + > + > + >> <==? .L .STOP>> > + )> + >)>>> + + + ) + (<==? STRING> ) + ( >> + ) + (ELSE )> + ,NULL>> ;"The rubout atom is there." + + +>)) + + .SPECBEF> > + > + > + ) + ( + <- + + .M 3>> + >) + (T >)>) + (T )> + ">>> + + +  ð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒð`Áƒ \ No newline at end of file diff --git a/MUDDLE/microm.1 b/MUDDLE/microm.1 new file mode 100644 index 0000000..ba64793 --- /dev/null +++ b/MUDDLE/microm.1 @@ -0,0 +1,165 @@ + + )> +CO CI CL+1 LST LOC +O GETC NC +PUSHO POPO +L R DR DL UR UL +I K G C +SR SL WR WL +CWR CWL + + + )> + + + + + + )> + T>> + + + + + +>> + +> >> + +>>> + +> + > + > + > + > + T>> + )) + <==? .T >>>> + +)) + <==? .T >>>> + + + #FALSE("NO-RIGHT")) + (ELSE )>>> + + + #FALSE("NO-LEFT")) + (ELSE #FALSE()>)>>> + +> #FALSE("MONAD")) + (ELSE + + > + >> + >)>>> + + #FALSE("TOP")) + (ELSE > )>>> + + #FALSE("TOP")) + (ELSE >> )>>> + +> + > + > + T>> + >>> +