It is currently Sun Dec 10, 2017 8:54 pm

All times are UTC - 7 hours





Post new topic Reply to topic  [ 26 posts ]  Go to page 1, 2  Next
Author Message
PostPosted: Wed Mar 08, 2017 6:29 pm 
Offline
User avatar

Joined: Tue Mar 07, 2017 4:25 pm
Posts: 29
Location: Ohio, USA
Wanting to learn more about the NES, I decided to write my own emulator, and today I'm releasing it into the wild. I plan to do a lot more work on it, and I have some interesting ideas that I hope will carve it into a niche of its own.

Some features of note include NTSC simulation, gameplay recording, mid-instruction cycle-accuracy, game genie support.
Currently Supported Mappers: 0, 1, 2, 3, 4, 5, 7, 9, 10, 11, 13, 16, 18, 19, 28, 34, 66, 69, 71, 79, 85, 118, 119, 140, 163, 185, 228, 232
Many difficult to emulate games work, such as BattleToads, Bee-52, Mig 29 Soviet Fighter, and Crystalis to name a few.

I attempted cycle-accuracy in the CPU and PPU, and have more or less achieved it. There is still a lot more work to be done, but it's totally playable currently.
I plan on putting the code up soon under an unrestrictive license (MIT maybe), after I clean it up a little.

Download Any-Yes 0.2.0

Let me know what you think, I certainly plan on improving it greatly! Thanks!

Instructions, from the readme:
===============================================================================
Operating Any-Yes
===============================================================================
To run: You must have Java installed. Simply double click the .jar file if you are in Windows.
If that doesn't work, or you are in Linux, run this command:
java -jar any-yes.jar

Put ROMs in the included ROMS folder, which is the easiest method of accessing them.
You can also navigate to whereever they are using the built-in file browser, but it's still somewhat of a work in prgress.

The file browser is simply a frontend. To set key mappings and other options, you must launch a game.
To navigate, click files or directories. To go up to a previous directory, click the folder name in the top bar.
If you need to change the start-up directory, edit last_dir.txt, which is in the loader/config/all/ subdirectory of the config location (see below)

You can make the window large by double clicking the title bar, or dragging the edges to resize. True fullscreen support will come soon.

Zip support is very temperamental, some zip files refuse to open currently. If you run into this problem, please unzip the rom and try again.

===============================================================================
Configuration
===============================================================================
To map controller controls:
Press Escape while in a game
Click "Map Controls"
Currently cannot remap keyboard controls.

All config data currently is put in:
Windows: <OS Drive>:/vnand/
Linux: ~/vnand/
(VNAnd is the name of a larger multi-emulator platform I am working on, of which Any-Yes is a module)
Any-Yes specific data and configs are in the engine_data/any-yes subdirectory.

===============================================================================
Recordings
===============================================================================
Some notes about the recording system:
Press R or click "Create" in the menu to begin recording.
Press R again or click "Finish" to complete the recording.
Press T to play the recording. Currently you can only have one recording at a time per game, to have more, move the recording file for that game.
You can make a recording over multiple play sessions by saving the state (F5) while recording. If you load the save state later, it will continue recording.

===============================================================================
Key list
===============================================================================
Escape: Toggle Pause / Menu

Q - toggle NTSC simulation
W - toggle linear screen filter
S - toggle scanline overlay

` - hold for fast forward

R - toggle recording
T - play recording

F1 - quick save state
F2 - quick load state

F5 - save state file
F6 - Load state file

Arrow key - D-Pad
Z - B
X - A
Tab - Select
Enter - Start

===============================================================================
Upcoming Features
===============================================================================
Some lofty and not-so-lofty upcoming features I plan on supporting:

- Rewind
- Game Manual / Cover archival
- Better frontend
- Android (Mostly working)
- Neural Network to learn to play games (via reinforcement learning, think Mar I/O)
- Javascript plugins
- External hardware simulation (plug and unplug virtual controllers, TVs, etc in a visual way)
- Fast cycle-innacurate core

===============================================================================
Changelog
===============================================================================
0.2.0:
- Command line launch support
- Added more conventional menu bar
- various optimizations
- Rewrote NMI triggering (Fixes Bases Loaded II)

0.1.3:
- Added mappers 85 and 34
- Adapted VRC7 sound chip from nesimulare (MIT licensed) for use with Any-Yes APU
- Partial Namco 163 sound chip support
- Audio high & low pass filtering
- Major performance increase (Located a huge source of Java garbage collection)
- Prevent joysticks that rapid-fire events from making key mapping impossible
- Save state serialzation rewrite
- Minor timing fixes
- Better handling of cleanup for audio and video threads

0.1.2:
- Added mappers 18, 79, and 185
- Fixed save state info in mapper 16 and 19
- NTSC simulation now attempts to use more CPU cores
- CHR-RAM banking, fixing Romancia and Lagrange Point
- Updated libGDX to 1.9.6
- Updated lwjgl to version 3

0.1.1:
- Added dummy write in INC and multi-write detection in MMC1 (Fixes Bill & Ted)
- PPU $2004 now returns more accurate values (Fixes Micro Machines) (Still needs a little work)
- Adjusted NMI timing (Fixes Battletoads)


Attachments:
File comment: Castlevania 3.
castlevania-3.jpg
castlevania-3.jpg [ 124.49 KiB | Viewed 3195 times ]
File comment: Mario 3.
mario-3.jpg
mario-3.jpg [ 70.94 KiB | Viewed 3195 times ]
File comment: Zelda 2 with and without NTSC emulation.
zelda-ntsc.jpg
zelda-ntsc.jpg [ 216.32 KiB | Viewed 3195 times ]


Last edited by YoukaiCountry on Fri Mar 31, 2017 3:10 pm, edited 6 times in total.
Top
 Profile  
 
PostPosted: Wed Mar 08, 2017 7:12 pm 
Offline
User avatar

Joined: Fri Nov 19, 2004 7:35 pm
Posts: 3967
Passes the Chu Chu Rocket test (Great job!), but fails the Bill & Ted test.

_________________
Here come the fortune cookies! Here come the fortune cookies! They're wearing paper hats!


Top
 Profile  
 
PostPosted: Wed Mar 08, 2017 7:15 pm 
Offline
User avatar

Joined: Tue Mar 07, 2017 4:25 pm
Posts: 29
Location: Ohio, USA
Dwedit wrote:
Passes the Chu Chu Rocket test (Great job!), but fails the Bill & Ted test.


Good catch, the multi-write latch that breaks Bill & Ted is on my short list of things to fix!


Top
 Profile  
 
PostPosted: Wed Mar 08, 2017 9:52 pm 
Offline

Joined: Sun May 03, 2015 8:19 pm
Posts: 90
Doesn't seem to run a game I converted to MMC5 correctly but it could be my implementation. It doesn't seem to switch the BG-CHR banks right.

My MMC3 to MMC5 conversion works under the following emulators:
FCEUX
Nestopia
Nintendulator
Mesen


Top
 Profile  
 
PostPosted: Wed Mar 08, 2017 10:01 pm 
Offline
User avatar

Joined: Tue Mar 07, 2017 4:25 pm
Posts: 29
Location: Ohio, USA
hackfresh wrote:
Doesn't seem to run a game I converted to MMC5 correctly but it could be my implementation. It doesn't seem to switch the BG-CHR banks right.

My MMC3 to MMC5 conversion works under the following emulators:
FCEUX
Nestopia
Nintendulator
Mesen


MMC5 is one I haven't tested a lot, I don't think the PRG-RAM banking is working correctly for instance (Uncharted Waters seems to be the only game that really uses it). Do you have an IPS patch for your conversion so I can test it? It would help me out a lot!


Top
 Profile  
 
PostPosted: Wed Mar 08, 2017 10:19 pm 
Offline

Joined: Sun May 03, 2015 8:19 pm
Posts: 90
I PM'ed it to you.


Top
 Profile  
 
PostPosted: Thu Mar 09, 2017 3:07 am 
Offline
User avatar

Joined: Tue Mar 07, 2017 4:25 pm
Posts: 29
Location: Ohio, USA
Update:
After testing I discovered that I had managed to break Battletoads and hadn't noticed (probably in a recent round of timing corrections), but I managed to fix it; NMI triggering was off by a CPU cycle which was causing random mayhem.
I also discovered I was having the dreaded Micro Machines jittering (I had never tested the game). My $2004 read isn't pulling from secondary OAM during the proper cycles. I put a bandage on it with the recommended hack for now. Since I want this to be cycle-accurate I intend to put a proper fix in place.

I'll get a new release out later on today with those fixes and hopefully I'll have time to implement some more.


Top
 Profile  
 
PostPosted: Thu Mar 09, 2017 5:08 pm 
Offline
User avatar

Joined: Tue Mar 07, 2017 4:25 pm
Posts: 29
Location: Ohio, USA
Made a small compatibility release:
Download Any-Yes 0.1.1

Changes:
- Added dummy write in INC and multi-write detection in MMC1 (Fixes Bill & Ted)
- PPU $2004 now returns more accurate values (Fixes Micro Machines) (Still needs a little work)
- Adjusted NMI timing (Fixes Battletoads)


Top
 Profile  
 
PostPosted: Fri Mar 10, 2017 4:26 pm 
Offline
User avatar

Joined: Mon Feb 07, 2011 12:46 pm
Posts: 941
If you will add a JavaScript plugins then you should need one that can use ES6 features (I think Rhino doesn't, but I am not sure). An important JavaScript feature inside of a NES emulator I think would be typed arrays, so you should use one that implements that. I don't know which ones that are compatible with Java do have such capabilities.

_________________
.


Top
 Profile  
 
PostPosted: Sat Mar 11, 2017 3:12 am 
Offline
User avatar

Joined: Tue Mar 07, 2017 4:25 pm
Posts: 29
Location: Ohio, USA
ES6 would definitely be great to support. It looks like Nashorn engine provides some level of support for it, though I haven't looked closely into it yet. Rhino has definitely been my goto in the past, but it's aging :)

One of my major goals for scripting support is on the fly programmatic manipulation of memory values.
For example I'd like to play with neural networks / reinforcement learning bots, and script would be a great middle layer to pull values from memory to feed to the AI.
Things like debugging plugins or game trainers would be relatively simple to write too, if I make the API good (and fast) enough :)


Top
 Profile  
 
PostPosted: Sat Mar 11, 2017 11:11 am 
Offline
User avatar

Joined: Mon Feb 07, 2011 12:46 pm
Posts: 941
Also, do you implement support for NES 2.0 headers? If not, then you should. (Note: My recommendation is to never perform hash checks if the NES 2.0 header is present. If you perform hash checks at all, do them only if the NES 2.0 header is not present.)

_________________
.


Top
 Profile  
 
PostPosted: Sat Mar 11, 2017 4:00 pm 
Offline
User avatar

Joined: Tue Mar 07, 2017 4:25 pm
Posts: 29
Location: Ohio, USA
I do not actually support 2.0 headers, but I really should add it to my short list.

As for hash checks, I have managed to get this far without game specific code / hacks, although I do need to add some; for instance Romancia and Lagrange Point with their surprise banked CHR-RAM.

When I add iNES 2.0 support, it sounds like a lot of things will be simpler! Thanks for the suggestion!


Top
 Profile  
 
PostPosted: Sat Mar 11, 2017 4:27 pm 
Offline

Joined: Sun Apr 13, 2008 11:12 am
Posts: 6503
Location: Seattle
YoukaiCountry wrote:
for instance Romancia and Lagrange Point with their surprise banked CHR-RAM.
I'm pretty certain that all mappers that support banking and are used with CHR-RAM support banking that CHR-RAM.


Top
 Profile  
 
PostPosted: Sat Mar 11, 2017 5:03 pm 
Offline
User avatar

Joined: Tue Mar 07, 2017 4:25 pm
Posts: 29
Location: Ohio, USA
[/quote]I'm pretty certain that all mappers that support banking and are used with CHR-RAM support banking that CHR-RAM.[/quote]

I had no idea. It doesn't seem to come up very often so I implemented a per-mapper chr-ram-banking boolean for optimization reasons. Turning it on for mapper 1 doesn't seem to break anything, and now Romancia and Lagrange Point show correctly. Thanks!


Top
 Profile  
 
PostPosted: Sat Mar 11, 2017 5:20 pm 
Offline

Joined: Sun Apr 13, 2008 11:12 am
Posts: 6503
Location: Seattle
Yeah, very few games take advantage of it, since at the time cost reasons meant that almost all games only used 8 KiB of CHR RAM, and it's no-where near as obviously useful when you've only got 8 source banks.

But if you're only using 8x8 sprites, you're only going to be able to draw 320 different tiles in given refresh anyway, so very very careful arrangement of tiles leaves you with 3 banks for e.g. bankswitching animation.


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 26 posts ]  Go to page 1, 2  Next

All times are UTC - 7 hours


Who is online

Users browsing this forum: TmEE and 7 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group