&&------------------------------------------------------------------------------
WERKEN MET DE AMIGA HARDWARE-REGISTERS                                 DEEL 01
------------------------------------------------------------------------------

In deze tekst wil ik een begin maken met een cursus over de hardware-registers
van de Amiga.
We kijken vooral naar de speciale hardware-grapjes waardoor we programma's
sneller kunnen maken. Aan de orde komen b.v. De geheugenverdeling in de Amiga,
DMA, de Copper, de Blitter, Scrollen, Sprites, interrupts en geluid.

De programmeertaal waarin we dit gaan doen is Assembler omdat deze taal de
nodige snelheid bezit die b.v. AmigaBasic niet haalt, ook niet na compileren.
We gebruiken als assembler de Seka-assembler.

Beginnen we met de grondbeginselen. Via Assembler-programmering kun je aller-
lei gegevens veranderen en adresregisters aanpassen, echter kommando's die
direct met de buitenwereld kontakt hebben, zoals Screen On - Play Sound -
Print, zijn er niet. Om die dingen te kunnen doen moeten we direct de daarvoor
aanwezige chips aanspreken.
Alle belangrijke chips in de Amiga zijn net als geheugen aan te spreken. Deze
(hardware)-registers staan op vaste plaatsen in het Amiga geheugen.
De registers in zo'n chip spreken we aan met een bepaalde offset, afstand
vanaf het beginadres van de chip. Willen we b.v. de achtergrondkleur van het
scherm veranderen dan gebruiken we offset $180. Het adres van de gebruikte
chip is $DFF000, het eigenlijke adres wordt dan dus $DFF180.
&&Twee mogelijke assembler-routines zijn dan :

   MOVE #Kleur,$DFF000+$180

of

   LEA $DFF000,A6
   MOVE #Kleur,$180(A6)

De meeste registers zijn alleen te beschrijven, lezen we ze uit dan krijgen we
onzin terug. Dan zijn er nog een paar die precies andersom werken en een
enkele (strobe-registers) die een aktie starten, wat je er ook inzet of
uitleest.

Een aantal registers bevatten een zogenaamd SET/CLR-bit. Dat bit heeft de
volgende funktie :
Als we slechts een deel van het register willen beschrijven en daarbij de niet
gebruikte bits onveranderd willen laten, dan doen we dat met het SET/CLR-bit.
Dit bit is bit 15 van het register. Willen we een bit onveranderd laten dan
geven we die de waarde 0, moet een bit veranderd worden dan krijgt die de
waarde 1. Nu wordt op die plaats waar die 1 staat geen 1 gezet, maar de waarde
van de SET/CLR-bit. Een voorbeeld :

   MOVE #%1000000001000000,$DFF00+Offset

Bit 6 wordt op 1 gezet, alle andere bits blijven onveranderd.
&&Vervangen we bit 15 door een 0 dan wordt het kommando :

   MOVE #%0000000001000000,$DFF00+Offset

Bit 6 wordt op 0 gezet, alle andere bits blijven onveranderd.


Als we een eenvoudige opdracht uitvoeren zijn slechts een paar registers nodig
en duurt het maar even. Willen we iets meer complex doen zoals b.v. het
afspelen van een stuk muziek, dan kost het te veel tijd om steeds de gegevens
aan de chip te geven. Om die reden hebben de custom-chips de mogelijkheid om
zelf iets uit het geheugen te halen of in het geheugen te schrijven. Dat heet
DMA, Direct Memory Acces - directe geheugen- toegang. DMA kan gedaan worden
door : de Blitter, de Copper, de VideoChip en de Diskcontroller.
Wat voor een voordelen heeft nu DMA? Het ontlast de processor. Deze hoeft voor
b.v. het afspelen van een geluids-sampel alleen aan de geluids-chip mee te
delen waar de geluids-sampel staat, hoe snel deze gespeeld moet worden en wat
het volume is. De geluids-chip doet dan de rest, onafhankelijk van de proces-
sor.

Bekijken we als eerste eens de COPPER.

Het doel van de Copper is hoofdzakelijk de processor te ontlasten. Door de
nauwe samenwerking met de video-chip is de Copper in staat te wachten tot een
bepaalde beeldlijn door de video-chip beschreven wordt. Is zo'n beeldlijn
bereikt dan kan via een DMA-tabel b.v. de waarde van een register veranderd
worden.
&&Ook kan de Copper wachten tot de Blitter met een opdracht klaar is en dan de
Blitter de volgende opdracht toespelen.
De Copper heeft slechts een zeer beperkt aantal opdrachten. Elke opdracht is
32 bits lang (2 woorden).
Via DMA leest de Copper de kommando's uit een lijst, de zogenaamde COPPERLIST.
Het volgende stukje is een stukje uit een Copperlist :

   DC.W $180,$F00      - Zet de achtergrondkleur op ROOD
   DC.W $700F,-2       - Wacht op het begin van regel $70
   DC.W $180,$FFF      - Zet de achtergrondkleur op WIT
   DC.W $E00F,-2       - Wacht op het begin van regel $E0
   DC.W $180,$00F      - Zet de achtergrondkleur op BLAUW

Laten we de verschillende kommando's eens bekijken :

COPPERKOMMANDO : MOVE

Met het MOVE-kommando kunnen we gegevens in een hardware-register schrijven.
Het eerste woord geeft de offset van het register, het tweede woord de waarde
die er in geschreven moet worden.

Het 68000-kommando :

   MOVE #$FFF,$DFF180

&&Is bij de Copper :

   DC.W $180,$FFF

Omdat de Seka-assembler geen Copper-kommando's kent moeten we die als getallen
of als macro opgeven. Een macro is dan b.v. :

   CMOVE:
    MACRO
     DC.W ?2,?1
    ENDM

   COMVE $FFF,$180

De Copper ziet verschil tussen het MOVE-kommando en andere kommando's door bit
0 van het offset-getal. Dit bit is bij een MOVE-kommando altijd 0 omdat
registers altijd op even adressen staan.

**********************  MEER IN DEEL 2 VAN DEZE CURSUS  **********************

------------------------------------------------------------------------------
&&
