Pinball

Products: Pinball
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Game

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:

  1. Line 1 — A REM statement containing the entire machine code binary for the pinball game, stored as raw bytes within the BASIC line.
  2. Line 2POKE 16418,0 sets the low byte of the RAMTOP system variable, protecting the REM block and its machine code from being overwritten.
  3. Line 3RAND USR 16550 transfers execution to the machine code embedded in the REM statement at line 1. Address 16550 points into the body of the REM data.
  4. Line 4SAVE "PINBALL" saves the program to tape.
  5. Line 5STOP halts BASIC if execution somehow falls through.
  6. Line 6 — A REM string providing a user hint: “TO START TYPE GOTO 7”.
  7. Line 7RUN re-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; RAND discards 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.
  • RUN at line 7 (reached via GOTO 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

Appears On

Related Products

High-scoring, fast-paced pinball game includes shooting the ball, bumper action, nudge for those good bounces and flip-action flippers. Free ball...

Related Articles

Related 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.

People

No people associated with this content.

Scroll to Top