--- title: "Invaders" id: 51384 type: "computer_media" slug: "invaders" url: "http://localhost/computer_media/invaders/" markdown_url: "http://localhost/computer_media/invaders.md" published_at: "2023-07-29T22:03:27+00:00" modified_at: "2026-04-03T07:59:20+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2019/02/20230809-041332.jpg" excerpt: "A nearly full machine-code Space Invaders clone with custom UDG graphics, joystick support, and a charming sideswipe bug that leaves ghostly invaders hanging in space." category: - name: "Archived Media" slug: "archived-media" taxonomy: "category" url: "http://localhost/category/archived-media/" post_tag: - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "SyncWare Co." slug: "syncware-co" taxonomy: "post_tag" url: "http://localhost/tag/syncware-co/" - name: "TS 1000" slug: "ts1000" taxonomy: "post_tag" url: "http://localhost/tag/ts1000/" model: - name: "Timex/Sinclair 1000" slug: "ts-1000" taxonomy: "model" url: "http://localhost/model/ts-1000/" indiv: - name: "Fred Nachbaur" slug: "fred-nachbaur" taxonomy: "indiv" url: "http://localhost/indiv/fred-nachbaur/" genre: - name: "Game" slug: "game" taxonomy: "genre" url: "http://localhost/type/game/" media_type: "Cassette" programmers: - name: "Fred Nachbaur" slug: "fred-nachbaur" taxonomy: "indiv" url: "http://localhost/indiv/fred-nachbaur/" download_url: "https://archive.org/download/timex-sinclair-software-archive/Invaders%20%281987%29%28Nachbaur%2C%20Fred%29%28US%29%28TS1000%29%28Program%29.zip" mediadate: "1987" producer_company: - id: 11370 title: "SyncWare Co." type: "company" url: "http://localhost/company/syncware-co/" images: - url: "http://localhost/wp-content/uploads/2023/07/Invaders.jpg" media_type_tags: "Game" --- # Invaders 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](http://localhost/computer_media/sram-hi-res-extended-basic/) 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: | 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 `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. ## 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 ```