	
; This program sets up a 1 bit plane screen and then uses hardware scroll
;to move through the first half meg of memory letting you view any screens
;left by a previous program. As you can see the only difference between
;this and the 1bitplane program is the small routine to scroll through
;memory. Use the keys as explained below to scroll the screen.
; 
;		Action   	Key
;		------------------------------
;		scroll up	ctrl
;		scroll down	left shift
;		scroll left	left alt
;		scroll right	left amiga key
;
;If you get bored you can quit by pressing the left mouse button.

start

; Reserve memory for copper list and one bit plane

		move.l		execbase,a6	a6-->exec lib
		move.l		#40*256,d0	d0=size of bitplane
		moveq.l		#chip,d1	make sure its chip ram
		jsr		allocmem(a6)	get memory
		move.l		d0,bpl1		save pointer
		beq		quit_fast	leave if error
		move.l		#80,d0		d0=size of copper list
		moveq.l		#chip,d1	make sure its chip ram
		jsr		allocmem(a6)	get memory
		move.l		d0,clist	save pointer
		beq		quit		leave if error
	
; Build copper list

		move.l		d0,a0		a0-->copper list
		move.l		#bpl1pth,d1	d1-->DMA register
		move.w		d1,(a0)+	write into copper list
		move.l		bpl1,d0		d0-->bit plane
		swap		d0		get MSB of address
		move.w		d0,(a0)+	write into copper list
		move.l		#bpl1ptl,d1	d1-->DMA register
		move.w		d1,(a0)+	write into copper list
		swap		d0		get LSB of address
		move.w		d0,(a0)+	write into copper list
		move.l		#$fffffffe,d0	end of copper list
		move.l		d0,(a0)		write into copper list
	
; DMA off and o/s out

		jsr		forbid(a6)	switch out o/s
		lea		$dff000,a5	a5-->1st DMA register
		move.w		#$01e0,dmacon(a5) stop DMA
	
; Initialise copper list

		move.l		clist,cop1lc(a5) copper DMA-->our list
		clr.w		copjmp1(a5)	 start our list
	
; Initialise bitplane

		move.w		#$3081,diwstrt(a5) start of our screen
		move.w		#$f4c1,diwstop(a5) end of our screen
		move.w		#$0038,ddfstrt(a5) start of DMA
		move.w		#$00d0,ddfstop(a5) end of DMA
		move.w		#%0001001000000000,bplcon0(a5) 1 bitplane
		clr.w		bplcon1(a5)	no scroll
		clr.w		bplcon2(a5)	no priority
		clr.w		bpl1mod(a5)	no modulo
		clr.w		bpl2mod(a5)	no modulo
		move.w		#$8380,dmacon(a5)   enable DMA
		
; Clear this bit plane

		move.l		bpl1,a0		a0-->bitmap
		move.w		#(10*256)-1,d2	d2=counter
		moveq.l		#0,d0		use d0 to clr bitmap
clrloop		move.l		d0,(a0)+	blank next piece
		dbra		d2,clrloop	loop back until finished



; Scroll through memory

		moveq.l		#0,d0		d0-->start of bitplane
		move.l		clist,a0	a0-->address of copper list
loop		move.l		vposr(a5),d2	d1=beam position
		and.l		#$0001ff00,d2	mask vert. position
		cmp.l		#$00001000,d2	on line 16?
		bne		loop		if not loop back and wait
scrllp		swap		d0		get MSB of bitplane addr
		move.w		d0,2(a0)	write into copper list
		swap		d0		get LSB of bitplane addr
		move.w		d0,6(a0)	write into copperlist
nloop		move.b		$bfec01,d1	d1=special keys
		cmpi.b		#$33,d1		right amiga pressed ?
		beq		left		if so jump to handler
		cmpi.b		#$3f,d1		shift left pressed ?
		beq		down		if so jump to handler
		cmpi.b		#$37,d1		alt key pressed ?
		beq		right		if so jump to handler
		cmpi.b		#$39,d1		ctrl key pressed ?
		beq		up		if so jump to handler
		btst		#6,ciaapra	test left mouse button
		bne		nloop		loop back if not pressed
		bra		letsgo		else finish 
	
left		subi.l		#1,d0
		bra		loop
down		addi.l		#40,d0
		bra		loop
up		subi.l		#40,d0
		bra		loop
right		addi.l		#1,d0
		bra		loop
; Activate system copper list

letsgo		move.l		#grname,a1	a1-->library name
 		moveq.l		#0,d0		any version
		jsr		openlibrary(a6) open graphics lib
		move.l		d0,a4		a4-->graphics lib
		move.l		startlist(a4),cop1lc(a5) DMA-->sys list
		clr.w		copjmp1(a5)	start sys list
		move.w		#$83e0,dmacon(a5) enable all DMA
		jsr		permit(a6)	bring back o/s
	
; Give reserved memory back to system

		move.l		clist,a1	a1-->mem to free
		move.l		#80,d0		d0=size of mem chunk
		jsr		freemem(a6)	free it
	
quit		move.l		bpl1,a1		a1-->mem to free
		move.l		#40*256,d0	d0=size of mem chunk
		jsr		freemem(a6)	free it
	
quit_fast	rts

; Program variable area

clist		dc.l		0
bpl1		dc.l		0
grname		dc.b		'graphics.library',0
		even

;CHIP REGISTERS

intena		=		$9a
intreq		=		$1e
dmacon		=		$96
dmaconr		=		$2
color00		=		$180
vhposr		=		$6
vposr		=		$4

;COPPER REGISTERS

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

;BITPLANE REGISTERS

bplcon0		=		$100
bplcon1		=		$102
bplcon2		=		$104
bpl1pth		=		$0e0
bpl1ptl		=		$0e2
bpl1mod		=		$108
bpl2mod		=		$10a
diwstrt		=		$08e
diwstop		=		$090
ddfstrt		=		$092
ddfstop		=		$094

;EXEC LIB. OFFSETS

openlibrary	=		-30-522
forbid		=		-30-102
permit		=		-30-108
allocmem	=		-30-168
freemem		=		-30-180

;GRAPHICS LIB. OFFSETS

startlist	=		38

;OTHER STUFF

execbase	=		$4
chip		=		$2
ciaapra		=		$bfe001
		end

