
;FEXEC2.ASM
;

;  Again, this code originated from Manx, but has been heavily re-written
;

      xdef  _doexec
      xref  _LVOFreeMem
      xref  _SysRegs
      xref  _SysBase

;
;doexec(len, arg, (seg+1)<<2, stk)
;       D0    A0    A4        A7
;

_doexec:
   move.l   sp,savefp            ;save Frame Pointer
   movem.l  d2-d7/a2-a6,-(sp)    ;save Registers
   move.l   sp,savsp             ;save current SP
   movem.l  _SysRegs,D0-D7/A0-A6 ;Get System Startup Registers (BCPL stuff)
   move.l   savefp,A0            ;A0 = frame pointer
   movem.l  4(A0),d0/a0/a4/a7    ;load parameters, including new SP
   move.l   d0,12(a1)            ;set length
   move.l   a0,d1                ;copy to dreg
   lsr.l    #2,d1                ;convert to BPTR
   move.l   d1,8(a1)             ;set ptr
   jsr      (a4)                 ;call new program
   movem.l  (sp)+,d2/d3          ;get stk siz and old sp
   move.l   sp,a1                ;save current sp
   move.l   savsp,sp             ;get back our sp
   move.l   d0,-(sp)             ;save return code so we don't loose it
   sub.l    d2,a1                ;Backup from end of stack to start
   sub.l    #8,a1                ;point over header placed on stack
   move.l   (a1),d0              ;get size to free
   move.l   _SysBase,a6          ;get ExecBase
   jsr      _LVOFreeMem(a6)      ;Free memory allocated for stack
   move.l   (sp)+,d0             ;D0 = return code
   movem.l  (sp)+,D2-D7/A2-A6    ;restore Registers
   rts

savsp:   dc.l   0
savefp:  dc.l   0


