A Chip-8 emulator Swift package. For use in macOS, iOS, watchOS and tvOS projects.
This package implements the core functionality of a Chip-8 emulator in Swift. It contains no platform UI elements and this is left to a consumer projects to implement.
The emulator package contains a Chip8Engine
which drives the Chip-8 run loop.
chip8Engine.start()
chip8Engine.stop()
chip-8 keys (Chip8InputCode
)
chip8Engine.handleKeyDown(key: key)
chip8Engine.handleKeyUp(key: key)
The callbacks are handled through the delegate pattern. Set the delegate of the engine:
override func viewDidLoad() {
super.viewDidLoad()
chip8Engine.delegate = self
}
The engine will call the delegate render
method when the engine determines that a render of the pixels is necessary.
This will only be called when the pixels have changed. The engine assumes that pixels have been rendered on a call to the delegate and will not re-call with the same pixels.
Implement the rendering method:
extension YourViewController: Chip8EngineDelegate {
func render(screen: Chip8Screen) {
// ...
}
}
The engine will call the delegate beep
method when the engine determines that a sound effect needs to be played.
Implement the beep method using the provided BeepPlayer
(or through a custom implementation):
extension YourViewController: Chip8EngineDelegate {
func beep() {
beepPlayer.play()
// haptics etc.
}
}
The ROMs bundled into this project are from https://github.com/dmatlack/chip8
beep.wav
file in Assets is from Mixkit, originally titled mixkit-player-jumping-in-a-video-game-2043.wav
. See here for Mixkit license.
I made heavy use of the following resources when working on this project:
- Checking runtime correctness:
- Specs:
- Checking code/logic correctness: