1.CHIP-8简介
CHIP-8是由Joseph Weisbecker开发,使用晶振频率为1.76MHZ的8位处理器(1802),可发出一个修正过的音调,数据存储在磁带存储器中。CHIP-8在上个世纪70年代被使用在COSMAC-VIP和Telmac 1800上。许多游戏如Pong,Space Invaders,Tetris都曾使用该语言编写。有一个更强的CHIP-8版本叫做SUPER-CHIP,它包含CHIP-8的全部特性,并且多支持了128*64分辨率。
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字节被用于存储程序调用栈等其他内部变量使用。
地址范围(HEX) | 功能 |
0000-003F | 栈(stack) |
0040-004C | 暂存器(Scrathpad)0040H-固件版本(2 bytes) 0048H-EEPROM唯一ID(8 bytes) |
004D-00FF | 未使用 |
0100-01FF | 显示(Display) |
0200-0FFF | 程序(Program area) |
2.数据寄存器(Data Registers)
CHIP-8有16个8位寄存器,他们的名字从V0到VF,他们可用于算术逻辑计算指令或条件指令。VF寄存器为标志寄存器,可用于标记计算结果溢出或者像素碰撞检测等。
3.地址寄存器(Address register)
只有一个16位地址寄存器I,当内存大小为4KB时,CHIP8解释器只使用其中的12位。它可以用于存储读取指令或显示指令。
4.栈(Stack)
栈(stack)用于保存子程序被调用时返回的地址。其允许有16层嵌套,即栈的大小为32字节。
5.定时器(Timers)
CHIP-8有两个寄存器。他们通常以60HZ的速度递减至0为止。
1)延时寄存器(Delay timer)
该计时器被设计用于定时游戏事件,它的值可以被读写。
2)声音寄存器(Sound timer)
该寄存器被设计用于声音事件,当它为非零值时,蜂鸣器保持发声。
6.输入(Input)
输入通常采用十六进制键盘(hex keyboard),16个键的范围为0到F,'8','4','6','2'四个键通常被用于方向输入。
1 | 2 | 3 | C |
4 | 5 | 6 | D |
7 | 8 | 9 | E |
A | 0 | B | F |
检测输入的指令类型有三种:
1:当按键被按下跳过一个指令。
2:如果按键没有按下跳过一个指令。
3:等待按键,并在寄存器中存入值。
7.图形和声音(Graphics and sound)
CHIP-8的分辨率通常为64*32像素(pixel),也存在64*48和64*64分辨率,像素颜色为黑白。
(0,0) | (0,63) |
(63,0) | (63,63) |
图形通过绘制图形精灵(sprites)显示,图形精灵通常为8*15像素。屏幕的原点时左上角,所有坐标都是正数,X坐标通过被64取模计算,Y坐标通过被32取模计算。
绘制精灵像素时会与此时的屏幕像素进行异或(XOR)操作,即精灵会翻转对应位置屏幕的像素。如果绘制精灵时将屏幕像素由1翻转为0,VF就会设置为1,这就是碰撞检测。
CHIP8使用8*5像素的十六进制字体来绘制字符,字符为0-9和A-F,字体数据存储在(0x000 - 0x1FF)。
CHIP8只有一种声音,如上面的声音寄存器所述,只要声音寄存器中的值不为0,蜂鸣器就会一直响着。
8.SCHIP模式(SUPER-CHIP)
SCHIP是经过扩展的CHIP-8解释器,它提供128*64的分辨率。它还提供8*10的十进制字体和一个16*16的精灵,它们的绘制方法和在CHIP-8上相同。SCHIP含有一些新指令,有些指令只能在SCHIP模式上运行,指令如下。
00Cn - SCD nibble
00FB - SCR
00FC - SCL
00FD - EXIT
00FE - LOW
00FF - HIGH
Dxy0 - DRW Vx, Vy, 0
Fx30 - LD HF, Vx
Fx75 - LD R, Vx
Fx85 - LD Vx, R
参考文献:CHIP-8 - Wikipedia