EARTH ATTACK by David Mold from ZX Computing Oct/Nov.1983 [NOTE: This program requires Issue 2 emulation because of the way] [it uses IN for scanning the keyboard. JimG ] With just a sprinkling of machine code, David Mold of Cheshunt has devised an exciting space adventure for your ZX Spectrum. Written for the 16K and 48K Spectrum, this listing presents you with an exciting game which makes great use of machine code to save vital memory space. This program is divided into four main sections. These are: 1) Lines 1 to 180 contain all the initialisation and jumps to the user-defined graphics and machine code initialising routines. Since the amount of initialisation which needs to be done in this program is very large, there is quite a long pause after RUNning before the action starts - however, I shall explain later how this problem can be overcome. 2) Lines 200 to 999 contain the main game loop, including its servant subroutines (scoring, 'smart bomb' and high score routines). This loop calls all the machine code routines, and ties together their responses and any other relevant BASIC needed for the 'action' of the game. 3) Lines 1000 to 2400 contain the data and POKEing routines to set up first the user-defined graphics, then the machine code. 4) Lines 3000 to 3250 contain the three pages of instructions and game details which the computer cycles through between games. The capital letters in quotes in the following lines should be entered in the Graphics mode and when the program is RUN produce the corresponding user-defined graphics to that key: 140, 180, 200, 230, 245, 701, 715, 725, 3140 Variables The variables used, in order of their appearance, are: s$ - Initials of the highest scorer. h$ - The high score total. s - Current score. bo - INT s/1000 - used in calculating bonus bombs. n - Used throughout the program as a control variable in FOR ... NEXT loops. a$ - Displays the number of ships remaining (initially four). l - Number of laser shots. sb - The number of smart bombs ready for use. x,y - The co-ordinates of the ship. p - The screen byte directly in front of the ship (top byte of the character position). rg - The random variable used in selecting alien types. b - The variable used for POKEing into machine code (address 32477) to denote the height of the next building. a - The dummy variable for jumps to machine code. p$ - Used in the high score routine to accept initials. There are numerous other variables used in the program, but they are mostly control or dummy variables which are only used once and their use is fairly self-explanatory. Welcome to the machine There are three main machine code routines used in the program. The data for them starts at line 2000, and I have disassembled them for you in Figs. 3a, 4a and 4b. First is the 'SMART BOMB' routine. This is 26 bytes long and starts at address 32400 Using the attributes file of the Spectrum display, it changes the PAPER colour of every character position in the central third of the display (the part which the 'action' of this game utilises) to red. Whilst doing this it also calculates how many of the character positions previously contained yellow as their INK colour. This is the number which it returns to the variable s, when it returns to BASIC, which is then multiplied by 10 to increase your score according to how many aliens your smart bomb destroyed. Next comes the 'SIDE SCROLL' and 'BUILD CITY' routines, which actually run together, and are called by USR 32426. The height that the skyscrapers are built up to depends upon the variable b, which is POKEd into location 32477. The routine operates once again only on the central third of the display. The reasons for this are: 1) This is in keeping with the character of the game; 2) it speeds up the workings of code which has to operate on the thousands of bytes in the Spectrum's D_FILE; and 3) due to what is termed the curious construction of the display file, it makes manipulating one third of the screen at a time a fairly simple task, but crossing between the thirds rather complicated. The last of these three main routines is the 'CHECK FIRING' routine. Actually it does rather more than its name suggests. Its action is as follows: First the laser fire of the ship is drawn. At each step of this a check is made to see whether an alien has been hit or not. If an alien has been hit, it checks whether this is a saucer or a monster, and adjusts the value of bc accordingly. It then creates a two stage explosion. The routine then erases the laser fire and returns to BASIC. In short ... There are two other shorter machine code routines also included. The routine which starts at address 32350 and shown in Fig.3b is a servant subroutine for the 'CHECK FIRING' code. When called from within another routine, it prints a character to the screen by POKEing the eight bytes which follow the call instruction to the character position, the start of which is specified by HL. The routine starting at address 32300 produces the display of the city being destroyed at the end of the program, and is disassembled in Fig.3c. I mentioned before, the delay caused by the setting up of the machine code and user-defined graphics. Another problem with all this data is that it is an incredible waste of space, since once it has all been POKEd into the relevant addresses when the program was first run, it justs sits there cluttering up your machine. And since the program as it stands uses very nearly all the space in a 16K machine, this means that, should you be tempted, you would find it hard to squeeze in many more lines before the Spectrum gives up the ghost. The answer is, of course, to SAVE the code and user-defined graphics in a separate file on tape, and re-LOAD them each time you LOAD the program from tape. This is a very quick, efficient method which really makes use of the space saving advantages which machine code can offer. So, once your program has been typed in and you have RUN it once or twice to ensure that there are no errors in your typed- in version, you can erase every program line between 1000 and 2400 inclusive. Then type in the program lines shown in Fig.1. Do not worry that some of these lines overwrite program lines that still exist - this is intended. Now, find some room on a cassette somewhere, and SAVE the program and the two code files by typing: RUN 2000 When re-LOADed, the program will automatically LOAD the two files and then RUN itself. Time for fun! And now, after all this effort, for the fun part - playing the game Fig.2 shows the keys used to control your rocket ship as it wings its way over a terrestrial cityscape. To add amusement there are a whole crop of little alien saucers out to get you. Although they don't actually shoot at you, there is a plentiful supply of them, and you can be destroyed in any of three ways: by crashing into them, by crashing into the city below you, or by accidentally moving into 'hyperspace' above. In fact, your little ship is not very sturdy at all, but you do have one weapon on your side - your lasers! To start with you have 20 lasers, and your laser count is decremented by one each time you use them. You score 10 points for each saucer you hit, and 20 for each alien being (little yellow 'nasties' who stand on rooftops and are very hard to hit). Each time you bring the nose of your ship into contact with a green fuel base, your number of lasers is incremented by 20. It does not matter if you plough right through these fuel bases. You get three smart bombs per 1,000 points scored. While the little bomb graphics are still showing beneath the city, each time you press the Space key the sky will turn red, and all visible aliens will be wiped out, and you will be given 10 points for each. Your ship will then accelerate out of the dangerous area. The game ends when all five of your ships have been destroyed. = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Fig.1 30 LOAD "mcode" CODE 40 LOAD "chars" CODE USR "a" 2000 SAVE "attack" LINE 2050 2010 SAVE "mcode" CODE 32300,300 2020 SAVE "chars" CODE USR "a",6*8 2030 PRINT "SAVEing finished": STOP 2050 RUN = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Fig.2 EARTH ATTACK Use Keys: 1-5......Up Q-T......Down 6-0......Fire SHIFT....Extra Speed SPACE....Smart Bombs PRESS 'S' TO START = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Fig.3a 'SMART BOMB' disassembled ld hl,ATTR_FILE ld c,0 ld b,255 LOOP inc hl ld a,hl cp 6 jr nz,CHANGE inc c ld a,8 ld (hl),a djnz LOOP ret CHANGE add a,16 ld (hl),a djnz LOOP ret = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Fig.3b 'CPOKE' disassembled ld b,8 LOOP pop de ld a,(de) inc de push de ld (hl),a ld de,256 add hl,de djnz LOOP ret = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Fig.3c End of game display disassembled ld a,7 LOOP2 ld hl,ATTR_FILE ld b,255 LOOP1 ld (hl),a inc hl djnz LOOP1 halt dec a jr nz,LOOP2 ld b,l LOOP5 ld hl,D_FILE LOOP4 ld c,32 xor a LOOP3 ld a,(hl) srl a ld (hl),a dec hl dec c jr nz,LOOP3 ld a,71 cp h jr nz,LOOP4 djnz LOOP5 ret = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Fig.4a 'SIDE SCROLL' and 'BUILD CITY' disassembled SIDE SCROLL: ld b,64 ld hl,D_FILE ld de,32 ld a,0 LOOP1 ld (hl),a add hl,de djnz LOOP1 ld hl,ATTR_FILE ld b,8 ld de,32 ld a,7 LOOP2 ld (hl),a add hl,de djnz LOOP2 ld bc,2048 ld de,D_FILE ld hl,D_FILE+1 ldir ld bc,256 ld de,ATTR_FILE ld hl,ATTR_FILE+1 ldir BUILD CITY: ld b,0 ld c,15 LOOP3 ld a,22 rst 16 ld a,c rst 16 ld a,31 rst 16 ld a,16 rst 16 ld a,5 rst 16 ld a,17 rst 16 ld a,0 rst 16 ld a,148 rst 16 dec c djnz LOOP3 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Fig.4b 'CHECK FIRING' disassembled ld c,0 ld hl,(DFCC) ld de,768 add hl,de push hl ld b,5 LOOP1 ld a,(hl) cp 129 jr z,X1 cp 127 jr z,X2 ld (hl),255 inc hl djnz LOOP1 halt halt halt halt jr X3 X2 inc c X1 push bc sbc hl,de push hl call CPOKE defb 0,66,36,24,24,36,66,0 halt halt pop hl push hl call CPOKE defb 153,90,16,199,227,8,90,153 halt halt pop hl call CPOKE defb 0,0,0,0,0,0,0,0 pop bc inc c X3 pop hl ld a,5 LOOP2 ld (hl),0 inc hl inc b cp b jr nz,LOOP2 ld b,0 ret -- Another Fine Product transcribed by: Jim Grimwood (jimg@globalnet.co.uk), Weardale, England --