;---------------------------------------------------------------------------
;    :Program.    Sleeper.asm
;    :Author.     Christoph Dworzak
;    :Address.    creaholic sa ; Molzgasse 10 ; 2502 BIEL ; Switzerland
;    :Phone.      [(++41|0)32] 50 19 11
;    :BBS/Fax.    [(++41|0)32] 50 19 15
;    :BBS/ISDN.   [(++41|0)32] 50 19 19
;    :Shortcut.   [CHD]
;    :Version.    2.0
;    :Date.       18.August 1994
;    :Copyright.  by Ch.Dworzak
;    :Language.   68000 Assembler
;    :Translator. a68k
;    :Contents.   patch BeginIO of scsi.device to stop HD
;    :Remark.     I am a member of:  FAB (First Amigaholics Biel)
;    :Remark.     AUGS (Amiga User Group Switzerland)
;    :Remark.     UseNet: dworz@amazing.link-ch1.ch
;    :Remark.     SwissAmiNet: 44:8010/409.0
;    :Remark.     AmigaNet: 39:110/409.0
;---------------------------------------------------------------------------




FindTask                EQU  -294
Signal                  EQU  -324
ReleaseSemaphore        EQU  -570
ObtainSemaphoreShared   EQU  -678
Wait                    EQU  -318


        XDEF MyBeginIO;
        XDEF MyColdReboot;
        XDEF MyResetHandler;
        XDEF oBeginIO;
        XDEF oColdReboot;
        XDEF MyTask;
        XDEF InColdReboot;
        XDEF InResetHandler;
        XDEF semaphore;
        XDEF ExecBase;
        XDEF unit;
        XDEF watchdog;

        section "bss_Sleeper",bss

oBeginIO:       dc.l    0
oColdReboot:    dc.l    0
MyTask:         dc.l    0
ExecBase:       dc.l    0
InColdReboot:   dc.l    0
InResetHandler: dc.l    0
semaphore:
s0:             dc.l    0
s1:             dc.l    0
s2:             dc.l    0
s3:             dc.l    0
s4:             dc.l    0
s5:             dc.l    0
s6:             dc.l    0
s7:             dc.l    0
unit:
u0:             dc.l    0
u1:             dc.l    0
u2:             dc.l    0
u3:             dc.l    0
u4:             dc.l    0
u5:             dc.l    0
u6:             dc.l    0
u7:             dc.l    0
watchdog:
w0:             dc.l    0
w1:             dc.l    0
w2:             dc.l    0
w3:             dc.l    0
w4:             dc.l    0
w5:             dc.l    0
w6:             dc.l    0
w7:             dc.l    0


        section "asm_Sleeper",code

MyResetHandler:
        move.l  #-1,InResetHandler
        rts



MyColdReboot:
        move.l  #-1,InColdReboot
        move.l  ExecBase,a6
        moveq   #0,d0
        jsr     Wait(a6)                        ; Wait forever...
        rts



MyBeginIO:
        movem.L D0-D7/A0-A6,-(A7)
        move.l  a1,a2
        move.l  ExecBase,a6
        suba.l  a1,a1
        jsr     FindTask(a6)
        cmp.l   MyTask,d0
        beq     ok
sync:
        move.l  24(a2),d1                       ; Unit from IOStdReq

        cmp.l   u0,d1
        beq     u0ok
        cmp.l   u1,d1
        beq     u1ok
        cmp.l   u2,d1
        beq     u2ok
        cmp.l   u3,d1
        beq     u3ok
        cmp.l   u4,d1
        beq     u4ok
        cmp.l   u5,d1
        beq     u5ok
        cmp.l   u6,d1
        beq     u6ok
        cmp.l   u7,d1
        beq     u7ok
ok:
        movem.L (A7)+,D0-D7/A0-a6
        movea.l oBeginIO,a0
        jmp     (a0)


u0ok:
        clr.l   w0

        move.l  s0,a0
        jsr     ObtainSemaphoreShared(a6)

        movem.L (A7)+,D0-D7/A0-a6

        movea.l oBeginIO,a0
        jsr     (a0)

        move.l  a6,-(sp)
        move.l  ExecBase,a6
        move.l  s0,a0
        jsr     ReleaseSemaphore(a6)
        move.l  (sp)+,a6

        rts
u1ok:
        clr.l   w1

        move.l  s1,a0
        jsr     ObtainSemaphoreShared(a6)

        movem.L (A7)+,D0-D7/A0-a6

        movea.l oBeginIO,a0
        jsr     (a0)

        move.l  a6,-(sp)
        move.l  ExecBase,a6
        move.l  s1,a0
        jsr     ReleaseSemaphore(a6)
        move.l  (sp)+,a6

        rts
u2ok:
        clr.l   w2

        move.l  s2,a0
        jsr     ObtainSemaphoreShared(a6)

        movem.L (A7)+,D0-D7/A0-a6

        movea.l oBeginIO,a0
        jsr     (a0)

        move.l  a6,-(sp)
        move.l  ExecBase,a6
        move.l  s2,a0
        jsr     ReleaseSemaphore(a6)
        move.l  (sp)+,a6

        rts
u3ok:
        clr.l   w3

        move.l  s3,a0
        jsr     ObtainSemaphoreShared(a6)

        movem.L (A7)+,D0-D7/A0-a6

        movea.l oBeginIO,a0
        jsr     (a0)

        move.l  a6,-(sp)
        move.l  ExecBase,a6
        move.l  s3,a0
        jsr     ReleaseSemaphore(a6)
        move.l  (sp)+,a6

        rts
u4ok:
        clr.l   w4

        move.l  s4,a0
        jsr     ObtainSemaphoreShared(a6)

        movem.L (A7)+,D0-D7/A0-a6

        movea.l oBeginIO,a0
        jsr     (a0)

        move.l  a6,-(sp)
        move.l  ExecBase,a6
        move.l  s4,a0
        jsr     ReleaseSemaphore(a6)
        move.l  (sp)+,a6

        rts
u5ok:
        clr.l   w5

        move.l  s5,a0
        jsr     ObtainSemaphoreShared(a6)

        movem.L (A7)+,D0-D7/A0-a6

        movea.l oBeginIO,a0
        jsr     (a0)

        move.l  a6,-(sp)
        move.l  ExecBase,a6
        move.l  s5,a0
        jsr     ReleaseSemaphore(a6)
        move.l  (sp)+,a6

        rts
u6ok:
        clr.l   w6

        move.l  s6,a0
        jsr     ObtainSemaphoreShared(a6)

        movem.L (A7)+,D0-D7/A0-a6

        movea.l oBeginIO,a0
        jsr     (a0)

        move.l  a6,-(sp)
        move.l  ExecBase,a6
        move.l  s6,a0
        jsr     ReleaseSemaphore(a6)
        move.l  (sp)+,a6

        rts
u7ok:
        clr.l   w7

        move.l  s7,a0
        jsr     ObtainSemaphoreShared(a6)

        movem.L (A7)+,D0-D7/A0-a6

        movea.l oBeginIO,a0
        jsr     (a0)

        move.l  a6,-(sp)
        move.l  ExecBase,a6
        move.l  s7,a0
        jsr     ReleaseSemaphore(a6)
        move.l  (sp)+,a6

        rts


        END
