打算编写一个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. idea springboot 父子工程 子工程maven不自动import

    父工程删除对spring boot启动项的引用,因为父工程 dependencyManagement,它不会自动加载包,只指定包的版本, 如果在父工程中引用了包,但是没有指定包版本,子工程将不会识别到 ...

  2. python_装饰器

    越来越觉得写一点技术博客是有多么重要了,明日复明日,现在就开始写吧! 1. 普通装饰器 装饰器的写法是一种语法糖,装饰器也还是一个函数而已,它接收一个函数对象作为参数,并返回一个新函数,主要是拓展原函 ...

  3. mybatis学习 -每天一记 mybatis insert null 报错

    mybatis 插入数据,model的属性存在null,插入报错 在使用mybatis 进行insert时,如果字段值存在null的情况,会出现插入失败的情况,解决方案: 如果使用spring boo ...

  4. WIN SERVER 2012 自启动tomcat

    本来手动启动时在开始cmd输入startup 自启动的方法是https://blog.csdn.net/ailo555/article/details/82754005 Windows Server ...

  5. MAC环境配置

    必须安装的依赖有:Node.Watchman 和 React Native 命令行工具以及 Xcode. 1.安装homebrew(用brew指令安装其他依赖) /usr/bin/ruby -e &q ...

  6. laravel5.6中jquery+ajax分页

    public function shows(Request $request){ $p=$request->get("page"); $page=empty($p)?:$p; ...

  7. requests和session的区别

    简单说 request对象和session对象的最大区别是生命周期. -request request对象的生命周期是针对一个客户端(说确切点就是一个浏览器应用程序)的一次请求,当请求完毕之后,req ...

  8. Redis系列十:缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级

    一.缓存雪崩 缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而 ...

  9. SQL Server并发操作单个表时发生在page页面级的死锁

    最近遇到的死锁问题都发生在并发操作单张表上,比较有意思,就模拟了重现了一下.根据非聚集索引为条件,删除某一个表的数据,类似于这么一个语句,delete from table where noclust ...

  10. 【源】ensp 绑定本地网卡与仿真设备进行通信 场景下 仿真设备ping 不通 本机IP 问题

    环境:Win7, ensp 1.2.00.500 问题现象:本机可以ping 通 仿真设备的接口IP,但是在仿真设备上 ping不通 本机接口ip. 问题处理:把本机win7系统只带的防火墙关闭后,在 ...