C64汇编存储内存地址并增加它

如何解决C64汇编存储内存地址并增加它

我现在学习 C64 的 KickAss 汇编程序,但我以前从未学习过任何汇编或 8 位计算。我想打印大的 ascii 横幅(数字)。我想将“$0400”地址存储在内存中,当我增加行号时,我需要将其增加 36(因为场景是 40 个字符宽度,所以我想跳到下一行),但我的问题是这是一个 2 字节的数字,所以我不能添加到它。这个演示工作“很好”,除了行增加,因为我不知道。

所以我需要什么:

  1. 如何可以存储2字节存储器地址在存储器?
  2. 如何增加内存地址并存储回来(2 字节)?
  3. 如何将值存储到新地址(2 个字节和索引寄存器只是一个)?

感谢很多人!

BasicUpstart2(main)

*=$1000

currentLine:
    .byte 00

main:
        printNumber(num5)
        rts


num5:   .byte $E0,$E0,$00     // XXXX(null)
        .byte $E0,$20,$00     // X   (null)
        .byte $E0,$00     // XXXX(null)
        .byte $20,$00     //    X(null)
        .byte $20,$00     //    X(null)
        .byte $E0,$00     // XXXX(null)


.macro printNumber(numberLabel)
{
    ldx #0
    lda #0
    
    lda #0
    
loop:
    lda numberLabel,x
    beq checkNextline
    sta $0400,x
    inx
    jmp loop
checkNextline: 
    inx
    inc currentLine
    lda currentLine
    cmp #7    
    beq done
    jmp loop
done:
}


// Expected output:

XXXX
X
X
XXXX
   X
   X
XXXX

// Current output:
XXXXX   X   XXXX   X   XXXXX


(where the X is the $E0 petscii char)

解决方法

clc
lda LowByte    ; Load the lower byte
adc #LowValue  ; Add the desired value
sta LowByte    ; Write back the lowbyte
lda HiByte     ; No load hi byte
adc #HiValue   ; Add the value.
sta HiByte
,

请记住,您可能需要在 $D800-$DBFF 处更新颜色内存。不同的内核版本有不同的默认值。至少有一个版本将字符颜色设置为与背景颜色相同的颜色,因此除非更新色块,否则字符将不可见。还要记住,直接写入屏幕内存使用不同的代码。

添加 16 位

在使用adc加进位)之前,您应该清除进位标志(clc)。

clc            ; Clear carry before adc
lda LowByte    ; Load the current value of LowByte
adc #LowValue  ; Add the value. Carry is set if result > 255,cleared otherwise 
sta LowByte    ; Write the result to LowByte
lda HiByte     ; Load the curent value of HiByte
adc #HiValue   ; Add the value. (use 0 if needed) The carry-flag will be used
sta HiByte     ; Write the reslt to HiByte

使用内核函数打印到屏幕

KERNAL 有一个 PLOT 函数来定位下一个字符将被打印的位置,还有一个 CHROUT 来打印 PETSCII 代码。 CHROUT 函数支持控制字符,所以你可以做 CR 来换行或改变颜色。

clc            ; Clear carry to set value
ldx #row       ; Load the desired row in the X register
ldy #column    ; Load the desired column in the Y register
jsr $FFF0      : Calling KERNAL:PLOT

lda #41        ; PETSCII code to print
jsr $FFD2      ; Calling KERNAL:CHROUT 

注意,PLOT 函数取 X 中的行和 Y 中的列,并且值是从零开始的:0,0 是左上角

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?