Tackling the Logiker 2023 Vintage Computing Christmas Challenge – part 3

See also: part 1, part 2, part 3 and part 4.

I have to admit, this year’s Logiker challenge stumped me. I had a few “clever” ideas on how to reproduce the pattern, but the code was larger than just printing out the pattern from arrays of strings.

Meanwhile, Jason Pittman kept posting revisions of his concept in the comments. In a response to part 2, he shared this:

This is the last attempt I came up with. It uses the same “-3 to 2 … ABS()” from the other example I sent on part 1. I think one potential trick here is to treat it as if you are holding a rubber stamp that stamps out three asterisks that are six spaces apart. You want to make this pattern by stamping it twice on each line. You’re keeping track of a starting position on each row (1027 + 32 for each row) and an offset to add and subtract to the starting position for each row. On the first line, the offset is zero, so you stamp it twice on top of itself at the starting position. On the next line, the offset is 1, so you stamp it twice, but one time you add -1 and the other time you add +1 to the starting position. Does this make any sense?

1 CLS:P=1027:FORC=1TO3:FORX=-3TO2:FORS=0TO12STEP6:POKEP-3+ABS(X)+S,106:POKEP+3-ABS(X)+S,106:NEXT:P=P+32:NEXT:NEXT:GOTO1

– Jason Pittman

This was an optimization of his original approach, but it had one limitation that might prevent it from solving the challenge: The CoCo’s 32×16 screen is too small to display the entire image, and POKEing characters on the screen would be limited to just 16 lines of text. He was aware of this, and his program does POKE the full image, but it is POKEing past the end of the visible screen. Would this count? RUNning the program displays the pattern over and over again (which was done to avoid having a new line with an endless loop GOTO):

POKEing past the visible screen works here because I am emulating a Disk Extended BASIC CoCo, and the memory after the text screen is reserved for four pages of PMODE high resolution graphics. But, I suspect, if I ran this on a cassette based CoCo, it might be POKEing in to memory used for the BASIC program itself.

Perhaps the CoCo 3 could help, since it has 40×25 and 80×25 text modes? Jason tried that:

I may play around with LPOKE. This should get it on the 40 column screen. I bet there is a crafty way to (a) not do the last line manually outside of the loops (b) remove one of the FOR loops (c) Shoot, there’s probably some crafty wizard way to do it in one FOR loop with logical operators, but I wouldn’t ever find it.

1 WIDTH40:FORZ=0TO12STEP6:FORX=-3TO2:FORS=0TO12STEP6:LOCATEABS(X)+S,Z+X+4:PRINT”*”;:LOCATE6-ABS(X)+S,Z+X+4:PRINT”*”;:NEXT:NEXT:NEXT:FORX=3TO15STEP6:LOCATE X,19:PRINT”*”;:NEXT

– Jason Pittman

In this version, Jason uses LOCATE(x,y) to position the cursor. That is what the CoCo 3 used instead of PRINT@ for text positioning. And it works!

It also feels better to use built-in BASIC text commands versus POKEing in to memory.

But he wasn’t done! He added this version:

10 WIDTH 40
20 FOR S = -15 TO 33 STEP 6
30 FOR X = 0 TO 18
40 IF S+X < 19 AND S+X >= 0 THEN LOCATE S+X,X:PRINT "*";
41 IF S-X >= 0 AND S-X < 19 THEN LOCATE S-X,X:PRINT "*";
50 NEXT X
60 NEXT S
70 GOTO 70

This one draws the same pattern, but in a very different way. It draws diagonal lines going down from the points at the top. Try it! It’s cool!

And, then this odd one, which creates the pattern by drawing the asterisks RANDOMLY, eventually getting them all on the screen.

0 WIDTH40
1 X=RND(3)*6:Y=RND(3)*6:RX=RND(7)-4:RY=ABS(RX)-3:D=RND(2)*2-3:LOCATE X+RX,Y+RY*D:PRINT"*";:GOTO 1

Nice job, Jason!

But it is going to make my brain hurt to understand how this works…

Meanwhile, I received a message from Rick Adams on Facebook with an implementation he was working on for a (much more limited) PDP-8 BASIC.

To be continued…

Tackling the Logiker 2023 Vintage Computing Christmas Challenge – part 2

See also: part 1, part 2, part 3 and part 4.

As I write this, I have no idea how to make this work. Producing this pattern:

   *     *     *
* * * * * *
* * * * * *
* * * *
* * * * * *
* * * * * *
* * *
* * * * * *
* * * * * *
* * * *
* * * * * *
* * * * * *
* * *
* * * * * *
* * * * * *
* * * *
* * * * * *
* * * * * *
* * *

…seems like it should be simple. Three asterisks, then six, then six, then four, then six, then six, then three… Spaces that go five, three, one, zero and then back up. Unhelpful.

But, it’s also just one pattern repeated across the screen three times…

   *
* *
* *
* *

And then it’s reversed, so I think if we can do the above, we can do the whole pattern. We see spaces of three, two, one, zero on the left, and zero, one, three, and five in the inside.

Color BASIC does not have a SPC() option (my VIC-20 did, I think) for outputting spaces, but TAB() will go to a specific column. Maybe we can figure out which column the asterisks should be in:

.........1111111111
1234567890123456789
* * *
* * * * * *
* * * * * *
* * * *

This gives us 4, 10 and 16. Then 3 and 5, 9 and 11, and 15 and 17. Then 2 and 6, 8 and 12, and 14 and 18. Finally, 1 and 7 and 13 and 19. I don’t know why, but I kind of like thinking about it as tab positions.

10 FOR SP=3 TO 0 STEP-1
20 PRINT TAB(SP);"*";TAB(6-SP);
30 IF SP<3 THEN PRINT "*";
40 PRINT
50 NEXT

That would give us one of the pyramid shapes. To complete the bottom, we’d do another FOR/NEXT loop. At least, that’s what I would do. BUT, in a comment to part 1, Jason Pittman had a smarter idea:

Awesome! I’ve got an idea on this one but I’m not going to jump ahead this year and I’m just going to follow along.One thought here is that you could combine the two print loops on 100 and 110 by coming up with a series that goes “0 1 2 3 2 1”. I did it by replacing 100 and 110 with this: “100 FOR A=-3 TO 2:PRINT A$(ABS(ABS(A)-3)):NEXT”

Or, you could shorten that a little if you reverse the direction of the array (so that it looks like “VVV”) and use “100 FOR A=-3 TO 2:PRINT A$(ABS(A)):NEXT” – Jason Pittman

I could print one diamond like this:

10 FOR A=-3 TO 3:SP=ABS(A)
20 PRINT TAB(SP);"*";TAB(6-SP);
30 IF SP<3 THEN PRINT "*";
40 PRINT
50 NEXT

That prints almost the entire diamond, except for the final asterisk. Because, if I wanted to print three of them, I’d do this in a loop, then print the final asterisk row at the end.

Unfortunately, as I start going down this rabbit hole, I find the code of loops and such ends up looking larger than some much simpler approaches, like one shown to my by Rick Adams. His code was written for a PDP-8 BASIC, which lacks things like ELSE and MID$. His technique was to have strings representing parts of the pyramid:

"   *  "
" * * "
" * *"
"* "

…then to print each string three times across the screen. This produced:

"   *     *     *  "
" * *  * *  * * "
" * * * * * *"
"* * * "

…and then do it backwards. There is a missing “*” on the right, that gets printed with an “IF”. In a chat, we bounced around some ideas to shrink the code, but looking at his approach, it seems everything I try to do gets larger:

  • Try “run length encode” where DATA statements represent the spaces. Print that many spaces, then an asterisk, and repeat.
  • Try DATA statements showing the positions of the asterisks. DATA is large than a string.
  • Try simulating a “SET(x,y)” to draw it, but using PRINT@ on the CoCo. Alas, the CoCo 32×16 screen is too small to fit the whole pattern, so even if this was smaller, it would still require extra code at the end to scroll the screen and print the final few lines (as the top portion scrolls off). BUT, using a CoCo 3 40/80 column screen would work using LOCATE x,y instead. But still, larger.

Is there an elegant solution to this challenge that doesn’t involve just PRINTing strings?

We shall continue… Next time…

Rest in peace, Steve Bjork

Glenside found out the details

In Memoriam: Steve Bjork, Pioneer and trailblazer of Personal Computing and the Tandy Color Computer

Legendary Color Computer game programmer, Steve Bjork, is no longer with us.

I have much to say about Steve. I considered him good friend, and alwauys enjoyed meeting up with him when I would visit Southern California. I had not been in touch since the Covid-era, and I wish I had. This news comes as quite a shock.

I hope to share some fun stories about hanging out with Steve. Though many know him from his video games on TRS-80, the Color Computer, Gameboy, Genesis, Super Nintendo, and I think even something on Playstation, I knew him as my Disneyland/theme park friend.

As a local, Steve grew up around Disneyland, and even worked there in the 1970s as a Jungle Cruise skipper.

I spent many days hanging out with him at Disneyland, and early on he would tell me, “there’s more to see in California than Disneyland.” He would become my tour guide during these trips — taking me to Magic Mountain (where he worked in the 1970s), Knott’s Berry Farms, and places like Fry’s Electronics and In and Out Burger. Many of the things I love about visiting California are directly traced back to Steve suggestions.

My finances prevented me for visiting for many years, but I did meet up with him again in 2017. Then he introduced us to Rock and Brews – a restaurant connected to KISS members Gene Simmons and Paul Stanley.

http://misc.disneyfans.com/OtherPlaces/California/RockAndBrews2017/index.html

There was always a new experience I would never have discovered on my own as an ignorant tourist ;-)

There are fun trivia things about Steve… He was an extra in The Goonies (if I have the movie correct), as a reporter. He was an extra in the movie Rollercoaster, I believe loading folks on a coaster. He has an Internet Movie Database entry through his work on One On One (basketball) and The Mask (Super Nintendo). He was a magician at some point — a tidbit that came up during an early theme park visit, complete with him presenting a “Hot Rod” trick he had with him (a trick I knew well from my younger days as an amateur magician).

There are many tales about his time in the software industry – such as a story about folks working on the TRON movie visiting computer places to ask questions. I think he worked for Datasoft at the time, which was “just down the road” from the Disney Studios.

If you look at the startup screen for The Rocketeer on Super Nintendo, I believe I heard Steve was the one wearing the suit for the photo (1992). Apparently props and such were loaned out so they could be used for reference for the game.

Steve also had a haunted house effects company — creating custom hardware and software to do things like make animated skulls talk to audio. An article about one of his products (“Wee Little Talker”) was featured in Nuts and Volts magazine (September 2017). You can see a photo of a circuit board with “Copyright 2017 Steve Bjork” on it. The article was co-written by his haunt partner, Steve Koci, who also passed away in recent years. Their business, Haunt Hackers, last updated in 2021 with a “closed due to Covid” message on the now-defunct website.

And people knew him. Once I was at Disneyland with him for some special opening event. A Disneyland manager type walked up to him and said “Steve Bjork, you’re my hero!” This person had known him through computer clubs back in the 80s. And that wasn’t the only time I saw something like that happen.

So while he popped up in CoCo discussions frequently (and got re-engaged in later years via the CoCoTalk YouTube show), it was also no surprise to see him pop up in an electronics publication or a haunted house message forum. I even remember reading a Disneyland fan site report about some event out there, and Steve Bjork was there presenting some kind of plaque to someone involved with a restaurant.

He did so much, and was still designing and programming new things right up to his final years.

He will be greatly missed.

I am sad.

Tackling the Logiker 2023 Vintage Computing Christmas Challenge – part 1

See also: part 1, part 2, part 3 and part 4.

Special thanks to Jason Pittman for mentioning this year’s challenge in a comment…

Logiker is at it again, with a 2023 retro-programming Christmas challenge:

???? Vintage Computing Christmas Challenge (VC³) 2023 ???? – Logiker

This year, the pattern looks like this:

   *     *     *
* * * * * *
* * * * * *
* * * *
* * * * * *
* * * * * *
* * *
* * * * * *
* * * * * *
* * * *
* * * * * *
* * * * * *
* * *
* * * * * *
* * * * * *
* * * *
* * * * * *
* * * * * *
* * *

This image is 19×19, so while it will fit on a Radio Shack Color Computer 1/2 screen width-wise, it’s a bit too tall to fit height-wise. The challenge allows for it to scroll off the screen, which is something we had to do for past challenges.

Logiker 2023 Challenge pattern.

I can think of a number of ways to approach this.

The pattern is made up of only four unique lines, so you could print them A B C D B C A B C D and so on. There’s probably a simple way to do that with a FOR/NEXT loop and an array of those four lines.

10 CLS
50 A$(0)=" * * *
60 A$(1)=" * * * * * *
70 A$(2)=" * * * * * *
80 A$(3)="* * * *
90 FOR I=1 TO 3
100 FOR A=0 TO 3:PRINT A$(A):NEXT
110 FOR A=2 TO 1 STEP-1:PRINT A$(A):NEXT
120 NEXT
130 PRINT A$(0)
333 GOTO 333

If we had a larger screen (like the 40 or 80 column screens on the Color Computer 3), we could use LOCATE x,y to plot the pattern using some line drawing type math.

We could try the RLE (run length encoding) compression from past years to see if we could compress it down to spaces and characters.

We could try using math to figure out a pattern.

These all seem fun.

I hope to find some time to experiment. I don’t plan to “enter,” since one of the asks for the challenge is to not share your work until after the challenge ends.

More to come…

Color BASIC overflow bug – same as Commodore’s?

I just saw a tweet from Robin @ 8-Bit Show And Tell concerning a bug in Commodore BASIC that existed in the PET, C64 and VIC-20.

VAL() takes a string and converts it in to a floating point numerical variable. The value of “1E39” is a number in scientific notation, and this appears to cause a problem.

In Microsoft BASIC, the notation “1E39” represents the number 1 multiplied by 10 raised to the power of 39. This is also known as scientific notation, where the “E” indicates the exponent to which the base (10 in this case) is raised. So, “1E39” is equal to 1 * 10^39, which is an extremely large number:

1E39 = 1 * 10^39 = 1000000000000000000000000000000000000000

This number has 39 zeros after the 1, making it a very large value.

– ChatGPT

I was curious to see what the CoCo’s Color BASIC did, so I tried it…

It appears that port of BASIC to the 6809 also ported over this bug. Anyone want to take a look at the source and see what the issue is?

…to be continued, maybe…

PONG 1993

File:  PONGTEST.TXT - Revision 1.1 (5/16, 5/18/93) - By Allen C. Huffman

                          In the beginning there was...

                           XXXX    XXX   X   X   XXXX
                           X   X  X   X  XX  X  X
                           XXXX   X   X  X X X  X  XX
                           X      X   X  X  XX  X   X
                           X       XXX   X   X   XXXX (tm)
                                                       
             And now, two decades later, Pong(tm) will live again...


  [DISCLAIMER:   The  game  name  "Pong(tm)"  is  a  TRADE  MARK  of   Atari
  Corporation.   None  of us have anything to do with Atari and we are using
  this name strictly as a term to define a video game concept.  Read at your
  own risk.]


       And to think...this rather bizarre idea all started with an impromptu
  P.A.  announcement at the 2nd Annual "Last" Chicago CoCoFest in May, 1993.
  The announcement, written by Sub-Etha founding partner  Terry  Todd,  went
  something like this:


               Sub-Etha Software, in voluntary cooperation with  StG
          Net,   StrongWare,  Intelligent  Algorithms,  Dave  Myers,
          BARSoft, Burke & Burke, HawkSoft, the National  OS9  Users
          Group  of  Australia,  and  more  of  the rest of the CoCo
          Community will be sponsoring a programming competition  in
          which  each  participant  will  create  a unique, original
          PONG(tm)-type game.  This contest is open to all who  wish
          to  enter.  The programs will be impartially judged at the
          1991 Atlanta CoCoFest on the basis of  Memory  Efficiency,
          Speed   Efficiency,   Originality,  Special  Effects,  and
          Playability.  The programmer judged best in each  category
          will receive a cashiers check in the amount of ONE DOLLAR!


  THE BEGINNING

       Video  games  all  started with Atari's original PONG(tm) game.  This
  tabletop two-player game, reportedly created in 1972 with a production  of
  8000  units  (see  "The  Killer List of Video Games", Dec 1992 version, in
  text-file format  available  from  various  sources),  became  an  instant
  success.   The  original  PONG(tm)  units  are rumored to have broken down
  their first day(s) in service...from jammed coin mechanisms.  (Atari could
  not be reached to comment on this bit of video game lore...)
       It occurs to me, though, that many of our fellow CoCo/OS9 users might
  not  have  even been BORN or, if born, might not have even been old enough
  to have ever seen a PONG(tm) game either as a console game  or  the  later
  home  versions  (before  the  Atari  2600,  even).   For  those...a bit of
  background...

  WHAT IS PONG(tm)?

       PONG(tm) was a digital version of table tennis.  A  black  and  white
  image   consisted  of  a  dotted  line  down  the  middle  of  the  screen
  (representing the net), with a small vertical line on  each  side  of  the
  screen  representing  the  paddles.   A small square represented the ball,
  which would bounce back and forth, hopefully to be deflected by a  paddle.
  Score  was  kept  it  the upper corners and typical tennis rules applied -
  the first one to 21 won.
       It  was  simple,  and  it  was  amazing.   (I first remember seeing a
  PONG(tm) game in a Shakey's  Pizza  Parlor  in  Houston...)   Sadly,  many
  people only remember this classic as a cartridge that used to be available
  for the  old  Atari  2600  called  "Video  Olympics"  (or  something  like
  that...it's  been  awhile)!   Even  the  original  stand-alone  home  game
  machines that did nothing but play PONG(tm) (or the many numerous  clones)
  have long since been forgotten...until now.

  WHAT'S THE DEAL?

       It  occurred  to us that PONG(tm), one of the simplest video games of
  all time, might be an interesting target  of  a  programming  contest.   A
  PONG(tm)-type  game  could  be  written in BASIC and be quite playable, or
  souped up in assembly for some real speed.  What we  propose  is  an  open
  challenge  for  programmers.  What would YOU do with a PONG(tm)-type game?
  Perhaps a "classic" version (how close can you make it  to  the  original,
  "beep"  sounds  and  everything?) or an updated colorized version, perhaps
  with  better  sounds?   Maybe   something   completely   different   -   a
  PONG(tm)-type game with "power-ups" or weapons.  Let your imagination take
  control.  Points will be awarded in a number of categories.  Just follow a
  few basic rules.

  THE RULES

       There  aren't any, really.  Your version of a PONG(tm)-type game must
  run on a CoCo under Basic or Assembly (either 6809 or 6309), or under  OS9
  ('C',  Basic09,  whatever)  or  even  under  OSK (MM/1, TC70, etc...).  If
  enough entries are received,  categories  will  be  created  for  as  many
  "types" as possible.
       To qualify as a PONG(tm)-type game, it must follow a few  guidelines.
  First,  you  should  have  a  bouncing  ball.  Second, you should have two
  paddles (and support one or two players) with which  to  bounce  the  ball
  back  and forth.  Scoring should go until 21 with whoever gets there first
  being the winner.  The ball should start from the middle of the screen and
  head  towards one side.  Whoever scores a point gets to "serve" again, and
  the ball will launch towards the opponent, just like  in  tennis.   That's
  it!  The "net" I guess would be optional.  <grin>
       To summarize:  Make it recognizable as a PONG(tm)-type game then  use
  your imagination!

  JUDGING

       All  received  entries  will be judged at the Atlanta CoCoFest (which
  will probably be held in October) by an  impartial  individual  or  group.
  Several  categories  have  been  established,  with  more  added  later if
  necessary.  These categories are as follows:

       o Memory Efficiency
            Awarded to whoever writes the "smallest" PONG(tm)-type game.

       o Speed Efficiency
            Awarded to whoever writes the fastest PONG(tm)-type game!

       o Originality
            Anything goes!  This will be awarded for the most original
            twist on the old classic.

       o Special Effects
            The game with the most "bells and whistles" will get a prize,
            too!  Music, graphics, whatever...basically, the version that
            looks/sounds the best.

       o Playability
            No  matter how memory or speed efficient, original, or "special"
            a game may be, if it's no fun to play, it's not a good game.
            The will be one overall winner of all entries judged to be the
            "funnest".

  THE PRIZE

       The "press release" states an award of ONE DOLLAR for winners in each
  category.  This may not sound like much of a prize, so let's make things a
  bit more interesting.  Al  Dages  of  the  Atlanta  Computer  Society  has
  decided  to  throw  in  a  TEN  DOLLAR  prize  to  the overall winner, and
  (although maybe jokingly) Dave Myers talked about  chipping  in  an  extra
  BUCK  too.   If  $13  for  top honors still doesn't appeal, let's go a bit
  further.
       Marketing,  my friends!  We will attempt to compile a disk (or disks)
  of all winning entries and a "reasonable fee" will  be  charged  for  this
  disk.   Funds  generated  will be split amongst the programmers.  Sub-Etha
  Software (with hopeful support from other vendors) will  "foot  the  bill"
  for the disks, labels, and duplication costs.
       If that's still not enough, there MAY be more!  We will be talking to
  other  vendors and see about getting together more prizes for the winners.
  This part of the contest will depend entirely on the response  from  other
  vendors (who are, by the way, ALLOWED to enter, too!).  It may never be as
  good as winning the lottery, but it certainly should be fun!

  HOW CAN I ENTER?

       Simply write a PONG(tm)-type game and get it  to  Sub-Etha  Software!
  As mentioned earlier, you can write it under BASIC, 6309 or 6809 assembly,
  OS9, or even OSK.  "Cheating" is allowed for all versions, by the way.  We
  are  more  concerned  with the outcome than "how it got there"...just make
  sure it doesn't do anything too bad!
       The  competition  should  be  interesting.  Several "well known" CoCo
  programmers are rumored to be interested in working on PONG(tm)-type games
  for  this  "for  the  fun  of it" contest.  Don't let that discourage you,
  though!  We'll do our best to try to make it as fun as  possible  for  all
  involved!   So...ready?   Then  let's  get started!  The clock is ticking.
  Get those balls bouncing, and let's have some fun!

  DISCLAIMER

       Please note that we are in no way connected  with  Atari  Corporation
  and  have  neither  their  permission  or  praise  to hold a PONG(tm)-type
  contest.  The game name, PONG(tm), apparently remains  property  of  Atari
  but,  over  the  years,  has fallen into such common usage that we felt we
  should be able to get away with using it to describe this contest  without
  fear of a nasty lawsuit.  (BUT, it is NOT acceptable to call a game simply
  "PONG(tm)".  That has been used...  ;)
       Of  special  interest, though, will be my attempts to contact someone
  at Atari for more official information on the history of PONG(tm) as  well
  as  possible  "official" permission to actually use the name legally.  Who
  knows!  Maybe we'll be able to take the winner and have it released  as  a
  "real"  PONG(tm)  game with Atari's blessing...but don't hold your breath.
  Let's just have some fun.

  THE END

       Terry, just look what you have started!  Any  vendors  interested  in
  upping   the   stakes   can   try   to  contact  me  via  electronic  mail
  (COCO-SYSOP@GENIE.GEIS.COM) or leave a message on the Sub-Etha OSK Midwest
  Division line at (815) 748-6638 (24 hours a day) and it will be relayed to
  me.  Of course, U.S.  Mail is always available...

            Sub-Etha Software
            P.O.  Box xxxx42
            Lufkin, Texas  75915

       Have fun!  I will be looking forward to your entries!   (OSK  entries
  can  be  directed  to Joel Hegberg and perhaps might even be better mailed
  directly to  Joel...Leave  a  message  to  JOELHEGBERG@DELPHI.COM  to  get
  instructions on how to get something to him...)  Thanks!

  ADDENDUM

       On  5/18/93,  I received a return phone call from a lady at the Legal
  Department of Atari.  She  is  currently  checking  into  some  "official"
  PONG(tm)  history for me, as well as finding out some legal guidelines for
  using the name PONG(tm) in this text file.  Suffice it to say that  I  had
  to revise this file and make sure that the TRADE MARK was clearly visible.
  To further disclaim all of this...we are NOT writing PONG(tm)...but  games
  that  are  PONG(tm)-like.   (Thus,  all  the changes in this document from
  Revision 1.0...)

10 PRINT CHR$(205.5+RND(1));GOTO 10 simplified by Jim Gerrie

There is a classic Commodore one-liner program that prints a maze. I have discussed it on this site several times in the past:

10 PRINT CHR$(205.5+RND(1));GOTO 10

I converted it to use CoCo ASCII “/” and “\” characters:

10 PRINT CHR$(47+(RND(2)-1)*45); : GOTO 10

I have since noticed that the 10 PRINT book even has a version for the CoCo in it:

https://10print.org/10_PRINT_121114.pdf page 55

Recently, Jim Gerrie posted a video of a new one-liner MC-10 version of the maze that truly fit on one 32-column line of the MC-10:

https://www.youtube.com/watch?v=7FQ_ht5u2y4

His approach of using MID$() looked much simpler than the CHR$ version of the Commodore original. I am pretty sure my VIC-20 had MID$ so surely the C64 had it as well. Why wasn’t it used? Perhaps this was an example of code obfuscation. “Type in this mysterious code and see what you get!”

Indeed, in a quick test, using MID$() is smaller and faster:

0 PRINTMID$("/\",RND(2));:GOTO

0 PRINTCHR$(47+(RND(2)-1)*45);:GOTO

Now, doing the MC-10 version with CHR$() would be longer on the CoCo since we can’t type those characters like the MC-10 allows. We’d have to use CHR$(140)+CHR$(138) embedded in the MID$ to make that work (and be much slower since it would parse those numbers for every byte of the maze it prints). But…

0 PRINTMID$(CHR$(140)+CHR$(138),RND(2));:GOTO

…does work.

To make it faster, we’d need two lines and a string:

0 A$=CHR$(140)+CHR$(138)
1 PRINTMID$(A$,RND(2));:GOTO1

Even with that, the GOTO is slower than the MC-10 version since it has to parse a number, and then has to skip a line each time. You could get around that by doing it like this, and starting it with “RUN 1”:

0 PRINTMID$(A$,RND(2));:GOTO
1 A$=CHR$(140)+CHR$(138):GOTO

How would you do it? Let me know in the comments.

Until next time…

My unreleased MIDI program for the Kawai K4 synthesizer

I recently shared the story about my first commercial CoCo product, the Huffman K1 Librarian. This was a MIDI librarian for the Kawai K1 synthesizer. In that article, I mentioned that I later sold my K1 to buy a more-better Kawai K4 synthesizer. What I did not remember is that I apparently made a K4 librarian, as well!

The K4 version was very similar to the K1 original, but the menu was updated to reflect how patches were organized on the K4. It appears the K4 has single patches, blocks of patches, and a way to transfer everything at once.

It also had the same disk command menu.

This version shows a 1991 copyright, so two years after the K1 original in 1989. Although the title screen references Rulaford Research, I do not recall it ever being a product they sold. I’m not sure if anyone ever had a copy of it other than myself. If you know otherwise, please leave a comment.

Thirty two years later and I am still (re)discovering stuff.

Until next time…

Escape rooms: 99% looking for lock combinations, 1% “other”.

Earlier this year, I had the opportunity to experience the Back to the Future “escape room” experience by Universal Studios. I have been aware of escape rooms for some time, and while I thought they sounded interesting, I was never interested enough to try one. But this one was different… I had no idea how different it was until I visited a traditional escape room later.

Universal Studios’ experience is automated, and the puzzles involved pressing buttons and plugging things in. Not once did I have to find some four digit code written on the brim of a hat hanging on the wall in order to open a box that would leave me to another four digit code.

But I digress.

At Universal, your experience begins with a preshow (video of the rules), then you enter the initial room. This is where they set up the story through a video presentation (which featured Christopher Lloyd voicing his Doc Brown character from the movies). The room would have various puzzles that were randomized (allowing for re-playability) and if you got stuck, the show system would give hints. Eventually, a door would open and you’d go in to the next room (even if you didn’t solve anything).

Since each room had several levels of puzzles, you might get none, or all, but you still get to proceed. If I recall, this experience featured five (or six?) different rooms, and kept you moving.

There was great sound, music, effects, lights and even smoke.

And that set the bar too high.

Recently, we went through an unlicensed (*cough* copyright infringement *cough*) E.T. the Extra Terrestrial escape room in Branson, Missouri. We spent an hour in two rooms, mostly trying to find codes to various combination locks.

Retromania – Branson, Missouri

Most were four digit number locks. One was a five letter combination lock. And one was a school-locker style three digit combination lock.

That was the majority of the experience! Tryingto find (mostly) four numbers that opened a lock!

There was one different bit where you used a magnet on a string to retrieve a key from the end of a pipe (after you found the pipe), and another puzzle involving getting a code by counting blinking lights. The final puzzle, where time ran out on us, were a few knobs that displayed numbers in LED panels. We couldn’t figure that one out before the hour expired.

What I am curious about is — how many escape rooms are mostly just looking for four digit codes and opening locks? We did a local one, ran by a friend, and it did feature many four digit codes, but it had alot more puzzles and was vastly more interesting.

What is a “normal” escape room?

Comments welcome.

Phreak Philes: Modem scanning in the late 1980s…

phreak /frēk/ INFORMAL

verb: phreak; 3rd person present: phreaks; past tense: phreaked; past participle: phreaked; gerund or present participle: phreaking; noun: phreaking
hack into telecommunications systems, especially to obtain free calls.
“a few old-time hackers still phreak casually just to keep their hand in”

noun: phreak; plural noun: phreaks
a person who hacks into telecommunications systems, especially to obtain free calls.
“the nation’s most clever cellular phone phreaks”

– Oxford Languages via BING search for “define phreak”

I expect most of us have some life changing event we could cite that forever changed the direction of our existence. For example, looking through a telescope for the first mite might have led to a career in astronomy. To me, it was when I was in 7th grade English class and I quoted a line from a PBS TV show I had just watched (“The Hitchhikers Guide to the Galaxy“). A nearby student recognized the quote (“you watched that too?”), and introduce me to the books of Douglas Adams.

Jimmy also introduced me to computers, and helped me learn BASIC programming via books he had. We’d go down to the local Radio Shack to type in the programs we’d written down on paper. This led me to wanting a computer instead of an Intellivison (its baseball program could talk!) or ColecoVision (it came with Donkey Kong!), which started my career as a programmer.

In addition to Douglas Adams and computers, Jimmy also exposed me to the world of phone phreaking — though not at any “WarGames” level. It was just a bunch of junior high kids that learned how to make free phone calls from the school’s payphone, or talk with random kids via “loop lines”. (This made me search for “loop line” to see just what those phone numbers were for. I found a Wikipedia entry about “loop around” which does appear to be what I am referring to. #TheMoreYouKnow).

I remember kids all over Houston, Texas were making use of codes that allowed “free” long distance phone calls. This let them dial in to bulletin board systems out of state without the parents throwing a fit when they received a phone bill.

There was a higher level of phreaking that involved devices that would generate special tons that the old phone system would respond to. They were known as “boxes” and identified by a color. The “red box” simulated a tone that told the phone company a coin was inserted in to a payphone. This allowed making free calls from payphones. I see today’s Wikipedia has an entire category on these boxes with colors I never heard of back then. I think I’d only heard of red, blue (2600 Hz tone generator used for free long distance), and silver (four extra buttons on a standard touch tone keypad labeled A, B, C and D). I recall the “D tone” would knock an operator off the line, for some reason.

I actually had a silver box — something my dad found at a store. I remember him telling me (over the phone) that he found a phone that extra buttons on it that were going to be used for future phone services. He said they were labeled A, B, C and D. Somewhere, I still have that phone. I have no idea why this phone existed in stores, and I never knew how to use it for anything, but somewhere I still have it.

Popular computers like the Apple 2s had tons of phreaking software. The Tandy Color Computer had some, as well, including during the CoCo 3 days. Here’s one called “Super Phreak” by “Mr. Bill”:

It seems to be a software implementation of the phreak boxes, though it doesn’t make any sounds for me (at least not in an emulator).

There was one for the earlier Color Computers, called “BOX.BAS”, but based on the menu screen it may have been called “Phreak Operator.”

I wonder who “S Y N T A X” was, and how the licensing worked.

This one does produce tones, so it must have some assembly language audio routine embedded in it as the CoCo BASIC could only do one tone voice at a time.

But I digress…

In addition to loop lines, hardware boxes, and using codes for free long distance, there were other things lumped together with phreaking, such as having a computer dial numbers looking for other computers. This went by many names (we called it simply “modem scanning”) at the time, but today I see the Wikipedia refers to it as wardialing.

A famous example of this comes from the 1983 movie WarGames where David Lightman (played by a young Matthew Broderick) has his computer scanning for modems, and ends up finding the W.O.P.R. (War Operation Plan Response) supercomputer at NORAD.

WarGames wardialing clip

Unlike the infamous payphone scene, the movie was quite accurate on this. I expect folks wrote replica programs to recreate the user interface:

It does make me wonder how much the wardialing cost his parents. It sure sounded like his computer was just dialing a bunch of long distance numbers in area code 311 ;-)

The Radio Shack Color Computer also had programs that did this. I have two versions of “Modem Scanner” that used a Hayes-compatible modem hooked up to the Serial I/O port of the CoCo. In BASIC, the program would send dial commands to the modem using PRINT #-2 (as if they were going to a serial printer), and then it would use PEEK to look for the carrier detect pin to go high on the port. If a CD was not detected after some time, it would send the hangup command and move on to the next number.

It looked like this:

Above, you can see it would list the status of every number dialed, similarly to the WarGames program.

Using the “print to file” feature of the XRoar emulator, here is what was being sent to the modem:

+++ATZ
ATT C0 E0 M1 Q1
ATDT 555-0000
ATH
ATDT 555-0001
ATH
ATDT 555-0002
ATH
ATDT 555-0003
ATH
ATDT 555-0004
ATH
ATDT 555-0005
ATH
ATDT 555-0006
ATH
ATDT 555-0007
ATH
ATDT 555-0008
ATH
ATDT 555-0009
ATH
ATDT 555-0010
ATH
ATDT 555-0011

At the top, the “+++ATZ ATT C0 E0 M1 Q1” sequence was the initializing modem part. Looking at the list of Hayes modem commands on wikipedia, I can see that…

  • “+++” followed by a pause was the escape code that made a Hayes smart modem go from communications mode to command mode. In command mode you could change settings, dial numbers or hang up.
  • “ATH” was the hang up command. (Hayes commands start with “AT” for attention.)
  • “ATT C0 E0 M1 Q1” – This was “T” for tone dialing, “C” was not listed as a standard command (not sure what it did), “E” turned off auto-echo so commands did not echo back when typing them, “M” turned ON the modem speaker (geesh, that should have been a settable option), and “Q” turned on quit mode so the modem did not echo back “OK” after each command.

Looking at the BASIC source code shows this notice at the top:

And these version notes at the bottom:

The full source code is here:

0 ' +------------------------+
1 ' !   MODEM SCANNER V1.1   !
2 ' ! BY ZIGLWALD X. MALUSHI !
3 ' !    HAYES COMPATABLE    !
4 ' !     MODEM REQUIRED     !
5 ' +------------------------+
6 ' MODEM MUST BE ON AND READY
7 ' WHEN PROGRAM IS RAN
8 '
9 '
10 PCLEAR1:CLEAR10000:DIM MD$(1000)
15 CLS:PRINT@7,"MODEM SCANNER V1.1":PRINTSTRING$(32,131)
20 PRINT@64," THIS PROGRAM WILL DIAL A RANGE  OF  NUMBERS  YOU  SPECIFY  AND  REPORT  ANY MODEM CARRIERS  IT  FINDS.":PRINT
25 PRINT" warning:  CALLS PLACED BY THIS  PROGRAM ARE  CONSIDERED  PRANK  CALLS  AND ARE PUNISHABLE BY A  FINE OF UP TO $1000  AND/OR  A  JAIL TERM OF UP TO 180 DAYS."
30 PRINT:PRINT" ****USE AT YOUR OWN RISK!!****":PRINTSTRING$(32,140)TAB(9)"PRESS ANY KEY:";
35 IFINKEY$=""THEN35
40 CLS:PRINT@7,"MODEM SCANNER V1.1":PRINTSTRING$(32,131)
45 PRINT@68,"***INITIALIZING MODEM***"
50 POKE65315,48:POKE65314,249:POKE65315,52:POKE65314,0:POKE150,180:MD=0
55 FORA=1TO2000:NEXTA:PRINT#-2,"+++";:FORA=1TO2000:NEXTA:PRINT#-2,"ATZ":FORA=1TO1000:NEXTA:PRINT#-2,"ATT C0 E0 M1 Q1"
59 PRINT@128,"SCAN 800'S?  (Y/N) :";:LINEINPUTA$:IFA$="Y"THENAC$="1-800-"ELSEAC$=""
60 PRINT@160,"ENTER PREFIX (###) :";:LINEINPUTPF$:IFLEN(PF$)<>3THEN60
65 PRINT@192,"START RANGE (####) :";:LINEINPUTST$:IFLEN(ST$)<>4THEN65
70 PRINT@226,"END RANGE (####) :";:LINEINPUTEN$:IFLEN(EN$)<>4ORVAL(EN$)<VAL(ST$)THEN70
75 PRINT@288,"SCAN FROM "AC$PF$"-"ST$:PRINT@327,"TO "AC$PF$"-"EN$:PRINT@392,"IS THIS CORRECT? ";:LINEINPUTA$:IFLEFT$(A$,1)<>"Y"THEN59
80 CLS:FORNM=VAL(ST$)TOVAL(EN$):'FORA=1TO10000:NEXTA
82 PRINT@511:PRINT@0,TAB(7)"MODEM SCANNER V1.1":PRINTSTRING$(32,131):PRINT@69,;:IFAC$=""THENPRINT"LOCAL";ELSEPRINT"1-800";
83 PRINT" SCAN IN PROGRESS":PRINT@96,"SCANNED:"NM-VAL(ST$),"CARRIERS:"MD:PRINTSTRING$(32,131):PRINT@448,;
85 NM$=AC$+PF$+"-0000":NN$=RIGHT$(STR$(NM),LEN(STR$(NM))-1):MID$(NM$,1+LEN(NM$)-LEN(NN$),LEN(NN$))=NN$
90 PRINTNM$" - ";:PRINT#-2,"ATDT "NM$
95 CD=PEEK(&HFF20):FORTM=1TO1000:CD=PEEK(&HFF21):IF(CD AND 128)=128 THEN105 ELSENEXTTM
100 PRINT"NOTHING":PRINT#-2,"ATH":FORA=1TO3000:NEXTA:NEXTNM:GOTO120
105 PRINT"*CARRIER*":MD$(MD)=NM$:MD=MD+1
110 FORA=1TO2000:NEXTA:PRINT#-2,"+++";:FORA=1TO2000:NEXTA:PRINT#-2,"ATH":FORA=1TO2000:NEXTA
115 NEXTNM
120 CLS:PRINT@4,"TOTAL CARRIERS FOUND:"MD:PRINTSTRING$(32,131)
125 FORA=0TOMD:PRINTMD$(A),:IF(A/18)=INT(A/18)THEN135
130 NEXTA:PRINT@424,"END OF NUMBERS":END
135 PRINT@425,"PRESS ANY KEY:";
140 IFINKEY$=""THEN140ELSEFORZ=1TO12:PRINT@32+Z*32:NEXTZ:PRINT@96,;:GOTO130
150 '
151 'PROGRAM UPDATES
152 '
155 'OCTOBER 1987 (V1.0)
156 'FEBRUARY 1988 (FOR 800'S)
160 '

I believe the POKEs in line 50 are what made BASIC not wait for the printer to be ready (since that would never happen when using a modem) and setting the printer baud rate to 300 baud.

Line 95 is related to the carrier detect, though I don’t know what it’s doing specifically.

At 120 it appears to display all of the modem numbers found, with a pause at the end of the screen. I see no provision for writing this list out to tape or disk, so I guess the user would have just had to write them down. And, most likely, when scanning 10,000 numbers (0000-9999), how many of them would have actually been modems anyway?

I had a friend who did modem scanning back in the late 1980s, though I don’t know if he used this program. I do know that his parent’s got a phone call from the phone company, reporting that something was wrong on their other phone number and it was making too many calls. His dad went up to the room where the computer was and knew enough about it to hit the read BREAK key and stop the program.

I do not know if I ever used this program, but I do have a story to tell about getting in trouble for dialing in to a number that was found through modem scanning. But that’s a story for another time…

Until then…

For further research…

A disk image containing these programs may be found on the Color Computer archive site:

https://colorcomputerarchive.com/search?q=phreak