"""
::
+---------------+= 0xFFF (4095) End of Chip-8 RAM
| |
| |
| |
| |
| |
| 0x200 to 0xFFF|
| Chip-8 |
| Program / Data|
| Space |
| |
| |
| |
+- - - - - - - -+= 0x600 (1536) Start of ETI 660 Chip-8 programs
| |
| |
| |
+---------------+= 0x200 (512) Start of most Chip-8 programs
| 0x000 to 0x1FF|
| Reserved for |
| interpreter |
+---------------+= 0x000 (0) Start of Chip-8 RAM
"""
"""
字体
::
+---------------------+-----------------+--------------------+-------------------+
| Symbol | Address | Sprite | Binary | Hex |
+=====================+=================+====================+===================+
| 0 | 0x050 | **** | 11110000 | 0xF0 |
| | | * * | 10010000 | 0x90 |
| | | * * | 10010000 | 0x90 |
| | | * * | 10010000 | 0x90 |
| | | **** | 11110000 | 0xF0 |
+---------+-----------+-----------------+--------------------+-------------------+
| 1 | 0x055 | * | 00100000 | 0x20 |
| | | ** | 01100000 | 0x60 |
| | | * | 00100000 | 0x20 |
| | | * | 00100000 | 0x20 |
| | | *** | 01110000 | 0x70 |
+---------+-----------+-----------------+--------------------+-------------------+
| 2 | 0x05A | **** | 11110000 | 0xF0 |
| | | * | 00010000 | 0x10 |
| | | **** | 11110000 | 0xF0 |
| | | * | 10000000 | 0x80 |
| | | **** | 11110000 | 0xF0 |
+---------+-----------+-----------------+--------------------+-------------------+
| 3 | 0x05F | **** | 11110000 | 0xF0 |
| | | * | 00010000 | 0x10 |
| | | **** | 11110000 | 0xF0 |
| | | * | 00010000 | 0x10 |
| | | **** | 11110000 | 0xF0 |
+---------+-----------+-----------------+--------------------+-------------------+
| 4 | 0x064 | * * | 10010000 | 0x90 |
| | | * * | 10010000 | 0x90 |
| | | **** | 11110000 | 0xF0 |
| | | * | 00010000 | 0x10 |
| | | * | 00010000 | 0x10 |
+---------+-----------+-----------------+--------------------+-------------------+
| 5 | 0x069 | **** | 11110000 | 0xF0 |
| | | * | 10000000 | 0x80 |
| | | **** | 11110000 | 0xF0 |
| | | * | 00010000 | 0x10 |
| | | **** | 11110000 | 0xF0 |
+---------+-----------+-----------------+--------------------+-------------------+
| 6 | 0x06E | **** | 11110000 | 0xF0 |
| | | * | 10000000 | 0x80 |
| | | **** | 11110000 | 0xF0 |
| | | * * | 10010000 | 0x90 |
| | | **** | 11110000 | 0xF0 |
+---------+-----------+-----------------+--------------------+-------------------+
| 7 | 0x073 | **** | 11110000 | 0xF0 |
| | | * | 00010000 | 0x10 |
| | | * | 00100000 | 0x20 |
| | | * | 01000000 | 0x40 |
| | | * | 01000000 | 0x40 |
+---------+-----------+-----------------+--------------------+-------------------+
| 8 | 0x078 | **** | 11110000 | 0xF0 |
| | | * * | 10010000 | 0x90 |
| | | **** | 11110000 | 0xF0 |
| | | * * | 10010000 | 0x90 |
| | | **** | 11110000 | 0xF0 |
+---------+-----------+-----------------+--------------------+-------------------+
| 9 | 0x07D | **** | 11110000 | 0xF0 |
| | | * * | 10010000 | 0x90 |
| | | **** | 11110000 | 0xF0 |
| | | * | 00010000 | 0x10 |
| | | **** | 11110000 | 0xF0 |
+---------+-----------+-----------------+--------------------+-------------------+
| 10 | 0x082 | **** | 11110000 | 0xF0 |
| | | * * | 10010000 | 0x90 |
| | | **** | 11110000 | 0xF0 |
| | | * * | 10010000 | 0x90 |
| | | * * | 10010000 | 0x90 |
+---------+-----------+-----------------+--------------------+-------------------+
| 11 | 0x087 | *** | 11100000 | 0xE0 |
| | | * * | 10010000 | 0x90 |
| | | *** | 11100000 | 0xE0 |
| | | * * | 10010000 | 0x90 |
| | | *** | 11100000 | 0xE0 |
+---------+-----------+-----------------+--------------------+-------------------+
| 12 | 0x08C | **** | 11110000 | 0xF0 |
| | | * | 10000000 | 0x80 |
| | | * | 10000000 | 0x80 |
| | | * | 10000000 | 0x80 |
| | | **** | 11110000 | 0xF0 |
+---------+-----------+-----------------+--------------------+-------------------+
| 13 | 0x091 | *** | 11100000 | 0xE0 |
| | | * * | 10010000 | 0x90 |
| | | * * | 10010000 | 0x90 |
| | | * * | 10010000 | 0x90 |
| | | *** | 11100000 | 0xE0 |
+---------+-----------+-----------------+--------------------+-------------------+
| 14 | 0x096 | **** | 11110000 | 0xF0 |
| | | * | 10000000 | 0x80 |
| | | **** | 11110000 | 0xF0 |
| | | * | 10000000 | 0x80 |
| | | **** | 11110000 | 0xF0 |
+---------+-----------+-----------------+--------------------+-------------------+
| 15 | 0x09B | **** | 11110000 | 0xF0 |
| | | * | 10000000 | 0x80 |
| | | **** | 11110000 | 0xF0 |
| | | * | 10000000 | 0x80 |
| | | * | 10000000 | 0x80 |
+---------+-----------+-----------------+--------------------+-------------------+
"""
from typing import List
START_ADDR = 0x200
_MEM_SIZE = 4 * 1024
_FONTSET = [0xF0, 0x90, 0x90, 0x90, 0xF0, # 0
0x20, 0x60, 0x20, 0x20, 0x70, # 1
0xF0, 0x10, 0xF0, 0x80, 0xF0, # 2
0xF0, 0x10, 0xF0, 0x10, 0xF0, # 3
0x90, 0x90, 0xF0, 0x10, 0x10, # 4
0xF0, 0x80, 0xF0, 0x10, 0xF0, # 5
0xF0, 0x80, 0xF0, 0x90, 0xF0, # 6
0xF0, 0x10, 0x20, 0x40, 0x40, # 7
0xF0, 0x90, 0xF0, 0x90, 0xF0, # 8
0xF0, 0x90, 0xF0, 0x10, 0xF0, # 9
0xF0, 0x90, 0xF0, 0x90, 0x90, # A
0xE0, 0x90, 0xE0, 0x90, 0xE0, # B
0xF0, 0x80, 0x80, 0x80, 0xF0, # C
0xE0, 0x90, 0x90, 0x90, 0xE0, # D
0xF0, 0x80, 0xF0, 0x80, 0xF0, # E
0xF0, 0x80, 0xF0, 0x80, 0x80] # F
[docs]class Memory:
def __init__(self):
# 4KB memory
self._ram = [0] * _MEM_SIZE
# stack
self._stack = []
for i in range(len(_FONTSET)):
self._ram[i] = _FONTSET[i]
@property
def ram(self):
return self._ram
[docs] def write(self, data: List[int]):
for i in range(len(data)):
self._ram[START_ADDR + i] = int(data[i])
[docs] def stack_pop(self):
return self._stack.pop()
[docs] def stack_push(self, x: int):
return self._stack.append(x)