Retrochallenge 2015/01

Additional notes and info.

Please see the Blog thread on:

rc2015 01

For full details of this Retrochallenge.

The game loop timing experiment BASIC code:
frametest.bas

   5 POKE 23672,0
  10 REM Game Loop
  20 LET t1=PEEK 23672
  50 PRINT AT 0,0;t1
  55 PAUSE INT (RND*3)+1
  60 GO SUB 1000
  70 GO TO 10
1000 REM wait for timer
1010 IF PEEK 23672<5 THEN GO TO 1010
1020 BEEP 0.01,10
1030 POKE 23672,0
1040 RETURN

Explanation:
5 - reset the FRAMES system variable (Least significant byte)
20 to 55 - pretend game loop code (with random duration)
60 - call to synchronise to timer
70 - continue game loop
1010 - the synchronise code (ie. wait for frames counter to get to 4)
1020 - perform sound
1030 - reset the FRAMES system variable
1040 - return from subroutine

Input Test (first draft)
inputtest.bas

   5 POKE 23672,0
  10 REM Game Loop
  20 LET t1=PEEK 23672
  30 GO SUB 2000
  50 PRINT AT 0,0;lft;" ";rht;"  ";fre
  55 PAUSE INT (RND*3)+1
  60 GO SUB 1000
  70 GO TO 10
1000 REM wait for timer
1010 IF PEEK 23672<5 THEN GO TO 1010
1020 BEEP 0.01,10
1030 POKE 23672,0
1040 RETURN
2000 REM input
2010 LET lft=0: LET rht=0: LET fre=0
2015 LET joy=IN 31
2020 IF IN 65022<191 OR IN 49150<191 THEN LET fre=1
2025 IF joy>=16 THEN LET fre=1: LET joy=joy-16
2027 IF joy>=8 THEN LET joy=joy-8
2030 IF IN 65278<191 THEN LET lft=1
2040 IF IN 32766<191 THEN LET rht=1
2050 IF joy>=4 THEN LET joy=joy-4
2060 IF joy>=2 THEN LET joy=joy-2: LET lft=1
2070 IF joy>=1 THEN LET joy=joy-1: LET rht=1
2080 RETURN

The above code supports Keyboard input (bottom row keys, and top row for fire), also supports Kempston joystick.

However a small issue exists if the Kempston interface isn't present which is fixed in the below version:
inputtest2.bas

   5 POKE 23672,0
  10 REM Game Loop
  20 LET t1=PEEK 23672
  30 GO SUB 2000
  50 PRINT AT 0,0;lft;" ";rht;"  ";fre
  55 PAUSE INT (RND*3)+1
  60 GO SUB 1000
  70 GO TO 10
1000 REM wait for timer
1010 IF PEEK 23672<5 THEN GO TO 1010
1020 BEEP 0.01,10
1030 POKE 23672,0
1040 RETURN
2000 REM input
2010 LET lft=0: LET rht=0: LET fre=0
2015 LET joy=IN 31: IF joy=255 THEN LET joy=0
2020 IF IN 65022<191 OR IN 49150<191 THEN LET fre=1
2025 IF joy>=16 THEN LET fre=1: LET joy=joy-16
2027 IF joy>=8 THEN LET joy=joy-8
2030 IF IN 65278<191 THEN LET lft=1
2040 IF IN 32766<191 THEN LET rht=1
2050 IF joy>=4 THEN LET joy=joy-4
2060 IF joy>=2 THEN LET joy=joy-2: LET lft=1
2070 IF joy>=1 THEN LET joy=joy-1: LET rht=1
2080 RETURN

(modification is on line 2015)

Stop SHIFT-BREAK
stopbreak.bas

  10 REM disable break
  20 LET nobreak=PEEK 23613-2
  30 POKE 23613,nobreak
  40 FOR a=1 TO 1000
  50 PRINT AT 0,0;a;"    "
  60 NEXT a
  70 POKE 23613,nobreak+2

The above code prevents you being able to break the code whilst the loop is running. Line 70 resets BREAK functionality as otherwise the Spectrum can crash when exiting back to BASIC.

Revised Input test with SHIFT-BREAK Disabled.
inputtest3.bas

  10 LET nobreak=PEEK 23613-2
  20 POKE 23613,nobreak
 200 REM Game Loop
 210 POKE 23672,0
 220 LET RETURN =240
 230 GO TO 2000
 240 PRINT AT 0,0;lft;" ";rht;"  ";fre
 250 LET RETURN =200
 260 GO TO 1000
1000 REM wait for timer
1010 IF PEEK 23672<10 THEN GO TO 1010
1020 BEEP 0.01,10
1030 POKE 23672,0
1040 GO TO RETURN
2000 REM input
2010 LET lft=0: LET rht=0: LET fre=0
2015 LET joy=IN 31: IF joy=255 THEN LET joy=0
2020 IF IN 65022<191 OR IN 49150<191 THEN LET fre=1
2025 IF joy>=16 THEN LET fre=1: LET joy=joy-16
2027 IF joy>=8 THEN LET joy=joy-8
2030 IF IN 65278<191 THEN LET lft=1
2040 IF IN 32766<191 THEN LET rht=1
2050 IF joy>=4 THEN LET joy=joy-4
2060 IF joy>=2 THEN LET joy=joy-2: LET lft=1
2070 IF joy>=1 THEN LET joy=joy-1: LET rht=1
2080 GO TO RETURN

The full listing of the game written for this challenge is available to club members:

submarine rescue listing


Membership number
Passcode