assign byte table screen $0400 assign byte table screen2 1274 assign byte table screen3 1524 assign byte table screen4 1774 assign byte table colormap 55296 assign byte table colormap2 55546 assign byte table colormap3 55796 assign byte table colormap4 56046 assign byte vic_border 53280 assign byte table vic_bg 53281 assign byte joy2 $dc00 assign vector cinv 788 ; --------- reserve vector save_cinv assign word position $fb assign word new_position $fd reserve word delta reserve byte value reserve word compare_target routine main { lda #5 sta vic_border lda #0 sta vic_bg jsr reset_position jsr clear_screen sei { copy cinv save_cinv copy routine our_cinv to cinv } clc repeat bcc { } } routine our_cinv { lda #32 ldy #0 sta (position), y jsr read_stick jsr advance_pos jsr check_new_position_in_bounds if bcs { jsr install_new_position } else { } lda #81 ldy #0 sta (position), y jmp (save_cinv) } routine reset_position { copy #$0400 position } routine advance_pos { clc lda position adc >delta sta >new_position } routine install_new_position { copy new_position position } routine check_new_position_in_bounds { copy #$07e8 compare_target ; just past bottom of screen jsr compare_new_pos if bcs { clc } else { copy #$0400 compare_target jsr compare_new_pos if bcc { clc } else { sec } } } routine compare_new_pos { lda >new_position cmp >compare_target if beq { lda delta ldx joy2 txa and #1 ; up if beq { lda #216 ; -40 sta delta } else { txa and #2 ; down if beq { lda #40 sta delta } else { txa and #8 ; right if beq { lda #1 sta