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

COPPERKOMMANDO : WAIT

Met dit kommando kan de Copper wachten tot een bepaalde plaats op het beeld-
scherm is bereikt door de elektronenstraal die het beeld zichtbaar maakt. De
Copper kan op 4 pixels nauwkeurig deze plaats bepalen.
Het WAIT-kommando ziet er als volgt uit :

   DC.W YYXX,-2

YY staat voor de Y-coordinaat, $00 t/m $FF,
XX staat voor de X-coordinaat, $01 t/m $E1.

De nauwkeurigheid in de X-richting is 4 pixels, in de Y-richting 1 regel.
Om verschil te hebben tussen het WAIT- en het MOVE-kommando moet in het eerste
woord altijd een oneven getal staan, de X-coordinaat moet oneven zijn. Als
tweede kenmerk moet bit 0 van het tweede woord 0 zijn.

Met deze twee kommando's kunnen we al de Copperlist maken die we als voorbeeld
gaven. Echter is dit slechts een stuk van de Copperlist.

De lijst moet steeds opnieuw gestart worden als de video-chip start met een
nieuw plaatje. We moeten de DMA-hardware vertellen waar de Copperlist staat.
&&Hiervoor zijn er twee registers van elk 32 bits :

COPADR1 (offset $80) en  COPADR2 (offset $84)

Door het kommando COMJMP1 (of COPJMP2) leest de Copper de instruktie vanaf het
adres dat in COPADR1 (of COPADR2) staat, De COMJMP-registers zijn Strobe-
registers die de Copper starten.
Aan het begin van de opbouw van een scherm wordt hardwarematig het kommando
COPJMP1 uitgevoerd.

Keren we nog even naar de lijst terug. Er zijn nog wat initialiserings-kom-
mando's nodig om onze Copperlist te starten. Omdat het operating-systeem ook
over eigen Copperlisten beschikt en gestoord wordt als we deze zo maar ver-
anderen, moeten we het operating-systeem even stoppen tijdens onze aanpassing.

We doen dat door de interrupts van de computer even uit te zetten :

   MOVE #$4000,$DFF09A          - Multitask uitzetten

De Copper-DMA hoeven we niet extra aan te zetten, deze staat al aan omdat het
operating-systeem deze al gebruikt.

&&Het volgende programma zet een vlag op het scherm :

    ;
    ; LISTING 1
    ;

    ORG  $40000 ; Programma in het CHIP-geheugen vanaf $40000.
    LOAD $40000

   x:
    MOVE     #$4000,$DFF09A ; Multitastking uitzetten.
    MOVE.L   #cop,$DFF084   ; Adres Copperlist in COPADR2.

   waitmouse:
    BTST     #6,$BFE001     : wacht op linker-muis-knop.
    BNE.S    waitmouse
    RTS

   cop:
    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
    DC.W $FFFF,-2       ; Einde van de lijst

&&Om dit met de Seka-assembler te assembleren moet u de letter a intikken,
gevolgd door twee keer RETURN. Het programma wordt gestart door het kommando :
jx   of   j$40000.

De video-chip beschrijft meer dan 256 lijnen, omdat het WAIT-kommando slechts
test op een 8-bit-getal kan deze geen verschil zien tussen beeldlijn $25 en
$125. We gebruiken daarvoor een truukje. Wacht eerst op regel $FF en dan op
$25. De Copper zal dan op regel $125 reageren.
De video-chip kan regel $000 tot $136 beschrijven.

Willen we de vlag uit het vorige programma nu onder het workbench-venster heb-
ben dan wordt het programma het volgende :

    ;
    ; LISTING 2
    ;

    ORG  $40000 ; Programma in het CHIP-geheugen vanaf $40000.
    LOAD $40000

   x:
    MOVE     #$4000,$DFF09A ; Multitastking uitzetten.
    MOVE.L   #cop,$DFF084   ; Adres Copperlist in COPADR2.

&&   waitmouse:
    BTST     #6,$BFE001     : Wacht op linker-muis-knop.
    BNE.S    waitmouse
    RTS

   cop:
    DC.W $180,$000      ; Zet de achtergrondkleur op ZWART
    DC.W $FFe1,-2       ; Wacht op het einde van regel $FF
    DC.W $070F,-2       ; Wacht op het begin van regel $107
    DC.W $180,$F00      ; Zet de achtergrondkleur op ROOD
    DC.W $170F,-2       ; Wacht op het begin van regel $117
    DC.W $180,$FFF      ; Zet de achtergrondkleur op WIT
    DC.W $280F,-2       ; Wacht op het begin van regel $128
    DC.W $180,$00F      ; Zet de achtergrondkleur op BLAUW
    DC.W $FFFF,-2       ; Einde van de lijst

In de voorbeelden hebben we het register COPADR2 gebruikt omdat deze na het
verlaten van het programma automatisch teruggezet wordt. Als hardware-kommando
wordt nog steeds COPJMP1 uitgevoerd, maar de systeem-Copperlist start de
tweede Copperlist met het COPJMP2-kommando.
Willen we onze Copperlist als eerste (COPADR1) zetten dan moeten we aan het
einde een verwijzing naar de systeem-Copperlist zetten. Doen we dat niet .....


&&Omdat het register waar het adres staat schrijf-registers zijn moeten we via
de graphics.library zoeken waar de originele Copperlist staat :

   .....
   MOVE.L   #cop,$DFF080     ; Adres onze Copperlist in COPADR1
   LEA      GFXNaam(pc),A1   ; Pointer naar lib-naam
   MOVEQ    #0,D0            ; Versienummer
   MOVE.L   #4,A6            ; Exec-library-offset
   JSR      -552(A6)         ; OpenLibrary
   MOVE.L   38(A0),$DFF080   ; Originele Copperlist in COPADR1
   MOVE.L   A0,A1            ;
   JSR      -414(A6)         ; CloseLibrary
   .....
   GFXNaam:
   DC.B "graphics.library",0
   Even

**********************  MEER IN DEEL 3 VAN DEZE CURSUS  **********************

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