原创文章,如有转载,请注明出处:http://blog.csdn.net/desert2009sz/article/details/6877589
一、前言
对于汇编,我一直很敬畏,特别是多过2000行的代码时,看到就有点怯场,不敢往下看了。“人都是被迫出来”,这句话在这里也适用,在没有办法的情况下,有些时候你也必须淡定地面对它。虽然代码啰嗦,随处可见的稀奇古怪跳转,纠结的各种各样的寻址方式,必须面对的寄存器使用,以及让人最最痛苦的是思维模式的转变等,让人用起来伤脑筋,但不可否认它独有的优势:细节可控,时序精准,硬件成本低廉(OTP的MCU多数只能用汇编)。
昨天终于说服自己狠下心来去看iop相关的那段代码,目的只有一个:为了节约成本和实现双无线游戏手柄。代码不是很长,一部分受编译开关的影响没有起作用,可以跳过不看。本文主要对6502s的硬件地址结构,常用指令系统做了记录,以及对iop主程序的结构,复位,中断,IR接收(NEC),游戏按键扫描等做了备注。
二、基础知识
1. MCU R65C02硬件地址划分
地址范围 说明 区域 $0 ~ $40 直接I/O控制器寄存器(不存SRAM区域) - $40 ~ $FF Zero Page free SRAM $100 ~ $1FF Page1 SRAM $200 ~ $205 Each vector SRAM $206 ~ $23F Free direct-mapping area SRAM $240 ~ $ CODE区域 CODE 2. 数制
数制 说明 二进制 "%"开头,或"B"、"b"结尾 八进制 "O"、"o"、"Q"、"q"结尾 十进制 "D"、"d"结尾,或无结尾 十六进制 "H"、"h"结尾,或"$"、"0x"、"0X"开头 3. 指令
指令 说明 sei 关闭总的中断 cli 打开总的中断 stz mm 将目的地址清零,累加器和状态寄存器都不变 stx mm X→mm rmb bit, byte 将byte的bit位清0 smb bit, byte 将byte的bit位置1 bbr bit, byte, label 如果byte的bit为0,则跳到label处执行,否则顺序执行 bbs bit, byte, label 如果byte的bit为1,则跳到label处执行,否则顺序执行 bra 相当于jmp phx X→SP
phx: .macro
txa
pha
.endmplx SP→X
phx: .macro
pla
tax
.endmcmp #dd A-#dd,若结果为负,则C置0,否则置1;若结果为0,则Z置1。不改变A的值 .PAGE0 将.PAGE0下的数据定位到“零页段”(0x00~0xFF) .ifnz 当条件不为0时(条件为真),汇编器将对.ifnz的语句进行汇编
由于没有8202v和6502s的规格书,所以芯片的硬件结构和指令系统,也是参考程序内的注释和同系列芯片的介绍,不对之处还请各位指出。