;/*
  *	COPASM.A		by Patrick van Logchem (v912152@si.hhs.nl)
  *	last changed on 16 march 1994
  */

	SECTION	copasm,CODE

	XDEF	_leftmouse
	XDEF	_rightmouse
	XDEF	_chopper
	XDEF	_setcopper
	XDEF	_setcolor
	XDEF	_getcolor
	XDEF	_ytab
	XDEF	_xoff

NEXTROW	EQU	40
ROWS	EQU	80

HIGH_E	EQU	3
HIGH_O	EQU	2
WIDTH	EQU	2

TEST	EQU	0

_leftmouse:
	moveq	#0,d0
	btst	#6,$bfe001
	seq	d0
	rts

_rightmouse:
	moveq	#0,d0
	btst	#7,$bfe001
	seq	d0
	rts

_ytab	dc.l	0
_xoff	dc.l	0

; 'chopper' fills all what's needed for a chunky-copper-screen.
_chopper:
	; a0 = adres first bitplane
	; d0 = offset next bitplane
	; a1 = adres copperlist
	; a2 = adres y-adres-table
	; a3 = adres x-offset-table
	movem.l	d0-d7/a0-a6,-(a7)

	move.l	a2,_ytab
	move.l	a3,_xoff

; Setup copper to display screen:
	move.l	#$01800000,(a1)+	; color0  = $0000
	move.l	#$010c0011,(a1)+	; bplcon4 = $0011
	move.l	#$008e2269,(a1)+	; diwstrt = $2269
	move.l	#$01000210,(a1)+	; bplcon0 = $0210
	move.l	#$01040224,(a1)+	; bplcon2 = $0224
	move.l	#$009022a9,(a1)+	; diwstop = $22a9
	move.l	#$00920018,(a1)+	; ddfstrt = $0018
	move.l	#$009400b8,(a1)+	; ddfstop = $00b8
	move.l	#$01028888,(a1)+	; bplcon1 = $8888
	move.l	#$0108fff8,(a1)+	; bpl1mod = $fff8
	move.l	#$010afff8,(a1)+	; bpl2mod = $fff8
	move.l	#$01e42100,(a1)+	; diwhigh = $2100
	move.l	#$01fc0003,(a1)+	; fmode   = $0003

	move.l	a0,d1
	move.w	#$00e0,d2		; d2.w = first planes' high-pointer
	moveq	#8-1,d7			; do 8 bitplanes
ploop:
	move.w	d2,(a1)+		; place this planes' high-pointer
	addq	#2,d2			; d2.w = low-pointer
	swap.w	d1			; d1.w = high-adres
	move.w	d1,(a1)+		; place high-adres

	move.w	d2,(a1)+		; place this planes' low-pointer
	addq	#2,d2			; d2.w = next planes' high-pointer
	swap.w	d1			; d1.w = low-adres
	move.w	d1,(a1)+		; place low-adres

	add.l	d0,d1			; goto next bitplane
	dbf	d7,ploop		; loop

; fill rest of copper with color-bank-fills (and do adres-table meanwhile):
	move.l	#$00020000,d4		; next color add
	move.l	#$2007fffe,d2		; starting row
	move.l	#HIGH_E<<24,d3		; even row add
	move.l	#HIGH_O<<24,d5		; odd row add

	move.l	#(ROWS/2)-1,d6		; do ROWS/2 lines (even & odd)

rloop:
	move.l	d2,(a1)+		; place wait-instruction
	add.l	d3,d2			; next row
	move.l	a1,(a2)+		; place adres in y-adres table

	move.l	#$01060c60,(a1)+	; select bank 0
	move.l	#$01800000,d1
	moveq	#32-1,d7
cloop0:	move.l	d1,(a1)+
	add.l	d4,d1
	dbf	d7,cloop0		; place all 32 colors

	move.l	#$01062c60,(a1)+	; select bank 1
	move.l	#$01800000,d1
	moveq	#32-1,d7
cloop1:	move.l	d1,(a1)+
	add.l	d4,d1
	dbf	d7,cloop1		; place all 32 colors

	move.l	#$01064c60,(a1)+	; select bank 2
	move.l	#$01800000,d1
	moveq	#32-1,d7
cloop2:	move.l	d1,(a1)+
	add.l	d4,d1
	dbf	d7,cloop2		; place all 32 colors

	move.l	d2,(a1)+		; place wait-instruction
	add.l	d5,d2			; next row
	move.l	a1,(a2)+		; place adres in y-adres table

	move.l	#$01068c60,(a1)+	; select bank 4
	move.l	#$01800000,d1
	moveq	#32-1,d7
cloop4:	move.l	d1,(a1)+
	add.l	d4,d1
	dbf	d7,cloop4		; place all 32 colors

	move.l	#$0106ac60,(a1)+	; select bank 5
	move.l	#$01800000,d1
	moveq	#32-1,d7
cloop5:	move.l	d1,(a1)+
	add.l	d4,d1
	dbf	d7,cloop5		; place all 32 colors

	move.l	#$0106cc60,(a1)+	; select bank 6
	move.l	#$01800000,d1
	moveq	#32-1,d7
cloop6:	move.l	d1,(a1)+
	add.l	d4,d1
	dbf	d7,cloop6		; place all 32 colors

  ifeq TEST-1
	move.l	#$01060c60,(a1)+
	move.l	#$01800888,(a1)+	; test time left
  endc

	dbf	d6,rloop

; fill x_offset table:
	moveq	#6,d4			; first offset is 6 (after bank-select)
	moveq	#3-1,d6			; do 3 banks
bloop	moveq	#32-1,d7		; do 32 colors
oloop	move.w	d4,(a3)+		; place offset
	addq	#4,d4			; next offset
	dbf	d7,oloop		; do all offsets

	addq	#4,d4			; skip bank-select statement
	dbf	d6,bloop		; do all banks

; plot pixels in the bitplanes:
pln0:	move.l	a0,a2
	move.l	#(ROWS/2)-1,d7
ylp0:	moveq	#HIGH_E+HIGH_O-1,d6
blp0:	move.l	a2,a3
  ifeq WIDTH-3
	move.l	#$1c71c71c,(a3)+
	move.l	#$71c71c71,(a3)+
	move.l	#$c71c71c7,(a3)+
	move.l	#$1c71c71c,(a3)+
	move.l	#$71c71c71,(a3)+
	move.l	#$c71c71c7,(a3)+
	move.l	#$1c71c71c,(a3)+
	move.l	#$71c71c71,(a3)+
	move.l	#$c71c71c7,(a3)+
  else
	move.l	#$33333333,(a3)+
	move.l	#$33333333,(a3)+
	move.l	#$33333333,(a3)+
	move.l	#$33333333,(a3)+
	move.l	#$33333333,(a3)+
	move.l	#$33333333,(a3)+
  endc
	lea	NEXTROW(a2),a2
	dbf	d6,blp0
	dbf	d7,ylp0
	lea	(a0,d0.l),a0

pln1:	move.l	a0,a2
	move.l	#(ROWS/2)-1,d7
ylp1:	moveq	#HIGH_E+HIGH_O-1,d6
blp1:	move.l	a2,a3
  ifeq WIDTH-3
	move.l	#$03f03f03,(a3)+
	move.l	#$f03f03f0,(a3)+
	move.l	#$3f03f03f,(a3)+
	move.l	#$03f03f03,(a3)+
	move.l	#$f03f03f0,(a3)+
	move.l	#$3f03f03f,(a3)+
	move.l	#$03f03f03,(a3)+
	move.l	#$f03f03f0,(a3)+
	move.l	#$3f03f03f,(a3)+
  else
	move.l	#$0f0f0f0f,(a3)+
	move.l	#$0f0f0f0f,(a3)+
	move.l	#$0f0f0f0f,(a3)+
	move.l	#$0f0f0f0f,(a3)+
	move.l	#$0f0f0f0f,(a3)+
	move.l	#$0f0f0f0f,(a3)+
  endc
	lea	NEXTROW(a2),a2
	dbf	d6,blp1
	dbf	d7,ylp1
	lea	(a0,d0.w),a0

pln2:	move.l	a0,a2
	move.l	#(ROWS/2)-1,d7
ylp2:	moveq	#HIGH_E+HIGH_O-1,d6
blp2:	move.l	a2,a3
  ifeq WIDTH-3
	move.l	#$000fff00,(a3)+
	move.l	#$0fff000f,(a3)+
	move.l	#$ff000fff,(a3)+
	move.l	#$000fff00,(a3)+
	move.l	#$0fff000f,(a3)+
	move.l	#$ff000fff,(a3)+
	move.l	#$000fff00,(a3)+
	move.l	#$0fff000f,(a3)+
	move.l	#$ff000fff,(a3)+
  else
	move.l	#$00ff00ff,(a3)+
	move.l	#$00ff00ff,(a3)+
	move.l	#$00ff00ff,(a3)+
	move.l	#$00ff00ff,(a3)+
	move.l	#$00ff00ff,(a3)+
	move.l	#$00ff00ff,(a3)+
  endc
	lea	NEXTROW(a2),a2
	dbf	d6,blp2
	dbf	d7,ylp2
	lea	(a0,d0.w),a0

pln3:	move.l	a0,a2
	move.l	#(ROWS/2)-1,d7
ylp3:	moveq	#HIGH_E+HIGH_O-1,d6
blp3:	move.l	a2,a3
  ifeq WIDTH-3
	move.l	#$000000ff,(a3)+
	move.l	#$ffff0000,(a3)+
	move.l	#$00ffffff,(a3)+
	move.l	#$000000ff,(a3)+
	move.l	#$ffff0000,(a3)+
	move.l	#$00ffffff,(a3)+
	move.l	#$000000ff,(a3)+
	move.l	#$ffff0000,(a3)+
	move.l	#$00ffffff,(a3)+
  else
	move.l	#$0000ffff,(a3)+
	move.l	#$0000ffff,(a3)+
	move.l	#$0000ffff,(a3)+
	move.l	#$0000ffff,(a3)+
	move.l	#$0000ffff,(a3)+
	move.l	#$0000ffff,(a3)+
  endc
	lea	NEXTROW(a2),a2
	dbf	d6,blp3
	dbf	d7,ylp3
	lea	(a0,d0.w),a0

pln4:	move.l	a0,a2
	move.l	#(ROWS/2)-1,d7
ylp4:	moveq	#HIGH_E+HIGH_O-1,d6
blp4:	move.l	a2,a3
  ifeq WIDTH-3
	move.l	#$00000000,(a3)+
	move.l	#$0000ffff,(a3)+
	move.l	#$ffffffff,(a3)+
	move.l	#$00000000,(a3)+
	move.l	#$0000ffff,(a3)+
	move.l	#$ffffffff,(a3)+
	move.l	#$00000000,(a3)+
	move.l	#$0000ffff,(a3)+
	move.l	#$ffffffff,(a3)+
  else
	move.l	#$00000000,(a3)+
	move.l	#$ffffffff,(a3)+
	move.l	#$00000000,(a3)+
	move.l	#$ffffffff,(a3)+
	move.l	#$00000000,(a3)+
	move.l	#$ffffffff,(a3)+
  endc
	lea	NEXTROW(a2),a2
	dbf	d6,blp4
	dbf	d7,ylp4
	lea	(a0,d0.w),a0

pln5:	move.l	a0,a2
	move.l	#(ROWS/2)-1,d7
ylp5:	moveq	#HIGH_E+HIGH_O-1,d6
blp5:	move.l	a2,a3
	move.l	#$00000000,(a3)+
	move.l	#$00000000,(a3)+
  ifeq WIDTH-3
	move.l	#$00000000,(a3)+
	move.l	#$ffffffff,(a3)+
  endc
	move.l	#$ffffffff,(a3)+
	move.l	#$ffffffff,(a3)+
	move.l	#$00000000,(a3)+
	move.l	#$00000000,(a3)+
  ifeq WIDTH-3
	move.l	#$00000000,(a3)+
  endc
	lea	NEXTROW(a2),a2
	dbf	d6,blp5
	dbf	d7,ylp5
	lea	(a0,d0.w),a0

pln6:	move.l	a0,a2
	move.l	#(ROWS/2)-1,d7
ylp6:	moveq	#HIGH_E+HIGH_O-1,d6
blp6:	move.l	a2,a3
	move.l	#$00000000,(a3)+
	move.l	#$00000000,(a3)+
	move.l	#$00000000,(a3)+
	move.l	#$00000000,(a3)+
  ifeq WIDTH-3
	move.l	#$00000000,(a3)+
	move.l	#$00000000,(a3)+
	move.l	#$ffffffff,(a3)+
  endc
	move.l	#$ffffffff,(a3)+
	move.l	#$ffffffff,(a3)+
	lea	NEXTROW(a2),a2
	dbf	d6,blp6
	dbf	d7,ylp6
	lea	(a0,d0.w),a0

pln7:	move.l	a0,a2
	move.l	#(ROWS/2)-1,d7
ylp7:	moveq	#HIGH_E-1,d6
blp71:	move.l	a2,a3
	move.l	#$00000000,(a3)+
	move.l	#$00000000,(a3)+
	move.l	#$00000000,(a3)+
	move.l	#$00000000,(a3)+
	move.l	#$00000000,(a3)+
	move.l	#$00000000,(a3)+
  ifeq WIDTH-3
	move.l	#$00000000,(a3)+
	move.l	#$00000000,(a3)+
	move.l	#$00000000,(a3)+
  endc
	lea	NEXTROW(a2),a2
	dbf	d6,blp71

	move.l	#HIGH_O-1,d6
blp72:	move.l	a2,a3
	move.l	#$ffffffff,(a3)+
	move.l	#$ffffffff,(a3)+
	move.l	#$ffffffff,(a3)+
	move.l	#$ffffffff,(a3)+
	move.l	#$ffffffff,(a3)+
	move.l	#$ffffffff,(a3)+
  ifeq WIDTH-3
	move.l	#$ffffffff,(a3)+
	move.l	#$ffffffff,(a3)+
	move.l	#$ffffffff,(a3)+
  endc
	lea	NEXTROW(a2),a2
	dbf	d6,blp72
	dbf	d7,ylp7

; end copper-list:
	move.l	#-2,(a1)+
	move.l	#-2,(a1)+
	movem.l	(a7)+,d0-d7/a0-a6

; start de copper with adres in a1:
	move.l	a1,a0

_setcopper:
	move.l	a0,$dff080
	clr.l	$dff088
	rts

_setcolor:
	movem.l	d0/a0/a1,-(a7)

	move.l	_ytab(pc),a0
	move.l	(a0,d1.w*4),a0

	move.l	_xoff(pc),a1
	move.w	(a1,d0.w*2),d0

	move.w	d2,(a0,d0.w)

	movem.l	(a7)+,d0/a0/a1
	rts

_getcolor:
	movem.l	a0/a1,-(a7)

	move.l	_ytab(pc),a0
	move.l	(a0,d1.w*4),a0

	move.l	_xoff(pc),a1
	move.w	(a1,d0.w*2),d0

	move.w	(a0,d0.w),d0

	movem.l	(a7)+,a0/a1
	rts

	END
