*
* bblock.asm - installed as an Amiga bootblock displays a checkmark on screen
*
* Bruno Costa - 4 Dec 89 - 7 Dec 89
*

	include "exec/funcdef.i"
	include "exec/exec_lib.i"
	include "hardware/custom.i"

gb_copinit	EQU	$00000026
RT_INIT		EQU	$00000016

chipcpr		equ	$07F000
chipbp1		equ	$07F100
chipbp2		equ	$07F600
chipbp3		equ	$07FB00

	SECTION bootblock,CODE
	dc.b	'DOS',0		; DOS ID
	dc.l	0		; checksum
	dc.l	$00000370	; DOS patch

start	lea	gfxname(PC),a1
	moveq.l	#0,d0
	jsr	_LVOOpenLibrary(a6)	; open gfx library
	move.l	d0,a1
	move.l	gb_copinit(a1),a3	; save old copper list
	jsr	_LVOCloseLibrary(a6)	; close gfx library

	move.l	#chipbp1,a0
	move.l	#960,d0		; 960 longwords = 320 bits * 96 lines
clrloop	clr.l	(a0)+		; clear all bitplanes
	dbra	d0,clrloop

	lea	bplane1(PC),a0	; copy image first bitmap
	move.l	#chipbp1+16,a1	; center position in first bplane
	bsr.s	drawpl

	lea	bplane2(PC),a0	; copy image second bitmap
	move.l	#chipbp2+16,a1	; center position in second bplane
	bsr.s	drawpl

	lea	bplane3(PC),a0	; copy image third bitmap
	move.l	#chipbp3+16,a1	; center position in third bplane
	bsr.s	drawpl

	move.l	#chipcpr,a0
	move.l	a0,a2
	lea	cprlist(PC),a1
	moveq.l	#30,d0			; copper list size
mvloop	move.l	(a1)+,(a0)+		; copy copper list to chip RAM
	dbra	d0,mvloop

	lea	$00DFF000,a0		; custom chip base address in a0
	move.l	a2,cop1lc(a0)		; load copper list
	clr.w	copjmp1(a0)		; signal copper to load new list
	move.w	#$8380,dmacon(a0)	; enable copper & bitplane DMA

	moveq.l	#13,d1		; reserve some time to see the picture
wait	nop
	dbra	d0,wait
	dbra	d1,wait

	move.l	a3,cop1lc(a0)	; reload old copper list
	clr.w	copjmp1(a0)

	lea	dosname(PC),a1		; standard DOS bootblock
	jsr	_LVOFindResident(a6)
	tst.l	d0
	beq.s	nodos
	move.l	d0,a0
	move.l	RT_INIT(a0),a0
	moveq.l	#0,d0
	rts
 
nodos	moveq.l	#-1,d0
	rts	


; draw data pointed by a0 in bitplane pointed by a1

drawpl	moveq.l	#28,d0		; copy 28 lines
nextln	move.l	(a0)+,(a1)
	move.l	(a0)+,4(a1)
	add.l	#40,a1
	dbra	d0,nextln
	rts

dosname		dc.b	'dos.library',0
gfxname		dc.b	'graphics.library',0

	CNOP	0,4

cprlist	dc.l	$2001FFFE	; WAIT for VBLANK (?)
	dc.l	$01000200	; load BPLCON0 with $200
	dc.l	$008E05D1	; load DIWSTRT with $0581
	dc.l	$00904071	; load DIWSTOP with $40C1
	dc.l	$00920064	; load DDFSTRT with $38
	dc.l	$009400AC	; load DDFSTOP with $D0
	dc.l	$01020000	; load BPLCON1 with 0
	dc.l	$01040024	; load BPLCON2 with $24
	dc.l	$01080000	; load BPL1MOD with 0
	dc.l	$010A0000	; load BPL2MOD with 0

	dc.l	$01800000	; load color palette
	dc.l	$0182045B
	dc.l	$0184019C
	dc.l	$01860086
	dc.l	$018808B3
	dc.l	$018A0DA2
	dc.l	$018C0C63
	dc.l	$018E0B22

	dc.l	$00E00007	; put high bits of bplane1 addr
	dc.l	$00E2F100	; put low bits (result 0x07F100)
	dc.l	$00E40007	; put high bits of bplane2 addr
	dc.l	$00E6F600	; put low bits (result 0x07F600)
	dc.l	$00E80007	; put high bits of bplane3 addr
	dc.l	$00EAFB00	; put low bits (result 0x07FB00)

	dc.l	$8001FFFE	; WAIT for
	dc.l	$0100B200	; load BPLCON0 with $B200
	dc.l	$9C01FFFE	; WAIT for
	dc.l	$01000200	; load BPLCON0 again with $200
	dc.l	$FFFFFFFE	; end of copper list

bplane1	dc.l	$00000000,$01FE7F80,$00000000,$03FCFF00
	dc.l	$00000000,$07F9FE00,$00000000,$0AA2A800
	dc.l	$00000000,$15455000,$00000000,$2A8AA000
	dc.l	$00000000,$00000000,$00000000,$00000000
	dc.l	$00000000,$00000000,$00000001,$54550000
	dc.l	$00000002,$A8AA0000,$00000005,$51540000
	dc.l	$0000001F,$E7F80000,$0000003F,$CFF00000
	dc.l	$0000007F,$9FE00000,$000000AA,$2A800000
	dc.l	$7F9FE154,$55000000,$3FCFF2A8,$AA000000
	dc.l	$1FE7F800,$00000000,$05515000,$00000000
	dc.l	$02A8A000,$00000000,$01545545,$50000000
	dc.l	$00002A8A,$A0000000,$00005515,$40000000
	dc.l	$0001FE7F,$80000000,$002BFEFF,$00000000
	dc.l	$0017FDFE,$00000000,$000FF3FC,$00000000

bplane2	dc.l	$00000000,$01FE7F80,$00000000,$03FCFF00
	dc.l	$00000000,$07F9FE00,$00000000,$0FF3FC00
	dc.l	$00000000,$1FE7F800,$00000000,$3FCFF000
	dc.l	$00000000,$7F9FE000,$00000000,$FF3FC000
	dc.l	$00000001,$FE7F8000,$00000002,$A8AA0000
	dc.l	$00000005,$51540000,$0000000A,$A2A80000
	dc.l	$00000000,$00000000,$00000000,$00000000
	dc.l	$00000000,$00000000,$00000000,$00000000
	dc.l	$00000000,$00000000,$00000000,$00000000
	dc.l	$00000000,$00000000,$0AA2A000,$00000000
	dc.l	$05514000,$00000000,$02A89545,$50000000
	dc.l	$01FE2A8A,$A0000000,$00FF55D5,$40000000
	dc.l	$007FFFFF,$80000000,$003FFFFF,$00000000
	dc.l	$001FFFFE,$00000000,$000FF3FC,$00000000

bplane3	dc.l	$00000000,$01FE7F80,$00000000,$03FCFF00
	dc.l	$00000000,$07F9FE00,$00000000,$0FF3FC00
	dc.l	$00000000,$1FE7F800,$00000000,$3FCFF000
	dc.l	$00000000,$7F9FE000,$00000000,$FF3FC000
	dc.l	$00000001,$FE7F8000,$00000003,$FCFF0000
	dc.l	$00000007,$F9FE0000,$0000000F,$F3FC0000
	dc.l	$0000001F,$E7F80000,$0000003F,$CFF00000
	dc.l	$0000007F,$9FE00000,$000000FF,$3FC00000
	dc.l	$000001FE,$7F800000,$000003FC,$FF000000
	dc.l	$000007F9,$FE000000,$00000FF3,$FC000000
	dc.l	$00001FE7,$F8000000,$00002A8A,$A0000000
	dc.l	$00005515,$40000000,$0000AA2A,$80000000
	dc.l	$00000000,$00000000,$00000000,$00000000
	dc.l	$00000000,$00000000,$00000000,$00000000

; End of bootblock

	END
