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
| Variable | Meaning |
|---|---|
N1 | Constant 1, read from DATA at line 8010; used to avoid the literal digit 1 (memory optimisation) |
FL / fl | Flag: 0 on first visit, 1 after the constellation has been named once; triggers star-name challenge |
AL | Mode 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, TEST | Numeric 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 allowGO SUB ASKandGO TO TEST— a clean way to alias subroutine entry points without hardcoding line numbers throughout the code. - Multiplication dispatch:
GO TO 100*Lat 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\athroughout PRINT statements to represent dim stars, distinguishing them visually from*(brighter) andX(brightest). PRINT AT PI,...: Lines 1120, 2120, and 2320 useAT PI, which evaluates asAT 3(INT of π = 3). This is unusual but valid; it saves one byte over writing the literal3.- Star-challenge gating: The pattern
IF fl THEN GO SUB STAR/IF fl THEN PRINT ... FLASH N1;"X": GO TO STAR1means the star identification challenge is only shown after the user has already named the constellation (sinceFLis set to 1 inASKon return). - Two-attempt quiz logic: Both
ASKand the star section allow exactly two attempts before revealing the answer, using consecutiveINPUTstatements rather than a loop.
Content
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.

