Skip to content

Read a command on Commodore PET

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

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

Commodore PET 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 whole line; the caller recognises GO. N survives the subroutine. The ROM owns keyboard scanning and its editing buffer.

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

Use another string or add a dispatch table after INPUT. Changing case handling is a separate decision.

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 59467,16:POKE 59466,15:POKE 59464,51
2010 FOR J=1 TO 200:NEXT J
2020 POKE 59467,0
2030 RETURN
3000 INPUT A$
3010 RETURN
Commodore PET 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 59467,16:POKE 59466,15:POKE 59464,51
2010 FOR J=1 TO 200:NEXT J
2020 POKE 59467,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: 40-column PET firmware configuration with emulated VIA/CB2 sound output. 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, PET/CBM documentation: BASIC INPUT and GOSUB/RETURN; MOS Technology 6522 VIA data sheet: ACR, shift-register modes and Timer 2; PET sound requires the appropriate CB2 connection.