START   movem.l d0/a0,-(a7)     ;save initial values
        movea.l $4.w,a6
        suba.l  a1,a1
        jsr     (-294,a6)               ; FindTask()
        move.l  d0,a4
        tst.l   (172,a4)                ; process.cli
        beq.s   workbench
        movem.l (a7)+,d0/a0     ;restore regs
        bra.s   cli             ;and run the user prog
workbench       lea     (92,a4),a0      ; process.msgport
        jsr     (-384,a6)               ;wait for a message (WaitPort(())
        lea     (92,a4),a0      ; process.msgport
        jsr     (-372,a6)               ;then get it (GetMsg())
        move.l  d0,_wbmessage           ;save it for later reply
        movem.l (a7)+,d0/a0     ;restore
cli     bsr.s   _START          ;call our program
        move.l  d0,-(a7)                ;save it
        tst.l   _wbmessage
        beq.s   exittodos               ;if I was a CLI
        jsr     (-132,a6)               ; Forbid()
        move.l  (_wbmessage,pc),a1
        jsr     (-138,a6)               ; Permit()
exittodos       move.l  (a7)+,d0                ;exit code
        rts

_START  move.l  a0,_arg
        clr.b   (-1,a0,d0.w)

        movea.l $4.w,a6
        lea     (DOSName,pc),a1
        moveq   #39,d0
        jsr     (-552,a6)               ; OpenLibrary()
        move.l  d0,_DOSBase
        beq.s   .FINISH

        movea.l d0,a6
        jsr     (-60,a6)                ; Output()
        move.l  d0,_stdout
        jsr     (-54,a6)                ; Input()
        move.l  d0,_stdin

        movea.l $4.w,a6
        lea     (IntName,pc),a1
        moveq   #39,d0
        jsr     (-552,a6)               ; OpenLibrary()
        move.l  d0,_IntuitionBase
        beq.s   .CLOSEDOS

        movea.l $4.w,a6
        lea     (GfxName,pc),a1
        moveq   #39,d0
        jsr     (-552,a6)               ; OpenLibrary()
        move.l  d0,_GfxBase
        beq.s   .CLOSEINT

        movea.l $4.w,a6
        lea     (MUIName,pc),a1
        moveq   #19,d0
        jsr     (-552,a6)
        move.l  d0,_MUIMasterBase
        beq.s   .CLOSEGFX

        movea.l $4.w,a6
        lea     (LocName,pc),a1
        moveq   #38,d0
        jsr     (-552,a6)
        move.l  d0,_LocaleBase
        beq.s   .CLOSEMUI

        movea.l $4.w,a6
        lea     (AslName,pc),a1
        moveq   #39,d0
        jsr     (-552,a6)
        move.l  d0,_ASLBase
        beq.s   .CLOSELOC

        xref    _main
        jsr     _main           ; a6 is stored
        move.l  d0,d2

        movea.l _ASLBase,a1
        jsr     (-414,a6)
.CLOSELOC
        movea.l _LocaleBase,a1
        jsr     (-414,a6)
.CLOSEMUI
        movea.l _MUIMasterBase,a1
        jsr     (-414,a6)               ; CloseLibrary()
.CLOSEGFX
        movea.l _GfxBase,a1
        jsr     (-414,a6)               ; CloseLibrary()
.CLOSEINT
        movea.l _IntuitionBase,a1
        jsr     (-414,a6)               ; CloseLibrary()
.CLOSEDOS
        movea.l _DOSBase,a1
        jsr     (-414,a6)               ; CloseLibrary()
.FINISH move.l  d2,d0
        rts
****************************************
        xdef    _DOSBase
        xdef    _IntuitionBase
        xdef    _GfxBase
        xdef    _MUIMasterBase
        xdef    _LocaleBase
        xdef    _ASLBase
        xdef    _arg
        xdef    _stdout
        xdef    _stdin
        xdef    _wbmessage
****************************************
_DOSBase        dc.l    0
_IntuitionBase  dc.l    0
_GfxBase        dc.l    0
_MUIMasterBase  dc.l    0
_LocaleBase     dc.l    0
_ASLBase        dc.l    0
_arg            dc.l    0
_stdout         dc.l    0
_stdin          dc.l    0
_wbmessage      dc.l    0
****************************************
DOSName dc.b    'dos.library',0
IntName dc.b    'intuition.library',0
GfxName dc.b    'graphics.library',0
MUIName dc.b    'muimaster.library',0
LocName dc.b    'locale.library',0
AslName dc.b    'asl.library',0
