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