Skip to content

Read a command on MSX1

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

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

MSX1 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$ waits for a line and replaces A$. GO is accepted by the caller. The test’s byte at 40000 mirrors the game count; it is not the input routine’s output.

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 CLEAR 200,39999
20 N=0:POKE 40000,0
30 CLS:PRINT "TURN";N
31 GOSUB 1000
40 GOSUB 3000
50 IF A$="GO" THEN N=(N+1) AND 255:GOSUB 2000
60 POKE 40000,N
70 GOTO 30

Change it and recognise a mistake

Use a different command string or connect the reader to a parser. The separate assembly loop shows physical press edges.

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 CLEAR 200,39999
20 N=0:POKE 40000,0
30 CLS:PRINT "TURN";N
31 GOSUB 1000
40 A$="GO"
50 IF A$="GO" THEN N=(N+1) AND 255:GOSUB 2000
60 POKE 40000,N
70 GOTO 30
1000 PRINT "XXX"
1010 PRINT "X X"
1020 PRINT "XXX"
1030 RETURN
2000 SOUND 0,100:SOUND 1,0:SOUND 7,62:SOUND 8,15
2010 FOR J=1 TO 200:NEXT J
2020 SOUND 8,0
2030 RETURN
3000 INPUT A$
3010 RETURN
MSX1 deliberately broken input caller.
Observed fault; use the working caller to repair it.

The complete caller

Working setup and integration

demo.bas
10 CLEAR 200,39999
20 N=0:POKE 40000,0
30 CLS:PRINT "TURN";N
31 GOSUB 1000
40 GOSUB 3000
50 IF A$="GO" THEN N=(N+1) AND 255:GOSUB 2000
60 POKE 40000,N
70 GOTO 30
1000 PRINT "XXX"
1010 PRINT "X X"
1020 PRINT "XXX"
1030 RETURN
2000 SOUND 0,100:SOUND 1,0:SOUND 7,62:SOUND 8,15
2010 FOR J=1 TO 200:NEXT J
2020 SOUND 8,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: MSX1 NTSC, recorded MSX BASIC/BIOS. 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.

ASCII/Microsoft, MSX Technical Data Book: BASIC INPUT, CLEAR, SOUND, GOSUB/RETURN; PSG and BIOS ownership.