The system variables

The bytes in memory from 23552 to 23733 are set aside for specific uses by the system. You can peek them to find out various things about the system, and some of them can be usefully poked. They are listed here with their uses.

These are called system variables, and have names, but do not confuse them with the variables used by the BASIC. The computer will not recognize the names as referring to system variables, and they are given solely as mnemonics for we humans.

The abbreviations in column 1 have the following meanings:

X The variables should not be poked because the system might crash.
N Poking the variable will have no lasting effect

The number in column 1 is the number of bytes in the variable. For two bytes, the first one is the less significant byte the reverse of what you might expect. So to poke a value v to a two byte variable at address n, use

	POKE n,v-256*1NT (v/256) 
	POKE n+1,lNT (v/256) 

and to peek its value, use the expression

	PEEK n+256*PEEK (n+1)
Notes Address Name Contents
N8 23552 KSTATE Used in reading the keyboard.
Nl 23560 LAST K Stores newly pressed key.
1 23561 REPDEL Time (in 50ths of a second in 60ths of a second in N. America) that a key must be held down before it repeats. This starts off at 35, but you can POKE in other values.
1 23562 REPPER Delay (in 50ths of a second in 60ths of a second in N. America) between successive repeats of a key held down: initially 5.
N2 23563 DEFADD Address of arguments of user defined function if one is being evaluated; otherwise 0.
Nl 23565 K DATA Stores 2nd byte of colour controls entered from keyboard .
N2 23566 TVDATA Stores bytes of coiour, AT and TAB controls going to television.
X38 23568 STRMS Addresses of channels attached to streams.
2 23606 CHARS 256 less than address of character set (which starts with space and carries on to the copyright symbol). Normally in ROM, but you can set up your own in RAM and make CHARS point to it.
1 23608 RASP Length of warning buzz.
1 23609 PIP Length of keyboard click.
1 23610 ERR NR 1 less than the report code. Starts off at 255 (for 1) so PEEK 23610 gives 255.
X1 23611 FLAGS Various flags to control the BASIC system.
X1 23612 TV FLAG Flags associated with the television.
X2 23613 ERR SP Address of item on machine stack to be used as error return.
N2 23615 LIST SP Address of return address from automatic listing.
N1 23617 MODE Specifies K, L, C. E or G cursor.
2 23618 NEWPPC Line to be jumped to.
1 23620 NSPPC Statement number in line to be jumped to. Poking first NEWPPC and then NSPPC forces a jump to a specified statement in a line.
2 23621 PPC Line number of statement currently being executed.
1 23623 SUBPPC Number within line of statement being executed.
1 23624 BORDCR Border colour * 8; also contains the attributes normally used for the lower half of the screen.
2 23625 E PPC Number of current line (with program cursor).
X2 23627 VARS Address of variables.
N2 23629 DEST Address of variable in assignment.
X2 23631 CHANS Address of channel data.
X2 23633 CURCHL Address of information currently being used for input and output.
X2 23635 PROG Address of BASIC program.
X2 23637 NXTLIN Address of next line in program.
X2 23639 DATADD Address of terminator of last DATA item.
X2 23641 E LINE Address of command being typed in.
2 23643 K CUR Address of cursor.
X2 23645 CH ADD Address of the next character to be interpreted: the character after the argument of PEEK, or the NEWLINE at the end of a POKE statement.
2 23647 X PTR Address of the character after the ? marker.
X2 23649 WORKSP Address of temporary work space.
X2 23651 STKBOT Address of bottom of calculator stack.
X2 23653 STKEND Address of start of spare space.
N1 23655 BREG Calculator's b register.
N2 23656 MEM Address of area used for calculator's memory. (Usually MEMBOT, but not always.)
1 23658 FLAGS2 More flags.
X1 23659 DF SZ The number of lines (including one blank line) in the lower part of the screen.
2 23660 S TOP The number of the top program line in automatic listings.
2 23662 OLDPPC Line number to which CONTINUE jumps.
1 23664 OSPCC Number within line of statement to which CONTINUE jumps.
N1 23665 FLAGX Various flags.
N2 23666 STRLEN Length of string type destination in assignment.
N2 23668 T ADDR Address of next item in syntax table (very unlikely to be useful).
2 23670 SEED The seed for RND. This is the variable that is set by RANDOMIZE.
3 23672 FRAMES 3 byte (least significant first), frame counter. Incremented every 20ms. See Chapter 18.
2 23675 UDG Address of 1st user defined graphic You can change this for instance to save space by having fewer user defined graphics.
1 23677 COORDS x-coordinate of last point plotted.
1 23678   y-coordinate of last point plotted.
1 23679 P POSN 33 column number of printer position
X2 23680 PR CC Full address of next position for LPRINT to print at (in ZX printer buffer). Legal values 5B00 - 5B1F. [Not used in 128K mode or when certain peripherals are attached]
2 23682 ECHO E 33 column number and 24 line number (in lower half) of end of input buffer.
2 23684 DF CC Address in display file of PRINT position.
2 23686 DFCCL Like DF CC for lower part of screen.
X1 23688 S POSN 33 column number for PRINT position
X1 23689   24 line number for PRINT position.
X2 23690 SPOSNL Like S POSN for lower part
1 23692 SCR CT Counts scrolls: it is always 1 more than the number of scrolls that will be done before stopping with scroll? If you keep poking this with a number bigger than 1 (say 255), the screen will scroll on and on without asking you.
1 23693 ATTR P Permanent current colours, etc (as set up by colour statements).
1 23694 MASK P Used for transparent colours, etc. Any bit that is 1 shows that the corresponding attribute bit is taken not from ATTR P, but from what is already on the screen.
N1 23695 ATTR T Temporary current colours, etc (as set up by colour items).
N1 23696 MASK T Like MASK P, but temporary.
1 23697 P FLAG More flags.
N30 23698 MEMBOT Calculator's memory area; used to store numbers that cannot conveniently be put on the calculator stack.
2 23728 NMIADD This is the address of a user supplied NMI address which is read by the standard ROM when a peripheral activates the NMI.
Probably intentionally disabled so that the effect is to perform a reset if both locations hold zero, but do nothing if the locations hold a non-zero value.
Interface 1's with serial number greater than 87315 will initialize these locations to 0 and 80 to allow the RS232 "T" channel to use a variable line width. 23728 is the current print position and 23729 the width - default 80.
2 23730 RAMTOP Address of last byte of BASIC system area.
2 23732 P RAMT Address of last byte of physical RAM.

This program tells you the first 22 bytes of the variables area:

 	10 FOR n=0 TO 21
 	20 PRINT PEEK (PEEK 23627+256*PEEK 23628+n)
 	30 NEXT n

Try to match up the control variable n with the descriptions above. Now change line 20 to

	20 PRINT PEEK (23755+n)

This tells you the first 22 bytes of the program area. Match these up with the program itself.

[Back] [Contents] [Next]