%begin; !Analyse Imp object file (show external entries and references)
%include "inc:util.imp"
%recordformat headerf(%byte mark,version,%short checks,
                      %short exportsize,importsize,
                      %integer codesize,
                      %short reset,entry,
                      %integer ownsize,
                      %integer stacksize,
                      %integer spare1,spare2)
%recordformat extf(%short flags,parmtype,
                   %integer objtype,
                   %integer address,
                   %string(255) name)

%constbytearray code(0:3)='#','S','E','Y'

%record(headerf)%name header
%record(extf)%name e
%integer start,limit,p,q,n
%string(255)s

%routine ph(%integer value)
  %if value>>16 = 0 %then phex4(value) %else phex(value)
%end

%routine show(%integer value)
  ph(value)
  printsymbol('(');  write(value,0);  printsymbol(')')
%end

%routine SHOW CHECKS(%integer bits)
%integer PROBE=16_8000, I=1
%const%string TEXT = %c
"-ARR-LOOP-CAP-OVER-ASS-STRASS-SASS-BASS-LINE-DIAG-TRACE-STACK--VOL-"
  printstring(" Checks:              ")
  %if bits = 0 %start
    printstring("none")
  %else
    %cycle
      %cycle
        printsymbol(charno(text,i)) %if bits&probe # 0
        i = i+1
      %repeat %until charno(text,i) = '-'
      probe = probe>>1
    %repeat %until probe = 16_0002
  %finish
  newline
%end

  s = cliparam
  to upper(s)
  s = s.".MOB" %if substring(s,length(s)-3,length(s)) # ".MOB"
  connectfile(s,0,start,limit); limit = limit+start
  header == record(start)
  %if header_mark # 16_FE %start
    printstring("Not code file");  newline
    %stop
  %finish
  %if header_version # 16_02 %start
    printstring("Not V02 code file");  newline
  %finish
  printstring(" Code size:           ");  show(header_codesize)
  newline
  printstring(" Static requirement:  ");  show(header_ownsize)
  newline
  printstring(" Stack requirement:   "); show(header_stacksize)
  newline
  show checks(header_checks)
  printstring(" External entries:");  newline
  spaces(2);  ph(header_entry<<1);  printstring("  Main entry")
  spaces(13);  ph(header_reset<<1);  printstring("  Reset entry"); newline
  %if header_exportsize # 0 %start
    e == record(start+32)
    n = 0
    %while e_flags < 0 %cycle
      space;  space %if n = 0;  n = n+1
      ph(e_address)
      space
      printsymbol(code(e_flags>>12&3))
      space;  space
      printstring(e_name)
      %if n=2 %then newline %and n = 0 %else spaces(20-length(e_name))
      e == record(addr(e)+(length(e_name)+14)&(\1))
    %repeat
    newline %unless n=0
  %finish
  %if header_importsize # 0 %start
    printstring(" External references:");  newline
    n = 0
    e == record(start+32+header_exportsize)
    %while e_flags < 0 %cycle
      space;  space %if n = 0;  n = n+1
      ph(e_address)
      space
      printsymbol(code(e_flags>>12&3))
      space;  space
      printstring(e_name)
      %if n=2 %then newline %and n = 0 %else spaces(20-length(e_name))
      e == record(addr(e)+(length(e_name)+14)&(\1))
    %repeat
    newline %unless n=0
  %finish
%endofprogram
