打算编写一个NES模拟器,先从简单的chip8模拟器入手

1.CHIP-8简介

CHIP-8是一个解释型语言,由Joseph Weisbecker开发。最初CHIP-8在上个世纪70年代被使用在COSMAC-VIP和Telmac 1800上。许多游戏如Pong,Space Invaders,Tetris都曾使用该语言编写。

2.CHIP-8硬件载体描述

1.内存(Memory)

CHIP-8通常在4K系统上使用,如Cosmac VIP和Telmac 1800,其内存大小为4096(0x1000),以字节(byte)编址(1byte = 8bit,这就是CHIP-8名称的由来)。由于CHIP-8解释器自身占据了前512字节,所以大部分CHIP-8程序的起始地址为0x200,这些程序不能访问0x200之前的内存地址。另外(0xF00-0xFFF)这256字节被用于存储屏幕刷新时的缓存,(0xEA0-0xEFF)这96字节被用于存储程序调用栈等其他内部变量使用。

2.寄存器(Registers)

CHIP-8有16个8位寄存器,他们的名字从V0到VF。VF寄存器为标志寄存器,可用于标记计算结果溢出或者像素碰撞检测等。此外还有一个16位地址寄存器I,与涉及内存操作的指令。

3.栈(Stack)

栈(stack)用于保存子程序被调用时返回的地址。现代解释器要求至少有16层嵌套,即32字节。

4.定时器(Timers)

CHIP-8有两个寄存器。他们通常以60HZ的速度递减至0为止。

一、延时寄存器(Delay timer)

该计时器被设计用于定时游戏事件,它的值可以被读写。

二、声音寄存器(Sound timer)

该寄存器被设计用于声音事件,当它为非零值时,蜂鸣器保持发声。

5.输入(Input)

输入通常采用十六进制键盘(hex keyboard),16个键的范围为0到F,'8','4','6','2'四个键通常被用于方向输入。检测输入的指令有三个,1:当按键被按下跳过一个指令 2:如果按键没有按下跳过一个指令 3.等待按键,并在寄存器中存入值。

6.图形和声音(Graphics and sound)

CHIP-8的分辨率通常为64x32像素(pixel),颜色为黑白。图形通过绘制图形精灵(sprites)显示,图形精灵通常为8像素宽,1到15像素高。绘制精灵像素时会与此时的屏幕像素进行异或(XOR)操作,即精灵会翻转对应位置屏幕的像素。如果绘制精灵时将屏幕像素由1翻转为0,VF就会设置为1,这就是碰撞检测。

如上面的声音寄存器所述,蜂鸣器会一直响着,只要声音寄存器中的值不为0。

参考文献:CHIP-8 - Wikipedia

chip8模拟器的python3实现-1-CHIP8简介的更多相关文章

  1. chip8模拟器的python3实现-2-指令介绍

    CHIP指令表 CHIP-8有35个指令,都为两字节长,以大端方式存储.指令表的指令格式规定如下: NNN:地址 NN:8位常量 N:4位常量 V:寄存器 X和Y:4位,标识寄存器 PC:程序计数器 ...

  2. CHIP8模拟器的python3实现-3-指令实现

    class Chip8CPU(object): def __init__(self, screen): self.registers = { 'v': [], 'index': 0, 'pc': 0, ...

  3. Python3.x:生成器简介

    Python3.x:生成器简介 概念 任何使用yield的函数都称之为生成器:使用yield,可以让函数生成一个序列,该函数返回的对象类型是"generator",通过该对象连续调 ...

  4. 正则表达式:Python3中的应用简介

    正则表达式:Python3中的应用简介 一.正则表达式 1,概述 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学 ...

  5. C++版 Chip8游戏模拟器

    很早就想写个FC模拟器,但真是一件艰难的事情.. 所以先写个Chip8模拟器,日后再继续研究FC模拟器. Chip8只有35条指令,属于RISC指令集,4k内存,2k显存,16个寄存器(其中15个通用 ...

  6. 如何实现模拟器(CHIP-8 interpreter) 绝佳杰作.

    转自 http://www.multigesture.net/articles/how-to-write-an-emulator-chip-8-interpreter/ How to write an ...

  7. python3与Redis连接操作

    Python3之redis使用   简介 redis是一个key-value存储系统,和Memcache类似,它支持存储的value类型相对更多,包括string(字符串),list(链表),set( ...

  8. 原创:从零开始,微信小程序新手入门宝典《一》

    为了方便大家了解并入门微信小程序,我将一些可能会需要的知识,列在这里,让大家方便的从零开始学习:一:微信小程序的特点张小龙:张小龙全面阐述小程序,推荐通读此文: 小程序是一种不需要下载.安装即可使用的 ...

  9. Python中urlopen()介绍

    #以下介绍是基于Python3.4.3 一.  简介   urllib.request.urlopen()函数用于实现对目标url的访问. 函数原型如下:urllib.request.urlopen( ...

随机推荐

  1. 如何让SQLServer的 itemNum 字段 按照数字大小顺序排序

    我的 itemNum 从1到20,可是超过了SQLServer的默认排序这样的1101112...19234567如何才能让排序成为这样1234567891011.. . 解决办法:因为 itemNu ...

  2. GitHub提供服务简介

    |GitHub-Funcation| |Git仓库|   一般情况下,我们可以免费建立任意个GitHub提供的Git仓库.但需要私有仓库则需要最低每月支付$7. |Organization|    这 ...

  3. 记一次使用getRequestDispatcher遇到的坑。。响应页面出现新建下载任务

    getRequestDispatcher RequestDispatcher接口提供将请求转发送到另一个资源的功能,它可能是html,servlet或jsp等. 此接口也可用于包括另一资源的内容.它是 ...

  4. PHP等值判断中,常量与变量在左在右的区别

    在平时写代码过程中,经常会用到判断变量与常量相等的情况,比如if($a==1){…..} 或者if(1==$a) ,从执行效率上来说,1==$a比 $a==1的效率更高. 这个写法的另一个好处,当使用 ...

  5. Linux 下安装多个 tomcat

    安装多个 tomcat 和安装一个同理,只是需要更改一些配置. 1.复制多个 tomcat 安装目录 cp /usr/local/tomcat_8080/ /usr/local/tomcat_8081 ...

  6. Going to university is supposed to be a mind-broadening experience.

    Going to university is supposed to be a mind-broadening experience. That assertion is presumably mad ...

  7. MPC学习笔记1:基于状态空间模型的预测控制(1)

    MPC调节器 1.给定一个由状态空间法描述的离散系统: MPC控制器与其他线性二次调节器(LQR)的区别就在于其可以很好的将系统动态约束纳入考虑. 采样周期Ts控制了算法的效率,太大会错过很多系统运行 ...

  8. Redis阻塞诊断基础

    slowlog Redis慢查询 slowlog 参数 slowlog-log-slower-than: 慢查询时间阈值,超过这个阈值的查询将会被记录,默认值10000,但是微妙,也即10毫秒. sl ...

  9. APK签名说明

    在 Android 系统下, 一些公司会将自己做的APK进行管控,授权签名后方可使用. APK所属的软件公司会提供签名包,例如: 第一步:是要检查所操作的 PC 机是否安装 JDK,如果没有安装,请安 ...

  10. 《DOM Scripting》学习笔记-——第七章 动态创建html内容

    本章内容: 1.动态创建html内容的“老”技巧:document.write()和innerHTML属性 2.DOM方法:createElement(),creatTextNode(),append ...