.setcpu "6502" .smart on .autoimport on .importzp sp, sreg, regsave, regbank .importzp tmp1, tmp2, tmp3, tmp4, ptr1, ptr2, ptr3, ptr4 .export _turn_on, _turn_off, _toggle, _turn_up, _turn_double_up .export _turn_down .import _row .macro loop_start sta tmp1 ; tmp1 = j stx tmp1+1 ldy #0 ; ptr1 = tmp3 = i lda (sp),y sta tmp3 sta ptr1 iny lda (sp),y sta tmp3+1 sta ptr1+1 lda ptr1 ; ptr1 = ptr1 * 2 + _row (= &row[i]) asl rol ptr1+1 clc adc #<_row sta ptr1 lda ptr1+1 adc #>_row sta ptr1+1 sec ; tmp1 = tmp1 - tmp3 (= j - i) lda tmp1 sbc tmp3 sta tmp1 lda tmp1+1 sbc tmp3+1 sta tmp1+1 .endmacro .macro loop_end .local exit_loop lda tmp1 ; tmp1 == 0? ora tmp1+1 beq exit_loop dec tmp1 ; tmp1 -= 1 lda tmp1 cmp #$ff bne loop dec tmp1+1 jmp loop exit_loop: jmp incsp2 .endmacro .code _turn_on: ldy #1 .byte $2c ; BIT $???? _turn_off: ldy #0 .proc turn_common sty selfmod+1 loop_start ldy #0 loop: selfmod: lda #$ff sta (ptr1),y iny iny bne skip1 inc ptr1+1 skip1: loop_end .endproc .proc _toggle loop_start ldy #0 loop: lda (ptr1),y eor #1 sta (ptr1),y iny iny bne skip1 inc ptr1+1 skip1: loop_end .endproc _turn_up: ldy #1 .byte $2c ; BIT $???? _turn_double_up: ldy #2 .proc turn_up_common sty selfmod+1 loop_start ldy #0 loop: clc lda (ptr1),y selfmod: adc #$ff sta (ptr1),y iny lda (ptr1),y adc #0 sta (ptr1),y iny bne skip1 inc ptr1+1 skip1: loop_end .endproc .proc _turn_down loop_start ldy #0 loop: lda (ptr1),y iny ora (ptr1),y beq skip0 dey sec lda (ptr1),y sbc #1 sta (ptr1),y iny lda (ptr1),y sbc #0 sta (ptr1),y skip0: iny bne skip1 inc ptr1+1 skip1: loop_end .endproc