Pinball is a machine code game stored within a REM statement at line 1, loaded into memory and executed via RAND USR 16550 at line 3. The program uses POKE 16418,0 to set the system variable RAMTOP, ensuring the machine code embedded in the REM block is preserved in memory. Line 4 saves the program with the filename “PINBALL” before the STOP at line 5 halts BASIC execution. A hint at line 6 instructs the user to type GOTO 7 to restart, which triggers RUN at line 7 to re-execute the loader sequence.
Program Analysis
Program Structure
The program is organized as a compact loader/launcher wrapper around a large machine code payload. The BASIC lines serve only to set up memory, execute the machine code, and provide a save/restart mechanism:
- Line 1 — A
REMstatement containing the entire machine code binary for the pinball game, stored as raw bytes within the BASIC line. - Line 2 —
POKE 16418,0sets the low byte of the RAMTOP system variable, protecting the REM block and its machine code from being overwritten. - Line 3 —
RAND USR 16550transfers execution to the machine code embedded in the REM statement at line 1. Address 16550 points into the body of the REM data. - Line 4 —
SAVE "PINBALL"saves the program to tape. - Line 5 —
STOPhalts BASIC if execution somehow falls through. - Line 6 — A
REMstring providing a user hint: “TO START TYPE GOTO 7”. - Line 7 —
RUNre-executes the program from line 1, providing a simple restart path.
Machine Code Embedding in REM
Storing machine code inside a REM statement is a well-established technique. The BASIC interpreter skips the content of REM lines entirely, so arbitrary binary data — including Z80 opcodes — can be placed there without interfering with BASIC tokenization. The RAND USR call at line 3 computes the address 16550 and jumps the Z80 program counter directly into the REM body, beginning game execution.
The POKE 16418,0 at line 2 manipulates the RAMTOP system variable. By lowering RAMTOP, CLEAR or NEW operations are prevented from reclaiming the memory area occupied by the REM block, keeping the machine code intact across BASIC operations.
BASIC Loader Idioms
RAND USR address— Standard idiom for calling machine code without triggering an error;RANDdiscards the return value cleanly if the machine code returns.POKE 16418,0— Adjusts RAMTOP to protect the machine code payload in the REM block from memory management routines.RUNat line 7 (reached viaGOTO 7) — Restarts the program from line 1, re-initializing and re-launching the game without needing to reload from tape.
Save Line
Line 4 saves the combined loader and machine code payload as "PINBALL". Because the machine code resides inside the BASIC program’s REM line, a single SAVE command preserves everything needed to reload and run the game.
Notable Observations
- The decoded content of the REM block — visible as a dense sequence of BASIC tokens and escape characters in the listing — represents raw Z80 machine code bytes that happen to decode as BASIC tokens when viewed through the tokenizer. This is an artifact of how the listing tool renders the binary data, not actual BASIC logic.
- The program is entirely self-contained: tape load, memory protection, execution, and re-run are all handled by seven short BASIC lines wrapping the machine code payload.
- Address 16550 decimal is 0x40A6 hex, which falls at a specific offset into the REM block beginning at line 1’s data area, consistent with the standard memory map where BASIC program storage begins just above the system variables.
Content
Image Gallery
Source Code
1 REM [:]#5 [(]▒4 ▀ ,#SGN #[1]#[2]#[3]#[6]#[7]#[8]#▒#INT # 15▙RND▞;Q 7( CLS E£RND)- ;▞\~~Q█7( CLSQ[0]77▞4Q▄7( CLS7Q█)3 ▞+;Q█77Q█( RUN FF▞▀FQ[~~]( CLS▞\~~)5 LEN Q█ GOSUB #( SAVE FFQ▄▞▌;Q[:]( CLS76[2]RNDFFQS7▞▞)5 Q[:];( CLSFF▞" GOSUB #( UNPLOT Q▄▞▒;Q█( CLS ▞▌FQ▄( CLS▞▒F( CLEAR▞▌FQ▄( CLSF▞▒)5 LEN Q█ GOSUB #( SAVE Q▄FFQ▄▞▌;Q[:]( CLS7QTF▞▌;Q[:]( CLSY(M#INKEY$ E£RND)▚ ;▞.Q▄7( CLS)5 GOSUB # GOSUB #6[:]RND7Q<7 FF;▞\~~Q█;( CLSE£RND)S▘;LN #PIE£RND)LN ;LN #PIE£RND)<> ;LN #PIE£RND)# ;)5 ▞+Q█;( CLSE£RND) CLEAR▘;Q*7Q[I]7Q*E£RND)? ;QB7QA7QL7QL77Q06[4]RNDE£RND)▚ ;Q 7Q ▞\~~7Q▄( CLS7QT777QI777QM777QE777QX)J LEN GOSUB #Q█)5 GOSUB #Q█6## E£RND)*▝;)5 Q*;Q*7Q*;7▞▀Q*F( CLS;7▞▖Q*7( CLSLN ▚PILN CHR$ PILN K#LN [=]# #""#11Q*)4 ;Q*7Q*7Q*;Q*TAN 11Y M[$]RND=;QLTAN E£RND)▗▝;▞▖LN ""PIE£RND)#▝;▞▀LN ""PIE£RND)#▝;▞▝LN ""PIE£RND)B▝;▞▘LN ""PIE£RND)▛▝;Q/TAN Q/7Q[▒]( CLSTAN 111)B▝11111111E£RND)<=▝;▞▛Q\~~7( CLS6[>]RNDQ▒7)5 6[=]RNDQ▒LEN GOSUB #Q ;76[-]RNDQ▒ GOSUB #Q GOSUB #Q E▙RNDQO7;;6[(]RND5[6]RNDQ 5#RNDQ TAN D;DDD;6MRNDTAN 111111111E£RND) SCROLL▝;6[/]RND)5 LEN Q▒ GOSUB #Q GOSUB #Q ;;76[,]RNDQ▒ GOSUB #Q ;7Q▒6[0]RND▞▛7Q\~~( CLSE▙RNDQO#▜#Q TAN LEN GOSUB #TAN 111)3 E£RND;# RETURN█4▝Y[0]W RETURN[A]4▌Q[0]F/ LOAD #( FASTTAN 11###ACS COS ACS ""#E£RND)\,, ;Q[1]7Q[0]7Q[0]7Q[0]#3# 1U[▒]RND▞▖??S$( IF U[▒]RND RETURN▘C▖Y /▝Y▘M["]RND ACS #C▖A COPY/▝A U[▒]RND?K▖I▘/G?K▖I COPY/9?K▖I4/2?K▖I THEN/*?K▖I5/(?K▖I TO /\,,?K▖I6/▝I STEP U[▒]RND RETURN▘4▝A 6▜RNDTAN 11E▚RNDF#[P]4 CLSTAN 111111111111111111111LN CHR$ PILN K#E▙RNDQ TAN 11111U[▒]RNDACS #C▀▛/▞ACS #C▘??M[▒]RNDLN [W]#TAN [W]#TAN )K /▀)# E▚RND;6▚RND#ACS #COS LN ##A▞6▚RNDTAN E£RND) RETURNCOS NOT /11111111111111▘▝▖▒(4RND█ GOSUB COPY THEN COPY▘ COPY COPY1111LN -#)PEEK ▝;QO6▙RNDY4M[▒]RND E[4]RND# RETURN5ASN [S]#W#E[:]RNDQ LN [J]# LN [W]# LN >=#LN [~~]# ACS #C▒ACS #C\,,ACS #C\~~▘ ▝/▒▘ ▘/▀▘# EORNDA \,,6▚RND LN [W]# E▙RNDQ GOSUB #▜RND;#LN T# RETURN█ASN SLOW# RETURN▄ASN USR # RETURN*ASN LEN # RETURN▒ASN ## RETURN<ASN ## RETURN/ASN [W]# RETURN\~~ASN STOP# RETURN[▒]ASN ## RETURN[~~]ASN ## RETURN[<]ASN SLOW# RETURN[>]ASN [)]# RETURN[:]ASN ##ACS #TAB ## 6▙RNDQOU["]RNDACS #C▌LN ##/=E▚RND)H GOSUB ##CHR$ ▘ PAUSE [Y]#5-▘6▚RND LN E# LN IF #E▙RNDQO 5[7]RNDQ 7Q LN [V]▝# RETURN COPY4\,,LN CHR$ PILN K####5[6]RNDO PRINT # RETURN▝ IF \~~# GOSUB #▚RND== LET #G# LET ACS #4▌) ▘//ACS #4▝/ PRINT ACS #4▌) ▝/\,,ACS #4▝/ PRINT ) ▀ GOSUB #[P]# GOSUB # THEN# PRINT ACS #ATN O# LET PRINT ACS #ATN G# LET ACS #C▒ACS #C▖ACS #4▛ PRINT LN /# LET /▀LN CHR$ PIACS #C▒ACS #C▖ACS #4▌LN [I]#/▀LN K## SAVE #U[7]RND RETURN ASN COS # GOSUB #[P]# GOSUB #▚RNDACS #C▝/-ACS #C▞U[▒]RND?/£ACS #C▖Y▒/▖LN █# LN [E]#M[▒]RNDLN [W]# E▙RND GOSUB #▜RNDQ ;; 6▙RND### #O# GOSUB #[P]# GOSUB #▚RNDACS #C▖Y▘/2ACS #C:U[▒]RNDACS #C▖Y▘/?▛/£ACS #C▖#K# LN █# LN [E]#M[▒]RNDLN [W]##[E]#11111111111111Y GOSUB #▙RNDE[>]RND FASTLN ##4▝Y▝ LPRINT 7 FASTLN ##4▝Y▘ LPRINT Q 7 FASTLN ##4▝Y▒ LPRINT Q ▘5 LEN GOSUB PI FASTLN ##4▝Y▒ LPRINT F FASTLN ##4▝Y▖ LPRINT Q▒F FASTLN ##4▝Y▝ LPRINT LEN GOSUB PI7 FASTLN ##4▝Y( LPRINT 7Q▒ FASTLN ##4▝Y4 LPRINT LEN GOSUB PILN ##4▝YRNDM[7]RND5#RNDOTAN 4▝Y▖ LPRINT Q 7 FASTLN ##4▝Y▒ LPRINT ▘5 LEN GOSUB PI FASTY GOSUB #▙RNDE[/]RND FASTLN ##4▝Y▝ LPRINT Q 7 FASTLN ##4▝Y▖ LPRINT Q 7 FASTLN ##4▝Y▒ LPRINT ▘5 LEN GOSUB PI FASTLN ##4▝Y▒ LPRINT F FASTLN ##4▝Y( LPRINT Q▒F FASTLN ##4▝Y▝LEN LPRINT GOSUB PI FASTQ▒LN ##4▝44 LPRINT 7 FASTLN ##4▝Y( LPRINT LEN GOSUB PIF FASTLN ##4▝YRND LPRINT M[8]RND5#RNDOTAN 111EORNDACS #4▖Y█/▝Y4#▘#1111 GOSUB #▙RND FOR Q FOR F Q[<]6[:]RNDFQO6▙RND Y▝M[▒]RND5K 6##LN INPUT ##CODE #1Y(M[▒]RNDE▚RND8886▚RND#CODE ##111111111111 PRINT Y\~~M## LET TAN 111111111111111111# ▌▞▝ REM E£RND) RETURNCOS NOT /1111111111Q ▞\~~LN ##LN #####RND RETURN▌TAB ##LN ▚PI▞\~~)0 LN #####1111111U[▒]RNDACS #C▖Y▝/£ACS #C▖Y▘/ PLOT ????M[▒]RNDLN INPUT ##SIN #4▛)6 GOSUB #▜RND/6# RETURN▘4▛) COPY COPY GOSUB #▜RND RETURN64▛)4 GOSUB #▜RND RETURN STEP 4▛) THEN COPY GOSUB #▜RNDLN [W]##PI#1111111)PI U[▒]RNDE▜RNDACS #C▀;/▖LEN GOSUB #6▜RNDLN [W]#LN ###PI#111111111111111111LN ##LN ##Y▝M[▒]RNDLN INPUT # #CODE # 5[6]RNDQ 5#RNDQ TAN ▖▛▛/▘?M[▒]RNDLN [W]#5 ▝6▚RND#EXP #E▚RND) ▘#[N]#▘ REM 11111111111111111E##Q )5 ;Q TAN 11111111U[▒]RNDACS #C\,,EORNDACS #C▝/$U["]RNDACS #C▞U[▒]RND?/▖U[▒]RND▛M[▒]RND▞▘LN ##LN INPUT ##CODE #LN [W]##PI#1111111##E£RND;LEN █#TAN 11111U[~~]RNDACS ZACS ZACS Z RETURN34▌LN ## U[~~]RND RETURN COPY4"▞\~~)0 LN ##LN [=]#E▙RND GOSUB #▜RND;;6▙RNDLN ""##CODE # #▞\~~LN ###5[~~]RND# RETURN[I]ASN [*]# RETURNI4"ACS LIST )▝ LN (##3# RETURNM4"ACS CONT )▀ LN (##3# RETURNE4"ACS STEP )▖ LN (##3# RETURNX4"ACS **)▌ LN (##3# RETURNS4"ACS SQR )▒ LN (##3#ACS SAVE )▘ LN (#)▛ LN )##3##ACS "")\~~ LN (##3#1111111111111111U[$]RNDACS SIN M[$]RND GOSUB #▜RND# RETURN54G GOSUB #[-]RND<LEN GOSUB # IF ># E▙RNDQ FQO6▙RND#CODE #E▙RNDQ 7QO6▙RND#CODE #LEN )5 GOSUB # FASTE▙RNDQ LPRINT QO6▙RNDLN ###CODE # FASTE£RND) PLOT ▝; FOR LPRINT FAST GOSUB # LPRINT **AT LN ▚PI#""#111111111111111111111U[$]RNDACS #4\,,5 ▞6▚RND#USR #E▙RND)5 ;# STOP##4\,,5 ▞6▚RND#USR #E▙RND)5 ;E▙RNDQ 7Q█7 QO6▙RNDE[2]RNDQ ▞#LN ###Z#11E[2]RNDQ )4 LEN GOSUB #Q█#[,]#11111111 FASTE#RND76#RNDACS # LPRINT COS )7 ;Q[P]TAN ;LN [V]▝# RETURN CLEAR4 SAVE # RETURN LOAD COS RETURN TO COS RETURN[Z]COS / GOTO 1111111111E▙RNDQ 7# RETURN "" FAST5[O]#O# LPRINT RETURN COPY4▝6▙RNDTAN RETURN█""/ RUN 11111111111111111111E▙RNDQ 7/▞E▙RNDQ F)[N]#, RETURN▘ LIST W>#J RETURN COPY"" 6▙RNDQOTAN Z# \,,# Y M[N]##Z#E[2]RNDQ[>])4 LEN GOSUB #Q TAN 11111E[4]RNDP#""#LN ### RETURN COPY4 SAVE E£RNDTAN 1E£RND77Q█TAN 11E##Q█)5 ;Q█TAN 11111111 $ ▀1LN ""#)▀ ;QG7QA7QM7QE7QO7QV7QE7QR), ;QP7QR7QE7QS7QS77QP77QT7QO77QR7QE7QS7QT7QA7QR7QTLN [=]# Y▒M▗RNDLN E#E£RND777Q[G]7777Q[O]LN COS #LN E##[S]# 111111111LN [V]▝# RETURN COPY4 SAVE LN ##E£RNDTAN E£RND▘▛▝)4 \,,▞▖#J RETURN COPY"";( SAVE LN ▚PI▞▌)0 LN ##TAN 111EORNDACS #C▀Y▒TAN ACS #C▀Y4TAN Y█TAN LN [V]▝# RETURN CLEAR""# RETURN TO 4▖ LPRINT #[A]RND RETURN#"" LPRINT SIN ACS #4▛ ACS #COS ?M[▒]RNDTAN C NEXT TAN # ▝[W] REM 111▞\~~LN ##U[▒]RNDACS #C▖▛▛/▘?M[▒]RNDLN [W]#5 ▀6▚RNDLN INPUT ##EXP #11111Y M[$]RNDTAN 1111U#RND RETURN▘ASN ##U[7]RND RETURN▒C▌ RETURN▘TAB ###Z###Z#111E£RND)PEEK ▝;6▙RNDLN [V]▝# RETURN COPY4 SAVE LN CHR$ PILN K#E£RNDTAN 11U#RND RETURN▘C:U[8]RND RETURN▝C▖ RETURN▖4▀#Z#U[8]RND RETURN ASN Z##ACS #111LN ##LN ##UORNDACS #C▖Y▝/▝Y▒M[▒]RNDLN INPUT ##CODE #11E£RND7QT7QI7QM7QE7QX7Q 7QT7QS7Q17Q07Q07Q07Q Y M[~~]RNDTAN 111111111111111111111111111E£RND▞$7Q ( CLSE£RNDTAN 1111111111111111111111111111
2 POKE 16418,0
3 RAND USR 16550
4 SAVE "PINBAL[L]"
5 STOP
6 REM "TO START TYPE GOTO 7
7 RUN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.