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

--

!$

