%include "inc:util.imp"
%begin; !TRY: Load Software front panel and trial (CS3) operating system

%externalroutinespec connectfile(%string(255)f,%integer m,%integername s,l)
%string(255)panel="fmac:sfp",file=""
%integer sfps,sfpl,syss,sysl,p
%recordformat hf(%short magic,spare1,export,import,%integer code,
                 %short reset,main,%integer static,stack,spare2,spare3)
%recordformat ef(%short flags,ptype,%integer type,disp,%string(255)s)
%record(hf)%name h
%record(ef)%name e

  %routine copy(%integer from,to,size)
    *move.l d0,a0
    *move.l d1,a1
    *subq.l #1,d2
    *swap d2
a:  *swap d2
b:  *move.b (a0)+,(a1)+
    *dbra d2,b
    *swap d2
    *dbra d2,a
!   %cycle
!     integer(to) = integer(from)
!     to = to+4; from = from+4; size = size-4
!   %repeatuntil size<=0
  %end

  %routine catcher
    *move.w #16_700,(sp)
    *addq.l #4,2(sp)
    *rte
  %end

  defineparam("Program",file,pamnodefault)
  defineparam("SFP",panel,0)
  processparameters(cliparam)
  connectfile(file.".mob",0,syss,sysl)
  h == record(syss)
  %if h_magic&65535#16_fe02 %start
    printstring(file.".mob is not a V2 object file"); newline; %stop
  %finish
  %if h_import#0 %start
    p = syss+sizeof(h)+h_export
    printstring(file." has external references:"); newline
    %cycle
      e == record(p); p = p+sizeof(e)-256
      %exitif e_flags=0
      printstring(e_s); newline
      p = (p+length(e_s)+2)&\1
    %repeat
    %stop
  %finish
  connectfile(panel.".mob",0,sfps,sfpl)
!write(sysl,0); space; write(sfpl,0); newline

!* Interrupts off etc

@16_400100 %byte ptm1
@16_400102 %byte ptm2
  ptm2 = 1; ptm1 = 1;        !Clock off

@16_4000c1 %byte vdus
  vdus = 3;                  !Acia ints off

@16_7fffc %byte eths
%integer zero=0
  eths = zero;               !Ether ints off

  *lea catcher,a0;           !Acquire privilege
  *move.l a0,16_1020
  *mtsr #16_700;             !and raise IPL to 7.

  copy(sfps,16_1000,sfpl)
  copy(syss,16_800000,sysl)

  *stop #0;                  !Invoke loaded SFP
%endofprogram
