One of the amazing things about this project is that the author built physical harnesses for real early CPUs so that he could build test suites against the real hardware and ensure the emulation is 100% correct, down to every timing and quirk of the original hardware.
To add on top this, the author wrote multiple blog posts on their setup [0, 1, 2]. The project itself is hosted at https://github.com/dbalsom/arduinoX86
It is insane because IBM wanted a wireless keyboard. If you're not familiar with the PCjr keyboard, it has two IR transmitters (they are electrically the same, just having two gives you a better transmission path). The PCjr system has an IR receiver.
Now, a normal keyboard cable is a standard two-wire serial protocol with clock and data. Being wireless, you have no clock, so you have to synchronize clocks, or have clock recovery built into the protocol. The PCjr does the former, using the 8253 timer chip.
The keyboard has no way of knowing if the system has received a keystroke, so the system must receive every keystroke - they can't be stored in a fifo, they can't be resent if the CPU missed it.
This rules out the possibility of using system interrupts - so when you type a key on the CPU and the IR receiver gets the start bit - the NMI line is raised, the 8253 is programmed to time the clock bursts from the IR receiver, and the CPU reads out every bit of the scancode.
The PCjr also famously has no DMA, so things like floppy drive transfers are both extremely slow and somewhat unreliable - the IBM floppy controller is somewhat additionally weird is that they disable interrupts as well. The only way the PCjr knows what the controller is doing is by polling its status register, and there is enough ambiguity that it sets a 555 timer that will reset the FDC and start everything over if things time out.
The combination of these two decisions means its inadvisable to type while your floppy drive is transferring data
besides the fact that it was written in rust, rust happens to be a really nice language to write emulators, you don't have to think much about threading and not much abut memory management, rust makes that easy => you can concentrate on your pixels. Moreover LLM grasp it very well so that you can get a bit more spare time for your emulator-side-project.
It was very long since I wrote any sort of C++ and using rust was pretty refreshing.
Second "besides": marty's PC may not have a lot of breadth in terms of supported hardware, but it gets the accuracy totally right. It's a very special kind of achievement.
(I'm not a rust fanboy :-) I just appreciate the language for writing my emulator)
For not well off geeks you could just solder a bunch of resistors together and get vastly better sound than from the crappy PC speaker and there were games that supported it and I wrote some software for it (which unfortunately is gone I think). I had a lot of just having this on the pc in the house.
"Not long after its introduction, Creative Labs introduced its competing Sound Blaster card. The Sound Blaster was fully compatible with AdLib's hardware, and it also implemented two key features absent from the AdLib: a PCM audio channel and a game port. With additional features and better marketing, the Sound Blaster quickly overshadowed AdLib as the de facto standard in PC gaming audio. AdLib's slow response, the AdLib Gold, did not sell well enough to sustain the company."
DOS has the 'keyb' utility and 'keyboard.sys' to support different layouts, using various code pages.
If you have a CGA card, you're stuck with the code page of the ROM your card came with, which in most cases was code page 437, although a few variants were made.
EGA/VGA had software fonts so other code pages could be loaded.
Key is Scancode 0x2B, or as a VKEY code: VK_OEM_5 (0xDC)
Javascript says the key I pressed was keycode 220 (same number as 0xDC) or key "\".
I had Tandy 1000 as the selected machine. When I look at the onscreen keyboard, I don't see a backslash key underneath backspace, but I do see one next to left shift. For keyboards that have the alternate backslash there, it is listed as having a scancode of 0x56 and a VKEY code of VK_OEM_102 (0xE2). (I haven't actually checked information specific to the actual Tandy keyboard)
Not just the OSD keyboard, my real backslash key is also pressing backspace. You can't do your classic DOS commands like "cd\" without a working backspace key.
they're planned at some point. I need to write a utility or custom controller rig with a pico that can step the head on an MFM drive in patterns i can record, then model stepping to cylinder in the hard disk controller.
This comment is itself a meta comment but here we go I guess...How is it possible that half the comments in this thread are about the title itself? It’s not even a made-up title, it’s taken straight from the project’s README...I keep seeing people complaining almost aggressively that others are touting Rust as a useful tool (which, to me personally, it certainly is). Does someone have a financial stake in opposing Rust’s development, or what?
When I started writing MartyPC over four years ago, writing an emulator in Rust was still somewhat novel. The development of the 'egui' immediate-mode graphics framework made it possible to make one with an advanced interactive debugger.
By mentioning Rust people have been able to more easily find MartyPC as an example of how (or how not to) write an emulator in Rust.
Perhaps the tag as outlived its usefulness, especially if people find it pompous or something. I'm not trying to be Rust cultist, I swear.
I believe a true engineer should love problems not only languages. But it seems like majority of Rust devs only love the language and try to convert all the problems into Rust problems.
If you have problems in C/C++? Write Rust.
If you have problems in Python? Use Rust.
If you have an issue with your product? Rewrite it in Rust.
Is your company in pinch? Launch a new product in Rust.
If you burn your finger while you’re cooking? Write Rust.
If you have a mental problem? Read a Rust book.
You don’t have a girl friend? You have Rust next to you.
If you hate yourself? Writing Rust will solve your life problems.
its just ppl trying to be different from their boring parents. wish i had enough karma to flag them too but i keep getting downvoted into oblivion for making fun of written in rust posts
I am not the OP of this post, but they're just using my github description. when I first wrote it, Rust was a novel choice for an emulator, and it helped people find examples of emulators written in Rust.
believe it or not I didn't tailor it for the HN meta
"cross-platform" and Rust, as advertised in the current title/link label, is incompatible for sure. Can't get that to run on my older OS X machine nor my Amiga. :)
Yep, before UNIX and C there were no systems programming languages, and after getting the clay tablets from UNIX and C, all civilisation was built upon them. /s
At least when you spend long time around some programming circles.
One of the amazing things about this project is that the author built physical harnesses for real early CPUs so that he could build test suites against the real hardware and ensure the emulation is 100% correct, down to every timing and quirk of the original hardware.
To add on top this, the author wrote multiple blog posts on their setup [0, 1, 2]. The project itself is hosted at https://github.com/dbalsom/arduinoX86
[0]: https://martypc.blogspot.com/2023/06/hardware-validating-emu...
[1]: https://martypc.blogspot.com/2023/05/exploring-dma-on-ibm-pc...
[2]: https://martypc.blogspot.com/2023/10/bus-sniffing-ibm-5150.h...
Hi, thanks for checking out MartyPC. I'm the developer if there are any questions.
What's your favorite "What the FUCK were they smoking when they designed this?" moment?
easy - the PCjr keyboard interface.
It is insane because IBM wanted a wireless keyboard. If you're not familiar with the PCjr keyboard, it has two IR transmitters (they are electrically the same, just having two gives you a better transmission path). The PCjr system has an IR receiver.
Now, a normal keyboard cable is a standard two-wire serial protocol with clock and data. Being wireless, you have no clock, so you have to synchronize clocks, or have clock recovery built into the protocol. The PCjr does the former, using the 8253 timer chip.
The keyboard has no way of knowing if the system has received a keystroke, so the system must receive every keystroke - they can't be stored in a fifo, they can't be resent if the CPU missed it.
This rules out the possibility of using system interrupts - so when you type a key on the CPU and the IR receiver gets the start bit - the NMI line is raised, the 8253 is programmed to time the clock bursts from the IR receiver, and the CPU reads out every bit of the scancode.
In software.
The PCjr also famously has no DMA, so things like floppy drive transfers are both extremely slow and somewhat unreliable - the IBM floppy controller is somewhat additionally weird is that they disable interrupts as well. The only way the PCjr knows what the controller is doing is by polling its status register, and there is enough ambiguity that it sets a 555 timer that will reset the FDC and start everything over if things time out.
The combination of these two decisions means its inadvisable to type while your floppy drive is transferring data
Many people are very angry that you used Rust. Did you expect this choice to cause such an uproar?
Angry people gonna angry. Don't take criticism from people you wouldn't take advice from.
People will generally get angry no matter what you do. People are also angry it is MIT licensed.
But honestly I wanted to learn the Rust programming language and I thought writing an emulator was a good a project to learn as any.
I have been working on a emulator in C++ in collaboration with a friend, it is also cycle-accurate. It is called XTCE-Blue.
besides the fact that it was written in rust, rust happens to be a really nice language to write emulators, you don't have to think much about threading and not much abut memory management, rust makes that easy => you can concentrate on your pixels. Moreover LLM grasp it very well so that you can get a bit more spare time for your emulator-side-project.
It was very long since I wrote any sort of C++ and using rust was pretty refreshing.
Second "besides": marty's PC may not have a lot of breadth in terms of supported hardware, but it gets the accuracy totally right. It's a very special kind of achievement.
(I'm not a rust fanboy :-) I just appreciate the language for writing my emulator)
Adlib support! At least someone else remembers it wasn't only Soundblaster.
All my friends had Soundblasters; I had a self soldered Covox. Fun times.
Whaaat?? Do tell more!
For not well off geeks you could just solder a bunch of resistors together and get vastly better sound than from the crappy PC speaker and there were games that supported it and I wrote some software for it (which unfortunately is gone I think). I had a lot of just having this on the pc in the house.
https://github.com/necroware/silly-sound-bastard
I am very close to emulating the Covox - I emulate the Disney Sound Source, which is just a Covox with a FIFO
But Soundblaster came with Adlib, so surely complete support for SB should mean Adlib support as well.. ?
Yeah and eventually Adlib was gone.
From Wikipedia,
"Not long after its introduction, Creative Labs introduced its competing Sound Blaster card. The Sound Blaster was fully compatible with AdLib's hardware, and it also implemented two key features absent from the AdLib: a PCM audio channel and a game port. With additional features and better marketing, the Sound Blaster quickly overshadowed AdLib as the de facto standard in PC gaming audio. AdLib's slow response, the AdLib Gold, did not sell well enough to sustain the company."
I haven't implemented the Soundblaster card yet, although it's quite high on my list of things to do.
Ironically, and unfortunately, this doesn't actually emulate the FM Towns Marty (or even the regular FM Towns PC) like I assumed it would.
The name is a reference to the 8088 MPH scene demo, it was the first emulator to be able to run it.
Doesn't seem to support non-QWERTY keboards :(
I've built out a full keyboard-remapping system, to support any keyboard layout. I need help building these files.
Are you using DVORAK? If you are willing to help, please open a Github issue with some info about your keyboard, and I'll build support for it.
Thanks! Done
How did DOS era software handle this anyways? I can't imagine it would be fun to be a dvorak typist in the DOS era.
DOS has the 'keyb' utility and 'keyboard.sys' to support different layouts, using various code pages.
If you have a CGA card, you're stuck with the code page of the ROM your card came with, which in most cases was code page 437, although a few variants were made.
EGA/VGA had software fonts so other code pages could be loaded.
But it's written in Rust! Who cares about non-qwerty!
/s
Mysteriously, backslash has been mapped to backspace for some reason.
That's keyboard code [1] vs. Keyboard key [2].
[1] Physical location of a key https://w3c.github.io/uievents/#keys-codevalues
[2] Mapping of a key https://w3c.github.io/uievents/#keys-keyvalues
The naming is terrible and I have to look it up every single time
What keyboard layout are you using? I can't reproduce on a US layout.
Key is Scancode 0x2B, or as a VKEY code: VK_OEM_5 (0xDC)
Javascript says the key I pressed was keycode 220 (same number as 0xDC) or key "\".
I had Tandy 1000 as the selected machine. When I look at the onscreen keyboard, I don't see a backslash key underneath backspace, but I do see one next to left shift. For keyboards that have the alternate backslash there, it is listed as having a scancode of 0x56 and a VKEY code of VK_OEM_102 (0xE2). (I haven't actually checked information specific to the actual Tandy keyboard)
Yeah the OSD is only the Model F and the Tandy has some difference so the OSD keyboard may not work quite right with the Tandy.
I have to make all new pixel-art for a Tandy 1000 keyboard and PCjr keyboard. Fun
Not just the OSD keyboard, my real backslash key is also pressing backspace. You can't do your classic DOS commands like "cd\" without a working backspace key.
I don't think Backspace as a key was standard internationally until 1994. Apple still doesn't use it, just Delete.
This is about early IBM PCs, not apple computers. And the non-working key is the Backslash key \ , not the backspace key.
Old terminals had this shenanigans going on too. Backspace was not backspace and so on
probably in the minority but i want the screeching and grumbling hard disk sounds
they're planned at some point. I need to write a utility or custom controller rig with a pico that can step the head on an MFM drive in patterns i can record, then model stepping to cylinder in the hard disk controller.
Now that’s attention to detail!
IBMulator has HDD sounds: https://www.ibmulator.org/
great emulator and nice guy too. maybe i should ask him if i can use his HDD sounds
Almost usable on an iPhone.
What would you say is missing or not working well?
I used to have a phone like that.
I assume it's called MartyPC because it Marty McFlies?
It is indeed a Marty McFly reference. The original demo I was trying to run was called 8088 MPH and is full of Back to the Future references.
I was trying to Run Back To The Future, so I figured I'd call my emulator either Marty or McFly.
Unfortunately I found out about the FM Towns later, so I renamed it from Marty to MartyPC so you could google "MartyPC Emulator" properly.
This comment is itself a meta comment but here we go I guess...How is it possible that half the comments in this thread are about the title itself? It’s not even a made-up title, it’s taken straight from the project’s README...I keep seeing people complaining almost aggressively that others are touting Rust as a useful tool (which, to me personally, it certainly is). Does someone have a financial stake in opposing Rust’s development, or what?
When I started writing MartyPC over four years ago, writing an emulator in Rust was still somewhat novel. The development of the 'egui' immediate-mode graphics framework made it possible to make one with an advanced interactive debugger.
By mentioning Rust people have been able to more easily find MartyPC as an example of how (or how not to) write an emulator in Rust.
Perhaps the tag as outlived its usefulness, especially if people find it pompous or something. I'm not trying to be Rust cultist, I swear.
I suppose it makes a change from complaining that the post was written by an LLM.
But if it's written in rust and with llm then they both implode and we get really insightful comments
Yet another avenue to play EGATREK in a browser. For that, its work it.
What's great about Egatrek?
Oh, holy crap. I haven't thought about EGATREK in at least 30 years. I'm going to go dig it up right now. Thanks for causing me to recall that memory!
nice
Why never seeing a title “written by C” or Java or js
"Hax – a minimalist, terminal-native coding agent written in C" https://news.ycombinator.com/item?id=49273175
but I see your point.
I believe a true engineer should love problems not only languages. But it seems like majority of Rust devs only love the language and try to convert all the problems into Rust problems.
If you have problems in C/C++? Write Rust.
If you have problems in Python? Use Rust.
If you have an issue with your product? Rewrite it in Rust.
Is your company in pinch? Launch a new product in Rust.
If you burn your finger while you’re cooking? Write Rust.
If you have a mental problem? Read a Rust book.
You don’t have a girl friend? You have Rust next to you.
If you hate yourself? Writing Rust will solve your life problems.
Because people love to propagandize
The main feature of apps written in Rust is that they are written in Rust.
"It's not a feature, it's a bug"
I flag all these “written in Rust” posts.
its just ppl trying to be different from their boring parents. wish i had enough karma to flag them too but i keep getting downvoted into oblivion for making fun of written in rust posts
I am not the OP of this post, but they're just using my github description. when I first wrote it, Rust was a novel choice for an emulator, and it helped people find examples of emulators written in Rust.
believe it or not I didn't tailor it for the HN meta
Because their following is not cult-based.
(To clarify: I like Rust. I use it every day. But this is going too far.)
Because they predate HN, and aren't hip languages any longer.
There was a time for CoffeeScript, PureScript, Elm, Ruby and whatever else you can think of.
Naturally Lisp has to have monthly entries.
/s
Because nowadays "written in Rust" means "written by AI", as Java or C are not so sexy for LLMs /s
Not really true, I've had LLMs write hundreds of thousands of lines of C just fine, including stripping out Rust deps out of projects I use. :)
the other week i wrote a program in python, and ive been thinking of upgrading my cpp knowledge from v11, wish me luck
how to use this fossil computer era ????? I cant type shhiiii
What does the "written in Rust" contribute to the title, exactly?
Not specific to this project, but nowadays when I see "written in rust" I hear "written by Claude".
When I started this emulator four years ago, this was the first PC emulator written in Rust so it was novel.
I've heard the comments here loud and clear :) You all don't think Rust is novel anymore and I should lose that bit.
"cross-platform" and Rust, as advertised in the current title/link label, is incompatible for sure. Can't get that to run on my older OS X machine nor my Amiga. :)
Yup, I have private forks where I've had Claude/Codex rip out Rust for that reason.
Early PCs weren’t written in Rust.
In C neither, despite urban myths.
Is that something people believe? I can’t say that’s a myth I’ve ever heard.
Yep, before UNIX and C there were no systems programming languages, and after getting the clay tablets from UNIX and C, all civilisation was built upon them. /s
At least when you spend long time around some programming circles.
computer, remove the extraneous slash es from the statement.
"I'm sorry, Dave, I'm afraid I can't do that"
Early PCs were made of steel which can rust
Nicely done!