Neko screen saver via QEMU

A while back I found this post on IBM of all places on making a Windows screen saver out of Qemu.

I’ve always wanted to play with this but never really got around to it.  So I figured I’d give it a shot today, and whoa what a LOT of work.  First of all back then they were using Qemu 0.72 which… sucks compared to 0.14.1!

Next things have changed a *LOT* so it did take a bit of work to get this thing to go.  I’m not terribly happy with this but the upshot is that I did manage to create a CD-ROM ISO image that can:

Boot up, load the windows 3.0 demo which then kicks off Neko!

After exiting the demo, it’ll do an APM shutdown of the VM killing Qemu and returning you back to Windows.

So yes, in effect it is a neko screensaver using Windows 3.0 & Neko from 1991.  The installation is manual, the ISO has to live in C:\ .  There is no install program, and I don’t think it works on x86_64 machines.  Also the neat Windows preview thing doesn’t work (in the small window OR full screen preview..  And full screen textmode in Qemu is broken so while it’s doing the MS-DOS shuffle you’ll get garbage until it comes up in it’s VGA glory.

I’m kind of hesitant to release this but it it’s been driving me mad.  Also the changes to vl.c are in the ISO for the 2 or 3 people that care about how to remove the madding CLI options from Qemu and perhaps either read a config file, or hardcode it what to do.

So for those of you who think you can handle it, it’s right here.


Oh and the patch is like this in vl.c

    /* second pass of option parsing */
    optind = 1;
for(;;) {
        if (optind >= argc)
        if (argv[optind][0] != '-') {
              /* Going to run as a Windows screen saver */
              full_screen = 1 ;
                data_dir = ".";
              ram_size=16*1024*1024 ;
                no_reboot = 1;
                drive_add(IF_DEFAULT, 2, "c:\\neko.iso", CDROM_OPTS);

		optind--;       //turn off the 2nd uneeded flag...?
              rtc_utc = 0;
              optind += 1 ;
                else {
            hda_opts = drive_add(IF_DEFAULT, 0, argv[optind++], HD_OPTS);

Leave a Reply