2024年10月29日发(作者:解寻绿)
FC(NES)游戏修改基础教程
14号拐角
一、序言
在童年时期,很多人或许对于FC的回忆有许许多多,我也不例外,不过说
实在话,我在家能玩到的FC游戏非常的少,回忆起来也只有几个,坦克大战,
魂斗罗,赤色要塞,沙罗曼蛇……当然最经典的还是小时候玩的热血格斗……之
后就由于种种原因再也没有接触了,直到PC的出现,我又重温了那些经典。
但是每每看到网上各种HACK版本,总是希望自己也能做点什么修改,所以
各种找教程,各种翻资料……可能对于FC这种已经淘汰的游戏没有很多人关心
一样,教程的东西也像烟雾弹一般,可以忽略一样……
但是对于已经进入迷途的我,似乎有种由衷的爱好般……
我教过一些人,但是总觉得自己的方法或许不得当,教不会,今天写出这些
东西,希望能遇到一些有天赋的人,如果能遇到给予我批评指出的人或许会更好。
我不能保证我100%全对,有误的地方希望大家能更正吧。
好吧,或许大家都不喜欢看废话,于是我们开始吧……
二、基础修改
修改,当然要准备工具,这里我推荐一个非常强大的FC模拟器——FCEUX
系列,现在最新版本是2.1.6吧(在我打这篇文章的时候),它提供了非常齐全
完善的调试器和16进制编辑器。当然,如果要修改FC贴图的话可以用很多FC
贴图修改器进行修改,网上应该有很多,这里我找不到好的东西,大伙可以自己
找找吧,我主要是讲解游戏内容的修改,而不是贴图修改。
好吧,我们开始修改我修改到恶心的游戏——魂斗罗。
对于这一段,感谢小粽子以前的教诲。
魂斗罗很经典,可能到今天都没有人能够一命通关,对于这些头疼的玩家,
我们就给他几个选项。1、无限命;2、无限金身;3、瞬秒敌人(不推荐修改,有
点偏高端)。
友情提示,以下16进制编辑器中,在查看菜单有NES
内存
、PPU
内存
、ROM
文件
,所以在进行修改之前,请注意自己所在那一页,以免修改错误导致没有相
应的效果出现。
只有NES内存和PPU内存才能右键,但是在NES内存下无法进行修改,一
改变之后数值会立即转变成为没有修改的状态,注意好自己所在页。
1、无限命:
我们在网上都能知道,魂斗罗的1P的生命值的地址是0032(如果不知道的话
就自己网上查吧,如果金手指不会用/查,那就自己学吧= =)。我所点的地址就
是0032(可以看看标题栏,上面有写),很多人都知道,游戏中的很多地方都是由
大家所称的金手指,我所认识是NES内存所控制的,所以,对这些内存进行相
应的操作,就能达到相应的效果……,比如金手指锁定某个地址,网上有
0032-01-14就会锁定一定生命数不变,然后就能达到无限命的目的,这个就是
简单的对0032这个地址做相应的操作(锁定),达到相应的效果(命不改变)。
(图2-1)
我只能说:呵呵,又废话了多了。想想,我们死了一条命,就是对0032这
个生命值地址进行“改写”,因为是“改写”,右键0032(NES内存)这个地址之后,
我们“给地址0x0032添加写入断点”,添加之后会弹出调试器,不理它,切回
游戏画面。当然,生命值要进行“改写”,我们就英勇的去撞子弹吧,少年!
翻身之后,游戏会暂停,然后调试器的第一行会显示
(图2-2)
我们查一查6502大全里面会知道(不知道你可以查这篇文章的附录)。
D6命令是DEC——存储器单元内容减1,寻址方式是零页寻址(1)X变址(2)。
当然我们非常好理解,存储器单元内容减1,喜闻乐见,发来贺电,就是减
一条命罢了。于是我们就是不让它执行这条命令行,自然就不会减命了。
用鼠标右键直接点击那个红框框的地方,进入16进制编辑器(ROM文件),
被选中的就是D6,于是我们修改成EA EA。
EA在6502汇编中是NOP,就是无操作的意思,也就是执行这行代码的时候
什么都不做,就是要傻楞两行。
强调一下,输入命令要打完整,要使输入标示跳入下一个代码中才行,比如
代码原本是95,要改成85,不能只打一个8,要打完整个代码85,要不然模拟
器不承认你的修改。
之后我们切回调试器,这个时候调试器就变成了这样:(图2-3)
修改好之后双击右边的断点中的0032,使0032之后的 EC-W-- 变成 -C-W-- ,
让模拟器取消对0032断点的监视(要不然会一死因为已经监视了0032的“改写”
会再次暂停的,要恢复再双击即可),然后点运行即可。(图2-4)
好了,再怎么死也死不完了。
2、无限金身
金身,所向披靡的一种标志,一种必须的存在,一种GOD MODE的向往……
(这个作者在写小说么……扔砖头了哦!!!)不好意思,又废话了。百度一下我
就知道金身的地址是00B0,这个要想想,金身为什么会打不死(因为他是金身啊,
废话),是游戏的一种判定,读取金身这个地址内容,是金身,就不死,否则翻
身。这个思路很重要,因为要涉及断点的判定方法是读还是写。
好了,找到思路之后,我们添加00B0的断点(NES内存)
(图2-7)
一添加断点之后,模拟器马上暂停,有下面两种可能
(图2-8)
(图2-9)
了解的我自然能看出来原理,不过不了解的也希望大家都可以试着修改,修
改错误不会造成死机,只会造成无法玩游戏而已,而且FCEUX可以在你修改过
后撤销修改。
停留在图2-8的童鞋,请点一下运行,应该就能停在图2-9了,然后我们看
代码。B5 B0,B5是什么,我们查一下。LDA--由存储器取数送入累加器,M→A,
B5,零页X变址。零页寻址X变址没什么好讲的,不懂可以再看看(1)(2)。
由存储器取数送入累加器,也就是从00B0这个地址读取数字送出来,然后
放入累加器A中,关于累加器A,之后会有介绍,目前就当做能寄放数字并且能
运算的东西吧。把00B0的数字送出来之后,下一行代码是F0 12,F0我们能查
查看“如果标志位Z=1则转移,否则继续”,我用简单的方法解释一下,读取00B0
的内容放入累加器A中,如果相等则跳转。这样读下来或许感觉少了些什么,没
错,什么相等啊?
其实在这里,如果没有给出比较数,默认情况下可以理解成为与0进行比较,
于是这句话可以理解成了:读取00B0的内容放入累加器A中,和0进行比较,
如果相等则跳转(3)。跳转8个代码,可以自己数数看,正好到D482的地方。
好了,如果是0,则跳转,也就是金身状态是0就跳转,那不就是金身状态
不能持续了么,不爽不舒服,把跳转取消,就把F0 08直接改成EA EA。
嗯,之后先把对00B0的监视状态取消,然后点运行,看游戏的小人闪闪发
亮了!
3、瞬秒敌人(偏高端)
或许有些人玩魂斗罗没有快感,一定要开外挂,我提供外挂,你们玩!观察
到,魂斗罗其实敌人是有生命值这种东西的,所以我们找到敌人的生命值。
(图3-1)
我旁边圈黑的06(NES内存)就是我前面炮台目前的生命值,注意,这个炮台的地
址不一定是0585,它是系统分配的,取决于游戏。然后当然,我们打一枪它少
一滴血,我们自然是对它的生命值进行了“改写”,于是我们对这个地址添加写
入断点(NES内存)。添加之后,我们打炮台一枪,然后游戏会暂停,切到调试器,
我们来看看代码。
(图3-2)
E3ED:99 78 05 STA $0578,Y @ $0585 = #$06
99我们可以看看,STA--将累加器的内容送入存储器 A→M,绝对寻址Y变址(4)。
此时Y内容中为十六进制的0D,也就是十进制的13,99后面所跟的地址是0578,
然后0578偏转13个,那就是0585了(16进制无非就是0 1 2 3 4 5 6 7 8 9 A B C
D E F,只要记好这个也挺好数的)
(图3-3)
然后我们利用一个跳转语句对图3-2的程序段进行修改,看到此时累加器A的数
是5,说明即将把5,也就是被打过之后少一滴血的炮台生命值放入原来炮台生
命值中替换掉,好,我们从这里下文章。
我们找到(NES内存)很多FF的地方,这里可以让我们为所欲为的写代码,
但是要注意,最好从C000之后找代码,否则会不生效,而且8000之前的基本
上无法进行修改,请不要使用那里的FF,因为你无法使用。
其中我找到的是F620这里,这里是多么广阔的大草原啊……(拍飞!)
(图3-4)
我们想想,不能把05放到0585里,而是直接放0进去,炮台没血自然爆炸了
吧。我们要增加代码,如图点右键之后“转至ROM文件中对应位置”,先把代码
打上去A9 00 99 78 05 60(5),好了,我们在图3-2第一行左边点击鼠标右键,
然后修改99 78 05成20 20 F6。(6)
好了,我们取消对断点的监视,然后尽情的秒杀全宇宙吧(只有第二第四关
BOSS没有此效果)!
到这里基本课程算讲完了吧,希望大家有所收获。
补充
(1):零页寻址,就是对NES内存中的0000-00FF这些地址进行操作;即对
以下地址进行操作,当然,最后一行已经超出范围,无法用零页寻址进行操作。
(图补-1)
(2):X变址:就是一个偏转量,依照X寄存器的内容进行偏转。CPU有三个
寄存器,在调试器中也有显示,分别是A、X、Y(图补-2)。刚才的命令D6 32中(图
2-2),零页寻址X变址,我们可以看到此时X是为0,所以模拟器偏转计算后得
@ 0032,如果X是1,则是 @ 0033,如果是2,则 @ 0034依此类推。
当然Y变址也是一个道理,不过偏转量所运用的寄存器有所不同而已,即用
的是Y寄存器,用法一样。
(3):跳转:简单说就是跳转到某个程序段继续执行。这里有两种跳转,有条
件跳转和无条件跳转。
这里的F0(图2-9)中,就是有条件跳转,当标志位(7)Z=1的时候进行跳转,
否则继续。
(4):绝对寻址:记得零页寻址么,就是只有对0000-00FF进行操作,而绝对
寻址能对所有地址,即0000-FFFF进行操作,但是绝对寻址有一点不同的是,它
的寻址方式是从低位到高位,比如图3-2中是99 78 05,则所寻地址是0578,
基本上6502内的绝对寻址都是从低位到高位,简单说就是反过来的。
(5):A9 00:在6502是由存储器取数送入累加器,是立即寻址,简单介绍
一下立即寻址,也就是直接把00,放入累加器A中,所有相应的立即寻址大同
小异,不多做介绍,童鞋可以自己领会。不过要注意,如果你要放入累加器A
内容为十进制的10,那就要写成A9 0A,因为这里所有运算都是以16进制为基
准的。
(6):这里的20,在6502中是无条件跳转【有条件跳转请看(3)】。就是程序
执行到这里之后,会无条件的跳转到相应位置,这里是20 20 F6,则就是无条件
跳转到F620这个地址【为什么会反过来请看(4)有关绝对寻址】执行这个程序段,
执行完之后会返回原来的D0 08继续执行,返回代码是60。相当于一条直的道
路,当我们遇到一个牌子:道路施工,请绕行(20的作用),我们就绕行到了某条
路,然后绕行肯定还要回到主路,于是看到了一个“<<<<<”提示我们返回的标
志(60的作用)。
(7):标志位,6502的标志位寄存器(图补-3)。
关于16进制,童鞋们大可放心,不必需要你自己换算,可以使用Windows自带
的计算器,直接调成科学型,然后在10进制状态下输入完后点16进制,计算机
(图补-4)
就帮你换算了。
附录:代码大全,先按类别排序,后按照机器码进行排序。
A1
A5
A9
AD
B1
B5
B9
BD
A2
A6
AE
B6
BE
A0
A4
AC
LDA
LDA
LDA
LDA
LDA
LDA
LDA
LDA
LDX
LDX
LDX
LDX
LDX
LDY
LDY
LDY
由存储器取数送入累加器A
由存储器取数送入累加器A
由存储器取数送入累加器A
由存储器取数送入累加器A
由存储器取数送入累加器A
由存储器取数送入累加器A
由存储器取数送入累加器A
由存储器取数送入累加器A
由存储器取数送入寄存器X
由存储器取数送入寄存器X
由存储器取数送入寄存器X
由存储器取数送入寄存器X
由存储器取数送入寄存器X
由存储器取数送入寄存器Y
由存储器取数送入寄存器Y
由存储器取数送入寄存器Y
先变址X后间址
零页寻址
立即寻址
绝对寻址
先间址后Y变址
零页X变址
绝对Y变址
绝对X变址
立即寻址
零页寻址
绝对寻址
零页Y变址
绝对Y变址
立即寻址
零页寻址
绝对寻址
B4 LDY
BC LDY
81 STA
85 STA
8D STA
91 STA
95 STA
99 STA
9D STA
86 STX
8E STX
98 STX
84 STY
8C STY
94 STY
AA TAX
8A TXA
A8 TAY
98 TYA
BA TSX
9A TXS
61 ADC
65 ADC
69 ADC
6D ADC
71 ADC
75 ADC
79 ADC
7D ADC
E1 SEC
E5 SEC
E9 SEC
ED SEC
F1 SEC
F5 SEC
F9 SEC
FD SEC
由存储器取数送入寄存器Y
由存储器取数送入寄存器Y
将累加器A的内容送入存储器
将累加器A的内容送入存储器
将累加器A的内容送入存储器
将累加器A的内容送入存储器
将累加器A的内容送入存储器
将累加器A的内容送入存储器
将累加器A的内容送入存储器
将寄存器X的内容送入存储器
将寄存器X的内容送入存储器
将寄存器X的内容送入存储器
将寄存器Y的内容送入存储器
将寄存器Y的内容送入存储器
将寄存器Y的内容送入存储器
将累加器A的内容送入寄存器X
将寄存器X的内容送入累加器A
将累加器A的内容送入寄存器Y
将寄存器Y的内容送入累加器A
将堆栈指针S的内容送入寄存器X
将寄存器X的内容送入堆栈指针S
累加器,存储器,进位标志C相加,结果送累加器A
累加器,存储器,进位标志C相加,结果送累加器A
累加器,存储器,进位标志C相加,结果送累加器A
累加器,存储器,进位标志C相加,结果送累加器A
累加器,存储器,进位标志C相加,结果送累加器A
累加器,存储器,进位标志C相加,结果送累加器A
累加器,存储器,进位标志C相加,结果送累加器A
累加器,存储器,进位标志C相加,结果送累加器A
从累加器减去存储器和进位标志C,结果送累加器A
从累加器减去存储器和进位标志C,结果送累加器A
从累加器减去存储器和进位标志C,结果送累加器A
从累加器减去存储器和进位标志C,结果送累加器A
从累加器减去存储器和进位标志C,结果送累加器A
从累加器减去存储器和进位标志C,结果送累加器A
从累加器减去存储器和进位标志C,结果送累加器A
从累加器减去存储器和进位标志C,结果送累加器A
零页X变址
绝对X变址
先变址X后间址
零页寻址
绝对寻址
先间址后Y变址
零页X变址
绝对Y变址
绝对X变址
零页寻址
绝对寻址
零页Y变址
零页寻址
绝对寻址
零页X变址
寄存器寻址
寄存器寻址
寄存器寻址
寄存器寻址
寄存器寻址
寄存器寻址
先变址X后间址
零页寻址
立即寻址
绝对寻址
先间址后Y变址
零页X变址
绝对Y变址
绝对X变址
先变址X后间址
零页寻址
立即寻址
绝对寻址
后变址Y间址
零页X变址
绝对Y变址
绝对X变址
E6 INC
EE INC
F6 INC
FE INC
C6 DEC
CE DEC
D6 DEC
DE DEC
E8 INX
CA DEX
C8 INY
88 DEY
21 AND
25 AND
29 AND
2D AND
31 AND
35 AND
39 AND
3D AND
01 ORA
05 ORA
09 ORA
0D ORA
11 ORA
15 ORA
19 ORA
1D ORA
41 EOR
45 EOR
49 EOR
4D EOR
51 EOR
55 EOR
59 EOR
5D EOR
18 CLC
38 SEC
存储器单元内容增1
存储器单元内容增1
存储器单元内容增1
存储器单元内容增1
存储器单元内容减1
存储器单元内容减1
存储器单元内容减1
存储器单元内容减1
寄存器X内容加1
寄存器X内容减1
寄存器Y内容加1
寄存器Y内容减1
寄存器与累加器相与,结果送累加器A
寄存器与累加器相与,结果送累加器A
寄存器与累加器相与,结果送累加器A
寄存器与累加器相与,结果送累加器A
寄存器与累加器相与,结果送累加器A
寄存器与累加器相与,结果送累加器A
寄存器与累加器相与,结果送累加器A
寄存器与累加器相与,结果送累加器A
寄存器与累加器相或,结果送累加器A
寄存器与累加器相或,结果送累加器A
寄存器与累加器相或,结果送累加器A
寄存器与累加器相或,结果送累加器A
寄存器与累加器相或,结果送累加器A
寄存器与累加器相或,结果送累加器A
寄存器与累加器相或,结果送累加器A
寄存器与累加器相或,结果送累加器A
寄存器与累加器相异或,结果送累加器A
寄存器与累加器相异或,结果送累加器A
寄存器与累加器相异或,结果送累加器A
寄存器与累加器相异或,结果送累加器A
寄存器与累加器相异或,结果送累加器A
寄存器与累加器相异或,结果送累加器A
寄存器与累加器相异或,结果送累加器A
寄存器与累加器相异或,结果送累加器A
清除进位标志
置进位标志C
零页寻址
绝对寻址
零页X变址
绝对X变址
零页寻址
绝对寻址
零页X变址
绝对X变址
隐含寻址
隐含寻址
隐含寻址
隐含寻址
先变址X后间址
零页寻址
立即寻址
绝对寻址
先间址后Y变址
零页X变址
绝对Y变址
绝对X变址
先变址X后间址
零页寻址
立即寻址
绝对寻址
先间址后Y变址
零页X变址
绝对Y变址
绝对X变址
先变址X后间址
零页寻址
立即寻址
绝对寻址
先间址后Y变址
零页X变址
绝对Y变址
绝对X变址
D8 CLD
F8 SED
B8 CLV
58 CLI
78 SEI
C1 CMP
C5 CMP
C9 CMP
CD CMP
D1 CMP
D5 CMP
D9 CMP
DD CMP
E0 CPX
E4 CPX
EC CPX
C0 CPY
C4 CPY
CC CPY
24 BIT
2C BIT
0A ASL
06 ASL
0E ASL
16 ASL
1E ASL
4A LSR
46 LSR
4E LSR
56 LSR
5E LSR
2A ROL
26 ROL
2E ROL
36 ROL
3E ROL
6A ROR
清除十进制运算标志D
置十进制运算标志D
清除溢出标志V
清除中断禁止指令I
置位中断禁止标志I
累加器A的内容和存储器比较
累加器A的内容和存储器比较
累加器A的内容和存储器比较
累加器A的内容和存储器比较
累加器A的内容和存储器比较
累加器A的内容和存储器比较
累加器A的内容和存储器比较
累加器A的内容和存储器比较
寄存器X的内容和存储器比较
寄存器X的内容和存储器比较
寄存器X的内容和存储器比较
寄存器Y的内容和存储器比较
寄存器Y的内容和存储器比较
寄存器Y的内容和存储器比较
累加器A与存储器相与不放入A,结果影响标志位
累加器A与存储器相与不放入A,结果影响标志位
算术左移指令,相当于把数乘以2
算术左移指令,相当于把数乘以2
算术左移指令,相当于把数乘以2
算术左移指令,相当于把数乘以2
算术左移指令,相当于把数乘以2
逻辑右移指令,相当于把数除以2
逻辑右移指令,相当于把数除以2
逻辑右移指令,相当于把数除以2
逻辑右移指令,相当于把数除以2
逻辑右移指令,相当于把数除以2
循环左移指令,连进位C一起左移一位
循环左移指令,连进位C一起左移一位
循环左移指令,连进位C一起左移一位
循环左移指令,连进位C一起左移一位
循环左移指令,连进位C一起左移一位
循环右移指令,连进位C一起右移一位
先变址X后间址
零页寻址
立即寻址
绝对寻址
先间址后Y变址
零页X变址
绝对Y变址
绝对X变址
立即寻址
零页寻址
绝对寻址
立即寻址
零页寻址
绝对寻址
零页寻址
绝对寻址
累加器寻址
零页寻址
绝对寻址
零页X变址
绝对X变址
累加器寻址
零页寻址
绝对寻址
零页X变址
绝对X变址
累加器寻址
零页寻址
绝对寻址
零页X变址
绝对X变址
累加器寻址
66 ROR 循环右移指令,连进位C一起右移一位
6E ROR 循环右移指令,连进位C一起右移一位
76 ROR 循环右移指令,连进位C一起右移一位
7E ROR 循环右移指令,连进位C一起右移一位
48 PHA 累加器进栈指令
68 PLA 累加器出栈指令
08 PHP 标志寄存器P进栈指令
28 PLP 标志寄存器P出栈指令
4C JMP 无条件转移指令
5C JMP 无条件转移指令
F0 BEQ 如果标志位Z=1则转移,否则继续
D0 BNE 如果标志位Z=0则转移,否则继续
B0 BCS 如果标志位C=1则转移,否则继续
90 BCC 如果标志位C=0则转移,否则继续
30 BMI 如果标志位N=1则转移,否则继续
10 BPL 如果标志位N=0则转移,否则继续
70 BVS 如果标志位V=1则转移,否则继续
50 BVC 如果标志位V=0则转移,否则继续
20 JSR 从主程序转移到子程序
60 RTS 返回主程序
01 ORA
寄存器与累加器相或,结果送累加器
A
05 ORA
寄存器与累加器相或,结果送累加器
A
06 ASL
算术左移指令,相当于把数乘以
2
08 PHP
标志寄存器
P
进栈指令
09 ORA
寄存器与累加器相或,结果送累加器
A
0A ASL
算术左移指令,相当于把数乘以
2
0D ORA
寄存器与累加器相或,结果送累加器
A
0E ASL
算术左移指令,相当于把数乘以
2
10 BPL
如果标志位
N=0
则转移,否则继续
11 ORA
寄存器与累加器相或,结果送累加器
A
15 ORA
寄存器与累加器相或,结果送累加器
A
16 ASL
算术左移指令,相当于把数乘以
2
18 CLC
清除进位标志
19 ORA
寄存器与累加器相或,结果送累加器
A
1D ORA
寄存器与累加器相或,结果送累加器
A
1E ASL
算术左移指令,相当于把数乘以
2
20 JSR
从主程序转移到子程序
21 AND
寄存器与累加器相与,结果送累加器
A
24 BIT
累加器
A
与存储器相与不放入
A
,结果影响标志位
零页寻址
绝对寻址
零页X变址
绝对X变址
隐含寻址
隐含寻址
隐含寻址
隐含寻址
绝对寻址
间接寻址
相对寻址
相对寻址
相对寻址
相对寻址
相对寻址
相对寻址
相对寻址
相对寻址
绝对寻址
隐含寻址
先变址
X
后间址
零页寻址
零页寻址
隐含寻址
立即寻址
累加器寻址
绝对寻址
绝对寻址
相对寻址
先间址后
Y
变址
零页
X
变址
零页
X
变址
绝对
Y
变址
绝对
X
变址
绝对
X
变址
绝对寻址
先变址
X
后间址
零页寻址
25 AND
寄存器与累加器相与,结果送累加器
A
26 ROL
循环左移指令,连进位
C
一起左移一位
28 PLP
标志寄存器
P
出栈指令
29 AND
寄存器与累加器相与,结果送累加器
A
2A ROL
循环左移指令,连进位
C
一起左移一位
2C BIT
累加器
A
与存储器相与不放入
A
,结果影响标志位
2D AND
寄存器与累加器相与,结果送累加器
A
2E ROL
循环左移指令,连进位
C
一起左移一位
30 BMI
如果标志位
N=1
则转移,否则继续
31 AND
寄存器与累加器相与,结果送累加器
A
35 AND
寄存器与累加器相与,结果送累加器
A
36 ROL
循环左移指令,连进位
C
一起左移一位
38 SEC
置进位标志
C
39 AND
寄存器与累加器相与,结果送累加器
A
3D AND
寄存器与累加器相与,结果送累加器
A
3E ROL
循环左移指令,连进位
C
一起左移一位
41 EOR
寄存器与累加器相异或,结果送累加器
A
45 EOR
寄存器与累加器相异或,结果送累加器
A
46 LSR
逻辑右移指令,相当于把数除以
2
48 PHA
累加器进栈指令
49 EOR
寄存器与累加器相异或,结果送累加器
A
4A LSR
逻辑右移指令,相当于把数除以
2
4C JMP
无条件转移指令
4D EOR
寄存器与累加器相异或,结果送累加器
A
4E LSR
逻辑右移指令,相当于把数除以
2
50 BVC
如果标志位
V=0
则转移,否则继续
51 EOR
寄存器与累加器相异或,结果送累加器
A
55 EOR
寄存器与累加器相异或,结果送累加器
A
56 LSR
逻辑右移指令,相当于把数除以
2
58 CLI
清除中断禁止指令
I
59 EOR
寄存器与累加器相异或,结果送累加器
A
5C JMP
无条件转移指令
5D EOR
寄存器与累加器相异或,结果送累加器
A
5E LSR
逻辑右移指令,相当于把数除以
2
60 RTS
返回主程序
61 ADC
累加器,存储器,进位标志
C
相加,结果送累加器
A
65 ADC
累加器,存储器,进位标志
C
相加,结果送累加器
A
66 ROR
循环右移指令,连进位
C
一起右移一位
68 PLA
累加器出栈指令
69 ADC
累加器,存储器,进位标志
C
相加,结果送累加器
A
6A ROR
循环右移指令,连进位
C
一起右移一位
6D ADC
累加器,存储器,进位标志
C
相加,结果送累加器
A
6E ROR
循环右移指令,连进位
C
一起右移一位
70 BVS
如果标志位
V=1
则转移,否则继续
零页寻址
零页寻址
隐含寻址
立即寻址
累加器寻址
绝对寻址
绝对寻址
绝对寻址
相对寻址
先间址后
Y
变址
零页
X
变址
零页
X
变址
绝对
Y
变址
绝对
X
变址
绝对
X
变址
先变址
X
后间址
零页寻址
零页寻址
隐含寻址
立即寻址
累加器寻址
绝对寻址
绝对寻址
绝对寻址
相对寻址
先间址后
Y
变址
零页
X
变址
零页
X
变址
绝对
Y
变址
间接寻址
绝对
X
变址
绝对
X
变址
隐含寻址
先变址
X
后间址
零页寻址
零页寻址
隐含寻址
立即寻址
累加器寻址
绝对寻址
绝对寻址
相对寻址
71 ADC
累加器,存储器,进位标志
C
相加,结果送累加器
A
75 ADC
累加器,存储器,进位标志
C
相加,结果送累加器
A
76 ROR
循环右移指令,连进位
C
一起右移一位
78 SEI
置位中断禁止标志
I
79 ADC
累加器,存储器,进位标志
C
相加,结果送累加器
A
7D ADC
累加器,存储器,进位标志
C
相加,结果送累加器
A
7E ROR
循环右移指令,连进位
C
一起右移一位
81 STA
将累加器
A
的内容送入存储器
84 STY
将寄存器
Y
的内容送入存储器
85 STA
将累加器
A
的内容送入存储器
86 STX
将寄存器
X
的内容送入存储器
88 DEY
寄存器
Y
内容减
1
8A TXA
将寄存器
X
的内容送入累加器
A
8C STY
将寄存器
Y
的内容送入存储器
8D STA
将累加器
A
的内容送入存储器
8E STX
将寄存器
X
的内容送入存储器
90 BCC
如果标志位
C=0
则转移,否则继续
91 STA
将累加器
A
的内容送入存储器
94 STY
将寄存器
Y
的内容送入存储器
95 STA
将累加器
A
的内容送入存储器
98 STX
将寄存器
X
的内容送入存储器
98 TYA
将寄存器
Y
的内容送入累加器
A
99 STA
将累加器
A
的内容送入存储器
9A TXS
将寄存器
X
的内容送入堆栈指针
S
9D STA
将累加器
A
的内容送入存储器
A0 LDY
由存储器取数送入寄存器
Y
A1 LDA
由存储器取数送入累加器
A
A2 LDX
由存储器取数送入寄存器
X
A4 LDY
由存储器取数送入寄存器
Y
A5 LDA
由存储器取数送入累加器
A
A6 LDX
由存储器取数送入寄存器
X
A8 TAY
将累加器
A
的内容送入寄存器
Y
A9 LDA
由存储器取数送入累加器
A
AA TAX
将累加器
A
的内容送入寄存器
X
AC LDY
由存储器取数送入寄存器
Y
AD LDA
由存储器取数送入累加器
A
AE LDX
由存储器取数送入寄存器
X
B0 BCS
如果标志位
C=1
则转移,否则继续
B1 LDA
由存储器取数送入累加器
A
B4 LDY
由存储器取数送入寄存器
Y
B5 LDA
由存储器取数送入累加器
A
B6 LDX
由存储器取数送入寄存器
X
B8 CLV
清除溢出标志
V
B9 LDA
由存储器取数送入累加器
A
先间址后
Y
变址
零页
X
变址
零页
X
变址
绝对
Y
变址
绝对
X
变址
绝对
X
变址
先变址
X
后间址
零页寻址
零页寻址
零页寻址
隐含寻址
寄存器寻址
绝对寻址
绝对寻址
绝对寻址
相对寻址
先间址后
Y
变址
零页
X
变址
零页
X
变址
零页
Y
变址
寄存器寻址
绝对
Y
变址
寄存器寻址
绝对
X
变址
立即寻址
先变址
X
后间址
立即寻址
零页寻址
零页寻址
零页寻址
寄存器寻址
立即寻址
寄存器寻址
绝对寻址
绝对寻址
绝对寻址
相对寻址
先间址后
Y
变址
零页
X
变址
零页
X
变址
零页
Y
变址
绝对
Y
变址
BA TSX
将堆栈指针
S
的内容送入寄存器
X
BC LDY
由存储器取数送入寄存器
Y
BD LDA
由存储器取数送入累加器
A
BE LDX
由存储器取数送入寄存器
X
C0 CPY
寄存器
Y
的内容和存储器比较
C1 CMP
累加器
A
的内容和存储器比较
C4 CPY
寄存器
Y
的内容和存储器比较
C5 CMP
累加器
A
的内容和存储器比较
C6 DEC
存储器单元内容减
1
C8 INY
寄存器
Y
内容加
1
C9 CMP
累加器
A
的内容和存储器比较
CA DEX
寄存器
X
内容减
1
CC CPY
寄存器
Y
的内容和存储器比较
CD CMP
累加器
A
的内容和存储器比较
CE DEC
存储器单元内容减
1
D0 BNE
如果标志位
Z=0
则转移,否则继续
D1 CMP
累加器
A
的内容和存储器比较
D5 CMP
累加器
A
的内容和存储器比较
D6 DEC
存储器单元内容减
1
D8 CLD
清除十进制运算标志
D
D9 CMP
累加器
A
的内容和存储器比较
DD CMP
累加器
A
的内容和存储器比较
DE DEC
存储器单元内容减
1
E0 CPX
寄存器
X
的内容和存储器比较
E1 SEC
从累加器减去存储器和进位标志
C
,结果送累加器
A
E4 CPX
寄存器
X
的内容和存储器比较
E5 SEC
从累加器减去存储器和进位标志
C
,结果送累加器
A
E6 INC
存储器单元内容增
1
E8 INX
寄存器
X
内容加
1
E9 SEC
从累加器减去存储器和进位标志
C
,结果送累加器
A
EC CPX
寄存器
X
的内容和存储器比较
ED SEC
从累加器减去存储器和进位标志
C
,结果送累加器
A
EE INC
存储器单元内容增
1
F0 BEQ
如果标志位
Z=1
则转移,否则继续
F1 SEC
从累加器减去存储器和进位标志
C
,结果送累加器
A
F5 SEC
从累加器减去存储器和进位标志
C
,结果送累加器
A
F6 INC
存储器单元内容增
1
F8 SED
置十进制运算标志
D
F9 SEC
从累加器减去存储器和进位标志
C
,结果送累加器
A
FD SEC
从累加器减去存储器和进位标志
C
,结果送累加器
A
FE INC
存储器单元内容增
1
寄存器寻址
绝对
X
变址
绝对
X
变址
绝对
Y
变址
立即寻址
先变址
X
后间址
零页寻址
零页寻址
零页寻址
隐含寻址
立即寻址
隐含寻址
绝对寻址
绝对寻址
绝对寻址
相对寻址
先间址后
Y
变址
零页
X
变址
零页
X
变址
绝对
Y
变址
绝对
X
变址
绝对
X
变址
立即寻址
先变址
X
后间址
零页寻址
零页寻址
零页寻址
隐含寻址
立即寻址
绝对寻址
绝对寻址
绝对寻址
相对寻址
后变址
Y
间址
零页
X
变址
零页
X
变址
绝对
Y
变址
绝对
X
变址
绝对
X
变址
2024年10月29日发(作者:解寻绿)
FC(NES)游戏修改基础教程
14号拐角
一、序言
在童年时期,很多人或许对于FC的回忆有许许多多,我也不例外,不过说
实在话,我在家能玩到的FC游戏非常的少,回忆起来也只有几个,坦克大战,
魂斗罗,赤色要塞,沙罗曼蛇……当然最经典的还是小时候玩的热血格斗……之
后就由于种种原因再也没有接触了,直到PC的出现,我又重温了那些经典。
但是每每看到网上各种HACK版本,总是希望自己也能做点什么修改,所以
各种找教程,各种翻资料……可能对于FC这种已经淘汰的游戏没有很多人关心
一样,教程的东西也像烟雾弹一般,可以忽略一样……
但是对于已经进入迷途的我,似乎有种由衷的爱好般……
我教过一些人,但是总觉得自己的方法或许不得当,教不会,今天写出这些
东西,希望能遇到一些有天赋的人,如果能遇到给予我批评指出的人或许会更好。
我不能保证我100%全对,有误的地方希望大家能更正吧。
好吧,或许大家都不喜欢看废话,于是我们开始吧……
二、基础修改
修改,当然要准备工具,这里我推荐一个非常强大的FC模拟器——FCEUX
系列,现在最新版本是2.1.6吧(在我打这篇文章的时候),它提供了非常齐全
完善的调试器和16进制编辑器。当然,如果要修改FC贴图的话可以用很多FC
贴图修改器进行修改,网上应该有很多,这里我找不到好的东西,大伙可以自己
找找吧,我主要是讲解游戏内容的修改,而不是贴图修改。
好吧,我们开始修改我修改到恶心的游戏——魂斗罗。
对于这一段,感谢小粽子以前的教诲。
魂斗罗很经典,可能到今天都没有人能够一命通关,对于这些头疼的玩家,
我们就给他几个选项。1、无限命;2、无限金身;3、瞬秒敌人(不推荐修改,有
点偏高端)。
友情提示,以下16进制编辑器中,在查看菜单有NES
内存
、PPU
内存
、ROM
文件
,所以在进行修改之前,请注意自己所在那一页,以免修改错误导致没有相
应的效果出现。
只有NES内存和PPU内存才能右键,但是在NES内存下无法进行修改,一
改变之后数值会立即转变成为没有修改的状态,注意好自己所在页。
1、无限命:
我们在网上都能知道,魂斗罗的1P的生命值的地址是0032(如果不知道的话
就自己网上查吧,如果金手指不会用/查,那就自己学吧= =)。我所点的地址就
是0032(可以看看标题栏,上面有写),很多人都知道,游戏中的很多地方都是由
大家所称的金手指,我所认识是NES内存所控制的,所以,对这些内存进行相
应的操作,就能达到相应的效果……,比如金手指锁定某个地址,网上有
0032-01-14就会锁定一定生命数不变,然后就能达到无限命的目的,这个就是
简单的对0032这个地址做相应的操作(锁定),达到相应的效果(命不改变)。
(图2-1)
我只能说:呵呵,又废话了多了。想想,我们死了一条命,就是对0032这
个生命值地址进行“改写”,因为是“改写”,右键0032(NES内存)这个地址之后,
我们“给地址0x0032添加写入断点”,添加之后会弹出调试器,不理它,切回
游戏画面。当然,生命值要进行“改写”,我们就英勇的去撞子弹吧,少年!
翻身之后,游戏会暂停,然后调试器的第一行会显示
(图2-2)
我们查一查6502大全里面会知道(不知道你可以查这篇文章的附录)。
D6命令是DEC——存储器单元内容减1,寻址方式是零页寻址(1)X变址(2)。
当然我们非常好理解,存储器单元内容减1,喜闻乐见,发来贺电,就是减
一条命罢了。于是我们就是不让它执行这条命令行,自然就不会减命了。
用鼠标右键直接点击那个红框框的地方,进入16进制编辑器(ROM文件),
被选中的就是D6,于是我们修改成EA EA。
EA在6502汇编中是NOP,就是无操作的意思,也就是执行这行代码的时候
什么都不做,就是要傻楞两行。
强调一下,输入命令要打完整,要使输入标示跳入下一个代码中才行,比如
代码原本是95,要改成85,不能只打一个8,要打完整个代码85,要不然模拟
器不承认你的修改。
之后我们切回调试器,这个时候调试器就变成了这样:(图2-3)
修改好之后双击右边的断点中的0032,使0032之后的 EC-W-- 变成 -C-W-- ,
让模拟器取消对0032断点的监视(要不然会一死因为已经监视了0032的“改写”
会再次暂停的,要恢复再双击即可),然后点运行即可。(图2-4)
好了,再怎么死也死不完了。
2、无限金身
金身,所向披靡的一种标志,一种必须的存在,一种GOD MODE的向往……
(这个作者在写小说么……扔砖头了哦!!!)不好意思,又废话了。百度一下我
就知道金身的地址是00B0,这个要想想,金身为什么会打不死(因为他是金身啊,
废话),是游戏的一种判定,读取金身这个地址内容,是金身,就不死,否则翻
身。这个思路很重要,因为要涉及断点的判定方法是读还是写。
好了,找到思路之后,我们添加00B0的断点(NES内存)
(图2-7)
一添加断点之后,模拟器马上暂停,有下面两种可能
(图2-8)
(图2-9)
了解的我自然能看出来原理,不过不了解的也希望大家都可以试着修改,修
改错误不会造成死机,只会造成无法玩游戏而已,而且FCEUX可以在你修改过
后撤销修改。
停留在图2-8的童鞋,请点一下运行,应该就能停在图2-9了,然后我们看
代码。B5 B0,B5是什么,我们查一下。LDA--由存储器取数送入累加器,M→A,
B5,零页X变址。零页寻址X变址没什么好讲的,不懂可以再看看(1)(2)。
由存储器取数送入累加器,也就是从00B0这个地址读取数字送出来,然后
放入累加器A中,关于累加器A,之后会有介绍,目前就当做能寄放数字并且能
运算的东西吧。把00B0的数字送出来之后,下一行代码是F0 12,F0我们能查
查看“如果标志位Z=1则转移,否则继续”,我用简单的方法解释一下,读取00B0
的内容放入累加器A中,如果相等则跳转。这样读下来或许感觉少了些什么,没
错,什么相等啊?
其实在这里,如果没有给出比较数,默认情况下可以理解成为与0进行比较,
于是这句话可以理解成了:读取00B0的内容放入累加器A中,和0进行比较,
如果相等则跳转(3)。跳转8个代码,可以自己数数看,正好到D482的地方。
好了,如果是0,则跳转,也就是金身状态是0就跳转,那不就是金身状态
不能持续了么,不爽不舒服,把跳转取消,就把F0 08直接改成EA EA。
嗯,之后先把对00B0的监视状态取消,然后点运行,看游戏的小人闪闪发
亮了!
3、瞬秒敌人(偏高端)
或许有些人玩魂斗罗没有快感,一定要开外挂,我提供外挂,你们玩!观察
到,魂斗罗其实敌人是有生命值这种东西的,所以我们找到敌人的生命值。
(图3-1)
我旁边圈黑的06(NES内存)就是我前面炮台目前的生命值,注意,这个炮台的地
址不一定是0585,它是系统分配的,取决于游戏。然后当然,我们打一枪它少
一滴血,我们自然是对它的生命值进行了“改写”,于是我们对这个地址添加写
入断点(NES内存)。添加之后,我们打炮台一枪,然后游戏会暂停,切到调试器,
我们来看看代码。
(图3-2)
E3ED:99 78 05 STA $0578,Y @ $0585 = #$06
99我们可以看看,STA--将累加器的内容送入存储器 A→M,绝对寻址Y变址(4)。
此时Y内容中为十六进制的0D,也就是十进制的13,99后面所跟的地址是0578,
然后0578偏转13个,那就是0585了(16进制无非就是0 1 2 3 4 5 6 7 8 9 A B C
D E F,只要记好这个也挺好数的)
(图3-3)
然后我们利用一个跳转语句对图3-2的程序段进行修改,看到此时累加器A的数
是5,说明即将把5,也就是被打过之后少一滴血的炮台生命值放入原来炮台生
命值中替换掉,好,我们从这里下文章。
我们找到(NES内存)很多FF的地方,这里可以让我们为所欲为的写代码,
但是要注意,最好从C000之后找代码,否则会不生效,而且8000之前的基本
上无法进行修改,请不要使用那里的FF,因为你无法使用。
其中我找到的是F620这里,这里是多么广阔的大草原啊……(拍飞!)
(图3-4)
我们想想,不能把05放到0585里,而是直接放0进去,炮台没血自然爆炸了
吧。我们要增加代码,如图点右键之后“转至ROM文件中对应位置”,先把代码
打上去A9 00 99 78 05 60(5),好了,我们在图3-2第一行左边点击鼠标右键,
然后修改99 78 05成20 20 F6。(6)
好了,我们取消对断点的监视,然后尽情的秒杀全宇宙吧(只有第二第四关
BOSS没有此效果)!
到这里基本课程算讲完了吧,希望大家有所收获。
补充
(1):零页寻址,就是对NES内存中的0000-00FF这些地址进行操作;即对
以下地址进行操作,当然,最后一行已经超出范围,无法用零页寻址进行操作。
(图补-1)
(2):X变址:就是一个偏转量,依照X寄存器的内容进行偏转。CPU有三个
寄存器,在调试器中也有显示,分别是A、X、Y(图补-2)。刚才的命令D6 32中(图
2-2),零页寻址X变址,我们可以看到此时X是为0,所以模拟器偏转计算后得
@ 0032,如果X是1,则是 @ 0033,如果是2,则 @ 0034依此类推。
当然Y变址也是一个道理,不过偏转量所运用的寄存器有所不同而已,即用
的是Y寄存器,用法一样。
(3):跳转:简单说就是跳转到某个程序段继续执行。这里有两种跳转,有条
件跳转和无条件跳转。
这里的F0(图2-9)中,就是有条件跳转,当标志位(7)Z=1的时候进行跳转,
否则继续。
(4):绝对寻址:记得零页寻址么,就是只有对0000-00FF进行操作,而绝对
寻址能对所有地址,即0000-FFFF进行操作,但是绝对寻址有一点不同的是,它
的寻址方式是从低位到高位,比如图3-2中是99 78 05,则所寻地址是0578,
基本上6502内的绝对寻址都是从低位到高位,简单说就是反过来的。
(5):A9 00:在6502是由存储器取数送入累加器,是立即寻址,简单介绍
一下立即寻址,也就是直接把00,放入累加器A中,所有相应的立即寻址大同
小异,不多做介绍,童鞋可以自己领会。不过要注意,如果你要放入累加器A
内容为十进制的10,那就要写成A9 0A,因为这里所有运算都是以16进制为基
准的。
(6):这里的20,在6502中是无条件跳转【有条件跳转请看(3)】。就是程序
执行到这里之后,会无条件的跳转到相应位置,这里是20 20 F6,则就是无条件
跳转到F620这个地址【为什么会反过来请看(4)有关绝对寻址】执行这个程序段,
执行完之后会返回原来的D0 08继续执行,返回代码是60。相当于一条直的道
路,当我们遇到一个牌子:道路施工,请绕行(20的作用),我们就绕行到了某条
路,然后绕行肯定还要回到主路,于是看到了一个“<<<<<”提示我们返回的标
志(60的作用)。
(7):标志位,6502的标志位寄存器(图补-3)。
关于16进制,童鞋们大可放心,不必需要你自己换算,可以使用Windows自带
的计算器,直接调成科学型,然后在10进制状态下输入完后点16进制,计算机
(图补-4)
就帮你换算了。
附录:代码大全,先按类别排序,后按照机器码进行排序。
A1
A5
A9
AD
B1
B5
B9
BD
A2
A6
AE
B6
BE
A0
A4
AC
LDA
LDA
LDA
LDA
LDA
LDA
LDA
LDA
LDX
LDX
LDX
LDX
LDX
LDY
LDY
LDY
由存储器取数送入累加器A
由存储器取数送入累加器A
由存储器取数送入累加器A
由存储器取数送入累加器A
由存储器取数送入累加器A
由存储器取数送入累加器A
由存储器取数送入累加器A
由存储器取数送入累加器A
由存储器取数送入寄存器X
由存储器取数送入寄存器X
由存储器取数送入寄存器X
由存储器取数送入寄存器X
由存储器取数送入寄存器X
由存储器取数送入寄存器Y
由存储器取数送入寄存器Y
由存储器取数送入寄存器Y
先变址X后间址
零页寻址
立即寻址
绝对寻址
先间址后Y变址
零页X变址
绝对Y变址
绝对X变址
立即寻址
零页寻址
绝对寻址
零页Y变址
绝对Y变址
立即寻址
零页寻址
绝对寻址
B4 LDY
BC LDY
81 STA
85 STA
8D STA
91 STA
95 STA
99 STA
9D STA
86 STX
8E STX
98 STX
84 STY
8C STY
94 STY
AA TAX
8A TXA
A8 TAY
98 TYA
BA TSX
9A TXS
61 ADC
65 ADC
69 ADC
6D ADC
71 ADC
75 ADC
79 ADC
7D ADC
E1 SEC
E5 SEC
E9 SEC
ED SEC
F1 SEC
F5 SEC
F9 SEC
FD SEC
由存储器取数送入寄存器Y
由存储器取数送入寄存器Y
将累加器A的内容送入存储器
将累加器A的内容送入存储器
将累加器A的内容送入存储器
将累加器A的内容送入存储器
将累加器A的内容送入存储器
将累加器A的内容送入存储器
将累加器A的内容送入存储器
将寄存器X的内容送入存储器
将寄存器X的内容送入存储器
将寄存器X的内容送入存储器
将寄存器Y的内容送入存储器
将寄存器Y的内容送入存储器
将寄存器Y的内容送入存储器
将累加器A的内容送入寄存器X
将寄存器X的内容送入累加器A
将累加器A的内容送入寄存器Y
将寄存器Y的内容送入累加器A
将堆栈指针S的内容送入寄存器X
将寄存器X的内容送入堆栈指针S
累加器,存储器,进位标志C相加,结果送累加器A
累加器,存储器,进位标志C相加,结果送累加器A
累加器,存储器,进位标志C相加,结果送累加器A
累加器,存储器,进位标志C相加,结果送累加器A
累加器,存储器,进位标志C相加,结果送累加器A
累加器,存储器,进位标志C相加,结果送累加器A
累加器,存储器,进位标志C相加,结果送累加器A
累加器,存储器,进位标志C相加,结果送累加器A
从累加器减去存储器和进位标志C,结果送累加器A
从累加器减去存储器和进位标志C,结果送累加器A
从累加器减去存储器和进位标志C,结果送累加器A
从累加器减去存储器和进位标志C,结果送累加器A
从累加器减去存储器和进位标志C,结果送累加器A
从累加器减去存储器和进位标志C,结果送累加器A
从累加器减去存储器和进位标志C,结果送累加器A
从累加器减去存储器和进位标志C,结果送累加器A
零页X变址
绝对X变址
先变址X后间址
零页寻址
绝对寻址
先间址后Y变址
零页X变址
绝对Y变址
绝对X变址
零页寻址
绝对寻址
零页Y变址
零页寻址
绝对寻址
零页X变址
寄存器寻址
寄存器寻址
寄存器寻址
寄存器寻址
寄存器寻址
寄存器寻址
先变址X后间址
零页寻址
立即寻址
绝对寻址
先间址后Y变址
零页X变址
绝对Y变址
绝对X变址
先变址X后间址
零页寻址
立即寻址
绝对寻址
后变址Y间址
零页X变址
绝对Y变址
绝对X变址
E6 INC
EE INC
F6 INC
FE INC
C6 DEC
CE DEC
D6 DEC
DE DEC
E8 INX
CA DEX
C8 INY
88 DEY
21 AND
25 AND
29 AND
2D AND
31 AND
35 AND
39 AND
3D AND
01 ORA
05 ORA
09 ORA
0D ORA
11 ORA
15 ORA
19 ORA
1D ORA
41 EOR
45 EOR
49 EOR
4D EOR
51 EOR
55 EOR
59 EOR
5D EOR
18 CLC
38 SEC
存储器单元内容增1
存储器单元内容增1
存储器单元内容增1
存储器单元内容增1
存储器单元内容减1
存储器单元内容减1
存储器单元内容减1
存储器单元内容减1
寄存器X内容加1
寄存器X内容减1
寄存器Y内容加1
寄存器Y内容减1
寄存器与累加器相与,结果送累加器A
寄存器与累加器相与,结果送累加器A
寄存器与累加器相与,结果送累加器A
寄存器与累加器相与,结果送累加器A
寄存器与累加器相与,结果送累加器A
寄存器与累加器相与,结果送累加器A
寄存器与累加器相与,结果送累加器A
寄存器与累加器相与,结果送累加器A
寄存器与累加器相或,结果送累加器A
寄存器与累加器相或,结果送累加器A
寄存器与累加器相或,结果送累加器A
寄存器与累加器相或,结果送累加器A
寄存器与累加器相或,结果送累加器A
寄存器与累加器相或,结果送累加器A
寄存器与累加器相或,结果送累加器A
寄存器与累加器相或,结果送累加器A
寄存器与累加器相异或,结果送累加器A
寄存器与累加器相异或,结果送累加器A
寄存器与累加器相异或,结果送累加器A
寄存器与累加器相异或,结果送累加器A
寄存器与累加器相异或,结果送累加器A
寄存器与累加器相异或,结果送累加器A
寄存器与累加器相异或,结果送累加器A
寄存器与累加器相异或,结果送累加器A
清除进位标志
置进位标志C
零页寻址
绝对寻址
零页X变址
绝对X变址
零页寻址
绝对寻址
零页X变址
绝对X变址
隐含寻址
隐含寻址
隐含寻址
隐含寻址
先变址X后间址
零页寻址
立即寻址
绝对寻址
先间址后Y变址
零页X变址
绝对Y变址
绝对X变址
先变址X后间址
零页寻址
立即寻址
绝对寻址
先间址后Y变址
零页X变址
绝对Y变址
绝对X变址
先变址X后间址
零页寻址
立即寻址
绝对寻址
先间址后Y变址
零页X变址
绝对Y变址
绝对X变址
D8 CLD
F8 SED
B8 CLV
58 CLI
78 SEI
C1 CMP
C5 CMP
C9 CMP
CD CMP
D1 CMP
D5 CMP
D9 CMP
DD CMP
E0 CPX
E4 CPX
EC CPX
C0 CPY
C4 CPY
CC CPY
24 BIT
2C BIT
0A ASL
06 ASL
0E ASL
16 ASL
1E ASL
4A LSR
46 LSR
4E LSR
56 LSR
5E LSR
2A ROL
26 ROL
2E ROL
36 ROL
3E ROL
6A ROR
清除十进制运算标志D
置十进制运算标志D
清除溢出标志V
清除中断禁止指令I
置位中断禁止标志I
累加器A的内容和存储器比较
累加器A的内容和存储器比较
累加器A的内容和存储器比较
累加器A的内容和存储器比较
累加器A的内容和存储器比较
累加器A的内容和存储器比较
累加器A的内容和存储器比较
累加器A的内容和存储器比较
寄存器X的内容和存储器比较
寄存器X的内容和存储器比较
寄存器X的内容和存储器比较
寄存器Y的内容和存储器比较
寄存器Y的内容和存储器比较
寄存器Y的内容和存储器比较
累加器A与存储器相与不放入A,结果影响标志位
累加器A与存储器相与不放入A,结果影响标志位
算术左移指令,相当于把数乘以2
算术左移指令,相当于把数乘以2
算术左移指令,相当于把数乘以2
算术左移指令,相当于把数乘以2
算术左移指令,相当于把数乘以2
逻辑右移指令,相当于把数除以2
逻辑右移指令,相当于把数除以2
逻辑右移指令,相当于把数除以2
逻辑右移指令,相当于把数除以2
逻辑右移指令,相当于把数除以2
循环左移指令,连进位C一起左移一位
循环左移指令,连进位C一起左移一位
循环左移指令,连进位C一起左移一位
循环左移指令,连进位C一起左移一位
循环左移指令,连进位C一起左移一位
循环右移指令,连进位C一起右移一位
先变址X后间址
零页寻址
立即寻址
绝对寻址
先间址后Y变址
零页X变址
绝对Y变址
绝对X变址
立即寻址
零页寻址
绝对寻址
立即寻址
零页寻址
绝对寻址
零页寻址
绝对寻址
累加器寻址
零页寻址
绝对寻址
零页X变址
绝对X变址
累加器寻址
零页寻址
绝对寻址
零页X变址
绝对X变址
累加器寻址
零页寻址
绝对寻址
零页X变址
绝对X变址
累加器寻址
66 ROR 循环右移指令,连进位C一起右移一位
6E ROR 循环右移指令,连进位C一起右移一位
76 ROR 循环右移指令,连进位C一起右移一位
7E ROR 循环右移指令,连进位C一起右移一位
48 PHA 累加器进栈指令
68 PLA 累加器出栈指令
08 PHP 标志寄存器P进栈指令
28 PLP 标志寄存器P出栈指令
4C JMP 无条件转移指令
5C JMP 无条件转移指令
F0 BEQ 如果标志位Z=1则转移,否则继续
D0 BNE 如果标志位Z=0则转移,否则继续
B0 BCS 如果标志位C=1则转移,否则继续
90 BCC 如果标志位C=0则转移,否则继续
30 BMI 如果标志位N=1则转移,否则继续
10 BPL 如果标志位N=0则转移,否则继续
70 BVS 如果标志位V=1则转移,否则继续
50 BVC 如果标志位V=0则转移,否则继续
20 JSR 从主程序转移到子程序
60 RTS 返回主程序
01 ORA
寄存器与累加器相或,结果送累加器
A
05 ORA
寄存器与累加器相或,结果送累加器
A
06 ASL
算术左移指令,相当于把数乘以
2
08 PHP
标志寄存器
P
进栈指令
09 ORA
寄存器与累加器相或,结果送累加器
A
0A ASL
算术左移指令,相当于把数乘以
2
0D ORA
寄存器与累加器相或,结果送累加器
A
0E ASL
算术左移指令,相当于把数乘以
2
10 BPL
如果标志位
N=0
则转移,否则继续
11 ORA
寄存器与累加器相或,结果送累加器
A
15 ORA
寄存器与累加器相或,结果送累加器
A
16 ASL
算术左移指令,相当于把数乘以
2
18 CLC
清除进位标志
19 ORA
寄存器与累加器相或,结果送累加器
A
1D ORA
寄存器与累加器相或,结果送累加器
A
1E ASL
算术左移指令,相当于把数乘以
2
20 JSR
从主程序转移到子程序
21 AND
寄存器与累加器相与,结果送累加器
A
24 BIT
累加器
A
与存储器相与不放入
A
,结果影响标志位
零页寻址
绝对寻址
零页X变址
绝对X变址
隐含寻址
隐含寻址
隐含寻址
隐含寻址
绝对寻址
间接寻址
相对寻址
相对寻址
相对寻址
相对寻址
相对寻址
相对寻址
相对寻址
相对寻址
绝对寻址
隐含寻址
先变址
X
后间址
零页寻址
零页寻址
隐含寻址
立即寻址
累加器寻址
绝对寻址
绝对寻址
相对寻址
先间址后
Y
变址
零页
X
变址
零页
X
变址
绝对
Y
变址
绝对
X
变址
绝对
X
变址
绝对寻址
先变址
X
后间址
零页寻址
25 AND
寄存器与累加器相与,结果送累加器
A
26 ROL
循环左移指令,连进位
C
一起左移一位
28 PLP
标志寄存器
P
出栈指令
29 AND
寄存器与累加器相与,结果送累加器
A
2A ROL
循环左移指令,连进位
C
一起左移一位
2C BIT
累加器
A
与存储器相与不放入
A
,结果影响标志位
2D AND
寄存器与累加器相与,结果送累加器
A
2E ROL
循环左移指令,连进位
C
一起左移一位
30 BMI
如果标志位
N=1
则转移,否则继续
31 AND
寄存器与累加器相与,结果送累加器
A
35 AND
寄存器与累加器相与,结果送累加器
A
36 ROL
循环左移指令,连进位
C
一起左移一位
38 SEC
置进位标志
C
39 AND
寄存器与累加器相与,结果送累加器
A
3D AND
寄存器与累加器相与,结果送累加器
A
3E ROL
循环左移指令,连进位
C
一起左移一位
41 EOR
寄存器与累加器相异或,结果送累加器
A
45 EOR
寄存器与累加器相异或,结果送累加器
A
46 LSR
逻辑右移指令,相当于把数除以
2
48 PHA
累加器进栈指令
49 EOR
寄存器与累加器相异或,结果送累加器
A
4A LSR
逻辑右移指令,相当于把数除以
2
4C JMP
无条件转移指令
4D EOR
寄存器与累加器相异或,结果送累加器
A
4E LSR
逻辑右移指令,相当于把数除以
2
50 BVC
如果标志位
V=0
则转移,否则继续
51 EOR
寄存器与累加器相异或,结果送累加器
A
55 EOR
寄存器与累加器相异或,结果送累加器
A
56 LSR
逻辑右移指令,相当于把数除以
2
58 CLI
清除中断禁止指令
I
59 EOR
寄存器与累加器相异或,结果送累加器
A
5C JMP
无条件转移指令
5D EOR
寄存器与累加器相异或,结果送累加器
A
5E LSR
逻辑右移指令,相当于把数除以
2
60 RTS
返回主程序
61 ADC
累加器,存储器,进位标志
C
相加,结果送累加器
A
65 ADC
累加器,存储器,进位标志
C
相加,结果送累加器
A
66 ROR
循环右移指令,连进位
C
一起右移一位
68 PLA
累加器出栈指令
69 ADC
累加器,存储器,进位标志
C
相加,结果送累加器
A
6A ROR
循环右移指令,连进位
C
一起右移一位
6D ADC
累加器,存储器,进位标志
C
相加,结果送累加器
A
6E ROR
循环右移指令,连进位
C
一起右移一位
70 BVS
如果标志位
V=1
则转移,否则继续
零页寻址
零页寻址
隐含寻址
立即寻址
累加器寻址
绝对寻址
绝对寻址
绝对寻址
相对寻址
先间址后
Y
变址
零页
X
变址
零页
X
变址
绝对
Y
变址
绝对
X
变址
绝对
X
变址
先变址
X
后间址
零页寻址
零页寻址
隐含寻址
立即寻址
累加器寻址
绝对寻址
绝对寻址
绝对寻址
相对寻址
先间址后
Y
变址
零页
X
变址
零页
X
变址
绝对
Y
变址
间接寻址
绝对
X
变址
绝对
X
变址
隐含寻址
先变址
X
后间址
零页寻址
零页寻址
隐含寻址
立即寻址
累加器寻址
绝对寻址
绝对寻址
相对寻址
71 ADC
累加器,存储器,进位标志
C
相加,结果送累加器
A
75 ADC
累加器,存储器,进位标志
C
相加,结果送累加器
A
76 ROR
循环右移指令,连进位
C
一起右移一位
78 SEI
置位中断禁止标志
I
79 ADC
累加器,存储器,进位标志
C
相加,结果送累加器
A
7D ADC
累加器,存储器,进位标志
C
相加,结果送累加器
A
7E ROR
循环右移指令,连进位
C
一起右移一位
81 STA
将累加器
A
的内容送入存储器
84 STY
将寄存器
Y
的内容送入存储器
85 STA
将累加器
A
的内容送入存储器
86 STX
将寄存器
X
的内容送入存储器
88 DEY
寄存器
Y
内容减
1
8A TXA
将寄存器
X
的内容送入累加器
A
8C STY
将寄存器
Y
的内容送入存储器
8D STA
将累加器
A
的内容送入存储器
8E STX
将寄存器
X
的内容送入存储器
90 BCC
如果标志位
C=0
则转移,否则继续
91 STA
将累加器
A
的内容送入存储器
94 STY
将寄存器
Y
的内容送入存储器
95 STA
将累加器
A
的内容送入存储器
98 STX
将寄存器
X
的内容送入存储器
98 TYA
将寄存器
Y
的内容送入累加器
A
99 STA
将累加器
A
的内容送入存储器
9A TXS
将寄存器
X
的内容送入堆栈指针
S
9D STA
将累加器
A
的内容送入存储器
A0 LDY
由存储器取数送入寄存器
Y
A1 LDA
由存储器取数送入累加器
A
A2 LDX
由存储器取数送入寄存器
X
A4 LDY
由存储器取数送入寄存器
Y
A5 LDA
由存储器取数送入累加器
A
A6 LDX
由存储器取数送入寄存器
X
A8 TAY
将累加器
A
的内容送入寄存器
Y
A9 LDA
由存储器取数送入累加器
A
AA TAX
将累加器
A
的内容送入寄存器
X
AC LDY
由存储器取数送入寄存器
Y
AD LDA
由存储器取数送入累加器
A
AE LDX
由存储器取数送入寄存器
X
B0 BCS
如果标志位
C=1
则转移,否则继续
B1 LDA
由存储器取数送入累加器
A
B4 LDY
由存储器取数送入寄存器
Y
B5 LDA
由存储器取数送入累加器
A
B6 LDX
由存储器取数送入寄存器
X
B8 CLV
清除溢出标志
V
B9 LDA
由存储器取数送入累加器
A
先间址后
Y
变址
零页
X
变址
零页
X
变址
绝对
Y
变址
绝对
X
变址
绝对
X
变址
先变址
X
后间址
零页寻址
零页寻址
零页寻址
隐含寻址
寄存器寻址
绝对寻址
绝对寻址
绝对寻址
相对寻址
先间址后
Y
变址
零页
X
变址
零页
X
变址
零页
Y
变址
寄存器寻址
绝对
Y
变址
寄存器寻址
绝对
X
变址
立即寻址
先变址
X
后间址
立即寻址
零页寻址
零页寻址
零页寻址
寄存器寻址
立即寻址
寄存器寻址
绝对寻址
绝对寻址
绝对寻址
相对寻址
先间址后
Y
变址
零页
X
变址
零页
X
变址
零页
Y
变址
绝对
Y
变址
BA TSX
将堆栈指针
S
的内容送入寄存器
X
BC LDY
由存储器取数送入寄存器
Y
BD LDA
由存储器取数送入累加器
A
BE LDX
由存储器取数送入寄存器
X
C0 CPY
寄存器
Y
的内容和存储器比较
C1 CMP
累加器
A
的内容和存储器比较
C4 CPY
寄存器
Y
的内容和存储器比较
C5 CMP
累加器
A
的内容和存储器比较
C6 DEC
存储器单元内容减
1
C8 INY
寄存器
Y
内容加
1
C9 CMP
累加器
A
的内容和存储器比较
CA DEX
寄存器
X
内容减
1
CC CPY
寄存器
Y
的内容和存储器比较
CD CMP
累加器
A
的内容和存储器比较
CE DEC
存储器单元内容减
1
D0 BNE
如果标志位
Z=0
则转移,否则继续
D1 CMP
累加器
A
的内容和存储器比较
D5 CMP
累加器
A
的内容和存储器比较
D6 DEC
存储器单元内容减
1
D8 CLD
清除十进制运算标志
D
D9 CMP
累加器
A
的内容和存储器比较
DD CMP
累加器
A
的内容和存储器比较
DE DEC
存储器单元内容减
1
E0 CPX
寄存器
X
的内容和存储器比较
E1 SEC
从累加器减去存储器和进位标志
C
,结果送累加器
A
E4 CPX
寄存器
X
的内容和存储器比较
E5 SEC
从累加器减去存储器和进位标志
C
,结果送累加器
A
E6 INC
存储器单元内容增
1
E8 INX
寄存器
X
内容加
1
E9 SEC
从累加器减去存储器和进位标志
C
,结果送累加器
A
EC CPX
寄存器
X
的内容和存储器比较
ED SEC
从累加器减去存储器和进位标志
C
,结果送累加器
A
EE INC
存储器单元内容增
1
F0 BEQ
如果标志位
Z=1
则转移,否则继续
F1 SEC
从累加器减去存储器和进位标志
C
,结果送累加器
A
F5 SEC
从累加器减去存储器和进位标志
C
,结果送累加器
A
F6 INC
存储器单元内容增
1
F8 SED
置十进制运算标志
D
F9 SEC
从累加器减去存储器和进位标志
C
,结果送累加器
A
FD SEC
从累加器减去存储器和进位标志
C
,结果送累加器
A
FE INC
存储器单元内容增
1
寄存器寻址
绝对
X
变址
绝对
X
变址
绝对
Y
变址
立即寻址
先变址
X
后间址
零页寻址
零页寻址
零页寻址
隐含寻址
立即寻址
隐含寻址
绝对寻址
绝对寻址
绝对寻址
相对寻址
先间址后
Y
变址
零页
X
变址
零页
X
变址
绝对
Y
变址
绝对
X
变址
绝对
X
变址
立即寻址
先变址
X
后间址
零页寻址
零页寻址
零页寻址
隐含寻址
立即寻址
绝对寻址
绝对寻址
绝对寻址
相对寻址
后变址
Y
间址
零页
X
变址
零页
X
变址
绝对
Y
变址
绝对
X
变址
绝对
X
变址