nex*_*006 4 string assembly 6502 commodore
我正在通过C64仿真器学习6502 micro的装配。当前正在尝试将字符串输出到屏幕。这是我的代码:
processor 6502
org $1000
ldx #$00 ;using x register as column counter
print:
lda message,x;load a with x bit from message
sta $0400,x ;store this bit in row 0 col 0 address
inx ;x++
cpx #$05 ;is x >= 5?
bne print ;if not x >= 5, loop again
rts ;return from program
message dc "HELLO"
hexmsg dc $08,$05,$0c,$0c,$0f
Run Code Online (Sandbox Code Playgroud)
因为我的编辑器(胜利10上的notepad ++)使用类似ascii的字符代码,所以"HELLO"
输入message
是48 45 4C 4C 4F。这将在屏幕的左上角提供以下输出:
我想这是正确的,请看这里的commodore屏幕代码表。
如果将第6行更改为,lda hexmsg,x
那么我将得到确切的字眼HELLO
。
我对DASM汇编器不是很熟悉,无法找到它的完整文档(如果存在)。我发现的大多数教程都只有您声明message .byte "HELLO"
或类似的内容,它之所以起作用,是因为他们使用的汇编器会自动将类似ascii的文本字符串自动转换为准字符串,但DASM似乎不这样做。
有谁知道我可以让DASM执行此操作的方法,还是推荐另一种方法来简单地将字符串键入汇编器,而不是手动将我的字符串作为一堆十六进制数据输入?
啊哈,ASCII编码与Commodore屏幕代码。我们都去过那里。您有几种选择:
不要直接写入屏幕内存,而应使用Kernal CHROUT例程(可能通过更高级别的字符串输出例程)。然后,您只需要担心ASCII和PETSCII之间的区别,但这又是另一个故事了。同样,这对于文本来说很好,但是对于游戏来说很烂,因为与直接写入相比,内核的速度很慢。
编写一个小的转换例程,该例程在程序启动时运行,吃掉您的字符串表,并吐出等效的转换屏幕代码。只要您的字符串都在一起并且您没有编写基于ROM的应用程序(该应用程序将无法进行就地转换),便可以快速高效地进行操作。
在您的构建脚本中编写一个运行在DASM之前的DASM预处理程序,基本上执行与上面#2相同的转换,但是在汇编程序看到之前将其转换为源代码。这可能有点陈旧,您必须确保在备份原始源之前对其进行备份。
获取DASM源代码并对其进行修补,以调用与第二种相同但在组装过程中即时进行的新数据类型(用于屏幕代码)的用户出口。非常陈旧。
在字符串中使用小写字母,这将在汇编过程中转换为等效的大写屏幕代码。您可能忽略了以下事实:您看到的是字符串中字符的移位表示,在默认显示模式下为图形符号。
从所有5个选项的经验来看,我已经选择了#2。
另外:切换到KickAssembler,这
小智 5
自从我对6510进行编程以来已经有一段时间了。(如果没有按下来保存C64存储器的每个单个字节。使其比计算字符串长度更方便:D
processor 6502
org $1000
printstring:
ldx #$00
printstrlp:
lda message,x
cmp #0
beq quitstr
cmp #32 ;' ' character
beq noconv
cmp #33 ;! character
beq noconv
cmp #42 ;* character
beq noconv
cmp #48 ;numbers 0-9
bcs numconv
conv:
sec
sbc #$40
noconv:
sta $0400,x
inx
bne printstrlp
quitstr:
rts
numconv:
cmp #58
bcc noconv
jmp conv
message dc "** HELLO C64 WORLD! **",0
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1026 次 |
最近记录: |