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

问题描述

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

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

粗体我真的有问题!

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

*=$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 不能做的事情?我不太愿意去这里,因为我确信我之前在游戏介绍中看到过位图循环 - 只是真的在摸索着弄清楚如何做到这一点。

再次感谢大家,对于这里缺乏理解,我很抱歉,一般来说我是编程新手,但我认为我走在正确的轨道上。我希望很多人能从你的回答中学到东西,因为我认为这确实是一些关于这方面的信息。

您的 Commodore 挚友,

詹姆斯(Smokeyparkin)

解决方法

你有三种选择。

  1. 您可以将所有三个位图都包含到不同的内存位置,并将它们一一传输到正确的位置。例如,您当前将第一个位图加载到 2000 美元。没关系。您可以将下一个位图加载到 4800 美元和 7000 美元。然后在需要显示下一个位图时将它们相应地转移到正确的位置。
  2. 您可以将位图加载到合适的 VIC 位图位置,例如 $2000、$6000、$e000 等。然后您需要做的就是更改 $dd00 并进行银行转换。但是要小心,$6000 是可以的,但是要能够使用 $e000,您需要禁用 Kernal ROM。那里的事情变得有点棘手,您需要摆弄 $01 的值。
  3. 您可以使用 IRQ 加载器,例如 Krill 的 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...