📄 6502基础知识.txt
字号:
-----------------------------------------------------------------------------
1.7 指令系统
这是本章的最后一节,将详细讲解指令系统
$xxxx:16位地址
#$xx:数据
$xx:零页地址
data:地址中数据
addr:地址
stack:堆栈
a,x,y,p,s:寄存器
z,n,c,v,d,i,b:标志寄存器p的各位
各种指令和寻址方式构成了汇编代码,要注意并非每个指令都有所有的寻址方式,例如cmp指令就只有cmp($xx,x)的间接x寻址方式而没有cmp($xx),y的间接y寻址方式
指令分为一字节、二字节、三字节指令,分别占用1,2,3 b的存储空间,一、二字节的指令比三字节指令所占空间少,速度快
1.数据传输指令
这里的传输是"复制",而不是"移动"
(1)lda
data->a
(2)ldx
data->x
(3)ldy
data->y
(4)sta
a->addr
(5)stx
a->addr
(6)sty
a->addr
(7)tay
a->y
(8)tya
y->a
(9)tax
a->x
(10)txa
x->a
(11)pha
a->stack
堆栈是由系统开辟的一块用于保护数据的区,在$0100-$01ff间,用于存放一些数据
这里pha将a放入了堆栈中,同时堆栈指针s=s-1
(12)pla
stack->a
将保存在堆栈最上的数据弹出->a,s=s+1
(13)php
p->stack,s=s-1
(14)plp
stack->p,s=s+1
(15)tsx
s->x
(16)txs
x->s
2.数据操作指令
(1)ora
a=a or data
(2)eor
a=a xor data
(3)and
a=a and data
(4)asl
逻缉左移,将data中各位依次向作移一位,最高位->c,相当于x2
a(or data)=<<a(or data)=a(or data)*2
(5)lsr
a(or data)=>>a(or data)=a(or data)/2
(6)rol
循环左移
(7)ror
循环右移
(8)bit
相当于and,只是与操作的结果不放入a中,而只是影响标志位
(9)adc
a=a+c+data
这带c进位的加法,若c=1,则a=a+data+1
因此在单个数据加法时要将c位清0
如:lda#$80
clc
adc#$05
sta$2000
rts
此时结果为85 而在多个数据加法时,仅在最低位加法时清0
如2030+5080
lda#$30
clc
adc#$80
sta$2000
lda#$20
adc#$50 //注意这里就不要清c了
sta$2001
rts
结果为70B0
(10)sbc
带c借位减法
a=a-c-data
减法和加法类似,在单个数据减法时,需将c位置1
如lda#$80
sec
sbc#$20
sta$2000
rts
多个数据加减最低位要令c置1,其它不要
如:2050-1020
lda#$50
sec
sbc#$20
sta$2000
lda#$20
sbc#$10
sta$2001
rts
(11)dex
x=x-1
(12)dey
y=y-1
(13)inx
x=x+1
(14)iny
y=y-1
(15)inc
data=data+1
(16)dec
data=data-1
3.数据比较指令
(1)cmp
比较 a和 data
若相等,z=0
a>data c=1
a<data c=0
(2)cpx
比较x和data
(3)cpy
比较y和data
4.跳转指令
(1)bne
if z=1 then ...
(2)beq
if z=0 then ...
(3)bcs
if c=1 then ...
(4)bcc
if c=0 then ...
(5)bvs
if n=0 then ...
(6)bmi
if n=1 then ....
(1)-(6)皆为相对寻址
(7)jsr
调用子程序,遇rts返回
如:
2000:lda#$20
jsr$2100
sta$2000
rts
2100:clc
adc#$20
rts
(8)jmp
无条件跳转至地址
jmp($xxxx)
间接寻址跳转
5.位操作指令
(1)sec
set c=1
(2)clc
set c=0
(3)sei
set i=1
(4)cli
set i=0
(5)sed
set d=1
(6)cld
set d=0
(7)clv
set v=0
6.中断相关指令
(1)int
执行软中断
(2)rti
从中断返回
7.其它指令
(1)nop
什么也不做,空耗一个机器周期,用于延时等
(2)rts
从子程序返回或结束主程序
第二章 编写程序
第一节 BIN文件结构
第二节 第一个汇编程序
第三节 程序分析
第2章
+----------+
+ 编写程序 +
+----------+
第一节 BIN文件结构
我们要用汇编来编写一个WQX上的可执行文件-BIN文件
首先要熟悉BIN文件的结构
1.文件0-2字节 作用是BIN文件的标志,在NC1020中,可能有2种情况,1是AE EE EA,系统将把BIN文件装载到$04-$0F页中的任一页$4000开始的地址,然后跳转到这一页,运行之
另一种是"A5 55 5A",系统将把文件复制到内存$2000开始的地址,运行之
NC2k之后的系统则只有"AE EE EA"这种情况,系统将把文件复制到$80页XRAM的$4000开始的地址,运行之
2.文件3-6字节:是表示文件大小,实际上系统并不使用这一数据,因次可以不管,可以使其为"00 10 00 20"就好了
3.文件7-9字节:"4C XX YY",4C是固定的,$YYXX则是要文件的入口
比如是这样的"4C FF 40"那么在载入了BIN文件后,就会跳转到$40FF来执行之
4.文件A-F字节:系统版本标志,Nc1020必须为"70 03 10 03 FF FF",NC2k之后的机型一般为"70 03 31 03 FF FF",但若改为其它的也无影响
接着10-文件尾部,就是BIN文件的正式内容了,代码和数据都是在这里的
另外,NC机型上的BIN文件在传入电脑后,都会被加密,而传回WQX后则会被解密
因此若要在电脑端编辑BIN文件,则需使用BIN解密工具如BXSY的NC加解密
第二节 第一个汇编程序
我们现在来编写一个汇编程序,它的作用是显示一个信息框
首先是进入DEBUG工具
比如在NC1020上使用NC-TOOLS,NC2k上使用WQXDEBUG,TOOLS-2600,WQXHEXNC等
这里以使用TOOLS-2600在NC2600上为例,nc2000可用tools-2000
tool-2600可生成*.com文件,其格式和运行方式同第一节所说的nc1020的"aa 55 5a"相同 进入TOOLS-2600
进入HEX的界面后
按下求助,选择"6.清空内存",$2000-$3000的数据将被清除
输入V 2013,空格 //每次输入后都要按空格,下同按下"输入法"键,输入文字"Hello world!"
输入e c 201f,输入数据00 00 80 13 20 18 10 0c 02 27 20
到这里数据部分就完成了
输入
A 202a,空格
最底下会出现202a-
这时就会要输入汇编代码:
输入以下代码:
LDX#$21
LDY#$20
LDA#$00
INT$CA12
INT$C00A
RTS
输入a 2010
输入代码:
jmp$202a
输入中,方向上为"$",方向下为",",翻页上为"#",翻页下为"(",方向左为")",方向右为"y","."为"b",若输入不正确,可按"k"消去刚输入的一个符号
这样,一个程序就算是完成了,运行一下看看
输入G 2010
看到效果了吧!
接着按下"求助"->"应用程序",选择"制作程序",给这个程序起个名字,比如"message",确定,然后在COM程序目录下就会多了个message.com文件
用com平台运行它,就可看到效果了
第三节 程序分析
现在我们来分析上面说的那个程序,
首先,我们输入的信息"Hello World!"是待显示的信息
那些80 13 20....则是一个表,信息框的显示程序利用这个表来了解如何显示文字
表的格式是这样的:
80 ;固定标志
13 20 ;要显示文字的位置,这里即是$2013,文字的最要跟2个00
18 10 ;信息框的x,y轴位置
0c ;文字长度,不包括00
02 ;信息框行数x2,这共一行,因此是02,若是2行,则是04,3行是06...以此类推
27 20 ;是信息框文字显示类型的地址,这里是$2027,$2027为02,则显示类型为02,正常,修改02为其它值如82,可看到一些其它的效果,如反显,小字等等
接着输入的那段程序则是关键的程序部分了
ldx#$21
ldy#$20
这个是定义上一步那个表的地址,这里是$2021
lda#$00
这里是显示的信息框类型,00表示是普通的信息框
01表示单选框
02是是否选择框,图标为"!"
03是是否选择框,图标是"?"
接着是
int$ca12
int$c00a
这2个都是调用系统中断,int$ca12的作用是跟据前面设定的参数来显示文字信息框
int$c00a则是和gvbasic里的inkey$一样,获得一次按键停顿,然后才接着运行,好让用户看清显示
最后rts ;结束程序
int中断向量
如int$ca12这样的代码称为中断调用(brk),其计算方法如下:
若设int$abcd(如int$0517,那么a=0,b=5,ab=05,cd=17)
1.若ab在$01-0f之间,a ab则从ab页的地址$4000+cd*2和$4001+cd*2取数据xx,yy,运行$yyxx
2.若ab=$0 则从0页地址$8000+cd*2和$8001+cd*2处取数据xx,yy,运行$yyxx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -