	include exec/lists.i
	include exec/nodes.i
	include exec/tasks.i
	include exec/memory.i
	include dos/dosextens.i
	include graphics/clip.i
	include graphics/layers.i
	include graphics/rastport.i
	include intuition/screens.i

	include lvo/exec_lib.i
	include lvo/dos_lib.i
	include lvo/layers_lib.i
	include lvo/intuition_lib.i
	include lvo/graphics_lib.i	

	include "AsmRoutines.i"


;***************** MACROS ******************

IMPOSSIBLEPOSITION MACRO	
	bsr	BlinkerFehler
	ENDM
	
	XREF _MyConfig

	XREF _ScreenList
	XREF _ScreenListSemaphore
	XREF _DragSemaphore
	XREF _DummyHook
	XREF _SuperLayerHook
	XREF _IconLayerHook
	XREF _MagicMenuLayerHook
	
	XREF _IO_x1
	XREF _IO_y1
	XREF _IO_x2
	XREF _IO_y2
	XREF _IO_RP
	XREF _IO_Scr
	XREF _IO_ScreenEntry
	
	XREF _IO_EntryCounter
	XREF _OpaqueON
	XREF _CxInactive

	XREF _Old_UpfrontLayer
	XREF _Old_MoveLayerInFrontOf
	XREF _Old_CreateUpfrontHookLayer
	XREF _Old_CreateUpfrontLayer
	XREF _Old_OpenWorkBench
	XREF _Old_CloseWorkBench
	XREF _Old_OpenScreen
	XREF _Old_OpenScreenTagList
	XREF _Old_CloseScreen
	XREF _Old_OpenWindowTagList
	XREF _Old_OpenWindow
	XREF _Old_CloseWindow
	XREF _Old_ActivateWindow
	XREF _Old_ActivateGadget
	XREF _Old_WindowToBack
	XREF _Old_WindowToFront
	XREF _Old_FreeSysRequest
	XREF _Old_EasyRequestArgs
	XREF _Old_AutoRequest
	XREF _Old_SetWindowTitles
	XREF _Old_NewObjectA

	XREF _SysBase
	XREF _DosBase
	XREF _LayersBase
	XREF _GfxBase
	XREF _IntuitionBase
	

	XREF _MyImageClass
	XREF _MyButtonClass
	
	XREF _RemoveWindows
	XREF _MyInputHandler
	XREF _Before_OpenWindowTagList
	XREF _After_OpenWindowTagList
	
	XREF _strcmp				;/* Case-Sensitive */
	XREF _stricmp				;/* Case-Insensitive */

;====/ Dummy_HookFunc 
	XDEF	Dummy_HookFunc
	
Dummy_HookFunc:
	rts

	IMPOSSIBLEPOSITION


;====/ Dummy_ScreenChecker 

	XDEF	Dummy_ScreenChecker
	
Dummy_ScreenChecker:
	moveq		#1,d0
	rts
	
	IMPOSSIBLEPOSITION


;====/ Dummy_WindowChecker 

	XDEF	Dummy_WindowChecker
	
Dummy_WindowChecker:
	moveq		#1,d0
	rts

	IMPOSSIBLEPOSITION
		
;====/ FindScreen   a0 : LayerInfo  d0--> ScreenNode /==================

	XDEF FindScreen
	
FindScreen:
	movem.l	a0/a1,-(sp)
	lea		_ScreenList,a1
	move.l	LH_HEAD(a1),a1			;/* First Node */
.While:
	move.l	MLN_SUCC(a1),d0
	beq.s		.EndListe
	cmp.l		ScreenEntry_se_LayerInfo(a1),a0
	beq.s		.Found
	move.l	d0,a1
	bra.s		.While
	
.EndListe:
	moveq		#0,d0
	movem.l	(sp)+,a0/a1
	rts
	
	IMPOSSIBLEPOSITION
	
.Found:
	move.l	a1,d0
	movem.l	(sp)+,a0/a1
	rts
	
	IMPOSSIBLEPOSITION

;/*===========================/ P A T C H E S /===========================*/

	XDEF	New_UpfrontLayer
	XREF	_NEW_UpfrontLayer
	
New_UpfrontLayer:
	move.l	a1,-(sp)						;/* Layer */
	move.l	a0,-(sp)						;/* Dummy */
	jsr		_NEW_UpfrontLayer
	addq.l	#8,sp
	rts

	IMPOSSIBLEPOSITION
;/**/

	XDEF	JumpOld_UpfrontLayer

JumpOld_UpfrontLayer:
	move.l	a6,-(sp)
	move.l	_LayersBase,a6
	pea		.1
	move.l	_Old_UpfrontLayer,-(sp)
	rts
.1:
	move.l	(sp)+,a6
	rts

	IMPOSSIBLEPOSITION
;/**/

	XDEF	Jump_UpfrontLayer
	
Jump_UpfrontLayer:
	move.l	a6,-(sp)
	move.l	_LayersBase,a6
	jsr		_LVOUpfrontLayer(a6)
	move.l	(sp)+,a6
	rts

	IMPOSSIBLEPOSITION
;/* =================================================================== */

	XDEF	New_MoveLayerInFrontOf 
	
New_MoveLayerInFrontOf:
	cmp.l		#0,a1						;/* any Target-Layer?? */
	bne.s		.MustMove
.SoonExit:
	moveq		#0,d0
	rts
	
	IMPOSSIBLEPOSITION
	
.MustMove:
	cmp.l		#0,a0						;/* any Source-Layer?? */
	beq.s		.SoonExit
	
	move		lr_Flags(a0),d0
	and		#LAYERBACKDROP,d0
	bne.s		.Standard				;/* ignore Source-Layers that are BACKDROP */
	
	move.l	lr_LayerInfo(a1),d1

	movem.l	d1/a0/a1,-(sp)
	move.l	d1,a0
	jsr		_LVOLockLayerInfo(a6)
	movem.l	(sp)+,d1/a0/a1
	
	bra.s		.Weiter
	
.CheckNext:
	move.l	lr_Back(a1),a1				;/* does Target-Layer have a Back-Layer */
	cmp.l		#0,a1
	bne.s		.Weiter

	bsr.s		.UnlockLI
	moveq		#0,d0							;/* EXIT EXIT EXIT do nothing */
	rts
	
.Weiter:
	cmp.l		a0,a1							;/* are target and source identical? */
	beq.s		.CheckNext
	move.l	lr_BackFill(a1),d0
	cmp.l		#_SuperLayerHook,d0		;/* another Super-Layer ?? */
	beq.s		.CheckNext					;/* YES? --> next back-Layer */
	
	move.l	a2,-(sp)
	lea		_MyConfig,a2
	cmp		#ID_ALWAYSFRONT,c_IconDepth(a2)
	move.l	(sp)+,a2						;/* should not change SR !?!? */

	bne.s		.OK
	
	cmp.l		#_IconLayerHook,d0		;/* or is it a Icon-Window ?? */
	beq.s		.CheckNext					;/* YES? --> next back-Layer */
	

	;/* NO? --> let this be the new target-Layer! */
.OK:
	bsr.s		.UnlockLI
.Standard:
	move.l	_Old_MoveLayerInFrontOf,-(sp)
	rts
	
.UnlockLI:
	movem.l	a0/a1,-(sp)
	move.l	d1,a0
	jsr		_LVOUnlockLayerInfo(a6)
	movem.l	(sp)+,a0/a1
	rts
	
	IMPOSSIBLEPOSITION

		
	XDEF	Jump_MoveLayerInFrontOf
	
Jump_MoveLayerInFrontOf:
	move.l	a6,-(sp)
	move.l	_LayersBase,a6
	jsr		_LVOMoveLayerInFrontOf(a6)
	move.l	(sp)+,a6
	rts

	IMPOSSIBLEPOSITION


	XDEF	Jump_BehindLayer
	
Jump_BehindLayer:
	move.l	a6,-(sp)
	move.l	_LayersBase,a6
	jsr		_LVOBehindLayer(a6)
	move.l	(sp)+,a6
	rts
	
	IMPOSSIBLEPOSITION
		
	XDEF	New_CreateUpfrontLayer
	
New_CreateUpfrontLayer:
	move.l	a3,-(sp)
	move.l	#LAYERS_BACKFILL,a3
	bsr.s		New_CreateUpfrontHookLayer
	move.l	(sp)+,a3
	rts

	IMPOSSIBLEPOSITION
;/* =================================================================== */

	XDEF	New_CreateUpfrontHookLayer
	
New_CreateUpfrontHookLayer:
	btst		#6,d4								;/* LAYERBACKDROP = $40 in Flags */
	bne		.Standard
	
	cmp.l		#_SuperLayerHook,a3
	beq		.Standard

	movem.l	d0/a0/a6,-(sp)
	move.l	_SysBase,a6
	lea		_ScreenListSemaphore,a0
	jsr		_LVOObtainSemaphoreShared(a6)	;/* LOCK SHARED */

	movem.l	(sp),d0/a0/a6
	jsr		FindScreen

	move.l	d0,-(sp)
	move.l	_SysBase,a6
	lea		_ScreenListSemaphore,a0
	jsr		_LVOReleaseSemaphore(a6)		;/* UNLOCK */
	move.l	(sp)+,d0							;/* ReleaseSem. solle Register eigentlich retten! */

	tst.l		d0
	bne.s		.Weiter
	movem.l	(sp)+,d0/a0/a6
	bra		.Standard
	
.Weiter:
	move.l	a2,-(sp)
	lea		_MyConfig,a2
	tst		c_MagicMenu(a2)
	move.l	(sp)+,a2						;/* should not change SR */

	bne		.CheckMagicMenu
	
	movem.l	(sp)+,d0/a0/a6

.NoMagicMenu:
	move.l	a3,-(sp)								;/* Save Hook */
	lea		_DummyHook,a3
	jsr		_LVOCreateBehindHookLayer(a6)	;/* Behind-Layer machen ... */
	move.l	(sp)+,a3
	move.l	a3,a1

	tst.l		d0
	bne.s		.LayerDa
	rts
	
.LayerDa:
	move.l	a2,-(sp)
	lea		_MyConfig,a2
	cmp		#ID_NORMALBEHIND,c_IconDepth(a2)
	move.l	(sp)+,a2							;/* should not change SR !?!?! */

	bne.s		.DontCheckHook
	cmp.l		#_IconLayerHook,a1
	bne.s		.DontCheckHook

	;/* Icons bei ID_NORMALBEHIND nicht nach vorne! */

	move.l	d0,-(sp)
	move.l	d0,a0
	;/* a1 ist schon auf altem Hook */
	jsr		_LVOInstallLayerHook(a6)
	move.l	(sp)+,d0	
	rts

.DontCheckHook:

.MoveLayerFront:
	move.l	a1,-(sp)								;/* Hook saven */
	sub.l		a0,a0
	move.l	d0,a1
	move.l	d0,-(sp)
	jsr		_LVOUpfrontLayer(a6)				;/* und in den Vordergrund bringen */
	move.l	(sp)+,d0
	move.l	(sp)+,a1

	move.l	d0,a0
	move		lr_Flags(a0),d1
	btst		#2,d1									;/* Bit 2 ist LAYERSUPER */
	bne.s		.IstSuperLayer
	
	move.l	d0,-(sp)
	;/* a0 ist auf Layer */
	;/* a1 ist auf altem Hook */
	jsr		_LVOInstallLayerHook(a6)
	move.l	(sp)+,d0
	
	movem.l	d0/d2-d3/a6,-(sp)
	move.l	_GfxBase,a6
	move.l	d0,a0
	move.l	lr_rp(a0),a1
	moveq		#0,d0
	moveq		#0,d1
	move.l	#16383,d2
	move.l	#16383,d3
	jsr		_LVOEraseRect(a6)
	jsr		_LVOWaitBlit(a6)
	jsr		_LVOWaitBlit(a6)
	movem.l	(sp)+,d0/d2-d3/a6
	
.IstSuperLayer:
	move.l	a2,-(sp)
	lea		_MyConfig,a2
	tst		c_NoRefreshKill(a2)
	move.l	(sp)+,a2					;/* should not change SR !?!?!? */
	
	bne.s		.Ende
	
	movem.l	d0/a6,-(sp)
	move.l	_GfxBase,a6
	move.l	d0,a0
	move.l	lr_DamageList(a0),a0
	jsr		_LVOClearRegion(a6)
	movem.l	(sp)+,d0/a6
	
	move.l	d0,a0
	and		#~(LAYERREFRESH|LAYERIREFRESH|LAYERIREFRESH2),lr_Flags(a0)
	rts
	
.Standard:
	move.l	_Old_CreateUpfrontHookLayer,-(sp)
.Ende:
	rts

	IMPOSSIBLEPOSITION
	
.CheckMagicMenu:
	cmp.l		#_MagicMenuLayerHook,a3
	beq.s		.MagicMenuFound
	
.NotMagicMenu:
	movem.l	(sp)+,d0/a0/a6
	bra		.NoMagicMenu

.MagicMenuFound:
	
;//	lea		_MagicMenuLayerHook,a3

	move.l	d0,a0						;/* d0 ist ScreenEntry */
	move.l	(sp)+,d0

	cmp		ScreenEntry_se_NormalWidth(a0),d0
	bls.s		.x1OK
	
	move		ScreenEntry_se_NormalWidth(a0),d0
	subq		#1,d0

.x1OK:
	cmp		ScreenEntry_se_NormalHeight(a0),d1
	bls.s		.y1OK
	
	move		ScreenEntry_se_NormalHeight(a0),d1
	subq		#1,d1
	
.y1OK:
	cmp		ScreenEntry_se_NormalWidth(a0),d2
	bls.s		.x2OK
	
	move		ScreenEntry_se_NormalWidth(a0),d2
	subq		#1,d2

.x2OK:
	cmp		ScreenEntry_se_NormalHeight(a0),d3
	bls.s		.y2OK
	
	move		ScreenEntry_se_NormalHeight(a0),d3
	subq		#1,d3
	
.y2OK:
	
	movem.l	(sp)+,a0/a6

	move.l	_Old_CreateUpfrontHookLayer,-(sp)
	rts
	
	IMPOSSIBLEPOSITION

;/* ===================================================================*/

	XDEF	CompareTask
	
CompareTask:
	movem.l	d0-d1/a0-a1/a6,-(sp)
	
	move.l	_SysBase,a6
	sub.l		a1,a1
	jsr		_LVOFindTask(a6)
	move.l	d0,a0

	move.l	LN_NAME(a0),a1

	cmp.b		#NT_PROCESS,LN_TYPE(a0)
	bne.s		.NameOK
	
	move.l	pr_CLI(a0),d0				;/* CLI - Struktur */
	beq.s		.NameOK

	lsl.l		#2,d0
	move.l	d0,a0
	move.l	cli_CommandName(a0),d0	;/* cli_CommandName */
	beq.s		.NameOK

	lsl.l		#2,d0
	addq.l	#1,d0
	move.l	d0,a1

.NameOK:
	move.l	(sp),d0
	move.l	d0,-(sp)					;/* (sp) ist d0 !?? */
	move.l	a1,-(sp)
	jsr		_stricmp

	addq.l	#8,sp
	
	tst.l		d0
	beq.s		.NameFound
	
	movem.l	(sp)+,d0-d1/a0-a1/a6
	moveq		#0,d0
	rts
	
.NameFound:
	movem.l	(sp)+,d0-d1/a0-a1/a6
	moveq		#1,d0
	rts
	
	IMPOSSIBLEPOSITION

	XDEF	New_OpenScreen
	
New_OpenScreen:
	sub.l		a1,a1
	cmp.l		#0,a0
	beq.s		.Weiter

	move		ns_Type(a0),d0
	and		#NS_EXTENDED,d0
	beq.s		.Weiter

	move.l	ens_Extension(a0),a1
;//	clr.l		ens_Extension(a0)

.Weiter:
	bra.s		New_OpenScreenTagList

	IMPOSSIBLEPOSITION
;/* ================================================================ */

	XDEF	New_OpenScreenTagList
	XREF _After_OpenScreen

New_OpenScreenTagList:
	tst		_CxInactive
	bne.s		.OldOnly
	
	pea		.1

.OldOnly:
	move.l	_Old_OpenScreenTagList,-(sp)
	rts
.1:
	tst.l	d0
	bne.s		.Weiter
	rts
	
.Weiter:
	move.l	d0,-(sp)
	
	move.l	d0,-(sp)
	jsr		_After_OpenScreen
	addq.l	#4,sp
	
	move.l	(sp)+,d0
	rts
	
	IMPOSSIBLEPOSITION
;/* =================================================================== */

	XDEF	New_OpenWorkBench
	XREF _After_OpenWorkBench
	
New_OpenWorkBench:
	pea		.1
	move.l	_Old_OpenWorkBench,-(sp)
	rts
.1:
	tst.l		d0
	bne.s		.Weiter
	rts
	
.Weiter:
	move.l	d0,-(sp)
	
	move.l	d0,-(sp)
	jsr		_After_OpenWorkBench
	addq.l	#4,sp
	
	move.l	(sp)+,d0
	rts
	
	IMPOSSIBLEPOSITION
;/* =================================================================== */

	XDEF	New_OpenWindow

New_OpenWindow:
	cmp.l		#0,a0
	beq.s		.KeineTagList
	
	move.l	nw_Flags(a0),d0
	and.l		#WFLG_NW_EXTENDED,d0
	beq.s		.KeineTagList
	
	move.l	enw_Extension(a0),d0
	move.l	d0,a1
	and.b		#1,d0						; Word aligned?
	bne.s		.KeineTagList
	
	movem.l	a0-a1/a6,-(sp)
	move.l	_SysBase,a6
	jsr		_LVOTypeOfMem(a6)
	movem.l	(sp)+,a0-a1/a6

	tst.l	d0
	bne.s		.DoTagList

.KeineTagList:
;//	clr.l		enw_Extension(a0)
	sub.l		a1,a1

.DoTagList:
	bra.s		New_OpenWindowTagList

	IMPOSSIBLEPOSITION
;/* =================================================================== */

	XDEF	New_OpenWindowTagList	;/* geaendert !!! wegen Crash */

New_OpenWindowTagList:
	movem.l	a0/a1,-(sp)
	
	move.l	a1,-(sp)		;/* TagList */
	move.l	a0,-(sp)		;/* NewWindow */
	jsr		_Before_OpenWindowTagList
	addq.l	#8,sp
	
	movem.l	(sp)+,a0/a1

	pea		.1
	move.l	_Old_OpenWindowTagList,-(sp)
	rts
	
.1:
	tst.l		d0
	bne.s		.Weiter
	rts
	
.Weiter:
	move.l	d0,-(sp)
	
	move.l	d0,-(sp)
	jsr		_After_OpenWindowTagList
	addq.l	#4,sp
	
	move.l	(sp)+,d0
	rts
	
	IMPOSSIBLEPOSITION
;/* =================================================================== */

;//	XDEF	OldCreateUpfrontHookLayer
	
;//OldCreateUpfrontHookLayer:
;//	move.l	a6,-(sp)
;//	move.l	_LayersBase,a6
;//	pea		.1
;//	move.l	_Old_CreateUpfrontHookLayer,-(sp)
;//	rts
;//.1:
;//	move.l	(sp)+,a6
;//	rts

	IMPOSSIBLEPOSITION
;/* =================================================================== */

	XDEF	New_CloseScreen
	XREF _NEW_CloseScreen
	
New_CloseScreen:
	cmp.l		#0,a0
	bne.s		.ScreenDa
	moveq		#0,d0
	rts
	
.ScreenDa:
	move.l	a0,-(sp)
	
	move.l	a0,-(sp)
	jsr		_NEW_CloseScreen
	addq.l	#4,sp
	
	move.l	(sp)+,a0
	
	move.l	_Old_CloseScreen,-(sp)
	rts

	IMPOSSIBLEPOSITION
;/* =================================================================== */

	XDEF	New_CloseWorkBench
	XREF _NEW_CloseWorkBench
	XREF _After_CloseWorkBench

New_CloseWorkBench:
	jsr		_NEW_CloseWorkBench
	pea		.after(pc)
	move.l 	_Old_CloseWorkBench,-(sp)
	rts

.after:
	move.l	d0,-(sp)
	jsr		_After_CloseWorkBench
	move.l	(sp)+,d0
	rts
	
	IMPOSSIBLEPOSITION
;/* =================================================================== */
	

	XDEF	New_CloseWindow	
	XREF _NEW_CloseWindow

New_CloseWindow:
	cmp.l		#0,a0
	bne.s		.Weiter
	moveq		#0,d0
	rts
	
.Weiter:
	movem.l	a0/a6,-(sp)
	
	move.l	a0,-(sp)
	move.l	_SysBase,a6
	lea		_DragSemaphore,a0
	jsr		_LVOObtainSemaphore(a6)
	
;/*	move.l	(sp)+,a0		a0 ist schon auf -(sp)!!
;	move.l	a0,-(sp)*/
	
	jsr		_NEW_CloseWindow
	addq.l	#4,sp

	movem.l	(sp)+,a0/a6
	
	pea		.AfterClose
	move.l	_Old_CloseWindow,-(sp)
	rts

.AfterClose:
	move.l	a6,-(sp)
	move.l	_SysBase,a6
	lea		_DragSemaphore,a0
	jsr		_LVOReleaseSemaphore(a6)
	move.l	(sp)+,a6
	rts
	
	IMPOSSIBLEPOSITION
	
;/* =================================================================== */

	XDEF	New_FreeSysRequest
	XREF	_NEW_FreeSysRequest

New_FreeSysRequest:
	cmp.l		#0,a0
	bne.s		.Weiter
	moveq		#0,d0
	rts
	
.Weiter:
	movem.l	a0/a6,-(sp)
	
	move.l	a0,-(sp)
	move.l	_SysBase,a6
	lea		_DragSemaphore,a0
	jsr		_LVOObtainSemaphore(a6)
	
;/*	move.l	(sp)+,a0		a0 ist schon auf -(sp)!!
;	move.l	a0,-(sp)*/
	
	jsr		_NEW_FreeSysRequest
	addq.l	#4,sp

	movem.l	(sp)+,a0/a6
	
	pea		.AfterClose
	move.l	_Old_FreeSysRequest,-(sp)
	rts

.AfterClose:
	move.l	a6,-(sp)
	move.l	_SysBase,a6
	lea		_DragSemaphore,a0
	jsr		_LVOReleaseSemaphore(a6)
	move.l	(sp)+,a6
	rts
	
	IMPOSSIBLEPOSITION
	
	XDEF	New_ActivateWindow
	XREF	_NEW_ActivateWindow

New_ActivateWindow:
	movem.l	a0/a6,-(sp)

	move.l	a0,-(sp)
	jsr		_NEW_ActivateWindow
	addq.l	#4,sp
	
	movem.l	(sp),a0/a6

	move.l	_SysBase,a6
	lea		_DragSemaphore,a0
	jsr		_LVOAttemptSemaphore(a6)		;/* Attempt locking DragSemaphore */
	tst.l		d0
	bne.s		.Weiter
	
	movem.l	(sp)+,a0/a6						;/* Semaphore locked ?? EXIT EXIT EXIT */
	rts
	
	IMPOSSIBLEPOSITION

.Weiter:
	movem.l	(sp),a0/a6

	pea		.1
	move.l	_Old_ActivateWindow,-(sp)
	rts
	
.1:
	move.l	_SysBase,a6
	lea		_DragSemaphore,a0
	jsr		_LVOReleaseSemaphore(a6)		;/* Release Semaphore */

	movem.l	(sp)+,a0/a6
	rts
	
	IMPOSSIBLEPOSITION
	

	XDEF	New_ActivateGadget

New_ActivateGadget:
	movem.l	a0-a2/a6,-(sp)
	
	move.l	_SysBase,a6
	lea		_DragSemaphore,a0
	jsr		_LVOAttemptSemaphore(a6)		;/* Attempt locking DragSemaphore */
	tst.l		d0
	bne.s		.Weiter
	
	movem.l	(sp)+,a0-a2/a6					;/* Semaphore locked ?? EXIT EXIT EXIT */
	moveq		#0,d0								;/* return FALSE */
	rts
	
	IMPOSSIBLEPOSITION
	
.Weiter:
	movem.l	(sp),a0-a2/a6

	pea		.1
	move.l	_Old_ActivateGadget,-(sp)
	rts
	
.1:
	move.l	d0,-(sp)							;/* Activate-Gadget retourinert TRUE, odeer FALSE ! */
	move.l	_SysBase,a6
	lea		_DragSemaphore,a0
	jsr		_LVOReleaseSemaphore(a6)		;/* Release Semaphore */
	move.l	(sp)+,d0
	
	movem.l	(sp)+,a0-a2/a6
	rts
	
	IMPOSSIBLEPOSITION


	XDEF	New_WindowToFront

New_WindowToFront:
	movem.l	a0/a6,-(sp)
	move.l	_SysBase,a6
	lea		_DragSemaphore,a0
	jsr		_LVOObtainSemaphore(a6)		;/* Obtain DragSemaphore */

	movem.l	(sp),a0/a6

	pea		.1
	move.l	_Old_WindowToFront,-(sp)
	rts
	
.1:
	move.l	_SysBase,a6
	lea		_DragSemaphore,a0
	jsr		_LVOReleaseSemaphore(a6)		;/* Release Semaphore */
	
	movem.l	(sp)+,a0/a6
	rts
	
	IMPOSSIBLEPOSITION
	

	XDEF	New_WindowToBack

New_WindowToBack:
	movem.l	a0/a6,-(sp)
	move.l	_SysBase,a6
	lea		_DragSemaphore,a0
	jsr		_LVOObtainSemaphore(a6)		;/* Obtain DragSemaphore */
	
	movem.l	(sp),a0/a6

	pea		.1
	move.l	_Old_WindowToBack,-(sp)
	rts
	
.1:
	move.l	_SysBase,a6
	lea		_DragSemaphore,a0
	jsr		_LVOReleaseSemaphore(a6)		;/* Release Semaphore */
	
	movem.l	(sp)+,a0/a6
	rts
	
	IMPOSSIBLEPOSITION
	

	XDEF	New_EasyRequestArgs
	XREF	_NEW_EasyRequestArgs
	
New_EasyRequestArgs:
	move.l	a3,-(sp)		;/* args */
	move.l	a2,-(sp)		;/* idcmpPTR */
	move.l	a1,-(sp)		;/* easyStruct */
	move.l	a0,-(sp)		;/* window */
	
	jsr		_NEW_EasyRequestArgs
	lea		16(sp),sp
	rts
	
	IMPOSSIBLEPOSITION

	XDEF	JumpOld_EasyRequestArgs
	
JumpOld_EasyRequestArgs:
	move.l	a6,-(sp)
	
	pea		.1
	move.l	_IntuitionBase,a6
	move.l	_Old_EasyRequestArgs,-(sp)
	rts
	
.1:
	move.l	(sp)+,a6
	rts

	
	IMPOSSIBLEPOSITION

	XDEF	New_AutoRequest
	XREF	_NEW_AutoRequest
	
New_AutoRequest:
	move.l	d3,-(sp)		;/* Height */
	move.l	d2,-(sp)		;/* Width */
	move.l	d1,-(sp)		;/* negativeFlags */
	move.l	d0,-(sp)		;/* positiveFlags */
	move.l	a3,-(sp)		;/* negativetext */
	move.l	a2,-(sp)		;/* positivetext */
	move.l	a1,-(sp)		;/* bodytext */
	move.l	a0,-(sp)		;/* window */
	jsr		_NEW_AutoRequest
	lea		32(sp),sp
	rts
	
	IMPOSSIBLEPOSITION
	
	XDEF	JumpOld_AutoRequest

JumpOld_AutoRequest:
	move.l	a6,-(sp)
	
	pea		.1(pc)
	move.l	_IntuitionBase,a6
	move.l	_Old_AutoRequest,-(sp)
	rts

.1:
	move.l	(sp)+,a6
	rts

	IMPOSSIBLEPOSITION

	XDEF	New_SetWindowTitles
	XREF	_NEW_SetWindowTitles
	
New_SetWindowTitles:
	cmp.l		#0,a0
	beq.s		.Standard
	cmp.l		#$FFFFFFFF,a1
	beq.s		.Standard
	
	movem.l	a0/a1,-(sp)
	
	bsr.s		.Standard
	
	movem.l	(sp)+,a0/a1
	
	move.l	a1,-(sp)						;/* WindowTitle */
	move.l	a0,-(sp)						;/* Window */
	jsr		_NEW_SetWindowTitles
	addq.l	#8,sp
	rts

.Standard:
	move.l	_Old_SetWindowTitles,-(sp)
	rts
	
	IMPOSSIBLEPOSITION
	
	XDEF	New_NewObjectA
	XREF	_NEW_NewObjectA

New_NewObjectA:
	move.l	a2,-(sp)					;// taglist
	move.l	a1,-(sp)					;// classID
	move.l	a0,-(sp)					;// classPtr
	jsr		_NEW_NewObjectA
	lea		12(sp),sp
	rts
	
	IMPOSSIBLEPOSITION

	XDEF	JumpOld_NewObjectA
	
JumpOld_NewObjectA:
	move.l	a6,-(sp)
	move.l	_IntuitionBase,a6
	pea		.1(pc)
	move.l	_Old_NewObjectA,-(sp)
	rts

.1:
	move.l	(sp)+,a6
	rts
	
	IMPOSSIBLEPOSITION
	
	XDEF	KillLayer
	
KillLayer:							;/* Layer in a1 */
	move.l	a6,-(sp)
	move.l	a1,d0
	beq.s		.Ende

	move.l	a1,-(sp)

	move.l	_GfxBase,a6
	jsr		_LVOWaitBlit(a6)

	move.l	_LayersBase,a6
	move.l	lr_LayerInfo(a1),a0
	moveq		#LAYERS_NOBACKFILL,d0
	move.l	d0,a1
	jsr		_LVOInstallLayerInfoHook(a6)

	move.l	(sp)+,a1

;//	clr		lr_MinX(a1)
;//	clr		lr_MinY(a1)
;//	clr		lr_MaxX(a1) 
;//	clr		lr_MaxY(a1)
;//	sub.l		a0,a0

	move.l	d0,-(sp)				;'save old layerinfo hook
	move.l	lr_LayerInfo(a1),-(sp)

	jsr		_LVODeleteLayer(a6)	

	move.l	(sp)+,a0				;
	move.l	(sp)+,a1				;'old layerinfo hook
	
	jsr		_LVOInstallLayerInfoHook(a6)

.Ende:
	move.l	(sp)+,a6
	rts

	IMPOSSIBLEPOSITION
	
;/* =================================================================== */

	XDEF	InputEntry	

InputEntry:
	addq		#1,_IO_EntryCounter

	move.l	a1,-(sp)		;/* inputevent */
	move.l	a0,-(sp)		;/* handlerdata */
	jsr		_MyInputHandler;
	addq.l	#8,sp
	rts

	IMPOSSIBLEPOSITION
	
;/* =================================================================== */
	
;'	XDEF	DrawRect
	
DrawRect:
	lea		_MyConfig,a0
	cmp		#MARKER_NONE,c_MarkerTyp(a0)

	beq		.Ende
	tst		_OpaqueON
	bne		.Ende

	movem.l	d2/a2/a6,-(sp)
	move.l	_GfxBase,a6
	move.l	_IO_ScreenEntry,a2

	lea		_IO_RP,a1
	moveq		#0,d0
	moveq		#0,d1
	move		_IO_x1,d0
	move		_IO_y1,d1
	jsr		_LVOMove(a6)
	
	lea		_IO_RP,a1
	moveq		#0,d0
	moveq		#0,d1
	move		_IO_x2,d0
	cmp		ScreenEntry_se_NormalWidth(a2),d0
	slt		d2						;/* d2 = FF, wenn Rechteck innerhalb X */
	blt		.1
	move		ScreenEntry_se_NormalWidth(a2),d0
	subq		#1,d0
.1:
	move		_IO_y1,d1
	jsr		_LVODraw(a6)
	
	lea		_IO_RP,a1
	moveq		#0,d0
	moveq		#0,d1
	tst.b		d2
	beq.s		.NichtZeichnen
	
	move		_IO_x2,d0
	move		_IO_y2,d1
	cmp		ScreenEntry_se_NormalHeight(a2),d1
	slt		d2						;/* d2 = FF, wenn Rechteck innerhalb Y */
	blt.s		.2
	
	move		ScreenEntry_se_NormalHeight(a2),d1
	subq		#1,d1
.2:
	jsr		_LVODraw(a6)
	bra.s		.Linie3
	
.NichtZeichnen:
	move		ScreenEntry_se_NormalWidth(a2),d0
	subq		#1,d0
	move		_IO_y2,d1
	cmp		ScreenEntry_se_NormalHeight(a2),d1
	slt		d2						;/* d2 = FF, wenn Rechteck innerhalb Y */
	blt		.3
	move		ScreenEntry_se_NormalHeight(a2),d1
	subq		#1,d1
.3:
	jsr		_LVOMove(a6)
	
.Linie3:
	lea		_IO_RP,a1
	moveq		#0,d0
	moveq		#0,d1
	tst.b		d2
	beq.s		.NichtZeichnen2
	
	move		_IO_x1,d0
	move		_IO_y2,d1
	jsr		_LVODraw(a6)
	bra.s		.Linie4

.NichtZeichnen2:
	move		_IO_x1,d0
	move		ScreenEntry_se_NormalHeight(a2),d1
	subq		#1,d1
	jsr		_LVOMove(a6)
	
.Linie4:
	lea		_IO_RP,a1
	moveq		#0,d0
	moveq		#0,d1
	move		_IO_x1,d0
	move		_IO_y1,d1
	jsr		_LVODraw(a6)
	
	movem.l	(sp)+,d2/a2/a6
.Ende:
	rts

	IMPOSSIBLEPOSITION

;/* =================================================================== */

	IFD	DOROMPATCH

ROMPatch_CheckWindowPos:			;'(a0 = screen)
	move.w	d0,6(a2)

	btst		#7,sc_LayerInfo+li_Flags+1(a0)
	beq.s		.raus

	move		#-16383,(a2)
	move		#-16383,2(a2)
	move		#16383,4(a2)
	move		#16383,6(a2)

.raus:
	move.l	(a7)+,a2
	rts
	
;/* =================================================================== */

ROMPatch_CheckWindowSize:		;'(a0 = screen)
	sub.l		d1,d0
	move.w	d0,$FFF6(a5)
	
	btst		#7,sc_LayerInfo+li_Flags+1(a0)
	beq.s		.raus

	move		#-16383,$FFF0(a5)
	move		#-16383,$FFF2(a5)
	move		#16383,$FFF4(a5)
	move		#16383,$FFF6(a5)

.raus:
	rts

;/* =================================================================== */

ROMPatch_CheckDragging:		;'(a1 = screen)
	sub.l   D1,D0
	move.w  D0,$FFFA(A5)

	btst		#7,sc_LayerInfo+li_Flags+1(a1)
	beq.s		.raus

	move		#-16383,$FFF4(a5)
	move		#-16383,$FFF6(a5)
	move		#16383,$FFF8(a5)
	move		#16383,$FFFA(a5)
	
.raus:
	rts

;/* =================================================================== */

;/* =================================================================== */

	XDEF	RomSearch
	
RomSearch:
	movea.l $002E(A1),A0
	move.w  $000E(A0),D0
	ext.l   D0
	move.w  $000A(A1),D1
	ext.l   D1
	sub.l   D1,D0
	move.w  D0,$0006(A2)
	movea.l (A7)+,A2
	rts

RomSearchEnd:

	XDEF	RomSearchSize
	
RomSearchSize:
	dc.l		RomSearchEnd-RomSearch

	XDEF	RomPatch
	
RomPatch:
	movea.l $002E(A1),A0
	move.w  $000E(A0),D0
	ext.l   D0
	move.w  $000A(A1),D1
	ext.l   D1
	sub.l   D1,D0
	dc.w	  $4EF9		;'jmp
	dc.l	  ROMPatch_CheckWindowPos

RomPatchEnd:
	dc.w		$AFFE

	XDEF	OldROM
	
OldROM:
	blk.b		RomPatchEnd-RomPatch,0
	dc.w		$AFFE


;/***************************************************/

	XDEF	RomSearch2
	
RomSearch2:
	move.w  D0,$FFF4(A5)
	movea.l $002E(A2),A0
	move.w  $000E(A0),D0
	ext.l   D0
	move.w  $0006(A3),D1
	ext.l   D1
	sub.l   D1,D0
	move.w  D0,$FFF6(A5)

RomSearch2End:

	XDEF		RomSearch2Size

RomSearch2Size:
	dc.l		RomSearch2End-RomSearch2

	XDEF		RomPatch2

RomPatch2:
	move.w  D0,$FFF4(A5)
	movea.l $002E(A2),A0
	move.w  $000E(A0),D0
	ext.l   D0
	move.w  $0006(A3),D1
	ext.l   D1
	dc.w	  $4EB9	;'jsr
	dc.l	  ROMPatch_CheckWindowSize
	
RomPatch2End:	
	dc.w		$AFFE


	XDEF	OldROM2

OldROM2:
	blk.b		RomPatch2End-RomPatch2,0
	dc.w		$AFFE

;/***************************************************/

	XDEF	RomSearch3
	
RomSearch3:
	movea.l D2,A1
	move.w  $000C(A1),D0
	ext.l   D0
	move.w  $0008(A3),D1
	ext.l   D1
	sub.l   D1,D0
	move.w  D0,$FFF8(A5)
	move.w  $000E(A1),D0
	ext.l   D0
	move.w  $000A(A3),D1
	ext.l   D1
	sub.l   D1,D0
	move.w  D0,$FFFA(A5)

RomSearch3End:

	XDEF		RomSearch3Size

RomSearch3Size:
	dc.l		RomSearch3End-RomSearch3

	XDEF		RomPatch3

RomPatch3:
	movea.l D2,A1
	move.w  $000C(A1),D0
	ext.l   D0
	move.w  $0008(A3),D1
	ext.l   D1
	sub.l   D1,D0
	move.w  D0,$FFF8(A5)
	move.w  $000E(A1),D0
	ext.l   D0
	move.w  $000A(A3),D1
	ext.l   D1
	dc.w	  $4EB9	;'jsr
	dc.l	  ROMPatch_CheckDragging

RomPatch3End:	
	dc.w		$AFFE


	XDEF	OldROM3

OldROM3:
	blk.b		RomPatch3End-RomPatch3,0
	dc.w		$AFFE

;/* =================================================================== */

	XDEF	SearchRom
	
SearchRom:			;'a0 = what  a1 = startsearch  a2 = endsearch  d0 = searchsize
	movem.l	d2/a2-a4,-(sp)

	sub.l		d0,a2
	lsr		#1,d0
	subq		#1,d0

.outerloop:
	move		d0,d1
	move.l	a0,a3
	move.l	a1,a4

.loop:
	cmpm.w	(a3)+,(a4)+
	bne.s		.next
	
	subq		#1,d1
	bpl.s		.loop
	bra.s		.found

.next:
	addq.l	#2,a1
	cmp.l		a2,a1
	bls.s		.outerloop
	moveq		#0,d0
	bra.s		.raus

.found:
	move.l	a1,d0
	sub.l		ROMStart(pc),d0
	add.l		ROMBufferStart(pc),d0

.raus:
	movem.l	(sp)+,d2/a2-a4
	rts

	
;/* =================================================================== */

	XDEF	CalcROMCheckSum

CalcROMCheckSum:
	move.l	d2,-(sp)
	
	move.l	ROMBufferStart(pc),a0
	lea		$7FFE8,a1
	add.l		a0,a1
	clr.l		(a1)
	
	moveq		#-1,d1
	moveq		#1,d2
	moveq		#0,d0

.loop:
	add.l		(a0)+,d0
	bcc.s		.dontadd
	addq.l	#1,d0

.dontadd:
	dbf		d1,.loop
	dbf		d2,.loop

	not.l		d0
	
	move.l	d0,(a1)
	
	move.l	(sp)+,d2
	rts
	
	
	ENDC

	XDEF  RollWORD

RollWORD:
	move	(a0),d0
	rol	#1,d0
	move	d0,(a0)
	rts

 	XDEF	Blinker

Blinker:
	move		$dff006,$dff180
	btst		#7,$bfe001
	bne.s		Blinker
	rts
	
	XDEF	Blinker2
	
Blinker2:
	bsr.s		Blinker
.BlinkerWait:
	move		#$FF0,$dff180
	btst		#6,$bfe001
	bne.s		.BlinkerWait
	rts
	
	XDEF	BlinkerFehler
	
BlinkerFehler:
	movem.l	d0/d1,-(sp)

.Loop:
	moveq	#10,d0
.1:
	moveq	#-1,d1
.2:
	move	#$F00,$dff180
	dbf	d1,.2
	dbf	d0,.1
	
	moveq	#10,d0
.3:
	moveq	#-1,d1
.4:
	move	#$FF0,$dff180
	dbf	d1,.4
	dbf	d0,.3
	
	btst	#7,$bfe001
	bne.s	.Loop
	
	movem.l	(sp)+,d0/d1
	rts
	
;/* Variablen ============================================================== */
	
	CNOP	0,4

TaskList_TOSCAN:
	dc.l 0

	XDEF	ROMStart

ROMStart:
	dc.l	0

	XDEF	ROMBufferStart

ROMBufferStart:
	dc.l	0

CaseSensitive_TOSCAN:
	dc.w 0

XOR_TOSCAN:
	dc.w 0
	
MagicMenuName:
	dc.b "MAGICMENU",0

	END
	
	
