*************************************************
*	Demonstrace blitteru (kresleni car)	*	
*************************************************
	SECTION copper_demo,CODE_P
**********************************************
	lea	$dff000,a6
**************************************************
* zde inicializujeme  copper list resp. ukazovtka
* bitplanu
	lea	bp,a0			;ukazovatko na obrazovku
	move.l	#screen,d0		
	move.w	d0,6(a0)
	swap	d0
	move.w	d0,2(a0)
**********************************************
	move.w	#$7fff,$9a(a6)		;zakazat preruseni
	move.w	#$83c0,$96(a6)		;povolit DMA copperu,bitplanu a blitteru
	move.l	#copper,$80(a6)		;zapsat pocatek copper listu 
	clr.w	$88(a6)			;restart

	moveq #0,d0
	moveq #0,d1
	moveq #0,d2
	move.w #255,d3

	moveq #24,d7
kresli
	movem.l	d0-d7,-(a7)
	bsr	Line
	movem.l	(a7)+,d0-d7
	add.w	#10,d1
	add.w	#10,d2
	dbf	d7,kresli

loop
	btst	#$6,$bfe001		;cekani na mys
	bne.b	loop
	rts
*****************************************************************
;                     *********************************
;                     **** RUTINA PRO KRESLENI CAR ****
;                     *********************************
;                 original routine by Rune Gram-Madsen 1990
;                       comment by Sci-fi Defor 1992
;
; D0 = startX
; D1 = startY
; D2 = endX
; D3 = endY
; PRO VYKRESLENI NAPLNTE TYTO REGISTRY SOURADNICEMI O VELIKOSTI WORD 
; A SKOCTE NA ADRESU    -- DRAWLINE --
; PRO KRESLENI NORMALNICH CAR single = 0, PRO KRESLENI CARY S JEDNIM BODEM
; NA RADEK single = 2
; bytewidth JE POCET BYTU NA OBRAZOVCE 
; DO REGISTRU A5 SE NA ZACATKU RUTINY VKLADA ADRESA OBRAZ. PAMETI,
; JE VELMI VHODNE TOTO UPRAVIT (napr. move.l screenptr,a5)
; POUZIVAJI SE REGISTRY :  D0/D1/D2/D3/D4/D7/A5/A6

single 	  = 0		; 2 = SINGLE BIT WIDTH (pro kresleni car s jednim bodem na linku)
bytewidth = 40		; delka radkuv bytech

Line
	lea.l	screen,a5		; do a5 adresa bpl (vhodne upravit!!)
	lea.l	$dff000,a6
	sub.w	d3,d1			; d1 = endY-startY = dY
	mulu	#bytewidth,d3		; endY * bytewidth  (= radek v bytech)
	moveq	#$f,d4			; maskaovani
	and.w	d2,d4			; d4 = nizsi 4 bity ze endX (doplnek)
	sub.w	d2,d0			; d2 = startX-endX = dX
	blt.s	draw_dont0146		; kdyz endX > startX, pak vyber 5,2,7,3
	tst.w	d1			; otestuj dY
	blt.s	draw_dont04		; pokud zaporny, pak vyber 6,1		
	cmp.w	d0,d1			; test dX a dY
	bge.s	draw_select0		; pokud dY < dX, pak
	moveq	#$11+single,d7		; vyber OCT 4
	bra.s	draw_octselected
draw_select0
	moveq	#1+single,d7		; jinak vyber OCT 0
	exg	d0,d1			; prohod do d1
	bra.s	draw_octselected
draw_dont04
	neg.w	d1			; zkladni dY
	cmp.w	d0,d1			; otestuj dX a dY
	bge.s	draw_select1		; pokud dY < dX, pak
	moveq	#$19+single,d7		; vyber OCT 6
	bra.s	draw_octselected
draw_select1
	moveq	#5+single,d7		; jinak vyber OCT1
	exg	d0,d1
	bra.s	draw_octselected
draw_dont0146
	neg.w	d0			; dX udelej zase kladne
	tst.w	d1			; test dY
	blt.s	draw_dont25		; pokud dY kladne, pak
	cmp.w	d0,d1			; otestuj jestli dX > dY
	bge.s	draw_select2		; jestlize ne, pak
	moveq	#$15+single,d7		; vybran  OCT 5
	bra.s	draw_octselected
draw_select2
	moveq	#9+single,d7		; jinak vybran OCT 2
	exg	d0,d1			; prohodi d0 d1
	bra.s	draw_octselected
draw_dont25
	neg.w	d1			; zkladni dY
	cmp.w	d0,d1			; je dX > dY
	bge.s	draw_select3		; jestlize ne, pak
	moveq	#$1d+single,d7		; vybran OCT 7
	bra.s	draw_octselected
draw_select3
	moveq	#$d+single,d7		; jinak OCT 3
	exg	d0,d1			; prohod d0 d1
draw_octselected
	add.w	d1,d1			; 2*dY
	asr.w	#3,d2			; endX = endX/8
	ext.l	d2			; rozsir endX o znamenko
	add.l	d2,d3			; d3 = endX+endY*40 = pozice na obr
	move.w	d1,d2			; d2 = 2*dY
	sub.w	d0,d2			; d2 = 2*dY-dX
	bge.s	draw_dontsetsign	; pokud je 2*dY mensi nez dX, pak
	ori.w	#$40,d7			; nastav znamenko 
draw_dontsetsign
.wait	btst	#$e,$2(a6)		; wait on the blitter
	bne.s	.wait
	move.l	#$ffff8000,$72(a6)
	move.w	#bytewidth,$60(a6)	; do bltcmod sirka obr. v bytech
	move.w	d2,$52(a6)		; 2*dY-dX do bltaptl
	move.w	d1,$62(a6)		; 2*dY do bltbmod
	sub.w	d0,d2			; d2 = 2*dY-dX-dX
	move.w	d2,$64(a6)		; 2*dY-2*dX do bltamod
	asl.w	#6,d0			; d0 = 64*dX
	add.w	#$0042,d0		; d0 = 64*(dx+1)+2
	move.w	d4,d1
	ror.w	#4,d4			; doplnek do wordu radky otocit o 4
	ori.w	#$bea,d4		; dma + minterm
					; $b4a maze pokud prekresluje nakreslene
	swap	d7			; otoc OCT (=d7)
	move.w	d4,d7			; pridej k nemu doplnek
	swap	d7			; opet otoc, ponevadz doplnek do $40
	add.l	a5,d3			; cilovou pozici pricist k bplptr
	move.l	d7,$40(a6)		; OCT a doplnek do bltcon0 + bltcon1
	move.l	d3,$48(a6)		; cilovou adresu cary do bltcpt
	move.l	d3,$54(a6)		; a do bltdpt
	move.l	d3,a5
	not.b	d1
	bchg	d1,(a5)
	moveq #-1,d7
	move.l	d7,$44(a6)		; $ffffffff do bltafwm a bltalwm
	move.w	d0,$58(a6)		; velikost cary do bltsize AND GO!
	rts
**********************************************
	SECTION chip_data,DATA_C
copper	
	dc.w	$96,$20			;zakazani spritu
	dc.w	$008E,$2c75		;velikost zobraz. okna
	dc.w	$0090,$2cc5
	dc.w	$0092,$0038		;prenos dat
	dc.w	$0094,$00d0
	dc.w	$0108,0			; vynulovat modulo pro liche
	dc.w	$010A,0			; vynulovat modulo pro sude
	dc.w	$1fc,0			; vynulovat (kvuli kompatibilty s AGA)
	dc.w	$0100,$1000		; jeden bitplany 
	dc.w	$0102,$0
	dc.w	$0104,$0
bp
	dc.w	$00E0,$0,$00E2,$0

	dc.w	$180,$0FFF,$182,$0000	;paleta barev
	dc.w	$ffff,$fffe	;konec copper listu (cekani na konec snimku)

	SECTION bitplan,BSS_C
screen	ds.b	10240
