Dust Loong

Results 54 issues of Dust Loong

### STEP4: 背景渲染 那么进入第四步, 背景的渲染. 终于进入关于图像渲染的步骤了, 这开始后就加快节奏了, 图形API的部分会略过, 因为可能读者拥有自己习惯的图形API, 这里采用的是D2D 1.1, 至少需要Win7的平台更新或者Win8. ### 黑匣子 如果没有自己熟悉的图形API的话, 这里介绍一下"黑匣子"函数, 就像```printf```那样, 不需要了解实现细节, 只需要知道它是干什么的就行. 这里, 自己将这些称为黑匣子函数: - 头文件 "common/d2d_interface.h" - 源文件 "common/d2d_draw.cpp" - 是的, 这个用C++实现的...

C/C++
FC/NES

### NesDev 本系列博客几乎全部资料来源是[nesdev.com](http://nesdev.com) 根据本人习惯, 项目命名为StepFC, 简写SFC(感觉...和超任重名了). 当然, 读作模拟器, 写作仿真器(emulator). 然后就是很重要的声明: **由于精力和水平, 不能保证文章所述均为正确的** ### 名词解释 本篇可能能遇到下列名词: - CPU: 中央处理器, 即2A03 - PPU: 图形处理器, 用来控制/显示图形之类的 - VRAM: 即Video-RAM, 俗称显存 - PRG-ROM: 程序只读储存器:...

C/C++
FC/NES

### STEP1: CPU地址空间: 基础读写 + Mapper000 让我们再跨一步吧. 6502汇编使用数字前面美元符号(\$)作为16进制的表示(8086则是在后面加‘h’) ### CPU地址空间布局 先谈谈内存布局, 6502理论支持64KB的寻址空间, 但是小霸王服务器只有2kb的内存. 自然得说说内存布局 | 地址 | 大小 | 标记 | 描述 | |---------|------|-------|------------------------| | $0000 | $800 | |...

C/C++
FC/NES

### STEP3: CPU 指令实现 - 寻址模式 终于进入了所谓的"本番", 通过阅读文档, 可知CPU拥有下列的寄存器: - [8位]累加寄存器 Accumulator - [8位]X 变址寄存器 (X Index Register) - [8位]Y 变址寄存器 (Y Index Register) - [8位]状态寄存器 (Status Register) - [8位]栈指针...

C/C++
FC/NES

### STEP3: CPU 指令实现 - 基础指令 这节就详细谈谈基础指令, 所谓'基础指令'只是自己随便命名的, 避免一节过长, 请勿对号入座. ### 指令周期 不同指令需要消耗不同的周期, 这很好理解. 不过就算相同的指令环境不同也会消耗不同周期: - 页面边界交叉(Page Boundary Crossed) - 页面边界交叉是指6502将内存划分为256个页面(8位机但是拥有16位地址空间). - 当访问不同页面时, 需要额外的指令周期去读取. - 跳转到不同页面(Branch Occurs Different Page) -...

C/C++
FC/NES

### STEP3: CPU 指令实现 - 流程指令 同样, '流程指令'是指为了和上节分开而自己随便取的名字. ### JMP - Jump | 寻址模式| 汇编格式| OP代码 |指令字节|指令周期| |--------|-----------|----|---------|----------| | 绝对 | JMP Oper | 4C | 3 | 3 |...

C/C++
FC/NES

### STEP3: CPU 指令实现 - 具体实现 这节是指令实现的最后一节, 前面介绍了几乎所有的指令, 现在就做具体实现 说说之前有提到的"页面边界交叉", 或者简单理解为"跨页" ### 条件转移 条件转移语句很简单: - 没有跳转: 花费2周期 - 跳转至本页面: 花费3周期 - 跳转至其他页面: 花费4周期 ### 页面边界交叉 之前提到了"+1s", 与其说是"+1s", 不如说是"-1s". 会发生在下列寻址方式: -...

C/C++
FC/NES

开始在这里写博客了, 国内各种要求绑定手机, 我写个没人看的文章至于么Orz.

### STEP8: 基本音频播放 本文github[备份地址](https://github.com/dustpg/BlogFM/issues/20) 上节简单介绍了基本概念, 下面, 介绍相关[寄存器](https://wiki.nesdev.com/w/index.php/APU_registers) ### 分频器(Divider) 这里特指时钟分频器(或者叫做'分时器'?), 分频器会利用一个值(P)输出时钟, 内部持有一个计数器, 计数器到0就输出然后重置为P值, 比如P为5: - 2 -> 1 - 1 -> 0 - 0 -> 5 =>输出 - 5 ->...

C/C++
FC/NES

![a](https://user-images.githubusercontent.com/6801311/55178822-1c7cf500-51c1-11e9-8500-045397bfbad9.png) ![41](https://user-images.githubusercontent.com/6801311/55178886-4209fe80-51c1-11e9-87fe-6041fbabbe75.gif)

Diary