!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)
--
!$
