base:20-pixel_sprite_interleave
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionLast revisionBoth sides next revision | ||
base:20-pixel_sprite_interleave [2020-10-15 14:43] – raistlin | base:20-pixel_sprite_interleave [2020-10-15 15:02] – raistlin | ||
---|---|---|---|
Line 4: | Line 4: | ||
Original idea and help from Christopher Jam for 20-pixel interleave technique | Original idea and help from Christopher Jam for 20-pixel interleave technique | ||
- | ===== Intro ===== | + | === Intro === |
When using large arrays of sprites, eg. an 8x10 array, it can be tricky to do this without having gaps or glitches. Annoyingly, C64 sprites are 21 pixels tall - so it's not possible to have this array without at least one row of sprites being around a bad line - where there simply aren't enough cycles to update all the sprite values. | When using large arrays of sprites, eg. an 8x10 array, it can be tricky to do this without having gaps or glitches. Annoyingly, C64 sprites are 21 pixels tall - so it's not possible to have this array without at least one row of sprites being around a bad line - where there simply aren't enough cycles to update all the sprite values. | ||
Line 69: | Line 69: | ||
</ | </ | ||
- | What matters to us here is the cycle count between our first write to the sprite values and our last. So that's 7x2 + 7x4 = 42. To reduce this, we can use the illegal opcode, SAX:- | + | What matters to us here is the cycle count between our first write to the sprite values and our last. So that's 7x2 + 7x4 = 42 cycles. To reduce this, we can use the illegal opcode, SAX:- |
< | < | ||
LDA #64 + 4 | LDA #64 + 4 | ||
LDX #$fb | LDX #$fb | ||
- | SAX ScreenAddr + $3f8 + 0; <-- SAX will write A&X .. ie. 64 in this case (we mask out bit 2) | + | SAX ScreenAddr + $3f8 + 0; <-- SAX will write "A & X" |
STA ScreenAddr + $3f8 + 4 | STA ScreenAddr + $3f8 + 4 | ||
INX | INX |