;; We have the following variables: ;; cursor_blink_disable ;; cursor_blink_countdown ;; cursor_saved_character ;; cursor_is_visible ;; colour_under_cursor show_cursor_if_enabled: lda cursor_blink_disable beq + rts * lda cursor_is_visible beq show_cursor rts show_cursor: ;; Set cursor as though it had just finished the off phase, ;; so that the call to blink_cursor paints it lda #$00 sta cursor_blink_countdown sta cursor_is_visible jsr blink_cursor ;; Then set the timeout to 1 frame, so that the cursor ;; blinks under key repeat conditions, like on the original KERNAL lda #$01 sta cursor_blink_countdown rts blink_cursor: ;; Is the cursor enabled? lda cursor_blink_disable bne no_blink_cursor ;; Do we need to redraw things? dec cursor_blink_countdown bpl no_blink_cursor ;; Check if cursor was visible or not, and toggle lda cursor_is_visible bne undraw_cursor draw_cursor: jsr calculate_screen_line_pointer ldy current_screen_x lda (current_screen_line_ptr),y sta cursor_saved_character eor #$80 sta (current_screen_line_ptr),y ;; Also set cursor colour lda (current_screen_line_colour_ptr),y sta colour_under_cursor lda text_colour sta (current_screen_line_colour_ptr),y lda #1 sta cursor_is_visible jmp reset_blink_timer undraw_cursor: jsr calculate_screen_line_pointer lda cursor_saved_character ldy current_screen_x sta (current_screen_line_ptr),y lda colour_under_cursor sta (current_screen_line_colour_ptr),y lda #0 sta cursor_is_visible ;; Fall through reset_blink_timer: ;; Rest blink counter ;; (Compute's Mapping the 64, p39-40) lda #20 sta cursor_blink_countdown no_blink_cursor: rts disable_cursor: lda #$80 sta cursor_blink_disable ;; FALL THROUGH hide_cursor_if_visible: lda cursor_is_visible bne undraw_cursor rts enable_cursor: lda #$00 sta cursor_blink_disable rts