The Copper instruction list contains all the register resetting done during the vertical blanking interval and the register modifications necessary for making mid-screen alterations. As you are planning what will happen during each display field, you may find it easier to think of each aspect of the display as a separate subsystem, such as playfields, sprites, audio, interrupts, and so on. Then you can build a separate list of things that must be done for each subsystem individually at each video beam position. When you have created all these intermediate lists of things to be done, you must merge them together into a single instruction list to be executed by the Copper once for each display frame. The alternative is to create this all-inclusive list directly, without the intermediate steps. For example, the bitplane pointers used in playfield displays and the sprite pointers must be rewritten during the vertical blanking interval so the data will be properly retrieved when the screen display starts again. This can be done with a Copper instruction list that does the following: WAIT until first line of the display MOVE data to bitplane pointer 1 MOVE data to bitplane pointer 2 MOVE data to sprite pointer 1, and so on. As another example, the sprite DMA channels that create movable objects can be reused multiple times during the same display field. You can change the size and shape of the reuses of a sprite; however, every multiple reuse normally uses the same set of colors during a full display frame. You can change sprite colors mid-screen with a Copper instruction list that waits until the last line of the first use of the sprite processor and changes the colors before the first line of the next use of the same sprite processor: WAIT for first line of display MOVE firstcolor1 to COLOR17 MOVE firstcolor2 to COLOR18 MOVE firstcolor3 to COLOR19 WAIT for last line +1 of sprite's first use MOVE secondcolor1 to COLOR17 MOVE secondcolor2 to COLOR18 MOVE secondcolor3 to COLOR19, and so on. As you create Copper instruction lists, note that the final list must be in the same order as that in which the video beam creates the display. The video beam traverses the screen from position (0,0) in the upper left hand corner of the screen to the end of the display (226,262) NTSC (or (226,312) PAL) in the lower right hand corner. The first 0 in (0,0) represents the x position. The second 0 represents the y position. For example, an instruction that does something at position (0,100) should come after an instruction that affects the display at position (0,60). Note that given the form of the WAIT instruction, you can sometimes get away with not sorting the list in strict video beam order. The WAIT instruction causes the Copper to wait until the value in the beam counter is equal to or greater than the value in the instruction. This means, for example, if you have instructions following each other like this: WAIT for position (64,64) MOVE data WAIT for position (60,60) MOVE data then the Copper will perform both moves, even though the instructions are out of sequence. The "greater than" specification prevents the Copper from locking up if the beam has already passed the specified position. A side effect is that the second MOVE below will be performed: WAIT for position (60,60) MOVE data WAIT for position (60,60) MOVE data At the time of the second WAIT in this sequence, the beam counters will be greater than the position shown in the instructions. Therefore, the second MOVE will also be performed. Note also that the above sequence of instructions could just as easily be WAIT for position (60,60) MOVE data MOVE data because multiple MOVE s can follow a single WAIT . Complete Sample Copper List
[Back to Amiga Developer Docs]