
; Listing2l.s

Begin:
	lea	$dff000,a0	; gib $dff000 in a0
Waitmouse:
	move.w	#$20,$1dc(a0)	; BEAMCON0 (ECS+) resolutie video PAL
	bsr.s	Flikker		; Subroutine om beeldscherm te laten 
				; flikkeren.
	bsr.s	Kleurloop	; Laat de Muispointer flikkeren.
	btst	#2,$16(a0)	; POTINP - Rechter Muisknop gedrukt?
				; (bit 2 im $dff016)
	bne.s	NietGedrukt	; Zo nee,spring naar NietGedrukt
	bsr.s	Chaos		; Zo ja,spring naar Chaos
NietGedrukt:
	btst	#6,$bfe001	; Linker Muisknop gedrukt?
	bne.s	Waitmouse	; Zo niet,spring naar waitmouse.
	rts			; Einde


Kleurloop:
	moveq	#-1,d1		; dus moveq #$FFFFFFFF,d1
	moveq	#20-1,d0	; Aantal flikkerkleuren-cycli
flash:
	subq.w	#8,d1		; verander de kleur die in $dff1a4 staat
	move.w	d1,$1a4(a0)	; COLOR18 - geef de waarde van d1 in $dff1a4
				; (= Kleur van de muispointer)
	dbra	d0,flash
	rts

Flikker:
	move.w	6(a0),$180(a0)	; Geef de .w-Waarde van $dff006 in COLOR0
	move.b	6(a0),$182(a0)	; Geef de .b-Waarde van $dff006 in COLOR1
	rts

Chaos:
	move.w	#0,$1dc(a0)	; BEAMCON0 (ECS+) Resolutie video NTSC
	rts

	END

Dit programma is alleen vanwege zijn structuur interessant, omdat het een
hoofdprogramma heeft (Van Begin: tot RTS) dat SubRoutines aanroept (Dus 
delen van een programma die met een Label worden aangegeven en met RTS
(ReTurn from Subroutine) eindigen). Haal dit programma evt. door een 
debugger als u de werking niet begrijpt.

Het fundamentele probleem v.d. BSR/BEQ/BNE/RTS structuren ligt daarin dat
alles door sprongen geregeld is,en waarna men met een RTS terug keert of
naar een nog 'diepere' subroutine springt. Een subroutine kan dus een 
andere subroutine aanroepen.

Tak 1
		   _______ _ _ ect ect _ _ _  RTS, Einde van de weg
  Ga naar beq/bne /
   ______________/
		 \ Tak 2
		  \______ _ _ etc etc _ _ _ _ RTS, Einde van de weg

Een BEQ/BNE-sprong is als een beslissing of men naar Amsterdam of naar
Rotterdam rijden zal. Men moet andere wegen volgen, en eenmaal daargekomen
moeten we terug.
Als we een BSR.w Amsterdam tegenkomen, dan springen we naar Amsterdam, 
voeren daar de bevelen uit die we tegenkomen, en 'beamen' onszelf op 
magische wijze weer terug naar waar we vandaan komen.

Opmerking 1: Door het indrukken van de rechter-muisknop wordt een routine
aangeroepen die we anders overslaan:

	....
	....
	....
	btst	#2,$16(a0)	; POTINP - Rechter Muisknop gedrukt?
				; (bit 2 im $dff016)
	bne.s	NietGedrukt	; Zo nee,spring naar NietGedrukt
	bsr.s	Chaos		; Zo ja,spring naar Chaos
NietGedrukt:
	....
	....
	....
	
Onthoud goed deze vorm om een routine aan te roepen als aan een bepaalde
voorwaarde is voldaan (b.v. de rechter muisknop is ingedrukt, of een teller
heeft een bepaalde waarde bereikt enz.. enz..).

Bij programmeren komen zulke dingen vaak voor. 
Het register dat we bij CHAOS gebruiken is $dff1dc, waarvan bit 5 dient om
tussen de PAL (europa) en NTSC (amerika) stand te schakelen. Dit register
bestaat alleen in computers (Amiga's!) die na 1989 werden gemaakt. Als we nu
op de rechter muisknop drukken,lijkt het beeld te 'exploderen' (na ja..)
omdat er veel kleuren flikkeren, en er zer snel tussen NTSC en PAL stand 
wordt heen en weer geschakeld. Als u een programma schrijft dat tussen
PAL en NTSC schakeltm dan moet u het volgende doen:

	move.w	#0,$dff1dc	; BEAMCON0
	rts

Bovenstaande schakelt naar NTSC stand en:

	move.w	#$20,$dff1dc	; BEAMCON0
	rts

schakelt naar PAL stand.

Als u hier al problemen mee heeft om de listing te begrijpen, dan probeer
hem a.u.b. 100% te begrijpen. Onthoud wel dat 'echte' programma's 1000-en
malen ingewikkelder zijn omdat ze vele sub-routines gebruiken.
Door naar les 3.txt!

