
; Listing3d.s	; BALK, DIE OP EN NEER GAAT

; 	In deze listing wordt een label als FLAG gebruikt, dus als Signaal
;	of onze balk stijgen of dalen moet. Analyseer dit programma zeer
;	goed.

	SECTION	VerloopCOP,CODE	; Fast is OK

Begin:
	move.l	4.w,a6	    ; Execbase in a6
	jsr	-$78(a6)    ; Disable - stopt Multitasking
	lea	GfxName,a1  
	jsr	-$198(a6)   
	move.l	d0,GfxBase
	move.l	d0,a6
	move.l	$26(a6),OldCop
	move.l	#COPPERLIST,$dff080
	move.w	d0,$dff088	
mouse:	 
	cmpi.b	#$ff,$dff006	; VHPOSR - Zijn we bij lijn 255 aangekomen?
	bne.s	mouse		; Zo niet,ga niet verder

	bsr.s	BeweegCopper	; De eerste beweging op het scherm!
				; Deze subroutine laat de WAIT zakken!
				; Ze wordt 1 keer per Frame uitgevoerd,
				; want de bsr.s BeweegCopper wordt maar
				; 50 keer per seconde opgeroepen.

Wacht:			; Zitten we nog op lijn $FF? 

	cmpi.b	#$ff,$dff006 ; Zitten we nog op lijn $FF? Zo ja,wacht dan op
	beq.s	Wacht	     ; het volgende Frame (lijn 00). Anders wordt
			     ; BeweegCopper weer uitgevoerd. Dit probleem
			     ; bestaat alleen bij zeer korte & snelle
			     ; programma's.

	btst	#6,$bfe001	; linker Muisknop gedrukt?
	bne.s	mouse		; zo niet, terug naar mouse.

	move.l	OldCop(PC),$dff080  
	move.w	d0,$dff088	    

	move.l	4.w,a6
	jsr	-$7e(a6)	; Enable 
	move.l	GfxBase(PC),a1	
				
	jsr	-$19e(a6)	; Closelibrary 
	rts	

;	Met deze routine bewegen we een balk van 10 Wait's naar beneden:

BeweegCopper:
	Lea	Balk,a0		;in a0 komt het adres van Balk
	Tst	OpNeer		;Moeten we omhoog of omlaag? Als OpNeer
				;0 is moeten we naar Beneden,anders naar
				;Boven.
	beq	Omlaag
	
	cmpi.b	#$82,8*9(a0)	;Zijn we bij lijn 82 aangekomen?
	beq	ZetOmlaag	;Zo ja, dan zijn we boven aangekomen, en
				;moeten we naar beneden.
				
	subq.b	#1,(a0)	   ; Wait 1 veranderen (zonder offset)
	subq.b	#1,8(a0)   ; Nu veranderen we alle andere wait's: De offsets
	subq.b	#1,8*2(a0) ; tussen 1 wait en de andere bedraagt 
	subq.b	#1,8*3(a0) ; 8 Byte, want dc.w $xx07,$FFFE,$180,$xxxx
	subq.b	#1,8*4(a0) ; is een Long.Als we dan een offset gebruiken 
	subq.b	#1,8*5(a0) ; van 8 verandert de eerste wait. Daarna 
	subq.b	#1,8*6(a0) ; gebruiken we een stap van 8 om de volgende
	subq.b	#1,8*7(a0) ; lijn te vinden.
	subq.b	#1,8*8(a0) ; 
	subq.b	#1,8*9(a0) ; Laatste wait.
	rts

ZetOmlaag:
	clr.b	OpNeer		;Zet Opneer op 0.
	rts
Omlaag:
	cmpi.b	#$fc,8*9(a0)	;zijn we bij lijn $fc aangekomen?
	beq	ZetOmhoog
	addq.b	#1,(a0)		; steigen
	addq.b	#1,8(a0)
	addq.b	#1,8*2(a0)
	addq.b	#1,8*3(a0)
	addq.b	#1,8*4(a0)
	addq.b	#1,8*5(a0)
	addq.b	#1,8*6(a0)
	addq.b	#1,8*7(a0)
	addq.b	#1,8*8(a0)
	addq.b	#1,8*9(a0)
	rts

ZetOmhoog:
	move.b	#$ff,OpNeer
	rts

;Deze byte die we OpNeer genoemd hebben, is een FLAG. Een FLAG is een soort
;schakelaar met 2 toestanden, 1 en 0 of omhoog en omlaag, of true en false.
;Is de Flag 0, dan moeten we naar beneden, is de flag $FF dan moeten we
;naar boven...

;	DATA...

OpNeer:
	dc.b	0,0

GfxName:
	dc.b	"graphics.library",0,0	

GfxBase:	   
	dc.l	0  

OldCop:		 
	dc.l	0	

	SECTION GRAPHIC,DATA_C	; COPPERLIST MOET IN CHIP RAM!

COPPERLIST:
	dc.w	$100,$200	; BPLCON0
	dc.w	$180,$000	; COLOR0 - Begin de COP met Zwart
	dc.w	$4907,$FFFE	
	dc.w	$180,$001	
	dc.w	$4a07,$FFFE	
	dc.w	$180,$002	
	dc.w	$4b07,$FFFE	
	dc.w	$180,$003	
	dc.w	$4c07,$FFFE	
	dc.w	$180,$004	
	dc.w	$4d07,$FFFE	
	dc.w	$180,$005	
	dc.w	$4e07,$FFFE	
	dc.w	$180,$006	
	dc.w	$5007,$FFFE	
	dc.w	$180,$007	
	dc.w	$5207,$FFFE	
	dc.w	$180,$008	
	dc.w	$5507,$FFFE	
	dc.w	$180,$009	
	dc.w	$5807,$FFFE	
	dc.w	$180,$00a	
	dc.w	$5b07,$FFFE	
	dc.w	$180,$00b	
	dc.w	$5e07,$FFFE	
	dc.w	$180,$00c	
	dc.w	$6207,$FFFE	
	dc.w	$180,$00d	
	dc.w	$6707,$FFFE	
	dc.w	$180,$00e	
	dc.w	$6d07,$FFFE	
	dc.w	$180,$00f	
	dc.w	$780f,$FFFE	
	dc.w	$180,$000	; Kleur Zwart

BALK:
	dc.w	$7907,$FFFE	
	dc.w	$180,$300	
	dc.w	$7a07,$FFFE	
	dc.w	$180,$600	
	dc.w	$7b07,$FFFE
	dc.w	$180,$900
	dc.w	$7c07,$FFFE
	dc.w	$180,$c00	  
	dc.w	$7d07,$FFFE
	dc.w	$180,$f00	
	dc.w	$7e07,$FFFE
	dc.w	$180,$c00	
	dc.w	$7f07,$FFFE
	dc.w	$180,$900	
	dc.w	$8007,$FFFE
	dc.w	$180,$600	
	dc.w	$8107,$FFFE
	dc.w	$180,$300	
	dc.w	$8207,$FFFE
	dc.w	$180,$000	

	dc.w	$fd07,$FFFE	
	dc.w	$180,$00a	
	dc.w	$fe07,$FFFE	
	dc.w	$180,$00f	
	dc.w	$FFFF,$FFFE	; EINDE VAN DE COPPERLIST

	end

Nu gaat de balk omhoog en omlaag. We zijn daarbij geholpen door een Label
dat wij OpNeer hebben genoemd, en dat ons aangeeft welke kant we op moeten.
Dit noemen we een FLAG.
Nog wat aanpassingen: Laten we eens de timing weghalen, en zie wat er 
gebeurt: De balk wordt dol! En zeker op een snelle computer! Dat doen we zo:

mouse:	 
	cmpi.b	#$ff,$dff006	; VHPOSR - Zijn we bij lijn 255 aangekomen?
;	bne.s	mouse		; Zo niet,ga niet verder

	bsr.s	BeweegCopper	; De eerste beweging op het scherm!
				; Deze subroutine laat de WAIT zakken!
				; Ze wordt 1 keer per Frame uitgevoerd,
				; want de bsr.s BeweegCopper wordt maar
				; 50 keer per seconde opgeroepen.

Wacht:			; Zitten we nog op lijn $FF? 

	cmpi.b	#$ff,$dff006 ; Zitten we nog op lijn $FF? Zo ja,wacht dan op
;	beq.s	Wacht	     ; het volgende Frame (lijn 00). Anders wordt
			     ; BeweegCopper weer uitgevoerd. Dit probleem
			     ; bestaat alleen bij zeer korte & snelle
			     ; programma's.

door simpelweg twee ;'s ervoor te zetten! Tot in de volgende listing!