All pastes #10744 Raw Edit

Untitled

public text v1 · immutable
#10744 ·published 2005-05-02 00:06 UTC
rendered paste body
; 1. INITIALISATIE

		move	#$6000,A7		; begin het programma op adres $6000
		move.l	#41,-(A7)		; sla aantal personen (= lengte invoertabel en uitvoertabel) op
		move.l	(A7),D0			; sla kopie van aantal personen op in D0
		move.l	#7,-(A7)		; sla periode op
		move.l  (A7),D1			; sla kopie van periode op in D1
		move.l	#1,-(A7)		; stel startpersoon in (tussen 1 en D0)
		sub.l	#1,D1			; verminder de periode met 1


; 2. AANMAAK VAN DE INVOERTABEL

; 2.1. Initialisatie

		lea		$7004,A0		; sla beginadres invoertabel op in A0
		move.l	D0,$7000		; sla lengte invoertabel als eerste element op
		move	A0,D2			; D2 zal telkens verwijzen naar adres buur; stel dit in op de eerste buur
		sub.l	#2,D0			; verminder de teller, die gelijk is aan het aantal personen, initieel met 2:
								; 	* -1: negeer laatste element (zie lager)
								; 	* -1: respecteer constructie lus

; 2.2. Invullen tabel

init	add.l	#4,D2			; genereer verwijzing naar volgende buur door huidige buur met 1 te verhogen
		move.l	D2,(A0)+		; sla verwijzing op in adres waar adresregister naar verwijst en verhoog adres
		sub.l	#1,D0			; verminder teller met 1
		bgt		init			; indien teller groter is dan 0 gaat lus door

		move.l	#$7004,(A0)		; stop beginverwijzing in laatste element van tabel


; 3. AANMAAK VAN DE UITVOERTABEL

; 3.1. Initialisatie

		move.l	(A7),D3			; sla nummer huidige speler op in D3
		sub.l	#1,D3			; verminder dit met 1
		mulu	#4,D3			; vermenigvuldig dit met 4
		add.l	#$7004,D3		; tel hier het eerste adres bij op om het adres te bekomen
		move.l	D3,A2			; sla het op in A2

		move.l	A0,A1			; sla eerste adres uitvoertabel op
		add.l	#8,A1			; verhoog dit adres een weinig, voor zichtbaar onderscheid tussen tabellen

		move.l	$7000,D0		; haal lengte tabel opnieuw op om D0 opnieuw als teller te gebruiken,
								; daar beide tabellen even lang zijn
		sub.l	#1,D0			; verminder teller met 1, om constructie lus te respecteren

; 3.2. Eigenlijke executie van de spelers

dood	move.l	D1,D3			; maak teller voor tweede lus aan, met als waarde periode
		sub.l	#2,D3			; verminder deze teller met 2:
								;	* -1: sla tussenliggende spelers over, dus periode - 1
								; 	* -1: respecteer constructie lus

								; na afloop van volgende lus kennen we het slachtoffer
slaover	move.l	(A2),A2			; huidige speler wordt diens buur
		sub.l	#1,D3			; verminder teller voor periode
		bgt		slaover			; indien teller voor periode groter is dan 0 gaat lus door

		move.l	(A2),D4			; sla het geheugenadres van het slachtoffer op in D4
		sub.l	#$7000,D4		; trek het adres waar de invoertabel begint af van het nummer van het slachtoffer
		divu	#4,D4			; deel dit verschil door 4
		move.l	D4,(A1)+		; sla het getal op in het adres waar A1 naar verwijst en incrementeer A1

		move.l	(A2),A3			; sla buur van huidige speler tijdelijk op
		move.l	(A3),(A2)		; stel buur van huidige speler in op buur van buur van huidige speler; van het
								; slachtoffer is nu geen sprake meer
		move.l	(A2),A2			; ga verder met buur van huidige speler, nl. volgende overlevende

		sub.l	#1,D0			; verminder teller voor aantal executies
		bgt		dood			; indien aantal executies nog niet is bereikt gaat lus door


; 4. EINDE PROGRAMMA

		stop #0
		end