started work on screen scroll
This commit is contained in:
1 parent
870de4e432
commit
44df124fc7
3 files changed
+108
-8
No files matched your search
@@ -0,0 +1,239 @@
|
||||
|
||||
//
|
||||
// Scroll the whole screen up by 1 logical line
|
||||
//
|
||||
|
||||
|
||||
screen_scroll_up:
|
||||
|
||||
// Preserve SAL and EAL
|
||||
|
||||
lda SAL+0
|
||||
pha
|
||||
lda SAL+1
|
||||
pha
|
||||
lda EAL+0
|
||||
pha
|
||||
lda EAL+1
|
||||
pha
|
||||
|
||||
screen_scroll_up_next:
|
||||
|
||||
#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 #$03
|
||||
!:
|
||||
ldx #$FF
|
||||
jsr wait_x_bars
|
||||
dey
|
||||
bne !-
|
||||
|
||||
screen_scroll_up_delay_done:
|
||||
|
||||
// First 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
|
||||
|
||||
// Now, we need to scroll both screen memory and color memory
|
||||
|
||||
|
||||
|
||||
// YYY implement
|
||||
|
||||
|
||||
|
||||
|
||||
// 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_next
|
||||
|
||||
// Restore SAL and EAL
|
||||
|
||||
pla
|
||||
sta EAL+1
|
||||
pla
|
||||
sta EAL+0
|
||||
pla
|
||||
sta SAL+1
|
||||
pla
|
||||
sta SAL+0
|
||||
|
||||
// Return
|
||||
|
||||
rts
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* YYY disabled for rework, add CTRL and NO_SCROLL support
|
||||
|
||||
not_last_line:
|
||||
rts
|
||||
|
||||
screen_scroll_up_if_on_last_line:
|
||||
|
||||
// Colour RAM is always in fixed place, so is easiest
|
||||
// to use to check if we are on the last line.
|
||||
// The last line is at $D800 + 24*40 = $DBC0
|
||||
lda USER+1
|
||||
cmp #>$DBC0
|
||||
bne not_last_line
|
||||
|
||||
lda USER+0
|
||||
cmp #<$DBC0
|
||||
beq is_last_line
|
||||
|
||||
jsr screen_get_current_line_logical_length
|
||||
clc
|
||||
adc USER+0
|
||||
cmp #<$DBE7-1
|
||||
bcc not_last_line
|
||||
|
||||
is_last_line:
|
||||
|
||||
dec TBLX
|
||||
|
||||
// FALLTHROUGH to screen_scroll_up
|
||||
|
||||
|
||||
|
||||
scroll_screen_up:
|
||||
|
||||
// Preserve EAL
|
||||
lda EAL+0
|
||||
pha
|
||||
lda EAL+1
|
||||
pha
|
||||
|
||||
// Now scroll the whole screen up either one or two lines
|
||||
// based on whether the first screen line is linked or not.
|
||||
|
||||
// Get pointers to start of screen + colour RAM
|
||||
lda HIBASE
|
||||
sta PNT+1
|
||||
sta SAL+1
|
||||
lda #>$D800
|
||||
sta USER+1
|
||||
sta EAL+1
|
||||
lda #$00
|
||||
sta PNT+0
|
||||
sta USER+0
|
||||
|
||||
// Get pointers to screen/colour RAM source
|
||||
lda LDTBL+0
|
||||
bmi !+
|
||||
lda #40
|
||||
.byte $2C // BIT $nnnn to skip next instruction
|
||||
!:
|
||||
lda #80
|
||||
sta SAL+0
|
||||
sta EAL+0
|
||||
|
||||
// Copy first three pages
|
||||
ldy #$00
|
||||
ldx #3
|
||||
scroll_copy_loop:
|
||||
lda (EAL),y
|
||||
sta (USER),y
|
||||
lda (SAL),y
|
||||
sta (PNT),y
|
||||
|
||||
iny
|
||||
bne scroll_copy_loop
|
||||
|
||||
inc SAL+1
|
||||
inc PNT+1
|
||||
inc EAL+1
|
||||
inc USER+1
|
||||
dex
|
||||
bne scroll_copy_loop
|
||||
|
||||
// Copy last partial page
|
||||
// We need to copy 1000-(3*256)-line length
|
||||
// = 232 - line length
|
||||
lda SAL+0
|
||||
lda #232
|
||||
sec
|
||||
sbc SAL+0
|
||||
tax
|
||||
scroll_copy_loop2:
|
||||
lda (EAL),y
|
||||
sta (USER),y
|
||||
lda (SAL),y
|
||||
sta (PNT),y
|
||||
iny
|
||||
dex
|
||||
bne scroll_copy_loop2
|
||||
|
||||
// Restore EAL
|
||||
pla
|
||||
sta EAL+1
|
||||
pla
|
||||
sta EAL+0
|
||||
|
||||
// Fill in scrolled up area
|
||||
ldx SAL+0
|
||||
scroll_copy_loop3:
|
||||
lda COLOR
|
||||
sta (USER),y
|
||||
lda #$20
|
||||
sta (PNT),y
|
||||
iny
|
||||
dex
|
||||
bne scroll_copy_loop3
|
||||
|
||||
// Shift line linkage list
|
||||
ldy #0
|
||||
ldx #24
|
||||
link_copy:
|
||||
lda LDTBL+1,y
|
||||
sta LDTBL+0,y
|
||||
iny
|
||||
dex
|
||||
bne link_copy
|
||||
// Clear line link flag of last line
|
||||
stx LDTBL+24
|
||||
|
||||
// Restore correct line pointers
|
||||
jmp screen_calculate_line_pointer
|
||||
*/
|
||||
Reference in new issue
Block a user