; This command tells Zeus where to put the code it generates. As a szx file...
; Alter the path to suit your system

	output_szx "c:\spi.szx",$8000,Start     ; The szx file

; If for some reason you want binary, uncomment this line
	output_bin "c:\spi.bin",$0000,$10000	; The binary file

             ORG #8000
ENT
             ; Another Great Game From Crystal
             ;
             ;
             ;
lInv         EQU 32
nInv         EQU 45
InvStep      EQU 3
InvSp        EQU 30
InvVStep     EQU 3
InvLeftMar   EQU 14
InvRightMar  EQU 244
nProj        EQU 4
BLeft        EQU 15
SLeft        EQU 15
BRight       EQU 240
SRight       EQU 240
ShipVel      EQU 34
ShipTime     EQU 20000

TgAlive      EQU 0
TgX          EQU 1
TgY          EQU 2
TgSpeedI     EQU 3
TgSpeed      EQU 4
TgType       EQU 5
TgMissDisp   EQU 6
TgMissInv    EQU 7
TgMissCount  EQU 8

InvTable     EQU #E000
ProjTable    EQU #F000
Start        CALL InitGame
             CALL Game
             JR Start
InitGame     LD A,3
             LD (nBases),A
             LD A,0
             LD (nSheets),A
             CALL InitBaseSh
             CALL InitInvSh
             CALL InitExplSh
             RET
nBases       NOP
nSheets      NOP
InitBaseSh   LD HL,BaseDef1
             LD DE,BaseDefn
             LD BC,32
             LDIR
             LD HL,BaseDefn
             LD DE,BaseDefn+32
             LD B,56
IBSa         OR A:LD A,(HL):RRA:LD (DE),A
             INC DE:INC HL
             LD A,(HL):RRA:LD (DE),A
             INC DE:INC HL
             LD A,(HL):RRA:LD (DE),A
             INC DE:INC HL
             LD A,(HL):RRA:LD (DE),A
             INC DE:INC HL
             DJNZ IBSa
             RET
InitInvSh    LD B,6
             LD IX,InvShapes
             LD IY,InvDef0
IIShlp       PUSH BC:CALL InitInv1:POP BC
             LD DE,44:ADD IY,DE
             LD DE,352:ADD IX,DE
             DJNZ IIShlp
             RET
InitExplSh   LD B,5          ;Include ship .
             LD IX,Expl1
             LD IY,ExplDefn1
IEShlp       PUSH BC:CALL InitExp1:POP BC
             LD DE,32:ADD IY,DE
             LD DE,256:ADD IX,DE
             DJNZ IEShlp
             RET
InitExp1     PUSH IY:POP HL
             PUSH IX:POP DE
             LD BC,32
             LDIR
             PUSH IX:POP DE
             LD HL,32:ADD HL,DE:EX DE,HL
             LD B,56
             JP IBSa
InitInv1     PUSH IY:POP HL
             PUSH IX:POP DE
             LD BC,44
             LDIR
             PUSH IX:POP DE
             LD HL,44:ADD HL,DE:EX DE,HL
             LD B,77
             JP IBSa
InitInvaders LD IX,InvTable
             LD DE,0
             LD C,5
II1          LD B,9
             PUSH DE
II2          PUSH BC
             CALL CreateInv
             PUSH DE
             LD DE,lInv
             ADD IX,DE
             POP DE
             INC E
             POP BC
             DJNZ II2
             POP DE
             INC D
             DEC C
             JR NZ II1
             LD A,nInv:LD (NoInv1),A
             LD (cInv),A
             LD A,1:LD (InvDir),A
             LD A,0:LD (ChangeDir),A
             RET
CreateInv    EQU $
             ; IX = Entry in table
             ; E  = X pos on screen 0..7
             ; D  = Y pos on screen 0..5
             LD (IX+TgType),D
             LD (IX+TgAlive),1
             LD A,E
             ADD A,A:ADD A,A:ADD A,A:ADD A,A
             ADD A,E:ADD A,E:ADD A,12
             LD (IX+TgX),A
             LD A,D
             ADD A,A:ADD A,A:ADD A,A:ADD A,A
             ADD A,8
             LD B,A
             LD A,(nSheets)
             ADD A,A:ADD A,A:ADD A,A:ADD A,A
             ADD A,B
             LD (IX+TgY),A
             RET
InitProj     LD IX,ProjTable
             LD B,nProj+1
             LD DE,lInv
IPlp         LD (IX+TgAlive),0
             ADD IX,DE
             DJNZ IPlp
             RET
InitBase     XOR A
             LD (KilledF),A
             LD A,31
             LD (BaseX),A
             RET
Game         CALL InitInvaders
             CALL InitProj
             CALL InitBase
             CALL PlaySheet
             LD A,(KilledF)
             OR A
             JR Z GameNS
             LD A,(nBases)
             DEC A
             LD (nBases),A
             RET Z
             JR Game
GameNS       LD A,(nSheets)
             INC A
             LD (nSheets),A
             JR Game
KilledF      NOP
PlaySheet    CALL CLS
             CALL DrawShields
             CALL ORBase
             CALL DisplayInvs
             XOR A
             LD (EndF),A
             LD A,#C9
             LD (MoveShip),A
             LD HL,ShipTime
             LD (NextShipT),HL
PlayLoop     CALL MoveBase
             CALL MoveProj
             CALL MoveInvs
             CALL MoveShip
             CALL NextShip
             LD BC,61438:IN A,(C):BIT 0,A:JP Z 0
             LD A,(EndF)
             OR A
             RET NZ
             JR PlayLoop
EndF         NOP
CLS          LD HL,#4000
             LD DE,#4001
             LD BC,#1800
             LD (HL),0
             LDIR
             LD (HL),#06
             LD BC,32
             LDIR
             LD (HL),#07
             LD BC,#240
             LDIR
             LD (HL),#04
             LD BC,#9F
             LDIR
             LD A,0
             OUT (#FE),A
             RET
DrawShields  LD B,4
             LD A,2
DS1          CALL Shield
             ADD A,8
             DJNZ DS1
             RET
Shield       PUSH BC
             LD IX,ShieldYs
             LD HL,ShieldDefn
             LD B,28
Shield1      PUSH BC
             EX DE,HL
             LD C,A:LD B,0:LD L,(IX):LD H,(IX+1)
             ADD HL,BC
             EX DE,HL
             LD BC,4
             LDIR
             POP BC
             INC IX:INC IX
             DJNZ Shield1
             POP BC
             RET
ORShip       LD A,(ShipX):SUB 12
             AND #7
             RRCA:RRCA:RRCA
             LD HL,Ship1
             LD E,A:LD D,0
             ADD HL,DE
             EX DE,HL
             LD A,(ShipX):SUB 12
             RRCA:RRCA:RRCA
             AND #1F
             LD IX,ShipYs
             JR ORIt
ANDShip      LD A,(ShipX):SUB 12
             AND #7
             RRCA:RRCA:RRCA
             LD HL,Ship1
             LD E,A:LD D,0
             ADD HL,DE
             EX DE,HL
             LD A,(ShipX):SUB 12
             RRCA:RRCA:RRCA
             AND #1F
             LD IX,ShipYs
             JP ANDIt
ORBase       LD A,(BaseX):SUB 12
             AND #7
             RRCA:RRCA:RRCA
             LD HL,BaseDefn
             LD E,A:LD D,0
             ADD HL,DE
             EX DE,HL
             LD A,(BaseX):SUB 12
             RRCA:RRCA:RRCA
             AND #1F
             LD IX,BaseYs
ORIt         LD B,8
DBlp         PUSH BC
             LD L,(IX):LD H,(IX+1)
             LD C,A:LD B,0
             ADD HL,BC
             LD B,4:LD C,A
DBlp1        LD A,(DE):OR (HL):LD (HL),A
             INC DE:INC HL
             DJNZ DBlp1
             LD A,C
             POP BC
             INC IX:INC IX
             DJNZ DBlp
             RET
ORINV        LD B,11
OIlp         PUSH BC
             LD L,(IX):LD H,(IX+1)
             LD C,A:LD B,0
             ADD HL,BC
             LD B,4:LD C,A
OIlp1        LD A,(DE):OR (HL):LD (HL),A
             INC DE:INC HL
             DJNZ OIlp1
             LD A,C
             POP BC
             INC IX:INC IX
             DJNZ OIlp
             RET
ANDBase      LD A,(BaseX):SUB 12
             AND #7
             RRCA:RRCA:RRCA
             LD HL,BaseDefn
             LD E,A:LD D,0
             ADD HL,DE
             EX DE,HL
             LD A,(BaseX):SUB 12
             RRCA:RRCA:RRCA
             AND #1F
             LD IX,BaseYs
ANDIt        LD B,8
Dilp         PUSH BC
             LD L,(IX):LD H,(IX+1)
             LD C,A:LD B,0
             ADD HL,BC
             LD B,4:LD C,A
Dilp1        LD A,(DE):CPL:AND(HL):LD (HL),A
             INC DE:INC HL
             DJNZ Dilp1
             LD A,C
             POP BC
             INC IX:INC IX
             DJNZ Dilp
             RET
ANDINV       LD B,11
AIlp         PUSH BC
             LD L,(IX):LD H,(IX+1)
             LD C,A:LD B,0
             ADD HL,BC
             LD B,4:LD C,A
AIlp1        LD A,(DE):CPL:AND(HL):LD (HL),A
             INC DE:INC HL
             DJNZ AIlp1
             LD A,C
             POP BC
             INC IX:INC IX
             DJNZ AIlp
             RET
DisplayInvs  LD B,nInv
             LD IX,InvTable
DIlp         LD A,(IX+TgAlive)
             OR A
             CALL NZ ORInv
             LD DE,lInv:ADD IX,DE
             DJNZ DIlp
             RET
ORInv        PUSH BC:PUSH IX
             CALL CalcInvAdd
             PUSH HL
             LD A,(IX+TgY)
             ADD A,A
             LD C,A:LD A,0:ADC A,0:LD B,A
             LD HL,LineYs
             ADD HL,BC
             PUSH HL
             LD A,(IX+TgX):SUB 12
             RRCA:RRCA:RRCA
             AND #1F
             POP IX
             POP DE
             CALL ORINV
             POP IX
             POP BC
             RET
ANDInv       PUSH BC:PUSH IX
             CALL CalcInvAdd
             PUSH HL
             LD A,(IX+TgY)
             ADD A,A
             LD C,A:LD A,0:ADC A,0
             LD B,A
             LD HL,LineYs
             ADD HL,BC
             PUSH HL
             LD A,(IX+TgX):SUB 12
             RRCA:RRCA:RRCA
             AND #1F
             POP IX
             POP DE
             CALL ANDINV
             POP IX
             POP BC
             RET
CalcInvAdd   LD A,(IX+TgType)
             LD DE,352
             LD HL,InvShapes
CIA          OR A
             JR Z CIA1
             ADD HL,DE
             DEC A
             JR CIA
CIA1         LD A,(IX+TgX):SUB 12
             AND #7
             LD DE,44
CIA2         OR A
             RET Z
             ADD HL,DE
             DEC A
             JR CIA2
BaseAlive    DEFB 1
BaseX        DEFB 10
BaseY        DEFB 191-8
BaseSpeed    DEFB 1
FireP        DEFB 0
MoveBase     LD A,(BaseSpeed)
             DEC A
             LD (BaseSpeed),A
             JR NZ MB4
             LD A,25
             LD (BaseSpeed),A
             CALL MB3
MB4          LD BC,32766
             IN A,(C)
             BIT 0,A
             JR NZ MB1
             LD A,(FireP)
             OR A
             LD A,1:LD (FireP),A
             RET NZ
             LD D,0-3&#FF
             LD E,191-15
             LD B,20:LD C,0
             LD IX,BaseAlive
             CALL FireProjB
             RET
MB1          XOR A:LD (FireP),A:RET
MB3          LD BC,65278
             IN A,(C)
             AND #06
             JP PE ORBase
             BIT 1,A
             JR NZ MBRight
             LD A,(BaseX)
             CP BLeft
             RET Z
             CALL ANDBase
             LD A,(BaseX):DEC A:LD (BaseX),A
             JP ORBase
MBRight      LD A,(BaseX)
             CP BRight
             RET Z
             CALL ANDBase
             LD A,(BaseX):INC A:LD (BaseX),A
             JP ORBase
InvDir       DEFB 0
InvSpeed     DEFB 1
NoInv1       DEFB 0
NoInv2       DEFB 0
cInv         DEFB 0
pcInv        DEFW InvTable
ChangeDir    DEFB 0
MoveInvs     LD A,(InvSpeed)
             DEC A
             LD (InvSpeed),A
             RET NZ
             LD A,InvSp
             LD (InvSpeed),A
MI1          LD A,(cInv):LD HL,(pcInv)
             CP nInv
             JP Z LastInv
             INC A:LD (cInv),A
             LD DE,lInv:ADD HL,DE
             LD (pcInv),HL
MI1a         LD A,(HL)
             OR A
             JR Z MI1
             LD A,(NoInv1):INC A:LD (NoInv1),A
             PUSH HL:POP IX
             CALL ANDInv
             CALL DoMoveInv
             LD A,(IX+TgType)
             XOR #01
             LD (IX+TgType),A
             CALL ORInv
Rnd1         LD A,R
             AND #F:CP 9:JR NC Rnd1
             ADD A,A:ADD A,A:ADD A,A
             ADD A,A:ADD A,A
             LD E,A:LD A,0:ADC A,0:LD D,A
             LD HL,InvTable+1024+128
             ADD HL,DE
             LD B,5
             LD DE,0-288
FindItLp     LD A,(HL)
             OR A
             JR NZ FILx
             ADD HL,DE
             DJNZ FindItLp
             RET
FILx         PUSH HL:POP IX
             LD A,R:AND #50:RET NZ
FireIN       LD A,(IX+TgY):ADD A,20:LD E,A
             LD A,R:AND #01:LD C,A:NEG:ADD A,4
             LD D,A
             LD A,R:AND #3F:ADD A,20:LD B,A
             CALL FireProj
             RET C
             LD (IY+TgMissInv),1
             RET
DoMoveInv    LD A,(InvDir)
             BIT 7,A
             CALL NZ DMIDown
             BIT 0,A
             JR NZ DMIRight
             LD A,(IX+TgX)
             SUB InvStep
             LD (IX+TgX),A
             CP InvLeftMar
             RET NC
             LD A,1:LD (ChangeDir),A
             RET
             RET
DMIRight     LD A,(IX+TgX)
             ADD A,InvStep
             LD (IX+TgX),A
             CP InvRightMar
             RET C
             LD A,1:LD (ChangeDir),A
             RET
DMIDown      EX AF,AF'
             LD A,(IX+TgY)
             ADD A,InvVStep
             LD (IX+TgY),A
             EX AF,AF'
             RET
LastInv      LD A,(NoInv1):LD (NoInv2),A
             OR A
             JR NZ MI2
             LD A,1
             LD (EndF),A
             RET
MI2          XOR A:LD (NoInv1),A
             INC A:LD (cInv),A
             LD A,(InvDir):AND #1:LD (InvDir),A
             LD HL,InvTable
             LD (pcInv),HL
             LD A,(ChangeDir):OR A:JP Z MI1a
             XOR A:LD (ChangeDir),A
             LD A,(InvDir):OR #80:XOR #01
             LD (InvDir),A
             JP MI1a
MoveShip     NOP
             LD A,(ShipSpeed)
             DEC A
             LD (ShipSpeed),A
             RET NZ
             LD A,ShipVel
             LD (ShipSpeed),A
             CALL ANDShip
             LD A,(ShipDelX)
             LD B,A
             LD A,(ShipX)
             ADD A,B
             LD (ShipX),A
             LD B,A
             LD A,(TargetMargin)
             CP B
             JR Z MSexit
             CALL ORShip
             RET
MSexit       LD A,#C9:LD (MoveShip),A
             RET
ShipSpeed    DEFB 1
ShipX        DEFB SLeft
ShipDelX     DEFB 1
TargetMargin DEFB SRight
NextShip     LD HL,(NextShipT)
             DEC HL
             LD (NextShipT),HL
             LD A,L:OR H
             RET NZ
             LD HL,ShipTime
             LD (NextShipT),HL
             LD A,(NoInv2)
             CP 8
             RET C
             XOR A
             LD (MoveShip),A
             LD A,R
             AND #01
             JR Z NSRight
             LD A,SLeft:LD (TargetMargin),A
             LD A,SRight:LD (ShipX),A
             LD A,1:LD (ShipSpeed),A
             LD A,0-1&#FF:LD (ShipDelX),A
             RET
NSRight      LD A,SRight:LD (TargetMargin),A
             LD A,SLeft :LD (ShipX),A
             LD A,1:LD (ShipSpeed),A
             LD A,1:LD (ShipDelX),A
             RET
NextShipT    DEFW ShipTime
MoveProj     LD B,nProj+1
             LD IX,ProjTable
MPlp         LD A,(IX+TgAlive)
             OR A
             CALL NZ MP1
             LD DE,lInv
             ADD IX,DE
             DJNZ MPlp
             RET
MP1          DEC (IX+TgSpeed)
             RET NZ
             LD A,(IX+TgSpeedI):LD (IX+TgSpeed),A
             PUSH BC
             CALL RemoveProj
             LD A,(IX+TgMissCount)
             INC A:CP 3:JR NZ MP1z
             XOR A
MP1z         LD (IX+TgMissCount),A
             BIT 7,(IX+TgType)
             JR NZ MP1a
             LD A,(IX+TgY)
             ADD A,(IX+TgMissDisp)
             LD (IX+TgY),A
             CP 4
             JR C MP2
             CP 191-4
             JR NC MP2
MP1a         CALL PlaceProj
             POP BC:RET
MP2          CALL Explode:POP BC:RET
Explode      CALL RemoveProj:LD (IX+TgAlive),4
             LD (IX+TgType),#80
             LD (IX+TgSpeed),50
             LD (IX+TgSpeedI),50
             RET
ANDBar       LD A,(IX+TgX)
             AND #07
             LD HL,BitTable
             LD E,A:LD D,0
             ADD HL,DE
             LD A,(HL)
             CPL
             LD C,A
             LD A,(IX+TgY)
             LD L,A:LD H,0
             ADD HL,HL
             LD DE,LineYs
             ADD HL,DE
             PUSH HL:POP IY
             LD A,(IX+TgX)
             RRCA:RRCA:RRCA
             AND #1F
             LD E,A:LD D,0
             LD B,8
RPlp         LD L,(IY):LD H,(IY+1)
             ADD HL,DE
             EX AF,AF'
             LD A,(HL):AND C:LD (HL),A
             EX AF,AF'
             INC IY:INC IY
             DJNZ RPlp
             RET
ORBar        XOR A:LD (ProjHit),A
             LD A,(IX+TgX)
             AND #07
             LD HL,BitTable
             LD E,A:LD D,0
             ADD HL,DE
             LD A,(HL)
             LD C,A
             LD A,(IX+TgY)
             LD L,A:LD H,0
             ADD HL,HL
             LD DE,LineYs
             ADD HL,DE
             PUSH HL:POP IY
             LD A,(IX+TgX)
             RRCA:RRCA:RRCA
             AND #1F
             LD E,A:LD D,0
             LD B,8
PPlp         LD L,(IY):LD H,(IY+1)
             ADD HL,DE
             EX AF,AF'
             LD A,(HL):AND C:JR NZ PPlp1
             LD A,(HL):OR C:LD (HL),A
             EX AF,AF'
             INC IY:INC IY
             DJNZ PPlp
             RET
PPlp1        CALL Explode
             PUSH IX
             CALL TestAndKill
             POP IX
             RET
ProjHit      NOP
ZigCalc      LD A,(IX+TgX)
             SUB 4
             AND #07
             ADD A,A:ADD A,A:ADD A,A:ADD A,A
             LD HL,ZigTable
             LD E,A:LD D,0
             LD A,(IX+TgMissCount):OR A:JR Z ZC1
             LD HL,ZigTable+128:DEC A:JR Z ZC1
             LD HL,ZigTable+256
ZC1          ADD HL,DE
             PUSH HL
             LD A,(IX+TgY)
             LD L,A:LD H,0
             ADD HL,HL
             LD DE,LineYs
             ADD HL,DE
             PUSH HL:POP IY
             LD A,(IX+TgX)
             SUB 4
             RRCA:RRCA:RRCA
             AND #1F
             LD E,A:LD D,0
             LD B,8
             EXX:POP HL:EXX
             RET
ANDZig       CALL ZigCalc
ZAlp         LD L,(IY):LD H,(IY+1)
             ADD HL,DE
             EX AF,AF'
             EXX:LD A,(HL):INC HL:EXX
             CPL:AND(HL):LD (HL),A
             INC HL
             EXX:LD A,(HL):INC HL:EXX
             CPL:AND(HL):LD (HL),A
             EX AF,AF'
             INC IY:INC IY
             DJNZ ZAlp
             RET
ORZig        CALL ZigCalc
ZOlp         LD L,(IY):LD H,(IY+1)
             ADD HL,DE
             EX AF,AF'
             EXX:LD A,(HL):EXX
             AND(HL):JP NZ PPlp1
             EXX:LD A,(HL):INC HL:EXX
             OR (HL):LD (HL),A:INC HL
             EXX:LD A,(HL):EXX
             AND(HL):JP NZ PPlp1
             EXX:LD A,(HL):INC HL:EXX
             OR (HL):LD (HL),A
             EX AF,AF'
             INC IY:INC IY
             DJNZ ZOlp
             RET
ZigTable     DEFB #08,#00
             DEFB #10,#00
             DEFB #08,#00
             DEFB #04,#00
             DEFB #08,#00
             DEFB #10,#00
             DEFB #08,#00
             DEFB #04,#00
;0
             DEFB #04,#00
             DEFB #08,#00
             DEFB #04,#00
             DEFB #02,#00
             DEFB #04,#00
             DEFB #08,#00
             DEFB #04,#00
             DEFB #02,#00
;1
             DEFB #02,#00
             DEFB #04,#00
             DEFB #02,#00
             DEFB #01,#00
             DEFB #02,#00
             DEFB #04,#00
             DEFB #02,#00
             DEFB #01,#00
;2
             DEFB #01,#00
             DEFB #02,#00
             DEFB #01,#00
             DEFB #00,#80
             DEFB #01,#00
             DEFB #02,#00
             DEFB #01,#00
             DEFB #00,#80
;3
             DEFB #00,#80
             DEFB #01,#00
             DEFB #00,#80
             DEFB #00,#40
             DEFB #00,#80
             DEFB #01,#00
             DEFB #00,#80
             DEFB #00,#40
;4
             DEFB #00,#40
             DEFB #00,#80
             DEFB #00,#40
             DEFB #00,#20
             DEFB #00,#40
             DEFB #00,#80
             DEFB #00,#40
             DEFB #00,#20
;5
             DEFB #00,#20
             DEFB #00,#40
             DEFB #00,#20
             DEFB #00,#10
             DEFB #00,#20
             DEFB #00,#40
             DEFB #00,#20
             DEFB #00,#10
;6
             DEFB #00,#10
             DEFB #00,#20
             DEFB #00,#10
             DEFB #00,#08
             DEFB #00,#10
             DEFB #00,#20
             DEFB #00,#10
             DEFB #00,#08
;7
             DEFB #10,#00
             DEFB #08,#00
             DEFB #04,#00
             DEFB #08,#00
             DEFB #10,#00
             DEFB #08,#00
             DEFB #04,#00
             DEFB #08,#00
;0
             DEFB #08,#00
             DEFB #04,#00
             DEFB #02,#00
             DEFB #04,#00
             DEFB #08,#00
             DEFB #04,#00
             DEFB #02,#00
             DEFB #04,#00
;1
             DEFB #04,#00
             DEFB #02,#00
             DEFB #01,#00
             DEFB #02,#00
             DEFB #04,#00
             DEFB #02,#00
             DEFB #01,#00
             DEFB #02,#00
;2
             DEFB #02,#00
             DEFB #01,#00
             DEFB #00,#80
             DEFB #01,#00
             DEFB #02,#00
             DEFB #01,#00
             DEFB #00,#80
             DEFB #01,#00
;3
             DEFB #01,#00
             DEFB #00,#80
             DEFB #00,#40
             DEFB #00,#80
             DEFB #01,#00
             DEFB #00,#80
             DEFB #00,#40
             DEFB #00,#80
;4
             DEFB #00,#80
             DEFB #00,#40
             DEFB #00,#20
             DEFB #00,#40
             DEFB #00,#80
             DEFB #00,#40
             DEFB #00,#20
             DEFB #00,#40
;5
             DEFB #00,#40
             DEFB #00,#20
             DEFB #00,#10
             DEFB #00,#20
             DEFB #00,#40
             DEFB #00,#20
             DEFB #00,#10
             DEFB #00,#20
;6
             DEFB #00,#20
             DEFB #00,#10
             DEFB #00,#08
             DEFB #00,#10
             DEFB #00,#20
             DEFB #00,#10
             DEFB #00,#08
             DEFB #00,#10
;7
             DEFB #08,#00
             DEFB #04,#00
             DEFB #08,#00
             DEFB #10,#00
             DEFB #08,#00
             DEFB #04,#00
             DEFB #08,#00
             DEFB #10,#00
;0
             DEFB #04,#00
             DEFB #02,#00
             DEFB #04,#00
             DEFB #08,#00
             DEFB #04,#00
             DEFB #02,#00
             DEFB #04,#00
             DEFB #08,#00
;1
             DEFB #02,#00
             DEFB #01,#00
             DEFB #02,#00
             DEFB #04,#00
             DEFB #02,#00
             DEFB #01,#00
             DEFB #02,#00
             DEFB #04,#00
;2
             DEFB #01,#00
             DEFB #00,#80
             DEFB #01,#00
             DEFB #02,#00
             DEFB #01,#00
             DEFB #00,#80
             DEFB #01,#00
             DEFB #02,#00
;3
             DEFB #00,#80
             DEFB #00,#40
             DEFB #00,#80
             DEFB #01,#00
             DEFB #00,#80
             DEFB #00,#40
             DEFB #00,#80
             DEFB #01,#00
;4
             DEFB #00,#40
             DEFB #00,#20
             DEFB #00,#40
             DEFB #00,#80
             DEFB #00,#40
             DEFB #00,#20
             DEFB #00,#40
             DEFB #00,#80
;5
             DEFB #00,#20
             DEFB #00,#10
             DEFB #00,#20
             DEFB #00,#40
             DEFB #00,#20
             DEFB #00,#10
             DEFB #00,#20
             DEFB #00,#40
;6
             DEFB #00,#10
             DEFB #00,#08
             DEFB #00,#10
             DEFB #00,#20
             DEFB #00,#10
             DEFB #00,#08
             DEFB #00,#10
             DEFB #00,#20
;7

RemoveProj   LD A,(IX+TgType)
             BIT 7,A
             JR NZ RemExpl
             BIT 0,(IX+TgType):JP NZ ANDZig
             JP ANDBar
PlaceProj    LD A,(IX+TgType)
             BIT 7,A
             JR NZ PlaceExpl
             BIT 0,(IX+TgType):JP NZ ORZig
             JP ORBar
RemExpl      AND #3
             LD HL,Expl1
             OR A
             JR Z RE1
             LD HL,Expl2
             DEC A
             JR Z RE1
             LD HL,Expl3
             DEC A
             JR Z RE1
             LD HL,Expl4
RE1          PUSH IX:CALL CalcExplAdd
             CALL ANDIt
             POP IX
             RET
PlaceExpl    DEC (IX+TgAlive):RET Z
             LD A,R:AND #3
             LD (IX+TgType),A
             SET  7,(IX+TgType)
             LD HL,Expl1
             OR A
             JR Z PE1
             LD HL,Expl2
             DEC A
             JR Z PE1
             LD HL,Expl3
             DEC A:JR Z PE1
             LD HL,Expl4
PE1          PUSH IX:CALL CalcExplAdd
             CALL ORIt
             POP IX
             RET
KillExpl     LD (IX+TgAlive),0
             RET
CalcExplAdd  LD A,(IX+TgX):SUB 8
             AND #7
             RRCA:RRCA:RRCA
             LD E,A:LD D,0
             ADD HL,DE
             EX DE,HL
             LD BC,LineYs
             LD L,(IX+TgY):LD H,0
             ADD HL,HL:ADD HL,BC
             PUSH HL
             LD A,(IX+TgX):SUB 8
             RRCA:RRCA:RRCA
             AND #1F
             POP IX
             RET

TestAndKill  LD A,(IX+TgMissInv):OR A:JR NZ HBase
             LD L,(IX+TgX)
             LD A,(IX+TgY):CP 8:JP C HShip
             LD H,A
             LD B,nInv
             LD IY,InvTable
TAKlp        LD A,(IY+TgAlive)
             OR A
             JR Z TAKlpx
             LD A,(IY+TgX)
             SUB L
             JP P TAK1
             NEG
TAK1         CP 9
             JR NC TAKlpx
             LD A,H
             SUB (IY+TgY)
             JR C TAKlpx
             CP 16
             JR NC TAKlpx
             ;Found it
             PUSH IY:POP IX:CALL ANDInv
             LD (IY+TgAlive),0
             RET
TAKlpx       LD DE,lInv
             ADD IY,DE
             DJNZ TAKlp
             RET
HBase        LD A,(IX+TgY)
             CP 191-13
             RET C
             LD A,(BaseX)
             SUB (IX+TgX)
             JP P HB1
             NEG
HB1          CP 14
             RET NC
             JP #8000
HShip        LD A,(MoveShip)
             OR A
             RET NZ
             LD A,(ShipX):SUB (IX+TgX)
             JP P HSp1
             NEG
HSp1         CP 10
             RET NC
             ;HitShip
             CALL ANDShip
             LD A,#C9:LD (MoveShip),A
             RET
FireProjB    LD IY,ProjTable
             LD A,(IY+TgAlive):OR A:JR Z FPB
             RET
FireProj     PUSH DE ; D = Disp E = Y
             PUSH BC ; B = Speed C = Type
             CALL FPS
             POP BC
             POP DE
             RET C
FPB          LD (IY+TgSpeed),1
             LD (IY+TgMissCount),0
             LD (IY+TgSpeedI),B
             LD (IY+TgType),C
             LD A,(IX+TgX):LD (IY+TgX),A
             LD (IY+TgY),E
             LD (IY+TgAlive),1
             LD (IY+TgMissDisp),D
             LD (IY+TgMissInv),0
             OR A
             RET
FPS          LD IY,ProjTable+lInv
             LD B,nProj
             LD DE,lInv
FPS1         LD A,(IY+TgAlive)
             OR A
             RET Z
             ADD IY,DE
             DJNZ FPS1
             SCF
             RET
BitTable     DEFB #80,#40,#20,#10,#08,#04,#02,#01
             DEFW 0,0,0,0,0,0,0,0,0,0,0,0
             DEFW 0,0,0,0,0,0,0,0,0,0,0,0
             DEFW 0,0,0,0,0,0,0,0,0,0,0,0
LineYs       DEFW #4000,#4100,#4200,#4300
ShipYs       EQU LineYs
             DEFW #4400,#4500,#4600,#4700
             DEFW #4020,#4120,#4220,#4320
             DEFW #4420,#4520,#4620,#4720
             DEFW #4040,#4140,#4240,#4340
             DEFW #4440,#4540,#4640,#4740
             DEFW #4060,#4160,#4260,#4360
             DEFW #4460,#4560,#4660,#4760
             DEFW #4080,#4180,#4280,#4380
             DEFW #4480,#4580,#4680,#4780
             DEFW #40A0,#41A0,#42A0,#43A0
             DEFW #44A0,#45A0,#46A0,#47A0
             DEFW #40C0,#41C0,#42C0,#43C0
             DEFW #44C0,#45C0,#46C0,#47C0
             DEFW #40E0,#41E0,#42E0,#43E0
             DEFW #44E0,#45E0,#46E0,#47E0
             DEFW #4800,#4900,#4A00,#4B00
             DEFW #4C00,#4D00,#4E00,#4F00
             DEFW #4820,#4920,#4A20,#4B20
             DEFW #4C20,#4D20,#4E20,#4F20
             DEFW #4840,#4940,#4A40,#4B40
             DEFW #4C40,#4D40,#4E40,#4F40
             DEFW #4860,#4960,#4A60,#4B60
             DEFW #4C60,#4D60,#4E60,#4F60
             DEFW #4880,#4980,#4A80,#4B80
             DEFW #4C80,#4D80,#4E80,#4F80
             DEFW #48A0,#49A0,#4AA0,#4BA0
             DEFW #4CA0,#4DA0,#4EA0,#4FA0
             DEFW #48C0,#49C0,#4AC0,#4BC0
             DEFW #4CC0,#4DC0,#4EC0,#4FC0
             DEFW #48E0,#49E0,#4AE0,#4BE0
             DEFW #4CE0,#4DE0,#4EE0,#4FE0
             DEFW #5000,#5100,#5200,#5300
             DEFW #5400,#5500,#5600,#5700
             DEFW #5020,#5120,#5220,#5320
             DEFW #5420,#5520,#5620,#5720
             DEFW #5040,#5140,#5240,#5340
             DEFW #5440,#5540,#5640,#5740
ShieldYs     DEFW #5060,#5160,#5260,#5360
             DEFW #5460,#5560,#5660,#5760
             DEFW #5080,#5180,#5280,#5380
             DEFW #5480,#5580,#5680,#5780
             DEFW #50A0,#51A0,#52A0,#53A0
             DEFW #54A0,#55A0,#56A0,#57A0
             DEFW #50C0,#51C0,#52C0,#53C0
             DEFW #54C0,#55C0,#56C0,#57C0
BaseYs       DEFW #50E0,#51E0,#52E0,#53E0
             DEFW #54E0,#55E0,#56E0,#57E0
             DEFW 0,0,0,0,0,0,0,0,0,0,0,0
             DEFW 0,0,0,0,0,0,0,0,0,0,0,0
             DEFW 0,0,0,0,0,0,0,0,0,0,0,0
             DEFW 0,0,0,0,0,0,0,0,0,0,0,0
ShieldDefn   DEFB #00,#3F,#FC,#00
             DEFB #01,#FF,#FF,#80
             DEFB #03,#FF,#FF,#C0
             DEFB #07,#FF,#FF,#E0
             DEFB #0F,#FF,#FF,#F0
             DEFB #1F,#FF,#FF,#F8
             DEFB #3F,#FF,#FF,#FC
             DEFB #7F,#FF,#FF,#FE
             DEFB #FF,#FF,#FF,#FF
             DEFB #FF,#FF,#FF,#FF
             DEFB #FF,#FF,#FF,#FF
             DEFB #FF,#FF,#FF,#FF
             DEFB #FF,#FF,#FF,#FF
             DEFB #FF,#FF,#FF,#FF
             DEFB #FF,#FF,#FF,#FF
             DEFB #FF,#FF,#FF,#FF
             DEFB #FF,#FF,#FF,#FF
             DEFB #FF,#FF,#FF,#FF
             DEFB #FF,#FF,#FF,#FF
             DEFB #FF,#FF,#FF,#FF
             DEFB #FF,#FF,#FF,#FF
             DEFB #FF,#E0,#07,#FF
             DEFB #FF,#80,#01,#FF
             DEFB #FF,#00,#00,#FF
             DEFB #FE,#00,#00,#7F
             DEFB #FC,#00,#00,#3F
             DEFB #F8,#00,#00,#1F
             DEFB #F0,#00,#00,#0F
BaseDef1     DEFB #00,#08,#00,#00
             DEFB #00,#08,#00,#00
             DEFB #00,#08,#00,#00
             DEFB #00,#7F,#00,#00
             DEFB #0F,#FF,#F8,#00
             DEFB #1F,#FF,#FC,#00
             DEFB #1F,#FF,#FC,#00
             DEFB #1F,#FF,#FC,#00
InvDef0      DEFB #00,#08,#00,#00
             DEFB #00,#1C,#00,#00
             DEFB #00,#3E,#00,#00
             DEFB #00,#7F,#00,#00
             DEFB #00,#C9,#80,#00
             DEFB #00,#C9,#80,#00
             DEFB #00,#FF,#80,#00
             DEFB #00,#FF,#80,#00
             DEFB #00,#2A,#00,#00
             DEFB #00,#41,#00,#00
             DEFB #00,#22,#00,#00
;Inv1
             DEFB #00,#08,#00,#00
             DEFB #00,#1C,#00,#00
             DEFB #00,#3E,#00,#00
             DEFB #00,#7F,#00,#00
             DEFB #00,#C9,#80,#00
             DEFB #00,#C9,#80,#00
             DEFB #00,#FF,#80,#00
             DEFB #00,#FF,#80,#00
             DEFB #00,#14,#00,#00
             DEFB #00,#2A,#00,#00
             DEFB #00,#55,#00,#00
;Inv2
             DEFB #00,#63,#00,#00
             DEFB #00,#14,#00,#00
             DEFB #00,#3E,#00,#00
             DEFB #00,#7F,#00,#00
             DEFB #00,#C9,#80,#00
             DEFB #01,#C9,#C0,#00
             DEFB #02,#FF,#A0,#00
             DEFB #02,#FF,#A0,#00
             DEFB #02,#E3,#A0,#00
             DEFB #00,#80,#80,#00
             DEFB #00,#63,#00,#00
;Inv3
             DEFB #00,#63,#00,#00
             DEFB #00,#14,#00,#00
             DEFB #02,#3E,#20,#00
             DEFB #02,#7F,#20,#00
             DEFB #02,#C9,#A0,#00
             DEFB #01,#C9,#C0,#00
             DEFB #00,#FF,#80,#00
             DEFB #00,#FF,#80,#00
             DEFB #00,#E3,#80,#00
             DEFB #00,#80,#80,#00
             DEFB #01,#00,#C0,#00
;Inv4
             DEFB #00,#3E,#00,#00
             DEFB #01,#FF,#C0,#00
             DEFB #03,#FF,#E0,#00
             DEFB #03,#08,#60,#00
             DEFB #03,#08,#60,#00
             DEFB #03,#FF,#E0,#00
             DEFB #03,#F7,#E0,#00
             DEFB #03,#E3,#E0,#00
             DEFB #00,#DD,#80,#00
             DEFB #01,#80,#C0,#00
             DEFB #00,#E3,#80,#00
;Inv5
             DEFB #00,#3E,#00,#00
             DEFB #01,#FF,#C0,#00
             DEFB #03,#FF,#E0,#00
             DEFB #03,#08,#60,#00
             DEFB #03,#08,#60,#00
             DEFB #03,#FF,#E0,#00
             DEFB #03,#F7,#E0,#00
             DEFB #03,#E3,#E0,#00
             DEFB #00,#DD,#80,#00
             DEFB #01,#80,#C0,#00
             DEFB #03,#00,#60,#00
ExplDefn1    DEFB #00,#80,#00,#00
             DEFB #01,#40,#00,#00
             DEFB #02,#C0,#00,#00
             DEFB #05,#E0,#00,#00
             DEFB #03,#A8,#00,#00
             DEFB #02,#40,#00,#00
             DEFB #01,#C0,#00,#00
             DEFB #00,#80,#00,#00
             DEFB #00,#80,#00,#00 ;expl 2
             DEFB #02,#A0,#00,#00
             DEFB #04,#88,#00,#00
             DEFB #05,#96,#00,#00
             DEFB #09,#DC,#00,#00
             DEFB #04,#A0,#00,#00
             DEFB #03,#B0,#00,#00
             DEFB #00,#80,#00,#00
             DEFB #00,#80,#00,#00 ;expl 3
             DEFB #01,#D8,#00,#00
             DEFB #05,#74,#00,#00
             DEFB #0A,#78,#00,#00
             DEFB #03,#E4,#00,#00
             DEFB #09,#58,#00,#00
             DEFB #05,#E0,#00,#00
             DEFB #00,#80,#00,#00
             DEFB #00,#80,#00,#00 ;expl 4
             DEFB #02,#40,#00,#00
             DEFB #05,#10,#00,#00
             DEFB #02,#20,#00,#00
             DEFB #03,#10,#00,#00
             DEFB #01,#50,#00,#00
             DEFB #01,#20,#00,#00
             DEFB #00,#80,#00,#00
ShipDefn     DEFB #00,#00,#00,#00
             DEFB #00,#00,#00,#00
             DEFB #00,#08,#00,#00
             DEFB #00,#FF,#80,#00
             DEFB #1F,#FF,#FC,#00
             DEFB #6A,#AA,#AB,#00
             DEFB #1F,#FF,#FC,#00
             DEFB #00,#FF,#80,#00
             DEFB #00,#08,#00,#00
             DEFB #00,#00,#00,#00

BaseDefn     DEFS 256
InvShapes    DEFS 352 * 6
Expl1        DEFS 256
Expl2        DEFS 256
Expl3        DEFS 256
Expl4        DEFS 256
Ship1        DEFS 256
ENDY EQU $


