November 12, 2018 Re: NES emulator written in D | ||||
---|---|---|---|---|
| ||||
Posted in reply to blahness | On Sat, Feb 3, 2018 at 5:55 AM blahness via Digitalmars-d-announce <digitalmars-d-announce@puremagic.com> wrote: > > Hi everyone, > > Not sure how interested people here will be with this but I've ported https://github.com/fogleman/nes from Go to D [1]. I should point out that I'm not the author of the original Go version. > > The emulator code itself is 100% D with no dependencies. I've also created a little app using SDL to show how you'd put this library to use [2]. > > Its PPU & APU timing isn't 100% accurate (same as the Go version) so not all games will work correctly but this should be pretty easy to fix. > > Links > -------------- > [1] https://github.com/blahness/nes > [2] https://github.com/blahness/nes_test Nice work. Oh wow, this is pretty rough! ``` void createTable() { this.table = [ &this.brk, &this.ora, &this.kil, &this.slo, &this.nop, &this.ora, &this.asl, &this.slo, &this.php, &this.ora, &this.asl, &this.aac, &this.nop, &this.ora, &this.asl, &this.slo, ... ``` Here's one I prepared earlier: https://github.com/TurkeyMan/superemu (probably doesn't work with DMD from the last year or 2!) Extensible architecture, supports a bunch of systems. |
November 13, 2018 Re: NES emulator written in D | ||||
---|---|---|---|---|
| ||||
Posted in reply to Manu | On Tuesday, 13 November 2018 at 05:59:52 UTC, Manu wrote:
>
> Nice work.
>
> Oh wow, this is pretty rough!
> ```
> void createTable() {
> this.table = [
> &this.brk, &this.ora, &this.kil, &this.slo, &this.nop, &this.ora,
> &this.asl, &this.slo, &this.php, &this.ora, &this.asl, &this.aac,
> &this.nop, &this.ora, &this.asl, &this.slo,
> ...
> ```
>
> Here's one I prepared earlier: https://github.com/TurkeyMan/superemu (probably doesn't work with DMD from the last year or 2!) Extensible architecture, supports a bunch of systems.
That's an artifact from the original code which was written in Go. My main focus was adding missing instructions & fixing any timing issues. It now passes nearly every NES specific CPU instruction & timing test I can throw at it so I'm fairly happy with it. Any improvements are always welcome though.
|
November 13, 2018 Re: NES emulator written in D | ||||
---|---|---|---|---|
| ||||
Posted in reply to blahness | On Mon, Nov 12, 2018 at 10:30 PM blahness via Digitalmars-d-announce <digitalmars-d-announce@puremagic.com> wrote: > > On Tuesday, 13 November 2018 at 05:59:52 UTC, Manu wrote: > > > > Nice work. > > > > Oh wow, this is pretty rough! > > ``` > > void createTable() { > > this.table = [ > > &this.brk, &this.ora, &this.kil, &this.slo, &this.nop, > > &this.ora, > > &this.asl, &this.slo, &this.php, &this.ora, &this.asl, > > &this.aac, > > &this.nop, &this.ora, &this.asl, &this.slo, > > ... > > ``` > > > > Here's one I prepared earlier: https://github.com/TurkeyMan/superemu (probably doesn't work with DMD from the last year or 2!) Extensible architecture, supports a bunch of systems. > > That's an artifact from the original code which was written in Go. My main focus was adding missing instructions & fixing any timing issues. It now passes nearly every NES specific CPU instruction & timing test I can throw at it so I'm fairly happy with it. Any improvements are always welcome though. A great test is to emulate an Atari2600; you'll know your 6502 is 100% perfect if you can play pitfall or some other complex 2600 games ;) I can't see how your cycle counting logic works, it looks like it's missing a lot of cycles. How do you clock your scanlines against your CPU? Can you run Battletoads or Super Mario Bros? They're pretty sensitive to proper timing. |
November 13, 2018 Re: NES emulator written in D | ||||
---|---|---|---|---|
| ||||
Posted in reply to Manu | On Tuesday, 13 November 2018 at 08:24:05 UTC, Manu wrote: > A great test is to emulate an Atari2600; you'll know your 6502 is 100% > perfect if you can play pitfall or some other complex 2600 games ;) > I can't see how your cycle counting logic works, it looks like it's > missing a lot of cycles. How do you clock your scanlines against your > CPU? > Can you run Battletoads or Super Mario Bros? They're pretty sensitive > to proper timing. Every cycle is accounted for via a memory read or write. Notice both memoryRead & memoryWrite call nextCycle. In nextCycle you'll notice after every CPU cycle the PPU gets 3 cycles (equivalent to 1 CPU cycle) & the APU gets 1 cycle. Super Mario Bros runs fine but Battletoads has some issues unrelated to the CPU. It is highly dependent on correct sprite 0 collision detection timing. It's a PPU timing issue. I'm relying on these CPU tests: https://wiki.nesdev.com/w/index.php/Emulator_tests. Notice one of the authors of one of the most extensive tests is kevtris who's most famous for his FPGA recreations of the NES & Super Nintendo for Analogue (https://www.analogue.co/). I'm pretty confident about the CPU being cycle accurate at least as far as the NES is concerned. |
Copyright © 1999-2021 by the D Language Foundation