6502基础知识.docx

上传人:b****3 文档编号:11614077 上传时间:2023-06-01 格式:DOCX 页数:14 大小:23.57KB
下载 相关 举报
6502基础知识.docx_第1页
第1页 / 共14页
6502基础知识.docx_第2页
第2页 / 共14页
6502基础知识.docx_第3页
第3页 / 共14页
6502基础知识.docx_第4页
第4页 / 共14页
6502基础知识.docx_第5页
第5页 / 共14页
6502基础知识.docx_第6页
第6页 / 共14页
6502基础知识.docx_第7页
第7页 / 共14页
6502基础知识.docx_第8页
第8页 / 共14页
6502基础知识.docx_第9页
第9页 / 共14页
6502基础知识.docx_第10页
第10页 / 共14页
6502基础知识.docx_第11页
第11页 / 共14页
6502基础知识.docx_第12页
第12页 / 共14页
6502基础知识.docx_第13页
第13页 / 共14页
6502基础知识.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

6502基础知识.docx

《6502基础知识.docx》由会员分享,可在线阅读,更多相关《6502基础知识.docx(14页珍藏版)》请在冰点文库上搜索。

6502基础知识.docx

6502基础知识

6502基础知识:

6502CPU就是8位的处理器,早期的nes(任天堂娱乐系统)即就是采用了此种cpu,特点就是功耗小,成本低,稳定性强,缺点嘛,自然就是很明显,速度慢,能处理的任务类型少,而且,相对于NES,WQX还少了象处理图象与声音的专用芯片(NC2k后的系统增加了高速处理芯片DSP来作为声音处理,因此使在其上播放WAV成为可能)。

 

以后,我们使用汇编语言,就都要与这个6502芯片打交道了,让我们熟悉一下它。

 

与PC上的8080CPU一样,6502cpu也有一套指令集,cpu识别指令,进行相应的操作。

 

这些指令都就是16进制的,比如:

a9h01h85h80h60h,在16进制数据后面加上一个"h"(hex),来将它们与其它进制区分开来,以后的内容里,16进制后将不加h,其它进制(10进制后加"D"(dec),2进制后加"B"(bin))则将特别说明。

 

上面的那段数据:

a901858060,就就是一段机器码,也就是一段汇编程序,汇编的写法如下:

 

lda#$01 

sta$80 

rts 

这段命令的用途将在以后介绍,这里只就是让大家了解一下汇编及机器码程序的书写格式。

 

这些数据以二进制的格式被存储在wqx的存储介质里(一般为ram,flash,rom),由cpu控制不断从存储介质中读取并分析执行。

数与运算相关知识 

这节讲解进制、逻辑运算知识,若已经知道,可跳去下一节 

(1)进制:

 

a、常见的计数制:

 

10进制,这就是大家熟悉的,由0-9这10个数码组成,逢10进位,表示时在数码后加D(Decimal),由于很常用,常省略"D" 

b、二进制数:

 

只有0,1两个数码,逢2进位,用B(Binary)结尾,如11110000B 

c、十六进制数 

有0-9与A,B,C,D,E,F共16个数码,其中A,B,C,D,E,F分别对应10进制的10,11,12,13,14,15,后用H(hexadecimal)结尾,如79h。

因为本书中大量使用了这一数志,所以将"h"省略 

各进制数间可进行等值转换,可使用wqx上科学计算器实现计算机只能识别1,0代表的两种信息,所以在计算机中运行的就是二进制数,而计算机中所谓的8位机,则就是指6502一次处理数据长度为8位 

逻辑运算知识 

6502多用于控制领域,因此6502系统中存在大量逻辑运算,基本的逻辑运算有:

"与","或","非",基本逻辑运算再经简单的组合,便可构成复合逻辑门,如"与非门","或非门","异或门"等等,下面讲解它们a、逻辑与 

逻辑表达式为:

f=a^b 

a,b为2事件,只有当a,b皆为真时,结果f才为真,否则f为假 

f=a^b的逻辑状态表:

 

0^0=00^1=01^0=0 

1^1=1 

规则可总结为:

"有0则0,全1则1" 

与操作在实际中常于于屏蔽(修改)或测试(获取)数据中某个或某几个位的状态 

如lda$80 

and#$40(10000000b) 

sta$80 

rts 

这样就可以屏蔽$80中的6-0位 

b、逻辑或 

逻辑或的表达式为:

 

f=aˇb 

逻辑状态表为:

 

0ˇ0=10ˇ1=11ˇ0=11ˇ1=1规则可总结为:

"有1则1,全0则0" 

或操作常用来置位,如将$80的0,1位置1:

 

lda$80 

ora#$03(00000011b) 

sta$80 

rts 

与上面就是一样的,现在$80里就又就是原来的数据了,这里#$79就就是密码,没有它就无法解开加密后的数据 

6502寄存器知识 

触发器就是一类具有记忆能力的基本逻辑电路 

触发器就就是一位寄存器,可以存放1位二进制信息,并且有接收与输出二进制数的功能,N个触发器便可构成N位的寄存器 

6502中共有5个8位寄存器与1个16位寄存器 

1、累加寄存器A 

这就是8位的寄存器,也就是6502中最重要与最常用的寄存器,可用于读写数据,进行各种逻辑运算等等。

 

2、变址寄存器X 

这个8位寄存器与A差不多,只就是它可以非常方便地加1或减1,常用于数据传送,运算等等3、变址寄存器Y 

与X一样,2个变址寄存器搭配使用使程序更加灵活 

4、堆栈指针SP 

这就是8位的寄存器,指向对栈栈顶位置 

在程序运行时。

须要一称之为堆栈的RAM块作为数据缓冲区,以暂存程序运行过程中的一些重要数据 

堆栈由连续的RAM单元组成。

数据写入堆栈称入栈,数据从堆栈中读出称为出栈,堆栈的操作遵循"先进后出"的操作,即先入栈的数据后出栈。

 

系统如何了解当前的堆栈顶在哪以从顶部弹出堆栈呢?

 

就要依靠堆栈指针SP,6502规定,堆栈位于第一页($0100-$01ff)的RAM中,因此SP指向的时堆栈顶的低8位,即堆栈顶地址为$00SP,当进行入栈、出栈操作时,栈顶单元发生变化,SP的内容也将加1或减1 

可以用下面程序读出当前SP的内容:

 

TSX 

STX$2000 

RTS 

这时$2000即为SP的内容 

5、程序状态字PSW(ProgramStatusWord) 

这也就是8位寄存器,用于寄存指令执行的状态信息,PSW的各位状态有的就是根据指令执行的结果由硬件自动设置的,有的可以由用户用软件的方法设定。

PSW的各位如下(其中第5位未用,保持为0) 

76543210 

NVBDIZC 

N:

负数标志,指令指行完后为负(>7F)则n=0,否则为1 

V:

溢出标志,若产生溢出则V=1,否则V=0 

I:

中断标志。

就是否允许系统中断IRQ,=1:

禁止,=0:

允许 

Z:

零标志,结果就是否为0,为0则Z=1,否则Z=0 

C:

进位标志,结果最高位有进位则C=1,否则C=0 

5、程序计数器PC 

这就是6502唯一的一个16为计数器,其内容为将要执行命令的存放地址,寻址范围达64KB($0000-$FFFF),CPU就是根据PC的内容找到指令的存储单元,取出指令执行的。

PC具有自动加1的功能,CPU每读取一条指令的1字节,PC内容自动加1,指向下一个存储单元,这样就能实现程序的顺序执行 

PC没有地址,用户不能对它进行读写,但可以通过转移,调用,返回等指令改变其内容,以改变程序的执行顺序 

6502主要组成设备 

这节讲解wqx的主要组成部件 

1、软件 

就就是我们编写或下载的程序与系统的部分,6502系统包括软件与硬件两个方面。

 

2、存储器 

主要作用就是存放程序与数据,6502系统的存储单元为8位,每位都就是一个二进制数,即每个存储单元存放一个8位的进制数,也就就是一个字节。

 

向存储单元存放信息称为"写",取出信息称为"读","读","写"操作都称为访问存储器。

6502访问存储器就是根据存储单元的地址进行的,根据地址访问存储单元又称为寻址。

6502的cpu最大寻址范围为64kb,即$0000-$ffff 

wqx有512kb的闪存与数mb的rom,而cpu却只能寻址64kb,这个问题就是如何解决的呢?

 

与早期的dos系统一样,系统对存储器采取了分页访问的方法,以nc1020的512kb闪存为例,第00页的$4000-$bfff为512kb的第一个32kb,第01页的$4000-$bfff为512kb的第二个32kb、、、以此类推,这样即可对大容量的存储器进行访问。

至于nc2k的nandflash存储器,与这有些不同,这将在以后详细讲解。

 

Wqx主要有下面这些存储器:

 

a、MaskROM 

这就是种不可写的存储器,又称为掩膜ROM,也就就是说对于此种存储器来说,只能进行读操作。

在NC1020中分步在80-FF页$4000-BFFF 

b、Systembios 

这就是种特殊的rom,就是系统的bios,存放了中断处理例程,系统重要的函数等等 

位于各系统的$e000-$ffff 

c、NorFlash就是可多次擦除的存储器,wqx用的就是512kb的norflash,Flash存储器内容不易丢失。

norflash的特点就是读取速度快,性能稳定,可以芯片内执行,缺点则就是容量小,写入速度慢,nc2k以前的机型将其作为系统/数据存储器,nc2k以后的机型则将其作为系统与一些重要数据的存储器 

d、nandflash 

这就是一种容量很大的flash存储器。

nc2k使用的就是32mb的nandflash,它的特点就是容量大,擦写速度快,缺点就是稳定性较差(易出现坏区),读写复杂,同时读取速度较慢 

e、sram 

主要的随机存储器也即内存,分布在各系统的$0000-$3fff($0000-$003f映射到系统i/o) 

f、xram 

nc2k后的机型为了适应nandflash增加的32k大内存,位于$80页4000-bfff 

g、ramb 

nc2k系统作为坏区表等信息存放处 

h、ram04 

$00页的$4000-$5fff($6000-$7fff为其镜象),8k的内存 

3、CPU中央处理器(CentralProcessorUnit,CPU)就是整个6502系统的核心,由运算器与控制器组成,进行运算与控制操作。

 

a、运算器就是6502的运算部件,内有逻辑运算单元,可以实现加、减、加1、减1、比较等算术运算与与、或、异或等逻辑运算。

 

b、控制器就是6502的指挥控制元件,保证wqx各部分能自动而协调地工作。

 

4、I/O接口 

wqx在工作时,要不断从外部设备,比如键盘等获取信息,并向外部设备,比如屏幕,发送控制信号,这些信息的输入输出电路称为I/O(Input/Output),I/O口就是系统与外部设备之间交换信息的通道 

WQX共有64个8位I/O口,分别被映射到sram的$0000-$003f,直接对改段地址进行操作即可操作I/O 

5、其它外部设备 

很多设备就是不能集成到6502主板上的,比如lcd,红外/串口通讯设备,键盘,电源(电池与外部电源接口),时钟电路,发音设备等等,它们称为外部设备,一般通过I/O接口对它们进行访问。

 

使用debug工具 

这就是本章最后一节,这里我将告诉大家如何使用debug工具,这可就是很重要的!

 

目前wqx使用的debug工具有xasm(byxu),wqxhex(bysun),nc-tools(byxu)等等,这里我强烈推荐nc-tools这个工具!

这就是我有史以来用过的最好的debug工具了。

 

nc-tools1020与2600分别在的下载区与星迷天地区可得到最新版本。

nc1020版nc-tools可用于nc1020/n,cc880,cc980;nc2600版可用于nc-2600,如果您的机型没由相应的nc-tools,用sun的wqxhexeditor也可。

 

这里只介绍与汇编编程相关的一些命令的用法,其它功能请参考nc-tools使用说明 

按键操作:

 

空格:

命令确定 

方向上:

当前浏览位置+10 

下:

减10 

换姨烫烫烫烫烫烫烫烫烫烫烫坛上:

加1 

下:

加60 

方向左:

减1 

方向右:

减60 

q:

退出 

求助:

工具菜单 

<中英数>:

切换hex/中文 

<输入法>:

直接以文字修改当前存储器内容 

:

查瞧寄存器状态 

:

当前页+1 

:

-1 

+(nc1020):

清空$2000-$3000 

1、v命令 

转到地址 

格式:

 

vxxxx 

vxxxxyy 

xxxx为地址 

yy为页 

2、ec修改存储器内容 

ecxxxx 

ecxxxxyy 

3、ei插入数据 

eixxxx 

xxxx:

移动范围 

yy:

删除个数 

5、c比较数据 

cx000yy 

x000:

地址yy页 

将yy页x000-xfff与$2000-$2fff比较

6、a写汇编 

axxxxyy 

axxxx 

只能在ram写 

方向上="$" 

换页上="#" 

左=")" 

方向下="," 

右="y" 

"、"="b" 

换页下="(" 

7、sh搜索hex 

shxxxxyyyyxxyy 

xxxxxx开始地址、页 

yyyyyy结束地址、页 

8、sc搜索文字 

scxxxxyyyyxxyy 

9、u反汇编 

uxxxx 

uxxxxyy 

10g执行 

gxxxx 

gxxxxyy 

11、w写入 

wx000yy 

将$2000-$2fff写入$x000-$xfff 

12、l发送 

lx000yy 

将$2000-$2fff写入$x000-$xfff 

12、l发送 

lx000yy 

将yy页x000-xfff发送到$2000-$2fff 

13、x求int中断地址 

xyyyy 

yyyy:

中断向量 

寻址方式 

掌握6502的寻址方式才能弄懂6502的指令,因此这节很重要 

#$xx:

指令 

#$zz:

数据(8位) 

$yy:

地址(8位零页地址) 

$yyyy:

地址(16位) 

(1)立即寻址方式 

格式:

xx#$zz 

如lda#$05 

要寻址的数据在后面已给出,称为立即寻址 

(2)直接寻址方式 

格式:

xx$yyorxx$yyyy 

如:

LDA$1E 

ADC$2300 

要寻址的数据在所给出的地址中,该地址的内容即为所需数据 

这里分为零页寻址(xx$yy)与普通寻址(xx$yyyy) 

xx$yy就相当于xx$00yy 

cpu将$0000-$ffff的可寻址范围分为0-ff个页面,每页面ff个地址,其中$00-$ff称为零页,对她们的寻址称为零页寻址,可以瞧出,由于零页寻址的指令为2字节,较普通寻址要快,因此使用零页寻址的指令可提高程序运行速度 

(3)寄存器隐含寻址 

格式:

xx 

如:

tay 

php 

在这种寻址方式中,所需的数据并没有直接给出,也没有给出地址,而就是将某个寄存器的内容作为操作数,常用于寄存器间交换数据等 

(4)直接x变址,直接y变址 

格式:

xx$yyyy,x 

orxx$yyyy,y 

orxx$yy,y 

orxx$yy,x 

如:

lda$1000,x 

lda$1000,y 

lda$80,x 

lda$80,y 

这种寻址方式就是在直接寻址的基础上,再加上x或y寄存器的内容,获得操作数所在地址 

如lda$1000,x 

当x=5时,那么所要寻址的操作数就在$1005 

(4)间接寻址 

格式:

xx($yy,x)orxx($yy),yorjmp($xxxx) 

如:

cmp($80,x) 

lda($80),y 

所谓间接寻址就就是指操作数所在的地址或所需跳转的地址并不直接给出,而就是在所给出的地址中 

如:

lda($80,x) 

当x=5,$85=00,$86=20 

那么所要的操作数就在$2000中即在$80+5,$81+5存放了地址 

如:

lda($80),y 

当y=5,$80=00,$81=20那么操作数就在$2005中,即将$80,$81中地址+5(y) 

如jmp($2000) 

$2000=00,$2001=30 

那么就会跳转到$3000 

间接寻址就是很重要的一种寻址方式,刚开始时您也许会觉得使用直接寻址很简单,但用多了就会发现,间接寻址的灵活方便就是直接寻址无法相比的 

(6)相对寻址 

格式:

xx$yyyy 

如:

bcs$2000 

相对寻址就是相对于当前地址的跳转指令寻址,可向前或向后跳转,范围在+7f~-7f之间

指令系统 

$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,3b的存储空间,一、二字节的指令比三字节指令所占空间少,速度快 

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=aordata 

(2)eor 

a=axordata 

(3)and 

a=aanddata 

(4)asl 

逻缉左移,将data中各位依次向作移一位,最高位->c,相当于x2 

a(ordata)=<

(5)lsr 

a(ordata)=>>a(ordata)=a(ordata)/2 

(6)rol 

循环左移 

(7)ror 

循环右移 

(8)bit 

相当于and,只就是与操作的结果不放入a中,而只就是影响标志位 

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>datac=1 

a

(2)cpx 

比较x与data 

(3)cpy 

比较y与data 

4、跳转指令 

(1)bne 

ifz=1then、、、 

(2)beq 

ifz=0then、、、 

、、 

(4)bcc 

ifc=0then、、、 

(5)bvs 

ifn=0then、、、 

(6)bmi 

ifn=1then、、、、 

(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 

setc=1 

(2)clc 

setc=0 

(3)sei 

seti=1 

(4)cli 

seti=0 

(5)sed 

setd=1 

(6)cld 

setd=0 

(7)clv 

中断相关指令 

(1)int 

执行软中断 

(2)rti 

从中断返回 

7、其它指令 

(1)nop 

什么也不做,空耗一个机器周期,用于延时等 

(2)rts 

从子程序返回或结束主程序

展开阅读全文
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2