;*********************************************************
;* Experimental GameBoy -> BitPlanes conversion routines *
;* Neither finished nor used in the current distribution *
;* If you want to have a look at the source, build own   *
;* routines, suggest improvements etc. - here it is!     *
;*********************************************************

	MACHINE 68020

WIDTH		equ	20	; 160 / 8 !
HEIGHT		equ	(18*8)	; 144

;********* Getting Values from C-Code ***********

	XREF	_XBuf
	XREF	_RAM
	XREF	_BgdTab
	XREF	_ChrGen
	XDEF	_StartDisplay

;********* Temp.-defines ************

;_XBuf		equ	$100000
;_LCDCONT	equ	$81
;_SCROLLX	equ	10
;_SCROLLY	equ	20
;_Y		equ	5
;_BgdTab		equ	$160000
;_ChrGen		equ	$170000

	cnop	0,4

x:
	move.b	#$55,$16006a
	move.b	#$56,$16006b
	move.b	#$55,$16006c
	move.b	#$56,$16006d
	move.b	#$11,$170552
	move.b	#$22,$170553
	move.b	#$33,$170562
	move.b	#$44,$170563
	

_StartDisplay:
backgndwork:
	movem.l	d1-d7/a0-a6,-(sp)
	move.b	d0,Y
	move.l	_RAM,a0
	move.b	$ff43(a0),SCROLLX
	move.b	$ff42(a0),SCROLLY
	move.b	$ff40(a0),LCDCONT

	move.l	_XBuf,a4		; Zeiger 1. Plane

	lea	$100000,a0
	move.l	a4,(a0)+


	move.l	a4,a5
	moveq	#0,d0
	move.b	#HEIGHT,d0
	muls	#WIDTH,d0
	add.l	d0,a5                   ; Zeiger 2. Plane

	moveq	#0,d0
	move.b	Y,d0
	muls	#WIDTH,d0
	add.l	d0,a4
	
	moveq	#0,d0
	move.b	LCDCONT(pc),d0
	and.b	#$81,d0                 ; LCD Operation | Background Display
	cmp.b	#$81,d0
	beq	display
	moveq	#WIDTH,d0
clearline:
	move.b	#0,(a4)+
	move.b	#0,(a5)+
	dbra	d0,clearline
	bra	windowwork

display:
	moveq	#0,d0
	move.b	Y,d0
	add.b	SCROLLY(pc),d0
	move.b	d0,Offset
	and.b	#$f8,d0
	lsl.w	#2,d0
	move.l	#_BgdTab,d1	
	add.l	d0,d1
	move.l	d1,T
	moveq	#0,d0
	move.b	Offset,d0
	and.b	#$07,d0
	lsl.l	#1,d0	
	move.b	d0,Offset
	moveq	#0,d0
	move.b	SCROLLX(pc),d0
	add.l	T,d0	
	move.l	d0,a0
	moveq	#0,d0
	move.b	(a0),d0	
	move.b	d0,T0
	moveq	#0,d0
	move.b	LCDCONT(pc),d0
	and.b	#$10,d0                 ; Tile Pattern Table Adress
	cmp.b	#$10,d0
	bne	noadd
	add.b	#$80,T0
noadd:
	move.b	T0,d0
	lsl	#4,d0
	add.b	Offset,d0		
	add.l	#_ChrGen,d0
	move.l	d0,P
	move.l	d0,a0
	moveq	#$0,d0
	move.b	SCROLLX(pc),d0
	and.b	#$07,d0
	move.b	d0,Mask
	move.b	SCROLLX(pc),d0
	move.b	d0,X1
	add.b	#WIDTH,d0
	move.b	d0,X2
;	lea	TLine1,a3
;	lea	TLine2,a4
	moveq	#0,d4
	moveq	#0,d5
	move.b	X1,d4
	move.b	X2,d5


TempLineLoop:
	move.l	P,a2
	move.b	(a2)+,(a4)+
	move.b	(a2),(a5)+		

	add.b	#1,d4

	moveq	#0,d0
	move.b	d4,d0
	add.l	T,d0	
	move.l	d0,a0
	moveq	#0,d0
	move.b	(a0),d0	
	move.b	d0,T0
	moveq	#0,d0
	move.b	LCDCONT(pc),d0
	and.b	#$10,d0                 ; Tile Pattern Table Adress
	cmp.b	#$10,d0
	bne	noadd2
	add.b	#$80,T0
noadd2:
	move.b	T0,d0
	lsl	#4,d0
	add.b	Offset,d0		
	add.l	#_ChrGen,d0
	move.l	d0,P

	cmp.b	d4,d5	
	bne	TempLineLoop

windowwork:	

	movem.l	(sp)+,d1-d7/a0-a6
	rts	
	
; ********** Misc stuff **********

	cnop	0,4
	
Offset:		dc.l	0
T:		dc.l	0
P:		dc.l	0
P0:		dc.l	0
P1:		dc.l	0
T0:		dc.l	0
Mask:		dc.l	0
TLine1:		blk.b	20,0
		cnop	0,4
TLine2:		blk.b	20,0
		cnop	0,4
X1		dc.l	0
X2		dc.l	0
Y		dc.b	0
LCDCONT		dc.b	0
SCROLLX		dc.b	0
SCROLLY		dc.b	0
