EMM386 and VDS: Not Quite Working

The other day I set out to solve a seemingly simple problem: With a DOS extended application, lock down memory buffers using DPMI and use them for bus-mastering (BusLogic SCSI HBA, though the exact device model isn’t really relevant to the problem).

Now, DPMI does not allow querying the physical address of a memory region, although it does have provisions for mapping a given physical memory area. But that doesn’t help here–mapping physical memory is useful for framebuffers where a device memory needs to be mapped so that an application can access it. In my case, I needed the opposite, allowing a bus-mastering device to use already-allocated system memory.

As many readers probably know, VDS (Virtual DMA Services) should solve this problem through the “Scatter/Gather Lock Region” VDS function. The function is presented with a linear address and buffer size, and returns one or more physically contiguous regions together with their physical addresses.

I already had VDS working for low (DOS) memory, but I just could not get it working for “normal” extended memory. It did not matter if I used statically allocated variables placed in the executable, C runtime malloc(), or direct DPMI memory allocation functions. The VDS call succeeded and filled the result buffer with the same address I passed in, indicating a 1:1 linear:physical mapping, except the memory definitely was not mapped 1:1. So bus-mastering couldn’t work, because the addresses I programmed into the adapter were bogus. But why was this happening?

Continue reading
Posted in Bugs, Development, DOS Extenders | 2 Comments

A Brief Visit to Disk Geometry Hell

Several weeks ago I thought I’d install NetWare 3.12 in a virtual machine using the BusLogic SCSI controller emulation. While configuring a 1.5 GB virtual drive, I thought I should be safe and not run into any trouble with a “too big” disk.

But I was wrong. The NetWare 3.12 installer created the DOS partition and launched the NetWare OS, but trying to create a NetWare partition resulted in the following error:

NetWare 3.12 reporting an error when attempting to create a NetWare partition, caused by a geometry mismatch between the BIOS and driver.
NetWare 3.12 upset by a geometry mismatch

This error is naturally not specific to virtualization and happens on real systems as well. But why? The geometry of a SCSI disk is entirely fictional, so why is it a problem?

Continue reading
Posted in BusLogic, IBM, NetWare, PC architecture, Storage | 32 Comments

Emulating EtherLink

Spurred by the discovery of a pre-release OS/2 NetWare Requester from early 1988 with a very thin selection of drivers, several months ago I decided to write emulation of the classic 3Com 10Mbps Ethernet 3C501 card, also known as EtherLink. The developer documentation from 3Com was available, and didn’t look all that terrifying, just a couple of pages.

A 3Com 3C501 Etherlink adapter.
A non-emulated 3C501 EtherLink adapter manufactured in 1986.

The 3C501 is known for the comments made about it by Donald Becker, the author of many Linux networking drivers in the mid-1990s: “Don’t purchase this card, even as a joke.” The comments were not unjustified when they were made; the 3C501 was already an obsolete design in 1992 or so. The problem was that the card has a tiny buffer, only big enough for one packet, and three mutually exclusive modes: Send, receive, and buffer access by the host (obviously no full-duplex Ethernet there). Once a packet is received, further reception stops until the packet buffer is emptied by the host and receive re-started again. That leads to many dropped packets and very poor performance in busy networks, particularly networks with a lot of broadcast or multicast traffic.

Fortunately, the virtual switch in a hypervisor has the ability to buffer packets, and packet loss is far less of a problem in a VM. Which is not to say the emulated EtherLink is some kind of a great performer, but it can certainly handle much more than 10Mbps.

Continue reading
Posted in 3Com, Networking, PC hardware, PC history, Virtualization | 33 Comments

1987 Networking: ELS NetWare 286 Level I 2.0a

A rare find recently turned up: NetWare from 1987, specifically the low-end ELS variant of NetWare 286 version 2.0a (ELS may be claimed to mean Entry Level System or maybe Entry Level Server, but at least originally it stood for Entry Level Solution). NetWare v2.0 was released in 1985, followed by v2.0a in 1986. In November 1987, NetWare v2.1 was to become available, but in September of that year Novell released the low-end ELS product with support for 4 users (really 4 concurrent connections) and without some of the perks of Advanced NetWare. The ELS package was based on the about-to-be obsoleted v2.0a version of NetWare 286.

Screenshot of non-dedicated ELS NetWare 2.0a booting up.
Is it DOS? Is it NetWare? It’s both!

The original ELS I product was later updated with NetWare v2.12 as its basis. In early 1988, Novell added an ELS II package with support for 8 users. The ELS II variant was initially based on NetWare v2.1 and later updated to v2.11, v2.12, and finally v2.15. In 1991, Novell consolidated all the low-end versions into NetWare 2.2 (sold alongside NetWare 3.11 and released more or less at the same time as 3.11).

A print ad for ELS (Entry Level Solution) NetWare, published in PC Magazine in December 1987. "To get the power of NetWare, you'll have to pay a small price", $595. Via Google Books.
A NetWare ELS print ad (PC Magazine, December 1987)

For whatever reason, even though NetWare versions for PCs existed since the early 1980s, it is nearly impossible to find any NetWare server software from before 1990; presumably in large part because NetWare actually sold in rather small numbers before 1990 and with funny stuff like hardware locks in the early versions, the software wasn’t very useful once the hardware died. Whatever the reason, NetWare from 1987 is exceedingly rare, and in fact any PC networking software from 1987 or earlier is surprisingly difficult to find.

Continue reading
Posted in 286, 3Com, Kryoflux, NetWare, Networking | 29 Comments

Another Strange 286 Board

The OS/2 Museum sometimes seems to have a knack for acquiring hardware so obscure that it cannot be even identified. One of the more recent arrivals was a seemingly typical Baby AT 286 board with an 8 MHz CPU. The board was in remarkably good condition for its age, having been produced in 1986; the date code on the PCB could be read as 15-98 or as 86-51, but there’s no question which of the two interpretations is correct. A significant contributing factor to the good shape of the board was no doubt the fact that it uses a CR2032 lithium coin battery and not one of those horrible leaky NiMh rechargeables.

A Maxware/Fujitech Baby AT 286 motherboard.
A Baby-AT 286 clone board of ostensibly Japanese manufacture

The board claims to have been made in Japan by a company named Fujitech, or maybe Maxware. Interestingly, a very similar Fujitech XT board was seen with a sticker on it referencing Octek, a Taiwanese company. This would not be the first board supposedly Made in Japan that was really manufactured in Taiwan or China, but at least this “AT-BABY” uses almost exclusively Japanese components, whether it was actually assembled in Japan or not.

Continue reading
Posted in 286, PC hardware, PC history | 27 Comments

More Fun with ISA DMA

A reader comment on a previous post on ISA DMA pointed out that UMBPCI (or rather the DMACHK utility distributed with it) does something unusual with regard to ISA DMA. There was a suspicion of somehow accomplishing the mythical memory-to-memory DMA transfers; that proved to be unfounded, at least in the UMBPCI case, but what the utility does is nevertheless quite interesting.

Dual NEC D8237AC-% DMA controllers in a PC/AT clone board.
Classic cascaded 8237A DMA controller chips in a PC/AT clone

First some background about what DMACHK does and why it exists in the first place. UMBs are generally prone to causing difficulty with DMA, and UMBPCI is no exception. The way UMBPCI works is that it enables memory between 640KB to 1MB for use with UMBs. Such memory is normally only intended for ROM shadowing and in some chipsets, it is not accessible via DMA (whereas EMM386/QEMM/386MAX use paging to remap normal memory into the UMB range, causing physical addresses to differ from linear ones).

Continue reading
Posted in PC architecture, PC hardware, Software Hacks | 8 Comments

MS OS/2 SDK Document Dump

The Microsoft OS/2 1.0 SDK library section got a big fat update. Over the holidays I managed to finalize and upload about 25 PDFs, some of which have been lying on my NAS in 98% completed state for almost 10 years, and some of which have been only scanned a few months ago. I may still have one or two ring binders lying around and those will be added when I find them and scan them.

It’s thousands of pages of Microsoft documentation from 1987 and early 1988. Some of the documents ought to be interesting for DOS programmers since they include retail MASM 5.0 and MS C 5.0 documentation. There are also pre-release versions of the MS C/MASM 5.0 documentation from May 1987. There are separate “diff” addenda documenting the OS/2 specific features of the tools pertaining to the beta compilers shipped with the MS OS/2 SDK. And there is actual pre-release OS/2 programming documentation from April 1987, right after OS/2 was publicly announced.

Posted in Documentation, Microsoft, OS/2 | Leave a comment

The Cape Cod Disaster

Here’s a motherboard Intel very quickly wanted to forget about:

Intel Desktop Board CC820 with CPU and SDRAM, early 2000
Intel CC820 Desktop Board (early 2000)

It’s the Intel CC820—or Cape Cod—desktop board, a product that was late to market (not unusual) and within a few months, the subject of a recall (quite unusual). As the CC820 designation suggests, the board was built on the ill-fated Intel 820 ‘Camino’ chipset.

The Camino chipset was supposed to be released roughly in mid-1999 as a replacement of the workhorse 440BX chipset for mainstream desktops. At the same time, Intel changed how it segmented the market. The 440BX supported up to two processors, while the 820 didn’t (though the 820DP variant did); the 820 chipset was targeted for typical desktops, while the Intel 840 chipset was meant for high-end workstations with two processors. Note that the Intel 810 chipset was meant for “value” PCs, and played that role quite successfully.

The 440BX chipset was limited to 100 MHz FSB; the 820 supported 100 and 133 MHz FSB for the then-new Coppermine Pentium III processors. The 440BX chipset was limited to ATA-33, while the 820 supported ATA-66. The 440BX only supported AGP 2x, while the 820 provided AGP 4x capability.

But that wasn’t all. The 820 chipset also supported RDRAM, or Rambus DRAM. And therein lay the problem.

Continue reading
Posted in Bugs, Intel, PC hardware, PC history, Pentium III, RDRAM | 45 Comments

DOS Wireless Networking, Continued

As I recently mentioned, wireless networking is extra difficult when the access point reboots itself at the slightest hint of heavier traffic. The faulty TP-Link router was temporarily replaced with a Netgear WG602 of similar vintage. The Netgear has been solid and has no trouble transferring tens of megabytes without a glitch.

I should note that although the TP-Link turned out to be bad, it has nicer diagnostics than the Netgear and it is slightly more tweakable. But a working AP wins out any day.

Agere ORiNOCO wireless PC Card in an IBM ThinkPad 760XL
Agere ORiNOCO wireless PC Card in a ThinkPad 760XL

The next project was getting IBM’s TCP/IP 2.1 working wirelessly. The protocol stack is almost completely dynamically loadable and unloadable, and comes with a decent NFS client. I had previously got IBM TCP/IP going in a DOS VM without much difficulty, but convincing it to work with a Cisco Aironet 350 turned out to be surprisingly tricky.

Continue reading
Posted in DOS, Networking, NFS, TCP/IP, Wireless | 3 Comments

The Danger of Datasheets

A few days age I came across an article about the 8237 DMA controller in an old German computing magazine (DOS Extra, issue 1 ’87/88, page 123, Schnelle Speicherverwaltung mit dem DMA-Controller, or Fast memory management with the DMA controller). While skimming through the article, I began to suspect that the although the author did a good job reading the 8237 datasheet, he had only a rather vague idea of how the controller was actually wired up in the IBM PC.

On closer reading of the article, my suspicion was confirmed. While there is some PC-centric information in the article (which I/O ports the 8237 is mapped at, or the fact that the DMA controller is used for memory refresh in the IBM PC), absolutely crucial IBM-specific information is missing.

Continue reading
Posted in Corrections, PC hardware, PC press | 29 Comments