<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: jjuran</title><link>https://news.ycombinator.com/user?id=jjuran</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Tue, 14 Apr 2026 10:30:30 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=jjuran" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by jjuran in "Advanced Mac Substitute is an API-level reimplementation of 1980s-era Mac OS"]]></title><description><![CDATA[
<p>I knew of Executor, but never saw it in action.  Winning back performance lost to emulation was critical when competing with contemporary real hardware, and kudos to ctm and ARDI for their clever solution.<p>Decades later, though, emulation performance is mostly a non-issue (and even improves automatically with faster hosts).  What matters now is portability (which requires ongoing maintenance) and renovation of programs designed around having the CPU to themselves (via dynamically applied patches).</p>
]]></description><pubDate>Sun, 12 Apr 2026 16:54:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=47741875</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=47741875</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47741875</guid></item><item><title><![CDATA[New comment by jjuran in "Advanced Mac Substitute is an API-level reimplementation of 1980s-era Mac OS"]]></title><description><![CDATA[
<p>A Mac 512K of sorts was already built before the Macintosh introduction at the 1984 shareholders meeting — the demo wouldn't run in 128K of RAM.</p>
]]></description><pubDate>Sun, 12 Apr 2026 15:34:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=47740947</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=47740947</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47740947</guid></item><item><title><![CDATA[New comment by jjuran in "Advanced Mac Substitute is an API-level reimplementation of 1980s-era Mac OS"]]></title><description><![CDATA[
<p>Funny you should bring up MacRelix — the very first front end for Advanced Mac Substitute was built in it.</p>
]]></description><pubDate>Sun, 12 Apr 2026 07:29:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=47736963</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=47736963</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47736963</guid></item><item><title><![CDATA[New comment by jjuran in "Dark Castle"]]></title><description><![CDATA[
<p>The latter.  There's only one heavy drinker in Dark Castle, and it's not the hero. ;-)</p>
]]></description><pubDate>Sun, 12 Apr 2026 07:05:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=47736868</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=47736868</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47736868</guid></item><item><title><![CDATA[New comment by jjuran in "Advanced Mac Substitute is an API-level reimplementation of 1980s-era Mac OS"]]></title><description><![CDATA[
<p>It's not you; it's me.  My implementation of LoadScrap() (which is called at startup) is calling FSOpen(), and it turns out the glue code for that tries OpenDF() before falling back to PBOpen().  TIL.<p>The call is coming from within the OS!</p>
]]></description><pubDate>Sun, 12 Apr 2026 05:07:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=47736295</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=47736295</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47736295</guid></item><item><title><![CDATA[New comment by jjuran in "Advanced Mac Substitute is an API-level reimplementation of 1980s-era Mac OS"]]></title><description><![CDATA[
<p>You want to talk trap patches?  Your Mac's INITs have minimal trap patches, touch the Toolbox in boring places like SysBeep() and GetNextEvent().  The Developator's Mac has big, tricky INITs with trap patches that hook into half of the Device Manager.[1]  The Developator is in touch with the metal, starts like a warm boot off the ROM reset vector, stops on an NMI.<p>[1] See <a href="https://www.macrelics.com/legacynth/" rel="nofollow">https://www.macrelics.com/legacynth/</a></p>
]]></description><pubDate>Sun, 12 Apr 2026 04:57:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=47736261</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=47736261</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47736261</guid></item><item><title><![CDATA[New comment by jjuran in "Advanced Mac Substitute is an API-level reimplementation of 1980s-era Mac OS"]]></title><description><![CDATA[
<p>A Genesis has to start somewhere. ;-)</p>
]]></description><pubDate>Sun, 12 Apr 2026 02:57:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=47735778</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=47735778</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47735778</guid></item><item><title><![CDATA[New comment by jjuran in "Advanced Mac Substitute is an API-level reimplementation of 1980s-era Mac OS"]]></title><description><![CDATA[
<p>Oh wow.  Once I saw the smiling machine and empty progress bar, I went straight to NoScript and enabled your domain without a moment's hesitation — highly unusual for me.  It's charming!  I laughed out loud when I saw your screen-saver.<p>It's familiar and alien at the same time, like I'm seeing an alternate universe.<p>I made my own web-based Mac simulator some time ago:  <a href="https://www.metamage.com/apps/maxim/" rel="nofollow">https://www.metamage.com/apps/maxim/</a><p>It was a way to become more familiar with CSS and JS (and indulge my classic Mac OS nostalgia), but my biggest takeaway was that the web wasn't a foundation I wanted to build complex structures on, and indirectly helped spur me to create Advanced Mac Substitute.</p>
]]></description><pubDate>Sun, 12 Apr 2026 02:26:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=47735662</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=47735662</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47735662</guid></item><item><title><![CDATA[New comment by jjuran in "Advanced Mac Substitute is an API-level reimplementation of 1980s-era Mac OS"]]></title><description><![CDATA[
<p>My earliest recollection of what motivated me is a desire to resurrect The Fool's Errand.<p>The irony is not lost on me. :-)</p>
]]></description><pubDate>Sat, 11 Apr 2026 21:51:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=47734336</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=47734336</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47734336</guid></item><item><title><![CDATA[New comment by jjuran in "Advanced Mac Substitute is an API-level reimplementation of 1980s-era Mac OS"]]></title><description><![CDATA[
<p>Advanced Mac Substitute uses a factored approach.  68K emulation happens in the back end, which is a collection of processes connected by Unix-domain sockets, portable to basically any POSIX system.<p>The front end deals with displaying graphics and forwarding user input to the back end.  Working front ends include SDL2 (by a contributor), X11, Linux fbdev, VNC, and five different macOS APIs (Cocoa/OpenGL, CGL, AGL, Quartz, and QuickDraw).<p>The front and back ends communicate using FIFOs and shared memory.  I'm aware that certain platforms will require refactoring all of this to run in a single process.  If Emscripten is one of them, then it won't be as simple as you suggest.<p>In any case, if I were the one doing the port, I might write a bare-bones front end just for this purpose, possibly using the fbdev one as a starting point.</p>
]]></description><pubDate>Sat, 11 Apr 2026 21:28:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=47734167</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=47734167</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47734167</guid></item><item><title><![CDATA[New comment by jjuran in "Advanced Mac Substitute is an API-level reimplementation of 1980s-era Mac OS"]]></title><description><![CDATA[
<p>Advanced Mac Substitute stores documents and preference files in sandboxed host directories.<p>For example, check out the MacPaint demo:<p><a href="https://www.v68k.org/advanced-mac-substitute/demo/MacPaint-AMS-demo.mp4" rel="nofollow">https://www.v68k.org/advanced-mac-substitute/demo/MacPaint-A...</a><p>If you were to double-click the Hello document in macOS' Finder, it would launch and open in MacPaint.app.</p>
]]></description><pubDate>Sat, 11 Apr 2026 20:50:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=47733923</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=47733923</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47733923</guid></item><item><title><![CDATA[New comment by jjuran in "Advanced Mac Substitute is an API-level reimplementation of 1980s-era Mac OS"]]></title><description><![CDATA[
<p>Correction:  68K Mac OS calls were A-line traps — in other words, they had opcodes of the form `$Axxx`.  To the processor, they're unimplemented instructions that each take an exception through the same vector.  The exception handler is the Mac OS trap dispatcher.<p>`TRAP` is a different instruction, with opcodes `$4E4x`.  Each one gets its own exception vector.<p>It's not just trap calls, though — sometimes applications write directly to the sound buffer or use hardware page flipping.</p>
]]></description><pubDate>Sat, 11 Apr 2026 20:28:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=47733744</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=47733744</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47733744</guid></item><item><title><![CDATA[New comment by jjuran in "Advanced Mac Substitute is an API-level reimplementation of 1980s-era Mac OS"]]></title><description><![CDATA[
<p>Any interaction with the Welcome application terminates it.  Try setting AMS_APPNAME=Tic-tac-toe in the environment, or AMS_APPNAME="Nyanochrome Cat".</p>
]]></description><pubDate>Sat, 11 Apr 2026 20:07:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=47733554</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=47733554</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47733554</guid></item><item><title><![CDATA[New comment by jjuran in "Advanced Mac Substitute is an API-level reimplementation of 1980s-era Mac OS"]]></title><description><![CDATA[
<p>Ah, yes, the two front ends I haven't touched in years.  This should be fun. :-)<p>You clipped the part that said "Starting VNC server on 127.0.0.1:5900".  Did you try connecting a VNC client?</p>
]]></description><pubDate>Sat, 11 Apr 2026 20:04:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=47733536</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=47733536</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47733536</guid></item><item><title><![CDATA[New comment by jjuran in "Advanced Mac Substitute is an API-level reimplementation of 1980s-era Mac OS"]]></title><description><![CDATA[
<p>The FSSpec calls added in System 7 are mostly new interfaces to existing File Manager functionality.  There's an actual high-level `OpenDF()` call, which is like `FSOpen()` except that it won't try to open a driver when the name begins with `.`.<p>Some applications call `OpenDF()` without checking its availability, but fall back to `FSOpen()` or equivalent if `OpenDF()` returns `paramErr`, which is what the parent is witnessing.  See `68k/modules/ams-fs/Files.cc` in the `metamage_1` repo.<p>If the error message is confusing people, maybe it's time to implement `OpenDF()` for real.</p>
]]></description><pubDate>Sat, 11 Apr 2026 19:48:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=47733425</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=47733425</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47733425</guid></item><item><title><![CDATA[New comment by jjuran in "Linear Address Spaces: Unsafe at any speed (2022)"]]></title><description><![CDATA[
<p>Implementing fork() without address translation <i>is</i> possible — it's just expensive.<p>In MacRelix (a POSIX-like environment for classic Mac OS), when a process calls fork(), the system allocates backup memory regions for it and its child.  Whenever one of them is switched in after its counterpart was the last of the two to run, the old one's regions are backed up and the new one's regions restored.</p>
]]></description><pubDate>Tue, 06 Jan 2026 20:52:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=46518532</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=46518532</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46518532</guid></item><item><title><![CDATA[New comment by jjuran in "System 7 natively boots on the Mac mini G4"]]></title><description><![CDATA[
<p>Rhapsody DR2 is not a solution for classic Mac OS on x86.  Lunduke writes:<p>"Unfortunately [the Blue Box] was only available on PowerPC versions of Rhapsody"<p>Another option is Advanced Mac Substitute.  It doesn't run everything, but what it does run it runs really well.  One of my goals is that you <i>can</i> use a 68K Mac application (e.g. MacPaint) as part of your personal computing workflow, if you wish.<p><a href="https://www.v68k.org/ams/" rel="nofollow">https://www.v68k.org/ams/</a></p>
]]></description><pubDate>Sat, 29 Nov 2025 15:47:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=46088414</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=46088414</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46088414</guid></item><item><title><![CDATA[New comment by jjuran in "New OS aims to provide (some) compatibility with macOS"]]></title><description><![CDATA[
<p>You're in luck:  <<a href="https://github.com/ravynsoft/ravynos/discussions/529" rel="nofollow">https://github.com/ravynsoft/ravynos/discussions/529</a>><p>ravynOS is moving to Darwin.</p>
]]></description><pubDate>Fri, 21 Nov 2025 08:02:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=46002265</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=46002265</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46002265</guid></item><item><title><![CDATA[New comment by jjuran in "New OS aims to provide (some) compatibility with macOS"]]></title><description><![CDATA[
<p>If you're okay with a System 6 appearance, I've already made one <<a href="https://github.com/jjuran/metamage_1/tree/master/68k/modules/ams-ui" rel="nofollow">https://github.com/jjuran/metamage_1/tree/master/68k/modules...</a>>, for Advanced Mac Substitute <<a href="https://www.v68k.org/ams/" rel="nofollow">https://www.v68k.org/ams/</a>>.<p>I do appreciate Alan Kay's thinking, in particular his talk "Normal Considered Harmful" <<a href="https://www.youtube.com/watch?v=FvmTSpJU-Xc" rel="nofollow">https://www.youtube.com/watch?v=FvmTSpJU-Xc</a>><p>My own high-level language, Varyx, has somewhat LISPy internals and is very dynamic — for example, you can annotate a variable with a type that's determined only at run time — and has an eval() that insulates the caller from the payload and vice versa.  You can sequester mutable state within a closure, which can't be cracked open.  Using an experimental Varyx build with some bindings for Apple's Core Graphics API, I wrote a script that rendered an arrow cursor (which I donated to the ravynOS project).<p>Perhaps we should talk. :-)</p>
]]></description><pubDate>Fri, 21 Nov 2025 06:49:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=46001886</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=46001886</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46001886</guid></item><item><title><![CDATA[New comment by jjuran in "An invalid 68030 instruction accidentally allowed the Mac Classic II to boot"]]></title><description><![CDATA[
<p>I hate to disappoint you, but the canonical way to clear a 68K address register is `SUBA.L  An,An`.  My asm-coded replacement for the Metrowerks code resource runtime uses it:<p><<a href="https://github.com/jjuran/metamage_1/blob/master/mac/toolchain/postlink-68k-standalone/postlink.cc#L281">https://github.com/jjuran/metamage_1/blob/master/mac/toolcha...</a>></p>
]]></description><pubDate>Sun, 26 Jan 2025 20:56:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=42834016</link><dc:creator>jjuran</dc:creator><comments>https://news.ycombinator.com/item?id=42834016</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42834016</guid></item></channel></rss>