Holy Shit! Mario 64 works on Java

As so happens someone somewhere wrote an n64 emulator known as Project64, then dooglamoo ported it to java. I thought it’d be an interesting experiment to see if it could be run in a browser. So i’ve spent some time porting it to LWJGL and making it work as an applet.

Which gives you Super Mario 64 in your browser, complete with ingame saving so you can come back to it later and continue where you left off. Pretty impressive huh?

You can play here

note - its still pretty experimental and sound is borked, also reports of flickering on ATI cards (crappy drivers?).

p.s. sorry for the title it was a reference to the Holy shit! They made the flash version of DOOM!! post :wink:

You can add to that a report from me of flickering on an nVidia 8600M GT in Vista, driver 190.89

How do they do the dynarec that the original does?
(whatever - to - 86x assembly)

That is amazing! Great work with the port to LWJGL.

I saw some pretty serious flicker as well, it seemed like there were 2 versions of the game running - one that ran fine and another that would display white frames or old previousluy shown frames. As soon as you see it happening you’ll probably know what the reason is straight away.

Crashing Safari and Firefox on OS X:


11/20/09 9:22:49 PM Safari[3812] *** Assertion failure in -[NSMenu removeItem:], /SourceCache/AppKit/AppKit-949.54/Menus.subproj/NSMenu.m:702 
11/20/09 9:22:49 PM Safari[3812] *** CPerformer: ignoring exception 'Invalid parameter not satisfying: item != nil' raised during perform of selector 'sharedDelegate' on target 'ApplicationDelegate' with args '(null)' 
11/20/09 9:22:49 PM Safari[3812] *** Assertion failure in -[NSMenu removeItem:], /SourceCache/AppKit/AppKit-949.54/Menus.subproj/NSMenu.m:702 
11/20/09 9:22:53 PM [0x0-0x17b17b].com.apple.Safari[3812] Invalid memory access of location 0x1 eip=0x2b50a12e 
11/20/09 9:22:59 PM com.apple.launchd[164] ([0x0-0x17b17b].com.apple.Safari[3812]) Exited abnormally: Bus error 

ah could explain the flickering will have a look at that, thx for the observation.

@CommanderKeith I’ve added a small fix, it might fix the flickering, could you try again? thanks

eww that looks like a nasty error.

Nice, that did the trick! Graphics are 100% smooth.

Wish I had those secret magic codes to fix my bugs so quickly 8)

Graphics don’t flicker for me, it all runs fine. However the sound is a complete mess. That’s where the flickering occures for me.

Same thing here. Great job kapta! That’s so cool!

That fixed the flickering for me too. 8)

So it was actually two apps?

And you might want to tell him you’ve ported his software to use LWJGL if he doesn’t already know.

Very very cool. Well done. :slight_smile: Works better than the best Mac OS X N64 emulator.

Worked without nasty exceptions on Mac OS X on Safari for me. Way to go!

Well done, the flickering seems to be fixed now, but I’m still having problems with the sound as well (didn’t mention that before).

NICE!

that is amazing.

did yuo port the emulator or the game?

by that I mean, how much effort would it take you to change it to another game?

I presume the emulator was ported.

Incidentally, I tried dooglamoo; it didn’t seem to load Mario by default so I loaded a Zelda rom I had lying around, and it had similar problems with audio.

It works fine, it is a bit slow on my machine but quite playable. I get this when I leave the game:

[quote]java.lang.InterruptedException
at java.lang.Object.wait(Native Method)
at java.lang.Thread.join(Thread.java:1143)
at java.lang.Thread.join(Thread.java:1196)
at jario64.AppletMain.stopLWJGL(Unknown Source)
at jario64.AppletMain.access$0(Unknown Source)
at jario64.AppletMain$2.removeNotify(Unknown Source)
at java.awt.Container.removeNotify(Container.java:2591)
at java.awt.Container.removeNotify(Container.java:2591)
at java.awt.Container.removeNotify(Container.java:2591)
at java.awt.Container.removeAll(Container.java:1197)
at sun.plugin.viewer.frame.XNetscapeEmbeddedFrame.windowClosing(XNetscapeEmbeddedFrame.java:31)
at java.awt.Window.processWindowEvent(Window.java:1845)
at java.awt.Window.processEvent(Window.java:1803)
at java.awt.Component.dispatchEventImpl(Component.java:4501)
at java.awt.Container.dispatchEventImpl(Container.java:2081)
at java.awt.Window.dispatchEventImpl(Window.java:2458)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Clear up
org.lwjgl.LWJGLException: X Error - disp: 0x811cbe8 serial: 18460 error: BadValue (integer parameter out of range for operation) request_code: 145 minor_code: 9
at org.lwjgl.opengl.LinuxDisplay.globalErrorHandler(LinuxDisplay.java:284)
at org.lwjgl.opengl.GL11.nglClear(Native Method)
at org.lwjgl.opengl.GL11.glClear(GL11.java:584)
at lwjglgfx.OpenGlGdp.OGL_ClearDepthBuffer(Unknown Source)
at lwjglgfx.rdp.Gdp.gDPFillRectangle(Unknown Source)
at lwjglgfx.opcodes.Rdpfuncs2$12.exec(Unknown Source)
at lwjglgfx.rsp.Gsp.RSP_ProcessDList(Unknown Source)
at lwjglgfx.OpenGl.display(Unknown Source)
at lwjglgfx.GLN64jPlugin.processDList(Unknown Source)
at jario64.Rsp.runRsp(Unknown Source)
at jario64.Memory.swNonMemory(Unknown Source)
at jario64.Memory.storeWord(Unknown Source)
at jario64.Cpu$45.run(Unknown Source)
at jario64.Cpu.executeInstruction(Unknown Source)
at jario64.Cpu.access$16(Unknown Source)
at jario64.Cpu$64.run(Unknown Source)
at jario64.Cpu$3.run(Unknown Source)
at jario64.Cpu.startInterpreterCPU(Unknown Source)
at jario64.Cpu.startEmulation(Unknown Source)
at jario64.Main.startRom(Unknown Source)
at jario64.Main.initApplet(Unknown Source)
at jario64.AppletMain$1.run(Unknown Source)
Exception in thread “pool-1-thread-1” java.lang.IllegalMonitorStateException
at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:127)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1175)
at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:431)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:369)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
[/quote]

Unfortunately can’t do much about the sound, It uses the original JavaSound Implementation which is a pretty poorly implemented. It’d probably run alot smoother using OpenAL but currently the sound code is a mess and i don’t have the time or experience with OpenAL to port that part. However do note its only dooglamoo’s first attempt at the sound plugin so may improve in the future.

you presume correctly.

very little effort.

Ah, doesn’t look too serious, but thats one long exception paste :slight_smile:

Yes, it seems to be a bit slow or the frame rate a bit low. Can I display the fps? Doesn’t seem to be a CPU issue since mine was used between 50% and 60%.

Othen then that, I hope Nintendo nevers learns about that, especially with the virtual console on wii.

Works fine here.
I also have the sounds problem.

Not sure if its the game itself, or that the game isn’t made for a keyboard but I found its controls annoying to play heh.