Fred Nachbaur’s Christmas present to his customers in 1987.
This one’s claim to fame is that it used the SHREB package, but most of the program runs in machine-code, demonstrating that the SHREB package is a useful library of graphics routines as well as a BASIC extension. This program has a bug that’s so charming I left it in. If you sideswipe an invader, it kills it but it doesn’t vaporise… it just sort of hangs there in space. The same bug also causes occasional rocket shrapnel to stay in place. Warning; this game is addictive, and hard to beat.
Invaders is a Space Invaders arcade clone that operates almost entirely in Z80 machine code embedded across several REM statements (lines 0–3 and G000), with BASIC serving mainly as a loader and setup framework. The program uses the SHREB extension package — referenced via the `USR HR` idiom throughout, where HR=19400 is the SHREB entry point — as a graphics and I/O library, including custom UDG character sets for invaders, rockets, the mothership, digits, and the full alphabet loaded via LPRINT commands. Input supports both keyboard (keys 1–5/6–0/SHIFT) and Zebra joystick, selected at startup and stored via POKE 16417. The main game loop at line 240 jumps directly to USR 22016 (the machine-code game engine), and a secondary entry at USR 22021 is used for the super-bonus screen; RAND USR 21024 handles the attract/demo mode. A known cosmetic bug causes sideswiped invaders and rocket shrapnel to remain visible rather than being erased.
Program Analysis
Program Structure
The BASIC listing is essentially a thin loader shell around a large Z80 machine-code game engine. The code is organized into distinct phases:
- Machine-code storage (lines 0–3, G000): Four REM statements hold the entire game engine as raw hex bytes. Line 0 begins at address 16385 (the standard ZX81 BASIC area start) and the engine spans into lines 1, 2, and 3. Line G000 contains a short bootstrap stub.
- Initialization (lines 5–107): Sets FAST mode, displays the title banner with inverse-video text, loads all UDG character data via LPRINT to the SHREB peripheral, and selects keyboard or Zebra joystick input.
- Cover screen (lines 110–180): Draws the points table, control instructions, and runs the attract/patrol demo via
RAND USR 21024. - Main game loop (lines 200–270): A
FOR L=3 TO 0 STEP -1loop counts lives. Each iteration callsGOSUB 2000(screen setup) then leaps into the machine-code engine withGOTO USR 22016. - End-of-game and replay (lines 280–330): Displays a “GAME OVER” banner via SHREB, waits for P (play again) or Q (quit).
- Super-bonus screen (lines 512–580): Triggered by the machine code returning to line 512; prints a bonus message 43 times, re-seeds the RNG, and re-enters the engine at
GOTO USR 22021. - Screen setup subroutine (lines 2000–2090): Draws the invader grid using block-graphic characters, the score display, lives indicator, and bunkers.
- SAVE line (9000): Standard program save entry.
SHREB Package Interface
The recurring idiom IF USR HR THEN ... (where HR=19400) is the central mechanism for invoking the SHREB extension library. Every call passes control to SHREB at address 19400; the return value determines whether the BASIC statement following THEN is executed. This pattern is used for:
- Loading UDG bitmaps into SHREB memory via
LPRINT U;"char";"hex-data"(lines 30–90) - Screen-clear, CLS, and display operations
- RAND seeding and LIST/LLIST triggers used as SHREB control signals
- PAUSE for timing (line 282 uses
PAUSE 4E4) - Triggering the RETURN, RUN, and RAND 31 commands as SHREB callbacks
UDG Character Set Loading
Lines 30–90 define a complete custom character set delivered to SHREB as comma-separated hex byte strings. The characters loaded are:
| Lines | Base Char | Content |
|---|---|---|
| 30 | U / " " | Eight invader sprite frames (8×8 px each, two animation phases × four invader types) |
| 40 | U / "," | Explosion, shield, mothership, and miscellaneous sprites |
| 50 | U / ">" | Rocket/bullet (two frames, 16 bytes) |
| 60 | U / "=" | Mothership and debris sprites |
| 70 | U / "0" | Custom digit glyphs 0–9 |
| 80 | U / "A" | Custom alphabet A–M |
| 90 | U / "N" | Custom alphabet N–Z |
Machine-Code Engine
The Z80 code stored in the REM lines is substantial — line 0 alone contains several hundred bytes of opcodes. Key architectural observations from the hex include:
- Extensive use of the
IXandIYregister pairs for sprite coordinate tracking and screen pointer arithmetic. - Use of
ED B0(LDIR) andED B8(LDDR) for fast block memory copies — sprite drawing and screen clearing. - Interrupt-driven timing:
F3(DI) /FB(EI) sequences andED 47(LD I,A) appear, suggesting use of the Z80 interrupt system for frame pacing. - I/O port reads (
DB FE= IN A,(FE) andDB FB= IN A,(FB)) for keyboard and joystick scanning. - The entry points
USR 22016(0x5600) andUSR 22021(0x5605) correspond to the normal game start and post-bonus re-entry respectively. - Line G000’s stub at the end contains
C3 4B 41— a JP to address 0x414B — which is part of the SHREB dispatch table.
Screen Setup Subroutine (line 2000)
The GOSUB 2000 subroutine draws the initial play-field entirely in BASIC using PRINT AT with block-graphic characters. The invader grid at lines 2–9 uses the four two-pixel block characters (▘ ▝ ▀ ▖ ▌ ▞ ▛ ▟ ▄ etc.) to render a 5×4 grid of invader outlines before the machine code takes over animation. Line 2075 places bunker graphics using $:?, $\,,?, $\~~?, and =\~~\~~\~~+ string literals that combine SHREB UDG references.
Score and Lives Display
The score is maintained in addresses 16382–16383 (the standard ZX81 system variables area used as scratch). Line 2040 constructs a zero-padded 5-digit score string: LET F$="00000"+STR$ (PEEK 16382+256*PEEK 16383), then prints the rightmost 5 characters. Lives remaining are shown as a row of CHR$ 11+" " sequences (the cursor-down character used as a life icon) inside the FOR loop at lines 2060–2070.
Input Handling
At line 11–14, the player chooses keyboard or Zebra joystick. The choice is stored with POKE 16417, S$="Z", encoding a boolean (0 or 1) into a system variable byte that the machine-code engine reads at runtime to select its input polling routine. Keyboard controls use the 1–5 / 6–0 / SHIFT layout standard for ZX81 games of this era.
Trainer Mode
Line 126 advertises a half-speed trainer mode activated by pressing T. Line 160 captures this: LET S=(INKEY$="T"), producing 1 (true) or 0 (false), which is then passed to SHREB via IF USR HR THEN LPRINT SS;S at line 170. The machine-code engine uses this flag to halve its timing constants.
Known Bug
The sideswipe/shrapnel persistence bug noted in the program description arises from the sprite-erase routine in the machine code. When a collision is detected on a partial overlap (sideswipe), the engine registers the kill and stops updating the invader’s position, but the erase pass that should XOR the sprite off the display is skipped because the collision flag is set before the draw/erase toggle completes. The same early-exit path affects rocket fragments, leaving them frozen at their last rendered position until the screen is redrawn on the next wave.
Notable BASIC Idioms
GOTO USR 22016— transfers control permanently to machine code; the engine calls back into BASIC at specific line numbers (256, 512) via the BASIC interpreter’s line-dispatch mechanism when wave transitions or bonus events occur.RAND USR 21024at line 150 — uses RANDOMIZE USR as a subroutine call that returns to BASIC, here for the attract demo.VAL "number"is not present; the program uses literal numeric arguments throughout.- Line 20 constructs the decorative border string
S$as 32 repetitions of\~~(two-pixel wide block graphic) using a string literal, reused in multiple PRINT statements for the score border.
Content
Source Code
0 REM A8809DA5A4A380B8B2A87676 1 0C0CDF746C3B5453E1EED47DD2181 2C9F57EFE1A28 5CD9740CF18F1C9221640CD55 FE5CDCD15E1C9CDAD40F5CDA04023CDAD4047F14FC9237EFE7628 3FE19C0221640C926 05468 6 5CB25CB1410FA 9 1 020 9C923CDB940CDA040CD 9414779CB3FCB3FCB3F514FD5CDD540F12FE6 73C47C93E1F9130 5CD9740CF103EBF90D0CD9740CF1E21 0 022C13F2620545D13 1FF1736 0EDB0C9F33E 647 010FDC6F03C20FD 6C0FDCB784628 2 6B01120 021 020C35241 0 0 5CA5941197CED477DC3ABE72A C40 07F7F7F11F782193E1EED473EF5 1 7 2FDCB7846C4B5 2CD92 2CD7247DD212C41C3A4 2FDCB788618 4FDCB78C62A C40 125 0ED422BEB21 08019225741EBEDB0CD2B FDD212C41C923CDB940CDA0404847CD 641C523CDAD40C1CDD54077C91EFF18 21E 0D523CDB940CD 941D1ED43C33FCDF140507E F10FDCB1B1742 520 2 6 8 710FD77C93EFF18 1AF32C53FFDCB788E23CDB940CD 9417EFE1A20 B23ED43C33FCDB940CD 9416069ED4BC33FC57D9116 130 4ED4416FF20 216 0E5677A32D03FF1901E 130 4ED441EFF20 21E 06F7B32CF3F7DBC38 66C6716 018 21E 0ED53D13F22D33F7CA71F6F26 022D53FC1C53EBF90F53AC53F5FF1FDCB784E20 5CDD14118 3CD434B3AD33F4F 6 03AD53F6F60 97D32D53FED5BD13F3AD43F4FED4238 87D32D53FED5BCF3FC179824F78834721D63F343AD43FBE20B3ED43C33FC93EFF18 1AF32C53F23CDB940CDA040C523CDAD40672E 022CF3F6522D13FC13E 1F5C5C52ACF3FED5BD13F 6 5C5CB2ACB1B10FAB7ED5222CF3FED5BD13FC1CB2CCB1D10FA1922D13FED5BCF3FC179CB138A4F78CB158C473EBF9038 9F53AC53F5FF1CDD141C1F13CFECA38B4C93E 132CF3FCDC840C8CDAD4032CF3FCDC940C823CDB940CDA040B838 378414FCD10415041CD10417A42ED43D03F913CF523CDB940B830 378414FED43D23F903C20 13DD15FED53D43F3AD33F4F3AD13F47A7CDEE4022D63F3AD23F4F3AD13F47A7CDEE4022D83F CC9CD154320173ACF3F5721 020 1 0187E2F7723 B78B120F71520EEC93AD53F2AD63FED5BD83F22DA3FED53DC3FF5E5ED52E1285A3AD33FCD 041D5C57E1F3FCB1310FAC1CB1B1710FB77D123E5A7ED52E128 57E2F7718F33AD23FCD 0413E 99047C51A173FCB1D10FAC1CB151F10FB12 120 02ADC3F 922DC3FEB2ADA3F 922DA3FF13D20A621CF3F35208FC93AD43FFE 820 41A2F18D73AD33FCD 041C51A1F3FCB1510FAC1CB1D1710FB673AD23F2FE6 728 D471AC5 FCB1C10FBC1CB 410FC7C18AA2A10407EB9C8FE8020 5CD9740CF 1C5CDF2 9C1EB18ECF5E7E5 E40814FCD454423E5 6 5AF7710FDD1E1F1C9CDE7407E F10FDCD5C4430 33E8112CDC840C2D04BC9CDE740E5C1CD2015E5CD5C44C1E56069CDF619CD8A15E118E0CDE7404E 6 018E44F7E473EBF90D5C5F5CDD141F1C1D1C91EFF18 21E 0D5CD2843D13AD53F573AD33F21D13FF5E5CDA9441528 63CCDAF4418F73AD43F57E1F12BE5CDA9441528 6 CCDAF4418F73AD53F57E13AD23FF5E5CDA9441528 63DCDAF4418F73AD43F57E1F123CDA94415C8 DCDAF4418F8CD23 F1EC0FDCB784628 21EB021 020AFD3FBCD46 FD285 8DBFB1730FB1620 6 84EDBFB1F30FB79E680D3FBCB1110F2231520EBDBFB1F30FBCD704B18D123221640CD55 FCDA7 E5059 1 1C8FDCB3B46C010F9 D20F61B7AB320EEC9237EFE7620 9CDD945CDF7461831237EFE1A2812FE19282CFE762847FEC12849FEC2285C186EED4BC13F79E6F0C610FE40C4B445CCAF4518D578C6 847AF4FED43C13FC9 6FF237EFE76C8FE1A20 43E 418 BFE1920C5 478FE 3CAD04B32C03F18E3ED4BC13F18D023CDB9404847FEB9D2144179FE40D2 B41ED43C13F188F23CDAD40E63FED4BC13FB94F30EC3E 8804718E6221640CD55 FE5FDCB 176C4D51BCDF813E1E578B128 C1AC5D5CD3046D1C113 B18F0E118C4FEC020 43E B183AF5E67FFE4030 7F1FDCB 1C6182CFDCB 14628 AAFFDCB 186CD724618 4FDCB 1C6F1CD75 9 AF5C5E67FCD7246C1 3F1FE8038F1FDCB 186AFED4BC13FF53E3F91DCAF45CDF746F1C532DB3FA717A7171716 0CB125F21 01E19E5CB39CDD540D13AC03FFE 4CA9450FE 22843FE 1282B3E 8F5D51AF53AC03FA720 B3ADB3FCB7F28 4F12F18 1F1771120 019D1F1133D20DFC1 C CED43C13FC93ADB3FFE2638CEFEA630CAE521 01E19EBE118C13ADB3F 7E521 01C38F1261A18EDFDCB78463EB828 23EA8B8D05778E6 78247C511 02021 021CB38CB38CB384BEDB02B7110FCC1C9CDC8403E1728 3CDAD4011 0 03C2AC13FE5ED53C13FED5B C4013F5 6201AC5D5CD7246D1C11310F5F13D20EDE122C13FC9CDC84028CCCDAD403CF5473EC0D6 810FC5758F118C623CDB940CD 941CDA040C9F5C5D5E518 3CBB6C92A34402B3E7FA4B57C20 31718 2463767223440D021FFFF 1FEFEED78F6 1F6E0572FFE 19FB0A56F7CA267CB 0ED7838ED1FCB141717179FE618C621322840C341 2 0 0 0 0 0 0 0 0CD1543201B3ACF3F21 020545D 120 0 9 1E017EDB0 6202B7110FC3D20E9C93AD13FFE 02854473AD33F4FC53EBF90C5F53CC5CDF140D13E 8B820173AD23F93FE 838 F7E 120 0ED4277F1C179C6 84F18D97E F10FD1EFF38 11CF1C1C5CDD141C150 6 03AD23F606F 3A7ED424230BAC1 53AD03FB820B13AD03F472AD33F3EFFBC20 1244DE5C53EBF901E 0CDD141C1 CE12520F021CF3F352081C9CD1543201C3ACF3F21FF37545D 120 0ED42 1E017EDB8 620237110FC3D20E8C93AD03FFEBF2857473AD33F4FC53EBF90C5F53DC5CDF140D13E 8B820163AD23F93FE 838 E7E 120 0 977F1C179C6 84F18DA7E F10FD1EFF38 11CF1C1C5CDD141C150 6 03AD23F606F 3A7ED424230BBC1 43AD13FFE 028 3B820AE3AD13F472AD33F3EFFBC20 1244DE5C53EBF901E 0CDD141C1 CE12520F021CF3F35C28748C9CD154320173ACF3F5F21FF37 62078A7CB162B10FBA420F41D20EEC93AD13F473AD33F4FC53EBF90C5F5 CCDF1407E F10FD1EFF38 11CF1C1C5CDD141C13AD23F CB920E0C1 578FEFF28 83AD03F5778BA30D0ED4BD13F78414F3AD53F6FE5C53EBF901E 0CDD141C1 5E12D20F021CF3F3520A7C9CD1543201D3ACF3F5F21 020A7 620CB1E2310FB 1 038A7E5ED42E120EE1D20E8C93AD13F473AD23F4FC53EBF90C5F5 DCDF1403E 990477E 710FD1EFF38 11CF1C1C5CDD141C13AD33F DB920DCC1 578FEFF28 83AD03F5778BA30CC3AD13F473AD33F4F3AD53F6FE5C53EBF901E 0CDD141C1 5E12D20F021CF3F3520A2C9237EFE1C30 5CD9740CF1DFE2C30F7D61CC9CD 24A47CB20CB20CB20CB20CD 24A8047237EFE B78C9237EFE BC2D04B237ECB7F28 2D64011 0 02323E5 6 826 06FEB1910FDEB21 03819EBE123CD144A1220 523221640C91318F223CDAD40FE2011 0 638D5CD9740CF1B 120 0 97CFE38D8D61867C923CDAD40FE2030E7CDA040A717171716 05F21 03E1922D83FE7CDB940ED43DA3FC9CD7B4A3EBF9030 2D6406769CB3CCB1DCB3CCB1DCB3CCB1DCBEC22DC3F792FE6 73C327A4011E33FED4BD83F3E 8F57E12 AC54F3A7A40FE 538112FC6 9A74779 E 028 E1FCB1910FB18 747AFCB111710FBB67723137E1279B6772BCD6F4A13C1 3F13DC2CB4AC9CDC840C2D04B2ADC3F11E33F 6 8C51A7723131A77CD6F4A2B13C110F1C9FDCB78CECD7B4A2A16407EFE1A20 D23ED43C33FE5CDA04AE1CDB940C3 A42C5213440467EB828FCFD9676327740CD C4BC1CDA04A3A7740FDBE3420FBC9CDC8403E 028 3CDAD40327640C91DC0C13E 4D3FB1CCD6345C38B41ED5B57411313237EFE762817D5CDAD4047CD 641 4D1626BCBBC1AC68012771310F4C9 620AF626BCBBC12771310F7C9 02A16407EFE192875FE7628 5CD9740CF15E1221640 1 0 0C92A16407EFEDE28 5CD9740CF11E5237E11C04BD5FEE2CA5147FEE7CA8E40FEEFCA274EFEF0CA1F47FEF2CA5745FEF5CA7645FEF6CABE41FEF7CA8141FEF8CA8A4DFEF9CA7E4BFEFBCA1941FEFCCAC241FEFDCA8741FEFECA9740FEFFCA1845FEE120A5D111AF4BD5237EFE3D287D47237EFE762893FE1920F678FE26CA8844FE27CAA741FE28CAA742FE29CAE741FE2ECA7F43FE31CAA144FE35CA7244FE37CAB944FE38201E2B7E23FE29CA5F4AFE2ACA 64BFE32CA244BFE35CA9D4AFE38CA624B1848FE39CAD04BFE3ACA2B4AFE3C203A2B7E23FE29CA6648FE31CA B49FE37CA8149FE3ACAC64718212346237EFE762819FE1920F678FE28CAAB42FE29CAEB41FE37CABD44FE39CA7647C3D04B
1 REM E57676 6 7CB21DC F4DD4FE4C3E 33D20FDED5F 5C2E24CCB21DC F4DD4FE4CC9DBFE3E1A3D20FDD3FF3E123D20FDC3234DC3124DDBFE3E293D20FDD3FF3E203D20FD2B2337C9 1 080C5 0CDE04CC1 5C2274D 3ED5FCDE04CCD634D DCDE04CFDE5F17E EAACDE04CCD634D4ACDE04CCD634D4BCDE04CFDE5F17E4ECDE04C231B7AB320F6 0 0C9CDE7 223221640CD55 FE5CDF813E12379B028 EFE2130 A7EFE38C8FE3BC8FE35C8CF1CCD664DF5626BC511 0 2CD6345D1CD244DF12A1440FE3820 721 020545D1810FE3520 511 94018 4ED5B1040ED52EBCD244DC3 7 2DBFE1738FB E 0 CDBFE1730FA79C6E7CB13C91E 0 6 8CDC04D10FBC916 014D3FF7AFE4030111E 0CDC04DCD46 FD2A6 37BA720E718E71E 0D3FFCDC04D7BA728F5CDD34D1C20D6CDD34D7BFEAA20CECDD34D53CDD34DD5D3FFCDD34D73D1231B7AB320F2C9E5CD664DF5D5C5213C40E5CDDD4DC1AFED42C1ED42D128 916 2CD6345F1E118DF213C401ABE20F02313 B78B120F5F1E1FE3820 921 020CDDD4DC3 7 2FE3B20122A1040CDDD4D2BCD9D14D1E1CD 7 2C376 621 94018EC
2 REM A2A096A8B4B180B5B7AEB3B97676 0 0 0 0 0 0 0 07EA542A5817E2442FF2442A5817E42242442243C42A5817E8142243C42A5997E42C3BDE7FFBD246681C3BDE7C3BD42663C42A5815A2442243C42A599423C42813C5AA5DBDBA55A3C 0FF55AA55 0FF 018183C665AFFE7C318183C247E42FF81 1 3 6 F193F66FF99FF66FF99FF66FF80C060F098FC66FF1F1F3D3E7D78FF 0F8F87CBC5E1EFF 01038382838287C4428383838383810 0 0 31F74DBF4FF81 0C0F82EDB2FFF81 0 0 07C 0 0 0 0 0105438385410 0 0 4 810204080 0 0 010 0 0101020 0 0 0 0 0101020 0 0 0 0 03030 0 0384C54546438 0 030501010107C 0 03844 438407C 0 07C 418 44438 0 0 81828487C 8 0 07C4078 44438 0 0384078444438 0 07C 4 8102020 0 0384438444438 0 03844443C 438 0 03844447C4444 0 0784478444478 0 0384440404438 0 0704844444870 0 07C407840407C 0 07C4078404040 0 03844404C4438 0 044447C444444 0 0381010101038 0 018 8 8484830 0 0444870504844 0 040404040407C 0 0446C54544444 0 04464544C4444 0 0384444444438 0 0784444784040 0 0384444544834 0 0784444784844 0 0384038 44438 0 07C1010101010 0 0444444444438 0 0444444442810 0 0A0AAAAAAEEAA 0 0A0AA4A44AAAA 0 0A0AA4A464242 4 0E02E424488EE 0E521943019EBE13ADB3FE6803AC13F F 6 8C5F51A46282C381CE6F0F578E6 F47F1B07713D51120 019D1F1C110E3C1 CED43C13FC9CB3FCB3FCB3FCB3FF578E6F018DC38 ACB27CB27CB27CB2718CCE6 F18EA
3 REM 0 2 4 6 0 2 4 6 0 4 2 6 0 4 2 6 0 2 0 4 2 6 4 6 0 6 2 4 6 0 4 2 0 0 0 6 9 1 0 0 0 0 0 0 0 0 0 0 0 0F5C5D579 E 05158CB38CB19CB38CB19CB38CB19814F2A C4023 919D1C1F1C9E5CD205177E1C9E5D5C5F53E 230 63AC63F F3E 4CB1132C03FCB20CB20CB20ED43C13FF1F5CD7246F1C1D1E1C9CD405118D421 038E511944E 1E0 1EDB0E111 03E 148 0EDB0C9CBFF37CD4751CBBFE5D5C5F518CF3AF33F3CE6 332F33F 7 7 716 05F21EE501922F43FC9A7F5CD B52AFCD6E5169CB 5CB 5CB 53E1890 7 7 73D6722C33F3AC73FA73AC83F F20 7 C2C2C2C2C18 5 D2D2D2D2D30 5 425252525F1C538 BCB4728 33C18 13DCD4051CD C42CD C4BED4BC33FCDA04AC1C92AC33F37F518BE17171716 05F21 03E1922D83F21 0 022DC3FC9 0FDCB78CECD7351AF32C83F32C73F161E 1 1 03CCD45523E 132C73F57 11E 0CD455218E2C5D5CDAE51C5CD 452CDBB 22CC1D12013CD20515E79BA7B20E7C1 4 4C6 2FE 9D018DCC1C1C9CD6C567D2E 0FEF720 12DFEEF20 12C3AFC3F85A728 7FE1F30 332FC3F7D32C93FAFCB C3F1732CA3FC9 6171E 0 E1FCD795330 21C50 DFAAA5218F3 5F29B527AED53F63F3E1032FC3FC9 0 0 0 0 0 03AFC3F3D4F 615AFCD6E51 C3E BCD6E51 CAFCD6E5118953AC93FA7C8ED44573DF53E 132C63F3AFC3F824F 615AFCD4751F13AFC3F4F28 1 D3E BC389513AFD3F4F D 6 0FE1E2013AFCD6E51 CCD6E51AF CCD6E51ED5F32FD3FC938 53C32FD3FC9A728 4AFCD6E51 C3E14CD6E51 C3E15C36E513AFD3F4F 6 0FE1ED03C32FD3FAFCD47513C32C63F3E14CD8951 C3CC3895148 421 020545875EDB018B53AC73FA73AC83F FED4B115130 5C225541851207218 A 0CD20517EA7C8FE 9C9 C C79FE2030 ACD795330F5ED431151C93A10513CFE 828143210515F16 02AF43F19463AF73F8047 EFF18D43E 132C83F3AF73F3C32F73FC6 5473E 4 EFF321351 C79FE2030 7CD795330F518BC3A13513D28 4 5 518E4AF32C83F3C32C73F3E 71813 D DFAF453CD795330F7189A3A10513DFA F543210515F16 02AF43F19463AF73F8047 E2018DA3E 132C83F3AF73F3C32F73FC6 5473E 4 E20321351 DFA3154CD795330F7C38E533A13513D28 4 5 518E5AF32C83F32C73FC39B533AFA3FA7C03ACA3FA7C83AFC3F4F 614ED43FA3F3E12C36E51 0 0F5C5D5E53A34403DFDBE3420FAE1D1C1F1C9 0ED4BFA3F C DC8 5F28954AF47CD6E514FED43FA3FC9ED43FA3F 4CD20517EFE122812FE B28 EC5AF21E33F 610772310FCC118 4AFCD6E51 5CD20517EA720 53E12C36E51FE13285BFE142867FE152863FE 930EB3CCB3FED44C6 5578787878282CDE8543AF63F3D32F63F 1 0 0ED43FA3FC9C5F53E 9A7CD4751F12AFE3F 6 04F 922FE3FCD5055 1 017AFCD20511E 57ECD475123 C1D20F7C1AFC36E51 0 0 03E 3CDE854CDE054 1 015ED43F83FC93EC8CDE854CDE0543E 4CD6054ED5B57411313 620F5CD944BCD6054CD6054F13D20EAC35553 0 0E5 1 017CDF5 8E1E51E1C 1F0D8CDE1 7CDAD AC9 03AF83FA7C0ED5FFEA0D0ED4B115178FE10D0 4CD795338F6FE12C8ED43F83FC9ED4BF83F C DC8AF32CB3FCD795330 632CB3F 418F5FE12CA1855FE B20123E 9CD6E513E40CD60543D20FAC1 1 0 1C978FE15282D3ACB3FA720 5AFCD6E51 4CD795338FAFE12CA1855FE B28D05778FE15CA20553E13A7ED43F83FCD6E517AA7C8AFCD6E51C32055 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 03EFF32F33FCD9752AF321051CD975121FF 2FD747822115121 0 022C73F22F83F22FA3F 0 0 0CD6153CDAE51CDBF52CD7354CD8655CDFE52CD4554CD 452CDD752CD7354CD8655CD3653CD66553A1251FE1430 A3AF63FA720CC 1 0 2C93AFC3F4F 615C5C3A555 0 0 03A2140A720 42A2540C926FEDB1DCB5720 42EF718 6CB5F20 22EEFCB67C825C9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5 FAST
7 REM :'''''''''''''''''''''''''''''''''''''''''''': : %S%P%A%C%E% %I%N%V%A%D%E%R%S% %-% %S%R%A%M : : BY FRED NACHBAUR 1987 : :............................................:
8 REM %*%M%E%R%R%Y% %C%H%R%I%S%T%M%A%S%* FROM SILICON MOUNTAIN COMPUTERS
10 SLOW
11 PRINT "USE %KEYBOARD OR %ZEBRA JOYSTICK?"
12 LET S$=INKEY$
13 IF S$<>"K" AND S$<>"Z" THEN GOTO 12
14 POKE 16417,S$="Z"
15 CLS
16 PRINT "BE SURE SRAM IS ENABLED BEFORE PROCEEDING....."
17 IF INKEY$="" THEN GOTO 17
20 LET S$="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
25 LET HR=19400
29 REM %I%N%V%A%D%E%R% %U%D%G%S
30 IF USR HR THEN LPRINT U;" ";"00,00,00,00,00,00,00,00,7E,A5,42,A5,81,7E,24,42,FF,24,42,A5,81,7E,42,24,24,42,24,3C,42,A5,81,7E,81,42,24,3C,42,A5,99,7E,42,C3,BD,E7,FF,BD,24,66,81,C3,BD,E7,C3,BD,42,66,3C,42,A5,81,5A,24,42,24,3C,42,A5,99,42,3C,42,81"
39 REM %O%T%H%E%R% %U%D%G%S
40 IF USR HR THEN LPRINT U;",,";"3C,5A,A5,DB,DB,A5,5A,3C,00,FF,55,AA,55,00,FF,00,18,18,3C,66,5A,FF,E7,C3,18,18,3C,24,7E,42,FF,81,01,03,06,0F,19,3F,66,FF,99,FF,66,FF,99,FF,66,FF,80,C0,60,F0,98,FC,66,FF,1F,1F,3D,3E,7D,78,FF,00,F8,F8,7C,BC,5E,1E,FF,00"
49 REM %R%O%C%K%E%T%/%B%U%L%L%E%T
50 IF USR HR THEN LPRINT U;">";"10,38,38,28,38,28,7C,44,28,38,38,38,38,38,10,00"
59 REM %M%O%T%H%E%R%S%H%I%P% %-%*%/
60 IF USR HR THEN LPRINT U;"=";"00,03,1F,74,DB,F4,FF,81,00,C0,F8,2E,DB,2F,FF,81,00,00,00,7C,00,00,00,00,00,10,54,38,38,54,10,00,00,04,08,10,20,40,80,00"
69 REM %N%U%M%B%E%R%S
70 IF USR HR THEN LPRINT U;"0";"00,38,4C,54,54,64,38,00,00,30,50,10,10,10,7C,00,00,38,44,04,38,40,7C,00,00,7C,04,18,04,44,38,00,00,08,18,28,48,7C,08,00,00,7C,40,78,04,44,38,00,00,38,40,78,44,44,38,00,00,7C,04,08,10,20,20,00,00,38,44,38,44,44,38,00,00,38,44,44,3C,04,38,00,00"
79 REM %A%L%P%H%A% %A%-%M
80 IF USR HR THEN LPRINT U;"A";"00,38,44,44,7C,44,44,00,00,78,44,78,44,44,78,00,00,38,44,40,40,44,38,00,00,70,48,44,44,48,70,00,00,7C,40,78,40,40,7C,00,00,7C,40,78,40,40,40,00,00,38,44,40,4C,44,38,00,00,44,44,7C,44,44,44,00,00,38,10,10,10,10,38,00,00,18,08,08,48,48,30,00,00,44,48,70,50,48,44,00,00,40,40,40,40,40,7C,00,00,44,6C,54,54,44,44,00,00"
89 REM %A%L%P%H%A% %N%-%Z
90 IF USR HR THEN LPRINT U;"N";"00,44,64,54,4C,44,44,00,00,38,44,44,44,44,38,00,00,78,44,44,78,40,40,00,00,38,44,44,54,48,34,00,00,78,44,44,78,48,44,00,00,38,40,38,04,44,38,00,00,7C,10,10,10,10,10,00,00,44,44,44,44,44,38,00,00,44,44,44,44,28,10,00,00,44,44,54,54,6C,44,00,00,44,28,10,28,44,44,00,00,44,44,28,10,10,10,00,00,7C,08,10,20,40,7C,00,00"
100 IF USR HR THEN CLS
102 IF USR HR THEN RUN
105 IF USR HR THEN RAND
107 POKE 16320,2
109 REM %C%O%V%E%R%-%S%C%R%E%E%N
110 CLS
112 POKE 16418,0
115 PRINT AT 1,0;;;;S$,,"** S P A C E I N V A D E R S **",,S$
120 PRINT ,,TAB 13;"POINTS",,,TAB 5;"< 3";TAB 22;"## 10";TAB 15;"£";TAB 5;".' 20";TAB 14;"$:?";TAB 22;". 30";TAB 13;"(~~~~~~)";TAB 5;"' 40";TAB 22;"=+ 200"
125 PRINT ,,"1-5 MOVE LEFT --- MOVE RIGHT 6-0",,TAB 8;"SHIFT --- FIRE",,,,,"PRESS ANY KEY TO START INVASION<",,S$
126 PRINT "1/2-SPEED TRAINER MODE - PRESS T"
128 IF USR HR THEN RAND 31
130 IF USR HR THEN LIST
136 POKE 16382,0
138 POKE 16383,0
139 REM %"%P%A%T%R%O%L%"% %D%E%M%O
140 IF USR HR THEN LPRINT SS;1
150 RAND USR 21024
160 LET S=(INKEY$="T")
170 IF USR HR THEN LPRINT SS;S
180 IF NOT USR HR THEN CLS
200 FOR L=3 TO 0 STEP -1
230 GOSUB 2000
239 REM %M%A%G%I%C% %M%A%C%H%I%N%E%-%C%O%D%E
240 GOTO USR 22016
256 CLS
258 FOR N=1 TO 3
260 IF USR HR THEN RAND
265 IF USR HR THEN RAND 31
267 NEXT N
270 NEXT L
279 REM %E%N%D% %O%F% %G%A%M%E
280 IF USR HR THEN PRINT AT 80,0;;;;S$;"><><>< G A M E -- O V E R <><><>";S$;"-P- ---- PLAY AGAIN -Q- ---- END OFF ",,S$
282 IF USR HR THEN PAUSE 4E4
285 IF INKEY$="Q" THEN GOTO 300
290 IF INKEY$="P" THEN RUN
295 GOTO 282
300 CLS
310 IF USR HR THEN RETURN
320 IF USR HR THEN CLS
330 STOP
512 IF USR HR THEN PRINT AT 0,0;;;;
520 FOR N=1 TO 43
530 IF USR HR THEN PRINT "-- SUPER -- BONUS ";
535 IF USR HR THEN RAND 31
540 NEXT N
545 CLS
550 RAND 1000+PEEK 16382+256*PEEK 16383
560 POKE 16382,PEEK 16434
565 POKE 16383,PEEK 16435
570 GOSUB 2000
580 GOTO USR 22021
2000 REM %S%E%T% %U%P% %S%C%R%E%E%N
2005 IF USR HR THEN CLS
2010 POKE 16418,0
2030 PRINT AT 2,2;"' ' ' ' ' ' ' ' ' ";AT 4,2;"'' . '' . '' . '' . ''";AT 6,2;": .' : .' : .' : .' : ";AT 8,2;":' ## :' ## :' ## :' ## :'";AT 22,0;S$
2040 LET F$="00000"+STR$ (PEEK 16382+256*PEEK 16383)
2050 PRINT F$(LEN F$-4 TO );TAB 26;
2060 FOR N=1 TO L
2065 PRINT (CHR$ 11+" ");
2070 NEXT N
2075 PRINT AT 18,5;"£";TAB 16;"£";TAB 26;"£";TAB 4;"$:?";TAB 15;"$,,?";TAB 25;"$~~?";TAB 3;"=~~~~~~+";TAB 14;"(~~~~~~)";TAB 24;"(:::)"
2080 POKE 16320,2
2085 IF USR HR THEN LLIST
2090 RETURN
9000 SAVE "INVADER%S"
9010 RUN
G000 REM 7676ED4F8080808080808080808080808080808080808080808080808080808080808080C34B41
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
