Type test again and press ENTER. The buzz indicating the error in your code, shortened in length. You can experiment with different values. The new value you enter must be between -255 and +255, and if it is negative then 256 is added to it.

POKE is not confined into a simple byte sized value as you may have surmised. In fact it can accept a mix of numbers and strings, in a comma separated list of values with each accepting an optional tilde ~ character suffix. In the case of numeric values, the optional tilde suffix after each value makes that value 16 bits wide (a word) while in the case of strings, the optional tilde suffix sets the most significant bit of the last character in the string, usually known as bit7-termination. This is sometimes used in order to store variable-length strings in a compact way. However, it's usually more convenient to use a byte such 0 (NUL) (null-termination), 255 (FFh) or 13 (0Ch) (CR) to terminate a variable-length string in memory. Note that for DPOKE, the tilde is used after numeric values to specify values that should be written to memory as a byte rather than a 16 bit word. You can therefore think of the tilde as a write this value in the opposite way to the default for this command designator! Let's see a few examples:

POKE 32768,200

modifies the contents of the byte address 32768 to 200.

POKE 32768,8,9,10,"test",30000~,55

modifies the contents of address 32768 to 8, address 32769 to 9, address 32770 to 10, addresses 32771 to 32774 to contain the string test (or in other words the values 116, 101 ,115 and 116 respectively – the ASCII codes for the letters making up the word test), addresses 32775 and 32776 to contain values 48, 117 respectively (or 117 x 256 + 48 = 30000) and finally address 32777 to 55. In other words we POKEd 3 bytes, a string, a word and a byte.

DPOKE 32768,1000,2000,3000,100~,2

modifies addresses 32768 though 32775 (pokes 3 words, a byte **–with the tilde–**and a word).

In Chapter 13 we briefly discussed POKE USR "letter". That may look like a separate variant of POKE but in reality USR "letter" is just as shortcut to the address of the UDG defined by letter. There is a small caveat that when used in a single value context, 8 successive POKE USR commands must be given (one for each row in the 8x8 matrix of the UDG) so it's always better if we use it in a list of values context, like so:

POKE USR "A",1,3,7,15,31,63,127,255

which redefines UDG A.

Using POKE with strings is equally powerful so it deserves a separate example. Let's use the example that used PEEK$() to search for a string in order to demonstrate a bit of NextBASIC memory areas magic! First delete all lines after 60 and modify line 20 to read:

20 %a=22000 TO 65535

(This change is to make sure the program doesn't take forever).

RUN the program and when you find the address, note it down, then do the following:

POKE address, "Horrible"

where address is the address you noted earlier. Press ENTER, then write LIST and look at line 50. See? Magic!

Note that using the first form of POKE to any address between 0 and 16383 (the ROM slot) will have no effect regardless of what you attempt to do as shown by this example:

FOR %f=0 TO 16383: POKE %f,0: NEXT %f

ZX Spectrum Next User Manual, 3rd Edition (ISBN 978-1-5272-5496-1), written and illustrated by Phoebus R. Dokos. Copyright © 2020-2024 Phoebus Dokos / SpecNext Ltd. Licensed under CC BY-NC-SA 4.0. This is a transcription and can contain errors; check any doubt against the printed page.