Source code for src.chip8.memory

"""
::

    +---------------+= 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)