; Stoppa motorn på hårddisken när den inte används.
;
; $Id: noisesaver.asm,v 1.2 1994/01/15 15:31:10 mh Exp $
;
; $Log: noisesaver.asm,v $
; Revision 1.2  1994/01/15  15:31:10  mh
; multiple units
;
; Revision 1.1  1993/10/11  01:38:46  mh
; Initial revision
;

; BeginIO() patch for NoiseSaver

; offsets

FindTask		EQU -294
Signal			EQU -324
ObtainSemaphoreShared	EQU -678
ReleaseSemaphore	EQU -570
CtrlF			EQU $8000

; export

	XDEF MyProc;
	XDEF OrigProc;
	XDEF MyTask;
	XDEF Semaphore;
	XDEF ExecBase;

        section "bss_NoiseSaver",bss

; Read-Only vars (set by Oberon-process)
OrigProc: 	dc.l	0
MyTask:		dc.l	0
Semaphore:	dc.l	0
ExecBase:	dc.l	0

	section "asm_NoiseSaver",code

MyProc:
	movem.l	a1/a6,-(sp)
	move.l  ExecBase,a6
	suba.l	a1,a1
	jsr     FindTask(a6)
	cmp.l   MyTask,d0
	bne	sync				; own task?
	movem.l	(sp)+,a1/a6                     ; -> do nothing
	movea.l	OrigProc,a0
	jmp	(a0)
sync:	move.l	MyTask,a1			; other task
	move.l	#CtrlF,d0
	jsr	Signal(a6)			; -> notify own task
	move.l  Semaphore,a0
	jsr     ObtainSemaphoreShared(a6)	;    and get semaphore
	movem.l	(sp)+,a1/a6
	movea.l	OrigProc,a0
	jsr	(a0)
	move.l	a6,-(sp)
	move.l	ExecBase,a6
	move.l  Semaphore,a0
	jsr	ReleaseSemaphore(a6)
	move.l	(sp)+,a6
	rts

	END
