SolChip8 is the first 100% on-chain Chip8 emulator smart contract where you can run chip8 games on EVM environment. CHIP-8 is an interpreted programming language, initially used on the 8-bit microcomputers made in the mid-1970s. blog post
forge install rkdud007/solchip8
- unified contract address start with
0xc8c8c8c8to represent chip8 by using CREATE2 contract usingcreate2deploycli tool
❯ cast create2 \
--deployer 0x0000000000FFe8B47B3e2130213B802212439497 \
--caller 0x0000000000000000000000000000000000000000 \
--init-code-hash 614b9ac9323beeaffd9de369597fc476014aee6e350489c0601b5f47b1146334 \
--starts-with c8c8c8c8| Chain | Chain ID | Contract | v0.0.1 |
|---|---|---|---|
| Base mainnet | 8453 | Solchip8 |
0xc8c8c8c8421e85597881ae753d040449e81e528a |
| Ethereum sepolia | 11155111 | Solchip8 |
0xc8c8c8c8421e85597881ae753d040449e81e528a |
| Arbitrum sepolia | 421614 | Solchip8 |
0xc8c8c8c8421e85597881ae753d040449e81e528a |
| Base sepolia | 84532 | Solchip8 |
0xc8c8c8c8421e85597881ae753d040449e81e528a |
| Optimism sepolia | 11155420 | Solchip8 |
0xc8c8c8c8421e85597881ae753d040449e81e528a |
| Odyssey testnet | 911867 | Solchip8 |
0xc8c8c8c81fd75f59103ded843a1082ce403885f4 |
- A 64x32 monochrome display
- Sixteen 8-bit general purpose registers
- 4096 bytes of RAM
- Example ROM games from Chip-8 Games Pack
- Run demo with desktop
Tested here
| Opcode | Mnemonic | Description |
|---|---|---|
| 0000 | NOP | Nothing |
| 00E0 | CLS | Clear the display |
| 00EE | RET | Return from a subroutine |
| 1NNN | JP NNN | Jump to address NNN |
| 2NNN | CALL NNN | Call subroutine at NNN |
| 3XNN | SE Vx, NN | Skip next instruction if Vx equals NN |
| 4XNN | SNE Vx, NN | Skip next instruction if Vx does not equal NN |
| 5XY0 | SE Vx, Vy | Skip next instruction if Vx equals Vy |
| 6XNN | LD Vx, NN | Load value NN into register Vx |
| 7XNN | ADD Vx, NN | Add value NN to register Vx |
| 8XY0 | LD Vx, Vy | Set Vx equal to Vy |
| 8XY1 | OR Vx, Vy | Set Vx to Vx OR Vy |
| 8XY2 | AND Vx, Vy | Set Vx to Vx AND Vy |
| 8XY3 | XOR Vx, Vy | Set Vx to Vx XOR Vy |
| 8XY4 | ADD Vx, Vy | Add Vy to Vx, set VF to carry |
| 8XY5 | SUB Vx, Vy | Subtract Vy from Vx, set VF to NOT borrow |
| 8XY6 | SHR Vx | Shift Vx right by 1, set VF to least significant bit |
| 8XY7 | SUBN Vx, Vy | Set Vx to Vy minus Vx, set VF to NOT borrow |
| 8XYE | SHL Vx | Shift Vx left by 1, set VF to most significant bit |
| 9XY0 | SNE Vx, Vy | Skip next instruction if Vx does not equal Vy |
| ANNN | LD I, NNN | Set I to address NNN |
| BNNN | JP V0, NNN | Jump to address V0 + NNN |
| CXNN | RND Vx, NN | Set Vx to random byte AND NN |
| DXYN | DRW Vx, Vy, N | Draw sprite at (Vx, Vy) with height N, set VF on collision |
| EX9E | SKP Vx | Skip next instruction if key Vx is pressed |
| EXA1 | SKNP Vx | Skip next instruction if key Vx is not pressed |
| FX07 | LD Vx, DT | Set Vx to the value of the delay timer |
| FX0A | LD Vx, K | Wait for a key press, store the value in Vx |
| FX15 | LD DT, Vx | Set the delay timer to Vx |
| FX18 | LD ST, Vx | Set the sound timer to Vx |
| FX1E | ADD I, Vx | Add Vx to I |
| FX29 | LD F, Vx | Set I to the location of the sprite for digit Vx |
| FX33 | LD B, Vx | Store BCD representation of Vx in memory at I, I+1, and I+2 |
| FX55 | LD [I], Vx | Store registers V0 to Vx in memory starting at I |
| FX65 | LD Vx, [I] | Read registers V0 to Vx from memory starting at I |
