Over the last few days I have been pushing forward on several fronts, and I also published a short YouTube video showing a quick installation flow for MS-DOS 3.30 and Windows 2.10: https://www.youtube.com/watch?v=EyJ-g8DnEoM
Quite a lot of time also went into MS-DOS 5.0 compatibility work, but the biggest change so far is adding protected mode support to the 286 core. At this point that work is roughly 85% complete. Because this code path has not been properly profiled yet, there is a noticeable performance drop right now, but that is something I plan to address in the next nightly releases.
Probably the biggest milestone of all is installing and correctly booting Windows 3.0, in real mode for now.

I spent a good few days on that alone. The current blocker is still protected mode and the exact LOADALL handling semantics, including some unofficial documentation around that instruction. Even though I already have LOADALL implemented, the Windows 3.0 protected-mode boot still falls into an infinite loop.
This was a bit of a move into the future, because stable Windows 3.0 protected mode was something I originally planned only for the 0.1.0 beta milestone, but I could not resist trying it earlier.
The emulator codebase has also grown enough that I had to introduce ccache on CI/CD. Building and running one full pipeline, whether on Windows or Linux, was taking roughly 15 minutes. Fortunately I have already managed to cut a few solid minutes off that.
I am also preparing a separate test suite. These will be end-to-end tests, because unit tests alone will not cover everything here. As the 286 core keeps expanding with protected mode support, regressions sometimes slip in, so I want to harden the project by running CI scenarios such as booting DOS 5.0, booting Windows 3.0 in real mode, and launching a program afterward.
Another thing that sometimes makes itself felt now is performance regression. Because of the work around 286 protected mode, quite a lot of extra emulator state tracing code has been added. Some of it is already disabled behind preprocessor directives, but I still need to profile the code properly and generate flamegraphs, because I have the impression there are still many low-hanging fruits left to collect.
We are slowly getting closer to version 0.1.0 alpha. There are still quite a few smaller bugs on my TODO list. They are not always critical, but they can definitely be annoying.
Thanks, and see you next time!