Part 25
The system variables
Subjects covered...
POKE, PEEK
The bytes in memory from 5B00h (23296) to 5CB6h (23734) are set aside
for specific uses by the system. There are a few routine (used to keep
the paging in order), and some locations called system variables. You
can peek these to find out various things about the system, and some
of them can be usefully poked. They are listed here with their uses.
There is quite a difference, as you might expect, between the system
variables' area in 48 BASIC mode and in +3 BASIC mode. In 48 BASIC
mode, all the variables and routines below 5C00h (23552) do not exist;
instead there is a buffer between 5B00h (23296) and 5C00h (23552)
which is used for controlling the printer. This was quite a popular
location for small machine code programs on the old 48K Spectrum, and
if any of these routines are tried in +3 BASIC, the computer will
invariably crash. Any old program that uses PEEK, POKE and USR is
therefore a safer bet if it is run in 48 BASIC mode (although it can
be entered in +3 BASIC mode and transferred using the SPECTRUM
command). If there is a chance that a program might inadvertently
address the added I/O ports of the +3, then 'OUT 32765,48' will set
bit 5 in port 7FFDh to disable further use of the added ROM/RAM
switching.
Although system variables have names, you should not confuse them with
the words and names used in BASIC. The computer will not recognise the
names as referring to system variables; they are given solely as
mnemonics for humans.
The abbreviations in column 1 of the table have the following
meanings:
X - The variables should not be poked because the system might crash.
N - Poking the variables will have no lasting effect.
R - Routine entry point. Not a variable.
The number in column 1 is the number of bytes in the variable or
routine. For a two-byte word, the first byte is the least significant
- the reverse of what you might expect. So, to poke a value 'v' into a
two-byte variable at address 'n', use...
POKE n,v-256* INT (v/256)
POKE n+1, INT (v/256)
...and to peek its value, use the expression...
PRINT PEEK n+256* PEEK (n+1)
NOTES ADDRESS NAME CONTENTS
HEX (DECIMAL)
--------------------------------------------------------------------
R16 5B00h (23296) SWAP Paging subroutine.
R17 5B10h (23312) STOO Paging subroutine. Entered with
interrupts already disabled and AF, BC
on the stack.
R9 5B21h (23329) YOUNGER Paging subroutine.
R16 5B2Ah (23338) REGNUOY Paging subroutine.
R24 5B3Ah (23354) ONERR Paging subroutine.
X2 5B52h (23378) OLDHL Temporary register store while
switching ROMs.
X2 5B54h (23380) OLDBC Temporary register store while
switching ROMs.
X2 5B56h (23382) OLDAF Temporary register store while
switching ROMs.
N2 5B58h (23384) TARGET Subroutine address in ROM 3.
X2 5B5Ah (23386) RETADDR Return address in ROM 1.
X1 5B5Ch (23388) BANKM Copy of last byte output to I/O port
7FFDh (32765). This port is used to
control the RAM paging (bits 0...2),
the 'horizontal' ROM switch (0<->1 and
2<->3 - bit 4), screen selection (bit
3) and added I/O disabling (bit 5).
This byte must be kept up to date with
the last value output to the port if
interrupts are enabled.
X1 5B5Dh (23389) RAMRST RST 8 instruction. Used by ROM 1 to
report old errors to ROM 3.
N1 5B5Eh (23390) RAMERR Error number passed from ROM 1 to ROM
3. Also used by SAVE/LOAD as temporary
drive store.
2 5B5Fh (23391) BAUD RS232 bit period in T states/26. Set
by FORMAT LINE.
N2 5B61h (23393) SERFL Second-character-received-flag, and
data.
N1 5B63h (23395) COL Current column from 1 to width.
1 5B64h (23396) WIDTH Paper column width. Defaults to 80.
1 5B65h (23397) TVPARS Number of inline parameters expected
by RS232.
1 5B66h (23398) FLAGS3 Various flags. Bits 0, 1, 6 and 7
unlikely to be useful. Bit 2 is set
when tokens are to be expanded on
printing. Bit 3 is set if print output
is RS232. The default (at reset) is
Centronics. Bit 4 is set if a disk
interface is present. Bit 5 is set if
drive B: is present.
X1 5B67h (23399) BANK678 Copy of last byte output to I/O port
1FFDh (8189). This port is used to
control the +3 extended RAM and ROM
switching (bits 0..2 - if bit 0 is 0
then bit 2 controls the 'vertical' ROM
switch 0<->2 and 1<->3), the disk
motor (bit 3) and Centronics strobe
(bit 4). This byte must be kept up to
date with the last value output to the
port if interrupts are enabled.
N1 5B68h (23400) XLOC Holds X location when using the
unexpanded COPY command.
N1 5B69h (23401) YLOC Holds Y location when using the
unexpanded COPY command.
X2 5B6Ah (23402) OLDSP Old SP (stack pointer) when TSTACK is
in use.
X2 5B6Ch (23404) SYNRET Return address for ONERR.
5 5B6Eh (23406) LASTV Last value printed by calculator.
2 5B73h (23411) RCLINE Current line being renumbered.
2 5B75h (23413) RCSTART Starting line number for
renumbering. The default value is 10.
2 5B77h (23415) RCSTEP Incremental value for renumbering. The
default is 10.
1 5B79h (23417) LODDRV Holds 'T' if LOAD, VERIFY, MERGE are
from tape, otherwise holds 'A', 'B'
or 'M'.
1 5B7Ah (23418) SAVDRV Holds 'T' if SAVE is to tape,
otherwise holds 'A', 'B' or 'M'.
1 5B7Bh (23419) DUMPLF Holds the number of 1/216ths user for
line feeds in 'COPY EXP'. This is
normally set to 9. If problems are
experienced fitting a dump onto a
sheet of A4 paper, POKE this
location with 8. This will reduce the
size of the dump and improve the
aspect ratio slightly. (The quality of
the dump will be marginally degraded,
however.)
N8 5B7Ch (23420) STRIP1 Stripe one bitmap.
N8 5B84h (23428) STRIP2 Stripe two bitmap. This extends to
5B8Bh (23436).
X115 5BFFh (23551) TSTACK Temporary stack grows down from
here. Used when RAM page 7 is switched
in at top of memory (while executing
the editor or calling +3DOS). it may
safely go down to 5B8Ch (and across
STRIP1 and STRIP2 if necessary). This
guarantees at least 115 bytes of stack
when BASIC calls +3DOS.
N8 5C00h (23552) KSTATE Used in reading the keyboard.
N1 5C08h (23560) LASTK Stores newly pressed key.
1 5C09h (23561) REPDEL Time (in 50ths of a second) that a key
must be held down before it
repeats. This starts off at 35, but
you can POKE in other values.
1 5C0Ah (23562) REPPER Delay (in 50ths of a second) between
successive repeats of a key held down
- initially 5.
N2 5C0Bh (23563) DEFADD Address of arguments of user defined
function (if one is being evaluated),
otherwise 0.
Nl 5C0dh (23565) K DATA Stores 2nd byte of colour controls entered from keyboard .
N1 5C0Dh (23566) TVDATA Stores bytes of colour, AT and TAB
controls going to TV.
X38 5C10h (23568) STRMS Addresses of channels attached to
streams.
2 5C36h (23606) CHARS 256 less than address of character set
(which starts with space and carries
on to (C)). Normally in ROM, but you
can set up your down in RAM and make
CHARS point to it.
1 5C38h (23608) RASP Length of warning buzz.
1 5C39h (23609) PIP Length of keyboard click.
1 5C3Ah (23610) ERRNR 1 less than the report code. Starts
off at 255 (for -1) so 'PEEK 23610'
gives 255.
X1 5C3Bh (23611) FLAGS Various flags to control the BASIC
system.
X1 5C3Ch (23612) TVFLAG Flags associated with the TV.
X2 5C3Dh (23613) ERRSP Address of item on machine stack to be
used as error return.
N2 5C3Fh (23615) LISTSP Address of return address from
automatic listing.
N1 5C41h (23617) MODE Specifies 'K', 'L', 'C', 'E' or 'G'
cursor.
2 5C42h (23618) NEWPPC Line to be jumped to.
1 5C44h (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 5C45h (23621) PPC Line number of statement currently
being executed.
1 5C47h (23623) SUBPPC Number within line of statement
currently being executed.
1 5C48h (23624) BORDCR Border colour multiplied by 8; also
contains the attributes normally used
for the lower half of the screen.
2 5C49h (23625) E PPC Number of current line (with program
cursor).
X2 5C4Bh (23627) VARS Address of variables.
N2 5C4Dh (23629) DEST Address of variable in assignment.
X2 5C4Fh (23631) CHANS Address of channel data.
X2 5C51h (23633) CURCHL Address of information currently being
used for input and output.
X2 5C53h (23635) PROG Address of BASIC program.
X2 5C57h (23637) NXTLIN Address of next line in program.
X2 5C57h (23639) DATADD Address of terminator of last DATA
item.
X2 5C59h (23641) E LINE Address of command being typed in.
2 5C5Bh (23643) K CUR Address of cursor.
X2 5C5Dh (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 5C5Fh (23647) X PTR Address of the character after the []
marker.
X2 5C61h (23649) WORKSP Address of temporary work space.
X2 5C63h (23651) STKBOT Address of bottom of calculator stack.
X2 5C65h (23653) STKEND Address of start of spare space.
N1 5C67h (23655) BREG Calculator's B register.
N2 5C68h (23656) MEM Address of area used for calculator's
memory (usually MEMBOT, but not
always).
1 5C6Ah (23658) FLAGS2 More flags. (Bit 3 set when CAPS SHIFT
or CAPS LOCK is on.)
X1 5C6Bh (23659) DF SZ The number of lines (including one
blank line) in the lower part of the
screen.
2 5C6Ch (23660) S TOP The number of the top program line in
automatic listings.
2 5C6Eh (23662) OLDPPC Line number to which CONTINUE jumps.
1 5C70h (23664) OSPPC Number within line of statement to
which CONTINUE jumps.
N1 5C71h (23665) FLAGX Various flags.
N2 5C72h (23666) STRLEN Length of string type destination in
assignment.
N2 5C74h (23668) T ADDR Address of next item in syntax table
(very unlikely to be useful).
2 5C76h (23670) SEED The seed for RND. This is the variable
that is set by RANDOMIZE.
3 5C78h (23672) FRAMES 3 byte (least significant byte first),
frame counter incremented every 20ms.
2 5C7Bh (23675) UDG Address of first user-defined
graphic. You can change this, for
instance, to save space by having
fewer user-defined characters.
1 5C7Dh (23677) COORDS X-coordinate of last point plotted.
1 5C7Eh (23678) Y-coordinate of last point plotted.
1 5C7Fh (23679) P POSN 33-column number of printer position.
X2 5C80h (23680) PRCC 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 5C82h (23682) ECHO E 33-column number and 24-line number
(in lower half) of end of input
buffer.
2 5C84h (23684) DF CC Address in display file of PRINT
position.
2 5C86h (23686) DF CCL Like DF CC for lower part of screen.
X1 5C88h (23688) S POSN 33-column number for PRINT position.
X1 5C89h (23689) 24-line number for PRINT position.
X2 5C8Ah (23690) SPOSNL Like S POSN for lower part.
1 5C8Ch (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 5C8Dh (23692) ATTR P Permanent current colours, etc., (as
set up by colour statements).
1 5C8Eh (23693) 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 5C8Fh (23694) ATTR T Temporary current colours, etc., (as
set up by colour items).
N1 5C90h (23696) MASK T Like MASK P, but temporary.
1 5C91h (23697) P FLAG More flags.
N30 5C92h (23698) MEMBOT Calculator's memory area - used to
store numbers that cannot conveniently
be put on the calculator stack.
2 5CB0h (23728) NMIADD Holds the address of the users NMI
service routine.
NOTE - On previous machines, this did
not work correctly and these two bytes
were documented as 'Not used.'
Programs that user these two bytes for
passing values may need to be
modified.
2 5CB2h (23730) RAMTOP Address of last byte of BASIC system
area.
2 5CB4h (23732) P RAMT Address of last byte of physical RAM.