C64汇编存储内存地址并增加它
C64 assembly store memory address and increase it
我现在正在学习 C64 的 KickAss 汇编器,但我以前从未学过任何 asm 或 8 位计算。我想打印大的 ascii 横幅(数字)。我想将“$0400”地址存储在内存中,当我增加行号时,我需要将其增加 36(因为屏幕宽度为 40 个字符,所以我想跳到下一行),但我的问题是这是一个 2 字节的数字,所以我不能只添加它。这个演示工作“很好”,除了行增加,因为我不知道。
所以我需要什么:
- 如何在内存中存储一个 2 字节的内存地址?
- 如何增加内存地址并存储回(2 字节)?
- 如何将值存储到新地址(2 个字节和索引寄存器只是一个)?
非常感谢大家!
BasicUpstart2(main)
*=00
currentLine:
.byte 00
main:
printNumber(num5)
rts
num5: .byte $E0, $E0, $E0, $E0, [=10=] // XXXX(null)
.byte $E0, , , , [=10=] // X (null)
.byte $E0, , , , [=10=] // X (null)
.byte $E0, $E0, $E0, $E0, [=10=] // XXXX(null)
.byte , , , $E0, [=10=] // X(null)
.byte , , , $E0, [=10=] // X(null)
.byte $E0, $E0, $E0, $E0, [=10=] // XXXX(null)
.macro printNumber(numberLabel)
{
ldx #0
lda #0
lda #0
loop:
lda numberLabel,x
beq checkNextline
sta 00,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 的颜色 ram。不同的内核版本有不同的默认值。至少有一个版本将字符颜色设置为与背景颜色相同的颜色,因此除非更新颜色 ram,否则字符将不可见。还要记住,直接写入屏幕内存使用不同的代码。
加 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 是左上角
我现在正在学习 C64 的 KickAss 汇编器,但我以前从未学过任何 asm 或 8 位计算。我想打印大的 ascii 横幅(数字)。我想将“$0400”地址存储在内存中,当我增加行号时,我需要将其增加 36(因为屏幕宽度为 40 个字符,所以我想跳到下一行),但我的问题是这是一个 2 字节的数字,所以我不能只添加它。这个演示工作“很好”,除了行增加,因为我不知道。
所以我需要什么:
- 如何在内存中存储一个 2 字节的内存地址?
- 如何增加内存地址并存储回(2 字节)?
- 如何将值存储到新地址(2 个字节和索引寄存器只是一个)?
非常感谢大家!
BasicUpstart2(main)
*=00
currentLine:
.byte 00
main:
printNumber(num5)
rts
num5: .byte $E0, $E0, $E0, $E0, [=10=] // XXXX(null)
.byte $E0, , , , [=10=] // X (null)
.byte $E0, , , , [=10=] // X (null)
.byte $E0, $E0, $E0, $E0, [=10=] // XXXX(null)
.byte , , , $E0, [=10=] // X(null)
.byte , , , $E0, [=10=] // X(null)
.byte $E0, $E0, $E0, $E0, [=10=] // XXXX(null)
.macro printNumber(numberLabel)
{
ldx #0
lda #0
lda #0
loop:
lda numberLabel,x
beq checkNextline
sta 00,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 的颜色 ram。不同的内核版本有不同的默认值。至少有一个版本将字符颜色设置为与背景颜色相同的颜色,因此除非更新颜色 ram,否则字符将不可见。还要记住,直接写入屏幕内存使用不同的代码。
加 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 是左上角