The most common requests are for fully assembled boards or complete parts kits, so I’m now pleased to announce the availability of full kits for the ISA CompactFlash board, available now!
The kit contains everything needed to build a fully functioning board to allow the connection of a CompactFlash card, via a cheap Compactflash-to-IDE converter like this one or this one (randomly picked; I have no connection with the sellers) to an 8088 or 8086 based IBM compatible PC.
In the parts bag are the ICs and sockets pressed into some antistatic foam, and a number of loose components – everything on the Bill Of Materials:
ISA CompactFlash Parts Kit Contents
The loose components are:
Once assembled, the XTIDE Universal BIOS must be programmed onto the card. This can be performed with the card installed in the PC (no external EPROM programmer is required) using the lo-tech Flash utlity and the pre-configured ROM image. This requires having some way to transfer the utility and image file to the target system, for example by floppy disk. If you don’t have this capability, the ROM can be programmed in an external programmer, or the kit can be shipped with the ROM ready-programmed – just add the Flash Chip Programming Service for each kit purchased.
It turns out there’s already a bootable IDE solution, the FreHD project, providing access to disk images stored on a FAT32 formatted SD card powered by a PIC microcontroller. It does look fantastic, but I felt there could be space for something simpler (and so cheaper) as well.
The prototyped low-cost adapter needs just a few 7400 series ICs, and simply ignores half the data coming from the IDE device to provide the 256-byte sectors the TRS-80 expects. The designer though notes some compatibility issues:
I did have one problem, though — not all IDE drives would work….only one of the four IDE drives I tried would work.
When the CPU accesses a device, it first provides the address (IO Port) then the read or write signal. In the Z80 world the CPU generates the same address, read (RD) and write (WR) signals for memory or IO port addressing, the two being distinguished with IO-Request (IORQ) or Memory Request (MREQ) signals.
In the TRS-80 expansion interface (model 3/4/4P), the system combines IORQ, RD and WR signals to provide simple IN and OUT signals along with the address bus, also providing IORQ and M1 signals for reference which can be used to identify interrupt acknowledgement.
In the original design it seems that device compatibility issues might have been caused by the inclusion of IORQ in the address matching logic:
IORQ is asserted concurrently with IN or OUT, so the logic has a timing issue since the IDE interface expects its chip-select (i.e. address match) line to have been asserted before the read or write command.
The Lo-tech design follows more the the XT-CF design, with the IDE chip-select line being driven directly from the address bus with just an LS688 comparator. Some prototyping work by vcforum member Chromedome45 soon proved the logic – so the Lo-tech TRS-80 IDE Adapter PCB design:
Lo-tech TRS-80 IDE Adapter (image generated with GerbV)
Further information on the board including bill of materials, device drivers and design files can be found on the Lo-tech TRS-80 IDE Adapter wiki page.
Magnetic Bubble Memory (MBM) was positioned as a major contender for computer storage in the late 1970s, even appearing in popular culture when at the center of the plot in Knight of the Phoenix. The technology seemed to offer everything flash offers today, and is the basis of some surprising patents such as this iPod forerunner filed in 1979.
…the main advantages are the low entry price versus disks…, nonvolatility…, and high-density storage… ideally suited for portable applications as well as providing memory for traditional processing systems
What Is Bubble Memory?
Bubble memory works like a shift register
MBM works by storing bits as cylindrical magnetic domains (the bubbles) on a film mounted within an electromagnet array, which is used to move the bubbles through the film. Functionally, MBM is like a massive shift register – moving the bubbles results in one (stored) bit being read from one end, and a new bit being supplied at the other.
By the end of the 1970s, practically every major semiconductor manufacturer was working furiously on this technology, and of course Intel was no exception with its subsidiary ‘Intel Magnetics’. Their 1979 Design Handbook for the Intel Magnetics One Megabit Bubble Memory is well worth a look, and includes a technical article as an appendix with some performance specifications. The power consumption jumps out as surprisingly high for a solid-state technology.
Conner & Shugart
ST-506 (image: fosketts.net)
Meanwhile Finis Conner and Al Shugart, having enjoyed some success as Shugart Associates with 8″ floppy and fixed disks, in 1979 formed a startup to produce 5.25″ fixed disks for the emerging personal computer industry. Shugart Technology was born, named deliberately in the expectation of some free publicity from Shugart Associates owner Xerox.
Less than a year after incorporation, they led the storage industry with the introduction of the micro-Winchester ST-506, the first 5.25″ form factor hard drive. With 5 MB usable capacity, it immediately provided a problem for bubble technology – and DEC (absorbed by Compaq in 1998) provided Shugart with their first major order, ST-506 drives being destined for its Rainbow PC in a deal apparently negotiated over cocktails and written on a napkin (source).
Disk vs Bubble
Intel IMB-100 Development Board
The limitations of MBM were, by 1980, becoming clear. Whilst requiring complex controller logic similar to that of a hard disk, it was power hungry and slow in comparison: Intel’s iSBC254 bubble memory storage board needed 32W per ½MB, had a 48ms access time, burst data rate of 48KB/s and a physical volume of 50cu.in.
In contrast, the ST-506 drive boasted 10x the capacity in a package about 3x the volume, had 10x the burst data rate, and needed less than a tenth of the power per KB. The death-knell for bubble though came when, setting the pace of capacity expansion we’ve expected since, what was by then Seagate produced the 10MB ST-412 in 1981.
Originally to be named ST-512, the drive heads were changed to thin-film type and name updated to ST-412 according to a comment on theregister, but either way the significance in vintage computing is simple: it was selected by IBM for it’s PC/XT 5160 (produced from 1983 to 1987), putting Seagate on track to become one of the most successful storage vendors today.
Meanwhile with bubble further compounded by poor yields and the need for gadolinium gallium garnet and highly toxic chemicals, by the early 1980s pretty much all efforts with bubble memory had been dropped.
ST-506/ST-412 Reliability
Even as of 2013, there’s no shortage of working ST-412 drives – I acquired one recently in an IBM PC/XT, which when powered on presumably for the first time in about 20 years booted up straight-off, loading the school accounts system it still stored without a fuss.
Running a low-level format (using the IBM XT Diagnostics disk – the formatter is hidden away in the diagnostics menu under fixed disk tests) gives a good indication of the state of a drive, and it completed without even the hint of a bad sector. Not bad for a 28-year old drive, especially one whose “magnetic disks have a life expectancy of 5 years” according to the service manual.
Performance
The ST506 interface used by the ST-506 and ST-412 drives was derived from the SA1000 MFM floppy interface Shugart designed in the mid 1970s, and in the PC/XT it provided 5Mbps and 17 sectors per track. Raw transfer rate is therefore about 600KB/s, but in practice much lower because an interleave was needed to allow the CPU time to collect sector data. Running my simple disk test utility the disk does about 68KB/s with the default 6:1 interleave.
Bubble Today
Bubble memory has popped up again more recently – MIT proposed a microfluidic bubble memory in 2007 (ultimately too slow) and IBM has been working on racetrack memory for some time. Whilst (as of 2013) it seems unlikely that bubble will be back any time soon, IBM Research suggests that Storage Class Memory (i.e. racetrack) could become mainstream if work on 3D NAND Flash fails to deliver.
A few weeks back I wrote about the lo-tech ISA CompactFlash Adapter designed to fit the Sinclair PC200, at the request of a system owner, and based on a few ideas I already had on the drawing board at the time.
Being simple to make and cheap, the adapter has found a home in many machines besides the Sinclair already – only a couple of PCBs are left and the feedback from assemblers has been good.
The main challenge with the Sinclair is the available expansion slot height, which is what the small form-factor adapter was designed to solve. Here it is fitted to the Sinclair, with the top cover fitted.
Since the Sinclair doesn’t have any spare power connectors, make use of the 4-hole power outlet on the PCB to attach a floppy-drive style power lead to power an IDE to CompactFlash adapter (alternatively the keypin on the adapter will supply 5V, if the CompactFlash adapter in use supports this).
Testing, after a couple of false starts, has been successful so far. Be sure to set ‘IDE Controllers’ to 1 (and the adapter type to XT-CF of course) when configuring the XTIDE Universal BIOS. The BIOS can be written out using the lo-tech XT-CF flash utility.
Tandy helpfully included an expansion slot in their 1400 series of laptops, and in places there is reference to an expansion box, but it seems it never made it to market. The later 1400FD and 1400HD models retained the expansion slot and added a second (slightly different) slot for an MFM HDD controller, as implemented in the 1400HD.
The expansion slot is basically an 8-bit ISA slot, but with a different pinout and a few differences, in a custom card form factor to fit in the machine. Power budget is also limited to 200mA, according to the service manual. Fortunately, Tandy documentation provides everything needed to create a card – so here is what I believe to be the first ever expansion card for Tandy 1400 Series laptops (only about 20 years late):
Expansion Card Design
Based on the information available in the Tandy technical reference, I’ve created a wiki page detailing everything about the expansion slots. Some of the Tandy documentation is contradictory, but my wiki is based on what is now a proven design. I’ve also included an Eagle layout for the PCB (restricted to a 100 x 100mm footprint, to enable low-cost manufacture by SeeedStudio).
XT-CF
My XT-CF cards provide hard disk functionality to PC/XT and PC/AT class machines based on CompactFlash (or microdrives), and for the Tandy 1400 the design needs just four ICs – a flash ROM, two 74688 address decoders and a 74139 decoder. Being XT-CF compatible, the design is fully supported by the XTIDE Universal BIOS (from build r554).
BIOS Initialisation
I built this board a while back, and although BIOS flashing went OK the machine didn’t want to initialise the XTIDE Universal BIOS. The BIOS was clearly detecting the option ROM as the floppy seek test was performed on only the first floppy with it present (the BIOS assuming that an HDD would be installed in place of the second floppy, exactly as the 1400HD was shipped), but the BIOS initialisation messages never appeared.
This has had me stumped and the board simply sat on the side since. But recently XTIDE Universal BIOS project lead Tomi posted a code update (in r552):
XTIDE Universal BIOS can now be initialized if non-standard main BIOS does not call INT 19h or if INT 19h handler is replaced by some other BIOS.
And sure enough, the BIOS fired into life and the machine booted (and yes, the SuperTwist LCD screen really does look this bad):
The solution isn’t quite perfect – the fixed disk is inaccessible when restarted via CTRL-ALT-DELETE, but since boot time on this machine is identical for both soft boot and cold boot, this is just something that we need to live with for now.
1400LT, 1400FD and 1400HD
For 1400FD systems at least with BIOS 1.04, the system BIOS assumes the second floppy isn’t installed when the XT-CF option ROM is present (this may also affect 1400LT systems). For now this is a limitation, but with 32KB of flash ROM available it should be possible to resolve it by adding a floppy BIOS to the card.
For 1400HD machines, the MFM controller must be removed since both cards have their BIOS at C800h (upper memory space is somewhat limited in the 1400 series as Tandy included RAM in the upper memory area for use as a RAM disk).
Performance
Using the ‘XTplus’ XTIDE Universal BIOS build (thanks to the V20 CPU), DOS throughput (as measured with my own test utility) is at least 550KB/s. Due to the 8-bit data bus and V20 microcode optimisations, there is no performance difference between standard 8-bit PIO and BIU offload modes (as set with XTCFMODE), although both modes are supported.
Availability
ENIG PCBs (gold plated) are available now through the shop page.
Components will also be needed from your local electronics outlet such as Farnell, Mouser or Digikey – full Bill of Materials in the wiki. There is no bracket needed, since the card slides into the expansion slot guides within the system chassis, and the fit into the slot is tight enough not to need and further support.
The 8237 DMA controller in the original PC/XT (and its clones) is fundamentally an 8-bit device with a 16-bit address space – perfectly matched to the MCS 85 family of which it was a part. So to make it work with the 20-bit address space of the 8086 and 8088, IBM added a 4-bit ‘page register’ for each of its four DMA channels using a 74LS670 (a quad 4-bit register file).
The 8237 and the 74LS670 though are broadly independent; the page register does not automatically increment when the address register wraps around to zero. This has two implications: normal segment:offset addresses must be converted to a linear, 20-bit physical address, and DMA transfers cannot cross a 64 KB page boundary.
Determining the Physical Buffer Address
Code in the XTIDE Universal BIOS illustrates how to convert a standard segment:offset address (presented in ES:SI) to a linear address, with just the 8088 instruction set:
xor dx, dx ; clear DX
mov ax, es ; copy ES to AX
%rep 4
shl ax, 1 ; shift left 1, MSB into carry...
rcl dx, 1 ; ...and from carry to DX LSB
%endrep ; repeat for the 4 MSB bits
; AX now has ES SHL 4, and DX has ES SHR 12
add si, ax ; add AX to SI, to get low 16-bits in SI
adc dl, dh ; if it overflowed, increment DX (DH is zero)
mov es, dx ; and save DX back in ES
DX needs to end up with ES SHR 12 because IBM hooked up the 74LS670 DMA page register to the low four-bits of the data bus, so programming the high 4-bits of the physical address is achieved from the low 4-bits of a CPU register. The addresses are then loaded into the DMA controller address register (in two halves, since the DMA controller has only an 8-bit data bus) and the associated page register. In this example, the port addresses are for channel 3:
out 0Ch, al ; Reset flip-flop to low byte
mov ax, es ; Get high 4 bits
out 82h, al ; Page register for Ch.3
mov ax, si ; Get low 16 bits
out 06h, al ; Send low byte to Ch.3 address register
mov al, ah ;
out 06h, al ; Send high byte to Ch.3 address register
Crossing a 64KB Boundary
Since the page register isn’t incremented by the DMA controller, a DMA transfer can run up to a page boundary at which point it (and the associated page register) must be re-programmed for another transfer into the next physical page. Splitting a transfer across a boundary therefore requires a check of the transfer size against the possible number of bytes up to a page boundary.
The code that follows assumes the maximum total transfer size is less than 64KB so allows for either one or two DMA transfers.
; On entry - buffer is in ES:DI, CX has bytes to transfer
; First calculate bytes up to physical page boundary
mov ax, di
neg ax ; 2s compliment
; if DI was zero, carry flag will be cleared (and set otherwise)
; When DI is zero only one transfer is required if total DMA
; transfer size is restricted to < 64KB
jnc .TransferDmaPageWithSizeInCX
; CF was set, so DI != 0 and we might need one or two transfers
cmp cx, ax ; if won't cross physical page boundary...
jbe .TransferDmaPageWithSizeInCX ; ...perform transfer in one operation
; Calculate how much we can transfer on first and second rounds
xchg cx, ax ; CX = BYTEs for first page
sub ax, cx ; AX = BYTEs for second page
push ax ; Save bytes for second transfer on stack
; Transfer first DMA page
call StartDMAtransfer
pop cx ; Pop size for second DMA page
.TransferDmaPageWithSizeInCX:
; Fall to StartDMAtransfer
StartDMAtransfer:
; DMA controller programming and transfer is completed here
; This code will be hardware dependent
; ...
; Once transfer is done, update physical address in ES:DI
; since IO might need several calls through this function
; (if crossing a physical page boundary)
mov ax, es ; copy physical page address to ax
add di, cx ; add requested bytes to di
adc al, 0 ; increment physical page address, if required
mov es, ax ; and save it back in es
ret
Purpose
The DMA controller in the original IBM PC really has a few reasons for being – RAM refresh of course, background transfers (as used by SoundBlaster sampled audio for example), and high-performance transfers. The 8237 DMA controller is usually noted for its lack of performance, but that perception came about because CPU speed soon eclipsed it.
Operating in a 4.77MHz 8088, the DMA controller is the only way to transfer data to or from a peripheral in consecutive, back-to-back full-speed bus cycles (in later PCs, the DMA controller is throttled to about 5MHz to ensure peripheral compatibility). Of course it’s made more difficult by the boundary crossing issues and requirement to pause for RAM refresh, but the controller can provide the fastest possible transfers as demonstrated by my XT-CFv3 DMA Transfer Mode.
I was contacted recently by the owner of a Sinclair PC200 (an XT class machine in an Atari ST style case) about my XT-CF boards, wondering if a custom board could be built for the machine, with its physical 50mm height restriction on its two ISA slots. The quick answer to that is no, since the CompactFlash header is too big in either orientation, but I’d already been pondering on the idea of a super-simple PCB providing a 40-pin IDE header, based on the lo-tech 8-bit ROM board, so this seemed like a good opportunity to finish the design.
A through-hole, small form factor 8-bit ISA adapter providing a 40-pin IDE header suitable for connection to a separate IDE to CompactFlash adapter (available cheaply on eBay). By using a 40-pin header instead of a CompactFlash socket, home assembly of the device is made simple as all required components are 2.54mm pitch through-hole.
Other than the small form factor (and without any provision for a slot bracket), the PCB is a standard ISA card and can be used in any PC with an ISA slot.
New IDE Logic Implementation
Making an XT/IDE derivative in such a small PCB meant minimising the component count:
Whilst the XT-CF-lite was based closely on the original XT/IDE adapter, borrowing directly its OR and inverter gate design to provide IDE register access and IDE reset, with this new board this has been condensed into a single 74LS139.
Because of the 40-pin potentially cabled connection to the CompactFlash adapter, a buffer (74HCT245) is required, but with only 8-bit transfer mode supported (hence the CompactFlash designation), a 16-to-8-bit MUX isn’t required
Any CompactFlash or microdrive device should work with this adapter, and probably ATA-2 compliant hard drives (since 8-bit transfer mode is a requirement of ATA-2).
Extended Functionality
I wanted to include as much functionality as possible, so implementing the logic for IBM PC/XT Slot-8 compatibility (developed with the CPLD based XT-CF adapters) was a goal. Although out of space on the ISA component side, the layout could accommodate a few SMT components on the ISA solder side: these are entirely optional, but when populated provide LED drive and Slot-8 functions.
The logic required to provide slot-8 functionality is straight-forward – it’s just an echo of MEMR or IOR when either the ROM or IDE ports (respectively) are selected, with an open-collector drive since other logic on the system board can also drive this signal (as I’ve written about before). In this new board, this is implemented with a single 74LS33D quad NOR gate, the one spare gate being used to provide LED drive too:
LED drive requires the SMT 74LS33D populated since CompactFlash devices provide only minimal activity LED drive current, which is likely already absorbed by LEDs on the required CompactFlash to IDE adapter.
The boards are fully supported by the XTIDE Universal BIOS (from build R545), with standard 8-bit PIO transfer mode and the enhanced performance BIU Offload mode just as with the XT-CF-lite. The DMA transfer mode of the XT-CFv3 is not however supported.
Availability
ENIG (gold plated) rev.2 PCBs are available via the shop page.
Components will also be needed from your local electronics outlet such as Farnell, Mouser or Digikey – full Bill of Materials in the wiki.
When IBM released the PC/XT 5160, the 8 ISA slots were a welcome improvement from the 5 in the original IBM PC 5150; multi-function cards weren’t yet common and the system board itself provided no IO capabilities other than the speaker and keyboard, so everything needed an expansion card.
Whilst seven of the slots operated just like those in the 5150, the slot nearest the CPU was special – the IBM Technical Reference noting Slot J8 is slightly different from the others in that any card placed in it is expected to respond with a ‘card selected’ signal whenever the card is selected, the key being a previously unused signal line B8:
CARD SLCTD (I) Card Selected: This line is activated by cards in expansion slot J8. It signals the system board that the card has been selected and that appropriate drivers on the system board should be directed to either read from, or write to, expansion slot J8. Connectors J1 through J8 are tied together at this pin, but the system board does not use their signal. This line should be driven by an open collector device.
By observation, B8 needs to be asserted (low) only when reading from a device in slot 8, which then sets the direction of the buffer U15 to transfer data from the XD bus (housing slot J8, the system ROMs and the DMA controller) to the D bus (slots 1 to 7).
Open Collector Drive
For novices like me, the last part of IBM’s text is important: the open collector drive (see evilmadscientist.com for a good description of this). As other logic can drive B8, such as the ROM address decoder, a device driving ISA B8 can’t present a high-level drive when not asserted (the signal level is pulled up through RN1). This can be achieved either directly using open-collector logic, or by using a separate buffer.
In my CPLD logic for the XT-CFv3, the logic looks like this:
In the Lo-tech CompactFlash Adapter, I’ve gone with a separate buffer by distilling the logic down to some NOR gates, to minimise component count (the NOR gate also providing LED drive):
There’s probably a better way, but both of those work anyhow 🙂
Zero Wait State
The CARD SLCTD use for B8 was pretty much limited to the IBM PC/XT 5160 – the later PC/AT re-purposed the line as a “zero wait state” line, which has particular advantage for 8-bit cards.
As IBM started pushing the processor clock rates up, ISA at the time being effectively a local bus, IBM chose to limit the effective bus speed for 8-bit cards by adding wait states to achieve a bus cycle time of about 750ns, roughly equivalent to the 4.77MHz speed of the original PC. At the time, expansion cards could be quite an investment so keeping things compatible was key.
Through the ZWS (B8) line in the PC/AT, and using the same basic logic as used to generate CARD SLCTD, the wait states can be eliminated for reads, and the logic simply extended to also consider IOW to also eliminate the wait states on writes. This can boost throughput by 30% on a 6MHz AT, and 50% on a later 12MHz AT class machine.
The XT-CFv3 DMA transfer mode works in an unconventional way to deliver the highest possible throughput for the original IBM PC and PC/XT – here’s how.
The Intel 8237 DMA Controller
In the PC and PC/XT, the Intel 8237 DMA controller provides two functions – it keeps system memory alive by periodic refresh, and it enables transfers to and from IO devices with minimal CPU intervention (the floppy drive, many hard disk controllers, and SoundBlaster cards use DMA). To achieve this, the DMA controller has four sets of DMA Request (DRQ) and DMA Acknowledge (DACK) lines and broadly, the process is:
DRQ is asserted by the requesting IO device (e.g. the floppy drive controller)
The DMA controller raises the HOLD line (connected to the 8088 CPU)
The 8088 CPU completes the current bus cycle, then asserts HLDA (Hold Acknowledge) so passing control to the DMA controller. At this point, all output lines on the CPU are put in a high-Z state (effectively disconnected) and the CPU enters a waiting state
Now the DMA controller has control of the bus, it presents the memory address on the address bus and asserts AEN, which signals to IO devices not involved in the DMA transfer to disregard the bus cycle
The DMA controller next asserts DACK, preparing the IO device to present (or receive) data
Then the DMA controller asserts both IOR (IO read) and MEMW (memory write) concurrently, or IOW (IO write) and MEMR (memory read), so feeding data directly from the device to memory or vice-versa
The DMA controller transfer counter and memory address registers are then updated
What happens next depends on whether more data is available (so DRQ is still asserted), whether the transfer counter has reached zero, and finally the DMA controller operating mode. In single byte transfer mode, the DMA controller will return control to the CPU by releasing HOLD after each byte, whilst in demand mode the process will continue until the IO device releases DRQ (block mode generally isn’t used because it can disrupt RAM refresh, as described below).
DMA vs Port IO
In demand mode DMA runs much faster than 8088/V20 transfers since with DMA, each byte is delivered to memory in just one bus cycle. The 8088, on the other hand, has to read the byte from the IO device in one bus cycle then store it to memory in a second bus cycle, because both the IO device and memory use the same address bus. On the 8088, the code to fetch a block of port mapped data is less than ideal:
mov cx, 512
.TransferLoop:
in al, dx
stosb
loop .TransferLoop
The instruction fetch and jumps of course make this slow, although it can be improved by unrolling. In the XTIDE Universal BIOS, this is the basis of the 8-bit port-mapped IO operating mode for the XT-CF series, achieving about 170KB/s at 4.77MHz. The V20 though streamlines this by eliminating instruction fetch and jump overhead:
mov cx, 512
rep insb
Freeing up the bus for just the data by the elimination of all the instructions pays significant dividends – this delivers about 390KB/s at 4.77MHz (and is available in the ‘XTplus’ XTIDE Universal BIOS build, for V20/286 powered XT class hardware).
Making DMA Scream
DMA on the PC and PC/XT brings with it some challenges:
Programming the DMA controller absorbs many cycles
Control must be returned to the CPU every 15 µs (72 cycles) for RAM refresh
To play sampled SoundBlaster audio at 22KHz, the DMA controller must be available to service the SoundBlaster DRQ once every 216 cycles
For my goal of ultimate throughput, packing bytes back-to-back on the data bus is the key – and with each byte taking 4 cycles, 18 bytes can be transferred before disrupting RAM refresh. For the XT-CFv3, this is achieved with some counter logic to release DRQ after 16 bytes (since that makes the maths easy and provides a margin of safety):
In the XT-CFv3, the oDRQ output in the schematic is delivered to the ISA bus via a 3-state output buffer, because the card must be able to co-exist with any original hard disk controller and DMA channels (DRQ/DACK pairs) can’t be shared as there are no pull-ups on the DRQ lines, so the card must drive the line continually when DMA function is in use.
Generating DRQ
Because DRQ is released by the counter, the DRQ lines on the IDE interface can’t be used – and in any case, DMA isn’t even supported by the majority of CompactFlash cards. The XT-CFv3 therefore provides another mechanism – to allow the software direct control over DRQ through an IO port write (the address decoding for which appears in the schematic above as ‘XTCF_DRQ_PORT’). This approach makes the transfer code itself elegant, once the DMA controller has been programmed:
mov cx, 32
.TransferNextDmaBlock:
out dx, al ; Raise XT-CFv3 DRQ & transfer 16 bytes
loop .TransferNextDmaBlock ; loop also adds required wait-state
The results are heavily dependent on the media: the majority of CompactFlash cards support only single-sector transfers, and therefore the DMA controller must be programmed once for every 512 bytes transferred, which delivers about 420 KB/s – a vast improvement on 8-bit port IO. But for devices supporting multi-sector transfers, performance rises to 530KB/s with an 8088 and a 560KB/s with a V20 (both at 4.77MHz).
Since working on the Dangerous Prototypes version of the XT/IDE project, I’ve been increasingly interested in ‘the storage problem’ for early 1980’s PCs – it’s both difficult to transfer files between machines and increasingly problematic storing data on them too, with still surviving hard drives now well into borrowed time.
The goal was to make a board with the DMA function of the XT-CFv2, but as easy to make as the XT-CF-lite (only the CompactFlash header represents something of a soldering challenge). So the XT-CFv3 specs:
8-bit ISA card providing bootable fixed-disk storage for PC/XT and PC/AT class hardware
Up to 8GB usable by MS-DOS (DOS limit)
CompactFlash header positioned to allow CompactFlash media to be exchanged through a custom ISA card slot, without opening the PC
32KB in-system re-programmable flash ROM, providing storage for the XTIDE Universal BIOS boot ROM with 24KB free
Provides several transfer modes optimised for 8088, V20 and 286 machines
Up to 530KB/s in a stock PC/XT, and up to 1.1.MB/s in a 12MHz 286
Low-cost manufacturing requirements
Programmable Logic: the Xilinx XC9536
At the heart of the XT-CFv3 is the Xilinx XC9536 CPLD. To me, these are little pieces of silicon magic – simply hook up the components on the PCB to the nearest convenient CPLD pin, then define in software the circuit logic the CPLD should perform and upload it into the CPLD. This is great for home-brew projects like this, since once the basic PCB layout is done and the board electrically sound, the design can be revised over-and-over by just reprogramming the CPLD.
The XT-CFv3 logic is a greatly simplified version of that from the XT-CFv2, which aside from electrical reliability issues, was working well enough – so I was confident the logic would work. Even so, six revisions were needed to finally bring the thing to life. But it’s running now with three modes of operation – more on which will follow soon 🙂
DMA Transfers
DMA is the big XT-CFv3 feature: it offers performance way beyond what any disk controller ‘back in the day’ could do, achieving up to 530KB/s on a stock PC/XT. The CPLD implementation makes this possible since it can do the work of many discrete logic chips (and of course be reprogrammed in the development phase getting it running). More on this, and the other operating modes, to follow soon.
Availability
The XT-CFv3 is just entering field testing so is some way off still. The plan though is to offer bare PCBs and brackets for home assembly.
This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish.AcceptRead More
Privacy & Cookies Policy
Privacy Overview
This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.
Lo-tech products are sold via TexElec. Please visit their web site texelec.com. Dismiss