;=========================================== ; hgr draw sprite mask and save (only at 7-bit boundaries) ;=========================================== ; SPRITE in INL/INH ; Location at SPRITE_X SPRITE_Y ; xsize, ysize in first two bytes ; sprite AT INL/INH ; save at OUTL/OUTH hgr_draw_sprite_mask_and_save: ldy #0 lda (INL),Y ; load xsize sta (OUTL),Y clc adc SPRITE_X sta sms_sprite_width_end_smc+1 ; self modify for end of line iny ; load ysize lda (INL),Y sta (OUTL),Y sta sms_sprite_ysize_smc+1 ; self modify ; point smc to sprite lda INL ; 16-bit add sta sms_sprite_smc1+1 lda INH sta sms_sprite_smc1+2 ; point smc to sprite lda OUTL ; 16-bit add sta backup_sprite_smc1+1 lda OUTH sta backup_sprite_smc1+2 lda MASKL sta sms_mask_smc1+1 lda MASKH sta sms_mask_smc1+2 ldx #0 ; X is pointer offset stx CURRENT_ROW ; actual row ldx #2 hgr_sms_sprite_yloop: lda CURRENT_ROW ; row clc adc SPRITE_Y ; add in cursor_y ; calc GBASL/GBASH tay ; get output ROW into GBASL/H lda hposn_low,Y sta GBASL lda hposn_high,Y ;hgr_sprite_page_smc: ; eor #$00 clc adc DRAW_PAGE sta GBASH ldy SPRITE_X sms_sprite_inner_loop: lda (GBASL),Y ; load bg backup_sprite_smc1: sta $f000,X sms_sprite_smc1: eor $f000,X ; load sprite data sms_mask_smc1: and $f000,X eor (GBASL),Y sta (GBASL),Y ; store to screen inx ; increment sprite offset iny ; increment output position sms_sprite_width_end_smc: cpy #6 ; see if reached end of row bne sms_sprite_inner_loop ; if not, loop inc CURRENT_ROW ; row lda CURRENT_ROW ; row sms_sprite_ysize_smc: cmp #31 ; see if at end bne hgr_sms_sprite_yloop ; if not, loop rts backup_sprite1 = $1800 backup_sprite2 = $1900