Home » Archimedes archive » Zipped Apps » BCPL » BCPL/armlib/b/backtr

BCPL/armlib/b/backtr

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/armlib/b/backtr
Read OK:
File size: 1865 bytes
Load address: 0000
Exec address: 0000
File contents
SECTION "map"

GET "LibHdr"

STATIC {
// Version of 19 Feb 88 12:00:00
   dummy = VersionMark;
   version = 1*256 + 5 }

MANIFEST {
   SectionStart       = #x4c504342;
   StartRelocation    = #x12345678;
   EndRelocation      = #x87654321;
   EndMark	      = 1002;
   HunkMark	      = 1001;
   LineLength	      = 80;
   UnsetGlobalMask    = #xFFFF0000;
   UnsetGlobalValue   = #xAE950000;
   PCMask	      = #x03FFFFFC }

GLOBAL { g0: 0 };

LET BackTrace() BE {
   LET firstLoc = 0	  // first local variable in stack
   LET sb = stackBase;
   stackBase!4 := Level();
   WriteS("*NBacktrace called*N")

   {  LET base = (sb+6)<<2
      LET lastP = sb!4;
      LET newP = ?
      LET p = VCAR[lastP+4]
      LET topFrame = lastP-4

      TEST sb!5 = -1 THEN
	 WriteS("*NRoot stack:*N")
      ELSE {
	 NewLine()
	 WriteArg(sb!5, p)
	 WriteS(" coroutine stack:*N") }

      IF topFrame>[(sb!2)<<2] THEN
	 WriteS("WARNING: Stack has overflowed or been corrupted*N");

      WriteS("*NStack-frame     Function    Arg 1     Arg 2     Arg 3     .....*N")

      FOR i = 1 TO 50 DO {
	 WriteF("%x6/%x6:  ", p, p>>2)	// stack frame
	 WriteFName(VCAR p, p)
	 WriteS("  ")
	 FOR j = p+16 TO topFrame BY 4 DO {
	    WriteArg(VCAR j, p)
	    IF ((j-p-16) REM 20)=16 & (j~=topFrame) THEN
	       WriteS("*n                            ") }
	 NewLine();
	 topFrame := p-4;
	 newP := VCAR[p+4]
	 IF newP=p THEN { WriteS("Base of stack*N"); BREAK };
	 p := newP;
	 UNLESS base<=p<=topFrame THEN {
	    WriteF("Improper link %X8 %X8 %X8*N", base, p, topFrame);
	    BREAK }
	 IF topFrame-p>200 THEN topFrame := p+200 } // not more than 50 args
      sb := sb!1 } REPEATUNTIL sb=-1;
   WriteS("*NEnd of backtrace*N") }

AND WriteFName(n, p) BE
   TEST n=-1 THEN
      WriteS("ROOT      ")
   ELSE
      WriteArg(n, p)  // function name


AND WriteArg(n,p) BE {
// WriteS a hex no./function name in a 10 char field
// P is BCPL stack pointer
   LET f = n-8

   IF #x1000<f<=topOfStore & 0%f=7 & VCAR[f-4]=-1 THEN {
      WriteF("%s   ", f>>2); RETURN };

   IF -1000<n<1000 THEN {
      WriteF("%x3(%i4) ", n, n); RETURN };

   p := p>>2;
   IF p+4<=n<=p+54 THEN {
     // does n point to an item in this stack frame? (first 50 args)
      n := n-p-3
      WriteF("-> Arg%I2  ", n)
      RETURN }

   WriteF("%x8  ", n) }

AND MapStore() BE {
   LET g = @G0
   LET nglobs = G0
   LET column = 0
   LET p = blockList

   WriteS("*NMapstore called*N")

   DescribeCode(loadPoint);
   TEST ug<=G0<=10000 THEN
      WriteF("*N%N globals allocated*N", G0)
   ELSE {
      WriteS("Global zero is corrupted*N"); nglobs := 250 };

   WriteF("*NValues set in Global Vector (%X6/%X6):*N", g, g<<2);

   FOR t = 0 TO nglobs DO {
      LET val = g!t;
      IF [val&UnsetGlobalMask]~=UnsetGlobalValue THEN {
	 IF column>LineLength-20 THEN { NewLine(); column := 0 };
	 TEST t>=1000
	    THEN WriteF("%i4: ",t)
	    ELSE WriteF("G%I3: ", t);
	 WriteArg(val, 0);
	 WriteS("   ");
	 column := column+20 } }

 /*
   WriteS("*n*nMemory blocks:")
   UNTIL !p=0 DO {
      LET len = !p;
      WriteF("*n%x6/%x6: ", p+1, (p+1)<<2)
      TEST len<0 THEN { // used block
	 TEST g = p+1 THEN
	    WriteS("Global vector")
	 ELSE TEST stackbase = p+1 THEN
	    WriteS("Current stack")
	 ELSE TEST p!1=HunkMark THEN
	    DescribeCode(p)
	 ELSE
	    WriteF("Allocated Block of %N BCPL words", -len-1);
	 len := -len }

      ELSE  // freeblock
	 WriteF("Free Block of %N BCPL words", len-1)

      p := p+len }  // next block */

   WriteS("*NEnd of mapstore*N") }

AND DescribeCode(q) BE {
   LET column = 0;
   LET sectionEnd = q;
   WriteS("Program code")
   UNTIL q>=sectionEnd & !q=EndMark DO {
      LET word = !q;
      TEST q>=sectionEnd & word=SectionStart THEN {
	 LET name = VEC 2
	 AND date = VEC 2
	 AND time = VEC 2
	 AND unsetstring = "<unset>";
	 LET namel = 8;
	 LET versionWord = q!9;
	 sectionEnd := q+[(q!1)>>2];
	 FOR i = 0 TO 7 DO {
	    LET c = q%(i+8);
	    IF c=0 & namel=8 THEN { namel := i; BREAK };
	    name%(i+1) := c }
	 name%0 := namel;
	 TEST q%16='<' THEN
	    date, time := unsetstring, unsetstring
	 ELSE {
	    FOR i = 0 TO 8 DO {
	       date%(i+1) := q%(i+16);
	       time%(i+1) := q%(i+26) };
	    date%0 := 9;
	    time%0 := 8 };
	 WriteF("*n*n%X6  Section %s", q<<2, name);
	 IF q!11=-1 & q%48=7 THEN {
	    LET local = q!10;
	    IF VCAR local = VersionMark THEN {
	       LET n = VCAR(local+4);
	       WriteF("  version %n.%n", n>>8, n&255) } }
	 WriteF("*n    compiled on %s at %s", date, time);
	 IF versionWord~=0 THEN
	    WriteF(" using CG version %n.%n",
		     versionWord>>24, (versionWord>>16)&255);
	 NewLine();
	 q := q+10;
	 column := 0 }

      ELSE TEST q=SectionEnd THEN // skip global initialisations
	 q := q+2 REPEATWHILE (-1)!q~=0

      ELSE TEST q>=SectionEnd & word=StartRelocation THEN
	 q := q+1 REPEATWHILE !q~=EndRelocation

      ELSE TEST word=-1 & q%4=7 THEN {
	 LET procStart = q+2;
	 IF [(!procstart)>>24]=0 THEN procStart := procStart+1;
	 IF column>=LineLength-16 THEN { NewLine(); column := 0 };
	 WriteF("  %x6: %s", procStart<<2, q+1);
	 column := column+17;
	 q := procStart }

      ELSE q := q+1 }

   NewLine() }


MANIFEST {
   Error_IllegalInstruction = #x80000000
   Error_PrefetchAbort	    = #x80000001
   Error_DataAbort	    = #x80000002
   Error_AddressException   = #x80000003
   Error_UnknownIRQ	    = #x80000004
   Error_BranchThroughZero  = #x80000005

   Error_FPBase 	    = #x80000200
   Error_FPLimit	    = #x80000300 }

LET Abort(n) BE {
   LET pc = (VCAR[Level()+12])&PCMask;
   IF n~=0 THEN {
      SWITCHON n INTO {
	 CASE Error_IllegalInstruction:WriteS("*nIllegal Instruction"); ENDCASE
	 CASE Error_PrefetchAbort:     WriteS("*nPrefetch Abort"); ENDCASE
	 CASE Error_DataAbort:	       WriteS("*nData Abort"); ENDCASE
	 CASE Error_AddressException:  WriteS("*nAddress Exception"); ENDCASE
	 DEFAULT:
	    {  LET v = VEC 64;
	       TKRErr(v, 255);
	       {  LET n = v%0;
		  WHILE n>0 & (v%n='*C' | v%n='*N') DO n := n-1;
		  v%0 := n };
	       WriteF("*nAbort %x8: %s", n, v) } };

      WriteF(" at %x8", pc) };
   IF (pc&UnsetGlobalMask)=(UnsetGlobalValue&PCMask) THEN
      WriteF("*nIs Global %N defined?", [(pc&~UnsetGlobalMask)>>2]-1);
   BackTrace();
   MapStore();
   Stop(256) }
00000000  53 45 43 54 49 4f 4e 20  22 6d 61 70 22 0a 0a 47  |SECTION "map"..G|
00000010  45 54 20 22 4c 69 62 48  64 72 22 0a 0a 53 54 41  |ET "LibHdr"..STA|
00000020  54 49 43 20 7b 0a 2f 2f  20 56 65 72 73 69 6f 6e  |TIC {.// Version|
00000030  20 6f 66 20 31 39 20 46  65 62 20 38 38 20 31 32  | of 19 Feb 88 12|
00000040  3a 30 30 3a 30 30 0a 20  20 20 64 75 6d 6d 79 20  |:00:00.   dummy |
00000050  3d 20 56 65 72 73 69 6f  6e 4d 61 72 6b 3b 0a 20  |= VersionMark;. |
00000060  20 20 76 65 72 73 69 6f  6e 20 3d 20 31 2a 32 35  |  version = 1*25|
00000070  36 20 2b 20 35 20 7d 0a  0a 4d 41 4e 49 46 45 53  |6 + 5 }..MANIFES|
00000080  54 20 7b 0a 20 20 20 53  65 63 74 69 6f 6e 53 74  |T {.   SectionSt|
00000090  61 72 74 20 20 20 20 20  20 20 3d 20 23 78 34 63  |art       = #x4c|
000000a0  35 30 34 33 34 32 3b 0a  20 20 20 53 74 61 72 74  |504342;.   Start|
000000b0  52 65 6c 6f 63 61 74 69  6f 6e 20 20 20 20 3d 20  |Relocation    = |
000000c0  23 78 31 32 33 34 35 36  37 38 3b 0a 20 20 20 45  |#x12345678;.   E|
000000d0  6e 64 52 65 6c 6f 63 61  74 69 6f 6e 20 20 20 20  |ndRelocation    |
000000e0  20 20 3d 20 23 78 38 37  36 35 34 33 32 31 3b 0a  |  = #x87654321;.|
000000f0  20 20 20 45 6e 64 4d 61  72 6b 09 20 20 20 20 20  |   EndMark.     |
00000100  20 3d 20 31 30 30 32 3b  0a 20 20 20 48 75 6e 6b  | = 1002;.   Hunk|
00000110  4d 61 72 6b 09 20 20 20  20 20 20 3d 20 31 30 30  |Mark.      = 100|
00000120  31 3b 0a 20 20 20 4c 69  6e 65 4c 65 6e 67 74 68  |1;.   LineLength|
00000130  09 20 20 20 20 20 20 3d  20 38 30 3b 0a 20 20 20  |.      = 80;.   |
00000140  55 6e 73 65 74 47 6c 6f  62 61 6c 4d 61 73 6b 20  |UnsetGlobalMask |
00000150  20 20 20 3d 20 23 78 46  46 46 46 30 30 30 30 3b  |   = #xFFFF0000;|
00000160  0a 20 20 20 55 6e 73 65  74 47 6c 6f 62 61 6c 56  |.   UnsetGlobalV|
00000170  61 6c 75 65 20 20 20 3d  20 23 78 41 45 39 35 30  |alue   = #xAE950|
00000180  30 30 30 3b 0a 20 20 20  50 43 4d 61 73 6b 09 20  |000;.   PCMask. |
00000190  20 20 20 20 20 3d 20 23  78 30 33 46 46 46 46 46  |     = #x03FFFFF|
000001a0  43 20 7d 0a 0a 47 4c 4f  42 41 4c 20 7b 20 67 30  |C }..GLOBAL { g0|
000001b0  3a 20 30 20 7d 3b 0a 0a  4c 45 54 20 42 61 63 6b  |: 0 };..LET Back|
000001c0  54 72 61 63 65 28 29 20  42 45 20 7b 0a 20 20 20  |Trace() BE {.   |
000001d0  4c 45 54 20 66 69 72 73  74 4c 6f 63 20 3d 20 30  |LET firstLoc = 0|
000001e0  09 20 20 2f 2f 20 66 69  72 73 74 20 6c 6f 63 61  |.  // first loca|
000001f0  6c 20 76 61 72 69 61 62  6c 65 20 69 6e 20 73 74  |l variable in st|
00000200  61 63 6b 0a 20 20 20 4c  45 54 20 73 62 20 3d 20  |ack.   LET sb = |
00000210  73 74 61 63 6b 42 61 73  65 3b 0a 20 20 20 73 74  |stackBase;.   st|
00000220  61 63 6b 42 61 73 65 21  34 20 3a 3d 20 4c 65 76  |ackBase!4 := Lev|
00000230  65 6c 28 29 3b 0a 20 20  20 57 72 69 74 65 53 28  |el();.   WriteS(|
00000240  22 2a 4e 42 61 63 6b 74  72 61 63 65 20 63 61 6c  |"*NBacktrace cal|
00000250  6c 65 64 2a 4e 22 29 0a  0a 20 20 20 7b 20 20 4c  |led*N")..   {  L|
00000260  45 54 20 62 61 73 65 20  3d 20 28 73 62 2b 36 29  |ET base = (sb+6)|
00000270  3c 3c 32 0a 20 20 20 20  20 20 4c 45 54 20 6c 61  |<<2.      LET la|
00000280  73 74 50 20 3d 20 73 62  21 34 3b 0a 20 20 20 20  |stP = sb!4;.    |
00000290  20 20 4c 45 54 20 6e 65  77 50 20 3d 20 3f 0a 20  |  LET newP = ?. |
000002a0  20 20 20 20 20 4c 45 54  20 70 20 3d 20 56 43 41  |     LET p = VCA|
000002b0  52 5b 6c 61 73 74 50 2b  34 5d 0a 20 20 20 20 20  |R[lastP+4].     |
000002c0  20 4c 45 54 20 74 6f 70  46 72 61 6d 65 20 3d 20  | LET topFrame = |
000002d0  6c 61 73 74 50 2d 34 0a  0a 20 20 20 20 20 20 54  |lastP-4..      T|
000002e0  45 53 54 20 73 62 21 35  20 3d 20 2d 31 20 54 48  |EST sb!5 = -1 TH|
000002f0  45 4e 0a 09 20 57 72 69  74 65 53 28 22 2a 4e 52  |EN.. WriteS("*NR|
00000300  6f 6f 74 20 73 74 61 63  6b 3a 2a 4e 22 29 0a 20  |oot stack:*N"). |
00000310  20 20 20 20 20 45 4c 53  45 20 7b 0a 09 20 4e 65  |     ELSE {.. Ne|
00000320  77 4c 69 6e 65 28 29 0a  09 20 57 72 69 74 65 41  |wLine().. WriteA|
00000330  72 67 28 73 62 21 35 2c  20 70 29 0a 09 20 57 72  |rg(sb!5, p).. Wr|
00000340  69 74 65 53 28 22 20 63  6f 72 6f 75 74 69 6e 65  |iteS(" coroutine|
00000350  20 73 74 61 63 6b 3a 2a  4e 22 29 20 7d 0a 0a 20  | stack:*N") }.. |
00000360  20 20 20 20 20 49 46 20  74 6f 70 46 72 61 6d 65  |     IF topFrame|
00000370  3e 5b 28 73 62 21 32 29  3c 3c 32 5d 20 54 48 45  |>[(sb!2)<<2] THE|
00000380  4e 0a 09 20 57 72 69 74  65 53 28 22 57 41 52 4e  |N.. WriteS("WARN|
00000390  49 4e 47 3a 20 53 74 61  63 6b 20 68 61 73 20 6f  |ING: Stack has o|
000003a0  76 65 72 66 6c 6f 77 65  64 20 6f 72 20 62 65 65  |verflowed or bee|
000003b0  6e 20 63 6f 72 72 75 70  74 65 64 2a 4e 22 29 3b  |n corrupted*N");|
000003c0  0a 0a 20 20 20 20 20 20  57 72 69 74 65 53 28 22  |..      WriteS("|
000003d0  2a 4e 53 74 61 63 6b 2d  66 72 61 6d 65 20 20 20  |*NStack-frame   |
000003e0  20 20 46 75 6e 63 74 69  6f 6e 20 20 20 20 41 72  |  Function    Ar|
000003f0  67 20 31 20 20 20 20 20  41 72 67 20 32 20 20 20  |g 1     Arg 2   |
00000400  20 20 41 72 67 20 33 20  20 20 20 20 2e 2e 2e 2e  |  Arg 3     ....|
00000410  2e 2a 4e 22 29 0a 0a 20  20 20 20 20 20 46 4f 52  |.*N")..      FOR|
00000420  20 69 20 3d 20 31 20 54  4f 20 35 30 20 44 4f 20  | i = 1 TO 50 DO |
00000430  7b 0a 09 20 57 72 69 74  65 46 28 22 25 78 36 2f  |{.. WriteF("%x6/|
00000440  25 78 36 3a 20 20 22 2c  20 70 2c 20 70 3e 3e 32  |%x6:  ", p, p>>2|
00000450  29 09 2f 2f 20 73 74 61  63 6b 20 66 72 61 6d 65  |).// stack frame|
00000460  0a 09 20 57 72 69 74 65  46 4e 61 6d 65 28 56 43  |.. WriteFName(VC|
00000470  41 52 20 70 2c 20 70 29  0a 09 20 57 72 69 74 65  |AR p, p).. Write|
00000480  53 28 22 20 20 22 29 0a  09 20 46 4f 52 20 6a 20  |S("  ").. FOR j |
00000490  3d 20 70 2b 31 36 20 54  4f 20 74 6f 70 46 72 61  |= p+16 TO topFra|
000004a0  6d 65 20 42 59 20 34 20  44 4f 20 7b 0a 09 20 20  |me BY 4 DO {..  |
000004b0  20 20 57 72 69 74 65 41  72 67 28 56 43 41 52 20  |  WriteArg(VCAR |
000004c0  6a 2c 20 70 29 0a 09 20  20 20 20 49 46 20 28 28  |j, p)..    IF ((|
000004d0  6a 2d 70 2d 31 36 29 20  52 45 4d 20 32 30 29 3d  |j-p-16) REM 20)=|
000004e0  31 36 20 26 20 28 6a 7e  3d 74 6f 70 46 72 61 6d  |16 & (j~=topFram|
000004f0  65 29 20 54 48 45 4e 0a  09 20 20 20 20 20 20 20  |e) THEN..       |
00000500  57 72 69 74 65 53 28 22  2a 6e 20 20 20 20 20 20  |WriteS("*n      |
00000510  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000520  20 20 20 20 20 20 22 29  20 7d 0a 09 20 4e 65 77  |      ") }.. New|
00000530  4c 69 6e 65 28 29 3b 0a  09 20 74 6f 70 46 72 61  |Line();.. topFra|
00000540  6d 65 20 3a 3d 20 70 2d  34 3b 0a 09 20 6e 65 77  |me := p-4;.. new|
00000550  50 20 3a 3d 20 56 43 41  52 5b 70 2b 34 5d 0a 09  |P := VCAR[p+4]..|
00000560  20 49 46 20 6e 65 77 50  3d 70 20 54 48 45 4e 20  | IF newP=p THEN |
00000570  7b 20 57 72 69 74 65 53  28 22 42 61 73 65 20 6f  |{ WriteS("Base o|
00000580  66 20 73 74 61 63 6b 2a  4e 22 29 3b 20 42 52 45  |f stack*N"); BRE|
00000590  41 4b 20 7d 3b 0a 09 20  70 20 3a 3d 20 6e 65 77  |AK };.. p := new|
000005a0  50 3b 0a 09 20 55 4e 4c  45 53 53 20 62 61 73 65  |P;.. UNLESS base|
000005b0  3c 3d 70 3c 3d 74 6f 70  46 72 61 6d 65 20 54 48  |<=p<=topFrame TH|
000005c0  45 4e 20 7b 0a 09 20 20  20 20 57 72 69 74 65 46  |EN {..    WriteF|
000005d0  28 22 49 6d 70 72 6f 70  65 72 20 6c 69 6e 6b 20  |("Improper link |
000005e0  25 58 38 20 25 58 38 20  25 58 38 2a 4e 22 2c 20  |%X8 %X8 %X8*N", |
000005f0  62 61 73 65 2c 20 70 2c  20 74 6f 70 46 72 61 6d  |base, p, topFram|
00000600  65 29 3b 0a 09 20 20 20  20 42 52 45 41 4b 20 7d  |e);..    BREAK }|
00000610  0a 09 20 49 46 20 74 6f  70 46 72 61 6d 65 2d 70  |.. IF topFrame-p|
00000620  3e 32 30 30 20 54 48 45  4e 20 74 6f 70 46 72 61  |>200 THEN topFra|
00000630  6d 65 20 3a 3d 20 70 2b  32 30 30 20 7d 20 2f 2f  |me := p+200 } //|
00000640  20 6e 6f 74 20 6d 6f 72  65 20 74 68 61 6e 20 35  | not more than 5|
00000650  30 20 61 72 67 73 0a 20  20 20 20 20 20 73 62 20  |0 args.      sb |
00000660  3a 3d 20 73 62 21 31 20  7d 20 52 45 50 45 41 54  |:= sb!1 } REPEAT|
00000670  55 4e 54 49 4c 20 73 62  3d 2d 31 3b 0a 20 20 20  |UNTIL sb=-1;.   |
00000680  57 72 69 74 65 53 28 22  2a 4e 45 6e 64 20 6f 66  |WriteS("*NEnd of|
00000690  20 62 61 63 6b 74 72 61  63 65 2a 4e 22 29 20 7d  | backtrace*N") }|
000006a0  0a 0a 41 4e 44 20 57 72  69 74 65 46 4e 61 6d 65  |..AND WriteFName|
000006b0  28 6e 2c 20 70 29 20 42  45 0a 20 20 20 54 45 53  |(n, p) BE.   TES|
000006c0  54 20 6e 3d 2d 31 20 54  48 45 4e 0a 20 20 20 20  |T n=-1 THEN.    |
000006d0  20 20 57 72 69 74 65 53  28 22 52 4f 4f 54 20 20  |  WriteS("ROOT  |
000006e0  20 20 20 20 22 29 0a 20  20 20 45 4c 53 45 0a 20  |    ").   ELSE. |
000006f0  20 20 20 20 20 57 72 69  74 65 41 72 67 28 6e 2c  |     WriteArg(n,|
00000700  20 70 29 20 20 2f 2f 20  66 75 6e 63 74 69 6f 6e  | p)  // function|
00000710  20 6e 61 6d 65 0a 0a 0a  41 4e 44 20 57 72 69 74  | name...AND Writ|
00000720  65 41 72 67 28 6e 2c 70  29 20 42 45 20 7b 0a 2f  |eArg(n,p) BE {./|
00000730  2f 20 57 72 69 74 65 53  20 61 20 68 65 78 20 6e  |/ WriteS a hex n|
00000740  6f 2e 2f 66 75 6e 63 74  69 6f 6e 20 6e 61 6d 65  |o./function name|
00000750  20 69 6e 20 61 20 31 30  20 63 68 61 72 20 66 69  | in a 10 char fi|
00000760  65 6c 64 0a 2f 2f 20 50  20 69 73 20 42 43 50 4c  |eld.// P is BCPL|
00000770  20 73 74 61 63 6b 20 70  6f 69 6e 74 65 72 0a 20  | stack pointer. |
00000780  20 20 4c 45 54 20 66 20  3d 20 6e 2d 38 0a 0a 20  |  LET f = n-8.. |
00000790  20 20 49 46 20 23 78 31  30 30 30 3c 66 3c 3d 74  |  IF #x1000<f<=t|
000007a0  6f 70 4f 66 53 74 6f 72  65 20 26 20 30 25 66 3d  |opOfStore & 0%f=|
000007b0  37 20 26 20 56 43 41 52  5b 66 2d 34 5d 3d 2d 31  |7 & VCAR[f-4]=-1|
000007c0  20 54 48 45 4e 20 7b 0a  20 20 20 20 20 20 57 72  | THEN {.      Wr|
000007d0  69 74 65 46 28 22 25 73  20 20 20 22 2c 20 66 3e  |iteF("%s   ", f>|
000007e0  3e 32 29 3b 20 52 45 54  55 52 4e 20 7d 3b 0a 0a  |>2); RETURN };..|
000007f0  20 20 20 49 46 20 2d 31  30 30 30 3c 6e 3c 31 30  |   IF -1000<n<10|
00000800  30 30 20 54 48 45 4e 20  7b 0a 20 20 20 20 20 20  |00 THEN {.      |
00000810  57 72 69 74 65 46 28 22  25 78 33 28 25 69 34 29  |WriteF("%x3(%i4)|
00000820  20 22 2c 20 6e 2c 20 6e  29 3b 20 52 45 54 55 52  | ", n, n); RETUR|
00000830  4e 20 7d 3b 0a 0a 20 20  20 70 20 3a 3d 20 70 3e  |N };..   p := p>|
00000840  3e 32 3b 0a 20 20 20 49  46 20 70 2b 34 3c 3d 6e  |>2;.   IF p+4<=n|
00000850  3c 3d 70 2b 35 34 20 54  48 45 4e 20 7b 0a 20 20  |<=p+54 THEN {.  |
00000860  20 20 20 2f 2f 20 64 6f  65 73 20 6e 20 70 6f 69  |   // does n poi|
00000870  6e 74 20 74 6f 20 61 6e  20 69 74 65 6d 20 69 6e  |nt to an item in|
00000880  20 74 68 69 73 20 73 74  61 63 6b 20 66 72 61 6d  | this stack fram|
00000890  65 3f 20 28 66 69 72 73  74 20 35 30 20 61 72 67  |e? (first 50 arg|
000008a0  73 29 0a 20 20 20 20 20  20 6e 20 3a 3d 20 6e 2d  |s).      n := n-|
000008b0  70 2d 33 0a 20 20 20 20  20 20 57 72 69 74 65 46  |p-3.      WriteF|
000008c0  28 22 2d 3e 20 41 72 67  25 49 32 20 20 22 2c 20  |("-> Arg%I2  ", |
000008d0  6e 29 0a 20 20 20 20 20  20 52 45 54 55 52 4e 20  |n).      RETURN |
000008e0  7d 0a 0a 20 20 20 57 72  69 74 65 46 28 22 25 78  |}..   WriteF("%x|
000008f0  38 20 20 22 2c 20 6e 29  20 7d 0a 0a 41 4e 44 20  |8  ", n) }..AND |
00000900  4d 61 70 53 74 6f 72 65  28 29 20 42 45 20 7b 0a  |MapStore() BE {.|
00000910  20 20 20 4c 45 54 20 67  20 3d 20 40 47 30 0a 20  |   LET g = @G0. |
00000920  20 20 4c 45 54 20 6e 67  6c 6f 62 73 20 3d 20 47  |  LET nglobs = G|
00000930  30 0a 20 20 20 4c 45 54  20 63 6f 6c 75 6d 6e 20  |0.   LET column |
00000940  3d 20 30 0a 20 20 20 4c  45 54 20 70 20 3d 20 62  |= 0.   LET p = b|
00000950  6c 6f 63 6b 4c 69 73 74  0a 0a 20 20 20 57 72 69  |lockList..   Wri|
00000960  74 65 53 28 22 2a 4e 4d  61 70 73 74 6f 72 65 20  |teS("*NMapstore |
00000970  63 61 6c 6c 65 64 2a 4e  22 29 0a 0a 20 20 20 44  |called*N")..   D|
00000980  65 73 63 72 69 62 65 43  6f 64 65 28 6c 6f 61 64  |escribeCode(load|
00000990  50 6f 69 6e 74 29 3b 0a  20 20 20 54 45 53 54 20  |Point);.   TEST |
000009a0  75 67 3c 3d 47 30 3c 3d  31 30 30 30 30 20 54 48  |ug<=G0<=10000 TH|
000009b0  45 4e 0a 20 20 20 20 20  20 57 72 69 74 65 46 28  |EN.      WriteF(|
000009c0  22 2a 4e 25 4e 20 67 6c  6f 62 61 6c 73 20 61 6c  |"*N%N globals al|
000009d0  6c 6f 63 61 74 65 64 2a  4e 22 2c 20 47 30 29 0a  |located*N", G0).|
000009e0  20 20 20 45 4c 53 45 20  7b 0a 20 20 20 20 20 20  |   ELSE {.      |
000009f0  57 72 69 74 65 53 28 22  47 6c 6f 62 61 6c 20 7a  |WriteS("Global z|
00000a00  65 72 6f 20 69 73 20 63  6f 72 72 75 70 74 65 64  |ero is corrupted|
00000a10  2a 4e 22 29 3b 20 6e 67  6c 6f 62 73 20 3a 3d 20  |*N"); nglobs := |
00000a20  32 35 30 20 7d 3b 0a 0a  20 20 20 57 72 69 74 65  |250 };..   Write|
00000a30  46 28 22 2a 4e 56 61 6c  75 65 73 20 73 65 74 20  |F("*NValues set |
00000a40  69 6e 20 47 6c 6f 62 61  6c 20 56 65 63 74 6f 72  |in Global Vector|
00000a50  20 28 25 58 36 2f 25 58  36 29 3a 2a 4e 22 2c 20  | (%X6/%X6):*N", |
00000a60  67 2c 20 67 3c 3c 32 29  3b 0a 0a 20 20 20 46 4f  |g, g<<2);..   FO|
00000a70  52 20 74 20 3d 20 30 20  54 4f 20 6e 67 6c 6f 62  |R t = 0 TO nglob|
00000a80  73 20 44 4f 20 7b 0a 20  20 20 20 20 20 4c 45 54  |s DO {.      LET|
00000a90  20 76 61 6c 20 3d 20 67  21 74 3b 0a 20 20 20 20  | val = g!t;.    |
00000aa0  20 20 49 46 20 5b 76 61  6c 26 55 6e 73 65 74 47  |  IF [val&UnsetG|
00000ab0  6c 6f 62 61 6c 4d 61 73  6b 5d 7e 3d 55 6e 73 65  |lobalMask]~=Unse|
00000ac0  74 47 6c 6f 62 61 6c 56  61 6c 75 65 20 54 48 45  |tGlobalValue THE|
00000ad0  4e 20 7b 0a 09 20 49 46  20 63 6f 6c 75 6d 6e 3e  |N {.. IF column>|
00000ae0  4c 69 6e 65 4c 65 6e 67  74 68 2d 32 30 20 54 48  |LineLength-20 TH|
00000af0  45 4e 20 7b 20 4e 65 77  4c 69 6e 65 28 29 3b 20  |EN { NewLine(); |
00000b00  63 6f 6c 75 6d 6e 20 3a  3d 20 30 20 7d 3b 0a 09  |column := 0 };..|
00000b10  20 54 45 53 54 20 74 3e  3d 31 30 30 30 0a 09 20  | TEST t>=1000.. |
00000b20  20 20 20 54 48 45 4e 20  57 72 69 74 65 46 28 22  |   THEN WriteF("|
00000b30  25 69 34 3a 20 22 2c 74  29 0a 09 20 20 20 20 45  |%i4: ",t)..    E|
00000b40  4c 53 45 20 57 72 69 74  65 46 28 22 47 25 49 33  |LSE WriteF("G%I3|
00000b50  3a 20 22 2c 20 74 29 3b  0a 09 20 57 72 69 74 65  |: ", t);.. Write|
00000b60  41 72 67 28 76 61 6c 2c  20 30 29 3b 0a 09 20 57  |Arg(val, 0);.. W|
00000b70  72 69 74 65 53 28 22 20  20 20 22 29 3b 0a 09 20  |riteS("   ");.. |
00000b80  63 6f 6c 75 6d 6e 20 3a  3d 20 63 6f 6c 75 6d 6e  |column := column|
00000b90  2b 32 30 20 7d 20 7d 0a  0a 20 2f 2a 0a 20 20 20  |+20 } }.. /*.   |
00000ba0  57 72 69 74 65 53 28 22  2a 6e 2a 6e 4d 65 6d 6f  |WriteS("*n*nMemo|
00000bb0  72 79 20 62 6c 6f 63 6b  73 3a 22 29 0a 20 20 20  |ry blocks:").   |
00000bc0  55 4e 54 49 4c 20 21 70  3d 30 20 44 4f 20 7b 0a  |UNTIL !p=0 DO {.|
00000bd0  20 20 20 20 20 20 4c 45  54 20 6c 65 6e 20 3d 20  |      LET len = |
00000be0  21 70 3b 0a 20 20 20 20  20 20 57 72 69 74 65 46  |!p;.      WriteF|
00000bf0  28 22 2a 6e 25 78 36 2f  25 78 36 3a 20 22 2c 20  |("*n%x6/%x6: ", |
00000c00  70 2b 31 2c 20 28 70 2b  31 29 3c 3c 32 29 0a 20  |p+1, (p+1)<<2). |
00000c10  20 20 20 20 20 54 45 53  54 20 6c 65 6e 3c 30 20  |     TEST len<0 |
00000c20  54 48 45 4e 20 7b 20 2f  2f 20 75 73 65 64 20 62  |THEN { // used b|
00000c30  6c 6f 63 6b 0a 09 20 54  45 53 54 20 67 20 3d 20  |lock.. TEST g = |
00000c40  70 2b 31 20 54 48 45 4e  0a 09 20 20 20 20 57 72  |p+1 THEN..    Wr|
00000c50  69 74 65 53 28 22 47 6c  6f 62 61 6c 20 76 65 63  |iteS("Global vec|
00000c60  74 6f 72 22 29 0a 09 20  45 4c 53 45 20 54 45 53  |tor").. ELSE TES|
00000c70  54 20 73 74 61 63 6b 62  61 73 65 20 3d 20 70 2b  |T stackbase = p+|
00000c80  31 20 54 48 45 4e 0a 09  20 20 20 20 57 72 69 74  |1 THEN..    Writ|
00000c90  65 53 28 22 43 75 72 72  65 6e 74 20 73 74 61 63  |eS("Current stac|
00000ca0  6b 22 29 0a 09 20 45 4c  53 45 20 54 45 53 54 20  |k").. ELSE TEST |
00000cb0  70 21 31 3d 48 75 6e 6b  4d 61 72 6b 20 54 48 45  |p!1=HunkMark THE|
00000cc0  4e 0a 09 20 20 20 20 44  65 73 63 72 69 62 65 43  |N..    DescribeC|
00000cd0  6f 64 65 28 70 29 0a 09  20 45 4c 53 45 0a 09 20  |ode(p).. ELSE.. |
00000ce0  20 20 20 57 72 69 74 65  46 28 22 41 6c 6c 6f 63  |   WriteF("Alloc|
00000cf0  61 74 65 64 20 42 6c 6f  63 6b 20 6f 66 20 25 4e  |ated Block of %N|
00000d00  20 42 43 50 4c 20 77 6f  72 64 73 22 2c 20 2d 6c  | BCPL words", -l|
00000d10  65 6e 2d 31 29 3b 0a 09  20 6c 65 6e 20 3a 3d 20  |en-1);.. len := |
00000d20  2d 6c 65 6e 20 7d 0a 0a  20 20 20 20 20 20 45 4c  |-len }..      EL|
00000d30  53 45 20 20 2f 2f 20 66  72 65 65 62 6c 6f 63 6b  |SE  // freeblock|
00000d40  0a 09 20 57 72 69 74 65  46 28 22 46 72 65 65 20  |.. WriteF("Free |
00000d50  42 6c 6f 63 6b 20 6f 66  20 25 4e 20 42 43 50 4c  |Block of %N BCPL|
00000d60  20 77 6f 72 64 73 22 2c  20 6c 65 6e 2d 31 29 0a  | words", len-1).|
00000d70  0a 20 20 20 20 20 20 70  20 3a 3d 20 70 2b 6c 65  |.      p := p+le|
00000d80  6e 20 7d 20 20 2f 2f 20  6e 65 78 74 20 62 6c 6f  |n }  // next blo|
00000d90  63 6b 20 2a 2f 0a 0a 20  20 20 57 72 69 74 65 53  |ck */..   WriteS|
00000da0  28 22 2a 4e 45 6e 64 20  6f 66 20 6d 61 70 73 74  |("*NEnd of mapst|
00000db0  6f 72 65 2a 4e 22 29 20  7d 0a 0a 41 4e 44 20 44  |ore*N") }..AND D|
00000dc0  65 73 63 72 69 62 65 43  6f 64 65 28 71 29 20 42  |escribeCode(q) B|
00000dd0  45 20 7b 0a 20 20 20 4c  45 54 20 63 6f 6c 75 6d  |E {.   LET colum|
00000de0  6e 20 3d 20 30 3b 0a 20  20 20 4c 45 54 20 73 65  |n = 0;.   LET se|
00000df0  63 74 69 6f 6e 45 6e 64  20 3d 20 71 3b 0a 20 20  |ctionEnd = q;.  |
00000e00  20 57 72 69 74 65 53 28  22 50 72 6f 67 72 61 6d  | WriteS("Program|
00000e10  20 63 6f 64 65 22 29 0a  20 20 20 55 4e 54 49 4c  | code").   UNTIL|
00000e20  20 71 3e 3d 73 65 63 74  69 6f 6e 45 6e 64 20 26  | q>=sectionEnd &|
00000e30  20 21 71 3d 45 6e 64 4d  61 72 6b 20 44 4f 20 7b  | !q=EndMark DO {|
00000e40  0a 20 20 20 20 20 20 4c  45 54 20 77 6f 72 64 20  |.      LET word |
00000e50  3d 20 21 71 3b 0a 20 20  20 20 20 20 54 45 53 54  |= !q;.      TEST|
00000e60  20 71 3e 3d 73 65 63 74  69 6f 6e 45 6e 64 20 26  | q>=sectionEnd &|
00000e70  20 77 6f 72 64 3d 53 65  63 74 69 6f 6e 53 74 61  | word=SectionSta|
00000e80  72 74 20 54 48 45 4e 20  7b 0a 09 20 4c 45 54 20  |rt THEN {.. LET |
00000e90  6e 61 6d 65 20 3d 20 56  45 43 20 32 0a 09 20 41  |name = VEC 2.. A|
00000ea0  4e 44 20 64 61 74 65 20  3d 20 56 45 43 20 32 0a  |ND date = VEC 2.|
00000eb0  09 20 41 4e 44 20 74 69  6d 65 20 3d 20 56 45 43  |. AND time = VEC|
00000ec0  20 32 0a 09 20 41 4e 44  20 75 6e 73 65 74 73 74  | 2.. AND unsetst|
00000ed0  72 69 6e 67 20 3d 20 22  3c 75 6e 73 65 74 3e 22  |ring = "<unset>"|
00000ee0  3b 0a 09 20 4c 45 54 20  6e 61 6d 65 6c 20 3d 20  |;.. LET namel = |
00000ef0  38 3b 0a 09 20 4c 45 54  20 76 65 72 73 69 6f 6e  |8;.. LET version|
00000f00  57 6f 72 64 20 3d 20 71  21 39 3b 0a 09 20 73 65  |Word = q!9;.. se|
00000f10  63 74 69 6f 6e 45 6e 64  20 3a 3d 20 71 2b 5b 28  |ctionEnd := q+[(|
00000f20  71 21 31 29 3e 3e 32 5d  3b 0a 09 20 46 4f 52 20  |q!1)>>2];.. FOR |
00000f30  69 20 3d 20 30 20 54 4f  20 37 20 44 4f 20 7b 0a  |i = 0 TO 7 DO {.|
00000f40  09 20 20 20 20 4c 45 54  20 63 20 3d 20 71 25 28  |.    LET c = q%(|
00000f50  69 2b 38 29 3b 0a 09 20  20 20 20 49 46 20 63 3d  |i+8);..    IF c=|
00000f60  30 20 26 20 6e 61 6d 65  6c 3d 38 20 54 48 45 4e  |0 & namel=8 THEN|
00000f70  20 7b 20 6e 61 6d 65 6c  20 3a 3d 20 69 3b 20 42  | { namel := i; B|
00000f80  52 45 41 4b 20 7d 3b 0a  09 20 20 20 20 6e 61 6d  |REAK };..    nam|
00000f90  65 25 28 69 2b 31 29 20  3a 3d 20 63 20 7d 0a 09  |e%(i+1) := c }..|
00000fa0  20 6e 61 6d 65 25 30 20  3a 3d 20 6e 61 6d 65 6c  | name%0 := namel|
00000fb0  3b 0a 09 20 54 45 53 54  20 71 25 31 36 3d 27 3c  |;.. TEST q%16='<|
00000fc0  27 20 54 48 45 4e 0a 09  20 20 20 20 64 61 74 65  |' THEN..    date|
00000fd0  2c 20 74 69 6d 65 20 3a  3d 20 75 6e 73 65 74 73  |, time := unsets|
00000fe0  74 72 69 6e 67 2c 20 75  6e 73 65 74 73 74 72 69  |tring, unsetstri|
00000ff0  6e 67 0a 09 20 45 4c 53  45 20 7b 0a 09 20 20 20  |ng.. ELSE {..   |
00001000  20 46 4f 52 20 69 20 3d  20 30 20 54 4f 20 38 20  | FOR i = 0 TO 8 |
00001010  44 4f 20 7b 0a 09 20 20  20 20 20 20 20 64 61 74  |DO {..       dat|
00001020  65 25 28 69 2b 31 29 20  3a 3d 20 71 25 28 69 2b  |e%(i+1) := q%(i+|
00001030  31 36 29 3b 0a 09 20 20  20 20 20 20 20 74 69 6d  |16);..       tim|
00001040  65 25 28 69 2b 31 29 20  3a 3d 20 71 25 28 69 2b  |e%(i+1) := q%(i+|
00001050  32 36 29 20 7d 3b 0a 09  20 20 20 20 64 61 74 65  |26) };..    date|
00001060  25 30 20 3a 3d 20 39 3b  0a 09 20 20 20 20 74 69  |%0 := 9;..    ti|
00001070  6d 65 25 30 20 3a 3d 20  38 20 7d 3b 0a 09 20 57  |me%0 := 8 };.. W|
00001080  72 69 74 65 46 28 22 2a  6e 2a 6e 25 58 36 20 20  |riteF("*n*n%X6  |
00001090  53 65 63 74 69 6f 6e 20  25 73 22 2c 20 71 3c 3c  |Section %s", q<<|
000010a0  32 2c 20 6e 61 6d 65 29  3b 0a 09 20 49 46 20 71  |2, name);.. IF q|
000010b0  21 31 31 3d 2d 31 20 26  20 71 25 34 38 3d 37 20  |!11=-1 & q%48=7 |
000010c0  54 48 45 4e 20 7b 0a 09  20 20 20 20 4c 45 54 20  |THEN {..    LET |
000010d0  6c 6f 63 61 6c 20 3d 20  71 21 31 30 3b 0a 09 20  |local = q!10;.. |
000010e0  20 20 20 49 46 20 56 43  41 52 20 6c 6f 63 61 6c  |   IF VCAR local|
000010f0  20 3d 20 56 65 72 73 69  6f 6e 4d 61 72 6b 20 54  | = VersionMark T|
00001100  48 45 4e 20 7b 0a 09 20  20 20 20 20 20 20 4c 45  |HEN {..       LE|
00001110  54 20 6e 20 3d 20 56 43  41 52 28 6c 6f 63 61 6c  |T n = VCAR(local|
00001120  2b 34 29 3b 0a 09 20 20  20 20 20 20 20 57 72 69  |+4);..       Wri|
00001130  74 65 46 28 22 20 20 76  65 72 73 69 6f 6e 20 25  |teF("  version %|
00001140  6e 2e 25 6e 22 2c 20 6e  3e 3e 38 2c 20 6e 26 32  |n.%n", n>>8, n&2|
00001150  35 35 29 20 7d 20 7d 0a  09 20 57 72 69 74 65 46  |55) } }.. WriteF|
00001160  28 22 2a 6e 20 20 20 20  63 6f 6d 70 69 6c 65 64  |("*n    compiled|
00001170  20 6f 6e 20 25 73 20 61  74 20 25 73 22 2c 20 64  | on %s at %s", d|
00001180  61 74 65 2c 20 74 69 6d  65 29 3b 0a 09 20 49 46  |ate, time);.. IF|
00001190  20 76 65 72 73 69 6f 6e  57 6f 72 64 7e 3d 30 20  | versionWord~=0 |
000011a0  54 48 45 4e 0a 09 20 20  20 20 57 72 69 74 65 46  |THEN..    WriteF|
000011b0  28 22 20 75 73 69 6e 67  20 43 47 20 76 65 72 73  |(" using CG vers|
000011c0  69 6f 6e 20 25 6e 2e 25  6e 22 2c 0a 09 09 20 20  |ion %n.%n",...  |
000011d0  20 20 20 76 65 72 73 69  6f 6e 57 6f 72 64 3e 3e  |   versionWord>>|
000011e0  32 34 2c 20 28 76 65 72  73 69 6f 6e 57 6f 72 64  |24, (versionWord|
000011f0  3e 3e 31 36 29 26 32 35  35 29 3b 0a 09 20 4e 65  |>>16)&255);.. Ne|
00001200  77 4c 69 6e 65 28 29 3b  0a 09 20 71 20 3a 3d 20  |wLine();.. q := |
00001210  71 2b 31 30 3b 0a 09 20  63 6f 6c 75 6d 6e 20 3a  |q+10;.. column :|
00001220  3d 20 30 20 7d 0a 0a 20  20 20 20 20 20 45 4c 53  |= 0 }..      ELS|
00001230  45 20 54 45 53 54 20 71  3d 53 65 63 74 69 6f 6e  |E TEST q=Section|
00001240  45 6e 64 20 54 48 45 4e  20 2f 2f 20 73 6b 69 70  |End THEN // skip|
00001250  20 67 6c 6f 62 61 6c 20  69 6e 69 74 69 61 6c 69  | global initiali|
00001260  73 61 74 69 6f 6e 73 0a  09 20 71 20 3a 3d 20 71  |sations.. q := q|
00001270  2b 32 20 52 45 50 45 41  54 57 48 49 4c 45 20 28  |+2 REPEATWHILE (|
00001280  2d 31 29 21 71 7e 3d 30  0a 0a 20 20 20 20 20 20  |-1)!q~=0..      |
00001290  45 4c 53 45 20 54 45 53  54 20 71 3e 3d 53 65 63  |ELSE TEST q>=Sec|
000012a0  74 69 6f 6e 45 6e 64 20  26 20 77 6f 72 64 3d 53  |tionEnd & word=S|
000012b0  74 61 72 74 52 65 6c 6f  63 61 74 69 6f 6e 20 54  |tartRelocation T|
000012c0  48 45 4e 0a 09 20 71 20  3a 3d 20 71 2b 31 20 52  |HEN.. q := q+1 R|
000012d0  45 50 45 41 54 57 48 49  4c 45 20 21 71 7e 3d 45  |EPEATWHILE !q~=E|
000012e0  6e 64 52 65 6c 6f 63 61  74 69 6f 6e 0a 0a 20 20  |ndRelocation..  |
000012f0  20 20 20 20 45 4c 53 45  20 54 45 53 54 20 77 6f  |    ELSE TEST wo|
00001300  72 64 3d 2d 31 20 26 20  71 25 34 3d 37 20 54 48  |rd=-1 & q%4=7 TH|
00001310  45 4e 20 7b 0a 09 20 4c  45 54 20 70 72 6f 63 53  |EN {.. LET procS|
00001320  74 61 72 74 20 3d 20 71  2b 32 3b 0a 09 20 49 46  |tart = q+2;.. IF|
00001330  20 5b 28 21 70 72 6f 63  73 74 61 72 74 29 3e 3e  | [(!procstart)>>|
00001340  32 34 5d 3d 30 20 54 48  45 4e 20 70 72 6f 63 53  |24]=0 THEN procS|
00001350  74 61 72 74 20 3a 3d 20  70 72 6f 63 53 74 61 72  |tart := procStar|
00001360  74 2b 31 3b 0a 09 20 49  46 20 63 6f 6c 75 6d 6e  |t+1;.. IF column|
00001370  3e 3d 4c 69 6e 65 4c 65  6e 67 74 68 2d 31 36 20  |>=LineLength-16 |
00001380  54 48 45 4e 20 7b 20 4e  65 77 4c 69 6e 65 28 29  |THEN { NewLine()|
00001390  3b 20 63 6f 6c 75 6d 6e  20 3a 3d 20 30 20 7d 3b  |; column := 0 };|
000013a0  0a 09 20 57 72 69 74 65  46 28 22 20 20 25 78 36  |.. WriteF("  %x6|
000013b0  3a 20 25 73 22 2c 20 70  72 6f 63 53 74 61 72 74  |: %s", procStart|
000013c0  3c 3c 32 2c 20 71 2b 31  29 3b 0a 09 20 63 6f 6c  |<<2, q+1);.. col|
000013d0  75 6d 6e 20 3a 3d 20 63  6f 6c 75 6d 6e 2b 31 37  |umn := column+17|
000013e0  3b 0a 09 20 71 20 3a 3d  20 70 72 6f 63 53 74 61  |;.. q := procSta|
000013f0  72 74 20 7d 0a 0a 20 20  20 20 20 20 45 4c 53 45  |rt }..      ELSE|
00001400  20 71 20 3a 3d 20 71 2b  31 20 7d 0a 0a 20 20 20  | q := q+1 }..   |
00001410  4e 65 77 4c 69 6e 65 28  29 20 7d 0a 0a 0a 4d 41  |NewLine() }...MA|
00001420  4e 49 46 45 53 54 20 7b  0a 20 20 20 45 72 72 6f  |NIFEST {.   Erro|
00001430  72 5f 49 6c 6c 65 67 61  6c 49 6e 73 74 72 75 63  |r_IllegalInstruc|
00001440  74 69 6f 6e 20 3d 20 23  78 38 30 30 30 30 30 30  |tion = #x8000000|
00001450  30 0a 20 20 20 45 72 72  6f 72 5f 50 72 65 66 65  |0.   Error_Prefe|
00001460  74 63 68 41 62 6f 72 74  09 20 20 20 20 3d 20 23  |tchAbort.    = #|
00001470  78 38 30 30 30 30 30 30  31 0a 20 20 20 45 72 72  |x80000001.   Err|
00001480  6f 72 5f 44 61 74 61 41  62 6f 72 74 09 20 20 20  |or_DataAbort.   |
00001490  20 3d 20 23 78 38 30 30  30 30 30 30 32 0a 20 20  | = #x80000002.  |
000014a0  20 45 72 72 6f 72 5f 41  64 64 72 65 73 73 45 78  | Error_AddressEx|
000014b0  63 65 70 74 69 6f 6e 20  20 20 3d 20 23 78 38 30  |ception   = #x80|
000014c0  30 30 30 30 30 33 0a 20  20 20 45 72 72 6f 72 5f  |000003.   Error_|
000014d0  55 6e 6b 6e 6f 77 6e 49  52 51 09 20 20 20 20 3d  |UnknownIRQ.    =|
000014e0  20 23 78 38 30 30 30 30  30 30 34 0a 20 20 20 45  | #x80000004.   E|
000014f0  72 72 6f 72 5f 42 72 61  6e 63 68 54 68 72 6f 75  |rror_BranchThrou|
00001500  67 68 5a 65 72 6f 20 20  3d 20 23 78 38 30 30 30  |ghZero  = #x8000|
00001510  30 30 30 35 0a 0a 20 20  20 45 72 72 6f 72 5f 46  |0005..   Error_F|
00001520  50 42 61 73 65 20 09 20  20 20 20 3d 20 23 78 38  |PBase .    = #x8|
00001530  30 30 30 30 32 30 30 0a  20 20 20 45 72 72 6f 72  |0000200.   Error|
00001540  5f 46 50 4c 69 6d 69 74  09 20 20 20 20 3d 20 23  |_FPLimit.    = #|
00001550  78 38 30 30 30 30 33 30  30 20 7d 0a 0a 4c 45 54  |x80000300 }..LET|
00001560  20 41 62 6f 72 74 28 6e  29 20 42 45 20 7b 0a 20  | Abort(n) BE {. |
00001570  20 20 4c 45 54 20 70 63  20 3d 20 28 56 43 41 52  |  LET pc = (VCAR|
00001580  5b 4c 65 76 65 6c 28 29  2b 31 32 5d 29 26 50 43  |[Level()+12])&PC|
00001590  4d 61 73 6b 3b 0a 20 20  20 49 46 20 6e 7e 3d 30  |Mask;.   IF n~=0|
000015a0  20 54 48 45 4e 20 7b 0a  20 20 20 20 20 20 53 57  | THEN {.      SW|
000015b0  49 54 43 48 4f 4e 20 6e  20 49 4e 54 4f 20 7b 0a  |ITCHON n INTO {.|
000015c0  09 20 43 41 53 45 20 45  72 72 6f 72 5f 49 6c 6c  |. CASE Error_Ill|
000015d0  65 67 61 6c 49 6e 73 74  72 75 63 74 69 6f 6e 3a  |egalInstruction:|
000015e0  57 72 69 74 65 53 28 22  2a 6e 49 6c 6c 65 67 61  |WriteS("*nIllega|
000015f0  6c 20 49 6e 73 74 72 75  63 74 69 6f 6e 22 29 3b  |l Instruction");|
00001600  20 45 4e 44 43 41 53 45  0a 09 20 43 41 53 45 20  | ENDCASE.. CASE |
00001610  45 72 72 6f 72 5f 50 72  65 66 65 74 63 68 41 62  |Error_PrefetchAb|
00001620  6f 72 74 3a 20 20 20 20  20 57 72 69 74 65 53 28  |ort:     WriteS(|
00001630  22 2a 6e 50 72 65 66 65  74 63 68 20 41 62 6f 72  |"*nPrefetch Abor|
00001640  74 22 29 3b 20 45 4e 44  43 41 53 45 0a 09 20 43  |t"); ENDCASE.. C|
00001650  41 53 45 20 45 72 72 6f  72 5f 44 61 74 61 41 62  |ASE Error_DataAb|
00001660  6f 72 74 3a 09 20 20 20  20 20 20 20 57 72 69 74  |ort:.       Writ|
00001670  65 53 28 22 2a 6e 44 61  74 61 20 41 62 6f 72 74  |eS("*nData Abort|
00001680  22 29 3b 20 45 4e 44 43  41 53 45 0a 09 20 43 41  |"); ENDCASE.. CA|
00001690  53 45 20 45 72 72 6f 72  5f 41 64 64 72 65 73 73  |SE Error_Address|
000016a0  45 78 63 65 70 74 69 6f  6e 3a 20 20 57 72 69 74  |Exception:  Writ|
000016b0  65 53 28 22 2a 6e 41 64  64 72 65 73 73 20 45 78  |eS("*nAddress Ex|
000016c0  63 65 70 74 69 6f 6e 22  29 3b 20 45 4e 44 43 41  |ception"); ENDCA|
000016d0  53 45 0a 09 20 44 45 46  41 55 4c 54 3a 0a 09 20  |SE.. DEFAULT:.. |
000016e0  20 20 20 7b 20 20 4c 45  54 20 76 20 3d 20 56 45  |   {  LET v = VE|
000016f0  43 20 36 34 3b 0a 09 20  20 20 20 20 20 20 54 4b  |C 64;..       TK|
00001700  52 45 72 72 28 76 2c 20  32 35 35 29 3b 0a 09 20  |RErr(v, 255);.. |
00001710  20 20 20 20 20 20 7b 20  20 4c 45 54 20 6e 20 3d  |      {  LET n =|
00001720  20 76 25 30 3b 0a 09 09  20 20 57 48 49 4c 45 20  | v%0;...  WHILE |
00001730  6e 3e 30 20 26 20 28 76  25 6e 3d 27 2a 43 27 20  |n>0 & (v%n='*C' |
00001740  7c 20 76 25 6e 3d 27 2a  4e 27 29 20 44 4f 20 6e  || v%n='*N') DO n|
00001750  20 3a 3d 20 6e 2d 31 3b  0a 09 09 20 20 76 25 30  | := n-1;...  v%0|
00001760  20 3a 3d 20 6e 20 7d 3b  0a 09 20 20 20 20 20 20  | := n };..      |
00001770  20 57 72 69 74 65 46 28  22 2a 6e 41 62 6f 72 74  | WriteF("*nAbort|
00001780  20 25 78 38 3a 20 25 73  22 2c 20 6e 2c 20 76 29  | %x8: %s", n, v)|
00001790  20 7d 20 7d 3b 0a 0a 20  20 20 20 20 20 57 72 69  | } };..      Wri|
000017a0  74 65 46 28 22 20 61 74  20 25 78 38 22 2c 20 70  |teF(" at %x8", p|
000017b0  63 29 20 7d 3b 0a 20 20  20 49 46 20 28 70 63 26  |c) };.   IF (pc&|
000017c0  55 6e 73 65 74 47 6c 6f  62 61 6c 4d 61 73 6b 29  |UnsetGlobalMask)|
000017d0  3d 28 55 6e 73 65 74 47  6c 6f 62 61 6c 56 61 6c  |=(UnsetGlobalVal|
000017e0  75 65 26 50 43 4d 61 73  6b 29 20 54 48 45 4e 0a  |ue&PCMask) THEN.|
000017f0  20 20 20 20 20 20 57 72  69 74 65 46 28 22 2a 6e  |      WriteF("*n|
00001800  49 73 20 47 6c 6f 62 61  6c 20 25 4e 20 64 65 66  |Is Global %N def|
00001810  69 6e 65 64 3f 22 2c 20  5b 28 70 63 26 7e 55 6e  |ined?", [(pc&~Un|
00001820  73 65 74 47 6c 6f 62 61  6c 4d 61 73 6b 29 3e 3e  |setGlobalMask)>>|
00001830  32 5d 2d 31 29 3b 0a 20  20 20 42 61 63 6b 54 72  |2]-1);.   BackTr|
00001840  61 63 65 28 29 3b 0a 20  20 20 4d 61 70 53 74 6f  |ace();.   MapSto|
00001850  72 65 28 29 3b 0a 20 20  20 53 74 6f 70 28 32 35  |re();.   Stop(25|
00001860  36 29 20 7d 0a                                    |6) }.|
00001865