From 6eaca33523d3392e6551192e1c6abe5a93a45d06 Mon Sep 17 00:00:00 2001 From: Theron Spiegl Date: Sat, 11 Jan 2020 17:08:51 -0600 Subject: [PATCH] readme --- README.md | 10 +++------- pics/zelda.png | Bin 0 -> 33999 bytes src/main.rs | 2 +- 3 files changed, 4 insertions(+), 8 deletions(-) create mode 100644 pics/zelda.png diff --git a/README.md b/README.md index a05649f..ac684b7 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,8 @@ # nestur -This is an NES emulator and a work in progress. The CPU, PPU, and APU mostly work, though there are still at least a couple bugs. I've mostly tested on Donkey Kong and Super Mario Bros. so far. There are plenty of full-featured emulators out there; this is primarily an educational project but I do want it to run well. +This is an NES emulator and a work in progress. There are still some minor bugs and the audio is kind of scratchy. I've mostly tested on Donkey Kong, Super Mario Bros., and Zelda so far. There are plenty of full-featured emulators out there; this is primarily an educational project but I do want it to run well. SDL2 is the only dependency, it's NTSC timing, and contains no `unsafe` code. -- One dependency (SDL) - -- NTSC timing - - + ## Controls: ``` @@ -26,7 +22,7 @@ The code aims to follow the explanations from the [NES dev wiki](https://wiki.ne ## To do: -- More mappers (only NROM/mapper 0 implemented so far) +- More mappers (only mappers 0 (NROM) and 1 (MMC1) implemented so far) - DMC audio channel, high- and low-pass filters, APU cleanup/timing fix diff --git a/pics/zelda.png b/pics/zelda.png new file mode 100644 index 0000000000000000000000000000000000000000..6f0aa19b3af9fec57dec37b0bef06858990c5f07 GIT binary patch literal 33999 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 U=AWkE=u|N?Q)`owlNWFQKc*5kn*aa+ literal 0 HcmV?d00001 diff --git a/src/main.rs b/src/main.rs index 83caeb9..deba0ff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -125,7 +125,7 @@ fn main() -> Result<(), String> { /* TODO: -- fix 8x16 sprites +- fix zelda hearts - common mappers - untangle CPU and PPU - DMC audio channel, high- and low-pass filters, refactor envelope, fix static