	include graphics/layers.i
	include intuition/screens.i

	XREF	_ROMStart
	XREF	_ROMPatchStart
	XREF	_ROM
	XREF	_ROMSize
	XREF	_printf
	XREF	_relocarray

	XDEF	_FindRes
	
_FindRes			;'(a0 = startsearch a1 = endsearch)
	addq.l	#2,a0
	move.l	a0,d1
	sub.l		#_ROM,d1
	add.l		_ROMStart,d1
	
.loop:
	cmp.w		#$4AFC,(a0)+
	bne.s		.next
	
	move.l	(a0),d0
	cmp.l		d1,d0
	bne.s		.next
	
	move.l	4(a0),d0
	cmp.l		d1,d0
	blo.s		.next

	move.l	a0,d0
	subq.l	#2,d0
	bra.s		.raus

.next:
	addq.l	#2,d1
	cmp.l		a1,a0
	bls.s		.loop
	
	moveq		#0,d0

.raus:
	rts


	XDEF	_CalcROMCheckSum

_CalcROMCheckSum:
	move.l	d2,-(sp)
	
	lea		_ROM,a0
	move.l	_ROMSize,d0
	lea		-$18(a0,d0.l),a1
	clr.l		(a1)
	
	moveq		#-1,d1
	move		_ROMSize,d2
	lsr		#2,d2
	subq		#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
	


	XDEF	_PatchROM
	
_PatchROM:
	movem.l	d2/a2-a3,-(sp)

	lea		RomSearch(pc),a0
	lea		RomPatch(pc),a1
	move.l	#RomSearchEnd-RomSearch,d2
	bsr.s		DoPatch

	lea		RomSearch2(pc),a0
	lea		RomPatch2(pc),a1
	move.l	#RomSearch2End-RomSearch2,d2
	bsr.s		DoPatch

	lea		RomSearch3(pc),a0
	lea		RomPatch3(pc),a1
	move.l	#RomSearch3End-RomSearch3,d2
	bsr.s		DoPatch
	
	lea		FirstROMPatch(pc),a0
	move.l	_ROMPatchStart,a1
	move		#(LastROMPatch-FirstROMPatch)/2-1,d0
	
.loop:
	move		(a0)+,(a1)+
	dbf		d0,.loop

	lea		ADDRESSARRAY(pc),a0
	lea		SETADDRESSARRAY(pc),a1
	lea		_relocarray,a3

.loop2:
	move.l	(a0)+,a2
	move.l	(a1)+,d0
	bmi.s		.done
	
	cmp.l		#0,a2
	beq.s		.loop2

	add.l		_ROMPatchStart,d0
	sub.l		#_ROM,d0
	
	add.l		_ROMStart,d0
	move.l	d0,-4(a2)
	
	lea		-4(a2),a2
	sub.l		#_ROM,a2
	move.l	a2,(a3)+

	sub.l		_ROMStart,d0
	move.l	d0,(a3)+
	
	bra.s		.loop2

.done:
	movem.l	(sp)+,d2/a2-a3
	rts

	
DoPatch:
	move.l	a1,-(sp)

	move.l	_IntuitionStart(pc),a1
	move.l	_IntuitionEnd(pc),a2
	move.l	d2,d0
	bsr		SearchRom

	move.l	(sp)+,a1
	
	tst.l		d0
	bne.s		.ok
	
	move.l	_ErrTextPointer(pc),-(sp)
	jsr		_printf
	addq.l	#4,sp
	
	bra.s		.raus

.ok:
	move.l	d0,a0

.copy:
	move		(a1)+,d0
	cmp		#$AFFE,d0
	beq.s		.copydone
	move		d0,(a0)+
	bra.s		.copy
	
.copydone:
	move.l	_SetAddressPointer(pc),a1
	move.l	a0,(a1)

.raus:
	addq.l	#4,_ErrTextPointer
	addq.l	#4,_SetAddressPointer
	rts
	
;/**************************************************/

FirstROMPatch:

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

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

	move.l	a2,a0
	bsr.s		ROMPatch_Set

.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

	lea		$FFF0(a5),a0
	bsr.s		ROMPatch_Set

.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

	lea		$FFF4(a5),a0
	bsr.s		ROMPatch_Set

.raus:
	rts
	
ROMPatch_Set:
	move.l	#$C001C001,d0
	
	move.l	d0,(a0)+
	neg		d0
	swap		d0
	neg		d0
	move.l	d0,(a0)
	rts
	

	

LastROMPatch:

;/***************************************************/
	
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:
	
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

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

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:

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


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

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:


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


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

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

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


	CNOP	0,4
	
	XDEF	_ROMPatchBytes
	XDEF	_IntuitionStart
	XDEF	_IntuitionEnd

_ROMPatchBytes:		dc.l	LastROMPatch-FirstROMPatch
_IntuitionStart:		dc.l	0
_IntuitionEnd:			dc.l	0
_ErrTextPointer:		dc.l	ERRTEXTARRAY
_SetAddressPointer:	dc.l ADDRESSARRAY

ADDRESSARRAY:		dc.l 0,0,0
SETADDRESSARRAY:	dc.l	ROMPatch_CheckWindowPos-FirstROMPatch
						dc.l	ROMPatch_CheckWindowSize-FirstROMPatch
						dc.l	ROMPatch_CheckDragging-FirstROMPatch
						dc.l	-1
						
ERRTEXTARRAY:		dc.l ERRTEXT_NOTFOUND1,ERRTEXT_NOTFOUND2,ERRTEXT_NOTFOUND3

ERRTEXT_NOTFOUND1: dc.b 'Warning: window position check routine not found!',0
ERRTEXT_NOTFOUND2: dc.b 'Warning: window size check routine not found!',0
ERRTEXT_NOTFOUND3: dc.b 'Warning: drag check routine not found!',0

	END
