%begin; !FROMBIN: Convert binary file to Motorola object

%include "inc:util.imp"

%owninteger loc=0

%routine dump(%integer byte)
%constinteger max=16
%ownintegerarray buf(1:max)
%owninteger open=0,nextloc,p,checksum

  %routine put(%integer byte)
    phex2(byte)
    checksum=checksum+byte
  %end

  %routine flush
  %integer i
    printstring("S1"); checksum=0
    put(p+3); put((nextloc-p)>>8); put((nextloc-p)&255)
    put(buf(i)) %for i=1,1,p
    phex2(\checksum)
    newline
    p=0
  %end

  %if open=0 %start
    open=1
    printstring("S00600004844521B"); newline
    nextloc=loc; p=0
  %finish

  %if byte<0 %start; ! Closing
    flush %unless p=0
    printstring("S9030000FC"); newline
    %return
  %finish

  flush %if p=max %or nextloc#loc
  loc=loc+1; nextloc=loc
  p=p+1; buf(p)=byte
%end

%routine frombin
%integer sym
  %onevent 3,9 %start
    dump(-1)
    %stop
  %finish
  %cycle
    readsymbol(sym); dump(sym)
  %repeat
%end

%string(255)parm,in,out

  %onevent 3,4,9 %start
    selectoutput(0)
    printstring(event_message); newline
    %stop
  %finish

  parm = cliparam
  in = parm %and out = parm %unless parm -> in.("/").out
  selectinput(1); openinput(1,in)
  selectoutput(1); openoutput(1,out)
  frombin

%endofprogram
