From 27792a78ea2320a7807a1ae9e37dfbec933bf135 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 6 Jan 2020 09:47:13 +0100 Subject: [PATCH] separate functions for EAL/SAL preservation during screen routines --- c64/kernal/screen/e8ea.screen_scroll_up.s | 53 +++++++++++++------- c64/kernal/screen/screen_grow_logical_line.s | 18 ++++++- c64/kernal/screen/screen_preserve_sal_eal.s | 23 +++++++++ c64/kernal/screen/screen_restore_sal_eal.s | 18 +++++++ c64/kernal/screen/screen_scroll_delay.s | 40 --------------- 5 files changed, 92 insertions(+), 60 deletions(-) create mode 100644 c64/kernal/screen/screen_preserve_sal_eal.s create mode 100644 c64/kernal/screen/screen_restore_sal_eal.s delete mode 100644 c64/kernal/screen/screen_scroll_delay.s diff --git a/c64/kernal/screen/e8ea.screen_scroll_up.s b/c64/kernal/screen/e8ea.screen_scroll_up.s index eb9186fe..52939e08 100644 --- a/c64/kernal/screen/e8ea.screen_scroll_up.s +++ b/c64/kernal/screen/e8ea.screen_scroll_up.s @@ -10,7 +10,38 @@ screen_scroll_up: // First handle CTRL and NO_SCRL keys - jsr screen_scroll_delay +#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65 + + // Do not scroll if NO_SCRL is pressed and interrupts are enabled +!: + php + pla + and #%00000010 + bne !+ // branch if IRQs disabled, we cannot detect NO_SCRL status + + lda SHFLAG + and #KEY_FLAG_NO_SCRL + bne !- +!: + +#endif + + // Check if CTRL key pressed - if so, perform a delay + + lda SHFLAG + and #KEY_FLAG_CTRL + beq screen_scroll_up_delay_done + + ldy #$09 +!: + ldx #$FF + jsr wait_x_bars + dey + bne !- + + // FALLTROUGH + +screen_scroll_up_delay_done: // Scroll the LDTBL (line link table) @@ -27,14 +58,7 @@ screen_scroll_up: // Preserve SAL and EAL - lda SAL+0 - pha - lda SAL+1 - pha - lda EAL+0 - pha - lda EAL+1 - pha + jsr screen_preserve_sal_eal // Now, we need to scroll both screen memory and color memory; first create start/end pointers @@ -86,15 +110,8 @@ screen_scroll_up_loop: screen_scroll_up_loop_done: // Restore SAL and EAL - - pla - sta EAL+1 - pla - sta EAL+0 - pla - sta SAL+1 - pla - sta SAL+0 + + jsr screen_restore_sal_eal // Clear the newly introduced line diff --git a/c64/kernal/screen/screen_grow_logical_line.s b/c64/kernal/screen/screen_grow_logical_line.s index 98f20304..65be75ce 100644 --- a/c64/kernal/screen/screen_grow_logical_line.s +++ b/c64/kernal/screen/screen_grow_logical_line.s @@ -8,7 +8,6 @@ screen_grow_logical_line_done: screen_grow_logical_line: // Do not grow line if previus one is grown - ldy TBLX lda LDTBL,y bpl screen_grow_logical_line_done @@ -28,12 +27,27 @@ screen_grow_logical_line: lda #$00 sta LDTBL,y + // Preserve SAL and EAL + jsr screen_preserve_sal_eal + // Now we have to scroll lines downwards to make space + // YYY implement here .break - rts + + + + + + + + // Restore SAL and EAL + jsr screen_restore_sal_eal + + // Recalculate PNT and USER YYY is it needed? + jmp screen_calculate_PNT_USER diff --git a/c64/kernal/screen/screen_preserve_sal_eal.s b/c64/kernal/screen/screen_preserve_sal_eal.s new file mode 100644 index 00000000..df92288f --- /dev/null +++ b/c64/kernal/screen/screen_preserve_sal_eal.s @@ -0,0 +1,23 @@ + + +screen_preserve_sal_eal: + + plx_trash_a + ply_trash_a + + lda SAL+0 + pha + lda SAL+1 + pha + lda EAL+0 + pha + lda EAL+1 + pha + + // FALLTROUGH + +screen_common_sal_eal: + + phy_trash_a + phx_trash_a + rts diff --git a/c64/kernal/screen/screen_restore_sal_eal.s b/c64/kernal/screen/screen_restore_sal_eal.s new file mode 100644 index 00000000..b2d95a52 --- /dev/null +++ b/c64/kernal/screen/screen_restore_sal_eal.s @@ -0,0 +1,18 @@ + + +screen_restore_sal_eal: + + plx_trash_a + ply_trash_a + + pla + sta EAL+1 + pla + sta EAL+0 + pla + sta SAL+1 + pla + sta SAL+0 + + jmp screen_common_sal_eal + \ No newline at end of file diff --git a/c64/kernal/screen/screen_scroll_delay.s b/c64/kernal/screen/screen_scroll_delay.s deleted file mode 100644 index 557b931e..00000000 --- a/c64/kernal/screen/screen_scroll_delay.s +++ /dev/null @@ -1,40 +0,0 @@ - -// -// Handles CTRL and NO_SCRL during screen scroll -// - - -screen_scroll_delay: - -#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65 - - // Do not scroll if NO_SCRL is pressed and interrupts are enabled -!: - php - pla - and #%00000010 - bne !+ // branch if IRQs disabled, we cannot detect NO_SCRL status - - lda SHFLAG - and #KEY_FLAG_NO_SCRL - bne !- -!: - -#endif - - // Check if CTRL key pressed - if so, perform a delay - - lda SHFLAG - and #KEY_FLAG_CTRL - beq screen_scroll_delay_done - - ldy #$09 -!: - ldx #$FF - jsr wait_x_bars - dey - bne !- - -screen_scroll_delay_done: - - rts