

** CODE		SIMPLE BOBS
** CODER	MARC.B

**THANK'S TO MARK FOR HIS BLITTER EXPLINATION**

; this code displays the individual planes that are combined to
; make the finished bob	, then just fills the screen with
; the complete bob.		
	   
*****************************************
*	   SYSTEM OFFSETS		*
*****************************************

execbase	equ	4
openlibrary	equ	-408
closelibrary	equ	-414
allocmem	equ	-198
freemem		equ	-210
forbid		equ	-132
permit		equ	-138
copymem		equ	-624


*********************************
*	 CONSTANTS		*
*********************************

chip		equ	2
clear		equ	$10000
bob_size	equ	96*5
bob_dest	equ	40*10


*********************************
*	INCLUDE FILES		*
*********************************

	include	source:include/hardware.i

	lea	$dff000,a5			;custom base address
	move.l	#40*256+4,plane_size		;set plane size plus offset


**********************************************************
*	OPEN GFX LIBRARY AND SAVE SYSTEM COPPER		 *
**********************************************************

	move.l	execbase,a6
	move.l	#gfxname,a1
	moveq	#0,d0
	jsr	openlibrary(a6)
	tst	d0			
	beq	the_end			
	move.l	d0,gfxbase		
	move.l	d0,a0			;put gfxbase in a0 
	move.l	38(a0),systemcopper	;save the copper address 


****************************************************
*	ALLOCATE MEMORY FOR BIT PLANES		   *
****************************************************

	move.l	execbase,a6
	move.l	#(320/8*256)*5,d0	;memory for 5 bitplanes
	move.l	#chip+clear,d1		;chip memory and wipe it 
	jsr	allocmem(a6)
	tst	d0			;fail 
	beq	exit			;yep 
	move.l	d0,bitbase		;save  pointer


*******************************************************
*	  ALLOCATE MEMORY FOR BOB		      *
*******************************************************

	move.l	execbase,a6
	move.l	#bob_size*5,d0			;total bytes needed
	move.l	#chip+clear,d1
	jsr	allocmem(a6)			;get the memory
	tst	d0				;course it worked
	beq	clean_up			;no it didn't
	move.l	d0,bob_base			;save bob address

******************************************************
*		COPY BOB TO CHIP RAM		     *
******************************************************

	move.l	execbase,a6
	lea	bob,a0		;address of bob data
	move.l	bob_base,a1	;destination address of bob data
	move.l	#bob_size,d0	;length of bob data
	jsr	copymem(a6)	;copy data !!!



*****************************************************************
*	LOAD BITPLANE AND SPRITE POINTERS INTO COPPER LIST      *
*****************************************************************


	move.l	bitbase,d0
	lea	copper,a0
	move.w	d0,6(a0)	;load bitplane pointers into c list
	swap	d0
	move.w	d0,2(a0)
	swap	d0
	add.l	#$2800,d0
	move.w	d0,14(a0)
	swap	d0
	move.w	d0,10(a0)
	swap d0
	add.l	#$2800,d0
	move.w	d0,22(a0)
	swap	d0
	move.w	d0,18(a0)
	swap d0
	add.l	#$2800,d0
	move.w	d0,30(a0)
	swap	d0
	move.w	d0,26(a0)
	swap d0
	add.l	#$2800,d0
	move.w	d0,38(a0)
	swap	d0
	move.w	d0,34(a0)
	clr.l	d0
	

***************************************************************
*		START CUSTOM COPPER LIST		      *
***************************************************************	

	move.l	#copper,COP1LCH(a5)
	move.l	#0,COPJMP1(a5)
	move.l	execbase,a6
	jsr	forbid(a6)
	clr.l	d5
	move.l	#bob_dest,d3

*************************************************************
*		    MAIN CODE LOOP    			    *
*************************************************************

wait
	move.l	VPOSR(a5),d0	;read current beam position
	and.l	#$0001ff00,d0	;mask all but the vertical pos
	lsr.l	#8,d0		
	cmp.w	#$0106,d0	;wait for end of display
	bne	wait
	btst	#6,CIAAPRA	;check left mouse button
	beq	clean_up	;end if pressed
	cmp.b	#$f,finished	;check	end of blit flag
	beq	wait		;yes then wait

blit_screen
	
	bsr	blitter
	cmp.l	#40*256+4,plane_size	;done seperated planes
	beq	full_width		;yes then back to normal
	add.w	#4,d5			;increment x pos of bob
	cmp.w	#40,d5			;test if at end of display
	bge	full_width		;yes then alter pointers
	bra	wait

**********************************************************
*			RESTORE SYSTEM 			 *
**********************************************************

clean_up
	move.l	systemcopper,COP1LCH(a5)
	move.l	#0,COPJMP1(a5)
	move.l	execbase,a6
	jsr	permit(a6)
	move.l	execbase,a6		  
	move.l	#bob_size*5,d0
	move.l	bob_base,a1
	jsr	freemem(a6)
	move.l	execbase,a6		;free bitplane memory
	move.l	#(320/8*256)*5,d0
	move.l	bitbase,a1
	jsr	freemem(a6)

exit
	move.l	gfxbase,a1		;close the graphics library
	move.l	execbase,a6
	jsr	closelibrary(a6)
	
the_end
	rts				;exit from program

	
************************************************************
*		BLITTER OPERATION			   *
************************************************************

blitter

	move.l	#4,d7			;number of planes
	move.l	bob_base,a2		;base address of bob
	move.l	bitbase,a3		;base address of screen
	add.l	d3,a3			;where on the screen
	add.l	d5,a3
	
blitter_loop
	bsr 	blit_bob
	add.l	#96,a2			;find next bob plane
	add.l	plane_size,a3		;find next screen plane
	dbra	d7,blitter_loop		;do 'till end
	
	rts

blit_bob
	bsr	blitter_busy		;check blitter status
	move.l	a2,BLTAPTH(a5)		;DMA a pointer (bob)
	move.l	a3,BLTDPTH(a5)		;DMA d pointer (screen)
	move.w	#0,BLTAMOD(a5)		;no bob offset
	move.w	#40-4,BLTDMOD(a5)	;set screen offset
	move.l	#$09f00000,BLTCON0(a5)	;set blitter DMA
	move.w	#0,BLTCON1(a5)
	move.w	#$ffff,BLTAFWM(a5)	;no mask
	move.w	#$ffff,BLTALWM(a5)	;no mask
	move.w	#$602,BLTSIZE(a5)	;start blitter
	rts

blitter_busy
	btst	#14,DMACONR(a5)		;blitter working ?
	bne	blitter_busy		;yes then wait......
	rts				;no GET ON WITH IT !!!

full_width

	move.l	#40*256,plane_size	;reset plane size to normal
	clr.l	d5			;reset x position
	add.w	#1040,d3		;move down screen by 26 lines	
	cmp.w	#9040,d3		;reached bottom ?
	bge	blitter_done		;yes end blitter op
	bra	wait

blitter_done	
	move.b	#$f,finished		;set blitter finished flag
	bra	wait


***********************************************************
*		   CUSTOM COPPER LIST			  *
***********************************************************


	SECTION		copper.list,CODE_C
copper
	dc.w	BPL1PTH,0000		;next 4 blank words
	dc.w	BPL1PTL,0000		;are where we load
	dc.w	BPL2PTH,0000		;the bitplane pointers
	dc.w	BPL2PTL,0000
	dc.w	BPL3PTH,0000
	dc.w	BPL3PTL,0000
	dc.w	BPL4PTH,0000
	dc.w	BPL4PTL,0000
	dc.w	BPL5PTH,0000
	dc.w	BPL5PTL,0000
	dc.w	SPR0PTH,0000
	dc.w	SPR0PTL,0000		;sprite 0 pointer
	dc.w	SPR1PTH,0000
	dc.w	SPR1PTL,0000		;sprite 1 pointer
	dc.w	SPR2PTH,0000
	dc.w	SPR2PTL,0000		;sprite 2 pointer
	dc.w	SPR3PTH,0000
	dc.w	SPR3PTL,0000		;sprite 3 pointer
	dc.w	SPR4PTH,0000
	dc.w	SPR4PTL,0000		;sprite 4 pointer
	dc.w	SPR5PTH,0000
	dc.w	SPR5PTL,0000		;sprite 5 pointer
	dc.w	SPR6PTH,0000
	dc.w	SPR6PTL,0000		;sprite 6 pointer
	dc.w	SPR7PTH,0000
	dc.w	SPR7PTL,0000		;sprite 7 pointer
	dc.l 	$2b01fffe		;wait for line 43
	dc.w	DIWSTRT,$2c81		;where we start displaying
	dc.w	DIWSTOP,$2cc1		;where we stop!
	dc.w	BPLCON0,$5200		;this is for Amiga 1000 owners
	dc.w	BPLCON2,$0024		
	dc.w	DDFSTRT,$0038		;where to start the horizontal display
	dc.w	DDFSTOP,$00d0		;and where we stop
	dc.w	BPLCON1,$0000
	dc.w	BPL1MOD,$0000		;not a scroller
	dc.w	BPL2MOD,$0000		;so these are blank

color_map
	dc.w	COLOR00,$0000		;background colour black
	dc.w	COLOR01,$0fff		;colour 1 
	dc.w	COLOR02,$0e00		;colour 2 
	dc.w	COLOR03,$00a1		;colour 3 
	dc.w	COLOR04,$0d80
	dc.w	COLOR05,$0c70
	dc.w	COLOR06,$0c71
	dc.w	COLOR07,$0b61
	dc.w	COLOR08,$0b62
	dc.w	COLOR09,$0a52
	dc.w	COLOR10,$0a52
	dc.w	COLOR11,$0000
	dc.w	COLOR12,$001d
	dc.w	COLOR13,$0f00
	dc.w	COLOR14,$0f32
	dc.w	COLOR15,$0f53
	dc.w	COLOR16,$0000
	dc.w	COLOR17,$0888
	dc.w	COLOR18,$06f8
	dc.w	COLOR19,$0fca
	dc.w	COLOR20,$0333
	dc.w	COLOR21,$0444
	dc.w	COLOR22,$0555
	dc.w	COLOR23,$0666
	dc.w	COLOR24,$0777
	dc.w	COLOR25,$0888
	dc.w	COLOR26,$0999
	dc.w	COLOR27,$0aaa
	dc.w	COLOR28,$0ccc
	dc.w	COLOR29,$0ddd
	dc.w	COLOR30,$0eee
	dc.w	COLOR31,$06f8
	
	
	dc.l	$fffffffe		;wait for the impossible
endcopper

copperlen	equ	endcopper-copper

	
************************************************************
*			VARIABLES	 		   *
************************************************************


gfxbase		dc.l 0
bitbase		dc.l 0
systemcopper	dc.l 0
bob_base	dc.l 0
plane_size	dc.l 0
finished	dc.b 0
gfxname		dc.b 'graphics.library',0


bob	incbin 	graphics/alien.s

end
	
