"The future of gaming can be summed
      up in two words -- Pong and Joust"
       --Otter on rec.games.video.classic

FlapPing (formerly "JoustPong") is an original game for the Atari 2600 by Kirk Israel. This page was the game's development journal.

What is it?
At its core FlapPing is an oldschool Pong Deathmatch...but with a flap button. Each player flaps furiously to prevent the opponent from getting a ball past and scoring a point. 10 Points Wins, or 3 Points in a "Poorlords" variant, where each player is granted a defensive wall. A certain flying dinosaur from another game makes a cameo apperaance, causing a bit of havoc with the ball and even the players as it flies in the middle of the screen.

It's a surprisingly deep game for 2 players, and tourneys of it have proven popular. It's one of the most advanced games that can played with a single clicking fire button. Plus, it includes a challenging (but not unbeatable!) computer opponent, as well as "Easy" modes.

See the first journal entry for a bit on the history of the game, or its AtariAge entry. You can even purchase a cartridge from the AtariAge online store, complete with original cartridge artwork and manual. (The promotional T-shirts are no longer available, alas.)

See a rough draft of the manual for more details.

Let's Play!
The easiest way to see it in action is to grab the emulator StellaX, unzip it, and then copy the latest 'stable' release into its ROMS directory. Start StellaX, click on "joustpong.bin". Hit F2 to start the game (or select a different game version with F1). Press left "Ctrl" to flap and hit the ball back to your opponent (who uses the J key in 2 player mode)

art attack -- 2005 February 8
I thought I'd enhance this entry with a quick history of the brilliant work artist Dave "Liveinabin" Exton has done for the FlapPing revamp. (He made the orignal coverart and manual layout as well.)

His first inspiration was some concept art for the game Ico...here's what he sent me to tell me what he was thinking about...

Shortly there after, he came up with this lovely, lovely sketch...unfortunately he says he doesn't have the fullsize version any more. This my slight modification to it, where I showed him where I thought the logo could go...

As you can see it's a great, lonely-feeling piece with great texture. I liked the idea of having the logo small, and not blocking the sky.

This is the version he sent me next...he says that the lines are an unfortunate necesity to make the art stronger on the cart itself...

I wasn't crazy about how cluttered it looked, and I don't really need my name on it...just an Alien Bill Logo, and then one for Atari Age...so this is the final art:

I like the "artsiness" of just having icons, no names on the front save for the title. The border around the icons is mostly to ensure that it doesn't look like alienbill is running around the scenery.

Incidentally, his first idea for the Title was this:

It's a pretty cool idea, but I thought it would be hard to make the modern font / tech font distinction on the title screen, so he came up with this kind of flintstone-y (in my mind at least) chunky font, which except for the color (he first sent it in red) is what we ended up using:

Good stuff! I think it mapped out pretty well on the title screen, as you can see at the start of the previous entry.

UPDATE! Either I whined enough or Mr. Exton finally recognized my stupendous sense of aesthetic judgement, but he redid the art in his original softer style...and was even able to give me a fullsize photoshop file I plan on making into a poster. So, minus the "FlapPing" text (which I deleted from the image) and the icons, here is the new art:
flap-ping like the phoenix -- 2005 February 7
So, Atari made a stink about using the name "Pong"...now I'm pretty sure "Pong" is on the verge of being a generic term... certainly judging by the Google results, it seems Atari has been lax in defending their "intellectual property".

Anyway, JoustPong is no longer for sale at AtariAge, but I'm working on a slight revamp...Thomas came up with the brilliant name "FlapPing" (sometimes written "Flap-Ping".) Liveinabin has made up a great new bit of cartridge art for it, I'll post that later. Meanwhile, here is a new ROM with the new title screen. I've changed the "CPU" icon so it's no longer a Fuji, and fixed that small bug, so now when you win a 3-pt game the winning score flashes "W" not just "3".

Today's Source / Today's Binary
it's out there! -- 2004 March 26
I guess I "owe" this page a small write up of my time at PhillyClassic, talking with people about the game and selling around 30 copies. It was a lot of fun and I left feeling more positive about the game in general than when I got there, people seemed to groove on it.

JoustPong is now for sale at the AtariAge store. Seems to be selling pretty well, so if you want to get a version with the T-shirt, you better move quickly!

Dirty secret: there is a tiny conceptual 'bug' in the current release; after playing it with people, and spending more time on the Poorlords mode (which, I've decided, not only looks better but plays much better as well, it really mellows out what can be too harsh of a game) I noticed that when someone wins poorlords, the score display stays at "3", it doesn't switch to "W"....whoops!
no more mudpong -- 2004 March 14
Well, it wouldn't be a release without at least one last minute bug!

Eric Mooney's sharp eyes caught that sometimes a button push would cause the wing to move, but not actually move the player. At first I thought he was just mis-seeing intertia, but no, it was a bug. In the course of investigating a fix, I realized that sometimes a slow collision w/ the floor would cause the player to bounce properly, but other times the player would just stick... aspiring 2600 geeks will be interested to know that the fix involved stopping ignoring of the fractional byte when adusting the players position to be resting on the floor, seeding it with a large constant instead. Everyone else, just know I fixed the sticky floor bug!

(If for some reason I hadn't been able to fix the bug, I would've suggested adding some handwaving about "muddy floors" to the manual, since it actually did a pretty good impression of that. But the manual was already printed, so I had no choice but to fix the dang thing.)

Oh, and I did lighten up the floor and ceiling. I think they were about the darkest shad of grey besides black the Atari has--almost unseeable on my 36" TV in the daylight.

Today's Source / Today's Binary
stick me with a fork? -- 2004 March 13
Sweet jimminy crickets, I may actually be ready to call it a ROM.

First off, in non-programming news: the shirts arrived! They came out really well and at a good price. (Call Salisbury Sales, ask for Josh, custom-T's are fun.) My friend Jane is modelling one here.

Also, Dave Exton put the manual in a nice format...but you gotta shell out for the game if you want to see it ;-)

Alright, back to the game...

Chris Tumber did some awesome detective work to figure out what was going wrong with my program on the supercharger. Turns out it was kind of a supercharger specific problem...maybe sort of. It had to do with this clever "PHP Trick" the kernal Paul Slocum crafted for me depended on...sometimes it was grabbing undefined values, and it would set the "decimal mode" bit on the 6507 chip, which means every time I tried to compare two numeric values, things were borked. That's fixed, and along with cleaning up my kernal clearing code, now my ROM works on Z26, PCAEWin, and Stella...Mac users can get in on the action.

NOTHING! Well, I may decide to make the grey bars at the top and bottom of the game a bit lighter. It looks a bit dark on my big TV. (Incidentally, with my subwoofer and speakers going on that TV, the music sounds pretty amazing.)

  • changed two lda BALL_FUDGE_SPEED to lda #BALL_FUDGE_SPEED (rookie mistake)
  • switch to CLEAN_START macro for stack clearing
  • removed extraneous clc before cmps;;temporarilyish cleared up problem.....
  • fixed capitalization of instructions
  • (back to no illegal opcodes)
  • fixed blatant score graphic pointer problem
  • cleaned up reset behavior (twice)
  • check/fix wall bounce bug - basically, the what-brick-to-remove tweaks I added for my pre-Paul kernal had to go.
  • make computer show its wingdown graphic for longer
  • bug w/ stellax, jsut doesn't work FIXED
  • bug w/ Z26: game select during game makes sound and shown frame rate go nuts, though plays ok FIXED
  • I tested and tested and decided the AI and physics are just about right. Sometimes balls are hard to return, I can often beat the hard AI but not always, it's pretty tough when you put it on fast, etc.
Philly, here I come! (JoustPong will have its official debut at PhillyClassic next weekend.)

Dang, this journal has gotten long...I'm a slow programmer I guess!

Today's Source / Today's Binary
behold, i am become shiva, destroyer of kernals! -- 2004 March 10
I was hoping to wrap things up tonight but I'm getting a terrible bug trying to do some very basic things and I'm calling on Stella list for help.

Today's 'working' Source / Today's 'working' Binary
Today's 'broken' Source / Today's 'broken' Binary
doing it manually -- 2004 March 9
So close to finished, I can almost taste it.

Fixed a stupid typo bug (class forget the "#" befre a numeric constant) w/ the new ball launch code that only showed up on an actual 2600 (Z26 is oddly much more forgiving of that, in general) and spent a lot of time getting accurate ball vertical speed range limiters, so it doesn't go too flat or too sharp. But actually spent the most time today working on the content for the manual. That was kind of fun.

Today's Source / Today's Binary
the final countdown -- 2004 March 8
Trying to wrap things up! Added a fun little 3...2...1 countdown and make it go off in a random direction at the start of a game.

Al's final suggestion is making it so the ball won't flatline quite so much. Then all I have to do is fix up the AI, and I think I'm ready to call it a game!

Today's Source / Today's Binary
new england classic gamers, ho! -- 2004 March 7
This is the version I'll be demo'ing today at New England Classic Gamers.
  • switched to dark grey for both floor and ceiling (formerly just floor, lighter ceiling)
  • added ball freeze at begining of new game
  • if the ball hits a player whos resting on the ground, rather than going flat (and getting caught in a likely loop) it has an upward tilt
Al mentioned a 5,4,3,2,1 style countdown might be cool at the begining...like the flashing score, it's one of those "perceived value adds" that shouldn't be too hard to put in, doesn't add a lot to the game itself, but makes it look like a more quality product.

Today's Source / Today's Binary
beyond compare -- 2004 March 3
ITEM: the other day I finally got around to see if my buddy Ranjit's hand-me-down Diamond Rio mp3 player (32 megs) could be used to feed Atari binary WAV's into the supercharger...yup, though it didn't work at all consistently until I downloaded RazorLame and had it translate the MakeWav sound file at the highest possible bitrate. I figure I should burn a CD w/ the sound and bring a discman as backup...though the MP3 player/supercharge combo looks very cool.

ITEM: I've started thinking about how to package this game for PhillyClassic. I'm working with Al to get shirts printed up, logo shown here...pretty snazzy, I think.

ITEM: once this is done, I'd like to go back to my old 2600 programming tutorial 2600 101 and add a lot to it Possible topics include: - subpixel motion - exact horizontal positioning - music basics - big playfield assymetrical graphic (failure of 40 pixel) - cleverness like double player kernal - PCAEwin debugger / listfile - (math comparison stupidness) - flicker vs / intelligent sprite reuse; - that 6502 simulator - COMPARISONS (like 6502.org tutorials page) - tricks like using PF or player graphics for binary read out

ITEM:then of course there's the game itself. I learned signed/unsigned comparisons are tricky, that's why one of the two tutorials at 6502.org is dedicated to 'em (hence today's title's weak pun) Thanks to Eric Ball for showing me the way

Biggest changes in the game: "Poorlords" now stops at 3 pts (having to break the wall down AND get 10 pts was taking forever) but more importantly, I made the vertical motion of the ball 16 bits. I'm still trying to figure out if the ball speed should just be the speed of the player that hit it (though checked so it can't exceed a certain value) or a combination of its previous speed plus the speed of the player who hit. I think the former might be the best bet, but I'm releasing a version with both.

The last change I might make is having the horizontal speed of the ball decrease as the vertical increases. I don't want to go crazy getting it perfect w/ SIN and COS lookup tables, some kind of simple subtraction might do the trick.

Today's Source /
Today's Binary (copy speed) /
Today's Binary (add speeds)
another month, another update -- 2004 March 1
  • I think I got the final scheme for game select. It alternates wall/no wall, starts one player normal (i.e. difficult), goes to one player easy (hence the teddy bear), than the two 2 player modes.
  • finished off one music bug, forget exactly what
  • my new scheme fixed a Z26-ish bug where there was bogus joystick move at start that was changing the select. Now since I always "do a selct" on game start, you don't see it.
  • fixed bug where wall graphics for title screen weren't properly reset when the title screen was returned to
  • modifed game selector so pressing left or down goes 'backwards' thorugh game option, up and right goes forward
  • change ball speed w/ left difficulty switch -- "amateur" slow, "pro" faster...also at the same time I tweaked the values used, so neither angle is pseudo-45 degrees (before, if both players were resting, the ballwould bounce between them back and forth 'til pterry interfered, that's gone)
  • music starts from scratch at game over and return to title screen
  • made left player blue. Hopefully the random plug I'm using to power my atari isn't distorting the color
Today's Source / Today's Binary
lead (day) ing ahead -- 2004 February 29
Not as productive a day as I had hope, alas . I put in that pterry sound I worked out yesterday. Also, I (think I) put in variable ball vertical speed, based on the speed of the player it hits, but it seems to usuall just resort to "1"...

Today's Source / Today's Binary
the slow slog of progress -- 2004 February 28
Some more progress.
  • Worked with a suggestion from Al...now the score flashes when a player gets a hit, and also at 9 points (to warn of the victory) and 10/W (to celebrate the victory).
  • Pterry now only flies within the boundaries of the wall (or where the wall would be in the non-poorlords version).
  • It looks like the rainbow walls can stay! I started using a Missile graphic instead of the Ball, so it doesn't flicker colors as it goes up and down relative to the wall. It's now a nice Pterry-color.
  • When Pterry hits a player, the player is knocked down towards the ground. I'm still toying with the idea of the flapping being disabled during that time... dunno.
  • Fixed a small bug (again) because if you hit select on the main gameplay screen, I don't want it to change the game mode 'til you press it again.
Also, I use PCAEWin's debugger to get a frame by frame analysis of the sound Pterry makes in 2600 Joust, and managed to reproduce it in my own miniprogram, Haven't had the chance to work it succesfully into this game, but plan to make him caw when he succesfully hits a player. Gotta take care to figure out what sound effect it should override...

Today's Source / Today's Binary
getting there -- 2004 February 27
More progress...mostly Paul Slocum based...

The rainbow might not stay. But Al has some interesting ideas: -since the ball color is tied into the wall, maybe slowly cycling colors would be a good compromise w/ the rainbow all. Maybe flash the screen when a point is scored, or flash the players score when its at 9...also I might want to add a teddy bear select to make the computer easier or harder....
  • -pterry needs to flap (kernal timing issue) THANKS PAUL
  • players should touch floor....(kernal issue) THANKS PAUL
  • pterry has one pixel descend 3/4 over on screen (kernal) PAUL
  • -ball should be bigger (kernal) (brighter instead)
  • ; ;-color of players could be different PAUL AGAIN!
  • ; -if pterry flaps, maybe wings up on descend, down on ascend
  • ; -make bricks colorful (if easy to do...)

Today's Source / Today's Binary
so much stuff! -- 2004 February 26
What a couple of days I've had! Paul Slocum gave me a brilliant "kernal" routine that draws both player on either side of the screen using the same player graphic, by using the 2600's duplication feature. So clever! So I spent a lot of time working my game around that.

Another big change is an idea from AtariAge Al about the computer...he pointed it out it flaps just to fast, so I put in a rate limiter which does an excellent job of making the game a bit easier.

Also, Pterry is flying around in a cooler pattern, and the title screen has been enhanced.

So here's the stuff I still gotta do, and then all the stuff I did today... High Priority Todo:
  • pterry needs to flap (kernal timing issue)
  • players should touch floor....(kernal issue)
Medium Priority Todo:
  • change speed or computer warmup time w/ difficulty switches?
  • pterry (and ball) has one pixel descend 3/4 over on screen (kernal)
  • ball should be bigger (kernal)
  • reconsider multiple ball angles?
Low Priority Todo:
  • if pterry flaps, maybe wings up on descend, down on ascend
  • color of players could be different
  • colors could be improved in general
  • make bricks colorful (if easy to do...)
  • pterry "looks" at player who was ahead on title?
  • Z26, bogus joystick move at start?
high priority done
  • ball not bouncing right offa right player
  • score kernal messed up...
  • ball not bouncing right off pterry
  • framerate problem on title screen
  • music voices needs to be reset after game
  • player graphic problem on title screen
  • wall needs to reset for new game
  • ball needs to stop after game won...
medium priority done
  • music has better voice
  • wall/no wall game option
  • make sure pterry is actually centered for title
  • put ball out of drawing range on title screen
  • ensure bricks initialized to match what happens when they hit select.
  • computer might be too smart
  • !!!Tried Al's idea of computer flap limitator--works great
  • fixed slight jitter on pressing select on title screen
low priority done
  • kick in music on game over?
  • make computer flap go longer so it doesn't flicker so much
  • start game w/ fire button
  • change option on select down, not on select up
  • change gamemode w/ joystick

Today's Source / Today's Binary
welcome pterry! -- 2004 February 22
Wow, I had probably one of my single most productive, self-debugginest days like, ever. I've added the charcter Pterry from Joust into the mix. Currently he (she?) flies in the middle of the screen, adding a bit of chaos into the mix. I need to revamp how the ball bounces off of Pterry (right now, the way the ball bounces depends on which sprite he's sharing, and the vertical speed of the ball doesn't change because of it) and also get Pterry doing a bit more swooping, not just going back and forth on the screen. Still, I'm happy... it's a lot tougher than it looks to add in a character.

Also, I went back to a simplified ball rebound algorithm, but when I thought about why it was so difficult, I realized the ball was moving too fast. So I made the ball horizontal speed start using fractional positioning, and slowed it down, and it makes the humans better and the computer a bit worse.

It's so cute how I keep writing this little journal like someone's actually reading it. Still, it'll be good reference for me in the future, and some aspiring programmer might find it...I dunno, inspirational, how I can be so mediocre and slow at this but still keep making progress.

Today's Source / Today's Binary
bounce to the ounce -- 2004 February 18
Trying some experiments with the ball speed after it hits the player...here it's based on where the ball strikes the paddle. I don't think it works so well. Feh.

BUT! I got my Atari music mojo working, a decent little riff and beat during the titlescreen.

Today's Source / Today's Binary
buggin' -- 2004 February 15
Well, I'm proud of myself that I really focused in and debugged the phantom brick issue that had been bugging me for so long, by setting up special test cases and finding out what caused the problem...basically, if it detects a ball/wall collision, it looks at the ball position and figures out what brick got hit. It turns out, though, that the ball could hit two bricks at once, if it was exactly in between them. Fair enough, the game would round off and the top brick would get removed...but if the ball hit between a brick and the empty space above it, the program would happily still try to "remove the top brick"...which was already gone, duhhr. So now it just does a trick... it KNOWS the ball hit, it then sees if the brick it's gonna remove is already gone, and if so, removes the one below instead.

But now I have another bug...and I put in some decent debugging stuff, but to no avail. I'm experimenting with variable vertical speeds for the ball. For my first attempt, I was just gonna grab the hit player's vertical speed (the integer byte of it, now that I'm using sub-pixel speed and positioning) and make it the vertical speed of the ball. But, as you can see with today's ROM by just letting the player fall--speed'll be zero--the ball's rebounding up. I added diagnostic, left player's score is set to the binary version of left player's speed (integery byte), right player's score is set to the bits of the ball's vertical speed. The player's speed meter is about what I'd expect, but the ball's speed seems to be -1 as soon as it hits. And I couldn't see anything in between the collision and the meter display that changes the ball speed.

Today's Source / Today's Binary
you call this progress? -- 2004 February 12
Simple little bug fix. Turns out that the new math I'm doing moved stuff inside the ROM enough that my tightly wound kernal had a page crossing part in it...I let my guard down against those things, but Dennis Debro pointed out the errors of my ways.

Today's Source / Today's Binary
gah -- 2004 February 5
More new bugs. Very frustrating: I think all the changes I've done shouldn't effect the kernal (where the screen is being drawn), it should all be in the VBLANK, but it's the kernal that's messing up, when both players and the ball are on the same line, there's noticeable screen distortion. And weird things seem to fix it...I started putting in a huge amount of NOPS to see if would break it worse, and actually, a large enough # seemed to make the problem go away.

Which just means I'm being totally misled and have no idea what the problem is.

Today's Source / Today's Binary
i'm a wuss -- 2004 February 3
So lots of people on Stella thought JoustPong's control was way too fast, but too slow it down, I'd have to use 16-bit math with sub-pixel speed and positioning. I think that intimidated me, and I didn't get around to it through all of January. But when I finally sat and did it, it wasn't too bad.

Oh, and I've been getting a divorce through all of this, which is my other excuse for the delay...

I still need to tweak the numbers, and I'm fudging the foor rebound and stuff, and maybe I need to figure out how to use delay stuff to make up for my two-line-kernal, but it has a lot of potential.

I made a javascript tool to help with the two's complement 16 bit math...it'll help me figure out the constants for the physics much more easily.

Oh, and I fixed a small bug where the landed paddles were stretching down too far, and there still seems to be a bit of that wall bug, where the ball bounces but doesn't chip off a piece of the wall when it does.

And I'm still not sure about the wall thing overall. Maybe I'll keep it in as an option.

Oh yeah, I used Michal Kowalski's 6502 eumulator to practice my 16 bit math programming...

Today's Source / Today's Binary
mr. fixit -- 2003 October 13
Took a break there...started to scare myself! Sometimes I get a little intimidated by a difficult bug, and back down for too long... that's kind of what happened during my year break.

But here, I think I nailed the bug in short order. I tested out one theory, that somehow bricks on one side of the board were registering as hits of the other side, by clearing out one player's bricks...didn't change anything. Then I made an odd little variant of the game where the player controlled the height of the ball by pressing up or down in order to test the theory that the "which brick" math was a little off..and that indeed was the problem. The playfield collision sensor would detect the hit, but then it might try to remove a brick that was already out...

Actually, that's odd...I musta thought that the problem was sometimes the ball would rebound off of blank space, but maybe not?

I fixed one other bug, where the ball would show up on the right side before registering as a hit on the left side. Also, I thought I had some kernal bug where lines were showing up on the walls, but that seems to have gone away or been a figment of my imagination as well.

In other good news, today's art is a first pass at cart art by Dave Exton...I love how it looks like the paddle is going "back, back, way back..." (though I believe Dave is British, so he probably didn't have those words in mind, exactly.) I like it a lot, though I'm asking him to consider move the "alien bill production" down to the lower left.

Today's Source / Today's Binary
poorlords alpha ahoy -- 2003 September 21
So, I finally started to bring things together enough to get a feel for what the "Poorlords" would feel like...now you have a protective wall behind you. Unfortunately, things are still glitchy, with the playfield kernal showing some crud when the players are on the same line, and then there's some weird thing where it just bounces out of the left player's goal. Not positive what I think of it yet... also it might be different once the "wall patching" routine is in.

Still, I'm wondering if it woulda been better to work up multiball or and maybe the pterodactyl first. But I can always add 'em later, provided I ahve the space.

Oh, and a prototype of joustpong was shown off by AtariAge at OKGE.

Today's Source / Today's Binary
title screen thrills -- 2003 September 16
So after a lot of updates that improved the guts but made it look a bit worse, I decided to try the opposite, and make a new prettier title screen, and I added a top and bottom border to the game itself. (After looking at a lot of other 2600 games, I realized that while the type of graphics I use for the title requires wide pixels (only 40 across for the entire screen) they can be as short as a scanline, an interesting style.) I think the new screen looks really good... even better on a real tv.

Today's Source / Today's Binary
still an assembly retard -- 2003 September 15
So I spent a long time tonight making my humble program look even more crappy! I've learned some horizontal positioning tricks, so now I don't need those bumpers on the side to tell when I scored. So I ditched 'em...and the game looks a lot worse, the side barriers gave the board some character. But I'll need to repurpose those "bumpers" as walls to be destroyed in my "Poorlords" scheme, so- despite appearances-I am making progress here.

That's not how I know that I'm still an assembly retard, though...I'm an assembly retard because it takes hours to debug a simple "greater than"/"less than" set of comparisons...I need to stop assuming I know this stuff and just keep cribbing from other parts in the code.

Today's Source / Today's Binary
mini me! -- 2003 September 11
I made a 1000 bytes of ROM (inside a 4K shell) version of JoustPong (took out all the 2 player stuff) to enter it into the 1K category of the 2003 Minigame Competition. Not much else to report besides that, except I made the following writeup for JoustPong's Alpha Version display at the Oklahoma Gaming Exhibition by AtariAge.

"The future of gaming can be summed up in two words -- Pong and Joust." ...with these prophetic words on rec.games.video.classic, "Otter" planted the seeds for the game you see before you now. JoustPong, at its core, is an oldschool Pong Deathmatch... but with a "Flap" button. Each player flaps furiously to prevent the opponent from getting a ball past and scoring a point--first to 10 points win.

The current game is classic JoustPong...you can play another human, or take on all the AI might of your Atari 2600. The final game should add other interesting gameplay modes, including "Poorlords", where you have to guard your wall...but if you're up in points, you can add bricks back in! Multiball and the return of Pterry are also possibilities, along with improved graphics and sound.

Today's Source / Today's Binary
how not to be an idiot -- 2003 September 10
I'm kind of a moron. I wasn't having so much trouble because of timing issues...my screen was going crazy because I was resetting the X register for use for memory offsetting while still trying to use it to count how many scanlines I have left...duhrrrr!

So I have a kernal that should be able to do "Poorlords"...this wacky macrame looking demo is a proof of concept that I can change the playfield every 4 scanlines.

Also, I switched the Atari "Fuji" logo on the front page to switch between two graphics really quickly...the effect works out pretty well I think, though I may go ahead and fiddle with the actual graphic some more.

Today's Source / Today's Binary

The Tower of Fuji, a few experiments in how best to draw the symbol
Today's Source / Today's Binary
getting there -- 2003 September 9
Yet another advance where the insides are better, but you wouldn't know by looking at it. I got most of what I need for the "poorlords" scheme I want (where players knock a row of bricks behind the other player)...now I just need to figure out how to make it work with my kernal.

Today's Source / Today's Binary
plugged in -- 2003 September 8
Heh, hi to everyone who linked here from NewMoanYeah.com's writeup.

Definitive progress this evening, but subtle...I switched all the graphics in the main game kernal to use a variation on Thomas Jentzsch's (as explained by Dennis Debro) infamous "skipdraw" routine. It gives me a bunch more time to play with, at least 30 cycles, always a good thing.

Today's Source / Today's Binary
curse you indirect indexed addressing! curse you to heck! -- 2003 September 7
Feh. Trying to tighten up my kernal...I know I'm setting the left player more or less right because I can see it when I put the graphic in the score...besides that I don't know what's going on.

Today's Source / Today's Binary
Manic, Depressive, Manic, Depressive -- 2003 September 4
Oy. I'm in a kinda weird place right now.

They came up with some interesting gameplay ideas on stella list, involving having a "Breakout" or "Warlords" like playfield behind each player, and maybe you could "rebuild" holes in it ala "Rampart". So I'm really psyched (and getting weirdly obsessed) about that stuff, but my first attempts to start coding it are really depressing and not coming out to well. I may be getting out of my depth.

The obsession is weird. During the workday I was getting really optimistic about where this could go, and eager to code, and then I get home and code and things are a real mess, and I'm really down. It's a real Manic-Depressive way to be.

So today's binary is back to rebuilding. I'm trying out an idea where I can turn the playfield on and off to make blocks, though even this humble effort where both sides of the playfield are the same, and we just alternate on/off is risking turning my two line kernal into a three line kernal. Plus, my idea for making the ball rebound is broken, I think if it hits the 'top' of the block, it can tend to get stuck inside the damn thing.

Other alternate games are my idea to make it more like "Polo", where players can move left and right on the screen. Another idea is to throw in the old pterodactyl from Joust...may be just flying around the middle, causing trouble 'cause the ball bounces off him. A little random element.

Humbler ideas also involve having a smaller but more highrez title on the titlescreen, and maybe a little music there.


In terms of improvements, I did make it so when you hit select during a game it just brings you back to the title screen without changing the game mode. Also, I rearranged this page so the newest entries were at the top, and quick start instructions.

Today's Source / Today's Binary
game on, baby, game on -- 2003 August 31
I learned something important tonight.

It is very difficult to draw a decent Atari "Fuji" logo symbol that is 8 pixels wide or less. To the right is my best stab at it...not great, but I think it's recognizable (See the logo here if you don't know what it's supposed to represent.)

Anyway, today is an important milestone; the first binary that I could potentially release and feel like it was a complete game. It starts with a title screen, the user can select 1 or 2 players with the Select Switch and see his or her choice on screen, the game plays (with sound and possible computer AI) and ends after 10 points.

Of course, there's always more to be done, so here are some features I'm toying with:
  • A more interesting title screen, maybe with some flapping (I even have an idea for a flapping logo... might tend to move to quickly for people to see though.) Maybe add an "alienbill" somewhere, or not.
  • Might go back to my old physics model...usually when I do Joust Pong, I make it so the ball's postbounce vertical speed is its prebounce speed plus the speed of the paddle. I tried it here, but my first attempt sometimes had the ball going so fast it was a bit nuts. So I switched to a very simplified ball only goes on strict diagonals. I'm surprised it works as well as it does, actually, unlike the Java version it doesn't seem to fall into repetitive loops against the computer. Still, it might be worth going back to the more complex speed behaviour, but with a limiter so it doesn't start moving to fast up or down.
  • It could still use some more pizazz in general. Another way would be to have some special sound at game start or game end.
  • I really haven't decided on the final colors yet. Everything you see in it is pretty much the result of some arbitrary numbers I plugged into the Color fields.
  • Maybe I should consider going to a "1 line" kernal. This is a hardcore subject, but right now, everything in the actual gameplay is in "two line" increments, because of the time I need to figure out what to draw... if I can get back down to 1 line, it might make for smoother game play, more options with the physics.
  • Oh, I think I need to reset the ball when the game restarts.
Still, I'm pretty pleased with myself this evening!

Today's Source / Today's Binary
putting it together -- 2003 August 30
So, I put the title screen kernal back into the main ROM, and now Reset starts a game. I'm having trouble getting the Select Switch code to work right...it's not wired up to do anything, but I'm having trouble just getting it to reliabely toggle the color of the font on the main screen.

Oh, also, I upgraded my version of DASM, and started using the "standard" macro.h (for its SLEEP macro mostly) so you'll need those two files to compile my stuff, so you might need to get those from http://www.atari2600.org/dasm.

Today's Source / Today's Binary
the name of the game -- 2003 August 29
Today's source and binary is a totally stand alone program that displays JoustPong in big bold letters... I need to merge it into the main game, hopefully I'm still ok for ROM space and everything.

Decided I liked a "TitleCase" font better than "ALLCAPS".

Today's Source / Today's Binary
can you hear me now? -- 2003 August 28
Todays update: Sound! I'm not 100% happy with the sound choice, epecially for the wingflap, fiddled with it a bit, bit it's ok. What worries me more is this odd split-second delay...I gotta ask Stella list if I'm missing something.

Speaking of sound...I dusted off my old 6-switch Atari and got my supercharger mojo working again, using the power of .wav files through a supercharger (old way of getting games into an atari via casettes) to see my creation on a realt TV via a real Atari...and it worked! Very satisfying. Here's an action shot of it...without the flash, you can see the action of the ball. Also, it seems like the real atari doesn't have the problem with delayed sound, so that's a relief.

Today's Source / Today's Binary
it's lookin' like a game! -- 2003 August 27
Incremental progress! Now the ball resets when a point is scored, and the point is duly noted. Also, the computer player doesn't bother to flap when the ball is heading away from it...

For grins I made a todo list:
  • title screen
  • select 1p/2p(or maybe 0 players?) from select screen
  • handle reset
  • sound effects:
    • on wing flap
    • when ball bounces
    • on point scored
    • maybe on game start?
    • maybe on game victory/loss?
  • need to tweak the physics a bit
  • bug: colors aren't what I expect on Z26
  • bug: on other emulators, top line of score chopped
That's close to it...maybe a few more details, colors and what not, but still...I'm finally starting to feel like I could pull this off!

Today's Source / Today's Binary
hacking cough -- 2003 August 25
Got the score display routine working... mostly thanks to some advice from Erik Mooney (though my first workable pass was on a scheme devised by Christopher Tumber, and some of the other folk on the Stella list helped too, like Andrew Davie who pointed out that a space character can be a dangerous thing) Now all I need to do is actually start registering points, and resetting the ball after. (Add a title screen, game select (1p vs 2p) start/restart logic, some sounds, tweak the physics, and I'm done!)

(I know I'm getting way ahead of myself, and I suspect JoustPong might be my only 2600 game, but I have this idea for another game... "tank dodgeball" or "warball"--4 players w/ paddles, steering tanks. Press button to propel forward...releasing the button fires, but you can only fire if you "have the ball"...firing makes the ball "hot", it goes forward 1/3 or 1/2 the screen, then stops and becomes "cool", and any player can go pick it up. With 4 players, you have to be tricky with the player graphics. Plus, I don't have any great ideas for AI, and that would be a drawback... Ah well, a geek can dream, can't he)

Today's Source / Today's Binary
the computer thinks! -- 2003 August 24
Big day this Sunday....
  • Computer AI! It plays a decent game against you. Eventually I'll put 1P/2P as an option, but for now this is kind of fun.
  • better constant vs variable vs label naming schemes (Dennis Debro suggestion)
  • softer bounces on ceiling
  • computer player wing flap graphic
  • enabled "bufferstuffer" logic for ball enable, not just graphic
  • start of score display, but it's currently very broken

Today's Source / Today's Binary
the year that wasn't -- 2003 August 23
Wow. I let this thing go for like a year.

For a while I thought maybe I should just call it quits, but I want to get back at it. And today, for the first time, it kind of looks like a game!

I started adding in that playfield graphic thing I mentioned (using my own PlayerPal javascript tool for doing the math), when I ran into the same weird timing kind of issue that stopped me before, and threw me for a loop for like a year. I brought it to the Stella list, and within minutes Dennis Debro pointed out that I was refering to constants without the "#" sign before them , which meant the compiler was looking at places in memory instead of constant values. So strange that things still kinda worked despite that!

So, it's still crap-tastic, I think my two line kernal is getting pretty irregular, and the ball speed is not changing when a player hits it, and nothing is being done in terms of scoring or even registering hits, but still...the ball is moving, it's bouncing off the floor and ceiling and off of the players. You can actually play it as a bit of a game.

Hopefully tomorrow I can throw in the basic AI and some of that other stuff.

Today's Source / Today's Binary
stay in shape -- 2002 September 21
Decided I should stop puttering around and try to get the gameplay elements going. To that end, I've removed the ability to move left and right, and have positioned the players where they go.

The extra stripes are my first thoughts about how to register scores... I was thinking I could use missiles as "goal lines" and counting on collision detection to know when a point was scored, and I was thinking that I could make the missiles black so they wouldn't show up, but I'm remembering that oh yeah, they're stuck as the same color as the players...dang. I guess my options are 1. live with 'em visible, 2. use some position tracking technique to find out when the ball has gone on the side of the screen, or 3. change the color on the fly...not much room for the last option though.

Or huh...Maybe I could use the playfield graphics...hmmm.

Today's Source / Today's Binary
back in the saddle -- 2002 September 16
Yikes...it has been a long, long while since my last update!

So I haven't been as on the case as I would've hoped, but I finished 2600 101 a few weeks ago. I hope people find it helpful.

But I've made a smidgin of headway...and man, it's harder than I thought! I replaced the happyfaces with pong bars and added a flap animation. I was getting weird results when the flap button was pressed...the players went to double height. I thought it might've been a timing issue, so I started counting cycles in a half-assed way, and yeah, I was running out of time during the scan lines. But the players were looking kind of squashed down in their "natural state" anyway (they looked better when they were stretched out 'cause of the bug) so I decided to switch to a "two line kernal". The techique works very well with the "PlayerBufferStuffer" concept, since it stops me from having to worry about the exact timing of when values are updated. (Though I did a very cheap thing to hack the timing, stuck in a random small amount of NOP Do-nothings and saw if it looked ok...)

I should have plenty of time for reposition the ball as well.

Haven't tested on a real Atari yet, I messed something up in revamping my PC setup and now it's like the supercharger can't "hear" the WAV file...

Today's Source / Today's Binary
i'm on tv! -- 2002 July 14
I'm still not making real programming headway (the whole time thing) and I think I might like to get a bit of closure on 2600 101 (including a "2600 Cookbook" section) But, some exciting things have happened...I got my supercharger and 2600 setup setup, (including highjacking our VCR, so I don't constantly have to rejigger the cable connection) so now I can download the stuff I write to a real live 2600! One of the first things I tried was this example of the 2600 worshipping me, a hack of "How To Draw a Playfield".

But, of course, my real JoustPong code didn't work. Rats! But I got some help on the Stella list, and now it works great. Two different types of typos: I thought DASM could support defining constants, and I forgot a # sign before a constant... I don't know why it worked on the Z26 and StellaX emulators... below is the corrected code.

Today's Source / Today's Binary
sidetracked -- 2002 July 10
Got kind of distracted by a heavy schedule at work and that whole wedding feature for the loveblender thing. And for some reason I got inspired to add some more to 2600 101, my "Atari 2600 programming for dummies" style guide. Finally made the edits some people had suggested, and added a new page. Probably could've added a few more (moving a dot with a joystick, moving a sprite, which would probably come close to finishing the thing) but I felt lazy. I'm pretty happy with how the whole thing has come out so far, though, already I've heard of a few newbies using it.
and then there were two -- 2002 July 6
And now the goofy red happy face has a friend, the goofy purple happy face. (These are just place holders until I decide if I'm going with the joust-like players or the pong-like paddles with wings.)

Mostly it was just a matter of cut and pasting code, but it was a bit fiddly. Odd little bug has the "landing" of one on the "floor" moving the other one...it's actually a cute little subtle effect, so I'm not going to try to hard to remove it. The way that they both have horizontal movement is just until I bother to remove it...untill then, it's kind of fun to play with. Maybe it should be joust soccer, not pong? Maybe for the next iteration...

Today's Source / Today's Binary
the story so far -- 2002 July 5
In the tradition of SCSIcide and Death Derby, I've decided to make an online journal page for my own homebrew effort for the Atari 2600, JoustPong. I'd date the start of this programming effort to June 22, when I posted my first note to the Stella list.

This will be the fourth version of JoustPong. The first was for Windows (written in Visual Basic). Then came one for the PalmPilot, but written in a strange little language called "PocketC". Then came a version in version in Java, with graphics borrowed from the arcade version of Joust.

The idea originally came from a discussion in the newsgroup rec.games.video.classic, specifically this post by "Otter". I think it's one of the most interesting games that can played with a single button per player (though this past May I made a series of games were both the display and control was just a single grey form pushbutton.) Also, it's been wonderfully easy to make good but not perfect AI for the second player, I learned that trick early on. (The computer hits 'flap' whenever its beneath the ball, so it tends to overshoot a bit...but it's a strategy that beats many humans, at least 'til they get the hang of it.)

Progress has been ok so far. I'm a newbie to both the 2600 and the 6507 chip that powers it. As I've been learning, I've been trying to put my hard-won experience in the form of a tutorial, 2600 101, to give other newbies a helping hand. That's the latest screenshot to the right... it doesn't look like much, but it has a nice kinetic joust-like feel to it. I'm not happy with the bounce routine, but the border collision detection was a hassle, since I was using the wrong post-compare operators.

You can play the latest BIN with StellaX, which is what I'm using for development. It doesn't work very with PCAE for some reason, I'm gonna ask about that.

Today's Source / Today's Binary