打算编写一个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. asp代码写的,微信会员报名转发分享带上下级和邀约人关系并且能微信支付asp编号的

    昨天晚上应一个客户要求写了一套代码,实现的功能是: 在微信公众号上注册会员,获取用户的头像和微信名称,进入会员中心报名,报名成功成功后,他如果转发链接给别人,别人打开后则成为他的下级,上面那个算是一个 ...

  2. tomcat和iis共用80端口的简明手册

    ​​对于使用tomcat-connector实现iis与tomcat实现80端口共用的问题,网上的信息异常混乱,很多地方误人子弟,浪费时间.本文给出简明手册式的做法: 首先列出我们需要做的事项: 1. ...

  3. kolla queens on centos7.5 -all in one

    目录 环境准备 开始配置 快照,快照,快照 pull镜像并部署 登录配置OpenStack 环境准备 我这里用workstation创建了一个虚拟机,安装centos7.5 mini系统,这台虚拟机上 ...

  4. Vue.js中记不住 的东西

    给样式背景赋值: :style="{backgroundImage:'url(' + otherInfo.head_image + ')'}" <img :src=" ...

  5. [Unity优化]批处理03:静态批处理

    原理: 运行时,把需要进行静态批处理的网格合并到一个新的网格中.虽然只进行一次合并操作,但是会占用更多的内存来存储合并后的网格,并且被静态批处理的物体无法移动旋转缩放 要使用静态批处理,需要把Stat ...

  6. nginx访问统计

    1).根据访问IP统计UV awk '{print $1}'  access.log|sort | uniq -c |wc -l 2).统计访问URL统计PV awk '{print $7}' acc ...

  7. qt button clicked(bool) always false

    今天用 qt 中的按键的时候,希望按键有两种状态,通过 clicked(bool) 发送信号给槽,结果一直发的是 false,不能为 true,后来终于找到问题了,有两种解决方法. 在 button ...

  8. objective-c数组的七种遍历方法总结

    //第一种 [arr enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop){     NSLog(@"%ld,% ...

  9. LINUX新建和增加SWAP分区

    我们都知道在安装Linux系统时在分区时可以分配swap分区,而系统安装后(在运行中)如何建立或调整swap分区呢? 在装完Linux系统之后,建立Swap分区有两种方法. 1.新建磁盘分区作为swa ...

  10. matlab-逻辑回归二分类(Logistic Regression)

    逻辑回归二分类 今天尝试写了一下逻辑回归分类,把代码分享给大家,至于原理的的话请戳这里 https://blog.csdn.net/laobai1015/article/details/7811321 ...