Over time I developed a number of library routines to help with the creation of various tools. For example, how do you run another program (fork/exec) on an OS designed to run one application at a time? Answer: Do something like what the OS does; relocate a small module to the top of memory, swap the current memory image to disk, adjust system pointers to simulate an empty state, trap OS calls, load and run the surbordinate program, catch the exit of that program, reload the original from disk, reset the system pointers and return back to the caller. Simple, right?
As new operating systems were introduced I had to port existing programs to new platforms, so I started bringing my tools along to help with the tasks. I added support for new system features (hierarchical file names, extended memory, far pointers) as they became available (the "swapping spawn" described above was ported to PC-DOS and MS-DOS). These tools have been compiled for 8080, Z80, 8085, 8086 and 80[12345]86 CPUs and run on CP/M, MP/M, CP/M-86, PC-DOS, MS-DOS, OS/2 and Win32 systems.
Early versions of compilers offered standard libraries that were not heavily optimized and were often large and slow. I wrote a complete standard library in 8080/Z80 assembler, cutting every imaginable corner. My floating-point emulation library outperformed every other library available by at least 5%. I ported this library to 8086 assembler shortly after the IBM PC was introduced. The tools used this library for a long time, until the 32-bit compiler libraries became good enough for me to abandon my assembler library.
When combined with other tools like dmake and various GNU packages, this package allows for nearly identical development environments on both Win32 and Unix.