Friday, January 15, 2016

RC2016/01 Half-time Update

Wow, half-way through January already! After a slow start, I now have my Xmas Rush port to the MC-10 well underway. I recorded a few more progress reports throughout the past week -- let's review!


Graphics Mode

The Christmas tree on the title screen is drawn in a "semi-graphics" mode in which the low-resolution graphical glyphs are really just special characters, no different from numerals, punctuation, and letters of the alphabet. These are handy for a number of things, but they are generally not as flexible as the "high-resolution" graphics used for the main part of the game. Fortunately, switching to graphics mode is fairly simple to do.

The 6847 Video Display Generator (VDG) is configured through a collection of logic signals applied to its external pins. These can be wired a number of different ways, and even on the MC-10 some of the configuration pins are actually driven directly by the incoming video data. The rest are connected to a small register on the MC-10 motherboard. That register can be changed by writing to any address between $9000 and $bfff, although $bfff is the conventional address to use. Writing an appropriate bit pattern to this address is all that is required to change the graphics mode.


Coordinate Translation

With graphics mode engaged, we need some way to specify where graphics are displayed on the screen. For simplicity's sake, I designed Xmas Rush to use a simple 32x32 grid for placing objects on the screen. This alignment naturally matches the number of horizontal bytes for each line, avoiding the need for any mask-and-shift operations when writing data to the screen. The X- and Y-coordinate for each object is stored in a two-bye pair that can be easily manipulated using the double-accumulator operations (e.g. LDD, STD, etc) available on the 6803.

There is a bit of math involved in translating a set of coordinates on the 32x32 grid into an address for accessing the framebuffer. Of course, I already had 6809 code to do this on the CoCo. Blindly translating that to 6803 code for the MC-10 quickly provided satisfactory results.



Timing Again

From there, I quickly conquered the task of drawing the playfield. Xmas Rush uses a bitmap to describe the placement of all the bare trees that make-up the playfield. Translating the relevant 6809 code from the CoCo to 6803 code for the MC-10 again proved an easy task, allowing me to begin work on the fundamentals of constructing the game loop.

The CoCo version of Xmas Rush uses a graphics animation technique known as "double buffering". At any give time one buffer is displayed while the other is redrawn for the next frame of animation. Periodically a vertical sync event occurs.  At that time the program changes which buffer is actually displayed, and work shifts to clearing and redrawing the previous buffer. This technique prevents ever displaying a partially drawn frame, and it provides a natural source of "real time" information for pacing the game.


The MC-10 provides no means for the CPU to observe when a vertical sync event happens, but it does provide an internal timing source that can be used for game pacing. My initial attempt to use this timing source as a substitute for the vertical sync event was disappointing, because I was resetting the timer based upon its current value (a moving target) rather than as an offset from the previous setting. A little fix stabilized the timing so at least the game can be paced correctly.

The current timing technique is still prone to showing some weird video effects, depending on the exact timing between the game and what the VDG is doing. I think that a manual, user-driven timing synchronization is possible. Alternatively, maybe just some random resets will be acceptable -- this would be similar to the "reset until this is blue" that was so common on CoCo games that used NTSC "artifact" colors.

In any case, there is still some work to be done adding player movement, snowman AI, and other missing game bits.  This is a good start, but it needs a good finish. Do you want to see how it ends-up? Then you will just have to stay tuned...

Sunday, January 10, 2016

MC-10 Familiarization

Programming retro computers is not rocket science. After all, it wasn't that long ago that teenagers and grade-schoolers regularly produced commercial-quality programs on these very machines! Nevertheless, a new machine always has some new idiosyncrasies and a few tricks to learn to make them useful. The MC-10 is no exception, and much of my time spent with that machine in the past week has been devoted to learning a few such tips and tricks...


Time Well Spent

I like to make use of "real time" sources to control events in my games. Hand-coded loops and cycle counting can be an effective soure of "real time" information, but they are fragile. Small changes in the game code can produce large timing differences than can be difficult to predict and painful to recode again and again. On the CoCo, I often use the vertical and horizontal sync signals as reliable sources of timing information. Unfortunately, the MC-10 makes no provision for accessing either sync source.

Fortunately, the Motorola 6803 CPU in the MC-10 has a little "secret" -- an internal timer! The timer functionality is based on counting elapsed CPU clock pulses, which amounts to a source of "real time" information. Using this timer I was able to replace the hand-coded timing loop in my screen flashing example program, unlocking the ability to accurately time game events.


Key Exercises

Moving along from timing, it should be obvious that a game needs some form of input to indicate what the player wants to do in the game. A joystick would seem like an obvious choice, but the MC-10 has no joystick ports. It does, however, have a keyboard. The MC-10 keyboard employs a reasonably standard switch matrix that the CPU controls by outputing a value at one location and reading back a value from another location. This is similar to how the keyboard is read on the CoCo and on any number of other systems.

Conversely, a game needs some form of output. Graphics are obvious, but a little audio can be a big plus. The MC-10 has no sound chip, and it does not even have the CoCo's DAC. However, it does have a 1-bit digital output for producing audio, similar to the Apple II or the ZX Spectrum. Producing audio on the MC-10 is reasonably simple, particularly with control of the timer. There is even a ROM call available for producing simple tones. One might be surprised at how much is possible with 1-bit audio, but simple tones will be more than enough for porting Xmas Rush.


Practice Porting

So with a few exercises under my belt, it is time to start porting. Since the MC-10 has the same Motorola 6847 video chip as the CoCo and can support all of the video modes used by Xmas Rush, there is practically no need to generate new graphic data for anything. I started by reproducing the "intro" and "tally" screens using the same data used in the CoCo version. I did change some of the text to reflect the use of the MC-10 keyboard rather than the (non-existent) joystick port. Incidentally, the Christmas tree graphic was produced using Simon Jonassen's web-based sgedit utility -- very handy!

Well, that is my little recap of this week's progress. I am pleased with my results so far! The biggest challenge has been figuring-out how to port 6809 code to it's poorer cousin, the 6803. Most of the Xmas Rush graphics data should remain intact, and most algorithms will be virtually the same (albeit written for the register-poor 6803). The biggest problem I forsee right now will be dealing with the single, fixed video buffer on the MC-10. I don't think that problem will be too tough, but there could be problems.  If you want to see how that goes, then you will just have to stay tuned!

Tuesday, January 5, 2016

A Little Prodding Helps!

More than half-way through the first week of RC2016/01, and not surprisingly I am barely getting started. Slow Retrochallenge starts seem to have become a habit for me! Hopefully this competition will at least end better for me than the last one did...


Desktop MC-10

The biggest reason for my sluggish Retrochallenge start is that I was still finishing-up some stuff I started during my extended end-of-the-year break in December. I generally use this yearly ritual to enjoy some retro projects and similar work, and this time was no exception. Along with a few soldering projects and other fun, I used a big portion of my time to straighten-up some of the disaster that is my office/bonus-room/man-cave. This time I even managed to clear-off the top of my desk and to reduce the biggest pile of junk to a somewhat smaller, mostly orderly pile of boxes!

One of the soldering projects from my December break involved installing a composite video output circuit to my MC-10. (These are available from Ed Snider, and are highly recommended to other MC-10 owners!) The newly composite-capable MC-10 pairs nicely with an 8 inch Night Owl LCD monitor on my newly cleaned-off desk. In fact, I have it situated in such a way that the "cassette" interface cable easily reaches my development laptop, allowing me to load code on the MC-10 by simply playing a WAV file on my laptop.

Wake-Up Calls

We are far enough into the Retrochallenge event that I had started to get "how's it going?" inquiries from a few friends. This includes inquiries from CoCo (and MC-10) "demo coder" Simon Jonassen, fellow Retrochallenge competitor Brett Gordon, and even my old Linux colleague Alan Cox. In particular, the latter inquiry proved to be enough to get me moving.

I had no idea that Alan had been working on a project to enable playing the old Scott Adams adventure games on the MC-10. Anyway, Alan suggested using a slightly modernized version of the old Motorola freeware assembler which is maintained for Unix-like systems. He also pointed me at a tool he had written for making cassette images for loading machine code. I had solutions for these problems, but apparently Alan's code (and his interest in my project) was enough to get me off the couch -- thanks, Alan!

In Motion

Back in March of 2014, there was a thread on the MC-10 Yahoo group about getting an ASCII-based animation running on the MC-10 and other 6847-based machines. I had participated in this effort, and had some MC-10 assembly code as my result. As part of getting started with this project, I got that code out and running on the MC-10 on my desk. I also ported the code I had from my earlier Micro Chroma 68 build I did as a Retrochallenge project. I now feel "in the groove" for writing some new code for the MC-10.


Originally, I had envisioned porting a monitor program for loading code over the serial port. However, the rebuild/reload/run cycle with my current arrangement seems fairly quick and is convenient enough to make me question the need for that porting effort. Also, the MC-10 emulator support on Linux is better than I had realized, including both MAME/MESS support and a surprisingly good Javascript-based emulator at mc-10.com.  The latter even includes the ability to load cassette images from local storage directly into emulator memory -- fast and easy! So, I may just live with what I have and save the serial-port stuff for another day...maybe...

Anyway, I suppose this post marks that I am officially underway with the RC2016/01 competition.  If you want to see where I end-up, then I guess you will just have to stay tuned...

Thursday, December 31, 2015

Xmas Rush for the MC-10

It's been a while since I've posted on this blog. I guess it is time to change that! A little Retrochallenge action should liven things up for a bit...

Christmas Spirit

Late in 2015 (just before the Thanksgiving holiday in the USA), I started thinking about making a Christmas-themed game for the Tandy Color Computer (CoCo). The original idea was to have a collection of 3 or 4 "mini games" with silly holiday references. I got started on that by putting together a simple game engine that used one of the 4-color modes on the CoCo. I tried to save time by taking the easy choice as often as possible, implementing simple blocky animation mechanisms, etc. Nevertheless, the holiday season brought with it some extra demands on my time...

What's the Rush?

By mid-December or so I had only come-up with one mini-game, a scenario where you have to go into the forest, grab the last Christmas tree, and escape from the evil snowmen guarding the tree. It sounds silly, but it turned-out to be rather fun. With the self-imposed Christmas deadline approaching I decided to polish-up what I had and make the best of things by releasing it. The result was Xmas Rush!


Challenge Accepted

Now we are at the turn of the year. With the New Year comes the next Retrochallenge event, RC2016/01! I have been participating in Retrochallenge events for a number of years, although my entry this past summer was a bit lackluster. Nevertheless, Retrochallenge is generally time well spent. The competition aspect makes for great motivation to get things done and the event provides great inspiration as an opportunity to observe what others are doing. I will continue what has become a tradition for me by entering again this year.

But what is the entry? Well, one regret I had about the Xmas Rush development was that I didn't have time to document any of what I was doing. I suppose I could go back and do that as my entry, but that seems a bit lame. However, it occurred to me that the MC-10 should be able to run Xmas Rush reasonably well. Plus, I have wanted to do an MC-10 project for some time. So for RC2016/01 I will port Xmas Rush to the MC-10, documenting the process along the way. Hopefully everyone will enjoy that!

The MC-10 is a different processor than the CoCo, and it has a number of architectural limitations that make it more challenging as a development target that its more powerful cousin. Plus, I will have to put some work into building an MC-10 development environment that is friendly to my style of work. Hopefully none of those challenges in insurmountable...be sure to stay tuned!

Thursday, January 1, 2015

35 Colors On NTSC

Some time ago, I played with a "flicker" technique on the CoCo that alternated screens between a 9-color (8 + black) "Semi-Graphics" mode and a 4-color "Color Graphics" mode on the VDG.  I combined that with a technique for teasing 8 on-screen colors out of the 4-color mode, giving a combined effect of 44 on-screen colors!  I then used this technique as the basis for showing puzzle pictures in Sluzzle, and there was much rejoicing...

Not long after that, I conceived of a similar technique that might solve at least a few of the problems with the 44 color technique at the cost of reducing the palette size a bit.  I let that sit dormant for a while, until I decided to play with it a bit during my 2014 year-end break.  Below I will describe the 35 color technique for those interested in hearing more.

Problems Abound

The main problem with the 44 color "flicker" technique is, of course, the flicker.  The mode toggles between the two base video modes (SG24 and G6C) at the vertical refresh rate (60 Hz on NTSC machines, 50 Hz on PAL machines).  This produces a noticeable flicker effect on the displayed screen, but unfortunately this is inherent to any "flicker" technique -- sorry!

The bigger problem with the 44 color technique is that it uses the aforementioned technique to get 8 on-screen colors from the 4-color modes of the VDG.  This is achieved by switching the colorset select (i.e. CSS) input to the VDG while a line is being drawn on the screen!  This changes between the two 4-color palettes as much as 8 times per line, doubling the amount of available colors on the screen.  (This 8 color technique is also used in the CoCo version of the Imagic game Dragonfire.)  Unfortunately the extra colors come at the cost of eating-up all of the available CPU while the 4- (now 8-)color screen is being drawn.

The other big problem with the 44 color technique is that only one of the base modes offers the (non-)color black.  Since the observed color at a given position is the average of the colors at that position on the two base screens, then no position will ever be observed as fully black.  Although the available dark blue is a workable substitute in many case, the lack of a true black is a big handicap for the 44 color technique.

Another Option

If we accept that we will only get 4 on-screen colors from the 4-color base screen, then we could free-up more CPU time while that screen is displayed.  This would allow more time for implementing a game, playing background music, or whatever else.  But what about black pixels?

It turns out that on NTSC CoCos (and Dragons), there is another option.  Due to how an NTSC video signal encodes color (and how the CoCo video circuit is implemented), the black and white 256x192 VDG mode (G6R) is effectively a 128x192 4-color mode offering black, white, "blue" (cyan?), and "red" (orange?) pixels.  This mode was very popular for commercial games on the Coco, and it is similar to using 4 of the 6 available colors in the high-res video mode of the Apple II.

So now we can use a "flicker" technique to alternate between the G6R (i.e. PMODE4) "artifact color" mode and a Semi-Graphics mode.  Since the G6R mode also offers black and white, both of those colors are still available when using the "flicker" technique!  I will show the available palette below.

Semi-Graphics Palette
G6R "artifact color" Palette
Combined "Flicker" Palette
Issues Remain

As you can see, this technique yields a nice range of usable colors from the VDG.  It does, of course, still have a perceivable "flicker" on the screen.  Also, the technique is limited to being used on NTSC displays.  Of course, the G6R mode can be used as a 2-color mode on PAL machines -- by ignoring the "artifact" colors, this could also be viewed as a 17 color technique...

Sticking with the NTSC world, there is one other problem.  Anyone familiar with the use of "artifact" colors on the CoCo will know that the patterns corresponding to "blue" and "red" switch at random between resets.  That is why so many CoCo games have an introductory screen with a message like "reset until this is blue".  Any program using the 35 color technique described above will need to address the same issue.

Finally, I am seeing some distortion to the colors near the top of the display.  I have not yet determined why that is happening, and it might relate to something else I am doing -- YMMV.  I'm going to downplay this distortion for now, as I believe it is likely caused by something outside the core of the technique described herein.

44 Color Me
35 Color Me
Nevertheless, I am getting decent results in my picture conversions using this 35 color technique.  The availability of a true black makes a huge difference, and that largely compensates for the ~20% smaller color palette available versus the 44 color technique.  With a lot more CPU time available, this technique could be useful for any number of programs on the CoCo including games.

I'm not planning to do anything more with this technique right now, but I hope someone else finds it useful.  I'm happy to consult with anyone that wants to try to make use of it.  In any case, be sure to stay tuned... :-)

Sunday, February 2, 2014

Working Keyboard

The end of the Retrochallenge event freed me to work a bit on spiffing-up my Micro Chroma 68 project.  Still not happy with the keyboard hack, I looked in earnest at how I might fix things...

Keyboard Adapter One-Shot Timer Circuit
One Shot

My earlier experiences with the PS/2 keyboard adapter and my own hack to make it work with the Micro Chroma 68 suggested that either the adapter was not generating a strobe signal at all or that the TVBug software was just missing it.  The former seemed unlikely, so I set about to address the latter issue.

Mike Willegal's documentation for the keyboard adapter tells me that the adapter should be generating an 125 microsecond pulse for every keystroke.  That translates to a little more than 100 CPU cyles during the strobe signal.  But since the strobe signal is not generating an interrupt, those 100 cycles may not be enough for TVBug to see the strobe if it happens to be doing something else.

To address this, I fed the strobe signal from the adapter to a 555 timer circuit configured as a one-shot timer.  This allowed me to send a longer strobe to the Micro Chroma 68 after a keystroke.  Experimenting a bit led me to use a 470 kΩ resistor and 0.1 μF capacitor, resulting in a pulse width of 47 milliseconds -- quite a bit longer than what the adapter was generating!  These values give me very reliable and pleasant keyboard entry, with no need for a magic "repeat the last key" button... :-)

Grounded Out

The Micro Chroma 68 keyboard interface also has provisions for 4 directional keys and a "Home" key.  I guess these allow for moving the cursor around on the screen, but I'm not sure I see the usefulness.  Anyway, letting them float was resulting in some random cursor movement as can be seen in some of my videos posted previously.  While mucking with the keyboard interface, I took the opportunity to ground all of those signals.  This also resulted in a much more pleasant TVBug experience.

Happy Camper

So, that is one less nagging problem with my Micro Chroma 68 build!  As long as I restrain myself from typing more than 20 characters per second (which would be 240 words per minute), the keyboard is quite usable.  With the new modifications I was able to reenter my flashing "Retrochallenge Rulez!" program much more easily than before.

Anyway, it looks like the Retrochallenge event was extended until midnight GMT today.  I wanted to get this posted so that my entry gets full consideration... :-)  But in all seriousness, I do hope and expect to keep poking at this one a bit more for a little while longer.  So, as always...stay tuned!

Friday, January 31, 2014

Final Lap

The end of the month is here, and with it the end of the Retrochallenge Winter Warmup for 2014.  Despite a few setbacks and unresolved issues, this has been a good one for me!  But before I declare my contest entry complete, I should at least get some code running on this thing... :-)

The Micro Chroma 68 Expressing Enthusiasm
Some Assembly Required

The TVBug monitor on the Micro Chroma 68 board only provides for loading machine language programs.  So, the first step is to find an assembler for the Motorola 6800 family of processors that runs under my Linux development environment.  There are a number of options for this, although it seems that not all assemblers are created equalWe must be cautious...

In the days of yore, Motorola operated a "freeware" BBS.  This BBS was originally available by modem, and later over the Internet as an FTP site.  Some of the files there included source code for assemblers targeting the full range of Motorola's CPUs, including the 6800.  Alas, the site is no more and it is now difficult to find even an old archive of it.  If anyone knows of such an archive, please leave that info as a comment on this blog -- that site needs to be preserved!

Fortunately, others found those tools useful as well.  While the unadulterated sources are difficult to find, a variety of slightly modified versions are available from a number of places.  So for now, I will be using the as0 assembler from the "masm" package.  It is a simple tool, but it more then fills the need at hand.

Manual Code Entry In TVBug
Hands-On Programming

The Micro Chroma 68 is already limited in its accessibility for loading programs, providing only an audio cassette interface and the video/keyboard console.  Since I still have not received those magic capacitors for the audio interface, I am limited to just the console for loading programs.  The keyboard adapter I am using has a provision for input through a serial port instead of the PS/2 keyboard.  But with the continuing "repeated characters" problem, manual intervention is still required.

Undaunted, I wrote a small program to put a message on the screen and assembled it with the assembler mentioned above.  The assembler outputs an S-record file by default, but I also had it generate a listing file.  That file had the hexadecimal values for all of the opcodes and data for my program, allowing me to enter them into the TVBug monitor manually.  The process was a bit tedious, but it was manageable for the small program in question.

Flash In The Pan

The original program merely cleared the display and wrote a new message to the screen.  At the end of the program, I simply inserted a busy loop to keep my display on the screen rather than returning to TVBug.  This worked fine, but didn't have quite enough sizzle for the end of the project.  I checked the schematics and found that the video timing signals from the VDG are available for the CPU to read on the Micro Chroma 68.  So, I changed the end of the program to spin in a loop that counted those timing signals and periodically changed the display's color set between the green and orange options -- exciting! ;-)

While changing the end of the program, I was faced with a problem.  I had structured the code such that adding new code at the end would force me to reenter a significant amount of data in memory.  My inherent laziness kicked-in and found another option -- I just jumped over the data and added new code at the end.  Maybe this sheds some light on why "spaghetti code" was so prevalent and accepted back in the early days of computing?  Or, maybe I am just a horrible coder...


Thus ends my entry for the Retrochallenge Winter Warmup 2014 event.  I hope that all of you have enjoyed reading about it as much as I have enjoyed doing it!  A few problems remain, and ultimately I would like to do something a bit more useful (or at least something more interesting) with the Micro Chroma 68 in the future.  I can't help but think that it would look right at home mounted inside of an arcade cabinet...hmmm...

Well, anyway...if you want to find-out what happens in the future then you'll just have to stay tuned!