<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Nathanael Gentry</title>
    <link>/</link>
    <description>Recent content on Nathanael Gentry</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Mon, 25 May 2026 16:47:06 -0400</lastBuildDate>
    <atom:link href="/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>No Click of Death Here!</title>
      <link>/posts/no-click-of-death-here/</link>
      <pubDate>Fri, 11 Oct 2024 07:52:00 -0400</pubDate>
      <guid>/posts/no-click-of-death-here/</guid>
      <description>&lt;p&gt;I recently had the interesting task of getting some interesting data off a 100
MB Zip
disk for my &lt;a href=&#34;https://npjg.github.io&#34;&gt;Media Station&lt;/a&gt; project. Yes, &lt;em&gt;that&lt;/em&gt; Zip. The &lt;a href=&#34;https://www.grc.com/tip/codfaq4.htm&#34;&gt;Click of Death&lt;/a&gt;
kind.&lt;/p&gt;
&lt;p&gt;Someone gave me lovely Tangent tower for free the other day - that&amp;rsquo;s another
topic - and there was a Zip drive in it. It was manufactured in 2000. I just
hoped there weren&amp;rsquo;t many hours on it. I didn&amp;rsquo;t have a spare disk to check if the
drive was good - I probably should have gotten one to test with.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Finishing up</title>
      <link>/posts/gsoc-2020/finishing-up/</link>
      <pubDate>Tue, 25 Aug 2020 22:32:00 -0400</pubDate>
      <guid>/posts/gsoc-2020/finishing-up/</guid>
      <description>&lt;p&gt;Last week was the last official week in the GSoC work period. I plan to submit
my final evaluation after I post this. There you will be able to see some of the
highlights from my time with ScummVM this summer.&lt;/p&gt;
&lt;p&gt;In the past week, though, I didn&amp;rsquo;t start work on any new features. I spent a
while understanding the data path location mechanism that the Mac version of
&lt;em&gt;Journeyman Project 2: Buried in Time&lt;/em&gt; used, and I ultimately discovered some
buried XFCNs. (As @djsrv helpfully explained, XFCNs are external functions from
(HyperCard)[https://en.wikipedia.org/wiki/HyperCard] that can often be called as
regular Lingo.) One of these just looped through all the volume names on the
system, looking for the proper CD name. This &lt;em&gt;Journeyman Project&lt;/em&gt; is split
across three CDs, so some more additions will be needed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A short week</title>
      <link>/posts/gsoc-2020/a-short-week/</link>
      <pubDate>Tue, 18 Aug 2020 23:25:00 -0400</pubDate>
      <guid>/posts/gsoc-2020/a-short-week/</guid>
      <description>&lt;p&gt;Last week, I finished implementing the direct-copy mode for our Macintosh window
manager. Now, with the Director engine, there is no intermediate blitting onto a
&lt;code&gt;screen&lt;/code&gt; surface that is then copied to the physical screen. This restored
transition speed and avoided duplicate work on every frame. Here&amp;rsquo;s the opening
of Spaceship Warlock with the new interface and transitions:&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/7S03CkwXK08?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;For a while I was stuck on implementing border transparency without an
intermediate surface, but @sev helpfully reminded me of
&lt;code&gt;g_system-&amp;gt;lockScreen()&lt;/code&gt;, which no longer has performance issues on some
systems.&lt;/p&gt;</description>
    </item>
    <item>
      <title>On the right path</title>
      <link>/posts/gsoc-2020/on-the-right-path/</link>
      <pubDate>Tue, 11 Aug 2020 11:59:00 -0400</pubDate>
      <guid>/posts/gsoc-2020/on-the-right-path/</guid>
      <description>&lt;p&gt;Hey there!&lt;/p&gt;
&lt;p&gt;Last week, I added palette support for Director 3 movies, so several more games
had their colouring issues on their opening movies resolved. Then, I spent much
of Tuesday and Wednesday fixing issues with our path-loading code that prevented
several of @trembyle&amp;rsquo;s testing titles from running &amp;ndash; no less than 7 when you account for
Windows and Mac versions. Lingo provides several ways to interact with the
filesystem. Some games asked you for a drive letter and would just loop
endlessly if they would not find the file they wanted. Others were a bit smarter
&amp;ndash; on Windows, for instance, they would look for a hardcoded file name on all
the drive letters and crash if there was no match.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fresh air</title>
      <link>/posts/gsoc-2020/fresh-air/</link>
      <pubDate>Mon, 03 Aug 2020 23:07:00 -0400</pubDate>
      <guid>/posts/gsoc-2020/fresh-air/</guid>
      <description>&lt;p&gt;Hello!&lt;/p&gt;
&lt;p&gt;This will be short, as last week was rather slow. I mostly finished shoring up
all the areas where Director palettes can be tested and set &amp;ndash; in the frame
palette channel, with the puppetPalette command, with the movie-wide default
palette, and also with the &lt;code&gt;palette of cast&lt;/code&gt; Lingo. As I look back at my
commit log, I realize that this took me many more commits than I expected. There
are still some issues that some of our new test targets, including the 1991
title &lt;em&gt;The Riddle of the Maze&lt;/em&gt;, recently revealed. As of this morning, though,
this game&amp;rsquo;s elegant artwork has been restored:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Below the surface</title>
      <link>/posts/gsoc-2020/below-the-surface/</link>
      <pubDate>Tue, 28 Jul 2020 00:07:00 -0400</pubDate>
      <guid>/posts/gsoc-2020/below-the-surface/</guid>
      <description>&lt;p&gt;This week, I worked on implementing a few Lingo commands that required some
significant backend work, but not much in the rendering code where I have spent
so much of my time. I mentioned that I had worked on a custom cursor
implementation, and I spent the first part of the week fixing bugs there. Now
cursor bitmaps like the starfish on the island are properly displayed at the
proper position, whereas after my initial work just a black box showed.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Lots of chop suey</title>
      <link>/posts/gsoc-2020/lots-of-chop-suey/</link>
      <pubDate>Mon, 20 Jul 2020 22:54:38 -0400</pubDate>
      <guid>/posts/gsoc-2020/lots-of-chop-suey/</guid>
      <description>&lt;p&gt;Hey there!&lt;/p&gt;
&lt;p&gt;My big showcase for the week&amp;rsquo;s work is a few scenes from the kids&amp;rsquo; game Chop
Suey, one of our primary Director 4 test cases:&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/kGMHHfJx8AU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;p&gt;Just a few weeks ago, Chop Suey ran at an almost unplayable crawl in ScummVM.
Part of this was its reliance on Matte inks, for which I implemented a simple
surface caching scheme and shaved about 20% off our buildbot&amp;rsquo;s target test time
for Spaceship Warlock. This also made Chop Suey run much faster, though it still
consumed CPU.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rendering my progress</title>
      <link>/posts/gsoc-2020/rendering-my-progress/</link>
      <pubDate>Mon, 13 Jul 2020 19:56:00 -0400</pubDate>
      <guid>/posts/gsoc-2020/rendering-my-progress/</guid>
      <description>&lt;p&gt;Hey there!&lt;/p&gt;
&lt;p&gt;After last week&amp;rsquo;s post, I nearly finished with the last major piece of the ink
types &amp;ndash; applying foreground and background colours on the fly. We had some idea
of when this colour-application process took effect, but deducing the rules and
working out the patterns took a while. I have gained a new appreciation for the
power of bitwise operations through this process. My next step will be extending
all this logic to other colour depths, but I probably won&amp;rsquo;t get to that this
week.&lt;/p&gt;</description>
    </item>
    <item>
      <title>That was fast!</title>
      <link>/posts/gsoc-2020/that-was-fast/</link>
      <pubDate>Mon, 06 Jul 2020 19:56:00 -0400</pubDate>
      <guid>/posts/gsoc-2020/that-was-fast/</guid>
      <description>&lt;p&gt;Another week has gone by quite quickly. After taking some time off for
Independence Day here in the US, I can&amp;rsquo;t believe that another Monday has passed.
Last week I talked about a major update to our renderer, and I finished that
pretty early last week. There was some major refactoring involved, but my work
&amp;ndash; splitting out our renderer into a Stage class and moving to traditional
dirty-rects handling &amp;ndash; worked well with some of the major refactoring that
djsrv had been wanting to do for a while. Going into this week, our engine&amp;rsquo;s
code is far more modular (thanks primarily to djsrv), and the graphics are
looking good. All this we showed off to John Henry Thompson last Thursday.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A third of the way done!</title>
      <link>/posts/gsoc-2020/third-way-done/</link>
      <pubDate>Mon, 29 Jun 2020 19:10:00 -0400</pubDate>
      <guid>/posts/gsoc-2020/third-way-done/</guid>
      <description>&lt;p&gt;Hello again!&lt;/p&gt;
&lt;p&gt;This week wrapped up the fourth week of coding, which means that there are about
8 weeks left until GSoC finishes and it&amp;rsquo;s time for me to go back to school. This
week, I spent the early part of the week fixing up our rendering pipeline. It is
fun to work on, since it&amp;rsquo;s so fundamental to the engine, but many bugs are quite
difficult to track down. A big part of this was more closely integrating
Director&amp;rsquo;s internal state memory, now kept in the Channel class that I wrote,
with the &amp;ldquo;widgets&amp;rdquo; that the window manager knows about. A tight interface with
the window manager will become essential quite soon, when we implement MIAWs
(movies in a window).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making progress</title>
      <link>/posts/gsoc-2020/making-progress/</link>
      <pubDate>Mon, 22 Jun 2020 16:03:00 -0400</pubDate>
      <guid>/posts/gsoc-2020/making-progress/</guid>
      <description>&lt;p&gt;Hey guys!&lt;/p&gt;
&lt;p&gt;I started off last week attempting to get the infamous &lt;code&gt;zoomBox&lt;/code&gt; working with the
new rendering pipeline I wrote for our Director engine. A zoomBox effect is the
classic window movement animation in classic Mac OS: When you open or close a
window, you see many spectral rectangles in between the window&amp;rsquo;s origin and
destination. Even though I haven&amp;rsquo;t seen any games actually use it, this function
was the first motivation I was given reworking the rendering pipeline. Before,
we could not look ahead into the next frame to get the dimensions of a sprite.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A busy week</title>
      <link>/posts/gsoc-2020/busy-week/</link>
      <pubDate>Mon, 15 Jun 2020 06:58:00 -0400</pubDate>
      <guid>/posts/gsoc-2020/busy-week/</guid>
      <description>&lt;p&gt;Last week, I finished up the tasks that had dragged me down, and then I moved on
to sundry other topics. Now our Director engine renders The Apartment, a demo
movie that MacroMind and later Macromedia developed for the early Directors, in
greater fidelity. One of the issues that took a while to figure out was that, in
the Director 3 version of The Apartment, GUI buttons had a special type that
were not stored in the usual place. To our engine, they just looked like regular
texts, but they were not. I also realized how tedious it is to fiddle with a few
magic numbers until the GUI elements came out looking right. I still need to get QuickDraw
shapes fully transported over to widget-based rendering, which I plan to do
later this week.&lt;/p&gt;</description>
    </item>
    <item>
      <title>In the widget weeds</title>
      <link>/posts/gsoc-2020/widget-weeds/widget-weeds/</link>
      <pubDate>Mon, 08 Jun 2020 07:52:00 -0400</pubDate>
      <guid>/posts/gsoc-2020/widget-weeds/widget-weeds/</guid>
      <description>&lt;p&gt;Last time, I promised I would give an update on QuickDraw and the Macintosh GUI
emulator. This second major part of reworking the rendering pipeline, which i
thought I could finish in the first week of coding, has taken more time and gone
deeper than I expected. When I am coding I am well aware of wasting time in
&lt;a href=&#34;https://en.wiktionary.org/wiki/yak%5Fshaving&#34;&gt;shaving the yak&lt;/a&gt;. I mentioned in our Discord the other day that I might have
experienced mission creep. Let me explain.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Settling the score</title>
      <link>/posts/gsoc-2020/settling-the-score/</link>
      <pubDate>Mon, 01 Jun 2020 21:10:00 -0400</pubDate>
      <guid>/posts/gsoc-2020/settling-the-score/</guid>
      <description>&lt;p&gt;Google Summer of Code 2020 officially started today, although throughout May I
worked regularly on the Macromedia Director engine&amp;rsquo;s rendering pipeline. In the
middle of May I replaced the long-standing frame-based renderer &amp;ndash; which redrew
the entire screen every frame &amp;ndash; with a channel-based approach. This first part
of the project brought me in touch with most of the other ScummVM Director devs,
which was a nice touch for GSoC&amp;rsquo;s Community Bonding Period.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Macromedia mysteries</title>
      <link>/posts/gsoc-2020/macromedia-mysteries/</link>
      <pubDate>Sun, 10 May 2020 21:10:00 -0400</pubDate>
      <guid>/posts/gsoc-2020/macromedia-mysteries/</guid>
      <description>&lt;p&gt;This summer, I will be helping bring the Macromedia Director engine to maturity
as my project for Google Summer of Code 2020. Tonight I found myself quite deep
in a major rewrite of the core rendering pipeline, and when I got tired of that
I decided to finally learn how to use Hugo. That&amp;rsquo;s why you are reading this now.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/about/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;When I was ten, I first started programming with QBasic. Quickly thereafter, I
switched to Visual Basic and C.&lt;/p&gt;
&lt;p&gt;When I&amp;rsquo;m not hacking away on my beloved ThinkPad 450s, I can probably be found
engrossed in &lt;a href=&#34;https://www.youtube.com/watch?v=kHXxWfSAxik&#34;&gt;Chopin&lt;/a&gt; or studying a &lt;a href=&#34;https://www.youtube.com/watch?v=7R9RA%5FBR%5Fp0&#34;&gt;Vaughan Williams&lt;/a&gt; score.&lt;/p&gt;
&lt;h2 id=&#34;computer-archaeology&#34;&gt;Computer Archaeology&lt;/h2&gt;
&lt;p&gt;I was first introduced to reverse engineering at Google Summer of Code 2020, where I worked with ScummVM
to improve the engine for Macromedia Director.&lt;/p&gt;
&lt;p&gt;Despite COVID, I learned so much at GSoC. My experiences there have defined my primary pastime for the past
few years - what I call &lt;em&gt;computer archaeology&lt;/em&gt;. I like preserving old software (usually PC games) by reverse
engineering their logic/file formats and documenting them in open-sourced code. I call this &lt;em&gt;archaeology&lt;/em&gt; there&amp;rsquo;s
lots of interesting information from computer generations past, but it&amp;rsquo;s &amp;ldquo;buried&amp;rdquo; in proprietary formats. My job is
to &amp;ldquo;dig up&amp;rdquo; this information and put it &amp;ldquo;on display&amp;rdquo; for this generation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Music</title>
      <link>/music/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/music/</guid>
      <description>&lt;p&gt;I am a collaborative pianist, accompanist, and vocalist based in northern Virginia. I regularly play for church, weddings, funerals, and other special events.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a demo of my choral accompanying:

      &lt;div
          style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
        &lt;iframe
          src=&#34;https://player.vimeo.com/video/234249423?dnt=0&#34;
            style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; allow=&#34;fullscreen&#34;&gt;
        &lt;/iframe&gt;
      &lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;And a demo of me playing piano in a musical theatre pit orchestra:
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/GXNzfgeHZZE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;
&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tech</title>
      <link>/tech/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>/tech/</guid>
      <description>&lt;p&gt;I graduated with a B.S. in Mathematics in 2021, and I have been a professional software engineer since then.&lt;/p&gt;
&lt;p&gt;If you would like to see my full résumé, please get in touch at &lt;a href=&#34;mailto:requests@natgentry.com&#34;&gt;requests@natgentry.com&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
