
VIO MPF v2.0
electrickery/VIO_MPF_I
Extended firmware for the 6845 based video card for the Microprofessor MPF-I(b)

CADzilla is an S-100 bus board built around the Hitachi HD63484 Advanced CRT Controller (ACRTC) paired with a Brooktree Bt453 video DAC.
Cadzilla is an open-source printed circuit board by ToddHoug, from the ToddHoug/cadzilla repository on GitHub. It is a 6-layer board of 253.6 × 134.2 mm with 172 parts on 483 nets, routed with 6,050 tracks and 1,311 vias.
It is built around the 74F245D, 74F676PC and 74LS573PC, with the 74LS04PC, 74LS273PC and 74LS85DC among its other parts. Its parts include 87 capacitors, 60 ICs, 11 diodes, 7 resistors and 3 connectors. It belongs with the FPGA and CPLD boards of this library.

CADzilla is an S-100 bus board built around the Hitachi HD63484 Advanced CRT Controller (ACRTC) paired with a Brooktree Bt453 video DAC. The board carries about 2.2 MBytes of video memory in total:
Board design project: KiCAD schematics/PCB, GAL16V8 PLD logic, and supporting software projects that run on it (assembled and tested on an emulator).
For the full board reference, see the CADzilla User Reference Manual.
CADzilla exists for one reason: to enjoy the graphics board design process the way I did it forty years ago. The circuit architecture, schematic design, and PCB layout were all done by hand, with no AI assistance — the way boards like this were designed back then.
Every component on the board, aside from the modern SRAM used for the frame buffer, is a part that would have been available in 1984, when the Hitachi HD63484 was released and the S-100 bus was still a going concern. As far as I could find, no one had ever built an HD63484-based S-100 board — so I built one.
AI did play a role, but not in the hardware: it made it possible to build a CP/M software development environment and toolchain for the board that I could never have put together on my own.
schematics/ — KiCAD project (schematic, PCB, libraries, fab outputs)pld/ — GAL16V8 PLD source (src/) and assembled fuse maps (jed/)software/ — software projects targeting the board, grouped by toolchain
asm/ — Digital Research ASM + LOAD: hello, firstdraw, drawdemom80/ — Microsoft M80 + L80: the czgfx graphics library, gfxdemo,
czbasic, testpatrmac/ — Digital Research RMAC + LINK: rhello, ddcz (GSX-80 driver)z88dk/ — z88dk z80asm (host cross-assembler): the cz88gfx graphics
library, zhello, z88demo, autodemozcc/ — z88dk zcc (C): chello, cgfxdemo, cgsxdemo, dxfviewdocs/ — design notes and reference datasheets
docs/cadzilla-manual.pdf — user reference manualdocs/images/ — logo and other documentation imagestools/ — build/assemble/program scriptstests/ — emulator test programs and expected outputThe software runs under CP/M 2.2 on altairsim, an Altair/S-100 simulator with a CADzilla board. Requirements:
~/altairsim/build/altairsim, on PATH, or named
by $ALTAIRSIM.
altairsim -n -x 'SHOW VERSION' says which build you have. Its video
row should read SDL3 -- windowed (...), not
none -- headless (null display).docs/building-linux.md; libxtst-dev is required, and without the
X11/Wayland ones SDL3 gets no window backend:
sudo apt-get install -y build-essential cmake git ninja-build pkg-config \
libx11-dev libxext-dev libxrandr-dev libxcursor-dev libxi-dev libxfixes-dev \
libxss-dev libxtst-dev libwayland-dev libxkbcommon-dev wayland-protocols \
libdecor-0-dev libasound2-dev libpulse-dev
cd ~/altairsim
tools/build-sdl3-static.sh # SDL3, pinned version, into ~/opt/sdl3-static
cmake -S . -B build -DCMAKE_PREFIX_PATH=$HOME/opt/sdl3-static
cmake --build buildSDL3 found -- video boards enabled (windowed);sudo snap install z88dk --edge. The snap only sees paths under $HOME,
so the clone has to be there too.After cloning, run:
tools/setup.shIt checks the requirements, then builds every project. Each project gets
its own altairsim machine and CP/M disks in work/, and its program on that
disk. Nothing is installed. Without z88dk, the projects that need it are
skipped. tools/setup.sh --check runs only the check.
To run a program, start altairsim from the project's work/:
cd software/asm/hello/work
altairsim cadzilla.toml
A0>HELLOaltairsim> monitor, RUN
carries on, and QUIT leaves.A0> before stopping: the BIOS writes its last disk
track to the image only then.Each project has its own build.sh, which rebuilds it onto its disk, e.g.
software/m80/gfxdemo/build.sh.
--clean resets the project's disks from the pristine images first.build/<NAME>.LOG.tools/altairsim/README.md has the details, and how an AI assistant drives
the same machines.
The board decodes a single 8-byte-aligned base I/O address, set by SW1 (see below). All board registers are addressed as offsets from that base address:
| Offset | Register | Access |
|---|---|---|
Base + 0 | HD63484 Address/Status Register (RS = 0) | Read/Write |
Base + 1 | MODE register (board configuration, write only) | Write only |
Base + 2 | HD63484 Control/FIFO Register (RS = 1) | Read/Write |
Base + 3 | Reserved / not decoded | — |
Base + 4–Base + 7 | Bt453 video DAC registers | Read/Write |
Base + 1, write only)| Bit | Name | Description |
|---|---|---|
| 0 | HSPOL | Horizontal sync polarity: 0 = positive sync pulse, 1 = negative sync pulse |
| 1 | VSPOL | Vertical sync polarity: 0 = positive sync pulse, 1 = negative sync pulse |
| 2 | AMODE | Address mode: 0 = single access mode, 1 = interleaved access mode |
| 3 | OLEN | Overlay enable: 0 = overlay plane blanked (shift register loads zeros), 1 = overlay pixels displayed over the frame buffer |
| 4 | OLSEL | Overlay select: 0 = lower half, 1 = upper half of the overlay memory — selects which 64K-word half of the 128K-word overlay SRAM a drawing-mode CHR screen addresses |
| 5–7 | — | Reserved |
The overlay (U19, 1 bit per pixel, mapped 1:1 onto frame-buffer pixels) is drawn by targeting an ACRTC screen with the CHR bit set in its Memory Width register. A CHR screen only has a 64K-word address space, so OLSEL selects which 64K-word half of the 128K-word overlay SRAM that screen addresses. OLSEL is cleared to 0 by reset. A CHR screen must never be displayed — overlay display is driven by the frame buffer's own display cycles, independent of OLSEL.
SW1 is an 8-position DIP switch that sets the board's I/O base address and host interface options:
| Switch | Function | On | Off |
|---|---|---|---|
| SW1-1 – SW1-5 | I/O base address (address bits 7:3) | — | — |
| SW1-6 | HD63484 host bus width | 8-bit host interface: DACK* follows RESET*, so it is low during reset | 16-bit host interface: DACK* is pulled high |
| SW1-7 | 16-bit address decode enable | Decodes the full 16-bit I/O address (A15–A8 must be 00h) | Decodes only the 8-bit I/O address |
| SW1-8 | Interrupt enable | HD63484 interrupt request connected to the S-100 bus | Interrupt request disconnected from the S-100 bus |
See the board manual for full details.
Copyright (C) 2026 Todd Houg.
schematics/, the
GAL logic in pld/, and the board manual) is licensed under the
CERN Open Hardware Licence Version 2 - Permissive
(CERN-OHL-P-2.0).software/, tools/ and tests/) is
licensed under the GNU General Public License,
version 3 or (at your option) any later version (GPL-3.0-or-later).The manufacturers' datasheets in docs/datasheets/, and the
third-party CP/M tools on the disk images, are not covered by either
license. See LICENSE for the full breakdown.
See CLAUDE.md for AI-assistance working notes.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 47 | 0.1uf | S-100:C_Rect_L9.1mm_W2.5mm_P7.62mm_MKT | C1, C2, C10, C11, C12, C13, C14, C17, C18, C19, C20, C21, C26, C27, C28, C29 +31 |
| 21 | 74F245 | S-100:DIP-20_W7.62mm_Socket | U20, U21, U22, U23, U24, U25, U26, U27, U28, U29, U30, U31, U32, U33, U34, U35 +5 |
| 18 | 0.1uf | Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder | C70, C71, C72, C73, C74, C75, C76, C77, C78, C79, C80, C81, C82, C83, C84, C85 +2 |
| 17 | 0.1uf | S-100:C_Rect_L9.1mm_W2.5mm_P7.62mm_Small_Pads | C8, C15, C16, C22, C23, C24, C25, C31, C32, C38, C39, C45, C51, C52, C58, C61 +1 |
| 10 | 1N4148 | Diode_SMD:D_0805_2012Metric_Pad1.15x1.40mm_HandSolder | D2, D3, D4, D5, D6, D7, D8, D9, D10, D11 |
| 9 | 74F676 | S-100:DIP-24_W7.62mm_Socket_Small_Pads | U2, U3, U4, U5, U6, U7, U8, U9, U10 |
| 9 | CY62136ESL | Package_SO:TSOP-II-44_10.16x18.41mm_P0.8mm | U11, U12, U13, U14, U15, U16, U17, U18, U19 |
| 7 | GAL16V8 | S-100:DIP-20_W7.62mm_Socket | U45, U46, U48, U55, U56, U57, U58 |
| 3 | 0.1uf | Capacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolder | C66, C67, C68 |
| 3 | 74ALS857 | S-100:DIP-24_W7.62mm_Socket | U52, U53, U54 |
| 3 | 75R | Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal | R8, R9, R10 |
| 2 | 10uf | S-100:C_Rect_L9.1mm_W2.5mm_P7.62mm_MKT | C69, C88 |
| 2 | 33R | Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal | R11, R12 |
| 2 | 74LS573 | S-100:DIP-20_W7.62mm_Socket | U49, U50 |
| 1 | 1.2V | Diode_THT:D_A-405_P7.62mm_Horizontal | D1 |
| 1 | 10K | Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal | R1 |
| 1 | 4.7K | Resistor_THT:R_Array_SIP8 | RN1 |
| 1 | 74LS04 | S-100:DIP-14_W7.62mm_Socket | U42 |
| 1 | 74LS244 | S-100:DIP-20_W7.62mm_Socket | U51 |
| 1 | 74LS273 | S-100:DIP-20_W7.62mm_Socket | U41 |
| 1 | 74LS85 | S-100:DIP-16_W7.62mm_Socket | U44 |
| 1 | 74LS86 | S-100:DIP-14_W7.62mm_Socket | U43 |
| 1 | ACO-xxxMHz | Oscillator:Oscillator_DIP-14 | Y1 |
| 1 | BT453_DIP40 | S-100:DIP-40_W15.24mm_Socket | U47 |
| 1 | Conn_02x08_Odd_Even | Connector_PinHeader_2.54mm:PinHeader_2x08_P2.54mm_Vertical | J2 |
| 1 | DE15_Socket_HighDensity | Connector_Dsub:DSUB-15-HD_Socket_Horizontal_P2.29x1.90mm_EdgePinOffset3.03mm_Housed_MountingHolesOffset4.94mm | J1 |
| 1 | FerriteBead_Small | S-100:C_Rect_L9.1mm_W2.5mm_P7.62mm_MKT | FB1 |
| 1 | GAL16V8 | S-100:DIP-20_W7.62mm_Socket_Small_Pads | U60 |
| 1 | HD63484P | S-100:DIP-64_W22.86mm_Socket | U1 |
| 1 | LM1084-5.0 | Package_TO_SOT_THT:TO-220F-3_Horizontal_TabDown | U59 |
| 1 | RSET | Resistor_THT:R_Axial_DIN0204_L3.6mm_D1.6mm_P7.62mm_Horizontal | R7 |
| 1 | S100_MALE | S-100:S100_MALE | P1 |
| 1 | SW_DIP_x08 | S-100:DIP-16_W7.62mm_Socket | SW1 |
It measures 253.6 × 134.2 mm and has 6 copper layers, 1.6 mm thick.
172 parts, built around the 74F245D, 74F676PC, 74LS573PC and 74LS04PC. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the ToddHoug/cadzilla repository on GitHub, at the commit this page was made from: the board is schematics/cadzilla.kicad_pcb and its schematic schematics/Data BUffers.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask ToddHoug before reusing the design.

electrickery/VIO_MPF_I
Extended firmware for the 6845 based video card for the Microprofessor MPF-I(b)

alvaroalea/QL_Cumana_FLoppyController
A clone of the Cumana's Disk Interface for the Sinclair QL


reifsnyderb/Atari-1090XL-80CVC
Re-make of the Atari 1090XL 80 column card for monochrome monitors.



lafehubert/electronics
A place for info and code relating to my electronics projects
