Animation Get things moving with Duncan Overton's graphics program. It all began whilst watching some software company's logo reveal itself, stripe by stripe, on the TV screen. Loading a screen string from tape is a slow operation, quite magi- cal and entertaining when first seen, but slow. It becomes plain boring when you have to watch that logo every time you want to give the Alien Menace a good sorting out. Having loaded a screen string you wish to use, just one misplaced finger and it's lost, needing retrieval from tape (where is that Microdrive?). So why not invent a routine to shunt screenfuls into memory and recall them when needed? This is easy enough to do using PEEK and POKE, PEEKing bytes from address 16384 onwards and POKEing them into higher memory. As there are 6912 screen bytes, the process is even slower than loading from tape, and Machine Code becomes necessary. For the novice who is only used to BASIC, the structure of Code operations seems very obscure. With a little persistence, however, Code seems to be like any other area of programming, easier to learn once you have a specific need to be met. Once the sequence of oper- ations is properly visualised, trial and error will get you there in the end. One point soon learnt is that you must tape each program before you RUN it - in Code, crashes are invariably fatal! There are over 40,000 bytes available on the 48K for programs and storage space, so up to 5 screenfuls could be stored. Program 1 [found below] is a Code routine to move 6912 bytes from one starting adderss to another. In order that this routine can be used and modified easily, it may be entered from a DATA statement in BASIC. For this, it needs to be written in decimal form. Bytes 2,3 and 5,6 are the addresses, which are written in a manner illogical to common mortals. Byte 3 is the number of 256s in the ad- dress, and byte 2 is the remainder from this division. So addess 33000 is 33000/256 which equals 128, remainder 232, and is entered as 232, 128, which the little Z80 chip seems to understand perfectly. Program 2 [found on the accompanying TZX as "animcode"] is a BASIC routine to enter and run the Code program using specified addresses. The Code is placed at the top end of memory, 64000 to 64020, and is preserved from NEW using line 1000. Screen strings can be stored as low as 25000 in memory provided only a small BASIC program is stored as well. The storage addresses increase by 7000 for each new entry. Enter and RUN the program, using addresses 16384 and 25000, and then set up a screen design. Enter RANDOMIZE USR 64000, and nothing at all will appear to happen. But with the specified addresses, the screen is now copied into memory from 25000 to 31912 (PEEK it and see). Clear the screen and RUN the BASIC program again, entering address 25000 first and 16384 second. RANDOMIZE USR 64000 again and your screenful will return, considerably more quickly than using PEEK and POKE. Four further screenfuls can be stored and retrieved in the same way. So what has all this to do with animation? Well, if the code routine is used to recall screenfuls repeatedly in cycle, then interesting possibilities arise. Program 3 [on the TZX as "Starspin"] uses the Code routine, at line 100, to store 4 designs. These 4 designs are created in line 7 to 70, and are each slightly different. Lines 200 onwards recall these blocks in cycle continuously, and Hey Presto! you have an animated Spectrum. [ Note the red streaks, which are a result of drawing the new screen over the old screen's attributes. This could be avoided with a careful set-up of the attributes of each screen, but that would go a bit far for a demonstration like this. Note also that a clever machine code programmer knows about the LDIR instruction, as demonstrated in "StarLDIR" - which is both rather shorter and slightly faster than the article's original! ] For those of us used only to BASIC programming it is awe-inspiring to calculate that, as one revolution of the figures takes about 7 seconds, and involves 64 'frames', then some 63000 bytes are being shunted around each second! Spinning wheels, wriggly caterpillars, travelling waves and rotating solids can all be produced in the same way. Program 1 HEX MNEMONICS FOR HUMANS 11,XX,XX LD DE,address 1 Set 'read from' address 21,XX,XX LD HL,address 2 Set 'load to' address 06,1B LD B,27 Set up a loop of C5 PUSH BC 6912 repetitions 06,00 LD B,256 1A LD A,(DE) Put contents of add. 1 77 LD (HL),A into add. 2 13 INC DE Move add. 1 & add. 2 23 INC HL on to next address 10,F9 DJNZ,-6 Other end of C1 POP BC loop 10,F4 DJNZ,-11 C9 RET Return to BASIC [ Program 1a - LDIR version HEX MNEMONICS FOR HUMANS 01,00,1B LD BC,6912 Set number of bytes to move 21,XX,XX LD HL,address 1 Set 'read from' address 11,XX,XX LD DE,address 2 Set 'load to' address ED,B0 LDIR Move BC bytes from HL to DE C9 RET Return to BASIC ]