139 lines
2.6 KiB
Plaintext
139 lines
2.6 KiB
Plaintext
|
|
|
|
GPU instruction pair <= 148 cycles:
|
|
setup
|
|
(burst)
|
|
clean
|
|
|
|
Pixel burst (videoA,B and/or C)
|
|
|
|
CopperSetup
|
|
Burst Burst Burst Burst
|
|
CopperClean CopperSetup
|
|
Burst Burst Burst Burst
|
|
CopperClean
|
|
|
|
Setup:
|
|
; Overhead
|
|
ld [videoY],x ; Find out page from video indirection table
|
|
ld $01,y
|
|
ls [y,x]
|
|
st [vTmp],y
|
|
|
|
; Object
|
|
ld [y,$a0] ; X position of object
|
|
ld ac,x
|
|
|
|
; Pixel 1
|
|
ld [y,x] ; Preserve background
|
|
st [y,$a1]
|
|
ld [y,$a2] ; Display object
|
|
st [y,x++]
|
|
|
|
Clean:
|
|
; Overhead
|
|
ld [vTmp],y ; XXX is this untouched by the video loop?
|
|
|
|
ld [y,$a0] ; X position of object
|
|
ld ac,x
|
|
ld [y,$a1] ; Restore background
|
|
st [y,x++]
|
|
|
|
Object costs: 4 cycles
|
|
Pixel costs: 6 cycles
|
|
|
|
5 pixel object: 34 cycles -> 4 objects (ghosts!), 10 cycles for overhead sounds ok
|
|
6 pixel object: 40 cycles -> 3 objects (boring)
|
|
|
|
Eg. 4 objects of 6 pixels
|
|
|
|
148/4 = 37
|
|
|
|
- # # # - - - - - -
|
|
# O # O # - - - - -
|
|
# # # # # - - X - -
|
|
# # # # # - - - - -
|
|
# - # - # - - - - -
|
|
|
|
- O O O -
|
|
O O # O O
|
|
O O O O O
|
|
O O O O O
|
|
- O O O -
|
|
|
|
- O O O -
|
|
O O # O O
|
|
- O O O O
|
|
O O O O O
|
|
- O O O -
|
|
|
|
O O O O -
|
|
- O # O O
|
|
- - O O O
|
|
- O O O O
|
|
O O O O -
|
|
|
|
Because most lines have no sprites, there is a lot of wasted CPU time.
|
|
These kind of sprites are better done in vertical blank.
|
|
|
|
|
|
But here's an idea for a cool screensaver:
|
|
|
|
Setup:
|
|
ld [y,$a7]
|
|
st [vTmp],x
|
|
ld [y,$a8]
|
|
adda sprite1
|
|
bra [ac]
|
|
sprite1 ld [y,$a0] ;Draw sprite 1
|
|
st [y,x++]
|
|
ld [y,$a1]
|
|
st [y,x++]
|
|
ld [y,$a2]
|
|
st [y,x++]
|
|
ld [y,$a3]
|
|
st [y,x++]
|
|
ld [y,$a4]
|
|
st [y,x++]
|
|
ld [y,$a5]
|
|
st [y,x++]
|
|
ld [y,$a6]
|
|
st [y,x++]
|
|
|
|
ld [y,$a0]
|
|
loop bne loop ;Resync
|
|
suba 2
|
|
|
|
Clean:
|
|
ld [vTmp],x
|
|
|
|
ld [x] ;Restore sprite 1
|
|
st [y,x++]
|
|
ld [x]
|
|
st [y,x++]
|
|
ld [x]
|
|
st [y,x++]
|
|
ld [x]
|
|
st [y,x++]
|
|
ld [x]
|
|
st [y,x++]
|
|
ld [x]
|
|
st [y,x++]
|
|
ld [x]
|
|
st [y,x++]
|
|
|
|
With a background in 160 bytes in zero page, we have a vertical bars.
|
|
Playing with videoTable[].dX gives us a blocky pattern!
|
|
|
|
7 pixel objects cost 8*4 = 32 cycles. We can have 4 objects <-- lets try this
|
|
6 pixel objects cost 7*4 = 28 cycles. We can have 5 objects
|
|
|
|
But no alpha channel..
|
|
Different ROM routine per shape?
|
|
|
|
ld [y,x]
|
|
op [y,$a0]
|
|
st [y,x++]
|
|
|
|
Maybe we don't need full screen frame buffer. 1 line is enough?
|