(This is part five of the chronicle of my Retrochallenge 2016/01 submission, which is to port some classic Star Trek text games to the Mattel Aquarius. To jump to the beginning, go here.)
Thank Heavens for the Internet Archive
Today I came across Mike Mayfield’s personal account of the history of STTR1. This information was rescued from a defunct website by the fabulous efforts of the Internet Archive:
That page was part of a more general survey of the early Star Trek text games. I noticed a Palm Pilot version. I’ll be trying that on the Palm III I use for weekend To Do lists.
Work Begins on STTR2
I’ve begun working on (or at least mulling over) an enhanced version of STTR1 for the Aquarius that will take advantage of the system’s modest graphics and sound capabilities.
The set of goals is not solidified but at a minimum:
Use a fixed display (not scrolling). Left half is Short Range Scan, right half is output of all other commands except the Galactic Record.
(This is part four of the chronicle of my Retrochallenge 2016/01 submission, which is to port some classic Star Trek text games to the Mattel Aquarius. To jump to the beginning, go here.)
STTR1’s Gone Gold
STTR1 cassette case
The straight port of STTR1 for the Aquarius is nearing completion. These were the tasks on my TODO list:
Finalize the code
Create a Git repository for the files that will be publicly shared
Record STTR1 to a cassette tape
(Finally) run STTR1 on a real Aquarius
Create & print artwork for the cassette case
Finalize the Code
I’m trying to keep the target platform an Aquarius with a 16K RAM extension, even in emulation. One of the files I’ll be including in the distribution is a ROM (.bin file) image. This will allow easier loading on emulators or perhaps one day the file can be included with a multi-cart. To accomplish this, I used the modern hack Bootloader BASIC v2.1 (or BLBasic) found on the Atariage forums. This is an enhanced version of Aquarius Extended BASIC that, among other things, will create a ready-to-run binary version of a BASIC program. The clever trick exploits the fact that Virtual Aquarius emulator redirects printer output to a text file on the host computer. BLBasic re-purposes the LDUMP command to instead export a binary version of a BASIC program to the host computer via the emulated Aquarius printer port.
However I was seeing some strange behavior emanating from the .bin version of STTR1 while using MESS. It could be that MESS is not correctly emulating the Aquarius, or perhaps the STTR1 code along with whatever runtime is needed by BLBasic was hitting the upper bounds of the available memory.
So I’ve trimmed the memory footprint of the STTR1 code on the Aquarius by:
Consolidating multiple lines of HP Time-Shared BASIC to a single line using the “:” command separator. HP must’ve allowed strictly one command per line number in its Time-Shared BASIC because the original code never strays from that.
Trimming REM statements when HP added the program to their Contributed Program Library.
Consolidating commands introduced many new bugs because I inevitably removed a line number that was referenced somewhere else by a GOTO. I became very familiar with the “UL” error.
UL UNDEFINED LINE. Attemp-
ted branch to a line that is not in
memory, or deletion of a non-
existent line.
Create a Git Repository
Nothing too interesting . I’ve been using bitbucket.org for no particular reason. I know all the cool kids are hanging out at github, but I’m too lazy to migrate. So far, I’ve uploaded:
the text of the BASIC source
a .CAQ file (cassette file format for Virtual Aquarius)
Recording STTR1 WAV file to Cassette Tape using a GE 3-5015C Tape Recorder
In the Virtual Aquarius emulator, you can run the CSAVE command and it will export a .CAQ data file to your PC. Included in the tools sub-directory of the emulator is a program called CAQ2WAV.EXE. This Windows application will convert a .CAQ to a .WAV audio file.
I used Audacity to play the .WAV file to this gorgeous c.1986 General Electric 3-5015C tape recorder connected to the laptop’s audio output. Moved the tape over to the Aquarius’s Data Record and CLOAD’ed the muther in.
For all the stink eye that cassettes get, let me say that this all worked on the first try. Sure it takes 4m30s but that’s time to meditate – or run a very good mile.
Red DATA Light means life is good
(Finally) Play STTR1 on a Real Aquarius
STTR1 Instructions being printed to screen
The game plays well on the Aquarius. I even love the keyboard. The program includes an option to either print the instructions to screen or to the Aquarius’ thermal printer. I almost got weepy seeing that work on the first run.
Create & print artwork for the cassette case
I wanted a nice looking cassette case for STTR1. I looked at some examples of the third-party games sold in the eighties, for example “Chuckman“. And skimmed through episodes of Star Trek: The Only Series on Netflix to find some screen shots of space scenes to grab. After a long night of cutting, pasting, rotating, blurring, and undoing, I came up with something I like. Even has liner notes.
I’ll include this as a PDF or PNG in the repository.
Up Next
My original plan was to also port Super Star Trek. Alas that one may have to wait for a future Retrochallenge. Instead I want to add color, sound, and maybe even extremely crude graphics to STTR1, making it what? STTR2?
(This is part three of the chronicle of my Retrochallenge 2016/01 submission, which is to port some classic Star Trek text games to the Mattel Aquarius. To jump to the beginning, go here.)
Mind Melding
In porting the 1972 version of STTR1 from HP Time-Shared BASIC to the Mattel Aquarius, I had to learn more about the code than I originally thought would be required. I imagined merely dealing with syntax differences which I could search and replace with ignorant bliss. However, the implementation of string variables differ so much between the two systems, I inevitably had to time-travel, get into the head of the high school student who authored STTR1, understand the program’s logic to a sufficient degree, and re-code some critical sections.
Is it spaghetti code? Of course it is. This is early BASIC and therefore a design requirement. Even so, some very clever algorithms exist throughout. (I’m especially impressed by the code that calculates course and torpedo trajectory.) However, the 1 or 2 character limit for variable names makes for a dizzying experience.
So before I move on and allow the weeds to germinate, I’d like to at least catalog the more interesting variables found in the original STTR1 listing along with my understanding of each one’s purpose.
Noteworthy Variables Found in Original STTR1
In case you’re inclined to follow along, here is the original BASIC listing for STTR1.
Arrays/Matrices
230 REM ***** PROGRAM STARTS HERE *****
240 Z$=" "
250 GOSUB 5460
260 DIM G[8,8],C[9,2],K[3,3],N[3],Z[8,8]
...
420 C[2,1]=C[3,1]=C[4,1]=C[4,2]=C[5,2]=C[6,2]=-1
430 C[1,1]=C[3,2]=C[5,1]=C[7,2]=C[9,1]=0
440 C[1,2]=C[2,2]=C[6,1]=C[7,1]=C[8,1]=C[8,2]=C[9,2]=1
...
1885 C2=INT(C1)
1890 X1=C[C2,1]+(C[C2+1,1]-C[C2,1])*(C1-C2)
1900 X2=C[C2,2]+(C[C2+1,2]-C[C2,2])*(C1-C2)
...
2700 H=(X/K3/FND(0))*(2*RND(1))
2710 K[I,3]=K[I,3]-H
2720 PRINT USING 2730;H,K[I,1],K[I,2],K[I,3]
2730 IMAGE 4D," UNIT HIT ON KLINGON AT SECTOR ",D,",",D," (",3D," LEFT)"
...
3400 G[Q1,Q2]=K3*100+B3*10+S3
Variable Name
Data Type
Description
G
8×8 Matrix
Galaxy; Elements contain 3-digit values to store number of Klingons, Starbases, and Stars in each of the 64 Quadrants
C
2×9 Matrix
Lookup of Δrow, Δcol for a given course, where 1≤course<9
K
3×3 Matrix
Klingon attributes; row, col, and hit-points remaining for up to 3 enemies found in current Quadrant
Strings
270 DIM C$[6],D$[72],E$[24],A$[3],Q$[72],R$[72],S$[48]
280 DIM Z$[72]
...
460 D$="WARP ENGINESS.R. SENSORSL.R. SENSORSPHASER CNTRL"
470 D$[49]="PHOTON TUBESDAMAGE CNTRL"
480 E$="SHIELD CNTRLCOMPUTER"
...
950 Q$=Z$
960 R$=Z$
970 S$=Z$[1,48]
...
3790 IF C$ <> "DOCKED" THEN 3820
3800 PRINT "STAR BASE SHIELDS PROTECT THE ENTERPRISE"
3810 RETURN
Variable Name
Data Type
Description
C$
6 char String
Condition of the Enterprise – GREEN, RED, YELLOW, or DOCKED
D$
72 char String
First 6 labels for Damage Report – 72 char string treated as array of (6) 12-char strings
E$
24 char String
2 more labels for Damage Report – 24 char string treated as array of (2) 12-char strings
A$
3 char String
Symbol definition for Stars (‘ * ‘), Klingons (‘+++’), or the Enterprise (‘<*>’)
Q$, R$, S$
total 192 char String
Buffer used to display current Quadrant. 8×8 cells where each 3-char cell contains a copy of A$ or empty space
Z$
72 char String
Zeroed String – 72 spaces used to clear Q$, R$, and S$
(This is part two of the chronicle of my Retrochallenge 2016/01 submission, which is to port some classic Star Trek text games to the Mattel Aquarius. To jump to the beginning, go here.)
Work-in-Progress Port of STTR1 on the Aquarius
As with most of my Retrochallenge experiences, what I imagine I can accomplish in the first weekend requires the remainder of the month. So it has been with the no-frills port of the 1972 version of STTR1 to the Aquarius. My real goal is to extend a classic Star Trek text game to use Aquarius features such as color, sound, and hand controllers. But here we are halfway through January and I’m still just trying to get the original STTR1 game to run on the target platform.
As of the last several work sessions I have a foothold into the game and am able to play for a bit before encountering a mysterious syntax error at line number 1910. And torpedoes targeted towards Klingons instead say that I shouldn’t attack stars.
In this post I will enumerate the types of code changes I’ve had to make so far and provide some brief examples. At a high level there’s the trivial changes and, well, the non-trivial.
Trivial Changes
Printing Concatenated Strings
HP doesn’t require semicolons as concatenation operators.
HP Time-Shared BASIC
1580 PRINT "YOU HAVE"E" UNITS OF ENERGY"
Aquarius BASIC
1580 PRINT "YOU HAVE";E;" UNITS OF ENERGY"
Array Indexes
HP uses square brackets. Aquarius uses parentheses.
HP Time-Shared BASIC
1630 D[I]=D[I]+1
Aquarius BASIC
1630 D(I)=D(I)+1
Chained Variable Assignments
HP allows chained assignments, the Aquarius does not.
HP Time-Shared BASIC
320 E0=E=3000
330 P0=P=10
Aquarius BASIC
320 E0=3000:E=E0
330 P0=10:P=P0
Shortening Command Lines to 72 Characters
Aquarius BASIC has a maximum line length of 72 characters. The original STTR1 source for the HP contains many, many lines that exceed that limit. These are simple but somewhat tedious changes.
Aquarius Guide to Home Computing pp. 1-10
Reformatting Output for a 40 Character Display
The teletype terminals that would be connected to an HP2000C had generous line widths for displaying the program output. The 40 character display on a television set requires inserting line breaks into the original STTR1 text.
HP Time-Shared BASIC
3690 PRINT USING 3700;K[I,1],K[I,2]
3700 IMAGE "KLINGON AT SECTOR ",D,",",D," DESTROYED ****"
HP Time-Shared BASIC provides formatted printing akin to C’s printf() function. IMAGE statements define a mix of literal strings and placeholders with format codes. The PRINT USING statement points to the line containing the desired IMAGE statement and a list of variables to be substituted for the placeholders.
HP Time-Shared BASIC
2720 PRINT USING 2730;H,K[I,1],K[I,2],K[I,3]
2730 IMAGE 4D," UNIT HIT ON KLINGON AT SECTOR ",D,",",D," (",3D," LEFT)"
Aquarius BASIC
2720 PRINT H;" UNIT HIT ON KLINGON":PRINT " AT SECTOR ";
2730 PRINT K(I,1);",";K(I,2);" (";K(I,3);" LEFT)":PRINT
Zeroing an Array
The HP has strong matrix support and has the ability to operate on all elements in a matrix with one command.
HP Time-Shared BASIC
260 DIM G[8,8],C[9,2],K[3,3],N[3],Z[8,8]
...
910 MAT K=ZER
Aquarius BASIC
260 DIM G(8,8),C(9,2),K(3,3),N(3),Z(8,8)
...
910 FOR I=0 TO 3:FOR J=0 TO 3:K(I,J)=0:NEXT J:NEXT I
Jumped GOTO
HP Time-Shared BASIC provides a variation of the ON x GOTO line1 line2… seen in other BASICs on micros but not found on the Aquarius. And…Was GOTO originally intended to be GO TO (two words)!?
HP Time-Shared BASIC
1270 PRINT "COMMAND:";
1280 INPUT A
1290 GOTO A+1 OF 1410,1260,2330,2530,2800,3460,3560,4630
Aquarius BASIC
1270 PRINT "COMMAND:";
1280 INPUT A
1290 IF A=0 THEN 1410
1292 IF A=1 THEN 1260
1293 IF A=2 THEN 2330
1294 IF A=3 THEN 2530
1295 IF A=4 THEN 2800
1296 IF A=5 THEN 3460
1297 IF A=6 THEN 3560
1298 IF A=7 THEN 4630
Non-Trivial Changes
Fundamental Differences in String Variables
HP Time-Shared BASIC
HP BASIC strings are implemented as a one-dimensional array of bytes. The command DIM S$ [n] reserves n bytes for string S$.
Throughout the original STTR1 code, much of the game’s “graphical” representation is accomplished by injecting the symbols for the Enterprise (‘<*>’), stars (‘ * ‘), and Klingons (‘+++’) into large strings, exploiting HP’s treatment of Strings as special cases of matrices.
However, HP BASIC strings are limited to 72 characters. For this reason, the young Mr. Mayfield had to split the 192 (8 x 8 x 3) characters needed to represent the Short Range Scan view across 3 string variables Q$, R$, and S$. And then add code to cascade across the variables when trying to inspect a particular spot in a quadrant.
270 DIM C$[6],D$[72],E$[24],A$[3],Q$[72],R$[72],S$[48]
...
980 A$="<*>"
...
5510 REM ****** INSERTION IN STRING ARRAY FOR QUADRANT ******
5520 S8=Z1*24+Z2*3-26 (Note: Z1 and Z2 are values between 1 and 8)
5530 IF S8>72 THEN 5560
5540 Q$[S8,S8+2]=A$
5550 GOTO 5600
5560 IF S8>144 THEN 5590
5570 R$[S8-72,S8-70]=A$
5580 GOTO 5600
5590 S$[S8-144,S8-142]=A$
5600 RETURN
Aquarius BASIC
Strings do not need to be declared before use. The command DIM Q$ (64) creates an array of 64 (maybe 65) strings. For the Aquarius version of STTR1, strings will need to be used in a totally different way. Since the game’s “graphics” are stored as 3-character strings, I’ve opted to create an array of strings. In a 8×8 quadrant, Q$ will provide (64) 3-character strings.
270 DIM Q$(64)
...
980 A$="<*>"
...
5510 REM ****** INSERTION IN STRING ARRAY FOR QUADRANT ******
5520 S8=(Z1-1)*8+Z2 (Note: Z1 and Z2 are values between 1 and 8)
5540 Q$(S8)=A$
5600 RETURN
Memory
No-Frills STTR1 Consumes Most of the 16K on an Aquarius
The target platform is an Aquarius with 16K RAM. If I drop the STTR1 code into an Aquarius emulator, FRE(0) shows that 1K of RAM is remaining. If I want to add new features, then the existing program will need to be put on a diet. Otherwise OM (Out of Memory) errors will begin to appear.
Solutions include: moving the embedded instructions to a separate, stand-alone program, combining multiple BASIC commands onto a single line, and creating an array of resource strings to use in place of repeated literals, like “KLINGON”, “TORPEDO”, and “ENTERPRISE”.
Up Next
Documenting the important variables used in STTR1.
(This is part one of the chronicle of my Retrochallenge 2016/01 submission, which is to port some classic Star Trek text games to the Mattel Aquarius. To jump to the beginning, go here.)
Let’s Play the HP Time Shared BASIC Version of STTR1
I recorded a “Let’s Play” video of an abbreviated session of STTR1, enough to exercise all of the commands at least once. This was very, very late night recording – my mental acuteness was the opposite of acute.
How/Where to Run the Original STTR1
In preparation for my Retrochallenge, I spent some time in December trying to learn about STTR1 and how to play the original game. Well, I assume the “original” original game, which ran on an SDS Sigma 7 computer is lost to us and now resides in bit heaven. But the HP Time Shared BASIC port survived because of its inclusion in HP’s User-Contributed Library and the success of the HP2000 Family. In the end, I found at least three options for playing the HP version of STTR1:
Locate and restore (2) HP2000 Series computers. One unit is needed for multiplexing terminals and one to run Access/Time Shared BASIC. And don’t forget tape drives or paper tape readers. And the media (magnetic and/or paper tapes). So – this option is impossible.
Download, compile, configure, and run the SimH simulator. If you haven’t heard of SimH, it is to minicomputers what MESS is to microcomputers – only difficult. I did, in fact, have success with this route after several weeks of trying and would like to document my setup and perhaps share some configuration files. But that is a lower priority at the moment. If I fail to document this, I did find everything I needed, (though not in any single, tidy package) at the HP2000 Group but you’ll need to join the group to gain access to the necessary files.
Telnet to an already-running instance of a simh simulator. There are two such machines available at the time of this writing due to the generosity of the HP2000 Yahoo Group members :
mickey.publicvm.com
hp2000.brighton.ac.uk
The “Too Long, Didn’t Watch” Version
So, assuming these machines are still listening when you read this, the telnet option is the most straight-forward way to try out STTR1.
To Launch STTR1:
Launch a terminal, such as the classic ‘xterm‘, that won’t be confused by the HP’s strange End-of-Line characters.
Do this:
telnet mickey.publicvm.com or hp2000.brighton.ac.uk
CTRL+m,CTRL+j
HELLO-T001,HP2000,1
GROUPS
EXECUTE-*STTR1
For your convenience, the instructions for STTR1 have been pulled from the original source and reformatted in my previous post.
To Quit STTR1:
Use Command 7,2
Enter a long string at prompt for using the calculator. This causes a string overflow and breaks out of the program.
BYE
These machines have many other early text games including 1975 version of Oregon Trail. When looking at the list of programs in the output of GROUPS, the programs with a “C” attribute are semi-compiled and may need to be started using the command EXE-*progname, otherwise you should be able to use EXE-progname.
Up Next
Due to incompatibilities between HP’s BASIC and the version of MS BASIC found on the Aquarius, I’m forced to climb into the head of a teenage programmer from 1972.
Here are the instructions for the 1972 Star Trek text game as found(*) in STTR1’s BASIC listing.
(*) Modified from strictly upper case
SYMBOL
DESCRIPTION
<*>
Enterprise
+++
Klingon
>!<
Starbase
*
Star
Command 0 = Warp Engine Control
‘Course’ is a circular numerical vector arrangement as shown. Integer and real values may be used. Therefore course 1.5 is half way between 1 and 2.
4 3 2\ ^ / \ ^ /5 ------------- 1/ ^ \/ ^ \6 7 8
C O U R S E
A vector of 9 is undefined, but values may approach 9.
One ‘warp factor’ is the size of one quadrant. Therefore to get from quadrant 6,5 to 5,5 you would use course 3, warp factor 1.
Command 1 = Short Range Sensor Scan
Prints the quadrant you are currently in, including stars, Klingons, starbases, and the Enterprise; along with other pertinate information.
Command 2 = Long Range Sensor Scan
Shows conditions in space for one quadrant on each side of the Enterprise in the middle of the scan. The scan is coded in the form XXX, where the units digit is the number of stars, the tens digit is the number of starbases, and the hundreds digit is the number of Klingons.
Command 3 = Phaser Control
Allows you to destroy the Klingons by hitting him with suitably large numbers of energy units to deplete his shield power. Keep in mind that when you shoot at him, he gonna do it to you too.
Command 4 = Photon Torpedo Control
Course is the same as used in Warp Engine Control. If you hit the Klingon, he is destroyed and cannot fire back at you. If you miss, he will shoot his phasers at you.
Note: The Library Computer (Command 7) has an option to compute torpedo trajectory for you (Option 2).
Command 5 = Shield Control
Defines number of energy units to be assigned to shields. Energy is taken from the total ship’s energy.
Command 6 = Damage Control Report
Gives state of repairs of all devices. A state of repair less than zero shows that the device is temporarily damaged.
Command 7 = Library Computer
The library computer contains the three options:
Option 0 = Cumulative Galactic Record
Shows computer memory of the results of all previous long range sensor scans.
Option 1 = Status Report
Shows number of Klingons, stardates, and starbases left.
Option 2 = Photon Torpedo Data
Gives trajectory and distance between the Enterprise and all Klingons in your quadrant.
My Retrochallenge for 2016/01 is to correct an error in the space-time continuum and bring several versions of the not-as-ubiquitous-as-I’ve-been-led-to-believe classic Star Trek text game to the Mattel Electronics/Radofin Aquarius (a machine that can confidently claim to have been retro since inception). The target platform is an Aquarius with 16K RAM running Martin v.d. Steenoven’s BootLoader BASIC v2.1.
Todo:
Port Mike Mayfield’s STTR1 (1972) from HP 2000 Time Share BASIC
Port Leedom & Ahl’s Super Star Trek (1975) from Microsoft BASIC
Modify Super Star Trek to take advantage of features of the Aquarius
Along the way I hope to learn more about the history of the game (something that had already passed me by before I got my Atari 400 in 1983) and more about the Aquarius (my first, though sorely neglected, retro-as-a-hobby computer).
The Star Trek Text Game
Through the late sixties, versions of Star Trek-themed computer games bubbled up in academic computer labs such as Carnegie Mellon and Berkley. However it was high school student Mike Mayfield’s 1972 version that would define the genre. Originally played on a teletype terminal connected to an SDS Sigma 7 computer, he later ported the program to HP2000C Time Shared BASIC in exchange for computer time. From there it was distributed on HP’s official Contributed Software tape library (named as STTR1) exposing it to a much greater audience.
The game was re-implemented and extended on disparate platforms in the years before the micro computer revolution. One of which was David H. Ahl & Mary Cole’s SPACWR found in Ahl’s 101 BASIC Computer Games, a book printed in 1973-75 by Digital Equipment Corporation. Another was Robert C. Leedom’s Super Star Trek that, as publisher of Creative Computing, Ahl included in the magazine’s May-June 1975 issue. The program listing was reprinted in other books and magazine compendiums around 1978, just as micros were becoming easily accessible. Having been ported to Microsoft BASIC, Super Star Trek pollinated to most of the micro computers of the era since that flavor had become the de facto standard.
Once microcomputers became sophisticated enough to incorporate color graphics the game lost its appeal. Atari’s Star Raiders exemplifies this transition from text to video games. At its core, it’s still a Star Trek style game with a quadrant-style map and emphasis on resource management. But now included arcade sequences to settle the battles.
Unfortunately for the Mattel Aquarius, it entered the market after the wave of Star Trek games had come and gone. And lacked the graphical prowess to compete with other home computers.
(This is the final part of the chronicle of my Retrochallenge 2015/01 submission, which is to port the modern-day Apple II game, Structris, to the Atari 8-bit home computer using an obscure language called PL65. The mediocrity starts here.)
Before really jumping into it. Here are links I want to share:
I couldn’t have cut it any closer to the deadline, but I declare victory over my Retrochallenge 2015/01 project. Since the previous post, I’ve been able to put finishing touches on the game. These include:
Level advancement
Throttled game loop
Scoring
Level 11 and beyond
Allow movement after collision
Loading Time screen
Level Advancement
Each level range (1..10, 11..12, …) has a target number of rows to be collapsed before advancing to the next level. The game now tracks the rows collapsed and when the goal has been reached, play temporarily ends, and the playfield is animated to first drop all the pieces to the bottom, and then collapses the remaining pile. The Tetris well is cleared and re-drawn to be smaller than before. Levels 10, 20, 30, … are the most constrained.
Unfortunately my ongoing PL65 bug occurs during the animation sequence. The bug seems to occur when I use STRING datatypes. From my vantage point the PRIOR/GPRIOR register is being trespassed for some reason and the graphics mode will shift to either 8, 9, or 11 (or if I’m lucky, the desired mode, 10, will appear). It’s beyond my skill to find a solution for this one. I’ve decided to leave the bug in as Noahsoft’s artistic contribution since it does provide a startling exit to the current level and the graphics returns to normal when the game resumes.
Throttled Game Loop
The assembly code version of the “Scroll” routine is way too fast to allow running wide open. I played the original Apple version of the game and measured (crudely) the time it takes for a game piece to fall from top to bottom for a small sampling of levels. I derived a linear equation to variably adjust the game loop to match the timing on the Apple. I wouldn’t be surprised if I’m off and the Apple II’s speed increases with each level on a curved path rather than linearly. All I can say is it’s very playable.
Scoring
Simple. You get one point per row cleared. No bonuses for collapsing multiple rows at a time. Score is displayed in the text frame.
Level 11 and Beyond
Play advances beyond level 10, to match the competition version of Structis. The well returns to its level 1 size but your blip becomes mostly invisible, appearing maybe once every 5 seconds. If you make it to level 20, it’s even more invisible. But who’d go that far?
Allow Movement After Collision
I modified the keyboard routine to allow side-to-side movement after your blip comes into contact with a descending game piece. This feature is found in the Apple version but wasn’t working on my Atari version until now. This allows for some daring escapes.
Load Time Screens
Added the equivalent of the Apple’s version of the boot screen that contains abbreviated instructions and credits. Modified the “title” screen to include my name.
What’s Different?
Here’s some differences I’ve noticed between my version and the Apple version:
On the Atari version you can not descend faster than a falling piece. On the Apple version you can out-race a descending piece for an especially skillful escape.
The pink “S” shaped piece occasionally misses its cue. You may notice a pause when this piece is supposed to appear. If you stay where you are, it will appear on its second chance.
Level “cut-scene” animation glitches – but now it’s a feature.
(This is part six of the chronicle of my Retrochallenge 2015/01 submission, which is to port the modern-day Apple II game, Structris, to the Atari 8-bit home computer using an obscure language called PL65. The mediocrity starts here.)
I was able to convert the scroll routine that moves the Tetris pieces down the screen from straight PL65 to 6502 Assembly. Recall that one of the brilliant virtues of Noahsoft’s PL65 is its ability to treat 6502 mnemonics as first-class commands. There are limitations and PL65’s documentation warns against intermingling PL65 and 6502 statements .unless you have a fetish for devious bugs.
Though you can’t help but use INC MYVAR instead of MYVAR = MYVAR + 1.
Earlier this month, I was dismayed that PL65, by itself, couldn’t render quickly enough to match speed of the Apple version. The Apple does use a machine language routine to perform the scrolling. It was implemented using Ivan X’s Applesoft extension called Slammer, which embeds monitor or assembly instructions as REM statements. I’m still relatively new to 6502 Assembly, so I wasn’t planning on having to spend time trying to figure that one out.
Holy Crap! I May Finish This Yet.
The performance difference using the 6502 routine is astounding.
This will give me plenty of cycles to spare to help finishing up any lingering features. In fact, if I don’t run out of time, my plan is to throttle the Atari version to animate the pieces to match the speed of the Apple version. In Martin Haye’s Apple II game, as the player advances to the next level, the Tetris well reduces in size. A happy side effect is the computer has fewer pixels to move and therefore the pieces fall faster as the level increases.
But there’s still several features needed before calling this one done:
The calculation of “Rows Cleared” needs to be corrected
Once the goal for rows-cleared is completed, play should advance to the next round
Match the game’s speed exactly to the Apple II version (may vary by level) – this should aid in the player’s blip being more visible.
Add scoring
General cleanup
Stretch 1: Add German/Czech/Polish versions of the instructions)
Stretch 2: Add other instructions to the BeweDOS batch file to better mimic the Apple II version
Code Dump
Here’s the logic for the scroll routine first in PL65 and then re-implemented as 6502 instructions:
!---------------------------------------
! SCROLL
!---------------------------------------
PROC SCROLL()
INT A1, A2
BYTE R, S, CL
BEGIN
! CHECK TO SEE IF BOTTOM ROW IS CLEAR
CL = 0 R = 0 S = 0 A1 = ORIGIN P1 = ORIGIN
WHILE V1 <> $88 DO
IF V1 = $00 THEN
INC R
ELSE
INC S
ENDIF
A1 = A1 + 2 P1 = A1
ENDWHILE
! IF CLEARED
IF R = 0 AND S > 0 THEN
INC RC INC CL
ENDIF
R = CL
S = HEIGHT2
A1 = ORIGIN
A2 = A1 - 32
P1 = A1 P2 = A2 P3 = A1 + 1 P4 = A2 + 1
WHILE V1 <> $88 DO
WHILE S > 0 DO
IF R = 0 AND V1 = $00 THEN R = 1 ENDIF
IF R = 1 THEN
V1 = V2 V3 = V4
IF S = 1 THEN V2 = $00 V4 = $00 ENDIF
ENDIF
P1 = A2 P3 = A2 + 1 A2 = A2 - 32
P2 = A2 P4 = A2 + 1
DEC S
ENDWHILE
A1 = A1 + 2 A2 = A1 - 32
P1 = A1 P2 = A2 P3 = A1 + 1 P4 = A2 + 1
S = 37 - LV
R = CL
ENDWHILE
END
CONST DUMMY4 = @
@ = $8800
!-----------------------------
! SCROLL2
!-----------------------------
PROC SCROLL2()
INT A1, A2
BYTE FILL_FL, HGT, CL
BEGIN
! CHECK TO SEE IF BOTTOM ROW IS CLEAR
! SCAN BOTTOM ROW
!CL = 0 R = 0 S = 0
LDA #$00
STA CL
STA FILL_FL
STA HGT
!A1 = ORIGIN
LDA ORIGIN+1
LDY ORIGIN
STY A1
STA A1+1
!P1 = ORIGIN
STY P1
STA P1+1
!WHILE V1 <> $88 DO
LDY #$00
:wh01
LDA (P1),Y
CMP #$88
BEQ endw01
CMP #$00
BNE inc_s
INC FILL_FL
GOTO endif01
:inc_s
INC HGT
:endif01
INY
INY
JMP wh01
:endw01
!IF R = 0 AND S > 0 THEN
LDA FILL_FL
BNE endif04
LDA HGT
BEQ endif04
INC RC
JSR PRINT_ROWS_CLEARED
INC CL
:endif04
! FILL_FL = CL
LDA CL
STA FILL_FL
!HGT = HEIGHT2
LDA HEIGHT2
STA HGT
! A1 = ORIGIN
LDA ORIGIN+1
LDY ORIGIN
STY A1
STA A1+1
!A2 = A1 - 32
SEC
LDA A1
SBC #$20
STA A2
LDA A1+1
SBC #$00
STA A2+1
!P1 = A1
LDA A1+1
LDY A1
STA P1+1
STY P1
!P2 = A2
LDA A2+1
LDY A2
STA P2+1
STY P2
!P3 = A1 + 1
LDA A1
LDY A1+1
STY P3+1
CLC
ADC #$01
STA P3
BCC add02
INC P3+1
:add02
!P4 = A2 + 1
LDA A2
LDY A2+1
STY P4+1
CLC
ADC #$01
STA P4
BCC add03
INC P4+1
:add03
!WHILE V1 <> $88 DO
:wh02
LDY #$00
LDA (P1),Y
CMP #$88
BNE wh03
GOTO endw02
!WHILE HGT > 0 DO
:wh03
LDA HGT
BEQ endw03
!IF FILL_FL = 0 AND V1 = $00 THEN FILL_FL = 1 ENDIF
LDA FILL_FL
BNE endif02
LDY #$00
LDA (P1),Y
BNE endif02
LDA #$01
STA FILL_FL
:endif02
!IF FILL_FL = 1 THEN
LDA FILL_FL
BEQ endif03
!V1 = V2 V3 = V4
LDY #$00
LDA (P2),Y
STA (P1),Y
LDA (P4),Y
STA (P3),Y
!IF HGT = 1 THEN V2 = $00 V4 = $00 ENDIF
LDA HGT
CMP #$01
BNE endif03
LDA #$00
STA (P2),Y
STA (P4),Y
!ENDIF
:endif03
!P1 = A2
LDA A2+1
LDY A2
STA P1+1
STY P1
!P3 = A2 + 1
LDA A2
LDY A2+1
STY P3+1
CLC
ADC #$01
STA P3
BCC add04
INC P3+1
:add04
!A2 = A2 - 32
SEC
LDA A2
SBC #$20
STA A2
LDA A2+1
SBC #$00
STA A2+1
!P2 = A2
LDA A2+1
LDY A2
STA P2+1
STY P2
!P4 = A2 + 1
LDA A2
LDY A2+1
STY P4+1
CLC
ADC #$01
STA P4
BCC add05
INC P4+1
:add05
DEC HGT
!ENDWHILE
JMP wh03
:endw03
!A1 = A1 + 2
CLC
LDA A1
ADC #$02
STA A1
BCC add01
INC A1+1
:add01
! A2 = A1 - 32
SEC
LDA A1
SBC #$20
STA A2
LDA A1+1
SBC #$00
STA A2+1
!P1 = A1
LDA A1+1
LDY A1
STA P1+1
STY P1
!P2 = A2
LDA A2+1
LDY A2
STA P2+1
STY P2
! P3 = A1 + 1
LDA A1
LDY A1+1
STY P3+1
CLC
ADC #$01
STA P3
BCC add06
INC P3+1
:add06
!P4 = A2 + 1
LDA A2
LDY A2+1
STY P4+1
CLC
ADC #$01
STA P4
BCC add07
INC P4+1
:add07
!S = HEIGHT2
LDA HEIGHT2
STA HGT
!R = CL
LDA CL
STA FILL_FL
JMP wh02
!ENDWHILE
:endw02
END
@ = DUMMY4
(This is part five of the chronicle of my Retrochallenge 2015/01 submission, which is to port the modern-day Apple II game, Structris, to the Atari 8-bit home computer using an obscure language called PL65. The mediocrity starts here.)
Only a minor difference in this version versus the previous. Now for each completed row, the pile of pieces will collapse. I was surprised that it didn’t take much additional code in the scroll routine to implement. The algorithm scans the pixels along the bottom of the well. If no $00 (background) pixels are found then the scroll routine performs the “copy pixel from above” from the bottom of the pile (and up) instead of the top of the pile (and up).
Common sense should have me working some easy wins to see this game nearly functionally equivalent to its Apple II hero. This would be keeping track of the rows completed and advancing to the next level. Instead I’m consumed with trying to convert the scroll routine from PL65 to 6502 assembly, for which I have no skill. But then again, common sense should have me working on something entirely different.