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

COPPERSUBKOMMANDO : JMP

JMP (Jump) is eigenlijk geen kommando van de Copper maar een kommando wat we
simuleren. In feite schrijven we het sprong-adres in COPADR2 en voeren we via
het COPJMP2-register de sprong uit. Omdat een adres 32-bit groot is en de
Copper alleen met 16-bit waarden werkt moeten we om een sprong-adres door te
geven deze in 2 16-bit-waarden splitsen. In normaal assembler ziet zo'n op-
dracht er zo uit :

   MOVE.L #label1,$DFF084

Voor de Copper moeten we dat splitsen in :

   DC.W $84,label1/$10000 ; High
   DC.W $86,label1&$FFFF  ; Low

En met :

   DC.W $8A,0             ; Offset van COPJMP2

pakt de programmateller van de Copper dat adres over en gaat de Copperlist
vanaf dat adres uitvoeren. We hebben daarmee een lus geprogrammeerd.

&&Laten we het programma eens bekijken. Dit programma laat tot beeldlijn $60 het
scherm zwart. Daarna wordt afwisselend de kleuren rood en wit in het register
gezet. Na die opdracht wordt de sprong uitgevoerd. De eindeloze lus wordt ge-
stopt als bij het begin van een nieuw scherm het COPJMP1-kommando wordt ge-
geven.

   ;
   ; LISTING 3
   ;

   ORG  $40000
   LOAD $40000

   x:
   MOVE    #$4000,$DFF09A     ; Interrupts uitzetten
   MOVE.L  #cop,$DFF080       ; COPADR1

   waitmouse:
   BTST    #6,$BFE001         ; Test op muisknop
   BNE.S   waitmouse
   LEA     GFXNaam(pc),A1
   MOVEQ   #0,D0
   MOVE.L  #4,A6              ; offset EXEC-library
   JSR     -552(A6)           ; OpenLibrary
   MOVE.L  38(A0),$DFF080
   MOVE.L  A0,A1
&&   JSR     -414(A6)           ; CloseLibrary
   RTS

   GFXNaam:
   DC.B    "graphics.library",0
   EVEN

   cop:
   DC.W  $180,$000            ; Achtergrond op zwart
   DC.W  $600F,-2             ; Wachten op regel $60

   label1:
   DC.W  $180,$F00            ; Achtergrond op rood
   DC.W  $180,$FFF            ; Achtergrond op wit
   DC.W  $84,label1/$10000    ; High van label1 naar COPADR2
   DC.W  $86,label1&$FFFF     ; Low van label1 naar COPADR2
   DC.W  $8A,0                ; COPJMP2

Aan de lengte van de rode en witte streepjes zien we hoe lang de Copper bezig
is met de instrukties. Zetten we in de Copperlist een wachtlus dan komt toe-
vallig een fraai patroon naar voren. Zet na de "DC.W  $180,$FFF" dit kommando
nog eens in de Copper-list en assembleer het nog eens. (LISTING3a).

Tot nu toe hebben we bij het WAIT-kommando als tweede waarde het getal -2 op-
gegeven. Het tweede woord heeft echter wel een betekenis. Het is een masker
over het X- en Y-coordinatenpaar waarmee enkele bits overgeslagen kunnen wor-
den.
&&De volgende tabel laat de maskerbits zien :

BIT   1e Woord     2e Woord
----------------------------------------------------------------
15    Y, bit 7     Blitter-Finish-Disable (0 = Wacht op Blitter)
14    Y, bit 6     Y, maskerbit 6
13    Y, bit 5     Y, maskerbit 5
12    Y, bit 4     Y, maskerbit 4
11    Y, bit 3     Y, maskerbit 3
10    Y, bit 2     Y, maskerbit 2
 9    Y, bit 1     Y, maskerbit 1
 8    Y, bit 0     Y, maskerbit 0
 7    X, bit 8     X, maskerbit 8
 6    X, bit 7     X, maskerbit 7
 5    X, bit 6     X, maskerbit 6
 4    X, bit 5     X, maskerbit 5
 3    X, bit 4     X, maskerbit 4
 2    X, bit 3     X, maskerbit 3
 1    X, bit 2     X, maskerbit 2
 0    1            WAIT/SKIP (0=WAIT, 1=SKIP)
----------------------------------------------------------------

Willen we dat alle bits meedoen in het vergelijken dan moeten we het hele
masker op 1 zetten :

MASKER = %1111111111111110    = decimaal -2

&&Willen we dat WAIT geen verschil maakt tussen even en oneven y-posities dan
moeten we bit 0 van het y-masker op 0 zetten :

MASKER = %1111111011111110

Een WAIT-kommando op regel $81 wordt al gevonden in regel $80. Een kort voor-
beeldprogramma :

   ORG  $40000
   LOAD $40000

   x:
   MOVE    #$4000,$DFF09A     ; Interrupts uitzetten
   MOVE.L  #cop,$DFF080       ; COPADR1

   waitmouse:
   BTST    #6,$BFE001         ; Test op muisknop
   BNE.S   waitmouse
   LEA     GFXNaam(pc),A1
   MOVEQ   #0,D0
   MOVE.L  #4,A6              ; Offset EXEC-library
   JSR     -552(A6)           ; OpenLibrary
   MOVE.L  38(A0),$DFF080
   MOVE.L  A0,A1
   JSR     -414(A6)           ; CloseLibrary
   RTS

&&   GFXNaam:
   DC.B    "graphics.library",0
   EVEN

   cop:
   DC.W  $180,$F00
   DC.W  $8049,%1000000011111110 ; WAIT $7F < Y < $100 en X=$49
   DC.W  $180,$FFF
   DC.W  $80CD,%1000000011111110 ; WAIT $7F < Y < $100 en X=$CD
   DC.W  $180,$F00
   DC.W  $80E1,%1000000011111110 ; WAIT $7F < Y < $100 en X=$E1
   DC.W  $88,0

Wat doet dit programma?

Als eerste wordt de achtergrondkleur op rood gezet. Het volgende kommando
wacht tot de X-waarde $49 en bit 7 van de Y-waarde 1 is.
Het WAIT-kommando stopt zijn wachtfase dus alleen bij Y-waarden groter dan $80
en kleiner dan $FF. In dat bereikt schakelt de Copper bij X=$49 over op wit,
en bij X=$CD weer op rood.
Het resultaat is een wit vlak op een rood scherm met coordinaten ($49,$80)-
($CD,$FF).

Twee dingen van het masker hebben we nog niet bekeken :

BIT 0 = WAIT/SKIP

&&Met dit bit maakt de Copper weer verschil tussen 2 kommando's. SKIP komt na
dit stukje.

BIT 15 = BLITTER-FINISH-DISABLE

Met dit bit kan de Copper kiezen of er gewacht wordt op een beeldlijn of op
het einde van een Blitter-kommando. In al onze programma's tot nu toe moet
daar 1 staan, 1=videosignaal.

**********************  MEER IN DEEL 4 VAN DEZE CURSUS  **********************

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