Whilst it cannot be done directly from the ROM it can be be done by making an altered copy of the ROMs save/load routines. This way you could save,say for example, the variables area only then reload same.
In his book "Advanced programming for the ZX81" author Mike Costello shows one such method.
The PDF can be found here...
https://datassette.nyc3.cdn.digitalocea ... zx81.pdfen
Pages 105 to 107 then page 120 are the pages of relevance here.
Also this taken from Sinclair User July 1983 answers a question asked by
Richard Mellor (sounds familiar?)
QUOTE.
"Richard Mellor poses a question which does not concern the display file but the solution involves saving information above RAMTOP in a similar manner to storing the display. He asks: Is it possible, on the ZX-81, to load and save variables only from within a program so that they can be loaded in at a later date and reused?
The ZX-81 LOAD and SAVE routines transfer to and from cassette all the information between address 16384 and the address held in the system variable called STKEND. Inspection of the memory map on page 171 of ZX-81 Basic Programming shows that most of the active contents of memory - the system variables, the program, the display and the variables and the like - lie between 16384 and STKEND. Hence those items are transferred automatically by the LOAD and SAVE commands.
It is unfortunate that the starting address is fixed at 16384. If it was determined by the contents of an extra system variable it would be possible, by POKEing suitable values into the system variable, to LOAD or SAVE portions of memory as can be done on the Spectrum. An alternative would be to copy the SAVE and LOAD routines into RAM, alter them and then use the new routines instead of the originals.
A simpler solution is to copy the contents of the memory area which is required separately - in this case the variables area - above RAMTOP, SAVE the program, copy the variables back again and then SAVE them separately. The reverse procedure is used when LOADing the program and the variables.
Sinclair printout
Supposing a two-dimensional array P(5,2 3) is to be SAVEd separately from the program. The first task is to determine how much memory is required in the variables area, and therefore also above RAMTOP, to store the array. It is possible to calculate the space requirements using the information in chapter 27 of ZX-81 Basic Programming but it is probably easier to let the machine do the work for you. First clear the ZX-81 by entering NEW and define the array by entering:
DIM P(5,23)
Then calculate the length of the variables area by checking the value of the two systems variables VARS - which points to the beginning of the area - and E-LINE - which points to one more than the end of the variables area. The difference between E-LINE and VARS less one, i.e. PEEK 16404 + 256*PEEK 16405-1-PEEK 16400-256*PEEK 16401 is the length of the variables area and, as the array P is the only variable, it is also the length of P. In this case P proves to be 583 bytes long - five bytes for each of the 5*23 = 115 elements of the array plus another eight bytes to hold various ancillary information as shown on page 173 of the manual.
Thus at least 583 bytes of memory are required above RAMTOP to provide temporary storage for the array. Reducing the contents of 16389 from 128 to 125 reserves 3*256 = 768 bytes, hence enter POKE 16389,125 followed by NEW.
The program can then be LOADed from cassette and the two routines listed in table three can be added to it. The two routines transfer the first 583 bytes of the variables area to and from the space above RAMTOP in much the same way as the display was transferred previously. There is one more requirement of the program. That is that the array must be the first variable declared by the program. That ensures that the array lies at the bottom of the variables area.
100 REM STORE P(5,23) ABOVE RAMTOP
110 LET I=PEEK 16400+256*PEEK 16401
120 LET J=PEEK 16388+256*PEEK 16389
130 FOR K=0 TO 582
140 POKE J+K, PEEK(I+K)
150 NEXT K
200 REM RECALL P(5,23) FROM ABOVE RAMTOP
210 LET I=PEEK 16400+256*PEEK 16401
220 LET J=PEEK 16388+256*PEEK 16389
230 FOR K=0 TO 582
240 POKE I+K, PEEK(J+K)
250 NEXT K
Table 3. Two ZX-81 routines to store an array p(5,23)
above RAMTOP and to retrieve it.
That final requirement makes it difficult to use the technique with ordinary string variables because they can move up the variables area when they are redefined by the program. It is therefore best to use the technique only with numeric variables, arrays and string arrays.
Two simple machine code loops could be used to transfer the data in a similar manner to the loops in table two. That is left as an exercise for the reader."
END QUOTE.