;=========================================== ; hgr draw sprite (only at 7-bit boundaries) ;=========================================== ; SPRITE in INL/INH ; Location at XPOS YPOS ; xsize, ysize in first two bytes ; sprite AT INL/INH hgr_draw_sprite: ldy #0 lda (INL),Y ; load xsize clc adc XPOS sta sprite_width_end_smc+1 ; self modify for end of line iny ; load ysize lda (INL),Y sta sprite_ysize_smc+1 ; self modify ; skip the xsize/ysize and point to sprite clc lda INL ; 16-bit add adc #2 sta sprite_smc1+1 lda INH adc #0 sta sprite_smc1+2 ldx #0 ; X is pointer offset stx MASK ; actual row hgr_sprite_yloop: lda MASK ; row clc adc YPOS ; add in cursor_y ; calc GBASL/GBASH tay ; get output ROW into GBASL/H lda hposn_low,Y sta GBASL lda hposn_high,Y ; eor #$00 draws on page2 ; eor #$60 draws on page1 hgr_sprite_page_smc: eor #$00 sta GBASH ldy XPOS sprite_inner_loop: sprite_smc1: lda $d000 ; get sprite pattern sta (GBASL),Y ; store out inx iny inc sprite_smc1+1 bne sprite_noflo inc sprite_smc1+2 sprite_noflo: sprite_width_end_smc: cpy #6 bne sprite_inner_loop inc MASK ; row lda MASK ; row sprite_ysize_smc: cmp #31 bne hgr_sprite_yloop rts hgr_sprite_page_toggle: lda hgr_sprite_page_smc+1 eor #$60 sta hgr_sprite_page_smc+1 rts ;=========================================== ; hgr draw sprite (only at 7-bit boundaries) ;=========================================== ; autoshift version ; assumes sprite is drawn for even column ; and shifts it if in odd column ; SPRITE in INL/INH ; Location at XPOS YPOS ; xsize, ysize in first two bytes ; sprite AT INL/INH hgr_draw_sprite_autoshift: ; self modify to shift for odd start location ; SEC=$38 0b0011 1000 CLC=$18 0b0001 10000 lda XPOS lsr bcc make_it_even make_it_odd: lda #$18 bne make_it_so make_it_even: lda #$38 make_it_so: sta odd_even_smc ldy #0 lda (INL),Y ; load xsize clc adc XPOS sta sprite_width_end_smc_as+1 ; self modify for end of line iny ; load ysize lda (INL),Y sta sprite_ysize_smc_as+1 ; self modify ; skip the xsize/ysize and point to sprite clc lda INL ; 16-bit add adc #2 sta sprite_smc1_as+1 lda INH adc #0 sta sprite_smc1_as+2 ldx #0 ; X is pointer offset stx MASK ; actual row hgr_sprite_yloop_as: lda MASK ; row clc adc YPOS ; add in cursor_y ; calc GBASL/GBASH tay ; get output ROW into GBASL/H lda hposn_low,Y sta GBASL lda hposn_high,Y ; eor #$00 draws on page2 ; eor #$60 draws on page1 hgr_sprite_smc_as: eor #$00 sta GBASH ldy XPOS sprite_inner_loop_as: sprite_smc1_as: lda $d000 ; get sprite pattern ; lsr odd_even_smc: sec bcs no_adjust asl php clc lsr plp ror no_adjust: ;? Xcababab ;X cababab? ;? X0cababa ; clc ; rol asl ; rol sta (GBASL),Y ; store out inx iny inc sprite_smc1_as+1 bne sprite_noflo_as inc sprite_smc1_as+2 sprite_noflo_as: sprite_width_end_smc_as: cpy #6 bne sprite_inner_loop_as inc MASK ; row lda MASK ; row sprite_ysize_smc_as: cmp #31 bne hgr_sprite_yloop_as rts hgr_sprite_as_toggle: lda hgr_sprite_smc_as+1 eor #$60 sta hgr_sprite_smc_as+1 rts ;=========================================== ; hgr draw sprite (only at 7-bit boundaries) ;=========================================== ; autoshift version ; assumes sprite is drawn for even column ; and shifts it if in odd column ; ors with bg for lemming ; SPRITE in INL/INH ; Location at XPOS YPOS ; xsize, ysize in first two bytes ; sprite AT INL/INH hgr_draw_sprite_or_autoshift: ; self modify to shift for odd start location ; SEC=$38 0b0011 1000 CLC=$18 0b0001 10000 lda XPOS lsr bcc make_it_even_or make_it_odd_or: lda #$18 bne make_it_so_or make_it_even_or: lda #$38 make_it_so_or: sta odd_even_smc_or ldy #0 lda (INL),Y ; load xsize clc adc XPOS sta sprite_width_end_smc_as_or+1 ; self modify for end of line iny ; load ysize lda (INL),Y sta sprite_ysize_smc_as_or+1 ; self modify ; skip the xsize/ysize and point to sprite clc lda INL ; 16-bit add adc #2 sta sprite_smc1_as_or+1 lda INH adc #0 sta sprite_smc1_as_or+2 ldx #0 ; X is pointer offset stx MASK ; actual row hgr_sprite_yloop_as_or: lda MASK ; row clc adc YPOS ; add in cursor_y ; calc GBASL/GBASH tay ; get output ROW into GBASL/H lda hposn_low,Y sta GBASL lda hposn_high,Y ; eor #$00 draws on page2 ; eor #$60 draws on page1 hgr_sprite_smc_as_or: eor #$00 sta GBASH ldy XPOS sprite_inner_loop_as_or: sprite_smc1_as_or: lda $d000 ; get sprite pattern ; lsr odd_even_smc_or: sec bcs no_adjust_or asl php clc lsr plp ror no_adjust_or: ;? Xcababab ;X cababab? ;? X0cababa ; clc ; rol asl ; rol ora (GBASL),Y sta (GBASL),Y ; store out inx iny inc sprite_smc1_as_or+1 bne sprite_noflo_as_or inc sprite_smc1_as_or+2 sprite_noflo_as_or: sprite_width_end_smc_as_or: cpy #6 bne sprite_inner_loop_as_or inc MASK ; row lda MASK ; row sprite_ysize_smc_as_or: cmp #31 bne hgr_sprite_yloop_as_or rts hgr_sprite_as_or_toggle: lda hgr_sprite_smc_as_or+1 eor #$60 sta hgr_sprite_smc_as_or+1 rts