Constellations

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 quizzes the user on 28 constellations and their brightest named stars. Each constellation (lines 100–2820) is drawn on screen using UDG character “\a” (defined as a small dot pattern via POKE USR), asterisks, and “X” marks to represent stars of varying brightness. The program tracks which constellations have been shown using a DIM L(29) boolean array and uses FLASH to highlight the target star when in star-identification mode. Two quiz modes are offered: constellations only, or constellations combined with named-star identification, controlled by the variable AL.


Program Structure

The program is organised into three broad regions:

  1. Dispatcher loop (lines 10–90): Randomly picks an unvisited constellation index L from 1–28, checks the L() array for already-shown entries, and jumps to 100*L to reach the appropriate constellation block.
  2. Constellation blocks (lines 100–2820): Each block sets C$ (constellation name) and optionally S$ (bright star name), marks L(L)=N1 (i.e. 1) as visited, draws the star field with PRINT AT, then calls GO SUB ASK and GO TO TEST.
  3. Subroutines (lines 5000–8999): ASK (5000), STAR (6000), STAR1 (6020), TEST (7000), SETUP (8000), and an end-of-quiz message (8999).

Initialisation and UDG Definition

The setup subroutine at line 8000 is called via GO SUB 8E3 (a VAL-style memory optimisation using a floating-point literal). It sets BORDER 0: PAPER 0: INK 7 for a black background, reads the constants N1=1 and fl=0 from inline DATA, and dimensions L(29) as the visited-constellation array. UDG “a” is defined by poking 8 bytes 0,0,0,20,8,20,0,0 into USR "a", producing a small three-pixel diamond or asterism glyph used throughout the drawings as a dim-star marker.

Constellation Drawing Technique

Each constellation is drawn entirely with PRINT AT row,col statements, exploiting the comma (new print zone) and apostrophe (newline within a PRINT) to position multiple elements in one statement. Stars are represented by three symbols of increasing brightness:

  • \a — UDG “a” (dim star glyph, chars 144)
  • * — brighter star (literal asterisk)
  • X or x — the brightest / named star

When star-identification mode is active (FL≠0), the brightest star is reprinted with FLASH N1 (i.e. FLASH 1) to highlight it before the player is asked to name it.

Quiz Flow and Mode Control

Two numeric variables govern quiz behaviour:

VariableRole
AL0 = constellations only; 1 = constellations + stars. Toggled each round by LET AL=ABS(AL-N1) at line 7040, so the two modes alternate.
FLFlag set to 1 after the constellation is correctly named; causes the star-identification path to execute on re-entry to the constellation block.

Constellations without a dedicated named star (PISCES, CANCER, PEGASUS, CEPHEUS, CASSIOPEIA, HERCULES, LIBRA, AQUARIUS, CAPRICORNUS, SAGITTARIUS, ANDROMEDA) skip the star subroutine entirely and jump directly to TEST.

Visited-Constellation Tracking

The array L(29) acts as a Boolean visited set. LET L(L)=N1 marks a constellation as shown. The loop at lines 50–70 counts unvisited entries; when all 28 are visited (K=28), the program branches to line 8999 with a completion message. The array is declared with 29 elements but only indices 1–28 are used (index 0 is wasted), consistent with BASIC’s 1-based default.

Subroutine Addressing via Variables

Line 8160 assigns line numbers to variables: LET ASK=5E3: LET STAR=6E3: LET STAR1=6020: LET TEST=7E3. These are then used as GO SUB ASK, GO TO TEST, etc., allowing the targets to be stored symbolically and saving token bytes compared to literal line numbers in every constellation block.

Content

Related Products

Related Articles

Related Content

Image Gallery

Constellations

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