第一行的Commodore 64平滑滚动条,如果在线0设置中断,则在屏幕上跳动。

3
我有一行水平平滑滚动的文本在屏幕上第一行。平滑滚动效果使用$ d016硬件滚动效果,通过迭代$ d016的7个最低位)来实现。滚动器运行在屏幕的第1行。我设置了两个光栅中断。
“noScroller”中断是不应该滚动的屏幕部分 -整个屏幕除了第一行。
“scroller”是发生在第1行的中断。 我将此中断设置为#50,尽管我认为将其设置为#0是有意义的,因为滚动只应在第1行发生,但如果我将其设置为#0,则滚动文本会跳来跳去。
“noscroller”中断设置为发生在第#66行-如果我将其设置为似乎是第1行发生的地方的#58,则滚动文本开始奇怪地跳来跳去。
我的问题是我不知道我的2个中断有什么问题。我希望$ d016平滑滚动仅在第1行发生,但我必须使屏幕上更大的区域滚动而不仅仅是第1行,否则文本将跳来跳去。这是我的工作代码(具有太大的滚动屏幕区域):
            *=$c000
            sei
            lda #$7f
            sta $dc0d
            sta $dd0d
            and $d011
            sta $d011                  
            ldy #50
            sty $d012
            lda #<scroller
            ldx #>scroller
            sta $0314
            stx $0315
            lda #$01
            sta $d01a
            cli
            rts

 noScroller      lda $d016
            and #$f8
            sta $d016
            ldy #50
            sty $d012
            lda #<scroller
            ldx #>scroller
            sta $0314
            stx $0315
            inc $d019
            jmp $ea31        


scroller        lda $d016
            and #$f8
            adc offset
            sta $d016
            dec offset
            bpl continue
            lda #07
            sta offset

 shiftrow        ldx #$00
            lda $0401,x
            sta $0400,x
            inx
            cpx #39
            bne shiftrow+2

 fetchnewchar    ldx nextchar                
            lda message,x
            sta $0427
            inx
            lda message,x
            cmp #255
            bne continue-3
            ldx #00
            stx nextchar

 continue       ldx #66
           stx $d012
           lda #<noScroller
           ldy #>noScroller
           sta $0314
           sty $0315
           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
1个回答

1
很长时间了;-)我记得在中断中进行实际工作有时会有问题,因为计算机很忙,你将无法及时获得下一个中断。当你在该区域内更新$0400区域时,那将会闪烁。也许这就是你需要增加扫描线窗口的原因。
我建议您尝试将寄存器$d016的更改与存储文本在$0400处分开。将文本复制到第二个中断noScroller中,在重置$d016之后进行,因为您有足够的时间。在再次达到顶部扫描线之前,不会看到变化。然后再次尝试使用扫描线$d012,看看是否可以将区域缩小到所需大小。
在调试过程中,您可以在中断开始时更改屏幕的背景颜色,并在结束时重置它。您应该在屏幕上看到一个短的彩色线条,稍微晃动一下。这将向您展示“何处”发生了您的中断。如果您发现每8个中断都花费了太长时间,请尝试使用39次LDA/STA展开循环shiftrow,这样会更快。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接