--- title: "Block Buster" id: 51373 type: "computer_media" slug: "block-buster" url: "http://localhost/computer_media/block-buster/" markdown_url: "http://localhost/computer_media/block-buster.md" published_at: "2023-07-29T15:34:12+00:00" modified_at: "2026-04-03T07:59:21+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2019/02/20230809-041332.jpg" excerpt: "A two-part puzzle-action game where you steer a character across a block-filled screen, defusing bombs using hi-res graphics and custom UDGs." 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: "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: "Gregory Harder" slug: "gregory-harder" taxonomy: "indiv" url: "http://localhost/indiv/gregory-harder/" genre: - name: "Game" slug: "game" taxonomy: "genre" url: "http://localhost/type/game/" media_type: "Cassette" programmers: - name: "Gregory Harder" slug: "gregory-harder" taxonomy: "indiv" url: "http://localhost/indiv/gregory-harder/" download_url: "https://archive.org/download/timex-sinclair-software-archive/Block-Buster%20WRX%20%28198x%29%28Harder%2C%20Gregory%29%28US%29%28TS1000%29%28Program%29.zip" mediadate: "1986" media_type_tags: "Game" --- # Block Buster Block Buster is a puzzle-action game in which the player steers a character around a screen full of blocks, defusing time bombs before they detonate. The program is split into two parts: Part 1 is a loader that checks for an 8K NVM (non-volatile memory), then chains to Part 2, which contains the full game logic. Part 2 makes extensive use of high-resolution BASIC via a machine-code routine address stored in `HR` (19473), with nearly every display and print operation gated through `IF USR HR THEN` to drive a custom hi-res display layer. User-defined graphics (UDGs) are loaded via `LPRINT UDG` commands, defining 20 custom characters for the player sprite, flag, bombs, and decorative block tiles. The game uses a two-row string array `M$` to represent the playfield and supports row-shifting left or right with keys 1 and 2, wrapping blocks toroidally around the screen edges. *** ## Program Analysis ### Program Structure The listing comprises two distinct programs. The first (lines 0–230) is a loader: it saves itself, displays a readiness message, checks for the NVM via `USR 16516`, and chains to the second part with `LOAD "BLOCK[2]"`. The second program (lines 0–9010, saved as `BLOCK[2]`) contains the complete game engine, organized into clearly commented sections: - Lines 1–1240: Main game loop, scoring, movement, and level progression - Lines 1250–1400: Screen and playfield setup (`REM * SET UP SCREEN *`) - Lines 1410–1490: Display refresh and random-position subroutine - Lines 1500–1590: Initialization, hi-res mode setup, and UDG data loading - Lines 1600–1710: Instructions display - Line 9000–9010: Save and restart ### Hi-Res BASIC Driver Almost every output statement is prefixed with `IF USR HR THEN`, where `HR=19473` is set at line 1500. This machine-code entry point implements a hi-res graphics layer; the return value controls whether normal BASIC output proceeds. This idiom allows the same BASIC source to drive a custom display system while remaining syntactically valid. `LPRINT` is used to send commands to the hi-res driver (e.g., `LPRINT I;...` for line drawing, `LPRINT XD;...` for divider lines, `LPRINT UDG;"[A]";...` for UDG definition). ### User-Defined Graphics UDGs are defined in lines 1560–1590 using `LPRINT UDG` with hex byte strings. Twenty characters (A through T) are defined, covering: the player sprite (L, M, N, O), flag (D, E, F, G), active bomb (H, I, J, K), safe block tiles (A, B, C), and checkerboard/gray block tiles (Q, R, S, T) used for the unshiftable row introduced after level 2. ### Playfield Representation The playfield is a 20×30 string array `M$(20,30)`. Each on-screen entity occupies a 2×2 cell (two rows, two columns). The player position is tracked by row `A` and column `B`, the flag by `F1,F2`, and the active bomb by `B1,B2`. Row shifting (keys 1 and 2) is implemented by string rotation at lines 720–800, appending the end of each row string to the front, achieving toroidal wrapping without any element-by-element loop. ### Game Mechanics - Movement uses keys 5/6/7/8 (cursor keys), with toroidal screen wrapping enforced at lines 670–680. - Row shift (keys 1/2) rotates the player’s two-row slice of `M$` and adjusts flag/bomb column references accordingly. - Bombs have a countdown timer `T` initialized to `50-L*4` (shorter at higher levels). The countdown is displayed using the pre-built two-digit string array `N$(100,2)`. - The bonus object array `M(L*3+3)` tracks row positions of all flags on the current level. - The unshiftable gray row is introduced when `L>2`: `D=-1+(INT(RND*10)*2+2 AND L>2)` selects a row index, and lines 1320–1330 fill that row with the Q/R/S/T UDG tile set. ### Scoring | Event | Points | | --- | --- | | Moving onto a new block | +2 | | Reaching a flag | +20 | | Defusing a bomb | +L×15 | | Level completion bonus | +55×L | The score display uses a pre-built lookup array `N$(100,2)` constructed at initialization (lines 1505–1510) by taking the last two characters of `STR$(99+N)`, giving zero-padded two-digit strings “00”–”99″. The score is split into hundreds (`SC1`) and remainder (`SC2`) for display. ### Key BASIC Idioms - `AND` used as a conditional multiplier: e.g., `2 AND X$="6"` evaluates to 2 if true, 0 if false — a compact movement delta calculation. - `VAL "number"` in `GOTO`/`GOSUB` targets as a memory optimization (not used here, but `GO TO` targets are direct line numbers). - String slicing for rotation: `M$(A+X,3 TO )+M$(A+X)` drops the first two columns and appends them to the end for a rightward shift. - The `PAUSE 4E4` (40000 frames) used in instructions/title screens acts as a long wait, effectively blocking until `PAUSE` is interrupted by a keypress. ### Notable Anomalies Line 700 contains the condition `D=A` to prevent row-shifting when the player is on the immovable gray row. Lines 1120–1147 handle the game-over restart loop: `IF USR HR THEN RETURN` at line 1140 exits to a calling context under the hi-res driver, while line 1145 `STOP` and lines 1146–1147 provide fallback paths (`RUN` and `GOTO 30`) depending on the execution context. Line 160 in the first program uses `IF USR 16516 THEN` to test NVM presence before proceeding — a hardware capability check via machine code. ### REM Line 0 Data Both programs carry a `REM` at line 0 containing binary data — a common technique for embedding machine code or character set data in the program area. The first program’s REM contains graphics and machine-code bytes for the hi-res character set described in line 10 (Mode 1 and Mode 2 character sets plus a full UDG set). The second program’s REM 0 holds the hi-res BASIC runtime itself, referenced throughout via `USR HR` (`HR=19473`). ## Source Code ``` 0 REM ##5[(]RND) S▘ ▞ GOSUB [K]TAN LIST LIST LIST LIST ???? COPY COPY COPY COPY LIST LIST LIST LIST LIST LIST LIST LIST LIST LIST LIST LIST ???? LIST LIST LIST LIST COPY COPY COPY COPY LIST LIST LIST LIST [E]#[E]#[E]#[E]# [E]#[E]#[E]#[E]# 88 06#44# ▒YCY~~Y▒ ( ( WPI▖▒ ▒ ▖▒▒▒▒▖ 4((((4 (▒▖▒( ▖▒(▒▖ Y Y ▒▒Y▒▒ Y =▒Y▒= ▝▖▒(4 ( ((4 ▒▒( // ###### S////W ##▖### #▖2▞## £0O##▖ #RND#£## #RND#### #£££££ W88### ####££ #▖### RNDRND#### ##### ▖▖#### ##### WK#KKK ####▖# ###### 4 4KKKK ▖ ▖▞▞▞## ###### S////W ##### ##### ##### ####RNDRND ####▖▞ ##### #RND#£# /#//// ##### PI#W// ##### #8W8# ####▞# #▖### COPY COPY COPY COPY COPY COPY COPY COPY???? COPY COPY COPY COPY LIST LIST LIST LIST COPY COPY COPY COPY COPY COPY COPY COPY COPY COPY COPY COPY???????????? LIST LIST LIST LIST ???? ????#[E]#[E]#[E]#[E] COPY COPY COPY COPY#[E]#[E]#[E]#[E] COPY COPY COPY COPY444RND /8/E#U 8#88#8 ##▒(A# //// / RNDRNDRNDRNDRNDRNDRNDRND▘▘▘▘▘▘▘▘ ▒▖#▖▒ (4#4( COPY COPY COPY W###RNDW ▝▖▒ 4( £(##(£ #(00(# #PIPIPIPI# 4KWWK4 ▖£WW£▖ RNDRNDRNDRNDRNDRNDRND COPY COPYRNDRNDRNDRNDRNDRNDRND▘▘▘▘▘▘▘ COPY COPY▘▘▘▘▘▘▘ WPI##PIW M# (#(((( W8#### ###### ###### ###### ###### ###### ###### ###### ////// £££### ###### ###### ###### #PIPI### ###### ###### ###### ###### #RND#££# #///// ###### PIPI#W// ###### ##S### ###/// ##/K## COPY COPY COPY COPY COPY COPY COPY COPY???? COPY COPY COPY COPY LIST LIST LIST LIST COPY COPY COPY COPY COPY COPY COPY COPY COPY COPY COPY COPY???????????? LIST LIST LIST LIST ???? ????#[E]#[E]#[E]#[E] COPY COPY COPY COPY#[E]#[E]#[E]#[E] COPY COPY COPY COPY ====== ##▒(A# /8/E#U ▖▖▝ (((( ( ▖▒▒/▒▒▖ 4((/((4 COPY M# 0((((0 W###RNDW S▒▒▒▒S ▒▖#▖▒ (4#4( (S#((( 444RND ▘Y#=== S###C# ▞#[)]#▞ ▒ 6 6 ▒ ▘▝#[C]( 4#(4# #(4(# #6(▒(6#((#(( # ▒=(((#4 S▖W#W RNDRND#### S#RNDRNDS ▖▖W##W S##RNDS 04#444 S##W▖S RNDRND#### ( K((S ▒ /▒▒#K 48CKC8 K((((S ##### ##### S###S ####RNDRND W##W▖▞ GM444 WRNDW▝W 4#448/ ####W ###C( ####C #C(C# 6662▝0 #▒(4# 10 REM LOWER CASE/NEW SYMBOLS (MODE 1 CHARACTER SET) PLUS ONE COMPLETE SET OF UDG, TECH. CHARAC- TER SET. (MODE 2 CHARACTER SET) 20 REM [B][L][O][C][K][B][U][S][T][E][R]█[P][A][R][T]█[1] 30 REM [*][E][N][T][E][R]█[R][U][N]█[T][O]█[S][A][V][E] 40 REM 50 SAVE "BLOCK[1]" 60 SLOW 160 CLS 170 PRINT "BLOCKBUSTER PART 1 HAS LOADED.","BE SURE YOUR 8K NVM IS ENABLED" 180 PAUSE 300 190 IF USR 16516 THEN 200 CLS 210 PRINT "LOADING BLOCKBUSTER PART 2" 220 PAUSE 100 230 LOAD "BLOCK[2]" 0 REM [(][C][)]█[1][9][8][6]█[G][.][C][.][H][A][R][D][E][R]##Y2 GOSUB #<>5▟▝TAN PRINT # RETURN,C▌LN [*]RNDINT / LET TAN 6-RNDLN #? FASTLN LN + LPRINT TAN LN [H]RND PRINT LN [4]RND7LN [H]RND# LET #TAN 7# RETURN#C▀ RETURN;""6-RNDTAN A ##▞▌ACS 9ACS =( IF ,,▘ 4,,TAN 7LN [T]RNDLN [4]RNDLN ,,INKEY$ ##ACS ZACS ZACS Z##STR$ LN STR$ RND LET J NEW▛W#TAN Y3[)]K▌LN [*]RNDINT (Y[Z][(]SQR LN [*]RNDINT 25 6AT ZA4##<▘ COPY*Q GOSUB [K]TAN NEXT Y▞# ( CLEARLEN LIST W4 CLEAR▞"" CLEARACS ##C▝▞[K])4 5 4##INKEY$ ▌ASN #INKEY$ ;# GOSUB ###▞ NEWE£RND ###) RUN ▙;Y2 GOSUB #Y PRINT ▘▛▝ CLEARACS ##CODE [P]▝LN [>]▝LN 4▝<>5GINKEY$ #[8]▝ CLEARACS #▚/▖ CLEARACS #LEN E£RND▘9 GOSUB PIF FOR 5 █;6#INKEY$ FOR GOSUB [K]LN F?<>5GINKEY$ TAN 7LN [T]RNDLN [4]RND##LN ▞INKEY$ VAL 7LN [H]RNDAT LN STR$ RND#TAN 2 COPY/▝2 STR$ 7LN [T]RNDLN ,,INKEY$ SGN GOSUB ##ZLN LET RND##?( CLEARACS .*PI▌4▝▞▒▛( CLEAR#TAN Y COPY/▘[J]MVAL Z CLEARACS #[:]7LN [T]RNDLN ,,INKEY$ # RETURN,4"7 GOSUB ##ZLN [T]RNDLN ,,INKEY$ ## GOSUB ##ZVAL #[)]-▘K▖ GOSUB #- COPY4▝- FAST##MSQR Z LET [(]2▘K▖ GOSUB #2 COPY4▝2 ##MINT Z#[W]S▞##- /▝2 GOSUB #SGN Z6PEEK Z#[B]3#A 6STR$ ZAT VAL Y[Z][(] PRINT UVAL Z# LET CLEARACS ##4▌LN SGN INKEY$ /▀LN USR #UPEEK Z#▞ USTR$ Z##,,#MSTR$ Z GOSUB #SGN ZUUSR Z# GOSUB PIS▒#MSTR$ Z GOSUB #INT ZAT #▙##▄#5CHR$ ZOUUSR Z[Y]4[N] GOSUB ##ZTAN Y COPY/▘[J]MVAL Z7LN [T]RNDLN [4]RNDVAL 7LN [H]RND#I 6INT Z#6SGN ZAT Y▘ PRINT VAL VAL EINT Z GOSUB #SGN Z▞▌VAL ACS EACS .( IF [R] GOSUB #6INT Z GOSUB #SGN ZAT ACS GACS 1( IF ;6SGN Z GOSUB #INT ZAT #ACS <[~~]##ACS +[£]#Y[Z][(]S,, PRINT UVAL Z# LET LN SGN INKEY$ AT LET W RETURNASN S[O]TAN Y▘MINT ZLN COS RNDCOS LN [H]RNDMINT ZLN TAN RNDCOS 7LN [T]RNDLN [4]RND[S]S▀#INKEY$ #LN (INKEY$ #INKEY$ LN (INKEY$ #PI GOSUB #SQR Z[)]W PRINT 7LN [T]RND[S]K▀#INKEY$ # GOSUB #ABS Z[(]W4▘XSGN # GOSUB #USR ZUPEEK Z#USGN Z#[B]LN INPUT RND6CHR$ ZUABS Z#USGN Z#[B]LN INPUT RND6**Z£TAN LN +#4*UINT Z#5 4▘ /#J#7"#[L]4 RUN +4 INPUT TAN USTR$ ZECHR$ Z GOSUB #**Z6 AND Z GOSUB #>=Z PRINT FAST GOSUB # LPRINT C#UPEEK ZLN INKEY$ STR$ VAL #3ZACS <( IF AT ACS .*( CLS#SGN 7 FAST[B] GOSUB # LPRINT C▌#J#/ NEXT UABS ZLN INKEY$ Y,,[(]#VAL ,*ZACS 1( IF AT ACS +3( CLS>▘4 E>=Z,,6>=Z FOR E AND Z,,6 AND Z LET X4[A]5INT ZP4[?]TAN UUSR Z RETURN▒4▖,J/NOT UPEEK ZLN INKEY$ VAL ,3ZACS +( IF AT ACS 1*( CLS#UABS ZJ NEW▛C$#,VAL ?ACS 0( CLSAT ACS ▖( UNPLOT #/[E]E(RND#[T]COS RETURN█4▌LN [*]RNDINT ▘VAL LN PAUSE ,,AT FOR / GOTO PRINT SCROLL FAST:RND▟#LN ##7 FAST▞▌[J]#( CLEARSGN LPRINT LET TAN LN SCROLLRND#?( CLEARLN ##K▀Y▟>LN COS RNDTAB ;#TAN LN SCROLLRND FASTAT LN 4+ FASTLN ##AT FAST##LN PLOT ;LN [~~]+ LPRINT / STEP LN SCROLLRND#▞ / SLOW###Y[Z][(]STR$ VAL PRINT LN SGN INKEY$ LET AT SGN TAN 2 COPY/▝2 STR$ LN C#SGN USTR$ Z#UPEEK Z5SGN Z PRINT FASTLN [D]#+C▞WLN [J]#/ RUN UUSR Z# LPRINT LET F FASTLN [D]#+C▞£LN [J]#/ RUN USTR$ Z# LPRINT UABS Z PRINT FASTLN [D]#+C▞XLN [J]#/ RUN UUSR Z# LPRINT LET 7LN [D]#+COS $LN [J]#/ SAVE LN 7?2"" CLEARACS ##C▝2[K]5 4[J]PEEK CLSLN #?ABS ▐▒<= CLS*K CLS-4▞▒#<= CLS3K CLS# NEW█PEEK CLSACS )( PAUSE 7+4 FOR <= CLS3K CLSLN REM #/SGN 76-RNDLN #?LN [B]:##▘▘COS CLEARACS V#""( RAND $4 PLOT .#[N]4 INPUT TAN 7# RETURN,C> RETURN;C7 RETURN#CN RETURNAT CQ RETURNTAB CINKEY$ /# GOSUB #AT Z# RETURN(Y(S▌#LEN ▒#[J]# GOSUB #AT Z▞ COPY7# RETURN#C" RETURN;4COS ▖#M""Z/ LOAD TAN GOSUB #AT ZF/<=7LN [T]RND##LN ▞INKEY$ GOSUB #AT Z/[E]7LN [H]RND NEW3 GOSUB #AT Z[T]#K GOTO ▖/ DIM 6-RNDLN #? FAST CLEARACS ▘#C▀LN STR$ .LN SAVE < LPRINT FAST#[L]C£,VAL STR$ LN ▞#SGN AT <"/ LIST LPRINT /VAL RETURN""4▖Y"/U PRINT NEW# RETURNRNDK▛ LET CLEARACS ▘LEN /G CLEARACS ▘#C~~[J] CLEARACS ▘▚LN ##/▖ CLEARACS ▘LEN LET LN #,,~~ PRINT VAL NEW#LN ##AT ▀ LET RETURN█S LET CLEARACS ▘▚[J]M<=Z GOSUB #AT ZVAL #Y3[)]K▒AT : #LEN ▒#VAL #[B]*[B]**- ACS >#5 2; FASTLN STR$ RNDSGN U""Z RETURN▝C/ RETURN▘4BU<=Z RETURNAS4 RETURN[A]K0 FAST5 2; FOR LPRINT /=AT ▌# RETURN COPYC▒USQR Z##[U]KATN USGN Z#UPEEK Z#USTR$ Z# FASTVAL Y[Z][(]2 LN SGN INKEY$ AT ▌ LPRINT H4 LIST 5INT ZP4[6]TAN 7# RETURN0K▌LN [*]RNDINT 1 RETURNGK RUN CHR$ 0TAN LN [X]##ACS 4ACS 4ACS 4ACS 4LN [X]#█#7# RETURN"#TAN 7# RETURN"TAB ;#7#ACS #C▝CHR$ RND) 77 FAST▞▒A # FOR ;( CLEAR FOR 5 S; FOR LPRINT 7LN INT #>4▌76-RNDTAN =ZVAL FAST) STOPZ▞▒VAL #>7<#>LN E#F=Z) STOPZ▞▒VAL ,#7<,#LN E#F=X#USR K#$TAB ##LN K#TAN LN 7?LN 5#5 CONT ▀LN K#F#[P]4 SAVE Y CLEAR PRINT LN ## LET LN ##) 4PI#VAL ,LN ##"" THEN GOTO 50 60 IF INKEY$ ="" THEN GOTO 60 70 IF INKEY$ ="I" THEN GOSUB 1600 80 RAND 90 LET SC=0 100 LET L=1 110 LET L$="[P][P][P] " 120 LET A=19 130 LET B=15 140 LET AA=A 150 LET BB=B 160 LET D=-1+(INT (RND*10)*2+2 AND L>2) 170 GOSUB 1250 180 LET F1=Y 190 LET F2=Z 200 LET T=-1 210 LET BO=1 220 LET B1=T 230 LET B2=T 240 REM * MAIN GAME * 250 IF USR HR THEN PRINT AT F1*8+8,F2;;;;"[D][E]";AT F1*8+16,F2;"[F][G]";AT AA*8+8,BB;" ";AT AA*8+16,BB;" " 255 IF USR HR THEN PRINT AT A*8+8,B;"[L][M]";AT A*8+16,B;"[N][O]" 260 IF NOT (AA<>A OR BB<>B) THEN GOTO 320 270 LET SC=SC+2 290 LET M$(AA,BB TO BB+1)=" " 300 LET M$(AA+1,BB TO BB+1)=" " 310 IF M$(A,B)=" " AND (F1<>A OR F2<>B) THEN GOTO 890 320 LET AA=A 330 LET BB=B 340 IF NOT (A=F1 AND B=F2) THEN GOTO 390 350 GOSUB 1450 360 LET F1=Y 370 LET F2=Z 380 LET SC=SC+20 390 IF NOT (A=B1 AND B=B2) THEN GOTO 450 400 LET BO=BO+1 410 LET SC=SC+L*15 420 LET T=-1 430 LET B1=T 440 LET B2=T 450 IF M$(A,B)="[H]" OR T=0 THEN GOTO 890 460 IF BO>L*3+3 THEN GOTO 1150 465 LET SC1=INT (SC/100) 467 LET SC2=SC-100*SC1 470 IF USR HR THEN PRINT AT 0,6;N$(SC1+1);N$(SC2+1) 480 IF NOT (T>0) THEN GOTO 520 490 LET T=T-1 500 IF USR HR THEN PRINT AT B1*8+8,B2;"**";AT B1*8+16,B2;"**";AT 8*(B1+1+(INT (T/2)=T/2)),B2;N$(T+1) 510 GOTO 630 520 LET Y=M(BO) 530 FOR N=0 TO INT (RND*4) 540 LET Z=INT (RND*15)*2+1 550 IF M$(Y,Z)="[H]" THEN GOTO 580 560 NEXT N 570 GOTO 630 580 LET T=50-L*4 590 LET B1=Y 600 LET B2=Z 610 LET M$(Y,Z TO Z+1)="█[A]" 620 LET M$(Y+1,Z TO Z+1)="[B][C]" 630 LET X$=INKEY$ 640 IF X$<"5" THEN GOTO 700 650 LET A=A+(2 AND X$="6")-(2 AND X$="7") 660 LET B=B+(2 AND X$="8")-(2 AND X$="5") 670 LET A=A+(20 AND A<1)-(20 AND A>19) 680 LET B=B+(30 AND B<1)-(30 AND B>29) 690 GOTO 240 700 IF X$<>"1" AND X$<>"2" OR D=A THEN GOTO 240 710 IF X$="2" THEN GOTO 780 720 FOR X=0 TO 1 730 LET M$(A+X)=M$(A+X,3 TO )+M$(A+X) 735 IF USR HR THEN PRINT AT (A+X)*8+8,1;M$(A+X) 740 NEXT X 750 IF A=F1 THEN LET F2=F2-2 760 IF A=B1 THEN LET B2=B2-2 770 GOTO 860 780 FOR X=0 TO 1 790 LET M$(A+X)=M$(A+X,29 TO )+M$(A+X) 795 IF USR HR THEN PRINT AT (A+X)*8+8,1;M$(A+X) 800 NEXT X 810 IF A=F1 THEN LET F2=F2+2 820 IF A=B1 THEN LET B2=B2+2 860 LET F2=F2+(30 AND F2=-1)-(30 AND F2=31) 870 LET B2=B2+(30 AND B2=-1)-(30 AND B2=31) 880 GOTO 240 890 REM * LOSE A LIFE * 910 IF USR HR THEN LPRINT I;100,A*8-183,A*8-168,B*8,B*8+15 920 LET L$=L$(2 TO ) 930 IF L$=" " THEN GOTO 1080 940 IF NOT (M$(A,B)="[H]" OR M$(A,B)=" ") THEN GOTO 1010 950 GOSUB 1450 960 LET A=Y 970 LET B=Z 980 LET AA=A 990 LET BB=B 1000 IF M$(A,B)=" " THEN GOTO 940 1010 IF T THEN GOTO 1060 1020 LET BO=BO+1 1030 LET T=-1 1040 LET B1=T 1050 LET B2=T 1060 GOSUB 1410 1070 GOTO 460 1080 REM * GAME OVER * 1090 IF USR HR THEN PRINT AT 72,1;"<<<<< G A M E O V E R >>>>>";AT 98,1;"<<<<<<<< AGAIN (Y/N)? >>>>>>>>" 1100 IF SC>HI THEN LET HI=SC 1110 GOSUB 1440 1120 IF INKEY$ ="Y" THEN GOTO 30 1130 IF INKEY$ <>"N" THEN GOTO 1120 1140 IF USR HR THEN RETURN 1145 STOP 1146 IF USR HR THEN RUN 1147 GOTO 30 1150 REM * NEXT LEVEL * 1160 LET L=L+(L<9) 1170 LET X$="SUPER BONUS [P]-[P] " 1175 LET X$=X$+X$+X$ 1177 LET I=1 1180 FOR X=1 TO 50 1190 IF USR HR THEN PRINT AT 176,1;X$(I TO I+29) 1200 LET I=I+2-(16 AND I=15) 1220 NEXT X 1230 LET SC=SC+55*L 1240 GOTO 120 1250 REM * SET UP SCREEN * 1260 IF USR HR THEN CLS 1262 IF USR HR THEN LPRINT I;1,0,184,0,255 1265 IF USR HR THEN PRINT AT 80,9;"PLEASE WAIT..." 1270 DIM M$(20,30) 1280 DIM M(L*3+3) 1290 FOR X=1 TO 20 STEP 2 1300 LET M$(X)="█[A]█[A]█[A]█[A]█[A]█[A]█[A]█[A]█[A]█[A]█[A]█[A]█[A]█[A]█[A]" 1310 LET M$(X+1)="[B][C][B][C][B][C][B][C][B][C][B][C][B][C][B][C][B][C][B][C][B][C][B][C][B][C][B][C][B][C]" 1320 IF X=D OR X=D+1 THEN LET M$(X)="[Q][R][Q][R][Q][R][Q][R][Q][R][Q][R][Q][R][Q][R][Q][R][Q][R][Q][R][Q][R][Q][R][Q][R][Q][R]" 1330 IF X=D OR X=D+1 THEN LET M$(X+1)="[S][T][S][T][S][T][S][T][S][T][S][T][S][T][S][T][S][T][S][T][S][T][S][T][S][T][S][T][S][T]" 1340 NEXT X 1350 FOR X=1 TO L*3+3 1360 GOSUB 1450 1370 LET M$(Y,Z TO Z+1)="[H][I]" 1380 LET M$(Y+1,Z TO Z+1)="[J][K]" 1390 LET M(X)=Y 1400 NEXT X 1405 IF USR HR THEN LPRINT XD;8,184,247,184;XD;8,176,247,176 1410 FOR X=1 TO 20 1420 IF USR HR THEN PRINT AT X*8+8,1;M$(X) 1430 NEXT X 1440 IF USR HR THEN PRINT AT 0,0;"SCORE:";TAB 11;"HIGH:";HI;TAB 21;L$;TAB 25;"LEVEL:";L 1450 REM * RANDOM POSITION * 1460 LET Y=INT (RND*10)*2+1 1470 LET Z=INT (RND*15)*2+1 1480 IF M$(Y,Z)="[H]" OR Y=19 AND Z=15 THEN GOTO 1460 1490 RETURN 1500 LET HR=19473 1502 FAST 1504 IF USR HR THEN CLS 1505 DIM N$(100,2) 1506 FOR N=1 TO 100 1508 LET N$(N)=(STR$ (99+N))(2 TO ) 1510 NEXT N 1520 IF USR HR THEN RUN 1530 IF USR HR THEN PRINT ;;;"[B][L][O][C][K] [B][U][S][T][E][R]------------";AT 20,10;"[B]Y [A]DAM [B]ULL";AT 40,2;"[Z][X] [C][O][M][P][U][T][I][N][G]: [V][O][L]. 2, [N][O]. 8";AT 60,0;"[A] PROGRAM ORIGINALLY WRITTEN FORTHE [Z][X] [S][P][E][C][T][R][U][M] AND CONVERTED TO[S][R][A][M] [H][I]*[R][E][S] [B][A][S][I][C] BY [G]REGORY [C]. [H]ARDER.";AT 140,3;"[P]RESS ANY KEY TO CONTINUE." 1540 IF USR HR THEN PAUSE 4E4 1550 REM * U.D.G. DATA * 1560 IF USR HR THEN LPRINT UDG;"[A]";"F8,F4,F2,F2,F2,F2,F2,F2[B]FF,FF,FF,FF,40,20,1F,00[C]F2,F2,F2,F2,0A,06,FE,00[D]00,00,0F,3F,7F,7F,7F,7F" 1570 IF USR HR THEN LPRINT UDG;"[E]";"3C,3C,18,F8,D8,D8,D8,D8[F]7F,70,40,00,00,00,00,00[G]D8,F8,18,18,18,18,18,00[H]60,E7,FF,3F,39,39,3F,1E[I]0C,CE,FE,F8,38,38,F8,F0[J]1E,0F,1C,3C,F7,E3,60,00" 1580 IF USR HR THEN LPRINT UDG;"[K]";"F0,E0,70,78,DE,8E,0C,00[L]07,07,3F,0F,1F,3D,39,3F[M]C0,C0,F8,E0,F0,78,38,F8[N]7B,5C,4F,27,0C,58,70,00[O]BC,74,E4,C8,60,34,1C,00[P]3C,FF,5A,7E,A5,18,24,42" 1590 IF USR HR THEN LPRINT UDG;"[Q]";"FF,AA,D5,AA,D5,AA,D5,AA[R]F8,B4,52,B2,52,B2,52,B2[S]D5,AA,D5,FF,40,20,1F,00[T]52,B2,52,F2,0A,06,FE,00" 1600 IF USR HR THEN CLS 1610 IF USR HR THEN PRINT ;;;"[B][L][O][C][K] [B][U][S][T][E][R]------------",,,"[U]SE THE CURSOR KEYS TO STEER THEMAN AROUND THE SCREEN. [I]F YOU GOOFF ONE EDGE OF THE SCREEN YOU WILL APPEAR ON THE OPPOSITE SIDE" 1620 IF USR HR THEN PRINT "[Y]OU MUST DEFUSE THE TIME BOMBS BEFORE THEY DETONATE, BUT YOU MAY ONLY DO THIS ONCE THEY ARE ACTIVATED." 1630 IF USR HR THEN PRINT ,,"[Y]OU MAY NOT MOVE ONTO AN EMPTY SPACE, OR ONTO AN UNACTIVATED BOMB." 1640 IF USR HR THEN PRINT ,,"[T]HE [R][O][W] OF BLOCKS YOU ARE ON CANBE SHIFTED LEFT OR RIGHT USING KEYS 1 AND 2. [T]HIS MAY HELP YOU TO REACH A BOMB, ETC.",,,,,"[P]RESS ANY KEY TO CONTINUE." 1650 IF USR HR THEN PAUSE 4E4 1660 IF USR HR THEN CLS 1670 IF USR HR THEN PRINT "[H]OWEVER, AFTER LEVEL 2, THERE WILL BE A ROW OF GRAY BLOCKS WHICH CAN[,]T BE SHIFTED.",,,"[B]ONUS POINTS ARE GIVEN FOR REACHING A FLAG.";AT 40,0; 1680 IF USR HR THEN PRINT ;;;;,,,,"█[A]";;;" : [A] SAFE BLOCK";;;;,"[B][C]",,,,"[D][E]";;;" : [A] FLAG";;;;,,"[F][G]",,,,"[H][I]";;;" : [A]N UNACTIVATED BOMB";;;;,"[J][K]",,,,"[L][M]";;;" : [Y]OUR MAN";;;;,,"[N][O]" 1690 IF USR HR THEN PRINT AT 160,2;;;"[G][O][O][D] [L][U][C][K]...[P]RESS ANY KEY.";;;; 1700 IF USR HR THEN PAUSE 4E4 1710 RETURN 9000 SAVE "BLOCK[2]" 9010 RUN ```