; 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