Skip to content

Read a command on Commodore VIC-20

Reuse the actual machine-specific reader, with its caller, state, ownership and a diagnosed input mistake.

Enter the complete demo.bas in Commodore VIC-20 BASIC and RUN. Submit GO, then Return. One accepted command advances the displayed turn; another gives two.

Commodore VIC-20 native caller after accepted input.
Captured from the running caller in the configuration below.

Take the reader

Copy read-command.bas into free line numbers, then call it with GOSUB 3000. It replaces A$; the caller checks that value before updating N. Keep N’s initialisation outside the repeated path. Renumber the GOSUB and routine together.

The reusable reader

read-command.bas
3000 INPUT A$
3010 RETURN

INPUT A$ returns a submitted line. The example accepts GO; held-key repeat during editing belongs to the ROM, not to game turns.

BASIC owns the keyboard buffer, line editor, return stack and variable storage. The global variable and line-number names belong to your program: reserve or rename them consistently. INPUT waits; no animation or deadline code in your main path can run during that wait.

Fit it into a program

The complete numbered program is caller.bas, draw.bas, sound.bas and read-command.bas together. The reader does not accept a move on its own; the IF in the caller does that.

Initialise once, read, validate, then update

caller.bas
10 N=0
20 PRINT CHR$(147);"TURN";N
21 GOSUB 1000
30 GOSUB 3000
40 IF A$="GO" THEN N=N+1:GOSUB 2000
50 GOTO20

Change it and recognise a mistake

Add another string-to-action branch. Do not assume a string returned by INPUT is already a valid game command.

This deliberately broken caller reuses an accepted command instead of reading another one. The world advances without you. Restore the GOSUB before the validation/update path; the working caller waits at zero until input arrives.

Deliberately broken input/update path

stale-command.bas
10 N=0
20 PRINT CHR$(147);"TURN";N
21 GOSUB 1000
30 A$="GO"
40 IF A$="GO" THEN N=N+1:GOSUB 2000
50 GOTO20
1000 PRINT "XXX"
1010 PRINT "X X"
1020 PRINT "XXX"
1030 RETURN
2000 POKE 36878,15:POKE 36876,220
2010 FOR J=1 TO 200:NEXT J
2020 POKE 36876,0
2030 RETURN
3000 INPUT A$
3010 RETURN
Commodore VIC-20 deliberately broken input caller.
Observed fault; use the working caller to repair it.

The complete caller

Working setup and integration

demo.bas
10 N=0
20 PRINT CHR$(147);"TURN";N
21 GOSUB 1000
30 GOSUB 3000
40 IF A$="GO" THEN N=N+1:GOSUB 2000
50 GOTO20
1000 PRINT "XXX"
1010 PRINT "X X"
1020 PRINT "XXX"
1030 RETURN
2000 POKE 36878,15:POKE 36876,220
2010 FOR J=1 TO 200:NEXT J
2020 POKE 36876,0
2030 RETURN
3000 INPUT A$
3010 RETURN

For more responsive controls, compare polling, buffering and press edges in input choices.

Verification and sources

Target: unexpanded PAL VIC-20, Commodore BASIC. These callers were executed with released Emu198x 0.44.1; assembly uses Asm198x 0.0.71. The sample folder contains reproduction instructions and retained observations. The independent checker binds source, native captures and actual output; its rejection tests exercise wrong state, missing files and false audio claims.

This qualifies the named emulator/firmware path. Pitch accuracy, original hardware and other peripherals require their own observations.

Commodore, VIC-20 Programmer’s Reference Guide: BASIC INPUT/GOSUB and VIC sound registers $900A–$900E.