第 1 行的 commodore 64 smooth scroller - 如果在第 0 行设置中断,则在屏幕上跳来跳去
commodore 64 smooth scroller on line 1 - is jumping around on the screen if interrupt set on line #0
我在屏幕的第 1 行有这个水平平滑滚动的文本。平滑滚动效果是使用 $d016 硬件滚动效果通过迭代 $d016 的 7 个最低位来实现的)。滚动条在屏幕的第一行运行。我设置了两个光栅中断。
"noScroller"中断是屏幕不应该滚动的部分
- 这是除第 1 行之外的整个屏幕。
"scroller" 是第 1 行发生的中断。
我已将此中断设置为 #50,尽管我认为将其设置为 #0 是有意义的,因为滚动只应发生在第 1 行,但如果我将其设置为 #0,则滚动文本会跳来跳去。
"noscroller" 中断设置为在第 66 行发生 - 如果我将它设置为 #58,这似乎是第 1 行发生的地方,那么滚动文本开始奇怪地跳来跳去。
我的问题是我不知道我的 2 个中断有什么问题。我想让 $d016 平滑滚动只发生在第 1 行,但我必须使屏幕滚动区域比第 1 行更大,否则文本会跳来跳去。这是我的工作代码(滚动屏幕区域太大):
*=$c000
sei
lda #f
sta $dc0d
sta $dd0d
and $d011
sta $d011
ldy #50
sty $d012
lda #<scroller
ldx #>scroller
sta 14
stx 15
lda #
sta $d01a
cli
rts
noScroller lda $d016
and #$f8
sta $d016
ldy #50
sty $d012
lda #<scroller
ldx #>scroller
sta 14
stx 15
inc $d019
jmp $ea31
scroller lda $d016
and #$f8
adc offset
sta $d016
dec offset
bpl continue
lda #07
sta offset
shiftrow ldx #[=10=]
lda 01,x
sta 00,x
inx
cpx #39
bne shiftrow+2
fetchnewchar ldx nextchar
lda message,x
sta 27
inx
lda message,x
cmp #255
bne continue-3
ldx #00
stx nextchar
continue ldx #66
stx $d012
lda #<noScroller
ldy #>noScroller
sta 14
sty 15
inc $d019
jmp $ea31
offset byte 07
nextchar byte 00
message byte 011, 009, 012, 018, 015, 025, 032, 023, 001, 019, 032, 006, 009, 014, 001, 012, 012, 025, 032, 008, 005, 018, 005, 032, 032, 032, 032, 032, 032, 255
好久不见了 ;-) 我记得在中断中做真正的工作有时会出问题,因为计算机很忙,你不会及时得到下一个中断。当你在那个区域时,你确实更新了 00
区域,那会闪烁。也许这就是您需要增加 window 扫描线的原因。
我建议您尝试将寄存器 $d016
的更改与存储在 00
的文本分开。重置 $d016
后,将文本复制移至第二个中断 noScroller
,因为那里有您需要的所有时间。在您再次点击顶部扫描线之前,更改将不可见。然后再次尝试扫描线 $d012
,如果您可以使该区域正好与需要的一样小。
在调试过程中,您可以在中断开始时更改屏幕的背景颜色,并在结束时重置它。您应该会在屏幕上看到一条有点晃动的彩色短线。这将向您显示 "where" 您的中断正在发生。如果您发现每 8 次中断都花费太长时间,请尝试将循环 shiftrow
展开 39 次 LDA/STA,这样会更快。
我在屏幕的第 1 行有这个水平平滑滚动的文本。平滑滚动效果是使用 $d016 硬件滚动效果通过迭代 $d016 的 7 个最低位来实现的)。滚动条在屏幕的第一行运行。我设置了两个光栅中断。
"noScroller"中断是屏幕不应该滚动的部分 - 这是除第 1 行之外的整个屏幕。
"scroller" 是第 1 行发生的中断。 我已将此中断设置为 #50,尽管我认为将其设置为 #0 是有意义的,因为滚动只应发生在第 1 行,但如果我将其设置为 #0,则滚动文本会跳来跳去。
"noscroller" 中断设置为在第 66 行发生 - 如果我将它设置为 #58,这似乎是第 1 行发生的地方,那么滚动文本开始奇怪地跳来跳去。
我的问题是我不知道我的 2 个中断有什么问题。我想让 $d016 平滑滚动只发生在第 1 行,但我必须使屏幕滚动区域比第 1 行更大,否则文本会跳来跳去。这是我的工作代码(滚动屏幕区域太大):
*=$c000
sei
lda #f
sta $dc0d
sta $dd0d
and $d011
sta $d011
ldy #50
sty $d012
lda #<scroller
ldx #>scroller
sta 14
stx 15
lda #
sta $d01a
cli
rts
noScroller lda $d016
and #$f8
sta $d016
ldy #50
sty $d012
lda #<scroller
ldx #>scroller
sta 14
stx 15
inc $d019
jmp $ea31
scroller lda $d016
and #$f8
adc offset
sta $d016
dec offset
bpl continue
lda #07
sta offset
shiftrow ldx #[=10=]
lda 01,x
sta 00,x
inx
cpx #39
bne shiftrow+2
fetchnewchar ldx nextchar
lda message,x
sta 27
inx
lda message,x
cmp #255
bne continue-3
ldx #00
stx nextchar
continue ldx #66
stx $d012
lda #<noScroller
ldy #>noScroller
sta 14
sty 15
inc $d019
jmp $ea31
offset byte 07
nextchar byte 00
message byte 011, 009, 012, 018, 015, 025, 032, 023, 001, 019, 032, 006, 009, 014, 001, 012, 012, 025, 032, 008, 005, 018, 005, 032, 032, 032, 032, 032, 032, 255
好久不见了 ;-) 我记得在中断中做真正的工作有时会出问题,因为计算机很忙,你不会及时得到下一个中断。当你在那个区域时,你确实更新了 00
区域,那会闪烁。也许这就是您需要增加 window 扫描线的原因。
我建议您尝试将寄存器 $d016
的更改与存储在 00
的文本分开。重置 $d016
后,将文本复制移至第二个中断 noScroller
,因为那里有您需要的所有时间。在您再次点击顶部扫描线之前,更改将不可见。然后再次尝试扫描线 $d012
,如果您可以使该区域正好与需要的一样小。
在调试过程中,您可以在中断开始时更改屏幕的背景颜色,并在结束时重置它。您应该会在屏幕上看到一条有点晃动的彩色短线。这将向您显示 "where" 您的中断正在发生。如果您发现每 8 次中断都花费太长时间,请尝试将循环 shiftrow
展开 39 次 LDA/STA,这样会更快。