diff --git a/space_bars/gr_putsprite_fast.s b/space_bars/gr_putsprite_fast.s new file mode 100644 index 00000000..2e3878bc --- /dev/null +++ b/space_bars/gr_putsprite_fast.s @@ -0,0 +1,75 @@ + ;============================================= + ; put_sprite_fast + ;============================================= + ; Sprite to display in INH,INL + ; Assumes sprite size is 3x2 + ; Location is SPRITE_XPOS,SPRITE_YPOS + ; Note, only works if SPRITE_YPOS is multiple of two + + ; NO TRANSPARENCY + + ; 13+ Y*(33+17+X*(18+13) + 5 + ; 18 + Y*(50+31*X) + + ; so if 3*2 = 304 cycles?? + +put_sprite_fast: + ldy #0 ; 2 + lda #2 ; ysize is 2 ; 2 + sta CV ; ysize is in CV ; 3 + + lda SPRITE_YPOS ; make a copy of ypos ; 3 + sta TEMPY ; as we modify it ; 3 + ;=========== + ; 13 +put_sprite_loop_fast: + sty TEMP ; save sprite pointer ; 3 + ldy TEMPY ; 3 + lda gr_offsets,Y ; lookup low-res memory address ; 4 + clc ; 2 + adc SPRITE_XPOS ; add in xpos ; 3 + sta OUTL ; store out low byte of addy ; 3 + lda gr_offsets+1,Y ; look up high byte ; 4 + adc DRAW_PAGE ; ; 3 + sta OUTH ; and store it out ; 3 + ldy TEMP ; restore sprite pointer ; 3 + + ; OUTH:OUTL now points at right place + + ldx #3 ; load xsize into x ; 2 + ;=========== + ; 33 +put_sprite_pixel_fast: + lda (INL),Y ; get sprite colors ; 5 + iny ; increment sprite pointer ; 2 + + sty TEMP ; save sprite pointer ; 3 + ldy #$0 ; 2 + sta (OUTL),Y ; and write it out ; 6 + ;============ + ; 18 + +put_sprite_done_draw_fast: + + ldy TEMP ; restore sprite pointer ; 3 + + inc OUTL ; increment output pointer ; 5 + dex ; decrement x counter ; 2 + bne put_sprite_pixel_fast ; if not done, keep looping ; 3 + ;============== + ; 13 + + ; -1 + inc TEMPY ; each line has two y vars ; 5 + inc TEMPY ; 5 + dec CV ; decemenet total y count ; 5 + bne put_sprite_loop_fast ; loop if not done ; 3 + ;============== + ; 17 + + ; -1 + rts ; return ; 6 + + + +