;------------------------------------------------------------------------------
;
;   Detach
;
;------------------------------------------------------------------------------


sysbase        equ     4
FindName   equ   -276
WaitPort   equ   -384
DupLock    equ    -96
Delay      equ   -198
UnLock     equ    -90
UnLoadSeg  equ   -156
Open       equ    -30
Close      equ    -36

Forbid     equ   -132
CreateProc equ   -138
Permit     equ   -138
GetMsg     equ   -372
ReplyMsg   equ   -378
OpenLibrary  equ  -552
CloseLibrary equ  -414


Me         EQUR A4
thisTask   EQU 276
cli        EQU 172
cis        EQU 156
cos        EQU 160

            section "Startup",code

start
            move.l  $4,A6
            move.l  276(A6),Me    ; Exec.thisTask
            tst.l   cli(Me)       ; pr_CLI
            bne.s   fromdos
            jmp     mainwb

fromdos:
            move.l  D0,arglen;
            lea     args,A1;
            and.w   #$FF,D0
doubargs:   move.b  (A0)+,(A1)+
            dbra    D0,doubargs

            lea     dosname(PC),a1
            move.l  #33,D0
            jsr     OpenLibrary(A6)
            move.l  d0,dosbase;


            lea     start-4(PC),A1;start = effektiver Prg-Anf.
            move.l  (A1),mySeg
            move.l  (A1),CLI+60
            clr.l   (a1)

            move.l  4,a0
            move.l  276(a0),a0     ;ThisTask
            move.l  152(a0),d1     ;pr_currentDir
            move.l  dosbase,A6;
            jsr     DupLock(A6);
            move.l  d0,curDir
            bne.s   \lockok
            moveq   #20,d0;
            rts;

\lockok:

            move.l  $4,A6;
            jsr     Forbid(A6);
            move.l  #newname,d1      ;newname
            clr.l   d2               ;
            move.b  9(Me),d2         ;Me.task.node.pri
            move.l  #mainprg,d3      ;woher?
            subq    #4,d3
            lsr.l   #2,d3            ;BPTR *seglist
            move.l  132(Me),d4       ;Me.stackSize
            move.l  dosbase,A6;
            jsr     CreateProc(A6)
            sub.l   #92,D0
            move.l  d0,a0
            move.l  curDir,152(a0)
            lea.l   CLI,a1;
            move.l  a1,d0
            lsr.l   #2,d0;
            move.l  d0,cli(A0);
            subq.l  #1,d0;
            move.l  d0,4(a1);
            move.l  d0,16(a1);
            move.l  d0,24(a1);
            move.l  d0,36(a1);
            move.l  $4,A6;
            jsr     Permit(A6);

            moveq   #0,d0
            rts

dosname     dc.b    'dos.library',0

            EVEN

            section "Main",code

mainprg:
            move.l  dosbase,A6;
            move.l  #nilname,D1;
            move.l  #1005,D2;
            jsr     Open(A6);
            move.l  d0,in
            beq.s   quit;
            move.l  #nilname,D1;
            move.l  #1006,D2;
            jsr     Open(A6);
            move.l  d0,out;
            beq.s   quit
            move.l  $4,Me;
            move.l  thisTask(Me),Me;
            move.l  in,cis(Me);
            move.l  out,cos(Me)
            lea.l   CLI,A1;
            move.l  curDir,8(A1)
            move.l  in,28(A1);
            move.l  in,32(A1);
            move.l  out,48(A1);
            move.l  out,56(A1);
            move.l  arglen,D0;
            lea.l   args,A0;

mainwb:     jsr     Program
            move.l  8+CLI,curDir

quit:       move.l  D0,D3
            move.l  curDir,D1;
            beq.s   \nolock
            move.l  dosbase,A6;
            jsr     UnLock(A6);
            move.l  $4,A6;
            jsr     Forbid(A6);
            move.l  dosbase,A6;
            move.l  mySeg,D1;
            jsr     UnLoadSeg(A6);
            move.l  in,D1
            beq.s   \a
            jsr     Close(A6)
\a:         move.l  out,D1
            beq.s   \b
            jsr     Close(A6)
\b:         move.l  A6,A1
            move.l  $4,A6;
            jsr     CloseLibrary(A6);
\nolock:    move.l  D3,D0
            rts

newname     dc.b    'Detached',0
            even
nilname     dc.b    'NIL:',0

            section "DetachVars",bss

dosbase     dc.l    0
curDir      dc.l    0
mySeg       dc.l    0
in          dc.l    0
out         dc.l    0
args        ds.b    256
arglen      dc.l    0
dummystr    dc.b    1,'?',0,0
CLI         ds.l    16;


;------------------------------------------------------------------------------
;
;  Hier beginnt unabhängiges Programm:
;
;------------------------------------------------------------------------------


            section "Program",code

Program:    move    D0,D3
            move.l  $4,A6
            move.l  thisTask(A6),Me
            tst.l   cli(Me);
            bne.s   \scli
            lea.l   $5c(Me),A0;
            jsr     WaitPort(A6);
            lea.l   $5c(Me),A0;
            jsr     GetMsg(A6);
            move.l  D0,wbmsg;
\scli:
            lea     doslib(PC),a1
            move.l  #33,D0
            jsr     OpenLibrary(A6)
            move.l  d0,dos;
            beq.s   nodos;

            cmp     #1,D3;
            bhi.s   loop
            move    #100,D3
loop:       bchg.b  #1,$bfe001;
            moveq   #1,D1
            move.l  dos,A6;
            jsr     Delay(A6);
            dbf     D3,loop
            move.l  $4,A6;
            move.l  dos,A1;
            jsr     CloseLibrary(A6);
nodos:      tst.l   cli(Me);
            bne.s   \scli
            jsr     Forbid(A6);
            move.l  wbmsg(PC),A1;
            jsr     ReplyMsg(A6);
\scli:      moveq   #0,D0;
            rts

wbmsg:      dc.l    0;
dos:        dc.l    0;
doslib:     dc.b    "dos.library",0

            end

