OpenNT 4.5 revisited

OpenNT 4.5 installed

It’s been a few years since Tenox had mentioned OpenNT 4.5, and in that time the project pages, repositories and well just about everything has vanished.  It seems that the hardest thing to do with OpenNT had become finding it.

Then I found this over on vetusware, and with my curiosity piqued, I thought I’d check it out.

As mentioned the first thing to do is combine the parts, and create the single 7zip file, and then extract that.

copy /B "OpenNT45(Source).z00" + "OpenNT45(Source).z01" + "OpenNT45(Source).z02" "OpenNT45(Source).7z"

Extracting that will give a simple ISO file, weighing in at 1.7GB!

While not obvious at first, there is a readme in the ISO that provides instructions on how to compile it.  Basically it boils down to a few main points:

  • xcopy the CD onto a ‘W’ drive, or subst any other drive to ‘W’ as apparently the build process requires it to be on W.  Did I mention that the CD needs to be copied onto the W drive?
  • Run the ‘setup.cmd’ file to configure the environment and get the build process ready
  • run zTESTBUILD and do a clean build.  It will run and eventually fail.
  • run zTESTBUILD again, but do not do the clean build, and it should finish
  • run \cdimg\genall to create the ISO image

So with those points basically figured out after the fact, let’s go!

The first thing to do is either create a VM to compile this in, or just xcopy and go.  The big requirement though is that it must be a 32bit version of Windows, as part of the build process requires the ability to use NTVDM.  For simplicity sake, I chose Windows 2000 server, so I could allocate 2GB of RAM, and 4 CPU cores.  During the build it doesn’t use that much memory, cores are more so important during various phases of the build that can seemingly use any and all cores, while various other parts only run on a single core.

OpenNT disk space after a build.

I chose to use a separate ‘C’ drive, and ‘W’ drive for the 2000 VM.  With no idea how much space to give it, I setup a 32GB W drive, which after the build takes up just under 4GB of space.  

With the VM installed, and the W drive formatted, and the contents of the CD copied over, it’s time to start the build.

Phase 1

So basically you just answer ‘Y’ to zTESTBUILD.cmd and it’ll do it’s thing.  For me this took about 42 minutes for this to run until it failed, as expected.

Failure building MVDM

Looking at the \binaries\nt directory there was now 1,274 files currently built.  Naturally with the failure this is not a complete build.

Starting phase 2

After this failure you then re-run zTESTBUILD.cmd but this time answer ‘No’ to the clean build.

This step took about 15 minutes to complete.


The \binaries\nt directory now has 1293 files.

Checking the binaries\nt directory there is now 1,293 files and looking at the entire directory there is 2,624 files taking up about 120MB of space.

With the OS compiled, all that remains is to create an install CD and boot it up.  running \cdimg\genall.cmd will create the ISO image.

Creating the ISO with CDIMAGE 2.47

This will compress almost all the files, and took another 15 minutes to create the CD.  After this is all done it’s just a matter of setting up a VM to run the NT45Wks.iso file.

Bluescreen bootup of OpenNT 4.5

The first thing you notice is the extra banners on OpenNT 4.5, when compared to a retail copy of NT 4.0.

OpenNT Project

And of course the different branding during setup.  One of the nice things about OpenNT is that it can format filesystems directly as NTFS, instead of the old way of first creating a FAT partition, and converting it to NTFS.  This ought to bypass all the limitations of disk/partition sizes for the older NT.

WOW Crash

Running OpenNT 4.5 on VMWare seemed to run the Win32 stuff okay, although Win16/WOW stuff immediately crashed, and MS-DOS was incredibly slow with screen redraw issues. I know that NT 4.0 builds prior to SP 6 have issues with many newer emulation/hypervisors even when CPU levels are set to regular Pentium.

MS-DOS DPMI stuff like DooM are incredibly slow, and seemingly lock up when launching.

Oddly enough the OS/2 subsystem works just fine.

So there it is, the nearly vanished ‘OpenNT 4.5’.

Compiling Microsoft Word 1.1a for Windows

A while back, Microsoft had famously released the source code to Word for Windows 1.1a (and OS/2 as well!), to some fanfare.

People were excited, but then kind of dismayed as they couldn’t really do much with it.  Oddly enough the source code release really didn’t have any notes on how to build it, although everything needed is included.  I went looking for information on how to build Word to see why it keeps doing weird things on WineVDM, and I came across this thread on betaarchive: 

https://www.betaarchive.com/forum/viewtopic.php?t=31096

Special props to yksoft1 for getting it to build in the first place, and Ringding for noticing that the OS/2 supplied compiler binaries can be re-bound to run under MS-DOS using a MS-DOS Extender.

So I went ahead and fired up Qemu and within an hour I had done it!

Word 1.1a compiled and on Windows 2.11

Well this is great fun, and all, but there isn’t a heck of a lof of people with Windows 2.x around anymore.  And of course Word 1.1a really wanted to have 2.11 or higher.  It has some hooks for what would be Windows 3.0 although I think it was much more.  Although it certainly doesn’t want to run (unmodified) under debug release 1.14.

So now that the world has gone beyond Win16 OS’s what can you do?

Well the tip of  WineVDM will run it!

Word 1.1a on Windows 10 using WineVDM

So now there is some new life for this old word processor.

Another fun thing in Word 1.1a is that it has an early implementation of MDI letting you view and work with several documents at once.  Naturally you would need a massive monitor, which we all have today.  Although people tend to just launch more than one copy of Word to accomplish this.

Early MDI

So now on my 64bit machine I can not only play with the source to Word, but I can run it at unimaginable resolutions on my modern machine!

My crappy CVS archive of old crap is now online via pserver!

So yeah HOURS of fun.  Even though the database is only a few gigabytes, it took a while to rebuild everything as ‘cvs pserver’ package for Debian runs in a chroot of /var/lib/cvsd which doesn’t play nice when your archives are all created in /var/lib/cvs .. The cvs-web VM doesn’t seem to care, but the logon process for anonymous sure does.

Anyways the following archives are online:

  • 32v
  • binutils
  • cblood
  • Corridor8
  • CSRG
  • darwin0
  • darwinstep
  • djgppv1
  • dmsdos
  • doom
  • dynamips
  • frontvm
  • gas
  • gcc1x
  • gcc2x
  • gcc130-x68000
  • gdb
  • linux001
  • linux
  • lites
  • mach
  • MacMiNT
  • MiNT
  • net2
  • nextstep33examples
  • pgp
  • plan9next
  • qemu
  • quake1
  • quake2
  • research
  • rsaref
  • sbbs
  • simh
  • TekWar
  • tme
  • truecrypt
  • uae
  • winnt
  • WitchavenII
  • Witchaven
  • xinu
  • xnu

Say you are interested in Research Unix v6, you logon to the CVS server:

cvs -d:pserver:[email protected]:/research login

And in the case of research & CSRG there is multiple modules (directories) and it’s probably best to list them to see which one you want.

$ cvs -d:pserver:[email protected]:/research ls
CVSROOT
researchv10dc
researchv10no
researchv3
researchv6
researchv6id
researchv6kw
researchv7hs
researchv7kb
researchv7ni
researchv7th
researchv8dc
researchv9

Which in this case I tried to keep it somewhat sane with each found distro with some initials when there was more than one… As always its easier to look through the web interface (for me) and then decide which one to checkout.

And then you can checkout v6

cvs -d:pserver:[email protected]:/research checkout researchv6

Of if you wanted the Emacs that was in Research Unix v9:

cvs -d:pserver:[email protected]:/research checkout researchv9/cmd/emacs

Ok, that’s great, but how about something that has all kinds of source overlaid in varous branches, like my doom repository?  First login, and then check out the default repository:

cvs -d:pserver:[email protected]:/doom login
cvs -d:pserver:[email protected]:/doom checkout doom

Now we can run this quick thing I threw together to get each of the branches.

cvs -d:pserver:[email protected]:/doom log -h | grep -P ‘^\t’ | awk ‘{print $1}’ | sort|uniq| sed -e ‘s/://g’

And now this will tell us there is the following branches:

djgppdoom
heretic
hexen
iD
jagdoom
linuxdoom
windoom

So, let’s say I want to look at the Jaguar port, with the branch name of jagdoom:

cvs -d:pserver:[email protected]:/doom checkout -r jagdoom doom

You will get errors about not having write permission into the CVS repository to set your current tag level, but that is fine, because you don’t have permission.  And now if you check the directory it’s at the Jaguar port level, as the 68000 based assembly is now in the directory:

$ ls doom/*gas
doom/decomp.gas doom/music.gas doom/p_sight.gas doom/r_phase3.gas doom/r_phase7.gas
doom/dspbase.gas doom/p_base.gas doom/p_slide.gas doom/r_phase4.gas doom/r_phase8.gas
doom/eeprom.gas doom/p_move.gas doom/r_phase1.gas doom/r_phase5.gas doom/r_phase9.gas
doom/gpubase.gas doom/p_shoot.gas doom/r_phase2.gas doom/r_phase6.gas doom/sfx.gas
$

I don’t think many will care, but well for those who do, here you go.  Anyways the web browsing from unix.superglobalmegacorp.com should be working just fine.  Although I did move a bunch of stuff around, so people who like to deep link, I guess you are kinda screwed.

WinFile comes back from the dead.

WinFile!

Yes, this WinFile.  So Microsoft apparently went through their Windows NT 4.0 source code tree from 2007, and decided to pull this tool out, and send it out into the world.  It’s available in a ‘original’ version, and a ‘v10’ version which includes the following enhancements:

  1. OLE drag/drop support
  2. control characters (e.g., ctrl+C) map to current short cut (e.g., ctrl+c -> copy) instead of changing drives
  3. cut (ctrl+X) followed by paste (ctrl+V) translates into a file move as one would expect
  4. left and right arrows in the tree view expand and collapse folders like in the Explorer
  5. added context menus in both panes
  6. improved the means by which icons are displayed for files
  7. F12 runs notepad or notepad++ on the selected file
  8. moved the ini file location to %AppData%\Roaming\Microsoft\WinFile
  9. File.Search can include a date which limits the files returned to those after the date provided; the output is also sorted by the date instead of by the name
  10. File.Search includes an option as to whether to include sub-directories
  11. ctrl+K starts a command shell (ConEmu if installed) in the current directory; shfit+ctrl+K starts an elevated command shell (cmd.exe only)
  12. File.Goto (ctrl+G) enables one to type a few words of a path and get a list of directories; selecting one changes to that directory. Only drive c: is indexed.
  13. UI shows reparse points (e.g., Junction points) as such
  14. added simple forward / back navigation (probably needs to be improved)
  15. View command has a new option to sort by date forward (oldest on top); normal date sorting is newest on top

Which is quite the list of things to add to the old WinFile.

You can find the source & binaries on github.

So the source code to the Macintosh port of System Shock was just released

It’s the ‘classic’ MacOS. And it requires Code Warrior 10 to build. Apparently its for the PowerPC only, although I haven’t tried to compile it yet, as I foolishly just upgraded to 10.5 on my PowerPC, which of course has no classic support.

Source code is on github, here.

It’s a nice present from Night Dive studios.  I know that many people are mad at their reboot being consumed by feature bloat, but at least they aren’t going down into obscurity.

As always, enjoy!

Source code to EXXOS / ERE Informatique Captain Blood not exactly released

It’s no secret that I always was fascinated with the 1988 game Captain Blood.  Last time I played it through was when I’d modified it to run with a virtual floppy drive on an Amiga 600.  While the game had been ported to numerous 8 bit and 16 bit platforms, it basically vanished into the haze that was French 80’s SciFi body horror.

But then I saw this tweet:

And sure enough I grabbed a copy of the IIGS emulator KEGS32, the ROM, an OS disk, and booted up System 6.0.1 after putting the OS disk into slot S7D1. I then mounted up the source code diskette found at brutaldeluxe.fr

Captain Blood source code release

Great right?

Well it’s a bunch of assembler files.  Ok, so when I try to open one from System 6.0.1 I get this:

Corruption

So not giving up just yet, I loaded up a program called CiderPress that can read the IIGS disk image files, and using that I was able to extract the source.

CiderPress extraction

And then I saw this gen scattered in the ASM files that were.. well honestly pretty bare of any comments.  Or sane labels.

TFBD generated externals

Which of course is the output from The Flaming Bird Disassembler, a product of Brutal Deluxe, aka where this ‘source’ came from.  Although apparently it can be re-assembled into a working executable, as Antoine had fixed it so the mouse used toolbox calls for the mouse for ROM 03.

I put the source code online in CVS.  Although I don’t think many people would care, as it’s reversed and VERY terse.

cflow

This is just me rambling……

Anyways I was looking at some source, and instead of me trying to make heads or tails of it, it’d be more fun to have the machine try to do so, and in this endeavor I thought I’d try cflow.

So let’s try something terribly simply, like the fortune program from Unix 32v:

#include stdio.h

char line[500];
char bline[500];

main()
{
        double p;
        register char * l;
        long t;
        FILE *f;

        f = fopen("/usr/games/lib/fortunes", "r");
        if (f == NULL) {
                printf("Memory fault -- core dumped\n");
                exit(1);
        }
        time(&t);
        srand(getpid() + (int)((t>>16) + t));
        p = 1.;
        for(;;) {
                l = fgets(line, 500, f);
                if(l == NULL)
                        break;
                if(rand() < 2147483648./p)
                        strcpy(bline, line);
                p += 1.;
        }
        fputs(bline, stdout);
        return(0);
}

This is a simple program, to say the least.  So running cflow gives me this:
# cflow fortune.c
main() :
    fopen()
    printf()
    exit()
    time()
    srand()
    getpid()
    fgets()
    rand()
    strcpy()
    fputs()

Simple, right?  Now let’s add in the C pre-processor, and add in the 32v include paths….
# cflow --cpp='/usr/bin/cpp -nostdinc -I../../include -I../../include/sys -I.' -n fortune.c
    1 main() :
    2     fopen()
    3     printf()
    4     exit()
    5     time()
    6     srand()
    7     getpid()
    8     fgets()
    9     rand()
   10     strcpy()
   11     fputs()

OK same thing, I can’t say I was expecting anything else.  But now let’s add in libc:
# cflow --cpp='/usr/bin/cpp -nostdinc -I../../include -I../../include/sys -I.' -n fortune.c ../libc/gen/*.c ../libc/stdio/*.c
    1 main() [main () at ../libc/gen/ttytest.c:2]:
    2     fopen() [struct _iobuf fopen (file, mode) at ../libc/stdio/fopen.c:5]
    3     printf() [printf (fmt, args) at ../libc/stdio/printf.c:3]:
    4     exit()
    5     time()
    6     srand()
    7     getpid()
    8     fgets() [char *fgets (s, n, iop) at ../libc/stdio/fgets.c:4]
    9     rand() [rand () at ../libc/gen/rand.c:9]
   10     strcpy()
   11     fputs()
   12     ttyname() [char *ttyname (f) at ../libc/gen/ttyname.c:17]:
   13         isatty() [if (isatty (( & _iob[1]) _file)) at ../libc/stdio/flsbuf.c:24]:
   14             gtty() [gtty (fd, ap) at ../libc/gen/stty.c:13]:
   15                 ioctl()
   16         fstat()
   17         open()
   18         read()
   19         strcpy()
   20         strcat()
   21         stat()
   22         close()

Isn’t that cool?  Now what does the kernel do?

I went ahead and renamed the main function call in the 32v kernel so that way it doesn’t mesh the main’s but here is the call flow:

    # cflow --cpp='/usr/bin/cpp -nostdinc -I../../include -I../../include/sys -I.' -n  fortune.c ../libc/gen/*.c ../libc/stdio/*.c ../sys/sys/*.c
    1 main() [main () at ../libc/gen/ttytest.c:2]:
    2     fopen() [struct _iobuf fopen (file, mode) at ../libc/stdio/fopen.c:5]
    3     printf() [printf (fmt, args) at ../libc/stdio/printf.c:3]:
    4     exit() [exit (rv) at ../sys/sys/sys1.c:343]:
    5         closef()
    6         plock()
    7         iput()
    8         xfree() [xfree () at ../sys/sys/text.c:127]
    9         acct() [acct () at ../sys/sys/acct.c:51]:
   10             plock()
   11             compress()
   12             writei()
   13             prele()
   14         memfree()
   15         wakeup()
   16         setrun()
   17         swtch() [swtch () at ../sys/sys/slp.c:417]:
   18             save() [if (save (u u_ssav)) at ../sys/sys/text.c:253]
   19             resume()
   20             spl6()
   21             idle()
   22             spl0()
   23     srand()
   24     getpid() [getpid () at ../sys/sys/sys4.c:120]:
   25     fgets() [char *fgets (s, n, iop) at ../libc/stdio/fgets.c:4]
   26     rand() [rand () at ../libc/gen/rand.c:9]
   27     strcpy()
   28     fputs()
   29     ttyname() [char *ttyname (f) at ../libc/gen/ttyname.c:17]:
   30         isatty() [if (isatty (( & _iob[1]) _file)) at ../libc/stdio/flsbuf.c:24]:
   31             gtty() [gtty () at ../sys/sys/tty.c:90]:
   32                 ioctl() [ioctl () at ../sys/sys/tty.c:102]:
   33                     getf()
   34         fstat() [fstat () at ../sys/sys/sys3.c:18]:
   35             getf()
   36             stat1()
   37         open() [open () at ../sys/sys/sys2.c:80]
   38         read() [read () at ../sys/sys/sys2.c:12]:
   39             rdwr()
   40         strcpy()
   41         strcat()
   42         stat() [stat () at ../sys/sys/sys3.c:36]:
   43             namei() [struct inode namei (func, flag) at ../sys/sys/nami.c:21]
   44             uchar() [uchar () at ../sys/sys/nami.c:216]:
   45                 fubyte()
   46             stat1()
   47             iput()
   48         close() [close () at ../sys/sys/sys2.c:163]

For something more aggressive, check out the QuakeWorld Server, and UAE 0.4

I found the source to Mach 2.5

And an i386 port dating back to 1989!

Browsable CVS source is on my ‘unix’ site.

Or for anyone who cares, you can download the compressed MACH_CSRG_CD.7z .

I haven’t tried to build it, but I also see SUN2/3 hardware support, lots of bug fixes from NeXT, but no NeXT hardware support.  Also the VAX platform is in there as well.

Capstone source archive

I came across this fun page, which has the source code for a variety of games from the now defunct Capstone Software company.

For a while they licensed the build engine to pump out a few games, namely:

Pretty cool!

Corridor 8 was never finished so this is more so in the Alpha stage using many DooM assets.

I haven’t had time to try them out, but I thought I’d share the links as it were.

OpenNT – Windows NT 4.5

(This is a guest post from Tenox)

Just stumbled across this: someone has forked Windows NT 4.0 and created an open source version of it. But wait, forked what? Windows source code doesn’t live on Github. Is it ReactOS? No! Upon some digging, it was apparently born from the leaked source code of NT4.0, some W2K bits and 2003 WRK.

Enter NT version 4.5:

NT45Test-2015-04-27-18-20-37More screenshots here: http://www.opennt.net/projects/opennt/wiki/Screenshots

The main project site: http://www.opennt.net/

Looking at activity the project seems to be alive and well. There is some background information and discussion going on BetaArchive for those interested.

I wonder what Microsoft has to say about this 🙂