Skyplot

This file is part of and Miscellaneous Programs. Download the collection to get this file.
Date: 198x
Type: Program
Platform(s): TS 2068

This program is an interactive astronomy tutorial that displays dot-map representations of 28 constellations using UDG characters and asterisks, then quizzes the user on constellation and bright-star names. It uses a 29-element array L() to track which constellations have already been shown, randomly selecting unseen ones until all 28 have been displayed, at which point it ends with a completion message. A single UDG character (defined at line 8020 with the pattern 0,0,0,20,8,20,0,0 — a small triangle or arrow shape) is used throughout to represent dim stars. The program supports two quiz modes: constellations only, or constellations plus named bright stars (e.g., Polaris, Vega, Sirius), controlled by the variable AL.


Program Structure

The program is organised into three distinct regions. Lines 10–90 form the main dispatch loop, which randomly picks an unseen constellation and jumps to its drawing routine via GO TO 100*L. Lines 100–2820 (in steps of 100) are individual constellation blocks, each drawing a star field and calling the quiz subroutine. Lines 5000–8999 contain shared subroutines: ASK (5000), STAR (6000), STAR1 (6020), TEST (7000), and SETUP (8000).

Execution begins with GO SUB 8E3 at line 10, which initialises variables, defines the UDG, prints the title screen, and reads the user’s mode selection before returning to the loop.

Constellation Dispatch

The 28 constellations are assigned integer identifiers 1–28 (excluding 29, which is reserved for the completion sentinel). The random selector at line 20 picks a value in [N1, 28] and rejects it if L(L) is already set (non-zero), then jumps to 100*L. Each constellation block immediately sets L(L)=N1 (i.e. 1) to mark it as seen.

The exhaustion check at line 80 counts set entries with the loop at lines 50–70; if all 28 are set, control goes to line 8999.

Variable Conventions

VariableMeaning
N1Constant 1, read from DATA at line 8010; used to avoid the literal digit 1 (memory optimisation)
FL / flFlag: 0 on first visit, 1 after the constellation has been named once; triggers star-name challenge
ALMode flag: 0 = constellations only, 1 = constellations + stars
L()29-element array tracking seen constellations
C$Current constellation name
S$Current bright star name
ASK, STAR, STAR1, TESTNumeric variables holding line numbers used as computed GO TO/GO SUB destinations

Notable Techniques

  • Computed destinations via numeric variables: LET ASK=5E3, LET STAR=6E3, etc. at line 8160 allow GO SUB ASK and GO TO TEST — a clean way to alias subroutine entry points without hardcoding line numbers throughout the code.
  • Multiplication dispatch: GO TO 100*L at line 30 directly maps the random integer to its constellation block with no lookup table needed.
  • UDG as dim-star glyph: A single UDG “a” is defined with bytes 0,0,0,20,8,20,0,0 (binary: a small diamond/asterisk shape) and used pervasively as \a throughout PRINT statements to represent dim stars, distinguishing them visually from * (brighter) and X (brightest).
  • PRINT AT PI,...: Lines 1120, 2120, and 2320 use AT PI, which evaluates as AT 3 (INT of π = 3). This is unusual but valid; it saves one byte over writing the literal 3.
  • Star-challenge gating: The pattern IF fl THEN GO SUB STAR / IF fl THEN PRINT ... FLASH N1;"X": GO TO STAR1 means the star identification challenge is only shown after the user has already named the constellation (since FL is set to 1 in ASK on return).
  • Two-attempt quiz logic: Both ASK and the star section allow exactly two attempts before revealing the answer, using consecutive INPUT statements rather than a loop.

Content

Related Products

Related Articles

Related Content

Image Gallery

Skyplot

Source Code

   10 GO SUB 8E3
   20 LET L=INT (RND*28)+N1: IF L(L) THEN GO TO 50
   30 CLS : GO TO 100*L
   50 LET K=0: FOR F=N1 TO 28
   60 IF L(F) THEN LET K=K+1
   70 NEXT F
   80 IF K=28 THEN GO TO 8999
   90 GO TO 20
  100 LET C$="PISCES": LET L(L)=N1
  110 PRINT AT 5,5;"\a"''''"    \a"'''TAB 7;"\a   \a"'TAB 19;"\a      \a   \a"'"\a";TAB 23;"\a"'TAB 28;"\a";TAB 23;"\a  \a"
  120 GO SUB ASK: GO TO TEST
  200 LET C$="ARIES": LET S$="HAMAL": LET L(L)=N1
  210 IF fl THEN GO SUB STAR
  220 PRINT AT 6,23;"\a";TAB 22;"\a"''TAB 26;"\a";TAB 12;"\a"'TAB 13;"\a";TAB 11;"\a"
  230 PRINT AT 15,25;"X";TAB 9;"\a";TAB 28;"*";TAB 5;"\a";TAB 28;"\a"
  240 IF fl THEN PRINT AT 15,25; FLASH N1;"X": GO TO STAR1
  250 GO SUB ASK: GO TO 210
  300 LET C$="TAURUS": LET S$="ALDEBARAN": LET L(L)=N1
  310 IF fl THEN GO SUB STAR
  320 PRINT AT 3,0;"*"'''TAB 24;"\a::"''TAB 6;"\a"'"*"''TAB 13;"\a"'TAB 14;"\a\a"
  330 PRINT AT 12,11;"X";AT 14,25;"\a    \a";AT 16,29;"\a";TAB 23;"\a      \a"
  340 IF fl THEN PRINT AT 12,11; FLASH N1;"X": GO TO STAR1
  350 GO SUB ASK: GO TO 310
  400 LET C$="GEMINI": LET S$="CASTOR": LET L(L)=N1
  410 IF fl THEN GO SUB STAR
  420 PRINT AT 4,19;"\a"
  430 PRINT AT 5,6;"X"''TAB 14;"\a"''"   X"'TAB 7;"\a"'TAB 22;"*"'"    \a"'TAB 12;"\a";TAB 29;"*  *"," \a          \a";AT 16,12;"*"'TAB 26;"X"''TAB 24;"*"
  440 IF fl THEN PRINT AT 5,6; FLASH N1;"X": GO TO STAR1
  450 GO SUB ASK: GO TO 410
  500 LET C$="CANCER": LET L(L)=N1
  510 PRINT AT 2,15;"\a";AT 8,15;"\a"';TAB 19;"\a";AT 12,15;"\a";TAB 26;"\a";AT 16,11;"\a";AT 18,25;"\a"
  520 GO SUB ASK: GO TO TEST
  600 LET C$="URSA MAJOR": LET S$="DUBHE": LET L(L)=N1
  610 IF fl THEN GO SUB STAR
  620 PRINT AT 8,31;"\a"''TAB 25;"*";TAB 8;"*"'TAB 12;"*    *","   *"'TAB 25;"*";TAB 18;"*"''TAB 18;"\a"''TAB 25;"\a"
  630 IF fl THEN PRINT AT 10,25; FLASH N1;"*": GO TO STAR1
  640 GO SUB ASK: GO TO 610
  700 LET C$="LEO": LET S$="REGULUS": LET L(L)=N1
  710 IF fl THEN GO SUB STAR
  720 PRINT AT 4,26;"\a",;TAB 30;"*";TAB 21;"\a";AT 8,6;"*  \a","     *","\a";AT 11,23;"\a","      *"'"*"
  730 PRINT AT 14,22;"X";AT 16,4;"\a"," \a";TAB 28;"\a";TAB 10;"\a"''TAB 6;"\a"
  740 IF fl THEN PRINT AT 14,22; FLASH N1;"X": GO TO STAR1
  750 GO SUB ASK: GO TO 710
  800 LET C$="VIRGO": LET S$="SPICA": LET L(L)=N1
  810 IF fl THEN GO SUB STAR
  820 PRINT AT 5,12;"*";AT 7,25;"\a",TAB 26;"\a   \a";AT 10,14;"*"';TAB 30;"*","      \a"',"*     *";AT 15,6;"\a";AT 19,4;"x"
  830 IF fl THEN PRINT AT 19,4; FLASH 1;"X": GO TO STAR1
  840 GO SUB ASK: GO TO 810
  900 LET C$="URSA MINOR": LET S$="POLARIS": LET L(L)=N1
  910 IF fl THEN GO SUB STAR
  920 PRINT AT 7,22;"X"''TAB 19;"\a"''," \a"'''TAB 14;"\a  *"'TAB 20;"\a"',"  *";TAB 15;"*"
  930 IF fl THEN PRINT AT 7,22; FLASH N1;"X": GO TO STAR1
  940 GO SUB ASK: GO TO 910
 1000 LET C$="PEGASUS": LET L(L)=N1
 1010 PRINT AT 6,22;"\a";TAB 19;"*"'TAB 21;"\a"'TAB 22;"\a"'''TAB 8;"*",TAB 19;"*"'''TAB 23;"*"''TAB 28;"*"
 1020 GO SUB ASK: GO TO TEST
 1100 LET C$="BOOTES": LET S$="ARCTURUS": LET L(L)=N1
 1110 IF FL THEN GO SUB STAR
 1120 PRINT AT PI,21;"\a \a"''TAB 22;"\a"''," *"'TAB 20;"*"''TAB 14;"*"''TAB 21;"\a"''TAB 19;"*"'''TAB 25;"X"
 1130 IF fl THEN PRINT AT 17,25; FLASH N1;"X": GO TO STAR1
 1140 GO SUB ASK: GO TO 1110
 1200 LET C$="AURIGA": LET S$="CAPELLA": LET L(L)=N1
 1210 IF FL THEN GO SUB STAR
 1220 PRINT AT 4,12;"\a"''''',"  X";TAB 10;"*"'TAB 21;"\a"'''TAB 12;"\a\a","    \a\a";TAB 10;"*"''''TAB 22;"*"
 1230 IF fl THEN PRINT AT 9,18; FLASH N1;"X": GO TO STAR1
 1240 GO SUB ASK: GO TO 1210
 1300 LET C$="CEPHEUS": LET L(L)=N1
 1310 PRINT AT 5,18;"*"''''''TAB 24;"*"'',"*"''''TAB 25;"*"'TAB 30;"*";TAB 17;"*"
 1320 GO SUB ASK: GO TO TEST
 1400 LET C$="CASSIOPEIA": LET L(L)=N1
 1410 PRINT AT 6,15;"\a";TAB 14;"\a"'''''TAB 11;"*"'''',"    *         *";TAB 15;"*"'TAB 22;"\a"'TAB 24;"*"
 1420 GO SUB ASK: GO TO TEST
 1500 LET C$="HERCULES": LET L(L)=N1
 1510 PRINT AT 5,18;"*          \a \a";TAB 30;"\a";TAB 28;"\a"''TAB 26;"*";TAB 13;"*      *"'''TAB 26;"*";TAB 11;"\a","      *";TAB 9;"\a \a"'TAB 13;"*"'TAB 19;"*"''"    \a";TAB 30;"*"
 1520 GO SUB ASK: GO TO TEST
 1600 LET C$="PERSEUS": LET S$="ALGOL": LET L(L)=N1
 1610 IF FL THEN GO SUB STAR
 1620 PRINT AT 5,23;"\a"'',"     *  \a"'''"      \a","  X  \a   \a"'"      \a"'TAB 8;"\a    *"'TAB 22;"\a"'''TAB 14;"\a"'TAB 23;"*";TAB 11;"*"'TAB 24;"\a"
 1630 IF FL THEN PRINT AT 17,23; FLASH N1;"*": GO SUB STAR1
 1640 GO SUB ASK: GO TO 1610
 1700 LET C$="CYGNUS": LET S$="DENEB": LET L(L)=N1
 1710 IF FL THEN GO SUB STAR
 1720 PRINT AT 2,30;"\a";TAB 28;"\a"'''TAB 20;"\a";TAB 20;"\a"'"      \a        X";TAB 26;"*";TAB 10;"\a"'TAB 11;"\a"',"   *";TAB 7;"\a"''TAB 24;"\a";TAB 14;"\a     \a"''''TAB 30;"*"
 1730 IF FL THEN PRINT AT 8,15; FLASH N1;"X": GO SUB STAR1
 1740 GO SUB ASK: GO TO 1710
 1800 LET C$="ANDROMEDA": LET L(L)=N1
 1810 PRINT AT 5,14;"\a"'TAB 15;"\a"''''TAB 9;"*"'TAB 14;"\a         \a";TAB 23;"\a"''TAB 20;"*      \a";TAB 26;"\a"'TAB 31;"*";TAB 26;"\a"
 1820 GO SUB ASK: GO TO TEST
 1900 LET C$="LYRA": LET S$="VEGA": LET L(L)=N1
 1910 IF FL THEN GO SUB STAR
 1920 PRINT AT 5,15;"\a"''''TAB 19;"\a";TAB 8;"\a";TAB 21;"X";TAB 7;"\a","  \a";TAB 15;"\a           \a"''''," *";TAB 14;"*"
 1930 IF FL THEN PRINT AT 10,21; FLASH N1;"X": GO SUB STAR1
 1940 GO SUB ASK: GO TO 1910
 2000 LET C$="CANIS MINOR": LET S$="PROCYON": LET L(L)=N1
 2010 IF FL THEN GO SUB STAR
 2020 PRINT AT 8,21;"\a"'TAB 22;"*"''',;"X"'''"      \a"
 2030 IF fl THEN PRINT AT 12,16; FLASH N1;"X": GO TO STAR1
 2040 GO SUB ASK: GO TO 2010
 2100 LET C$="AQUILA": LET S$="ALTAIR": LET L(L)=N1
 2110 IF FL THEN GO SUB STAR
 2120 PRINT AT PI,27;"\a";TAB 25;"*"'',"*";TAB 15;"X"'TAB 20;"\a";TAB 14;"*"''''TAB 14;"\a       *";TAB 9;"*"''''TAB 27;"*"'TAB 29;"*"
 2130 IF FL THEN PRINT AT 7,15; FLASH N1;"X": GO SUB STAR1
 2140 GO SUB ASK: GO TO 2110
 2200 LET C$="CANIS MAJOR": LET S$="SIRIUS": LET L(L)=N1
 2210 IF FL THEN GO SUB STAR
 2220 PRINT AT 5,17;"\a"'TAB 21;"X"''TAB 23;"\a   *"'',"*"'TAB 12;"\a     \a";TAB 14;"*";TAB 9;"*"'TAB 15;"*"''TAB 15;"\a";TAB 24;"*"'',"    \a"
 2230 IF fl THEN PRINT AT 6,21; FLASH N1;"X": GO TO STAR1
 2240 GO SUB ASK: GO TO 2210
 2300 LET C$="ORION": LET S$="RIGEL": LET L(L)=N1
 2310 IF FL THEN GO SUB STAR
 2320 PRINT AT PI,7;"\a       \a:";TAB 29;"\a"'TAB 30;"\a";TAB 9;"X";TAB 30;"\a"',"  \a *";TAB 30;"\a"''TAB 15;"\a"'TAB 29;"\a \a"''',"  *"',"*";TAB 14;"*     \a"''TAB 15;"\a";TAB 15;":"'TAB 23;"X"'TAB 11;"*"
 2330 IF fl THEN PRINT AT 18,23; FLASH N1;"X": GO TO STAR1
 2340 GO SUB ASK: GO TO 2310
 2400 LET C$="LIBRA": LET L(L)=N1
 2410 PRINT AT 4,22;"\a";AT 9,18;"*"''TAB 7;"\a"'TAB 13;"\a";TAB 8;"\a"'TAB 23;"*";AT 19,18;"\a"
 2420 GO SUB ASK: GO TO TEST
 2500 LET C$="AQUARIUS": LET L(L)=N1
 2510 PRINT AT 7,4;"*  *    *";TAB 8;"*"''TAB 21;"*       \a"''"  \a"'TAB 30;"\a";TAB 25;"\a"''"   \a"''" *"
 2520 GO SUB ASK: GO TO TEST
 2600 LET C$="SCORPIO": LET S$="ANTARES": LET L(L)=N1
 2610 IF fl THEN GO SUB STAR
 2620 PRINT AT 2,26;"\a*"'TAB 29;"\a"'TAB 30;"*"'''TAB 23;"*      *"
 2630 PRINT AT 8,21;"X";TAB 20;"*";TAB 30;"*"''''"    *  **"," *   \a";TAB 20;"\a";TAB 6;"*";TAB 5;"*"," *"'''TAB 8;"*";TAB 14;"*"
 2640 IF fl THEN PRINT AT 8,21; FLASH N1;"X": GO TO STAR1
 2650 GO SUB ASK: GO TO 2610
 2700 LET C$="CAPRICORNUS": LET L(L)=N1
 2710 PRINT AT 4,30;"*"''TAB 29;"*"''"    *  \a    \a   \a"''''TAB 7;"\a"'TAB 12;":"'," \a      \a";TAB 15;"*"'''',"*"
 2720 GO SUB ASK: GO TO TEST
 2800 LET c$="STAGITTARIUS": LET L(L)=N1
 2810 PRINT AT 4,9;"\a";TAB 9;"\a"''TAB 12;"*  \a";TAB 14;"\a"''TAB 15;"*";TAB 25;"*"'," *";TAB 27;"\a";TAB 12;"*";TAB 29;"\a";TAB 13;"*";TAB 26;"*"'TAB 29;"*"'''TAB 24;"*"''TAB 25;"*"
 2820 GO SUB ASK: GO TO TEST
 5000 REM ASK
 5010 INPUT "NAME THIS CONSTELLATION",;A$
 5020 IF A$=C$ THEN GO TO 5080
 5030 INPUT "SORRY, TRY AGAIN ";A$
 5040 IF A$=C$ THEN GO TO 5080
 5050 PRINT AT 20,N1;"STILL WRONG BUT NICE TRY": PAUSE 180
 5060 PRINT AT N1,N1;"  IT IS ";C$,;AT 20,N1;,,
 5070 GO TO 5090
 5080 PRINT AT N1,N1; FLASH N1;C$;" IS CORRECT"; FLASH 0,: PAUSE 180
 5090 INPUT "PRESS ENTER TO CONTINUE ";A$
 5100 LET FL=N1: RETURN 
 6000 REM STAR
 6010 PRINT AT N1,N1;"NAME THIS STAR IN ";C$,: RETURN 
 6020 REM STAR1
 6030 LET FL=0: INPUT A$
 6040 IF A$=S$ THEN GO TO 6090
 6050 INPUT "SORRY, TRY AGAIN ";A$
 6060 IF A$=S$ THEN GO TO 6090
 6070 PRINT AT N1,N1;"SORRY, THE STAR IS ";S$,
 6080 GO TO TEST
 6090 PRINT AT N1,N1;S$;" IS CORRECT.",;
 6100 INPUT "ANOTHER TEST (Y/N) ";B$
 7000 REM TEST
 7010 INPUT "ANOTHER TEST (Y/N) ";B$
 7020 IF B$="N" THEN CLS : PRINT AT 10,12; FLASH N1;"GOODBY": STOP 
 7030 IF AL=0 AND FL=N1 THEN LET FL=0
 7040 LET AL=ABS (AL-N1)
 7050 CLS : GO TO 20
 8000 REM SETUP
 8010 BORDER 0: PAPER 0: INK 7: CLS : READ n1,fl: DATA 1,0: DIM L(29)
 8020 FOR a=0 TO 7: READ al: POKE USR "a"+a,al: NEXT a: DATA 0,0,0,20,8,20,0,0: PRINT ''TAB 6;"An Astronomy Program"
 8030 PRINT 'TAB 12;"Tutorial"
 8040 PRINT ''TAB 9;"CONSTELLATIONS"
 8050 PLOT 68,122: DRAW 120,0: DRAW 0,-13: DRAW -120,0: DRAW 0,13
 8060 PRINT ''"© Eric Burgess F.R.A.S.","© Mods By ""PEH SOFTWARE"""
 8070 PRINT ''"All rights reserved by","S AND T  Software Services"
 8075 PRINT '"These are your stars:  \a dim,   * brighter,  x the brightest."
 8080 INPUT "Do you wish to see the programs instructions? ";a$: IF A$="" THEN GO TO 8080
 8085 IF a$>="a" THEN PRINT FLASH n1;"Please put computer in CAPSLOCK.": GO TO 8090
 8090 IF a$(N1)="Y" THEN GO TO 8120
 8100 IF a$(N1)="N" THEN GO TO 8140
 8110 GO TO 8080
 8120 CLS : PRINT '"This program displays a","constellation selected at randomand asks for it's name."''"You have 2 tries before the     correct name is revealed to you."
 8130 PRINT '"Next the program asks for the   name of a bright Star in the    displayed constellation."''"Again you have 2 tries to name  the Star before it's identified."''"Please pick either :","Constellations then the Stars   or both mixed up."
 8140 INPUT "SELECT:   Constellations (1) OR Stars AND Constellations (2) ";AL
 8150 LET AL=AL-1: IF al>1 THEN GO TO 8140
 8160 LET ASK=5E3: LET STAR=6E3: LET STAR1=6020: LET TEST=7E3
 8170 RETURN 
 8999 CLS : PRINT AT 10,0;"You have seen all the star      fields in this quiz at least    once. To repete this program    please INPUT RUN ": STOP 
 9000 SAVE "star quiz" LINE PI: BEEP 1,10

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.

Scroll to Top