EasyManua.ls Logo

Commodore Amiga A2000 - Copper Loops and Branches and Comparison Enable

Commodore Amiga A2000
380 pages
Print Icon
To Next Page IconTo Next Page
To Next Page IconTo Next Page
To Previous Page IconTo Previous Page
To Previous Page IconTo Previous Page
Loading...
The following example SKIP instruction skips the instruction following it if VP (vertical
beam position) is greater than or equal to 100 ($64).
DC.W $6401,$FF01 ; If VP >= 100,
; skip next instruction (ignore HP)
COPPER LOOPS AND BRANCHES AND COMPARISON ENABLE
You can change the value in the location registers at any time and use this value to
construct loops in the instruction list. Before the next vertical blanking time, however, the
COP1LC registers must be repointed to the beginning of the appropriate Copper list. The
value in the COP1L location registers will be restored to the Copper's program counter at
the start of the vertical blanking period.
Bits 14-1 of instruction word 2 in the WAIT and SKIP instructions specify which bits of the
horizontal and vertical position are to be used for the beam counter comparison. The
position in instruction word 1 and the compare enable bits in instruction word 2 are tested
against the actual beam counters before any further action is taken. A position bit in
instruction word 1 is used in comparing the positions with the actual beam counters if and
only if the corresponding enable bit in instruction word 2 is set to 1. If the corresponding
enable bit is 0, the comparison is always true. For instance, if you care only about the
value in the last four bits of the vertical position, you set only the last four compare
enable bits, bits (11-8) in instruction word 2.
Not all of the bits in the beam counter may be masked. If you look at the description of
the IR2 (second instruction word) you will notice that bit 15 is the blitter-finished-disable
bit. This bit is not part of the beam counter comparison mask, it has its own meaning in
the Copper WAIT instruction. Thus, you cannot mask the most significant bit in WAIT or
SKIP instructions. In most situations this limitation does not come into play, however, the
following example shows how to deal with it.
This example will instruct the Copper to issue an interrupt every 16 scan lines. It might
seem that the way to do this would be to use a mask of $0F and then compare the result
with $0F. This should compare "true" for $1F, $2F, $3F, etc. Since the test is for greater
than or equal to, this would seem to allow checking for every 16th scan line. However, the
highest order bit cannot be masked, so it will always appear in the comparisons. When the
Copper is waiting for $0F and the vertical position is past 128 (hex $80), this test will
always be true. In this case, the minimum value in the comparison will be $80, which is
always greater than $0F, and the interrupt will happen on every scan line. Remember, the
Copper only checks for greater than or equal to.
In the following example, the Copper lists have been made to loop. The COP1LC and
COP2LC values are either set via the CPU or in the Copper list before this section of
Copper code. Also, it is assumed that you have correctly installed an interrupt server for
the Copper interrupt that will be generated every 16 lines. Note that these are non-
interlaced scan lines.
- 28 Coprocessor Hardware -

Table of Contents

Other manuals for Commodore Amiga A2000

Related product manuals