It is a fun way to benchmark your system. I managed to get 4.1hz on my 13th gen i5 work laptop.
Let's see an M-series chip blow that out of the water. ;)
EDIT - It was 4.1Hz in advance mode. Actually runs at between 22Hz and 44hz depending on each time I run it. Odd to have such a wide performance variation. I will just blame Windows and some power management setting/thermal throttling.
M4 Max, Brave — 93Hz highest, usually around 90Hz. On Advanced it started at 22Hz & steadily dropped from there into the single digits as it ran. Safari held around 62.xHz. On Advanced it started at 40Hz & also kept dropping.
So, yeah, this is wonderful since the ARM architecture (Acorn Risc Machine) is arguably derived from the 6502 by Sophie Wilkins and Steve Furber at Acorn Computers.
Shameless plug: I wrote a 'remix' a couple of years ago over a Christmas break using WASM+WebGL+DearImGui with better rendering performance, integrated assembler and a couple visualization tools (using the visual6502 team's original reverse engineered netlist data, and https://github.com/mist64/perfect6502 as simulation loop):
The link to Perfect6502 is interesting. It says that it supposedly gets speeds of 1/30th of 1MHz - i.e. ~30KHz - on high-end 2025 CPUs. Which is very slow of course, but still ~1000x faster than what people are reporting in this thread.
Of course it's in JS rather than C, but V8 is really good, well within an order of magnitude - not three - of native, at least with well-written code. I profiled the original Visual6502 and at a glance it sure does look like it's losing a ton of performance to rendering (so good call there).
I have to wonder what the limit is. Even Perfect6502 looks like it's all single-threaded and CPU-driven, which really isn't making the most of modern machines. But I don't know if this is a task that could be efficiently split across cores or dispatched to the GPU (and I can't even begin to know whether SIMD might be useful); of course hardware itself is fundamentally parallel, but the synchronization might kill you?
As far as I understood it, this basically re-evaluates the state of a 'dirty list' of transistors though all their connections, and loops until the node list has 'settled' again into a stable state (e.g. state changes from the last loop didn't cause trigger new state changes). Haven't thought about how this could be threaded or simd-ified.
https://github.com/iaddis/metalnes
Similar project, gate level emulation of NES CPU+PPU by the Nesticle author Icer Addis.
An entire world in a scanline
It is a fun way to benchmark your system. I managed to get 4.1hz on my 13th gen i5 work laptop.
Let's see an M-series chip blow that out of the water. ;)
EDIT - It was 4.1Hz in advance mode. Actually runs at between 22Hz and 44hz depending on each time I run it. Odd to have such a wide performance variation. I will just blame Windows and some power management setting/thermal throttling.
M4 Max, Brave — 93Hz highest, usually around 90Hz. On Advanced it started at 22Hz & steadily dropped from there into the single digits as it ran. Safari held around 62.xHz. On Advanced it started at 40Hz & also kept dropping.
My very old i5-3570K on Firefox 153 is running this at 17.5Hz. I'm not sure why a much newer chip would be dramatically slower.
I got 22-33Hz on an AMD Ryzen 7640U on power-save mode and 50-55Hz on performance mode.
I'm seeing 34 Hz on a Ryzen 7 3600X 3.6 Ghz with Chrome. 47 Hz in Firefox.
70hz to 75hz on 12th Gen Core i7-12700
Get about 10 more hz in Firefox than in Chrome which was unexpected.
88Hz on the M4 Pro
I concur with that number for Chrome, then 70 Hz with Firefox 62 Hz with Safari
There it is, about 4 times faster than my machine. The single core performance of the M-series is something special.
So, yeah, this is wonderful since the ARM architecture (Acorn Risc Machine) is arguably derived from the 6502 by Sophie Wilkins and Steve Furber at Acorn Computers.
60Hz on my phone
85Hz M3 Max
62Hz on an iPhone 15 Pro
Pixel 6 - 40-50Hz
Linux, Core i7-8700, Firefox, GTX1650, nothing special, and I'm getting 45-55Hz out of it.
So you're probably not far off. I can't imagine more modern chips than mine would run it significantly faster, none of the "tweaks" would help here.
High 60's to 70 on a Firefox|Fedora|Ryzen AI 9 HX.
Shameless plug: I wrote a 'remix' a couple of years ago over a Christmas break using WASM+WebGL+DearImGui with better rendering performance, integrated assembler and a couple visualization tools (using the visual6502 team's original reverse engineered netlist data, and https://github.com/mist64/perfect6502 as simulation loop):
- 6502: https://floooh.github.io/visual6502remix/
- Z80: https://floooh.github.io/visualz80remix/
- 2A03 (this was contributed): https://floooh.github.io/visual2a03remix/
- source code: https://github.com/floooh/v6502r
(the simulation generally runs throttled to 1 half-clock-cycle per frame, so don't use it as any sort of benchmark)
The link to Perfect6502 is interesting. It says that it supposedly gets speeds of 1/30th of 1MHz - i.e. ~30KHz - on high-end 2025 CPUs. Which is very slow of course, but still ~1000x faster than what people are reporting in this thread.
Of course it's in JS rather than C, but V8 is really good, well within an order of magnitude - not three - of native, at least with well-written code. I profiled the original Visual6502 and at a glance it sure does look like it's losing a ton of performance to rendering (so good call there).
I have to wonder what the limit is. Even Perfect6502 looks like it's all single-threaded and CPU-driven, which really isn't making the most of modern machines. But I don't know if this is a task that could be efficiently split across cores or dispatched to the GPU (and I can't even begin to know whether SIMD might be useful); of course hardware itself is fundamentally parallel, but the synchronization might kill you?
The core of the simulation are these two functions:
https://github.com/mist64/perfect6502/blob/09fc542877a843182...
As far as I understood it, this basically re-evaluates the state of a 'dirty list' of transistors though all their connections, and loops until the node list has 'settled' again into a stable state (e.g. state changes from the last loop didn't cause trigger new state changes). Haven't thought about how this could be threaded or simd-ified.
I wish these guys would have released this amazing looking 6502 in circuits: https://www.evilmadscientist.com/2016/6502/
Agree. I would pay for it.
I haven’t followed progress, but they did say it would likely cost $2k-$4k if they ever produced them to sell.
Well I've played the 6502 simulator as a kind on my 6502 Apple ][ clone :) :) :)
youtube.com/watch?si=XuNgnVc4rf86nIgA&t=42
it should'be available here to play online too (but haven't tried it)
https://archive.org/details/257_Educational_Software_The_650...
The emulator on that page gets an error when booting, but I think the content is the same as this:
https://archive.org/details/riag_004_051_-_MECC_Assembly_Lan...
Which was awesome as a kid to finally see what was "going on" inside there.