Last modify 17 September 2017.
Back to "Programming the Tomy Tutor" | Back to the main page
Two keywords at work in the original Tutti.
All tokens have byte values of hex $80 or higher.
Several things become apparent when examining the inner workings of Tomy BASIC. Many tokens seem grouped by function; $BA-$BD, logical operators; $BE-$C5, binary operators; $9C-$AA (except RUN, $A9), program output and screen display; $CB-$DC, function calls. There are several large gaps in the keyword table; $DD-$FB (except $E7, see below) is unoccupied, but TAB and # occupy $FC and $FD. There is also a gap between $AB-$AF (except $AD, see below).
There is a significant number of "crash" tokens that when inserted into memory cause the system to lock up when LISTed (and presumably don't execute either). These tokens are $99, $9F, $AD, $B9 and $E7. Avoid!
Curiously, some direct mode keywords have tokens, which may indicate Tomy once considered allowing such instructions to be programmatically executable, and some keywords that you may think should be direct-only, like TRACE, can be used in a program as well (see that section).
|AUTO a,b||none||Initiates automatic line numbering. Arguments a and b are optional; a specifies starting number and b the increment. Defaults to 100 and 10, respectively.|
|CLRSTP a,b||$8F||Clears a breakpoint from lines a and b.|
|LIST a-b||none||Standard BASIC; a and b are optional.|
|LLIST a-b||none||Same as LIST, but sends to the printer. If you have one, that is, or are using the printer interface (or a Pyuuta with a BASIC-1 cartridge).|
|LOAD file||none||Loads a file from tape. file must be a literal (can't be a variable).|
|MENU||none||Exits to the Tomy menu.|
|NEW||none||Clears the current program. In reality, completely resets the BASIC interpreter (as if you'd exited by typing MENU and selected BASIC again).|
|RENUM a,b||none||Renumbers previously entered lines. Arguments a and b are optional; a specifies starting number and b the increment. Defaults to 100 and 10, respectively.|
|RUN a||$A9||Standard BASIC; a is optional.|
|SAVE file||none||Saves a file to tape. file must be a literal (can't be a variable).|
|STOP a,b||$8E||Sets a breakpoint at lines a and b; execution is continued with CONT. STOP by itself can be used in a program, as in any standard BASIC, but STOP with parameters as shown here can only be used in direct mode.|
|VERIFY file||none||Checks the integrity of tape file file. file must be a literal (can't be a variable).|
|AND, OR, XOR, NOT||$BB, $BA, $BC, $BD||Standard BASIC. Work as both logical and bitmask operators, though this behaviour is not documented in either manual.|
|ATN(a)||$CC||Standard BASIC. a must be in radians.|
|CHR$(a)||$D6||Standard BASIC, but undocumented.|
|CLS||$A0||Clears the screen. No arguments.|
|COLOR(a,b,c)||$A1||Sets the colour screen elements. a is the character set, usually 0;
b is the foreground colour and c is the background colour. Although the
Japanese manual claims it cannot be used in direct mode, this is
merely because BASIC will set everything back to the default colours
immediately after it executes; no error is actually generated.
The Japanese BASIC-1 manual explains the character set parameter, where character refers to the MCELL/SCELL number:
0: characters 30-127
By using sets 1, 2 or 3, you can set only certain characters' colours instead of the entire Latin character set (0).
|COS(a)||$CD||Standard BASIC. a must be in radians.|
|DATA, READ||$93, $97||Standard BASIC. You may specify multiple variables to READ.|
|DEF fun(lambda)=expression||$89||Allows function definition. Example: DEF MINE(A)=1+A|
|DIM v(a[,b...])||$8A||Standard BASIC.|
|END, STOP||$8B, $8E||Standard BASIC.|
|EXP(a)||$CE||Standard BASIC. Raises e to the ath power.|
|FOR, TO, STEP, NEXT||$8C, $B1, $B2, $96||Standard BASIC.|
|GCELL(a,b,c)||$A5||Get a screen cell into a variable. a is the vertical coordinate (1-24), b is the horizontal (1-32), and c is the name of the variable to save it to. The screen code is the same as that used for SCELL and MCELL.|
|GOSUB, RETURN||$87, $88||Standard BASIC. Computed GOSUBs are not allowed.|
|GOTO||$86||Standard BASIC. Computed GOTOs are not allowed.|
|IF, THEN, ELSE||$84, $B0, $81||Standard BASIC. THEN and ELSE may only be followed by line numbers, not statements. There is no colon between THEN and ELSE (example: IF Q=1 THEN 200 ELSE 300). Computed THENs and ELSEs are not allowed.|
|INPUT b$:a||$92||Standard BASIC. The prompt and the variable are separated by a colon instead of a semicolon or comma. BASIC whines with ERR 16 if you do a type mismatch (the equivalent of the 64's ?REDO FROM START complaint).|
|JKEY1, JKEY2||$A7, $A8||Undocumented. Despite having defined tokens, both generate an ERR 2 as functions or statements. Neither keyword appears in the Japanese BASIC-1 manual either, suggesting they were never implemented.|
|KEY(a,b)||$A6||Reads the joystick/joy controller
and keyboard. a is 0 for the keyboard, 1 for controller
#1, and 2 for controller #2; b is the name of the variable to store the ASCII
value (for keyboard) or stick value (for joystick/controller) in.
On the joystick and controllers,
bit 0 (1) is right, bit 1 (2) is up, bit 2 (4) is left, bit 3 (8) is down,
bit 4 (16) is select-right fire button, and bit 5 (32) is select-left fire
button, and combinations of them (SL+left+up = 32+4+2 = 38) are valid.
When querying the joyport there is a bug in Tomy BASIC where the value can overflow, causing weirdness with printing. The solution is to AND it with 127 before any further manipulation, like so:
10 KEY (1,J) :: J=J AND 127
With a single joystick, the same value is read on both #1 and #2.
|LET||$8D||Standard BASIC. LET is not required for assignment.|
|LOG(a)||$D0||Standard BASIC, but undocumented.|
|LPRINT||$9C||Identical to PRINT, but sends to the printer which was never manufactured, or to your own printer if you're using the printer interface (or a Pyuuta with a BASIC-1 cartridge).|
|MCELL(a,b$)||$A3||Loads bit pattern b$ into programmable character a (128-159 are available
for use, but actually any valid byte is acceptable). This value is shifted
to generate the actual offset into the character set.
The bit pattern is constructed identically to the TI's CALL CHAR
statement, basically eight hex bytes corresponding to the set bits.
Example from the manual:
00000000 00 01100110 66 11111111 FF 11111111 FF 11111111 FF 01111110 7E 00111100 3C 00011000 18So, MCELL(128, "0066FFFFFF7E3C18") turns character 128 into a heart. MCELL can be used to manipulate most VDP memory locations below VDP $0800. See the Memory Map and the SCELL command.
|ON, GOTO, GOSUB||$9B, $86, $87||Standard BASIC.|
|$9C||Standard BASIC. Similar to the TI, single colons (:) embedded in a PRINT statement, like PRINT "X":"Y", insert carriage returns.|
|RANDOMIZE||$95||Re-seeds the random number generator, presumably off the internal clock or some other "independent" source.|
|REM||$9A||Standard BASIC. The comment may not exceed 112 characters.|
|RESTORE a||$94||Standard BASIC; optional parameter a sets READ pointer to that line.|
|RND||$D7||Returns a random number between 0 and 1. Unlike many BASICs, RND takes no arguments.|
|SCELL(a,b,c,d)||$A4||Puts a character at a screen position. a is the vertical coordinate
(1-24), b is the horizontal coordinate (1-32), c is the character number
(32-159 officially, but actually any valid byte; this is actually based
on MCELL number and not the real offset into the character set)
and n is the number of times to print that character.
SCELL is the only BASIC command that allows direct access to all of VDP RAM since it has no bounds-checking. Refer to the Tomy Memory Map, and also the MCELL command.
|SCREEN(a)||$A2||Sets the background colour to colour a (1-16).|
|SEG$(a$,b,c)||$D8||Takes a substring of string a$. Undocumented; the American manual incorrectly lists this keyword as MID$. The Japanese BASIC-1 manual does properly list SEG$.|
|SIN(a)||$D2||Causes your computer to lust madly and ravenously after tender young ... ahem. Standard BASIC. a must be in radians.|
|SOUND(a,b,c,d,e,f,g)||$AA||Plays a tone on voice 1 of frequency b for a clock cycles (the Japanese
manual says roughly "1/200th of a second") at amplitude c.
Optional parameters d and f specify frequency for voices 2 and 3, and
e and g the corresponding amplitudes.
The supported frequency range is 110 to 1975 Hz; amplitude ranges from 0-30,
with 0 being loudest and 30 being off. Other values generate ERR 2.
To play, say, voice 2 alone, specify amplitude 30 for voice 1 (or for voice 3 alone, specify 30 for voices 1 and 2, and so forth).
Undocumented: The Japanese BASIC-1 manual further mentions that if you specify a negative number (-1, -2, or -3) for the frequency, you receive one of three pseudorandom noise frequencies instead; -1 is the highest pitched and -3 is the lowest, which directly correlate to the first three frequency settings for the sound chip's noise generator. The fourth option (which one assumes would be -4) for using the frequency of voice 3 is not implemented and generates an error. Interestingly, not even the Japanese BASIC-1 manual notes that noise can actually be specified for any of the three voice frequency parameters, but only once (ERR 16 otherwise) because the internal sound chip only has one noise channel. Other negative values generate ERR 2.
|STOP||$8E||Standard BASIC (but see above).|
|STR$(a)||$DB||Standard BASIC, but undocumented.|
|TAB(a)||$FC||Standard BASIC, but undocumented.|
|TRACE||$90||Enables BASIC trace mode. Dave mentions this and UNTRACE can work in a program, too.|
|UNTRACE||$91||Disables BASIC trace mode.|
|::||$82||Multiple statement separator.|
|!||$83||Davey suggests, perhaps a tail REM (a la the apostrophe in Microsoft BASIC). Undocumented in both the American and Japanese manuals.|
|;||$B4||Concatenator and newline suppressor for PRINT and LPRINT.|
|:||$B5||Inserts new lines in PRINT and LPRINT statements; parameter separator in INPUT.|
|) (||$B6, $B7||Arithmetic precedence operators; also used to denote argument lists for functions. Unlike the C64, where the leading ( is considered a part of the function tokens that require it, ( is a separate token in Tomy BASIC.|
|&||$B8||This works as a string concatenation operator, just like the 99/4A. Undocumented in the American manual but prominently demonstrated in the Japanese manual's type-in examples.|
|=, <, >||$BE, $BF, $C0||Logical comparison operators; = is also the assignment operator. Compound tokens >=, =>, <=, =< and <> also possible with regular BASIC semantics.|
|+, -, *, /, ^||$C1, $C2, $C3, $C4, $C5||Arithmetic operators. + is also the string concatenator. Standard BASIC.|
|#||$FD||Unknown. Undocumented. May be a remnant of never-finished input/output routines (compare with INPUT# on the 99/4A and C64). Dave experimented and found that PRINT #0 prints to the screen; PRINT #1 (all the way up to 255, what dedication!) gives a ERR 19 (see the Errors page); INPUT #0 gives ERR 20 (ibid.); INPUT #1 (through 255?) seems to be keyboard. RESTORE # on any device number gives ERR 19 again, and OPEN # and CLOSE # don't work.|
|$C7||Indicates literal string in quotes to follow. The LIST routine prints a quote, and gets the length of the string from the byte immediately following. The string is printed, and then a trailing quote.|
|$C8||Indicates literal string without quotes to follow (i.e. variables, token-less keywords). The length is also in the byte immediately following the token.|
|$C9||Indicates 16-bit integer to follow, in high-byte/low-byte standard 9995 word format.|