	opt c+,d+
	
; *** demo for the extra half bright mode ***

; custom chip register

intena	= $9a	
dmacon	= $96
colour00	= $180
vhposr	= $6

; copper register

cop1lc	= $80
cop2lc	= $84
copjmp1	= $88
copjmp2	= $8a

; bitplane register

bplcon0	= $100	; bitplane control reg. 0
bplcon1	= $102	; 1 (scroll vale)
bplcon2	= $104	; 2 (sprite<>playfield priority)
bpl1pth	= $e0	; no. of 1 bitplane
bpl1ptl	= $e2
bpl1mod	= $108	; modulo fo odd bitplanes
bpl2mod	= $10a	; modulo for even bitplanes
diwstrt	= $8e	; start of the screen windows
diwstop	= $90	; end of screen windows
ddfstrt	= $92	; bitplane dma start
ddfstop	= $94	; bitplane dma stop

; cia port reg. a (mouse button)

ciaapra	= $bfe001

; exec library base offsets

openlib	= -30-552
forbid	= -30-102
permit	= -30-108
allocmem	= -30-168
freemem	= -30-180

; graphics base

startlist	= 38

; other labels

execbase	= 4
planesize	= 40*200	; size of bitplane
clsize	= 13*4	; copper list with 13 commands
chip	= 2	; chip-ram request
clear	= chip+$10000	; clear previous chip-ram

; *** initialise program ***

start:

; request memory for bitplanes

	move.l execbase,a6
	move.l #planesize*6,d0
	move.l #clear,d1
	jsr allocmem(a6)
	move.l d0,planeadr
	beq end

; request memory for copper list

	moveq #clsize,d0
	moveq #chip,d1
	jsr allocmem(a6)
	move.l d0,cladr
	beq freeplane
	
; build copperlist
	moveq #5,d4
	move.l d0,a0
	move.l planeadr,d1
	move.w #bpl1pth,d3
makecl:	move.w d3,(a0)+ 
	addq.w #2,d3
	swap d1
	move.w d1,(a0)+
	move.w d3,(a0)+
	addq.w #2,d3
	swap d1
	move.w d1,(a0)+
	add.l #planesize,d1
	dbf d4,makecl
	move.l #$fffffffe,(a0)
	
; *** main program ***

; dma and task switching off

	jsr forbid(a6)
	lea $dff000,a5
	move.w #$03e0,dmacon(a5)
	
; copper initialisation

	move.l cladr,cop1lc(a5)
	clr.w copjmp1(a5)
	
; colour table with different colour fills

	moveq #31,d0
	lea colour00(a5),a1
	moveq #1,d1
settab:	move.w d1,(a1)+
	mulu #3,d1
	dbf d0,settab
	
; playfield initialisation 

	move.w #$3081,diwstrt(a5)
	move.w #$30c1,diwstop(a5)
	move.w #$0038,ddfstrt(a5)
	move.w #$00d0,ddfstop(a5)
	move.w #%0110001000000000,bplcon0(a5)
	clr.w bplcon1(a5)
	clr.w bplcon2(a5)
	clr.w bpl1mod(a5)
	clr.w bpl2mod(a5)
	
; dma on

	move.w #$8380,dmacon(a5)
	
; bitplane modification

	moveq #40,d5
	clr.l d2
loop:	clr.l d0
	move.w vhposr(a5),d0
	and.w #$3ffe,d0
	cmp.w #$2580,d0
	bcs continue
	and.w #$1ffe,d0
continue:	move.l planeadr,a4
	add.l d0,a4
	moveq #5,d4
	move.l d2,d3
block:
	clr.l d0
	lsr #1,d3
	negx.w d1
	moveq #15,d0
	move.l a4,a3
fill:
	move.w d1,(a3)
	add.l d5,a3
	dbf d0,fill
	
	add.l #planesize,a4
	dbf d4,block
	
	addq.b #1,d2
	btst #6,ciaapra
	bne loop
	
; *** end program ***

	move.l gfxname,a1
	clr.l d0
	jsr openlib(a6)
	move.l d0,a4
	move.l startlist(a4),cop1lc(a5)
	clr.w copjmp1(a5)
	move.w #$8060,dmacon(a5)
	jsr permit(a6)
	
; free memory for copper list

	move.l cladr,a1
	moveq #clsize,d0
	jsr freemem(a6)
	
; free memory for bitplanes

freeplane:
	move.l planeadr,a1
	move.l #planesize*6,d0
	jsr freemem(a6)
	
end:
	clr.l d0
	rts
	
; variables

cladr:	dc.l 0
planeadr:	dc.l 0

; constants

gfxname:	dc.b 'graphics.library',0

	
