两个有用的代码是:
1. 将内存中的一个字节与X寄存器进行比较(缩写:CPX,十六进制:EC)。如果相等,则将Z标志设置为零。 2. 如果Z标志= 0,则跳转X个字节(缩写:BNE,十六进制:D0)
这里有一个适合你开始学习的地方。该页面提供了一个交叉汇编器,可以在您的 PC 上运行。这 可能 是您的良好开发平台。
在进行任何操作之前,您必须了解 6502 的运作原理。然后,您需要了解包括以下内容的软件开发过程:
-- 准备所谓的符号指令的“源文件”,即您称之为“速记”
-- 使用汇编器将该源文件翻译成 6502 可以理解的机器指令
-- 将翻译加载到 6502 中
-- 告诉 6502 执行已翻译的机器指令
您的示例程序尝试从 SRC
复制 LEN
内存字节到 DST
。
您的格式如下:
LDX #0 ; Start with the first byte
_LOOP LDA SRC,X ; load a byte from SRC into the A register
STA DST,X ; store that byte into DST
INX ; bump the index register to point to the next SRC and DST locations
CPX #LEN ; have we moved LEN characters?
BNE _LOOP ; if not, go move the next one
当你添加更多语句行(例如像END
)之后,并且定义了SRC
、DST
和LEN
,你需要将整个内容保存在一个文件中,比如叫做cploop.txt
。
然后告诉汇编程序进行翻译。汇编程序输出一个二进制的6502机器码文件,可以表示为你所说的十六进制字节。
你将这个机器码文件输入到模拟的6502中。然后以某种方式告诉6502执行机器码所包含的操作。
LDX #LEN ; 从最后一个字节开始
_LOOP LDA SRC,X ; 从SRC中加载一个字节到A寄存器中
STA DST,X ; 将该字节存储到DST中
DEX ; 增加索引寄存器,指向下一个SRC和DST位置
BNE _LOOP ; 如果不为零,则继续移动下一个 - Eight-Bit Guru* = 4000 ; This is the address where our program will be stored
LDX #len
loop LDA src,X
STA dest,X
DEX
BNE loop
len
、src
和dest
的值:src = $1234
dest = $5678
len = 10
loop
名称需要理解的是,就像src
被分配了值$1234
一样,loop
将被分配为其后面指令的地址。因此,在这种情况下,由于LDX#len
占用2个字节(我很快会向您展示),loop
设置为$4000 + 2 = $4002
。这是由汇编器自动完成的,但当然您也可以在纸上完成所有这些工作。A2 0A
BD 34 12
9D 78 56
CA
D0 F7
4000 LDX #LEN A2 0A
4002 LOOP LDA SRC,X BD 34 12
4005 STA DEST,X 9D 78 56
4008 DEX CA
4009 BNE LOOP D0 F7
400B
LOOP
并未用于计算BNE LOOP
的机器码,只用于与BNE
指令本身的相对地址进行比较: F7
是-9,而$400B
和$4002
之间的差为-9!因此,如果您手动执行此操作,只需将其他所有内容转换为机器码,然后当您到达跳转时,计算下一条指令的起始地址与跳转目标地址之间的差。它应该为负数表示向后跳转,为正数表示向前跳转。
$D0 $00
:无操作,不考虑条件分支到下一条指令$D0 $FE
:分支指向自身,如果Z=0
则创建一个无限循环。while
语句的真正含义是:
使用6502,除非您可以做出很多假设,否则这些都不会非常简单。如果您要测试的条件始终是一个寄存器,则比较指令(cmp、cpx、cpy)和分支指令显然是您需要的1。
如果它将成为存储在内存中的单个字节,则需要加载该字节,然后进行比较。
如果它是存储在两个字节中的16位值,则需要加载并测试每个字节的值。
处理浮点数?如果您编写了或可用于您的浮点包(例如Commodore 64 ROM BASIC浮点例程),则需要使用它们。
您可以看到为什么高级语言具有数据类型。
因此,实际上取决于您正在处理的数据类型,但是在6502中的任何while
实现应基本遵循上述流程。
如果您知道要比较的数据始终在X中,并且目标始终与+127/-128字节相差(Bxx指令的范围限制),则您在问题中确定的特定情况是可行的。