230 FOR J= 0 TO ITER
240 LOAD "ANIM"+ STR$ (J)+".SL2"
LAYER
250 NEXT J
260 NEXT %I
360 LAYER 2,0: LAYER 0
The program generates ellipses that rotate counter to one another and after drawing each frame, saves the entire screen on the SD card. Once it's done generating (when CURITER reaches ITER), it uses LOAD … LAYER (which we will look at in depth in Chapter 19) to load and display the Layer 2 screens the previous part generated. Unlike the previous example using Layer 0 which only moved 2K at a time, this loads and displays 48K at a time.
Compared to the previous example using the RAMdisk, this appears much smoother and the reason is simple; there are many more frames generated by the program than what the previous one did. The question is can it be made smoother and if at all possible, faster?
It's time to delegate frame playback to RAM. Replace line 90 with this, longer, version:
90 IF CURITER <=ITER THEN SAVE
"ANIM"+STR$ (CURITER)+",SL2"
LAYER: BANK 9 COPY TO
111-(CURITER*3): BANK 10 COPY TO
110-(CURITER*3): BANK 11 COPY TO
109-(CURITER*3): CURITER +=1
and then add the following lines at the end:
270 PRINT AT 22,0;"Done Loading
from SD. Press any key to
load from memory"
280 PAUSE 0
290 FOR %I=0 TO 5
300 FOR %J=0 TO % INT {ITER}
310 BANK %111-(3*J) COPY TO %9
320 BANK %110-(3*J) COPY TO %10
330 BANK %109-(3*J) COPY TO %11
340 NEXT %J
350 NEXT %I
360 LAYER 2,0: LAYER 0
Run the program again and now compare the playback using the SD card, with the playback of all the screens using the memory.
You can see that the playback is even smoother AND faster than the SD card and the reason is simple and that is because memory is a much faster medium than your SD card. Now there are several things of note here. First of all, this is not very efficient code, memory wise; Layer 2 uses 3 banks of 16K each making an entire screen 48K long. For the 20 iterations we made, that's 20 * 3 * 16K = 960K making this program unlikely to work on a non-expanded KS1 ZX Spectrum Next1. Secondly, not the entire screen is moving. Only a small window does and that makes saving the remainder of each screen wasteful in mem-
1 If you modify variable ITER however to a value around 10 it will work since we already know that banks 0 to 12 are being used by the system and 10316 gives us a figure of 480K which is a memory size available on an unexpanded Next.
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.