3

我在这里有一个相当大的问题,我发现仅用几本参考书、互联网和你的真正难以回答。

  1. 我只想显示一个位图。等待几秒钟。
  2. 把它从记忆中抹去。
  3. 显示另一个位图。再等等。
  4. 从记忆中抹去那个。
  5. 显示最终位图。等最后一次。
  6. 而且,你已经猜到了,把它从记忆中抹去。
  7. 然后进入标准字符模式。 &继续运行我的代码 - 从屏幕空白开始,然后进入询问用户一些文本输入等......

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

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

*=$1000

        lda $4710
        sta $d020
        sta $d021
        ldx #$00

loaddccimage
        lda $3f40,x
        sta $0400,x
        lda $4040,x
        sta $0500,x
        lda $4140,x
        sta $0600,x
        lda $4240,x
        sta $0700,x
        lda $4328,x
        sta $d800,x
        lda $4428,x
        sta $d900,x
        lda $4528,x
        sta $da00,x
        lda $4628,x
        sta $db00,x
        inx
        bne loaddccimage

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

*=$1FFE
        incbin "ASTRO1.prg"

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

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

或者这仅仅是c64无法做到的事情?我不愿意去这里,因为我确信我以前在游戏介绍中看到过位图循环——只是真的挠头想知道怎么做。

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

你爱准将的朋友,

詹姆斯(Smokeyparkin)

4

1 回答 1

3

你有三个选择。

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

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

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

要创建延迟,请在此处查看我的答案: How to create a delay in asm for the MOS 6502

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

于 2021-07-12T09:19:00.200 回答