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
0xc8c8c8c8
to represent chip8 by using CREATE2 contract usingcreate2deploy
cli 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 |