📄 6502微处理器硬件资料.txt
字号:
6502 微处理器
下面的大多数信息都在 "Commodore 64 Programmers Reference Manual" 中简单的谈到过,因为它在电
工结构上是可用的,并且这片文档和6502文档没有什么差别,毕竟他们都是6500家族的. 我在合适的地方
做了信息的修改和添加.
理论上你可以用任何你可以找到的代码来模拟6510 (C64处理器).
+------------------------+
| 6502微处理器中的寄存器 |
+------------------------+
绝大多数的计算都在微处理器中进行. 寄存器是处理器中特别的储存块,它别用来取出和保存处理的信息.
6502有以下的寄存器:
+----------------------+
| 累加器 (Accumulator) |
+----------------------+
这是微处理器里最重要的寄存器. 很多种机器语言指令都允许你拷贝内存中某个位置的内容到累加器中,允
许你拷贝累加器中的内容到内存某个位置中,直接修改累加器或其他寄存器的内容而不影响到任何内存. 累
加器是唯一有执行数学计算指令的寄存器.
+---------------------------------+
| X 索引寄存器 (X Index Register) |
+---------------------------------+
它是非常重要的寄存器. 那里有几乎所有你能够改变累加器的指令. 但是有一些只有 X 寄存器能够执行的指
令. 许多机器语言指令都允许你拷贝内存的某个位置中的内容到 X 寄存器,拷贝 X 寄存器中的内容到内存
的某个位置中,直接修改 X 或者其他寄存器的内容.
+---------------------------------+
| Y 索引寄存器 (Y Index Register) |
+---------------------------------+
它是非常重要的寄存器. 那里有几乎所有你能够改变累加器和 X 寄存器的指令. 但是有一些只有 X 寄存器能
够执行的指令. 许多机器语言指令都允许你拷贝内存的某个位置中的内容到 Y 寄存器,拷贝 Y 寄存器中的内
容到内存的某个位置中,直接修改 Y 或者其他寄存器的内容.
+------------------------------+
| 状态寄存器 (Status Register) |
+------------------------------+
这个寄存器包括8个 "标记" (标记 = 显示某些事情发生或者没有发生的东西). 这个寄存器中的位的值得修改
依赖于算术和逻辑运算的结果. 位被描述如下:
Bit No. 7 6 5 4 3 2 1 0
S V B D I Z C
Bit 0 - C - 进位标记 (Carry flag): 这个标记保存了任何算术操作的大多数重要的位的进位. 然而在减法操
作中,这个标记被清空 - 需要借位责备设置为0,不需要借位则被设置为1. 进位标记也在逻辑操作转移
(shift)和交替 (rorate) 中被使用.
Bit 1 - Z - 零标记 (Zero flag): 当任何的算术或逻辑操作产生零结果的时候被设置为1,产生非零结果时被
设置为0.
Bit 2 - I: 这是一个允许/禁止中断标记. 如果被设置,则禁止中断. 如果被清空,则允许中断.
Bit 3 - D: 这是十进制模式状态标记. 当这个标记被设置,并且需要进位的加或者需要进位的减被执行,原始
值就被转换成为有效的 BCD 码 (Binary Codec Decimal: 二--十进制码,例如: 0x00 - 0x99 = 0 - 99). 生成
的结果仍旧是 BCD 码.
Bit 4 - B: 当一个软件中断 (BRK 指令)被执行的时候,这个标记被设置.
Bit 5: 未被使用. 任何时候都假定是逻辑1.
Bit 6 - V - 溢出标记 (Overflow flag): 当一个算术操作产生出一个过大的结果 (比一字节能描述的大), V 标
记被设置.
Bit 7 - S - 信号标记 (Sign flag): 当一个操作的结果被否定时,这个标记被设置; 当结果被肯定是,标记被清
空.
+------------------------------+
| 指令计数器 (Program Counter) |
+------------------------------+
这个寄存器保存着当前被执行的机器语言指令的地址. 由于 Commodore VIC-20 的操作系统一直在运行着 (或者,
任何操作系统),指令计数器总是改变着. 它只有在通过某种方法中断微处理器的时候停止.
+------------------------+
| 栈指针 (Stack Pointer) |
+------------------------+
这个寄存器保存了栈中第一个空区域的位置. 栈是被机器语言程序和计算机使用来临时储存的.
+-----------------------------+
| 地址模式 (Addressing Modes) |
+-----------------------------+
指令需要操作数来操作. 有多种方法来标记处理器从哪里得到操作数. 被用来这样做的不同的方法叫做地址模式.
6502提供11种模式,下面有描述.
1) 快速模式 (Immediate)
在这种模式中,操作数的值在指令中被给出. 在汇编语言中,这种模式以操作数前加 "#" 来标记.
例如: LDA #$0A - 意思是 "load the accumulator with the hex value 0A"
在机器代码中,不同的模式以不同的代码标记. 所以 LDA 将依赖于不同的地址模式被翻译成不同的代码. 在这种
模式中,代码是: $A9 $0A
2) & 3) 完全和完全零页面模式 (Absolute and Zero-page Absolute)
在这种模式中,操作数地址被给出.
例如: LDA $31F6 - (汇编语言)
$AD $31F6 - (机器代码)
如果地址不是在零页面 - 也就是,任何高字节不是00的地址 - 只有一个字节需要给出. 处理器自动将高字节填为00.
例如: LDA $F4
$A5 $F4
注意不同的模式中不同的指令代码.
同时注意对于两字节地址,低字节先被储存,例如: LDA $31F6 在内存中被存为三个字节: $AD $F6 $31.
绝对零页面通常被叫做零页面.
4) 隐含模式 (Implied)
这种模式不需要任何操作数地址. 它们隐含在指令中.
例如: TAX - (将累加器中的值传给 X 寄存器)
$AA
5) 累加器 (Accumulator)
这种模式中,指令操作累加器中的数据,所以不需要操作数.
例如: LSR - 逻辑位右移 (logical bit shift right)
$4A
6) & 7) 索引和零页面索引 (Indexed and Zero-page Indexed)
在这种模式中,被给出的地址的值将被与 X 或 Y 索引寄存器中的值相加以成为真正的操作数地址.
例如: LDA $31F6, Y
$D9 $31F6
LDA $31F6, X
$DD $31f6
注意不同的操作代码将由被使用的索引寄存器确定. 在零页面中,你需要注意,X 与 Y 寄存器的值都是不可互换的.
大多数能够以零页面索引方式工作的都仅用于 X 索引.
例如: LDA $20, X
$B5 $20
8) 间接 (Indirect)
这种模式仅适用于 JMP 指令 - 转到新位置 (JuMP to new location). 它的标志是操作数上的圆括号. 操作数是保
存有新位置的字节的地址.
例如: JMP ($215F)
假定: - byte value
$215F $76
$2160 $30
这个指令将获取 $215F, $2160 两个字节中的值,然后把它当作转到的地址 - 也就是,$3076 (记得地址中的低字节
先被存储).
9) 预索引间接 (Pre-indexed indirect)
这种模式是将一个零页面地址加上 X 寄存器中的内容,然后给出保存操作数地址的字节的地址. 间接模式在汇编语言
中是由圆括号标记.
例如: LDA ($3E, X)
$A1 $3E
假定: - byte value
X.reg $05
$0043 $15
$0044 $24
$2415 $6E
这条指令将被如下执行:
(i) $3E + $05 = $0043
(ii) 获取 $0043, $0044 两字节中保存的地址 = $2415
(iii) 读取 $2415 中的内容 - 也就是,$6E - 进入累加器
10) 传递索引间接 (Post-indexed indirect)
在这种模式中,一个零页面地址的内容 (包括其后面的字节) 给出一个间接地址,该地址中的内容将与 Y 寄存器中的
值相加生成出操作数的真实地址. 同样,在汇编语言中,这个指令由圆括号标记.
例如: LDA ($4C), Y
注意,圆括号只括起来了指令中的第二个字节,因为它是做间接操作的一部分.
假定: - byte value
$004C $00
$004D $21
Y.reg $05
$2105 $6D
这条指令将被如下执行:
(i) 读取字节 $4C, $4D 中的内容 = $2100
(ii) 与 Y 寄存器中的内容相加 = $2105
(iii) 读取字节 $2105 中的内容 - 也就是,$6D 到累加器.
注意,这种模式中,仅使用了 Y 寄存器.
11) 关系 (Relative)
这种模式使用分支状况指令 (Branch-on-Condition instructions). 这可能是你使用最多的一种模式. 一个单字节值
将被加到指令计数器中,然后程序就从那个地址继续执行. 这个单字节数将被认为是一个有符号数 - 也就是说,如果
7号位是1,则0-6号位给出的信息将被否定; 如果7号位是0,则此数被肯定. 当升至127字节时,这种模式起用了一种至
任何方向的分支转移 (Branch displacement).
例如: 位号: 7 6 5 4 3 2 1 0 有符号值 无符号值
值 1 0 1 0 0 1 1 1 -39 $A7
值 0 0 1 0 0 1 1 1 +39 $27
指令范例:
BEQ $A7
$F0 $A7
这个指令将检查零状态位. 如果被设置,十进制39将从指令计数器中减去,然后程序从那个地址开始执行 (应该是减去
39后的指令计数器中的地址 -- 译注). 如果零状态位没有被设置,程序从接下来的地址执行.
注意: a) 在分支指令后,分支转移之前,指令计数器指向指令的开始处.
b) 分支状况指令通过检查状态寄存器中的相关状态位来工作.
c) 如果你发现你需要的分支超过127个字节,可使用相反的分支状态和一个 JMP.
+------------------------------------------------------------------------
|
| MCS6502 MICROPROCESSOR INSTRUCTION SET - ALPHABETIC SEQUENCE
|
+------------------------------------------------------------------------
|
| ADC Add Memory to Accumulator with Carry
| AND "AND" Memory with Accumulator
| ASL Shift Left One Bit (Memory or Accumulator)
|
| BCC Branch on Carry Clear
| BCS Branch on Carry Set
| BEQ Branch on Result Zero
| BIT Test Bits in Memory with Accumulator
| BMI Branch on Result Minus
| BNE Branch on Result not Zero
| BPL Branch on Result Plus
| BRK Force Break
| BVC Branch on Overflow Clear
| BVS Branch on Overflow Set
|
| CLC Clear Carry Flag
| CLD Clear Decimal Mode
| CLI Clear interrupt Disable Bit
| CLV Clear Overflow Flag
| CMP Compare Memory and Accumulator
| CPX Compare Memory and Index X
| CPY Compare Memory and Index Y
|
| DEC Decrement Memory by One
| DEX Decrement Index X by One
| DEY Decrement Index Y by One
|
| EOR "Exclusive-Or" Memory with Accumulator
|
| INC Increment Memory by One
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -