在163的博客关了呀。在这边重新开张了。

  以后若网友有什么要长篇解答的问题,也在这儿作答。

  作为第一波原创文章,我打算做一次小白示范。那就是一步一步的展示某个汇编编译器的用法。

  一、科普

  很多人认为程序与CPU无关,那是受C语言的影响。其实,不同的CPU,它的指令集也不同。

  而汇编则是针对指令集的,可以认为汇编指令就是CPU的指令。当然还有寻址不同。(当然,真正的CPU指令是机器码。因为汇编是最紧贴CPU的,我就做理所当然了。有兴趣的朋友可以学一学汇编与机器码的编译关系,以后当一名HACK大神。)

  还有一点要提一提的,那就是即使同是6502CPU不同宏汇编器,其代码型式有微小的区别。这自然是因为没有一个6502汇编语言标准所造成的,像C语言有两个标准,那还好一些。大家用习惯就自然了解。而宏指令方面,那各个宏汇编器有较大的不同,可以说是八仙过海 -- 各显神通。宏指令就是前缀带点的指令。

  关于NES文件的结构,大家必须了解一二。NES文件是由卡带Dump而来的。意思是说从卡带上的ROM读取字节,保存成文件,其间还需要解密;还要识别卡带的电路结构(卡带电路并非都是一个样,恰恰相反,每家厂商都有自己独到的设计,真是五花百门。),卡带的一些信息定义成iNes文件头。

  NES文件结构,我们称为iNES。它由 : 文件头 + PRG_ROM + CHR_ROM ,依次连接而成。

  我们这次介绍的是Mapper=0的NES制作方法。这是最基础的,所以之后的变化都是从这儿开始的。

  Mapper又是一个新名词,Mapper是一个8位的ID号码,指代“卡带的电路结构”。也就是说,当时Dump的人,简单的将不同的电路结构定了一个序列编号,用作区分。而0号就是最初任天堂的卡带结构,是最简单的,最原始的,没有变化的。也可称之为原型。

  文件头的事,暂不细说。

  程序 (我们称为PRG_ROM) 按16K为单位,当Mapper=0时,程序Bin可以是16K或32K。也就是说程序的长序最多也只能是32K的了,这个限制。大家不用担心写程序时,生成的长度不规整。后面有办法的。不过超长的话要学学切页,那是Mapper>0的后话了。

  图形 (我们称为CHR_ROM) 按8K为单位,当Mapper=0时,图形Bin可以是0或8K。0是什么意思,是没有,可以不要的意思。那么没有图形,是否则黑屏呢。不是的,能够显示图形图案和画面的。那么不要了CHR_ROM,那么卡带上并不是空白,而是补上一个8K的CHR_RAM。大家对ROM和RAM应该了解。CHR就是图形的意思。这句话可以理解为,不要ROM了,换上RAM,图形库就不是固定的了,可以由程序转移不同图形到CHR_RAM里面去。那么显示就更加灵活了。不过用上RAM就不能切页图形了。这话以后就明白了。

  二、下载

  科普结束。这次我要讲解的通用型6502宏汇编器是"6502 Macroassembler & Simulator"。中文意思是“6502宏汇编与模拟器”,名字有点长,我们以后简称"6502Sim"。下载可以我的"网盘"。具体在 " NES Tool Kit " 文件夹中。

  本文下面提到的工具,还有后续博文用到的NES工具一鼓脑的塞进这一文件夹,直到塞满,才放到同名的2号文件夹。

  三、介绍主角

  介绍:6502Sim,作为模拟器,可以让代码在上面单步运行。从而学习6502汇编,看看CPU中各个寄存器的变化,还有栈的变化。从直观的角度学习汇编。调试自然要产生机器码,这个机器码可以保存下来。这就是我们需要的功能了。总之是一个非常好的工具。我提供的这个是中文版。不可避免一些极简单的英文保留下来。

  我们看看6502Sim的玉照。见图1。

图1 6502Sim

  可以看见只要光标点到某个指令上,就会显示对应的指令解析。只要在菜单”帮助“上,点”动态指令帮助“即可。很贴心的功能。我喜欢。帮助为什么是英文?哈哈没有汉化吧,反正不是我汉化的,所以大家要适当学一些英文。或者用机翻,自己解决吧。

  可惜没有行号列,若有编译报错,那要看右下角的坐标信息去找了。Ln是行,Col是列。

  注意:6502Sim规定指令必须缩进一格或一个Tab。我也不知为什么,这可能就是作者的格式,帮助上没有任何提示。我初学时常犯这个错误。报错也没有说清楚的,要问人才知道。坑!

  四、示例

  苦水吐完。我们来看一看还需要一些什么鬼。

  这次我提供完整的示例代码,和一个用来填补的图形文件,其实本示例为了简单起见,不打算显示图形。不过为了后面的学习,还是打包一起。反正批指令里面用到了。

  这次的示例是叶枫的初期作品"生日快乐”音乐演奏。

  代码相对简单,便于示例。(叶枫没有给我们原码,要我们自己去反汇编。泪奔呀。)这个代码由“不是女孩”提供。我小改了一下。我改文件头部分的型式,也是为了便于学习。我打包整套文件,大家去我的网盘下载就可以(前文有链接)。也是在“NES Tool Kit”。

  工具和文件,我是一起打包的。因为我的网盘有文件数量限制。又是坑。下在是必须的工具和文件清单。

 表1 清单

序号 类型 名称
1 工具 6502Sim
2 工具 NesInfo
3 文件 生日快乐.65s
4 文件 ascii_2.chr
5 文件 make.bat

  其它的文件就是自己造出来的了。其实make.bat也能自己写,不过相对有点复杂。我还是留着,还有一个文件头记录我也保留了。等下会说到。

  五、步骤

  这是大家最关心的事情了。

  5.1 代码的编辑工具。

  编辑工具用6502Sim就行,也可以用npp,记事本等等。有一点记好了,编码格式要求是"ANSI"。这一点非常重要。小白就用6502Sim,默认就是ansi格式。若用其它工具编辑,那么保存后缀名改为" .65s ",再用6502Sim打开。

  为什么要是65s后缀名?这只是为了区别汇编代码的格式。上面说过了,不同宏汇编器,对应的格式有区别,为了不混淆。若是像txt后缀名,用6502Sim也能打开,只要文件类型选“ *.* ”就行了。

  5.2 代码编译和生成。

  打开文件后,点菜单“仿真”-“编译”。记好这个图标(三张纸一个下箭头),在快捷栏直接点击也行。没错的话,只会闪一下,也没有什么别的提示。唯有快捷栏上编译按扭旁边的Debuger按扭(一个甲虫的样子)亮了。

  以后调试就用这个甲虫按扭,这次不提。

  接下来要生成bin文件,即65b文件。点菜单"文件"-“保存代码”。这次的例子,代码是从$C000开始的,那么直到$FFFF。(这就是16K了,那么这些代码自然不是刚好16K,完全是少于16K的,其中的空白部分编译时自动补全了。)

  填好文件名,文件名不要有空格,为了后面的方便,否则在make.bat里面给文件名加引号。我不建议给自己添麻烦。本例用的文件名是 BinaryCode 配合后面的make.bat。

  选好类型是“*.65b”,这一个不能错。

  还有还有,还要点“选项”。非常重要。不能漏。选项中,填“开始地址” 0xC000,结束地址“0xFFFF”,代码长度会自己算好。

  最后,点确定,再点保存。OK,这样程序Bin就生成了。(若是切页的话,众多的程序Bin,按次序连接就成了PRG_ROM。现在只有一个Bin,那它就是PRG_ROM。)

  5.3 图形Bin文件

  即作为CHR_ROM。这已经有现成的了(ascii_2.chr,有4K),再说这次示例不作图形显示,所以这个图形Bin也就是充数的。为了简单起见,下次重点再说说图形显示的事情。图形Bin的后缀名是chr,因为我是用一个叫YYCHR的软件生成的。

  这文件只有4K,为了补足8K,后面连接2次。下面详说。

  5.4 文件头的制作

  我们用的软件是我自己开发的。我们来看看样子。打开NesInfo程序,见图2。

图2 NesInfo

  

  填上这次,我们要的数值:

  这次我们只谈Mapper=0,那么填0就可以。

  这次程序从C000到FFFF,共16K,那么PRG ROM填1就可以,1x16K的意思呀。

  这次图形定为8K,当然,没有也行,不过为了完整演示,还是加一个补足。CHR ROM填1就好了。

  镜像,S-RAM,4屏幕,TRAINER用不上,默认好了。

  这里简单解释一下,大家暂时不用追求深入了解。

表2  名词

  释义
镜像 背景图像的左右或垂直镜像,滚屏用的。
S-RAM 带电池的SRAM,记录游戏数据
4屏幕 4屏联动,废掉镜像的作用。
TRAINER 教练,就是增加512字节的ROM,外加一些游戏示例等。实质是多了一点空间。电路设计麻烦了一点儿。

  填好之后,为了以后方便,先保存一下。点击“高级”。见图3。

图3 NesInfo 高级

  按下“另存信息”,就保存一个ini文件。

  (本示例包中,保留了head.ini。可以直接按这个“打开”,载入之前定义好的文件头。)

  最后要生成bin文件才行。我没有设计生成汇编.db形式的,否则生成数值,直观一些。我这个程序功能有点多,好像能够用行指令,那么就能写进make.bat,不细说。

  生成Bin,就是按“保存Bin",就行,他会以打开的文件名,按同名保存成bin,生成后没有太多的反应,就给你一上提勾图标就算了。

  那么,你打开我的head.ini,就会生成一个head.bin。否则没有名字,它会要求你写一个的。本例中名字是head.bin,这要配合后面的make.bat。

  5.5 Make批文件

  用批文件的原因是,因为要用到COPY指令。打开win附件记事本。填写如下

copy /b head.bin+BinaryCode.65b+ascii_2.chr+ascii_2.chr Day.nes
pause

  head.bin是我们生成文件头,

  BinaryCode.65b是我们生成的程序,

  ascii_2.chr是图形,本示例用于充数,

  Day.nes是生成的nes文件名。

  记得要写+号,我不晓得文件名出现空格会什么情况,也不知加引号顶不顶用。反正我的文件名不加空格,那就对了。

  后面一个暂停指令,让你看看过程出没出问题。

  保存成文件make.bat。文件类型选*.*,编码选ANSI。选错了出问题,不过ANSI是默认的。不用操心。只是你有可能文件类型忙记选了,保存的还是txt。变成make.bat.txt。

  那么保存后再重命名了,哈哈。

  那么让我们来双击make.bat

  

  正常的如下。见图4。

图4 正常的结果

  按任意键,就结束。nes就生成好了。可以用模拟器打开。就能听到生日快乐音乐。

【原创】NES第一波:如何用通用型6502宏汇编器,制用NES/FC游戏。的更多相关文章

  1. Android应用安全之Android APP通用型拒绝服务漏洞

    0xr0ot和Xbalien交流所有可能导致应用拒绝服务的异常类型时,发现了一处通用的本地拒绝服务漏洞.该通用型本地拒绝服务可以造成大面积的app拒绝服务. 针对序列化对象而出现的拒绝服务主要是由于应 ...

  2. 从AlphaGo谈通用型人工智能设计

    最近赢了人机大战的AlphaGo火了,火得一塌糊涂,圈里圈外,是人都在谈AlphaGo.但是AlphaGo毕竟是为特定场景特定应用设计的特定型人工智能,和通用型人工智能还是有很大差别,离人工智能普及更 ...

  3. Amazon RDS的通用型存储(SSD)

    在今年的6月份,我们曾介绍过为Amazon EC2实例提供的基于SSD的弹性块级存储. 在公布几个月过后,这样的被称为通用型存储(SSD)的新型选择方式在创建新的EBS卷中已经占到了90%,我们从客户 ...

  4. 通用型CRM还是行业型CRM?-定制为王

    大数据时代,怎样利用工具摆脱繁杂的数据管理之苦,洞察有价值的销售信息,是每一个管理者的迫切须要.Zoho  CRM问世10年来,见证了一个个行业客户怎样在CRM帮助下实现了效率和业绩提升.相同,广泛的 ...

  5. 城市经纬度 json 理解SignalR Main(string[] args)之args传递的几种方式 串口编程之端口 多线程详细介绍 递归一个List<T>,可自己根据需要改造为通用型。 Sql 优化解决方案

    城市经纬度 json https://www.cnblogs.com/innershare/p/10723968.html 理解SignalR ASP .NET SignalR 是一个ASP .NET ...

  6. 泛型理解及应用(二):使用泛型编写通用型Dao层

    相信目前所有的IT公司网站在设计WEB项目的时候都含有持久层,同样地使用过Hibernate的程序员都应该看过或者了解过Hibernate根据数据库反向生成持久层代码的模板.对于Hibernate生成 ...

  7. Android APP通用型拒绝服务、漏洞分析报告

    点评:记得曾经有段时间很多SRC平台被刷了大量APP本地拒绝服务漏洞(目前腾讯金刚审计系统已经可检测此类漏洞),移动安全团队发现了一个安卓客户端的通用型拒绝服务漏洞,来看看他们的详细分析吧. 0xr0 ...

  8. C++内存管理变革(6):通用型垃圾回收器 - ScopeAlloc

    本文已经迁移到:http://cpp.winxgui.com/cn:a-general-gc-allocator-scopealloc C++内存管理变革(6):通用型垃圾回收器 - ScopeAll ...

  9. NGK公链:通用型存储网络

    NGK公链,是一条发展中的通用型存储网络. NGK的运用归结与存储场景.NGK通证的运用归结于支付场景.个人数据被中心化服务商买卖.被大数据服务商使用.被无数的商务及销售人员窃取.那么NGK的运用场景 ...

随机推荐

  1. Linux不重启识别新添加的磁盘

    现网的一台EXSI 下的虚拟机一般在进行配置变更后都会通过重启来识别新增的配置,不过业务侧某台主机因为业务需要无法重启,想通过不重启直接识别护容上去的新磁盘.经测试,发现如下方可以解决. 1.通过ex ...

  2. gulp使用详情 及 3.0到4.0的坑

    项目的所有依赖都可以安装,每个都有详细的注释. const gulp = require('gulp'); const sass = require('gulp-sass'); const brows ...

  3. 5分钟快速部署ownCloud私有云盘存储系统

    ownCloud 是一个开源免费专业的私有云存储项目,它能帮你快速在个人电脑或服务器上架设一套专属的私有云文件同步网盘,可以像 Dropbox 那样实现文件跨平台同步.共享.版本控制.团队协作等等.o ...

  4. JAVA获取项目工程下的文件

    JAVA获取 工程下的文件  其实很简单主要是理解编译路径  ①class.getResource public static void main(String[] args) { WordTest ...

  5. 使用java的MultipartFile实现layui官网文件上传实现全部示例,java文件上传

    layui(谐音:类UI) 是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用. layui文件上传示例地址:https://www. ...

  6. 嵊州D1T3 睡美人航班

    嵊州D1T3 睡美人航班 不知不觉中,我对她的爱意已经达到了 n. 是这样子的,第 1 分钟,我对她的爱意值是 (1, 1). 假如当第 x 分钟时我对她的爱意值是 (a, b),那么第 x + 1 ...

  7. css单位中px和em,rem的区别

    css单位中分为相对长度单位.绝对长度单位. 今天我们主要讲解rem.em.px这些常用单位的区别和用法. px(绝对长度单位) 相信对于前端来说px这个单位是大家并不陌生,px这个单位,兼容性可以说 ...

  8. kafka介绍及安装配置(windows)

    Kafka介绍 Kafka是分布式的发布—订阅消息系统.它最初由LinkedIn(领英)公司发布,使用Scala和Java语言编写,与2010年12月份开源,成为Apache的顶级项目.Kafka是一 ...

  9. MyBatis简单使用方式总结

    MyBatis简单使用方式总结 三个部分来理解: 1.对MyBatis的配置部分 2.实体类与映射文件部分 3.使用部分 对MyBatis的配置部分: 1.配置用log4J显式日志 2.导入包的别名 ...

  10. 【Download error:TOO MANY REQUESTS】&【TypeError:excepted string or buffer】

    <用python写网络爬虫>,1.4.4链接爬虫,运行时,遇到错误: Download error:TOO MANY REQUESTS Traceback(most recent call ...