Anachro-mputing blog

retro and not-so-retro computing topics
Related links:
  • homebrew games, demos, and misc software
  • Old links
  • buy my rad t-shirts on Zazzle shirt 1 shirt 2 and miscellaneous art

  • Updates

    2019 Sep 07 updated .MOD player(s)

    three mod players: for Win32 command line, DOS (486+Sound Blaster), and 32X (a ROM image). Also included is NOWUT source, a guide to the .MOD file format, and one music track.

    2019 Aug 13 NOWUT version 0.20 release

    Many changes. MULTINO and LINKBIN can be built and run on Amiga, X68000, and 16-bit DOS, in addition to Win32. (Note that PE files still can't be linked without GoLink.) The compiler can run two passes for the purpose of optimizing some jumps/branches to short versions.

    A new example program, DISTG, can also be compiled for several platforms by linking to the same platform I/O modules. This is a simple Hu6280 disassembler.

    Check the documentation. Download the complete archive.

    And be sure to get Go Link from Go Tools website.

    2019 Jul 20 updated .MOD player

    a mod player for Win32 command line, now with bug fixes and improved audio (contains source and executable)

    2019 Jun 24 False Alarm...

    Boo :(

    Never mind! ^_^

    2019 Jun 1 SH2 benchmarking on 32X and Saturn

    from my post on sega16 forums:

    2019 Jun 1 Fooling with KiCad 4.0.7 on Win2K

    So far I've made a schematic and begun laying out a board. The UI is a bit alien and takes some getting used to. And then there's the mind-boggling "libraries" system... if you need to add a component or edit a foot print, be sure to RTFM and follow the instructions step-by-step, otherwise it will not make any sense. But after overcoming those hurdles I am actually getting stuff done (whether my circuit works is a different question).

    2019 Jun 1 a few more things about Win2K

    Some recent game releases on GOG are including a GOG Galaxy DLL file (with the non-Galaxy version of the game) which calls the kernel32 function QueryFullProcessImageName. This function doesn't exist in Win2K and will cause the game to fail with an error. Older versions of BWC's Extended Kernel did not add this function or had it disabled by default, but as of version 3.0b of Extended Kernel this function is now available. So even more games will run!

    Installing the Extended Kernel has some prerequisites, and along with all the other updates available, the process of bringing a fresh OS install up to speed can be tricky. After some trial and error, I've determined that this method should work:

  • begin with Win2K SP4
  • install unofficial service pack 5.1 (USP51.ZIP) (this contains some IE updates that are needed later, even if you have no intention of using IE)
  • install Windows2000-UpdateRollup2-x86-ENU.exe (or your language version if you can find it)
  • install IE6.0SP1-KB2722913-WINDOWS2000-X86-ENU.EXE
  • now Extended Kernel can be installed

    directx:

  • install the February 2010 release of DirectX 9
  • get the June 2010 (final) release of DirectX 9. This won't install but you can extract the files and manually add ones that are missing.
  • add D3DX9_43.DLL, D3DX10_43.DLL, D3DX11_43.DLL, D3DCompiler_43.dll, d3dcsx_43.dll, XAPOFX1_5.dll
  • xinput DLLs (can't remember where these are found, but they can be added to a game's own directory)
  • add the following files and execute the commands to register them (whatever that means)
    regsvr32 xactengine2_0.dll
    regsvr32 xactengine2_1.dll
    regsvr32 xactengine2_10.dll
    regsvr32 xactengine2_2.dll
    regsvr32 xactengine2_3.dll
    regsvr32 xactengine2_4.dll
    regsvr32 xactengine2_5.dll
    regsvr32 xactengine2_6.dll
    regsvr32 xactengine2_7.dll
    regsvr32 xactengine2_8.dll
    regsvr32 xactengine2_9.dll
    regsvr32 xactengine3_0.dll
    regsvr32 xactengine3_1.dll
    regsvr32 xactengine3_2.dll
    regsvr32 xactengine3_7.dll
    regsvr32 XAudio2_0.dll
    regsvr32 XAudio2_1.dll
    regsvr32 XAudio2_2.dll
    regsvr32 XAudio2_3.dll
    regsvr32 XAudio2_4.dll
    regsvr32 XAudio2_5.dll
    regsvr32 XAudio2_6.dll
    regsvr32 XAudio2_7.dll

    nVidia drivers:

  • the last official release appears to be 182.46_quadro_winxp2k_english_whql.exe which supports some rebadged Quadro versions of early DX10-level GeForce cards, eg. 8400GS, 9500GT, and even GTX 280
  • once kernelex is installed it becomes possible to use WinXP drivers up to 258.96 which supports GTX 480, GTX 460, and previous generation cards.
  • BWC's website has a modified version of 310.xx which supports GeForce 6xx series cards. I couldn't get the nVidia control panel to work with this release (makes it very difficult to use multiple monitors), however the stability and compatibilty with newer games appears to be superior.

    Radeon drivers: BWC's site has several versions of Radeon video drivers that work with Win2K. I use Catalyst 11.7 because the later versions are buggy on my system. This supports most of the Radeon HD 6000 cards and earlier. It includes OpenGL 4.1 support. Catalyst control center works as long as dotnetfx is installed. Unlike with the nVidia drivers, hardware-accelerated video playback does not work (but 1080p should be no problem for VLC 2.08 with a dual-core anyway)

    other stuff to install:

  • dotnetfx - there is a netfx4w2krc3.exe on BWC's site although when I ran this installer it got stuck in an infinite loop so I'm not sure if it was entirely successful. IIRC, before that I had NETFx20SP2_x86.exe installed. (update: there is also a NetFX35W2KEX.exe)
  • video/audio codecs...
  • MyPal, Opera 12.18, and/or otter-browser...
  • PPSSPP version 1.3, Avidemux 2.6, Foxit Reader 4.x or 5.4...
  • MSVC redistributables... the latest ones may not install on Win2K but you can manually add the files.
    07/12/2009  12:02 AM           569,664 msvcp90.dll
    07/12/2009  12:02 AM           653,120 msvcr90.dll
    07/12/2009  12:05 AM           225,280 msvcm90.dll
    03/18/2010  01:16 PM           771,424 msvcr100_clr0400.dll
    12/13/2011  06:39 PM           768,848 msvcr100.dll
    12/13/2011  06:39 PM           421,200 msvcp100.dll
    02/07/2012  07:12 PM            56,832 msvcirt.dll
    04/19/2013  02:06 PM           875,472 msvcr110.dll
    04/19/2013  02:06 PM           535,008 msvcp110.dll
    04/22/2015  05:18 PM           353,360 msvcrt.dll
    03/23/2018  01:09 PM           457,512 msvcp140.dll
    07/12/2018  02:16 AM           970,912 msvcr120.dll
    07/12/2018  02:16 AM           455,328 msvcp120.dll
  • 2019 May 15 IMGTOOL version 0.95 release

    Several changes to the auto-palettizer, and some other random stuff. Download the new archive.

    2019 May 11 NOWUT version 0.14b release

    Multino has had various bugs from 0.14 fixed. Download the new archive.

    Also, Here is a .MOD player (win32 command line).

    2019 May 1 NOWUT version 0.14 release

    This release combines NOWUT, NO68, and NOSH2 into a single compiler that supports all three CPUs (four? three-and-a-half?). 8086 support is complete, and there are small improvements to 68K and SH2. There is a JPEG decoder example program for the Amiga. Some old stuff has been removed from the archive (old archive links are still good if you need those).

    The compiler compiles itself in 6 seconds on a 100MHz 486. I tested a modified version compiled as 8086 code (not yet included in the release) which took about 11 seconds. That's not too bad for a 16-bit CPU pretending to be 32-bit?

    Check the documentation. Download the complete archive.

    And be sure to get Go Link from Go Tools website.

    2019 Apr 30 Amiga 2000

    After struggling with this system off and on over the course of many months, it finally seems to have reached a fully functional state. (Minus the RTC which hasn't had a battery in decades, but who cares about that.)

    The current configuration:

  • GVP A3001 with 68030/882 at 50MHz and 12MB of RAM
  • GVP HC+8 SCSI controller with 2MB of zorro-2 RAM
  • 270MB Quantum HDD
  • 2MB chipmem upgrade
  • deinterlacer/VGA upgrade

    Years ago it became increasingly unstable and I put it away. After digging it out again, and a bit of soldering, cleaning, and reseating of ICs it was able to reliably boot to the purple checkmark screen at least, but not beyond that. With the SCSI card installed it would either show a blinking power LED, complain of a faulty expansion board, or freeze while attempting to load workbench. An IDE HDD connected to the A3001 worked for a time and then died. I spent some time creating my own bootable disk image and writing it to another IDE HDD but this one was only able to boot occasionally (checksum errors). Then one of the two working SCSI HDDs that I had died.

    Eventually I got it to boot by disabling the RAM on the SCSI card and relocating the fast RAM on the A3001 RAM32 board to the sub-16MB space, a thing that I did unintentionally as a result of changing jumper settings. The function of some jumpers on this revision of the board turned out to be different than specified in the documentation I found on the web,

  • When J5 on the RAM32 board is closed it locates the memory in the sub-16MB space, while also limiting memory size to 4MB. With the jumper open, all the memory becomes available at $1000000. This board has always had three 4MB SIMMs installed since I got it, in the top three slots. No 1MB SIMMs are present or necessary.
  • J15 on the CPU board can be used to disable the boot ROM and speed up the booting process when no IDE HDD is being used. However, disabling the ROM means that the A3001 RAM is not recognized by the OS anymore. It's better to use J18 to disable the IDE instead.
  • J7 on the CPU board cuts the CPU clock in half. The interesting part about this is that the FPU keeps running at 50MHz, and further more the DRAM continues to run at the same speed. In other words the memory latency is greatly improved in relative terms. AIBB reports a latency of 7.1 at 50MHz, but only 3.3 at 25MHz. Benchmark results are somewhat lower but certainly better than half and also better than a stock A3000. Too bad we couldn't run at the full 50MHz with that kind of memory latency eh?

    For unknown reasons, OS 3.9 would not boot without "fast" RAM in the zorro-2 space. So my next step, wanting to use all 12MB on the A3001 again, was to determine why the HC+8 wouldn't behave when its memory was enabled. This came down to trying different SIMMs until it worked. It liked the 3-chip modules better than the 9-chip ones apparently.

    Now it's time to test some Amiga programs compiled with NOWUT (they work, yay!) and run some old scene demos.

  • 2019 Mar 30 Displaying images on the 16-bit Sega

    Here is a photo resized to 320x200 with some fancy color remapping and F-S dithering.

    Here it is on a CRT connected to the Genesis w/ composite video. It uses two layers to get 31 colors available anywhere. (click image for larger version)

    2019 Mar 23 NOWUT version 0.13 release

    This release adds experimental 8086 support. The dreaded segmented memory model has not yet been dealt with, so addressing is limited to 64KB. (Of course, inline assembly code can always modify segment registers itself.) However, the lack of 32-bit ALU is masked by the compiler which does 32-bit operations anyway. For instance, an addition compiles to an ADD AX,lowword > ADC DX,highword and then AX and DX are stored sequentially in a dword variable. This is a trade-off which sacrifices code efficiency in favor of convenience/compatibility.

    Two more example programs were added. Here is the complete list:

  • Amiga 68K (plays a sound sample)
  • DOS 16-bit (JPEG decoder)
  • DOS 32-bit (JPEG decoder)
  • Sega 32X (JPEG decoder)
  • Sega Genesis (JPEG decoder)
  • Sega Saturn (JPEG decoder)
  • Sharp X68000 (JPEG decoder)
  • Win32 (JPEG decoder)
  • Win32 (OpenGL renderer)

    Check the documentation. Download the complete archive.

    And be sure to get Go Link from Go Tools website.

  • 2019 Feb 24 NOWUT version 0.12 release

    This release contains bug fixes for NOSH2 and NOWUT, x87 FPU assembly support, and an OpenGL 3.2 demo.

    Check the documentation. Download the complete archive.

    And be sure to get Go Link from Go Tools website.


    2019 Feb 2 Amiga harddisk image utility

    Here is the utility I constructed to make a bootable disk image for my GVP A3001 IDE interface. It's a Win32 executable (with NOWUT source) and includes a dump of the startup "LSEG" code from the original harddisk. I don't really know what this code does or where it comes from, but it's needed for booting. When creating a disk image, it's automatically copied over.

    example:
    MAKEHDF seagate.hdf 1001 15 34

    After the disk image is created it can be mounted in WinUAE and an icon will appear in Workbench. It can then be formatted and have WB files copied over. Finally, the image needs to be byte-swapped (use the included HDSWAP) and written to a disk.

    Finding drives that work with the A3001 may be the biggest challenge. I tried the WD, a 200MB Toshiba, and a 2GB Transcend card which all failed to boot.

    2019 Jan 26 The web browser from 2004 that's better than anything from this decade.

    I will attempt to explain one of the reasons I've become disillusioned with the web by showing how awesome a browser could be, and was, before developers went mad.

    Here is a screenshot from Opera 7.54 (registered version).

    As you can see, it has real menus, with words and everything. There is an email/USENET reader built-in, and an IRC client, if you need those things.

    Look what happens if you press F12. You can disable JavaScript without having to download an extra program for that sole purpose.


    Now check this out. See how the link text is highlighted? That's because I pressed shift+down and selected that link. Keyboard controls can be used for nearly everything, a mouse is not needed. Then I pressed the context menu key. Look at the options that became available. New page, new window, background page, background window, download, copy link, and more.

    Of course, having multiple pages open in separate tabs was already old hat. In addition to opening the new page however you please, you can duplicate an existing tab. Let's say you see something interesting, but it's a little too long to read right now, and you need to look at some other items first. Just duplicate that tab and leave the dupe there for later. No need to copy and paste a URL or wait for the page to load again. You can also save your current roster of tabs as a "session" and reopen all of them again later, or next time you start the browser. There is a menu option and keyboard shortcut to reload all the open pages.

    I can browse photos in a local directory. I can zoom out on those big images, and hit F11 for a full screen view with plain, black border (if any). The image can be resized using a proper algorithm instead of nearest-neighbor ugliness (this is OS dependent). Then I can use the back/forward buttons, or their keyboard or mouse-gesture equivalents, to cycle through all of the photos in the directory.

    Now maybe the menus and toolbars were missing something important, or they took up too much space and had too many unneeded buttons. You can change it, easily.

    You can literally click-and-drag the buttons you want to the place you want them.


    Each one of the categories has additional options to pick from.

    I rearranged by buttons, now do I want toolbars at the top or bottom?

    I can change fonts and a million other things too. It's all accessible through the GUI, no need to use the registry-like about:config page.

    I'm sure I've left out many things, but this is a good start at least.

    2019 Jan 19 Amiga hacking

    So I wanted to test some of my NOWUT demo code on my dusty old Amiga 2000. Years ago the machine had become very tempermental and I had lost interest in it. Then last year I reflowed some solder joints and reseated the 68000 and got it to boot once again.

    However it would not boot from the 2GB SCSI HDD that I used to use. I don't know why, and since I have no compatible SCSI interface to connect the drive to a PC, I have no way to investigate.

    I was left with only the 80MB Quantum HDD that I received along with the GVP A3001 CPU board. It connects to its built-in IDE interface. And now that drive is on its last legs.

    Having a computer that can't do anything for lack of bootable media is always an annoying situation to be in. When you have another computer nearby, usually its possible to "jump start" something, but it depends. When I got an Apple IIGS, all I had to do was load DOS 3.3 over a null modem cable and go from there. If a PC won't boot, I can take the harddisk out and connect it to a USB-IDE adaptor. When I got a 68k Mac with a dead HDD, I could not find any instructions on how to get it going again, so it had to go on the junk pile.

    In any case, if I were designing a computer I would definitely put a disk partitioning utility, hex/sector editor, and terminal program into ROM to make things easier.

    As for my A2000, it at least has an IDE interface, and I still have my old Amiga files backed up on my PC. The GVP A3001 IDE is said to have poor compatibility, but I have several old drives to try on it. Another important detail to know about it is that it swaps the upper and lower bytes when it reads/writes the disk.

    The first thing I tried was to create a bootable hardfile (.HDF) in WinUAE and write it to a Western Digital Caviar 1170. So how do you do that? Well, WinUAE is a bit clunky in this regard, but it is possible. First I created a blank HDF. It doesn't let you specify the exact size, it only asks for "MB" and I wasn't sure whether it used real megabytes or base 10 ones, so I put in 171. That ended up being a bit oversize, but it doesn't matter.

    Hit full RDB and manual geometry and put in the CHS values. You might need to exit this dialog and start again, it's a bit confusing.

    The next step was to put some files in it. I booted WinUAE and ran HDtoolbox. Now, I'm not sure if this is something I used to know and had forgotten, but running HDtoolbox only gives you a blank window with grayed-out buttons unless you start it with a secret command line argument. That argument needs to be the name of a device, in this case uaehf.device

    hdtoolbox uaehf.device

    I partitioned. I formatted. I copied over some backed up workbench files from a PC directory. I tested whether I could boot this HDF with WinUAE. It worked.

    Then I attached the WD1170 to the secondary IDE port of my old Athlon XP and wrote 333,300 sectors from the HDF file using Roadkil's Sector Editor.

    I connected that to the Amiga. But it went to the insert disk screen. FAIL.

    I'm not sure if that disk image WOULD have worked... But my later experiment proved that the WD1170 is simply not useable with the GVP A3001.

    So at this point I took a different approach. After disconnecting the 1170 from the Athlon system, I connected the old 80MB Quantum drive again. (Bet you didn't know you could hot-plug IDE drives under Windows 2000!) Previously the drive had been making a lot of clunking noises and refusing to read certain sectors. But I tried again to dump it, using Roadkil's Sector Editor. I was able to get a complete dump with minimal clunking. It turns out that a large portion is corrupt, but I at least got the first track, and a substantial amount of the second partition (it was divided into two 40MB partitions).

    I kept thinking "what if I just write this dump to another disk and plug it in?" The only problem was that the Quantum drive had 965 cylinders, 10 heads, and 17 sectors, while the 1170 had 1010 cylinders, 6 heads, and 55 sectors. The geometry didn't match up, and it would never work if the system expected 10 heads and had only 6. But I looked around and found a 260MB Seagate with 1001 cylinders, 15 heads, and 34 sectors. Aha!

    I connected the Seagate to the Athlon XP and set the parameters in the BIOS to match the Quantum drive. Then I booted to DOS. I couldn't use Windows 2000 because it bypasses the BIOS for disk access, and would surely discover the real geometry. I needed the computer to think that the CHS values were the Quantum ones, so that the disk image gets written out the way I want it to. I used Norton Diskedit for DOS to write the image. It was INCREDIBLY SLOW, for unknown reasons. Took about 3 hours to write 80MB.

    But when I connected this drive to the Amiga, it did something! Because of the aforementioned corruption in the Quantum dump, it didn't boot Workbench, but after some error messages it did land on a "1" prompt. Now, I'm not an expert on Amiga DOS, but miraculously I was able to deduce that the reason I couldn't run "dir" was because it's an external command, located in the "c" directory. I remembered the name of the second partition, so I went there. Did a "cd c" and then I could use "dir" AMAZING! It WORKS! (sort of). The next thing I did was run hdtoolbox and try to see what was up with the first partition. It said it needed to update something. But after it did that, then the Amiga would no longer boot. Hmmm...

    Having proved that the A3001 could read this Seagate drive, I wanted to get a better disk image put together that wasn't all corrupt and stuff. I found some info about the Amiga RDB, Partition block, and filesys block on the www.amigadev.elowar.com site. I found some more details on the Amiga OS Wiki. And I started writing a program to generate disk images with custom geometry, while keeping everything as close as possible to how it was layed out on in the Quantum dump, in case there are any peculiarities there that the GVP card depends on.

    After several hours of monkeying around, I was able to generate images which would appear in WinUAE, where I could then format and copy files. Then I could write the image to a harddisk and try it on the A2000. (And let's not forget to swap the byte order in the image first!)

    It was at this point that I concluded that the WD1170 simply would not work with the GVP A3001. But I got the Seagate to boot to WB 3.1. However it seems that this setup isn't 100% reliable. While it does boot and run stuff, checksum errors are a regular occurence (hitting retry does the trick) and I suspect that if I were to try to write anything to the disk it would go horribly wrong.

    My utility to create HDFs from nothing still needs work. But after everything that I went through to resurrect the A2000 I was able to run a terminal program, download the NOWUT demo code into RAM: and execute it. And it worked :)

    2019 Jan 19 NOWUT version 0.11b release

    This release contains bug fixes for NO68, NOSH2, and LINKBIN.

    Check the documentation. Download the complete archive.

    And be sure to get Go Link from Go Tools website.

    2019 Jan 2 NOWUT version 0.11 release

    Here's an update to the self-hosted NOWUT compiler. Bug fixes, new linker, new DOS example program...

    Check the documentation. Download the complete archive.

    And be sure to get Go Link from Go Tools website.

    2018 Dec 15 cache policy

    A write-through cache can only speed up reads, as writes still result in a bus cycle (and avoids potential issues with "old" data in DRAM being accessed by another CPU/device). 486DX, 68020, etc. used write-through.

    With a write-back policy, writes can be stored in the cache instead of going to the bus. The cache line containing the modified data eventually gets written to DRAM when it is retired. However, when a write addresses a memory area which is not currently represented in the cache, two things can happen. Either it can be treated as a write-through (486DX4 uses this scheme if I'm not mistaken), or the relevant memory can be first read into the cache. The latter is called allocate-on-write and is used on 68040 and newer x86 CPUs (it's optional on Cyrix 6x86).

    Allocate-on-write can result in a degradation of performance when large data blocks are written. Data from the destination area of DRAM crowds out other data in the cache, and even if it is read later (data written to a video card frame buffer may not ever be read by the CPU) it is likely to still result in a miss.

    The improved efficiency of transferring an entire cache line at once in a burst, instead of accessing DRAM one word at a time, can mitigate slow-downs resulting from allocate-on-write while maintaining the advantages. Some socket 7 chipsets (eg. Via VP, MVP) don't do write bursts.

    If large data blocks are written one byte at time, rather than using 32- or 64-bit words, the reduced number of bus cycles using allocate-on-write may save more time than is lost by doing pointless reads before hand.

    A scheme called write-gathering or write-combining is used in specific circumstances (eg. video card frame buffer memory) to hold sequential writes in a buffer, without reading any data first, and then execute one large write.

    With all that being said, my idea is this. Maybe the decision on whether to allocate-on-write or not could take into account the size of the write. Eg. write-through (or combine) for 32-bit words, allocate for bytes. Large block copies would tend to use the larger size for speed. (Perhaps this has already been implemented.)

    2018 Dec 10 IMGTOOL version 0.94

    New version of my bitmap editor IMGTOOL. Has a lot of loose ends at the moment, but also many new features like tile/pixel editor modes. Time for a release! Includes FreeBASIC source and DOS/Win32 executables. Download the complete archive.

    2018 Dec 4 NOWUT compiler released

    This is the first release of the NOWUT cross compiler for the low-level NOWUT language. It runs on Win32 and targets x86, Amiga 68K, X68000, Sega 32x and Saturn. Check the documentation. Download the complete archive.

    And be sure to get Go Link from Go Tools website.


    2018 Dec 1 delayed immediates

    RISC CPUs sometimes employ a delayed branch, where the instruction immediately after the branch instruction is always executed, hence avoiding some disruption of the pipeline.

    RISC CPUs also tend not to allow immediate data (data following the opcode) to be used as operands. This is regrettable from a programming standpoint, and seems like it would be a mixed-bag from a performance standpoint, since a memory access has to occur somewhere else to load that data. So... what if, like a delayed branch, we had delayed immediate data? You could load a DWORD into a register with one instruction, but the data could go further down the stream.

    To be more specific, imagine that your CPU used a general purpose register as the program counter (eg. R15), and that you had a post-increment register-indirect addressing mode available to commonly used instructions. Loading from (R15+) would be the same thing as loading immediate data conceptually. You just have to assume that R15 was pointing at the location following the opcode, and that the post-increment would cause it to skip over the data before the next instruction fetch. Those assumptions wouldn't hold on a pipelined CPU, but perhaps the "delayed immediate" would make the situation workable, by lining up the data load and the "skip" with the proper pipeline stage of the opcode that needed it.

    2018 Apr 14 video card framebuffer memory bandwidth

    From my post on VOGONS:

    486DX4-100, Trident 8900 ISA - 5.4MB/s
    486DX4-100, Trident 9440 VLB - 31MB/s
    Pentium II-350, i440BX, Trident 9680 PCI - 38MB/s
    Pentium II-350, i440BX, Trident 9680 PCI - 62MB/s (write combining enabled)
    Pentium III-600e, i440BX, GeForce FX5200 AGP - 47MB/s
    Pentium III-600e, i440BX, GeForce FX5200 AGP - 240MB/s (write combining enabled)
    Pentium M-1200, i855PM, Radeon 7500 AGP - 50MB/s
    Pentium M-1200, i855PM, Radeon 7500 AGP - 169MB/s (write combining enabled)
    Athlon XP, ViaKT333, GeForce FX5700 AGP - 83MB/s
    Athlon XP, ViaKT333, GeForce FX5700 AGP - 192MB/s (write combining enabled)
    Phenom II, AMD770, Radeon 5670 PCIe - 189MB/s
    Phenom II, AMD770, Radeon 5670 PCIe - 2500MB/s (write combining enabled)
    

    These tests use the REP STOSD instruction to fill video memory with a constant. My guess is that the higher AGP 4X/8X speeds aren't enabled under DOS, since I haven't seen any AGP system beat this 440 board. (The Pentium M and Athlon are AGP 4X)

    2018 Mar 18 SuperPi

    From my post on VOGONS:

    Athlon II X2 260 (3.2GHz, DDR2-800 CL5) - 25s
    Athlon X2 7850 (2.8GHz, DDR2-800 CL5) - 28s
    Core2 SU9600 (1.6GHz, 1.8GHz turbo, DDR2-667) - 34s
    Athlon X2 4850e (2.5GHz, DDR2-800 CL5) - 36s
    Turion X2 1.6GHz (DDR2-667) - 57s
    Athlon XP 2800+ (2083MHz, KT333, DDR-333 CL3) - 1m
    Athlon XP 2500+ (1833MHz, KT333, DDR-333 CL2) - 1m1s
    Sempron 2300+ (1583MHz, KT333, DDR-333 CL2) - 1m15s
    Pentium M 1MB 1.0GHz (i855pm, DDR-266) - 1m25s
    Pentium M 2MB 1.2GHz (i855pm, DDR-266) - 1m4s
    Pentium M 2MB 1.2GHz (i915gm, DDR2-400) - 1m1s
    Pentium M 1MB 1.7GHz (i855pm, DDR-333) - 56s
    Pentium M 2MB 1.6GHz (i855pm, DDR-333) - 53s
    Pentium 3 933MHz (PC-133) - 2m17s
    Pentium 3M 800 (i830gm, PC-133 CL2) - 2m35s
    Pentium 3M 1333MHz (i830gm, PC-133 CL3) - 2m20s
    Pentium 3M 1333MHz (i830gm, PC-133 CL2) - 2m06s
    Pentium 3M 1333MHz (i830gm, PC-133 CL2) - 1m57s (screen mode at 800x600x16 instead of 1024x768x32)
    Pentium 3 600e (PC-100) - 3m21s
    Pentium MMX 166 (256KB L2) - 15m2s
    

    2018 Jan 16 some old 3DMark2001SE benchmarks
    Socket 5 (Packard Bell C 115, i430VX chipset, Win98)
    Pentium MMX Overdrive 200, GeForce 2MX 200 PCI = 290 3dmarks
    
    Socket 7 (Shuttle HOT-591p, VIA MVP3 chipset, 512KB cache, Win98)
    IDT Winchip 200, Radeon 9200 = 892 3dmarks
    Pentium 166 at 188, Radeon 9200 = 1071 3dmarks
    Cyrix M2 PR400 (285MHz), Radeon 9200 = 1535 3dmarks
    K6-2 380, Radeon 9200 = 1891 3dmarks
    K6-3 380, Radeon 9200 = 2304 3dmarks
    K6-3 380, GeForce 2 GTS = 683 3dmarks
    K6-3 380, Matrox G250 (800x600) = 308 3dmarks
    
    Slot 1 (Intel SE440BX2, PC100 CL2 SDRAM, Win98)
    Pentium 3 600e, SiS 6326 (640x480) = 203 3dmarks
    Pentium 3 600e, S3 Savage 4 (16-bit color) = 870 3dmarks
    Pentium 3 600e, nVidia TNT (800x600) = 976 3dmarks
    Pentium 3 600e, S3 Savage 2000 (16-bit color) = 1098 3dmarks
    Pentium 3 600e, Voodoo 3 3000 (16-bit color, unofficial drivers) = 1243 3dmarks
    Pentium 3 600e, GeForce 4MX 420 = 2495 3dmarks
    Pentium 3 600e, GeForce FX 5200 64-bit = 3100 3dmarks
    Pentium 3 600e, GeForce FX 5700LE = 4438 3dmarks
    Pentium 3 550, GeForce FX 5200 64-bit = 2785 3dmarks
    Pentium 3 550, Radeon 9200 = 3530 3dmarks
    Pentium 2 350, Radeon 9200 = 2643 3dmarks
    
    Socket 370 (i815 chipset, Win98/2k)
    Celeron 533, GeForce 2 GTS = 1381 3dmarks
    Pentium 3 733, nVidia TNT (800x600) = 1011 3dmarks
    Pentium 3 733, nVidia TNT2 M64 (800x600) = 1162 3dmarks
    Pentium 3 733, Matrox G450 (800x600)= 1150 3dmarks
    Pentium 3 733, Matrox G450 = 896 3dmarks
    Pentium 3 933, i815 integrated (16-bit color) = 660 3dmarks
    Pentium 3 933, GeForce 2MX 200 = 1533 3dmarks
    Pentium 3 933, GeForce 4MX 420 = 3213 3dmarks
    Pentium 3 933, GeForce 2 GTS = 3106 3dmarks
    Pentium 3 933, GeForce FX 5200 64-bit = 3794 3dmarks
    Pentium 3 933, Radeon 9200 = 5059 3dmarks
    Pentium 3 933, GeForce FX 5700LE = 5230 3dmarks
    
    Socket A (Biostar M7VIP-pro, VIA KT333 chipset, DDR333, Win2k)
    Sempron 2300+ (1583MHz), nVidia TNT2 M64 (800x600) = 1884 3dmarks
    Sempron 2300+ (1583MHz), GeForce 2MX = 2913 3dmarks
    Sempron 2300+ (1583MHz), GeForce 4MX 420 = 3450 3dmarks
    Sempron 2300+ (1583MHz), GeForce 4MX 420 195MHz RAM = 3900 3dmarks
    Sempron 2300+ (1583MHz), GeForce 2 GTS = 4171 3dmarks
    Sempron 2300+ (1583MHz), Radeon 9200 = 6666 3dmarks
    Sempron 2300+ (1583MHz), GeForce 6200 = 7291 3dmarks
    Sempron 2300+ (1583MHz), GeForce FX 5700LE = 7790 3dmarks
    Athlon XP 2500+ (1833MHz), GeForce FX 5200 64-bit = 4884 3dmarks
    Athlon XP 2500+ (1833MHz), GeForce FX 5700LE = 8425 3dmarks
    Athlon XP 2500+ (1833MHz), GeForce FX 5700LE 20% overclock = 9280 3dmarks
    
    Socket A (nForce2 chipset, Win2k)
    Athlon XP 2800+ (2083MHz), GeForce 4MX integrated = 3683 3dmarks
    Athlon XP 2800+ (2083MHz), GeForce FX 5700LE = 8977 3dmarks
    Athlon XP 2800+ (2083MHz), Quadro FX 1000 = 10771 3dmarks
    
    Socket 479 (Itox mini-ITX board, i855GM chipset, DDR333, Win2k)
    Pentium M 2MB 1.6GHz, i855 integrated = 2500 3dmarks
    Pentium M 2MB 1.6GHz, GeForce 4MX PCI = 4080 3dmarks
    Pentium M 2MB 1.6GHz, GeForce 8400GS PCI = 9200 3dmarks
    
    Socket AM2 (nForce 430 chipset, DDR2-800, Win2k)
    Athlon X2 4850e (2.5GHz), GeForce 6150 integrated = 5481 3dmarks
    Athlon X2 4850e (2.5GHz), Quadro NVS 285 = 9125 3dmarks
    Athlon X2 4850e (2.5GHz), Radeon X1300 64-bit = 10291 3dmarks
    Athlon X2 4850e (2.5GHz), Quadro NVS 290 = 13944 3dmarks
    Athlon X2 4850e (2.5GHz), GeForce 210 520/600 = 17900 3dmarks 
    Athlon X2 4850e (2.5GHz), GeForce 9500 DDR2 450/400 = 19887 3dmarks
    Athlon X2 4850e (2.5GHz), GeForce GT220 625/700 = 21626 3dmarks
    
    Socket AM2+ (Biostar A770-A2+, AMD 770 chipset, DDR2-800, Win2k)
    Athlon X2 4850e (2.5GHz), GeForce 7600GT = 23001 3dmarks
    Athlon X2 7850 (2.8GHz), GeForce 7600GT = 29945 3dmarks
    Athlon II X2 260 (3.2GHz), GeForce 7600GT = 29055 3dmarks
    Athlon II X2 260 (3.2GHz), Radeon HD 4550 600/800 = 24945 3dmarks
    Athlon II X2 260 (3.2GHz), GeForce 9500 DDR2 450/400 = 25815 3dmarks
    Athlon II X2 260 (3.2GHz), Radeon HD 7510 650/700 = 31000 3dmarks
    Athlon II X2 260 (3.2GHz), Radeon HD 5570 650/700 = 32828 3dmarks
    Athlon II X2 260 (3.2GHz), GeForce GT220 625/700 = 32602 3dmarks
    Athlon II X2 260 (3.2GHz), GeForce GT240 550/1000 = 32689 3dmarks
    Athlon II X2 260 (3.2GHz), Radeon HD 3850 = 34945 3dmarks
    
    Laptops (Win2k/XP)
    Dell Lattitude C400, Pentium 3M 1.33GHz, i830 integrated = 1080 3dmarks
    Fujitsu Lifebook B6110D, Pentium M 2MB 1.2GHz, i915 integrated = 3565 3dmarks
    NEC Versa S820, Pentium M 1MB 1.0GHz, Mobility Radeon 7500 64-bit = 4060 3dmarks
    Fujitsu Lifebook S series, Turion 64 X2 1.6GHz, DDR2-667, Radeon Xpress 200m = 4200 3dmarks
    Toshiba Portege M200, Pentium M 1MB 1.7GHz, GeForce Go 5200 64-bit = 4765 3dmarks
    Fujitsu Lifebook S series, Turion 64 2.0GHz, DDR2-800, Radeon Xpress 200m = 5300 3dmarks
    
    2017 Dec 20 power consumption
    Video cards at idle:
    GeForce 7600GT (560MHz) - 15W
    GeForce 9500 DDR2 (450MHz) - 10W
    
    cards that throttle to a lower speed at idle:
    GeForce 210 (135MHz) - 2.5W
    GeForce GT 220 (135MHz) - 7.5W
    GeForce GT 240 (135MHz) - 7.5W
    Radeon HD 3850 (300MHz) - 12W
    Radeon HD 4550 (110MHz) - 2.5W
    Radeon HD 5570 (400MHz) - 10W
    

    I also tested an IBM AT (286) loaded up with ISA memory board, VGA, sound, disk controller, and 3.5" harddisk. It drew 32W. A VLB 486DX4-100 system drew 28W.

    I test power consumption using a shunt resistor (10 ohms) in the AC supply and calculating the current and power draw from the voltage drop. (In the case of video cards, it's necessary to estimate and subtract out the power for the rest of the system.)

    2017 Oct 21 registry tweaks

    Use HDDs larger than 128GB in Windows 2000 by creating this DWORD registry key and setting the value to 1:

    HKLM\System\CurrentControlSet\Services\Atapi\Parameters\EnableBigLba 
    

    2017 Jan 17 GUI thought experiment