logical line growth adaptation
This commit is contained in:
1 parent
27792a78ea
commit
dfc6c5f90a
2 files changed
+73
-138
No files matched your search
@@ -56,12 +56,10 @@ screen_scroll_up_delay_done:
|
|||||||
lda #$80
|
lda #$80
|
||||||
sta LDTBL+24
|
sta LDTBL+24
|
||||||
|
|
||||||
// Preserve SAL and EAL
|
// Preserve SAL and EAL, prepare initial SAL/EAL/PNT/USER values
|
||||||
|
|
||||||
jsr screen_preserve_sal_eal
|
jsr screen_preserve_sal_eal
|
||||||
|
|
||||||
// Now, we need to scroll both screen memory and color memory; first create start/end pointers
|
|
||||||
|
|
||||||
lda HIBASE
|
lda HIBASE
|
||||||
sta SAL+1
|
sta SAL+1
|
||||||
sta EAL+1
|
sta EAL+1
|
||||||
|
|||||||
@@ -1,8 +1,16 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
screen_grow_logical_line_done:
|
screen_grow_logical_line_screen_up:
|
||||||
rts
|
|
||||||
|
jsr screen_scroll_up
|
||||||
|
|
||||||
|
// FALLTROUGH
|
||||||
|
|
||||||
|
screen_grow_logical_line_already_done:
|
||||||
|
|
||||||
|
inc TBLX
|
||||||
|
jmp screen_calculate_PNT_USER
|
||||||
|
|
||||||
|
|
||||||
screen_grow_logical_line:
|
screen_grow_logical_line:
|
||||||
@@ -14,10 +22,8 @@ screen_grow_logical_line:
|
|||||||
|
|
||||||
// If last line, scroll the screen up
|
// If last line, scroll the screen up
|
||||||
cpy #24
|
cpy #24
|
||||||
bne !+
|
beq screen_grow_logical_line_screen_up
|
||||||
jsr screen_scroll_up
|
|
||||||
ldy TBLX
|
|
||||||
!:
|
|
||||||
// Do not grow line if already grown
|
// Do not grow line if already grown
|
||||||
iny
|
iny
|
||||||
lda LDTBL,y
|
lda LDTBL,y
|
||||||
@@ -27,158 +33,89 @@ screen_grow_logical_line:
|
|||||||
lda #$00
|
lda #$00
|
||||||
sta LDTBL,y
|
sta LDTBL,y
|
||||||
|
|
||||||
|
// Now we have to scroll lines downwards to make space. We start from the end,
|
||||||
|
// and work backwards. We cannot be as simple and efficient here as we are
|
||||||
|
// for scrolling up, because we do not know how much must be scrolled.
|
||||||
|
|
||||||
// Preserve SAL and EAL
|
// Preserve SAL and EAL
|
||||||
|
|
||||||
jsr screen_preserve_sal_eal
|
jsr screen_preserve_sal_eal
|
||||||
|
|
||||||
// Now we have to scroll lines downwards to make space
|
// Work out how many physical lines to scroll down
|
||||||
|
|
||||||
|
lda #23
|
||||||
|
sec
|
||||||
|
sbc TBLX
|
||||||
|
beq screen_grow_logical_line_copy_done // branch if no need to copyy
|
||||||
|
tax
|
||||||
|
|
||||||
// YYY implement here
|
// Prepare initial SAL/EAL/PNT/USER values
|
||||||
|
|
||||||
.break
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Restore SAL and EAL
|
|
||||||
jsr screen_restore_sal_eal
|
|
||||||
|
|
||||||
// Recalculate PNT and USER YYY is it needed?
|
|
||||||
jmp screen_calculate_PNT_USER
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* YYY disabled for rework
|
|
||||||
|
|
||||||
// Count the number of physical lines to scroll down
|
|
||||||
ldx #$01
|
|
||||||
ldy TBLX
|
|
||||||
!:
|
|
||||||
iny
|
|
||||||
cpy #23
|
|
||||||
bcs !+
|
|
||||||
|
|
||||||
lda LDTBL,y
|
|
||||||
bmi !-
|
|
||||||
inx
|
|
||||||
bne !- // branch always
|
|
||||||
!:
|
|
||||||
cpx #$00
|
|
||||||
beq no_copy_down
|
|
||||||
|
|
||||||
// Scroll screen down to make space
|
|
||||||
// As we are scrolling down, we start from the end,
|
|
||||||
// and work backwards. We can't be as simple and efficient
|
|
||||||
// here as we are for scrolling up, because we don't know
|
|
||||||
// how much must be scrolled.
|
|
||||||
// Simple solution is to work out how many physical lines
|
|
||||||
// need shifting down, and then move lines at a time after
|
|
||||||
// initialising the pointers to the end area of the screen.
|
|
||||||
|
|
||||||
// Preserve EAL
|
|
||||||
lda EAL+0
|
|
||||||
pha
|
|
||||||
lda EAL+1
|
|
||||||
pha
|
|
||||||
|
|
||||||
// XXX fix TBLX value, it seems to show logical line number, which is wrong!
|
|
||||||
|
|
||||||
// Set pointers to end of screen line, and one line
|
|
||||||
// above. (It is always one physical line, because
|
|
||||||
// this can only happen when expanding a line from 40 to
|
|
||||||
// 80 characters).
|
|
||||||
// XXX - This is not very efficient, and longer than it
|
|
||||||
// needs to be. Better would be to work out size to
|
|
||||||
// copy, and count it down in a pointer somewhere, so
|
|
||||||
// that loop iteration logic is simpler.
|
|
||||||
lda HIBASE
|
lda HIBASE
|
||||||
clc
|
clc
|
||||||
adc #3
|
adc #3
|
||||||
sta PNT+1
|
|
||||||
sta SAL+1
|
sta SAL+1
|
||||||
lda #>$DBC0
|
|
||||||
sta EAL+1
|
sta EAL+1
|
||||||
|
|
||||||
|
lda #>$DB00 // 3rd page of the color memory
|
||||||
|
sta PNT+1
|
||||||
sta USER+1
|
sta USER+1
|
||||||
|
|
||||||
lda #<$03C0
|
lda #<$03C0 // start of destination row
|
||||||
sta PNT+0
|
sta EAL+0
|
||||||
sta USER+0
|
sta USER+0
|
||||||
// souce address is line above
|
lda #<$03C0 // start of source row
|
||||||
|
sta SAL+0
|
||||||
|
sta PNT+0
|
||||||
|
|
||||||
|
screen_grow_logical_line_loop:
|
||||||
|
|
||||||
|
// Scroll down one line each loop iteration
|
||||||
|
|
||||||
|
ldy #39
|
||||||
|
!:
|
||||||
|
lda (SAL), y
|
||||||
|
sta (EAL), y
|
||||||
|
lda (PNT), y
|
||||||
|
sta (USER), y
|
||||||
|
dey
|
||||||
|
bpl !-
|
||||||
|
|
||||||
|
// Decrement SAL/PNT pointers by 40 (optimized due to fact they share LSB)
|
||||||
|
|
||||||
|
lda SAL+0
|
||||||
sec
|
sec
|
||||||
sbc #40
|
sbc #40
|
||||||
sta SAL+0
|
sta SAL+0
|
||||||
sta EAL+0
|
sta PNT+0
|
||||||
|
bcs !+
|
||||||
|
dec SAL+1
|
||||||
|
dec PNT+1
|
||||||
|
!:
|
||||||
|
// Decrement EAL/USER pointers by 40 (optimized due to fact they share LSB)
|
||||||
|
|
||||||
copy_line_down_loop:
|
lda EAL+0
|
||||||
ldy #39
|
|
||||||
cl_inner:
|
|
||||||
lda (EAL),y
|
|
||||||
sta (USER),y
|
|
||||||
lda (SAL),y
|
|
||||||
sta (PNT),y
|
|
||||||
dey
|
|
||||||
bpl cl_inner
|
|
||||||
|
|
||||||
// This ugly hack prevents cursor blink interference XXX solve this in better way
|
|
||||||
php
|
|
||||||
sei
|
|
||||||
jsr cursor_hide_if_visible
|
|
||||||
plp
|
|
||||||
|
|
||||||
// Decrement all pointers by 40
|
|
||||||
// Low bytes are in common pairs
|
|
||||||
|
|
||||||
// Old source is new destination
|
|
||||||
// Use different registers to minimise byte similarity with C64 KERNAl
|
|
||||||
ldy SAL+1
|
|
||||||
sty PNT+1
|
|
||||||
lda EAL+1
|
|
||||||
ldy SAL+0
|
|
||||||
sta USER+1
|
|
||||||
sty PNT+0
|
|
||||||
sty USER+0
|
|
||||||
|
|
||||||
// Decrementing source pointers
|
|
||||||
lda SAL+0
|
|
||||||
sec
|
sec
|
||||||
sbc #<40
|
sbc #40
|
||||||
sta SAL+0
|
|
||||||
sta EAL+0
|
sta EAL+0
|
||||||
lda SAL+1
|
sta USER+0
|
||||||
sbc #>40
|
bcs !+
|
||||||
sta SAL+1
|
dec EAL+1
|
||||||
// convert to screen equivalent
|
dec USER+1
|
||||||
sec
|
!:
|
||||||
sbc HIBASE
|
// Next loop iteration
|
||||||
clc
|
|
||||||
adc #>$D800
|
|
||||||
sta EAL+1
|
|
||||||
|
|
||||||
dex
|
dex
|
||||||
bne copy_line_down_loop
|
bne screen_grow_logical_line_loop
|
||||||
|
|
||||||
// Restore EAL
|
screen_grow_logical_line_copy_done:
|
||||||
pla
|
|
||||||
sta EAL+1
|
|
||||||
pla
|
|
||||||
sta EAL+0
|
|
||||||
|
|
||||||
no_copy_down:
|
// Restore SAL and EAL
|
||||||
jsr screen_calculate_line_pointer
|
|
||||||
|
|
||||||
// Erase newly inserted line
|
jsr screen_restore_sal_eal
|
||||||
ldy #79
|
|
||||||
!:
|
|
||||||
lda COLOR
|
|
||||||
sta (USER),y
|
|
||||||
lda #$20
|
|
||||||
sta (PNT),y
|
|
||||||
dey
|
|
||||||
cpy #39
|
|
||||||
bne !-
|
|
||||||
|
|
||||||
rts
|
// Erase newly inserted line and quit
|
||||||
*/
|
|
||||||
|
ldx TBLX
|
||||||
|
inx
|
||||||
|
jmp screen_clear_line
|
||||||
Reference in new issue
Block a user