Home » Archimedes archive » Zipped Apps » BCPL » BCPL/b/inspect
BCPL/b/inspect
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/inspect |
Read OK: | ✔ |
File size: | 09C8 bytes |
Load address: | 0000 |
Exec address: | 0000 |
File contents
GET "LibHdr" MANIFEST $( SectionStart = #x4c504342 VersionMark = #x4e524556; EndMark = 1002; HunkMark = 1001; linelength = 80; maxaddress = 640*1024; UnsetGlobalMask = #xFFFF0000; UnsetGlobalValue = #xAE950000; PCMask = #x03FFFFFC $) STATIC $( loadAddress = 0 $) LET DescribeCode(q, offset) BE $( LET column = 0; LET sectionEnd = q; writes("Program code") UNTIL q>=sectionEnd & !q=EndMark DO $( TEST q>=sectionEnd & !q=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)-offset, name); IF q!11=-1 & q%48=7 THEN $( LET local = (q!10)+(q<<2); 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=-1 & q%4=7 THEN $( LET procStart = q+3; IF [(!procstart)>>24]=0 THEN procStart := procStart+1; IF column>=linelength-16 THEN $( newline() column := 0 $); writef(" %x6: %s", (procStart<<2)-offset, q+1); column := column+17; q := procStart $) ELSE q := q+1 $) newline() $) AND Start() BE $( LET argv = GetVec(200); LET v = GetVec(MaxVec()-200); LET size = 0; RdArgs("FROM/A,TO/K", argv, 200); IF argv!1~=0 THEN SelectOutput(FindOutput(argv!1)); size := Load(argv!0, v); IF size<0 THEN $( WriteF("Cannot access %s*n", argv!0); Stop(1) $); v!(size/4) := EndMark; DescribeCode(v, (v<<2)-loadAddress) $) AND load(name, buffer) = VALOF $( LET paramBlock = VEC 3; paramblock!0 := buffer*bytesperword paramblock!1 := 0 osfile(#xFF, name, paramblock) loadAddress := paramBlock!0; TEST ~result2 THEN RESULTIS paramblock!2 ELSE RESULTIS -1 $)
00000000 47 45 54 20 22 4c 69 62 48 64 72 22 0a 0a 4d 41 |GET "LibHdr"..MA| 00000010 4e 49 46 45 53 54 0a 24 28 20 53 65 63 74 69 6f |NIFEST.$( Sectio| 00000020 6e 53 74 61 72 74 20 20 20 20 20 20 20 3d 20 23 |nStart = #| 00000030 78 34 63 35 30 34 33 34 32 0a 20 20 20 56 65 72 |x4c504342. Ver| 00000040 73 69 6f 6e 4d 61 72 6b 09 20 20 20 20 20 20 3d |sionMark. =| 00000050 20 23 78 34 65 35 32 34 35 35 36 3b 0a 20 20 20 | #x4e524556;. | 00000060 45 6e 64 4d 61 72 6b 09 20 20 20 20 20 20 3d 20 |EndMark. = | 00000070 31 30 30 32 3b 0a 20 20 20 48 75 6e 6b 4d 61 72 |1002;. HunkMar| 00000080 6b 09 20 20 20 20 20 20 3d 20 31 30 30 31 3b 0a |k. = 1001;.| 00000090 20 20 20 6c 69 6e 65 6c 65 6e 67 74 68 09 20 20 | linelength. | 000000a0 20 20 20 20 3d 20 38 30 3b 0a 20 20 20 6d 61 78 | = 80;. max| 000000b0 61 64 64 72 65 73 73 09 20 20 20 20 20 20 3d 20 |address. = | 000000c0 36 34 30 2a 31 30 32 34 3b 0a 20 20 20 55 6e 73 |640*1024;. Uns| 000000d0 65 74 47 6c 6f 62 61 6c 4d 61 73 6b 20 20 20 20 |etGlobalMask | 000000e0 3d 20 23 78 46 46 46 46 30 30 30 30 3b 0a 20 20 |= #xFFFF0000;. | 000000f0 20 55 6e 73 65 74 47 6c 6f 62 61 6c 56 61 6c 75 | UnsetGlobalValu| 00000100 65 20 20 20 3d 20 23 78 41 45 39 35 30 30 30 30 |e = #xAE950000| 00000110 3b 0a 20 20 20 50 43 4d 61 73 6b 09 20 20 20 20 |;. PCMask. | 00000120 20 20 3d 20 23 78 30 33 46 46 46 46 46 43 0a 24 | = #x03FFFFFC.$| 00000130 29 0a 0a 53 54 41 54 49 43 0a 24 28 20 6c 6f 61 |)..STATIC.$( loa| 00000140 64 41 64 64 72 65 73 73 20 3d 20 30 0a 24 29 0a |dAddress = 0.$).| 00000150 0a 4c 45 54 20 44 65 73 63 72 69 62 65 43 6f 64 |.LET DescribeCod| 00000160 65 28 71 2c 20 6f 66 66 73 65 74 29 20 42 45 0a |e(q, offset) BE.| 00000170 24 28 20 4c 45 54 20 63 6f 6c 75 6d 6e 20 3d 20 |$( LET column = | 00000180 30 3b 0a 20 20 20 4c 45 54 20 73 65 63 74 69 6f |0;. LET sectio| 00000190 6e 45 6e 64 20 3d 20 71 3b 0a 20 20 20 77 72 69 |nEnd = q;. wri| 000001a0 74 65 73 28 22 50 72 6f 67 72 61 6d 20 63 6f 64 |tes("Program cod| 000001b0 65 22 29 0a 20 20 20 55 4e 54 49 4c 20 71 3e 3d |e"). UNTIL q>=| 000001c0 73 65 63 74 69 6f 6e 45 6e 64 20 26 20 21 71 3d |sectionEnd & !q=| 000001d0 45 6e 64 4d 61 72 6b 20 44 4f 0a 20 20 20 24 28 |EndMark DO. $(| 000001e0 20 54 45 53 54 20 71 3e 3d 73 65 63 74 69 6f 6e | TEST q>=section| 000001f0 45 6e 64 20 26 20 21 71 3d 53 65 63 74 69 6f 6e |End & !q=Section| 00000200 53 74 61 72 74 0a 09 20 54 48 45 4e 20 24 28 20 |Start.. THEN $( | 00000210 4c 45 54 20 6e 61 6d 65 20 3d 20 56 45 43 20 32 |LET name = VEC 2| 00000220 0a 09 09 20 41 4e 44 20 64 61 74 65 20 3d 20 56 |... AND date = V| 00000230 45 43 20 32 0a 09 09 20 41 4e 44 20 74 69 6d 65 |EC 2... AND time| 00000240 20 3d 20 56 45 43 20 32 0a 09 09 20 41 4e 44 20 | = VEC 2... AND | 00000250 75 6e 73 65 74 73 74 72 69 6e 67 20 3d 20 22 3c |unsetstring = "<| 00000260 75 6e 73 65 74 3e 22 3b 0a 09 09 20 4c 45 54 20 |unset>";... LET | 00000270 6e 61 6d 65 6c 20 3d 20 38 3b 0a 09 09 20 4c 45 |namel = 8;... LE| 00000280 54 20 76 65 72 73 69 6f 6e 57 6f 72 64 20 3d 20 |T versionWord = | 00000290 71 21 39 3b 0a 09 09 20 73 65 63 74 69 6f 6e 45 |q!9;... sectionE| 000002a0 6e 64 20 3a 3d 20 71 2b 5b 28 71 21 31 29 3e 3e |nd := q+[(q!1)>>| 000002b0 32 5d 3b 0a 09 09 20 46 4f 52 20 69 20 3d 20 30 |2];... FOR i = 0| 000002c0 20 54 4f 20 37 20 44 4f 0a 09 09 20 24 28 20 4c | TO 7 DO... $( L| 000002d0 45 54 20 63 20 3d 20 71 25 28 69 2b 38 29 3b 0a |ET c = q%(i+8);.| 000002e0 09 09 20 20 20 20 49 46 20 63 3d 30 20 26 20 6e |.. IF c=0 & n| 000002f0 61 6d 65 6c 3d 38 20 54 48 45 4e 20 24 28 20 6e |amel=8 THEN $( n| 00000300 61 6d 65 6c 20 3a 3d 20 69 3b 20 42 52 45 41 4b |amel := i; BREAK| 00000310 20 24 29 3b 0a 09 09 20 20 20 20 6e 61 6d 65 25 | $);... name%| 00000320 28 69 2b 31 29 20 3a 3d 20 63 0a 09 09 20 24 29 |(i+1) := c... $)| 00000330 3b 0a 09 09 20 6e 61 6d 65 25 30 20 3a 3d 20 6e |;... name%0 := n| 00000340 61 6d 65 6c 3b 0a 09 09 20 54 45 53 54 20 71 25 |amel;... TEST q%| 00000350 31 36 3d 27 3c 27 0a 09 09 20 20 20 20 54 48 45 |16='<'... THE| 00000360 4e 20 64 61 74 65 2c 20 74 69 6d 65 20 3a 3d 20 |N date, time := | 00000370 75 6e 73 65 74 73 74 72 69 6e 67 2c 20 75 6e 73 |unsetstring, uns| 00000380 65 74 73 74 72 69 6e 67 0a 09 09 20 20 20 20 45 |etstring... E| 00000390 4c 53 45 20 24 28 20 46 4f 52 20 69 20 3d 20 30 |LSE $( FOR i = 0| 000003a0 20 54 4f 20 38 20 44 4f 0a 09 09 09 20 20 20 20 | TO 8 DO.... | 000003b0 24 28 20 64 61 74 65 25 28 69 2b 31 29 20 3a 3d |$( date%(i+1) :=| 000003c0 20 71 25 28 69 2b 31 36 29 3b 0a 09 09 09 20 20 | q%(i+16);.... | 000003d0 20 20 20 20 20 74 69 6d 65 25 28 69 2b 31 29 20 | time%(i+1) | 000003e0 3a 3d 20 71 25 28 69 2b 32 36 29 0a 09 09 09 20 |:= q%(i+26).... | 000003f0 20 20 20 24 29 3b 0a 09 09 09 20 20 20 20 64 61 | $);.... da| 00000400 74 65 25 30 20 3a 3d 20 39 3b 0a 09 09 09 20 20 |te%0 := 9;.... | 00000410 20 20 74 69 6d 65 25 30 20 3a 3d 20 38 0a 09 09 | time%0 := 8...| 00000420 09 20 24 29 3b 0a 09 09 20 57 72 69 74 65 46 28 |. $);... WriteF(| 00000430 22 2a 6e 2a 6e 25 58 36 20 20 53 65 63 74 69 6f |"*n*n%X6 Sectio| 00000440 6e 20 25 73 22 2c 20 28 71 3c 3c 32 29 2d 6f 66 |n %s", (q<<2)-of| 00000450 66 73 65 74 2c 20 6e 61 6d 65 29 3b 0a 09 09 20 |fset, name);... | 00000460 49 46 20 71 21 31 31 3d 2d 31 20 26 20 71 25 34 |IF q!11=-1 & q%4| 00000470 38 3d 37 20 54 48 45 4e 0a 09 09 20 24 28 20 4c |8=7 THEN... $( L| 00000480 45 54 20 6c 6f 63 61 6c 20 3d 20 28 71 21 31 30 |ET local = (q!10| 00000490 29 2b 28 71 3c 3c 32 29 3b 0a 09 09 20 20 20 20 |)+(q<<2);... | 000004a0 49 46 20 56 43 41 52 20 6c 6f 63 61 6c 20 3d 20 |IF VCAR local = | 000004b0 56 65 72 73 69 6f 6e 4d 61 72 6b 20 54 48 45 4e |VersionMark THEN| 000004c0 0a 09 09 20 20 20 20 24 28 20 4c 45 54 20 6e 20 |... $( LET n | 000004d0 3d 20 56 43 41 52 28 6c 6f 63 61 6c 2b 34 29 3b |= VCAR(local+4);| 000004e0 0a 09 09 20 20 20 20 20 20 20 57 72 69 74 65 46 |... WriteF| 000004f0 28 22 20 20 76 65 72 73 69 6f 6e 20 25 6e 2e 25 |(" version %n.%| 00000500 6e 22 2c 20 6e 3e 3e 38 2c 20 6e 26 32 35 35 29 |n", n>>8, n&255)| 00000510 0a 09 09 20 20 20 20 24 29 0a 09 09 20 24 29 0a |... $)... $).| 00000520 09 09 20 57 72 69 74 65 46 28 22 2a 6e 20 20 20 |.. WriteF("*n | 00000530 20 63 6f 6d 70 69 6c 65 64 20 6f 6e 20 25 73 20 | compiled on %s | 00000540 61 74 20 25 73 22 2c 20 64 61 74 65 2c 20 74 69 |at %s", date, ti| 00000550 6d 65 29 3b 0a 09 09 20 49 46 20 76 65 72 73 69 |me);... IF versi| 00000560 6f 6e 57 6f 72 64 7e 3d 30 20 54 48 45 4e 0a 09 |onWord~=0 THEN..| 00000570 09 20 20 20 20 57 72 69 74 65 46 28 22 20 75 73 |. WriteF(" us| 00000580 69 6e 67 20 43 47 20 76 65 72 73 69 6f 6e 20 25 |ing CG version %| 00000590 6e 2e 25 6e 22 2c 0a 09 09 09 20 20 20 20 20 76 |n.%n",.... v| 000005a0 65 72 73 69 6f 6e 57 6f 72 64 3e 3e 32 34 2c 20 |ersionWord>>24, | 000005b0 28 76 65 72 73 69 6f 6e 57 6f 72 64 3e 3e 31 36 |(versionWord>>16| 000005c0 29 26 32 35 35 29 3b 0a 09 09 20 4e 65 77 4c 69 |)&255);... NewLi| 000005d0 6e 65 28 29 3b 0a 09 09 20 71 20 3a 3d 20 71 2b |ne();... q := q+| 000005e0 31 30 3b 0a 09 09 20 63 6f 6c 75 6d 6e 20 3a 3d |10;... column :=| 000005f0 20 30 0a 09 20 20 20 20 20 20 24 29 0a 0a 20 20 | 0.. $).. | 00000600 20 20 20 20 45 4c 53 45 20 54 45 53 54 20 21 71 | ELSE TEST !q| 00000610 3d 2d 31 20 26 20 71 25 34 3d 37 0a 09 20 54 48 |=-1 & q%4=7.. TH| 00000620 45 4e 20 24 28 20 4c 45 54 20 70 72 6f 63 53 74 |EN $( LET procSt| 00000630 61 72 74 20 3d 20 71 2b 33 3b 0a 09 09 20 49 46 |art = q+3;... IF| 00000640 20 5b 28 21 70 72 6f 63 73 74 61 72 74 29 3e 3e | [(!procstart)>>| 00000650 32 34 5d 3d 30 0a 09 09 20 20 20 20 54 48 45 4e |24]=0... THEN| 00000660 20 70 72 6f 63 53 74 61 72 74 20 3a 3d 20 70 72 | procStart := pr| 00000670 6f 63 53 74 61 72 74 2b 31 3b 0a 09 09 20 49 46 |ocStart+1;... IF| 00000680 20 63 6f 6c 75 6d 6e 3e 3d 6c 69 6e 65 6c 65 6e | column>=linelen| 00000690 67 74 68 2d 31 36 20 54 48 45 4e 0a 09 09 20 24 |gth-16 THEN... $| 000006a0 28 20 6e 65 77 6c 69 6e 65 28 29 0a 09 09 20 20 |( newline()... | 000006b0 20 20 63 6f 6c 75 6d 6e 20 3a 3d 20 30 0a 09 09 | column := 0...| 000006c0 20 24 29 3b 0a 09 09 20 77 72 69 74 65 66 28 22 | $);... writef("| 000006d0 20 20 25 78 36 3a 20 25 73 22 2c 20 28 70 72 6f | %x6: %s", (pro| 000006e0 63 53 74 61 72 74 3c 3c 32 29 2d 6f 66 66 73 65 |cStart<<2)-offse| 000006f0 74 2c 20 71 2b 31 29 3b 0a 09 09 20 63 6f 6c 75 |t, q+1);... colu| 00000700 6d 6e 20 3a 3d 20 63 6f 6c 75 6d 6e 2b 31 37 3b |mn := column+17;| 00000710 0a 09 09 20 71 20 3a 3d 20 70 72 6f 63 53 74 61 |... q := procSta| 00000720 72 74 0a 09 20 20 20 20 20 20 24 29 0a 09 20 45 |rt.. $).. E| 00000730 4c 53 45 20 71 20 3a 3d 20 71 2b 31 0a 20 20 20 |LSE q := q+1. | 00000740 24 29 0a 20 20 20 6e 65 77 6c 69 6e 65 28 29 0a |$). newline().| 00000750 24 29 0a 0a 41 4e 44 20 53 74 61 72 74 28 29 20 |$)..AND Start() | 00000760 42 45 0a 24 28 20 4c 45 54 20 61 72 67 76 20 3d |BE.$( LET argv =| 00000770 20 47 65 74 56 65 63 28 32 30 30 29 3b 0a 20 20 | GetVec(200);. | 00000780 20 4c 45 54 20 76 20 3d 20 47 65 74 56 65 63 28 | LET v = GetVec(| 00000790 4d 61 78 56 65 63 28 29 2d 32 30 30 29 3b 0a 20 |MaxVec()-200);. | 000007a0 20 20 4c 45 54 20 73 69 7a 65 20 3d 20 30 3b 0a | LET size = 0;.| 000007b0 0a 20 20 20 52 64 41 72 67 73 28 22 46 52 4f 4d |. RdArgs("FROM| 000007c0 2f 41 2c 54 4f 2f 4b 22 2c 20 61 72 67 76 2c 20 |/A,TO/K", argv, | 000007d0 32 30 30 29 3b 0a 20 20 20 49 46 20 61 72 67 76 |200);. IF argv| 000007e0 21 31 7e 3d 30 20 54 48 45 4e 20 53 65 6c 65 63 |!1~=0 THEN Selec| 000007f0 74 4f 75 74 70 75 74 28 46 69 6e 64 4f 75 74 70 |tOutput(FindOutp| 00000800 75 74 28 61 72 67 76 21 31 29 29 3b 0a 20 20 20 |ut(argv!1));. | 00000810 73 69 7a 65 20 3a 3d 20 4c 6f 61 64 28 61 72 67 |size := Load(arg| 00000820 76 21 30 2c 20 76 29 3b 0a 20 20 20 49 46 20 73 |v!0, v);. IF s| 00000830 69 7a 65 3c 30 20 54 48 45 4e 0a 20 20 20 24 28 |ize<0 THEN. $(| 00000840 20 57 72 69 74 65 46 28 22 43 61 6e 6e 6f 74 20 | WriteF("Cannot | 00000850 61 63 63 65 73 73 20 25 73 2a 6e 22 2c 20 61 72 |access %s*n", ar| 00000860 67 76 21 30 29 3b 0a 20 20 20 20 20 20 53 74 6f |gv!0);. Sto| 00000870 70 28 31 29 0a 20 20 20 24 29 3b 0a 0a 20 20 20 |p(1). $);.. | 00000880 76 21 28 73 69 7a 65 2f 34 29 20 3a 3d 20 45 6e |v!(size/4) := En| 00000890 64 4d 61 72 6b 3b 0a 20 20 20 44 65 73 63 72 69 |dMark;. Descri| 000008a0 62 65 43 6f 64 65 28 76 2c 20 28 76 3c 3c 32 29 |beCode(v, (v<<2)| 000008b0 2d 6c 6f 61 64 41 64 64 72 65 73 73 29 0a 24 29 |-loadAddress).$)| 000008c0 0a 0a 41 4e 44 20 6c 6f 61 64 28 6e 61 6d 65 2c |..AND load(name,| 000008d0 20 62 75 66 66 65 72 29 20 3d 20 56 41 4c 4f 46 | buffer) = VALOF| 000008e0 0a 24 28 20 4c 45 54 20 70 61 72 61 6d 42 6c 6f |.$( LET paramBlo| 000008f0 63 6b 20 3d 20 56 45 43 20 33 3b 0a 20 20 20 70 |ck = VEC 3;. p| 00000900 61 72 61 6d 62 6c 6f 63 6b 21 30 20 3a 3d 20 62 |aramblock!0 := b| 00000910 75 66 66 65 72 2a 62 79 74 65 73 70 65 72 77 6f |uffer*bytesperwo| 00000920 72 64 0a 20 20 20 70 61 72 61 6d 62 6c 6f 63 6b |rd. paramblock| 00000930 21 31 20 3a 3d 20 30 0a 20 20 20 6f 73 66 69 6c |!1 := 0. osfil| 00000940 65 28 23 78 46 46 2c 20 6e 61 6d 65 2c 20 70 61 |e(#xFF, name, pa| 00000950 72 61 6d 62 6c 6f 63 6b 29 0a 20 20 20 6c 6f 61 |ramblock). loa| 00000960 64 41 64 64 72 65 73 73 20 3a 3d 20 70 61 72 61 |dAddress := para| 00000970 6d 42 6c 6f 63 6b 21 30 3b 0a 20 20 20 54 45 53 |mBlock!0;. TES| 00000980 54 20 7e 72 65 73 75 6c 74 32 0a 20 20 20 20 20 |T ~result2. | 00000990 20 54 48 45 4e 20 52 45 53 55 4c 54 49 53 20 70 | THEN RESULTIS p| 000009a0 61 72 61 6d 62 6c 6f 63 6b 21 32 0a 20 20 20 20 |aramblock!2. | 000009b0 20 20 45 4c 53 45 20 52 45 53 55 4c 54 49 53 20 | ELSE RESULTIS | 000009c0 2d 31 0a 24 29 0a 0a 0a |-1.$)...| 000009c8