Invaders

Developer(s): Fred Nachbaur
Date: 1987
Type: Cassette
Platform(s): TS 1000
Tags: Game

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:

  1. 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.
  2. 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.
  3. Cover screen (lines 110–180): Draws the points table, control instructions, and runs the attract/patrol demo via RAND USR 21024.
  4. Main game loop (lines 200–270): A FOR L=3 TO 0 STEP -1 loop counts lives. Each iteration calls GOSUB 2000 (screen setup) then leaps into the machine-code engine with GOTO USR 22016.
  5. End-of-game and replay (lines 280–330): Displays a “GAME OVER” banner via SHREB, waits for P (play again) or Q (quit).
  6. 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.
  7. Screen setup subroutine (lines 2000–2090): Draws the invader grid using block-graphic characters, the score display, lives indicator, and bunkers.
  8. 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:

LinesBase CharContent
30U / " "Eight invader sprite frames (8×8 px each, two animation phases × four invader types)
40U / ","Explosion, shield, mothership, and miscellaneous sprites
50U / ">"Rocket/bullet (two frames, 16 bytes)
60U / "="Mothership and debris sprites
70U / "0"Custom digit glyphs 0–9
80U / "A"Custom alphabet A–M
90U / "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 IX and IY register pairs for sprite coordinate tracking and screen pointer arithmetic.
  • Use of ED B0 (LDIR) and ED B8 (LDDR) for fast block memory copies — sprite drawing and screen clearing.
  • Interrupt-driven timing: F3 (DI) / FB (EI) sequences and ED 47 (LD I,A) appear, suggesting use of the Z80 interrupt system for frame pacing.
  • I/O port reads (DB FE = IN A,(FE) and DB FB = IN A,(FB)) for keyboard and joystick scanning.
  • The entry points USR 22016 (0x5600) and USR 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 21024 at 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

Appears On

Related Products

Related Articles

Related Content

Image Gallery

Source Code

   0 REM A8809DA5A4A380B8B2A8767610C0CDF746C3B5453E1EED47DD21812C9F57EFE1A285CD9740CF18F1C9221640CD55FE5CDCD15E1C9CDAD40F5CDA04023CDAD4047F14FC9237EFE76283FE19C0221640C9260546865CB25CB1410FA910209C923CDB940CDA040CD9414779CB3FCB3FCB3F514FD5CDD540F12FE673C47C93E1F91305CD9740CF103EBF90D0CD9740CF1E210022C13F2620545D131FF17360EDB0C9F33E647010FDC6F03C20FD6C0FDCB78462826B01120021020C35241005CA5941197CED477DC3ABE72AC4007F7F7F11F782193E1EED473EF5172FDCB7846C4B52CD922CD7247DD212C41C3A42FDCB7886184FDCB78C62AC401250ED422BEB2108019225741EBEDB0CD2BFDD212C41C923CDB940CDA0404847CD641C523CDAD40C1CDD54077C91EFF1821E0D523CDB940CD941D1ED43C33FCDF140507EF10FDCB1B1742520268710FD77C93EFF181AF32C53FFDCB788E23CDB940CD9417EFE1A20B23ED43C33FCDB940CD9416069ED4BC33FC57D91161304ED4416FF202160E5677A32D03FF1901E1304ED441EFF2021E06F7B32CF3F7DBC3866C671601821E0ED53D13F22D33F7CA71F6F26022D53FC1C53EBF90F53AC53F5FF1FDCB784E205CDD141183CD434B3AD33F4F603AD53F6F6097D32D53FED5BD13F3AD43F4FED423887D32D53FED5BCF3FC179824F78834721D63F343AD43FBE20B3ED43C33FC93EFF181AF32C53F23CDB940CDA040C523CDAD40672E022CF3F6522D13FC13E1F5C5C52ACF3FED5BD13F65C5CB2ACB1B10FAB7ED5222CF3FED5BD13FC1CB2CCB1D10FA1922D13FED5BCF3FC179CB138A4F78CB158C473EBF90389F53AC53F5FF1CDD141C1F13CFECA38B4C93E132CF3FCDC840C8CDAD4032CF3FCDC940C823CDB940CDA040B838378414FCD10415041CD10417A42ED43D03F913CF523CDB940B830378414FED43D23F903C2013DD15FED53D43F3AD33F4F3AD13F47A7CDEE4022D63F3AD23F4F3AD13F47A7CDEE4022D83FCC9CD154320173ACF3F572102010187E2F7723B78B120F71520EEC93AD53F2AD63FED5BD83F22DA3FED53DC3FF5E5ED52E1285A3AD33FCD041D5C57E1F3FCB1310FAC1CB1B1710FB77D123E5A7ED52E12857E2F7718F33AD23FCD0413E99047C51A173FCB1D10FAC1CB151F10FB1212002ADC3F922DC3FEB2ADA3F922DA3FF13D20A621CF3F35208FC93AD43FFE82041A2F18D73AD33FCD041C51A1F3FCB1510FAC1CB1D1710FB673AD23F2FE6728D471AC5FCB1C10FBC1CB410FC7C18AA2A10407EB9C8FE80205CD9740CF1C5CDF29C1EB18ECF5E7E5E40814FCD454423E565AF7710FDD1E1F1C9CDE7407EF10FDCD5C443033E8112CDC840C2D04BC9CDE740E5C1CD2015E5CD5C44C1E56069CDF619CD8A15E118E0CDE7404E6018E44F7E473EBF90D5C5F5CDD141F1C1D1C91EFF1821E0D5CD2843D13AD53F573AD33F21D13FF5E5CDA944152863CCDAF4418F73AD43F57E1F12BE5CDA94415286CCDAF4418F73AD53F57E13AD23FF5E5CDA944152863DCDAF4418F73AD43F57E1F123CDA94415C8DCDAF4418F8CD23F1EC0FDCB78462821EB021020AFD3FBCD46FD2858DBFB1730FB1620684EDBFB1F30FB79E680D3FBCB1110F2231520EBDBFB1F30FBCD704B18D123221640CD55FCDA7E505911C8FDCB3B46C010F9D20F61B7AB320EEC9237EFE76209CDD945CDF7461831237EFE1A2812FE19282CFE762847FEC12849FEC2285C186EED4BC13F79E6F0C610FE40C4B445CCAF4518D578C6847AF4FED43C13FC96FF237EFE76C8FE1A2043E418BFE1920C5478FE3CAD04B32C03F18E3ED4BC13F18D023CDB9404847FEB9D2144179FE40D2B41ED43C13F188F23CDAD40E63FED4BC13FB94F30EC3E8804718E6221640CD55FE5FDCB176C4D51BCDF813E1E578B128C1AC5D5CD3046D1C113B18F0E118C4FEC02043EB183AF5E67FFE40307F1FDCB1C6182CFDCB14628AAFFDCB186CD7246184FDCB1C6F1CD759AF5C5E67FCD7246C13F1FE8038F1FDCB186AFED4BC13FF53E3F91DCAF45CDF746F1C532DB3FA717A71717160CB125F2101E19E5CB39CDD540D13AC03FFE4CA9450FE22843FE1282B3E8F5D51AF53AC03FA720B3ADB3FCB7F284F12F181F1771120019D1F1133D20DFC1CCED43C13FC93ADB3FFE2638CEFEA630CAE52101E19EBE118C13ADB3F7E52101C38F1261A18EDFDCB78463EB82823EA8B8D05778E678247C51102021021CB38CB38CB384BEDB02B7110FCC1C9CDC8403E17283CDAD4011003C2AC13FE5ED53C13FED5BC4013F56201AC5D5CD7246D1C11310F5F13D20EDE122C13FC9CDC84028CCCDAD403CF5473EC0D6810FC5758F118C623CDB940CD941CDA040C9F5C5D5E5183CBB6C92A34402B3E7FA4B57C20317182463767223440D021FFFF1FEFEED78F61F6E0572FFE19FB0A56F7CA267CB0ED7838ED1FCB141717179FE618C621322840C341200000000CD1543201B3ACF3F21020545D120091E017EDB06202B7110FC3D20E9C93AD13FFE02854473AD33F4FC53EBF90C5F53CC5CDF140D13E8B820173AD23F93FE838F7E1200ED4277F1C179C684F18D97EF10FD1EFF3811CF1C1C5CDD141C150603AD23F606F3A7ED424230BAC153AD03FB820B13AD03F472AD33F3EFFBC201244DE5C53EBF901E0CDD141C1CE12520F021CF3F352081C9CD1543201C3ACF3F21FF37545D1200ED421E017EDB8620237110FC3D20E8C93AD03FFEBF2857473AD33F4FC53EBF90C5F53DC5CDF140D13E8B820163AD23F93FE838E7E1200977F1C179C684F18DA7EF10FD1EFF3811CF1C1C5CDD141C150603AD23F606F3A7ED424230BBC143AD13FFE0283B820AE3AD13F472AD33F3EFFBC201244DE5C53EBF901E0CDD141C1CE12520F021CF3F35C28748C9CD154320173ACF3F5F21FF3762078A7CB162B10FBA420F41D20EEC93AD13F473AD33F4FC53EBF90C5F5CCDF1407EF10FD1EFF3811CF1C1C5CDD141C13AD23FCB920E0C1578FEFF2883AD03F5778BA30D0ED4BD13F78414F3AD53F6FE5C53EBF901E0CDD141C15E12D20F021CF3F3520A7C9CD1543201D3ACF3F5F21020A7620CB1E2310FB1038A7E5ED42E120EE1D20E8C93AD13F473AD23F4FC53EBF90C5F5DCDF1403E990477E710FD1EFF3811CF1C1C5CDD141C13AD33FDB920DCC1578FEFF2883AD03F5778BA30CC3AD13F473AD33F4F3AD53F6FE5C53EBF901E0CDD141C15E12D20F021CF3F3520A2C9237EFE1C305CD9740CF1DFE2C30F7D61CC9CD24A47CB20CB20CB20CB20CD24A8047237EFEB78C9237EFEBC2D04B237ECB7F282D64011002323E5682606FEB1910FDEB2103819EBE123CD144A1220523221640C91318F223CDAD40FE20110638D5CD9740CF1B120097CFE38D8D61867C923CDAD40FE2030E7CDA040A71717171605F2103E1922D83FE7CDB940ED43DA3FC9CD7B4A3EBF90302D6406769CB3CCB1DCB3CCB1DCB3CCB1DCBEC22DC3F792FE673C327A4011E33FED4BD83F3E8F57E12AC54F3A7A40FE538112FC69A74779E028E1FCB1910FB18747AFCB111710FBB67723137E1279B6772BCD6F4A13C13F13DC2CB4AC9CDC840C2D04B2ADC3F11E33F68C51A7723131A77CD6F4A2B13C110F1C9FDCB78CECD7B4A2A16407EFE1A20D23ED43C33FE5CDA04AE1CDB940C3A42C5213440467EB828FCFD9676327740CDC4BC1CDA04A3A7740FDBE3420FBC9CDC8403E0283CDAD40327640C91DC0C13E4D3FB1CCD6345C38B41ED5B57411313237EFE762817D5CDAD4047CD6414D1626BCBBC1AC68012771310F4C9620AF626BCBBC12771310F7C902A16407EFE192875FE76285CD9740CF15E1221640100C92A16407EFEDE285CD9740CF11E5237E11C04BD5FEE2CA5147FEE7CA8E40FEEFCA274EFEF0CA1F47FEF2CA5745FEF5CA7645FEF6CABE41FEF7CA8141FEF8CA8A4DFEF9CA7E4BFEFBCA1941FEFCCAC241FEFDCA8741FEFECA9740FEFFCA1845FEE120A5D111AF4BD5237EFE3D287D47237EFE762893FE1920F678FE26CA8844FE27CAA741FE28CAA742FE29CAE741FE2ECA7F43FE31CAA144FE35CA7244FE37CAB944FE38201E2B7E23FE29CA5F4AFE2ACA64BFE32CA244BFE35CA9D4AFE38CA624B1848FE39CAD04BFE3ACA2B4AFE3C203A2B7E23FE29CA6648FE31CAB49FE37CA8149FE3ACAC64718212346237EFE762819FE1920F678FE28CAAB42FE29CAEB41FE37CABD44FE39CA7647C3D04B
   1 REM E5767667CB21DCF4DD4FE4C3E33D20FDED5F5C2E24CCB21DCF4DD4FE4CC9DBFE3E1A3D20FDD3FF3E123D20FDC3234DC3124DDBFE3E293D20FDD3FF3E203D20FD2B2337C91080C50CDE04CC15C2274D3ED5FCDE04CCD634DDCDE04CFDE5F17EEAACDE04CCD634D4ACDE04CCD634D4BCDE04CFDE5F17E4ECDE04C231B7AB320F600C9CDE7223221640CD55FE5CDF813E12379B028EFE2130A7EFE38C8FE3BC8FE35C8CF1CCD664DF5626BC51102CD6345D1CD244DF12A1440FE3820721020545D1810FE3520511940184ED5B1040ED52EBCD244DC372DBFE1738FBE0CDBFE1730FA79C6E7CB13C91E068CDC04D10FBC916014D3FF7AFE4030111E0CDC04DCD46FD2A637BA720E718E71E0D3FFCDC04D7BA728F5CDD34D1C20D6CDD34D7BFEAA20CECDD34D53CDD34DD5D3FFCDD34D73D1231B7AB320F2C9E5CD664DF5D5C5213C40E5CDDD4DC1AFED42C1ED42D1289162CD6345F1E118DF213C401ABE20F02313B78B120F5F1E1FE3820921020CDDD4DC372FE3B20122A1040CDDD4D2BCD9D14D1E1CD72C37662194018EC
   2 REM A2A096A8B4B180B5B7AEB3B97676000000007EA542A5817E2442FF2442A5817E42242442243C42A5817E8142243C42A5997E42C3BDE7FFBD246681C3BDE7C3BD42663C42A5815A2442243C42A599423C42813C5AA5DBDBA55A3C0FF55AA550FF018183C665AFFE7C318183C247E42FF81136F193F66FF99FF66FF99FF66FF80C060F098FC66FF1F1F3D3E7D78FF0F8F87CBC5E1EFF01038382838287C44283838383838100031F74DBF4FF810C0F82EDB2FFF810007C0000010543838541000481020408000010001010200000010102000000303000384C545464380030501010107C003844438407C007C418444380081828487C8007C40784443800384078444438007C4810202000384438444438003844443C438003844447C4444007844784444780038444040443800704844444870007C407840407C007C4078404040003844404C44380044447C44444400381010101038001888484830004448705048440040404040407C00446C54544444004464544C4444003844444444380078444478404000384444544834007844447848440038403844438007C1010101010004444444444380044444444281000A0AAAAAAEEAA00A0AA4A44AAAA00A0AA4A46424240E02E424488EE0E521943019EBE13ADB3FE6803AC13FF68C5F51A46282C381CE6F0F578E6F47F1B07713D51120019D1F1C110E3C1CED43C13FC9CB3FCB3FCB3FCB3FF578E6F018DC38ACB27CB27CB27CB2718CCE6F18EA
   3 REM 02460246042604260204264606246042000691000000000000F5C5D579E05158CB38CB19CB38CB19CB38CB19814F2AC4023919D1C1F1C9E5CD205177E1C9E5D5C5F53E23063AC63FF3E4CB1132C03FCB20CB20CB20ED43C13FF1F5CD7246F1C1D1E1C9CD405118D421038E511944E1E01EDB0E11103E1480EDB0C9CBFF37CD4751CBBFE5D5C5F518CF3AF33F3CE6332F33F7771605F21EE501922F43FC9A7F5CDB52AFCD6E5169CB5CB5CB53E18907773D6722C33F3AC73FA73AC83FF207C2C2C2C2C185D2D2D2D2D305425252525F1C538BCB472833C1813DCD4051CDC42CDC4BED4BC33FCDA04AC1C92AC33F37F518BE1717171605F2103E1922D83F210022DC3FC90FDCB78CECD7351AF32C83F32C73F161E1103CCD45523E132C73F5711E0CD455218E2C5D5CDAE51C5CD452CDBB22CC1D12013CD20515E79BA7B20E7C144C62FE9D018DCC1C1C9CD6C567D2E0FEF72012DFEEF2012C3AFC3F85A7287FE1F30332FC3F7D32C93FAFCBC3F1732CA3FC96171E0E1FCD79533021C50DFAAA5218F35F29B527AED53F63F3E1032FC3FC90000003AFC3F3D4F615AFCD6E51C3EBCD6E51CAFCD6E5118953AC93FA7C8ED44573DF53E132C63F3AFC3F824F615AFCD4751F13AFC3F4F281D3EBC389513AFD3F4FD60FE1E2013AFCD6E51CCD6E51AFCCD6E51ED5F32FD3FC93853C32FD3FC9A7284AFCD6E51C3E14CD6E51C3E15C36E513AFD3F4F60FE1ED03C32FD3FAFCD47513C32C63F3E14CD8951C3CC3895148421020545875EDB018B53AC73FA73AC83FFED4B1151305C225541851207218A0CD20517EA7C8FE9C9CC79FE2030ACD795330F5ED431151C93A10513CFE828143210515F1602AF43F19463AF73F8047EFF18D43E132C83F3AF73F3C32F73FC65473E4EFF321351C79FE20307CD795330F518BC3A13513D2845518E4AF32C83F3C32C73F3E71813DDFAF453CD795330F7189A3A10513DFAF543210515F1602AF43F19463AF73F8047E2018DA3E132C83F3AF73F3C32F73FC65473E4E20321351DFA3154CD795330F7C38E533A13513D2845518E5AF32C83F32C73FC39B533AFA3FA7C03ACA3FA7C83AFC3F4F614ED43FA3F3E12C36E5100F5C5D5E53A34403DFDBE3420FAE1D1C1F1C90ED4BFA3FCDC85F28954AF47CD6E514FED43FA3FC9ED43FA3F4CD20517EFE122812FEB28EC5AF21E33F610772310FCC1184AFCD6E515CD20517EA72053E12C36E51FE13285BFE142867FE152863FE930EB3CCB3FED44C65578787878282CDE8543AF63F3D32F63F100ED43FA3FC9C5F53E9A7CD4751F12AFE3F604F922FE3FCD50551017AFCD20511E57ECD475123C1D20F7C1AFC36E510003E3CDE854CDE0541015ED43F83FC93EC8CDE854CDE0543E4CD6054ED5B57411313620F5CD944BCD6054CD6054F13D20EAC3555300E51017CDF58E1E51E1C1F0D8CDE17CDADAC903AF83FA7C0ED5FFEA0D0ED4B115178FE10D04CD795338F6FE12C8ED43F83FC9ED4BF83FCDC8AF32CB3FCD795330632CB3F418F5FE12CA1855FEB20123E9CD6E513E40CD60543D20FAC1101C978FE15282D3ACB3FA7205AFCD6E514CD795338FAFE12CA1855FEB28D05778FE15CA20553E13A7ED43F83FCD6E517AA7C8AFCD6E51C3205500000000000000003EFF32F33FCD9752AF321051CD975121FF2FD7478221151210022C73F22F83F22FA3F000CD6153CDAE51CDBF52CD7354CD8655CDFE52CD4554CD452CDD752CD7354CD8655CD3653CD66553A1251FE1430A3AF63FA720CC102C93AFC3F4F615C5C3A5550003A2140A72042A2540C926FEDB1DCB572042EF7186CB5F2022EEFCB67C825C900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
   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.

Scroll to Top