Assembly commodore 64 smooth scroller位于第1行-如果中断设置在第0行,则会在屏幕上跳跃

Assembly commodore 64 smooth scroller位于第1行-如果中断设置在第0行,则会在屏幕上跳跃,assembly,c64,6510,Assembly,C64,6510,我在屏幕上的第1行有这个水平平滑滚动的文本。平滑滚动效果是使用$d016硬件滚动效果通过迭代$d016的7个最低位来实现的。滚动条在屏幕的第1行运行。我设置了两个光栅中断 “noScroller”中断是屏幕上不应滚动的部分 -这是除第1行之外的整个屏幕 “滚动条”是发生在第1行的中断。 我已将此中断设置为#50,尽管我认为将其设置为#0是有意义的,因为滚动只应发生在第1行,但如果我将其设置为#0,则滚动文本会跳转 “noscroller”中断设置为发生在第66行-如果我将其设置为第58行,这似乎

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

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

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

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

我的问题是我不知道我的两次中断有什么问题。我想让$d016平滑滚动只发生在第1行,但我必须使屏幕滚动比第1行更大的区域,否则文本将跳转。这是我的工作代码(滚动屏幕区域太大):

*=$c000
软件工程研究所
lda#7f美元
sta$dc0d
sta$dd0d
和d011美元
sta$d011
ldy#50
sty$d012
卷轴
sta$0314
新加坡元$0315
lda#01美元
sta$d01a
cli
即时战略
诺思克罗尔lda$d016
和#$f8
sta$d016
ldy#50
sty$d012
卷轴
sta$0314
新加坡元$0315
公司:d019美元
jmp$ea31
滚动条lda$d016
和#$f8
模数转换器偏移量
sta$d016
十二月偏移量
bpl继续
lda#07
sta偏移量
shiftrow ldx#00美元
lda$0401,x
sta$0400,x
因克斯
cpx#39
bne shiftrow+2
fetchnewchar ldx nextchar
lda消息,x
sta$0427
因克斯
lda消息,x
cmp#255
bne-3
ldx#00
stx nextchar
继续ldx#66
新加坡元d012
诺斯克罗尔酒店
sta$0314
零三一五元
公司:d019美元
jmp$ea31
偏移字节07
nextchar字节00
消息字节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、255
已经很久了;-)我记得在中断中做真正的工作有时是有问题的,因为计算机很忙,你不能及时得到下一个中断。当您在
$0400
区域中时,确实会更新该区域,该区域将闪烁。也许这就是你需要增加扫描线窗口的原因

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

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

            *=$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