home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / draco / draco-1.ark / NDUMP.DRC < prev    next >
Text File  |  1986-11-12  |  4KB  |  147 lines

  1. #util.g
  2.  
  3. word
  4.     ASMMAGIC = 0x4689,
  5.     DRACOMAGIC = 0x4688,
  6.  
  7.     SYMSIZE = 100;        /* size of symbol buffer */
  8.  
  9. channel input binary CodeFile;    /* input code file */
  10. channel output text DumpFile;    /* output dump file */
  11. file() CodeFyle, DumpFyle;
  12.  
  13. [SYMSIZE] char SymbolBuffer;    /* buffer for one symbol */
  14.  
  15. proc nonrec getByte()byte:
  16.     byte b;
  17.  
  18.     if not read(CodeFile; b) then
  19.     writeln(CodeFile, ": unexpected end-of-file");
  20.     exit(1);
  21.     fi;
  22.     b
  23. corp;
  24.  
  25. proc nonrec getWord()word:
  26.     word high, low;
  27.  
  28.     low := getByte();
  29.     high := getByte();
  30.     (high << 8) | low
  31. corp;
  32.  
  33. proc nonrec getSymbol()void:
  34.     *char symPtr;
  35.     char c;
  36.  
  37.     symPtr := &SymbolBuffer[0];
  38.     while
  39.         c := getByte() + '\e';
  40.         symPtr* := c;
  41.         c ~= '\e'
  42.     do
  43.         symPtr := symPtr + 1;
  44.     od;
  45. corp;
  46.  
  47. proc nonrec getReloc()void:
  48.     word count;
  49.  
  50.     count := getWord();
  51.     while count ~= 0 do
  52.         count := count - 1;
  53.     writeln(DumpFile; getWord() : x : -4, ' ', getWord() : x : -4);
  54.     od;
  55. corp;
  56.  
  57. proc nonrec process()void:
  58.     word wordVal, pos;
  59.  
  60.     wordVal := getWord();
  61.     if wordVal ~= ASMMAGIC and wordVal ~= DRACOMAGIC then
  62.     writeln("File ", CodeFile, " invalid magic number: ",
  63.         wordVal : x : - 4);
  64.         exit(1);
  65.     fi;
  66.     writeln(DumpFile; "Size of globals is ", getWord());
  67.     writeln(DumpFile; "Size of file statics is ", getWord());
  68.     while
  69.         getSymbol();
  70.         SymbolBuffer[0] ~= '\e'
  71.     do
  72.     writeln(DumpFile; "proc ", &SymbolBuffer[0], ':');
  73.     writeln(DumpFile; "Size of locals is ", getWord());
  74.         wordVal := getWord();
  75.     write(DumpFile; "Size of code is ", wordVal, ", the code is:");
  76.         pos := 0;
  77.         while pos ~= wordVal do
  78.             if pos & (16 - 1) = 0 then
  79.         writeln(DumpFile;);
  80.         write(DumpFile; pos : x : -4, ": ");
  81.             fi;
  82.         write(DumpFile; getByte() : x : -2, ' ');
  83.             pos := pos + 1;
  84.         od;
  85.     writeln(DumpFile;);
  86.     writeln(DumpFile; "Globals relocation data:");
  87.         getReloc();
  88.         writeln(DumpFile; "File statics relocation data:");
  89.         getReloc();
  90.         writeln(DumpFile; "Local statics relocation data:");
  91.         getReloc();
  92.         writeln(DumpFile; "Program relocation data:");
  93.         getReloc();
  94.         while
  95.             getSymbol();
  96.             SymbolBuffer[0] ~= '\e'
  97.         do
  98.         writeln(DumpFile; &SymbolBuffer[0],
  99.                   " reference chain head is at ",
  100.                   getWord() : x : -4);
  101.         od;
  102.     od;
  103. corp;
  104.  
  105. proc nonrec main()void:
  106.     *char parPtr;
  107.     FILENAME fn;
  108.     [15] char nameBuffer;
  109.  
  110.     parPtr := GetPar();
  111.     if parPtr = nil then
  112.         writeln("Use is: dump f1[.rel] ... fn[.rel]");
  113.         exit(1);
  114.     fi;
  115.     while parPtr ~= nil do
  116.     SetFileName(fn, parPtr);
  117.     fn.fn_type[0] := 'R';
  118.     fn.fn_type[1] := 'E';
  119.     fn.fn_type[2] := 'L';
  120.     GetFileName(fn, &nameBuffer[0]);
  121.         if not open(CodeFile, CodeFyle, &nameBuffer[0]) then
  122.             writeln(&nameBuffer[0], ": cannot open");
  123.             exit(1);
  124.         fi;
  125.     fn.fn_type[0] := 'D';
  126.     fn.fn_type[1] := 'M';
  127.     fn.fn_type[2] := 'P';
  128.     GetFileName(fn, &nameBuffer[0]);
  129.     pretend(FileDestroy(fn), void);
  130.     if not FileCreate(fn) then
  131.         writeln(&nameBuffer[0], ": cannot create");
  132.         exit(1);
  133.     fi;
  134.     if not open(DumpFile, DumpFyle, &nameBuffer[0]) then
  135.         writeln(&nameBuffer[0], ": cannot open");
  136.         exit(1);
  137.     fi;
  138.     writeln(CodeFile, ':');
  139.         process();
  140.     if not close(DumpFile) then
  141.         writeln(DumpFile, ": error on close");
  142.         exit(1);
  143.     fi;
  144.     parPtr := GetPar();
  145.     od;
  146. corp;
  147.