Behold your vector nightmare, Amiga fans!

2021-03-06 - Reading time: 6 minutes

Kickstart1_3[3].pngOver on Hacker News there was an entry about the "awful" Amiga Kickstart 1.x icon and why it looked the way it did. This led to a link over on Stack Overflow where it was revealed that this was graphic actually drawn in a vector style, as opposed to raster pixels.

They also provided the actual bytes used to render the graphic. I thought it'd be fun to write a little parser to render these bytes.

And so did several other people, apparently, as I'm discovering now. :|

Anyway, here's my humble Codepen. And if that goes down, the original code is below the embed. 😎

(I skipped flood fill because I used two.js for this, and didn't realize until it was too late that I'd chosen poorly. Easy enough to swap out the graphics library, but it's time to move on.)

See the Pen Amiga Kickstart vector parser by Toby D (@Fortyseven) on CodePen.

/*
Inspired by:
https://retrocomputing.stackexchange.com/questions/13897/why-was-the-kickstart-1-x-insert-floppy-graphic-so-bad/13901

2021-03-06
*/

const floppy = [
    0xFF, 0x01, 0x23, 0x0B, 0x3A, 0x0B, 0x3A, 0x21, 0x71, 0x21, 0x71, 0x0B, 0x7D, 0x0B, 0x88, 
    0x16, 0x88, 0x5E, 0x7F, 0x5E, 0x7F, 0x38, 0x40, 0x38, 0x3E, 0x36, 0x35, 0x36, 0x34, 0x38, 
    0x2D, 0x38, 0x2D, 0x41, 0x23, 0x48, 0x23, 0x0B, 0xFE, 0x02, 0x25, 0x45, 0xFF, 0x01, 0x21, 
    0x48, 0x21, 0x0A, 0x7E, 0x0A, 0x8A, 0x16, 0x8A, 0x5F, 0x56, 0x5F, 0x56, 0x64, 0x52, 0x6C, 
    0x4E, 0x71, 0x4A, 0x74, 0x44, 0x7D, 0x3C, 0x81, 0x3C, 0x8C, 0x0A, 0x8C, 0x0A, 0x6D, 0x09, 
    0x6D, 0x09, 0x51, 0x0D, 0x4B, 0x14, 0x45, 0x15, 0x41, 0x19, 0x3A, 0x1E, 0x37, 0x21, 0x36, 
    0x21, 0x36, 0x1E, 0x38, 0x1A, 0x3A, 0x16, 0x41, 0x15, 0x45, 0x0E, 0x4B, 0x0A, 0x51, 0x0A, 
    0x6C, 0x0B, 0x6D, 0x0B, 0x8B, 0x28, 0x8B, 0x28, 0x76, 0x30, 0x76, 0x34, 0x72, 0x34, 0x5F,
    0x32, 0x5C, 0x32, 0x52, 0x41, 0x45, 0x41, 0x39, 0x3E, 0x37, 0x3B, 0x37, 0x3E, 0x3A, 0x3E, 
    0x41, 0x3D, 0x42, 0x36, 0x42, 0x33, 0x3F, 0x2A, 0x46, 0x1E, 0x4C, 0x12, 0x55, 0x12, 0x54, 
    0x1E, 0x4B, 0x1A, 0x4A, 0x17, 0x47, 0x1A, 0x49, 0x1E, 0x4A, 0x21, 0x48, 0xFF, 0x01, 0x32, 
    0x3D, 0x34, 0x36, 0x3C, 0x37, 0x3D, 0x3A, 0x3D, 0x41, 0x36, 0x41, 0x32, 0x3D, 0xFF, 0x01, 
    0x33, 0x5C, 0x33, 0x52, 0x42, 0x45, 0x42, 0x39, 0x7D, 0x39, 0x7D, 0x5E, 0x34, 0x5E, 0x33, 
    0x5A, 0xFF, 0x01, 0x3C, 0x0B, 0x6F, 0x0B, 0x6F, 0x20, 0x3C, 0x20, 0x3C, 0x0B, 0xFF, 0x01, 
    0x60, 0x0E, 0x6B, 0x0E, 0x6B, 0x1C, 0x60, 0x1C, 0x60, 0x0E, 0xFE, 0x03, 0x3E, 0x1F, 0xFF, 
    0x01, 0x62, 0x0F, 0x69, 0x0F, 0x69, 0x1B, 0x62, 0x1B, 0x62, 0x0F, 0xFE, 0x02, 0x63, 0x1A,
    0xFF, 0x01, 0x2F, 0x39, 0x32, 0x39, 0x32, 0x3B, 0x2F, 0x3F, 0x2F, 0x39, 0xFF, 0x01, 0x29, 
    0x8B, 0x29, 0x77, 0x30, 0x77, 0x35, 0x72, 0x35, 0x69, 0x39, 0x6B, 0x41, 0x6B, 0x41, 0x6D, 
    0x45, 0x72, 0x49, 0x72, 0x49, 0x74, 0x43, 0x7D, 0x3B, 0x80, 0x3B, 0x8B, 0x29, 0x8B, 0xFF, 
    0x01, 0x35, 0x5F, 0x35, 0x64, 0x3A, 0x61, 0x35, 0x5F, 0xFF, 0x01, 0x39, 0x62, 0x35, 0x64, 
    0x35, 0x5F, 0x4A, 0x5F, 0x40, 0x69, 0x3F, 0x69, 0x41, 0x67, 0x3C, 0x62, 0x39, 0x62, 0xFF, 
    0x01, 0x4E, 0x5F, 0x55, 0x5F, 0x55, 0x64, 0x51, 0x6C, 0x4E, 0x70, 0x49, 0x71, 0x46, 0x71, 
    0x43, 0x6D, 0x43, 0x6A, 0x4E, 0x5F, 0xFF, 0x01, 0x44, 0x6A, 0x44, 0x6D, 0x46, 0x70, 0x48, 
    0x70, 0x4C, 0x6F, 0x4D, 0x6C, 0x49, 0x69, 0x44, 0x6A, 0xFF, 0x01, 0x36, 0x68, 0x3E, 0x6A,
    0x40, 0x67, 0x3C, 0x63, 0x39, 0x63, 0x36, 0x65, 0x36, 0x68, 0xFF, 0x01, 0x7E, 0x0B, 0x89, 
    0x16, 0x89, 0x5E, 0xFE, 0x01, 0x22, 0x0B, 0xFE, 0x01, 0x3B, 0x0B, 0xFE, 0x01, 0x61, 0x0F, 
    0xFE, 0x01, 0x6A, 0x1B, 0xFE, 0x01, 0x70, 0x0F, 0xFE, 0x01, 0x7E, 0x5E, 0xFE, 0x01, 0x4B, 
    0x60, 0xFE, 0x01, 0x2E, 0x39, 0xFF, 0xFF
];

class AmigaVectParser {
    constructor(bytes, elem) {
        this.palette = ["#FFFFFF", "#000000", "#7777CC", "#BBBBBB"];
        this.offset = [0,0];
        this.prevOffset = [0,0];
        this.curColor = 0;
        this.isDrawing = false;
        this.buffer = bytes || [0xff, 0xff];
        this.done = false;

        this.two = new Two({ width: 640, height: 400 }).appendTo(elem);
    }

    doCmd(cmd_pair) {
        if (cmd_pair[0] === 0xff) {
            this.isDrawing = false;
            if (cmd_pair[1] === 0xff) {
                // cmd_done
                this.done = true;
                return;
            } else {
                // cmd_colorSet
                this.curColor = cmd_pair[1];
                return;
            }
        } else if (cmd_pair[0] === 0xfe) {
            // cmd_floodFill
            this.isDrawing = false;
            this.pointer += 2; //TODO FLOOD FILL
            return;
        }
        if (!this.isDrawing) {
            // first coordinate in a poly-line
            this.prevOffset[0] = cmd_pair[0];
            this.prevOffset[1] = cmd_pair[1];
            this.isDrawing = true;
            return;
        } else {
            // continuing the poly-line
            this.offset[0] = cmd_pair[0];
            this.offset[1] = cmd_pair[1];

            let line = this.two.makeLine(
                this.prevOffset[0] * 2,
                this.prevOffset[1] * 2, // doubling up X/Y to make it easier to see at 640x400
                this.offset[0] * 2,
                this.offset[1] * 2
            );

            line.stroke = this.palette[this.curColor];
            line.linewidth = 1;

            this.prevOffset[0] = this.offset[0];
            this.prevOffset[1] = this.offset[1];
        }
    }

    draw() {
        let cmd = [0, 0];
        let pointer = 0;        
        this.done = false;

        while (!this.done) {
            cmd[0] = this.buffer[pointer++];
            cmd[1] = this.buffer[pointer++];
            this.doCmd(cmd);
        }
        this.two.update();
    }
}

renderer = new AmigaVectParser(floppy, document.getElementById("draw-shapes"));
renderer.draw();

Datacom 1200

2020-12-29 - Reading time: 12 minutes

This is a weird post. Another one of those random things I never set out to write. But for some reason I feel the need to document things when there's little solid information online. Seeing anything go down the memory hole depresses me, so the least I can do is keep something alive with what I find.

A Half-Second Rack Focus Shot

I was surfing some old TV commercials from the 70s and 80s, as one does.

Eventually I came across this old CKCO Canadian TV station promo from 1983 called "We're Bringing It Home To You" over on the wonderful Retrontario channel on YouTube.

The promo features a quick montage tour of all the hot new technology and crew behind the station you're currently enjoying.

One of the machines that brings you their quality content has a fancy rack focus effect very early in the clip, at the 3 second mark. It's on a keyboard with the label "Datacom 1200" across the top:

datacom1200.jpg

Once in a while I get mentally snagged by something like this.

I see a technology from the era I don't recognize and go on a little detour for a half-hour reading about it. (Imagine this behavior spread out over a lifetime and a lot of things about me begin to make a lot of sense.)

Anyway, this time around I couldn't find... well, anything. The entire search engine bandwidth for "Datacom 1200" in 2020 is devoted to a product from a Brazilian company named "Datacom" that sells a family of network hardware. And one of the lines features "1200" in the name.

Hey, it's almost 40 years later. Whatchewgonnado?

A Lead!

Actually, it's only partially true that I didn't find anything. I fibbed a smidge.

In fact, the first search result for "Datacom 1200" is an empty listing on an printer ink company's website. Among the various third-party ink replacements they provide, under their "Other" category, is the "Bell DataCom 1200". 🤔

Ahh! Indeed, searching "Bell DataCom" as a full brand name sent me on a little trip that included this ad from Bell Canada in a mid-October 1974 issue of The Ottawa Journal; presumably* two older models of Datacom, the 500 and 600.

(*I say 'presumably' because the Amiga 500 came out after the Amiga 1000; numerical
superiority is not always an indicator of temporal positioning! 😉)

bell-canada-datacom-500-datacom600-ad.png 

The Bell Datacom is a line of old school printer terminals from the Bell Canada's "Computer Communications Group".

Pretty much what I expected. No real surprise there.

"The Datacom 500 terminal is a compact, self-contained and quiet unit that allows office personnel to send and receive messages from a remote computer. It is ideally suited for consumer-finance applications and such transactions as journal entries, payment inquiries and file up-dating."

"The Datacom 600 is a buffered keyboard teleprinter. This general purpose unit is useful in a wide variety of applications such as accounting information processing, order entry and invoicing, and inventory control."

A Quick Zenith 33000 Detour

zenith-33000.jpgOne interesting, apparently unrelated thing to note: "For more information, just dial Operator and ask for Zenith 33000."

My first thought: maybe these Bell-branded terminals are actually sourced from a Zenith supplier and rebranded. Zenith, after all, dipped their toe into the computer world for a minute there, around that time.

But here's the thing: do a search for "Zenith 33000". You'll find a lot of old newspapers returning results (from various sites that want you to subscribe to all of them to get access to a single article... good luck on that).

And it's not limited to Bell, or even this line of terminals:

This, however, is a dead end.

"Zenith 33000" is a Zenith number. Turns out this was a system of toll-free calling prior to modern toll-free numbers.

A fun bit of telephony trivia, to be sure, but it's completely unrelated to anything here. 😏

Back to the Datacom 1200...

A December 18th issue of Computerworld from 1978 refers to the 1200 model specifically, on it's introduction:

computerworld-1978-datacom1200.png

"The Datacom 1200 family of teleprinters has been introduced by the Computer Communications Group (CCG). Available as a receive-only (RO) terminal or equipped with a keyboard, Datacom 1200 prints bidirectionally at a maximum speed of 180 char./sec and produces up to 132 char./line.

Vucom Output

"Supplied by Digital Equipment Corp., the Datacom 1200 receive-only teleprinter can serve as a hard-copy output device for the Vucom 1, 3 and 4 series of CRTs, as a peripheral printer for mini- and microcomputer systems and for remote multicopy printing from a host data base in a stand-alone configuration.

"Rates for the Datacom 1200 in Canada are $2,715 for the RO model, with an additional $150 for the keyboard send-receive version. Filed rental rates, which are subject to regulatory approval, are $146/mo for the RO model, with an additional $7/mo for the KSR unit. Maintenance costs $44/mo.

Supplied by DEC, huh? Now that's interesting. From 1970 to the 80s, the once mighty Digital offered their famous DecWriter series of line terminals.

And I'm gonna call it now: the Bell Datacom 1200 is probably a rebranded DecWriter III.

I can't find anything specifically saying so, but I will make my case, and let you decide!

The Evidence

  • The DecWriter III was released in January 1977. The Computerworld article is from December 1976, referring to January '77 availability for the Datacom 1200.
  • Both have 180 cps printing speeds.
  • Both support 132-characters per line, max
  • The DecWriter III was a 1200 baud terminal; likely where the "Datacom 1200" number comes from.

But here's my smoking gun...

comparison-decwriter3-datacom1200.jpg

The keyboard of the DecWriter III compared to the corner of the Datacom 1200 we're seeing in the promo spot:

  • Same shape Shift and Return key (though these are probably common for the era).
  • Return has a pipe/backslash and a delete key to the right of it.
  • There's a cluster of at least four keys above the -/+/~/backspace keys.
  • There's even a bit of space for the custom Datacom 1200 badge.
  • Oh, and they're basically the same color. 😏

I feel good about this. The evidence is pretty convincing. There's just not any official word I'm finding. Yet.

If you find anything, or know first-hand, hit me on Twitter and I'll update this post.

Still Remembered. Sort of.

One super interesting thing about "Bell Datacom" is that it shows up in a LOT of ink supplier listings -- the 1200 model, specifically. In fact, ink listings take up most of the "Bell Datacom 1200" search results on Google.

Even Staples seems to have an atrophied entry for it in their ink category. Guessing there's a lot of copy/pasting of "machines that use ink" among companies, and either the 1200 still gets play today (unlikely considering how little direct information there is on it), or it simply never got culled over the years.

Anyway...

This was a hell of thing to write based on a half second blip.

I just wanted this to be little more than an "I SEE YOU, DATACOM 1200" type post for anyone in the future who might look for it, and be confused by the lack of information. I didn't expect to do a full on bit of research, and even come to a reasonable conclusion about it. Huh.

Until next time. 🍻


Retro Scans: Columbia Video Game Club

2013-02-08 - Reading time: 4 minutes
Omni, July 1983

I was flipping through some old Omni magazines (July 1983) that I'd dug up while cleaning out some boxes, and I found a treasure trove of awesome retro goodness.  So, I'm going to start scanning!  The first one is the Columbia Video Game Club, much like it's scammy cousin the Columbia House Music Club, except for video game cartridges.

At $4.95 A Game You Can't Miss. 

Take any one of these video games for only $4.95 when you join the Columbia Video Game Club and agree to buy just 2 more games at regular Club prices in the coming year.

Just look at the video games offered here... all available for home enjoyment on your Atari® Video Computer System™! They retail anywhere from $26.95 to $34.95 each, yet you can have any one for only $4.95 -- with membership in the Columbia Video Game Club!  This is an exciting new service that offers you the newest home video games on a convenient shop-at-home basis -- and at great club savings!

How the Club works: approximately every six weeks (up to 9 times a year) you will receive the Club's colorful Video Game Magazine.  It announces the Hit Game Selection...generally a brand-new arcade winner. In addition, the Magazine will picture and describe many other video games, new gadgets to upgrade your own Atari® system, helpful hints on how to improve your scores, a poster, and much more.

If you want the Hit Game Selection, you need do nothing -- it will be sent to you automatically.  If you want one of the alternate games offered -- or nothing at all -- just tell us so on the response card always provided and mail it by the date indicated.  You'll always have ten days to make your decision.  If you ever receive a game without having had ten days to decide, return it at our expense.

The game cartridges you order will be mailed and billed to you at regular Club prices -- which currently range from $24.95 to $29.95, plus shipping and handling, and appropriate sales tax.  Remember, you don't have to buy a video game every time you hear from us -- your only membership obligation is to buy as few as two games in the coming year, and you may cancel membership at any time after doing so.  If you decide to continue, you'll be eligible for our generous money-saving bonus plan.

10-Day Free Trial: we'll send complete details of the Club's operation with your introductory cartridge. If you are not satisfied for any reason whatsoever, just return everything within 10 days for a full refund and you will have no further obligation.  So mail the coupon now!

WANT STILL ONE MORE GAME for $4.95? You can have ANY TWO of these video games for only $.95 each -- if you agree to buy four more (at regular Club prices) in the coming two years! Just check box in application and enclose $9.90 for your two games.

All applications subject to review; Columbia Video Game Club reserves the right to reject any application or cancel any membership.

Columbia Video Game Club, Dept. 2CQ, 3000 North 35th Street, Terre Haute, IN 47811, 1-800-457-0866 (In Indiana call 812-466-8125 collect.)

GC18/F83