The Kodak Diconix 150 is a battery-powered portable thermal inkjet released in 1986 by Diconix Inc. of Dayton, Ohio. Kodak bought Diconix in 1988, which is why the machine wears a Kodak badge and the stock ROM prints "A KODAK COMPANY" on its self-test page.
The board is silkscreened UK-EP01B MAIN CONTROL PWB. On it is a NEC D78C10G at 11.0592 MHz carrying a date code of 8604EK, which is to say it was made in early 1986 and has been sitting there ever since. 32 KB of ROM in a socketed Fujitsu MBM27C256-25, 8 KB of SRAM, a Centronics port, and an HP 51604A ThinkJet head. Twelve nozzles, eight of them usable per pass, 96 dpi per pass. There is no ROM checksum anywhere on the boot path, which I verified before I touched anything, and which is the entire reason this project is possible.
It speaks a fixed Epson-style ESC text command set and nothing else. Which means nothing made this century can print to it. Windows will not offer you a driver, CUPS has no queue for it, and your phone has never heard of it.
There is a second reason I wanted this machine specifically. I grew up on one. From 1989 to about 1995 a Kodak-badged Diconix was the only printer in the house, and every graphic it ever printed for me came out at about two thirds size: three quarters tall, five eighths wide. That turns out to be a grid mismatch nobody had written down. The hardware lays dots at 96 or 192 dpi horizontal by 96 dpi vertical, per HP's own service manual for the 2225 ThinkJet engine. Epson's FX graphics standard assumes 60, 120 or 240 dpi across and 72 down. Nothing in the chain rescales, so vertical always lands at 72/96 and double-density horizontal lands at 120/192. Two different fractions on two axes, which is why the aspect looked squeezed as well as small. I spent six years assuming that was just how printers were. Fixing it thirty years later by writing the printer new firmware is the shape this project took.
What I did about that
I did not write it a driver. I wrote it new firmware.
DiKon is a from-scratch PCL3 raster interpreter in uPD78C10 assembly, patched into the stock Kodak ROM in space reclaimed from the resident fonts. The interpreter runs on the printer's own 8-bit CPU. 300 dpi PCL raster goes in the parallel port and gets decoded and re-interleaved on-chip to the head's native 192 dpi vertical by 1152-dot full-carriage grid.
The whole point of putting it in there instead of on a PC is that the host then needs nothing at all. Not a converter, not a spooler, not a print processor, not an install:
- Windows 11 - the stock in-box HP DeskJet 500 driver
- Linux / macOS - Gutenprint pcl-500 at 300 dpi, through CUPS
- Android - NokoPrint, "HP DeskJet 500 (Gutenprint)" or "Generic PCL4", mono 300 dpi
- Anything else - any generic PCL 3/4 mono 300 dpi raster driver
Always 300 x 300 dpi and mono. 150 dpi prints at half scale, legible but wrong size.
The Android row is the one I care about. A phone in your pocket printing to a printer built the year Top Gun came out, over a Centronics cable, with no app written for it by anybody.
Bone-stock hardware. No board modification, no piggyback, no daughtercard. Reflash the 27C256 or drop in a doubled W27C512 and it runs.
How it works
The stock ESC dispatch table at 0x196A gets its ESC* entry repointed at my parser at 0x2800. ESC& and ESC( are pointed at a swallow routine, because they are free on the plain 150 and harmless to consume. Six patched bytes in the table. Every other ESC handler stays stock, so the printer's native text path is untouched. The rest of DiKon is one blob living at 0x2800 to 0x2F28, in a ROM window that was proven unreferenced rather than merely looking empty.
The pipeline is:
ESC* -> M7STAR parser -> DISPATCH -> PROCESS_ROW -> column buffers -> EMIT -> stock ring (decode + bit) COLSA / COLSB (walk-back) THR / DTHR throttle
It never buffers a page. It processes one 16-row band at a time into 8 KB of RAM.
The interleave is the part I am proudest of. The head prints 8 usable rows per pass at 96 dpi. A band...
Read more »
TheRND2
ElectroScope Archive
jaromir.sukuba
J.C. Nelson
Hugo Melder