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

BCPL/b/cgf

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/cgf
Read OK:
File size: 58EF bytes
Load address: 0000
Exec address: 0000
File contents
SECTION "CGF"

GET "b.CGheader"

STATIC {
  // Version of 23 Nov 86 16:04:04
   dummy = VersionMark;
   version = 1*256+7 };

/*
*/

STATIC {
   staticDataLoc = 0;
   relocatedLocs = 0;
   relocateReferences = FALSE;
   xRelocatedLocs = 0;
   xSymbols = 0;
   xSymNo = 0;
   currentArea = 0;
   caRec = 0; daRec = 0;
   dataArea = 0 };

MANIFEST {
   CodeArea = 0 };

MANIFEST {
   sll.loc = 1; sll.reg = 2; sll.offset = 3;
   sll.size = 4 };

MANIFEST {
   a.locC=0; a.reloc=1; a.xreloc=2; a.sbv=3;
   a.size=4 };

MANIFEST {
   sym.next = 0;
   sym.str = 1;
   sym.attr = 2;
   sym.no = 3
   sym.id = 4;
   sym.val = 5;
   sym.size = 6 };

LET PutWord(word) BE
{  IF (CGDebugMode&db.tracepw)~=0 THEN
      WriteF("pw %x4 %x8*n", locCtr, word);
   WriteWord(locCtr, word);
   locCtr := locCtr+4 }

AND PutString(s, maxlen) BE
{  LET w = 0;
   LET l = s%0;
   LET wp = 0;
   FOR i = 1 TO maxlen DO {
      IF i<=l THEN (@w)%wp := s%i;
      TEST wp=3 THEN {
	 PutWord(w); w, wp := 0, 0 }
      ELSE
	 wp := wp+1 } }

AND AddressInCode(label, offset) BE
{  LET labelValue = ?;
   label := TransferredLabel(label);
   IF label=0 THEN label := exitLab;
   labelValue := ValueOfLabel(label);
   TEST labelValue=Null THEN {
      AddRef(locCtr, 0, label);
      PutWord(-offset) }
   ELSE
      PutWord(labelValue-offset) }

AND ReadWord(loc) = VALOF
{  LET o = ?;
   LET b = FindStoreBlock(loc, @o);
   RESULTIS b!o }

AND WriteWord(loc, word) BE
{  LET o = ?;
   LET b = FindStoreBlock(loc, @o);
   b!o := word }


AND FindStoreBlock(loc, lv.o) = VALOF
{  LET b = loc>>StoreBlockShift;
   LET v = ?;

   !lv.o := (loc & StoreBlockMask)>>2;

   IF b>=StoreBlockVSize THEN
      CGError(TRUE, "program too large (exceeds %N bytes)",
		StoreBlockVSize * StoreBlockSize * bytesperword);

   v := StoreBlockV!b;

   IF v=0 THEN {
      v := GetVector(StoreBlockSize);
      StoreBlockV!b := v };

   RESULTIS v }

AND FlagLabel(lab, flag) BE
{  LET p = FindLabelEntry(lab);
   !p := !p | flag }

AND LabelFlagged(lab, flag) = VALOF
{  LET p = FindLabelEntry(lab);
   RESULTIS ((!p) & flag)~=0 }

AND FindLabelEntry(lab) = VALOF
{  LET b = lab>>LabelBlockShift
   LET o = lab&LabelBlockMask
   LET v = ?

   IF b>=LabelBlockVSize THEN
     CGError(TRUE, "label too large (exceeds %N)",
		   last.label.number)

   v := LabelBlockV!b
   IF v=0 THEN {
      v := GetVector(LabelBlocksize);
      LabelBlockV!b := v;
      FOR j = 0 TO LabelBlockSize-1 DO v!j := 0 }

   RESULTIS v+o }

AND ValueOfLabel(lab) = VALOF
{  LET pointerToLabel = FindLabelEntry(lab);
   LET val = !pointerToLabel;
   RESULTIS (val&lab.set)~=0 -> val & (lab.value-lab.area),
				Null }

AND AreaOfLabel(lab) = VALOF
{  LET pointerToLabel = FindLabelEntry(lab);
   LET val = !pointerToLabel;
   RESULTIS (val&lab.set)~=0 -> val & lab.area,
				Null }

AND LabelWithValue(n, lab) = VALOF
{  IF n=0 THEN RESULTIS Null;

   WHILE lab<=last.label.number DO {
      LET v = labelBlockV!(lab>>LabelBlockShift);
      LET o = lab&LabelBlockMask

      TEST v=0
	 THEN lab := lab+LabelBlockSize
      ELSE TEST ((v!o)&lab.set)~=0 & ((v!o)&lab.value)=n
	 THEN RESULTIS lab
	 ELSE lab := lab+1 };
   RESULTIS Null }

AND RelocationForLoc(n) = Assoc(n, 1, XRelocatedLocs)

AND SymbolOfReloc(n) = VALOF {
   LET p = Assoc((2!n)&#xffff, sym.no, XSymbols);
   IF p=Null THEN RESULTIS Null;
   RESULTIS sym.id!p }

AND RealSetLabel(lab) BE
{  LET pointerToLabel = FindLabelEntry(lab);
   LET oldval = !pointerToLabel;
   LET val = locCtr;

   !pointerToLabel := ((oldval & ~lab.value)+val) | lab.set | currentArea;
   TEST (oldval&lab.set)~=0 THEN
      CGError(FALSE, "Label %n set twice, at %x6, old value %x6",
		     lab, val, oldval&lab.value)
   ELSE IF (oldval&lab.value)~=0 THEN {
      oldval := oldval & lab.value;
      WHILE oldval~=0 DO {
	 LET o = ?;
	 LET loc = oldval!RefLoc;
	 LET a = currentArea;
	 LET xx = SetArea(loc&lab.area);
	 LET block = FindStoreBlock(loc, @o);
	 LET word = block!o;
	 LET base = (word>>16)&15;

	 SWITCHON oldval!reftype INTO {
	    CASE 0:
	       block!o := word+val;
	       IF relocateReferences
		  THEN AddRelocatedLoc(loc, lab);
	       ENDCASE

	    CASE 1:
	    {  LET offset = RotateRight(word&255, (word>>7)&30);
	       LET n = base=r.pc ->	  loc+8,
		       staticDataLoc=0 -> ValueOfLabel(SLab)+4*SAddr,
					  staticDataLoc;
	       LET shiftit = FALSE;
	       offset := offset+val-n;
	       IF offset<0 THEN
		  word, offset := word+f.sub-f.add, -offset;
	       IF (base=r.pc | ~aofOut) & ~EightBitsOrFewer(offset) THEN {
		  LET r = word&#xf000;
		  LET m = word&#xf0000000;
		  LET x = m+f.mov+r+(r>>12)+sh.lsr+256;
		  LET next = ReadWord(loc+4);
		  IF next=x THEN {
		     block!o := m+f.mov+r+base+sh.lsr+256;
		     loc := loc+4;
		     block := FindStoreBlock(loc, @o)
		     offset := offset-4;
		     word := (word&#xfff0ffff)+(r<<4);
		     shiftit := TRUE };
		  WHILE ~EightBitsOrFewer(offset) DO {
		     next := ReadWord(loc+4);
		     IF BranchInst(next) |
			(next&#xf0000000)~=m |
			UsesOrUpdatesReg(next, r) THEN BREAK;
		     loc := loc+4;
		     offset := offset-4;
		     block!o := next;
		     block := FindStoreBlock(loc, @o) } };
	       TEST ~EightBitsOrFewer(offset) THEN
		  CGError(FALSE, "%x6: F1 offset %x8 out of range",
			  loc, offset)
	       ELSE {
		  IF shiftit THEN offset := offset>>2;
		  word := (word&#xfffff000)+PackUp(offset) }
	       block!o := word;
	       ENDCASE }

	    CASE 2:
	    {  LET n = base=r.pc -> loc+8,
		 staticDataLoc=0 -> ValueOfLabel(SLab)+4*SAddr,
				    staticDataLoc;
	       n := (word&#xfff)+val-n;
	       IF n<0 THEN {
		  n := -n;
		  word := word NEQV f.up };
	       IF ~(0<=n<=f2.max.offset) THEN {
		  CGError(FALSE, "Resolve reference: offset %x6 at %x6",
				 n, oldVal!RefLoc);
		  n := 0 };
	       block!o := (word&#xfffff000)+(n&#xfff);
	       ENDCASE }

	    CASE 6:
	    {  LET n = base=r.pc -> loc+8,
		 staticDataLoc=0 -> ValueOfLabel(SLab)+4*SAddr,
				    staticDataLoc;
	       n := (word&#xff)*BytesPerWord+val-n;
	       IF n<0 THEN {
		  n := -n;
		  word := word NEQV f.up };
	       n := n/BytesPerWord;
	       IF ~(0<=n<=255) THEN {
		  CGError(FALSE, "Resolve reference: offset %x6 at %x6",
				 n, oldVal!RefLoc);
		  n := 0 };
	       block!o := (word&#xffffff00)+(n&#xff);
	       ENDCASE }

	    CASE 5:
	       block!o := (word&#xff000000)+
			  ((word+(val>>2))&#xffffff);
	       ENDCASE

	    DEFAULT:
	       CGError(FALSE, "Bad reference type %N",
			      oldval!RefType) };
	 SetArea(a);
	 oldval := FreeBlk(oldval, RefSize) } } }

AND BranchInst(i) =
   (i&#x0f000000)=#x0f000000 -> TRUE,	 // SWI
   (i&#x0e000000)=#x0a000000 -> TRUE,	 // BR, BL
   (i&#x0e000000)=#x08000000 &
   ((i&#x00108000)=#x00108000) -> TRUE,  // LDM loading pc
   (i&#x0c10f000)=#x0410f000 -> TRUE,	 // LDR pc, ...
   (i&#x0c00f000)=#x0000f000 -> TRUE,	 // f1, dest pc
				FALSE

AND UsesOrUpdatesReg(i, r) = VALOF
{  LET ix = i & #x0e000000;
   TEST (i>>16)=r THEN
      RESULTIS TRUE
   ELSE TEST ix=#x08000000 THEN
      TEST (i&(1<<r))~=0 THEN
	 RESULTIS TRUE
      ELSE
	 RESULTIS FALSE
   ELSE TEST (i>>12)=r THEN
      RESULTIS TRUE
   ELSE TEST (ix=0 | ix=#x06000000) & (i&15)=r THEN
      RESULTIS TRUE
   ELSE
      RESULTIS FALSE }

AND AddRef(loc, type, lab) BE
{  LET pointerToLabel = FindLabelEntry(lab);
   LET val = !pointerToLabel;
   TEST (val&lab.set)~=0 THEN
      CGError(FALSE, "adding reference to set label %n (value %n)",
	       lab, val)
   ELSE {
      LET refp = FillBlk(RefSize, val & lab.value, type, loc+currentArea);
      !pointerToLabel := (val & ~lab.value) + refp } }

AND GetArea() = VALOF {
   LET a = GetVector(a.size);
   LET v = GetVector(StoreBlockVSize);
   FOR i = 0 TO StoreBlockVSize-1 DO v!i := 0;
   a!a.locC, a!a.reloc, a!a.xreloc := 0, 0, 0;
   a!a.sbv := v;
   RESULTIS a }

AND SetArea(a) BE IF a~=currentArea THEN {
   LET old, new = ?, ?;
   TEST a=CodeArea THEN
      old, new := daRec, caRec
   ELSE
      old, new := caRec, daRec;
   old!a.locC, old!a.reloc, old!a.xreloc :=
      locCtr, relocatedLocs, xRelocatedLocs;
   locCtr, relocatedLocs, xRelocatedLocs :=
      new!a.locC, new!a.reloc, new!a.xreloc;
   storeBlockV := new!a.sbv;
   currentArea := a }


AND InitDataLists() BE
{  freeDataBlocks := 0;
   FdataList := GetDataBlock(); Fdatap, Faddr := FdataList, 0;
   SdataList, Saddr := 0, 0;
   DataList := GetDataBlock(); Datap := DataList;
   relocatedLocs := 0; relocateReferences := FALSE;
   staticDataLoc := 0;
   pendingLoads, pendingStores := 0, 0;
   savedStates := 0;
   dedicatedRegisters := 0;
   localConstants := GetDataBlock();
   localConstP := localConstants;
   localFAddr := 0;
   RLLoadList := 0;
   xSymbols := 0;
   xRelocatedLocs := 0;
   xSymNo := 4;
   currentArea := 0;
   dataArea := 0;
   caRec := GetArea();
   IF aofOut THEN {
      dataArea := 1;
      daRec := GetArea() };
   storeBlockV := caRec!a.sbv }

AND GetDataBlock() = VALOF
{  LET v = ?;
   TEST freeDataBlocks=0 THEN
      v := GetVector(DataBlockSize)
   ELSE {
      v := freeDataBlocks;
      freeDataBlocks := !freeDataBlocks };
   v!NextBlock, v!EndOfDataInBlock := 0, DataBlockItems-1
   RESULTIS v }

AND AddData(lvdp, n, d1, d2, d3) BE
{  LET p = !lvdp;
   LET i = p!EndOfDataInBlock;
   LET dp = @n;
   IF (i+n)>=DataBlockSize THEN {
      LET newp = GetDataBlock();
      !lvdp, p!NextBlock := newp, newp;
      i := DataBlockItems-1;
      p := newp };
   FOR j = 1 TO n DO {
      i := i+1;
      p!i := dp!j };
   p!EndOfDataInBlock := i }

AND FData(n) = VALOF
{  LET i, p, q = 0, ?, ?;
   TEST usesRL
      THEN p, q := FdataList, @FDataP
      ELSE p, q := localConstants, @localConstP;

   WHILE p~=0 DO {
      FOR j = DataBlockItems TO p!EndOfDataInBlock DO {
	 IF n=p!j THEN RESULTIS i;
	 i := i+4 };
      p := p!NextBlock };
   AddData(q, 1, n);
   {  LET n = ?;
      TEST usesRL THEN {
	 n := Faddr;
	 Faddr := Faddr+4 }
      ELSE {
	 n := localFaddr;
	 localFaddr := localFaddr+4 };
      RESULTIS n } }

AND Sdata(n) BE
   TEST usesRL THEN
      CGError(FALSE, "SData should not be callable")
   ELSE
      AddData(@localConstP, 1, n)

AND Data(n1, n2) BE AddData(@DataP, 2, n1, n2)

AND CGString(n, label) BE
{  LET v = VEC 256/BytesPerWord;
   LET i = 1;
   LET size = n/4;
   v%0 := n;
   FOR i = 1 TO n DO v%i := ReadN();
   FOR i = n+1 TO n+3 DO v%i := 0;

   TEST usesRL | label~=0 THEN {
      LET b = GetBlk(DataBlockItems+size+1);
      !b := SDataList;
      SDataList := b;
      b!EndOfDataInBlock := size+DataBlockItems;
      FOR i = 0 TO size DO b!(i+DataBlockItems) := v!i;
      SAddr := SAddr+size+1;
      TEST label=0 THEN
	 Load(k.lvstatic, -SAddr)
      ELSE
	 staticLabels :=
	    FillBlk(4, staticLabels, label, Null, -4*SAddr) }
   ELSE {
      Load(k.lvlab, localConstLab);
      h4!arg1 := localFaddr/4;
      FOR i = 0 TO size DO {
	 SData(v!i);
	 localFaddr := localFaddr+4 } } }

AND GenData(d) BE
   WHILE d~=0 DO {
      FOR p = DataBlockItems TO d!EndOfDataInBlock DO
	 PutWord(d!p);
      d := d!NextBlock }

AND AddRelocatedLoc(loc, lab) BE
   relocatedLocs := FillBlk(RefSize, relocatedLocs, loc, lab)

AND AddXRelocatedLoc(loc, xsym, reftype) BE
   xrelocatedLocs := FillBlk(RefSize, xRelocatedLocs, loc, xsym!sym.no+reftype)

AND AddXSymbol(id, type, value) = VALOF
{  LET p = xSymbols;
   LET q = @xSymbols;
   WHILE p~=0 DO {
      IF CompString(id, sym.id!p)=0 THEN {
	 IF type~=0 THEN sym.attr!p, sym.val!p := type, value;
	 RESULTIS p };
      q := p;
      p := !p };
   !q := FillBlk(sym.size, 0, 0, type, xSymNo, InternString(id), value);
   xSymNo := xSymNo+1;
   RESULTIS !q }

AND InternString(string) = VALOF
{  LET n = (string%0+1)/BytesPerWord;
   LET s = GetBlk(n+1);
   FOR i = 0 TO n DO s!i := string!i;
   RESULTIS s }

AND GenXSym(name, label) BE {
   LET w = VEC 256/BytesPerWord;
   LET k = sectionName%0;
   LET k1 = name%0;
   FOR i = 1 TO k DO w%i := sectionName%i;
   k := k+1;
   w%k := '.';
   FOR i = 1 TO k1 DO w%(k+i) := name%i;
   w%0 := k+k1;
   SetLabel(label);
   AddXSymbol(w, 1, label) }

AND CGGlobal(n) BE
{  LET ldmtype = reversedStack | saveSpaceSize=3 -> upStack,
						    upStack+f.pre;
   deadCode := Alive;
   IF (![FindLabelEntry(callLab)] & lab.value)~=0 THEN {
      GenXSym("_Call", callLab);
      GenRR(f.mov, r.pc, 0, r.b) };

   IF (![FindLabelEntry(exitCallLab)] & lab.value)~=0 THEN {
      GenXSym("_ExitCall", exitCallLab);
      GenRR(f.mov, r.ts, 0, r.p);
      F4Inst(f.ldm, r.ts, f4.pl14, ldmtype);
      GenRR(f.mov, r.pc, 0, r.b) };

   IF (![FindLabelEntry(exitLab)] & lab.value)~=0 THEN {
      GenXSym("_Exit", exitLab);
      GenRR(f.mov, r.ts, 0, r.p);
      F4Inst(f.ldm, r.ts, f4.plpc, ldmtype+f.pc) };

   IF (![FindLabelEntry(multLab)] & lab.value)~=0 THEN {
      GenXSym("_Multiply", multLab);
      SetRtoRplusK(r.pc, r.gb, sr.multiply) };

   IF (![FindLabelEntry(quotLab)] & lab.value)~=0 THEN {
      GenXSym("_QuotRem", quotLab);
      SetRtoRplusK(r.pc, r.gb, sr.quotrem) };

   deadCode := Dead;
   SetArea(dataArea);
   SetLabel(SLab);
   GenData(SDataList);
   relocateReferences := TRUE;
   SetLabel(staticDataLab);
   relocateReferences := FALSE;
   staticDataLoc := locCtr;
   {  LET d = DataList;
      WHILE d~=0 DO {
	 FOR p = DataBlockItems TO d!EndOfDataInBlock BY 2 DO {
	    LET n = d!(p+1);
	    SWITCHON d!p INTO {
	       CASE s.datalab:
		  SetLabel(n); ENDCASE

	       CASE s.itemn:
		  PutWord(n); ENDCASE

	       CASE s.iteml:
		  AddRelocatedLoc(locCtr, n);
		  AddressInCode(n, 0);
		  ENDCASE

	       CASE s.itemx:
		  AddXRelocatedLoc(locCtr, AddXSymbol(n, 0, 0), RelWord+RelSymbol);
		  PutWord(0) } };
	 d := d!NextBlock } };
   SetLabel(FLab);
   GenData(FDataList);

   SetArea(CodeArea);
   SetLabel(endSectLabel);
   FOR i = 1 TO n DO {
      LET l = ?;
      PutWord(ReadGN());
      l := ReadL();
      AddRelocatedLoc(locCtr, l);
      AddressInCode(l, 0) };
   PutWord(MaxGn);
   PutWord(0);
   IF ~aofOut THEN
   {  LET setToPCplus = m.always+f.add+#x2000000+(r.pc<<16);
      WHILE RLLoadList~=0 DO {
	 LET loc = 1!RLLoadList;
	 LET offset = staticDataLoc-loc-8;
	 LET rl = ReadWord(loc)&#xf000;
	 TEST EightBitsOrFewer(offset) THEN
	    WriteWord(loc, setToPCplus+rl+PackUp(offset))
	 ELSE IF EightBitsOrFewer(offset+4) THEN {
	    LET w = ReadWord(loc-4);
	    WriteWord(loc-4, setToPCplus+rl+PackUp(offset+4));
	    WriteWord(loc, w) };
	 RLLoadList := FreeBlk(RLLoadList, 2) } } }

AND PrintingCharacter(n) = #x20<=n<#x7f

AND PrintHexAndChars(loc, n, fnname) BE
{  WriteF(" & &%x8", n);
   StartComment();
   WriteF("%x4  ", loc);
   IF ~fnname & (n&#xff000000)~=#xff000000
      THEN FOR i = 0 TO 3 DO {
	 LET c = [n>>(i*8)] & 255;
	 WrCh(c<32 | c>=127 -> '.', c) };
   NewLine() }

AND PrintSizes(sofar) = VALOF {
   TEST aofOut THEN {
      WriteF("s %n+%n", carec!a.locC, darec!a.locC);
      sofar := sofar+carec!a.locC+darec!a.locC }
   ELSE {
      WriteF(" %n", locctr);
      sofar := sofar+LocCtr }
   WriteS(" bytes");
   RESULTIS sofar }

AND PrintWords(end, lines, thisArea) BE {
   LET fnname = FALSE;
   LET notInst = FALSE;
   FOR loc = 0 TO locCtr-4 BY 4 DO {
      LET n = ReadWord(loc);
      LET x = n&#xffff0000;
      LET lab = 0;
      LET line = Assoc(loc, 2, lineCounts);
      IF line~=Null & lines THEN WriteF("; -- Line %n --*n", 1!line);
      {  lab := LabelWithValue(loc+thisArea, lab+1);
	 IF lab=Null THEN BREAK;
	 WriteF("L%n*n", lab);
	 {  LET p = Assoc(lab, 5, xSymbols);
	    IF p~=Null THEN WriteF("|%s|*n", p!4) };
	 notInst := LabelFlagged(lab, lab.endproclab) } REPEAT;

      TEST loc<40 | loc>=end | x=0 | x=#xffff0000 | fnname THEN {
	 LET p = Assoc(loc, 1, relocatedLocs);
	 TEST p~=Null THEN {
	    WriteF(" & L%n", TransferredLabel(2!p));
	    StartComment();
	    WriteF("%x4  %x8*n", loc, n) }
	 ELSE {
	    p := Assoc(loc, 1, XRelocatedLocs);
	    TEST p~=Null THEN {
	       WriteS(" & ");
	       IF n~=0 THEN WriteF("%n+", n);
	       WriteF("|%s|", SymbolOfReloc(p));
	       StartComment();
	       WriteF("%x4*n", loc) }
	    ELSE
	       PrintHexAndChars(loc, n, fnname) };

	 fnname := FALSE }

      ELSE TEST (@n)%0=7 & PrintingCharacter((@n)%1) &
			   PrintingCharacter((@n)%2) &
			   PrintingCharacter((@n)%3) THEN {
	 LET v = VEC 1;
	 v!0 := n;
	 v!1 := ReadWord(loc+4);
	 fnname := TRUE;
	 WriteF(" & &%x8    ; %s", n, v);
	 StartComment();
	 WriteF("%x4*n", loc);
	 notInst := FALSE }

      ELSE TEST notInst THEN
	 PrintHexAndChars(loc, n, FALSE)
      ELSE
	 PrintInstruction(loc, n) } }

AND CGEnd() BE
{  IF ListStream~=0 THEN {
      LET o = Output();

      SelectOutput(listStream);
      InitialiseDisassembler(TRUE);
      TEST aofOut THEN {
	 SetArea(codeArea);
	 WriteS(" AREA |BCPL$$Code|, CODE, READONLY*n*n");
	 PrintWords(ValueOfLabel(endSectlabel), TRUE, CodeArea)
	 WriteS("*n AREA |BCPL$$Data|*n*n");
	 SetArea(dataArea);
	 PrintWords(0, FALSE, dataArea) }
      ELSE
	 PrintWords(ValueOfLabel(slab), TRUE, 0);

      WriteS(" END*N");
      TerminateDisassembler();
      SelectOutput(o) };

   OutputSection() }

AND WriteTable(t) BE
{  LET i = 0;
   {  LET w = t!i;
      IF w=-1 THEN RETURN
      BinWord(t!i);
      i := i+1 } REPEAT }

AND WriteObjString(s) = VALOF
{  LET n = s%0;
   LET nn = (n+4)&-4;
   FOR i = 1 TO n DO OutByte(s%i);
   FOR i = n+1 TO nn DO OutByte(0);
   RESULTIS nn }

AND OutputSection() BE IF moduleStream~=0 THEN
{  LET o = output();
   SelectOutput(moduleStream);
   TEST AOFout THEN {
      MANIFEST {  // description of chunk file header
	 AreaChunkPosn = 11;
	 StringTablePosn = 15;
	 SymbolTablePosn = 19;

	 ChunkStart = 2;
	 ChunkLength = 3;

	 // description of header chunk
	 HCnSym = 3;
	 AreaPosn = 6;
	 AreaLength = 2;
	 AreaRelocs = 3;

	 AAAbs = #x100;
	 AACode = #x200;
	 AACommon = #x400;
	 AANoInit = #x1000;
	 AAReadOnly = #x2000;
	 AAPositionIndependent = #x4000;

	 SymName = 0;
	 SymAttributes = 1;
	 SymValue = 2;
	 SymArea = 3;
	 SymSize = 4 };

      LET RoundUp(n) = (n+4) & -4

      LET objFileHeader = TABLE
	 #xc3cbc6c5,	// "I am a chunk file"
	 7,		// max number of chunks
	 5,		// number used

	 'O'+('B'<<8)+('J'<<16)+('_'<<24),
	 'H'+('E'<<8)+('A'<<16)+('D'<<24),
	 #x7C,		// file position
	 24+2*20,	// length

	 'O'+('B'<<8)+('J'<<16)+('_'<<24),
	 'I'+('D'<<8)+('F'<<16)+('N'<<24),
	 #x7C+24+2*20,
	 20,

	 'O'+('B'<<8)+('J'<<16)+('_'<<24),
	 'A'+('R'<<8)+('E'<<16)+('A'<<24),
	 #x7C+24+2*20+20,
	 0,

	 'O'+('B'<<8)+('J'<<16)+('_'<<24),
	 'S'+('T'<<8)+('R'<<16)+('T'<<24),
	 #x7C+24+2*20+20,
	 0,

	 'O'+('B'<<8)+('J'<<16)+('_'<<24),
	 'S'+('Y'<<8)+('M'<<16)+('T'<<24),
	 #x7C+24+2*20+20,
	 0,

	 0,0,0,0,
	 0,0,0,0,

	 -1;

      LET headerChunk = TABLE
	 #xC5E2D080,	// magic 'I am a module' marker
	 110,		// version of object format
	 2,		// area count
	 0,		// number of symbols
	 0,		// entry area
	 0,		// entry offset

	 0,		// code area name
	 AACode+AAReadOnly+2,	   // code : word aligned
	 0,		// length: locCtr
	 0,		// relocations: LengthOfList(relocatedLocs)
	 0,		// base

	 12,		// data area name
	 2,		// data: word aligned
	 0,		// length: locCtr
	 0,		// relocations: LengthOfList(relocatedLocs)
	 0,		// base

	 -1;

      LET standardSyms = TABLE
	 0, SADefined+SAGlobal, 0, 0,
	 1, SADefined+SAGlobal+SAAbs, 0, 0,
	 2, SADefined+SAGlobal, 0, 12,
	 3, SADefined+SAGlobal+SAAbs, 0, 0,
	 -1;

      LET areaSyms = TABLE 0, 12;

      LET cLocCtr = locCtr;
      LET nRelocs = LengthOfList(relocatedLocs)+LengthOfList(xRelocatedLocs);
      LET codeAreaLength = locCtr+nRelocs*8;
      LET dLocCtr = daRec!a.locC;
      LET ndRelocs = LengthOfList(daRec!a.reloc)+LengthOfList(daRec!a.xreloc);
      LET dataAreaLength = dLocCtr+8*ndRelocs;
      LET filepos = objFileHeader!(AreaChunkPosn+ChunkStart)
      LET strTabLen = 24;   // for the area names
      strTabLen := strTabLen+2*RoundUp(sectionName%0+3)+2*RoundUp(sectionName%0+4);
      {  LET p = xSymbols;
	 WHILE p~=0 DO {
	    strTabLen := strTabLen+RoundUp((sym.id!p)%0);
	    p := !p } };
      objFileHeader!(AreaChunkPosn+ChunkLength) := codeAreaLength+dataAreaLength;
      filepos := filepos+codeAreaLength+dataAreaLength;
      objFileHeader!(StringTablePosn+ChunkStart) := filepos;
      objFileHeader!(StringTablePosn+ChunkLength) := strTabLen;
      objFileHeader!(SymbolTablePosn+ChunkStart) := filepos+strTabLen;
      objFileHeader!(SymbolTablePosn+ChunkLength) := xSymNo*(4*SymSize);

      headerChunk!(AreaPosn+AreaLength) := locCtr;
      headerChunk!(AreaPosn+AreaRelocs) := nRelocs;
      headerChunk!(AreaPosn+5+AreaLength) := dLocCtr;
      headerChunk!(AreaPosn+5+AreaRelocs) := ndRelocs;
      headerChunk!HCnSym := xSymNo;

      WriteTable(objFileHeader);
      WriteTable(headerChunk);
      WriteObjString(StringF("BCPL version %n.%n", CGMajorVersion, CGMinorVersion));

      OutArea(codeArea);
      OutArea(dataArea);

      {  // The string table
	 LET stPos = WriteObjString("BCPL$$Code");
	 stPos := stPos+WriteObjString("BCPL$$Data");
	 standardSyms!(SymName+0*SymSize) := stPos;
	 stPos := stPos+WriteObjString(StringF("%s.C$", sectionName));
	 standardSyms!(SymName+1*SymSize) := stPos;
	 stPos := stPos+WriteObjString(StringF("%s.CS$", sectionName));
	 standardSyms!(SymName+2*SymSize) := stPos;
	 stPos := stPos+WriteObjString(StringF("%s.D$", sectionName));
	 standardSyms!(SymName+3*SymSize) := stPos;
	 stPos := stPos+WriteObjString(StringF("%s.DS$", sectionName));
	 {  LET p = xSymbols;
	    WHILE p~=0 DO {
	       sym.str!p := stPos;
	       stPos := stPos+WriteObjString(sym.id!p);
	       p := !p } };

	 // The symbol table
	 standardSyms!(SymValue+1*SymSize) := cLocCtr;
	 standardSyms!(SymValue+3*SymSize) := dLocCtr;
	 WriteTable(standardSyms)
	 {  LET p = xSymbols;
	    WHILE p~=0 DO {
	       BinWord(sym.str!p);
	       BinWord(sym.attr!p);
	       TEST (sym.attr!p&SADefined)~=0 THEN {
		  BinWord(ValueOfLabel(sym.val!p));
		  BinWord(AreaSyms![AreaOfLabel(sym.val!p)]) }
	       ELSE {
		  BinWord(0); BinWord(0) };
	       p := !p } } } }

   ELSE {
      FOR loc = 0 TO locCtr-4 BY 4
	 DO BinWord(ReadWord(loc));
      BinWord(#x12345678);
      {  LET r = relocatedLocs;
	 WHILE r~=0 DO {
	    BinWord(1!r);
	    r := !r } };
      BinWord(#x87654321) };

   SelectOutput(o) }

AND OutArea(area) BE {
   SetArea(area);
   FOR loc = 0 TO locCtr-4 BY 4
      DO BinWord(ReadWord(loc));

   {  LET r = relocatedLocs;
      WHILE r~=0 DO {
	 BinWord(1!r);
	 TEST AreaOfLabel(2!r)=area THEN
	    BinWord(RelWord)  // additive, internal, word
	 ELSE
	    BinWord(RelWord+RelSymbol+(area=0 -> 2,0));
	 r := !r };
      r := xRelocatedLocs;
      WHILE r~=0 DO {
	 BinWord(1!r);
	 BinWord(2!r);
	 r := !r } } }


AND OutByte(byte) BE BinWrCh(byte)

AND BinWord(word) BE
   FOR i = 0 TO 24 BY 8
      DO OutByte((word>>i) & 255)
00000000  53 45 43 54 49 4f 4e 20  22 43 47 46 22 0a 0a 47  |SECTION "CGF"..G|
00000010  45 54 20 22 62 2e 43 47  68 65 61 64 65 72 22 0a  |ET "b.CGheader".|
00000020  0a 53 54 41 54 49 43 20  7b 0a 20 20 2f 2f 20 56  |.STATIC {.  // V|
00000030  65 72 73 69 6f 6e 20 6f  66 20 32 33 20 4e 6f 76  |ersion of 23 Nov|
00000040  20 38 36 20 31 36 3a 30  34 3a 30 34 0a 20 20 20  | 86 16:04:04.   |
00000050  64 75 6d 6d 79 20 3d 20  56 65 72 73 69 6f 6e 4d  |dummy = VersionM|
00000060  61 72 6b 3b 0a 20 20 20  76 65 72 73 69 6f 6e 20  |ark;.   version |
00000070  3d 20 31 2a 32 35 36 2b  37 20 7d 3b 0a 0a 2f 2a  |= 1*256+7 };../*|
00000080  0a 2a 2f 0a 0a 53 54 41  54 49 43 20 7b 0a 20 20  |.*/..STATIC {.  |
00000090  20 73 74 61 74 69 63 44  61 74 61 4c 6f 63 20 3d  | staticDataLoc =|
000000a0  20 30 3b 0a 20 20 20 72  65 6c 6f 63 61 74 65 64  | 0;.   relocated|
000000b0  4c 6f 63 73 20 3d 20 30  3b 0a 20 20 20 72 65 6c  |Locs = 0;.   rel|
000000c0  6f 63 61 74 65 52 65 66  65 72 65 6e 63 65 73 20  |ocateReferences |
000000d0  3d 20 46 41 4c 53 45 3b  0a 20 20 20 78 52 65 6c  |= FALSE;.   xRel|
000000e0  6f 63 61 74 65 64 4c 6f  63 73 20 3d 20 30 3b 0a  |ocatedLocs = 0;.|
000000f0  20 20 20 78 53 79 6d 62  6f 6c 73 20 3d 20 30 3b  |   xSymbols = 0;|
00000100  0a 20 20 20 78 53 79 6d  4e 6f 20 3d 20 30 3b 0a  |.   xSymNo = 0;.|
00000110  20 20 20 63 75 72 72 65  6e 74 41 72 65 61 20 3d  |   currentArea =|
00000120  20 30 3b 0a 20 20 20 63  61 52 65 63 20 3d 20 30  | 0;.   caRec = 0|
00000130  3b 20 64 61 52 65 63 20  3d 20 30 3b 0a 20 20 20  |; daRec = 0;.   |
00000140  64 61 74 61 41 72 65 61  20 3d 20 30 20 7d 3b 0a  |dataArea = 0 };.|
00000150  0a 4d 41 4e 49 46 45 53  54 20 7b 0a 20 20 20 43  |.MANIFEST {.   C|
00000160  6f 64 65 41 72 65 61 20  3d 20 30 20 7d 3b 0a 0a  |odeArea = 0 };..|
00000170  4d 41 4e 49 46 45 53 54  20 7b 0a 20 20 20 73 6c  |MANIFEST {.   sl|
00000180  6c 2e 6c 6f 63 20 3d 20  31 3b 20 73 6c 6c 2e 72  |l.loc = 1; sll.r|
00000190  65 67 20 3d 20 32 3b 20  73 6c 6c 2e 6f 66 66 73  |eg = 2; sll.offs|
000001a0  65 74 20 3d 20 33 3b 0a  20 20 20 73 6c 6c 2e 73  |et = 3;.   sll.s|
000001b0  69 7a 65 20 3d 20 34 20  7d 3b 0a 0a 4d 41 4e 49  |ize = 4 };..MANI|
000001c0  46 45 53 54 20 7b 0a 20  20 20 61 2e 6c 6f 63 43  |FEST {.   a.locC|
000001d0  3d 30 3b 20 61 2e 72 65  6c 6f 63 3d 31 3b 20 61  |=0; a.reloc=1; a|
000001e0  2e 78 72 65 6c 6f 63 3d  32 3b 20 61 2e 73 62 76  |.xreloc=2; a.sbv|
000001f0  3d 33 3b 0a 20 20 20 61  2e 73 69 7a 65 3d 34 20  |=3;.   a.size=4 |
00000200  7d 3b 0a 0a 4d 41 4e 49  46 45 53 54 20 7b 0a 20  |};..MANIFEST {. |
00000210  20 20 73 79 6d 2e 6e 65  78 74 20 3d 20 30 3b 0a  |  sym.next = 0;.|
00000220  20 20 20 73 79 6d 2e 73  74 72 20 3d 20 31 3b 0a  |   sym.str = 1;.|
00000230  20 20 20 73 79 6d 2e 61  74 74 72 20 3d 20 32 3b  |   sym.attr = 2;|
00000240  0a 20 20 20 73 79 6d 2e  6e 6f 20 3d 20 33 0a 20  |.   sym.no = 3. |
00000250  20 20 73 79 6d 2e 69 64  20 3d 20 34 3b 0a 20 20  |  sym.id = 4;.  |
00000260  20 73 79 6d 2e 76 61 6c  20 3d 20 35 3b 0a 20 20  | sym.val = 5;.  |
00000270  20 73 79 6d 2e 73 69 7a  65 20 3d 20 36 20 7d 3b  | sym.size = 6 };|
00000280  0a 0a 4c 45 54 20 50 75  74 57 6f 72 64 28 77 6f  |..LET PutWord(wo|
00000290  72 64 29 20 42 45 0a 7b  20 20 49 46 20 28 43 47  |rd) BE.{  IF (CG|
000002a0  44 65 62 75 67 4d 6f 64  65 26 64 62 2e 74 72 61  |DebugMode&db.tra|
000002b0  63 65 70 77 29 7e 3d 30  20 54 48 45 4e 0a 20 20  |cepw)~=0 THEN.  |
000002c0  20 20 20 20 57 72 69 74  65 46 28 22 70 77 20 25  |    WriteF("pw %|
000002d0  78 34 20 25 78 38 2a 6e  22 2c 20 6c 6f 63 43 74  |x4 %x8*n", locCt|
000002e0  72 2c 20 77 6f 72 64 29  3b 0a 20 20 20 57 72 69  |r, word);.   Wri|
000002f0  74 65 57 6f 72 64 28 6c  6f 63 43 74 72 2c 20 77  |teWord(locCtr, w|
00000300  6f 72 64 29 3b 0a 20 20  20 6c 6f 63 43 74 72 20  |ord);.   locCtr |
00000310  3a 3d 20 6c 6f 63 43 74  72 2b 34 20 7d 0a 0a 41  |:= locCtr+4 }..A|
00000320  4e 44 20 50 75 74 53 74  72 69 6e 67 28 73 2c 20  |ND PutString(s, |
00000330  6d 61 78 6c 65 6e 29 20  42 45 0a 7b 20 20 4c 45  |maxlen) BE.{  LE|
00000340  54 20 77 20 3d 20 30 3b  0a 20 20 20 4c 45 54 20  |T w = 0;.   LET |
00000350  6c 20 3d 20 73 25 30 3b  0a 20 20 20 4c 45 54 20  |l = s%0;.   LET |
00000360  77 70 20 3d 20 30 3b 0a  20 20 20 46 4f 52 20 69  |wp = 0;.   FOR i|
00000370  20 3d 20 31 20 54 4f 20  6d 61 78 6c 65 6e 20 44  | = 1 TO maxlen D|
00000380  4f 20 7b 0a 20 20 20 20  20 20 49 46 20 69 3c 3d  |O {.      IF i<=|
00000390  6c 20 54 48 45 4e 20 28  40 77 29 25 77 70 20 3a  |l THEN (@w)%wp :|
000003a0  3d 20 73 25 69 3b 0a 20  20 20 20 20 20 54 45 53  |= s%i;.      TES|
000003b0  54 20 77 70 3d 33 20 54  48 45 4e 20 7b 0a 09 20  |T wp=3 THEN {.. |
000003c0  50 75 74 57 6f 72 64 28  77 29 3b 20 77 2c 20 77  |PutWord(w); w, w|
000003d0  70 20 3a 3d 20 30 2c 20  30 20 7d 0a 20 20 20 20  |p := 0, 0 }.    |
000003e0  20 20 45 4c 53 45 0a 09  20 77 70 20 3a 3d 20 77  |  ELSE.. wp := w|
000003f0  70 2b 31 20 7d 20 7d 0a  0a 41 4e 44 20 41 64 64  |p+1 } }..AND Add|
00000400  72 65 73 73 49 6e 43 6f  64 65 28 6c 61 62 65 6c  |ressInCode(label|
00000410  2c 20 6f 66 66 73 65 74  29 20 42 45 0a 7b 20 20  |, offset) BE.{  |
00000420  4c 45 54 20 6c 61 62 65  6c 56 61 6c 75 65 20 3d  |LET labelValue =|
00000430  20 3f 3b 0a 20 20 20 6c  61 62 65 6c 20 3a 3d 20  | ?;.   label := |
00000440  54 72 61 6e 73 66 65 72  72 65 64 4c 61 62 65 6c  |TransferredLabel|
00000450  28 6c 61 62 65 6c 29 3b  0a 20 20 20 49 46 20 6c  |(label);.   IF l|
00000460  61 62 65 6c 3d 30 20 54  48 45 4e 20 6c 61 62 65  |abel=0 THEN labe|
00000470  6c 20 3a 3d 20 65 78 69  74 4c 61 62 3b 0a 20 20  |l := exitLab;.  |
00000480  20 6c 61 62 65 6c 56 61  6c 75 65 20 3a 3d 20 56  | labelValue := V|
00000490  61 6c 75 65 4f 66 4c 61  62 65 6c 28 6c 61 62 65  |alueOfLabel(labe|
000004a0  6c 29 3b 0a 20 20 20 54  45 53 54 20 6c 61 62 65  |l);.   TEST labe|
000004b0  6c 56 61 6c 75 65 3d 4e  75 6c 6c 20 54 48 45 4e  |lValue=Null THEN|
000004c0  20 7b 0a 20 20 20 20 20  20 41 64 64 52 65 66 28  | {.      AddRef(|
000004d0  6c 6f 63 43 74 72 2c 20  30 2c 20 6c 61 62 65 6c  |locCtr, 0, label|
000004e0  29 3b 0a 20 20 20 20 20  20 50 75 74 57 6f 72 64  |);.      PutWord|
000004f0  28 2d 6f 66 66 73 65 74  29 20 7d 0a 20 20 20 45  |(-offset) }.   E|
00000500  4c 53 45 0a 20 20 20 20  20 20 50 75 74 57 6f 72  |LSE.      PutWor|
00000510  64 28 6c 61 62 65 6c 56  61 6c 75 65 2d 6f 66 66  |d(labelValue-off|
00000520  73 65 74 29 20 7d 0a 0a  41 4e 44 20 52 65 61 64  |set) }..AND Read|
00000530  57 6f 72 64 28 6c 6f 63  29 20 3d 20 56 41 4c 4f  |Word(loc) = VALO|
00000540  46 0a 7b 20 20 4c 45 54  20 6f 20 3d 20 3f 3b 0a  |F.{  LET o = ?;.|
00000550  20 20 20 4c 45 54 20 62  20 3d 20 46 69 6e 64 53  |   LET b = FindS|
00000560  74 6f 72 65 42 6c 6f 63  6b 28 6c 6f 63 2c 20 40  |toreBlock(loc, @|
00000570  6f 29 3b 0a 20 20 20 52  45 53 55 4c 54 49 53 20  |o);.   RESULTIS |
00000580  62 21 6f 20 7d 0a 0a 41  4e 44 20 57 72 69 74 65  |b!o }..AND Write|
00000590  57 6f 72 64 28 6c 6f 63  2c 20 77 6f 72 64 29 20  |Word(loc, word) |
000005a0  42 45 0a 7b 20 20 4c 45  54 20 6f 20 3d 20 3f 3b  |BE.{  LET o = ?;|
000005b0  0a 20 20 20 4c 45 54 20  62 20 3d 20 46 69 6e 64  |.   LET b = Find|
000005c0  53 74 6f 72 65 42 6c 6f  63 6b 28 6c 6f 63 2c 20  |StoreBlock(loc, |
000005d0  40 6f 29 3b 0a 20 20 20  62 21 6f 20 3a 3d 20 77  |@o);.   b!o := w|
000005e0  6f 72 64 20 7d 0a 0a 0a  41 4e 44 20 46 69 6e 64  |ord }...AND Find|
000005f0  53 74 6f 72 65 42 6c 6f  63 6b 28 6c 6f 63 2c 20  |StoreBlock(loc, |
00000600  6c 76 2e 6f 29 20 3d 20  56 41 4c 4f 46 0a 7b 20  |lv.o) = VALOF.{ |
00000610  20 4c 45 54 20 62 20 3d  20 6c 6f 63 3e 3e 53 74  | LET b = loc>>St|
00000620  6f 72 65 42 6c 6f 63 6b  53 68 69 66 74 3b 0a 20  |oreBlockShift;. |
00000630  20 20 4c 45 54 20 76 20  3d 20 3f 3b 0a 0a 20 20  |  LET v = ?;..  |
00000640  20 21 6c 76 2e 6f 20 3a  3d 20 28 6c 6f 63 20 26  | !lv.o := (loc &|
00000650  20 53 74 6f 72 65 42 6c  6f 63 6b 4d 61 73 6b 29  | StoreBlockMask)|
00000660  3e 3e 32 3b 0a 0a 20 20  20 49 46 20 62 3e 3d 53  |>>2;..   IF b>=S|
00000670  74 6f 72 65 42 6c 6f 63  6b 56 53 69 7a 65 20 54  |toreBlockVSize T|
00000680  48 45 4e 0a 20 20 20 20  20 20 43 47 45 72 72 6f  |HEN.      CGErro|
00000690  72 28 54 52 55 45 2c 20  22 70 72 6f 67 72 61 6d  |r(TRUE, "program|
000006a0  20 74 6f 6f 20 6c 61 72  67 65 20 28 65 78 63 65  | too large (exce|
000006b0  65 64 73 20 25 4e 20 62  79 74 65 73 29 22 2c 0a  |eds %N bytes)",.|
000006c0  09 09 53 74 6f 72 65 42  6c 6f 63 6b 56 53 69 7a  |..StoreBlockVSiz|
000006d0  65 20 2a 20 53 74 6f 72  65 42 6c 6f 63 6b 53 69  |e * StoreBlockSi|
000006e0  7a 65 20 2a 20 62 79 74  65 73 70 65 72 77 6f 72  |ze * bytesperwor|
000006f0  64 29 3b 0a 0a 20 20 20  76 20 3a 3d 20 53 74 6f  |d);..   v := Sto|
00000700  72 65 42 6c 6f 63 6b 56  21 62 3b 0a 0a 20 20 20  |reBlockV!b;..   |
00000710  49 46 20 76 3d 30 20 54  48 45 4e 20 7b 0a 20 20  |IF v=0 THEN {.  |
00000720  20 20 20 20 76 20 3a 3d  20 47 65 74 56 65 63 74  |    v := GetVect|
00000730  6f 72 28 53 74 6f 72 65  42 6c 6f 63 6b 53 69 7a  |or(StoreBlockSiz|
00000740  65 29 3b 0a 20 20 20 20  20 20 53 74 6f 72 65 42  |e);.      StoreB|
00000750  6c 6f 63 6b 56 21 62 20  3a 3d 20 76 20 7d 3b 0a  |lockV!b := v };.|
00000760  0a 20 20 20 52 45 53 55  4c 54 49 53 20 76 20 7d  |.   RESULTIS v }|
00000770  0a 0a 41 4e 44 20 46 6c  61 67 4c 61 62 65 6c 28  |..AND FlagLabel(|
00000780  6c 61 62 2c 20 66 6c 61  67 29 20 42 45 0a 7b 20  |lab, flag) BE.{ |
00000790  20 4c 45 54 20 70 20 3d  20 46 69 6e 64 4c 61 62  | LET p = FindLab|
000007a0  65 6c 45 6e 74 72 79 28  6c 61 62 29 3b 0a 20 20  |elEntry(lab);.  |
000007b0  20 21 70 20 3a 3d 20 21  70 20 7c 20 66 6c 61 67  | !p := !p | flag|
000007c0  20 7d 0a 0a 41 4e 44 20  4c 61 62 65 6c 46 6c 61  | }..AND LabelFla|
000007d0  67 67 65 64 28 6c 61 62  2c 20 66 6c 61 67 29 20  |gged(lab, flag) |
000007e0  3d 20 56 41 4c 4f 46 0a  7b 20 20 4c 45 54 20 70  |= VALOF.{  LET p|
000007f0  20 3d 20 46 69 6e 64 4c  61 62 65 6c 45 6e 74 72  | = FindLabelEntr|
00000800  79 28 6c 61 62 29 3b 0a  20 20 20 52 45 53 55 4c  |y(lab);.   RESUL|
00000810  54 49 53 20 28 28 21 70  29 20 26 20 66 6c 61 67  |TIS ((!p) & flag|
00000820  29 7e 3d 30 20 7d 0a 0a  41 4e 44 20 46 69 6e 64  |)~=0 }..AND Find|
00000830  4c 61 62 65 6c 45 6e 74  72 79 28 6c 61 62 29 20  |LabelEntry(lab) |
00000840  3d 20 56 41 4c 4f 46 0a  7b 20 20 4c 45 54 20 62  |= VALOF.{  LET b|
00000850  20 3d 20 6c 61 62 3e 3e  4c 61 62 65 6c 42 6c 6f  | = lab>>LabelBlo|
00000860  63 6b 53 68 69 66 74 0a  20 20 20 4c 45 54 20 6f  |ckShift.   LET o|
00000870  20 3d 20 6c 61 62 26 4c  61 62 65 6c 42 6c 6f 63  | = lab&LabelBloc|
00000880  6b 4d 61 73 6b 0a 20 20  20 4c 45 54 20 76 20 3d  |kMask.   LET v =|
00000890  20 3f 0a 0a 20 20 20 49  46 20 62 3e 3d 4c 61 62  | ?..   IF b>=Lab|
000008a0  65 6c 42 6c 6f 63 6b 56  53 69 7a 65 20 54 48 45  |elBlockVSize THE|
000008b0  4e 0a 20 20 20 20 20 43  47 45 72 72 6f 72 28 54  |N.     CGError(T|
000008c0  52 55 45 2c 20 22 6c 61  62 65 6c 20 74 6f 6f 20  |RUE, "label too |
000008d0  6c 61 72 67 65 20 28 65  78 63 65 65 64 73 20 25  |large (exceeds %|
000008e0  4e 29 22 2c 0a 09 09 20  20 20 6c 61 73 74 2e 6c  |N)",...   last.l|
000008f0  61 62 65 6c 2e 6e 75 6d  62 65 72 29 0a 0a 20 20  |abel.number)..  |
00000900  20 76 20 3a 3d 20 4c 61  62 65 6c 42 6c 6f 63 6b  | v := LabelBlock|
00000910  56 21 62 0a 20 20 20 49  46 20 76 3d 30 20 54 48  |V!b.   IF v=0 TH|
00000920  45 4e 20 7b 0a 20 20 20  20 20 20 76 20 3a 3d 20  |EN {.      v := |
00000930  47 65 74 56 65 63 74 6f  72 28 4c 61 62 65 6c 42  |GetVector(LabelB|
00000940  6c 6f 63 6b 73 69 7a 65  29 3b 0a 20 20 20 20 20  |locksize);.     |
00000950  20 4c 61 62 65 6c 42 6c  6f 63 6b 56 21 62 20 3a  | LabelBlockV!b :|
00000960  3d 20 76 3b 0a 20 20 20  20 20 20 46 4f 52 20 6a  |= v;.      FOR j|
00000970  20 3d 20 30 20 54 4f 20  4c 61 62 65 6c 42 6c 6f  | = 0 TO LabelBlo|
00000980  63 6b 53 69 7a 65 2d 31  20 44 4f 20 76 21 6a 20  |ckSize-1 DO v!j |
00000990  3a 3d 20 30 20 7d 0a 0a  20 20 20 52 45 53 55 4c  |:= 0 }..   RESUL|
000009a0  54 49 53 20 76 2b 6f 20  7d 0a 0a 41 4e 44 20 56  |TIS v+o }..AND V|
000009b0  61 6c 75 65 4f 66 4c 61  62 65 6c 28 6c 61 62 29  |alueOfLabel(lab)|
000009c0  20 3d 20 56 41 4c 4f 46  0a 7b 20 20 4c 45 54 20  | = VALOF.{  LET |
000009d0  70 6f 69 6e 74 65 72 54  6f 4c 61 62 65 6c 20 3d  |pointerToLabel =|
000009e0  20 46 69 6e 64 4c 61 62  65 6c 45 6e 74 72 79 28  | FindLabelEntry(|
000009f0  6c 61 62 29 3b 0a 20 20  20 4c 45 54 20 76 61 6c  |lab);.   LET val|
00000a00  20 3d 20 21 70 6f 69 6e  74 65 72 54 6f 4c 61 62  | = !pointerToLab|
00000a10  65 6c 3b 0a 20 20 20 52  45 53 55 4c 54 49 53 20  |el;.   RESULTIS |
00000a20  28 76 61 6c 26 6c 61 62  2e 73 65 74 29 7e 3d 30  |(val&lab.set)~=0|
00000a30  20 2d 3e 20 76 61 6c 20  26 20 28 6c 61 62 2e 76  | -> val & (lab.v|
00000a40  61 6c 75 65 2d 6c 61 62  2e 61 72 65 61 29 2c 0a  |alue-lab.area),.|
00000a50  09 09 09 09 4e 75 6c 6c  20 7d 0a 0a 41 4e 44 20  |....Null }..AND |
00000a60  41 72 65 61 4f 66 4c 61  62 65 6c 28 6c 61 62 29  |AreaOfLabel(lab)|
00000a70  20 3d 20 56 41 4c 4f 46  0a 7b 20 20 4c 45 54 20  | = VALOF.{  LET |
00000a80  70 6f 69 6e 74 65 72 54  6f 4c 61 62 65 6c 20 3d  |pointerToLabel =|
00000a90  20 46 69 6e 64 4c 61 62  65 6c 45 6e 74 72 79 28  | FindLabelEntry(|
00000aa0  6c 61 62 29 3b 0a 20 20  20 4c 45 54 20 76 61 6c  |lab);.   LET val|
00000ab0  20 3d 20 21 70 6f 69 6e  74 65 72 54 6f 4c 61 62  | = !pointerToLab|
00000ac0  65 6c 3b 0a 20 20 20 52  45 53 55 4c 54 49 53 20  |el;.   RESULTIS |
00000ad0  28 76 61 6c 26 6c 61 62  2e 73 65 74 29 7e 3d 30  |(val&lab.set)~=0|
00000ae0  20 2d 3e 20 76 61 6c 20  26 20 6c 61 62 2e 61 72  | -> val & lab.ar|
00000af0  65 61 2c 0a 09 09 09 09  4e 75 6c 6c 20 7d 0a 0a  |ea,.....Null }..|
00000b00  41 4e 44 20 4c 61 62 65  6c 57 69 74 68 56 61 6c  |AND LabelWithVal|
00000b10  75 65 28 6e 2c 20 6c 61  62 29 20 3d 20 56 41 4c  |ue(n, lab) = VAL|
00000b20  4f 46 0a 7b 20 20 49 46  20 6e 3d 30 20 54 48 45  |OF.{  IF n=0 THE|
00000b30  4e 20 52 45 53 55 4c 54  49 53 20 4e 75 6c 6c 3b  |N RESULTIS Null;|
00000b40  0a 0a 20 20 20 57 48 49  4c 45 20 6c 61 62 3c 3d  |..   WHILE lab<=|
00000b50  6c 61 73 74 2e 6c 61 62  65 6c 2e 6e 75 6d 62 65  |last.label.numbe|
00000b60  72 20 44 4f 20 7b 0a 20  20 20 20 20 20 4c 45 54  |r DO {.      LET|
00000b70  20 76 20 3d 20 6c 61 62  65 6c 42 6c 6f 63 6b 56  | v = labelBlockV|
00000b80  21 28 6c 61 62 3e 3e 4c  61 62 65 6c 42 6c 6f 63  |!(lab>>LabelBloc|
00000b90  6b 53 68 69 66 74 29 3b  0a 20 20 20 20 20 20 4c  |kShift);.      L|
00000ba0  45 54 20 6f 20 3d 20 6c  61 62 26 4c 61 62 65 6c  |ET o = lab&Label|
00000bb0  42 6c 6f 63 6b 4d 61 73  6b 0a 0a 20 20 20 20 20  |BlockMask..     |
00000bc0  20 54 45 53 54 20 76 3d  30 0a 09 20 54 48 45 4e  | TEST v=0.. THEN|
00000bd0  20 6c 61 62 20 3a 3d 20  6c 61 62 2b 4c 61 62 65  | lab := lab+Labe|
00000be0  6c 42 6c 6f 63 6b 53 69  7a 65 0a 20 20 20 20 20  |lBlockSize.     |
00000bf0  20 45 4c 53 45 20 54 45  53 54 20 28 28 76 21 6f  | ELSE TEST ((v!o|
00000c00  29 26 6c 61 62 2e 73 65  74 29 7e 3d 30 20 26 20  |)&lab.set)~=0 & |
00000c10  28 28 76 21 6f 29 26 6c  61 62 2e 76 61 6c 75 65  |((v!o)&lab.value|
00000c20  29 3d 6e 0a 09 20 54 48  45 4e 20 52 45 53 55 4c  |)=n.. THEN RESUL|
00000c30  54 49 53 20 6c 61 62 0a  09 20 45 4c 53 45 20 6c  |TIS lab.. ELSE l|
00000c40  61 62 20 3a 3d 20 6c 61  62 2b 31 20 7d 3b 0a 20  |ab := lab+1 };. |
00000c50  20 20 52 45 53 55 4c 54  49 53 20 4e 75 6c 6c 20  |  RESULTIS Null |
00000c60  7d 0a 0a 41 4e 44 20 52  65 6c 6f 63 61 74 69 6f  |}..AND Relocatio|
00000c70  6e 46 6f 72 4c 6f 63 28  6e 29 20 3d 20 41 73 73  |nForLoc(n) = Ass|
00000c80  6f 63 28 6e 2c 20 31 2c  20 58 52 65 6c 6f 63 61  |oc(n, 1, XReloca|
00000c90  74 65 64 4c 6f 63 73 29  0a 0a 41 4e 44 20 53 79  |tedLocs)..AND Sy|
00000ca0  6d 62 6f 6c 4f 66 52 65  6c 6f 63 28 6e 29 20 3d  |mbolOfReloc(n) =|
00000cb0  20 56 41 4c 4f 46 20 7b  0a 20 20 20 4c 45 54 20  | VALOF {.   LET |
00000cc0  70 20 3d 20 41 73 73 6f  63 28 28 32 21 6e 29 26  |p = Assoc((2!n)&|
00000cd0  23 78 66 66 66 66 2c 20  73 79 6d 2e 6e 6f 2c 20  |#xffff, sym.no, |
00000ce0  58 53 79 6d 62 6f 6c 73  29 3b 0a 20 20 20 49 46  |XSymbols);.   IF|
00000cf0  20 70 3d 4e 75 6c 6c 20  54 48 45 4e 20 52 45 53  | p=Null THEN RES|
00000d00  55 4c 54 49 53 20 4e 75  6c 6c 3b 0a 20 20 20 52  |ULTIS Null;.   R|
00000d10  45 53 55 4c 54 49 53 20  73 79 6d 2e 69 64 21 70  |ESULTIS sym.id!p|
00000d20  20 7d 0a 0a 41 4e 44 20  52 65 61 6c 53 65 74 4c  | }..AND RealSetL|
00000d30  61 62 65 6c 28 6c 61 62  29 20 42 45 0a 7b 20 20  |abel(lab) BE.{  |
00000d40  4c 45 54 20 70 6f 69 6e  74 65 72 54 6f 4c 61 62  |LET pointerToLab|
00000d50  65 6c 20 3d 20 46 69 6e  64 4c 61 62 65 6c 45 6e  |el = FindLabelEn|
00000d60  74 72 79 28 6c 61 62 29  3b 0a 20 20 20 4c 45 54  |try(lab);.   LET|
00000d70  20 6f 6c 64 76 61 6c 20  3d 20 21 70 6f 69 6e 74  | oldval = !point|
00000d80  65 72 54 6f 4c 61 62 65  6c 3b 0a 20 20 20 4c 45  |erToLabel;.   LE|
00000d90  54 20 76 61 6c 20 3d 20  6c 6f 63 43 74 72 3b 0a  |T val = locCtr;.|
00000da0  0a 20 20 20 21 70 6f 69  6e 74 65 72 54 6f 4c 61  |.   !pointerToLa|
00000db0  62 65 6c 20 3a 3d 20 28  28 6f 6c 64 76 61 6c 20  |bel := ((oldval |
00000dc0  26 20 7e 6c 61 62 2e 76  61 6c 75 65 29 2b 76 61  |& ~lab.value)+va|
00000dd0  6c 29 20 7c 20 6c 61 62  2e 73 65 74 20 7c 20 63  |l) | lab.set | c|
00000de0  75 72 72 65 6e 74 41 72  65 61 3b 0a 20 20 20 54  |urrentArea;.   T|
00000df0  45 53 54 20 28 6f 6c 64  76 61 6c 26 6c 61 62 2e  |EST (oldval&lab.|
00000e00  73 65 74 29 7e 3d 30 20  54 48 45 4e 0a 20 20 20  |set)~=0 THEN.   |
00000e10  20 20 20 43 47 45 72 72  6f 72 28 46 41 4c 53 45  |   CGError(FALSE|
00000e20  2c 20 22 4c 61 62 65 6c  20 25 6e 20 73 65 74 20  |, "Label %n set |
00000e30  74 77 69 63 65 2c 20 61  74 20 25 78 36 2c 20 6f  |twice, at %x6, o|
00000e40  6c 64 20 76 61 6c 75 65  20 25 78 36 22 2c 0a 09  |ld value %x6",..|
00000e50  09 20 20 20 20 20 6c 61  62 2c 20 76 61 6c 2c 20  |.     lab, val, |
00000e60  6f 6c 64 76 61 6c 26 6c  61 62 2e 76 61 6c 75 65  |oldval&lab.value|
00000e70  29 0a 20 20 20 45 4c 53  45 20 49 46 20 28 6f 6c  |).   ELSE IF (ol|
00000e80  64 76 61 6c 26 6c 61 62  2e 76 61 6c 75 65 29 7e  |dval&lab.value)~|
00000e90  3d 30 20 54 48 45 4e 20  7b 0a 20 20 20 20 20 20  |=0 THEN {.      |
00000ea0  6f 6c 64 76 61 6c 20 3a  3d 20 6f 6c 64 76 61 6c  |oldval := oldval|
00000eb0  20 26 20 6c 61 62 2e 76  61 6c 75 65 3b 0a 20 20  | & lab.value;.  |
00000ec0  20 20 20 20 57 48 49 4c  45 20 6f 6c 64 76 61 6c  |    WHILE oldval|
00000ed0  7e 3d 30 20 44 4f 20 7b  0a 09 20 4c 45 54 20 6f  |~=0 DO {.. LET o|
00000ee0  20 3d 20 3f 3b 0a 09 20  4c 45 54 20 6c 6f 63 20  | = ?;.. LET loc |
00000ef0  3d 20 6f 6c 64 76 61 6c  21 52 65 66 4c 6f 63 3b  |= oldval!RefLoc;|
00000f00  0a 09 20 4c 45 54 20 61  20 3d 20 63 75 72 72 65  |.. LET a = curre|
00000f10  6e 74 41 72 65 61 3b 0a  09 20 4c 45 54 20 78 78  |ntArea;.. LET xx|
00000f20  20 3d 20 53 65 74 41 72  65 61 28 6c 6f 63 26 6c  | = SetArea(loc&l|
00000f30  61 62 2e 61 72 65 61 29  3b 0a 09 20 4c 45 54 20  |ab.area);.. LET |
00000f40  62 6c 6f 63 6b 20 3d 20  46 69 6e 64 53 74 6f 72  |block = FindStor|
00000f50  65 42 6c 6f 63 6b 28 6c  6f 63 2c 20 40 6f 29 3b  |eBlock(loc, @o);|
00000f60  0a 09 20 4c 45 54 20 77  6f 72 64 20 3d 20 62 6c  |.. LET word = bl|
00000f70  6f 63 6b 21 6f 3b 0a 09  20 4c 45 54 20 62 61 73  |ock!o;.. LET bas|
00000f80  65 20 3d 20 28 77 6f 72  64 3e 3e 31 36 29 26 31  |e = (word>>16)&1|
00000f90  35 3b 0a 0a 09 20 53 57  49 54 43 48 4f 4e 20 6f  |5;... SWITCHON o|
00000fa0  6c 64 76 61 6c 21 72 65  66 74 79 70 65 20 49 4e  |ldval!reftype IN|
00000fb0  54 4f 20 7b 0a 09 20 20  20 20 43 41 53 45 20 30  |TO {..    CASE 0|
00000fc0  3a 0a 09 20 20 20 20 20  20 20 62 6c 6f 63 6b 21  |:..       block!|
00000fd0  6f 20 3a 3d 20 77 6f 72  64 2b 76 61 6c 3b 0a 09  |o := word+val;..|
00000fe0  20 20 20 20 20 20 20 49  46 20 72 65 6c 6f 63 61  |       IF reloca|
00000ff0  74 65 52 65 66 65 72 65  6e 63 65 73 0a 09 09 20  |teReferences... |
00001000  20 54 48 45 4e 20 41 64  64 52 65 6c 6f 63 61 74  | THEN AddRelocat|
00001010  65 64 4c 6f 63 28 6c 6f  63 2c 20 6c 61 62 29 3b  |edLoc(loc, lab);|
00001020  0a 09 20 20 20 20 20 20  20 45 4e 44 43 41 53 45  |..       ENDCASE|
00001030  0a 0a 09 20 20 20 20 43  41 53 45 20 31 3a 0a 09  |...    CASE 1:..|
00001040  20 20 20 20 7b 20 20 4c  45 54 20 6f 66 66 73 65  |    {  LET offse|
00001050  74 20 3d 20 52 6f 74 61  74 65 52 69 67 68 74 28  |t = RotateRight(|
00001060  77 6f 72 64 26 32 35 35  2c 20 28 77 6f 72 64 3e  |word&255, (word>|
00001070  3e 37 29 26 33 30 29 3b  0a 09 20 20 20 20 20 20  |>7)&30);..      |
00001080  20 4c 45 54 20 6e 20 3d  20 62 61 73 65 3d 72 2e  | LET n = base=r.|
00001090  70 63 20 2d 3e 09 20 20  6c 6f 63 2b 38 2c 0a 09  |pc ->.  loc+8,..|
000010a0  09 20 20 20 20 20 20 20  73 74 61 74 69 63 44 61  |.       staticDa|
000010b0  74 61 4c 6f 63 3d 30 20  2d 3e 20 56 61 6c 75 65  |taLoc=0 -> Value|
000010c0  4f 66 4c 61 62 65 6c 28  53 4c 61 62 29 2b 34 2a  |OfLabel(SLab)+4*|
000010d0  53 41 64 64 72 2c 0a 09  09 09 09 09 20 20 73 74  |SAddr,......  st|
000010e0  61 74 69 63 44 61 74 61  4c 6f 63 3b 0a 09 20 20  |aticDataLoc;..  |
000010f0  20 20 20 20 20 4c 45 54  20 73 68 69 66 74 69 74  |     LET shiftit|
00001100  20 3d 20 46 41 4c 53 45  3b 0a 09 20 20 20 20 20  | = FALSE;..     |
00001110  20 20 6f 66 66 73 65 74  20 3a 3d 20 6f 66 66 73  |  offset := offs|
00001120  65 74 2b 76 61 6c 2d 6e  3b 0a 09 20 20 20 20 20  |et+val-n;..     |
00001130  20 20 49 46 20 6f 66 66  73 65 74 3c 30 20 54 48  |  IF offset<0 TH|
00001140  45 4e 0a 09 09 20 20 77  6f 72 64 2c 20 6f 66 66  |EN...  word, off|
00001150  73 65 74 20 3a 3d 20 77  6f 72 64 2b 66 2e 73 75  |set := word+f.su|
00001160  62 2d 66 2e 61 64 64 2c  20 2d 6f 66 66 73 65 74  |b-f.add, -offset|
00001170  3b 0a 09 20 20 20 20 20  20 20 49 46 20 28 62 61  |;..       IF (ba|
00001180  73 65 3d 72 2e 70 63 20  7c 20 7e 61 6f 66 4f 75  |se=r.pc | ~aofOu|
00001190  74 29 20 26 20 7e 45 69  67 68 74 42 69 74 73 4f  |t) & ~EightBitsO|
000011a0  72 46 65 77 65 72 28 6f  66 66 73 65 74 29 20 54  |rFewer(offset) T|
000011b0  48 45 4e 20 7b 0a 09 09  20 20 4c 45 54 20 72 20  |HEN {...  LET r |
000011c0  3d 20 77 6f 72 64 26 23  78 66 30 30 30 3b 0a 09  |= word&#xf000;..|
000011d0  09 20 20 4c 45 54 20 6d  20 3d 20 77 6f 72 64 26  |.  LET m = word&|
000011e0  23 78 66 30 30 30 30 30  30 30 3b 0a 09 09 20 20  |#xf0000000;...  |
000011f0  4c 45 54 20 78 20 3d 20  6d 2b 66 2e 6d 6f 76 2b  |LET x = m+f.mov+|
00001200  72 2b 28 72 3e 3e 31 32  29 2b 73 68 2e 6c 73 72  |r+(r>>12)+sh.lsr|
00001210  2b 32 35 36 3b 0a 09 09  20 20 4c 45 54 20 6e 65  |+256;...  LET ne|
00001220  78 74 20 3d 20 52 65 61  64 57 6f 72 64 28 6c 6f  |xt = ReadWord(lo|
00001230  63 2b 34 29 3b 0a 09 09  20 20 49 46 20 6e 65 78  |c+4);...  IF nex|
00001240  74 3d 78 20 54 48 45 4e  20 7b 0a 09 09 20 20 20  |t=x THEN {...   |
00001250  20 20 62 6c 6f 63 6b 21  6f 20 3a 3d 20 6d 2b 66  |  block!o := m+f|
00001260  2e 6d 6f 76 2b 72 2b 62  61 73 65 2b 73 68 2e 6c  |.mov+r+base+sh.l|
00001270  73 72 2b 32 35 36 3b 0a  09 09 20 20 20 20 20 6c  |sr+256;...     l|
00001280  6f 63 20 3a 3d 20 6c 6f  63 2b 34 3b 0a 09 09 20  |oc := loc+4;... |
00001290  20 20 20 20 62 6c 6f 63  6b 20 3a 3d 20 46 69 6e  |    block := Fin|
000012a0  64 53 74 6f 72 65 42 6c  6f 63 6b 28 6c 6f 63 2c  |dStoreBlock(loc,|
000012b0  20 40 6f 29 0a 09 09 20  20 20 20 20 6f 66 66 73  | @o)...     offs|
000012c0  65 74 20 3a 3d 20 6f 66  66 73 65 74 2d 34 3b 0a  |et := offset-4;.|
000012d0  09 09 20 20 20 20 20 77  6f 72 64 20 3a 3d 20 28  |..     word := (|
000012e0  77 6f 72 64 26 23 78 66  66 66 30 66 66 66 66 29  |word&#xfff0ffff)|
000012f0  2b 28 72 3c 3c 34 29 3b  0a 09 09 20 20 20 20 20  |+(r<<4);...     |
00001300  73 68 69 66 74 69 74 20  3a 3d 20 54 52 55 45 20  |shiftit := TRUE |
00001310  7d 3b 0a 09 09 20 20 57  48 49 4c 45 20 7e 45 69  |};...  WHILE ~Ei|
00001320  67 68 74 42 69 74 73 4f  72 46 65 77 65 72 28 6f  |ghtBitsOrFewer(o|
00001330  66 66 73 65 74 29 20 44  4f 20 7b 0a 09 09 20 20  |ffset) DO {...  |
00001340  20 20 20 6e 65 78 74 20  3a 3d 20 52 65 61 64 57  |   next := ReadW|
00001350  6f 72 64 28 6c 6f 63 2b  34 29 3b 0a 09 09 20 20  |ord(loc+4);...  |
00001360  20 20 20 49 46 20 42 72  61 6e 63 68 49 6e 73 74  |   IF BranchInst|
00001370  28 6e 65 78 74 29 20 7c  0a 09 09 09 28 6e 65 78  |(next) |....(nex|
00001380  74 26 23 78 66 30 30 30  30 30 30 30 29 7e 3d 6d  |t&#xf0000000)~=m|
00001390  20 7c 0a 09 09 09 55 73  65 73 4f 72 55 70 64 61  | |....UsesOrUpda|
000013a0  74 65 73 52 65 67 28 6e  65 78 74 2c 20 72 29 20  |tesReg(next, r) |
000013b0  54 48 45 4e 20 42 52 45  41 4b 3b 0a 09 09 20 20  |THEN BREAK;...  |
000013c0  20 20 20 6c 6f 63 20 3a  3d 20 6c 6f 63 2b 34 3b  |   loc := loc+4;|
000013d0  0a 09 09 20 20 20 20 20  6f 66 66 73 65 74 20 3a  |...     offset :|
000013e0  3d 20 6f 66 66 73 65 74  2d 34 3b 0a 09 09 20 20  |= offset-4;...  |
000013f0  20 20 20 62 6c 6f 63 6b  21 6f 20 3a 3d 20 6e 65  |   block!o := ne|
00001400  78 74 3b 0a 09 09 20 20  20 20 20 62 6c 6f 63 6b  |xt;...     block|
00001410  20 3a 3d 20 46 69 6e 64  53 74 6f 72 65 42 6c 6f  | := FindStoreBlo|
00001420  63 6b 28 6c 6f 63 2c 20  40 6f 29 20 7d 20 7d 3b  |ck(loc, @o) } };|
00001430  0a 09 20 20 20 20 20 20  20 54 45 53 54 20 7e 45  |..       TEST ~E|
00001440  69 67 68 74 42 69 74 73  4f 72 46 65 77 65 72 28  |ightBitsOrFewer(|
00001450  6f 66 66 73 65 74 29 20  54 48 45 4e 0a 09 09 20  |offset) THEN... |
00001460  20 43 47 45 72 72 6f 72  28 46 41 4c 53 45 2c 20  | CGError(FALSE, |
00001470  22 25 78 36 3a 20 46 31  20 6f 66 66 73 65 74 20  |"%x6: F1 offset |
00001480  25 78 38 20 6f 75 74 20  6f 66 20 72 61 6e 67 65  |%x8 out of range|
00001490  22 2c 0a 09 09 09 20 20  6c 6f 63 2c 20 6f 66 66  |",....  loc, off|
000014a0  73 65 74 29 0a 09 20 20  20 20 20 20 20 45 4c 53  |set)..       ELS|
000014b0  45 20 7b 0a 09 09 20 20  49 46 20 73 68 69 66 74  |E {...  IF shift|
000014c0  69 74 20 54 48 45 4e 20  6f 66 66 73 65 74 20 3a  |it THEN offset :|
000014d0  3d 20 6f 66 66 73 65 74  3e 3e 32 3b 0a 09 09 20  |= offset>>2;... |
000014e0  20 77 6f 72 64 20 3a 3d  20 28 77 6f 72 64 26 23  | word := (word&#|
000014f0  78 66 66 66 66 66 30 30  30 29 2b 50 61 63 6b 55  |xfffff000)+PackU|
00001500  70 28 6f 66 66 73 65 74  29 20 7d 0a 09 20 20 20  |p(offset) }..   |
00001510  20 20 20 20 62 6c 6f 63  6b 21 6f 20 3a 3d 20 77  |    block!o := w|
00001520  6f 72 64 3b 0a 09 20 20  20 20 20 20 20 45 4e 44  |ord;..       END|
00001530  43 41 53 45 20 7d 0a 0a  09 20 20 20 20 43 41 53  |CASE }...    CAS|
00001540  45 20 32 3a 0a 09 20 20  20 20 7b 20 20 4c 45 54  |E 2:..    {  LET|
00001550  20 6e 20 3d 20 62 61 73  65 3d 72 2e 70 63 20 2d  | n = base=r.pc -|
00001560  3e 20 6c 6f 63 2b 38 2c  0a 09 09 20 73 74 61 74  |> loc+8,... stat|
00001570  69 63 44 61 74 61 4c 6f  63 3d 30 20 2d 3e 20 56  |icDataLoc=0 -> V|
00001580  61 6c 75 65 4f 66 4c 61  62 65 6c 28 53 4c 61 62  |alueOfLabel(SLab|
00001590  29 2b 34 2a 53 41 64 64  72 2c 0a 09 09 09 09 20  |)+4*SAddr,..... |
000015a0  20 20 20 73 74 61 74 69  63 44 61 74 61 4c 6f 63  |   staticDataLoc|
000015b0  3b 0a 09 20 20 20 20 20  20 20 6e 20 3a 3d 20 28  |;..       n := (|
000015c0  77 6f 72 64 26 23 78 66  66 66 29 2b 76 61 6c 2d  |word&#xfff)+val-|
000015d0  6e 3b 0a 09 20 20 20 20  20 20 20 49 46 20 6e 3c  |n;..       IF n<|
000015e0  30 20 54 48 45 4e 20 7b  0a 09 09 20 20 6e 20 3a  |0 THEN {...  n :|
000015f0  3d 20 2d 6e 3b 0a 09 09  20 20 77 6f 72 64 20 3a  |= -n;...  word :|
00001600  3d 20 77 6f 72 64 20 4e  45 51 56 20 66 2e 75 70  |= word NEQV f.up|
00001610  20 7d 3b 0a 09 20 20 20  20 20 20 20 49 46 20 7e  | };..       IF ~|
00001620  28 30 3c 3d 6e 3c 3d 66  32 2e 6d 61 78 2e 6f 66  |(0<=n<=f2.max.of|
00001630  66 73 65 74 29 20 54 48  45 4e 20 7b 0a 09 09 20  |fset) THEN {... |
00001640  20 43 47 45 72 72 6f 72  28 46 41 4c 53 45 2c 20  | CGError(FALSE, |
00001650  22 52 65 73 6f 6c 76 65  20 72 65 66 65 72 65 6e  |"Resolve referen|
00001660  63 65 3a 20 6f 66 66 73  65 74 20 25 78 36 20 61  |ce: offset %x6 a|
00001670  74 20 25 78 36 22 2c 0a  09 09 09 09 20 6e 2c 20  |t %x6",..... n, |
00001680  6f 6c 64 56 61 6c 21 52  65 66 4c 6f 63 29 3b 0a  |oldVal!RefLoc);.|
00001690  09 09 20 20 6e 20 3a 3d  20 30 20 7d 3b 0a 09 20  |..  n := 0 };.. |
000016a0  20 20 20 20 20 20 62 6c  6f 63 6b 21 6f 20 3a 3d  |      block!o :=|
000016b0  20 28 77 6f 72 64 26 23  78 66 66 66 66 66 30 30  | (word&#xfffff00|
000016c0  30 29 2b 28 6e 26 23 78  66 66 66 29 3b 0a 09 20  |0)+(n&#xfff);.. |
000016d0  20 20 20 20 20 20 45 4e  44 43 41 53 45 20 7d 0a  |      ENDCASE }.|
000016e0  0a 09 20 20 20 20 43 41  53 45 20 36 3a 0a 09 20  |..    CASE 6:.. |
000016f0  20 20 20 7b 20 20 4c 45  54 20 6e 20 3d 20 62 61  |   {  LET n = ba|
00001700  73 65 3d 72 2e 70 63 20  2d 3e 20 6c 6f 63 2b 38  |se=r.pc -> loc+8|
00001710  2c 0a 09 09 20 73 74 61  74 69 63 44 61 74 61 4c  |,... staticDataL|
00001720  6f 63 3d 30 20 2d 3e 20  56 61 6c 75 65 4f 66 4c  |oc=0 -> ValueOfL|
00001730  61 62 65 6c 28 53 4c 61  62 29 2b 34 2a 53 41 64  |abel(SLab)+4*SAd|
00001740  64 72 2c 0a 09 09 09 09  20 20 20 20 73 74 61 74  |dr,.....    stat|
00001750  69 63 44 61 74 61 4c 6f  63 3b 0a 09 20 20 20 20  |icDataLoc;..    |
00001760  20 20 20 6e 20 3a 3d 20  28 77 6f 72 64 26 23 78  |   n := (word&#x|
00001770  66 66 29 2a 42 79 74 65  73 50 65 72 57 6f 72 64  |ff)*BytesPerWord|
00001780  2b 76 61 6c 2d 6e 3b 0a  09 20 20 20 20 20 20 20  |+val-n;..       |
00001790  49 46 20 6e 3c 30 20 54  48 45 4e 20 7b 0a 09 09  |IF n<0 THEN {...|
000017a0  20 20 6e 20 3a 3d 20 2d  6e 3b 0a 09 09 20 20 77  |  n := -n;...  w|
000017b0  6f 72 64 20 3a 3d 20 77  6f 72 64 20 4e 45 51 56  |ord := word NEQV|
000017c0  20 66 2e 75 70 20 7d 3b  0a 09 20 20 20 20 20 20  | f.up };..      |
000017d0  20 6e 20 3a 3d 20 6e 2f  42 79 74 65 73 50 65 72  | n := n/BytesPer|
000017e0  57 6f 72 64 3b 0a 09 20  20 20 20 20 20 20 49 46  |Word;..       IF|
000017f0  20 7e 28 30 3c 3d 6e 3c  3d 32 35 35 29 20 54 48  | ~(0<=n<=255) TH|
00001800  45 4e 20 7b 0a 09 09 20  20 43 47 45 72 72 6f 72  |EN {...  CGError|
00001810  28 46 41 4c 53 45 2c 20  22 52 65 73 6f 6c 76 65  |(FALSE, "Resolve|
00001820  20 72 65 66 65 72 65 6e  63 65 3a 20 6f 66 66 73  | reference: offs|
00001830  65 74 20 25 78 36 20 61  74 20 25 78 36 22 2c 0a  |et %x6 at %x6",.|
00001840  09 09 09 09 20 6e 2c 20  6f 6c 64 56 61 6c 21 52  |.... n, oldVal!R|
00001850  65 66 4c 6f 63 29 3b 0a  09 09 20 20 6e 20 3a 3d  |efLoc);...  n :=|
00001860  20 30 20 7d 3b 0a 09 20  20 20 20 20 20 20 62 6c  | 0 };..       bl|
00001870  6f 63 6b 21 6f 20 3a 3d  20 28 77 6f 72 64 26 23  |ock!o := (word&#|
00001880  78 66 66 66 66 66 66 30  30 29 2b 28 6e 26 23 78  |xffffff00)+(n&#x|
00001890  66 66 29 3b 0a 09 20 20  20 20 20 20 20 45 4e 44  |ff);..       END|
000018a0  43 41 53 45 20 7d 0a 0a  09 20 20 20 20 43 41 53  |CASE }...    CAS|
000018b0  45 20 35 3a 0a 09 20 20  20 20 20 20 20 62 6c 6f  |E 5:..       blo|
000018c0  63 6b 21 6f 20 3a 3d 20  28 77 6f 72 64 26 23 78  |ck!o := (word&#x|
000018d0  66 66 30 30 30 30 30 30  29 2b 0a 09 09 09 20 20  |ff000000)+....  |
000018e0  28 28 77 6f 72 64 2b 28  76 61 6c 3e 3e 32 29 29  |((word+(val>>2))|
000018f0  26 23 78 66 66 66 66 66  66 29 3b 0a 09 20 20 20  |&#xffffff);..   |
00001900  20 20 20 20 45 4e 44 43  41 53 45 0a 0a 09 20 20  |    ENDCASE...  |
00001910  20 20 44 45 46 41 55 4c  54 3a 0a 09 20 20 20 20  |  DEFAULT:..    |
00001920  20 20 20 43 47 45 72 72  6f 72 28 46 41 4c 53 45  |   CGError(FALSE|
00001930  2c 20 22 42 61 64 20 72  65 66 65 72 65 6e 63 65  |, "Bad reference|
00001940  20 74 79 70 65 20 25 4e  22 2c 0a 09 09 09 20 20  | type %N",....  |
00001950  20 20 20 20 6f 6c 64 76  61 6c 21 52 65 66 54 79  |    oldval!RefTy|
00001960  70 65 29 20 7d 3b 0a 09  20 53 65 74 41 72 65 61  |pe) };.. SetArea|
00001970  28 61 29 3b 0a 09 20 6f  6c 64 76 61 6c 20 3a 3d  |(a);.. oldval :=|
00001980  20 46 72 65 65 42 6c 6b  28 6f 6c 64 76 61 6c 2c  | FreeBlk(oldval,|
00001990  20 52 65 66 53 69 7a 65  29 20 7d 20 7d 20 7d 0a  | RefSize) } } }.|
000019a0  0a 41 4e 44 20 42 72 61  6e 63 68 49 6e 73 74 28  |.AND BranchInst(|
000019b0  69 29 20 3d 0a 20 20 20  28 69 26 23 78 30 66 30  |i) =.   (i&#x0f0|
000019c0  30 30 30 30 30 29 3d 23  78 30 66 30 30 30 30 30  |00000)=#x0f00000|
000019d0  30 20 2d 3e 20 54 52 55  45 2c 09 20 2f 2f 20 53  |0 -> TRUE,. // S|
000019e0  57 49 0a 20 20 20 28 69  26 23 78 30 65 30 30 30  |WI.   (i&#x0e000|
000019f0  30 30 30 29 3d 23 78 30  61 30 30 30 30 30 30 20  |000)=#x0a000000 |
00001a00  2d 3e 20 54 52 55 45 2c  09 20 2f 2f 20 42 52 2c  |-> TRUE,. // BR,|
00001a10  20 42 4c 0a 20 20 20 28  69 26 23 78 30 65 30 30  | BL.   (i&#x0e00|
00001a20  30 30 30 30 29 3d 23 78  30 38 30 30 30 30 30 30  |0000)=#x08000000|
00001a30  20 26 0a 20 20 20 28 28  69 26 23 78 30 30 31 30  | &.   ((i&#x0010|
00001a40  38 30 30 30 29 3d 23 78  30 30 31 30 38 30 30 30  |8000)=#x00108000|
00001a50  29 20 2d 3e 20 54 52 55  45 2c 20 20 2f 2f 20 4c  |) -> TRUE,  // L|
00001a60  44 4d 20 6c 6f 61 64 69  6e 67 20 70 63 0a 20 20  |DM loading pc.  |
00001a70  20 28 69 26 23 78 30 63  31 30 66 30 30 30 29 3d  | (i&#x0c10f000)=|
00001a80  23 78 30 34 31 30 66 30  30 30 20 2d 3e 20 54 52  |#x0410f000 -> TR|
00001a90  55 45 2c 09 20 2f 2f 20  4c 44 52 20 70 63 2c 20  |UE,. // LDR pc, |
00001aa0  2e 2e 2e 0a 20 20 20 28  69 26 23 78 30 63 30 30  |....   (i&#x0c00|
00001ab0  66 30 30 30 29 3d 23 78  30 30 30 30 66 30 30 30  |f000)=#x0000f000|
00001ac0  20 2d 3e 20 54 52 55 45  2c 09 20 2f 2f 20 66 31  | -> TRUE,. // f1|
00001ad0  2c 20 64 65 73 74 20 70  63 0a 09 09 09 09 46 41  |, dest pc.....FA|
00001ae0  4c 53 45 0a 0a 41 4e 44  20 55 73 65 73 4f 72 55  |LSE..AND UsesOrU|
00001af0  70 64 61 74 65 73 52 65  67 28 69 2c 20 72 29 20  |pdatesReg(i, r) |
00001b00  3d 20 56 41 4c 4f 46 0a  7b 20 20 4c 45 54 20 69  |= VALOF.{  LET i|
00001b10  78 20 3d 20 69 20 26 20  23 78 30 65 30 30 30 30  |x = i & #x0e0000|
00001b20  30 30 3b 0a 20 20 20 54  45 53 54 20 28 69 3e 3e  |00;.   TEST (i>>|
00001b30  31 36 29 3d 72 20 54 48  45 4e 0a 20 20 20 20 20  |16)=r THEN.     |
00001b40  20 52 45 53 55 4c 54 49  53 20 54 52 55 45 0a 20  | RESULTIS TRUE. |
00001b50  20 20 45 4c 53 45 20 54  45 53 54 20 69 78 3d 23  |  ELSE TEST ix=#|
00001b60  78 30 38 30 30 30 30 30  30 20 54 48 45 4e 0a 20  |x08000000 THEN. |
00001b70  20 20 20 20 20 54 45 53  54 20 28 69 26 28 31 3c  |     TEST (i&(1<|
00001b80  3c 72 29 29 7e 3d 30 20  54 48 45 4e 0a 09 20 52  |<r))~=0 THEN.. R|
00001b90  45 53 55 4c 54 49 53 20  54 52 55 45 0a 20 20 20  |ESULTIS TRUE.   |
00001ba0  20 20 20 45 4c 53 45 0a  09 20 52 45 53 55 4c 54  |   ELSE.. RESULT|
00001bb0  49 53 20 46 41 4c 53 45  0a 20 20 20 45 4c 53 45  |IS FALSE.   ELSE|
00001bc0  20 54 45 53 54 20 28 69  3e 3e 31 32 29 3d 72 20  | TEST (i>>12)=r |
00001bd0  54 48 45 4e 0a 20 20 20  20 20 20 52 45 53 55 4c  |THEN.      RESUL|
00001be0  54 49 53 20 54 52 55 45  0a 20 20 20 45 4c 53 45  |TIS TRUE.   ELSE|
00001bf0  20 54 45 53 54 20 28 69  78 3d 30 20 7c 20 69 78  | TEST (ix=0 | ix|
00001c00  3d 23 78 30 36 30 30 30  30 30 30 29 20 26 20 28  |=#x06000000) & (|
00001c10  69 26 31 35 29 3d 72 20  54 48 45 4e 0a 20 20 20  |i&15)=r THEN.   |
00001c20  20 20 20 52 45 53 55 4c  54 49 53 20 54 52 55 45  |   RESULTIS TRUE|
00001c30  0a 20 20 20 45 4c 53 45  0a 20 20 20 20 20 20 52  |.   ELSE.      R|
00001c40  45 53 55 4c 54 49 53 20  46 41 4c 53 45 20 7d 0a  |ESULTIS FALSE }.|
00001c50  0a 41 4e 44 20 41 64 64  52 65 66 28 6c 6f 63 2c  |.AND AddRef(loc,|
00001c60  20 74 79 70 65 2c 20 6c  61 62 29 20 42 45 0a 7b  | type, lab) BE.{|
00001c70  20 20 4c 45 54 20 70 6f  69 6e 74 65 72 54 6f 4c  |  LET pointerToL|
00001c80  61 62 65 6c 20 3d 20 46  69 6e 64 4c 61 62 65 6c  |abel = FindLabel|
00001c90  45 6e 74 72 79 28 6c 61  62 29 3b 0a 20 20 20 4c  |Entry(lab);.   L|
00001ca0  45 54 20 76 61 6c 20 3d  20 21 70 6f 69 6e 74 65  |ET val = !pointe|
00001cb0  72 54 6f 4c 61 62 65 6c  3b 0a 20 20 20 54 45 53  |rToLabel;.   TES|
00001cc0  54 20 28 76 61 6c 26 6c  61 62 2e 73 65 74 29 7e  |T (val&lab.set)~|
00001cd0  3d 30 20 54 48 45 4e 0a  20 20 20 20 20 20 43 47  |=0 THEN.      CG|
00001ce0  45 72 72 6f 72 28 46 41  4c 53 45 2c 20 22 61 64  |Error(FALSE, "ad|
00001cf0  64 69 6e 67 20 72 65 66  65 72 65 6e 63 65 20 74  |ding reference t|
00001d00  6f 20 73 65 74 20 6c 61  62 65 6c 20 25 6e 20 28  |o set label %n (|
00001d10  76 61 6c 75 65 20 25 6e  29 22 2c 0a 09 20 20 20  |value %n)",..   |
00001d20  20 20 20 20 6c 61 62 2c  20 76 61 6c 29 0a 20 20  |    lab, val).  |
00001d30  20 45 4c 53 45 20 7b 0a  20 20 20 20 20 20 4c 45  | ELSE {.      LE|
00001d40  54 20 72 65 66 70 20 3d  20 46 69 6c 6c 42 6c 6b  |T refp = FillBlk|
00001d50  28 52 65 66 53 69 7a 65  2c 20 76 61 6c 20 26 20  |(RefSize, val & |
00001d60  6c 61 62 2e 76 61 6c 75  65 2c 20 74 79 70 65 2c  |lab.value, type,|
00001d70  20 6c 6f 63 2b 63 75 72  72 65 6e 74 41 72 65 61  | loc+currentArea|
00001d80  29 3b 0a 20 20 20 20 20  20 21 70 6f 69 6e 74 65  |);.      !pointe|
00001d90  72 54 6f 4c 61 62 65 6c  20 3a 3d 20 28 76 61 6c  |rToLabel := (val|
00001da0  20 26 20 7e 6c 61 62 2e  76 61 6c 75 65 29 20 2b  | & ~lab.value) +|
00001db0  20 72 65 66 70 20 7d 20  7d 0a 0a 41 4e 44 20 47  | refp } }..AND G|
00001dc0  65 74 41 72 65 61 28 29  20 3d 20 56 41 4c 4f 46  |etArea() = VALOF|
00001dd0  20 7b 0a 20 20 20 4c 45  54 20 61 20 3d 20 47 65  | {.   LET a = Ge|
00001de0  74 56 65 63 74 6f 72 28  61 2e 73 69 7a 65 29 3b  |tVector(a.size);|
00001df0  0a 20 20 20 4c 45 54 20  76 20 3d 20 47 65 74 56  |.   LET v = GetV|
00001e00  65 63 74 6f 72 28 53 74  6f 72 65 42 6c 6f 63 6b  |ector(StoreBlock|
00001e10  56 53 69 7a 65 29 3b 0a  20 20 20 46 4f 52 20 69  |VSize);.   FOR i|
00001e20  20 3d 20 30 20 54 4f 20  53 74 6f 72 65 42 6c 6f  | = 0 TO StoreBlo|
00001e30  63 6b 56 53 69 7a 65 2d  31 20 44 4f 20 76 21 69  |ckVSize-1 DO v!i|
00001e40  20 3a 3d 20 30 3b 0a 20  20 20 61 21 61 2e 6c 6f  | := 0;.   a!a.lo|
00001e50  63 43 2c 20 61 21 61 2e  72 65 6c 6f 63 2c 20 61  |cC, a!a.reloc, a|
00001e60  21 61 2e 78 72 65 6c 6f  63 20 3a 3d 20 30 2c 20  |!a.xreloc := 0, |
00001e70  30 2c 20 30 3b 0a 20 20  20 61 21 61 2e 73 62 76  |0, 0;.   a!a.sbv|
00001e80  20 3a 3d 20 76 3b 0a 20  20 20 52 45 53 55 4c 54  | := v;.   RESULT|
00001e90  49 53 20 61 20 7d 0a 0a  41 4e 44 20 53 65 74 41  |IS a }..AND SetA|
00001ea0  72 65 61 28 61 29 20 42  45 20 49 46 20 61 7e 3d  |rea(a) BE IF a~=|
00001eb0  63 75 72 72 65 6e 74 41  72 65 61 20 54 48 45 4e  |currentArea THEN|
00001ec0  20 7b 0a 20 20 20 4c 45  54 20 6f 6c 64 2c 20 6e  | {.   LET old, n|
00001ed0  65 77 20 3d 20 3f 2c 20  3f 3b 0a 20 20 20 54 45  |ew = ?, ?;.   TE|
00001ee0  53 54 20 61 3d 43 6f 64  65 41 72 65 61 20 54 48  |ST a=CodeArea TH|
00001ef0  45 4e 0a 20 20 20 20 20  20 6f 6c 64 2c 20 6e 65  |EN.      old, ne|
00001f00  77 20 3a 3d 20 64 61 52  65 63 2c 20 63 61 52 65  |w := daRec, caRe|
00001f10  63 0a 20 20 20 45 4c 53  45 0a 20 20 20 20 20 20  |c.   ELSE.      |
00001f20  6f 6c 64 2c 20 6e 65 77  20 3a 3d 20 63 61 52 65  |old, new := caRe|
00001f30  63 2c 20 64 61 52 65 63  3b 0a 20 20 20 6f 6c 64  |c, daRec;.   old|
00001f40  21 61 2e 6c 6f 63 43 2c  20 6f 6c 64 21 61 2e 72  |!a.locC, old!a.r|
00001f50  65 6c 6f 63 2c 20 6f 6c  64 21 61 2e 78 72 65 6c  |eloc, old!a.xrel|
00001f60  6f 63 20 3a 3d 0a 20 20  20 20 20 20 6c 6f 63 43  |oc :=.      locC|
00001f70  74 72 2c 20 72 65 6c 6f  63 61 74 65 64 4c 6f 63  |tr, relocatedLoc|
00001f80  73 2c 20 78 52 65 6c 6f  63 61 74 65 64 4c 6f 63  |s, xRelocatedLoc|
00001f90  73 3b 0a 20 20 20 6c 6f  63 43 74 72 2c 20 72 65  |s;.   locCtr, re|
00001fa0  6c 6f 63 61 74 65 64 4c  6f 63 73 2c 20 78 52 65  |locatedLocs, xRe|
00001fb0  6c 6f 63 61 74 65 64 4c  6f 63 73 20 3a 3d 0a 20  |locatedLocs :=. |
00001fc0  20 20 20 20 20 6e 65 77  21 61 2e 6c 6f 63 43 2c  |     new!a.locC,|
00001fd0  20 6e 65 77 21 61 2e 72  65 6c 6f 63 2c 20 6e 65  | new!a.reloc, ne|
00001fe0  77 21 61 2e 78 72 65 6c  6f 63 3b 0a 20 20 20 73  |w!a.xreloc;.   s|
00001ff0  74 6f 72 65 42 6c 6f 63  6b 56 20 3a 3d 20 6e 65  |toreBlockV := ne|
00002000  77 21 61 2e 73 62 76 3b  0a 20 20 20 63 75 72 72  |w!a.sbv;.   curr|
00002010  65 6e 74 41 72 65 61 20  3a 3d 20 61 20 7d 0a 0a  |entArea := a }..|
00002020  0a 41 4e 44 20 49 6e 69  74 44 61 74 61 4c 69 73  |.AND InitDataLis|
00002030  74 73 28 29 20 42 45 0a  7b 20 20 66 72 65 65 44  |ts() BE.{  freeD|
00002040  61 74 61 42 6c 6f 63 6b  73 20 3a 3d 20 30 3b 0a  |ataBlocks := 0;.|
00002050  20 20 20 46 64 61 74 61  4c 69 73 74 20 3a 3d 20  |   FdataList := |
00002060  47 65 74 44 61 74 61 42  6c 6f 63 6b 28 29 3b 20  |GetDataBlock(); |
00002070  46 64 61 74 61 70 2c 20  46 61 64 64 72 20 3a 3d  |Fdatap, Faddr :=|
00002080  20 46 64 61 74 61 4c 69  73 74 2c 20 30 3b 0a 20  | FdataList, 0;. |
00002090  20 20 53 64 61 74 61 4c  69 73 74 2c 20 53 61 64  |  SdataList, Sad|
000020a0  64 72 20 3a 3d 20 30 2c  20 30 3b 0a 20 20 20 44  |dr := 0, 0;.   D|
000020b0  61 74 61 4c 69 73 74 20  3a 3d 20 47 65 74 44 61  |ataList := GetDa|
000020c0  74 61 42 6c 6f 63 6b 28  29 3b 20 44 61 74 61 70  |taBlock(); Datap|
000020d0  20 3a 3d 20 44 61 74 61  4c 69 73 74 3b 0a 20 20  | := DataList;.  |
000020e0  20 72 65 6c 6f 63 61 74  65 64 4c 6f 63 73 20 3a  | relocatedLocs :|
000020f0  3d 20 30 3b 20 72 65 6c  6f 63 61 74 65 52 65 66  |= 0; relocateRef|
00002100  65 72 65 6e 63 65 73 20  3a 3d 20 46 41 4c 53 45  |erences := FALSE|
00002110  3b 0a 20 20 20 73 74 61  74 69 63 44 61 74 61 4c  |;.   staticDataL|
00002120  6f 63 20 3a 3d 20 30 3b  0a 20 20 20 70 65 6e 64  |oc := 0;.   pend|
00002130  69 6e 67 4c 6f 61 64 73  2c 20 70 65 6e 64 69 6e  |ingLoads, pendin|
00002140  67 53 74 6f 72 65 73 20  3a 3d 20 30 2c 20 30 3b  |gStores := 0, 0;|
00002150  0a 20 20 20 73 61 76 65  64 53 74 61 74 65 73 20  |.   savedStates |
00002160  3a 3d 20 30 3b 0a 20 20  20 64 65 64 69 63 61 74  |:= 0;.   dedicat|
00002170  65 64 52 65 67 69 73 74  65 72 73 20 3a 3d 20 30  |edRegisters := 0|
00002180  3b 0a 20 20 20 6c 6f 63  61 6c 43 6f 6e 73 74 61  |;.   localConsta|
00002190  6e 74 73 20 3a 3d 20 47  65 74 44 61 74 61 42 6c  |nts := GetDataBl|
000021a0  6f 63 6b 28 29 3b 0a 20  20 20 6c 6f 63 61 6c 43  |ock();.   localC|
000021b0  6f 6e 73 74 50 20 3a 3d  20 6c 6f 63 61 6c 43 6f  |onstP := localCo|
000021c0  6e 73 74 61 6e 74 73 3b  0a 20 20 20 6c 6f 63 61  |nstants;.   loca|
000021d0  6c 46 41 64 64 72 20 3a  3d 20 30 3b 0a 20 20 20  |lFAddr := 0;.   |
000021e0  52 4c 4c 6f 61 64 4c 69  73 74 20 3a 3d 20 30 3b  |RLLoadList := 0;|
000021f0  0a 20 20 20 78 53 79 6d  62 6f 6c 73 20 3a 3d 20  |.   xSymbols := |
00002200  30 3b 0a 20 20 20 78 52  65 6c 6f 63 61 74 65 64  |0;.   xRelocated|
00002210  4c 6f 63 73 20 3a 3d 20  30 3b 0a 20 20 20 78 53  |Locs := 0;.   xS|
00002220  79 6d 4e 6f 20 3a 3d 20  34 3b 0a 20 20 20 63 75  |ymNo := 4;.   cu|
00002230  72 72 65 6e 74 41 72 65  61 20 3a 3d 20 30 3b 0a  |rrentArea := 0;.|
00002240  20 20 20 64 61 74 61 41  72 65 61 20 3a 3d 20 30  |   dataArea := 0|
00002250  3b 0a 20 20 20 63 61 52  65 63 20 3a 3d 20 47 65  |;.   caRec := Ge|
00002260  74 41 72 65 61 28 29 3b  0a 20 20 20 49 46 20 61  |tArea();.   IF a|
00002270  6f 66 4f 75 74 20 54 48  45 4e 20 7b 0a 20 20 20  |ofOut THEN {.   |
00002280  20 20 20 64 61 74 61 41  72 65 61 20 3a 3d 20 31  |   dataArea := 1|
00002290  3b 0a 20 20 20 20 20 20  64 61 52 65 63 20 3a 3d  |;.      daRec :=|
000022a0  20 47 65 74 41 72 65 61  28 29 20 7d 3b 0a 20 20  | GetArea() };.  |
000022b0  20 73 74 6f 72 65 42 6c  6f 63 6b 56 20 3a 3d 20  | storeBlockV := |
000022c0  63 61 52 65 63 21 61 2e  73 62 76 20 7d 0a 0a 41  |caRec!a.sbv }..A|
000022d0  4e 44 20 47 65 74 44 61  74 61 42 6c 6f 63 6b 28  |ND GetDataBlock(|
000022e0  29 20 3d 20 56 41 4c 4f  46 0a 7b 20 20 4c 45 54  |) = VALOF.{  LET|
000022f0  20 76 20 3d 20 3f 3b 0a  20 20 20 54 45 53 54 20  | v = ?;.   TEST |
00002300  66 72 65 65 44 61 74 61  42 6c 6f 63 6b 73 3d 30  |freeDataBlocks=0|
00002310  20 54 48 45 4e 0a 20 20  20 20 20 20 76 20 3a 3d  | THEN.      v :=|
00002320  20 47 65 74 56 65 63 74  6f 72 28 44 61 74 61 42  | GetVector(DataB|
00002330  6c 6f 63 6b 53 69 7a 65  29 0a 20 20 20 45 4c 53  |lockSize).   ELS|
00002340  45 20 7b 0a 20 20 20 20  20 20 76 20 3a 3d 20 66  |E {.      v := f|
00002350  72 65 65 44 61 74 61 42  6c 6f 63 6b 73 3b 0a 20  |reeDataBlocks;. |
00002360  20 20 20 20 20 66 72 65  65 44 61 74 61 42 6c 6f  |     freeDataBlo|
00002370  63 6b 73 20 3a 3d 20 21  66 72 65 65 44 61 74 61  |cks := !freeData|
00002380  42 6c 6f 63 6b 73 20 7d  3b 0a 20 20 20 76 21 4e  |Blocks };.   v!N|
00002390  65 78 74 42 6c 6f 63 6b  2c 20 76 21 45 6e 64 4f  |extBlock, v!EndO|
000023a0  66 44 61 74 61 49 6e 42  6c 6f 63 6b 20 3a 3d 20  |fDataInBlock := |
000023b0  30 2c 20 44 61 74 61 42  6c 6f 63 6b 49 74 65 6d  |0, DataBlockItem|
000023c0  73 2d 31 0a 20 20 20 52  45 53 55 4c 54 49 53 20  |s-1.   RESULTIS |
000023d0  76 20 7d 0a 0a 41 4e 44  20 41 64 64 44 61 74 61  |v }..AND AddData|
000023e0  28 6c 76 64 70 2c 20 6e  2c 20 64 31 2c 20 64 32  |(lvdp, n, d1, d2|
000023f0  2c 20 64 33 29 20 42 45  0a 7b 20 20 4c 45 54 20  |, d3) BE.{  LET |
00002400  70 20 3d 20 21 6c 76 64  70 3b 0a 20 20 20 4c 45  |p = !lvdp;.   LE|
00002410  54 20 69 20 3d 20 70 21  45 6e 64 4f 66 44 61 74  |T i = p!EndOfDat|
00002420  61 49 6e 42 6c 6f 63 6b  3b 0a 20 20 20 4c 45 54  |aInBlock;.   LET|
00002430  20 64 70 20 3d 20 40 6e  3b 0a 20 20 20 49 46 20  | dp = @n;.   IF |
00002440  28 69 2b 6e 29 3e 3d 44  61 74 61 42 6c 6f 63 6b  |(i+n)>=DataBlock|
00002450  53 69 7a 65 20 54 48 45  4e 20 7b 0a 20 20 20 20  |Size THEN {.    |
00002460  20 20 4c 45 54 20 6e 65  77 70 20 3d 20 47 65 74  |  LET newp = Get|
00002470  44 61 74 61 42 6c 6f 63  6b 28 29 3b 0a 20 20 20  |DataBlock();.   |
00002480  20 20 20 21 6c 76 64 70  2c 20 70 21 4e 65 78 74  |   !lvdp, p!Next|
00002490  42 6c 6f 63 6b 20 3a 3d  20 6e 65 77 70 2c 20 6e  |Block := newp, n|
000024a0  65 77 70 3b 0a 20 20 20  20 20 20 69 20 3a 3d 20  |ewp;.      i := |
000024b0  44 61 74 61 42 6c 6f 63  6b 49 74 65 6d 73 2d 31  |DataBlockItems-1|
000024c0  3b 0a 20 20 20 20 20 20  70 20 3a 3d 20 6e 65 77  |;.      p := new|
000024d0  70 20 7d 3b 0a 20 20 20  46 4f 52 20 6a 20 3d 20  |p };.   FOR j = |
000024e0  31 20 54 4f 20 6e 20 44  4f 20 7b 0a 20 20 20 20  |1 TO n DO {.    |
000024f0  20 20 69 20 3a 3d 20 69  2b 31 3b 0a 20 20 20 20  |  i := i+1;.    |
00002500  20 20 70 21 69 20 3a 3d  20 64 70 21 6a 20 7d 3b  |  p!i := dp!j };|
00002510  0a 20 20 20 70 21 45 6e  64 4f 66 44 61 74 61 49  |.   p!EndOfDataI|
00002520  6e 42 6c 6f 63 6b 20 3a  3d 20 69 20 7d 0a 0a 41  |nBlock := i }..A|
00002530  4e 44 20 46 44 61 74 61  28 6e 29 20 3d 20 56 41  |ND FData(n) = VA|
00002540  4c 4f 46 0a 7b 20 20 4c  45 54 20 69 2c 20 70 2c  |LOF.{  LET i, p,|
00002550  20 71 20 3d 20 30 2c 20  3f 2c 20 3f 3b 0a 20 20  | q = 0, ?, ?;.  |
00002560  20 54 45 53 54 20 75 73  65 73 52 4c 0a 20 20 20  | TEST usesRL.   |
00002570  20 20 20 54 48 45 4e 20  70 2c 20 71 20 3a 3d 20  |   THEN p, q := |
00002580  46 64 61 74 61 4c 69 73  74 2c 20 40 46 44 61 74  |FdataList, @FDat|
00002590  61 50 0a 20 20 20 20 20  20 45 4c 53 45 20 70 2c  |aP.      ELSE p,|
000025a0  20 71 20 3a 3d 20 6c 6f  63 61 6c 43 6f 6e 73 74  | q := localConst|
000025b0  61 6e 74 73 2c 20 40 6c  6f 63 61 6c 43 6f 6e 73  |ants, @localCons|
000025c0  74 50 3b 0a 0a 20 20 20  57 48 49 4c 45 20 70 7e  |tP;..   WHILE p~|
000025d0  3d 30 20 44 4f 20 7b 0a  20 20 20 20 20 20 46 4f  |=0 DO {.      FO|
000025e0  52 20 6a 20 3d 20 44 61  74 61 42 6c 6f 63 6b 49  |R j = DataBlockI|
000025f0  74 65 6d 73 20 54 4f 20  70 21 45 6e 64 4f 66 44  |tems TO p!EndOfD|
00002600  61 74 61 49 6e 42 6c 6f  63 6b 20 44 4f 20 7b 0a  |ataInBlock DO {.|
00002610  09 20 49 46 20 6e 3d 70  21 6a 20 54 48 45 4e 20  |. IF n=p!j THEN |
00002620  52 45 53 55 4c 54 49 53  20 69 3b 0a 09 20 69 20  |RESULTIS i;.. i |
00002630  3a 3d 20 69 2b 34 20 7d  3b 0a 20 20 20 20 20 20  |:= i+4 };.      |
00002640  70 20 3a 3d 20 70 21 4e  65 78 74 42 6c 6f 63 6b  |p := p!NextBlock|
00002650  20 7d 3b 0a 20 20 20 41  64 64 44 61 74 61 28 71  | };.   AddData(q|
00002660  2c 20 31 2c 20 6e 29 3b  0a 20 20 20 7b 20 20 4c  |, 1, n);.   {  L|
00002670  45 54 20 6e 20 3d 20 3f  3b 0a 20 20 20 20 20 20  |ET n = ?;.      |
00002680  54 45 53 54 20 75 73 65  73 52 4c 20 54 48 45 4e  |TEST usesRL THEN|
00002690  20 7b 0a 09 20 6e 20 3a  3d 20 46 61 64 64 72 3b  | {.. n := Faddr;|
000026a0  0a 09 20 46 61 64 64 72  20 3a 3d 20 46 61 64 64  |.. Faddr := Fadd|
000026b0  72 2b 34 20 7d 0a 20 20  20 20 20 20 45 4c 53 45  |r+4 }.      ELSE|
000026c0  20 7b 0a 09 20 6e 20 3a  3d 20 6c 6f 63 61 6c 46  | {.. n := localF|
000026d0  61 64 64 72 3b 0a 09 20  6c 6f 63 61 6c 46 61 64  |addr;.. localFad|
000026e0  64 72 20 3a 3d 20 6c 6f  63 61 6c 46 61 64 64 72  |dr := localFaddr|
000026f0  2b 34 20 7d 3b 0a 20 20  20 20 20 20 52 45 53 55  |+4 };.      RESU|
00002700  4c 54 49 53 20 6e 20 7d  20 7d 0a 0a 41 4e 44 20  |LTIS n } }..AND |
00002710  53 64 61 74 61 28 6e 29  20 42 45 0a 20 20 20 54  |Sdata(n) BE.   T|
00002720  45 53 54 20 75 73 65 73  52 4c 20 54 48 45 4e 0a  |EST usesRL THEN.|
00002730  20 20 20 20 20 20 43 47  45 72 72 6f 72 28 46 41  |      CGError(FA|
00002740  4c 53 45 2c 20 22 53 44  61 74 61 20 73 68 6f 75  |LSE, "SData shou|
00002750  6c 64 20 6e 6f 74 20 62  65 20 63 61 6c 6c 61 62  |ld not be callab|
00002760  6c 65 22 29 0a 20 20 20  45 4c 53 45 0a 20 20 20  |le").   ELSE.   |
00002770  20 20 20 41 64 64 44 61  74 61 28 40 6c 6f 63 61  |   AddData(@loca|
00002780  6c 43 6f 6e 73 74 50 2c  20 31 2c 20 6e 29 0a 0a  |lConstP, 1, n)..|
00002790  41 4e 44 20 44 61 74 61  28 6e 31 2c 20 6e 32 29  |AND Data(n1, n2)|
000027a0  20 42 45 20 41 64 64 44  61 74 61 28 40 44 61 74  | BE AddData(@Dat|
000027b0  61 50 2c 20 32 2c 20 6e  31 2c 20 6e 32 29 0a 0a  |aP, 2, n1, n2)..|
000027c0  41 4e 44 20 43 47 53 74  72 69 6e 67 28 6e 2c 20  |AND CGString(n, |
000027d0  6c 61 62 65 6c 29 20 42  45 0a 7b 20 20 4c 45 54  |label) BE.{  LET|
000027e0  20 76 20 3d 20 56 45 43  20 32 35 36 2f 42 79 74  | v = VEC 256/Byt|
000027f0  65 73 50 65 72 57 6f 72  64 3b 0a 20 20 20 4c 45  |esPerWord;.   LE|
00002800  54 20 69 20 3d 20 31 3b  0a 20 20 20 4c 45 54 20  |T i = 1;.   LET |
00002810  73 69 7a 65 20 3d 20 6e  2f 34 3b 0a 20 20 20 76  |size = n/4;.   v|
00002820  25 30 20 3a 3d 20 6e 3b  0a 20 20 20 46 4f 52 20  |%0 := n;.   FOR |
00002830  69 20 3d 20 31 20 54 4f  20 6e 20 44 4f 20 76 25  |i = 1 TO n DO v%|
00002840  69 20 3a 3d 20 52 65 61  64 4e 28 29 3b 0a 20 20  |i := ReadN();.  |
00002850  20 46 4f 52 20 69 20 3d  20 6e 2b 31 20 54 4f 20  | FOR i = n+1 TO |
00002860  6e 2b 33 20 44 4f 20 76  25 69 20 3a 3d 20 30 3b  |n+3 DO v%i := 0;|
00002870  0a 0a 20 20 20 54 45 53  54 20 75 73 65 73 52 4c  |..   TEST usesRL|
00002880  20 7c 20 6c 61 62 65 6c  7e 3d 30 20 54 48 45 4e  | | label~=0 THEN|
00002890  20 7b 0a 20 20 20 20 20  20 4c 45 54 20 62 20 3d  | {.      LET b =|
000028a0  20 47 65 74 42 6c 6b 28  44 61 74 61 42 6c 6f 63  | GetBlk(DataBloc|
000028b0  6b 49 74 65 6d 73 2b 73  69 7a 65 2b 31 29 3b 0a  |kItems+size+1);.|
000028c0  20 20 20 20 20 20 21 62  20 3a 3d 20 53 44 61 74  |      !b := SDat|
000028d0  61 4c 69 73 74 3b 0a 20  20 20 20 20 20 53 44 61  |aList;.      SDa|
000028e0  74 61 4c 69 73 74 20 3a  3d 20 62 3b 0a 20 20 20  |taList := b;.   |
000028f0  20 20 20 62 21 45 6e 64  4f 66 44 61 74 61 49 6e  |   b!EndOfDataIn|
00002900  42 6c 6f 63 6b 20 3a 3d  20 73 69 7a 65 2b 44 61  |Block := size+Da|
00002910  74 61 42 6c 6f 63 6b 49  74 65 6d 73 3b 0a 20 20  |taBlockItems;.  |
00002920  20 20 20 20 46 4f 52 20  69 20 3d 20 30 20 54 4f  |    FOR i = 0 TO|
00002930  20 73 69 7a 65 20 44 4f  20 62 21 28 69 2b 44 61  | size DO b!(i+Da|
00002940  74 61 42 6c 6f 63 6b 49  74 65 6d 73 29 20 3a 3d  |taBlockItems) :=|
00002950  20 76 21 69 3b 0a 20 20  20 20 20 20 53 41 64 64  | v!i;.      SAdd|
00002960  72 20 3a 3d 20 53 41 64  64 72 2b 73 69 7a 65 2b  |r := SAddr+size+|
00002970  31 3b 0a 20 20 20 20 20  20 54 45 53 54 20 6c 61  |1;.      TEST la|
00002980  62 65 6c 3d 30 20 54 48  45 4e 0a 09 20 4c 6f 61  |bel=0 THEN.. Loa|
00002990  64 28 6b 2e 6c 76 73 74  61 74 69 63 2c 20 2d 53  |d(k.lvstatic, -S|
000029a0  41 64 64 72 29 0a 20 20  20 20 20 20 45 4c 53 45  |Addr).      ELSE|
000029b0  0a 09 20 73 74 61 74 69  63 4c 61 62 65 6c 73 20  |.. staticLabels |
000029c0  3a 3d 0a 09 20 20 20 20  46 69 6c 6c 42 6c 6b 28  |:=..    FillBlk(|
000029d0  34 2c 20 73 74 61 74 69  63 4c 61 62 65 6c 73 2c  |4, staticLabels,|
000029e0  20 6c 61 62 65 6c 2c 20  4e 75 6c 6c 2c 20 2d 34  | label, Null, -4|
000029f0  2a 53 41 64 64 72 29 20  7d 0a 20 20 20 45 4c 53  |*SAddr) }.   ELS|
00002a00  45 20 7b 0a 20 20 20 20  20 20 4c 6f 61 64 28 6b  |E {.      Load(k|
00002a10  2e 6c 76 6c 61 62 2c 20  6c 6f 63 61 6c 43 6f 6e  |.lvlab, localCon|
00002a20  73 74 4c 61 62 29 3b 0a  20 20 20 20 20 20 68 34  |stLab);.      h4|
00002a30  21 61 72 67 31 20 3a 3d  20 6c 6f 63 61 6c 46 61  |!arg1 := localFa|
00002a40  64 64 72 2f 34 3b 0a 20  20 20 20 20 20 46 4f 52  |ddr/4;.      FOR|
00002a50  20 69 20 3d 20 30 20 54  4f 20 73 69 7a 65 20 44  | i = 0 TO size D|
00002a60  4f 20 7b 0a 09 20 53 44  61 74 61 28 76 21 69 29  |O {.. SData(v!i)|
00002a70  3b 0a 09 20 6c 6f 63 61  6c 46 61 64 64 72 20 3a  |;.. localFaddr :|
00002a80  3d 20 6c 6f 63 61 6c 46  61 64 64 72 2b 34 20 7d  |= localFaddr+4 }|
00002a90  20 7d 20 7d 0a 0a 41 4e  44 20 47 65 6e 44 61 74  | } }..AND GenDat|
00002aa0  61 28 64 29 20 42 45 0a  20 20 20 57 48 49 4c 45  |a(d) BE.   WHILE|
00002ab0  20 64 7e 3d 30 20 44 4f  20 7b 0a 20 20 20 20 20  | d~=0 DO {.     |
00002ac0  20 46 4f 52 20 70 20 3d  20 44 61 74 61 42 6c 6f  | FOR p = DataBlo|
00002ad0  63 6b 49 74 65 6d 73 20  54 4f 20 64 21 45 6e 64  |ckItems TO d!End|
00002ae0  4f 66 44 61 74 61 49 6e  42 6c 6f 63 6b 20 44 4f  |OfDataInBlock DO|
00002af0  0a 09 20 50 75 74 57 6f  72 64 28 64 21 70 29 3b  |.. PutWord(d!p);|
00002b00  0a 20 20 20 20 20 20 64  20 3a 3d 20 64 21 4e 65  |.      d := d!Ne|
00002b10  78 74 42 6c 6f 63 6b 20  7d 0a 0a 41 4e 44 20 41  |xtBlock }..AND A|
00002b20  64 64 52 65 6c 6f 63 61  74 65 64 4c 6f 63 28 6c  |ddRelocatedLoc(l|
00002b30  6f 63 2c 20 6c 61 62 29  20 42 45 0a 20 20 20 72  |oc, lab) BE.   r|
00002b40  65 6c 6f 63 61 74 65 64  4c 6f 63 73 20 3a 3d 20  |elocatedLocs := |
00002b50  46 69 6c 6c 42 6c 6b 28  52 65 66 53 69 7a 65 2c  |FillBlk(RefSize,|
00002b60  20 72 65 6c 6f 63 61 74  65 64 4c 6f 63 73 2c 20  | relocatedLocs, |
00002b70  6c 6f 63 2c 20 6c 61 62  29 0a 0a 41 4e 44 20 41  |loc, lab)..AND A|
00002b80  64 64 58 52 65 6c 6f 63  61 74 65 64 4c 6f 63 28  |ddXRelocatedLoc(|
00002b90  6c 6f 63 2c 20 78 73 79  6d 2c 20 72 65 66 74 79  |loc, xsym, refty|
00002ba0  70 65 29 20 42 45 0a 20  20 20 78 72 65 6c 6f 63  |pe) BE.   xreloc|
00002bb0  61 74 65 64 4c 6f 63 73  20 3a 3d 20 46 69 6c 6c  |atedLocs := Fill|
00002bc0  42 6c 6b 28 52 65 66 53  69 7a 65 2c 20 78 52 65  |Blk(RefSize, xRe|
00002bd0  6c 6f 63 61 74 65 64 4c  6f 63 73 2c 20 6c 6f 63  |locatedLocs, loc|
00002be0  2c 20 78 73 79 6d 21 73  79 6d 2e 6e 6f 2b 72 65  |, xsym!sym.no+re|
00002bf0  66 74 79 70 65 29 0a 0a  41 4e 44 20 41 64 64 58  |ftype)..AND AddX|
00002c00  53 79 6d 62 6f 6c 28 69  64 2c 20 74 79 70 65 2c  |Symbol(id, type,|
00002c10  20 76 61 6c 75 65 29 20  3d 20 56 41 4c 4f 46 0a  | value) = VALOF.|
00002c20  7b 20 20 4c 45 54 20 70  20 3d 20 78 53 79 6d 62  |{  LET p = xSymb|
00002c30  6f 6c 73 3b 0a 20 20 20  4c 45 54 20 71 20 3d 20  |ols;.   LET q = |
00002c40  40 78 53 79 6d 62 6f 6c  73 3b 0a 20 20 20 57 48  |@xSymbols;.   WH|
00002c50  49 4c 45 20 70 7e 3d 30  20 44 4f 20 7b 0a 20 20  |ILE p~=0 DO {.  |
00002c60  20 20 20 20 49 46 20 43  6f 6d 70 53 74 72 69 6e  |    IF CompStrin|
00002c70  67 28 69 64 2c 20 73 79  6d 2e 69 64 21 70 29 3d  |g(id, sym.id!p)=|
00002c80  30 20 54 48 45 4e 20 7b  0a 09 20 49 46 20 74 79  |0 THEN {.. IF ty|
00002c90  70 65 7e 3d 30 20 54 48  45 4e 20 73 79 6d 2e 61  |pe~=0 THEN sym.a|
00002ca0  74 74 72 21 70 2c 20 73  79 6d 2e 76 61 6c 21 70  |ttr!p, sym.val!p|
00002cb0  20 3a 3d 20 74 79 70 65  2c 20 76 61 6c 75 65 3b  | := type, value;|
00002cc0  0a 09 20 52 45 53 55 4c  54 49 53 20 70 20 7d 3b  |.. RESULTIS p };|
00002cd0  0a 20 20 20 20 20 20 71  20 3a 3d 20 70 3b 0a 20  |.      q := p;. |
00002ce0  20 20 20 20 20 70 20 3a  3d 20 21 70 20 7d 3b 0a  |     p := !p };.|
00002cf0  20 20 20 21 71 20 3a 3d  20 46 69 6c 6c 42 6c 6b  |   !q := FillBlk|
00002d00  28 73 79 6d 2e 73 69 7a  65 2c 20 30 2c 20 30 2c  |(sym.size, 0, 0,|
00002d10  20 74 79 70 65 2c 20 78  53 79 6d 4e 6f 2c 20 49  | type, xSymNo, I|
00002d20  6e 74 65 72 6e 53 74 72  69 6e 67 28 69 64 29 2c  |nternString(id),|
00002d30  20 76 61 6c 75 65 29 3b  0a 20 20 20 78 53 79 6d  | value);.   xSym|
00002d40  4e 6f 20 3a 3d 20 78 53  79 6d 4e 6f 2b 31 3b 0a  |No := xSymNo+1;.|
00002d50  20 20 20 52 45 53 55 4c  54 49 53 20 21 71 20 7d  |   RESULTIS !q }|
00002d60  0a 0a 41 4e 44 20 49 6e  74 65 72 6e 53 74 72 69  |..AND InternStri|
00002d70  6e 67 28 73 74 72 69 6e  67 29 20 3d 20 56 41 4c  |ng(string) = VAL|
00002d80  4f 46 0a 7b 20 20 4c 45  54 20 6e 20 3d 20 28 73  |OF.{  LET n = (s|
00002d90  74 72 69 6e 67 25 30 2b  31 29 2f 42 79 74 65 73  |tring%0+1)/Bytes|
00002da0  50 65 72 57 6f 72 64 3b  0a 20 20 20 4c 45 54 20  |PerWord;.   LET |
00002db0  73 20 3d 20 47 65 74 42  6c 6b 28 6e 2b 31 29 3b  |s = GetBlk(n+1);|
00002dc0  0a 20 20 20 46 4f 52 20  69 20 3d 20 30 20 54 4f  |.   FOR i = 0 TO|
00002dd0  20 6e 20 44 4f 20 73 21  69 20 3a 3d 20 73 74 72  | n DO s!i := str|
00002de0  69 6e 67 21 69 3b 0a 20  20 20 52 45 53 55 4c 54  |ing!i;.   RESULT|
00002df0  49 53 20 73 20 7d 0a 0a  41 4e 44 20 47 65 6e 58  |IS s }..AND GenX|
00002e00  53 79 6d 28 6e 61 6d 65  2c 20 6c 61 62 65 6c 29  |Sym(name, label)|
00002e10  20 42 45 20 7b 0a 20 20  20 4c 45 54 20 77 20 3d  | BE {.   LET w =|
00002e20  20 56 45 43 20 32 35 36  2f 42 79 74 65 73 50 65  | VEC 256/BytesPe|
00002e30  72 57 6f 72 64 3b 0a 20  20 20 4c 45 54 20 6b 20  |rWord;.   LET k |
00002e40  3d 20 73 65 63 74 69 6f  6e 4e 61 6d 65 25 30 3b  |= sectionName%0;|
00002e50  0a 20 20 20 4c 45 54 20  6b 31 20 3d 20 6e 61 6d  |.   LET k1 = nam|
00002e60  65 25 30 3b 0a 20 20 20  46 4f 52 20 69 20 3d 20  |e%0;.   FOR i = |
00002e70  31 20 54 4f 20 6b 20 44  4f 20 77 25 69 20 3a 3d  |1 TO k DO w%i :=|
00002e80  20 73 65 63 74 69 6f 6e  4e 61 6d 65 25 69 3b 0a  | sectionName%i;.|
00002e90  20 20 20 6b 20 3a 3d 20  6b 2b 31 3b 0a 20 20 20  |   k := k+1;.   |
00002ea0  77 25 6b 20 3a 3d 20 27  2e 27 3b 0a 20 20 20 46  |w%k := '.';.   F|
00002eb0  4f 52 20 69 20 3d 20 31  20 54 4f 20 6b 31 20 44  |OR i = 1 TO k1 D|
00002ec0  4f 20 77 25 28 6b 2b 69  29 20 3a 3d 20 6e 61 6d  |O w%(k+i) := nam|
00002ed0  65 25 69 3b 0a 20 20 20  77 25 30 20 3a 3d 20 6b  |e%i;.   w%0 := k|
00002ee0  2b 6b 31 3b 0a 20 20 20  53 65 74 4c 61 62 65 6c  |+k1;.   SetLabel|
00002ef0  28 6c 61 62 65 6c 29 3b  0a 20 20 20 41 64 64 58  |(label);.   AddX|
00002f00  53 79 6d 62 6f 6c 28 77  2c 20 31 2c 20 6c 61 62  |Symbol(w, 1, lab|
00002f10  65 6c 29 20 7d 0a 0a 41  4e 44 20 43 47 47 6c 6f  |el) }..AND CGGlo|
00002f20  62 61 6c 28 6e 29 20 42  45 0a 7b 20 20 4c 45 54  |bal(n) BE.{  LET|
00002f30  20 6c 64 6d 74 79 70 65  20 3d 20 72 65 76 65 72  | ldmtype = rever|
00002f40  73 65 64 53 74 61 63 6b  20 7c 20 73 61 76 65 53  |sedStack | saveS|
00002f50  70 61 63 65 53 69 7a 65  3d 33 20 2d 3e 20 75 70  |paceSize=3 -> up|
00002f60  53 74 61 63 6b 2c 0a 09  09 09 09 09 09 20 20 20  |Stack,.......   |
00002f70  20 75 70 53 74 61 63 6b  2b 66 2e 70 72 65 3b 0a  | upStack+f.pre;.|
00002f80  20 20 20 64 65 61 64 43  6f 64 65 20 3a 3d 20 41  |   deadCode := A|
00002f90  6c 69 76 65 3b 0a 20 20  20 49 46 20 28 21 5b 46  |live;.   IF (![F|
00002fa0  69 6e 64 4c 61 62 65 6c  45 6e 74 72 79 28 63 61  |indLabelEntry(ca|
00002fb0  6c 6c 4c 61 62 29 5d 20  26 20 6c 61 62 2e 76 61  |llLab)] & lab.va|
00002fc0  6c 75 65 29 7e 3d 30 20  54 48 45 4e 20 7b 0a 20  |lue)~=0 THEN {. |
00002fd0  20 20 20 20 20 47 65 6e  58 53 79 6d 28 22 5f 43  |     GenXSym("_C|
00002fe0  61 6c 6c 22 2c 20 63 61  6c 6c 4c 61 62 29 3b 0a  |all", callLab);.|
00002ff0  20 20 20 20 20 20 47 65  6e 52 52 28 66 2e 6d 6f  |      GenRR(f.mo|
00003000  76 2c 20 72 2e 70 63 2c  20 30 2c 20 72 2e 62 29  |v, r.pc, 0, r.b)|
00003010  20 7d 3b 0a 0a 20 20 20  49 46 20 28 21 5b 46 69  | };..   IF (![Fi|
00003020  6e 64 4c 61 62 65 6c 45  6e 74 72 79 28 65 78 69  |ndLabelEntry(exi|
00003030  74 43 61 6c 6c 4c 61 62  29 5d 20 26 20 6c 61 62  |tCallLab)] & lab|
00003040  2e 76 61 6c 75 65 29 7e  3d 30 20 54 48 45 4e 20  |.value)~=0 THEN |
00003050  7b 0a 20 20 20 20 20 20  47 65 6e 58 53 79 6d 28  |{.      GenXSym(|
00003060  22 5f 45 78 69 74 43 61  6c 6c 22 2c 20 65 78 69  |"_ExitCall", exi|
00003070  74 43 61 6c 6c 4c 61 62  29 3b 0a 20 20 20 20 20  |tCallLab);.     |
00003080  20 47 65 6e 52 52 28 66  2e 6d 6f 76 2c 20 72 2e  | GenRR(f.mov, r.|
00003090  74 73 2c 20 30 2c 20 72  2e 70 29 3b 0a 20 20 20  |ts, 0, r.p);.   |
000030a0  20 20 20 46 34 49 6e 73  74 28 66 2e 6c 64 6d 2c  |   F4Inst(f.ldm,|
000030b0  20 72 2e 74 73 2c 20 66  34 2e 70 6c 31 34 2c 20  | r.ts, f4.pl14, |
000030c0  6c 64 6d 74 79 70 65 29  3b 0a 20 20 20 20 20 20  |ldmtype);.      |
000030d0  47 65 6e 52 52 28 66 2e  6d 6f 76 2c 20 72 2e 70  |GenRR(f.mov, r.p|
000030e0  63 2c 20 30 2c 20 72 2e  62 29 20 7d 3b 0a 0a 20  |c, 0, r.b) };.. |
000030f0  20 20 49 46 20 28 21 5b  46 69 6e 64 4c 61 62 65  |  IF (![FindLabe|
00003100  6c 45 6e 74 72 79 28 65  78 69 74 4c 61 62 29 5d  |lEntry(exitLab)]|
00003110  20 26 20 6c 61 62 2e 76  61 6c 75 65 29 7e 3d 30  | & lab.value)~=0|
00003120  20 54 48 45 4e 20 7b 0a  20 20 20 20 20 20 47 65  | THEN {.      Ge|
00003130  6e 58 53 79 6d 28 22 5f  45 78 69 74 22 2c 20 65  |nXSym("_Exit", e|
00003140  78 69 74 4c 61 62 29 3b  0a 20 20 20 20 20 20 47  |xitLab);.      G|
00003150  65 6e 52 52 28 66 2e 6d  6f 76 2c 20 72 2e 74 73  |enRR(f.mov, r.ts|
00003160  2c 20 30 2c 20 72 2e 70  29 3b 0a 20 20 20 20 20  |, 0, r.p);.     |
00003170  20 46 34 49 6e 73 74 28  66 2e 6c 64 6d 2c 20 72  | F4Inst(f.ldm, r|
00003180  2e 74 73 2c 20 66 34 2e  70 6c 70 63 2c 20 6c 64  |.ts, f4.plpc, ld|
00003190  6d 74 79 70 65 2b 66 2e  70 63 29 20 7d 3b 0a 0a  |mtype+f.pc) };..|
000031a0  20 20 20 49 46 20 28 21  5b 46 69 6e 64 4c 61 62  |   IF (![FindLab|
000031b0  65 6c 45 6e 74 72 79 28  6d 75 6c 74 4c 61 62 29  |elEntry(multLab)|
000031c0  5d 20 26 20 6c 61 62 2e  76 61 6c 75 65 29 7e 3d  |] & lab.value)~=|
000031d0  30 20 54 48 45 4e 20 7b  0a 20 20 20 20 20 20 47  |0 THEN {.      G|
000031e0  65 6e 58 53 79 6d 28 22  5f 4d 75 6c 74 69 70 6c  |enXSym("_Multipl|
000031f0  79 22 2c 20 6d 75 6c 74  4c 61 62 29 3b 0a 20 20  |y", multLab);.  |
00003200  20 20 20 20 53 65 74 52  74 6f 52 70 6c 75 73 4b  |    SetRtoRplusK|
00003210  28 72 2e 70 63 2c 20 72  2e 67 62 2c 20 73 72 2e  |(r.pc, r.gb, sr.|
00003220  6d 75 6c 74 69 70 6c 79  29 20 7d 3b 0a 0a 20 20  |multiply) };..  |
00003230  20 49 46 20 28 21 5b 46  69 6e 64 4c 61 62 65 6c  | IF (![FindLabel|
00003240  45 6e 74 72 79 28 71 75  6f 74 4c 61 62 29 5d 20  |Entry(quotLab)] |
00003250  26 20 6c 61 62 2e 76 61  6c 75 65 29 7e 3d 30 20  |& lab.value)~=0 |
00003260  54 48 45 4e 20 7b 0a 20  20 20 20 20 20 47 65 6e  |THEN {.      Gen|
00003270  58 53 79 6d 28 22 5f 51  75 6f 74 52 65 6d 22 2c  |XSym("_QuotRem",|
00003280  20 71 75 6f 74 4c 61 62  29 3b 0a 20 20 20 20 20  | quotLab);.     |
00003290  20 53 65 74 52 74 6f 52  70 6c 75 73 4b 28 72 2e  | SetRtoRplusK(r.|
000032a0  70 63 2c 20 72 2e 67 62  2c 20 73 72 2e 71 75 6f  |pc, r.gb, sr.quo|
000032b0  74 72 65 6d 29 20 7d 3b  0a 0a 20 20 20 64 65 61  |trem) };..   dea|
000032c0  64 43 6f 64 65 20 3a 3d  20 44 65 61 64 3b 0a 20  |dCode := Dead;. |
000032d0  20 20 53 65 74 41 72 65  61 28 64 61 74 61 41 72  |  SetArea(dataAr|
000032e0  65 61 29 3b 0a 20 20 20  53 65 74 4c 61 62 65 6c  |ea);.   SetLabel|
000032f0  28 53 4c 61 62 29 3b 0a  20 20 20 47 65 6e 44 61  |(SLab);.   GenDa|
00003300  74 61 28 53 44 61 74 61  4c 69 73 74 29 3b 0a 20  |ta(SDataList);. |
00003310  20 20 72 65 6c 6f 63 61  74 65 52 65 66 65 72 65  |  relocateRefere|
00003320  6e 63 65 73 20 3a 3d 20  54 52 55 45 3b 0a 20 20  |nces := TRUE;.  |
00003330  20 53 65 74 4c 61 62 65  6c 28 73 74 61 74 69 63  | SetLabel(static|
00003340  44 61 74 61 4c 61 62 29  3b 0a 20 20 20 72 65 6c  |DataLab);.   rel|
00003350  6f 63 61 74 65 52 65 66  65 72 65 6e 63 65 73 20  |ocateReferences |
00003360  3a 3d 20 46 41 4c 53 45  3b 0a 20 20 20 73 74 61  |:= FALSE;.   sta|
00003370  74 69 63 44 61 74 61 4c  6f 63 20 3a 3d 20 6c 6f  |ticDataLoc := lo|
00003380  63 43 74 72 3b 0a 20 20  20 7b 20 20 4c 45 54 20  |cCtr;.   {  LET |
00003390  64 20 3d 20 44 61 74 61  4c 69 73 74 3b 0a 20 20  |d = DataList;.  |
000033a0  20 20 20 20 57 48 49 4c  45 20 64 7e 3d 30 20 44  |    WHILE d~=0 D|
000033b0  4f 20 7b 0a 09 20 46 4f  52 20 70 20 3d 20 44 61  |O {.. FOR p = Da|
000033c0  74 61 42 6c 6f 63 6b 49  74 65 6d 73 20 54 4f 20  |taBlockItems TO |
000033d0  64 21 45 6e 64 4f 66 44  61 74 61 49 6e 42 6c 6f  |d!EndOfDataInBlo|
000033e0  63 6b 20 42 59 20 32 20  44 4f 20 7b 0a 09 20 20  |ck BY 2 DO {..  |
000033f0  20 20 4c 45 54 20 6e 20  3d 20 64 21 28 70 2b 31  |  LET n = d!(p+1|
00003400  29 3b 0a 09 20 20 20 20  53 57 49 54 43 48 4f 4e  |);..    SWITCHON|
00003410  20 64 21 70 20 49 4e 54  4f 20 7b 0a 09 20 20 20  | d!p INTO {..   |
00003420  20 20 20 20 43 41 53 45  20 73 2e 64 61 74 61 6c  |    CASE s.datal|
00003430  61 62 3a 0a 09 09 20 20  53 65 74 4c 61 62 65 6c  |ab:...  SetLabel|
00003440  28 6e 29 3b 20 45 4e 44  43 41 53 45 0a 0a 09 20  |(n); ENDCASE... |
00003450  20 20 20 20 20 20 43 41  53 45 20 73 2e 69 74 65  |      CASE s.ite|
00003460  6d 6e 3a 0a 09 09 20 20  50 75 74 57 6f 72 64 28  |mn:...  PutWord(|
00003470  6e 29 3b 20 45 4e 44 43  41 53 45 0a 0a 09 20 20  |n); ENDCASE...  |
00003480  20 20 20 20 20 43 41 53  45 20 73 2e 69 74 65 6d  |     CASE s.item|
00003490  6c 3a 0a 09 09 20 20 41  64 64 52 65 6c 6f 63 61  |l:...  AddReloca|
000034a0  74 65 64 4c 6f 63 28 6c  6f 63 43 74 72 2c 20 6e  |tedLoc(locCtr, n|
000034b0  29 3b 0a 09 09 20 20 41  64 64 72 65 73 73 49 6e  |);...  AddressIn|
000034c0  43 6f 64 65 28 6e 2c 20  30 29 3b 0a 09 09 20 20  |Code(n, 0);...  |
000034d0  45 4e 44 43 41 53 45 0a  0a 09 20 20 20 20 20 20  |ENDCASE...      |
000034e0  20 43 41 53 45 20 73 2e  69 74 65 6d 78 3a 0a 09  | CASE s.itemx:..|
000034f0  09 20 20 41 64 64 58 52  65 6c 6f 63 61 74 65 64  |.  AddXRelocated|
00003500  4c 6f 63 28 6c 6f 63 43  74 72 2c 20 41 64 64 58  |Loc(locCtr, AddX|
00003510  53 79 6d 62 6f 6c 28 6e  2c 20 30 2c 20 30 29 2c  |Symbol(n, 0, 0),|
00003520  20 52 65 6c 57 6f 72 64  2b 52 65 6c 53 79 6d 62  | RelWord+RelSymb|
00003530  6f 6c 29 3b 0a 09 09 20  20 50 75 74 57 6f 72 64  |ol);...  PutWord|
00003540  28 30 29 20 7d 20 7d 3b  0a 09 20 64 20 3a 3d 20  |(0) } };.. d := |
00003550  64 21 4e 65 78 74 42 6c  6f 63 6b 20 7d 20 7d 3b  |d!NextBlock } };|
00003560  0a 20 20 20 53 65 74 4c  61 62 65 6c 28 46 4c 61  |.   SetLabel(FLa|
00003570  62 29 3b 0a 20 20 20 47  65 6e 44 61 74 61 28 46  |b);.   GenData(F|
00003580  44 61 74 61 4c 69 73 74  29 3b 0a 0a 20 20 20 53  |DataList);..   S|
00003590  65 74 41 72 65 61 28 43  6f 64 65 41 72 65 61 29  |etArea(CodeArea)|
000035a0  3b 0a 20 20 20 53 65 74  4c 61 62 65 6c 28 65 6e  |;.   SetLabel(en|
000035b0  64 53 65 63 74 4c 61 62  65 6c 29 3b 0a 20 20 20  |dSectLabel);.   |
000035c0  46 4f 52 20 69 20 3d 20  31 20 54 4f 20 6e 20 44  |FOR i = 1 TO n D|
000035d0  4f 20 7b 0a 20 20 20 20  20 20 4c 45 54 20 6c 20  |O {.      LET l |
000035e0  3d 20 3f 3b 0a 20 20 20  20 20 20 50 75 74 57 6f  |= ?;.      PutWo|
000035f0  72 64 28 52 65 61 64 47  4e 28 29 29 3b 0a 20 20  |rd(ReadGN());.  |
00003600  20 20 20 20 6c 20 3a 3d  20 52 65 61 64 4c 28 29  |    l := ReadL()|
00003610  3b 0a 20 20 20 20 20 20  41 64 64 52 65 6c 6f 63  |;.      AddReloc|
00003620  61 74 65 64 4c 6f 63 28  6c 6f 63 43 74 72 2c 20  |atedLoc(locCtr, |
00003630  6c 29 3b 0a 20 20 20 20  20 20 41 64 64 72 65 73  |l);.      Addres|
00003640  73 49 6e 43 6f 64 65 28  6c 2c 20 30 29 20 7d 3b  |sInCode(l, 0) };|
00003650  0a 20 20 20 50 75 74 57  6f 72 64 28 4d 61 78 47  |.   PutWord(MaxG|
00003660  6e 29 3b 0a 20 20 20 50  75 74 57 6f 72 64 28 30  |n);.   PutWord(0|
00003670  29 3b 0a 20 20 20 49 46  20 7e 61 6f 66 4f 75 74  |);.   IF ~aofOut|
00003680  20 54 48 45 4e 0a 20 20  20 7b 20 20 4c 45 54 20  | THEN.   {  LET |
00003690  73 65 74 54 6f 50 43 70  6c 75 73 20 3d 20 6d 2e  |setToPCplus = m.|
000036a0  61 6c 77 61 79 73 2b 66  2e 61 64 64 2b 23 78 32  |always+f.add+#x2|
000036b0  30 30 30 30 30 30 2b 28  72 2e 70 63 3c 3c 31 36  |000000+(r.pc<<16|
000036c0  29 3b 0a 20 20 20 20 20  20 57 48 49 4c 45 20 52  |);.      WHILE R|
000036d0  4c 4c 6f 61 64 4c 69 73  74 7e 3d 30 20 44 4f 20  |LLoadList~=0 DO |
000036e0  7b 0a 09 20 4c 45 54 20  6c 6f 63 20 3d 20 31 21  |{.. LET loc = 1!|
000036f0  52 4c 4c 6f 61 64 4c 69  73 74 3b 0a 09 20 4c 45  |RLLoadList;.. LE|
00003700  54 20 6f 66 66 73 65 74  20 3d 20 73 74 61 74 69  |T offset = stati|
00003710  63 44 61 74 61 4c 6f 63  2d 6c 6f 63 2d 38 3b 0a  |cDataLoc-loc-8;.|
00003720  09 20 4c 45 54 20 72 6c  20 3d 20 52 65 61 64 57  |. LET rl = ReadW|
00003730  6f 72 64 28 6c 6f 63 29  26 23 78 66 30 30 30 3b  |ord(loc)&#xf000;|
00003740  0a 09 20 54 45 53 54 20  45 69 67 68 74 42 69 74  |.. TEST EightBit|
00003750  73 4f 72 46 65 77 65 72  28 6f 66 66 73 65 74 29  |sOrFewer(offset)|
00003760  20 54 48 45 4e 0a 09 20  20 20 20 57 72 69 74 65  | THEN..    Write|
00003770  57 6f 72 64 28 6c 6f 63  2c 20 73 65 74 54 6f 50  |Word(loc, setToP|
00003780  43 70 6c 75 73 2b 72 6c  2b 50 61 63 6b 55 70 28  |Cplus+rl+PackUp(|
00003790  6f 66 66 73 65 74 29 29  0a 09 20 45 4c 53 45 20  |offset)).. ELSE |
000037a0  49 46 20 45 69 67 68 74  42 69 74 73 4f 72 46 65  |IF EightBitsOrFe|
000037b0  77 65 72 28 6f 66 66 73  65 74 2b 34 29 20 54 48  |wer(offset+4) TH|
000037c0  45 4e 20 7b 0a 09 20 20  20 20 4c 45 54 20 77 20  |EN {..    LET w |
000037d0  3d 20 52 65 61 64 57 6f  72 64 28 6c 6f 63 2d 34  |= ReadWord(loc-4|
000037e0  29 3b 0a 09 20 20 20 20  57 72 69 74 65 57 6f 72  |);..    WriteWor|
000037f0  64 28 6c 6f 63 2d 34 2c  20 73 65 74 54 6f 50 43  |d(loc-4, setToPC|
00003800  70 6c 75 73 2b 72 6c 2b  50 61 63 6b 55 70 28 6f  |plus+rl+PackUp(o|
00003810  66 66 73 65 74 2b 34 29  29 3b 0a 09 20 20 20 20  |ffset+4));..    |
00003820  57 72 69 74 65 57 6f 72  64 28 6c 6f 63 2c 20 77  |WriteWord(loc, w|
00003830  29 20 7d 3b 0a 09 20 52  4c 4c 6f 61 64 4c 69 73  |) };.. RLLoadLis|
00003840  74 20 3a 3d 20 46 72 65  65 42 6c 6b 28 52 4c 4c  |t := FreeBlk(RLL|
00003850  6f 61 64 4c 69 73 74 2c  20 32 29 20 7d 20 7d 20  |oadList, 2) } } |
00003860  7d 0a 0a 41 4e 44 20 50  72 69 6e 74 69 6e 67 43  |}..AND PrintingC|
00003870  68 61 72 61 63 74 65 72  28 6e 29 20 3d 20 23 78  |haracter(n) = #x|
00003880  32 30 3c 3d 6e 3c 23 78  37 66 0a 0a 41 4e 44 20  |20<=n<#x7f..AND |
00003890  50 72 69 6e 74 48 65 78  41 6e 64 43 68 61 72 73  |PrintHexAndChars|
000038a0  28 6c 6f 63 2c 20 6e 2c  20 66 6e 6e 61 6d 65 29  |(loc, n, fnname)|
000038b0  20 42 45 0a 7b 20 20 57  72 69 74 65 46 28 22 20  | BE.{  WriteF(" |
000038c0  26 20 26 25 78 38 22 2c  20 6e 29 3b 0a 20 20 20  |& &%x8", n);.   |
000038d0  53 74 61 72 74 43 6f 6d  6d 65 6e 74 28 29 3b 0a  |StartComment();.|
000038e0  20 20 20 57 72 69 74 65  46 28 22 25 78 34 20 20  |   WriteF("%x4  |
000038f0  22 2c 20 6c 6f 63 29 3b  0a 20 20 20 49 46 20 7e  |", loc);.   IF ~|
00003900  66 6e 6e 61 6d 65 20 26  20 28 6e 26 23 78 66 66  |fnname & (n&#xff|
00003910  30 30 30 30 30 30 29 7e  3d 23 78 66 66 30 30 30  |000000)~=#xff000|
00003920  30 30 30 0a 20 20 20 20  20 20 54 48 45 4e 20 46  |000.      THEN F|
00003930  4f 52 20 69 20 3d 20 30  20 54 4f 20 33 20 44 4f  |OR i = 0 TO 3 DO|
00003940  20 7b 0a 09 20 4c 45 54  20 63 20 3d 20 5b 6e 3e  | {.. LET c = [n>|
00003950  3e 28 69 2a 38 29 5d 20  26 20 32 35 35 3b 0a 09  |>(i*8)] & 255;..|
00003960  20 57 72 43 68 28 63 3c  33 32 20 7c 20 63 3e 3d  | WrCh(c<32 | c>=|
00003970  31 32 37 20 2d 3e 20 27  2e 27 2c 20 63 29 20 7d  |127 -> '.', c) }|
00003980  3b 0a 20 20 20 4e 65 77  4c 69 6e 65 28 29 20 7d  |;.   NewLine() }|
00003990  0a 0a 41 4e 44 20 50 72  69 6e 74 53 69 7a 65 73  |..AND PrintSizes|
000039a0  28 73 6f 66 61 72 29 20  3d 20 56 41 4c 4f 46 20  |(sofar) = VALOF |
000039b0  7b 0a 20 20 20 54 45 53  54 20 61 6f 66 4f 75 74  |{.   TEST aofOut|
000039c0  20 54 48 45 4e 20 7b 0a  20 20 20 20 20 20 57 72  | THEN {.      Wr|
000039d0  69 74 65 46 28 22 73 20  25 6e 2b 25 6e 22 2c 20  |iteF("s %n+%n", |
000039e0  63 61 72 65 63 21 61 2e  6c 6f 63 43 2c 20 64 61  |carec!a.locC, da|
000039f0  72 65 63 21 61 2e 6c 6f  63 43 29 3b 0a 20 20 20  |rec!a.locC);.   |
00003a00  20 20 20 73 6f 66 61 72  20 3a 3d 20 73 6f 66 61  |   sofar := sofa|
00003a10  72 2b 63 61 72 65 63 21  61 2e 6c 6f 63 43 2b 64  |r+carec!a.locC+d|
00003a20  61 72 65 63 21 61 2e 6c  6f 63 43 20 7d 0a 20 20  |arec!a.locC }.  |
00003a30  20 45 4c 53 45 20 7b 0a  20 20 20 20 20 20 57 72  | ELSE {.      Wr|
00003a40  69 74 65 46 28 22 20 25  6e 22 2c 20 6c 6f 63 63  |iteF(" %n", locc|
00003a50  74 72 29 3b 0a 20 20 20  20 20 20 73 6f 66 61 72  |tr);.      sofar|
00003a60  20 3a 3d 20 73 6f 66 61  72 2b 4c 6f 63 43 74 72  | := sofar+LocCtr|
00003a70  20 7d 0a 20 20 20 57 72  69 74 65 53 28 22 20 62  | }.   WriteS(" b|
00003a80  79 74 65 73 22 29 3b 0a  20 20 20 52 45 53 55 4c  |ytes");.   RESUL|
00003a90  54 49 53 20 73 6f 66 61  72 20 7d 0a 0a 41 4e 44  |TIS sofar }..AND|
00003aa0  20 50 72 69 6e 74 57 6f  72 64 73 28 65 6e 64 2c  | PrintWords(end,|
00003ab0  20 6c 69 6e 65 73 2c 20  74 68 69 73 41 72 65 61  | lines, thisArea|
00003ac0  29 20 42 45 20 7b 0a 20  20 20 4c 45 54 20 66 6e  |) BE {.   LET fn|
00003ad0  6e 61 6d 65 20 3d 20 46  41 4c 53 45 3b 0a 20 20  |name = FALSE;.  |
00003ae0  20 4c 45 54 20 6e 6f 74  49 6e 73 74 20 3d 20 46  | LET notInst = F|
00003af0  41 4c 53 45 3b 0a 20 20  20 46 4f 52 20 6c 6f 63  |ALSE;.   FOR loc|
00003b00  20 3d 20 30 20 54 4f 20  6c 6f 63 43 74 72 2d 34  | = 0 TO locCtr-4|
00003b10  20 42 59 20 34 20 44 4f  20 7b 0a 20 20 20 20 20  | BY 4 DO {.     |
00003b20  20 4c 45 54 20 6e 20 3d  20 52 65 61 64 57 6f 72  | LET n = ReadWor|
00003b30  64 28 6c 6f 63 29 3b 0a  20 20 20 20 20 20 4c 45  |d(loc);.      LE|
00003b40  54 20 78 20 3d 20 6e 26  23 78 66 66 66 66 30 30  |T x = n&#xffff00|
00003b50  30 30 3b 0a 20 20 20 20  20 20 4c 45 54 20 6c 61  |00;.      LET la|
00003b60  62 20 3d 20 30 3b 0a 20  20 20 20 20 20 4c 45 54  |b = 0;.      LET|
00003b70  20 6c 69 6e 65 20 3d 20  41 73 73 6f 63 28 6c 6f  | line = Assoc(lo|
00003b80  63 2c 20 32 2c 20 6c 69  6e 65 43 6f 75 6e 74 73  |c, 2, lineCounts|
00003b90  29 3b 0a 20 20 20 20 20  20 49 46 20 6c 69 6e 65  |);.      IF line|
00003ba0  7e 3d 4e 75 6c 6c 20 26  20 6c 69 6e 65 73 20 54  |~=Null & lines T|
00003bb0  48 45 4e 20 57 72 69 74  65 46 28 22 3b 20 2d 2d  |HEN WriteF("; --|
00003bc0  20 4c 69 6e 65 20 25 6e  20 2d 2d 2a 6e 22 2c 20  | Line %n --*n", |
00003bd0  31 21 6c 69 6e 65 29 3b  0a 20 20 20 20 20 20 7b  |1!line);.      {|
00003be0  20 20 6c 61 62 20 3a 3d  20 4c 61 62 65 6c 57 69  |  lab := LabelWi|
00003bf0  74 68 56 61 6c 75 65 28  6c 6f 63 2b 74 68 69 73  |thValue(loc+this|
00003c00  41 72 65 61 2c 20 6c 61  62 2b 31 29 3b 0a 09 20  |Area, lab+1);.. |
00003c10  49 46 20 6c 61 62 3d 4e  75 6c 6c 20 54 48 45 4e  |IF lab=Null THEN|
00003c20  20 42 52 45 41 4b 3b 0a  09 20 57 72 69 74 65 46  | BREAK;.. WriteF|
00003c30  28 22 4c 25 6e 2a 6e 22  2c 20 6c 61 62 29 3b 0a  |("L%n*n", lab);.|
00003c40  09 20 7b 20 20 4c 45 54  20 70 20 3d 20 41 73 73  |. {  LET p = Ass|
00003c50  6f 63 28 6c 61 62 2c 20  35 2c 20 78 53 79 6d 62  |oc(lab, 5, xSymb|
00003c60  6f 6c 73 29 3b 0a 09 20  20 20 20 49 46 20 70 7e  |ols);..    IF p~|
00003c70  3d 4e 75 6c 6c 20 54 48  45 4e 20 57 72 69 74 65  |=Null THEN Write|
00003c80  46 28 22 7c 25 73 7c 2a  6e 22 2c 20 70 21 34 29  |F("|%s|*n", p!4)|
00003c90  20 7d 3b 0a 09 20 6e 6f  74 49 6e 73 74 20 3a 3d  | };.. notInst :=|
00003ca0  20 4c 61 62 65 6c 46 6c  61 67 67 65 64 28 6c 61  | LabelFlagged(la|
00003cb0  62 2c 20 6c 61 62 2e 65  6e 64 70 72 6f 63 6c 61  |b, lab.endprocla|
00003cc0  62 29 20 7d 20 52 45 50  45 41 54 3b 0a 0a 20 20  |b) } REPEAT;..  |
00003cd0  20 20 20 20 54 45 53 54  20 6c 6f 63 3c 34 30 20  |    TEST loc<40 |
00003ce0  7c 20 6c 6f 63 3e 3d 65  6e 64 20 7c 20 78 3d 30  || loc>=end | x=0|
00003cf0  20 7c 20 78 3d 23 78 66  66 66 66 30 30 30 30 20  | | x=#xffff0000 |
00003d00  7c 20 66 6e 6e 61 6d 65  20 54 48 45 4e 20 7b 0a  || fnname THEN {.|
00003d10  09 20 4c 45 54 20 70 20  3d 20 41 73 73 6f 63 28  |. LET p = Assoc(|
00003d20  6c 6f 63 2c 20 31 2c 20  72 65 6c 6f 63 61 74 65  |loc, 1, relocate|
00003d30  64 4c 6f 63 73 29 3b 0a  09 20 54 45 53 54 20 70  |dLocs);.. TEST p|
00003d40  7e 3d 4e 75 6c 6c 20 54  48 45 4e 20 7b 0a 09 20  |~=Null THEN {.. |
00003d50  20 20 20 57 72 69 74 65  46 28 22 20 26 20 4c 25  |   WriteF(" & L%|
00003d60  6e 22 2c 20 54 72 61 6e  73 66 65 72 72 65 64 4c  |n", TransferredL|
00003d70  61 62 65 6c 28 32 21 70  29 29 3b 0a 09 20 20 20  |abel(2!p));..   |
00003d80  20 53 74 61 72 74 43 6f  6d 6d 65 6e 74 28 29 3b  | StartComment();|
00003d90  0a 09 20 20 20 20 57 72  69 74 65 46 28 22 25 78  |..    WriteF("%x|
00003da0  34 20 20 25 78 38 2a 6e  22 2c 20 6c 6f 63 2c 20  |4  %x8*n", loc, |
00003db0  6e 29 20 7d 0a 09 20 45  4c 53 45 20 7b 0a 09 20  |n) }.. ELSE {.. |
00003dc0  20 20 20 70 20 3a 3d 20  41 73 73 6f 63 28 6c 6f  |   p := Assoc(lo|
00003dd0  63 2c 20 31 2c 20 58 52  65 6c 6f 63 61 74 65 64  |c, 1, XRelocated|
00003de0  4c 6f 63 73 29 3b 0a 09  20 20 20 20 54 45 53 54  |Locs);..    TEST|
00003df0  20 70 7e 3d 4e 75 6c 6c  20 54 48 45 4e 20 7b 0a  | p~=Null THEN {.|
00003e00  09 20 20 20 20 20 20 20  57 72 69 74 65 53 28 22  |.       WriteS("|
00003e10  20 26 20 22 29 3b 0a 09  20 20 20 20 20 20 20 49  | & ");..       I|
00003e20  46 20 6e 7e 3d 30 20 54  48 45 4e 20 57 72 69 74  |F n~=0 THEN Writ|
00003e30  65 46 28 22 25 6e 2b 22  2c 20 6e 29 3b 0a 09 20  |eF("%n+", n);.. |
00003e40  20 20 20 20 20 20 57 72  69 74 65 46 28 22 7c 25  |      WriteF("|%|
00003e50  73 7c 22 2c 20 53 79 6d  62 6f 6c 4f 66 52 65 6c  |s|", SymbolOfRel|
00003e60  6f 63 28 70 29 29 3b 0a  09 20 20 20 20 20 20 20  |oc(p));..       |
00003e70  53 74 61 72 74 43 6f 6d  6d 65 6e 74 28 29 3b 0a  |StartComment();.|
00003e80  09 20 20 20 20 20 20 20  57 72 69 74 65 46 28 22  |.       WriteF("|
00003e90  25 78 34 2a 6e 22 2c 20  6c 6f 63 29 20 7d 0a 09  |%x4*n", loc) }..|
00003ea0  20 20 20 20 45 4c 53 45  0a 09 20 20 20 20 20 20  |    ELSE..      |
00003eb0  20 50 72 69 6e 74 48 65  78 41 6e 64 43 68 61 72  | PrintHexAndChar|
00003ec0  73 28 6c 6f 63 2c 20 6e  2c 20 66 6e 6e 61 6d 65  |s(loc, n, fnname|
00003ed0  29 20 7d 3b 0a 0a 09 20  66 6e 6e 61 6d 65 20 3a  |) };... fnname :|
00003ee0  3d 20 46 41 4c 53 45 20  7d 0a 0a 20 20 20 20 20  |= FALSE }..     |
00003ef0  20 45 4c 53 45 20 54 45  53 54 20 28 40 6e 29 25  | ELSE TEST (@n)%|
00003f00  30 3d 37 20 26 20 50 72  69 6e 74 69 6e 67 43 68  |0=7 & PrintingCh|
00003f10  61 72 61 63 74 65 72 28  28 40 6e 29 25 31 29 20  |aracter((@n)%1) |
00003f20  26 0a 09 09 09 20 20 20  50 72 69 6e 74 69 6e 67  |&....   Printing|
00003f30  43 68 61 72 61 63 74 65  72 28 28 40 6e 29 25 32  |Character((@n)%2|
00003f40  29 20 26 0a 09 09 09 20  20 20 50 72 69 6e 74 69  |) &....   Printi|
00003f50  6e 67 43 68 61 72 61 63  74 65 72 28 28 40 6e 29  |ngCharacter((@n)|
00003f60  25 33 29 20 54 48 45 4e  20 7b 0a 09 20 4c 45 54  |%3) THEN {.. LET|
00003f70  20 76 20 3d 20 56 45 43  20 31 3b 0a 09 20 76 21  | v = VEC 1;.. v!|
00003f80  30 20 3a 3d 20 6e 3b 0a  09 20 76 21 31 20 3a 3d  |0 := n;.. v!1 :=|
00003f90  20 52 65 61 64 57 6f 72  64 28 6c 6f 63 2b 34 29  | ReadWord(loc+4)|
00003fa0  3b 0a 09 20 66 6e 6e 61  6d 65 20 3a 3d 20 54 52  |;.. fnname := TR|
00003fb0  55 45 3b 0a 09 20 57 72  69 74 65 46 28 22 20 26  |UE;.. WriteF(" &|
00003fc0  20 26 25 78 38 20 20 20  20 3b 20 25 73 22 2c 20  | &%x8    ; %s", |
00003fd0  6e 2c 20 76 29 3b 0a 09  20 53 74 61 72 74 43 6f  |n, v);.. StartCo|
00003fe0  6d 6d 65 6e 74 28 29 3b  0a 09 20 57 72 69 74 65  |mment();.. Write|
00003ff0  46 28 22 25 78 34 2a 6e  22 2c 20 6c 6f 63 29 3b  |F("%x4*n", loc);|
00004000  0a 09 20 6e 6f 74 49 6e  73 74 20 3a 3d 20 46 41  |.. notInst := FA|
00004010  4c 53 45 20 7d 0a 0a 20  20 20 20 20 20 45 4c 53  |LSE }..      ELS|
00004020  45 20 54 45 53 54 20 6e  6f 74 49 6e 73 74 20 54  |E TEST notInst T|
00004030  48 45 4e 0a 09 20 50 72  69 6e 74 48 65 78 41 6e  |HEN.. PrintHexAn|
00004040  64 43 68 61 72 73 28 6c  6f 63 2c 20 6e 2c 20 46  |dChars(loc, n, F|
00004050  41 4c 53 45 29 0a 20 20  20 20 20 20 45 4c 53 45  |ALSE).      ELSE|
00004060  0a 09 20 50 72 69 6e 74  49 6e 73 74 72 75 63 74  |.. PrintInstruct|
00004070  69 6f 6e 28 6c 6f 63 2c  20 6e 29 20 7d 20 7d 0a  |ion(loc, n) } }.|
00004080  0a 41 4e 44 20 43 47 45  6e 64 28 29 20 42 45 0a  |.AND CGEnd() BE.|
00004090  7b 20 20 49 46 20 4c 69  73 74 53 74 72 65 61 6d  |{  IF ListStream|
000040a0  7e 3d 30 20 54 48 45 4e  20 7b 0a 20 20 20 20 20  |~=0 THEN {.     |
000040b0  20 4c 45 54 20 6f 20 3d  20 4f 75 74 70 75 74 28  | LET o = Output(|
000040c0  29 3b 0a 0a 20 20 20 20  20 20 53 65 6c 65 63 74  |);..      Select|
000040d0  4f 75 74 70 75 74 28 6c  69 73 74 53 74 72 65 61  |Output(listStrea|
000040e0  6d 29 3b 0a 20 20 20 20  20 20 49 6e 69 74 69 61  |m);.      Initia|
000040f0  6c 69 73 65 44 69 73 61  73 73 65 6d 62 6c 65 72  |liseDisassembler|
00004100  28 54 52 55 45 29 3b 0a  20 20 20 20 20 20 54 45  |(TRUE);.      TE|
00004110  53 54 20 61 6f 66 4f 75  74 20 54 48 45 4e 20 7b  |ST aofOut THEN {|
00004120  0a 09 20 53 65 74 41 72  65 61 28 63 6f 64 65 41  |.. SetArea(codeA|
00004130  72 65 61 29 3b 0a 09 20  57 72 69 74 65 53 28 22  |rea);.. WriteS("|
00004140  20 41 52 45 41 20 7c 42  43 50 4c 24 24 43 6f 64  | AREA |BCPL$$Cod|
00004150  65 7c 2c 20 43 4f 44 45  2c 20 52 45 41 44 4f 4e  |e|, CODE, READON|
00004160  4c 59 2a 6e 2a 6e 22 29  3b 0a 09 20 50 72 69 6e  |LY*n*n");.. Prin|
00004170  74 57 6f 72 64 73 28 56  61 6c 75 65 4f 66 4c 61  |tWords(ValueOfLa|
00004180  62 65 6c 28 65 6e 64 53  65 63 74 6c 61 62 65 6c  |bel(endSectlabel|
00004190  29 2c 20 54 52 55 45 2c  20 43 6f 64 65 41 72 65  |), TRUE, CodeAre|
000041a0  61 29 0a 09 20 57 72 69  74 65 53 28 22 2a 6e 20  |a).. WriteS("*n |
000041b0  41 52 45 41 20 7c 42 43  50 4c 24 24 44 61 74 61  |AREA |BCPL$$Data|
000041c0  7c 2a 6e 2a 6e 22 29 3b  0a 09 20 53 65 74 41 72  ||*n*n");.. SetAr|
000041d0  65 61 28 64 61 74 61 41  72 65 61 29 3b 0a 09 20  |ea(dataArea);.. |
000041e0  50 72 69 6e 74 57 6f 72  64 73 28 30 2c 20 46 41  |PrintWords(0, FA|
000041f0  4c 53 45 2c 20 64 61 74  61 41 72 65 61 29 20 7d  |LSE, dataArea) }|
00004200  0a 20 20 20 20 20 20 45  4c 53 45 0a 09 20 50 72  |.      ELSE.. Pr|
00004210  69 6e 74 57 6f 72 64 73  28 56 61 6c 75 65 4f 66  |intWords(ValueOf|
00004220  4c 61 62 65 6c 28 73 6c  61 62 29 2c 20 54 52 55  |Label(slab), TRU|
00004230  45 2c 20 30 29 3b 0a 0a  20 20 20 20 20 20 57 72  |E, 0);..      Wr|
00004240  69 74 65 53 28 22 20 45  4e 44 2a 4e 22 29 3b 0a  |iteS(" END*N");.|
00004250  20 20 20 20 20 20 54 65  72 6d 69 6e 61 74 65 44  |      TerminateD|
00004260  69 73 61 73 73 65 6d 62  6c 65 72 28 29 3b 0a 20  |isassembler();. |
00004270  20 20 20 20 20 53 65 6c  65 63 74 4f 75 74 70 75  |     SelectOutpu|
00004280  74 28 6f 29 20 7d 3b 0a  0a 20 20 20 4f 75 74 70  |t(o) };..   Outp|
00004290  75 74 53 65 63 74 69 6f  6e 28 29 20 7d 0a 0a 41  |utSection() }..A|
000042a0  4e 44 20 57 72 69 74 65  54 61 62 6c 65 28 74 29  |ND WriteTable(t)|
000042b0  20 42 45 0a 7b 20 20 4c  45 54 20 69 20 3d 20 30  | BE.{  LET i = 0|
000042c0  3b 0a 20 20 20 7b 20 20  4c 45 54 20 77 20 3d 20  |;.   {  LET w = |
000042d0  74 21 69 3b 0a 20 20 20  20 20 20 49 46 20 77 3d  |t!i;.      IF w=|
000042e0  2d 31 20 54 48 45 4e 20  52 45 54 55 52 4e 0a 20  |-1 THEN RETURN. |
000042f0  20 20 20 20 20 42 69 6e  57 6f 72 64 28 74 21 69  |     BinWord(t!i|
00004300  29 3b 0a 20 20 20 20 20  20 69 20 3a 3d 20 69 2b  |);.      i := i+|
00004310  31 20 7d 20 52 45 50 45  41 54 20 7d 0a 0a 41 4e  |1 } REPEAT }..AN|
00004320  44 20 57 72 69 74 65 4f  62 6a 53 74 72 69 6e 67  |D WriteObjString|
00004330  28 73 29 20 3d 20 56 41  4c 4f 46 0a 7b 20 20 4c  |(s) = VALOF.{  L|
00004340  45 54 20 6e 20 3d 20 73  25 30 3b 0a 20 20 20 4c  |ET n = s%0;.   L|
00004350  45 54 20 6e 6e 20 3d 20  28 6e 2b 34 29 26 2d 34  |ET nn = (n+4)&-4|
00004360  3b 0a 20 20 20 46 4f 52  20 69 20 3d 20 31 20 54  |;.   FOR i = 1 T|
00004370  4f 20 6e 20 44 4f 20 4f  75 74 42 79 74 65 28 73  |O n DO OutByte(s|
00004380  25 69 29 3b 0a 20 20 20  46 4f 52 20 69 20 3d 20  |%i);.   FOR i = |
00004390  6e 2b 31 20 54 4f 20 6e  6e 20 44 4f 20 4f 75 74  |n+1 TO nn DO Out|
000043a0  42 79 74 65 28 30 29 3b  0a 20 20 20 52 45 53 55  |Byte(0);.   RESU|
000043b0  4c 54 49 53 20 6e 6e 20  7d 0a 0a 41 4e 44 20 4f  |LTIS nn }..AND O|
000043c0  75 74 70 75 74 53 65 63  74 69 6f 6e 28 29 20 42  |utputSection() B|
000043d0  45 20 49 46 20 6d 6f 64  75 6c 65 53 74 72 65 61  |E IF moduleStrea|
000043e0  6d 7e 3d 30 20 54 48 45  4e 0a 7b 20 20 4c 45 54  |m~=0 THEN.{  LET|
000043f0  20 6f 20 3d 20 6f 75 74  70 75 74 28 29 3b 0a 20  | o = output();. |
00004400  20 20 53 65 6c 65 63 74  4f 75 74 70 75 74 28 6d  |  SelectOutput(m|
00004410  6f 64 75 6c 65 53 74 72  65 61 6d 29 3b 0a 20 20  |oduleStream);.  |
00004420  20 54 45 53 54 20 41 4f  46 6f 75 74 20 54 48 45  | TEST AOFout THE|
00004430  4e 20 7b 0a 20 20 20 20  20 20 4d 41 4e 49 46 45  |N {.      MANIFE|
00004440  53 54 20 7b 20 20 2f 2f  20 64 65 73 63 72 69 70  |ST {  // descrip|
00004450  74 69 6f 6e 20 6f 66 20  63 68 75 6e 6b 20 66 69  |tion of chunk fi|
00004460  6c 65 20 68 65 61 64 65  72 0a 09 20 41 72 65 61  |le header.. Area|
00004470  43 68 75 6e 6b 50 6f 73  6e 20 3d 20 31 31 3b 0a  |ChunkPosn = 11;.|
00004480  09 20 53 74 72 69 6e 67  54 61 62 6c 65 50 6f 73  |. StringTablePos|
00004490  6e 20 3d 20 31 35 3b 0a  09 20 53 79 6d 62 6f 6c  |n = 15;.. Symbol|
000044a0  54 61 62 6c 65 50 6f 73  6e 20 3d 20 31 39 3b 0a  |TablePosn = 19;.|
000044b0  0a 09 20 43 68 75 6e 6b  53 74 61 72 74 20 3d 20  |.. ChunkStart = |
000044c0  32 3b 0a 09 20 43 68 75  6e 6b 4c 65 6e 67 74 68  |2;.. ChunkLength|
000044d0  20 3d 20 33 3b 0a 0a 09  20 2f 2f 20 64 65 73 63  | = 3;... // desc|
000044e0  72 69 70 74 69 6f 6e 20  6f 66 20 68 65 61 64 65  |ription of heade|
000044f0  72 20 63 68 75 6e 6b 0a  09 20 48 43 6e 53 79 6d  |r chunk.. HCnSym|
00004500  20 3d 20 33 3b 0a 09 20  41 72 65 61 50 6f 73 6e  | = 3;.. AreaPosn|
00004510  20 3d 20 36 3b 0a 09 20  41 72 65 61 4c 65 6e 67  | = 6;.. AreaLeng|
00004520  74 68 20 3d 20 32 3b 0a  09 20 41 72 65 61 52 65  |th = 2;.. AreaRe|
00004530  6c 6f 63 73 20 3d 20 33  3b 0a 0a 09 20 41 41 41  |locs = 3;... AAA|
00004540  62 73 20 3d 20 23 78 31  30 30 3b 0a 09 20 41 41  |bs = #x100;.. AA|
00004550  43 6f 64 65 20 3d 20 23  78 32 30 30 3b 0a 09 20  |Code = #x200;.. |
00004560  41 41 43 6f 6d 6d 6f 6e  20 3d 20 23 78 34 30 30  |AACommon = #x400|
00004570  3b 0a 09 20 41 41 4e 6f  49 6e 69 74 20 3d 20 23  |;.. AANoInit = #|
00004580  78 31 30 30 30 3b 0a 09  20 41 41 52 65 61 64 4f  |x1000;.. AAReadO|
00004590  6e 6c 79 20 3d 20 23 78  32 30 30 30 3b 0a 09 20  |nly = #x2000;.. |
000045a0  41 41 50 6f 73 69 74 69  6f 6e 49 6e 64 65 70 65  |AAPositionIndepe|
000045b0  6e 64 65 6e 74 20 3d 20  23 78 34 30 30 30 3b 0a  |ndent = #x4000;.|
000045c0  0a 09 20 53 79 6d 4e 61  6d 65 20 3d 20 30 3b 0a  |.. SymName = 0;.|
000045d0  09 20 53 79 6d 41 74 74  72 69 62 75 74 65 73 20  |. SymAttributes |
000045e0  3d 20 31 3b 0a 09 20 53  79 6d 56 61 6c 75 65 20  |= 1;.. SymValue |
000045f0  3d 20 32 3b 0a 09 20 53  79 6d 41 72 65 61 20 3d  |= 2;.. SymArea =|
00004600  20 33 3b 0a 09 20 53 79  6d 53 69 7a 65 20 3d 20  | 3;.. SymSize = |
00004610  34 20 7d 3b 0a 0a 20 20  20 20 20 20 4c 45 54 20  |4 };..      LET |
00004620  52 6f 75 6e 64 55 70 28  6e 29 20 3d 20 28 6e 2b  |RoundUp(n) = (n+|
00004630  34 29 20 26 20 2d 34 0a  0a 20 20 20 20 20 20 4c  |4) & -4..      L|
00004640  45 54 20 6f 62 6a 46 69  6c 65 48 65 61 64 65 72  |ET objFileHeader|
00004650  20 3d 20 54 41 42 4c 45  0a 09 20 23 78 63 33 63  | = TABLE.. #xc3c|
00004660  62 63 36 63 35 2c 09 2f  2f 20 22 49 20 61 6d 20  |bc6c5,.// "I am |
00004670  61 20 63 68 75 6e 6b 20  66 69 6c 65 22 0a 09 20  |a chunk file".. |
00004680  37 2c 09 09 2f 2f 20 6d  61 78 20 6e 75 6d 62 65  |7,..// max numbe|
00004690  72 20 6f 66 20 63 68 75  6e 6b 73 0a 09 20 35 2c  |r of chunks.. 5,|
000046a0  09 09 2f 2f 20 6e 75 6d  62 65 72 20 75 73 65 64  |..// number used|
000046b0  0a 0a 09 20 27 4f 27 2b  28 27 42 27 3c 3c 38 29  |... 'O'+('B'<<8)|
000046c0  2b 28 27 4a 27 3c 3c 31  36 29 2b 28 27 5f 27 3c  |+('J'<<16)+('_'<|
000046d0  3c 32 34 29 2c 0a 09 20  27 48 27 2b 28 27 45 27  |<24),.. 'H'+('E'|
000046e0  3c 3c 38 29 2b 28 27 41  27 3c 3c 31 36 29 2b 28  |<<8)+('A'<<16)+(|
000046f0  27 44 27 3c 3c 32 34 29  2c 0a 09 20 23 78 37 43  |'D'<<24),.. #x7C|
00004700  2c 09 09 2f 2f 20 66 69  6c 65 20 70 6f 73 69 74  |,..// file posit|
00004710  69 6f 6e 0a 09 20 32 34  2b 32 2a 32 30 2c 09 2f  |ion.. 24+2*20,./|
00004720  2f 20 6c 65 6e 67 74 68  0a 0a 09 20 27 4f 27 2b  |/ length... 'O'+|
00004730  28 27 42 27 3c 3c 38 29  2b 28 27 4a 27 3c 3c 31  |('B'<<8)+('J'<<1|
00004740  36 29 2b 28 27 5f 27 3c  3c 32 34 29 2c 0a 09 20  |6)+('_'<<24),.. |
00004750  27 49 27 2b 28 27 44 27  3c 3c 38 29 2b 28 27 46  |'I'+('D'<<8)+('F|
00004760  27 3c 3c 31 36 29 2b 28  27 4e 27 3c 3c 32 34 29  |'<<16)+('N'<<24)|
00004770  2c 0a 09 20 23 78 37 43  2b 32 34 2b 32 2a 32 30  |,.. #x7C+24+2*20|
00004780  2c 0a 09 20 32 30 2c 0a  0a 09 20 27 4f 27 2b 28  |,.. 20,... 'O'+(|
00004790  27 42 27 3c 3c 38 29 2b  28 27 4a 27 3c 3c 31 36  |'B'<<8)+('J'<<16|
000047a0  29 2b 28 27 5f 27 3c 3c  32 34 29 2c 0a 09 20 27  |)+('_'<<24),.. '|
000047b0  41 27 2b 28 27 52 27 3c  3c 38 29 2b 28 27 45 27  |A'+('R'<<8)+('E'|
000047c0  3c 3c 31 36 29 2b 28 27  41 27 3c 3c 32 34 29 2c  |<<16)+('A'<<24),|
000047d0  0a 09 20 23 78 37 43 2b  32 34 2b 32 2a 32 30 2b  |.. #x7C+24+2*20+|
000047e0  32 30 2c 0a 09 20 30 2c  0a 0a 09 20 27 4f 27 2b  |20,.. 0,... 'O'+|
000047f0  28 27 42 27 3c 3c 38 29  2b 28 27 4a 27 3c 3c 31  |('B'<<8)+('J'<<1|
00004800  36 29 2b 28 27 5f 27 3c  3c 32 34 29 2c 0a 09 20  |6)+('_'<<24),.. |
00004810  27 53 27 2b 28 27 54 27  3c 3c 38 29 2b 28 27 52  |'S'+('T'<<8)+('R|
00004820  27 3c 3c 31 36 29 2b 28  27 54 27 3c 3c 32 34 29  |'<<16)+('T'<<24)|
00004830  2c 0a 09 20 23 78 37 43  2b 32 34 2b 32 2a 32 30  |,.. #x7C+24+2*20|
00004840  2b 32 30 2c 0a 09 20 30  2c 0a 0a 09 20 27 4f 27  |+20,.. 0,... 'O'|
00004850  2b 28 27 42 27 3c 3c 38  29 2b 28 27 4a 27 3c 3c  |+('B'<<8)+('J'<<|
00004860  31 36 29 2b 28 27 5f 27  3c 3c 32 34 29 2c 0a 09  |16)+('_'<<24),..|
00004870  20 27 53 27 2b 28 27 59  27 3c 3c 38 29 2b 28 27  | 'S'+('Y'<<8)+('|
00004880  4d 27 3c 3c 31 36 29 2b  28 27 54 27 3c 3c 32 34  |M'<<16)+('T'<<24|
00004890  29 2c 0a 09 20 23 78 37  43 2b 32 34 2b 32 2a 32  |),.. #x7C+24+2*2|
000048a0  30 2b 32 30 2c 0a 09 20  30 2c 0a 0a 09 20 30 2c  |0+20,.. 0,... 0,|
000048b0  30 2c 30 2c 30 2c 0a 09  20 30 2c 30 2c 30 2c 30  |0,0,0,.. 0,0,0,0|
000048c0  2c 0a 0a 09 20 2d 31 3b  0a 0a 20 20 20 20 20 20  |,... -1;..      |
000048d0  4c 45 54 20 68 65 61 64  65 72 43 68 75 6e 6b 20  |LET headerChunk |
000048e0  3d 20 54 41 42 4c 45 0a  09 20 23 78 43 35 45 32  |= TABLE.. #xC5E2|
000048f0  44 30 38 30 2c 09 2f 2f  20 6d 61 67 69 63 20 27  |D080,.// magic '|
00004900  49 20 61 6d 20 61 20 6d  6f 64 75 6c 65 27 20 6d  |I am a module' m|
00004910  61 72 6b 65 72 0a 09 20  31 31 30 2c 09 09 2f 2f  |arker.. 110,..//|
00004920  20 76 65 72 73 69 6f 6e  20 6f 66 20 6f 62 6a 65  | version of obje|
00004930  63 74 20 66 6f 72 6d 61  74 0a 09 20 32 2c 09 09  |ct format.. 2,..|
00004940  2f 2f 20 61 72 65 61 20  63 6f 75 6e 74 0a 09 20  |// area count.. |
00004950  30 2c 09 09 2f 2f 20 6e  75 6d 62 65 72 20 6f 66  |0,..// number of|
00004960  20 73 79 6d 62 6f 6c 73  0a 09 20 30 2c 09 09 2f  | symbols.. 0,../|
00004970  2f 20 65 6e 74 72 79 20  61 72 65 61 0a 09 20 30  |/ entry area.. 0|
00004980  2c 09 09 2f 2f 20 65 6e  74 72 79 20 6f 66 66 73  |,..// entry offs|
00004990  65 74 0a 0a 09 20 30 2c  09 09 2f 2f 20 63 6f 64  |et... 0,..// cod|
000049a0  65 20 61 72 65 61 20 6e  61 6d 65 0a 09 20 41 41  |e area name.. AA|
000049b0  43 6f 64 65 2b 41 41 52  65 61 64 4f 6e 6c 79 2b  |Code+AAReadOnly+|
000049c0  32 2c 09 20 20 20 2f 2f  20 63 6f 64 65 20 3a 20  |2,.   // code : |
000049d0  77 6f 72 64 20 61 6c 69  67 6e 65 64 0a 09 20 30  |word aligned.. 0|
000049e0  2c 09 09 2f 2f 20 6c 65  6e 67 74 68 3a 20 6c 6f  |,..// length: lo|
000049f0  63 43 74 72 0a 09 20 30  2c 09 09 2f 2f 20 72 65  |cCtr.. 0,..// re|
00004a00  6c 6f 63 61 74 69 6f 6e  73 3a 20 4c 65 6e 67 74  |locations: Lengt|
00004a10  68 4f 66 4c 69 73 74 28  72 65 6c 6f 63 61 74 65  |hOfList(relocate|
00004a20  64 4c 6f 63 73 29 0a 09  20 30 2c 09 09 2f 2f 20  |dLocs).. 0,..// |
00004a30  62 61 73 65 0a 0a 09 20  31 32 2c 09 09 2f 2f 20  |base... 12,..// |
00004a40  64 61 74 61 20 61 72 65  61 20 6e 61 6d 65 0a 09  |data area name..|
00004a50  20 32 2c 09 09 2f 2f 20  64 61 74 61 3a 20 77 6f  | 2,..// data: wo|
00004a60  72 64 20 61 6c 69 67 6e  65 64 0a 09 20 30 2c 09  |rd aligned.. 0,.|
00004a70  09 2f 2f 20 6c 65 6e 67  74 68 3a 20 6c 6f 63 43  |.// length: locC|
00004a80  74 72 0a 09 20 30 2c 09  09 2f 2f 20 72 65 6c 6f  |tr.. 0,..// relo|
00004a90  63 61 74 69 6f 6e 73 3a  20 4c 65 6e 67 74 68 4f  |cations: LengthO|
00004aa0  66 4c 69 73 74 28 72 65  6c 6f 63 61 74 65 64 4c  |fList(relocatedL|
00004ab0  6f 63 73 29 0a 09 20 30  2c 09 09 2f 2f 20 62 61  |ocs).. 0,..// ba|
00004ac0  73 65 0a 0a 09 20 2d 31  3b 0a 0a 20 20 20 20 20  |se... -1;..     |
00004ad0  20 4c 45 54 20 73 74 61  6e 64 61 72 64 53 79 6d  | LET standardSym|
00004ae0  73 20 3d 20 54 41 42 4c  45 0a 09 20 30 2c 20 53  |s = TABLE.. 0, S|
00004af0  41 44 65 66 69 6e 65 64  2b 53 41 47 6c 6f 62 61  |ADefined+SAGloba|
00004b00  6c 2c 20 30 2c 20 30 2c  0a 09 20 31 2c 20 53 41  |l, 0, 0,.. 1, SA|
00004b10  44 65 66 69 6e 65 64 2b  53 41 47 6c 6f 62 61 6c  |Defined+SAGlobal|
00004b20  2b 53 41 41 62 73 2c 20  30 2c 20 30 2c 0a 09 20  |+SAAbs, 0, 0,.. |
00004b30  32 2c 20 53 41 44 65 66  69 6e 65 64 2b 53 41 47  |2, SADefined+SAG|
00004b40  6c 6f 62 61 6c 2c 20 30  2c 20 31 32 2c 0a 09 20  |lobal, 0, 12,.. |
00004b50  33 2c 20 53 41 44 65 66  69 6e 65 64 2b 53 41 47  |3, SADefined+SAG|
00004b60  6c 6f 62 61 6c 2b 53 41  41 62 73 2c 20 30 2c 20  |lobal+SAAbs, 0, |
00004b70  30 2c 0a 09 20 2d 31 3b  0a 0a 20 20 20 20 20 20  |0,.. -1;..      |
00004b80  4c 45 54 20 61 72 65 61  53 79 6d 73 20 3d 20 54  |LET areaSyms = T|
00004b90  41 42 4c 45 20 30 2c 20  31 32 3b 0a 0a 20 20 20  |ABLE 0, 12;..   |
00004ba0  20 20 20 4c 45 54 20 63  4c 6f 63 43 74 72 20 3d  |   LET cLocCtr =|
00004bb0  20 6c 6f 63 43 74 72 3b  0a 20 20 20 20 20 20 4c  | locCtr;.      L|
00004bc0  45 54 20 6e 52 65 6c 6f  63 73 20 3d 20 4c 65 6e  |ET nRelocs = Len|
00004bd0  67 74 68 4f 66 4c 69 73  74 28 72 65 6c 6f 63 61  |gthOfList(reloca|
00004be0  74 65 64 4c 6f 63 73 29  2b 4c 65 6e 67 74 68 4f  |tedLocs)+LengthO|
00004bf0  66 4c 69 73 74 28 78 52  65 6c 6f 63 61 74 65 64  |fList(xRelocated|
00004c00  4c 6f 63 73 29 3b 0a 20  20 20 20 20 20 4c 45 54  |Locs);.      LET|
00004c10  20 63 6f 64 65 41 72 65  61 4c 65 6e 67 74 68 20  | codeAreaLength |
00004c20  3d 20 6c 6f 63 43 74 72  2b 6e 52 65 6c 6f 63 73  |= locCtr+nRelocs|
00004c30  2a 38 3b 0a 20 20 20 20  20 20 4c 45 54 20 64 4c  |*8;.      LET dL|
00004c40  6f 63 43 74 72 20 3d 20  64 61 52 65 63 21 61 2e  |ocCtr = daRec!a.|
00004c50  6c 6f 63 43 3b 0a 20 20  20 20 20 20 4c 45 54 20  |locC;.      LET |
00004c60  6e 64 52 65 6c 6f 63 73  20 3d 20 4c 65 6e 67 74  |ndRelocs = Lengt|
00004c70  68 4f 66 4c 69 73 74 28  64 61 52 65 63 21 61 2e  |hOfList(daRec!a.|
00004c80  72 65 6c 6f 63 29 2b 4c  65 6e 67 74 68 4f 66 4c  |reloc)+LengthOfL|
00004c90  69 73 74 28 64 61 52 65  63 21 61 2e 78 72 65 6c  |ist(daRec!a.xrel|
00004ca0  6f 63 29 3b 0a 20 20 20  20 20 20 4c 45 54 20 64  |oc);.      LET d|
00004cb0  61 74 61 41 72 65 61 4c  65 6e 67 74 68 20 3d 20  |ataAreaLength = |
00004cc0  64 4c 6f 63 43 74 72 2b  38 2a 6e 64 52 65 6c 6f  |dLocCtr+8*ndRelo|
00004cd0  63 73 3b 0a 20 20 20 20  20 20 4c 45 54 20 66 69  |cs;.      LET fi|
00004ce0  6c 65 70 6f 73 20 3d 20  6f 62 6a 46 69 6c 65 48  |lepos = objFileH|
00004cf0  65 61 64 65 72 21 28 41  72 65 61 43 68 75 6e 6b  |eader!(AreaChunk|
00004d00  50 6f 73 6e 2b 43 68 75  6e 6b 53 74 61 72 74 29  |Posn+ChunkStart)|
00004d10  0a 20 20 20 20 20 20 4c  45 54 20 73 74 72 54 61  |.      LET strTa|
00004d20  62 4c 65 6e 20 3d 20 32  34 3b 20 20 20 2f 2f 20  |bLen = 24;   // |
00004d30  66 6f 72 20 74 68 65 20  61 72 65 61 20 6e 61 6d  |for the area nam|
00004d40  65 73 0a 20 20 20 20 20  20 73 74 72 54 61 62 4c  |es.      strTabL|
00004d50  65 6e 20 3a 3d 20 73 74  72 54 61 62 4c 65 6e 2b  |en := strTabLen+|
00004d60  32 2a 52 6f 75 6e 64 55  70 28 73 65 63 74 69 6f  |2*RoundUp(sectio|
00004d70  6e 4e 61 6d 65 25 30 2b  33 29 2b 32 2a 52 6f 75  |nName%0+3)+2*Rou|
00004d80  6e 64 55 70 28 73 65 63  74 69 6f 6e 4e 61 6d 65  |ndUp(sectionName|
00004d90  25 30 2b 34 29 3b 0a 20  20 20 20 20 20 7b 20 20  |%0+4);.      {  |
00004da0  4c 45 54 20 70 20 3d 20  78 53 79 6d 62 6f 6c 73  |LET p = xSymbols|
00004db0  3b 0a 09 20 57 48 49 4c  45 20 70 7e 3d 30 20 44  |;.. WHILE p~=0 D|
00004dc0  4f 20 7b 0a 09 20 20 20  20 73 74 72 54 61 62 4c  |O {..    strTabL|
00004dd0  65 6e 20 3a 3d 20 73 74  72 54 61 62 4c 65 6e 2b  |en := strTabLen+|
00004de0  52 6f 75 6e 64 55 70 28  28 73 79 6d 2e 69 64 21  |RoundUp((sym.id!|
00004df0  70 29 25 30 29 3b 0a 09  20 20 20 20 70 20 3a 3d  |p)%0);..    p :=|
00004e00  20 21 70 20 7d 20 7d 3b  0a 20 20 20 20 20 20 6f  | !p } };.      o|
00004e10  62 6a 46 69 6c 65 48 65  61 64 65 72 21 28 41 72  |bjFileHeader!(Ar|
00004e20  65 61 43 68 75 6e 6b 50  6f 73 6e 2b 43 68 75 6e  |eaChunkPosn+Chun|
00004e30  6b 4c 65 6e 67 74 68 29  20 3a 3d 20 63 6f 64 65  |kLength) := code|
00004e40  41 72 65 61 4c 65 6e 67  74 68 2b 64 61 74 61 41  |AreaLength+dataA|
00004e50  72 65 61 4c 65 6e 67 74  68 3b 0a 20 20 20 20 20  |reaLength;.     |
00004e60  20 66 69 6c 65 70 6f 73  20 3a 3d 20 66 69 6c 65  | filepos := file|
00004e70  70 6f 73 2b 63 6f 64 65  41 72 65 61 4c 65 6e 67  |pos+codeAreaLeng|
00004e80  74 68 2b 64 61 74 61 41  72 65 61 4c 65 6e 67 74  |th+dataAreaLengt|
00004e90  68 3b 0a 20 20 20 20 20  20 6f 62 6a 46 69 6c 65  |h;.      objFile|
00004ea0  48 65 61 64 65 72 21 28  53 74 72 69 6e 67 54 61  |Header!(StringTa|
00004eb0  62 6c 65 50 6f 73 6e 2b  43 68 75 6e 6b 53 74 61  |blePosn+ChunkSta|
00004ec0  72 74 29 20 3a 3d 20 66  69 6c 65 70 6f 73 3b 0a  |rt) := filepos;.|
00004ed0  20 20 20 20 20 20 6f 62  6a 46 69 6c 65 48 65 61  |      objFileHea|
00004ee0  64 65 72 21 28 53 74 72  69 6e 67 54 61 62 6c 65  |der!(StringTable|
00004ef0  50 6f 73 6e 2b 43 68 75  6e 6b 4c 65 6e 67 74 68  |Posn+ChunkLength|
00004f00  29 20 3a 3d 20 73 74 72  54 61 62 4c 65 6e 3b 0a  |) := strTabLen;.|
00004f10  20 20 20 20 20 20 6f 62  6a 46 69 6c 65 48 65 61  |      objFileHea|
00004f20  64 65 72 21 28 53 79 6d  62 6f 6c 54 61 62 6c 65  |der!(SymbolTable|
00004f30  50 6f 73 6e 2b 43 68 75  6e 6b 53 74 61 72 74 29  |Posn+ChunkStart)|
00004f40  20 3a 3d 20 66 69 6c 65  70 6f 73 2b 73 74 72 54  | := filepos+strT|
00004f50  61 62 4c 65 6e 3b 0a 20  20 20 20 20 20 6f 62 6a  |abLen;.      obj|
00004f60  46 69 6c 65 48 65 61 64  65 72 21 28 53 79 6d 62  |FileHeader!(Symb|
00004f70  6f 6c 54 61 62 6c 65 50  6f 73 6e 2b 43 68 75 6e  |olTablePosn+Chun|
00004f80  6b 4c 65 6e 67 74 68 29  20 3a 3d 20 78 53 79 6d  |kLength) := xSym|
00004f90  4e 6f 2a 28 34 2a 53 79  6d 53 69 7a 65 29 3b 0a  |No*(4*SymSize);.|
00004fa0  0a 20 20 20 20 20 20 68  65 61 64 65 72 43 68 75  |.      headerChu|
00004fb0  6e 6b 21 28 41 72 65 61  50 6f 73 6e 2b 41 72 65  |nk!(AreaPosn+Are|
00004fc0  61 4c 65 6e 67 74 68 29  20 3a 3d 20 6c 6f 63 43  |aLength) := locC|
00004fd0  74 72 3b 0a 20 20 20 20  20 20 68 65 61 64 65 72  |tr;.      header|
00004fe0  43 68 75 6e 6b 21 28 41  72 65 61 50 6f 73 6e 2b  |Chunk!(AreaPosn+|
00004ff0  41 72 65 61 52 65 6c 6f  63 73 29 20 3a 3d 20 6e  |AreaRelocs) := n|
00005000  52 65 6c 6f 63 73 3b 0a  20 20 20 20 20 20 68 65  |Relocs;.      he|
00005010  61 64 65 72 43 68 75 6e  6b 21 28 41 72 65 61 50  |aderChunk!(AreaP|
00005020  6f 73 6e 2b 35 2b 41 72  65 61 4c 65 6e 67 74 68  |osn+5+AreaLength|
00005030  29 20 3a 3d 20 64 4c 6f  63 43 74 72 3b 0a 20 20  |) := dLocCtr;.  |
00005040  20 20 20 20 68 65 61 64  65 72 43 68 75 6e 6b 21  |    headerChunk!|
00005050  28 41 72 65 61 50 6f 73  6e 2b 35 2b 41 72 65 61  |(AreaPosn+5+Area|
00005060  52 65 6c 6f 63 73 29 20  3a 3d 20 6e 64 52 65 6c  |Relocs) := ndRel|
00005070  6f 63 73 3b 0a 20 20 20  20 20 20 68 65 61 64 65  |ocs;.      heade|
00005080  72 43 68 75 6e 6b 21 48  43 6e 53 79 6d 20 3a 3d  |rChunk!HCnSym :=|
00005090  20 78 53 79 6d 4e 6f 3b  0a 0a 20 20 20 20 20 20  | xSymNo;..      |
000050a0  57 72 69 74 65 54 61 62  6c 65 28 6f 62 6a 46 69  |WriteTable(objFi|
000050b0  6c 65 48 65 61 64 65 72  29 3b 0a 20 20 20 20 20  |leHeader);.     |
000050c0  20 57 72 69 74 65 54 61  62 6c 65 28 68 65 61 64  | WriteTable(head|
000050d0  65 72 43 68 75 6e 6b 29  3b 0a 20 20 20 20 20 20  |erChunk);.      |
000050e0  57 72 69 74 65 4f 62 6a  53 74 72 69 6e 67 28 53  |WriteObjString(S|
000050f0  74 72 69 6e 67 46 28 22  42 43 50 4c 20 76 65 72  |tringF("BCPL ver|
00005100  73 69 6f 6e 20 25 6e 2e  25 6e 22 2c 20 43 47 4d  |sion %n.%n", CGM|
00005110  61 6a 6f 72 56 65 72 73  69 6f 6e 2c 20 43 47 4d  |ajorVersion, CGM|
00005120  69 6e 6f 72 56 65 72 73  69 6f 6e 29 29 3b 0a 0a  |inorVersion));..|
00005130  20 20 20 20 20 20 4f 75  74 41 72 65 61 28 63 6f  |      OutArea(co|
00005140  64 65 41 72 65 61 29 3b  0a 20 20 20 20 20 20 4f  |deArea);.      O|
00005150  75 74 41 72 65 61 28 64  61 74 61 41 72 65 61 29  |utArea(dataArea)|
00005160  3b 0a 0a 20 20 20 20 20  20 7b 20 20 2f 2f 20 54  |;..      {  // T|
00005170  68 65 20 73 74 72 69 6e  67 20 74 61 62 6c 65 0a  |he string table.|
00005180  09 20 4c 45 54 20 73 74  50 6f 73 20 3d 20 57 72  |. LET stPos = Wr|
00005190  69 74 65 4f 62 6a 53 74  72 69 6e 67 28 22 42 43  |iteObjString("BC|
000051a0  50 4c 24 24 43 6f 64 65  22 29 3b 0a 09 20 73 74  |PL$$Code");.. st|
000051b0  50 6f 73 20 3a 3d 20 73  74 50 6f 73 2b 57 72 69  |Pos := stPos+Wri|
000051c0  74 65 4f 62 6a 53 74 72  69 6e 67 28 22 42 43 50  |teObjString("BCP|
000051d0  4c 24 24 44 61 74 61 22  29 3b 0a 09 20 73 74 61  |L$$Data");.. sta|
000051e0  6e 64 61 72 64 53 79 6d  73 21 28 53 79 6d 4e 61  |ndardSyms!(SymNa|
000051f0  6d 65 2b 30 2a 53 79 6d  53 69 7a 65 29 20 3a 3d  |me+0*SymSize) :=|
00005200  20 73 74 50 6f 73 3b 0a  09 20 73 74 50 6f 73 20  | stPos;.. stPos |
00005210  3a 3d 20 73 74 50 6f 73  2b 57 72 69 74 65 4f 62  |:= stPos+WriteOb|
00005220  6a 53 74 72 69 6e 67 28  53 74 72 69 6e 67 46 28  |jString(StringF(|
00005230  22 25 73 2e 43 24 22 2c  20 73 65 63 74 69 6f 6e  |"%s.C$", section|
00005240  4e 61 6d 65 29 29 3b 0a  09 20 73 74 61 6e 64 61  |Name));.. standa|
00005250  72 64 53 79 6d 73 21 28  53 79 6d 4e 61 6d 65 2b  |rdSyms!(SymName+|
00005260  31 2a 53 79 6d 53 69 7a  65 29 20 3a 3d 20 73 74  |1*SymSize) := st|
00005270  50 6f 73 3b 0a 09 20 73  74 50 6f 73 20 3a 3d 20  |Pos;.. stPos := |
00005280  73 74 50 6f 73 2b 57 72  69 74 65 4f 62 6a 53 74  |stPos+WriteObjSt|
00005290  72 69 6e 67 28 53 74 72  69 6e 67 46 28 22 25 73  |ring(StringF("%s|
000052a0  2e 43 53 24 22 2c 20 73  65 63 74 69 6f 6e 4e 61  |.CS$", sectionNa|
000052b0  6d 65 29 29 3b 0a 09 20  73 74 61 6e 64 61 72 64  |me));.. standard|
000052c0  53 79 6d 73 21 28 53 79  6d 4e 61 6d 65 2b 32 2a  |Syms!(SymName+2*|
000052d0  53 79 6d 53 69 7a 65 29  20 3a 3d 20 73 74 50 6f  |SymSize) := stPo|
000052e0  73 3b 0a 09 20 73 74 50  6f 73 20 3a 3d 20 73 74  |s;.. stPos := st|
000052f0  50 6f 73 2b 57 72 69 74  65 4f 62 6a 53 74 72 69  |Pos+WriteObjStri|
00005300  6e 67 28 53 74 72 69 6e  67 46 28 22 25 73 2e 44  |ng(StringF("%s.D|
00005310  24 22 2c 20 73 65 63 74  69 6f 6e 4e 61 6d 65 29  |$", sectionName)|
00005320  29 3b 0a 09 20 73 74 61  6e 64 61 72 64 53 79 6d  |);.. standardSym|
00005330  73 21 28 53 79 6d 4e 61  6d 65 2b 33 2a 53 79 6d  |s!(SymName+3*Sym|
00005340  53 69 7a 65 29 20 3a 3d  20 73 74 50 6f 73 3b 0a  |Size) := stPos;.|
00005350  09 20 73 74 50 6f 73 20  3a 3d 20 73 74 50 6f 73  |. stPos := stPos|
00005360  2b 57 72 69 74 65 4f 62  6a 53 74 72 69 6e 67 28  |+WriteObjString(|
00005370  53 74 72 69 6e 67 46 28  22 25 73 2e 44 53 24 22  |StringF("%s.DS$"|
00005380  2c 20 73 65 63 74 69 6f  6e 4e 61 6d 65 29 29 3b  |, sectionName));|
00005390  0a 09 20 7b 20 20 4c 45  54 20 70 20 3d 20 78 53  |.. {  LET p = xS|
000053a0  79 6d 62 6f 6c 73 3b 0a  09 20 20 20 20 57 48 49  |ymbols;..    WHI|
000053b0  4c 45 20 70 7e 3d 30 20  44 4f 20 7b 0a 09 20 20  |LE p~=0 DO {..  |
000053c0  20 20 20 20 20 73 79 6d  2e 73 74 72 21 70 20 3a  |     sym.str!p :|
000053d0  3d 20 73 74 50 6f 73 3b  0a 09 20 20 20 20 20 20  |= stPos;..      |
000053e0  20 73 74 50 6f 73 20 3a  3d 20 73 74 50 6f 73 2b  | stPos := stPos+|
000053f0  57 72 69 74 65 4f 62 6a  53 74 72 69 6e 67 28 73  |WriteObjString(s|
00005400  79 6d 2e 69 64 21 70 29  3b 0a 09 20 20 20 20 20  |ym.id!p);..     |
00005410  20 20 70 20 3a 3d 20 21  70 20 7d 20 7d 3b 0a 0a  |  p := !p } };..|
00005420  09 20 2f 2f 20 54 68 65  20 73 79 6d 62 6f 6c 20  |. // The symbol |
00005430  74 61 62 6c 65 0a 09 20  73 74 61 6e 64 61 72 64  |table.. standard|
00005440  53 79 6d 73 21 28 53 79  6d 56 61 6c 75 65 2b 31  |Syms!(SymValue+1|
00005450  2a 53 79 6d 53 69 7a 65  29 20 3a 3d 20 63 4c 6f  |*SymSize) := cLo|
00005460  63 43 74 72 3b 0a 09 20  73 74 61 6e 64 61 72 64  |cCtr;.. standard|
00005470  53 79 6d 73 21 28 53 79  6d 56 61 6c 75 65 2b 33  |Syms!(SymValue+3|
00005480  2a 53 79 6d 53 69 7a 65  29 20 3a 3d 20 64 4c 6f  |*SymSize) := dLo|
00005490  63 43 74 72 3b 0a 09 20  57 72 69 74 65 54 61 62  |cCtr;.. WriteTab|
000054a0  6c 65 28 73 74 61 6e 64  61 72 64 53 79 6d 73 29  |le(standardSyms)|
000054b0  0a 09 20 7b 20 20 4c 45  54 20 70 20 3d 20 78 53  |.. {  LET p = xS|
000054c0  79 6d 62 6f 6c 73 3b 0a  09 20 20 20 20 57 48 49  |ymbols;..    WHI|
000054d0  4c 45 20 70 7e 3d 30 20  44 4f 20 7b 0a 09 20 20  |LE p~=0 DO {..  |
000054e0  20 20 20 20 20 42 69 6e  57 6f 72 64 28 73 79 6d  |     BinWord(sym|
000054f0  2e 73 74 72 21 70 29 3b  0a 09 20 20 20 20 20 20  |.str!p);..      |
00005500  20 42 69 6e 57 6f 72 64  28 73 79 6d 2e 61 74 74  | BinWord(sym.att|
00005510  72 21 70 29 3b 0a 09 20  20 20 20 20 20 20 54 45  |r!p);..       TE|
00005520  53 54 20 28 73 79 6d 2e  61 74 74 72 21 70 26 53  |ST (sym.attr!p&S|
00005530  41 44 65 66 69 6e 65 64  29 7e 3d 30 20 54 48 45  |ADefined)~=0 THE|
00005540  4e 20 7b 0a 09 09 20 20  42 69 6e 57 6f 72 64 28  |N {...  BinWord(|
00005550  56 61 6c 75 65 4f 66 4c  61 62 65 6c 28 73 79 6d  |ValueOfLabel(sym|
00005560  2e 76 61 6c 21 70 29 29  3b 0a 09 09 20 20 42 69  |.val!p));...  Bi|
00005570  6e 57 6f 72 64 28 41 72  65 61 53 79 6d 73 21 5b  |nWord(AreaSyms![|
00005580  41 72 65 61 4f 66 4c 61  62 65 6c 28 73 79 6d 2e  |AreaOfLabel(sym.|
00005590  76 61 6c 21 70 29 5d 29  20 7d 0a 09 20 20 20 20  |val!p)]) }..    |
000055a0  20 20 20 45 4c 53 45 20  7b 0a 09 09 20 20 42 69  |   ELSE {...  Bi|
000055b0  6e 57 6f 72 64 28 30 29  3b 20 42 69 6e 57 6f 72  |nWord(0); BinWor|
000055c0  64 28 30 29 20 7d 3b 0a  09 20 20 20 20 20 20 20  |d(0) };..       |
000055d0  70 20 3a 3d 20 21 70 20  7d 20 7d 20 7d 20 7d 0a  |p := !p } } } }.|
000055e0  0a 20 20 20 45 4c 53 45  20 7b 0a 20 20 20 20 20  |.   ELSE {.     |
000055f0  20 46 4f 52 20 6c 6f 63  20 3d 20 30 20 54 4f 20  | FOR loc = 0 TO |
00005600  6c 6f 63 43 74 72 2d 34  20 42 59 20 34 0a 09 20  |locCtr-4 BY 4.. |
00005610  44 4f 20 42 69 6e 57 6f  72 64 28 52 65 61 64 57  |DO BinWord(ReadW|
00005620  6f 72 64 28 6c 6f 63 29  29 3b 0a 20 20 20 20 20  |ord(loc));.     |
00005630  20 42 69 6e 57 6f 72 64  28 23 78 31 32 33 34 35  | BinWord(#x12345|
00005640  36 37 38 29 3b 0a 20 20  20 20 20 20 7b 20 20 4c  |678);.      {  L|
00005650  45 54 20 72 20 3d 20 72  65 6c 6f 63 61 74 65 64  |ET r = relocated|
00005660  4c 6f 63 73 3b 0a 09 20  57 48 49 4c 45 20 72 7e  |Locs;.. WHILE r~|
00005670  3d 30 20 44 4f 20 7b 0a  09 20 20 20 20 42 69 6e  |=0 DO {..    Bin|
00005680  57 6f 72 64 28 31 21 72  29 3b 0a 09 20 20 20 20  |Word(1!r);..    |
00005690  72 20 3a 3d 20 21 72 20  7d 20 7d 3b 0a 20 20 20  |r := !r } };.   |
000056a0  20 20 20 42 69 6e 57 6f  72 64 28 23 78 38 37 36  |   BinWord(#x876|
000056b0  35 34 33 32 31 29 20 7d  3b 0a 0a 20 20 20 53 65  |54321) };..   Se|
000056c0  6c 65 63 74 4f 75 74 70  75 74 28 6f 29 20 7d 0a  |lectOutput(o) }.|
000056d0  0a 41 4e 44 20 4f 75 74  41 72 65 61 28 61 72 65  |.AND OutArea(are|
000056e0  61 29 20 42 45 20 7b 0a  20 20 20 53 65 74 41 72  |a) BE {.   SetAr|
000056f0  65 61 28 61 72 65 61 29  3b 0a 20 20 20 46 4f 52  |ea(area);.   FOR|
00005700  20 6c 6f 63 20 3d 20 30  20 54 4f 20 6c 6f 63 43  | loc = 0 TO locC|
00005710  74 72 2d 34 20 42 59 20  34 0a 20 20 20 20 20 20  |tr-4 BY 4.      |
00005720  44 4f 20 42 69 6e 57 6f  72 64 28 52 65 61 64 57  |DO BinWord(ReadW|
00005730  6f 72 64 28 6c 6f 63 29  29 3b 0a 0a 20 20 20 7b  |ord(loc));..   {|
00005740  20 20 4c 45 54 20 72 20  3d 20 72 65 6c 6f 63 61  |  LET r = reloca|
00005750  74 65 64 4c 6f 63 73 3b  0a 20 20 20 20 20 20 57  |tedLocs;.      W|
00005760  48 49 4c 45 20 72 7e 3d  30 20 44 4f 20 7b 0a 09  |HILE r~=0 DO {..|
00005770  20 42 69 6e 57 6f 72 64  28 31 21 72 29 3b 0a 09  | BinWord(1!r);..|
00005780  20 54 45 53 54 20 41 72  65 61 4f 66 4c 61 62 65  | TEST AreaOfLabe|
00005790  6c 28 32 21 72 29 3d 61  72 65 61 20 54 48 45 4e  |l(2!r)=area THEN|
000057a0  0a 09 20 20 20 20 42 69  6e 57 6f 72 64 28 52 65  |..    BinWord(Re|
000057b0  6c 57 6f 72 64 29 20 20  2f 2f 20 61 64 64 69 74  |lWord)  // addit|
000057c0  69 76 65 2c 20 69 6e 74  65 72 6e 61 6c 2c 20 77  |ive, internal, w|
000057d0  6f 72 64 0a 09 20 45 4c  53 45 0a 09 20 20 20 20  |ord.. ELSE..    |
000057e0  42 69 6e 57 6f 72 64 28  52 65 6c 57 6f 72 64 2b  |BinWord(RelWord+|
000057f0  52 65 6c 53 79 6d 62 6f  6c 2b 28 61 72 65 61 3d  |RelSymbol+(area=|
00005800  30 20 2d 3e 20 32 2c 30  29 29 3b 0a 09 20 72 20  |0 -> 2,0));.. r |
00005810  3a 3d 20 21 72 20 7d 3b  0a 20 20 20 20 20 20 72  |:= !r };.      r|
00005820  20 3a 3d 20 78 52 65 6c  6f 63 61 74 65 64 4c 6f  | := xRelocatedLo|
00005830  63 73 3b 0a 20 20 20 20  20 20 57 48 49 4c 45 20  |cs;.      WHILE |
00005840  72 7e 3d 30 20 44 4f 20  7b 0a 09 20 42 69 6e 57  |r~=0 DO {.. BinW|
00005850  6f 72 64 28 31 21 72 29  3b 0a 09 20 42 69 6e 57  |ord(1!r);.. BinW|
00005860  6f 72 64 28 32 21 72 29  3b 0a 09 20 72 20 3a 3d  |ord(2!r);.. r :=|
00005870  20 21 72 20 7d 20 7d 20  7d 0a 0a 0a 41 4e 44 20  | !r } } }...AND |
00005880  4f 75 74 42 79 74 65 28  62 79 74 65 29 20 42 45  |OutByte(byte) BE|
00005890  20 42 69 6e 57 72 43 68  28 62 79 74 65 29 0a 0a  | BinWrCh(byte)..|
000058a0  41 4e 44 20 42 69 6e 57  6f 72 64 28 77 6f 72 64  |AND BinWord(word|
000058b0  29 20 42 45 0a 20 20 20  46 4f 52 20 69 20 3d 20  |) BE.   FOR i = |
000058c0  30 20 54 4f 20 32 34 20  42 59 20 38 0a 20 20 20  |0 TO 24 BY 8.   |
000058d0  20 20 20 44 4f 20 4f 75  74 42 79 74 65 28 28 77  |   DO OutByte((w|
000058e0  6f 72 64 3e 3e 69 29 20  26 20 32 35 35 29 0a     |ord>>i) & 255).|
000058ef