!0.......^.........^.........^.. !B \H11\H07\H10\H02 B A N G \H11\H07\H10\H00 GOES YOUR CODE !2.......^.........^.........^.........^.........^.........^.... Has the razzle-dazzle gone out of your programs? Simon Lane's got some explosive ideas to stun you ... !1.......^.........^.........^.........^........ Have you ever had that feeling of anti-climax when, having successfully obliterated an alien (or whatever) in some otherwise superbly written Basic program, it simply disappears into thin air without any kind of graphic reward? Well, now you'll be able to remedy this omission by simply calling one of these interrupt-driven machine code explosion routines at the approp- riate point in your program. Just read the instructions, type in the object code, and off you go. The assembly language listings have been produced using the Hisoft GENS assembler, which uses a '#' symbol to denote Hex numbers. If you have an assembler you can type in the source code and assemble it yourself. This will allow you the added joy of making your own alterations to the programs - certainly, it's a lot less boring than entering the object code straight. However, without an assembler this is exactly what you will have to do - using either a suit- able monitor program, or the short Hex loader provided as a last resort. To use the Hex loader, first you'll have to enter the start address (in decimal) as given in the instructions for each routine; that has to be followed by all the Hex object code given in column two of the assembler listing. For example, to enter !0.......^.........^.........^.. !B 10 REM *********************** 20 REM HEX LOADER 30 REM *********************** 40 DEF FN d(h$)=CODE h$-48-(32 AND h$>="a")-(7 AND h$>="A") 50 INPUT "Start address:";l 60 INPUT (l);">";h$ 70 POKE l,FN d(h$(1))*16+FN d( h$(2)) 80 LET l=l+1: LET h$=h$(3 TO ) 90 IF h$>"" THEN GO TO 70 100 GO TO 60 !2.......^.........^.........^.........^.........^.........^.... Those without an assembler can use the above program to type in the Hex code. !1.......^.........^.........^.........^........ the Missile Command routine, you would type 65023 (Enter), 16FE (Enter), AF (Enter), 32D2FE ... 00FF (Enter). Once that's out of the way, you can break out of the program by deleting one of the quotes and typing STOP. !0.......^.........^.........^.. !B MISSILE COMMAND EXPLOSION (MCEXP) !1.......^.........^.........^.........^........ Anyone who's ever been in an amusement arcade must surely have come across the Missile Command game at some time or other. There the explosions are displayed as circles which get larger and larger and then shrink away to nothing; my first routine is an attempt to simulate this effect. The object code should be entered into memory starting at 65023 (FDFF Hex) and, just as a check, the first address at which no object code should be entered (that is, the address at which you STOP the Hex loader) should be 65256 (FEEB Hex). The routine works by drawing a series of octa- gons on the screen, starting at the coordinates stored in XPOS and YPOS (see below). When a 'radius' equal to the contents of LIMIT is reached, the octagons are 'undrawn', but this time in reverse order. This gives an effect very similar to a circle growing and then !0.......^.........^.........^.. 10 REM *********************** 20 REM MCEXP DEMO 30 REM *********************** 40 REM 50 REM ASSIGN VARIABLES 60 REM 70 LET xpos=65236 80 LET ypos=65237 90 LET limit=65238 100 LET speed=65239 110 LET done=65240 120 REM 130 REM INITIALISE MCEXP 140 REM 150 POKE xpos,128 160 POKE ypos,88 170 POKE limit,87 180 POKE speed,1 190 REM 200 REM CALL MCEXP 210 REM 220 RANDOMIZE USR 65025 230 REM 240 REM FLASH BORDER UNTIL END 250 REM 260 BORDER RND*7 270 IF PEEK done THEN STOP 280 GO TO 260 !2.......^.........^.........^.........^.........^.........^.... The Missile Command demo: produces an explosion at the centre of the screen. !1.......^.........^.........^.........^........ !B shrinking away - without the problems associated with drawing circles (slowness and/or large look-up tables). Note that when the octagons are drawn on the screen, XOR plotting is used. This gives the same effect as using PLOT OVER 1 from Basic. Once you've typed in the object code it's advisable to save it immediately, just in case you inadvertently manage to crash the program. Enter SAVE "mcexp" CODE 65023,233 to save to tape, and SAVE *"m";1;"mcexp" CODE 65023,233 to save to Microdrive cartridge. Then, type in and run the MCEXP DEMO program; if everything is as it should be, and explosion should be produced that starts at the centre of the screen and then fills it. To use the routine in your own programs, you just have to POKE the locations below with the appropriate values and then use the command RANDOMIZE USR 65025. The variables used in the program are as follows: !0.......^.........^.........^.. XPOS: 65236 (FED4 Hex) YPOS: 65237 (FED5 Hex) !1.......^.........^.........^.........^........ These should be POKEd with the x and y coord- inates of the point where the centre of the explosion is required. !0.......^.........^.........^.. LIMIT: 65238 (FED6 Hex) !1.......^.........^.........^.........^........ The radius of the required explosion. Note XPOS - LIMIT 0, XPOS + LIMIT 255, YPOS - LIMIT 0, YPOS + LIMIT 175, !0.......^.........^.........^.. SPEED: 65239 (FED7 Hex) !1.......^.........^.........^.........^........ The speed of the explosion. Note that one is fast, 255 is slow. Total time of explosion = (LIMIT * SPEED + 1)/25 seconds (approx). Large explosions take considerably longer. !0.......^.........^.........^.. DONE: 65240 (FED8 Hex) !1.......^.........^.........^.........^........ This location can be PEEKed to determine whether or not the explosion has been completed (since the routine is interrupt-driven, the Basic program continues to run while the machine code is executed). A zero indicates that the explos- ion is still taking place and a one indicates that it has finished. Note that commands of the form "IF PEEK done ..." can therefore be used in your programs. It's advisable to assign the values above to Basic variables at the start of your program. This approach is used in each of the demon- stration programs. !2.......^.........^.........^.........^.........^.........^.... !B FDFF ORG #FDFF FDFF 16FE DEFW MCEXP ;Initialise variables and interrupts FE01 AF GO XOR A FE02 32D8FE LD (DONE),A FE05 32DAFE LD (SIZE),A FE08 32DFFE LD (INOUT),A FE0B 3C INC A FE0C 32D9FE LD (COUNT),A FE0F 3EFD LD A,#FD ;This makes Z80 jump to the sub- FE11 ED47 LD I,A ;routine whose address is stored FE13 ED5E IM 2 ;at FDFF on each interrupt FE15 C9 RET ;This code is executed every 0.02 secs FE16 C5 MCEXP PUSH BC FE17 D5 PUSH DE FE18 E5 PUSH HL FE19 F5 PUSH AF FE1A DDE5 PUSH IX ;Draw an octagon every (SPEED)/50 secs FE1C 21D9FE LD HL,COUNT FE1F 35 DEC (HL) FE20 C2A4FE JP NZ,RET FE23 3AD7FE LD A,(SPEED) FE26 77 LD (HL),A FE27 2AD4FE LD HL,(XPOS) FE2A 3ADAFE LD A,(SIZE) FE2D A7 AND A FE2E 2005 JR NZ,NOT0 ;If (SIZE)=0 then plot a single point ... FE30 CDADFE CALL PLOT FE33 1848 JR ENDPLT ;otherwise draw an octagon of the appropriate size FE35 5F NOT0 LD E,A FE36 57 LD D,A FE37 CB3A SRL D FE39 19 ADD HL,DE FE3A 1100FF LD DE,#FF00 ;Down FE3D DD21E0FE LD IX,DIRTAB FE41 0E04 LD C,#04 FE43 FE01 MLOOP CP #01 FE45 2809 JR Z,NOGO FE47 47 LD B,A FE48 CB80 RES 0,B ;Draw straight line FE4A 19 STRT ADD HL,DE FE4B CDADFE CALL PLOT FE4E 10FA DJNZ STRT FE50 47 NOGO LD B,A FE51 04 INC B FE52 CB38 SRL B FE54 ED53DBFE LD (DE1),DE FE58 DD5E00 LD E,(IX+#00) FE5B DD5601 LD D,(IX+#01) FE5E ED53DDFE LD (DE2),DE ;Draw diagonal line FE62 19 DIAG ADD HL,DE FE63 CB47 BIT 0,A FE65 CCADFE CALL Z,PLOT FE68 ED5BDBFE LD DE,(DE1) FE6C 19 ADD HL,DE FE6D CDADFE CALL PLOT FE70 ED5BDDFE LD DE,(DE2) FE74 10EC DJNZ DIAG FE76 DD23 INC IX ;Point to next FE78 DD23 INC IX ;entry in DIRTAB FE7A 0D DEC C FE7B 20C6 JR NZ,MLOOP FE7D 3ADFFE MLOOP LD A,(INOUT) FE80 A7 AND A FE81 21DAFE LD HL,SIZE FE84 2010 JR NZ,IN FE86 3AD6FE LD A,(LIMIT) FE89 BE CP (HL) FE8A 2803 JR Z,CHANGE FE8C 34 INC (HL) ;Grow FE8D 1815 JR RET ;Change from growing to shrinking FE8F 3E01 CHANGE LD A,#01 FE91 32DFFE LD (INOUT),A FE94 180E JR RET FE96 3D IN DEC A FE97 BE CP (HL) FE98 2009 JR NZ,INOK ;Explosion complete FE9A 3E01 LD A,#01 FE9C 32D8FE LD (DONE),A FE9F ED56 IM 1 FEA1 1801 JR RET FEA3 35 INOK DEC (HL) ;Shrink ;Restore registers & jump to ROM interrupt routine FEA4 DDE1 RET POP IX FEA6 F1 POP AF FEA7 E1 POP HL FEA8 D1 POP DE FEA9 C1 POP BC FEAA C33800 JP #0038 ;Invert point if growing, unplot if shrinking FEAD E5 PLOT PUSH HL FEAE F5 PUSH AF FEAF 3ADFFE LD A,(INOUT) FEB2 A7 AND A FEB3 2008 JR NZ,UNPLOT ;Invert point FEB5 CDC5FE PLOTX CALL PIXAD FEB8 2F CPL FEB9 AE XOR (HL) FEBA 77 LD (HL),A FEBB 1805 JR PLTRET ;Unplot point FEBD CDC5FE UNPLOT CALL PIXAD FEC0 A6 AND (HL) FEC1 77 LD (HL),A FEC2 F1 PLTRET POP AF FEC3 E1 POP HL FEC4 C9 RET ;Convert x,y coords into d.file address & bit map FEC5 C5 PIXAD PUSH BC FEC6 44 LD B,H FEC7 4D LD C,L FEC8 CDAA22 CALL #22AA FECB 47 LD B,A FECC 04 INC B FECD 3EFE LD A,#FE FECF 0F PIXEL RRCA FED0 10FD DJNZ PIXEL FED2 C1 POP BC FED3 C9 RET ;Variables FED4 64 XPOS DEFB 100 ;X,Y coordinates of centre FED5 64 YPOS DEFB 100 ;of explosion on screen FED6 0A LIMIT DEFB 10 ;Max. radius of explosion FED7 05 SPEED DEFB 5 ;Speed of explosion FED8 00 DONE DEFB 0 ;Flag to indicate end of explosion FED9 00 COUNT DEFB 0 ;Interrupts before next octagon FEDA 00 SIZE DEFB 0 ;Current radius of explosion FEDB 0000 DE1 DEFW 0 ;Horizontal and vertical FEDD 0000 DE2 DEFW 0 ;components of diagonal FEDF 00 INOUT DEFB 0 ;0=growing; 1=shrinking ;Table of directions FEE0 FFFF DIRTAB DEFW #FFFF ;Left FEE2 0001 DEFW #0100 ;Up FEE4 0100 DEFW #0001 ;Right FEE6 000F DEFW #FF00 ;Down !0.......^.........^.........^.. !B DOT FADE EXPLOSION (FADE) !1.......^.........^.........^.........^........ Technically this isn't really an explosion at all. What happens here is that the object to be "de-materialised" fades away dot-by-dot. The start address for the object code is 64767 (FCFF Hex), and the first unused address should be 64922 (FD9A Hex). When you've entered the code, save using SAVE "fade" CODE 64767,155 or SAVE !0.......^.........^.........^.. 10 REM *********************** 20 REM FADE DEMO 30 REM *********************** 40 REM 50 REM ASSIGN VARIABLES 60 REM 70 LET dpos=64914 80 LET apos=64915 90 LET dlim=64916 100 LET alim=64917 110 LET speed=64918 120 LET done=64919 130 REM 140 REM FILL SCREEN 150 REM 160 FOR i=1 TO 704 170 PRINT CHR$ (RND*95+32); 180 NEXT i 190 REM 200 REM INITIALISE FADE 210 REM 220 POKE dpos,0 230 POKE apos,0 240 POKE dlim,22 250 POKE alim,32 260 POKE speed,10 270 REM 280 REM CALL FADE 290 REM 300 RANDOMIZE USR 64769 310 REM 320 REM WAIT UNTIL END 330 REM 340 IF PEEK done THEN STOP 350 GO TO 340 !2.......^.........^.........^.........^.........^.........^.... The Dot Fade demo: fills an area of the screen with random characters and erases them pixel-by-pixel. !1.......^.........^.........^.........^........ !B *"m";1;"fade" CODE 64767,155 - for tape or Microdrive respectively. If everything has gone OK so far, then try out the FADE DEMO program. This will (hopefully) fill the screen with random characters and then erase them pixel-by-pixel. To use the routine from your own programs, just POKE the locations shown below with the appropriate values and then use the command RANDOMIZE USR 64769. The variables used are: !0.......^.........^.........^.. DPOS: 64914 (FD92 Hex) APOS: 64915 (FD93 Hex) !1.......^.........^.........^.........^........ These should be POKEd with the down and across coordinates of the top left character square in the area to be exploded. Note that this is a different approach to the one used in MCEXP which uses x,y coordinates (this is, pixel coordinates). !0.......^.........^.........^.. DLIM: 64916 (FD94 Hex) ALIM: 64917 (FD95 Hex) !1.......^.........^.........^.........^........ These should be POKEd with the size of the area in character squares, down and across respec- tively. !0.......^.........^.........^.. SPEED: 64918 (FD96 Hex) !1.......^.........^.........^.........^........ The speed of the explosion. Again, one is fast, 255 is slow. Total time of explosion = SPEED/3 seconds (approx). Large areas may take consider- ably longer. !0.......^.........^.........^.. DONE: 64919 (FD97 Hex) !1.......^.........^.........^.........^........ The same as for MCEXP. !2.......^.........^.........^.........^.........^.........^.... !B FCFF ORG #FCFF FCFF 15FD DEFW FADE ;Initialise variables and interrupts FD01 AF GO XOR A FD02 3297FD LD (DONE),A FD05 3C INC A FD06 3298FD LD (COUNT),A FD09 3E08 LD A,#08 FD0B 3299FD LD (ROUND),A FD0E 3EFC LD A,#FC ;This makes Z80 jump to the sub- FD10 ED47 LD I,A ;routine whose address is stored FD12 ED5E IM 2 ;at FCFF on each interrupt FD14 C9 RET ;This code is executed every 0.02 secs FD15 C5 FADE PUSH BC FD16 D5 PUSH DE FD17 E5 PUSH HL FD18 F5 PUSH AF ;Erase some dots every (SPEED)/50 secs FD19 2198FD LD HL,COUNT FD1C 35 DEC (HL) FD1D 2047 JR NZ,RET FD1F 3A96FD LD A,(SPEED) FD22 77 LD (HL),A FD23 ED5B92FD LD DE,(DPOS) FD27 ED4B94FD LD BC,(DLIM) FD2B CB21 SLA C ;Convert number of FD2D CB21 SLA C ;rows to number of FD2F CB21 SLA C ;hires screen lines FD31 2199FD LD HL,ROUND FD34 35 DEC (HL) FD35 2816 JR Z,END ;Erase some dots in the specified area FD37 CD6DFD CALL CHRADR FD3A 50 MLOOP1 LD D,B FD3B 5D LD E,L FD3C ED5F BYTE1 LD A,R ;Reasonably random number FD3E A6 AND (HL) FD3F 77 LD (HL),A FD40 2C INC L FD41 10F9 DJNZ BYTE1 FD43 42 LD B,D FD44 6B LD L,E FD45 CD7CFD CALL NXTLIN FD48 0D DEC C FD49 20EF JR NZ,MLOOP1 FD4B 1819 JR RET ;Clear the specified area FD4D CD6DFD END CALL CHRADR FD50 50 MLOOP2 LD D,B FD51 5D LD E,L FD52 AF XOR A FD53 77 BYTE2 LD (HL),A FD54 2C INC L FD55 10FC DJNZ BYTE2 FD57 42 LD B,D FD58 6B LD L,E FD59 CD7CFD CALL NXTLIN FD5C 0D DEC C FD5D 20F1 JR NZ,MLOOP2 FD5F 3E01 LD A,#01 FD61 3297FD LD (DONE),A FD64 ED56 IM 1 ;Restore registers & jump to ROM interrupt routine FD66 F1 RET POP AF FD67 E1 POP HL FD68 D1 POP DE FD69 C1 POP BC FD6A C33800 JP #0038 ;Convert d,a character position to d.file address FD6D 7B CHRADR LD A,E FD6E 0F RRCA FD6F 0F RRCA FD70 0F RRCA FD71 E6E0 AND #E0 FD73 82 ADD A,D FD74 6F LD L,A FD75 7B LD A,E FD76 E618 AND #18 FD78 F640 OR #40 FD7A 67 LD H,A FD7B C9 RET ;Find address of next line from address of present FD7C 7C NXTLIN LD A,H FD7D 0F RRCA FD7E 0F RRCA FD7F 0F RRCA FD80 C620 ADD A,#20 FD82 3009 JR NC,DONE2 FD84 67 LD H,A FD85 7D LD A,L FD86 C620 ADD A,#20 FD88 6F LD L,A FD89 3001 JR NC,DONE1 FD8B 24 INC H FD8C 7C DONE1 LD A,H FD8D 07 DONE2 RLCA FD8E 07 RLCA FD8F 07 RLCA FD90 67 LD H,A FD91 C9 RET ;Variables FD92 00 DPOS DEFB 0 ;Down and across position FD93 00 APOS DEFB 0 ;of explosion on screen FD94 05 DLIM DEFB 5 ;Size of explosion FD95 20 ALIM DEFB 32 ;in character squares FD96 32 SPEED DEFB 50 ;Speed of explosion FD97 00 DONE DEFB 0 ;Flag to indicate end of explosion FD98 00 COUNT DEFB 0 ;Interrupts to go before next fade FD99 00 ROUND DEFB 0 ;Number of fades to go !0.......^.........^.........^.. !B COLOUR FLASH EXPLOSION (FLASH) !1.......^.........^.........^.........^........ In this explosion, various different patterns of random dots flash up onto the screen in many colours and then disappear. The routine itself is very similar to the FADE routine, and using it is exactly the same except that the numbers are different. Therefore I'll just give you the !0.......^.........^.........^.. 10 REM *********************** 20 REM FLASH DEMO 30 REM *********************** 40 REM 50 REM ASSIGN VARIABLES 60 REM 70 LET dpos=64706 80 LET apos=64707 90 LET dlim=64708 100 LET alim=64709 110 LET speed=64710 120 LET done=64711 130 REM 140 REM FILL SCREEN 150 REM 160 FOR i=1 TO 704 170 PRINT CHR$ (RND*95+32); 180 NEXT i 190 REM 200 REM INITIALISE FLASH 210 REM 220 POKE dpos,0 230 POKE apos,0 240 POKE dlim,22 250 POKE alim,32 260 POKE speed,5 270 REM 280 REM CALL FLASH 290 REM 300 RANDOMIZE USR 64513 310 REM 320 REM WAIT UNTIL END 330 REM 340 IF PEEK done THEN STOP 350 GO TO 340 !2.......^.........^.........^.........^.........^.........^.... The Colour Flash demo: flashes a number of random characters in different colours and then erases them. !1.......^.........^.........^.........^........ !B numbers, as it were, and you can use the text from FADE as a guide where necessary. But, there is one other important difference - the demon- stration program is called FLASH DEMO and it fills the screen with random characters and then explodes them appropriately. Here are the various numbers: Start address: 64511 (FBFF Hex) First unused address: 64714 (FCCA Hex) Saving: SAVE "flash" CODE 64511,203 or SAVE *"m";1;"flash" CODE 64511,203 (for tape or Microdrive respectively). To use from Basic: RANDOMIZE USR 64513 Variables: !0.......^.........^.........^.. DPOS: 64706 (FCC2 Hex) APOS: 64707 (FCC3 Hex) DLIM: 64708 (FCC4 Hex) ALIM: 64709 (FCC5 Hex) SPEED: 64710 (FCC6 Hex) DONE: 64711 (FCC7 Hex) !1.......^.........^.........^.........^........ Note that each of the routines occupies a diff- erent area of memory (they don't overlap). It's therefore possible to have all three routines in memory at the same time - although you'll only ever have one explosion occurring on the screen at any one time. Also, the use of BEEP, LOAD or SAVE while an interrupt is occurring will tempo- rarily halt it. Happy zapping! !2.......^.........^.........^.........^.........^.........^.... !B FBFF ORG #FBFF FBFF 15FC DEFW FLASH ;Initialise variables and interrupts FC01 AF GO XOR A FC02 32C7FC LD (DONE),A FC05 3C INC A FC06 32C8FC LD (COUNT),A FC09 3E08 LD A,#08 FC0B 32C9FC LD (ROUND),A FC0E 3EFB LD A,#FB ;This makes Z80 jump to the sub- FC10 ED47 LD I,A ;routine whose address is stored FC12 ED5E IM 2 ;at FBFF on each interrupt FC14 C9 RET ;This code is executed every 0.02 secs FC15 C5 FLASH PUSH BC FC16 D5 PUSH DE FC17 E5 PUSH HL FC18 F5 PUSH AF ;Flash every (SPEED)/50 secs FC19 21C8FC LD HL,COUNT FC1C 35 DEC (HL) FC1D 2077 JR NZ,RET FC1F 3AC6FC LD A,(SPEED) FC22 77 LD (HL),A FC23 ED5BC2FC LD DE,(DPOS) FC27 ED4BC4FC LD BC,(DLIM) FC2B CB21 SLA C ;Convert number of FC2D CB21 SLA C ;rows to number of FC2F CB21 SLA C ;hires screen lines FC31 21C9FC LD HL,ROUND FC34 35 DEC (HL) FC35 2846 JR Z,END ;Flash specified area FC37 CD9DFC CALL CHRADR FC3A 50 MLOOP1 LD D,B FC3B 5D LD E,L FC3C ED5F BYTE1 LD A,R FC3E 77 LD (HL),A FC3F ED5F LD A,R ;Reasonably random number FC41 0F RRCA FC42 0F RRCA FC43 AE XOR (HL) FC44 77 LD (HL),A FC45 2C INC L FC46 10F4 DJNZ BYTE1 FC48 42 LD B,D FC49 6B LD L,E FC4A CDACFC CALL NXTLIN FC4D 0D DEC C FC4E 20EA JR NZ,MLOOP1 FC50 2AC2FC LD HL,(DPOS) ;Convert d,a position to address in attribute file FC53 7C LD A,H FC54 2600 LD H,#00 FC56 0605 LD B,#05 FC58 29 DOUBLE ADD HL,HL FC59 10FD DJNZ DOUBLE FC5B B5 OR L FC5C 6F LD L,A FC5D 7C LD A,H FC5E F658 OR #58 FC60 67 LD H,A ;Colour in specified area with (ROUND) ink FC61 ED4BC4FC LD BC,(DLIM) FC65 3AC9FC LD A,(ROUND) FC68 57 LD D,A FC69 5D ALINE LD E,L FC6A C5 PUSH BC FC6B 7E ABYTE LD A,(HL) FC6C E6F8 AND #F8 FC6E B2 OR D FC6F 77 LD (HL),A FC70 2C INC L FC71 10F8 DJNZ ABYTE FC73 6B LD L,E FC74 0E20 LD C,#20 FC76 09 ADD HL,BC FC77 C1 POP BC FC78 0D DEC C FC79 20EE JR NZ,ALINE FC7B 1819 JR RET ;Clear specified area FC7D CD9DFC END CALL CHRADR FC80 50 MLOOP2 LD D,B FC81 5D LD E,L FC82 AF XOR A FC83 77 BYTE2 LD (HL),A FC84 2C INC L FC85 10FC DJNZ BYTE2 FC87 42 LD B,D FC88 6B LD L,E FC89 CDACFC CALL NXTLIN FC8C 0D DEC C FC8D 20F1 JR NZ,MLOOP2 FC8F 3E01 LD A,#01 FC91 32C7FC LD (DONE),A FC94 ED56 IM 1 ;Restore registers & jump to ROM interrupt routine FC96 F1 RET POP AF FC97 E1 POP HL FC98 D1 POP DE FC99 C1 POP BC FC9A C33800 JP #0038 ;Convert d,a character position to d.file address FC9D 7B CHRADR LD A,E FC9E 0F RRCA FC9F 0F RRCA FCA0 0F RRCA FCA1 E6E0 AND #E0 FCA3 82 ADD A,D FCA4 6F LD L,A FCA5 7B LD A,E FCA6 E618 AND #18 FCA8 F640 OR #40 FCAA 67 LD H,A FCAB C9 RET ;Find address of next line from address of present FCAC 7C NXTLIN LD A,H FCAD 0F RRCA FCAE 0F RRCA FCAF 0F RRCA FCB0 C620 ADD A,#20 FCB2 3009 JR NC,DONE2 FCB4 67 LD H,A FCB5 7D LD A,L FCB6 C620 ADD A,#20 FCB8 6F LD L,A FCB9 3001 JR NC,DONE1 FCBB 24 INC H FCBC 7C DONE1 LD A,H FCBD 07 DONE2 RLCA FCBE 07 RLCA FCBF 07 RLCA FCC0 67 LD H,A FCC1 C9 RET ;Variables FCC2 00 DPOS DEFB 0 ;Down and across position FCC3 00 APOS DEFB 0 ;of explosion on screen FCC4 05 DLIM DEFB 5 ;Size of explosion FCC5 20 ALIM DEFB 32 ;in character squares FCC6 32 SPEED DEFB 50 ;Speed of explosion FCC7 00 DONE DEFB 0 ;Flag to indicate end of explosion FCC8 00 COUNT DEFB 0 ;Interrupts to go before next fade FCC9 00 ROUND DEFB 0 ;Number of fades to go !1.......^.........^.........^.........^........ !B -- from Your Spectrum #6 (Aug.1984) -- !$