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
$)


