Rewrote the disassembler and `cpu::tick()` for code concision and massive speed improvements. Turns out, getting the current time takes AGES, so if we don't need it, we don't get it.
Chirp
How does an emulator work? I don't know!
So I wrote this, to see if i can find out.
Features:
- 32 * 64 1bpp pixel display, scaled 16x
- Full coverage of the original Chip-8 insn set
- 64-bit floating point internal sound/delay timers
- Pause/Resume
- Set and unset breakpoints
- A fairly nice command-line interface
Keybinds:
- F1: Dump CPU registers
- F2: Dump screen to terminal
- F3: Dump screen to file
- F4: Enable/Disable live disassembly
- F5: Pause/Resume
- F6: Single-step instruction
- F7: Set breakpoint at current instruction
- F8: Unset breakpoint at current instruction
- F9: Soft-reset the CPU
Keypad mapping:
QWERTY:
1 | 2 | 3 | 4 |
Q | W | E | R |
A | S | D | F |
Z | X | C | V |
Chip-8:
1 | 2 | 3 | C |
4 | 5 | 6 | D |
7 | 8 | 9 | E |
A | 0 | B | F |
Command Line Interface:
Usage: chirp [OPTIONS]
Positional arguments:
file Load a ROM to run on Chirp.
Optional arguments:
-h, --help Print this help message.
-d, --debug Enable debug mode at startup.
-p, --pause Enable pause mode at startup.
-s, --speed SPEED Set the instructions-per-frame rate.
-S, --step STEP Run the emulator as fast as possible for `step` instructions.
-z, --vfreset Disable setting vF to 0 after a bitwise operation.
-x, --drawsync Disable waiting for vblank after issuing a draw call.
-c, --memory Use CHIP-48 style DMA instructions, which don't touch I.
-v, --shift Use CHIP-48 style bit-shifts, which don't touch vY.
-b, --jumping Use SUPER-CHIP style indexed jump, which is indexed relative to v[adr].
-B, --break BP Set breakpoints for the emulator to stop at.
-D, --data WORD Load additional word at address 0x1fe
-f, --frame-rate FR Set the target framerate. (default: 60)
TODO:
- Implement sound
- Finish unit tests for "quirks"
- Make pausing/unpausing the emulator less messy
- Make resetting the emulator possible
- Allow code to be passed in hex on the command line? Hmm
- Assembler for my assembly syntax
- Make a UI for realtime configuration
- Cycle accuracy with original Chip-8 interpreter
Description
Languages
Rust
100%