Code:
!add = "clc : adc"
!sub = "sec : sbc"
sep #$20
lda #$88
sta $2115
lda !bank
pha
plb
rep #$30
lda !angle
asl
and #$01fe
tax
lda sine_table+$000000,x
sta !sine
txa
!add #$0080
and #$01fe
tax
lda sine_table+$000000,x
sta !cosine
lda !sine
!add !cosine
asl #2
sta !x_displacement
lda !cosine
!sub !sine
asl #2
sta !y_displacement
lda !width
tay
asl #2
xab
!add !x_pixel
find_x_pixel:
sub !x_displacement
dey
bne find_x_pixel
sta !x_pixel
lda !width
tay
asl #2
xab
!add !y_pixel
find_y_pixel:
sub !y_displacement
dey
bne find_y_pixel
sta !y_pixel
render_sprite:
lda !x_pixel
pha
lda !y_pixel
pha
lda !width
pha
lda !destination
sta $2116
render_line:
jsr make_affine_plane
dec !width
bne render_line
rep #$20
pla
sta !width
pla
!add !cosine
sta !y_pixel
pla
!add !sine
sta !x_pixel
lda !destination
!add #$0020
sta !destination
dec !height
bne render_sprite
rts
make_affine_plane:
rep #$30
lda !y_pixel
sta !pixel_address_1
!sub !sine
sta !pixel_address_2
!sub !sine
sta !pixel_address_3
!sub !sine
sta !pixel_address_4
!sub !sine
sta !pixel_address_5
!sub !sine
sta !pixel_address_6
!sub !sine
sta !pixel_address_7
!sub !sine
sta !pixel_address_8
!sub !sine
sta !y_pixel
lda !x_pixel
sta !pixel_address_1-1
!add !cosine
sta !pixel_address_2-1
!add !cosine
sta !pixel_address_3-1
!add !cosine
sta !pixel_address_4-1
!add !cosine
sta !pixel_address_5-1
!add !cosine
sta !pixel_address_6-1
!add !cosine
sta !pixel_address_7-1
!add !cosine
sta !pixel_address_8-1
!add !cosine
sta !x_pixel
sep #$20
lda (!pixel_address_1)
ror
rol !bit_plane_1
ror
rol !bit_plane_2
ror
rol !bit_plane_3
ror
rol !bit_plane_4
lda (!pixel_address_2)
ror
rol !bit_plane_1
ror
rol !bit_plane_2
ror
rol !bit_plane_3
ror
rol !bit_plane_4
lda (!pixel_address_3)
ror
rol !bit_plane_1
ror
rol !bit_plane_2
ror
rol !bit_plane_3
ror
rol !bit_plane_4
lda (!pixel_address_4)
ror
rol !bit_plane_1
ror
rol !bit_plane_2
ror
rol !bit_plane_3
ror
rol !bit_plane_4
lda (!pixel_address_5)
ror
rol !bit_plane_1
ror
rol !bit_plane_2
ror
rol !bit_plane_3
ror
rol !bit_plane_4
lda (!pixel_address_6)
ror
rol !bit_plane_1
ror
rol !bit_plane_2
ror
rol !bit_plane_3
ror
rol !bit_plane_4
lda (!pixel_address_7)
ror
rol !bit_plane_1
ror
rol !bit_plane_2
ror
rol !bit_plane_3
ror
rol !bit_plane_4
lda (!pixel_address_8)
ror
rol !bit_plane_1
ror
rol !bit_plane_2
ror
rol !bit_plane_3
ror
rol !bit_plane_4
ldx !bit_plane_1
stx $2118
ldx !bit_plane_2
stx $2118
rts
sine_table:
dw 0,6,13,19,25,31,38,44,50,56,62,68,74,80,86,92
dw 98,104,109,115,121,126,132,137,142,147,152,157,162,167,172,177
dw 181,185,190,194,198,202,206,209,213,216,220,223,226,229,231,234
dw 237,239,241,243,245,247,248,250,251,252,253,254,255,255,256,256
dw 256,256,256,255,255,254,253,252,251,250,248,247,245,243,241,239
dw 237,234,231,229,226,223,220,216,213,209,206,202,198,194,190,185
dw 181,177,172,167,162,157,152,147,142,137,132,126,121,115,109,104
dw 98,92,86,80,74,68,62,56,50,44,38,31,25,19,13
dw 0,-6,-13,-19,-25,-31,-38,-44,-50,-56,-62,-68,-74,-80,-86,-92
dw -98,-104,-109,-115,-121,-126,-132,-137,-142,-147,-152,-157,-162,-167,-172
dw -177,-181,-185,-190,-194,-198,-202,-206,-209,-213,-216,-220,-223,-226,-229,-231
dw -234,-237,-239,-241,-243,-245,-247,-248,-250,-251,-252,-253,-254,-255,-255,-256
dw -256,-256,-256,-256,-255,-255,-254,-253,-252,-251,-250,-248,-247,-245,-243,-241
dw -239,-237,-234,-231,-229,-226,-223,-220,-216,-213,-209,-206,-202,-198,-194,-190
dw -185,-181,-177,-172,-167,-162,-157,-152,-147,-142,-137,-132,-126,-121,-115,-109
dw -104,-98,-92,-86,-80,-74,-68,-62,-56,-50,-44,-38,-31,-25,-19,-13,-6
!sub = "sec : sbc"
sep #$20
lda #$88
sta $2115
lda !bank
pha
plb
rep #$30
lda !angle
asl
and #$01fe
tax
lda sine_table+$000000,x
sta !sine
txa
!add #$0080
and #$01fe
tax
lda sine_table+$000000,x
sta !cosine
lda !sine
!add !cosine
asl #2
sta !x_displacement
lda !cosine
!sub !sine
asl #2
sta !y_displacement
lda !width
tay
asl #2
xab
!add !x_pixel
find_x_pixel:
sub !x_displacement
dey
bne find_x_pixel
sta !x_pixel
lda !width
tay
asl #2
xab
!add !y_pixel
find_y_pixel:
sub !y_displacement
dey
bne find_y_pixel
sta !y_pixel
render_sprite:
lda !x_pixel
pha
lda !y_pixel
pha
lda !width
pha
lda !destination
sta $2116
render_line:
jsr make_affine_plane
dec !width
bne render_line
rep #$20
pla
sta !width
pla
!add !cosine
sta !y_pixel
pla
!add !sine
sta !x_pixel
lda !destination
!add #$0020
sta !destination
dec !height
bne render_sprite
rts
make_affine_plane:
rep #$30
lda !y_pixel
sta !pixel_address_1
!sub !sine
sta !pixel_address_2
!sub !sine
sta !pixel_address_3
!sub !sine
sta !pixel_address_4
!sub !sine
sta !pixel_address_5
!sub !sine
sta !pixel_address_6
!sub !sine
sta !pixel_address_7
!sub !sine
sta !pixel_address_8
!sub !sine
sta !y_pixel
lda !x_pixel
sta !pixel_address_1-1
!add !cosine
sta !pixel_address_2-1
!add !cosine
sta !pixel_address_3-1
!add !cosine
sta !pixel_address_4-1
!add !cosine
sta !pixel_address_5-1
!add !cosine
sta !pixel_address_6-1
!add !cosine
sta !pixel_address_7-1
!add !cosine
sta !pixel_address_8-1
!add !cosine
sta !x_pixel
sep #$20
lda (!pixel_address_1)
ror
rol !bit_plane_1
ror
rol !bit_plane_2
ror
rol !bit_plane_3
ror
rol !bit_plane_4
lda (!pixel_address_2)
ror
rol !bit_plane_1
ror
rol !bit_plane_2
ror
rol !bit_plane_3
ror
rol !bit_plane_4
lda (!pixel_address_3)
ror
rol !bit_plane_1
ror
rol !bit_plane_2
ror
rol !bit_plane_3
ror
rol !bit_plane_4
lda (!pixel_address_4)
ror
rol !bit_plane_1
ror
rol !bit_plane_2
ror
rol !bit_plane_3
ror
rol !bit_plane_4
lda (!pixel_address_5)
ror
rol !bit_plane_1
ror
rol !bit_plane_2
ror
rol !bit_plane_3
ror
rol !bit_plane_4
lda (!pixel_address_6)
ror
rol !bit_plane_1
ror
rol !bit_plane_2
ror
rol !bit_plane_3
ror
rol !bit_plane_4
lda (!pixel_address_7)
ror
rol !bit_plane_1
ror
rol !bit_plane_2
ror
rol !bit_plane_3
ror
rol !bit_plane_4
lda (!pixel_address_8)
ror
rol !bit_plane_1
ror
rol !bit_plane_2
ror
rol !bit_plane_3
ror
rol !bit_plane_4
ldx !bit_plane_1
stx $2118
ldx !bit_plane_2
stx $2118
rts
sine_table:
dw 0,6,13,19,25,31,38,44,50,56,62,68,74,80,86,92
dw 98,104,109,115,121,126,132,137,142,147,152,157,162,167,172,177
dw 181,185,190,194,198,202,206,209,213,216,220,223,226,229,231,234
dw 237,239,241,243,245,247,248,250,251,252,253,254,255,255,256,256
dw 256,256,256,255,255,254,253,252,251,250,248,247,245,243,241,239
dw 237,234,231,229,226,223,220,216,213,209,206,202,198,194,190,185
dw 181,177,172,167,162,157,152,147,142,137,132,126,121,115,109,104
dw 98,92,86,80,74,68,62,56,50,44,38,31,25,19,13
dw 0,-6,-13,-19,-25,-31,-38,-44,-50,-56,-62,-68,-74,-80,-86,-92
dw -98,-104,-109,-115,-121,-126,-132,-137,-142,-147,-152,-157,-162,-167,-172
dw -177,-181,-185,-190,-194,-198,-202,-206,-209,-213,-216,-220,-223,-226,-229,-231
dw -234,-237,-239,-241,-243,-245,-247,-248,-250,-251,-252,-253,-254,-255,-255,-256
dw -256,-256,-256,-256,-255,-255,-254,-253,-252,-251,-250,-248,-247,-245,-243,-241
dw -239,-237,-234,-231,-229,-226,-223,-220,-216,-213,-209,-206,-202,-198,-194,-190
dw -185,-181,-177,-172,-167,-162,-157,-152,-147,-142,-137,-132,-126,-121,-115,-109
dw -104,-98,-92,-86,-80,-74,-68,-62,-56,-50,-44,-38,-31,-25,-19,-13,-6
I haven't tested this out yet, but I was too excited not to post it. This is can be used during load times between levels. This uses the PPU for the purpose of memory organization since I wanted to avoid sloppy 65816 code. This wouldn't work during active display for said reason, but thanks to 128 kB of work ram, you don't need to.
Something I like about storing rotated sprites in work ram is they can take less memory than most people think. Angles 180-360 degrees are equivelant to 0-180 degrees with vertical and horizontal flipping applied. You can further minimize the amount of availeable memory by making use of symetrical sprites so that angles 0-90 become mirror images of angles 90-180.