; 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