LOOP
Microsoft Word 1.1a for Windows Goes Native x64: A Retro Port for the Ages
# Microsoft Word 1.1a for Windows Goes Native x64: A Retro Port for the Ages
When a mysterious thread titled "Word for Windows 1.1a, native x64" hit the front page of Hacker News in early 2026, the reaction was immediate: a mix of nostalgia, disbelief, and technical admiration. The post linked to a GitHub repository containing a transpiled, refactored, and rebuilt version of Microsoft Word 1.1a—originally a 16-bit application from 1989—now compiled and running natively on modern 64-bit Windows 11. No emulator. No virtual machine. Just the original binary's logic translated into modern x86-64 code, running as fast as your CPU can handle. The project is a masterclass in retrocomputing and binary reverse engineering, rekindling an essential debate about software bloat, keyboard-centric workflows, and why a 30-year-old word processor still feels snappy on hardware millions of times faster.
Released in November 1989, Microsoft Word for Windows 1.1a was the second major release of Word for the Windows platform. Designed for Windows 2.x and early Windows 3.0, it ran in 16-bit protected mode, required just 640KB of conventional RAM plus extended memory, and shipped on a few floppy disks. The whole program took less than a few megabytes on disk—an astonishing feat compared to today's bloated office suites that consume gigabytes. For many, Word 1.1a represents the golden age of word processors: fast, reliable, and focused on writing. Its interface was nearly devoid of toolbars—just a menu bar, a status bar, and a ruler. Keyboard shortcuts were everything. Alt+Backspace undid, Ctrl+F searched, and F4 repeated the last action. The program could load and save documents in a flash, even on a 12 MHz 286 processor. It is also historically significant because its file format was the ancestor of the infamous .doc binary format, essentially the springboard for the entire office software ecosystem that followed.
Word 1.1a is a 16-bit Windows application, a completely different species to modern Windows, which runs 64-bit code exclusively on x86-64 CPUs. The main obstacle lies in the architectural difference and Windows internals. 16-bit Windows applications rely on a segmented memory model. Instead of a flat 32- or 64-bit virtual address space, the CPU uses 16-bit segment selectors and 16-bit offsets to assemble addresses. Windows 2.x/3.x managed this through GlobalAlloc and LocalAlloc heaps, where pointers were often "far" or "near." Modern x64 Windows has no NTVDM (NT Virtual DOS Machine) by default. Even 32-bit (x86) versions of Windows dropped support for 16-bit apps in 2020, long after Windows 11 abandoned 32-bit operation entirely. This means that running the original Word 1.1a requires an emulator like DOSBox-X or a full virtual machine. That is perfectly fine for nostalgia, but it is not the same as running the app natively. The HN community understood this. There was no shortage of comments asking why someone would care about a native port when emulators work so well. The answer lies in the sheer technical achievement: taking a binary designed for a completely different execution model and rewriting its machine code to run natively, preserving its exact behavior.
The developer, a skilled reverse engineer who went by the handle retropc_curator, did not have access to the original source code. Microsoft certainly never released it, so the port had to be executed at the binary level. Several approaches were considered:
* **Emulation / Virtualization:** The easiest path, but not what the author wanted. Emulators introduce a performance layer and require dealing with 16-bit subsystem quirks. * **Binary Translation:** Full-system binary translators like QEMU can translate blocks of machine instructions from one architecture to another at runtime, but they still emulate a full environment, including the 16-bit Windows API. That is overkill and not truly native. * **Source-Level Refactoring via Decompilation:** The most ambitious route. The author used Ghidra and IDA Pro to reverse engineer the original executable's code and data segments, then manually reimplemented the logic in C, using modern Win32/Win64 API calls where appropriate.
This third path was ultimately chosen. The result is a hybrid: not a line-by-line translation but a semantic reimplementation that preserves the original program's logic, file handling, and rendering while running natively as a 64-bit process. The repository quickly revealed how the port worked. The key challenge was handling segmented memory. In 16-bit Windows, every module had a data segment referenced through a 16-bit selector. The original code would frequently manipulate these segments, calling functions like GlobalAlloc to obtain a handle and then dereferencing far pointers. The port used a simple but elegant solution: a global array to simulate the segment base addresses.
```c // Emulated far pointer for 16-bit segments static void *seg_base[0x10000]; static inline void *translate_far(uint32_t far_ptr) { return (char *)seg_base[far_ptr >> 16] + (far_ptr & 0xFFFF); } ```
Every far pointer in the original binary was replaced with a translate_far call during decompilation. The 16-bit near pointers (which were just offsets) were simply treated as linear addresses within a 64KB chunk. The original program also relied heavily on the Windows 2.x GDI (Graphics Device Interface). Word 1.1a used a bitmap-based UI, drawing its buttons and text through simple TextOut, Rectangle, and BitBlt calls. The port mapped those to modern Win32 GDI calls, which still exist and are surprisingly similar. In fact, the port used a shim layer for the old Windows 2.x API:
```c HANDLE WINAPI x64_GlobalAlloc(UINT flags, DWORD size) { return GlobalAlloc(flags, size); } void WINAPI x64_GlobalFree(HANDLE h) { GlobalFree(h); } ```
The actual message loop was ported with minimal fuss. The original WinMain function was reconstructed as a standard modern wWinMain that creates a window, pumps messages, and dispatches them to the original window procedure's logic. One of the most impressive feats is that the author was able to preserve the original keyboard accelerators, menu layout, and even the exact pixel-perfect rendering of the old UI. This was achieved by converting the original resource data (menus, dialogs, icons) into the .rc format that modern Visual C++ compiles. A snippet from the reconstructed resource file shows the painstaking attention to detail:
```rc BEGIN MENUITEM "&File" MENUITEM "&New...", 1 MENUITEM "&Open...", 2 MENUITEM "&Close", 3 MENUITEM "&Save", 4 MENUITEM "Save &As...", 5 MENUITEM SEPARATOR MENUITEM "E&xit", 6 END ```
The original used bitmap fonts—not TrueType—so the port also ships with the original .FON files, loaded directly. On a 4K monitor, the result is comically small, but for those who grew up on 640x480 VGA displays, it's pure nostalgia.
LOOP
LOOP
LOOP
LOOP
LOOP
LOOP
LOOP
LOOP
LOOP
LOOP