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:
- Dispatcher loop (lines 10–90): Randomly picks an unvisited constellation index
Lfrom 1–28, checks theL()array for already-shown entries, and jumps to100*Lto reach the appropriate constellation block. - Constellation blocks (lines 100–2820): Each block sets
C$(constellation name) and optionallyS$(bright star name), marksL(L)=N1(i.e. 1) as visited, draws the star field withPRINT AT, then callsGO SUB ASKandGO TO TEST. - 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)Xorx— 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:
| Variable | Role |
|---|---|
AL | 0 = constellations only; 1 = constellations + stars. Toggled each round by LET AL=ABS(AL-N1) at line 7040, so the two modes alternate. |
FL | Flag 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
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.

