November 12, 2018
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
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
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
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.
1 2
Next ›   Last »