Home » Archimedes archive » Zipped Apps » BCPL » BCPL/b/cgm

BCPL/b/cgm

This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.

Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.

Tape/disk: Home » Archimedes archive » Zipped Apps » BCPL
Filename: BCPL/b/cgm
Read OK:
File size: 457D bytes
Load address: 0000
Exec address: 0000
File contents
/* BCPL Code-Generator for ARM
   H.C.M.Meekings
*/

SECTION "CGM"

GET "b.CGheader"

STATIC {
 /* Version of 11 Sep 87 13:40:03
 */
   dummy = VersionMark;
   version = 1*256+9 };

STATIC {
   maxl = 0;
   nextFreeLabel = 0;
   pendingN = 0; pendingNExists = FALSE;
   err.p = 0; err.l = 0;
   ocodePosn = 0; endOfOcode = FALSE;
   ocptr = 0;
   writeOcode = 0 };

MANIFEST {
   infinity = #x7fffffff };

LET BCPL.cg() BE
{  // called once for each input section.
   LET mark = VEC mk.size-1;
   LET originalBase = ?;

   WriteF("ARM CodeGenerator %n.%n*n",
	   CGMajorVersion, CGMinorVersion);

   reversedStack := backwardVecs;
   upStack := reversedStack -> f.postdown, f.postup;
   nextStackWord := reversedStack -> -4, 4;
   err.p, err.l := Level(), die;

   ReadOp, ReadN := ReadBytes, ReadBytes;
   pendingNExists := FALSE;
   ocodeBuf := ocodeBufs;
   ocptr := oc.firstbyte;
   writeOcode := CGDebugMode&db.poc;

   labelBlockV := GetVector(LabelBlockVSize)
   FOR j = 0 TO LabelBlockVSize-1 DO labelBlockV!j := 0;

   tempv := GetVector(tempsize)
   tempt := tempv + tempsize

   InitialiseRegisterSlave();

   base := GetVector(30);
   baseAddr := 0;

   InitPendingInsts();

   MarkHeap(mark);
   nextFreeLabel := last.label.number-1;

   originalbase := base;
   Flab := NextLabel();
   Slab := NextLabel();
   staticDataLab:=NextLabel();
   endSectLabel := NextLabel();
   callLab := NextLabel();
   exitCallLab := NextLabel();
   exitLab := NextLabel();
   quotLab := NextLabel();
   multLab := NextLabel();
   localConstLab := NextLabel();

   InitStack(saveSpaceSize);

   blockLabel := -1;
   baselab := 0;
   pendingJump := 0;
   TOSoffset, R0Offset := Null, Null;
   locCtr := 0
   argumentNumber := Null;
   lineCounts := 0;

   staticLabels, DataLabel := 0, Null;
   staticOffset := 0; staticDataSize := 0;
   ps.tracedepth := 0;
   xrefsyms := 0;

   InitDataLists();
   maxgn, maxl := 100, 0;
   countFlag, deadCode := FALSE, Dead;

   loadRegFromFRegOK := FALSE;

   DiscardRegs();

   transferLabs := 0;
   ocodePosn := 0;
   op := ReadOp();
   PreScan1();
   IF (CGDebugMode&db.tlabs)~=0 THEN
      PrintList(transferLabs, 2, "transferlabs", ":", "*n");

   ocodeBuf := ocodeBufs;
   ocptr := oc.firstbyte;
   ocodePosn := 0;

   op := ReadOp();
   PreScan2();
   base := originalBase;
   ocodeBuf := ocodeBufs;
   ocptr := oc.firstbyte;

   op := ReadOp();
   IF op=0 THEN RETURN;

   // Generate the section name string

   TEST op=s.section THEN {
      sectionName := ReadString(ReadN());
      op := ReadOp() }
   ELSE
      sectionName := "BCPL";

   // Read and code generate the rest of the section

   PutWord(#x4c504342);
   AddressInCode(endSectLabel, 0);
   IF procNames THEN {
      PutString(sectionName, 8);
      {  LET v = VEC 4;
	 LET d = Date() AND t = TimeOfDay();
	 LET nd = d%0 AND nt = t%0;
	 v%0 := nd+nt+1;
	 FOR i = 1 TO nd DO v%i := d%i;
	 FOR i = 0 TO nt DO v%(nd+i+1) := t%i;
	 PutString(v, 20) };
      IF (hostProcessor&#xffff)~='A' THEN
	 // The ARM library sets this, but the 32016 doesn't
	 hostProcessor := #x3233;

      PutWord([CGMajorVersion<<24] |
	      [CGMinorVersion<<16] |
	      hostProcessor) };
   Scan();
   CGEnd();

   WriteF("Section %s: size", sectionName);
   programSize := PrintSizes(programSize);
   NewLine();

   // Reset the heap to release the store used in code
   // generating the section.
die:
   ResetHeap(mark) }

AND ReadBytes() = VALOF
{  LET n = ?;
   TEST pendingNExists THEN {
      pendingNExists := FALSE;
      n := pendingN }
   ELSE {
      n := ReadByte();
      TEST n=#X80 THEN {
	 n := 0;
	 FOR j = 1 TO bytesperword DO
	    n := (n<<8) + ReadByte() }
      ELSE IF (n & #X80)~=0 THEN
	 n := n | #XFFFFFF00 };

   IF writeOcode~=0 THEN {
      WrCh(' '); WriteN(n) };
   RESULTIS n
}

AND ReadByte() = VALOF
{  IF ocodeBuf=0 THEN RESULTIS 0;

   IF ocptr>=ocodeBuf!oc.lastbyte THEN {
      ocodeBuf := !ocodeBuf;
      IF ocodeBuf=0 THEN {
	 endOfOcode := TRUE; RESULTIS 0 };
      ocptr := oc.firstbyte };

   {  LET n = ocodeBuf%ocptr;
      ocptr := ocptr+1;
      ocodePosn := ocodePosn+1;
      RESULTIS n }
}

AND PeekN() = VALOF
{  LET n = ReadN();
   pendingN, pendingNExists := n, TRUE;
   RESULTIS n
}

AND ReadL() = VALOF
{  LET l = ReadN();
   IF l>maxl THEN {
      maxl := l;
      IF l>nextFreeLabel THEN CGError("") };
   RESULTIS l
}

AND ReadGN() = VALOF
{  LET g = ReadN()
   IF maxgn<g THEN maxgn := g
   RESULTIS g
}

AND NextLabel() = VALOF
{  LET w = nextFreeLabel;
   nextFreeLabel := nextFreeLabel-1;
   RESULTIS w
}

AND CGError(isItFatal, message, a, b, c) BE {
   WriteF("*N****** %s: ", (isItFatal=OnlyWarning -> "Warning", "Error"));
   IF lineCount>=0 THEN WriteF("near line %n:", lineCount);
   WriteF(message, a, b, c);
   NewLine();
   rc := 10;
   IF isItFatal=FatalError THEN
   {  IF (BackTrace>>24)~=#xAE THEN { BackTrace(); MapStore() };
      Collapse(10) } }

AND Collapse(n) BE {
   IF rc<n THEN rc := n
   LongJump(err.p, err.l) }

AND WriteByte(n) BE
{  IF ocptrw>=oc.bytes THEN {
      LET v = GetVector(oc.size);
      !ocodeBufw := v;
      ocodeBufw := v;
      !v := 0;
      ocptrw := oc.firstbyte };
   ocodeBufw%ocptrw := n;
   ocptrw := ocptrw+1;
   ocodeBufw!oc.lastbyte := ocptrw
}

AND WriteBytes(n) BE
   TEST -127<=n<=127 THEN
      WriteByte(n)
   ELSE {
      WriteByte(#x80);
      FOR i = 8*(BytesPerWord-1) TO 0 BY -8 DO
	 WriteByte(n>>i) }

AND DelNonAssoc(q, others, size) BE
{  LET p = !q;
   WHILE p~=0 DO {
      TEST Assoc(1!p, 1, others)=Null THEN
	 !q := FreeBlk(p, size)
      ELSE
	 q := p;
      p := !q } }

AND Copy(start, end) BE
{  // Copy ocode from byte start (inclusive) to end (exclusive)
   // out of the old into the new ocode buffer
   LET startblock = start/(oc.bytes-oc.firstbyte);
   ocptr := (start REM (oc.bytes-oc.firstbyte))+oc.firstbyte;
   IF (CGDebugMode&db.shuffle)~=0 THEN
      WriteF("copying from %n to %n*n", start, end);
   ocodePosn := start;
   ocodeBuf := Nth(startblock, ocodeBufs);
   UNTIL ocodePosn>=end | endOfOcode DO WriteByte(ReadByte()) }

AND PreScan1() BE
{  LET AddTransferLab(source, dest) BE
      IF source~=Null & source~=dest & TransferredLabel(dest)~=source THEN
	 transferLabs := FillBlk(3, transferLabs, source, dest);

   LET precedingLabel = Null;
   LET blockStart, blockLabel = Null, Null;
   LET insideBlock = FALSE;
   LET blocks, blockRefs = 0, 0;
   LET dataLabel = 0;

   {s
   SWITCHON op INTO
   {  CASE 0:
	 CGError(TRUE, "Premature end of ocode stream");

      DEFAULT:
	 CGError(FALSE, "Unexpected ocode operator %n", op);

      CASE s.debug: CASE s.query:
      CASE s.true: CASE s.false: CASE s.nil: CASE s.stnil:

      CASE s.getbyte: CASE s.putbyte:
      CASE s.stvcar: CASE s.stvcdr: CASE s.stcar: CASE s.stcdr:
      CASE s.stind: CASE s.mod: CASE s.modslct:
      CASE s.vcar: CASE s.vcdr: CASE s.car: CASE s.cdr:
      CASE s.rv:

      CASE s.mult: CASE s.plus: CASE s.div: CASE s.rem: CASE s.minus:
      CASE s.fmult: CASE s.fplus: CASE s.fdiv: CASE s.fminus:
      CASE s.lls: CASE s.lgr: CASE s.lle: CASE s.lge:
      CASE s.eq:  CASE s.ne:  CASE s.ls:
      CASE s.gr:  CASE s.le:  CASE s.ge:
      CASE s.feq: CASE s.fne: CASE s.fls:
      CASE s.fgr: CASE s.fle: CASE s.fge:
      CASE s.lshift: CASE s.rshift:
      CASE s.logand: CASE s.logor: CASE s.eqv: CASE s.neqv:
      CASE s.not: CASE s.neg: CASE s.abs:
      CASE s.fneg: CASE s.fabs:
      CASE s.fix:  CASE s.float:

      CASE s.store:
	 ENDCASE

      CASE s.slctap: CASE s.slctst:
	 ReadN();

      CASE s.fconst:
      CASE s.dtab:
	 ReadN();
	 ReadN();
	 ENDCASE

      CASE s.iteml:
      {  LET lab = ReadN();
	 FlagLabel(lab, lab.procorlabel);
	 staticDataSize := staticDataSize+4;
	 ENDCASE }

      CASE s.itemn:
	 staticDataSize := staticDataSize+4;
      CASE s.linecount:
      CASE s.argno:
      CASE s.lg: CASE s.lp: CASE s.ll: CASE s.ln:
      CASE s.llg:
      CASE s.sg: CASE s.sp:
      CASE s.save:
      CASE s.datalab:
      CASE s.fnap: CASE s.rtap:
	 ReadN();
	 ENDCASE

      CASE s.refext:
      {  LET lab = ReadL();
	 LET sval = ReadString(ReadN());
	 xrefsyms := FillBlk(3, xrefsyms, lab, sval);
	 Data(s.datalab, lab);
	 staticLabels := FillBlk(4, staticLabels, lab, Null, staticOffset);
	 Data(s.itemx, sval);
	 staticOffset := staticOffset+4;
	 staticDataSize := staticDataSize+4;
	 ENDCASE }

      CASE s.dstr:
      CASE s.defext:
	 ReadN();
      CASE s.section: CASE s.needs:
      CASE s.lstr:
	 DiscardN(ReadN());
	 ENDCASE

      CASE s.llp:
	 ReadN();
	 ENDCASE

      CASE s.lll:
	 FlagLabel(ReadN(), lab.lvtaken);
	 ENDCASE

      CASE s.sl:
	 FlagLabel(ReadN(), lab.stored);
	 ENDCASE

      CASE s.jt: CASE s.jf:
      CASE s.endfor:
	 ReadN();
	 ENDCASE

      CASE s.stack: CASE s.rstack:
	 ReadN();
	 op := ReadOp();
	 LOOP

      CASE s.lab:
	 {  LET p = ocodePosn-1;
	    LET l = ReadN();
	    AddTransferLab(precedingLabel, l);
	    precedingLabel := l;
	    TEST insideBlock THEN
	       blockStart := Null
	    ELSE
	       blockStart, blockLabel := p, l;
	    insideBlock := TRUE;
	    op := ReadOp();
	    LOOP }

      CASE s.entry:
	 DiscardN(ReadN()+1);
	 insideBlock := TRUE;
	 blockStart := Null;
	 ENDCASE

      CASE s.endproc:
      CASE s.endblock:
	 IgnoreNames();
	 ENDCASE

      CASE s.switchon:
	 {  LET n = ReadN();
	    LET d = ReadN();
	    FOR i = 1 TO 2*n DO ReadN();
	    IF Assoc(d, 1, blockRefs)=Null THEN
	       blockRefs := FillBlk(3, blockRefs, d, ocodePosn)
	    GOTO EndOfBlock };

      CASE s.fnrn: CASE s.rtrn:
	 AddTransferLab(precedingLabel, 0);
	 GOTO EndOfBlock

      CASE s.res:
      CASE s.jump:
	 {  LET l = ReadN();
	    LET p = Assoc(l, 1, blockRefs);
	    AddTransferLab(precedingLabel, l);
	    IF p~=Null THEN
	       blockRefs := DeleteFromList(blockRefs, p, 3);
	    blockRefs := FillBlk(3, blockRefs, l, ocodePosn) }

      CASE s.goto:
      CASE s.finish:
      EndOfBlock:
	 IF insideBlock & blockStart~=Null THEN
	    blocks := FillBlk(4, blocks, blockLabel, blockStart, ocodePosn);
	 insideBlock := FALSE;
	 ENDCASE

      CASE s.global:
	 BREAK
   };

   precedingLabel := Null;
   op := ReadOp()
   }s REPEAT;

   IF (CGDebugMode&db.shuffle)~=0 THEN
   {  PrintList(blocks, 3, "blocks", ":", "*n");
      PrintList(blockRefs, 2, "blockrefs", ":", "*n") };

   DelNonAssoc(@blockRefs, blocks, 3);
   DelNonAssoc(@blocks, blockRefs, 4);

   IF blocks~=0 & (CGOptMode&op.shuffle)~=0 THEN
   {  LET posn = 0;
      LET blockp = ?;
      LET insert, ignoreStart, ignoreEnd = ?, ?, ?;
      LET newBufs = GetVector(oc.size);

      blocks := ReverseInPlace(blocks);
      blockRefs := ReverseInPlace(blockRefs);

      IF (CGDebugMode&db.shuffle)~=0 THEN
      {  PrintList(blocks, 3, "blocks", ":", "*n");
	 PrintList(blockRefs, 2, "blockrefs", ":", "*n") };

      writeOcode := 0;
      ocptr := oc.firstbyte; ocodeBuf := ocodeBufs;
      ocodeBufw := newBufs;
      !ocodeBufw := 0;
      ocptrw := oc.firstbyte;
      endOfOcode := FALSE;
      blockp := blocks;

      {  insert := blockRefs=0 -> infinity, blockRefs!2;
	 ignoreStart := blockp=0 -> infinity, blockp!2;
	 ignoreEnd   := blockp=0 -> infinity, blockp!3;

	 IF (CGDebugMode&db.shuffle)~=0 THEN
	    writef("%n, [%n, %n]*n", insert, ignoreStart, ignoreEnd);

	 TEST insert<=ignoreStart & insert~=infinity THEN {
	    LET p = blockRefs;
	    LET target = ?;
	    Copy(posn, insert);
	    WHILE p~=Null DO
	    {  target := Assoc(1!p, 1, blocks);
	       Copy(target!2, target!3);
	       blockRefs := DeleteFromList(blockRefs, p, 3);
	       p := Assoc(target!3, 2, blockRefs) };
	    posn := insert }
	 ELSE {
	    Copy(posn, ignoreStart);
	    posn := ignoreEnd;
	    blockp := !blockp }
      } REPEATWHILE insert~=infinity | ignoreStart~=infinity;

      endOfOcode := FALSE;
      ocodeBufs := newBufs;
      ocptr := oc.firstbyte;
      ocodeBuf := ocodeBufs;
      IF (CGDebugMode&db.shuffle)~=0 THEN
      {  {  WriteF("%n ", ReadN()) } REPEATWHILE ~endOfOcode } }
}

AND PreJump(lab) BE
{  LET p = FindLabelEntry(TransferredLabel(lab));
   LET e = !p;

   TEST (e&lab.defined)~=0 THEN
      e := e & ~(lab.forwardjump+lab.onlyonejump)
   ELSE TEST (e&lab.forwardjump)~=0 THEN
      e := e & ~lab.onlyonejump
   ELSE
      e := e | (lab.forwardjump+lab.onlyonejump);

   !p := e
}

AND PreScan2() BE
{s LET stackFrame = 0;
   ssp := 0;

   {  SWITCHON op INTO
      {  DEFAULT:

	 CASE s.debug:

	 CASE s.vcar: CASE s.vcdr: CASE s.car: CASE s.cdr:
	 CASE s.rv:

	 CASE s.not: CASE s.neg: CASE s.abs:
	 CASE s.fneg: CASE s.fabs:
	 CASE s.fix: CASE s.float:

	 CASE s.finish:
	 CASE s.store:
	 CASE s.fnrn: CASE s.rtrn:
	    ENDCASE

	 CASE s.fconst:
	    ReadN();
	 CASE s.lg: CASE s.ln:
	 CASE s.llg:
	 CASE s.sg:
	    ReadN()
	 CASE s.true: CASE s.false: CASE s.nil:
	 incssp:
	    ssp := ssp+1;
	    IF ssp>stackframe THEN stackframe := ssp;
	    ENDCASE

	 CASE s.mult: CASE s.div: CASE s.rem:
	    // These may be handled by branch & link to global
	    // routines, so link storage is needed.
	    FlagLabel(baseLab, lab.frameneeded);

	 CASE s.stnil:
	 CASE s.plus: CASE s.minus:
	 CASE s.fplus: CASE s.fminus: CASE s.fmult: CASE s.fdiv:
	 CASE s.lls: CASE s.lgr: CASE s.lle: CASE s.lge:
	 CASE s.eq:  CASE s.ne:  CASE s.ls:
	 CASE s.gr:  CASE s.le:  CASE s.ge:
	 CASE s.feq: CASE s.fne: CASE s.fls:
	 CASE s.fgr: CASE s.fle: CASE s.fge:
	 CASE s.lshift: CASE s.rshift:
	 CASE s.logand: CASE s.logor: CASE s.eqv: CASE s.neqv:
	 CASE s.stvcar: CASE s.stvcdr: CASE s.stcar: CASE s.stcdr:
	 CASE s.mod: CASE s.modslct:
	 CASE s.getbyte:
	    ssp := ssp-1;
	    ENDCASE

	 CASE s.slctst:
	    ReadN(); ReadN(); ReadN();
	 CASE s.stind: CASE s.putbyte:
	    ssp := ssp-2;
	    ENDCASE

	 CASE s.slctap:
	    ReadN();

	 CASE s.dtab:
	    ReadN();

	 CASE s.linecount:
	 CASE s.argno:
	 CASE s.datalab:
	 CASE s.itemn: CASE s.iteml:
	    ReadN();
	    ENDCASE

	 CASE s.dstr:
	 CASE s.defext:
	 CASE s.refext:
	    ReadN();
	 CASE s.section: CASE s.needs:
	    DiscardN(ReadN());
	    ENDCASE

	 CASE s.lstr:
	    DiscardN(ReadN());
	    IF (CGOptMode&op.strings)=0 THEN
	       FlagLabel(baseLab, lab.frameneeded+lab.procstatics);
	    GOTO incssp

	 CASE s.save:
	    stackFrame := ReadN();
	    IF stackFrame>SaveSpaceSize+4 THEN
	       FlagLabel(baseLab, lab.frameneeded);
	    ENDCASE

	 CASE s.rstack: CASE s.stack:
	    ssp := ReadN();
	    IF ssp>stackFrame THEN stackFrame := ssp;
	    ENDCASE

	 CASE s.lp:
	    {  LET n = ReadN();
	       IF n>stackFrame THEN stackFrame := n
	       GOTO incssp
	    };

	 CASE s.sp:
	    {  LET n = ReadN();
	       IF n>stackFrame THEN stackFrame := n
	       ssp := ssp-1;
	       ENDCASE
	    };

	 CASE s.fnap: CASE s.rtap:
	    {  LET oldssp = ssp;
	       ssp := ReadN();
	       {  op := ReadOp();
		  IF op~=s.stack & op~=s.rstack THEN BREAK;
		  ReadN()
	       } REPEAT;
	       // Exit calls are OK
	       IF (~[(op=s.res | op=s.jump | op=s.lab) &
		    TransferredLabel(PeekN())=0] &
		   ~[op=s.rtrn | op=s.fnrn]) |
	       // unless they have more than four arguments
		  oldssp-ssp-saveSpaceSize>5 // one for the procedure called
	       THEN FlagLabel(baseLab, lab.frameneeded);

	    // whether this is an exit call or not, it may need arguments
	    // loading. (It's not easy to detect a call with none)
	       FlagLabel(baseLab, lab.prochascalls);
	       LOOP }

	 CASE s.ll:
	    {  LET l = ReadN();
	       LET n = ?;
	       n := PeekN();
	       TEST n=s.rtap | n=s.fnap THEN {
		  FlagLabel(l, lab.called);
		  IF LabelFlagged(l, lab.lvtaken+lab.stored) THEN
		     FlagLabel(baseLab, lab.frameneeded+lab.procstatics) }
	       ELSE
		  FlagLabel(baseLab, lab.frameneeded+lab.procstatics);
	       GOTO incssp
	    }

	 CASE s.llp:
	    ReadN();
	    FlagLabel(baseLab, lab.lvptaken);
	    FlagLabel(baseLab, lab.frameneeded);  // temporary expedient
	    GOTO incssp

	 CASE s.lll:
	    ReadN();
	    FlagLabel(baseLab, lab.frameneeded+lab.procstatics);
	    GOTO incssp

	 CASE s.sl:
	    ReadN();
	    FlagLabel(baseLab, lab.frameneeded+lab.procstatics);
	    ssp := ssp-1;
	    ENDCASE

	 CASE s.jt: CASE s.jf:
	 CASE s.endfor:
	    ssp := ssp-1;
	 CASE s.jump:
	    PreJump(ReadN());
	    ENDCASE

	 CASE s.res:
	    {  LET lab = ReadN();
	    // this is of course strictly a lie.  What it means
	    // is that a fixed register is going to be used, so
	    // my simple-minded register assignment is out.
	       IF TransferredLabel(lab)~=0
		  THEN FlagLabel(baseLab, lab.prochascalls);
	       PreJump(lab);
	       ENDCASE }

	 CASE s.goto:
	    ssp := ssp-1;
	    ENDCASE

	 CASE s.lab:
	    {  LET lab = ReadN();
	       FlagLabel(lab, lab.defined);
	       IF LabelFlagged(lab, lab.procorlabel) THEN
		  FlagLabel(baselab, lab.lvptaken+lab.frameneeded);
	       /* That was to disable exit calls from a procedure
		  containing a (source) label, in case a called
		  procedure tried to longjump to this one.  (Really,
		  this check should be on calls of Level, but I can't
		  see them)
	       */
	       ENDCASE }

	 CASE s.entry:
	    {  LET n = ReadN();
	       base!0 := baseLab;
	       base := base+1;
	       baseLab := ReadN();
	       DiscardN(n);
	       stackFrame := saveSpaceSize;
	       ENDCASE }

	 CASE s.endproc:
	    IF stackFrame>MaxStaticFrame+saveSpaceSize-4
	       THEN FlagLabel(baseLab, lab.frameneeded);
	    base := base-1;
	    baseLab := base!0;
	 CASE s.endblock:
	    IgnoreNames();
	    ENDCASE

	 CASE s.switchon:
	    {  LET n = ReadN();
	       PreJump(ReadN());
	       FOR i = 1 TO n DO
	       {  ReadN();
		  PreJump(ReadN()) };
	       ENDCASE }

	 CASE s.global:
	    RETURN
      };
      op := ReadOp()
   } REPEAT
}s

AND ReadString(n) = VALOF {
   LET w = VEC 256;
   w%0 := n;
   FOR i = 1 TO n DO w%i := ReadN();
   RESULTIS InternString(w) }
00000000  2f 2a 20 42 43 50 4c 20  43 6f 64 65 2d 47 65 6e  |/* BCPL Code-Gen|
00000010  65 72 61 74 6f 72 20 66  6f 72 20 41 52 4d 0a 20  |erator for ARM. |
00000020  20 20 48 2e 43 2e 4d 2e  4d 65 65 6b 69 6e 67 73  |  H.C.M.Meekings|
00000030  0a 2a 2f 0a 0a 53 45 43  54 49 4f 4e 20 22 43 47  |.*/..SECTION "CG|
00000040  4d 22 0a 0a 47 45 54 20  22 62 2e 43 47 68 65 61  |M"..GET "b.CGhea|
00000050  64 65 72 22 0a 0a 53 54  41 54 49 43 20 7b 0a 20  |der"..STATIC {. |
00000060  2f 2a 20 56 65 72 73 69  6f 6e 20 6f 66 20 31 31  |/* Version of 11|
00000070  20 53 65 70 20 38 37 20  31 33 3a 34 30 3a 30 33  | Sep 87 13:40:03|
00000080  0a 20 2a 2f 0a 20 20 20  64 75 6d 6d 79 20 3d 20  |. */.   dummy = |
00000090  56 65 72 73 69 6f 6e 4d  61 72 6b 3b 0a 20 20 20  |VersionMark;.   |
000000a0  76 65 72 73 69 6f 6e 20  3d 20 31 2a 32 35 36 2b  |version = 1*256+|
000000b0  39 20 7d 3b 0a 0a 53 54  41 54 49 43 20 7b 0a 20  |9 };..STATIC {. |
000000c0  20 20 6d 61 78 6c 20 3d  20 30 3b 0a 20 20 20 6e  |  maxl = 0;.   n|
000000d0  65 78 74 46 72 65 65 4c  61 62 65 6c 20 3d 20 30  |extFreeLabel = 0|
000000e0  3b 0a 20 20 20 70 65 6e  64 69 6e 67 4e 20 3d 20  |;.   pendingN = |
000000f0  30 3b 20 70 65 6e 64 69  6e 67 4e 45 78 69 73 74  |0; pendingNExist|
00000100  73 20 3d 20 46 41 4c 53  45 3b 0a 20 20 20 65 72  |s = FALSE;.   er|
00000110  72 2e 70 20 3d 20 30 3b  20 65 72 72 2e 6c 20 3d  |r.p = 0; err.l =|
00000120  20 30 3b 0a 20 20 20 6f  63 6f 64 65 50 6f 73 6e  | 0;.   ocodePosn|
00000130  20 3d 20 30 3b 20 65 6e  64 4f 66 4f 63 6f 64 65  | = 0; endOfOcode|
00000140  20 3d 20 46 41 4c 53 45  3b 0a 20 20 20 6f 63 70  | = FALSE;.   ocp|
00000150  74 72 20 3d 20 30 3b 0a  20 20 20 77 72 69 74 65  |tr = 0;.   write|
00000160  4f 63 6f 64 65 20 3d 20  30 20 7d 3b 0a 0a 4d 41  |Ocode = 0 };..MA|
00000170  4e 49 46 45 53 54 20 7b  0a 20 20 20 69 6e 66 69  |NIFEST {.   infi|
00000180  6e 69 74 79 20 3d 20 23  78 37 66 66 66 66 66 66  |nity = #x7ffffff|
00000190  66 20 7d 3b 0a 0a 4c 45  54 20 42 43 50 4c 2e 63  |f };..LET BCPL.c|
000001a0  67 28 29 20 42 45 0a 7b  20 20 2f 2f 20 63 61 6c  |g() BE.{  // cal|
000001b0  6c 65 64 20 6f 6e 63 65  20 66 6f 72 20 65 61 63  |led once for eac|
000001c0  68 20 69 6e 70 75 74 20  73 65 63 74 69 6f 6e 2e  |h input section.|
000001d0  0a 20 20 20 4c 45 54 20  6d 61 72 6b 20 3d 20 56  |.   LET mark = V|
000001e0  45 43 20 6d 6b 2e 73 69  7a 65 2d 31 3b 0a 20 20  |EC mk.size-1;.  |
000001f0  20 4c 45 54 20 6f 72 69  67 69 6e 61 6c 42 61 73  | LET originalBas|
00000200  65 20 3d 20 3f 3b 0a 0a  20 20 20 57 72 69 74 65  |e = ?;..   Write|
00000210  46 28 22 41 52 4d 20 43  6f 64 65 47 65 6e 65 72  |F("ARM CodeGener|
00000220  61 74 6f 72 20 25 6e 2e  25 6e 2a 6e 22 2c 0a 09  |ator %n.%n*n",..|
00000230  20 20 20 43 47 4d 61 6a  6f 72 56 65 72 73 69 6f  |   CGMajorVersio|
00000240  6e 2c 20 43 47 4d 69 6e  6f 72 56 65 72 73 69 6f  |n, CGMinorVersio|
00000250  6e 29 3b 0a 0a 20 20 20  72 65 76 65 72 73 65 64  |n);..   reversed|
00000260  53 74 61 63 6b 20 3a 3d  20 62 61 63 6b 77 61 72  |Stack := backwar|
00000270  64 56 65 63 73 3b 0a 20  20 20 75 70 53 74 61 63  |dVecs;.   upStac|
00000280  6b 20 3a 3d 20 72 65 76  65 72 73 65 64 53 74 61  |k := reversedSta|
00000290  63 6b 20 2d 3e 20 66 2e  70 6f 73 74 64 6f 77 6e  |ck -> f.postdown|
000002a0  2c 20 66 2e 70 6f 73 74  75 70 3b 0a 20 20 20 6e  |, f.postup;.   n|
000002b0  65 78 74 53 74 61 63 6b  57 6f 72 64 20 3a 3d 20  |extStackWord := |
000002c0  72 65 76 65 72 73 65 64  53 74 61 63 6b 20 2d 3e  |reversedStack ->|
000002d0  20 2d 34 2c 20 34 3b 0a  20 20 20 65 72 72 2e 70  | -4, 4;.   err.p|
000002e0  2c 20 65 72 72 2e 6c 20  3a 3d 20 4c 65 76 65 6c  |, err.l := Level|
000002f0  28 29 2c 20 64 69 65 3b  0a 0a 20 20 20 52 65 61  |(), die;..   Rea|
00000300  64 4f 70 2c 20 52 65 61  64 4e 20 3a 3d 20 52 65  |dOp, ReadN := Re|
00000310  61 64 42 79 74 65 73 2c  20 52 65 61 64 42 79 74  |adBytes, ReadByt|
00000320  65 73 3b 0a 20 20 20 70  65 6e 64 69 6e 67 4e 45  |es;.   pendingNE|
00000330  78 69 73 74 73 20 3a 3d  20 46 41 4c 53 45 3b 0a  |xists := FALSE;.|
00000340  20 20 20 6f 63 6f 64 65  42 75 66 20 3a 3d 20 6f  |   ocodeBuf := o|
00000350  63 6f 64 65 42 75 66 73  3b 0a 20 20 20 6f 63 70  |codeBufs;.   ocp|
00000360  74 72 20 3a 3d 20 6f 63  2e 66 69 72 73 74 62 79  |tr := oc.firstby|
00000370  74 65 3b 0a 20 20 20 77  72 69 74 65 4f 63 6f 64  |te;.   writeOcod|
00000380  65 20 3a 3d 20 43 47 44  65 62 75 67 4d 6f 64 65  |e := CGDebugMode|
00000390  26 64 62 2e 70 6f 63 3b  0a 0a 20 20 20 6c 61 62  |&db.poc;..   lab|
000003a0  65 6c 42 6c 6f 63 6b 56  20 3a 3d 20 47 65 74 56  |elBlockV := GetV|
000003b0  65 63 74 6f 72 28 4c 61  62 65 6c 42 6c 6f 63 6b  |ector(LabelBlock|
000003c0  56 53 69 7a 65 29 0a 20  20 20 46 4f 52 20 6a 20  |VSize).   FOR j |
000003d0  3d 20 30 20 54 4f 20 4c  61 62 65 6c 42 6c 6f 63  |= 0 TO LabelBloc|
000003e0  6b 56 53 69 7a 65 2d 31  20 44 4f 20 6c 61 62 65  |kVSize-1 DO labe|
000003f0  6c 42 6c 6f 63 6b 56 21  6a 20 3a 3d 20 30 3b 0a  |lBlockV!j := 0;.|
00000400  0a 20 20 20 74 65 6d 70  76 20 3a 3d 20 47 65 74  |.   tempv := Get|
00000410  56 65 63 74 6f 72 28 74  65 6d 70 73 69 7a 65 29  |Vector(tempsize)|
00000420  0a 20 20 20 74 65 6d 70  74 20 3a 3d 20 74 65 6d  |.   tempt := tem|
00000430  70 76 20 2b 20 74 65 6d  70 73 69 7a 65 0a 0a 20  |pv + tempsize.. |
00000440  20 20 49 6e 69 74 69 61  6c 69 73 65 52 65 67 69  |  InitialiseRegi|
00000450  73 74 65 72 53 6c 61 76  65 28 29 3b 0a 0a 20 20  |sterSlave();..  |
00000460  20 62 61 73 65 20 3a 3d  20 47 65 74 56 65 63 74  | base := GetVect|
00000470  6f 72 28 33 30 29 3b 0a  20 20 20 62 61 73 65 41  |or(30);.   baseA|
00000480  64 64 72 20 3a 3d 20 30  3b 0a 0a 20 20 20 49 6e  |ddr := 0;..   In|
00000490  69 74 50 65 6e 64 69 6e  67 49 6e 73 74 73 28 29  |itPendingInsts()|
000004a0  3b 0a 0a 20 20 20 4d 61  72 6b 48 65 61 70 28 6d  |;..   MarkHeap(m|
000004b0  61 72 6b 29 3b 0a 20 20  20 6e 65 78 74 46 72 65  |ark);.   nextFre|
000004c0  65 4c 61 62 65 6c 20 3a  3d 20 6c 61 73 74 2e 6c  |eLabel := last.l|
000004d0  61 62 65 6c 2e 6e 75 6d  62 65 72 2d 31 3b 0a 0a  |abel.number-1;..|
000004e0  20 20 20 6f 72 69 67 69  6e 61 6c 62 61 73 65 20  |   originalbase |
000004f0  3a 3d 20 62 61 73 65 3b  0a 20 20 20 46 6c 61 62  |:= base;.   Flab|
00000500  20 3a 3d 20 4e 65 78 74  4c 61 62 65 6c 28 29 3b  | := NextLabel();|
00000510  0a 20 20 20 53 6c 61 62  20 3a 3d 20 4e 65 78 74  |.   Slab := Next|
00000520  4c 61 62 65 6c 28 29 3b  0a 20 20 20 73 74 61 74  |Label();.   stat|
00000530  69 63 44 61 74 61 4c 61  62 3a 3d 4e 65 78 74 4c  |icDataLab:=NextL|
00000540  61 62 65 6c 28 29 3b 0a  20 20 20 65 6e 64 53 65  |abel();.   endSe|
00000550  63 74 4c 61 62 65 6c 20  3a 3d 20 4e 65 78 74 4c  |ctLabel := NextL|
00000560  61 62 65 6c 28 29 3b 0a  20 20 20 63 61 6c 6c 4c  |abel();.   callL|
00000570  61 62 20 3a 3d 20 4e 65  78 74 4c 61 62 65 6c 28  |ab := NextLabel(|
00000580  29 3b 0a 20 20 20 65 78  69 74 43 61 6c 6c 4c 61  |);.   exitCallLa|
00000590  62 20 3a 3d 20 4e 65 78  74 4c 61 62 65 6c 28 29  |b := NextLabel()|
000005a0  3b 0a 20 20 20 65 78 69  74 4c 61 62 20 3a 3d 20  |;.   exitLab := |
000005b0  4e 65 78 74 4c 61 62 65  6c 28 29 3b 0a 20 20 20  |NextLabel();.   |
000005c0  71 75 6f 74 4c 61 62 20  3a 3d 20 4e 65 78 74 4c  |quotLab := NextL|
000005d0  61 62 65 6c 28 29 3b 0a  20 20 20 6d 75 6c 74 4c  |abel();.   multL|
000005e0  61 62 20 3a 3d 20 4e 65  78 74 4c 61 62 65 6c 28  |ab := NextLabel(|
000005f0  29 3b 0a 20 20 20 6c 6f  63 61 6c 43 6f 6e 73 74  |);.   localConst|
00000600  4c 61 62 20 3a 3d 20 4e  65 78 74 4c 61 62 65 6c  |Lab := NextLabel|
00000610  28 29 3b 0a 0a 20 20 20  49 6e 69 74 53 74 61 63  |();..   InitStac|
00000620  6b 28 73 61 76 65 53 70  61 63 65 53 69 7a 65 29  |k(saveSpaceSize)|
00000630  3b 0a 0a 20 20 20 62 6c  6f 63 6b 4c 61 62 65 6c  |;..   blockLabel|
00000640  20 3a 3d 20 2d 31 3b 0a  20 20 20 62 61 73 65 6c  | := -1;.   basel|
00000650  61 62 20 3a 3d 20 30 3b  0a 20 20 20 70 65 6e 64  |ab := 0;.   pend|
00000660  69 6e 67 4a 75 6d 70 20  3a 3d 20 30 3b 0a 20 20  |ingJump := 0;.  |
00000670  20 54 4f 53 6f 66 66 73  65 74 2c 20 52 30 4f 66  | TOSoffset, R0Of|
00000680  66 73 65 74 20 3a 3d 20  4e 75 6c 6c 2c 20 4e 75  |fset := Null, Nu|
00000690  6c 6c 3b 0a 20 20 20 6c  6f 63 43 74 72 20 3a 3d  |ll;.   locCtr :=|
000006a0  20 30 0a 20 20 20 61 72  67 75 6d 65 6e 74 4e 75  | 0.   argumentNu|
000006b0  6d 62 65 72 20 3a 3d 20  4e 75 6c 6c 3b 0a 20 20  |mber := Null;.  |
000006c0  20 6c 69 6e 65 43 6f 75  6e 74 73 20 3a 3d 20 30  | lineCounts := 0|
000006d0  3b 0a 0a 20 20 20 73 74  61 74 69 63 4c 61 62 65  |;..   staticLabe|
000006e0  6c 73 2c 20 44 61 74 61  4c 61 62 65 6c 20 3a 3d  |ls, DataLabel :=|
000006f0  20 30 2c 20 4e 75 6c 6c  3b 0a 20 20 20 73 74 61  | 0, Null;.   sta|
00000700  74 69 63 4f 66 66 73 65  74 20 3a 3d 20 30 3b 20  |ticOffset := 0; |
00000710  73 74 61 74 69 63 44 61  74 61 53 69 7a 65 20 3a  |staticDataSize :|
00000720  3d 20 30 3b 0a 20 20 20  70 73 2e 74 72 61 63 65  |= 0;.   ps.trace|
00000730  64 65 70 74 68 20 3a 3d  20 30 3b 0a 20 20 20 78  |depth := 0;.   x|
00000740  72 65 66 73 79 6d 73 20  3a 3d 20 30 3b 0a 0a 20  |refsyms := 0;.. |
00000750  20 20 49 6e 69 74 44 61  74 61 4c 69 73 74 73 28  |  InitDataLists(|
00000760  29 3b 0a 20 20 20 6d 61  78 67 6e 2c 20 6d 61 78  |);.   maxgn, max|
00000770  6c 20 3a 3d 20 31 30 30  2c 20 30 3b 0a 20 20 20  |l := 100, 0;.   |
00000780  63 6f 75 6e 74 46 6c 61  67 2c 20 64 65 61 64 43  |countFlag, deadC|
00000790  6f 64 65 20 3a 3d 20 46  41 4c 53 45 2c 20 44 65  |ode := FALSE, De|
000007a0  61 64 3b 0a 0a 20 20 20  6c 6f 61 64 52 65 67 46  |ad;..   loadRegF|
000007b0  72 6f 6d 46 52 65 67 4f  4b 20 3a 3d 20 46 41 4c  |romFRegOK := FAL|
000007c0  53 45 3b 0a 0a 20 20 20  44 69 73 63 61 72 64 52  |SE;..   DiscardR|
000007d0  65 67 73 28 29 3b 0a 0a  20 20 20 74 72 61 6e 73  |egs();..   trans|
000007e0  66 65 72 4c 61 62 73 20  3a 3d 20 30 3b 0a 20 20  |ferLabs := 0;.  |
000007f0  20 6f 63 6f 64 65 50 6f  73 6e 20 3a 3d 20 30 3b  | ocodePosn := 0;|
00000800  0a 20 20 20 6f 70 20 3a  3d 20 52 65 61 64 4f 70  |.   op := ReadOp|
00000810  28 29 3b 0a 20 20 20 50  72 65 53 63 61 6e 31 28  |();.   PreScan1(|
00000820  29 3b 0a 20 20 20 49 46  20 28 43 47 44 65 62 75  |);.   IF (CGDebu|
00000830  67 4d 6f 64 65 26 64 62  2e 74 6c 61 62 73 29 7e  |gMode&db.tlabs)~|
00000840  3d 30 20 54 48 45 4e 0a  20 20 20 20 20 20 50 72  |=0 THEN.      Pr|
00000850  69 6e 74 4c 69 73 74 28  74 72 61 6e 73 66 65 72  |intList(transfer|
00000860  4c 61 62 73 2c 20 32 2c  20 22 74 72 61 6e 73 66  |Labs, 2, "transf|
00000870  65 72 6c 61 62 73 22 2c  20 22 3a 22 2c 20 22 2a  |erlabs", ":", "*|
00000880  6e 22 29 3b 0a 0a 20 20  20 6f 63 6f 64 65 42 75  |n");..   ocodeBu|
00000890  66 20 3a 3d 20 6f 63 6f  64 65 42 75 66 73 3b 0a  |f := ocodeBufs;.|
000008a0  20 20 20 6f 63 70 74 72  20 3a 3d 20 6f 63 2e 66  |   ocptr := oc.f|
000008b0  69 72 73 74 62 79 74 65  3b 0a 20 20 20 6f 63 6f  |irstbyte;.   oco|
000008c0  64 65 50 6f 73 6e 20 3a  3d 20 30 3b 0a 0a 20 20  |dePosn := 0;..  |
000008d0  20 6f 70 20 3a 3d 20 52  65 61 64 4f 70 28 29 3b  | op := ReadOp();|
000008e0  0a 20 20 20 50 72 65 53  63 61 6e 32 28 29 3b 0a  |.   PreScan2();.|
000008f0  20 20 20 62 61 73 65 20  3a 3d 20 6f 72 69 67 69  |   base := origi|
00000900  6e 61 6c 42 61 73 65 3b  0a 20 20 20 6f 63 6f 64  |nalBase;.   ocod|
00000910  65 42 75 66 20 3a 3d 20  6f 63 6f 64 65 42 75 66  |eBuf := ocodeBuf|
00000920  73 3b 0a 20 20 20 6f 63  70 74 72 20 3a 3d 20 6f  |s;.   ocptr := o|
00000930  63 2e 66 69 72 73 74 62  79 74 65 3b 0a 0a 20 20  |c.firstbyte;..  |
00000940  20 6f 70 20 3a 3d 20 52  65 61 64 4f 70 28 29 3b  | op := ReadOp();|
00000950  0a 20 20 20 49 46 20 6f  70 3d 30 20 54 48 45 4e  |.   IF op=0 THEN|
00000960  20 52 45 54 55 52 4e 3b  0a 0a 20 20 20 2f 2f 20  | RETURN;..   // |
00000970  47 65 6e 65 72 61 74 65  20 74 68 65 20 73 65 63  |Generate the sec|
00000980  74 69 6f 6e 20 6e 61 6d  65 20 73 74 72 69 6e 67  |tion name string|
00000990  0a 0a 20 20 20 54 45 53  54 20 6f 70 3d 73 2e 73  |..   TEST op=s.s|
000009a0  65 63 74 69 6f 6e 20 54  48 45 4e 20 7b 0a 20 20  |ection THEN {.  |
000009b0  20 20 20 20 73 65 63 74  69 6f 6e 4e 61 6d 65 20  |    sectionName |
000009c0  3a 3d 20 52 65 61 64 53  74 72 69 6e 67 28 52 65  |:= ReadString(Re|
000009d0  61 64 4e 28 29 29 3b 0a  20 20 20 20 20 20 6f 70  |adN());.      op|
000009e0  20 3a 3d 20 52 65 61 64  4f 70 28 29 20 7d 0a 20  | := ReadOp() }. |
000009f0  20 20 45 4c 53 45 0a 20  20 20 20 20 20 73 65 63  |  ELSE.      sec|
00000a00  74 69 6f 6e 4e 61 6d 65  20 3a 3d 20 22 42 43 50  |tionName := "BCP|
00000a10  4c 22 3b 0a 0a 20 20 20  2f 2f 20 52 65 61 64 20  |L";..   // Read |
00000a20  61 6e 64 20 63 6f 64 65  20 67 65 6e 65 72 61 74  |and code generat|
00000a30  65 20 74 68 65 20 72 65  73 74 20 6f 66 20 74 68  |e the rest of th|
00000a40  65 20 73 65 63 74 69 6f  6e 0a 0a 20 20 20 50 75  |e section..   Pu|
00000a50  74 57 6f 72 64 28 23 78  34 63 35 30 34 33 34 32  |tWord(#x4c504342|
00000a60  29 3b 0a 20 20 20 41 64  64 72 65 73 73 49 6e 43  |);.   AddressInC|
00000a70  6f 64 65 28 65 6e 64 53  65 63 74 4c 61 62 65 6c  |ode(endSectLabel|
00000a80  2c 20 30 29 3b 0a 20 20  20 49 46 20 70 72 6f 63  |, 0);.   IF proc|
00000a90  4e 61 6d 65 73 20 54 48  45 4e 20 7b 0a 20 20 20  |Names THEN {.   |
00000aa0  20 20 20 50 75 74 53 74  72 69 6e 67 28 73 65 63  |   PutString(sec|
00000ab0  74 69 6f 6e 4e 61 6d 65  2c 20 38 29 3b 0a 20 20  |tionName, 8);.  |
00000ac0  20 20 20 20 7b 20 20 4c  45 54 20 76 20 3d 20 56  |    {  LET v = V|
00000ad0  45 43 20 34 3b 0a 09 20  4c 45 54 20 64 20 3d 20  |EC 4;.. LET d = |
00000ae0  44 61 74 65 28 29 20 41  4e 44 20 74 20 3d 20 54  |Date() AND t = T|
00000af0  69 6d 65 4f 66 44 61 79  28 29 3b 0a 09 20 4c 45  |imeOfDay();.. LE|
00000b00  54 20 6e 64 20 3d 20 64  25 30 20 41 4e 44 20 6e  |T nd = d%0 AND n|
00000b10  74 20 3d 20 74 25 30 3b  0a 09 20 76 25 30 20 3a  |t = t%0;.. v%0 :|
00000b20  3d 20 6e 64 2b 6e 74 2b  31 3b 0a 09 20 46 4f 52  |= nd+nt+1;.. FOR|
00000b30  20 69 20 3d 20 31 20 54  4f 20 6e 64 20 44 4f 20  | i = 1 TO nd DO |
00000b40  76 25 69 20 3a 3d 20 64  25 69 3b 0a 09 20 46 4f  |v%i := d%i;.. FO|
00000b50  52 20 69 20 3d 20 30 20  54 4f 20 6e 74 20 44 4f  |R i = 0 TO nt DO|
00000b60  20 76 25 28 6e 64 2b 69  2b 31 29 20 3a 3d 20 74  | v%(nd+i+1) := t|
00000b70  25 69 3b 0a 09 20 50 75  74 53 74 72 69 6e 67 28  |%i;.. PutString(|
00000b80  76 2c 20 32 30 29 20 7d  3b 0a 20 20 20 20 20 20  |v, 20) };.      |
00000b90  49 46 20 28 68 6f 73 74  50 72 6f 63 65 73 73 6f  |IF (hostProcesso|
00000ba0  72 26 23 78 66 66 66 66  29 7e 3d 27 41 27 20 54  |r&#xffff)~='A' T|
00000bb0  48 45 4e 0a 09 20 2f 2f  20 54 68 65 20 41 52 4d  |HEN.. // The ARM|
00000bc0  20 6c 69 62 72 61 72 79  20 73 65 74 73 20 74 68  | library sets th|
00000bd0  69 73 2c 20 62 75 74 20  74 68 65 20 33 32 30 31  |is, but the 3201|
00000be0  36 20 64 6f 65 73 6e 27  74 0a 09 20 68 6f 73 74  |6 doesn't.. host|
00000bf0  50 72 6f 63 65 73 73 6f  72 20 3a 3d 20 23 78 33  |Processor := #x3|
00000c00  32 33 33 3b 0a 0a 20 20  20 20 20 20 50 75 74 57  |233;..      PutW|
00000c10  6f 72 64 28 5b 43 47 4d  61 6a 6f 72 56 65 72 73  |ord([CGMajorVers|
00000c20  69 6f 6e 3c 3c 32 34 5d  20 7c 0a 09 20 20 20 20  |ion<<24] |..    |
00000c30  20 20 5b 43 47 4d 69 6e  6f 72 56 65 72 73 69 6f  |  [CGMinorVersio|
00000c40  6e 3c 3c 31 36 5d 20 7c  0a 09 20 20 20 20 20 20  |n<<16] |..      |
00000c50  68 6f 73 74 50 72 6f 63  65 73 73 6f 72 29 20 7d  |hostProcessor) }|
00000c60  3b 0a 20 20 20 53 63 61  6e 28 29 3b 0a 20 20 20  |;.   Scan();.   |
00000c70  43 47 45 6e 64 28 29 3b  0a 0a 20 20 20 57 72 69  |CGEnd();..   Wri|
00000c80  74 65 46 28 22 53 65 63  74 69 6f 6e 20 25 73 3a  |teF("Section %s:|
00000c90  20 73 69 7a 65 22 2c 20  73 65 63 74 69 6f 6e 4e  | size", sectionN|
00000ca0  61 6d 65 29 3b 0a 20 20  20 70 72 6f 67 72 61 6d  |ame);.   program|
00000cb0  53 69 7a 65 20 3a 3d 20  50 72 69 6e 74 53 69 7a  |Size := PrintSiz|
00000cc0  65 73 28 70 72 6f 67 72  61 6d 53 69 7a 65 29 3b  |es(programSize);|
00000cd0  0a 20 20 20 4e 65 77 4c  69 6e 65 28 29 3b 0a 0a  |.   NewLine();..|
00000ce0  20 20 20 2f 2f 20 52 65  73 65 74 20 74 68 65 20  |   // Reset the |
00000cf0  68 65 61 70 20 74 6f 20  72 65 6c 65 61 73 65 20  |heap to release |
00000d00  74 68 65 20 73 74 6f 72  65 20 75 73 65 64 20 69  |the store used i|
00000d10  6e 20 63 6f 64 65 0a 20  20 20 2f 2f 20 67 65 6e  |n code.   // gen|
00000d20  65 72 61 74 69 6e 67 20  74 68 65 20 73 65 63 74  |erating the sect|
00000d30  69 6f 6e 2e 0a 64 69 65  3a 0a 20 20 20 52 65 73  |ion..die:.   Res|
00000d40  65 74 48 65 61 70 28 6d  61 72 6b 29 20 7d 0a 0a  |etHeap(mark) }..|
00000d50  41 4e 44 20 52 65 61 64  42 79 74 65 73 28 29 20  |AND ReadBytes() |
00000d60  3d 20 56 41 4c 4f 46 0a  7b 20 20 4c 45 54 20 6e  |= VALOF.{  LET n|
00000d70  20 3d 20 3f 3b 0a 20 20  20 54 45 53 54 20 70 65  | = ?;.   TEST pe|
00000d80  6e 64 69 6e 67 4e 45 78  69 73 74 73 20 54 48 45  |ndingNExists THE|
00000d90  4e 20 7b 0a 20 20 20 20  20 20 70 65 6e 64 69 6e  |N {.      pendin|
00000da0  67 4e 45 78 69 73 74 73  20 3a 3d 20 46 41 4c 53  |gNExists := FALS|
00000db0  45 3b 0a 20 20 20 20 20  20 6e 20 3a 3d 20 70 65  |E;.      n := pe|
00000dc0  6e 64 69 6e 67 4e 20 7d  0a 20 20 20 45 4c 53 45  |ndingN }.   ELSE|
00000dd0  20 7b 0a 20 20 20 20 20  20 6e 20 3a 3d 20 52 65  | {.      n := Re|
00000de0  61 64 42 79 74 65 28 29  3b 0a 20 20 20 20 20 20  |adByte();.      |
00000df0  54 45 53 54 20 6e 3d 23  58 38 30 20 54 48 45 4e  |TEST n=#X80 THEN|
00000e00  20 7b 0a 09 20 6e 20 3a  3d 20 30 3b 0a 09 20 46  | {.. n := 0;.. F|
00000e10  4f 52 20 6a 20 3d 20 31  20 54 4f 20 62 79 74 65  |OR j = 1 TO byte|
00000e20  73 70 65 72 77 6f 72 64  20 44 4f 0a 09 20 20 20  |sperword DO..   |
00000e30  20 6e 20 3a 3d 20 28 6e  3c 3c 38 29 20 2b 20 52  | n := (n<<8) + R|
00000e40  65 61 64 42 79 74 65 28  29 20 7d 0a 20 20 20 20  |eadByte() }.    |
00000e50  20 20 45 4c 53 45 20 49  46 20 28 6e 20 26 20 23  |  ELSE IF (n & #|
00000e60  58 38 30 29 7e 3d 30 20  54 48 45 4e 0a 09 20 6e  |X80)~=0 THEN.. n|
00000e70  20 3a 3d 20 6e 20 7c 20  23 58 46 46 46 46 46 46  | := n | #XFFFFFF|
00000e80  30 30 20 7d 3b 0a 0a 20  20 20 49 46 20 77 72 69  |00 };..   IF wri|
00000e90  74 65 4f 63 6f 64 65 7e  3d 30 20 54 48 45 4e 20  |teOcode~=0 THEN |
00000ea0  7b 0a 20 20 20 20 20 20  57 72 43 68 28 27 20 27  |{.      WrCh(' '|
00000eb0  29 3b 20 57 72 69 74 65  4e 28 6e 29 20 7d 3b 0a  |); WriteN(n) };.|
00000ec0  20 20 20 52 45 53 55 4c  54 49 53 20 6e 0a 7d 0a  |   RESULTIS n.}.|
00000ed0  0a 41 4e 44 20 52 65 61  64 42 79 74 65 28 29 20  |.AND ReadByte() |
00000ee0  3d 20 56 41 4c 4f 46 0a  7b 20 20 49 46 20 6f 63  |= VALOF.{  IF oc|
00000ef0  6f 64 65 42 75 66 3d 30  20 54 48 45 4e 20 52 45  |odeBuf=0 THEN RE|
00000f00  53 55 4c 54 49 53 20 30  3b 0a 0a 20 20 20 49 46  |SULTIS 0;..   IF|
00000f10  20 6f 63 70 74 72 3e 3d  6f 63 6f 64 65 42 75 66  | ocptr>=ocodeBuf|
00000f20  21 6f 63 2e 6c 61 73 74  62 79 74 65 20 54 48 45  |!oc.lastbyte THE|
00000f30  4e 20 7b 0a 20 20 20 20  20 20 6f 63 6f 64 65 42  |N {.      ocodeB|
00000f40  75 66 20 3a 3d 20 21 6f  63 6f 64 65 42 75 66 3b  |uf := !ocodeBuf;|
00000f50  0a 20 20 20 20 20 20 49  46 20 6f 63 6f 64 65 42  |.      IF ocodeB|
00000f60  75 66 3d 30 20 54 48 45  4e 20 7b 0a 09 20 65 6e  |uf=0 THEN {.. en|
00000f70  64 4f 66 4f 63 6f 64 65  20 3a 3d 20 54 52 55 45  |dOfOcode := TRUE|
00000f80  3b 20 52 45 53 55 4c 54  49 53 20 30 20 7d 3b 0a  |; RESULTIS 0 };.|
00000f90  20 20 20 20 20 20 6f 63  70 74 72 20 3a 3d 20 6f  |      ocptr := o|
00000fa0  63 2e 66 69 72 73 74 62  79 74 65 20 7d 3b 0a 0a  |c.firstbyte };..|
00000fb0  20 20 20 7b 20 20 4c 45  54 20 6e 20 3d 20 6f 63  |   {  LET n = oc|
00000fc0  6f 64 65 42 75 66 25 6f  63 70 74 72 3b 0a 20 20  |odeBuf%ocptr;.  |
00000fd0  20 20 20 20 6f 63 70 74  72 20 3a 3d 20 6f 63 70  |    ocptr := ocp|
00000fe0  74 72 2b 31 3b 0a 20 20  20 20 20 20 6f 63 6f 64  |tr+1;.      ocod|
00000ff0  65 50 6f 73 6e 20 3a 3d  20 6f 63 6f 64 65 50 6f  |ePosn := ocodePo|
00001000  73 6e 2b 31 3b 0a 20 20  20 20 20 20 52 45 53 55  |sn+1;.      RESU|
00001010  4c 54 49 53 20 6e 20 7d  0a 7d 0a 0a 41 4e 44 20  |LTIS n }.}..AND |
00001020  50 65 65 6b 4e 28 29 20  3d 20 56 41 4c 4f 46 0a  |PeekN() = VALOF.|
00001030  7b 20 20 4c 45 54 20 6e  20 3d 20 52 65 61 64 4e  |{  LET n = ReadN|
00001040  28 29 3b 0a 20 20 20 70  65 6e 64 69 6e 67 4e 2c  |();.   pendingN,|
00001050  20 70 65 6e 64 69 6e 67  4e 45 78 69 73 74 73 20  | pendingNExists |
00001060  3a 3d 20 6e 2c 20 54 52  55 45 3b 0a 20 20 20 52  |:= n, TRUE;.   R|
00001070  45 53 55 4c 54 49 53 20  6e 0a 7d 0a 0a 41 4e 44  |ESULTIS n.}..AND|
00001080  20 52 65 61 64 4c 28 29  20 3d 20 56 41 4c 4f 46  | ReadL() = VALOF|
00001090  0a 7b 20 20 4c 45 54 20  6c 20 3d 20 52 65 61 64  |.{  LET l = Read|
000010a0  4e 28 29 3b 0a 20 20 20  49 46 20 6c 3e 6d 61 78  |N();.   IF l>max|
000010b0  6c 20 54 48 45 4e 20 7b  0a 20 20 20 20 20 20 6d  |l THEN {.      m|
000010c0  61 78 6c 20 3a 3d 20 6c  3b 0a 20 20 20 20 20 20  |axl := l;.      |
000010d0  49 46 20 6c 3e 6e 65 78  74 46 72 65 65 4c 61 62  |IF l>nextFreeLab|
000010e0  65 6c 20 54 48 45 4e 20  43 47 45 72 72 6f 72 28  |el THEN CGError(|
000010f0  22 22 29 20 7d 3b 0a 20  20 20 52 45 53 55 4c 54  |"") };.   RESULT|
00001100  49 53 20 6c 0a 7d 0a 0a  41 4e 44 20 52 65 61 64  |IS l.}..AND Read|
00001110  47 4e 28 29 20 3d 20 56  41 4c 4f 46 0a 7b 20 20  |GN() = VALOF.{  |
00001120  4c 45 54 20 67 20 3d 20  52 65 61 64 4e 28 29 0a  |LET g = ReadN().|
00001130  20 20 20 49 46 20 6d 61  78 67 6e 3c 67 20 54 48  |   IF maxgn<g TH|
00001140  45 4e 20 6d 61 78 67 6e  20 3a 3d 20 67 0a 20 20  |EN maxgn := g.  |
00001150  20 52 45 53 55 4c 54 49  53 20 67 0a 7d 0a 0a 41  | RESULTIS g.}..A|
00001160  4e 44 20 4e 65 78 74 4c  61 62 65 6c 28 29 20 3d  |ND NextLabel() =|
00001170  20 56 41 4c 4f 46 0a 7b  20 20 4c 45 54 20 77 20  | VALOF.{  LET w |
00001180  3d 20 6e 65 78 74 46 72  65 65 4c 61 62 65 6c 3b  |= nextFreeLabel;|
00001190  0a 20 20 20 6e 65 78 74  46 72 65 65 4c 61 62 65  |.   nextFreeLabe|
000011a0  6c 20 3a 3d 20 6e 65 78  74 46 72 65 65 4c 61 62  |l := nextFreeLab|
000011b0  65 6c 2d 31 3b 0a 20 20  20 52 45 53 55 4c 54 49  |el-1;.   RESULTI|
000011c0  53 20 77 0a 7d 0a 0a 41  4e 44 20 43 47 45 72 72  |S w.}..AND CGErr|
000011d0  6f 72 28 69 73 49 74 46  61 74 61 6c 2c 20 6d 65  |or(isItFatal, me|
000011e0  73 73 61 67 65 2c 20 61  2c 20 62 2c 20 63 29 20  |ssage, a, b, c) |
000011f0  42 45 20 7b 0a 20 20 20  57 72 69 74 65 46 28 22  |BE {.   WriteF("|
00001200  2a 4e 2a 2a 2a 2a 2a 2a  20 25 73 3a 20 22 2c 20  |*N****** %s: ", |
00001210  28 69 73 49 74 46 61 74  61 6c 3d 4f 6e 6c 79 57  |(isItFatal=OnlyW|
00001220  61 72 6e 69 6e 67 20 2d  3e 20 22 57 61 72 6e 69  |arning -> "Warni|
00001230  6e 67 22 2c 20 22 45 72  72 6f 72 22 29 29 3b 0a  |ng", "Error"));.|
00001240  20 20 20 49 46 20 6c 69  6e 65 43 6f 75 6e 74 3e  |   IF lineCount>|
00001250  3d 30 20 54 48 45 4e 20  57 72 69 74 65 46 28 22  |=0 THEN WriteF("|
00001260  6e 65 61 72 20 6c 69 6e  65 20 25 6e 3a 22 2c 20  |near line %n:", |
00001270  6c 69 6e 65 43 6f 75 6e  74 29 3b 0a 20 20 20 57  |lineCount);.   W|
00001280  72 69 74 65 46 28 6d 65  73 73 61 67 65 2c 20 61  |riteF(message, a|
00001290  2c 20 62 2c 20 63 29 3b  0a 20 20 20 4e 65 77 4c  |, b, c);.   NewL|
000012a0  69 6e 65 28 29 3b 0a 20  20 20 72 63 20 3a 3d 20  |ine();.   rc := |
000012b0  31 30 3b 0a 20 20 20 49  46 20 69 73 49 74 46 61  |10;.   IF isItFa|
000012c0  74 61 6c 3d 46 61 74 61  6c 45 72 72 6f 72 20 54  |tal=FatalError T|
000012d0  48 45 4e 0a 20 20 20 7b  20 20 49 46 20 28 42 61  |HEN.   {  IF (Ba|
000012e0  63 6b 54 72 61 63 65 3e  3e 32 34 29 7e 3d 23 78  |ckTrace>>24)~=#x|
000012f0  41 45 20 54 48 45 4e 20  7b 20 42 61 63 6b 54 72  |AE THEN { BackTr|
00001300  61 63 65 28 29 3b 20 4d  61 70 53 74 6f 72 65 28  |ace(); MapStore(|
00001310  29 20 7d 3b 0a 20 20 20  20 20 20 43 6f 6c 6c 61  |) };.      Colla|
00001320  70 73 65 28 31 30 29 20  7d 20 7d 0a 0a 41 4e 44  |pse(10) } }..AND|
00001330  20 43 6f 6c 6c 61 70 73  65 28 6e 29 20 42 45 20  | Collapse(n) BE |
00001340  7b 0a 20 20 20 49 46 20  72 63 3c 6e 20 54 48 45  |{.   IF rc<n THE|
00001350  4e 20 72 63 20 3a 3d 20  6e 0a 20 20 20 4c 6f 6e  |N rc := n.   Lon|
00001360  67 4a 75 6d 70 28 65 72  72 2e 70 2c 20 65 72 72  |gJump(err.p, err|
00001370  2e 6c 29 20 7d 0a 0a 41  4e 44 20 57 72 69 74 65  |.l) }..AND Write|
00001380  42 79 74 65 28 6e 29 20  42 45 0a 7b 20 20 49 46  |Byte(n) BE.{  IF|
00001390  20 6f 63 70 74 72 77 3e  3d 6f 63 2e 62 79 74 65  | ocptrw>=oc.byte|
000013a0  73 20 54 48 45 4e 20 7b  0a 20 20 20 20 20 20 4c  |s THEN {.      L|
000013b0  45 54 20 76 20 3d 20 47  65 74 56 65 63 74 6f 72  |ET v = GetVector|
000013c0  28 6f 63 2e 73 69 7a 65  29 3b 0a 20 20 20 20 20  |(oc.size);.     |
000013d0  20 21 6f 63 6f 64 65 42  75 66 77 20 3a 3d 20 76  | !ocodeBufw := v|
000013e0  3b 0a 20 20 20 20 20 20  6f 63 6f 64 65 42 75 66  |;.      ocodeBuf|
000013f0  77 20 3a 3d 20 76 3b 0a  20 20 20 20 20 20 21 76  |w := v;.      !v|
00001400  20 3a 3d 20 30 3b 0a 20  20 20 20 20 20 6f 63 70  | := 0;.      ocp|
00001410  74 72 77 20 3a 3d 20 6f  63 2e 66 69 72 73 74 62  |trw := oc.firstb|
00001420  79 74 65 20 7d 3b 0a 20  20 20 6f 63 6f 64 65 42  |yte };.   ocodeB|
00001430  75 66 77 25 6f 63 70 74  72 77 20 3a 3d 20 6e 3b  |ufw%ocptrw := n;|
00001440  0a 20 20 20 6f 63 70 74  72 77 20 3a 3d 20 6f 63  |.   ocptrw := oc|
00001450  70 74 72 77 2b 31 3b 0a  20 20 20 6f 63 6f 64 65  |ptrw+1;.   ocode|
00001460  42 75 66 77 21 6f 63 2e  6c 61 73 74 62 79 74 65  |Bufw!oc.lastbyte|
00001470  20 3a 3d 20 6f 63 70 74  72 77 0a 7d 0a 0a 41 4e  | := ocptrw.}..AN|
00001480  44 20 57 72 69 74 65 42  79 74 65 73 28 6e 29 20  |D WriteBytes(n) |
00001490  42 45 0a 20 20 20 54 45  53 54 20 2d 31 32 37 3c  |BE.   TEST -127<|
000014a0  3d 6e 3c 3d 31 32 37 20  54 48 45 4e 0a 20 20 20  |=n<=127 THEN.   |
000014b0  20 20 20 57 72 69 74 65  42 79 74 65 28 6e 29 0a  |   WriteByte(n).|
000014c0  20 20 20 45 4c 53 45 20  7b 0a 20 20 20 20 20 20  |   ELSE {.      |
000014d0  57 72 69 74 65 42 79 74  65 28 23 78 38 30 29 3b  |WriteByte(#x80);|
000014e0  0a 20 20 20 20 20 20 46  4f 52 20 69 20 3d 20 38  |.      FOR i = 8|
000014f0  2a 28 42 79 74 65 73 50  65 72 57 6f 72 64 2d 31  |*(BytesPerWord-1|
00001500  29 20 54 4f 20 30 20 42  59 20 2d 38 20 44 4f 0a  |) TO 0 BY -8 DO.|
00001510  09 20 57 72 69 74 65 42  79 74 65 28 6e 3e 3e 69  |. WriteByte(n>>i|
00001520  29 20 7d 0a 0a 41 4e 44  20 44 65 6c 4e 6f 6e 41  |) }..AND DelNonA|
00001530  73 73 6f 63 28 71 2c 20  6f 74 68 65 72 73 2c 20  |ssoc(q, others, |
00001540  73 69 7a 65 29 20 42 45  0a 7b 20 20 4c 45 54 20  |size) BE.{  LET |
00001550  70 20 3d 20 21 71 3b 0a  20 20 20 57 48 49 4c 45  |p = !q;.   WHILE|
00001560  20 70 7e 3d 30 20 44 4f  20 7b 0a 20 20 20 20 20  | p~=0 DO {.     |
00001570  20 54 45 53 54 20 41 73  73 6f 63 28 31 21 70 2c  | TEST Assoc(1!p,|
00001580  20 31 2c 20 6f 74 68 65  72 73 29 3d 4e 75 6c 6c  | 1, others)=Null|
00001590  20 54 48 45 4e 0a 09 20  21 71 20 3a 3d 20 46 72  | THEN.. !q := Fr|
000015a0  65 65 42 6c 6b 28 70 2c  20 73 69 7a 65 29 0a 20  |eeBlk(p, size). |
000015b0  20 20 20 20 20 45 4c 53  45 0a 09 20 71 20 3a 3d  |     ELSE.. q :=|
000015c0  20 70 3b 0a 20 20 20 20  20 20 70 20 3a 3d 20 21  | p;.      p := !|
000015d0  71 20 7d 20 7d 0a 0a 41  4e 44 20 43 6f 70 79 28  |q } }..AND Copy(|
000015e0  73 74 61 72 74 2c 20 65  6e 64 29 20 42 45 0a 7b  |start, end) BE.{|
000015f0  20 20 2f 2f 20 43 6f 70  79 20 6f 63 6f 64 65 20  |  // Copy ocode |
00001600  66 72 6f 6d 20 62 79 74  65 20 73 74 61 72 74 20  |from byte start |
00001610  28 69 6e 63 6c 75 73 69  76 65 29 20 74 6f 20 65  |(inclusive) to e|
00001620  6e 64 20 28 65 78 63 6c  75 73 69 76 65 29 0a 20  |nd (exclusive). |
00001630  20 20 2f 2f 20 6f 75 74  20 6f 66 20 74 68 65 20  |  // out of the |
00001640  6f 6c 64 20 69 6e 74 6f  20 74 68 65 20 6e 65 77  |old into the new|
00001650  20 6f 63 6f 64 65 20 62  75 66 66 65 72 0a 20 20  | ocode buffer.  |
00001660  20 4c 45 54 20 73 74 61  72 74 62 6c 6f 63 6b 20  | LET startblock |
00001670  3d 20 73 74 61 72 74 2f  28 6f 63 2e 62 79 74 65  |= start/(oc.byte|
00001680  73 2d 6f 63 2e 66 69 72  73 74 62 79 74 65 29 3b  |s-oc.firstbyte);|
00001690  0a 20 20 20 6f 63 70 74  72 20 3a 3d 20 28 73 74  |.   ocptr := (st|
000016a0  61 72 74 20 52 45 4d 20  28 6f 63 2e 62 79 74 65  |art REM (oc.byte|
000016b0  73 2d 6f 63 2e 66 69 72  73 74 62 79 74 65 29 29  |s-oc.firstbyte))|
000016c0  2b 6f 63 2e 66 69 72 73  74 62 79 74 65 3b 0a 20  |+oc.firstbyte;. |
000016d0  20 20 49 46 20 28 43 47  44 65 62 75 67 4d 6f 64  |  IF (CGDebugMod|
000016e0  65 26 64 62 2e 73 68 75  66 66 6c 65 29 7e 3d 30  |e&db.shuffle)~=0|
000016f0  20 54 48 45 4e 0a 20 20  20 20 20 20 57 72 69 74  | THEN.      Writ|
00001700  65 46 28 22 63 6f 70 79  69 6e 67 20 66 72 6f 6d  |eF("copying from|
00001710  20 25 6e 20 74 6f 20 25  6e 2a 6e 22 2c 20 73 74  | %n to %n*n", st|
00001720  61 72 74 2c 20 65 6e 64  29 3b 0a 20 20 20 6f 63  |art, end);.   oc|
00001730  6f 64 65 50 6f 73 6e 20  3a 3d 20 73 74 61 72 74  |odePosn := start|
00001740  3b 0a 20 20 20 6f 63 6f  64 65 42 75 66 20 3a 3d  |;.   ocodeBuf :=|
00001750  20 4e 74 68 28 73 74 61  72 74 62 6c 6f 63 6b 2c  | Nth(startblock,|
00001760  20 6f 63 6f 64 65 42 75  66 73 29 3b 0a 20 20 20  | ocodeBufs);.   |
00001770  55 4e 54 49 4c 20 6f 63  6f 64 65 50 6f 73 6e 3e  |UNTIL ocodePosn>|
00001780  3d 65 6e 64 20 7c 20 65  6e 64 4f 66 4f 63 6f 64  |=end | endOfOcod|
00001790  65 20 44 4f 20 57 72 69  74 65 42 79 74 65 28 52  |e DO WriteByte(R|
000017a0  65 61 64 42 79 74 65 28  29 29 20 7d 0a 0a 41 4e  |eadByte()) }..AN|
000017b0  44 20 50 72 65 53 63 61  6e 31 28 29 20 42 45 0a  |D PreScan1() BE.|
000017c0  7b 20 20 4c 45 54 20 41  64 64 54 72 61 6e 73 66  |{  LET AddTransf|
000017d0  65 72 4c 61 62 28 73 6f  75 72 63 65 2c 20 64 65  |erLab(source, de|
000017e0  73 74 29 20 42 45 0a 20  20 20 20 20 20 49 46 20  |st) BE.      IF |
000017f0  73 6f 75 72 63 65 7e 3d  4e 75 6c 6c 20 26 20 73  |source~=Null & s|
00001800  6f 75 72 63 65 7e 3d 64  65 73 74 20 26 20 54 72  |ource~=dest & Tr|
00001810  61 6e 73 66 65 72 72 65  64 4c 61 62 65 6c 28 64  |ansferredLabel(d|
00001820  65 73 74 29 7e 3d 73 6f  75 72 63 65 20 54 48 45  |est)~=source THE|
00001830  4e 0a 09 20 74 72 61 6e  73 66 65 72 4c 61 62 73  |N.. transferLabs|
00001840  20 3a 3d 20 46 69 6c 6c  42 6c 6b 28 33 2c 20 74  | := FillBlk(3, t|
00001850  72 61 6e 73 66 65 72 4c  61 62 73 2c 20 73 6f 75  |ransferLabs, sou|
00001860  72 63 65 2c 20 64 65 73  74 29 3b 0a 0a 20 20 20  |rce, dest);..   |
00001870  4c 45 54 20 70 72 65 63  65 64 69 6e 67 4c 61 62  |LET precedingLab|
00001880  65 6c 20 3d 20 4e 75 6c  6c 3b 0a 20 20 20 4c 45  |el = Null;.   LE|
00001890  54 20 62 6c 6f 63 6b 53  74 61 72 74 2c 20 62 6c  |T blockStart, bl|
000018a0  6f 63 6b 4c 61 62 65 6c  20 3d 20 4e 75 6c 6c 2c  |ockLabel = Null,|
000018b0  20 4e 75 6c 6c 3b 0a 20  20 20 4c 45 54 20 69 6e  | Null;.   LET in|
000018c0  73 69 64 65 42 6c 6f 63  6b 20 3d 20 46 41 4c 53  |sideBlock = FALS|
000018d0  45 3b 0a 20 20 20 4c 45  54 20 62 6c 6f 63 6b 73  |E;.   LET blocks|
000018e0  2c 20 62 6c 6f 63 6b 52  65 66 73 20 3d 20 30 2c  |, blockRefs = 0,|
000018f0  20 30 3b 0a 20 20 20 4c  45 54 20 64 61 74 61 4c  | 0;.   LET dataL|
00001900  61 62 65 6c 20 3d 20 30  3b 0a 0a 20 20 20 7b 73  |abel = 0;..   {s|
00001910  0a 20 20 20 53 57 49 54  43 48 4f 4e 20 6f 70 20  |.   SWITCHON op |
00001920  49 4e 54 4f 0a 20 20 20  7b 20 20 43 41 53 45 20  |INTO.   {  CASE |
00001930  30 3a 0a 09 20 43 47 45  72 72 6f 72 28 54 52 55  |0:.. CGError(TRU|
00001940  45 2c 20 22 50 72 65 6d  61 74 75 72 65 20 65 6e  |E, "Premature en|
00001950  64 20 6f 66 20 6f 63 6f  64 65 20 73 74 72 65 61  |d of ocode strea|
00001960  6d 22 29 3b 0a 0a 20 20  20 20 20 20 44 45 46 41  |m");..      DEFA|
00001970  55 4c 54 3a 0a 09 20 43  47 45 72 72 6f 72 28 46  |ULT:.. CGError(F|
00001980  41 4c 53 45 2c 20 22 55  6e 65 78 70 65 63 74 65  |ALSE, "Unexpecte|
00001990  64 20 6f 63 6f 64 65 20  6f 70 65 72 61 74 6f 72  |d ocode operator|
000019a0  20 25 6e 22 2c 20 6f 70  29 3b 0a 0a 20 20 20 20  | %n", op);..    |
000019b0  20 20 43 41 53 45 20 73  2e 64 65 62 75 67 3a 20  |  CASE s.debug: |
000019c0  43 41 53 45 20 73 2e 71  75 65 72 79 3a 0a 20 20  |CASE s.query:.  |
000019d0  20 20 20 20 43 41 53 45  20 73 2e 74 72 75 65 3a  |    CASE s.true:|
000019e0  20 43 41 53 45 20 73 2e  66 61 6c 73 65 3a 20 43  | CASE s.false: C|
000019f0  41 53 45 20 73 2e 6e 69  6c 3a 20 43 41 53 45 20  |ASE s.nil: CASE |
00001a00  73 2e 73 74 6e 69 6c 3a  0a 0a 20 20 20 20 20 20  |s.stnil:..      |
00001a10  43 41 53 45 20 73 2e 67  65 74 62 79 74 65 3a 20  |CASE s.getbyte: |
00001a20  43 41 53 45 20 73 2e 70  75 74 62 79 74 65 3a 0a  |CASE s.putbyte:.|
00001a30  20 20 20 20 20 20 43 41  53 45 20 73 2e 73 74 76  |      CASE s.stv|
00001a40  63 61 72 3a 20 43 41 53  45 20 73 2e 73 74 76 63  |car: CASE s.stvc|
00001a50  64 72 3a 20 43 41 53 45  20 73 2e 73 74 63 61 72  |dr: CASE s.stcar|
00001a60  3a 20 43 41 53 45 20 73  2e 73 74 63 64 72 3a 0a  |: CASE s.stcdr:.|
00001a70  20 20 20 20 20 20 43 41  53 45 20 73 2e 73 74 69  |      CASE s.sti|
00001a80  6e 64 3a 20 43 41 53 45  20 73 2e 6d 6f 64 3a 20  |nd: CASE s.mod: |
00001a90  43 41 53 45 20 73 2e 6d  6f 64 73 6c 63 74 3a 0a  |CASE s.modslct:.|
00001aa0  20 20 20 20 20 20 43 41  53 45 20 73 2e 76 63 61  |      CASE s.vca|
00001ab0  72 3a 20 43 41 53 45 20  73 2e 76 63 64 72 3a 20  |r: CASE s.vcdr: |
00001ac0  43 41 53 45 20 73 2e 63  61 72 3a 20 43 41 53 45  |CASE s.car: CASE|
00001ad0  20 73 2e 63 64 72 3a 0a  20 20 20 20 20 20 43 41  | s.cdr:.      CA|
00001ae0  53 45 20 73 2e 72 76 3a  0a 0a 20 20 20 20 20 20  |SE s.rv:..      |
00001af0  43 41 53 45 20 73 2e 6d  75 6c 74 3a 20 43 41 53  |CASE s.mult: CAS|
00001b00  45 20 73 2e 70 6c 75 73  3a 20 43 41 53 45 20 73  |E s.plus: CASE s|
00001b10  2e 64 69 76 3a 20 43 41  53 45 20 73 2e 72 65 6d  |.div: CASE s.rem|
00001b20  3a 20 43 41 53 45 20 73  2e 6d 69 6e 75 73 3a 0a  |: CASE s.minus:.|
00001b30  20 20 20 20 20 20 43 41  53 45 20 73 2e 66 6d 75  |      CASE s.fmu|
00001b40  6c 74 3a 20 43 41 53 45  20 73 2e 66 70 6c 75 73  |lt: CASE s.fplus|
00001b50  3a 20 43 41 53 45 20 73  2e 66 64 69 76 3a 20 43  |: CASE s.fdiv: C|
00001b60  41 53 45 20 73 2e 66 6d  69 6e 75 73 3a 0a 20 20  |ASE s.fminus:.  |
00001b70  20 20 20 20 43 41 53 45  20 73 2e 6c 6c 73 3a 20  |    CASE s.lls: |
00001b80  43 41 53 45 20 73 2e 6c  67 72 3a 20 43 41 53 45  |CASE s.lgr: CASE|
00001b90  20 73 2e 6c 6c 65 3a 20  43 41 53 45 20 73 2e 6c  | s.lle: CASE s.l|
00001ba0  67 65 3a 0a 20 20 20 20  20 20 43 41 53 45 20 73  |ge:.      CASE s|
00001bb0  2e 65 71 3a 20 20 43 41  53 45 20 73 2e 6e 65 3a  |.eq:  CASE s.ne:|
00001bc0  20 20 43 41 53 45 20 73  2e 6c 73 3a 0a 20 20 20  |  CASE s.ls:.   |
00001bd0  20 20 20 43 41 53 45 20  73 2e 67 72 3a 20 20 43  |   CASE s.gr:  C|
00001be0  41 53 45 20 73 2e 6c 65  3a 20 20 43 41 53 45 20  |ASE s.le:  CASE |
00001bf0  73 2e 67 65 3a 0a 20 20  20 20 20 20 43 41 53 45  |s.ge:.      CASE|
00001c00  20 73 2e 66 65 71 3a 20  43 41 53 45 20 73 2e 66  | s.feq: CASE s.f|
00001c10  6e 65 3a 20 43 41 53 45  20 73 2e 66 6c 73 3a 0a  |ne: CASE s.fls:.|
00001c20  20 20 20 20 20 20 43 41  53 45 20 73 2e 66 67 72  |      CASE s.fgr|
00001c30  3a 20 43 41 53 45 20 73  2e 66 6c 65 3a 20 43 41  |: CASE s.fle: CA|
00001c40  53 45 20 73 2e 66 67 65  3a 0a 20 20 20 20 20 20  |SE s.fge:.      |
00001c50  43 41 53 45 20 73 2e 6c  73 68 69 66 74 3a 20 43  |CASE s.lshift: C|
00001c60  41 53 45 20 73 2e 72 73  68 69 66 74 3a 0a 20 20  |ASE s.rshift:.  |
00001c70  20 20 20 20 43 41 53 45  20 73 2e 6c 6f 67 61 6e  |    CASE s.logan|
00001c80  64 3a 20 43 41 53 45 20  73 2e 6c 6f 67 6f 72 3a  |d: CASE s.logor:|
00001c90  20 43 41 53 45 20 73 2e  65 71 76 3a 20 43 41 53  | CASE s.eqv: CAS|
00001ca0  45 20 73 2e 6e 65 71 76  3a 0a 20 20 20 20 20 20  |E s.neqv:.      |
00001cb0  43 41 53 45 20 73 2e 6e  6f 74 3a 20 43 41 53 45  |CASE s.not: CASE|
00001cc0  20 73 2e 6e 65 67 3a 20  43 41 53 45 20 73 2e 61  | s.neg: CASE s.a|
00001cd0  62 73 3a 0a 20 20 20 20  20 20 43 41 53 45 20 73  |bs:.      CASE s|
00001ce0  2e 66 6e 65 67 3a 20 43  41 53 45 20 73 2e 66 61  |.fneg: CASE s.fa|
00001cf0  62 73 3a 0a 20 20 20 20  20 20 43 41 53 45 20 73  |bs:.      CASE s|
00001d00  2e 66 69 78 3a 20 20 43  41 53 45 20 73 2e 66 6c  |.fix:  CASE s.fl|
00001d10  6f 61 74 3a 0a 0a 20 20  20 20 20 20 43 41 53 45  |oat:..      CASE|
00001d20  20 73 2e 73 74 6f 72 65  3a 0a 09 20 45 4e 44 43  | s.store:.. ENDC|
00001d30  41 53 45 0a 0a 20 20 20  20 20 20 43 41 53 45 20  |ASE..      CASE |
00001d40  73 2e 73 6c 63 74 61 70  3a 20 43 41 53 45 20 73  |s.slctap: CASE s|
00001d50  2e 73 6c 63 74 73 74 3a  0a 09 20 52 65 61 64 4e  |.slctst:.. ReadN|
00001d60  28 29 3b 0a 0a 20 20 20  20 20 20 43 41 53 45 20  |();..      CASE |
00001d70  73 2e 66 63 6f 6e 73 74  3a 0a 20 20 20 20 20 20  |s.fconst:.      |
00001d80  43 41 53 45 20 73 2e 64  74 61 62 3a 0a 09 20 52  |CASE s.dtab:.. R|
00001d90  65 61 64 4e 28 29 3b 0a  09 20 52 65 61 64 4e 28  |eadN();.. ReadN(|
00001da0  29 3b 0a 09 20 45 4e 44  43 41 53 45 0a 0a 20 20  |);.. ENDCASE..  |
00001db0  20 20 20 20 43 41 53 45  20 73 2e 69 74 65 6d 6c  |    CASE s.iteml|
00001dc0  3a 0a 20 20 20 20 20 20  7b 20 20 4c 45 54 20 6c  |:.      {  LET l|
00001dd0  61 62 20 3d 20 52 65 61  64 4e 28 29 3b 0a 09 20  |ab = ReadN();.. |
00001de0  46 6c 61 67 4c 61 62 65  6c 28 6c 61 62 2c 20 6c  |FlagLabel(lab, l|
00001df0  61 62 2e 70 72 6f 63 6f  72 6c 61 62 65 6c 29 3b  |ab.procorlabel);|
00001e00  0a 09 20 73 74 61 74 69  63 44 61 74 61 53 69 7a  |.. staticDataSiz|
00001e10  65 20 3a 3d 20 73 74 61  74 69 63 44 61 74 61 53  |e := staticDataS|
00001e20  69 7a 65 2b 34 3b 0a 09  20 45 4e 44 43 41 53 45  |ize+4;.. ENDCASE|
00001e30  20 7d 0a 0a 20 20 20 20  20 20 43 41 53 45 20 73  | }..      CASE s|
00001e40  2e 69 74 65 6d 6e 3a 0a  09 20 73 74 61 74 69 63  |.itemn:.. static|
00001e50  44 61 74 61 53 69 7a 65  20 3a 3d 20 73 74 61 74  |DataSize := stat|
00001e60  69 63 44 61 74 61 53 69  7a 65 2b 34 3b 0a 20 20  |icDataSize+4;.  |
00001e70  20 20 20 20 43 41 53 45  20 73 2e 6c 69 6e 65 63  |    CASE s.linec|
00001e80  6f 75 6e 74 3a 0a 20 20  20 20 20 20 43 41 53 45  |ount:.      CASE|
00001e90  20 73 2e 61 72 67 6e 6f  3a 0a 20 20 20 20 20 20  | s.argno:.      |
00001ea0  43 41 53 45 20 73 2e 6c  67 3a 20 43 41 53 45 20  |CASE s.lg: CASE |
00001eb0  73 2e 6c 70 3a 20 43 41  53 45 20 73 2e 6c 6c 3a  |s.lp: CASE s.ll:|
00001ec0  20 43 41 53 45 20 73 2e  6c 6e 3a 0a 20 20 20 20  | CASE s.ln:.    |
00001ed0  20 20 43 41 53 45 20 73  2e 6c 6c 67 3a 0a 20 20  |  CASE s.llg:.  |
00001ee0  20 20 20 20 43 41 53 45  20 73 2e 73 67 3a 20 43  |    CASE s.sg: C|
00001ef0  41 53 45 20 73 2e 73 70  3a 0a 20 20 20 20 20 20  |ASE s.sp:.      |
00001f00  43 41 53 45 20 73 2e 73  61 76 65 3a 0a 20 20 20  |CASE s.save:.   |
00001f10  20 20 20 43 41 53 45 20  73 2e 64 61 74 61 6c 61  |   CASE s.datala|
00001f20  62 3a 0a 20 20 20 20 20  20 43 41 53 45 20 73 2e  |b:.      CASE s.|
00001f30  66 6e 61 70 3a 20 43 41  53 45 20 73 2e 72 74 61  |fnap: CASE s.rta|
00001f40  70 3a 0a 09 20 52 65 61  64 4e 28 29 3b 0a 09 20  |p:.. ReadN();.. |
00001f50  45 4e 44 43 41 53 45 0a  0a 20 20 20 20 20 20 43  |ENDCASE..      C|
00001f60  41 53 45 20 73 2e 72 65  66 65 78 74 3a 0a 20 20  |ASE s.refext:.  |
00001f70  20 20 20 20 7b 20 20 4c  45 54 20 6c 61 62 20 3d  |    {  LET lab =|
00001f80  20 52 65 61 64 4c 28 29  3b 0a 09 20 4c 45 54 20  | ReadL();.. LET |
00001f90  73 76 61 6c 20 3d 20 52  65 61 64 53 74 72 69 6e  |sval = ReadStrin|
00001fa0  67 28 52 65 61 64 4e 28  29 29 3b 0a 09 20 78 72  |g(ReadN());.. xr|
00001fb0  65 66 73 79 6d 73 20 3a  3d 20 46 69 6c 6c 42 6c  |efsyms := FillBl|
00001fc0  6b 28 33 2c 20 78 72 65  66 73 79 6d 73 2c 20 6c  |k(3, xrefsyms, l|
00001fd0  61 62 2c 20 73 76 61 6c  29 3b 0a 09 20 44 61 74  |ab, sval);.. Dat|
00001fe0  61 28 73 2e 64 61 74 61  6c 61 62 2c 20 6c 61 62  |a(s.datalab, lab|
00001ff0  29 3b 0a 09 20 73 74 61  74 69 63 4c 61 62 65 6c  |);.. staticLabel|
00002000  73 20 3a 3d 20 46 69 6c  6c 42 6c 6b 28 34 2c 20  |s := FillBlk(4, |
00002010  73 74 61 74 69 63 4c 61  62 65 6c 73 2c 20 6c 61  |staticLabels, la|
00002020  62 2c 20 4e 75 6c 6c 2c  20 73 74 61 74 69 63 4f  |b, Null, staticO|
00002030  66 66 73 65 74 29 3b 0a  09 20 44 61 74 61 28 73  |ffset);.. Data(s|
00002040  2e 69 74 65 6d 78 2c 20  73 76 61 6c 29 3b 0a 09  |.itemx, sval);..|
00002050  20 73 74 61 74 69 63 4f  66 66 73 65 74 20 3a 3d  | staticOffset :=|
00002060  20 73 74 61 74 69 63 4f  66 66 73 65 74 2b 34 3b  | staticOffset+4;|
00002070  0a 09 20 73 74 61 74 69  63 44 61 74 61 53 69 7a  |.. staticDataSiz|
00002080  65 20 3a 3d 20 73 74 61  74 69 63 44 61 74 61 53  |e := staticDataS|
00002090  69 7a 65 2b 34 3b 0a 09  20 45 4e 44 43 41 53 45  |ize+4;.. ENDCASE|
000020a0  20 7d 0a 0a 20 20 20 20  20 20 43 41 53 45 20 73  | }..      CASE s|
000020b0  2e 64 73 74 72 3a 0a 20  20 20 20 20 20 43 41 53  |.dstr:.      CAS|
000020c0  45 20 73 2e 64 65 66 65  78 74 3a 0a 09 20 52 65  |E s.defext:.. Re|
000020d0  61 64 4e 28 29 3b 0a 20  20 20 20 20 20 43 41 53  |adN();.      CAS|
000020e0  45 20 73 2e 73 65 63 74  69 6f 6e 3a 20 43 41 53  |E s.section: CAS|
000020f0  45 20 73 2e 6e 65 65 64  73 3a 0a 20 20 20 20 20  |E s.needs:.     |
00002100  20 43 41 53 45 20 73 2e  6c 73 74 72 3a 0a 09 20  | CASE s.lstr:.. |
00002110  44 69 73 63 61 72 64 4e  28 52 65 61 64 4e 28 29  |DiscardN(ReadN()|
00002120  29 3b 0a 09 20 45 4e 44  43 41 53 45 0a 0a 20 20  |);.. ENDCASE..  |
00002130  20 20 20 20 43 41 53 45  20 73 2e 6c 6c 70 3a 0a  |    CASE s.llp:.|
00002140  09 20 52 65 61 64 4e 28  29 3b 0a 09 20 45 4e 44  |. ReadN();.. END|
00002150  43 41 53 45 0a 0a 20 20  20 20 20 20 43 41 53 45  |CASE..      CASE|
00002160  20 73 2e 6c 6c 6c 3a 0a  09 20 46 6c 61 67 4c 61  | s.lll:.. FlagLa|
00002170  62 65 6c 28 52 65 61 64  4e 28 29 2c 20 6c 61 62  |bel(ReadN(), lab|
00002180  2e 6c 76 74 61 6b 65 6e  29 3b 0a 09 20 45 4e 44  |.lvtaken);.. END|
00002190  43 41 53 45 0a 0a 20 20  20 20 20 20 43 41 53 45  |CASE..      CASE|
000021a0  20 73 2e 73 6c 3a 0a 09  20 46 6c 61 67 4c 61 62  | s.sl:.. FlagLab|
000021b0  65 6c 28 52 65 61 64 4e  28 29 2c 20 6c 61 62 2e  |el(ReadN(), lab.|
000021c0  73 74 6f 72 65 64 29 3b  0a 09 20 45 4e 44 43 41  |stored);.. ENDCA|
000021d0  53 45 0a 0a 20 20 20 20  20 20 43 41 53 45 20 73  |SE..      CASE s|
000021e0  2e 6a 74 3a 20 43 41 53  45 20 73 2e 6a 66 3a 0a  |.jt: CASE s.jf:.|
000021f0  20 20 20 20 20 20 43 41  53 45 20 73 2e 65 6e 64  |      CASE s.end|
00002200  66 6f 72 3a 0a 09 20 52  65 61 64 4e 28 29 3b 0a  |for:.. ReadN();.|
00002210  09 20 45 4e 44 43 41 53  45 0a 0a 20 20 20 20 20  |. ENDCASE..     |
00002220  20 43 41 53 45 20 73 2e  73 74 61 63 6b 3a 20 43  | CASE s.stack: C|
00002230  41 53 45 20 73 2e 72 73  74 61 63 6b 3a 0a 09 20  |ASE s.rstack:.. |
00002240  52 65 61 64 4e 28 29 3b  0a 09 20 6f 70 20 3a 3d  |ReadN();.. op :=|
00002250  20 52 65 61 64 4f 70 28  29 3b 0a 09 20 4c 4f 4f  | ReadOp();.. LOO|
00002260  50 0a 0a 20 20 20 20 20  20 43 41 53 45 20 73 2e  |P..      CASE s.|
00002270  6c 61 62 3a 0a 09 20 7b  20 20 4c 45 54 20 70 20  |lab:.. {  LET p |
00002280  3d 20 6f 63 6f 64 65 50  6f 73 6e 2d 31 3b 0a 09  |= ocodePosn-1;..|
00002290  20 20 20 20 4c 45 54 20  6c 20 3d 20 52 65 61 64  |    LET l = Read|
000022a0  4e 28 29 3b 0a 09 20 20  20 20 41 64 64 54 72 61  |N();..    AddTra|
000022b0  6e 73 66 65 72 4c 61 62  28 70 72 65 63 65 64 69  |nsferLab(precedi|
000022c0  6e 67 4c 61 62 65 6c 2c  20 6c 29 3b 0a 09 20 20  |ngLabel, l);..  |
000022d0  20 20 70 72 65 63 65 64  69 6e 67 4c 61 62 65 6c  |  precedingLabel|
000022e0  20 3a 3d 20 6c 3b 0a 09  20 20 20 20 54 45 53 54  | := l;..    TEST|
000022f0  20 69 6e 73 69 64 65 42  6c 6f 63 6b 20 54 48 45  | insideBlock THE|
00002300  4e 0a 09 20 20 20 20 20  20 20 62 6c 6f 63 6b 53  |N..       blockS|
00002310  74 61 72 74 20 3a 3d 20  4e 75 6c 6c 0a 09 20 20  |tart := Null..  |
00002320  20 20 45 4c 53 45 0a 09  20 20 20 20 20 20 20 62  |  ELSE..       b|
00002330  6c 6f 63 6b 53 74 61 72  74 2c 20 62 6c 6f 63 6b  |lockStart, block|
00002340  4c 61 62 65 6c 20 3a 3d  20 70 2c 20 6c 3b 0a 09  |Label := p, l;..|
00002350  20 20 20 20 69 6e 73 69  64 65 42 6c 6f 63 6b 20  |    insideBlock |
00002360  3a 3d 20 54 52 55 45 3b  0a 09 20 20 20 20 6f 70  |:= TRUE;..    op|
00002370  20 3a 3d 20 52 65 61 64  4f 70 28 29 3b 0a 09 20  | := ReadOp();.. |
00002380  20 20 20 4c 4f 4f 50 20  7d 0a 0a 20 20 20 20 20  |   LOOP }..     |
00002390  20 43 41 53 45 20 73 2e  65 6e 74 72 79 3a 0a 09  | CASE s.entry:..|
000023a0  20 44 69 73 63 61 72 64  4e 28 52 65 61 64 4e 28  | DiscardN(ReadN(|
000023b0  29 2b 31 29 3b 0a 09 20  69 6e 73 69 64 65 42 6c  |)+1);.. insideBl|
000023c0  6f 63 6b 20 3a 3d 20 54  52 55 45 3b 0a 09 20 62  |ock := TRUE;.. b|
000023d0  6c 6f 63 6b 53 74 61 72  74 20 3a 3d 20 4e 75 6c  |lockStart := Nul|
000023e0  6c 3b 0a 09 20 45 4e 44  43 41 53 45 0a 0a 20 20  |l;.. ENDCASE..  |
000023f0  20 20 20 20 43 41 53 45  20 73 2e 65 6e 64 70 72  |    CASE s.endpr|
00002400  6f 63 3a 0a 20 20 20 20  20 20 43 41 53 45 20 73  |oc:.      CASE s|
00002410  2e 65 6e 64 62 6c 6f 63  6b 3a 0a 09 20 49 67 6e  |.endblock:.. Ign|
00002420  6f 72 65 4e 61 6d 65 73  28 29 3b 0a 09 20 45 4e  |oreNames();.. EN|
00002430  44 43 41 53 45 0a 0a 20  20 20 20 20 20 43 41 53  |DCASE..      CAS|
00002440  45 20 73 2e 73 77 69 74  63 68 6f 6e 3a 0a 09 20  |E s.switchon:.. |
00002450  7b 20 20 4c 45 54 20 6e  20 3d 20 52 65 61 64 4e  |{  LET n = ReadN|
00002460  28 29 3b 0a 09 20 20 20  20 4c 45 54 20 64 20 3d  |();..    LET d =|
00002470  20 52 65 61 64 4e 28 29  3b 0a 09 20 20 20 20 46  | ReadN();..    F|
00002480  4f 52 20 69 20 3d 20 31  20 54 4f 20 32 2a 6e 20  |OR i = 1 TO 2*n |
00002490  44 4f 20 52 65 61 64 4e  28 29 3b 0a 09 20 20 20  |DO ReadN();..   |
000024a0  20 49 46 20 41 73 73 6f  63 28 64 2c 20 31 2c 20  | IF Assoc(d, 1, |
000024b0  62 6c 6f 63 6b 52 65 66  73 29 3d 4e 75 6c 6c 20  |blockRefs)=Null |
000024c0  54 48 45 4e 0a 09 20 20  20 20 20 20 20 62 6c 6f  |THEN..       blo|
000024d0  63 6b 52 65 66 73 20 3a  3d 20 46 69 6c 6c 42 6c  |ckRefs := FillBl|
000024e0  6b 28 33 2c 20 62 6c 6f  63 6b 52 65 66 73 2c 20  |k(3, blockRefs, |
000024f0  64 2c 20 6f 63 6f 64 65  50 6f 73 6e 29 0a 09 20  |d, ocodePosn).. |
00002500  20 20 20 47 4f 54 4f 20  45 6e 64 4f 66 42 6c 6f  |   GOTO EndOfBlo|
00002510  63 6b 20 7d 3b 0a 0a 20  20 20 20 20 20 43 41 53  |ck };..      CAS|
00002520  45 20 73 2e 66 6e 72 6e  3a 20 43 41 53 45 20 73  |E s.fnrn: CASE s|
00002530  2e 72 74 72 6e 3a 0a 09  20 41 64 64 54 72 61 6e  |.rtrn:.. AddTran|
00002540  73 66 65 72 4c 61 62 28  70 72 65 63 65 64 69 6e  |sferLab(precedin|
00002550  67 4c 61 62 65 6c 2c 20  30 29 3b 0a 09 20 47 4f  |gLabel, 0);.. GO|
00002560  54 4f 20 45 6e 64 4f 66  42 6c 6f 63 6b 0a 0a 20  |TO EndOfBlock.. |
00002570  20 20 20 20 20 43 41 53  45 20 73 2e 72 65 73 3a  |     CASE s.res:|
00002580  0a 20 20 20 20 20 20 43  41 53 45 20 73 2e 6a 75  |.      CASE s.ju|
00002590  6d 70 3a 0a 09 20 7b 20  20 4c 45 54 20 6c 20 3d  |mp:.. {  LET l =|
000025a0  20 52 65 61 64 4e 28 29  3b 0a 09 20 20 20 20 4c  | ReadN();..    L|
000025b0  45 54 20 70 20 3d 20 41  73 73 6f 63 28 6c 2c 20  |ET p = Assoc(l, |
000025c0  31 2c 20 62 6c 6f 63 6b  52 65 66 73 29 3b 0a 09  |1, blockRefs);..|
000025d0  20 20 20 20 41 64 64 54  72 61 6e 73 66 65 72 4c  |    AddTransferL|
000025e0  61 62 28 70 72 65 63 65  64 69 6e 67 4c 61 62 65  |ab(precedingLabe|
000025f0  6c 2c 20 6c 29 3b 0a 09  20 20 20 20 49 46 20 70  |l, l);..    IF p|
00002600  7e 3d 4e 75 6c 6c 20 54  48 45 4e 0a 09 20 20 20  |~=Null THEN..   |
00002610  20 20 20 20 62 6c 6f 63  6b 52 65 66 73 20 3a 3d  |    blockRefs :=|
00002620  20 44 65 6c 65 74 65 46  72 6f 6d 4c 69 73 74 28  | DeleteFromList(|
00002630  62 6c 6f 63 6b 52 65 66  73 2c 20 70 2c 20 33 29  |blockRefs, p, 3)|
00002640  3b 0a 09 20 20 20 20 62  6c 6f 63 6b 52 65 66 73  |;..    blockRefs|
00002650  20 3a 3d 20 46 69 6c 6c  42 6c 6b 28 33 2c 20 62  | := FillBlk(3, b|
00002660  6c 6f 63 6b 52 65 66 73  2c 20 6c 2c 20 6f 63 6f  |lockRefs, l, oco|
00002670  64 65 50 6f 73 6e 29 20  7d 0a 0a 20 20 20 20 20  |dePosn) }..     |
00002680  20 43 41 53 45 20 73 2e  67 6f 74 6f 3a 0a 20 20  | CASE s.goto:.  |
00002690  20 20 20 20 43 41 53 45  20 73 2e 66 69 6e 69 73  |    CASE s.finis|
000026a0  68 3a 0a 20 20 20 20 20  20 45 6e 64 4f 66 42 6c  |h:.      EndOfBl|
000026b0  6f 63 6b 3a 0a 09 20 49  46 20 69 6e 73 69 64 65  |ock:.. IF inside|
000026c0  42 6c 6f 63 6b 20 26 20  62 6c 6f 63 6b 53 74 61  |Block & blockSta|
000026d0  72 74 7e 3d 4e 75 6c 6c  20 54 48 45 4e 0a 09 20  |rt~=Null THEN.. |
000026e0  20 20 20 62 6c 6f 63 6b  73 20 3a 3d 20 46 69 6c  |   blocks := Fil|
000026f0  6c 42 6c 6b 28 34 2c 20  62 6c 6f 63 6b 73 2c 20  |lBlk(4, blocks, |
00002700  62 6c 6f 63 6b 4c 61 62  65 6c 2c 20 62 6c 6f 63  |blockLabel, bloc|
00002710  6b 53 74 61 72 74 2c 20  6f 63 6f 64 65 50 6f 73  |kStart, ocodePos|
00002720  6e 29 3b 0a 09 20 69 6e  73 69 64 65 42 6c 6f 63  |n);.. insideBloc|
00002730  6b 20 3a 3d 20 46 41 4c  53 45 3b 0a 09 20 45 4e  |k := FALSE;.. EN|
00002740  44 43 41 53 45 0a 0a 20  20 20 20 20 20 43 41 53  |DCASE..      CAS|
00002750  45 20 73 2e 67 6c 6f 62  61 6c 3a 0a 09 20 42 52  |E s.global:.. BR|
00002760  45 41 4b 0a 20 20 20 7d  3b 0a 0a 20 20 20 70 72  |EAK.   };..   pr|
00002770  65 63 65 64 69 6e 67 4c  61 62 65 6c 20 3a 3d 20  |ecedingLabel := |
00002780  4e 75 6c 6c 3b 0a 20 20  20 6f 70 20 3a 3d 20 52  |Null;.   op := R|
00002790  65 61 64 4f 70 28 29 0a  20 20 20 7d 73 20 52 45  |eadOp().   }s RE|
000027a0  50 45 41 54 3b 0a 0a 20  20 20 49 46 20 28 43 47  |PEAT;..   IF (CG|
000027b0  44 65 62 75 67 4d 6f 64  65 26 64 62 2e 73 68 75  |DebugMode&db.shu|
000027c0  66 66 6c 65 29 7e 3d 30  20 54 48 45 4e 0a 20 20  |ffle)~=0 THEN.  |
000027d0  20 7b 20 20 50 72 69 6e  74 4c 69 73 74 28 62 6c  | {  PrintList(bl|
000027e0  6f 63 6b 73 2c 20 33 2c  20 22 62 6c 6f 63 6b 73  |ocks, 3, "blocks|
000027f0  22 2c 20 22 3a 22 2c 20  22 2a 6e 22 29 3b 0a 20  |", ":", "*n");. |
00002800  20 20 20 20 20 50 72 69  6e 74 4c 69 73 74 28 62  |     PrintList(b|
00002810  6c 6f 63 6b 52 65 66 73  2c 20 32 2c 20 22 62 6c  |lockRefs, 2, "bl|
00002820  6f 63 6b 72 65 66 73 22  2c 20 22 3a 22 2c 20 22  |ockrefs", ":", "|
00002830  2a 6e 22 29 20 7d 3b 0a  0a 20 20 20 44 65 6c 4e  |*n") };..   DelN|
00002840  6f 6e 41 73 73 6f 63 28  40 62 6c 6f 63 6b 52 65  |onAssoc(@blockRe|
00002850  66 73 2c 20 62 6c 6f 63  6b 73 2c 20 33 29 3b 0a  |fs, blocks, 3);.|
00002860  20 20 20 44 65 6c 4e 6f  6e 41 73 73 6f 63 28 40  |   DelNonAssoc(@|
00002870  62 6c 6f 63 6b 73 2c 20  62 6c 6f 63 6b 52 65 66  |blocks, blockRef|
00002880  73 2c 20 34 29 3b 0a 0a  20 20 20 49 46 20 62 6c  |s, 4);..   IF bl|
00002890  6f 63 6b 73 7e 3d 30 20  26 20 28 43 47 4f 70 74  |ocks~=0 & (CGOpt|
000028a0  4d 6f 64 65 26 6f 70 2e  73 68 75 66 66 6c 65 29  |Mode&op.shuffle)|
000028b0  7e 3d 30 20 54 48 45 4e  0a 20 20 20 7b 20 20 4c  |~=0 THEN.   {  L|
000028c0  45 54 20 70 6f 73 6e 20  3d 20 30 3b 0a 20 20 20  |ET posn = 0;.   |
000028d0  20 20 20 4c 45 54 20 62  6c 6f 63 6b 70 20 3d 20  |   LET blockp = |
000028e0  3f 3b 0a 20 20 20 20 20  20 4c 45 54 20 69 6e 73  |?;.      LET ins|
000028f0  65 72 74 2c 20 69 67 6e  6f 72 65 53 74 61 72 74  |ert, ignoreStart|
00002900  2c 20 69 67 6e 6f 72 65  45 6e 64 20 3d 20 3f 2c  |, ignoreEnd = ?,|
00002910  20 3f 2c 20 3f 3b 0a 20  20 20 20 20 20 4c 45 54  | ?, ?;.      LET|
00002920  20 6e 65 77 42 75 66 73  20 3d 20 47 65 74 56 65  | newBufs = GetVe|
00002930  63 74 6f 72 28 6f 63 2e  73 69 7a 65 29 3b 0a 0a  |ctor(oc.size);..|
00002940  20 20 20 20 20 20 62 6c  6f 63 6b 73 20 3a 3d 20  |      blocks := |
00002950  52 65 76 65 72 73 65 49  6e 50 6c 61 63 65 28 62  |ReverseInPlace(b|
00002960  6c 6f 63 6b 73 29 3b 0a  20 20 20 20 20 20 62 6c  |locks);.      bl|
00002970  6f 63 6b 52 65 66 73 20  3a 3d 20 52 65 76 65 72  |ockRefs := Rever|
00002980  73 65 49 6e 50 6c 61 63  65 28 62 6c 6f 63 6b 52  |seInPlace(blockR|
00002990  65 66 73 29 3b 0a 0a 20  20 20 20 20 20 49 46 20  |efs);..      IF |
000029a0  28 43 47 44 65 62 75 67  4d 6f 64 65 26 64 62 2e  |(CGDebugMode&db.|
000029b0  73 68 75 66 66 6c 65 29  7e 3d 30 20 54 48 45 4e  |shuffle)~=0 THEN|
000029c0  0a 20 20 20 20 20 20 7b  20 20 50 72 69 6e 74 4c  |.      {  PrintL|
000029d0  69 73 74 28 62 6c 6f 63  6b 73 2c 20 33 2c 20 22  |ist(blocks, 3, "|
000029e0  62 6c 6f 63 6b 73 22 2c  20 22 3a 22 2c 20 22 2a  |blocks", ":", "*|
000029f0  6e 22 29 3b 0a 09 20 50  72 69 6e 74 4c 69 73 74  |n");.. PrintList|
00002a00  28 62 6c 6f 63 6b 52 65  66 73 2c 20 32 2c 20 22  |(blockRefs, 2, "|
00002a10  62 6c 6f 63 6b 72 65 66  73 22 2c 20 22 3a 22 2c  |blockrefs", ":",|
00002a20  20 22 2a 6e 22 29 20 7d  3b 0a 0a 20 20 20 20 20  | "*n") };..     |
00002a30  20 77 72 69 74 65 4f 63  6f 64 65 20 3a 3d 20 30  | writeOcode := 0|
00002a40  3b 0a 20 20 20 20 20 20  6f 63 70 74 72 20 3a 3d  |;.      ocptr :=|
00002a50  20 6f 63 2e 66 69 72 73  74 62 79 74 65 3b 20 6f  | oc.firstbyte; o|
00002a60  63 6f 64 65 42 75 66 20  3a 3d 20 6f 63 6f 64 65  |codeBuf := ocode|
00002a70  42 75 66 73 3b 0a 20 20  20 20 20 20 6f 63 6f 64  |Bufs;.      ocod|
00002a80  65 42 75 66 77 20 3a 3d  20 6e 65 77 42 75 66 73  |eBufw := newBufs|
00002a90  3b 0a 20 20 20 20 20 20  21 6f 63 6f 64 65 42 75  |;.      !ocodeBu|
00002aa0  66 77 20 3a 3d 20 30 3b  0a 20 20 20 20 20 20 6f  |fw := 0;.      o|
00002ab0  63 70 74 72 77 20 3a 3d  20 6f 63 2e 66 69 72 73  |cptrw := oc.firs|
00002ac0  74 62 79 74 65 3b 0a 20  20 20 20 20 20 65 6e 64  |tbyte;.      end|
00002ad0  4f 66 4f 63 6f 64 65 20  3a 3d 20 46 41 4c 53 45  |OfOcode := FALSE|
00002ae0  3b 0a 20 20 20 20 20 20  62 6c 6f 63 6b 70 20 3a  |;.      blockp :|
00002af0  3d 20 62 6c 6f 63 6b 73  3b 0a 0a 20 20 20 20 20  |= blocks;..     |
00002b00  20 7b 20 20 69 6e 73 65  72 74 20 3a 3d 20 62 6c  | {  insert := bl|
00002b10  6f 63 6b 52 65 66 73 3d  30 20 2d 3e 20 69 6e 66  |ockRefs=0 -> inf|
00002b20  69 6e 69 74 79 2c 20 62  6c 6f 63 6b 52 65 66 73  |inity, blockRefs|
00002b30  21 32 3b 0a 09 20 69 67  6e 6f 72 65 53 74 61 72  |!2;.. ignoreStar|
00002b40  74 20 3a 3d 20 62 6c 6f  63 6b 70 3d 30 20 2d 3e  |t := blockp=0 ->|
00002b50  20 69 6e 66 69 6e 69 74  79 2c 20 62 6c 6f 63 6b  | infinity, block|
00002b60  70 21 32 3b 0a 09 20 69  67 6e 6f 72 65 45 6e 64  |p!2;.. ignoreEnd|
00002b70  20 20 20 3a 3d 20 62 6c  6f 63 6b 70 3d 30 20 2d  |   := blockp=0 -|
00002b80  3e 20 69 6e 66 69 6e 69  74 79 2c 20 62 6c 6f 63  |> infinity, bloc|
00002b90  6b 70 21 33 3b 0a 0a 09  20 49 46 20 28 43 47 44  |kp!3;... IF (CGD|
00002ba0  65 62 75 67 4d 6f 64 65  26 64 62 2e 73 68 75 66  |ebugMode&db.shuf|
00002bb0  66 6c 65 29 7e 3d 30 20  54 48 45 4e 0a 09 20 20  |fle)~=0 THEN..  |
00002bc0  20 20 77 72 69 74 65 66  28 22 25 6e 2c 20 5b 25  |  writef("%n, [%|
00002bd0  6e 2c 20 25 6e 5d 2a 6e  22 2c 20 69 6e 73 65 72  |n, %n]*n", inser|
00002be0  74 2c 20 69 67 6e 6f 72  65 53 74 61 72 74 2c 20  |t, ignoreStart, |
00002bf0  69 67 6e 6f 72 65 45 6e  64 29 3b 0a 0a 09 20 54  |ignoreEnd);... T|
00002c00  45 53 54 20 69 6e 73 65  72 74 3c 3d 69 67 6e 6f  |EST insert<=igno|
00002c10  72 65 53 74 61 72 74 20  26 20 69 6e 73 65 72 74  |reStart & insert|
00002c20  7e 3d 69 6e 66 69 6e 69  74 79 20 54 48 45 4e 20  |~=infinity THEN |
00002c30  7b 0a 09 20 20 20 20 4c  45 54 20 70 20 3d 20 62  |{..    LET p = b|
00002c40  6c 6f 63 6b 52 65 66 73  3b 0a 09 20 20 20 20 4c  |lockRefs;..    L|
00002c50  45 54 20 74 61 72 67 65  74 20 3d 20 3f 3b 0a 09  |ET target = ?;..|
00002c60  20 20 20 20 43 6f 70 79  28 70 6f 73 6e 2c 20 69  |    Copy(posn, i|
00002c70  6e 73 65 72 74 29 3b 0a  09 20 20 20 20 57 48 49  |nsert);..    WHI|
00002c80  4c 45 20 70 7e 3d 4e 75  6c 6c 20 44 4f 0a 09 20  |LE p~=Null DO.. |
00002c90  20 20 20 7b 20 20 74 61  72 67 65 74 20 3a 3d 20  |   {  target := |
00002ca0  41 73 73 6f 63 28 31 21  70 2c 20 31 2c 20 62 6c  |Assoc(1!p, 1, bl|
00002cb0  6f 63 6b 73 29 3b 0a 09  20 20 20 20 20 20 20 43  |ocks);..       C|
00002cc0  6f 70 79 28 74 61 72 67  65 74 21 32 2c 20 74 61  |opy(target!2, ta|
00002cd0  72 67 65 74 21 33 29 3b  0a 09 20 20 20 20 20 20  |rget!3);..      |
00002ce0  20 62 6c 6f 63 6b 52 65  66 73 20 3a 3d 20 44 65  | blockRefs := De|
00002cf0  6c 65 74 65 46 72 6f 6d  4c 69 73 74 28 62 6c 6f  |leteFromList(blo|
00002d00  63 6b 52 65 66 73 2c 20  70 2c 20 33 29 3b 0a 09  |ckRefs, p, 3);..|
00002d10  20 20 20 20 20 20 20 70  20 3a 3d 20 41 73 73 6f  |       p := Asso|
00002d20  63 28 74 61 72 67 65 74  21 33 2c 20 32 2c 20 62  |c(target!3, 2, b|
00002d30  6c 6f 63 6b 52 65 66 73  29 20 7d 3b 0a 09 20 20  |lockRefs) };..  |
00002d40  20 20 70 6f 73 6e 20 3a  3d 20 69 6e 73 65 72 74  |  posn := insert|
00002d50  20 7d 0a 09 20 45 4c 53  45 20 7b 0a 09 20 20 20  | }.. ELSE {..   |
00002d60  20 43 6f 70 79 28 70 6f  73 6e 2c 20 69 67 6e 6f  | Copy(posn, igno|
00002d70  72 65 53 74 61 72 74 29  3b 0a 09 20 20 20 20 70  |reStart);..    p|
00002d80  6f 73 6e 20 3a 3d 20 69  67 6e 6f 72 65 45 6e 64  |osn := ignoreEnd|
00002d90  3b 0a 09 20 20 20 20 62  6c 6f 63 6b 70 20 3a 3d  |;..    blockp :=|
00002da0  20 21 62 6c 6f 63 6b 70  20 7d 0a 20 20 20 20 20  | !blockp }.     |
00002db0  20 7d 20 52 45 50 45 41  54 57 48 49 4c 45 20 69  | } REPEATWHILE i|
00002dc0  6e 73 65 72 74 7e 3d 69  6e 66 69 6e 69 74 79 20  |nsert~=infinity |
00002dd0  7c 20 69 67 6e 6f 72 65  53 74 61 72 74 7e 3d 69  || ignoreStart~=i|
00002de0  6e 66 69 6e 69 74 79 3b  0a 0a 20 20 20 20 20 20  |nfinity;..      |
00002df0  65 6e 64 4f 66 4f 63 6f  64 65 20 3a 3d 20 46 41  |endOfOcode := FA|
00002e00  4c 53 45 3b 0a 20 20 20  20 20 20 6f 63 6f 64 65  |LSE;.      ocode|
00002e10  42 75 66 73 20 3a 3d 20  6e 65 77 42 75 66 73 3b  |Bufs := newBufs;|
00002e20  0a 20 20 20 20 20 20 6f  63 70 74 72 20 3a 3d 20  |.      ocptr := |
00002e30  6f 63 2e 66 69 72 73 74  62 79 74 65 3b 0a 20 20  |oc.firstbyte;.  |
00002e40  20 20 20 20 6f 63 6f 64  65 42 75 66 20 3a 3d 20  |    ocodeBuf := |
00002e50  6f 63 6f 64 65 42 75 66  73 3b 0a 20 20 20 20 20  |ocodeBufs;.     |
00002e60  20 49 46 20 28 43 47 44  65 62 75 67 4d 6f 64 65  | IF (CGDebugMode|
00002e70  26 64 62 2e 73 68 75 66  66 6c 65 29 7e 3d 30 20  |&db.shuffle)~=0 |
00002e80  54 48 45 4e 0a 20 20 20  20 20 20 7b 20 20 7b 20  |THEN.      {  { |
00002e90  20 57 72 69 74 65 46 28  22 25 6e 20 22 2c 20 52  | WriteF("%n ", R|
00002ea0  65 61 64 4e 28 29 29 20  7d 20 52 45 50 45 41 54  |eadN()) } REPEAT|
00002eb0  57 48 49 4c 45 20 7e 65  6e 64 4f 66 4f 63 6f 64  |WHILE ~endOfOcod|
00002ec0  65 20 7d 20 7d 0a 7d 0a  0a 41 4e 44 20 50 72 65  |e } }.}..AND Pre|
00002ed0  4a 75 6d 70 28 6c 61 62  29 20 42 45 0a 7b 20 20  |Jump(lab) BE.{  |
00002ee0  4c 45 54 20 70 20 3d 20  46 69 6e 64 4c 61 62 65  |LET p = FindLabe|
00002ef0  6c 45 6e 74 72 79 28 54  72 61 6e 73 66 65 72 72  |lEntry(Transferr|
00002f00  65 64 4c 61 62 65 6c 28  6c 61 62 29 29 3b 0a 20  |edLabel(lab));. |
00002f10  20 20 4c 45 54 20 65 20  3d 20 21 70 3b 0a 0a 20  |  LET e = !p;.. |
00002f20  20 20 54 45 53 54 20 28  65 26 6c 61 62 2e 64 65  |  TEST (e&lab.de|
00002f30  66 69 6e 65 64 29 7e 3d  30 20 54 48 45 4e 0a 20  |fined)~=0 THEN. |
00002f40  20 20 20 20 20 65 20 3a  3d 20 65 20 26 20 7e 28  |     e := e & ~(|
00002f50  6c 61 62 2e 66 6f 72 77  61 72 64 6a 75 6d 70 2b  |lab.forwardjump+|
00002f60  6c 61 62 2e 6f 6e 6c 79  6f 6e 65 6a 75 6d 70 29  |lab.onlyonejump)|
00002f70  0a 20 20 20 45 4c 53 45  20 54 45 53 54 20 28 65  |.   ELSE TEST (e|
00002f80  26 6c 61 62 2e 66 6f 72  77 61 72 64 6a 75 6d 70  |&lab.forwardjump|
00002f90  29 7e 3d 30 20 54 48 45  4e 0a 20 20 20 20 20 20  |)~=0 THEN.      |
00002fa0  65 20 3a 3d 20 65 20 26  20 7e 6c 61 62 2e 6f 6e  |e := e & ~lab.on|
00002fb0  6c 79 6f 6e 65 6a 75 6d  70 0a 20 20 20 45 4c 53  |lyonejump.   ELS|
00002fc0  45 0a 20 20 20 20 20 20  65 20 3a 3d 20 65 20 7c  |E.      e := e ||
00002fd0  20 28 6c 61 62 2e 66 6f  72 77 61 72 64 6a 75 6d  | (lab.forwardjum|
00002fe0  70 2b 6c 61 62 2e 6f 6e  6c 79 6f 6e 65 6a 75 6d  |p+lab.onlyonejum|
00002ff0  70 29 3b 0a 0a 20 20 20  21 70 20 3a 3d 20 65 0a  |p);..   !p := e.|
00003000  7d 0a 0a 41 4e 44 20 50  72 65 53 63 61 6e 32 28  |}..AND PreScan2(|
00003010  29 20 42 45 0a 7b 73 20  4c 45 54 20 73 74 61 63  |) BE.{s LET stac|
00003020  6b 46 72 61 6d 65 20 3d  20 30 3b 0a 20 20 20 73  |kFrame = 0;.   s|
00003030  73 70 20 3a 3d 20 30 3b  0a 0a 20 20 20 7b 20 20  |sp := 0;..   {  |
00003040  53 57 49 54 43 48 4f 4e  20 6f 70 20 49 4e 54 4f  |SWITCHON op INTO|
00003050  0a 20 20 20 20 20 20 7b  20 20 44 45 46 41 55 4c  |.      {  DEFAUL|
00003060  54 3a 0a 0a 09 20 43 41  53 45 20 73 2e 64 65 62  |T:... CASE s.deb|
00003070  75 67 3a 0a 0a 09 20 43  41 53 45 20 73 2e 76 63  |ug:... CASE s.vc|
00003080  61 72 3a 20 43 41 53 45  20 73 2e 76 63 64 72 3a  |ar: CASE s.vcdr:|
00003090  20 43 41 53 45 20 73 2e  63 61 72 3a 20 43 41 53  | CASE s.car: CAS|
000030a0  45 20 73 2e 63 64 72 3a  0a 09 20 43 41 53 45 20  |E s.cdr:.. CASE |
000030b0  73 2e 72 76 3a 0a 0a 09  20 43 41 53 45 20 73 2e  |s.rv:... CASE s.|
000030c0  6e 6f 74 3a 20 43 41 53  45 20 73 2e 6e 65 67 3a  |not: CASE s.neg:|
000030d0  20 43 41 53 45 20 73 2e  61 62 73 3a 0a 09 20 43  | CASE s.abs:.. C|
000030e0  41 53 45 20 73 2e 66 6e  65 67 3a 20 43 41 53 45  |ASE s.fneg: CASE|
000030f0  20 73 2e 66 61 62 73 3a  0a 09 20 43 41 53 45 20  | s.fabs:.. CASE |
00003100  73 2e 66 69 78 3a 20 43  41 53 45 20 73 2e 66 6c  |s.fix: CASE s.fl|
00003110  6f 61 74 3a 0a 0a 09 20  43 41 53 45 20 73 2e 66  |oat:... CASE s.f|
00003120  69 6e 69 73 68 3a 0a 09  20 43 41 53 45 20 73 2e  |inish:.. CASE s.|
00003130  73 74 6f 72 65 3a 0a 09  20 43 41 53 45 20 73 2e  |store:.. CASE s.|
00003140  66 6e 72 6e 3a 20 43 41  53 45 20 73 2e 72 74 72  |fnrn: CASE s.rtr|
00003150  6e 3a 0a 09 20 20 20 20  45 4e 44 43 41 53 45 0a  |n:..    ENDCASE.|
00003160  0a 09 20 43 41 53 45 20  73 2e 66 63 6f 6e 73 74  |.. CASE s.fconst|
00003170  3a 0a 09 20 20 20 20 52  65 61 64 4e 28 29 3b 0a  |:..    ReadN();.|
00003180  09 20 43 41 53 45 20 73  2e 6c 67 3a 20 43 41 53  |. CASE s.lg: CAS|
00003190  45 20 73 2e 6c 6e 3a 0a  09 20 43 41 53 45 20 73  |E s.ln:.. CASE s|
000031a0  2e 6c 6c 67 3a 0a 09 20  43 41 53 45 20 73 2e 73  |.llg:.. CASE s.s|
000031b0  67 3a 0a 09 20 20 20 20  52 65 61 64 4e 28 29 0a  |g:..    ReadN().|
000031c0  09 20 43 41 53 45 20 73  2e 74 72 75 65 3a 20 43  |. CASE s.true: C|
000031d0  41 53 45 20 73 2e 66 61  6c 73 65 3a 20 43 41 53  |ASE s.false: CAS|
000031e0  45 20 73 2e 6e 69 6c 3a  0a 09 20 69 6e 63 73 73  |E s.nil:.. incss|
000031f0  70 3a 0a 09 20 20 20 20  73 73 70 20 3a 3d 20 73  |p:..    ssp := s|
00003200  73 70 2b 31 3b 0a 09 20  20 20 20 49 46 20 73 73  |sp+1;..    IF ss|
00003210  70 3e 73 74 61 63 6b 66  72 61 6d 65 20 54 48 45  |p>stackframe THE|
00003220  4e 20 73 74 61 63 6b 66  72 61 6d 65 20 3a 3d 20  |N stackframe := |
00003230  73 73 70 3b 0a 09 20 20  20 20 45 4e 44 43 41 53  |ssp;..    ENDCAS|
00003240  45 0a 0a 09 20 43 41 53  45 20 73 2e 6d 75 6c 74  |E... CASE s.mult|
00003250  3a 20 43 41 53 45 20 73  2e 64 69 76 3a 20 43 41  |: CASE s.div: CA|
00003260  53 45 20 73 2e 72 65 6d  3a 0a 09 20 20 20 20 2f  |SE s.rem:..    /|
00003270  2f 20 54 68 65 73 65 20  6d 61 79 20 62 65 20 68  |/ These may be h|
00003280  61 6e 64 6c 65 64 20 62  79 20 62 72 61 6e 63 68  |andled by branch|
00003290  20 26 20 6c 69 6e 6b 20  74 6f 20 67 6c 6f 62 61  | & link to globa|
000032a0  6c 0a 09 20 20 20 20 2f  2f 20 72 6f 75 74 69 6e  |l..    // routin|
000032b0  65 73 2c 20 73 6f 20 6c  69 6e 6b 20 73 74 6f 72  |es, so link stor|
000032c0  61 67 65 20 69 73 20 6e  65 65 64 65 64 2e 0a 09  |age is needed...|
000032d0  20 20 20 20 46 6c 61 67  4c 61 62 65 6c 28 62 61  |    FlagLabel(ba|
000032e0  73 65 4c 61 62 2c 20 6c  61 62 2e 66 72 61 6d 65  |seLab, lab.frame|
000032f0  6e 65 65 64 65 64 29 3b  0a 0a 09 20 43 41 53 45  |needed);... CASE|
00003300  20 73 2e 73 74 6e 69 6c  3a 0a 09 20 43 41 53 45  | s.stnil:.. CASE|
00003310  20 73 2e 70 6c 75 73 3a  20 43 41 53 45 20 73 2e  | s.plus: CASE s.|
00003320  6d 69 6e 75 73 3a 0a 09  20 43 41 53 45 20 73 2e  |minus:.. CASE s.|
00003330  66 70 6c 75 73 3a 20 43  41 53 45 20 73 2e 66 6d  |fplus: CASE s.fm|
00003340  69 6e 75 73 3a 20 43 41  53 45 20 73 2e 66 6d 75  |inus: CASE s.fmu|
00003350  6c 74 3a 20 43 41 53 45  20 73 2e 66 64 69 76 3a  |lt: CASE s.fdiv:|
00003360  0a 09 20 43 41 53 45 20  73 2e 6c 6c 73 3a 20 43  |.. CASE s.lls: C|
00003370  41 53 45 20 73 2e 6c 67  72 3a 20 43 41 53 45 20  |ASE s.lgr: CASE |
00003380  73 2e 6c 6c 65 3a 20 43  41 53 45 20 73 2e 6c 67  |s.lle: CASE s.lg|
00003390  65 3a 0a 09 20 43 41 53  45 20 73 2e 65 71 3a 20  |e:.. CASE s.eq: |
000033a0  20 43 41 53 45 20 73 2e  6e 65 3a 20 20 43 41 53  | CASE s.ne:  CAS|
000033b0  45 20 73 2e 6c 73 3a 0a  09 20 43 41 53 45 20 73  |E s.ls:.. CASE s|
000033c0  2e 67 72 3a 20 20 43 41  53 45 20 73 2e 6c 65 3a  |.gr:  CASE s.le:|
000033d0  20 20 43 41 53 45 20 73  2e 67 65 3a 0a 09 20 43  |  CASE s.ge:.. C|
000033e0  41 53 45 20 73 2e 66 65  71 3a 20 43 41 53 45 20  |ASE s.feq: CASE |
000033f0  73 2e 66 6e 65 3a 20 43  41 53 45 20 73 2e 66 6c  |s.fne: CASE s.fl|
00003400  73 3a 0a 09 20 43 41 53  45 20 73 2e 66 67 72 3a  |s:.. CASE s.fgr:|
00003410  20 43 41 53 45 20 73 2e  66 6c 65 3a 20 43 41 53  | CASE s.fle: CAS|
00003420  45 20 73 2e 66 67 65 3a  0a 09 20 43 41 53 45 20  |E s.fge:.. CASE |
00003430  73 2e 6c 73 68 69 66 74  3a 20 43 41 53 45 20 73  |s.lshift: CASE s|
00003440  2e 72 73 68 69 66 74 3a  0a 09 20 43 41 53 45 20  |.rshift:.. CASE |
00003450  73 2e 6c 6f 67 61 6e 64  3a 20 43 41 53 45 20 73  |s.logand: CASE s|
00003460  2e 6c 6f 67 6f 72 3a 20  43 41 53 45 20 73 2e 65  |.logor: CASE s.e|
00003470  71 76 3a 20 43 41 53 45  20 73 2e 6e 65 71 76 3a  |qv: CASE s.neqv:|
00003480  0a 09 20 43 41 53 45 20  73 2e 73 74 76 63 61 72  |.. CASE s.stvcar|
00003490  3a 20 43 41 53 45 20 73  2e 73 74 76 63 64 72 3a  |: CASE s.stvcdr:|
000034a0  20 43 41 53 45 20 73 2e  73 74 63 61 72 3a 20 43  | CASE s.stcar: C|
000034b0  41 53 45 20 73 2e 73 74  63 64 72 3a 0a 09 20 43  |ASE s.stcdr:.. C|
000034c0  41 53 45 20 73 2e 6d 6f  64 3a 20 43 41 53 45 20  |ASE s.mod: CASE |
000034d0  73 2e 6d 6f 64 73 6c 63  74 3a 0a 09 20 43 41 53  |s.modslct:.. CAS|
000034e0  45 20 73 2e 67 65 74 62  79 74 65 3a 0a 09 20 20  |E s.getbyte:..  |
000034f0  20 20 73 73 70 20 3a 3d  20 73 73 70 2d 31 3b 0a  |  ssp := ssp-1;.|
00003500  09 20 20 20 20 45 4e 44  43 41 53 45 0a 0a 09 20  |.    ENDCASE... |
00003510  43 41 53 45 20 73 2e 73  6c 63 74 73 74 3a 0a 09  |CASE s.slctst:..|
00003520  20 20 20 20 52 65 61 64  4e 28 29 3b 20 52 65 61  |    ReadN(); Rea|
00003530  64 4e 28 29 3b 20 52 65  61 64 4e 28 29 3b 0a 09  |dN(); ReadN();..|
00003540  20 43 41 53 45 20 73 2e  73 74 69 6e 64 3a 20 43  | CASE s.stind: C|
00003550  41 53 45 20 73 2e 70 75  74 62 79 74 65 3a 0a 09  |ASE s.putbyte:..|
00003560  20 20 20 20 73 73 70 20  3a 3d 20 73 73 70 2d 32  |    ssp := ssp-2|
00003570  3b 0a 09 20 20 20 20 45  4e 44 43 41 53 45 0a 0a  |;..    ENDCASE..|
00003580  09 20 43 41 53 45 20 73  2e 73 6c 63 74 61 70 3a  |. CASE s.slctap:|
00003590  0a 09 20 20 20 20 52 65  61 64 4e 28 29 3b 0a 0a  |..    ReadN();..|
000035a0  09 20 43 41 53 45 20 73  2e 64 74 61 62 3a 0a 09  |. CASE s.dtab:..|
000035b0  20 20 20 20 52 65 61 64  4e 28 29 3b 0a 0a 09 20  |    ReadN();... |
000035c0  43 41 53 45 20 73 2e 6c  69 6e 65 63 6f 75 6e 74  |CASE s.linecount|
000035d0  3a 0a 09 20 43 41 53 45  20 73 2e 61 72 67 6e 6f  |:.. CASE s.argno|
000035e0  3a 0a 09 20 43 41 53 45  20 73 2e 64 61 74 61 6c  |:.. CASE s.datal|
000035f0  61 62 3a 0a 09 20 43 41  53 45 20 73 2e 69 74 65  |ab:.. CASE s.ite|
00003600  6d 6e 3a 20 43 41 53 45  20 73 2e 69 74 65 6d 6c  |mn: CASE s.iteml|
00003610  3a 0a 09 20 20 20 20 52  65 61 64 4e 28 29 3b 0a  |:..    ReadN();.|
00003620  09 20 20 20 20 45 4e 44  43 41 53 45 0a 0a 09 20  |.    ENDCASE... |
00003630  43 41 53 45 20 73 2e 64  73 74 72 3a 0a 09 20 43  |CASE s.dstr:.. C|
00003640  41 53 45 20 73 2e 64 65  66 65 78 74 3a 0a 09 20  |ASE s.defext:.. |
00003650  43 41 53 45 20 73 2e 72  65 66 65 78 74 3a 0a 09  |CASE s.refext:..|
00003660  20 20 20 20 52 65 61 64  4e 28 29 3b 0a 09 20 43  |    ReadN();.. C|
00003670  41 53 45 20 73 2e 73 65  63 74 69 6f 6e 3a 20 43  |ASE s.section: C|
00003680  41 53 45 20 73 2e 6e 65  65 64 73 3a 0a 09 20 20  |ASE s.needs:..  |
00003690  20 20 44 69 73 63 61 72  64 4e 28 52 65 61 64 4e  |  DiscardN(ReadN|
000036a0  28 29 29 3b 0a 09 20 20  20 20 45 4e 44 43 41 53  |());..    ENDCAS|
000036b0  45 0a 0a 09 20 43 41 53  45 20 73 2e 6c 73 74 72  |E... CASE s.lstr|
000036c0  3a 0a 09 20 20 20 20 44  69 73 63 61 72 64 4e 28  |:..    DiscardN(|
000036d0  52 65 61 64 4e 28 29 29  3b 0a 09 20 20 20 20 49  |ReadN());..    I|
000036e0  46 20 28 43 47 4f 70 74  4d 6f 64 65 26 6f 70 2e  |F (CGOptMode&op.|
000036f0  73 74 72 69 6e 67 73 29  3d 30 20 54 48 45 4e 0a  |strings)=0 THEN.|
00003700  09 20 20 20 20 20 20 20  46 6c 61 67 4c 61 62 65  |.       FlagLabe|
00003710  6c 28 62 61 73 65 4c 61  62 2c 20 6c 61 62 2e 66  |l(baseLab, lab.f|
00003720  72 61 6d 65 6e 65 65 64  65 64 2b 6c 61 62 2e 70  |rameneeded+lab.p|
00003730  72 6f 63 73 74 61 74 69  63 73 29 3b 0a 09 20 20  |rocstatics);..  |
00003740  20 20 47 4f 54 4f 20 69  6e 63 73 73 70 0a 0a 09  |  GOTO incssp...|
00003750  20 43 41 53 45 20 73 2e  73 61 76 65 3a 0a 09 20  | CASE s.save:.. |
00003760  20 20 20 73 74 61 63 6b  46 72 61 6d 65 20 3a 3d  |   stackFrame :=|
00003770  20 52 65 61 64 4e 28 29  3b 0a 09 20 20 20 20 49  | ReadN();..    I|
00003780  46 20 73 74 61 63 6b 46  72 61 6d 65 3e 53 61 76  |F stackFrame>Sav|
00003790  65 53 70 61 63 65 53 69  7a 65 2b 34 20 54 48 45  |eSpaceSize+4 THE|
000037a0  4e 0a 09 20 20 20 20 20  20 20 46 6c 61 67 4c 61  |N..       FlagLa|
000037b0  62 65 6c 28 62 61 73 65  4c 61 62 2c 20 6c 61 62  |bel(baseLab, lab|
000037c0  2e 66 72 61 6d 65 6e 65  65 64 65 64 29 3b 0a 09  |.frameneeded);..|
000037d0  20 20 20 20 45 4e 44 43  41 53 45 0a 0a 09 20 43  |    ENDCASE... C|
000037e0  41 53 45 20 73 2e 72 73  74 61 63 6b 3a 20 43 41  |ASE s.rstack: CA|
000037f0  53 45 20 73 2e 73 74 61  63 6b 3a 0a 09 20 20 20  |SE s.stack:..   |
00003800  20 73 73 70 20 3a 3d 20  52 65 61 64 4e 28 29 3b  | ssp := ReadN();|
00003810  0a 09 20 20 20 20 49 46  20 73 73 70 3e 73 74 61  |..    IF ssp>sta|
00003820  63 6b 46 72 61 6d 65 20  54 48 45 4e 20 73 74 61  |ckFrame THEN sta|
00003830  63 6b 46 72 61 6d 65 20  3a 3d 20 73 73 70 3b 0a  |ckFrame := ssp;.|
00003840  09 20 20 20 20 45 4e 44  43 41 53 45 0a 0a 09 20  |.    ENDCASE... |
00003850  43 41 53 45 20 73 2e 6c  70 3a 0a 09 20 20 20 20  |CASE s.lp:..    |
00003860  7b 20 20 4c 45 54 20 6e  20 3d 20 52 65 61 64 4e  |{  LET n = ReadN|
00003870  28 29 3b 0a 09 20 20 20  20 20 20 20 49 46 20 6e  |();..       IF n|
00003880  3e 73 74 61 63 6b 46 72  61 6d 65 20 54 48 45 4e  |>stackFrame THEN|
00003890  20 73 74 61 63 6b 46 72  61 6d 65 20 3a 3d 20 6e  | stackFrame := n|
000038a0  0a 09 20 20 20 20 20 20  20 47 4f 54 4f 20 69 6e  |..       GOTO in|
000038b0  63 73 73 70 0a 09 20 20  20 20 7d 3b 0a 0a 09 20  |cssp..    };... |
000038c0  43 41 53 45 20 73 2e 73  70 3a 0a 09 20 20 20 20  |CASE s.sp:..    |
000038d0  7b 20 20 4c 45 54 20 6e  20 3d 20 52 65 61 64 4e  |{  LET n = ReadN|
000038e0  28 29 3b 0a 09 20 20 20  20 20 20 20 49 46 20 6e  |();..       IF n|
000038f0  3e 73 74 61 63 6b 46 72  61 6d 65 20 54 48 45 4e  |>stackFrame THEN|
00003900  20 73 74 61 63 6b 46 72  61 6d 65 20 3a 3d 20 6e  | stackFrame := n|
00003910  0a 09 20 20 20 20 20 20  20 73 73 70 20 3a 3d 20  |..       ssp := |
00003920  73 73 70 2d 31 3b 0a 09  20 20 20 20 20 20 20 45  |ssp-1;..       E|
00003930  4e 44 43 41 53 45 0a 09  20 20 20 20 7d 3b 0a 0a  |NDCASE..    };..|
00003940  09 20 43 41 53 45 20 73  2e 66 6e 61 70 3a 20 43  |. CASE s.fnap: C|
00003950  41 53 45 20 73 2e 72 74  61 70 3a 0a 09 20 20 20  |ASE s.rtap:..   |
00003960  20 7b 20 20 4c 45 54 20  6f 6c 64 73 73 70 20 3d  | {  LET oldssp =|
00003970  20 73 73 70 3b 0a 09 20  20 20 20 20 20 20 73 73  | ssp;..       ss|
00003980  70 20 3a 3d 20 52 65 61  64 4e 28 29 3b 0a 09 20  |p := ReadN();.. |
00003990  20 20 20 20 20 20 7b 20  20 6f 70 20 3a 3d 20 52  |      {  op := R|
000039a0  65 61 64 4f 70 28 29 3b  0a 09 09 20 20 49 46 20  |eadOp();...  IF |
000039b0  6f 70 7e 3d 73 2e 73 74  61 63 6b 20 26 20 6f 70  |op~=s.stack & op|
000039c0  7e 3d 73 2e 72 73 74 61  63 6b 20 54 48 45 4e 20  |~=s.rstack THEN |
000039d0  42 52 45 41 4b 3b 0a 09  09 20 20 52 65 61 64 4e  |BREAK;...  ReadN|
000039e0  28 29 0a 09 20 20 20 20  20 20 20 7d 20 52 45 50  |()..       } REP|
000039f0  45 41 54 3b 0a 09 20 20  20 20 20 20 20 2f 2f 20  |EAT;..       // |
00003a00  45 78 69 74 20 63 61 6c  6c 73 20 61 72 65 20 4f  |Exit calls are O|
00003a10  4b 0a 09 20 20 20 20 20  20 20 49 46 20 28 7e 5b  |K..       IF (~[|
00003a20  28 6f 70 3d 73 2e 72 65  73 20 7c 20 6f 70 3d 73  |(op=s.res | op=s|
00003a30  2e 6a 75 6d 70 20 7c 20  6f 70 3d 73 2e 6c 61 62  |.jump | op=s.lab|
00003a40  29 20 26 0a 09 09 20 20  20 20 54 72 61 6e 73 66  |) &...    Transf|
00003a50  65 72 72 65 64 4c 61 62  65 6c 28 50 65 65 6b 4e  |erredLabel(PeekN|
00003a60  28 29 29 3d 30 5d 20 26  0a 09 09 20 20 20 7e 5b  |())=0] &...   ~[|
00003a70  6f 70 3d 73 2e 72 74 72  6e 20 7c 20 6f 70 3d 73  |op=s.rtrn | op=s|
00003a80  2e 66 6e 72 6e 5d 29 20  7c 0a 09 20 20 20 20 20  |.fnrn]) |..     |
00003a90  20 20 2f 2f 20 75 6e 6c  65 73 73 20 74 68 65 79  |  // unless they|
00003aa0  20 68 61 76 65 20 6d 6f  72 65 20 74 68 61 6e 20  | have more than |
00003ab0  66 6f 75 72 20 61 72 67  75 6d 65 6e 74 73 0a 09  |four arguments..|
00003ac0  09 20 20 6f 6c 64 73 73  70 2d 73 73 70 2d 73 61  |.  oldssp-ssp-sa|
00003ad0  76 65 53 70 61 63 65 53  69 7a 65 3e 35 20 2f 2f  |veSpaceSize>5 //|
00003ae0  20 6f 6e 65 20 66 6f 72  20 74 68 65 20 70 72 6f  | one for the pro|
00003af0  63 65 64 75 72 65 20 63  61 6c 6c 65 64 0a 09 20  |cedure called.. |
00003b00  20 20 20 20 20 20 54 48  45 4e 20 46 6c 61 67 4c  |      THEN FlagL|
00003b10  61 62 65 6c 28 62 61 73  65 4c 61 62 2c 20 6c 61  |abel(baseLab, la|
00003b20  62 2e 66 72 61 6d 65 6e  65 65 64 65 64 29 3b 0a  |b.frameneeded);.|
00003b30  0a 09 20 20 20 20 2f 2f  20 77 68 65 74 68 65 72  |..    // whether|
00003b40  20 74 68 69 73 20 69 73  20 61 6e 20 65 78 69 74  | this is an exit|
00003b50  20 63 61 6c 6c 20 6f 72  20 6e 6f 74 2c 20 69 74  | call or not, it|
00003b60  20 6d 61 79 20 6e 65 65  64 20 61 72 67 75 6d 65  | may need argume|
00003b70  6e 74 73 0a 09 20 20 20  20 2f 2f 20 6c 6f 61 64  |nts..    // load|
00003b80  69 6e 67 2e 20 28 49 74  27 73 20 6e 6f 74 20 65  |ing. (It's not e|
00003b90  61 73 79 20 74 6f 20 64  65 74 65 63 74 20 61 20  |asy to detect a |
00003ba0  63 61 6c 6c 20 77 69 74  68 20 6e 6f 6e 65 29 0a  |call with none).|
00003bb0  09 20 20 20 20 20 20 20  46 6c 61 67 4c 61 62 65  |.       FlagLabe|
00003bc0  6c 28 62 61 73 65 4c 61  62 2c 20 6c 61 62 2e 70  |l(baseLab, lab.p|
00003bd0  72 6f 63 68 61 73 63 61  6c 6c 73 29 3b 0a 09 20  |rochascalls);.. |
00003be0  20 20 20 20 20 20 4c 4f  4f 50 20 7d 0a 0a 09 20  |      LOOP }... |
00003bf0  43 41 53 45 20 73 2e 6c  6c 3a 0a 09 20 20 20 20  |CASE s.ll:..    |
00003c00  7b 20 20 4c 45 54 20 6c  20 3d 20 52 65 61 64 4e  |{  LET l = ReadN|
00003c10  28 29 3b 0a 09 20 20 20  20 20 20 20 4c 45 54 20  |();..       LET |
00003c20  6e 20 3d 20 3f 3b 0a 09  20 20 20 20 20 20 20 6e  |n = ?;..       n|
00003c30  20 3a 3d 20 50 65 65 6b  4e 28 29 3b 0a 09 20 20  | := PeekN();..  |
00003c40  20 20 20 20 20 54 45 53  54 20 6e 3d 73 2e 72 74  |     TEST n=s.rt|
00003c50  61 70 20 7c 20 6e 3d 73  2e 66 6e 61 70 20 54 48  |ap | n=s.fnap TH|
00003c60  45 4e 20 7b 0a 09 09 20  20 46 6c 61 67 4c 61 62  |EN {...  FlagLab|
00003c70  65 6c 28 6c 2c 20 6c 61  62 2e 63 61 6c 6c 65 64  |el(l, lab.called|
00003c80  29 3b 0a 09 09 20 20 49  46 20 4c 61 62 65 6c 46  |);...  IF LabelF|
00003c90  6c 61 67 67 65 64 28 6c  2c 20 6c 61 62 2e 6c 76  |lagged(l, lab.lv|
00003ca0  74 61 6b 65 6e 2b 6c 61  62 2e 73 74 6f 72 65 64  |taken+lab.stored|
00003cb0  29 20 54 48 45 4e 0a 09  09 20 20 20 20 20 46 6c  |) THEN...     Fl|
00003cc0  61 67 4c 61 62 65 6c 28  62 61 73 65 4c 61 62 2c  |agLabel(baseLab,|
00003cd0  20 6c 61 62 2e 66 72 61  6d 65 6e 65 65 64 65 64  | lab.frameneeded|
00003ce0  2b 6c 61 62 2e 70 72 6f  63 73 74 61 74 69 63 73  |+lab.procstatics|
00003cf0  29 20 7d 0a 09 20 20 20  20 20 20 20 45 4c 53 45  |) }..       ELSE|
00003d00  0a 09 09 20 20 46 6c 61  67 4c 61 62 65 6c 28 62  |...  FlagLabel(b|
00003d10  61 73 65 4c 61 62 2c 20  6c 61 62 2e 66 72 61 6d  |aseLab, lab.fram|
00003d20  65 6e 65 65 64 65 64 2b  6c 61 62 2e 70 72 6f 63  |eneeded+lab.proc|
00003d30  73 74 61 74 69 63 73 29  3b 0a 09 20 20 20 20 20  |statics);..     |
00003d40  20 20 47 4f 54 4f 20 69  6e 63 73 73 70 0a 09 20  |  GOTO incssp.. |
00003d50  20 20 20 7d 0a 0a 09 20  43 41 53 45 20 73 2e 6c  |   }... CASE s.l|
00003d60  6c 70 3a 0a 09 20 20 20  20 52 65 61 64 4e 28 29  |lp:..    ReadN()|
00003d70  3b 0a 09 20 20 20 20 46  6c 61 67 4c 61 62 65 6c  |;..    FlagLabel|
00003d80  28 62 61 73 65 4c 61 62  2c 20 6c 61 62 2e 6c 76  |(baseLab, lab.lv|
00003d90  70 74 61 6b 65 6e 29 3b  0a 09 20 20 20 20 46 6c  |ptaken);..    Fl|
00003da0  61 67 4c 61 62 65 6c 28  62 61 73 65 4c 61 62 2c  |agLabel(baseLab,|
00003db0  20 6c 61 62 2e 66 72 61  6d 65 6e 65 65 64 65 64  | lab.frameneeded|
00003dc0  29 3b 20 20 2f 2f 20 74  65 6d 70 6f 72 61 72 79  |);  // temporary|
00003dd0  20 65 78 70 65 64 69 65  6e 74 0a 09 20 20 20 20  | expedient..    |
00003de0  47 4f 54 4f 20 69 6e 63  73 73 70 0a 0a 09 20 43  |GOTO incssp... C|
00003df0  41 53 45 20 73 2e 6c 6c  6c 3a 0a 09 20 20 20 20  |ASE s.lll:..    |
00003e00  52 65 61 64 4e 28 29 3b  0a 09 20 20 20 20 46 6c  |ReadN();..    Fl|
00003e10  61 67 4c 61 62 65 6c 28  62 61 73 65 4c 61 62 2c  |agLabel(baseLab,|
00003e20  20 6c 61 62 2e 66 72 61  6d 65 6e 65 65 64 65 64  | lab.frameneeded|
00003e30  2b 6c 61 62 2e 70 72 6f  63 73 74 61 74 69 63 73  |+lab.procstatics|
00003e40  29 3b 0a 09 20 20 20 20  47 4f 54 4f 20 69 6e 63  |);..    GOTO inc|
00003e50  73 73 70 0a 0a 09 20 43  41 53 45 20 73 2e 73 6c  |ssp... CASE s.sl|
00003e60  3a 0a 09 20 20 20 20 52  65 61 64 4e 28 29 3b 0a  |:..    ReadN();.|
00003e70  09 20 20 20 20 46 6c 61  67 4c 61 62 65 6c 28 62  |.    FlagLabel(b|
00003e80  61 73 65 4c 61 62 2c 20  6c 61 62 2e 66 72 61 6d  |aseLab, lab.fram|
00003e90  65 6e 65 65 64 65 64 2b  6c 61 62 2e 70 72 6f 63  |eneeded+lab.proc|
00003ea0  73 74 61 74 69 63 73 29  3b 0a 09 20 20 20 20 73  |statics);..    s|
00003eb0  73 70 20 3a 3d 20 73 73  70 2d 31 3b 0a 09 20 20  |sp := ssp-1;..  |
00003ec0  20 20 45 4e 44 43 41 53  45 0a 0a 09 20 43 41 53  |  ENDCASE... CAS|
00003ed0  45 20 73 2e 6a 74 3a 20  43 41 53 45 20 73 2e 6a  |E s.jt: CASE s.j|
00003ee0  66 3a 0a 09 20 43 41 53  45 20 73 2e 65 6e 64 66  |f:.. CASE s.endf|
00003ef0  6f 72 3a 0a 09 20 20 20  20 73 73 70 20 3a 3d 20  |or:..    ssp := |
00003f00  73 73 70 2d 31 3b 0a 09  20 43 41 53 45 20 73 2e  |ssp-1;.. CASE s.|
00003f10  6a 75 6d 70 3a 0a 09 20  20 20 20 50 72 65 4a 75  |jump:..    PreJu|
00003f20  6d 70 28 52 65 61 64 4e  28 29 29 3b 0a 09 20 20  |mp(ReadN());..  |
00003f30  20 20 45 4e 44 43 41 53  45 0a 0a 09 20 43 41 53  |  ENDCASE... CAS|
00003f40  45 20 73 2e 72 65 73 3a  0a 09 20 20 20 20 7b 20  |E s.res:..    { |
00003f50  20 4c 45 54 20 6c 61 62  20 3d 20 52 65 61 64 4e  | LET lab = ReadN|
00003f60  28 29 3b 0a 09 20 20 20  20 2f 2f 20 74 68 69 73  |();..    // this|
00003f70  20 69 73 20 6f 66 20 63  6f 75 72 73 65 20 73 74  | is of course st|
00003f80  72 69 63 74 6c 79 20 61  20 6c 69 65 2e 20 20 57  |rictly a lie.  W|
00003f90  68 61 74 20 69 74 20 6d  65 61 6e 73 0a 09 20 20  |hat it means..  |
00003fa0  20 20 2f 2f 20 69 73 20  74 68 61 74 20 61 20 66  |  // is that a f|
00003fb0  69 78 65 64 20 72 65 67  69 73 74 65 72 20 69 73  |ixed register is|
00003fc0  20 67 6f 69 6e 67 20 74  6f 20 62 65 20 75 73 65  | going to be use|
00003fd0  64 2c 20 73 6f 0a 09 20  20 20 20 2f 2f 20 6d 79  |d, so..    // my|
00003fe0  20 73 69 6d 70 6c 65 2d  6d 69 6e 64 65 64 20 72  | simple-minded r|
00003ff0  65 67 69 73 74 65 72 20  61 73 73 69 67 6e 6d 65  |egister assignme|
00004000  6e 74 20 69 73 20 6f 75  74 2e 0a 09 20 20 20 20  |nt is out...    |
00004010  20 20 20 49 46 20 54 72  61 6e 73 66 65 72 72 65  |   IF Transferre|
00004020  64 4c 61 62 65 6c 28 6c  61 62 29 7e 3d 30 0a 09  |dLabel(lab)~=0..|
00004030  09 20 20 54 48 45 4e 20  46 6c 61 67 4c 61 62 65  |.  THEN FlagLabe|
00004040  6c 28 62 61 73 65 4c 61  62 2c 20 6c 61 62 2e 70  |l(baseLab, lab.p|
00004050  72 6f 63 68 61 73 63 61  6c 6c 73 29 3b 0a 09 20  |rochascalls);.. |
00004060  20 20 20 20 20 20 50 72  65 4a 75 6d 70 28 6c 61  |      PreJump(la|
00004070  62 29 3b 0a 09 20 20 20  20 20 20 20 45 4e 44 43  |b);..       ENDC|
00004080  41 53 45 20 7d 0a 0a 09  20 43 41 53 45 20 73 2e  |ASE }... CASE s.|
00004090  67 6f 74 6f 3a 0a 09 20  20 20 20 73 73 70 20 3a  |goto:..    ssp :|
000040a0  3d 20 73 73 70 2d 31 3b  0a 09 20 20 20 20 45 4e  |= ssp-1;..    EN|
000040b0  44 43 41 53 45 0a 0a 09  20 43 41 53 45 20 73 2e  |DCASE... CASE s.|
000040c0  6c 61 62 3a 0a 09 20 20  20 20 7b 20 20 4c 45 54  |lab:..    {  LET|
000040d0  20 6c 61 62 20 3d 20 52  65 61 64 4e 28 29 3b 0a  | lab = ReadN();.|
000040e0  09 20 20 20 20 20 20 20  46 6c 61 67 4c 61 62 65  |.       FlagLabe|
000040f0  6c 28 6c 61 62 2c 20 6c  61 62 2e 64 65 66 69 6e  |l(lab, lab.defin|
00004100  65 64 29 3b 0a 09 20 20  20 20 20 20 20 49 46 20  |ed);..       IF |
00004110  4c 61 62 65 6c 46 6c 61  67 67 65 64 28 6c 61 62  |LabelFlagged(lab|
00004120  2c 20 6c 61 62 2e 70 72  6f 63 6f 72 6c 61 62 65  |, lab.procorlabe|
00004130  6c 29 20 54 48 45 4e 0a  09 09 20 20 46 6c 61 67  |l) THEN...  Flag|
00004140  4c 61 62 65 6c 28 62 61  73 65 6c 61 62 2c 20 6c  |Label(baselab, l|
00004150  61 62 2e 6c 76 70 74 61  6b 65 6e 2b 6c 61 62 2e  |ab.lvptaken+lab.|
00004160  66 72 61 6d 65 6e 65 65  64 65 64 29 3b 0a 09 20  |frameneeded);.. |
00004170  20 20 20 20 20 20 2f 2a  20 54 68 61 74 20 77 61  |      /* That wa|
00004180  73 20 74 6f 20 64 69 73  61 62 6c 65 20 65 78 69  |s to disable exi|
00004190  74 20 63 61 6c 6c 73 20  66 72 6f 6d 20 61 20 70  |t calls from a p|
000041a0  72 6f 63 65 64 75 72 65  0a 09 09 20 20 63 6f 6e  |rocedure...  con|
000041b0  74 61 69 6e 69 6e 67 20  61 20 28 73 6f 75 72 63  |taining a (sourc|
000041c0  65 29 20 6c 61 62 65 6c  2c 20 69 6e 20 63 61 73  |e) label, in cas|
000041d0  65 20 61 20 63 61 6c 6c  65 64 0a 09 09 20 20 70  |e a called...  p|
000041e0  72 6f 63 65 64 75 72 65  20 74 72 69 65 64 20 74  |rocedure tried t|
000041f0  6f 20 6c 6f 6e 67 6a 75  6d 70 20 74 6f 20 74 68  |o longjump to th|
00004200  69 73 20 6f 6e 65 2e 20  20 28 52 65 61 6c 6c 79  |is one.  (Really|
00004210  2c 0a 09 09 20 20 74 68  69 73 20 63 68 65 63 6b  |,...  this check|
00004220  20 73 68 6f 75 6c 64 20  62 65 20 6f 6e 20 63 61  | should be on ca|
00004230  6c 6c 73 20 6f 66 20 4c  65 76 65 6c 2c 20 62 75  |lls of Level, bu|
00004240  74 20 49 20 63 61 6e 27  74 0a 09 09 20 20 73 65  |t I can't...  se|
00004250  65 20 74 68 65 6d 29 0a  09 20 20 20 20 20 20 20  |e them)..       |
00004260  2a 2f 0a 09 20 20 20 20  20 20 20 45 4e 44 43 41  |*/..       ENDCA|
00004270  53 45 20 7d 0a 0a 09 20  43 41 53 45 20 73 2e 65  |SE }... CASE s.e|
00004280  6e 74 72 79 3a 0a 09 20  20 20 20 7b 20 20 4c 45  |ntry:..    {  LE|
00004290  54 20 6e 20 3d 20 52 65  61 64 4e 28 29 3b 0a 09  |T n = ReadN();..|
000042a0  20 20 20 20 20 20 20 62  61 73 65 21 30 20 3a 3d  |       base!0 :=|
000042b0  20 62 61 73 65 4c 61 62  3b 0a 09 20 20 20 20 20  | baseLab;..     |
000042c0  20 20 62 61 73 65 20 3a  3d 20 62 61 73 65 2b 31  |  base := base+1|
000042d0  3b 0a 09 20 20 20 20 20  20 20 62 61 73 65 4c 61  |;..       baseLa|
000042e0  62 20 3a 3d 20 52 65 61  64 4e 28 29 3b 0a 09 20  |b := ReadN();.. |
000042f0  20 20 20 20 20 20 44 69  73 63 61 72 64 4e 28 6e  |      DiscardN(n|
00004300  29 3b 0a 09 20 20 20 20  20 20 20 73 74 61 63 6b  |);..       stack|
00004310  46 72 61 6d 65 20 3a 3d  20 73 61 76 65 53 70 61  |Frame := saveSpa|
00004320  63 65 53 69 7a 65 3b 0a  09 20 20 20 20 20 20 20  |ceSize;..       |
00004330  45 4e 44 43 41 53 45 20  7d 0a 0a 09 20 43 41 53  |ENDCASE }... CAS|
00004340  45 20 73 2e 65 6e 64 70  72 6f 63 3a 0a 09 20 20  |E s.endproc:..  |
00004350  20 20 49 46 20 73 74 61  63 6b 46 72 61 6d 65 3e  |  IF stackFrame>|
00004360  4d 61 78 53 74 61 74 69  63 46 72 61 6d 65 2b 73  |MaxStaticFrame+s|
00004370  61 76 65 53 70 61 63 65  53 69 7a 65 2d 34 0a 09  |aveSpaceSize-4..|
00004380  20 20 20 20 20 20 20 54  48 45 4e 20 46 6c 61 67  |       THEN Flag|
00004390  4c 61 62 65 6c 28 62 61  73 65 4c 61 62 2c 20 6c  |Label(baseLab, l|
000043a0  61 62 2e 66 72 61 6d 65  6e 65 65 64 65 64 29 3b  |ab.frameneeded);|
000043b0  0a 09 20 20 20 20 62 61  73 65 20 3a 3d 20 62 61  |..    base := ba|
000043c0  73 65 2d 31 3b 0a 09 20  20 20 20 62 61 73 65 4c  |se-1;..    baseL|
000043d0  61 62 20 3a 3d 20 62 61  73 65 21 30 3b 0a 09 20  |ab := base!0;.. |
000043e0  43 41 53 45 20 73 2e 65  6e 64 62 6c 6f 63 6b 3a  |CASE s.endblock:|
000043f0  0a 09 20 20 20 20 49 67  6e 6f 72 65 4e 61 6d 65  |..    IgnoreName|
00004400  73 28 29 3b 0a 09 20 20  20 20 45 4e 44 43 41 53  |s();..    ENDCAS|
00004410  45 0a 0a 09 20 43 41 53  45 20 73 2e 73 77 69 74  |E... CASE s.swit|
00004420  63 68 6f 6e 3a 0a 09 20  20 20 20 7b 20 20 4c 45  |chon:..    {  LE|
00004430  54 20 6e 20 3d 20 52 65  61 64 4e 28 29 3b 0a 09  |T n = ReadN();..|
00004440  20 20 20 20 20 20 20 50  72 65 4a 75 6d 70 28 52  |       PreJump(R|
00004450  65 61 64 4e 28 29 29 3b  0a 09 20 20 20 20 20 20  |eadN());..      |
00004460  20 46 4f 52 20 69 20 3d  20 31 20 54 4f 20 6e 20  | FOR i = 1 TO n |
00004470  44 4f 0a 09 20 20 20 20  20 20 20 7b 20 20 52 65  |DO..       {  Re|
00004480  61 64 4e 28 29 3b 0a 09  09 20 20 50 72 65 4a 75  |adN();...  PreJu|
00004490  6d 70 28 52 65 61 64 4e  28 29 29 20 7d 3b 0a 09  |mp(ReadN()) };..|
000044a0  20 20 20 20 20 20 20 45  4e 44 43 41 53 45 20 7d  |       ENDCASE }|
000044b0  0a 0a 09 20 43 41 53 45  20 73 2e 67 6c 6f 62 61  |... CASE s.globa|
000044c0  6c 3a 0a 09 20 20 20 20  52 45 54 55 52 4e 0a 20  |l:..    RETURN. |
000044d0  20 20 20 20 20 7d 3b 0a  20 20 20 20 20 20 6f 70  |     };.      op|
000044e0  20 3a 3d 20 52 65 61 64  4f 70 28 29 0a 20 20 20  | := ReadOp().   |
000044f0  7d 20 52 45 50 45 41 54  0a 7d 73 0a 0a 41 4e 44  |} REPEAT.}s..AND|
00004500  20 52 65 61 64 53 74 72  69 6e 67 28 6e 29 20 3d  | ReadString(n) =|
00004510  20 56 41 4c 4f 46 20 7b  0a 20 20 20 4c 45 54 20  | VALOF {.   LET |
00004520  77 20 3d 20 56 45 43 20  32 35 36 3b 0a 20 20 20  |w = VEC 256;.   |
00004530  77 25 30 20 3a 3d 20 6e  3b 0a 20 20 20 46 4f 52  |w%0 := n;.   FOR|
00004540  20 69 20 3d 20 31 20 54  4f 20 6e 20 44 4f 20 77  | i = 1 TO n DO w|
00004550  25 69 20 3a 3d 20 52 65  61 64 4e 28 29 3b 0a 20  |%i := ReadN();. |
00004560  20 20 52 45 53 55 4c 54  49 53 20 49 6e 74 65 72  |  RESULTIS Inter|
00004570  6e 53 74 72 69 6e 67 28  77 29 20 7d 0a           |nString(w) }.|
0000457d