Files
open-roms/c64/kernal/screen/e8ea.screen_scroll_up.s
T

134 lines
2.1 KiB
ArmAsm

// #LAYOUT# STD * #TAKE
// #LAYOUT# * KERNAL_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Scroll the whole screen up by 1 logical line, described in:
//
// - [CM64] Computes Mapping the Commodore 64 - page 218
//
screen_scroll_up:
// First handle CTRL and NO_SCRL keys
#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: // entry point for cursor move control codes
// Scroll the LDTBL (line link table)
ldy #$00
!:
lda LDTBL+1, y
sta LDTBL+0, y
iny
cpy #24
bne !-
lda #$80
sta LDTBL+24
// Preserve SAL and EAL, prepare initial SAL/EAL/PNT/USER values
jsr screen_preserve_sal_eal
lda HIBASE
sta SAL+1
sta EAL+1
lda #>$D800
sta PNT+1
sta USER+1
lda #$00
sta EAL+0
sta USER+0
lda #40
sta SAL+0
sta PNT+0
// Now copy, SAL->EAL, PNT->USER, in a loop
ldy #$00
screen_scroll_up_loop:
lda (SAL), y
sta (EAL), y
lda (PNT), y
sta (USER), y
// Check if this was the last byte (last destination byte for color copy is #DBBF)
cpy #$BF
bne !+ // definitely not the last byte
lda USER+1
cmp #$DB
beq screen_scroll_up_loop_done
!:
// Increment .Y, possibly advance pointers
iny
bne screen_scroll_up_loop
inc SAL+1
inc EAL+1
inc USER+1
inc PNT+1
bne screen_scroll_up_loop // branch alwayys
screen_scroll_up_loop_done:
// Restore SAL and EAL
jsr screen_restore_sal_eal
// Clear the newly introduced line
ldx #24
jsr screen_clear_line
// Decrement the current physical line number
dec TBLX
// If the first line is linked, scroll once more
bit LDTBL+0
bpl screen_scroll_up
// Recalculate PNT and USER
jmp screen_calculate_PNT_USER