Would you believe that chasing the high score was not always a part of arcade games? Indeed, until well after Pong it was not even a desired feature until 1978’s Star Fire took it to a whole new level. The tale of that game and its many innovations are what we will bring you today, as well as the source code which reveals even more secrets within the legendary game Star Fire.
(This article serves as a promotion for the author’s book Candid Conversations in Code: Interviews with the First Generation of Video Game Programmers now available through the website Storybundle. Gaming Alexandria receives no proceeds from the sale of this book. Read all about the careers of Star Fire creator David Rolfe and more amazingly talented game creators in the book’s pages, as well as receiving a number of other published works from leading game historians like Matt Barton and John Harris by purchasing from Storybundle today!)
Star Fire, as with all good ideas, came from a place of ambition. The man with the plan was a fellow named Ted Michon. Michon had worked as a technician at arcade company Digital Games/Micronetics, which set him up to become a game creator for them when he created an early microprocessor game for them called Night Racer. With a new direction for games taking shape and the company he worked for falling apart, Michon decided to form his own independent arcade development company called Techni-Cal in 1976.
Ted was an alumnus of California Technical Institute (CalTech) and knew some of the computer-saavy students behind him in seniority. From this pool he settled on the inventive David Rolfe, who was a hotshot assembly programmer at the school. Rolfe readily admits that he has no interest in games as a matter of enjoyment, but leaps at the chance to solve hard problems. The task Michon had ready for his new employee would scratch that itch.
Ted had become enamored with an obscure film called Star Wars, particularly the iconic spaceship battles. He wanted to create a game which had that same sense of high-flying freedom, as well as incorporating a color monitor (for which had had found a cheap supplier). These sorts of tasks in the late 1970s, preceding even Space Invaders, were tall orders. Michon had created a hardware to facilitate this feat though, so it was up to Rolfe to make it sing.
Coupled with Ted’s then girlfriend (later wife) Susan Owen helping with art, the three person team would work out of Michon’s apartment via a terminal connected to the mainframe at CalTech to embark on their Star Wars-inspired project. At one point they even had hope they could secure the Star Wars license, though no official Star Wars game would emerge until 1982. They would retain major inspirations from that initial concept though, like the title screen at the enemy spacecraft. Michon secured a tentative deal with arcade manufacturer Midway Manufacturing, subsidiary of Bally, and the team would begin to show them work in progress.
Rolfe’s first problem to solve was creating an efficient color system which would not consume all the expensive RAM at their disposal. A standard, modern color system would assign a bit for every two colors on the screen, but even a four color system at even standard resolution would be over 32K of RAM. Rolfe’s solution would allow for up to eight total colors which only used 1.8 bits per pixel, with some compromises. For instance the stars in the background could change color from white to blue if one of the Tie Fighter-based enemy ships passed in front of it. Likely this was a form of color-cels as used on the Commodore 64, spread across much larger objects.
Then to make the ships appear as if they existed in a 3D space, Rolfe would have to implement a new technique called spite-scaling. Taito’s Interceptor had deployed this technique, but that game was only available in Japan. By having Susan create several different images of the enemy spacecraft, Rolfe could switch between the different sizes on the fly to have the fighters swoop in. All of this required a lot of storage, so much so that Star Fire wound up using 21 separate ROM chips to store all the game graphics and code.
Even with the unprecedented excitement and novelty the game could show, Midway was not impressed by the gameplay of Star Fire. It was suggested that they add in an extra element for the player to shoot, and perplexingly Midway President Hank Ross said that this should be a witch on a bicycle, not a spaceship. Even with this additional, the game still wasn’t deemed up to their standards, so Ted and David were both released from their deal.
With no money coming in, Rolfe had to find some extra work in the meantime. He joined up with APh Technology Consulting, who was at the time working on the programming backbone for what would become the Mattel Intellivision. Rolfe was directly responsible for providing a working prototype for the 1978 Winter CES, after which time Michon had managed to find a new buyer for their space flight game.
Exidy, a smaller arcade company out of Sunnyvale, California, was responsible for minor hits like Death Race and Circus. They were always seeking to push technological boundaries and thought Star Fire could be the sort of stand-out they needed. Rolfe returned to the project to make some minor changes – such as adding Exidy branding, including to an Enterprise-esque spaceship which replaced the witch – and the game was placed into a sit-down cabinet for increased immersion. It felt as close as they could get to the Star Wars game without a license.
After release in November of 1978, Exidy did not find the mega-hit that they were looking for, but they did bring one significant innovation: The high score table. Rolfe had wanted to have players make a mark on the game as a signature of their accomplishments, and he felt that saving scores would be the best way to do that. Such a trick had never been done before. Some arcade owners might take down high scores by hand as part of a formal competition, but Star Fire put these competitive instincts into rigid code. Players would have a reason to return to a machine beyond the novelty, and that goalpost could change constantly, along with the ability to input their initials.
Following this, Rolfe would again work with Michon on the games Fire One and Kreepy Krawlers (unreleased) for Exidy before moving over to full-time on Intellivision work. Before that though, he had prepared a second version of Star Fire for export called ‘Star Fire II’ with fixes from its predecessor. Through the last 40 years, Rolfe has managed to maintain this source code for this game and has provided the opportunity for Gaming Alexandria to share its secrets!
The following observations were made by Ryou of Sudden Desu, who delved into the Star Fire II code and extracted some interesting findings which support Rolfe’s tale.
The visual references are numerous and hard to ignore, from the STAR FIRE logo to the TIE fighter enemies, and even the Exidy ship which has the iconic X Wing laser guns. The David Rolfe interview elaborates on the reasoning behind this. The code is even more explicit in its references. SWARX.ASM is the code to draw the STAR FIRE logo on the title screen, and its TITLE directive is telling:
TITLE "DO STAR WARS TITLE"
When this code is called from ATRACT.ASM, it’s referred to as “SPACE WARS”
CALL DOSWAR ;WRITE SPACE WARS SIGN
The TIE fighter enemies are referred to by that name as well. TIE.ASM is their primary code.
SEXTERN PS.TFIR,PS.PULS ;TIE FIGHTER FIRE IN INIT ;MUST BE CALLED BEFORE THE TIE FIGHTERS CYCLE THROUGH THE PSEUDO COLOR RAM ;THIS ROUTINE IS OPTIMIZED FOR SPEED BASE ON THE ASSUMPTION THAT ; MOST OF THE SCREEN IF FILLED WITH ZERO
Star Fire is known as being the first game which allowed for player initials to be saved alongside their score in the High Score list. This also means that Star Fire is the first game that has Easter Eggs based on player initials. The high score list code is located in ATRACT.ASM, and right at the top of the file we have this assembler expression:
FT.GOD = -1 ;SET IF MACHINE KNOWS US
And further down, among the code for the player initials input:
IFE FT.GOD ELSE TITLE "CHECK FOR MAKERS" HIGOD: LD H,@IX-3 ;FIRST INITIAL LD B,@IX-2 ;SECOND INITIAL LD C,@IX-1 ;THIRD INITIAL TRYDBR: LD A,H ;GET FIRST INITIAL CP ("D"-"A"+1)*9 ;TRY OFFSET FOR D JR NZ,TRYTZM ;NO LD A,B ;YES, NEXT CP ("B"-"A"+1)*9 ;TRY OFFSET FOR B JR NZ,TRYTZM ;NO LD A,C ;YES, NEXT CP ("R"-"A"+1)*9 ;TRY OFFSET FOR R JR NZ,TRYTZM ;NO GOTDBR: CALL SCRNINI ;CLEAR SCREEN CALL WRTDBX ;BIG LETTERS WORD SCREEN+$970 BYTE "HI DAVE",0 JR GOTTZ1 ;DISPLAY MESSAGE TRYTZM: LD A,H ;FIRST INITIAL CP ("T"-"A"+1)*9 ;TRY OFFSET FOR T JR NZ,TRYSKO ;NO, TRY SUSAN LD A,B ;SECOND INITIAL CP ("Z"-"A"+1)*9 ;TRY OFFSET FOR Z JR NZ,TRYSKO ;NO, TRY SUSAN LD A,C ;THIRD INITIAL CP ("M"-"A"+1)*9 ;TRY OFFSET FOR M JR NZ,TRYSKO ;NO, TRY SUSAN GOTTZM: CALL SCRNINI ;CLEAR SCREEN CALL WRTDBX ;BIG LETTERS WORD SCREEN+$A70 BYTE "HI TED",0 JR GOTTZ1 ;DISPLAY MESSAGE TRYSKO: LD A,H ;FIRST INITIAL CP ("S"-"A"+1)*9 ;TRY OFFSET FOR S RET NZ ;NO LD A,B ;SECOND INITIAL CP ("K"-"A"+1)*9 ;TRY OFFSET FOR K RET NZ ;NO LD A,C ;THIRD INITIAL CP ("M"-"A"+1)*9 ;TRY OFFSET FOR M RET NZ ;NO GOTSKO: CALL SCRNINI ;CLEAR SCREEN CALL WRTDBX ;BIG LETTERS WORD SCREEN+$870 BYTE "HI SUSAN",0 GOTTZ1: LD B,80 ;TIME TO HOLD JP WAITZ ;DISPLAY MESSAGE AND RETURN ENDIF
Indeed, if you enter DBR, TZM or SKM as your initials, you will then see a full screen message reading HI DAVE, HI TED or HI SUSAN, respectively.
You may notice that the labels for Susan’s block of code are TRYSKO and GOTSKO, which implies the initials for the easter egg changed from SKO to SKM. (Did Susan get married along the way…?) Indeed, SKM only works for Star Fire II. In the original Star Fire sets, the initials for Susan’s easter egg are SKO.
WHAT TED WANTS…
Also in ATRACT.ASM, we have this comment:
LD A,PS.BLUE ;TED WANTS SOME BLUE ... LD @COLDATRG,A ;AND WHAT TED WANTS ... CALL WRTWOX ;NO MATTER HOW STUPID THE REQUEST IS WORD SCREEN+$800+LOWYA+$36 BYTE "START",0
Apparently, it was Ted who wanted the word START to be blue on the interstitial screen after inserting a coin.
According to the David Rolfe interview, the game was originally shopped to Midway. Though Midway turned it down and the game was later purchased by Exidy, there is still a leftover of the Midway offer. In ATRACT.ASM we have this code, which looks like it would have displayed the distributor’s name:
MDY.Y=LOWYA+$20 ;Y POSITION OF "MIDWAY" MAN.Y=MDY.Y+$20 ;Y POSITION OF "MANUFACTURING" COM.Y=MAN.Y+$10 ;Y POSITION OF "COMPANY" PRES.Y=$90 ;Y POSITION OF "PRESENTS"
These assembler values are not actually used anywhere.
Another leftover from the Midway proposition was the inclusion of an occasional bonus target on the screen. This is explained in the David Rolfe interview as originally being a witch who would fly across the screen on a bicycle, in the style of The Wizard of Oz movie. When the Midway deal didn’t happen, the witch graphic was updated to the Exidy space ship. However, most of the code related to this still refers to this bonus object as the witch.
CRAFT.ASM contains the graphics for the ship. Although the comment for it describes it as a spacecraft, the original title still refers to the witch:
TITLE "DATA FOR WITCH MODULE" ; COPYRIGHT 1978 TECHNI-CAL PASADENA, CALIFORNIA ;DATA GIVEN FOR EXIDY SPACECRAFT VIDEO ;BEGINS WITH LEFTMOST COLUMN, TOP BYTE
There is also WITCH.ASM which contains all the logic for the bonus object. Inside, all of the comments and variable names still refer to it as the witch:
WXSIZ=8 ;HOW MANY BYTES WIDES WITCH IS WYSIZ=29 ;HOW MANY BITS HIGH WRIGHT=$04 ;HOW FAST WITCH CROSSES SCREEN - LD @WTCHSTAT,A ;SO STATUS SHOWS WITCH HASN'T HAPPENED YET LD @LRTOTL,A ;ZERO TOTAL COUNTERS, ALSO LD @UDTOTL,A ; .. RET ;READY FOR HER FATEFUL RIDE ;HERE WHEN WITCH IS HIT BY LASERS KILWTCH::CALL NOWTCH ;GET RID OF THE WITCH CALL SO.THITS ;GIVE SOUND FOR WITCH HIT JP WTCHMSG ;AND GIVE LUDICROUS MESSAGE - LD HL,WTCHSTAT ;WHAT IS WITCH STATUS? LD A,@HL ; ..? JR NZ,DOWTC1 ;GAME IN PROGRESS, SO DO WITCH OR A ;NO GAME, WAS WITCH DYING? RET P ;NO, IGNORE HER DOWTC1: OR A ;HAS SHE HAPPENED YET? JP M,WTCHDIE ;IF SO, MUST FINISH HER OFF JR NZ,MOVWTCH ;GO MOVE HER IF IN PROGRESS LD HL,@WTCHDLY ;NO, MUST CHECK IF TIME FOR HER DEBUT - LD @WTCHCTR,A ;DEAD WITCH CAN'T BE HIT BY PHASERS LD A,@WTCHSTAT ;NOW GET STATUS OR A ;DID WE JUST FINISH OFF THE OLD GIRL? CALL Z,SETWTCH ;IF SO, SET UP THE RESURRECTION
She appears in other files as well, such as PANEL.ASM and here in XPLODE.ASM
LD A,@WTCHCTR ;IS STUPID WITCH IN POSITION TO BE HIT? OR A ; ..? JP NZ,KILWTCH ;IF SO, GO DO IN THE OLD BAG
GAME.ASM checks for assembler expression FT.DEBUG, which is set in DBGDLG.ASM
INSERT "DBGFLG" ;SET FT.DEBUG IFE FT.DEBUG NOTE "FINAL ASSEMBLY" ELSE NOTE "DEBUG ASSEMBLY" ENDIF INSERT "COMMON"
It seems this enabled some very minor debug functionality. It looks like the debug flag disabled some stack bounds checking:
SBC HL,DE ;HOW DEEP IN STACK ARE WE? IFE FT.DEBUG JP M,0 ;TOO DEEP TO BE IN STACK ENDIF LD DE,STKTOP-STACK ;ROOM TO TOP OF STACK SBC HL,DE ;IN RANGE? IFE FT.DEBUG JP P,0 ;NO, ABOVE STACK TOP ENDIF
It may have also enabled a pause mode:
IFE FT.DEBUG ELSE LD A,@$7FFC ;CHECK FOR DEBUG STOP BIT 1,A ; .. JR NZ,*+3 ;NONE RST $30 ;BREAK ENDIF
These are the only effects it had. Note that this was an assembler definition, so if the code was not built with this enabled (which it appears it wasn’t in the MAME ROMs), this debug functionality is not actually present in the code. Therefore, it’s not something we can enable in the current dumps.
BUILDING THE CODE
Having the original source code like this, building a binary would be one of the first things one would attempt. Indeed, I tried to do so myself. However, the code seems to use formatting and some directives that are not compatible with the assemblers I used. This included several tools, including the popular Microst Macro 80 assembler, in a CP/M environment that would have been contemporaneous with the game’s development. There are a handful of development artifacts (LX.SAV, GAME.MAP, GAME.CCL) that give us some hints about the tool chain that was used.
GAME.MAP lists all the symbols from the code along with their location in the final binary/memory map. (Which makes this file extremely useful to anyone who wants to write cheats or hack on the binary.) At the bottom is this text:
This Cross-Linker is the property of APh Technological Consulting. Use of this program by unauthorized persons is prohibited.
There are two things to note here. First is that a cross linker was used for the link phase of the build. Any build tools with “cross” as a prefix means that they generate machine code for a processor different from the one the application is running one. This implies that although the code is Z80 assembly, it was built in a non-Z80 environment.
The second point of interest is the company name, “APh Technological Consulting.” This is the company that helped design the Intellivision system, along with creating some of its early games. It seems their proprietary build tools were used to create Star Fire. Since these tools don’t appear to be online, building the code “as is” is probably impossible. Theoretically, the meta programming parts could be rewritten to work with a different/newer assembler, but that is a time consuming project…
(As a side note, given the text in GAME.MAP and the filename of LX.SAV, it’s likely that the cross linker command name was LX. Not that that really helps out with anything, unfortunately.)
At the moment we’re unable to do anything further with the source code, which leaves it to the dedicated preservationists to see what can be accomplished here. This is still a great get for preservation!
Thanks so much again to David Rolfe for providing the files, RetroRomper for seeking out expertise, and Ryou for providing it. For those who want to know more about Star Fire, the birth of Intellivision, and more words of wisdom from Rolfe and other programmers, consider buying the current Game Storybundle which will be live until September 2nd. Candid Conversations in Code is my book and I hope you enjoy it!
You can download the Star Fire source code files here.