assembly - Commodore 64 平滑滚动条位于第 1 行 - 如果在第 0 行设置了中断,则会在屏幕上跳跃

标签 assembly c64 6510

屏幕上的第 1 行有水平平滑滚动的文本。平滑滚动效果是使用 $d016 硬件滚动效果通过迭代 $d016 的 7 个最低位来实现的。滚动条在屏幕的第一行运行。我设置了两个光栅中断。

“noScroller”中断是屏幕上不应该滚动的部分 - 除第 1 行外的整个屏幕。

“scroller”是发生在第 1 行的中断。 我已将此中断设置为 #50,尽管我认为将其设置为 #0 是有意义的,因为滚动应该只发生在第 1 行,但如果我将其设置为 #0,则滚动文本会跳转。

“noscroller”中断设置为在第 #66 行发生 - 如果我将其设置为 #58(这似乎是第 1 行发生的地方),则滚动文本开始奇怪地跳跃。

我的问题是我不知道我的 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

最佳答案

已经很久了;-)我记得在中断中做实际工作有时会出现问题,因为计算机很忙,你将无法及时得到下一个中​​断。当您位于 $0400 区域时,您会更新该区域,该区域将会闪烁。也许这就是您需要增加扫描线窗口的原因。

我建议您尝试将寄存器 $d016 的更改与存储 $0400 中的文本分开。重置 $d016 后,将文本复制移至第二个中断 noScroller 中,因为那里有您需要的所有时间。在您再次点击顶部扫描线之前,更改将不可见。然后再次尝试扫描线 $d012,如果您可以使该区域精确到所需的大小。

在调试过程中,您可以在中断开始时更改屏幕的背景颜色并在结束时重置它。您应该在屏幕上看到一条有点摇晃的短彩色线。这将向您显示中断发生的“位置”。如果您发现每 8 个中断花费的时间太长,请尝试使用 39 次 LDA/STA 展开循环 shiftrow,这样速度更快。

关于assembly - Commodore 64 平滑滚动条位于第 1 行 - 如果在第 0 行设置了中断,则会在屏幕上跳跃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55076838/

相关文章:

assembly - C64 上的稳定光栅

assembly - 比较击键 - assembly CCS64

java - 模拟器框架

assembly - 将两个数字放入 EAX 寄存器

assembly - cmp 和 ja 问题

c - 32 位处理器上的程序集标签地址不正确

c64 - 如何在 Commodore 64 中禁用屏幕?

assembly - 汇编编译中 "pass"是什么意思

c# - AI 运动 100% 像 C64 上的游戏 MAFIA

emulation - 模拟器如何工作以及它们是如何编写的?