Oldskooler Ramblings

the unlikely child born of the home computer wars

Archive for the ‘Programming’ Category

8088 Domination

Posted by Trixter on June 17, 2014

A few days ago, I debuted 8088 Domination at @party 2014, which is an official sequel to 8088 Corruption that I made 10 years earlier. Like the former, 8088 Domination displays full-motion color video with audio on a 1981 IBM PC with CGA, a Sound Blaster, and any hard drive — but, unlike the former, Domination uses full graphics mode whereas Corruption used only text mode. This is significant because graphics mode requires 8x more memory and processing, and I had to combine a lot of creative and technical disciplines in order to pull it off.

Here is a capture of 8088 Domination running directly off of my IBM PC 5160; video is the composite CGA output signal, and audio is from a Sound Blaster Pro 2.0.

I am working on a postmortem write-up so you can all learn how I did it, but until then, download the party version at https://www.scene.org/file.php?file=%2Fparties%2F2014%2Fatparty14%2Fdemo_oldschool%2F8088_domination_party_version.zip&fileinfo if you’d like to run it on your own vintage hardware.

PS: A second round of thanks to Great Hierophant, for without whom I wouldn’t have been able to show off my production. He provided the hardware locally that I was unwilling to ship across the country.

Posted in Demoscene, Digital Video, Programming, Vintage Computing | 15 Comments »

Dev journal, day 37

Posted by Trixter on June 5, 2014

Dev journal, day 37

Giving a bit too much away here, but hit another milestone and wanted to celebrate a bit, so enjoy. It should be pretty obvious what I’m doing at this point.

Posted in Demoscene, Programming, Vintage Computing | Leave a Comment »

Dev journal, day 30

Posted by Trixter on May 30, 2014

Dev journal, day 30

Posted in Demoscene, Programming, Vintage Computing | 2 Comments »

Dev journal, day 22

Posted by Trixter on May 22, 2014

Dev journal, day 22

Posted in Demoscene, Programming, Vintage Computing | Leave a Comment »

Dev journal, day 20

Posted by Trixter on May 20, 2014

image

Right first time. Awesome.

Posted in Demoscene, Programming, Vintage Computing | Leave a Comment »

Dev journal, day 19

Posted by Trixter on May 20, 2014

Dev journal, day 19

Before you ask, this *IS* a bug. Always make sure your pointers are normalized, kids!

Posted in Demoscene, Programming, Uncategorized, Vintage Computing | Leave a Comment »

Dev journal, day 14

Posted by Trixter on May 14, 2014

1E            PUSH    DS
0E            PUSH    CS
1F            POP     DS
BEFFFF        MOV     SI,FFFF
B800B8        MOV     AX,B800
8EC0          MOV     ES,AX
FC            CLD

Posted in Demoscene, Programming, Vintage Computing | 4 Comments »

Dev journal, Day 1

Posted by Trixter on May 1, 2014

Dev journal, Day 1

Posted in Demoscene, Programming | Leave a Comment »

Hump Algorithms

Posted by Trixter on August 27, 2013

I have the dumbest first-world problems. The current one: I’ve come up with new ideas for a retroprogramming/demoscene project, ideas that nobody on my platform (4.77MHz 8088) has ever attempted. They’re pretty radical, and on par with 8088 Corruption in terms of code cleverness and impact, except this time, I actually know what I’m doing (as opposed to stumbling into it somewhat by accident with Corruption). Every time I think about what is possible, I get really excited and obsess over implementation details. In my head, it’s all coded and running beautifully, bringing shocks of laughter to other retroprogrammers and demosceners alike.

The problem is, even after weeks of design, it’s still in my head.

What I have planned relies heavily on same tricks as the 8-bit democoding scene, namely lots of tables. Generation of those tables, compared to how they are used, is a highly asymmetric process: It can take hours or days to create the table, whereas using it only costs a few cycles for a memory lookup. This very similar to the process of vector quantization, where coming up with the codebook is an NP-hard problem that there is no universal solution for. To bring my ideas to life, I need to write programs that take advantage of gigs of memory and multiple cores to come up with the tables I need. So why not just write them? What’s stopping me is the dumbest of dumb problems: I simply haven’t written any large, modern, multithreaded applications before. All of my programming over the last 30 years has been either in Pascal, or assembler, using dialects and architectures that aren’t applicable to modern resources any more.

“So pick up a new language, ya moron!” is what all of you just screamed at me. I know, I know. But this is what kills me: It would take me at least a month to pick up a new language, learn its IDE, learn its visual form/component system, and the inevitable learning of how to debug my code when it all goes pants. I’ve been putting it off for at least a decade.  I can do it… but it would take at least a month to ramp up to full speed! And (said in Veruca Salt cadence) I want to code up my idea NOW!

I’m frozen. What a stupid, stupid first-world problem.

I need an algorithm for getting over the hump that can be solved in polynomial time.

Posted in Demoscene, Programming, Vintage Computing | 17 Comments »

World Firsts and Happy Accidents

Posted by Trixter on July 20, 2013

(Impatient?  Scroll down to the end of this post if you just want to watch the videos or download the programs.)

The demoscene used to be based almost completely on “world firsts”, which are bonus levels of street cred given when you are the first in the world to produce a living, working example of some new technological marvel.  In the early days it was as simple as “most sprites onscreen at once” (impressive because you were exceeding the hardware’s published limitations for that kind of thing) or “first example of texture mapping on PC” or similar.  Nowadays the “world first”, as a pure concept, as been boiled down to “first demo for a platform”.  So for modern hardware, this will likely translate into something like the very first demo for the XBone or the PS4.

But what of old hardware?  Just about every single old personal computer has had a demo made for it.  Pouet lists over 25,000 demos for over 90 platforms from the Acorn to the ZX Spectrum.  There are demos for the TI-86 calculator, for old nokia cell phones… even a goddamn typewriter.  Linus Åkesson even created his own hardware platform out of a microcontroller when nothing else seemed interesting.  It is pretty hard to find something that hasn’t had a proper demoscene demo made for it.

Luckily, my obsession with the IBM PCjr’s 30th anniversary pays off in this area.  Around the beginning of the year, I noted that there have been a few demos that supported the Tandy 1000’s 16-color graphics and 3-voice sound, but nothing that was specifically designed for the PCjr, which made it a “virgin platform”.  Since I had intimate knowledge of the CPU and had a decent development toolchain, and with @party 2013 coming up, I realized this was probably my last chance to achieve a world first, so I starting writing code around April.

To qualify as a “world first” for the platform, I felt it was appropriate to perform one or more effects that specifically required a PCjr to run, and for good measure, that nobody had ever seen before so that DOSBox or any other emulator would not be able to run the code properly.  One of my favorite features of the PCjr is a real vertical retrace interrupt that you can use to perform display operations “behind the scenes” so that any tricks you’re pulling remain invisible.  Coding to use that went very well, and no emulator or clones (save for a few early Tandy 1000 models) provided it, so I started off on a proper little demo for the platform.

Along the way, I found that my ideas to use the vertical retrace interrupt broke down because I needed to do more operations than I had time for in the blanking interval, so I wrote my own interrupt sync’d to the interval I wanted using the system timer instead.  I also discovered that the PCjr’s legendary lack of speed (it’s the slowest PC clone ever made) meant I couldn’t use the 320x200x16 mode I originally wanted to — there’s just too many bits to move around in a reasonable amount of time.  To maintain world-first status, I pondered creating a PCjr cartridge-based demo — a ton of work I wasn’t really prepared for — when I discovered that some poor coding on my part had resulted in some odd graphical properties in the 160x200x16 mode.  The wrong values had configured the PCjr’s video gate array to double each line.  Completely by accident, I had created a lower-res 160x100x16 mode with a true linear chunky organization!  (This is not the same as CGA “lowres” mode, which is based on text mode and is slow to work with.)

That mode was a great match for the slower speed of the PCjr, and I proceeded to write the entire demo and all its effects to use that mode.  I had already started a silly joke game for the PCjr, and when I discovered the 160×100 mode, I retrofitted the game to use it as well!  Both of these productions won 2nd and 1st place in their respective categories at @party 2013 (and Phoenix doing the graphics and sound for the demo was a big help; check the video below for his tiny Charlie Chaplin).

But more important than winning competitions… world first, y’all.  I’m part of an elite group of less than 100 people in the entire world.  Which I know just about nobody cares about, but I care, and that’s what makes me smile.  :-)

To view the demo, watch INTROjr on Youtube.  Regrettably, the demo is not shown at the full framerate because Youtube doesn’t support 60fps video and has no plans to in the near future (of course, they support near useless 4K resolution video, but whatever).  Download links for the software can be found on INTROjr’s Pouet page.  .

To view the game with a silly theme attached, watch HARLEM SHAKEjr  on Youtube.  Download links for the software can be found on SHAKEjr’s Pouet page.

PS: If you want source code to the PCjr-specific bits, such as the music player, the vertical retrace interrupt, setting the special graphics mode up, using multiple graphics pages, reading the joystick, etc., drop me a line.

Posted in Demoscene, Programming, Vintage Computing | 1 Comment »