C64 程序集 - 6502/6510 - 依次显示一系列三个位图,然后进入字符模式

C64 Assembly - 6502/6510 - displaying a series of three bitmaps one after the other, and then moving into character mode

我有一个非常大的问题,我发现仅靠几本参考书、互联网和您的真的很难回答。

  1. 我只想显示位图。等几秒钟。
  2. 从内存中删除它。
  3. 显示另一个位图。再等等。
  4. 从内存中删除那个。
  5. 显示最终位图。等最后一回。
  6. 而且,您猜对了,从内存中删除它。
  7. 然后进入标准字符模式。 & Continue 运行我的代码 - 从空白屏幕开始,然后进入要求用户输入一些文本等...

粗体中的位我遇到了真正的麻烦!

这是我用于 运行 显示位图部分的代码,目前它只是进入无限循环...

*=00

        lda 10
        sta $d020
        sta $d021
        ldx #[=10=]

loaddccimage
        lda f40,x
        sta 00,x
        lda 40,x
        sta 00,x
        lda 40,x
        sta 00,x
        lda 40,x
        sta 00,x
        lda 28,x
        sta $d800,x
        lda 28,x
        sta $d900,x
        lda 28,x
        sta $da00,x
        lda 28,x
        sta $db00,x
        inx
        bne loaddccimage

        lda #b
        sta $d011
        lda #
        sta $d016
        lda #
        sta $d018
        
        jsr *

*=FFE
        incbin "ASTRO1.prg"

到目前为止,我已经尝试重复代码,认为它可以覆盖所有内容,但 *=$1FFE 似乎无法按时间顺序工作,对于每个文件,我都遇到内存覆盖错误它总是默认显示我用 incbin 函数调用的最后一个位图。有没有办法重置每个位图帧之间的所有内容(但只是变黑)?还是我只是错误地加载了这些图片?

然后进入字符模式也很棘手,因为即使使用一个位图我也找不到办法做到这一点。也许这整个代码结构是错误的方式,idk...

或者这只是 c64 不能做的事情?我不愿意去这里,因为我确信我以前在游戏介绍中看到过位图循环 - 只是绞尽脑汁想弄清楚它是如何完成的。

再次感谢大家,抱歉我对这里缺乏理解,我是编程新手,但我认为我走在正确的轨道上。我希望许多人可以从您的回答中学习,因为这确实是我认为没有任何信息的东西。

您的 Commodore 挚友,

詹姆斯 (Smokeyparkin)

你有三个选择。

  1. 您可以将所有三个位图包含到不同的内存位置,然后将它们一张一张地传输到正确的位置。例如,您当前将第一个位图加载到 $2000。没关系。您可以将下一个位图加载到 4800 美元和 7000 美元。然后在需要显示下一个位图时将它们相应地转移到正确的位置。
  2. 您可以将位图加载到合适的VIC 位图位置,如$2000、$6000、$e000 等。然后您需要做的就是更改$dd00 并进行bank 切换。但要小心,$6000 可以,但要使用 $e000,您需要禁用 Kernal ROM。那里的事情变得有点棘手,您需要 fiddle 使用 $01 值。
  3. 您可以使用像 Krill 的 IRQ 加载器这样的 IRQ 加载器。你可以在网上搜索它。使用 IRQ 加载程序,您可以包含第一个位图,然后再次将其他位图从磁盘加载到 $2000 位置并重复相同的操作。当然,您可能想显示其他内容,可能是在加载期间显示加载消息。更好的方法是为位图使用 $2000 和 $6000,将下一张图片加载到其他银行并再次使用 $dd00 进行银行切换。这样您的初始 PRG 文件将只包含第一张图片,您可以从磁盘加载其余图片。

关于回到字符模式,只需将$d011、$d016 和$d018 设置为它们的初始值就足够了(如果您更改它,也可以设置为$dd00)。

    lda #b
    sta $d011
    lda #$c8
    sta $d016
    lda #
    sta $d018

为了造成延迟,请在此处查看我的回答: How to create a delay in asm for the MOS 6502

对于键盘输入,请在此处查看我的答案: Compare keystrokes - Assembly CCS64