::::::::::::::::::::::::::::::::::::::::
;
;   1:57 pm 27/3/84   Dark Star (?)
;   3:39 pm 29/3/84   Began towers
;
;   Spectrum version
;
;   Changed slightly to support zeus.exe
;
;
::::::::::::::::::::::::::::::::::::::::

; 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:\ds.szx",$0000,Begin	; The szx file

; If for some reason you want binary, uncomment this line
;	output_bin "c:\ds.bin",$0000,$10000	; The binary file


nStar          EQU 85   ; Plus ref
lStar          EQU 9
StarX          EQU 0
StarY          EQU 2
StarZ          EQU 4
StarAddr       EQU 6
StarBit        EQU 8
;
;
nProj          EQU 30
lProj          EQU 16
ProjX          EQU 0
ProjY          EQU 2
ProjZ          EQU 4
ProjAddr       EQU 6
ProjBit        EQU 8
ProjLife       EQU 9
ProjDX         EQU 10
ProjDY         EQU 12
ProjDZ         EQU 14
Range          EQU 60
FireDelay      EQU 1
;
;
StartY         EQU  500
StartZ         EQU  Zdvstep
Zdvstep        EQU  -20
Xdtstep        EQU  8
Ydtstep        EQU  16
;
;
nObje          EQU 4
lObje          EQU 256
ObjeX          EQU 0
ObjeY          EQU 2
ObjeZ          EQU 4
ObjeDY         EQU 6
ObjepMove      EQU 8
ObjeOldLines   EQU 10
GrowthRate     EQU 16
lObjeLine      EQU 8
TWidth         EQU #100
VertBit        EQU 2
VertOff        EQU 3
VertpYTab      EQU 4
VertLeng       EQU 5
HoriBitl       EQU 2
HoriBitr       EQU 3
HoriLeng       EQU 4
HoriAddr       EQU 5
;
;
               ORG #8000
Begin          CALL GenYTab
               CALL Gen192Tab
               LD HL,0
               LD (DeltaX),HL
               LD (DeltaY),HL
               LD HL,StartZ
               LD (DeltaZ),HL
               LD HL,BitTab
               LD A,#80
GenXTab        LD (HL),A
               INC L
               RRCA
               JR NC GenXTab
               LD A,#FF
GenXTab1       LD (HL),A
               INC L
               SRL A
               OR A
               JR NZ GenXTab1
               LD A,#80
GenXTab2       LD (HL),A
               INC L
               SRA A
               CP #FF
               JR NZ GenXTab2
               LD (HL),A
               CALL SetUpStars
               CALL SetUpProj
               CALL SetUpObje
               CALL CLS
Loop           CALL ShowStars
               CALL ShowProj
               CALL ShowObje
               CALL AlterSteps
               CALL FireIfNess
               LD BC,#F7FE
               IN A,(C)
               OR #E0
               CP #FE
               JR NZ Loop
               RET
;
;
FireKey        LD A,#BD
               IN A,(#FE)
               OR #E1
               INC A
               RET
CallHL         JP (HL)
GenYTab        LD HL,YTable
               LD DE,#4000
               LD C,24
CharLp         LD B,8
CharLp1        LD (HL),E
               INC H
               LD (HL),D
               DEC H
               INC L
               INC D
               DJNZ CharLp1
               LD A,D
               SUB 8
               LD D,A
               DEC C
               JR Z GYT1
               LD A,E
               ADD A,32
               LD E,A
               JR NC CharLp
               LD A,D
               ADD A,8
               LD D,A
               JR CharLp
GYT1           LD B,#40
GYT2           LD (HL),0
               INC H
               LD (HL),0
               DEC H
               INC L
               DJNZ GYT2
               RET
CLS            LD HL,#4000
               LD DE,#4001
               LD BC,#1800
               LD (HL),0
               LDIR
               LD BC,#2FF
               LD A,(GameAttr)
               LD (HL),A
               LDIR
               XOR A
               OUT (#FE),A
               RET
Rand           CALL Rand1
               LD DE,(Seed)
               RET
Rand1          LD HL,(Seed+2)
               RL L
               RL H
               RL L
               RL H
               LD C,H
               LD A,(Seed)
               RLA
               LD B,A
               LD DE,(Seed+1)
               RL E
               RL D
               RES 7,D
               LD HL,(Seed)
               ADD HL,BC
               LD (Seed),HL
               LD HL,(Seed+2)
               ADC HL,DE
               RES 7,H
               LD (Seed+2),HL
               RET M
               LD HL,Seed
Rand2          INC (HL)
               RET NZ
               INC HL
               JR Rand2
Seed           DEFB "Nig!"
GameAttr       DEFB #47
Gen192Tab      LD BC,DivTab
               LD HL,0
               LD DE,#00C0
G192           LD A,H
               LD (BC),A
               ADD HL,DE
               INC C
               JR NZ G192
               RET
DivHLDE        XOR A
               SBC HL,DE
               ADD HL,DE
               JR C Div6
               JR Z Div1
               LD A,D
               OR A
               JR NZ Div2
               LD A,H
               CP E
               JR NC Div3
Div2           LD A,L
               LD L,H
               LD H,0
               LD B,8
Div4           ADD A,A
               ADC HL,HL
               SBC HL,DE
               JR NC Div5
               ADD HL,DE
               DJNZ Div4
               JP Div6
Div5           INC A
               DJNZ Div4
Div6           LD C,A
               LD B,8
Div7           ADD A,A
               ADD HL,HL
               SBC HL,DE
               JR NC Div8
               ADD HL,DE
               DJNZ Div7
               LD H,C
               LD L,A
               RET
Div8           INC A
               DJNZ Div7
               LD H,C
               LD L,A
               RET
Div1           LD HL,#0100
               RET
Div3           RET
ObjeDiv        BIT 7,H
               JR NZ OD1
               CALL DivHLDE
               SRL H
               RR L
               RET
OD1            LD A,L
               CPL
               LD L,A
               LD A,H
               CPL
               LD H,A
               INC HL
               CALL DivHLDE
               SRL H
               RR L
               LD A,L
               CPL
               LD L,A
               LD A,H
               CPL
               LD H,A
               INC HL
               RET
MultHLDE       LD B,H
               LD C,L
               LD HL,0
               LD A,C
               LD C,B
               LD B,8
               RRA
Mul0           JR NC Mul1
               ADD HL,DE
Mul1           RR H
               RL L
               RRA
               DJNZ Mul0
               LD B,A
               LD A,C
               LD C,B
               LD B,8
               RRA
Mul2           JR NC Mul3
               ADD HL,DE
Mul3           RR H
               RR L
               RRA
               DJNZ Mul2
               LD H,L
               LD L,A
               RET
SignMultHLDE   BIT 7,H
               JR Z SM1
               LD A,H
               CPL
               LD H,A
               LD A,L
               CPL
               LD L,A
               INC HL
               BIT 7,D
               JR Z SMn
               LD A,D
               CPL
               LD D,A
               LD A,E
               CPL
               LD E,A
               INC DE
SMp            JP MultHLDE
SMn            CALL MultHLDE
               LD A,H
               CPL
               LD H,A
               LD A,L
               CPL
               LD L,A
               INC HL
               RET
SM1            BIT 7,D
               JR Z MultHLDE
               LD A,D
               CPL
               LD D,A
               LD A,E
               CPL
               LD E,A
               INC DE
               JP SMn
CalcAddr       LD BC,128
               ADD HL,BC
               EX DE,HL
               ADD HL,BC
               EX DE,HL
               LD H,DivTab/256
               LD L,(HL)
               LD H,YTable/256
               LD A,(HL)
               INC H
               LD H,(HL)
               LD L,A
               LD A,E
               RRCA
               RRCA
               RRCA
               AND #1F
               OR L
               LD L,A
               LD A,E
               AND #7
               LD E,A
               LD D,BitTab/256
               LD A,(DE)
               RET
NegHL          LD A,L
               CPL
               LD L,A
               LD A,H
               CPL
               LD H,A
               INC HL
               RET
;
;
SetUpStars     LD IX,StarTable
               LD B,nStar
SUSlp          PUSH BC
               CALL Rand
               LD (IX+StarX),E
               LD (IX+StarX+1),D
               CALL Rand
               LD (IX+StarZ),E
               LD (IX+StarZ+1),D
               LD DE,StartY
               LD (IX+StarY),E
               LD (IX+StarY+1),D
               LD (IX+StarBit),0
               LD BC,lStar
               ADD IX,BC
               POP BC
               DJNZ SUSlp
               LD HL,0
               LD (GroundX),HL
               LD (GroundZ),HL
               LD HL,StartY
               LD (GroundY),HL
               XOR A
               LD (GroundZ+4),A
               RET
ShowStars      LD IX,GroundX
               LD HL,(DeltaX)
               LD DE,(DeltaY)
               LD BC,(DeltaZ)
               EXX
               LD B,nStar+1
SSlp           PUSH BC
               EXX
               LD A,L
               ADD A,(IX+StarX)
               LD (IX+StarX),A
               LD A,H
               ADC A,(IX+StarX+1)
               LD (IX+StarX+1),A
               LD A,E
               ADD A,(IX+StarY)
               LD (IX+StarY),A
               LD A,D
               ADC A,(IX+StarY+1)
               LD (IX+StarY+1),A
               LD A,C
               ADD A,(IX+StarZ)
               LD (IX+StarZ),A
               LD A,B
               ADC A,(IX+StarZ+1)
               LD (IX+StarZ+1),A
               EXX
               LD A,(IX+StarBit)
               OR A
               JR Z SS1
               LD L,(IX+StarAddr)
               LD H,(IX+StarAddr+1)
               CPL
               AND (HL)
               LD (HL),A
SS1            BIT 7,(IX+StarZ+1)
               JP NZ SSlpx
               LD L,(IX+StarX)
               LD H,(IX+StarX+1)
               LD E,(IX+StarZ)
               LD D,(IX+StarZ+1)
               BIT 7,H
               JR NZ SSW1
               OR A
               SBC HL,DE
               JP NC SSlpx
               ADD HL,DE
               CALL DivHLDE
               SRL H
               RR L
               JP SS2
SSW1           LD A,L:CPL:LD L,A
               LD A,H:CPL:LD H,A
               INC HL
               OR A
               SBC HL,DE
               JP NC SSlpx
               ADD HL,DE
               CALL DivHLDE
               SRL H
               RR L
               LD A,L:CPL:LD L,A
               LD H,#FF
               INC HL
SS2            PUSH HL
               LD L,(IX+StarY)
               LD H,(IX+StarY+1)
               LD E,(IX+StarZ)
               LD D,(IX+StarZ+1)
               BIT 7,H
               JR NZ SSW1a
               OR A
               SBC HL,DE
               JP NC SSlpx1
               ADD HL,DE
               CALL DivHLDE
               SRL H
               RR L
               JP SS2a
SSW1a          LD A,L:CPL:LD L,A
               LD A,H:CPL:LD H,A
               INC HL
               OR A
               SBC HL,DE
               JP NC SSlpx1
               ADD HL,DE
               CALL DivHLDE
               SRL H
               RR L
               LD A,L:CPL:LD L,A
               LD H,#FF
               INC HL
SS2a           POP DE
               CALL CalcAddr
               LD (IX+StarAddr),L
               LD (IX+StarAddr+1),H
               LD (IX+StarBit),A
               OR (HL)
               LD (HL),A
SSlpx          LD BC,lStar
               ADD IX,BC
               POP BC
               DEC B
               JP NZ SSlp
               RET
SSlpx1         POP AF
               LD BC,lStar
               ADD IX,BC
               POP BC
               DEC B
               JP NZ SSlp
               RET
SetUpProj      LD IX,ProjTable
               LD B,nProj
               LD DE,lProj
               XOR A
SUPlp          LD (IX+ProjLife),A
               ADD IX,DE
               DJNZ SUPlp
               LD HL,FireDelay
               LD (FireDel),HL
               XOR A
               LD (SideSel),A
               LD A,#40
               LD (TopSel),A
               RET
               DEFB "Here we go again!"
ShowProj       LD IX,ProjTable
               LD B,nProj
SPlp           PUSH BC
               LD A,(IX+ProjLife)
               OR A
               JP Z SPlpx
               XOR A
               OUT (#FE),A
               LD L,(IX+ProjX)
               LD H,(IX+ProjX+1)
               LD BC,(DeltaX)
               ADD HL,BC
               LD C,(IX+ProjDX)
               LD B,(IX+ProjDX+1)
               ADD HL,BC
               LD (IX+ProjX),L
               LD (IX+ProjX+1),H
               LD L,(IX+ProjY)
               LD H,(IX+ProjY+1)
               LD BC,(DeltaY)
               ADD HL,BC
               LD C,(IX+ProjDY)
               LD B,(IX+ProjDY+1)
               ADD HL,BC
               LD (IX+ProjY),L
               LD (IX+ProjY+1),H
               LD BC,(GroundY)
               OR A
               SBC HL,BC
               BIT 7,H
               JP Z SPKill
               LD L,(IX+ProjZ)
               LD H,(IX+ProjZ+1)
               LD BC,(DeltaZ)
               ADD HL,BC
               LD C,(IX+ProjDZ)
               LD B,(IX+ProjDZ+1)
               ADD HL,BC
               LD (IX+ProjZ),L
               LD (IX+ProjZ+1),H
               LD A,(IX+ProjBit)
               OR A
               JR Z SP1
               LD L,(IX+ProjAddr)
               LD H,(IX+ProjAddr+1)
               CPL
               AND (HL)
               LD (HL),A
               LD A,0
FireNoiseF     EQU $-1
               OUT (#FE),A
SP1            BIT 7,(IX+ProjZ+1)
               JP NZ SPKill
               DEC (IX+ProjLife)
               JP Z SPlpx
               LD L,(IX+ProjX)
               LD H,(IX+ProjX+1)
               LD E,(IX+ProjZ)
               LD D,(IX+ProjZ+1)
               BIT 7,H
               JR NZ SPW1
               OR A
               SBC HL,DE
               JP NC SPlpx
               ADD HL,DE
               CALL DivHLDE
               SRL H
               RR L
               JP SP2
SPW1           LD A,L:CPL:LD L,A
               LD A,H:CPL:LD H,A
               INC HL
               OR A
               SBC HL,DE
               JP NC SPlpx
               ADD HL,DE
               CALL DivHLDE
               SRL H
               RR L
               LD A,L:CPL:LD L,A
               LD H,#FF
               INC HL
SP2            PUSH HL
               LD L,(IX+ProjY)
               LD H,(IX+ProjY+1)
               LD E,(IX+ProjZ)
               LD D,(IX+ProjZ+1)
               BIT 7,H
               JR NZ SPW1a
               OR A
               SBC HL,DE
               JP NC SPlpx1
               ADD HL,DE
               CALL DivHLDE
               SRL H
               RR L
               JP SP2a
SPW1a          LD A,L:CPL:LD L,A
               LD A,H:CPL:LD H,A
               INC HL
               OR A
               SBC HL,DE
               JP NC SPlpx1
               ADD HL,DE
               CALL DivHLDE
               SRL H
               RR L
               LD A,L:CPL:LD L,A
               LD H,#FF
               INC HL
SP2a           POP DE
               CALL CalcAddr
               LD (IX+ProjAddr),L
               LD (IX+ProjAddr+1),H
               LD (IX+ProjBit),A
               OR (HL)
               LD (HL),A
SPlpx          LD BC,lProj
               ADD IX,BC
               POP BC
               DEC B
               JP NZ SPlp
               RET
SPKill         LD (IX+ProjLife),0
               LD A,(IX+ProjBit)
               CPL
               LD L,(IX+ProjAddr)
               LD H,(IX+ProjAddr+1)
               AND (HL)
               LD (HL),A
               LD (IX+ProjBit),0
               PUSH AF
SPlpx1         POP AF
               LD BC,lProj
               ADD IX,BC
               POP BC
               DEC B
               JP NZ SPlp
               RET
FireIfNess     LD HL,(FireDel)
               XOR A
               LD (FireNoiseF),A
               LD A,L
               OR H
               JR Z FIN1
               DEC HL
               LD (FireDel),HL
               CALL FireKey
               RET Z
               LD A,#F8
               LD (FireNoiseF),A
               RET
FIN1           CALL FireKey
               RET Z
               LD A,#F8
               LD (FireNoiseF),A
               LD IX,ProjTable
               LD B,nProj
               LD DE,lProj
FINlp          LD A,(IX+ProjLife)
               OR A
               JR Z FIN2
               ADD IX,DE
               DJNZ FINlp
               RET
FIN2           LD (IX+ProjLife),Range
               XOR A
               LD (IX+ProjY+1),A
               LD (IX+ProjZ),A
               LD (IX+ProjZ+1),A
               LD (IX+ProjBit),A
               LD HL,(DeltaX)
               CALL ProjMaths
               LD (IX+ProjDX),L
               LD (IX+ProjDX+1),H
               LD HL,(DeltaY)
               CALL ProjMaths
               LD (IX+ProjDY),L
               LD (IX+ProjDY+1),H
               LD HL,(DeltaZ)
               CALL ProjMaths
               LD (IX+ProjDZ),L
               LD (IX+ProjDZ+1),H
               LD A,(SideSel)
               CPL
               LD (SideSel),A
               OR A
               JR NZ FIN3
               LD A,(TopSel)
               XOR #80
               LD (TopSel),A
FIN3           LD A,(SideSel)
               LD (IX+ProjX+1),A
               LD (IX+ProjX),#80
               LD A,(TopSel)
               LD (IX+ProjY),A
               LD HL,FireDelay
               LD (FireDel),HL
               RET
ProjMaths      CALL NegHL
               ADD HL,HL
               RET
SetUpObje      LD IX,ObjeTable
               LD B,nObje
SUOlp          PUSH BC
               LD HL,ObjeTemp
               PUSH IX
               POP DE
               LD BC,lObje
               LDIR
               PUSH DE
               CALL Rand
               LD (IX+ObjeX),E
               LD (IX+ObjeX+1),D
               POP IX
               POP BC
               DJNZ SUOlp
               RET
ShowObje       LD IX,ObjeTable
               LD B,nObje
SOlp           PUSH BC
               LD L,(IX+ObjeX)
               LD H,(IX+ObjeX+1)
               LD BC,(DeltaX)
               ADD HL,BC
               LD (IX+ObjeX),L
               LD (IX+ObjeX+1),H
               LD L,(IX+ObjeY)
               LD H,(IX+ObjeY+1)
               LD BC,(DeltaY)
               ADD HL,BC
               LD (IX+ObjeY),L
               LD (IX+ObjeY+1),H
               LD L,(IX+ObjeZ)
               LD H,(IX+ObjeZ+1)
               LD BC,(DeltaZ)
               ADD HL,BC
               LD (IX+ObjeZ),L
               LD (IX+ObjeZ+1),H
               PUSH IX
               POP IY
               LD BC,ObjeOldLines
SO1            ADD IY,BC
               LD L,(IY)
               LD H,(IY+1)
               CALL CallHL
               LD BC,lObjeLine
               JP  SO1
nLine          POP AF
               BIT 7,(IX+ObjeZ+1)
               JP NZ SOlpx
               LD L,(IX+ObjeX)
               LD H,(IX+ObjeX+1)
               LD (TempX),HL
               LD E,(IX+ObjeZ)
               LD D,(IX+ObjeZ+1)
               LD (TempZ),DE
               LD BC,TWidth
               OR A
               SBC HL,BC
               LD (TempXl),HL
               CALL ObjeDiv
               LD (X1),HL
               LD HL,(TempX)
               LD BC,TWidth
               ADD HL,BC
               LD (TempXr),HL
               CALL ObjeDiv
               LD (X2),HL
               LD DE,(X1)
               OR A
               SBC HL,DE
               BIT 7,H
               JP NZ SOlpx
               ADD HL,DE
               LD BC,128
               ADD HL,BC
               BIT 7,H
               JP NZ SOlpx
               EX DE,HL
               LD BC,-127
               ADD HL,BC
               BIT 7,H
               JP Z SOlpx
               ;X windowed
               LD L,(IX+ObjeY)
               LD H,(IX+ObjeY+1)
               LD (TempY),HL
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (Y1),HL
               LD HL,(GroundY)
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (Y2),HL
               LD DE,(Y1)
               OR A
               SBC HL,DE
               BIT 7,H
               JP NZ SOlpx
               ADD HL,DE
               LD BC,128
               ADD HL,BC
               BIT 7,H
               JP NZ SOlpx
               EX DE,HL
               LD BC,-127
               ADD HL,BC
               BIT 7,H
               JP Z SOlpx
               ;Y windowed
               LD HL,(TempZ)
               LD BC,TWidth * 2
               ADD HL,BC
               LD (TempZ),HL
               EX DE,HL
               LD HL,(TempXl)
               CALL ObjeDiv
               LD (X3),HL
               LD HL,(TempXr)
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (X4),HL
               LD HL,(TempY)
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (Y3),HL
               LD HL,(GroundY)
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (Y4),HL
               LD L,(IX+ObjepMove)
               LD H,(IX+ObjepMove+1)
               CALL CallHL
               LD (IY),nLine&#FF
               LD (IY+1),nLine/256
SOlpx          LD BC,lObje
               ADD IX,BC
               POP BC
               DEC B
               JP NZ SOlp
               RET
pTower         PUSH IX
               POP IY
               LD BC,ObjeOldLines
               ADD IY,BC
               LD HL,(X4)
               LD BC,(X2)
               DEC BC
               DEC HL
               OR A
               SBC HL,BC
               JP P Towerad
               LD HL,(X1)
               LD BC,(X3)
               DEC HL
               OR A
               SBC HL,BC
               JP P Towercf
Towerbe        LD A,(Y1+1)
               BIT 7,A
               JR NZ Towere
Towerb         LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X1)
               CALL VertLine
               LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X2)
               CALL VertLine
               LD HL,(X2)
               LD DE,(X1)
               LD BC,(Y1)
               CALL HoriLine
               LD HL,(X4)
               LD DE,(X3)
               LD BC,(Y3)
               CALL HoriLine
               LD HL,(X3)
               LD DE,(X1)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               CALL AnyLine
               LD HL,(X4)
               LD DE,(X2)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               JP AnyLine
Towere         LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X1)
               CALL VertLine
               LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X2)
               CALL VertLine
               LD HL,(X2)
               LD DE,(X1)
               LD BC,(Y1)
               JP HoriLine
Towerad        LD A,(Y1+1)
               BIT 7,A
               JR NZ Towerd
Towera         LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X1)
               CALL VertLine
               LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X2)
               CALL VertLine
               LD HL,(Y4)
               LD DE,(Y3)
               LD BC,(X4)
               CALL VertLine
               LD HL,(X2)
               LD DE,(X1)
               LD BC,(Y1)
               CALL HoriLine
               LD HL,(X4)
               LD DE,(X3)
               LD BC,(Y3)
               CALL HoriLine
               LD HL,(X3)
               LD DE,(X1)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               CALL AnyLine
               LD HL,(X4)
               LD DE,(X2)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               JP AnyLine
Towerd         LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X1)
               CALL VertLine
               LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X2)
               CALL VertLine
               LD HL,(Y4)
               LD DE,(Y3)
               LD BC,(X4)
               CALL VertLine
               LD HL,(X2)
               LD DE,(X1)
               LD BC,(Y1)
               CALL HoriLine
               LD HL,(X4)
               LD DE,(X2)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               JP AnyLine
Towercf        LD A,(Y1+1)
               BIT 7,A
               JR NZ Towerf
Towerc         LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X1)
               CALL VertLine
               LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X2)
               CALL VertLine
               LD HL,(Y4)
               LD DE,(Y3)
               LD BC,(X3)
               CALL VertLine
               LD HL,(X2)
               LD DE,(X1)
               LD BC,(Y1)
               CALL HoriLine
               LD HL,(X4)
               LD DE,(X3)
               LD BC,(Y3)
               CALL HoriLine
               LD HL,(X3)
               LD DE,(X1)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               CALL AnyLine
               LD HL,(X4)
               LD DE,(X2)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               JP AnyLine
Towerf         LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X1)
               CALL VertLine
               LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X2)
               CALL VertLine
               LD HL,(Y4)
               LD DE,(Y3)
               LD BC,(X3)
               CALL VertLine
               LD HL,(X2)
               LD DE,(X1)
               LD BC,(Y1)
               CALL HoriLine
               LD HL,(X4)
               LD DE,(X2)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               JP AnyLine
AnyLine        RET
VertLine       PUSH HL
               LD L,C
               LD H,B
               LD BC,128
               ADD HL,BC
               BIT 7,H
               JR NZ VLx1
               INC H
               DEC H
               JR NZ VLx1
               LD A,L
               RRCA
               RRCA
               RRCA
               AND #1F
               LD (IY+VertOff),A
               LD A,L
               AND #7
               LD L,A
               LD H,BitTab/256
               LD A,(HL)
               LD (IY+VertBit),A
               POP HL
               LD BC,128
               ADD HL,BC
               BIT 7,H
               JR Z VL1
               LD HL,0
VL1            EX DE,HL
               ADD HL,BC
               BIT 7,H
               JR Z VL2
               LD HL,0
VL2            EX DE,HL
               INC H
               DEC H
               JR Z VL3
               LD HL,255
VL3            INC D
               DEC D
               JR Z VL4
               LD DE,255
VL4            OR A
               SBC HL,DE
               RET Z
               LD H,DivTab/256
               LD L,(HL)
               LD (IY+VertLeng),L
               LD D,DivTab/256
               LD A,(DE)
               LD (IY+VertpYTab),A
               LD E,A
               LD D,YTable/256
               ;Line
               LD B,(IY+VertLeng)
               LD A,(IY+VertOff)
               LD (VertMod1),A
               LD C,(IY+VertBit)
               LD (IY+0),VertAND&#FF
               LD (IY+1),VertAND/256
VertLoop       LD A,(DE)
               ADD A,0
VertMod1       EQU $-1
               LD L,A
               INC D
               LD A,(DE)
               LD H,A
               DEC D
               LD A,C
               OR (HL)
               LD (HL),A
               INC E
               DJNZ VertLoop
               LD BC,lObjeLine
               ADD IY,BC
               RET
VLx1           POP HL
               RET
VertAND        LD B,(IY+VertLeng)
               LD A,(IY+VertOff)
               LD (VertAND1),A
               LD A,(IY+VertBit)
               CPL
               LD C,A
               LD E,(IY+VertpYTab)
               LD D,YTable/256
VertANDlp      LD A,(DE)
               ADD A,0
VertAND1       EQU $-1
               LD L,A
               INC D
               LD A,(DE)
               LD H,A
               DEC D
               LD A,C
               AND (HL)
               LD (HL),A
               INC E
               DJNZ VertANDlp
               RET
HLx1           POP AF
               RET
HoriLine       PUSH HL
               LD L,C
               LD H,B
               LD BC,128
               ADD HL,BC
               INC H
               DEC H
               JR NZ HLx1
               LD H,DivTab/256
               LD L,(HL)
               LD H,YTable/256
               LD A,(HL)
               INC H
               LD H,(HL)
               LD (IY+HoriAddr+1),H
               LD (IY+HoriAddr),A
               POP HL
               ADD HL,BC
               BIT 7,H
               JR Z HLine1
               LD HL,0
HLine1         INC H
               DEC H
               JR Z HLine2
               LD HL,255
HLine2         EX DE,HL
               ADD HL,BC
               BIT 7,H
               JR Z HLine3
               LD HL,0
HLine3         INC H
               DEC H
               JR Z HLine4
               LD HL,255
HLine4         EX DE,HL
               OR A
               SBC HL,DE
               RET Z
               ADD HL,DE
               LD A,L
               AND #7
               ADD A,16
               LD C,A
               LD B,BitTab/256
               LD A,(BC)
               LD (IY+HoriBitr),A
               LD H,A
               LD A,L
               RRCA
               RRCA
               RRCA
               AND #1F
               LD L,A
               LD A,E
               AND #7
               ADD A,8
               LD C,A
               LD A,(BC)
               LD (IY+HoriBitl),A
               LD D,A
               LD A,E
               RRCA
               RRCA
               RRCA
               AND #1F
               LD E,A
               LD A,L
               SUB E
               JR Z HLine5
               LD (IY+HoriLeng),A
               LD A,E
               OR (IY+HoriAddr)
               LD (IY+HoriAddr),A
               LD L,A
               LD H,(IY+HoriAddr+1)
               LD B,(IY+HoriLeng)
               LD E,(IY+HoriBitl)
               LD D,(IY+HoriBitr)
               LD A,(HL)
               OR E
               LD (HL),A
HLine7         INC L
               DEC B
               JR Z HLine6
               LD (HL),#FF
               JP HLine7
HLine6         LD A,(HL)
               OR D
               LD (HL),A
               LD (IY+0),HLine8&#FF
               LD (IY+1),HLine8/256
               LD BC,lObjeLine
               ADD IY,BC
               RET
HLine5         LD A,E
               OR (IY+HoriAddr)
               LD (IY+HoriAddr),A
               LD A,H
               AND D
               LD (IY+HoriBitl),A
               LD L,(IY+HoriAddr)
               LD H,(IY+HoriAddr+1)
               OR (HL)
               LD (HL),A
               LD (IY+0),HLine11&#FF
               LD (IY+1),HLine11/256
               LD BC,lObjeLine
               ADD IY,BC
               RET
HLine11        LD A,(IY+HoriBitl)
               LD L,(IY+HoriAddr)
               LD H,(IY+HoriAddr+1)
               CPL
               AND (HL)
               LD (HL),A
               RET
HLine8         LD L,(IY+HoriAddr)
               LD H,(IY+HoriAddr+1)
               LD B,(IY+HoriLeng)
               LD A,(IY+HoriBitl)
               CPL
               LD E,A
               LD A,(IY+HoriBitr)
               CPL
               LD D,A
               LD A,(HL)
               AND E
               LD (HL),A
HLine9         INC L
               DEC B
               JR Z HLine10
               LD (HL),0
               JP HLine9
HLine10        LD A,(HL)
               AND D
               LD (HL),A
               LD (IY+0),HLine8&#FF
               LD (IY+1),HLine8/256
               RET
AlterSteps     LD BC,#FBFE
               IN A,(C)
               LD E,A
               LD BC,#FDFE
               IN A,(C)
               XOR E
               AND #01
               JR Z AS2
               BIT 0,E
               LD DE,Zdvstep
               JR Z AS1
               LD DE,-Zdvstep
AS1            LD HL,(DeltaZ)
               ADD HL,DE
               LD (DeltaZ),HL
AS2            LD BC,#FEFE
               IN A,(C)
               AND #06
               JP PE AS3
               BIT 2,A
               LD DE,Xdtstep
               LD HL,(XTurnRatio)
               CALL ASMakeTurn
               LD (XTurnRatio),HL
AS3            LD BC,#7FFE
               IN A,(C)
               AND #0C
               JP PE AS4
               BIT 2,A
               LD DE,Ydtstep
               LD HL,(YDiveRatio)
               CALL ASMakeTurn
               LD (YDiveRatio),HL
AS4            LD HL,(DeltaZ)
               LD DE,(YDiveRatio)
               ADD HL,HL:ADD HL,HL
               ADD HL,HL:ADD HL,HL
               CALL SignMultHLDE
               SRA H:RR L
               SRA H:RR L
               SRA H:RR L
               SRA H:RR L
               LD (DeltaY),HL
               LD HL,(XTurnRatio)
               LD DE,(DeltaZ)
               ADD HL,HL:ADD HL,HL
               ADD HL,HL:ADD HL,HL
               CALL SignMultHLDE
               SRA H:RR L
               SRA H:RR L
               SRA H:RR L
               SRA H:RR L
               LD (DeltaX),HL
               RET
ASMakeTurn     JR Z ASMT1
               LD A,D
               CPL
               LD D,A
               LD A,E
               CPL
               LD E,A
               INC DE
ASMT1          ADD HL,DE
               BIT 7,H
               JR NZ ASMT2
               DEC H
               INC H
               RET Z
               LD HL,#0100
               RET
ASMT2          INC H
               JR NZ ASMT2a
               DEC H
               RET
ASMT2a         LD HL,#FF00
               RET
ObjeTemp       DEFW 0
               DEFW -3000
               DEFW 30000
               DEFW GrowthRate
               DEFW pTower
               ; or pTower
               DEFW nLine,0,0,0
               DEFW nLine,0,0,0
               DEFW nLine,0,0,0
               DEFW nLine,0,0,0
               DEFW nLine,0,0,0
               DEFW nLine,0,0,0
               DEFW nLine,0,0,0
               DEFW nLine,0,0,0
               DEFW nLine,0,0,0
               DEFW nLine,0,0,0
               DEFW nLine,0,0,0
               DEFW nLine,0,0,0
; Vars
               ORG ($!#FF)+1
DivTab         DEFS #100
YTable         DEFS #200
BitTab         DEFS 24
DeltaX         DEFW 0
DeltaY         DEFW 0
DeltaZ         DEFW 0
XTurnRatio     DEFW 0
YDiveRatio     DEFW 0
FireDel        DEFW 0
SideSel        DEFB 0
TopSel         DEFB 0
TempX          DEFW 0
TempXl         DEFW 0
TempXr         DEFW 0
TempY          DEFW 0
TempZ          DEFW 0
X1             DEFW 0
X2             DEFW 0
X3             DEFW 0
X4             DEFW 0
Y1             DEFW 0
Y2             DEFW 0
Y3             DEFW 0
Y4             DEFW 0
;
               ORG ($!#FF)+1
ObjeTable      DEFS nObje * lObje
GroundX        DEFW 0      ; This is
GroundY        DEFW StartY ; moved
GroundZ        DEFW 0      ; as
               DEFW 0      ; a
               DEFB 0      ; star
StarTable      DEFS nStar * lStar
ProjTable      DEFS nProj * lProj

