Wow what a change from UAE 0.1! We now have colour, mouse and keyboard input, so we can finally interact with the machine. Behind the scenes the biggest change of course was the ‘Heroic effort’ of rewriting UAE from C++ into C. It certainly made reading the code much more easier as nothing is implicit, like it is in C++.
From the changelog between versions 0.3 and 0.4:
960203 filesys.c, action_read(): Slightly more efficient code (translate Amiga address to real pointer). Moved some common code in the generate_* functions in gencpu.c to a separate function. 960202 Added an experimental fast disk option. Currently turned off by default (it's not such a big win). Attached sprite fixes (overlapping att. sprites looked bad, Katakis). Add sleep(1) before resetting the console to text mode when using SVGAlib: this might fix some screen corruption problems. Add sprite/playfield priority checking to the most important case (single playfield, no HAM). In filesys.c, do_find(): open() returns -1 on error, not zero. Return ERROR_OBJECT_WRONG_TYPE if do_find() is called for a directory (fixes Champions of Krynn harddisk installation). 960201 Don't abort if sound driver not present, just set produce_sound to 0. New files keybuf.c and keybuf.h to record keypresses in the right order and without losing any. In cia.c, force 15 scanlines between keypresses, just to be sure. unixfs.device <em>does</em> work with Kick 1.3: just don't trust what Kick 1.3 sends in the startup packet. For now, disable more than one mount per command line. Started integrating Ernesto's new Mac sources. Remove superfluous includes from some files. 960131 Added Ed's unixfs.device (great stuff). Adding ULONGs to pointers is a bad idea on the Alpha if the ULONG value really is signed. Add some casts to LONG in (pc_p + src) expressions in genpu.c. If DMACON is written and copper DMA is enabled, do a COPJMP1 at once. Helps the "Interference" demo. 960129 More SGI fixes from Ed. Bugfixes and transdisk improvements from Marcus Sundberg. Remove EXTRA_DEFINES from Makefile. Breaks some systems. Move common sprite code from pfield_doline() and pfield_doline_slow() to new function pfield_sprite(). The same sprite may appear more than once on the same line, so don't shift out the bits of sprdata and sprdatb while displaying it (Turrican I). In xwin.c and svga.c, barf if LINUX_SVGALIB doesn't match the file being compiled. Make all .o files depend on config.h in the Makefile. No need to exit if sound driver unavailable, but -S given. Small debugger fix: Missing space in output. Fix for the sprite logic: Specifically, use a state variable indicating whether the sprite has been restarted after a VSYNC. Fixes most Turrican problems. 960124 Added Denis Sablic's patch for sound run-time option. Added Ed Hanway's patch for better Makefile, X mouse cursor blanking and more SGI compilation fixes. 960123 Include options.h everywhere. Handle 8 bit GrayScale visuals like PseudoColor. Remove C++ leftovers from joystick code. 960122 When using the joystick driver, the button test must come after handle_events() in vsync_handler(). 960118 Removed all the remaining C++ comments. Changed all inline keywords to <strong>inline</strong>. Define <strong>inline</strong> if not using gcc. Make proper prototypes for everything. Compile with maximum warnings + -ansi + -pedantic. Remove CIA_cycle(), obsolete. Reimplemented the STOP optimization in newcpu.c. Removed DualCPU support in CPU emulator. Real nasty bug in pfield_doline() fixed: sprxpos could be evaluated as negative, with not-so-amusing results. (Need to rewrite this in Oberon to get array bounds checking :-) 960117 Heroic effort: Rewrote the thing in C. This might help fix some problems with users being unable to compile it. Fixed a problem in hsync_handler(): Only call flush_line() for lines in the display window, i.e. when we did a prepare_line() before. Better code for relative branches: Don't use setpc(getpc()+x) calls, increment regs.pc_p instead. 960116 Reimplemented the function to load the Kickstart ROM. Use stdio instead of fstreams since this apparently does not work on the Mac. Detect 256K Kickstarts. Detect corrupt ROM images (calculate checksum). Added Ernesto Corvi's Mac port. Changed it around a bit, so it probably won't compile. 960115 Reinstate config.h options for X screen depth, so that DrawPixel() can be inlined in custom.cc for speed. xlinebuffer is now incremented in each call to DrawPixel() (for both X and SVGAlib) to get rid of some address calculations. 960114 Fixed X generic pixel drawing routine for SHM. Still trying to fix the harddisk emulation. uae.device no longer breaks the debugger (can step through uae.device functions now) Bugs affecting performance: SPCFLAG_STOP never got reset, and DSKLEN() would set SPCFLAG_DISK even if DMA was being turned off. Made slow memory a run-time option. Defer interrupts by one CPU instruction to give programs a chance to read INTREQR ("Seeing is Believing" and "Substance" demos) Added ScrollLock hack for X, too. 960113 SVGAlib version compiles again. Fixed SVGAlib mouse bug. Fixed SHM bug: Maximum scanline is 313, not 312. Sometimes, disk.cc missed a side change and would read the wrong data. Fixed. Apparently, this was the worst compatibility problem. Implemented trace mode. 960112 Changed layout of class amigamemory a little so that gcc can generate better addressing modes. Finally wrote functions in gencpu to generate MOVEMs. 960109 Integrated Ed Hanway's patches for better X support and run-time configuration of some options. Got rid of the direct VGA memory access. (Need to do this differently). Changed the method of drawing lines: custom.cc now tells the graphics code the line number and whether it needs to be doubleed before drawing it. Added Andre Beck's MIT-SHM patch. Remove warnings for newcpu.cc. 960108 Fixed exceptions in op_illg(): Need to decrement PC. 960107 Added an "uae.device" resident module at 0xF00000. This emulates a hard disk (fixed size 8MB for now). 960106 Moved some common code from pfield_doline() and pfield_doline_slow() to a separate function. This fixes a potential HAM bug (two static vars for the same value). Sound support for Linux. Works only with graphics off and the CPU slowed down. Better SVGAlib keyboard support. 960105 Added AvailMem(), AllocMem(), AllocAbs() and FreeMem() dummies. The Hardwired demo times the multiplication instructions and prints "This demo don't like Axel" if they are too fast. Apparently, Axel has a 68040. Added a WANT_SLOW_MULTIPLY option to config.h. Fixed the fast blitter emulation (seems to work now). 960104 Fixed all the ChangeLog entries from 95 that said 96 (oops??!) pfield_may_need_update() should check whether bitplane DMA is on. Added ersatz.cc and ersatz.h. The purpose of these files is to implement one or two Kickstart functions that are commonly called from bootblocks. This should help support some games and demos that only use the Kickstart as an initial track loader. So far, it's only good enough for one program. 951223 More intelligent event handling in the CPU emulator. Slightly faster. 951222 Optimize CPU emulation by inlining cctrue(). Also, the real PC no longer needs to be incremented each instruction. The real PC value now has to be fetched by m68k_getpc(). Added direct screen access for SVGAlib, but it didn't help much. I'll probably remove it again. The gencpu executable is 2M smaller if it allocates memory dynamically. 951216 custom_bput() enhanced a little. Now remembers the value that was written in the other half of the register. Apparently, the USEx bits of BLTCON0 are ignored in line draw mode. (Silents-Demo)
At this point it really does work. However a machine of 2016 compared to 1996 is just too fast. As a result it is once more again unusable. But it makes sense that code from this era would be built to run as fast as possible, however when it really can run fast, watch out!
I found this code while trying to find other older versions and found a post about uae-0.4.hqx, as the hqx suffix denotes that this was the Macintosh port, which thankfully included all the source, and it looks like it pretty much left the source to UAE intact.
It didn’t take much to modify the xwin.c module into a suitable module for SDL, and I was able to get it running on Linux, and with a simple re-compile onto Windows. I did amputate the filesystem sharing code. I could fix it I guess, but considering the insane speed of 0.4, it really doesn’t matter. If you want to test it, simply copy a 512KB kickstart to “kick.rom” and copy an ADF diskette image to df0.adf, and start uae. Unlike 0.1 this will start right away.
It is really far too fast to actually play, just tapping enter after launching is enough to propel you into space in Frontier for example. And as you can see from the egg shape of Aster, older versions of UAE use a 1:1 pixel emulation which stretches, and distorts objects. And it doesn’t correctly detect the screen margins. I guess if it were 1996 it would be worth the time for something like SDL 2.0 where you can close the primary screen, and create another matching the needed resolution on the fly.
For anyone who cares to try my modified version of UAE-0.4 I’ve placed it on sourceforge.
If anyone has any old versions of UAE kicking around, especially any of the 0.5 releases I’d love to know. Every old version I’ve found is here.