(* Forbidden planet. Spectrum source...

This code is (c) 1985..2008 Simon Brattel. All rights reserved, etc, etc, yada yada ya.

Policy - to make the generated code as close as possible to the original release code.

Therefore this source contains the original anti-piracy code, make sure the top bit
of R is set. Or better yet, remove the test code (it is commented).

This source is closer in form to the original and you'll need a competent assembler
to assemble it. I've provided one at http://www.desdes.com/products/oldfiles/zeus.exe

There were originally lots of separate sources, but I've stitched them together 
into this one to make life easier. One of the original sources has been lost,
the one that had all the equates in it. Fortunately I've been able to recover
those using a disassembler or to be more accurate I've recovered their values.

Where these values were computed using expressions those have been lost. 

The formatting is very close to the original 1985 source, except for the loss of 
the original's use of 16-bit load pseudo-ops.

In this code there are a lot of 16-bit loads to/from indexed variables. As a point 
of interest the original source had these as, say, ld hl,(ix+dObjepDraw) which
looked a hell of a lot tidier than this. I removed them to make the source more
compatible with standard assemblers, what I should have done is spent the time 
writing a better assembler... Done this now, wish I'd done it before I wasted a day
chasing somebody else's problems :(

Feel free to improve it, and send me anything interesting -> crem@desdes.com
*)

; Assembly time options. Comment these out to make them ineffective
; These assume you've got an assembler that can cope with conditional assembly in
; Zeus's format. I'm afraid that this is very variable across assemblers... If you
; don't want to use Zeus and these options are giving you a pain then have a look at
; the "fp_spin.asm" source - I removed all trace of the conditionals from that.

;Original        equ true                        ; Do the original
Elephants       equ true                        ; Elephants or Krell meters?
RandomHS        equ true                        ; Random highscores
No_Check        equ true                        ; Don't testing for piracy <grin>

; These next commands tell Zeus where to put the code it generates

		output_szx "c:\fp.szx",$0000,Main 	; The szx file
;		output_bin "c:\fp.bin",$0000,$10000	; Binary file (if required)

		export_sym "",%1 000000 00
;
; Original source starts here. Still has the ugly pairs of 8-bit loads for every
; object/star/whatever access. This isn't a performance issue, the Z80 binary is 
; the same, it's just uglier than the original source. I might put the originals
; back now I've made a version of Zeus available...
;
; Spectrum equates

ScreenBase      equ $4000                       ;
Attrs           equ $5800                       ;
lAttrs          equ $300                        ;

; Front end source starts

nOptions        equ 3                           ;

MessWait        equ 4000                        ;

; General equates

CodeFlashRate   equ 100                         ;

ArrowPos1       equ $4004
ArrowPos2       equ $50BF

GameRunning     equ 0                           ;
GameFinished    equ 1                           ;
GameQuit        equ 2                           ;

ModeDemo        equ 1                           ;

; Maximum number of objects

nObjes          equ 18                          ;

; Maximum number of lines

nLines          equ 200                         ;

; Maximum number of stars (stars are surprisingly expensive)

nStars          equ 25                          ;

; Object flag byte bits

bOnScreen       equ 0                           ;
bKilled         equ 1                           ;
bRepeat         equ 2                           ;
bCursorClip     equ 3                           ;
bScreenClip     equ 4                           ;
bSlug           equ 5                           ;
bFake           equ 6				;

; Those bits as masks

bbSetWind       equ $01                         ;
bbKilled        equ $02                         ;
bbRepeat        equ $04                         ;
bbCursorClip    equ $08                         ;
bbScreenClip    equ $10                         ;
bbSlug          equ $20                         ;
bbFake          equ $40                         ;

; Another flag byte's bits

bClipCent       equ 0                           ;
bbClipCent      equ $01                         ;
bbClipBelow     equ $02                         ;

MinZ            equ $01A0                       ;

; Scores for objects shot

HoleScore       equ 1                           ;
MissScore       equ 1                           ;
TowerScore      equ 1                           ;

; Damage added on impact with objects

FuelDam         equ 6                           ;
TowerDam        equ -12                         ;

SoundPort       equ $FE                         ;

nCodes          equ 16                          ;
CodesX          equ 160                         ;
CodesXc         equ 255-(6*5)                   ;

MapoY           equ 3                           ;
MapoX           equ 16                          ;

MapFlashRate    equ 200                         ;
CodeUpdateRate  equ 100                         ;

; Object types

tFHoleS         equ $00                         ;
tFHoleM         equ $01                         ;
tFHoleL         equ $02                         ;
tIris           equ $09                         ;
tMiss           equ $10                         ;
tMissA          equ $11                         ;
tProj           equ $14                         ;
tSAMs           equ $15                         ;
tSAMm           equ $16                         ;
tSAMf           equ $17                         ;
tSAMas          equ $18                         ;
tSAMss          equ $1B                         ;
tMine           equ $1C                         ;
tBunker         equ $1D                         ;
tCodeXmit       equ $1E                         ;
tCodeXmit1      equ $1E                         ;
tSAMSqu         equ $1F                         ;
tTowerS         equ $20                         ;
tTowerM         equ $21                         ;
tTowerL         equ $22                         ;
tSquMiss        equ $23                         ;
tRising         equ $24                         ;
tFuel           equ $25                         ;
tWarp           equ $26                         ;

; Player movement equates

Zdvacc          equ -10                         ;
Zdvdec          equ 10                          ;

dDX             equ 2                           ;
dDY             equ 2                           ;

Xdtstep         equ 2                           ;
Ydtstep         equ 2                           ;

StartY          equ $02BC                       ;
StartZ          equ $FFCB                       ;

MinSP           equ -52                         ;
MaxSP           equ -500                        ;
ProjSP          equ 620                         ;

HighY           equ 17000                       ;
LowY            equ 100                         ;

DamFSD          equ 71                          ;

; Offsets to fields in an object
; ie the NN values used in (ix+NN) addressing modes

dpnObje_L       equ 0                           ;
dpnObje_H       equ 1                           ;
dppObje_L       equ 2                           ;
dppObje_H       equ 3                           ;
dpnFreeObje_L   equ 4                           ;
dpnFreeObje_H   equ 5                           ;
dObjeX_L        equ 6                           ;
dObjeX_H        equ 7                           ;
dObjeY_L        equ 8                           ;
dObjeY_H        equ 9                           ;
dObjeZ_L        equ 10                          ;
dObjeZ_H        equ 11                          ;
dObjedX_L       equ 12                          ;
dObjedX_H       equ 13                          ;
dObjedY_L       equ 14                          ;
dObjedY_H       equ 15                          ;
dObjedZ_L       equ 16                          ;
dObjedZ_H       equ 17                          ;
dObjeOX_L       equ 18                          ;
dObjeOX_H       equ 19                          ;
dObjeOY_L       equ 20                          ;
dObjeOY_H       equ 21                          ;
dObjeOZ_L       equ 22                          ;
dObjeOZ_H       equ 23                          ;
dObjeDispXL_L   equ 24                          ;
dObjeDispXL_H   equ 25                          ;
dObjeDispXR_L   equ 26                          ;
dObjeDispXR_H   equ 27                          ;
dObjeDispYT_L   equ 28                          ;
dObjeDispYT_H   equ 29                          ;
dObjeDispYB_L   equ 30                          ;
dObjeDispYB_H   equ 31                          ;

dObjepLines_L   equ 32                          ; 8 line pointers
dObjepLines_H   equ 33                          ;

        ; These variables overlap line pointers

dObjeFFH1_L     equ 34                          ;
dObjeFFH1_H     equ 35                          ;
dObjeFFH2_L     equ 36                          ;
dObjeFFH2_H     equ 37                          ;
dObjeFFV1_L     equ 38                          ;
dObjeFFV1_H     equ 39                          ;
dObjeFFV2_L     equ 40                          ;
dObjeFFV2_H     equ 41                          ;

	; 42 .. 47 are used for line pointers

dObjepDraw      equ 48                          ;
dObjepUnDraw    equ 49                          ;
dObjeDraw_L     equ 50                          ;
dObjeDraw_H     equ 51                          ;
dObjeShot_L     equ 52                          ;
dObjeShot_H     equ 53                          ;
dObjeColl_L     equ 54                          ;
dObjeColl_H     equ 55                          ;
dObjeMiss_L     equ 56                          ;
dObjeMiss_H     equ 57                          ;
dObjeAlter_L    equ 58                          ;
dObjeAlter_H    equ 59                          ;
dObjeMove_L     equ 60                          ;
dObjeMove_H     equ 61                          ;
dObjeFlags      equ 62                          ;
dObjeStateF     equ 63                          ;
dObjeStarComp   equ 64                          ;
dObjeAXS_L      equ 65                          ;
dObjeAXS_H      equ 66                          ;
dObjeAYS_L      equ 67                          ;
dObjeAYS_H      equ 68                          ;
dObjepSizeTab_L equ 69                          ;
dObjepSizeTab_H equ 70                          ;
dObjeCnt        equ 71                          ;
dObjeBdXS_L     equ 72                          ;
dObjeBdXS_H     equ 73                          ;
dObjeBdYS_L     equ 74                          ;
dObjeBdYS_H     equ 75                          ;
dObjeBXS_L      equ 76                          ;
dObjeBXS_H      equ 77                          ;
dObjeBYS_L      equ 78                          ;
dObjeBYS_H      equ 79                          ;
dObjeWindF      equ 80                          ;
dObjeCol        equ 81                          ;
dObjeCntA       equ 82                          ;
dObjeCntiA      equ 83                          ;
dObjeCntB       equ 84                          ;
dObjeCntiB      equ 85                          ;
dObjeWidthX     equ 86                          ;
dObjeWidthY     equ 87                          ;
dObjeClipFlags  equ 88                          ;
dObjeWeapon     equ 89                          ;

lObje           equ 90                          ;

; Offsets to fields in a star

dpnStar_L       equ 0                           ;
dpnStar_H       equ 1                           ;
dpnStarFree_L   equ 2                           ;
dpnStarFree_H   equ 3                           ;
dStarX_L        equ 4                           ;
dStarX_H        equ 5                           ;
dStarY_L        equ 6                           ;
dStarY_H        equ 7                           ;
dStarZ_L        equ 8                           ;
dStarZ_H        equ 9                           ;
dStarAddr_L     equ 10                          ;
dStarAddr_H     equ 11                          ;
dStarBit        equ 12                          ;
dStarFlag       equ 13                          ;

lStar           equ 14                          ;

; Offsets to fields in a list of objects

dL_pList_L      equ 0                           ;
dL_pList_H      equ 1                           ;
dL_Z_L          equ 2                           ;
dL_Z_H          equ 3                           ;

; Offsets to an entry in a list of objects

dOL_Type        equ 0                           ;
dOL_X_L         equ 1                           ;
dOL_X_H         equ 2                           ;
dOL_Y_L         equ 3                           ;
dOL_Y_H         equ 4                           ;
dOL_Z_L         equ 5                           ;
dOL_Z_H         equ 6                           ;
dOL_ListFlag    equ 7                           ;

lList           equ 8                           ;

; Offsets to the demonstration data

dDemoText_L     equ 0                           ;
dDemoText_H     equ 1                           ;
dDemoObje_L     equ 2                           ;
dDemoObje_H     equ 3                           ;

; Offsets to a line object

dpLineAlg_L     equ 0                           ;
dpLineAlg_H     equ 1                           ;
dpnLine_L       equ 2                           ;
dpnLine_H       equ 3                           ;
dpnLineFree_L   equ 4                           ;
dpnLineFree_H   equ 5                           ;
dLineA          equ 6                           ;
dLineB          equ 7                           ;
dLineC          equ 8                           ;
dLineD          equ 9                           ;
dLineE          equ 10                          ;
dLineL          equ 11                          ;
dLineH          equ 12                          ;
dLineA1         equ 13                          ;
dLineC1         equ 14                          ;
dLineE1         equ 15                          ;
dLineL1         equ 16                          ;
dLineH1         equ 17                          ;
dLineSxx        equ 18                          ;
dLineBit        equ 19                          ;
dLineSyy        equ 20                          ;
dLineHV         equ 21                          ;
dLineIX_L       equ 22                          ;
dLineIX_H       equ 23                          ;

lLine           equ 24                          ;

; Offsets to a tunnel (wormhole) definition

dTunnelPos1_L   equ 0                           ;
dTunnelPos1_H   equ 1                           ;
dTunnelAngle1   equ 2                           ;
dTunnelPos2_L   equ 3                           ;
dTunnelPos2_H   equ 4                           ;
dTunnelAngle2   equ 5                           ;

; Offsets to a window object

dWindZ_L        equ 0                           ;
dWindZ_H        equ 1                           ;
dWindL_L        equ 3                           ;
dWindL_H        equ 4                           ;
dWindR_L        equ 5                           ;
dWindR_H        equ 6                           ;
dWindU_L        equ 7                           ;
dWindU_H        equ 8                           ;
dWindD_L        equ 9                           ;
dWindD_H        equ 10                          ;

lWind           equ 11                          ;

; Equates for the hidden rhino hunt game

dRhinoSpeed     equ 0                           ;
dRhinoiSpeed    equ 1                           ;
dRhinoPos_L     equ 2                           ;
dRhinoPos_H     equ 3                           ;
dRhinoFlag      equ 4                           ;
lRhino          equ 5                           ;

RhinoMap        equ $6700                       ;
RhinoList       equ $6800                       ;

cRhinoTree      equ $13                         ;
cRhinoBlank     equ $14                         ;
cRhinoChar      equ $17                         ;
cRhinoMan       equ $15                         ;
cRhinoExit      equ $16                         ;
cRhinoFuel      equ $0D                         ;

; Vectors to other parts of the code. This isn't included in this source (yet)...

SpaceInvaders   equ $DA00                       ;

; Start of Spectrum free memory

                org $5B00

                ; Include the fixed data and the start vector

; These are some fixed data fields generated by other tools...

; Character set graphics

pChars          defb $00,$00,$00,$00,$00,$00,$00,$00
                defb $80,$80,$80,$80,$80,$00,$80,$00
                defb $A0,$A0,$A0,$00,$00,$00,$00,$00
                defb $50,$50,$F8,$50,$F8,$50,$50,$00
                defb $20,$78,$A0,$70,$28,$F0,$20,$00
                defb $C0,$C8,$10,$20,$40,$98,$18,$00
                defb $40,$A0,$A0,$40,$A8,$90,$68,$00
                defb $80,$80,$80,$00,$00,$00,$00,$00
                defb $20,$40,$80,$80,$80,$40,$20,$00
                defb $80,$40,$20,$20,$20,$40,$80,$00
                defb $20,$A8,$70,$20,$70,$A8,$20,$00
                defb $00,$20,$20,$F8,$20,$20,$00,$00
                defb $00,$00,$00,$00,$40,$40,$80,$00
                defb $00,$00,$00,$F8,$00,$00,$00,$00
                defb $00,$00,$00,$00,$00,$00,$80,$00
                defb $00,$08,$10,$20,$40,$80,$00,$00
                defb $70,$88,$98,$A8,$C8,$88,$70,$00
                defb $20,$60,$20,$20,$20,$20,$70,$00
                defb $70,$88,$08,$30,$40,$80,$F8,$00
                defb $F8,$08,$10,$30,$08,$88,$70,$00
                defb $10,$30,$50,$90,$F8,$10,$10,$00
                defb $F8,$80,$F0,$08,$08,$88,$70,$00
                defb $38,$40,$80,$F0,$88,$88,$70,$00
                defb $F8,$08,$10,$20,$40,$40,$40,$00
                defb $70,$88,$88,$70,$88,$88,$70,$00
                defb $70,$88,$88,$78,$08,$10,$E0,$00
                defb $00,$00,$80,$00,$80,$00,$00,$00
                defb $00,$00,$40,$00,$40,$40,$80,$00
                defb $10,$20,$40,$80,$40,$20,$10,$00
                defb $00,$00,$F8,$00,$F8,$00,$00,$00
                defb $80,$40,$20,$10,$20,$40,$80,$00
                defb $70,$88,$10,$20,$20,$00,$20,$00
                defb $70,$88,$A8,$B8,$B0,$80,$78,$00
                defb $20,$50,$88,$88,$F8,$88,$88,$00
                defb $F0,$88,$88,$F0,$88,$88,$F0,$00
                defb $70,$88,$80,$80,$80,$88,$70,$00
                defb $F0,$88,$88,$88,$88,$88,$F0,$00
                defb $F8,$80,$80,$F0,$80,$80,$F8,$00
                defb $F8,$80,$80,$F0,$80,$80,$80,$00
                defb $78,$80,$80,$80,$98,$88,$78,$00
                defb $88,$88,$88,$F8,$88,$88,$88,$00
                defb $E0,$40,$40,$40,$40,$40,$E0,$00
                defb $08,$08,$08,$08,$08,$88,$70,$00
                defb $88,$90,$A0,$C0,$A0,$90,$88,$00
                defb $80,$80,$80,$80,$80,$80,$F8,$00
                defb $88,$D8,$A8,$A8,$88,$88,$88,$00
                defb $88,$88,$C8,$A8,$98,$88,$88,$00
                defb $70,$88,$88,$88,$88,$88,$70,$00
                defb $F0,$88,$88,$F0,$80,$80,$80,$00
                defb $70,$88,$88,$88,$A8,$90,$68,$00
                defb $F0,$88,$88,$F0,$A0,$90,$88,$00
                defb $70,$88,$80,$70,$08,$88,$70,$00
                defb $F8,$20,$20,$20,$20,$20,$20,$00
                defb $88,$88,$88,$88,$88,$88,$70,$00
                defb $88,$88,$88,$88,$88,$50,$20,$00
                defb $88,$88,$88,$A8,$A8,$D8,$88,$00
                defb $88,$88,$50,$20,$50,$88,$88,$00
                defb $88,$88,$50,$20,$20,$20,$20,$00
                defb $F8,$08,$10,$20,$40,$80,$F8,$00
                defb $F8,$C0,$C0,$C0,$C0,$C0,$F8,$00
                defb $00,$80,$40,$20,$10,$08,$00,$00
                defb $F8,$18,$18,$18,$18,$18,$F8,$00
                defb $20,$70,$A8,$20,$20,$20,$00,$00
                defb $00,$00,$00,$00,$00,$00,$F8,$00
                defb $00,$00,$00,$00,$00,$00,$00,$00
                defb $00,$00,$68,$98,$88,$98,$68,$00
                defb $80,$80,$B0,$C8,$88,$C8,$B0,$00
                defb $00,$00,$78,$80,$80,$80,$78,$00
                defb $08,$08,$68,$98,$88,$98,$68,$00
                defb $00,$00,$70,$88,$F8,$80,$70,$00
                defb $20,$40,$40,$E0,$40,$40,$40,$00
                defb $00,$00,$78,$88,$98,$68,$08,$70
                defb $80,$80,$F0,$88,$88,$88,$88,$00
                defb $80,$00,$80,$80,$80,$80,$80,$00
                defb $00,$20,$00,$20,$20,$20,$20,$C0
                defb $80,$80,$90,$A0,$E0,$90,$88,$00
                defb $C0,$40,$40,$40,$40,$40,$E0,$00
                defb $00,$00,$D0,$A8,$A8,$A8,$A8,$00
                defb $00,$00,$F0,$88,$88,$88,$88,$00
                defb $00,$00,$70,$88,$88,$88,$70,$00
                defb $00,$00,$F0,$88,$88,$F0,$80,$80
                defb $00,$00,$78,$88,$88,$78,$08,$08
                defb $00,$00,$B0,$C0,$80,$80,$80,$00
                defb $00,$00,$78,$80,$70,$08,$F0,$00
                defb $00,$20,$F8,$20,$20,$20,$18,$00
                defb $00,$00,$88,$88,$88,$88,$78,$00
                defb $00,$00,$88,$88,$50,$50,$20,$00
                defb $00,$00,$88,$88,$88,$A8,$50,$00
                defb $00,$00,$88,$50,$20,$50,$88,$00
                defb $00,$00,$90,$90,$90,$F0,$10,$E0
                defb $00,$00,$F8,$10,$20,$40,$F8,$00
                defb $30,$40,$40,$80,$40,$40,$30,$00
                defb $00,$80,$80,$00,$00,$80,$80,$00
                defb $C0,$20,$20,$10,$20,$20,$C0,$00
                defb $50,$00,$70,$88,$F8,$80,$70,$00
                defb $00,$00,$08,$70,$80,$00,$00,$00

; Character widths

wChars          defb $07,$09,$09,$09,$09,$09,$09,$03
                defb $05,$05,$05,$05,$03,$05,$05,$05
                defb $05,$03,$05,$05,$05,$05,$09,$09 ; " " ..
                defb $07,$09,$07,$02,$05,$09,$07,$09
                defb $06,$02,$04,$06,$06,$06,$06,$02
                defb $04,$04,$06,$06,$03,$06,$02,$06
                defb $06,$06,$06,$06,$06,$06,$06,$06
                defb $06,$06,$02,$03,$05,$06,$05,$06
                defb $06,$06,$06,$06,$06,$06,$06,$06
                defb $06,$04,$06,$06,$06,$06,$06,$06
                defb $06,$06,$06,$06,$06,$06,$06,$06
                defb $06,$06,$06,$06,$06,$06,$06,$06
                defb $06,$06,$06,$06,$06,$06,$04,$06
                defb $06,$02,$04,$06,$04,$06,$06,$06
                defb $06,$06,$05,$06,$06,$06,$06,$06
                defb $06,$05,$06,$05,$02,$05,$06,$06
                defb $03,$06,$0C,$12,$18,$1E,$24,$2A  ; Wide spaces $80..?
                defb $30,$36,$3C,$42,$48,$06,$06,$06
                defb $01,$02,$03,$04,$05,$06,$06,$06
                defb $06,$06,$06,$06,$06,$06,$06,$06
                defb $06,$06,$06,$06,$06,$06,$06,$06
                defb $06,$06,$06,$06,$06,$06,$06,$06
                defb $06,$06,$06,$06,$06,$06,$06,$06
                defb $06,$06,$06,$06,$06,$06,$06,$06
                defb $06,$06,$06,$06,$06,$06,$06,$06
                defb $06,$06,$06,$06,$06,$06,$06,$06
                defb $06,$06,$06,$06,$06,$06,$06,$06
                defb $06,$06,$06,$06,$06,$06,$06,$06
                defb $06,$06,$06,$06,$06,$06,$06,$06
                defb $06,$06,$06,$06,$06,$06,$06,$06
                defb $06,$06,$06,$06,$06,$06,$06,$06
                defb $06,$06,$06,$06,$06,$06,$06,$06

; The user-defined key codes

UDKTab          defb $01,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $02,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $26,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $25,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $0A,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $05,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $06,$07,$08,$09,$22,$21,$20,$1F
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF

; Initial settings for the user-defined keys

iUDKTab         defb $01,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $02,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $26,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $25,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $0A,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $05,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $06,$07,$08,$09,$22,$21,$20,$1F
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF

; The map of the planet.

Map             defb $FD,$20,$FE,$FE,$FE,$FE,$FE,$0F
                defb $0E,$0D,$07,$FF,$FF,$18,$02,$FF
                defb $FF,$00,$FC,$FE,$FE,$FF,$01,$FF
                defb $FB,$18,$FE,$FE,$FE,$FE,$FE,$FE
                defb $22,$21,$FE,$FF,$10,$19,$1A,$FF
                defb $28,$05,$20,$21,$22,$23,$24,$0A
                defb $FB,$FF,$FE,$02,$FF,$FF,$19,$FF
                defb $FF,$18,$FE,$08,$09,$08,$09,$08
                defb $23,$FE,$06,$1B,$22,$23,$24,$FF
                defb $04,$FE,$25,$1C,$FF,$FF,$27,$23
                defb $18,$10,$FF,$11,$12,$19,$18,$19
                defb $FF,$18,$28,$FE,$FC,$09,$FB,$03
                defb $00,$FE,$FE,$FC,$25,$FB,$25,$FC
                defb $FE,$FE,$27,$1D,$FB,$1E,$FC,$03
                defb $FE,$FE,$13,$FE,$18,$FE,$FC,$19
                defb $04,$FF,$FF,$08,$09,$FF,$FF,$FF
                defb $01,$02,$FE,$11,$26,$27,$26,$1F
                defb $FF,$19,$26,$FF,$FF,$1F,$18,$FE
                defb $20,$11,$14,$FE,$19,$FC,$29,$09
                defb $FC,$21,$FF,$22,$23,$FE,$FE,$FE
                defb $FE,$FE,$03,$FF,$12,$FC,$18,$FF
                defb $FB,$FF,$24,$23,$1B,$23,$27,$19
                defb $24,$15,$16,$FE,$FE,$10,$FF,$18
                defb $05,$23,$FF,$22,$25,$FE,$FE,$00
                defb $FE,$FE,$05,$04,$06,$1B,$1F,$1A
                defb $FF,$18,$FE,$29,$1C,$FF,$FE,$1A
                defb $FF,$10,$11,$12,$2A,$FB,$01,$13
                defb $FC,$20,$FF,$21,$08,$10,$19,$04
                defb $00,$07,$FF,$FF,$13,$FF,$19,$FF
                defb $FE,$01,$FE,$1D,$1E,$FB,$09,$FE
                defb $FE,$23,$24,$02,$2B,$17,$FF,$09
                defb $FC,$21,$FF,$24,$01,$02,$FB,$03
                defb $FE,$FF,$24,$FF,$14,$FF,$FC,$FF
                defb $FE,$2A,$FF,$1F,$1E,$00,$01,$07
                defb $04,$05,$06,$FF,$FF,$FF,$08,$18
                defb $11,$20,$FF,$11,$FF,$FF,$FF,$04
                defb $FE,$FF,$FF,$FB,$FE,$FE,$FF,$FE
                defb $FE,$FE,$03,$18,$05,$FF,$2B,$27
                defb $20,$FF,$21,$22,$23,$24,$25,$26
                defb $FF,$FE,$FF,$20,$FE,$FE,$FF,$FC
                defb $FE,$FE,$1C,$1D,$19,$06,$FC,$0F
                defb $27,$FF,$FB,$02,$0E,$0D,$0C,$20
                defb $20,$FE,$FF,$00,$FB,$01,$FE,$FF
                defb $10,$11,$FE,$03,$08,$FE,$FF,$FC
                defb $FE,$FE,$1E,$1C,$FF,$FF,$15,$18
                defb $23,$FF,$FC,$FF,$FE,$FE,$0B,$22
                defb $27,$FF,$FF,$FF,$FF,$FF,$FF,$FF
                defb $12,$13,$FE,$2C,$09,$26,$08,$FC
                defb $FE,$FE,$25,$00,$21,$FF,$16,$FB
                defb $21,$04,$FF,$FF,$FE,$FE,$0A,$24
                defb $21,$FF,$FE,$FE,$22,$23,$05,$11
                defb $12,$13,$14,$04,$08,$26,$09,$00
                defb $FE,$03,$FF,$26,$07,$15,$17,$19
                defb $08,$09,$FF,$FE,$FE,$FF,$FC,$FF
                defb $FF,$FE,$FC,$02,$FC,$03,$FE,$FE
                defb $18,$FB,$10,$03,$17,$FF,$18,$05
                defb $FE,$05,$27,$FE,$20,$01,$04,$FC
                defb $0A,$0B,$1A,$1B,$FC,$FF,$FE,$10
                defb $20,$21,$22,$23,$24,$FF,$00,$01
                defb $18,$19,$FF,$FE,$10,$FB,$04,$FE
                defb $FE,$FE,$04,$2C,$FE,$FE,$FE,$0D
                defb $0C,$FC,$05,$FB,$03,$19,$FE,$11
                defb $FF,$FF,$23,$24,$25,$FF,$04,$05
                defb $18,$19,$06,$07,$FE,$FC,$FE,$FE

; This is the correct entry point

Main            jp FireUp               ; Vector off to the start
FireUpVector    equ .-2                 ; This modified to hide the check code later

        ; Point to the four different HighScore tables... Only two really.

HighPtrs        defw HighScores,HighScores1,HighScores,HighScores1 ;

	; Now have the initial highscore tables.

HighScores      defb "I see children with vacant stares",$00,$01,$00
                defb "I thought I heard them say . . . ",$00,$01,$00
                defb "Don't think sorry's easily said",$00,$01,$00
                defb " ",$00,$01,$00
                defb "The price of infamy , the edge of insanity",$00,$01,$00
                defb "Talking 'bout stupid things",$00,$01,$00
                defb "She is dancing away from you now",$00,$01,$00
                defb "Take me for a fool if you feel that's right",$00,$01,$00
                defb "Or a whipping boy , someone to despise",$00,$01,$00
                defb "Please don't look at me this way",$00,$01,$00
                defb " ",$00,$01,$00
                defb "It's coming for me thro' the trees",$00,$01,$00
                defb "And you may ask yourself",$00,$01,$00
                defb "Wonder why . . What makes me rise so high",$00,$01,$00
                defb "Surely you know-the chance has gone by",$00,$01,$00
                defb "And my spirit is crying for leaving",$00,$01,$00

HighScores1     defb "We're not scared to lose it all",$00,$01,$00
                defb "Security gone to the wall",$00,$01,$00
                defb "Future dreams we have to realise",$00,$01,$00
                defb "A thousand critics hands",$00,$01,$00
                defb "Won't keep us from the things we plan",$00,$01,$00
                defb "While we cling to the Things we prize",$00,$01,$00
                defb "And do you feel scared - I do",$00,$01,$00
                defb "But I won't stop and falter",$00,$01,$00
                defb "And if we threw it all away",$00,$01,$00
                defb "Things can only get better",$00,$01,$00
                defb "Treating this as though it was",$00,$01,$00
                defb "The last , the final game",$00,$01,$00
                defb "Get to christmas and feel no regret",$00,$01,$00
                defb "It may take a little time",$00,$01,$00
                defb "A lonely path , an uphill climb",$00,$01,$00
                defb "Success or failure cannot alter us",$00,$01,$00

                defb "Please excuse me , I have some aging & dying to "
                defb "be getting on with ."

        ; Fill the rest of the highscore table buffer with zeros

                defs (HighScores+$600) - $,$00

	; The highscore editing line 

HSBuffer        defs $80,$00

; Encrypted end message...

Message         defb $F4,$F4,$F4,$ED,$33,$4F,$48,$52
                defb $07,$4A,$4C,$58,$07,$48,$52,$07
                defb $42,$56,$51,$51,$4C,$42,$53,$07
                defb $00,$07,$33,$4F,$4C,$07,$54,$4C
                defb $52,$52,$40,$4E,$4C,$07,$51,$4C
                defb $40,$43,$52,$07,$19,$14,$F4,$F4
                defb $F4,$EC,$01,$07,$15,$07,$15,$07
                defb $15,$07,$54,$55,$07,$53,$40,$57
                defb $4C,$07,$51,$4C,$42,$56,$51,$43
                defb $4C,$51,$07,$00,$07,$20,$4F,$07
                defb $00,$07,$20,$53,$07,$4B,$40,$52
                defb $53,$07,$00,$F4,$31,$48,$4E,$4F
                defb $53,$07,$0B,$07,$28,$0E,$5D,$4C
                defb $07,$56,$55,$4B,$58,$07,$4E,$56
                defb $53,$07,$40,$07,$4D,$4C,$5E,$07
                defb $52,$4C,$42,$56,$55,$43,$52,$07
                defb $0B,$07,$4D,$48,$51,$52,$53,$F4
                defb $28,$0E,$43,$07,$4B,$48,$4A,$4C
                defb $07,$53,$56,$07,$52,$40,$58,$07
                defb $4F,$56,$5E,$07,$4B,$48,$53,$53
                defb $4B,$4C,$07,$28,$0E,$5D,$4C,$07
                defb $4C,$55,$49,$56,$58,$4C,$43,$F4
                defb $41,$5C,$48,$4B,$43,$48,$55,$4E
                defb $07,$53,$4F,$48,$52,$07,$53,$4C
                defb $43,$48,$56,$5C,$52,$07,$57,$4B
                defb $40,$55,$4C,$53,$07,$0B,$07,$52
                defb $4C,$42,$56,$55,$43,$4B,$58,$F4
                defb $28,$0E,$43,$07,$49,$5C,$52,$53
                defb $07,$4B,$48,$4A,$4C,$07,$53,$56
                defb $07,$57,$56,$5C,$51,$07,$42,$56
                defb $55,$53,$4C,$54,$57,$53,$07,$56
                defb $55,$07,$15,$07,$15,$07,$15,$07
                defb $01,$F4,$F4,$ED,$21,$5C,$53,$07
                defb $40,$53,$07,$53,$4F,$48,$52,$07
                defb $57,$56,$48,$55,$53,$07,$53,$4F
                defb $4C,$07,$53,$40,$57,$4C,$07,$51
                defb $5C,$55,$52,$07,$56,$5C,$53,$07
                defb $40,$55,$43,$07,$53,$4F,$4C,$F4
                defb $51,$4C,$52,$53,$07,$56,$4D,$07
                defb $53,$4F,$4C,$07,$54,$4C,$52,$52
                defb $40,$4E,$4C,$07,$48,$52,$07,$4B
                defb $56,$52,$53,$07,$53,$56,$07,$53
                defb $4F,$4C,$07,$52,$4C,$40,$52,$F4
                defb $56,$4D,$07,$53,$48,$54,$4C,$07
                defb $15,$F4,$F4,$E2,$01,$30,$5C,$48
                defb $53,$4C,$07,$40,$07,$57,$56,$4C
                defb $53,$48,$42,$07,$4C,$55,$43,$48
                defb $55,$4E,$07,$28,$07,$53,$4F,$56
                defb $5C,$4E,$4F,$53,$01,$F4,$E3,$01
                defb $32,$4F,$5C,$53,$07,$5C,$57,$07
                defb $40,$55,$43,$07,$43,$56,$07,$53
                defb $4F,$4C,$07,$4B,$56,$40,$43,$4C
                defb $51,$01,$E7,$AA,$AA,$AA,$E6,$9F
                defb $C3,$CD,$70,$C3,$00,$94,$C3,$9E
                defb $7A,$C3,$A6,$7A,$C3,$AE,$7A,$C3
                defb $B6,$7A,$C3,$BE,$7A,$C3,$C6,$7A
                defb $C3,$CE,$7A,$C3,$D6,$7A,$E6,$9F
                defb $F2,$3C,$F8,$3B,$C3,$6A,$6F,$C3
                defb $8C,$77,$C3,$A3,$6D,$C3,$F6,$6E
                defb $C3,$A3,$79,$00,$80,$40,$04,$00
                defb $20,$01,$00,$00,$47,$47,$00,$00
                defb $00,$C3,$0C,$7D,$F8,$3C,$66,$66
                defb $3E,$06,$66,$3C,$00,$3C,$66,$66
                defb $66,$66,$66,$3C,$00,$18,$38,$18

; When decoded, that says:

;[yellow]   This key is correct ! The message reads :-
;
;
;[Cyan]     " . . . mn tape recorder ! Ah ! At last !
;           Right , I've only got a few seconds , first
;           I'd like to say how little I've enjoyed
;           building this tedious planet , secondly
;           I'd just like to pour contempt on . . . "
;
;[yellow]   But at this point the tape runs out and the
;           rest of the message is lost to the seas
;           of time .
;
;[magenta]  "Quite a poetic ending I thought"
;[green]    "Shut up and do the loader"


        ; Fill to the start of the code with zeros

                defs $6B00 - $,$00

; This looks like the start address, but that's a piece of misdirection.
; If you start it here it will crash (top bit of R is not set)...

Start           jp Reset                        ;

; Vector to the actual game code

Play            jp GameCode                     ;

;  Vectors to key scan code

kLeft           defs 3                          ;

kRight          defs 3                          ;

kUp             defs 3                          ;

kDown           defs 3                          ;

kAccel          defs 3                          ;

kDeccel         defs 3                          ;

kFire           defs 3                          ;

                defs 9,$00                      ; Spare room

vReadKey        jp ReadKeys                     ;

vScanOptiKeys   jp ScanOptiKeys                 ;

vPrint          jp Print                        ;

vPrintStr       jp PrintStr                     ;

vAddScroll      jp AddScroll                    ;

pCurX           defs 1                          ;
pCurY           defs 2                          ;
ppCurY          defs 1                          ;

AType           defs 1                          ;
BType           defs 1                          ;
CType           defs 1                          ;
DType           defs 1                          ;
EType           defs 1                          ;

DDamage         defs 1                          ;
ADamage         defs 1                          ;

DScore          defs 2                          ;

nCodesFound     defs 1                          ;

vFuckUp         jp FuckUp                       ;

EndState        defs 1                          ;

Mode            defs 1                          ;

; Character set for the soft-scrolling digits

Zero            defb $3C,$66,$66,$3E,$06,$66,$3C,0;
Sc0             defb $3C,$66,$66,$66,$66,$66,$3C,0;
Sc1             defb $18,$38,$18,$18,$18,$18,$7E,0;
Sc2             defb $3C,$66,$06,$3C,$60,$66,$7E,0;
Sc3             defb $3C,$66,$06,$1C,$06,$66,$3C,0;
Sc4             defb $1C,$3C,$6C,$CC,$FE,$0C,$1E,0;
Sc5             defb $7E,$62,$60,$7C,$06,$66,$3C,0;
Sc6             defb $3C,$66,$60,$7C,$66,$66,$3C,0;
Sc7             defb $7E,$66,$06,$0C,$18,$18,$18,0;
Sc8             defb $3C,$66,$66,$3C,$66,$66,$3C,0;
Sc9             defb $3C,$66,$66,$3E,$06,$66,$3C,0;

ScS             defb 0,0,0,0,0,0,0,0            ;

                defb $10,$30,$10,$10,$10,$10,$38,0;

ScTab1          defw ScS,Sc1,Sc2,Sc3,Sc4        ;
                defw Sc5,Sc6,Sc7,Sc8,Sc9        ;

ScTab2          defw Sc0,Sc1,Sc2,Sc3,Sc4        ;
                defw Sc5,Sc6,Sc7,Sc8,Sc9        ;

; Energy display dials

nDials          equ 8                           ;

MaxEnergy       equ nDials*9-1                  ;

        if not def Elephants or def Original

; These are the Krell style graphics

Dial0           defb $07,$E0,$18,$18,$20,$04,$40,$02;
                defb $40,$02,$80,$01,$80,$01,$81,$81;
                defb $81,$81,$82,$41,$82,$41,$44,$22;
                defb $44,$22,$24,$24,$18,$18,$00,$00;

Dial1           defb $07,$E0,$18,$18,$20,$04,$40,$02;
                defb $40,$02,$80,$01,$80,$01,$81,$81;
                defb $83,$81,$86,$41,$8E,$41,$5C,$22;
                defb $7C,$22,$3C,$24,$18,$18,$00,$00;

Dial2           defb $07,$E0,$18,$18,$20,$04,$40,$02;
                defb $40,$02,$80,$01,$80,$01,$FF,$81;
                defb $FF,$81,$FE,$41,$FE,$41,$7C,$22;
                defb $7C,$22,$3C,$24,$18,$18,$00,$00;

Dial3           defb $07,$E0,$18,$18,$30,$04,$78,$02;
                defb $7C,$02,$FE,$01,$FF,$01,$FF,$81;
                defb $FF,$81,$FE,$41,$FE,$41,$7C,$22;
                defb $7C,$22,$3C,$24,$18,$18,$00,$00;

Dial4           defb $07,$E0,$1F,$18,$3F,$04,$7F,$02;
                defb $7F,$02,$FF,$01,$FF,$01,$FF,$81;
                defb $FF,$81,$FE,$41,$FE,$41,$7C,$22;
                defb $7C,$22,$3C,$24,$18,$18,$00,$00;

Dial5           defb $07,$E0,$1F,$F8,$3F,$FC,$7F,$F2;
                defb $7F,$E2,$FF,$C1,$FF,$81,$FF,$81;
                defb $FF,$81,$FE,$41,$FE,$41,$7C,$22;
                defb $7C,$22,$3C,$24,$18,$18,$00,$00;

Dial6           defb $07,$E0,$1F,$F8,$3F,$FC,$7F,$FE;
                defb $7F,$FE,$FF,$FF,$FF,$FF,$FF,$81;
                defb $FF,$81,$FE,$41,$FE,$41,$7C,$22;
                defb $7C,$22,$3C,$24,$18,$18,$00,$00;

Dial7           defb $07,$E0,$1F,$F8,$3F,$FC,$7F,$FE;
                defb $7F,$FE,$FF,$FF,$FF,$FF,$FF,$FF;
                defb $FF,$FF,$FE,$5F,$FE,$47,$7C,$22;
                defb $7C,$22,$3C,$24,$18,$18,$00,$00;

Dial8           defb $07,$E0,$1F,$F8,$3F,$FC,$7F,$FE;
                defb $7F,$FE,$FF,$FF,$FF,$FF,$FF,$FF;
                defb $FF,$FF,$FE,$7F,$FE,$7F,$7C,$3E;
                defb $7C,$3E,$3C,$3C,$18,$18,$00,$00;

        else

; The elephant style gauges

Dial0           defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;

Dial1           defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %01100000,%00001100        ;
                defb %10010000,%00010010        ;
                defb %01000101,%01000100        ;
                defb %01000011,%10000100        ;
                defb %10000000,%00000010        ;
                defb %10010000,%00010010        ;
                defb %11001000,%00100110        ;
                defb %10010000,%00010010        ;
                defb %00100000,%00001000        ;
                defb %00100001,%10001000        ;
                defb %00100110,%11001000        ;
                defb %00111100,%01111000        ;
                defb %00111100,%01111000        ;
                defb %00111100,%01111000        ;

Dial2           defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %01100000,%00001100        ;
                defb %10010010,%00010010        ;
                defb %01000101,%01000100        ;
                defb %01000011,%10000100        ;
                defb %10000000,%00000010        ;
                defb %10010000,%00010010        ;
                defb %11001000,%00100110        ;
                defb %10010000,%00010010        ;
                defb %00100000,%00001000        ;
                defb %00111011,%11111000        ;
                defb %00111110,%11111000        ;
                defb %00111100,%01111000        ;
                defb %00111100,%01111000        ;
                defb %00111100,%01111000        ;

Dial3           defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %01100010,%00001100        ;
                defb %10010001,%00010010        ;
                defb %01000101,%01000100        ;
                defb %01000011,%10000100        ;
                defb %10000000,%00000010        ;
                defb %10010000,%00010010        ;
                defb %11001000,%00100110        ;
                defb %10011100,%01110010        ;
                defb %00111100,%11111000        ;
                defb %00111011,%11111000        ;
                defb %00111110,%11111000        ;
                defb %00111100,%01111000        ;
                defb %00111100,%01111000        ;
                defb %00111100,%01111000        ;

Dial4           defb %00000000,%00000000        ;
                defb %00000000,%00000000        ;
                defb %01100001,%00001100        ;
                defb %10010001,%00010010        ;
                defb %01000101,%01000100        ;
                defb %01000011,%10000100        ;
                defb %10000000,%00000010        ;
                defb %10010000,%00010010        ;
                defb %11001111,%11100110        ;
                defb %10011111,%11110010        ;
                defb %00111100,%11111000        ;
                defb %00111011,%11111000        ;
                defb %00111110,%11111000        ;
                defb %00111100,%01111000        ;
                defb %00111100,%01111000        ;
                defb %00111100,%01111000        ;

Dial5           defb %00000000,%00000000        ;
                defb %00000010,%00000000        ;
                defb %01100001,%00001100        ;
                defb %10010001,%00010010        ;
                defb %01000101,%01000100        ;
                defb %01000011,%10000100        ;
                defb %11000000,%00000110        ;
                defb %11111111,%11111110        ;
                defb %11001111,%11100110        ;
                defb %10011111,%11110010        ;
                defb %00111100,%11111000        ;
                defb %00111011,%11111000        ;
                defb %00111110,%11111000        ;
                defb %00111100,%01111000        ;
                defb %00111100,%01111000        ;
                defb %00111100,%01111000        ;

Dial6           defb %00000000,%00000000        ;
                defb %00000001,%00000000        ;
                defb %01100001,%00001100        ;
                defb %10010001,%00010010        ;
                defb %01000101,%01000100        ;
                defb %01000011,%10000100        ;
                defb %11111111,%11111110        ;
                defb %11111111,%11111110        ;
                defb %11001111,%11100110        ;
                defb %10011111,%11110010        ;
                defb %00111100,%11111000        ;
                defb %00111011,%11111000        ;
                defb %00111110,%11111000        ;
                defb %00111100,%01111000        ;
                defb %00111100,%01111000        ;
                defb %00111100,%01111000        ;

Dial7           defb %00000010,%00000000        ;
                defb %00000001,%00000000        ;
                defb %01100001,%00001100        ;
                defb %10010001,%00010010        ;
                defb %01100101,%01001100        ;
                defb %01111111,%11111100        ;
                defb %11111111,%11111110        ;
                defb %11111111,%11111110        ;
                defb %11001111,%11100110        ;
                defb %10011111,%11110010        ;
                defb %00111100,%11111000        ;
                defb %00111011,%11111000        ;
                defb %00111110,%11111000        ;
                defb %00111100,%01111000        ;
                defb %00111100,%01111000        ;
                defb %00111100,%01111000        ;

Dial8           defb %00000001,%00000000        ;
                defb %00000001,%00000000        ;
                defb %01100001,%00001100        ;
                defb %11110001,%00011110        ;
                defb %01111101,%01111100        ;
                defb %01111111,%11111100        ;
                defb %11111111,%11111110        ;
                defb %11111111,%11111110        ;
                defb %11001111,%11100110        ;
                defb %10011111,%11110010        ;
                defb %00111100,%11111000        ;
                defb %00111011,%11111000        ;
                defb %00111110,%11111000        ;
                defb %00111100,%01111000        ;
                defb %00111100,%01111000        ;
                defb %00111100,%01111000        ;
        endif

pUDKTab         defs 2                          ;
pKeyTab         defs 2                          ;
pKeyVDU         defs 2                          ;
CurType         defs 1                          ;
FlashpDisp      defs 2                          ;
UDKat0          defs 1                          ;
UDKat1          defs 1                          ;

LineBuffer      defs 30                         ;

OptiFlashR      equ 400                         ;
JoyFlashRate    equ 400                         ;

CurFlag         defs 1                          ;
CurrKey         defs 1                          ;
CurrKeyAddr     defs 2                          ;

RepDel          defs 2                          ;
RepSpeed1       defs 2                          ;
RepSpeed2       defs 2                          ;

CursorSpeed     defs 1                          ;
CursorType      defs 1                          ;
CurCol          defs 1                          ;

CapsShift       equ KeyCounts                   ;
KeyCounts       defs 36                         ;
SymbolShift     defs 4                          ;

MinScans        equ 9                           ;
FlashRate       equ 130                         ;
HSTimeOut       equ $5400                       ;

pUDKd           defs 1                          ;
UDKfr           equ 400                         ;
UDKft           defs 1                          ;
UDKatt          defs 2                          ;

pList           defs 2                          ;

EntryF          defs 1                          ;
EntryY          defs 2                          ;
pInsert         defs 2                          ;
pHSEnd          defs 2                          ;

KeyMask         defs 40                         ;

cJoy            defb 0                          ;
cJoyAttr        defs 2                          ;
cInput          defb "K"                        ;

lKey            equ 10                          ;

cDel            equ $08                         ;
cCret           equ $0D                         ;
cCls            equ $0C                         ;
Clr             equ $1B                         ;
cHome           equ $0E                         ;

cBlack          equ $00                         ;
cBlue           equ $01                         ;
cRed            equ $02                         ;
cMagenta        equ $03                         ;
cGreen          equ $04                         ;
cCyan           equ $05                         ;
cYellow         equ $06                         ;
cWhite          equ $07                         ;

Colon1R         equ $5AC2                       ;
Colon2R         equ $5AC5                       ;
Colon1N         equ $580E                       ;
Colon2N         equ $5811                       ;

ClockDataR      defw ScS,ScS,ScS,ScS,ScS,ScS            ;
                defw $50C7,$50C6,$50C4,$50C3,$50C1,$50C0;
                defb 9,5,9,5,9,9                        ;

ClockDataN      defw ScS,ScS,ScS,ScS,ScS,ScS            ;
                defw $4013,$4012,$4010,$400F,$400D,$400C;
                defb 9,5,9,5,9,9                        ;

CDEnd           equ $                           ;

SecCount        defb 1                          ;

Slice           defb 1                          ;

nScroll         defb 1                          ;

p1              defs 12                         ;

FirstpDig       defs 12                         ;
FirstDig        defs 6                          ;

ScCnt           defb 0                          ;

Sc_F            defb 0                          ;

ScPtr           defw 0                          ;

ScAttr          defb $45                        ;

ScACnt          defb 0                          ;

Buff0           defb 0                          ;
Buff1           defb 0                          ;
Buff2           defb 0                          ;
Buff3           defb 0                          ;
Buff4           defb 0                          ;
Buff5           defb 0                          ;
Buff6           defb 0                          ;
Buff7           defb 0                          ;

pcDial          defs 2                          ;

pcShape         defs 2                          ;

Print           push ix                         ;
                push hl                         ;
                push de                         ;
                push bc                         ;
                push af                         ;

                cp cWhite+1                     ;
                jr c,pColour                    ;

                cp cCls                         ;
                jr z,pCls                       ;

                cp cCret                        ;
                jr z,pCR                        ;

                cp cHome                        ;
                jr z,pHome                      ;

                ld h,wChars/256                 ;
                ld l,a                          ;

                ld a,(pCurX)                    ;
                add a,(hl)                      ;
                call c,pCret                    ;

                call pOutChar                   ;

                ld a,(pCurX)                    ;
                add a,(hl)                      ;
                ld (pCurX),a                    ;

pExit           pop af                          ;
                pop bc                          ;
                pop de                          ;
                pop hl                          ;
                pop ix                          ;
                ret                             ;

pColour         cp 4                            ;
                jr nc,pCol1                     ;

                or $40                          ;

pCol1           ld (CurCol),a                   ;
                jr pExit                        ;

pCR             call pCret                      ;
                jr pExit                        ;

pCls            ld e,$00                        ;
                ld hl,Attrs                     ;
                ld bc,$0300                     ;

pC1             ld a,(hl)                       ;
                and $07                         ;
                jr z,pC2                        ;

                set 0,e                         ;
                dec (hl)                        ;
pC2             cpi                             ;
                jp pe,pC1                       ;

                call Delay                      ;

                bit 0,e                         ;
                jr nz,pCls                      ;

                ld hl,ScreenBase                ;
                ld de,ScreenBase+1              ;
                ld bc,$1800                     ;

                xor a                           ;
                ld (hl),a                       ;

                ldir                            ;

                ld a,(CurCol)                   ;
                ld (hl),a                       ;

                ld bc,$02FF                     ;

                ldir                            ;

                xor a                           ;
                out ($FE),a                     ;

pHome           xor a                           ;
                ld (pCurX),a                    ;
                ld (ppCurY),a                   ;

                ld a,cWhite                     ;
                ld (CurCol),a                   ;

                ld hl,ScreenBase                ;
                ld (pCurY),hl                   ;

                jr pExit                        ;

pCret           ld a,(ppCurY)                   ;
                inc a                           ;

SetUpY          ld (ppCurY),a                   ;

                and $1F                         ;

                push hl                         ;

                ld l,a                          ;
                ld h,$00                        ;

                add hl,hl                       ;

                ld de,YTableFE                  ;
                add hl,de                       ;

                ld a,(hl)                       ;
                inc hl                          ;
                ld h,(hl)                       ;
                ld l,a                          ;

                ld (pCurY),hl                   ;

                xor a                           ;
                ld (pCurX),a                    ;

                pop hl                          ;
                ret                             ;

pOutChar        bit 7,l                         ;
                ret nz                          ;

                push hl                         ;

                ld h,0                          ;

                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;

                ld de,pChars-256                ;
                add hl,de                       ;

                push hl                         ;
                pop ix                          ;

                ld a,(pCurX)                    ;

                rrca                            ;
                rrca                            ;
                rrca                            ;
                and $1F                         ;

                ld de,(pCurY)                   ;

                or e                            ;
                ld e,a                          ;

                push de                         ;

                ld a,d                          ;
                rrca                            ;
                rrca                            ;
                rrca                            ;
                and $03                         ;
                or $58                          ;
                ld d,a                          ;

                ld a,(CurCol)                   ;
                ld (de),a                       ;
                inc de                          ;
                ld (de),a                       ;

                pop de                          ;

                ld a,(pCurX)                    ;
                and $07                         ;
                ld c,a                          ;

                ld b,$08                        ;

OutCharL        ld h,(ix)                       ;
                ld l,$00                        ;

                ld a,c                          ;
                or a                            ;
                jr z,OCL1                       ;

OCL2            srl h                           ;
                rr l                            ;
                dec a                           ;
                jr nz,OCL2                      ;

OCL1            ld a,(de)                       ;
                xor h                           ;
                ld (de),a                       ;

                inc e                           ;

                ld a,(de)                       ;
                xor l                           ;
                ld (de),a                       ;

                dec e                           ;

                inc ix                          ;
                inc d                           ;

                djnz OutCharL                   ;

                pop hl                          ;
                ret                             ;

YTableFE        defw $4000,$4020,$4040,$4060    ;
                defw $4080,$40A0,$40C0,$40E0    ;
                defw $4800,$4820,$4840,$4860    ;
                defw $4880,$48A0,$48C0,$48E0    ;
                defw $5000,$5020,$5040,$5060    ;
                defw $5080,$50A0,$50C0,$50E0    ;
                defw 0,0,0,0,0,0,0,0            ;

Wait            ld a,$7F                        ;
                in a,($FE)                      ;
                rra                             ;
                jr nc,Wait                      ;
                ret                             ;

Delay           push bc                         ;
                ld bc,$0320                     ;
Del1            cpi                             ;
                dec hl                          ;
                jp pe,Del1                      ;
                pop bc                          ;
                ret                             ;

PrintStr        push hl                         ;
                push af                         ;
PStr1           ld a,(hl)                       ;
                inc hl                          ;
                or a                            ;
                jr z,PStr2                      ;
                call Print                      ;
                jr PStr1                        ;

PStr2           pop af                          ;
                pop hl                          ;
                ret                             ;

PrintStr1       ex (sp),hl                      ;
                push af                         ;
PStr11          ld a,(hl)                       ;
                inc hl                          ;
                or a                            ;
                jr z,PStr12                     ;
                call Print                      ;
                jr PStr11                       ;

PStr12          pop af                          ;
                ex (sp),hl                      ;
                ret                             ;

InitKbd         ld hl,KeyCounts                 ;
                ld de,KeyCounts+1               ;
                ld bc,$0027                     ;
                ld (hl),$49                     ;
                ldir                            ;

                xor a                           ;
                ld (CurrKey),a                  ;

                ld hl,200                       ;
                ld (RepSpeed1),hl               ;

                ld hl,30                        ;
                ld (RepSpeed2),hl               ;
                ret                             ;

ReadKey         push ix                         ;
                push hl                         ;
                push de                         ;
                push bc                         ;
                push af                         ;

                ex af,af'                       ;
                push af                         ;

                ld hl,CapsShift                 ;
                set 7,(hl)                      ;

                ld hl,SymbolShift               ;
                set 7,(hl)                      ;

                call ReadKeys                   ;

                dec a                           ;
                ld b,a                          ;

                xor a                           ;

                ld hl,CapsShift                 ;
                bit 6,(hl)                      ;
                jr z,Shifta                     ;

                add a,40                        ;

Shifta          ld hl,SymbolShift               ;
                bit 6,(hl)                      ;
                jr z,Shiftb                     ;

                add a,80                        ;

Shiftb          add a,b                         ;

                ld e,a                          ;
                ld d,0                          ;

                ld hl,kTab0                     ;
                add hl,de                       ;

                pop af                          ;
                ex af,af'                       ;

                pop af                          ;

                ld a,(hl)                       ;

                pop bc                          ;
                pop de                          ;
                pop hl                          ;
                pop ix                          ;
                ret                             ;

ReadKeys        ld a,1                          ;
                ld (CursorSpeed),a              ;
                ld (CursorType),a               ;

ReadKeyLp       call CursorInv                  ;

                call ScanKeys                   ;

                jr nz,RKNewKey                  ;

                ld a,(CurrKey)                  ;
                or a                            ;
                jr z,ReadKeyLp                  ;

                ld hl,(CurrKeyAddr)             ;
                bit 6,(hl)                      ;
                jr z,RKCancelOld                ;

                ld hl,(RepDel)                  ;
                dec hl                          ;
                ld (RepDel),hl                  ;

                ld a,l                          ;
                or h                            ;
                jr nz,ReadKeyLp                 ;

                ld hl,(RepSpeed2)               ;
RK1             ld (RepDel),hl                  ;

                call CursorOff                  ;

                ld a,(CurrKey)                  ;
                ret                             ;

RKNewKey        ld (CurrKey),a                  ;

                ld hl,(RepSpeed1)               ;
                ld (CurrKeyAddr),ix             ;

                jr RK1                          ;

RKCancelOld     xor a                           ;
                ld (CurrKey),a                  ;

                jr ReadKeyLp                    ;

CursorOff       ld a,(CursorType)               ;
                or a                            ;
                jr z,FlipCur                    ;
                ret                             ;

CursorInv       ld a,(CursorSpeed)              ;
                dec a                           ;
                ld (CursorSpeed),a              ;
                ret nz                          ;

                ld a,FlashRate                  ;
                ld (CursorSpeed),a              ;

                ld a,(CursorType)               ;
                xor $01                         ;
                ld (CursorType),a               ;

FlipCur         ld l,$5F                        ;

                jp pOutChar                     ;

ScanKeys        ld bc,$FFFE                     ;
                ld hl,KeyCounts                 ;
                ld e,0                          ;

ScanKeyLp       dec b                           ;
                in a,(c)                        ;

                ld d,5                          ;

ScanKeyLp2      rra                             ;
                call nc,SKPressed               ;
                call c,SKNotPressed             ;
                inc hl                          ;

                dec d                           ;
                jr nz,ScanKeyLp2                ;

                scf                             ;
                rl b                            ;
                inc b                           ;
                jr nz,ScanKeyLp                 ;

                ld a,e                          ;
                or a                            ;
                ret                             ;

SKPressed       ex af,af'                       ;

                ld a,(hl)                       ;
                and $3F                         ;
                cp MinScans                     ;
                jr z,SKP1                       ;

                inc (hl)                        ;

                ex af,af'                       ;
                ret                             ;

SKP1            bit 6,(hl)                      ;
                jr nz,SKexit                    ;

                bit 7,(hl)                      ;
                jr nz,SKexit1                   ;

                ld a,e                          ;
                or a                            ;
                jr nz,SKexit                    ;

                push hl                         ;
                pop ix                          ;

                call CalcKeyPos                 ;

                ld e,a                          ;

SKexit1         set 6,(hl)                      ;

SKexit          ex af,af'                       ;
                ret                             ;

SKNotPressed    ex af,af'                       ;

                ld a,(hl)                       ;
                and $3F                         ;
                jr z,SKNP1                      ;

                dec (hl)                        ;

                ex af,af'                       ;
                ret                             ;

SKNP1           res 6,(hl)                      ;

                ex af,af'                       ;
                ret                             ;

CalcKeyPos      push de                         ;

                ld de,KeyCounts-1               ;
                or a                            ;
                sbc hl,de                       ;

                ld a,l                          ;

                add hl,de                       ;

                pop de                          ;
                ret                             ;

; Keyboard map

kTab0           defb " zxcv"                    ;
                defb "asdfg"                    ;
                defb "qwert"                    ;
                defb "12345"                    ;
                defb "09876"                    ;
                defb "poiuy"                    ;
                defb cCret,"lkjh"               ;
                defb "  mnb"                    ;

                defb " ZXCV"                    ;
                defb "ASDFG"                    ;
                defb "QWERT"                    ;
                defb "!@#$%"                    ;
                defb cDel,")('&"                ;
                defb "POIUY"                    ;
                defb cCret,"LKJH"               ;
                defb "  MNB"                    ;

                defb " :#?/"                    ;
                defb "~|'{}"                    ;
                defb "   <>"                    ;
                defb "!@#$%"                    ;
                defb "_)('&"                    ;
                defb $22,$3B," ]["		; Changed from $22,"; ][" because zxspin
                defb cCret,"=+-^"               ; can't cope with ; appearing in a string.
                defb "  .,*"                    ; It thinks it's a comment! Wonderful.not
						
                ; Note that the hidden message in the keys was corrupted

                defb "     "                    ;
                defb "t I g"                    ; This should present a message if you hit the 
                defb "a gir"                    ; extended-shift keys in order...
                defb cBlue,cRed,cMagenta,cGreen,cCyan ;
                defb Clr,cCls,cCret,cWhite,cYellow;
                defb "sel l"                    ;
                defb "dam o"                    ;
                defb "     "                    ;

; Front end code starts here

Reset           di                              ;

                ld a,r                          ; Randomly choose a table
                and $06                         ; (if the loader doesn't screw R)

                add a,HighPtrs & $FF            ;
                ld l,a                          ;
                ld h, HighPtrs / 256            ;

                ld a,(hl)                       ; Read the address
                inc hl                          ;
                ld h,(hl)                       ;
                ld l,a                          ;

                ld de,HighScores                ; And move it to the start
                ld bc,$0300                     ;
                ldir                            ;

Boot            ld sp,$0000                     ; Set the stack

                ld hl,iUDKTab                   ; Set the user defined keys
                ld de,UDKTab                    ;
                ld bc,$0080                     ;
                ldir                            ;

                call InitKbd                    ; Setup the keys

                call InitOpti                   ; And the options

DispMain        di                              ; Start the front end

                ld hl,sMainMenu                 ; Show the menu
                call PrintStr                   ;

                ld hl,HSTimeOut                 ; Pause before show highscores

MainLoop        ld bc,$7C10                     ;
                call ScanOptiKeys               ;

                ld de,MainVecTab                ;
                jp c,VecGoto                    ;

                dec hl                          ; Loop
                ld a,h                          ;
                or l                            ;
                jr nz,MainLoop                  ;

                ; Show the highscore table

DispHS          ld hl,0                         ;
                ld (DScore),hl                  ;

DispHS1         xor a                           ;
                ld (EntryF),a                   ;

                ld hl,sHighA                    ;
                call PrintStr                   ;

                ld ix,HighScores                ;
                ld a,"1"                        ;
DHSlp           call PrintHS                    ;

                inc a                           ;
                cp "9"+1                        ;
                jr nz,DHS1                      ;

                add a,"A"-("9"+1)               ;

DHS1            cp "H"                          ;
                jr nz,DHSlp                     ;

                ld a,(EntryF)                   ;
                or a                            ;
                jp nz,AcceptEnt                 ;

                ld hl,sHighB                    ;
                call PrintStr                   ;

HSw             ld bc,$0030                     ;
                call ScanOptiKeys               ;

                jr nc,HSw                       ;

                cp 10                           ;
                jp z,DispMain                   ;

                jp DispGame                     ;

DispCont        ld a,(cInput)                   ;
                cp "J"                          ;
                jp z,DispJoy                    ;

DispKeys        ld a,"K"                        ;
                ld (cInput),a                   ;

                ld hl,sKeysMenu                 ;
                call PrintStr                   ;

                ld hl,UDKTab                    ;
                ld iy,YTableFE+4                ;
                ld b,$07                        ;

UDKa            push bc                         ;

                ld c,(iy)                       ;
                ld b,(iy+1)                     ;
                ld (pCurY),bc                   ;

                ld a,100                        ;
                ld (pCurX),a                    ;

                call UDKlist                    ;

                ld bc,4                         ;
                add iy,bc                       ;

                ld a,l                          ;
                or $0F                          ;
                ld l,a                          ;

                inc hl                          ;

                pop bc                          ;

                djnz UDKa                       ;

UDKw            call UDKwa1                     ;

UDKw1           ld bc,$7FF0                     ;
                call ScanOptiKeys               ;
                jr nc,UDKw1                     ;

                cp 9                            ;
                jp z,DispJoy                    ;

                cp 8                            ;
                jp nc,DispMain                  ;

                push af                         ;

                add a,a                         ;

                add a,a                         ;
                ld l,a                          ;
                ld h,0                          ;

                ld de,YTableFE                  ;
                add hl,de                       ;

                ld a,(hl)                       ;
                inc hl                          ;
                ld h,(hl)                       ;
                ld l,a                          ;

                ld (pCurY),hl                   ;

                pop af                          ;

                dec a                           ;
                ld l,a                          ;
                ld h,$00                        ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;

                ld bc,Attrs+64+2                ;
                add hl,bc                       ;

                add a,a                         ;
                add a,a                         ;
                add a,a                         ;
                add a,a                         ;

                ld e,a                          ;
                ld d,0                          ;

                inc hl                          ;
                ld a,(hl)                       ;
                ld (UDKat0),a                   ;
                dec hl                          ;

                xor $40                         ;

                ld (UDKat1),a                   ;

                ld (pKeyVDU),hl                 ;

                ld hl,UDKTab                    ;
                add hl,de                       ;
                ld (pKeyTab),hl                 ;

                ld a,100                        ;
                ld (pCurX),a                    ;

                ld iy,(pCurY)                   ;

                ld hl,(pKeyTab)                 ;
                call UDKlist                    ;

                ld (pCurY),iy                   ;

                ld a,100                        ;
                ld (pCurX),a                    ;

                ld hl,(pKeyTab)                 ;

                ld b,$10                        ;
UDKc1           ld (hl),$FF                     ;
                inc hl                          ;
                djnz UDKc1                      ;

                call UDKwa1                     ;

                call SetUpKeyMap                ;

                ld ix,(pKeyTab)                 ;

                xor a                           ;
                ld (CurType),a                  ;

                ld hl,1                         ;

UDKlp           call FlashLine                  ;

                call UDKscan                    ;
                jr z,UDKlp                      ;

                cp 16                           ; "1"
                jr z,UDKend                     ;

                dec a                           ;
                ld b,a                          ;
                ld a,ixl                        ;
                cpl                             ;
                and $0F                         ;
                jr z,UDKlp                      ;

                ld a,cMagenta                   ;
                call Print                      ;

                ld a,b                          ;
                ld (ix),a                       ;
                inc ix                          ;

                call UDKchar                    ;

                call PrintSp2                   ;

                jr UDKlp                        ;

UDKwa1          ld e,30                         ;

                ld b,$7F                        ;

UDKwait         ld c,$FE                        ;
                in a,(c)                        ;
                or $E0                          ;
                inc a                           ;
                jr nz,UDKwa1                    ;

                rrc b                           ;
                jr c,UDKwait                    ;

                dec e                           ;
                jr nz,UDKwait                   ;

                ret                             ;

UDKend          ld a,(UDKat0)                   ;
                call FLO                        ;

                push ix                         ;
                pop hl                          ;

                ld de,(pKeyTab)                 ;
                or a                            ;
                sbc hl,de                       ;
                jp nz,UDKw                      ;

                ld l,e                          ;
                ld h,d                          ;

                ld bc,iUDKTab-UDKTab            ;
                add hl,bc                       ;

                ld bc,16                        ;
                ldir                            ;

                ld hl,(pKeyTab)                 ;
                call UDKlist                    ;

                jp UDKw                         ;

UDKscan         ld iy,KeyCounts                 ;
                ld e,1                          ;
                ld c,$FE                        ;

                ld b,$FE                        ;

UDKsc1          ld d,$01                        ;

UDKsc2          in a,(c)                        ;
                and d                           ;
                jr nz,UDKsc3                    ;

                bit 6,(iy)                      ;
                jr z,UDKsc3                     ;

                res 6,(iy)                      ;
                ld a,e                          ;
                ret                             ;

UDKsc3          inc iy                          ;
                inc e                           ;

                rlc d                           ;
                ld a,d                          ;
                cp $20                          ;
                jr nz,UDKsc2                    ;

                rlc b                           ;
                jr c,UDKsc1                     ;

                xor a                           ;
                ret                             ;

UDKlist         ld a,(hl)                       ;
                bit 7,(hl)                      ;
                ret nz                          ;

                ld a,cMagenta                   ;
                call Print                      ;

                ld a,(hl)                       ;
                call UDKchar                    ;

                call PrintSp2                   ;

                ld a,l                          ;
                cpl                             ;
                and $0F                         ;
                ret z                           ;

                inc hl                          ;

                jr UDKlist                      ;

; Show a UDK character name. Some are more than one char long...

UDKchar         push hl                         ;

                ld hl,UDKdesc                   ;
                inc a                           ;
UDKp            dec a                           ;
                jr z,UDKp1                      ;

UDKp2           bit 7,(hl)                      ;
                inc hl                          ;
                jr nz,UDKp2                     ;

                jr UDKp                         ;

UDKp1           ld a,(hl)                       ;
                and $7F                         ;

                call Print                      ;

                bit 7,(hl)                      ;
                inc hl                          ;
                jr nz,UDKp1                     ;

                pop hl                          ;
                ret                             ;


SetUpKeyMap     ld hl,KeyCounts                 ;
                ld b,40                         ;
SUKM            set 6,(hl)                      ;
                inc hl                          ;
                djnz SUKM                       ;
                ret                             ;

DispJoy         ld a,"J"                        ;
                ld (cInput),a                   ;

                ld hl,sJoysticks                ;
                call PrintStr                   ;

                ld a,(cJoy)                     ;
NewJoy          call CalcpJoyAttr               ;
                ld (cJoyAttr),hl                ;

                call GrabLine                   ;

                ld d,0                          ;

                ld hl,1                         ;

DJlp            dec hl                          ;

                ld a,l                          ;
                or h                            ;
                jr nz,DJa                       ;

                ld hl,(cJoyAttr)                ;

                inc d                           ;
                bit 0,d                         ;

                jr z,DJ1                        ;

                call ClearLine                  ;

                ld d,1                          ;

                jr DJa1                         ;

DJ1             call PutLine                    ;

                ld d,0                          ;

DJa1            ld hl,JoyFlashRate              ;

DJa             ld bc,$7CF0                     ;
                call ScanOptiKeys               ;
                jr nc,DJlp                      ;

                cp 9                            ;
                jp z,DispKeys                   ;

                cp 8                            ;
                jp nc,DispMain                  ;

                ld hl,(cJoyAttr)                ;
                call PutLine                    ;

                dec a                           ;

                ld b,a                          ;
                ld a,(cJoy)                     ;
                cp b                            ;
                jr z,NewJoy                     ;

                ld a,b                          ;
                ld (cJoy),a                     ;

                jp NewJoy                       ;


CalcpJoyAttr    ld l,a                          ;
                ld h,0                          ;

                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;

                ld de,Attrs+(3*32)+2            ;
                add hl,de                       ;

                ret                             ;


InitOpti        ld ix,OptiData                  ;
                ld hl,AType                     ;
                ld b,nOptions                   ;
                ld d,0                          ;

InitOptiLp      push ix                         ;

                ld a,(ix+4)                     ;
                add a,5                         ;
                ld e,a                          ;

                add ix,de                       ;

                ld a,(ix)                       ;
                ld (hl),a                       ;

                inc hl                          ;

                pop ix                          ;

                ld e,16                         ;
                add ix,de                       ;

                djnz InitOptiLp                 ;

                ret                             ;


GetString       ld ix,HSBuffer                  ;
                call InitKbd                    ;

                ld a,cMagenta                   ;
                call Print                      ;

AElp            call ReadKey                    ;

                or a                            ;
                jr z,AElp                       ;

                cp cCret                        ;
                ret z                           ;

                cp cDel                         ;
                jr z,AEDel                      ;

                cp Clr                          ;
                jr z,AEclr                      ;

                cp 8                            ;
                jr c,AE1                        ;

                cp $18                          ;
                jr c,AElp                       ;

AE1             ld e,a                          ;
                ld d,wChars/256                 ;
                ld a,(de)                       ;
                ld c,a                          ;

                ld a,(pCurX)                    ;
                add a,c                         ;
                cp 255-39                       ;
                jr nc,AElp                      ;

                push ix                         ;
                pop hl                          ;

                ld bc,HSBuffer                  ;
                or a                            ;
                sbc hl,bc                       ;

                ld bc,130                       ;
                or a                            ;
                sbc hl,bc                       ;
                jr nc,AElp                      ;

                ld a,e                          ;
                ld (ix),a                       ;
                inc ix                          ;
                call Print                      ;
                jr AElp                         ;

AEDel           call AEcDel                     ;
                jp AElp                         ;

AEclr           call AEcDel                     ;
                jr nz,AEclr                     ;

                jp AElp                         ;

; Remove a character/colour code

AEcDel          ld de,HSBuffer                  ;

                push ix                         ;
                pop hl                          ;

                or a                            ;
                sbc hl,de                       ;
                add hl,de                       ;

                ret z                           ;

                dec hl                          ;
                ld a,(hl)                       ;
                cp 8                            ;
                jr c,DelCC                      ;

                push hl                         ;
                ld l,a                          ;
                ld b,a                          ;
                ld h,wChars/256                 ;
                ld e,(hl)                       ;
                ld d,0                          ;
                ld hl,(pCurX)                   ;
                or a                            ;
                sbc hl,de                       ;
                ld (pCurX),hl                   ;
                ld a,b                          ;
                call Print                      ;
                ld (pCurX),hl                   ;
                pop ix                          ;
                or a                            ;
                ret                             ;

DelCC           ld de,HSBuffer                  ;
                ld c,cMagenta                   ;

DCC1            or a                            ;
                sbc hl,de                       ;
                add hl,de                       ;
                jr z,DCC2                       ;

                ld a,(de)                       ;
                cp 8                            ;
                jr nc,DCC3                      ;
                ld c,a                          ;

DCC3            inc de                          ;
                jr DCC1                         ;

DCC2            ld a,c                          ;
                call Print                      ;

                push hl                         ;
                pop ix                          ;

                or a                            ;
                ret                             ;

AcceptEnt       ld hl,sAccept                   ;
                call PrintStr                   ;

                ld hl,(EntryY)                  ;
                ld (pCurY),hl                   ;

                ld a,9                          ;
                ld (pCurX),a                    ;

                call GetString                  ;

                push ix                         ;
                pop hl                          ;
                call MWEntry                    ;
                ld (hl),0                       ;
                inc hl                          ;
                ld a,(DScore)                   ;
                ld (hl),a                       ;
                inc hl                          ;
                ld a,(DScore+1)                 ;
                ld (hl),a                       ;
                inc hl                          ;
                ld de,HSBuffer                  ;
                or a                            ;
                sbc hl,de                       ;
                ld b,h                          ;
                ld c,l                          ;
                push bc                         ;
                ld hl,(pHSEnd)                  ;
                ld de,(pInsert)                 ;
                or a                            ;
                sbc hl,de                       ;
                push hl                         ;
                ld hl,(pHSEnd)                  ;
                add hl,bc                       ;
                ex de,hl                        ;
                ld hl,(pHSEnd)                  ;
                pop bc                          ;
                inc bc                          ;
                lddr                            ;
                ld hl,HSBuffer                  ;
                ld de,(pInsert)                 ;
                pop bc                          ;
                ldir                            ;
                jp DispHS                       ;

MWEntry         ld de,HSBuffer                  ; Is the entry blank?
                or a                            ;
                sbc hl,de                       ;
                jr nz,MWE1                      ;

                ; If so we change it to "Someone" for the first 8 tries
                ; then to "Someone else" after 8 blank entries
                ; then to "Someone else ( who shall remain nameless)" after 16

                ld a,0                          ; Self-modifying code...
nSomeone        equ .-1                         ;
                inc a                           ;
                ld (nSomeone),a                 ;

                cp 16                           ; > 16?
                ld bc,SomeoneEnd-Someone        ;
                jr nc,MWEa                      ;

                cp Someone1 - Someone           ; < 8
                ld bc,8                         ;
                jr c,MWEa                       ;

                ld bc,Someone2-Someone          ; 9..15

MWEa            ld hl,Someone                   ;
                ld de,HSBuffer                  ;
                ldir                            ;
                ex de,hl                        ;
                ret                             ;

Someone         defb "Someone"                          ;
Someone1        defb " else"                            ;
Someone2        defb " ( who shall remain nameless )***";
SomeoneEnd      equ $                                   ;

MWE1            xor a                           ; Clear the someone count
                ld (nSomeone),a                 ;

                ld a,l                          ; Entry > 125 chars?
                add hl,de                       ;
                cp 125                          ;
                jr c,MWE2                       ;

                ; Replace with the long entry text

                ld hl,TooLong                   ;
                ld de,HSBuffer                  ;
                ld bc,lTooLong                  ;
                ldir                            ;
                ex de,hl                        ;
                ret                             ;

TooLong         defb "What strange behaviour !" ;
lTooLong        equ .-TooLong                   ;

MWE2            ld ix,sClues                    ;
                ld iy,Text                      ;
                ld (hl),0                       ;
                push hl                         ;

MWElp           push ix                         ;
                ld hl,HSBuffer                  ;

Mlp1            ld a,(hl)                       ;
                or a                            ;
                jr z,Mlpf                       ;

                cp $21                          ;
                inc hl                          ;
                jr c,Mlp1                       ;

                call ConvLC                     ;
                cp (ix)                         ;
                inc ix                          ;
                jr z,Mlp1                       ;

                dec ix                          ;

Mlpf            ld a,(ix)                       ;
                or a                            ;
                pop ix                          ;
                jr z,MWEcg                      ;

StepIX          ld a,(ix)                       ;
                inc ix                          ;
                or a                            ;
                jr nz,StepIX                    ;

StepIY          ld a,(iy)                       ;
                inc iy                          ;
                or a                            ;
                jr nz,StepIY                    ;

                ld a,(ix)                       ;
                inc a                           ;
                jr nz,MWElp                     ;
                pop hl                          ;
                ret                             ;

ConvLC          cp "Z"+1                        ;
                ret nc                          ;
                cp "A"                          ;
                ret c                           ;
                add a,"a"-"A"                   ;
                ret                             ;

MWEcg           push iy                         ;
                pop de                          ;

                pop af                          ;

                ld hl,HSBuffer                  ;
CGlp            ld a,(de)                       ;
                or a                            ;
                ret z                           ;

                ld (hl),a                       ;
                inc hl                          ;
                inc de                          ;

                jr CGlp                         ;

DispOpti        ld hl,sOptiMenu                 ;
                call PrintStr                   ;

OptiLoop        ld bc,$74A0                     ;
                call ScanOptiKeys               ;
                jr nc,OptiLoop                  ;

                cp 5                            ;
                jp z,HexMon                     ;

                cp 8                            ;
                jp z,DispMain                   ;
                cp 10                           ;
                jp z,DispMain                   ;

                dec a                           ;
                add a,a                         ;
                add a,a                         ;
                add a,a                         ;
                add a,a                         ;
                ld e,a                          ;
                ld d,0                          ;
                ld ix,OptiData                  ;
                add ix,de                       ;

                ld l,(ix+2)                     ;
                ld h,(ix+3)                     ;
                call PrintStr                   ;

                ld a,20                         ;
                ld (ppCurY),a                   ;

                ld hl,sBottom                   ;
                call PrintStr                   ;

OptiLpA         ld a,(ix+4)                     ;
                call CalcpVDU                   ;
                ld (FlashpDisp),hl              ;

                call GrabLine                   ;

                ld d,0                          ;

OptiLpB         ld hl,OptiFlashR                ;

OptiLp1         ld b,(ix+5)                     ;
                ld c,$E0                        ;
                call ScanOptiKeys               ;
                jr c,OptiKP                     ;

                dec hl                          ;
                ld a,l                          ;
                or h                            ;
                jr nz,OptiLp1                   ;

                ld a,d                          ;
                cpl                             ;
                ld d,a                          ;
                or a                            ;

                push de                         ;
                ld hl,(FlashpDisp)              ;
                push af                         ;
                call z,PutLine                  ;
                pop af                          ;
                call nz,ClearLine               ;
                pop de                          ;

                jr OptiLpB                      ;

OptiKP          cp (ix+4)                       ;
                jr z,OptiLp1                    ;

                push af                         ;
                ld hl,(FlashpDisp)              ;
                call PutLine                    ;
                pop af                          ;

                cp 8                            ;
                jp z,DispMain                   ;
                cp 9                            ;
                jp nc,DispOpti                  ;

                ld (ix+4),a                     ;

                push ix                         ;
                pop hl                          ;

                add a,5                         ;

                ld e,a                          ;
                ld d,0                          ;

                add hl,de                       ;

                ld a,(hl)                       ;

                ld l,(ix+11)                    ;
                ld h,(ix+12)                    ;
                ld (hl),a                       ;

                jr OptiLpA                      ;

CalcpVDU        push de                         ;

                dec a                           ;

                ld l,a                          ;
                ld h,0                          ;

                add hl,hl                       ;

                ld de,CpV                       ;
                add hl,de                       ;

                ld a,(hl)                       ;
                inc hl                          ;
                ld h,(hl)                       ;
                ld l,a                          ;

                pop de                          ;
                ret                             ;

CpV             defw $5882,$58C2,$5942,$5982,$5A22

GrabLine        ld de,LineBuffer                ;
                ld bc,30                        ;
                ldir                            ;
                ret                             ;

FlashLine       dec hl                          ;

                ld a,h                          ;
                or l                            ;
                ret nz                          ;

                ld hl,(pKeyVDU)                 ;

                ld a,(CurType)                  ;
                xor $01                         ;
                ld (CurType),a                  ;

                ld a,(UDKat0)                   ;

                jr z,FLO                        ;

                ld a,(UDKat1)                   ;

FLO             ld hl,(pKeyVDU)                 ;

                ld d,h                          ;
                ld e,l                          ;
                inc de                          ;

                ld bc,7                         ;

                ld (hl),a                       ;

                ldir                            ;

                ld hl,UDKfr                     ;
                ret                             ;

PutLine         ex de,hl                        ;
                ld hl,LineBuffer                ;
                ld bc,30                        ;
                ldir                            ;
                ret                             ;

ClearLine       ld e,l                          ;
                ld d,h                          ;
                inc de                          ;
                ld (hl),$41                     ;
                ld bc,29                        ;
                ldir                            ;
                ret                             ;

HexMon          ld a,0                          ; Self modifying code
MonFlag         equ .-1                         ;
                or a                            ;
                jr nz,HexMon1                   ;

                ld hl,sHexMon                   ;
                call PrintStr                   ;

                call Input                      ;

                call ReadHex16                  ;

                ld de,$1278                     ;
                or a                            ;
                sbc hl,de                       ;
                jp nz,DispOpti                  ;

                ld a,1                          ;
                ld (MonFlag),a                  ;

HexMon1         ld hl,sHexMon1                  ;
                call PrintStr                   ;

MonLoop         call Input                      ;
                ld a,(de)                       ;
                inc de                          ;
                or a                            ;
                jr z,MonLoop                    ;

                cp " "                          ;
                jr z,MonLoop                    ;

                cp "m"                          ;
                jr z,MonM                       ;

                cp "t"                          ;
                jr z,MonT                       ;

                cp "q"                          ;
                jp z,DispOpti                   ;

                cp "e"                          ;
                jr nz,MonLoop                   ;

                call ReadHex16                  ;
                jr c,MonErr                     ;

                call FrontCallHL                ;

                jp MonLoop                      ;

MonM            call ReadHex16                  ;
                jp c,MonErr                     ;

MonMlp          call ReadHex8                   ;
                jr z,MonLoop                    ;
                jp c,MonErr                     ;

                ld (hl),a                       ;
                inc hl                          ;

                jr MonMlp                       ;

MonT            call ReadHex16                  ;
                jr z,MonTa                      ;
                jp c,MonErr                     ;

                ld (TabPtr),hl                  ;

MonTa           call ClearWind                  ;

                ld ix,$0000                     ; Self modifying code
TabPtr          equ .-2                         ;

                ld b,8                          ;

MonTlp          push bc                         ;
                call TabLine                    ;
                pop bc                          ;

                djnz MonTlp                     ;

                ld (TabPtr),ix                  ;

                jp MonLoop                      ;

TabLine         push ix                         ;
                pop hl                          ;

                call PrintHex16                 ;

                ld b,8                          ;

TLlp            ld a," "                        ;
                call Print                      ;

                ld a,(ix)                       ;
                inc ix                          ;

                call PrintHex8                  ;

                djnz TLlp                       ;

                ld a,cCret                      ;
                jp Print                        ;

ClearWind       ld hl,$4800                     ;

CW8             push hl                         ;
                call ClearGraph                 ;
                pop hl                          ;

                ld a,l                          ;
                add a,$20                       ;
                ld l,a                          ;
                jr nz,CW8                       ;

                ld a,7                          ;
                ld (ppCurY),a                   ;

                ld a,cCyan                      ;
                call Print                      ;

                ld a,cCret                      ;
                jp Print                        ;

MonErr          ld hl,$40C0                     ;
                ld (pCurY),hl                   ;

                xor a                           ;
                ld (pCurX),a                    ;

                ld hl,sMonError                 ;
                call PrintStr                   ;

                ld bc,0                         ;
Err_1           cpi                             ;
                jp pe,Err_1                     ;

                ld hl,$40C0                     ;
                call ClearGraph                 ;

                jp MonLoop                      ;

ClearGraph      call CGa                        ;

                inc h                           ;
                ld a,h                          ;
                and $07                         ;
                ret z                           ;

                jr ClearGraph                   ;

CGa             push hl                         ;

                ld d,h                          ;
                ld e,l                          ;
                inc de                          ;
                ld bc,$001F                     ;

                ld (hl),$00                     ;

                ldir                            ;

                pop hl                          ;
                ret                             ;

Input           ld hl,$4080                     ;
                ld (pCurY),hl                   ;

                call ClearGraph                 ;

                xor a                           ;
                ld (pCurX),a                    ;

                call GetString                  ;
                ld (ix),$00                     ;
                ld de,HSBuffer                  ;
                ret                             ;

Hex             sub "0"                         ;
                ret c                           ;
                cp 10                           ;
                ccf                             ;
                ret nc                          ;
                sub 7+" "                       ;
                cp 10                           ;
                ret c                           ;
                cp 17                           ;
                ccf                             ;
                ret                             ;

ReadHex8        push hl                         ;
                call ReadHex16                  ;
                push af                         ;
                ld a,h                          ;
                or a                            ;
                jr z,RH8                        ;
                pop af                          ;
                scf                             ;
                ld a,l                          ;
                pop hl                          ;
                ret                             ;

RH8             pop af                          ;
                ld a,l                          ;
                pop hl                          ;
                ret                             ;

ReadHex16       ld a,(de)                       ;
                inc de                          ;

                cp " "                          ;
                jr z,ReadHex16                  ;

                dec de                          ;

ReadHex         ld a,(de)                       ;
                or a                            ;
                scf                             ;
                ret z                           ;

                call Hex                        ;
                ret c                           ;

                ld h,0                          ;
                ld l,a                          ;

Read3           inc de                          ;
                ld a,(de)                       ;

                call Hex                        ;
                ccf                             ;
                ret nc                          ;

                add hl,hl                       ;
                ret c                           ;
                add hl,hl                       ;
                ret c                           ;
                add hl,hl                       ;
                ret c                           ;
                add hl,hl                       ;
                ret c                           ;
                or l                            ;
                ld l,a                          ;

                jr Read3                        ;

Mon             call ReadKey                    ;
                call Print                      ;

DispDemo        ld a,1                          ;
                jp DispGame1                    ;

DispInst        ld hl,sInst                     ;
                call PrintStr                   ;

DIlp            ld bc,$7FF0                     ;
                call ScanOptiKeys               ;
                jr nc,DIlp                      ;

                jp DispMain                     ;

PrintHS         push af                         ;
                ld (HSChar),a                   ;

                ld hl,sHighC                    ;
                call PrintStr                   ;

                push ix                         ;
                pop hl                          ;

                ld a,(EntryF)                   ;
                or a                            ;
                jr nz,PHSb                      ;

PHSa            ld a,(hl)                       ;
                or a                            ;
                inc hl                          ;
                jr nz,PHSa                      ;

                ld a,(hl)                       ;
                inc hl                          ;
                ld h,(hl)                       ;
                ld l,a                          ;

                ld de,(DScore)                  ;
                or a                            ;
                sbc hl,de                       ;
                jr nc,PHSb                      ;

                ld a,1                          ;
                ld (EntryF),a                   ;

                ld hl,(pCurY)                   ;
                ld (EntryY),hl                  ;

                ld (pInsert),ix                 ;

                ex de,hl                        ;
                jr PHSx                         ;

PHSb            ld a,(ix)                       ;
                or a                            ;
                inc ix                          ;
                jr z,PHS2a                      ;

                call Print                      ;
                jr PHSb                         ;

PHS2a           ld l,(ix)                       ;
                inc ix                          ;
                ld h,(ix)                       ;
                inc ix                          ;
                ld (pHSEnd),ix                  ;

PHSx            ld a,255 - (5*6)                ;
                ld (pCurX),a                    ;

                ld a,cYellow                    ;
                call Print                      ;

                call PrintScore                 ;

                ld a,"0"                        ;
                call Print                      ;

                ld a,cCret                      ;
                call Print                      ;

                pop af                          ;
                ret                             ;

PHS2            inc ix                          ;

PHS3            call PrintSp                    ;
                djnz PHS3                       ;

                jr PHS2a                        ;

PrintSp         push af                         ;
                ld a," "                        ;
                call Print                      ;
                pop af                          ;
                ret                             ;

PrintSp2        push af                         ;
                ld a,$80                        ;
                call Print                      ;
                pop af                          ;
                ret                             ;

PrintScore1     ld c,$80                        ;
                ld b,4                          ;
                jr PS0                          ;

PrintScore      ld c,0                          ;
                ld b,4                          ;
PS0             call PS1                        ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;
                djnz PS0                        ;
                ret                             ;

PS1             ld a,h                          ;
                rrca                            ;
                rrca                            ;
                rrca                            ;
                rrca                            ;
                and $0F                         ;
                jr z,PS1a                       ;
                inc c                           ;
                or "0"                          ;
                jp Print                        ;

PS1a            ld a,c                          ;
                cp $80                          ;
                ret z                           ;
                and $7F                         ;
                jr z,PS2                        ;
                ld a,"0"                        ;
                jp Print                        ;

PS2             ld a,(pCurX)                    ;
                add a,6                         ;
                ld (pCurX),a                    ;
                ret                             ;

OptiData        defw 0,sSkillLevels             ;
                defb 2                          ;
                defb $7C                        ;
                defb -1,-2,-3,-4,-5             ;
                defw AType                      ;
                defs 3                          ;

                defw 0,sNoises                  ;
                defb 3                          ;
                defb $78                        ;
                defb $00,$09,$0F,$FF,$FF        ;
                defw BType                      ;
                defs 3                          ;

                defw 0,sDisplay                 ;
                defb 1                          ;
                defb $70                        ;
                defb 0,2,3,0,0                  ;
                defw CType                      ;
                defs 3                          ;

VecGoto         dec a                           ;
                add a,a                         ;
                ld l,a                          ;
                ld h,0                          ;
                add hl,de                       ;
                ld a,(hl)                       ;
                inc hl                          ;
                ld h,(hl)                       ;
                ld l,a                          ;
FrontCallHL     jp (hl)                         ;

MainVecTab      defw DispGame                   ; 1
                defw DispInst                   ; 2
                defw DispCont                   ; 3
                defw DispOpti                   ; 4
                defw DispDemo                   ; 5
                defw DispMain                   ; 6
                defw DispMain                   ; 7
                defw DispMain                   ; 8
                defw DispMain                   ; 9
                defw DispMain                   ; 10
                defw DispHS                     ; 11

ScanOptiKeys    push ix                         ;
                push de                         ;
                push bc                         ;

                call SOK                        ;

                pop bc                          ;
                pop de                          ;
                pop ix                          ;
                ret                             ;

SOK             ld ix,OptKeyTab                 ;
                ld e,12                         ;

SOKlp           rl c                            ;
                rl b                            ;
                jr c,SOK0                       ;

                push bc                         ;
                ld bc,4                         ;
                add ix,bc                       ;
                pop bc                          ;

SOKx            dec e                           ;
                jr nz,SOKlp                     ;

                or a                            ;
                ret                             ;

SOK0            call SOK1                       ;
                ret c                           ;

                jr SOKx                         ;

SOK1            push bc                         ;

                ld b,(ix)                       ;
                ld c,$FE                        ;
                in a,(c)                        ;

                or (ix+1)                       ;
                inc a                           ;

                jr z,SOKnp                      ;

                ld a,(ix+2)                     ;
                and $0F                         ;
                cp 4                            ;
                jr z,SOK2                       ;

                inc (ix+2)                      ;

SOKxf           ld bc,4                         ;
                add ix,bc                       ;
                or a                            ;

                pop bc                          ;
                ret                             ;

SOK2            bit 7,(ix+2)                    ;
                jr nz,SOKxf                     ;

                set 7,(ix+2)                    ;

                ld a,(ix+3)                     ;

                ld bc,4                         ;
                add ix,bc                       ;

                scf                             ;
                pop bc                          ;
                ret                             ;

SOKnp           ld a,(ix+2)                     ;
                and $0F                         ;
                jr z,SOKxf                      ;

                dec (ix+2)                      ;

                dec a                           ;
                and $0F                         ;
                jr nz,SOKxf                     ;

                res 7,(ix+2)                    ;

                jr SOKxf                        ;

IntRoutine      push af                         ;
                push hl                         ;

                ld a,(CType)                    ;
                cp 3                            ;
                jr z,IntIgnore                  ;

                push bc                         ;
                push de                         ;
                push ix                         ;
                push iy                         ;

                ld a,(SecCount)                 ;
                and $01                         ;
                jr z,Int0                       ;

                call ScrollScore                ;

                ld a,(ADamage)                  ;
                ld b,a                          ;
                ld a,(DDamage)                  ;
                cp b                            ;

                call nz,StepEnergy              ;

Int0            call ScMess                     ;

                ld a,(SecCount)                 ;
                dec a                           ;
                ld (SecCount),a                 ;

                cp 25                           ;
                jr z,Int2                       ;

                or a                            ;
                call z,SetUpSec                 ;

                ld a,(Slice)                    ;
                or a                            ;
                jr z,Int1                       ;

                dec a                           ;
                ld (Slice),a                    ;

                call ScrollIt                   ;

Int1            pop iy                          ;
                pop ix                          ;
                pop de                          ;
Crash           pop bc                          ;
                pop hl                          ;
                pop af                          ;
                ei                              ;
                ret                             ;

Int2            ld a,$00                        ; Colons OFF
                ld ($0000),a                    ; SMC
CM1             equ .-2                         ;
                ld ($0000),a                    ; SMC
CM2             equ .-2                         ;
                jp Int1                         ;

IntIgnore       ld a,(DDamage)                  ;
                ld (ADamage),a                  ;

                ld hl,(DScore)                  ;
                ld (AScore),hl                  ;

                pop hl                          ;
                pop af                          ;
                ei                              ;
                ret                             ;

RotDig          xor a                           ;
                add hl,hl                       ;
                rla                             ;
                add hl,hl                       ;
                rla                             ;
                add hl,hl                       ;
                rla                             ;
                add hl,hl                       ;
                rla                             ;
                ret                             ;

ScNext          ld hl,(ScPtr)                   ;
                ld a,(hl)                       ;
                inc hl                          ;
                ld (ScPtr),hl                   ;
                inc a                           ;
                ld (Sc_F),a                     ;
                jp z,ScNew                      ;

                dec a                           ;
                jr z,ScN2                       ;

                cp $20                          ;
                jr nc,ScN1                      ;

                ld (ScAttr),a                   ;

                ld a,3                          ;
                ld (ScCnt),a                    ;

                ld hl,Buff0                     ;
                ld de,Buff1                     ;
                ld bc,7                         ;
                ld (hl),$00                     ;
                ldir                            ;

                jr ScIt                         ;

ScN1            ld l,a                          ;
                ld h,wChars/256                 ;
                ld a,(hl)                       ;
                inc a                           ;
                sra a                           ;
                ld (ScCnt),a                    ;
                ld h,0                          ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;
                ld a,0+(pChars/256)-1           ; <<sigh!>>
                add a,h                         ;
                ld h,a                          ;
                ld de,Buff0                     ;
                ld bc,8                         ;
                ldir                            ;
                jr ScIt                         ;

ScN2            ld a,$7F                        ;
                ld (ScCnt),a                    ;
                jr ScIt                         ;

ScMess          ld a,(Sc_F)                     ;
                or a                            ;
                jp z,ScNew                      ;

                ld a,(ScCnt)                    ;
                or a                            ;
                jr z,ScNext                     ;

                dec a                           ;
                ld (ScCnt),a                    ;

ScIt            ld a,(ScACnt)                   ;
                dec a                           ;
                ld (ScACnt),a                   ;

                and $3                          ;
                call z,ScAtt                    ;

                ld hl,Buff0                     ;
                sla (hl)                        ;
                ex af,af'                       ;
                sla (hl)                        ;
                ex af,af'                       ;
                ld hl,$50FF                     ;
                call Sc1m                       ;

                ld hl,Buff1                     ;
                sla (hl)                        ;
                ex af,af'                       ;
                sla (hl)                        ;
                ex af,af'                       ;
                ld hl,$51FF                     ;
                call Sc1m                       ;

                ld hl,Buff2                     ;
                sla (hl)                        ;
                ex af,af'                       ;
                sla (hl)                        ;
                ex af,af'                       ;
                ld hl,$52FF                     ;
                call Sc1m                       ;

                ld hl,Buff3                     ;
                sla (hl)                        ;
                ex af,af'                       ;
                sla (hl)                        ;
                ex af,af'                       ;
                ld hl,$53FF                     ;
                call Sc1m                       ;

                ld hl,Buff4                     ;
                sla (hl)                        ;
                ex af,af'                       ;
                sla (hl)                        ;
                ex af,af'                       ;
                ld hl,$54FF                     ;
                call Sc1m                       ;

                ld hl,Buff5                     ;
                sla (hl)                        ;
                ex af,af'                       ;
                sla (hl)                        ;
                ex af,af'                       ;
                ld hl,$55FF                     ;
                call Sc1m                       ;

                ld hl,Buff6                     ;
                sla (hl)                        ;
                ex af,af'                       ;
                sla (hl)                        ;
                ex af,af'                       ;
                ld hl,$56FF                     ;
                call Sc1m                       ;

                ld hl,Buff7                     ;
                sla (hl)                        ;
                ex af,af'                       ;
                sla (hl)                        ;
                ex af,af'                       ;
                ld hl,$57FF                     ;

Sc1m            ld b,8                          ;

Sc2m            rl (hl)                         ;

                ex af,af'                       ;
                rl (hl)                         ;
                ex af,af'                       ;
                dec l                           ;
                rl (hl)                         ;
                ex af,af'                       ;
                rl (hl)                         ;
                ex af,af'                       ;
                dec l                           ;
                rl (hl)                         ;
                ex af,af'                       ;
                rl (hl)                         ;
                ex af,af'                       ;
                dec l                           ;
                rl (hl)                         ;
                ex af,af'                       ;
                rl (hl)                         ;
                ex af,af'                       ;
                dec l                           ;

                djnz Sc2m                       ;

                ret                             ;

ScAtt           ld hl,$5AE1                     ;
                ld de,$5AE0                     ;
                ld bc,$1F                       ;
                ldir                            ;

                ld a,(ScAttr)                   ;
                ld (de),a                       ;

                ret                             ;

ScNew           ld ix,$0000                     ;
pScrBuf2        equ .-2                         ;

                ld a,(ix+2)                     ;
                or a                            ;
                ret z                           ;

                ld a,1                          ;
                ld (Sc_F),a                     ;

                ld l,(ix)                       ;
                ld h,(ix+1)                     ;
                ld (ix+2),$00                   ;

                ld (ScPtr),hl                   ;

ScNew1          push ix                         ;
                pop hl                          ;

                inc hl                          ;
                inc hl                          ;
                inc hl                          ;

                ld de,SetUpSec                  ;
                ld (pScrBuf2),hl                ;
                or a                            ;
                sbc hl,de                       ;
                ret nz                          ;

                ld hl,ScrollBuff                ;
                ld (pScrBuf2),hl                ;

                ret                             ;

AddScroll       ld a,(CType)                    ;
                cp 3                            ;
                ret z                           ;

                push ix                         ;
                di                              ;
                ld ix,$0000                     ;
pScrBuf1        equ .-2                         ;

                ld a,(ix+2)                     ;
                or a                            ;
                jr nz,AScx                      ;

                ld (ix),l                       ;
                ld (ix+1),h                     ;
                ld (ix+2),1                     ;

                push ix                         ;
                pop hl                          ;

                inc hl                          ;
                inc hl                          ;
                inc hl                          ;

                ld (pScrBuf1),hl                ;

                ld de,SetUpSec                  ;
                or a                            ;
                sbc hl,de                       ;
                jr nz,AScx                      ;

                ld hl,ScrollBuff                ;
                ld (pScrBuf1),hl                ;

AScx            pop ix                          ;
                ei                              ;
                ret                             ;

InitScroll      xor a                           ;
                ld (Sc_F),a                     ;
                ld (ScCnt),a                    ;
                ld (ScACnt),a                   ;

                ld hl,ScrollBuff                ;
                ld (pScrBuf1),hl                ;
                ld (pScrBuf2),hl                ;

                ld hl,ScrollBuff                ;
                ld de,ScrollBuff+1              ;
                ld bc,29                        ;
                ld (hl),0                       ;
                ldir                            ;

                ret                             ;

ScrollBuff      defs 30                         ;

SetUpSec        ld a,8                          ;
                ld (Slice),a                    ;

                ld a,50                         ;
                ld (SecCount),a                 ;

                ld a,$47                        ;
CM0             equ .-1                         ;

                ld ($0000),a                    ;
CM1a            equ .-2                         ;

                ld ($0000),a                    ;
CM2a            equ .-2                         ;

                call AddOne                     ;

                ld a,b                          ;
                ld (nScroll),a                  ;

                ret                             ;

AddOne          ld de,FirstDig                  ;
                ld hl,p1                        ;
                ld b,1                          ;
                call DoTen                      ;
                ret c                           ;

                call DoSix                      ;
                ret c                           ;

                call DoTen                      ;
                ret c                           ;

                call DoSix                      ;
                ret c                           ;

                call DoTen                      ;
                ret c                           ;

                call DoTen                      ;
                dec b                           ;

                ret                             ;

DoTen           ld a,(de)                       ;
                inc a                           ;
                ld (de),a                       ;
                cp 10                           ;
                ret c                           ;

                ld (hl),Zero & $FF              ;
                inc hl                          ;
                ld (hl),Zero / 256              ;
                inc hl                          ;

                xor a                           ;
                ld (de),a                       ;

                inc b                           ;
                inc de                          ;

                ret                             ;

DoSix           ld a,(de)                       ;
                inc a                           ;
                ld (de),a                       ;
                cp 6                            ;
                ret c                           ;

                ld (hl),Zero & $FF              ;
                inc hl                          ;
                ld (hl),Zero / 256              ;
                inc hl                          ;

                xor a                           ;
                ld (de),a                       ;

                inc b                           ;
                inc de                          ;

                ret                             ;

ScrollIt        ld ix,p1                        ;
                ld a,(nScroll)                  ;
                ld b,a                          ;

SIlp            ld e,(ix)                       ;
                ld d,(ix+1)                     ;

                ld l,(ix+12)                    ;
                ld h,(ix+13)                    ;

                ld c,8                          ;

SIlp1           ld a,(de)                       ;
                inc de                          ;
                ld (hl),a                       ;
                inc h                           ;
                dec c                           ;

                jr nz,SIlp1                     ;

                inc (ix)                        ;
                inc ix                          ;
                inc ix                          ;

                djnz SIlp                       ;

                ret                             ;

UDKWS           defs 7*64,0                     ;

DispGame        xor a                           ;

DispGame1       ld (Mode),a                     ;

                ld a,cCls                       ;
                call Print                      ;

                ld a,(cInput)                   ;
                cp "J"                          ;
                jp z,GameJoy                    ;

                call DoKeys                     ;

GameExit        call InitInt                    ;

                call InitInst                   ;

                ld a,(CType)                    ;
                cp 3                            ;
                jp z,Play1                      ;

                call InitClock                  ;

                call InitScore                  ;

                call InitEnergy                 ;

Play1           call IntVec                     ;

                ld a,(Mode)                     ;
                ld hl,FUM                       ;
                or a                            ;
                jr z,Mess1                      ;

                ld hl,FUD                       ;

Mess1           call AddScroll                  ;

                ld a,(BType)                    ;
                bit 3,a                         ;
                call SetSoundFlag               ;
                ld (Trumpet),a                  ;
                ld (Trumpet1),a                 ;

                call Play                       ;

                di                              ;

                ld a,(Mode)                     ;
                or a                            ;
                jp nz,DispMain                  ;

                ld a,(EndState)                 ;
                dec a                           ;
                jr z,EndEsc                     ;

EndDead         ld hl,sEndDead                  ;
                call PrintStr                   ;

                ld hl,(DScore)                  ;
                call PrintScore1                ;

                ld hl,sEndDead1                 ;
                call PrintStr                   ;

                jp EElp                         ;

EndEsc          ld hl,sEndEsc                   ;
                call PrintStr                   ;

                call GetString                  ;

                ld ix,HSBuffer                  ;

                call FindCRC                    ; The correct str -> hl=$DF51

                ld de,$DF51                     ;
                or a                            ;
                sbc hl,de                       ;
                jr z,CodeFound1                 ;

                ld hl,sWrongCode                ;
                call PrintStr                   ;

EElp            ld bc,$FFD0                     ;
                call ScanOptiKeys               ;
                jr nc,EElp                      ;

                jp DispHS1                      ;

CodeFound1      ld hl,(DScore)                  ;

                ld a,$05                        ;
                add a,h                         ;
                daa                             ;
                ld h,a                          ;

                jr nc,CF2                       ;

                ld hl,$9999                     ;

CF2             ld (DScore),hl                  ;

                ld ix,HSBuffer+2                ;

                call FindCRC                    ; The correct str -> hl=$041D

                ex de,hl                        ;

                ld hl,Message                   ;

CodeFlp         ld a,(hl)                       ;
                xor d                           ;
                add a,e                         ;
                jr z,EElp                       ;

                call Print                      ;
                inc hl                          ;

                ld bc,MessWait                  ;

MessW           cpi                             ;
                dec hl                          ;
                jp pe,MessW                     ;

                jr CodeFlp                      ;

FindCRC         ld hl,0                         ;
                ld de,4                         ;
                ld a,8                          ;

DecLp           ld c,(ix)                       ;
                ld b,(ix+1)                     ;
                add hl,bc                       ;

                add ix,de                       ;

                dec a                           ;
                jr nz,DecLp                     ;

                ret                             ;

SetSoundFlag    ld a,$00                        ;
                ret z                           ;

                ld a,$F8                        ;
                ret                             ;

; Report problems to the user... Bad idea...

FuckUp          di                              ;

                pop hl                          ;
                ld sp,0                         ;
                push hl                         ;

                ld hl,sFuckUp                   ;
                call PrintStr                   ;

                pop hl                          ;
                dec hl                          ;
                dec hl                          ;
                dec hl                          ;
                call PrintHex16                 ;

FUlp            ld bc,$0020                     ;
                call ScanOptiKeys               ;
                jr nc,FUlp                      ;

                jp Boot                         ;

PrintHex16      ld a,h                          ;
                call PrintHex8                  ;

                ld a,l                          ;

PrintHex8       call PH2                        ;

PH2             rrca                            ;
                rrca                            ;
                rrca                            ;
                rrca                            ;

                push af                         ;

                and $0F                         ;

                add a,"0"                       ;
                cp "9"+1                        ;
                jr c,PH3                        ;

                add a,"A"-("9"+1)               ;

PH3             call Print                      ;

                pop af                          ;
                ret                             ;


InitEnergy      xor a                           ;
                ld (ADamage),a                  ;
                ld (cMag),a                     ;

                ld a,MaxEnergy                  ;
                ld (DDamage),a                  ;

                ld de,$50A6                     ;

                ld a,(CType)                    ;
                or a                            ;
                jr z,IEa                        ;

                ld de,$50A9                     ;

IEa             ld (pcDial),de                  ;

                ld hl,Dial0                     ;
                ld (pcShape),hl                 ;

                ld b,nDials                     ;

IElp            push de                         ;
                push bc                         ;

                ld hl,Dial0                     ;
                call Place                      ;

                pop bc                          ;
                pop de                          ;

                inc de                          ;
                inc de                          ;

                djnz IElp                       ;

                ret                             ;


StepEnergy      jr nc,SEinc                     ;

                ld a,$F8                        ;
Trumpet         equ .-1                         ;
                out ($FE),a                     ;

                ld a,$00                        ;
cMag            equ .-1                         ;

                or a                            ;

                ld de,(pcDial)                  ;
                ld hl,(pcShape)                 ;

                jr nz,SEdec1                    ;

                dec de                          ;
                dec de                          ;

                ld (pcDial),de                  ;

                ld hl,Dial8+32                  ;
                ld a,9                          ;

SEdec1          dec a                           ;
                ld (cMag),a                     ;

                ld a,(ADamage)                  ;
                dec a                           ;

                ld bc,-32                       ;

                jp SEexit                       ;

SEinc           ld a,$F8                        ;
Trumpet1        equ .-1                         ;
                out ($FE),a                     ;

                ld a,(cMag)                     ;
                cp 8                            ;

                ld de,(pcDial)                  ;
                ld hl,(pcShape)                 ;

                jr nz,SEinc1                    ;

                inc de                          ;
                inc de                          ;

                ld (pcDial),de                  ;

        if not def No_Check

                ; This next bit is intentionally devious. It's the piracy check
                ;
                ; We will have set the top-bit of the R register if we think
                ; the game is NOT pirated.
                ;
                ; This code reads the R register and checks for this.

                ld hl,Protect                   ; Unscramble the LD A,R inst.
                rlc (hl)                        ;

                defb $ED                        ; Scrambled LD A,R
Protect         defb $AF                        ;

                add a,a                         ; Carry set if bit 7 or R set

                jp nc Crash                     ; Cause a crash if it isn't

                rrc (hl)                        ; Scramble it again

        endif
		
                ld hl,Dial0-32                  ;
                ld a,-1                         ;

SEinc1          inc a                           ;
                ld (cMag),a                     ;

                ld bc,32                        ;

                ld a,(ADamage)                  ;
                inc a                           ;
SEexit          ld (ADamage),a                  ;

                add hl,bc                       ;
                ld (pcShape),hl                 ;

                xor a                           ;
                out ($FE),a                     ;

Place           push de                         ;
                call PInner                     ;
                pop de                          ;

                ld a,e                          ;
                add a,$20                       ;
                ld e,a                          ;

PInner          ld b,8                          ;

Inner1          ld a,(hl)                       ;
                ld (de),a                       ;

                inc hl                          ;
                inc e                           ;

                ld a,(hl)                       ;
                ld (de),a                       ;

                inc hl                          ;
                dec e                           ;

                inc d                           ;

                djnz Inner1                     ;

                ret                             ;


InitScore       ld hl,ScoreData                 ;
                ld de,ScorePtrs                 ;
                ld bc,ScorePtrs-ScoreData       ;
                ldir                            ;

                ld hl,0                         ;
                ld (DScore),hl                  ;

                ld a,(CType)                    ; Point at the score screen pos
                ld hl,$50BB                     ;
                or a                            ;
                jr z,IS1                        ;

                ld hl,$50DB                     ;

IS1             ld (pScore),hl                  ;
                ret                             ;


ScrollScore     ld a,(ScScrCnt)                 ;
                dec a                           ;
                jr nz,SSupdate                  ;

                ld hl,(AScore)                  ;
                ld de,(DScore)                  ;
                or a                            ;
                sbc hl,de                       ;
                ret z                           ;

                ex de,hl                        ;
                ld (AScore),hl                  ;

                ld a,0                          ;
                jr c,SSpos                      ;

                ld a,7                          ;

SSpos           ld (ScScrDir),a                 ;

                ld ix,ScorePtrs                 ;
                ld iy,1                         ;

                ld b,4                          ;
                ld c,ScTab1 & $FF               ;
                ld d,Zero/256                   ;

SScalc          xor a                           ;

                add hl,hl                       ;
                adc a,a                         ;
                add hl,hl                       ;
                adc a,a                         ;
                add hl,hl                       ;
                adc a,a                         ;
                add hl,hl                       ;
                adc a,a                         ;

                push af                         ;

                cp (ix+1)                       ;
                ld (ix+1),a                     ;
                jr z,SSb                        ;

                ld a,iyh                        ;
                or a                            ;
                jr nz,SSb                       ;

                ld iyh,iyl                      ;

SSb             pop af                          ;

                jr z,SSa                        ;

                ld c,ScTab2 & $FF               ;

SSa             add a,a                         ;
                add a,c                         ;

                ld e,a                          ;

                ld a,(de)                       ;

                ld e,a                          ;

                ld a,(ScScrDir)                 ;
                add a,e                         ;

                ld (ix),a                       ;

                inc iyl                         ;

                inc ix                          ;
                inc ix                          ;

                djnz SScalc                     ;

                ld a,(ScScrDir)                 ;
                add a,Sc0 and $FF               ;
                ld (ix),a                       ;

                ld a,iyh                        ;
                ld (ScScrNo),a                  ;

                ld a,8                          ;

SSupdate        ld (ScScrCnt),a                 ;

                ld de,ScreenBase                ;
pScore          equ .-2                         ;

                ld a,(ScScrNo)                  ;
                ld iyl,a                        ;

                ld a,(ScScrDir)                 ;
                add a,d                         ;
                cp d                            ;
                ld d,a                          ;

                jr nz,SSscdown                  ;

SSscup          ld hl,ScorePtrs                 ;
                ld b,5                          ;

SSscuplp        dec iyl                         ;
                jr nz,SSscupX                   ;
                inc iyl                         ;

                push bc                         ;

                push de                         ;
                push hl                         ;

                ld b,7                          ;

                ld h,d                          ;
                ld l,e                          ;
                inc h                           ;

SSscuplp1       ld a,(hl)                       ;
                ld (de),a                       ;

                inc h                           ;
                inc d                           ;

                djnz SSscuplp1                  ;

                pop hl                          ;

                ld c,(hl)                       ;
                ld b,Sc0/256                    ;

                ld a,(bc)                       ;
                ld (de),a                       ;

                inc (hl)                        ;

                pop de                          ;

                pop bc                          ;

SSscupX         inc e                           ;

                inc hl                          ;
                inc hl                          ;

                djnz SSscuplp                   ;

                ret                             ;

SSscdown        ld hl,ScorePtrs                 ;
                ld b,5                          ;

SSscdolp        dec iyl                         ;
                jr nz,SSscdoX                   ;
                inc iyl                         ;

                push bc                         ;

                push de                         ;
                push hl                         ;

                ld b,7                          ;

                ld h,d                          ;
                ld l,e                          ;
                dec h                           ;

SSscdolp1       ld a,(hl)                       ;
                ld (de),a                       ;

                dec h                           ;
                dec d                           ;

                djnz SSscdolp1                  ;

                pop hl                          ;

                ld c,(hl)                       ;
                ld b,Sc0/256                    ;

                ld a,(bc)                       ;
                ld (de),a                       ;

                dec (hl)                        ;

                pop de                          ;

                pop bc                          ;

SSscdoX         inc e                           ;

                inc hl                          ;
                inc hl                          ;

                djnz SSscdolp                   ;

                ret                             ;

; Score variables (for the scrolling display)

ScoreData       defw ScS,ScS,ScS,ScS,Sc0        ; Initial data. Copied down
                defw 0                          ;
                defb 9,0,1                      ;

        ; The initial data above is copied to these vars to init them

ScorePtrs       defs 5*2                        ;
AScore          defs 2                          ;
ScScrCnt        defs 1                          ;
ScScrDir        defs 1                          ;
ScScrNo         defs 1                          ;


GameJoy         call DoKeys                     ;

                ld a,(cJoy)                     ;
                ld l,a                          ;
                ld h,0                          ;

                add hl,hl                       ;

                ld d,h                          ;
                ld e,l                          ;

                add hl,hl                       ;
                add hl,hl                       ;
                add hl,de                       ;

                ld de,JoyVects                  ;
                add hl,de                       ;

                ld de,kLeft                     ;
                ld b,4                          ;

Joy1            call DoJoy                      ;

                djnz Joy1                       ;

                inc de                          ;
                inc de                          ;
                inc de                          ;
                inc de                          ;
                inc de                          ;
                inc de                          ;

                call DoJoy                      ;

                jp GameExit                     ;

DoJoy           inc de                          ;
                ld a,(hl)                       ;
                ld (de),a                       ;
                inc hl                          ;
                inc de                          ;
                ld a,(hl)                       ;
                ld (de),a                       ;
                inc hl                          ;
                inc de                          ;
                ret                             ;

; Addresses of Joystick scanning routines

JoyVects        defw KemL,KemR,KemU,KemD,KemF   ; Left,Right,Up,Down,Fire
                defw FulL,FulR,FulU,FulD,FulF   ;
                defw ProL,ProR,ProU,ProD,ProF   ;
                defw SinL,SinR,SinU,SinD,SinF   ;
                defw SinL,SinR,SinU,SinD,SinF   ;

; Scanning routines for the different types of joystick

KemL            in a,($1F)                      ;
                bit 1,a                         ;
                ret                             ;

KemR            in a,($1F)                      ;
                bit 0,a                         ;
                ret                             ;

KemU            in a,($1F)                      ;
                bit 3,a                         ;
                ret                             ;

KemD            in a,($1F)                      ;
                bit 2,a                         ;
                ret                             ;

KemF            in a,($1F)                      ;
                bit 4,a                         ;
                ret                             ;

FulL            in a,($7F)                      ;
                cpl                             ;
                bit 2,a                         ;
                ret                             ;

FulR            in a,($7F)                      ;
                cpl                             ;
                bit 3,a                         ;
                ret                             ;

FulU            in a,($7F)                      ;
                cpl                             ;
                bit 0,a                         ;
                ret                             ;

FulD            in a,($7F)                      ;
                cpl                             ;
                bit 1,a                         ;
                ret                             ;

FulF            in a,($7F)                      ;
                cpl                             ;
                bit 7,a                         ;
                ret                             ;

ProL            ld a,$F7                        ;
                in a,($FE)                      ;
                cpl                             ;
                bit 4,a                         ;
                ret                             ;

ProR            ld a,$EF                        ;
                in a,($FE)                      ;
                cpl                             ;
                bit 2,a                         ;
                ret                             ;

ProU            ld a,$EF                        ;
                in a,($FE)                      ;
                cpl                             ;
                bit 3,a                         ;
                ret                             ;

ProD            ld a,$EF                        ;
                in a,($FE)                      ;
                cpl                             ;
                bit 4,a                         ;
                ret                             ;

ProF            ld a,$EF                        ;
                in a,($FE)                      ;
                cpl                             ;
                bit 0,a                         ;
                ret                             ;

SinL            ld a,$EF                        ;
                in a,($FE)                      ;
                cpl                             ;
                bit 4,a                         ;
                ret                             ;

SinR            ld a,$EF                        ;
                in a,($FE)                      ;
                cpl                             ;
                bit 3,a                         ;
                ret                             ;

SinU            ld a,$EF                        ;
                in a,($FE)                      ;
                cpl                             ;
                bit 1,a                         ;
                ret                             ;

SinD            ld a,$EF                        ;
                in a,($FE)                      ;
                cpl                             ;
                bit 2,a                         ;
                ret                             ;

SinF            ld a,$EF                        ;
                in a,($FE)                      ;
                cpl                             ;
                bit 0,a                         ;
                ret                             ;

; This code compiles the user defined keys into the fastest code to read them

DoKeys          ld ix,kLeft                     ;
                ld iy,UDKWS                     ;
                ld de,UDKTab                    ;
                ld b,8                          ;

Game1           push bc                         ;
                push de                         ;

                ld hl,HSBuffer                  ;
DK1             ld a,(de)                       ;
                cp 40                           ;
                jr nc,DK2                       ;

                call Conv                       ;

                ld (hl),b                       ;
                inc hl                          ;
                ld (hl),c                       ;
                inc hl                          ;
                inc de                          ;

                jr DK1                          ;

Conv            ld bc,$FEFE                     ;
                inc a                           ;
Conv1           dec a                           ;
                ret z                           ;

                rlc c                           ;
                bit 5,c                         ;
                jr nz,Conv1                     ;

                ld c,$FE                        ;
                rlc b                           ;
                jr Conv1                        ;

DK2             ld (hl),0                       ;

                ld de,HSBuffer-2                ;

DK3             inc de                          ;
                inc de                          ;

                ld a,(de)                       ;
                or a                            ;
                jr z,DK5                        ;

                ld h,d                          ;
                ld l,e                          ;

DK4             inc hl                          ;
                inc hl                          ;

                ex af,af'                       ;
                ld a,(hl)                       ;
                or a                            ;
                jr z,DK3                        ;

                ex af,af'                       ;
                cp (hl)                         ;
                jr nz,DK4                       ;

                inc de                          ;
                inc hl                          ;

                ex af,af'                       ;
                ld a,(de)                       ;
                and (hl)                        ;
                ld (de),a                       ;
                ex af,af'                       ;

                ld (hl),$FF                     ;
                dec hl                          ;
                dec de                          ;
                ld (hl),$FF                     ;

                jr DK4                          ;

DK5             ld de,HSBuffer-2                ;

DK5a            inc de                          ;
                inc de                          ;

                ld a,(de)                       ;
                or a                            ;
                jr z,DK5c                       ;

                cp $FF                          ;
                jr z,DK5a                       ;

                inc de                          ;
                ld a,(de)                       ;
                dec de                          ;
                ld h,d                          ;
                ld l,e                          ;
                inc hl                          ;

DK5b            inc hl                          ;

                ex af,af'                       ;
                ld a,(hl)                       ;
                or a                            ;
                jr z,DK5a                       ;

                ex af,af'                       ;
                inc hl                          ;
                cp (hl)                         ;
                jr nz,DK5b                      ;

                dec hl                          ;
                ex af,af'                       ;
                ld a,(de)                       ;
                and (hl)                        ;
                ld (de),a                       ;
                ex af,af'                       ;

                ld (hl),$FF                     ;
                inc hl                          ;
                ld (hl),$FF                     ;
                jr DK5b                         ;

DK5c            ld (ix),$C3                     ;
                ld a,iyl                        ;
                ld (ix+1),a                     ;
                ld a,iyh                        ;
                ld (ix+2),a                     ;

                inc ix                          ;
                inc ix                          ;
                inc ix                          ;

                ld hl,HSBuffer-2                ;

DK6             inc hl                          ;
                inc hl                          ;

DK7             ld a,(hl)                       ;
                or a                            ;
                jr z,DK8                        ;

                cp $FF                          ;
                jr z,DK6                        ;

                ld (iy),$3E                     ;
                inc iy                          ;

                ld a,(hl)                       ;
                inc hl                          ;
                ld (iy),a                       ;
                inc iy                          ;

                ld (iy),$DB                     ;
                inc iy                          ;

                ld (iy),$FE                     ;
                inc iy                          ;

                ld (iy),$F6                     ;
                inc iy                          ;

                ld a,(hl)                       ;
                inc hl                          ;
                ld (iy),a                       ;
                inc iy                          ;

                ld (iy),$3C                     ;
                inc iy                          ;

                ld (iy),$C0                     ;
                inc iy                          ;

                jr DK7                          ;

DK8             ld (iy-1),$C9                   ;

                pop de                          ;
                pop bc                          ;

                ld a,e                          ;
                or $0F                          ;
                ld e,a                          ;

                inc de                          ;
                dec b                           ;
                jp nz,Game1                     ;

                ret                             ;

; Init the interrupt handler

InitInt         ld hl,IntPage                   ;
                ld b,0                          ;
                ld a,IntVec/256                 ;

IIlp            ld (hl),a                       ;
                inc hl                          ;
                djnz IIlp                       ;

                ld (hl),a                       ;

                ld a,1                          ;
                ld (SecCount),a                 ;

                xor a                           ;
                ld (Sc_F),a                     ;

                ld a,IntPage/256                ;
                ld i,a                          ;
                im 2                            ;
                ret                             ;

; Init the clock display

InitClock       ld hl,ClockDataN                ;
                ld de,Colon1N                   ;
                ld bc,Colon2N                   ;

                ld a,(CType)                    ;
                or a                            ;
                ld a,$47                        ;
                jr z,IC0                        ;

                ld a,$7                         ;
                ld hl,ClockDataR                ;
                ld de,Colon1R                   ;
                ld bc,Colon2R                   ;

IC0             ld (CM1),de                     ;
                ld (CM1a),de                    ;

                ld (CM2),bc                     ;
                ld (CM2a),bc                    ;

                ld (CM0),a                      ;

                ld de,p1                        ;
                ld bc,CDEnd-ClockDataN          ;
                ldir                            ;

                ld a,(CType)                    ;
                or a                            ;
                ld a,$1C                        ;
                jr z,IC2                        ;

                ld hl,$52C2                     ;
                call IC1                        ;
                ld hl,$52C5                     ;

IC1             ld (hl),a                       ;
                inc h                           ;
                ld (hl),a                       ;
                inc h                           ;

                inc h                           ;
                ld (hl),a                       ;
                inc h                           ;
                ld (hl),a                       ;

                ret                             ;

IC2             ld hl,$420E                     ;

                call IC1                        ;

                ld hl,$4211                     ;

                jr IC1                          ;


InitInst        ld a,(CType)                    ;
                or a                            ;
                jr z,InitIN                     ;

                cp 3                            ;
                jp z,InitIt                     ;

                ld a,0                          ;
                ld (pCurX),a                    ;

                ld hl,$50A0                     ;
                ld (pCurY),hl                   ;

                call PrintStr1                  ;
		noflow				;
                defb "Energy",0			;

                ld a,$CE                        ;
                ld (pCurX),a                    ;

                call PrintStr1                  ;
		noflow				; Tell Zeus this data is skipped
                defb "Angle",0			;

                ld de,$5AA0                     ;
                ld hl,BottDefNR                 ;

NR1             call SetAttr                    ;

                jp InitScroll                   ;

; Init the instruments

InitIN          xor a                           ;
                ld (pCurX),a                    ;

                ld hl,ScreenBase                ;
                ld (pCurY),hl                   ;

                call PrintStr1                  ;
		noflow				;
                defb "Angle",0			;

                xor a                           ;
                ld (pCurX),a                    ;

                ld hl,$50A0                     ;
                ld (pCurY),hl                   ;

                call PrintStr1                  ;
		noflow				;
                defb "Energy",0			;

                ld a,$B8                        ;
                ld (pCurX),a                    ;

                call PrintStr1                  ;
		noflow				;
                defb "Score",0			;

                ld de,Attrs                     ;
                ld hl,TopDefN                   ;
                call SetAttr                    ;

                ld de,$5A80                     ;
                ld hl,BottDefN                  ;
                call SetAttr                    ;

                call InitScroll                 ;

                ld hl,$5680                     ;
                call ILine                      ;

                ld hl,$4120                     ;
                call ILine                      ;

                ret                             ;

; Clear the attributes to bright white/black

InitIt          ld hl,Attrs                     ;
                ld de,Attrs+1                   ;
                ld bc,lAttrs-1                  ;
                ld (hl),$47                     ;
                ldir                            ;
                ret                             ;

; Fire-up menu

FUM             defb $5                         ;
                defb "Forbidden Planet   "      ;

                defb $3                         ;
                defb "(c) "                     ;
                defb 5                          ;
                defb "Design"                   ;
                defb 6                          ;
                defb "Design"                   ;
                defb 7                          ;
                defb "Software"                 ;
                defb $00,$FF                    ;

; Fire-up demo

FUD             defb $5                         ;
                defb "Demo mode"                ;
                defb $00,$FF                    ;

; Draw a dotted line

ILine           ld b,$20                        ;

ILine1          ld (hl),$AA                     ;
                inc l                           ;
                djnz ILine1                     ;

                ret                             ;


SetAttr         ld a,(hl)                       ;
                or a                            ;
                ret z                           ;

                inc hl                          ;
                ld b,(hl)                       ;
                inc hl                          ;

SAlp            ld (de),a                       ;
                inc de                          ;
                djnz SAlp                       ;

                jr SetAttr                      ;


BottDefNR       defb $43,$19                    ;
                defb $45,$07                    ;

                defb $47,$08                    ;
                defb $43,$11                    ;
                defb $47,$07                    ;

                defb $07,$20                    ;
                defb $00                        ;

BottDefN        defb $47,$20                    ;
                defb $43,$06                    ;
                defb $43,$10                    ;
                defb $46,$05                    ;
                defb $07,$05                    ;

                defb $43,$06                    ;
                defb $43,$10                    ;
                defb $46,$05                    ;
                defb $07,$05                    ;

                defb $47,$20                    ;
                defb $00                        ;

TopDefN         defb $45,$06                    ;
                defb $47,$1A                    ;
                defb $47,$20                    ;
                defb $00                        ;

OptKeyTab       defb $FF,$FF,$84,$00            ; Esc
                defb $F7,$FE,$00,$01            ; "1"
                defb $F7,$FD,$00,$02            ; "2"
                defb $F7,$FB,$00,$03            ; "3"
                defb $F7,$F7,$00,$04            ; "4"
                defb $F7,$EF,$00,$05            ; "5"
                defb $EF,$EF,$84,$06            ; "6"
                defb $EF,$F7,$84,$07            ; "7"
                defb $EF,$FB,$84,$08            ; "8"
                defb $EF,$FD,$84,$09            ; "9"
                defb $BF,$FE,$84,$0A            ; cCret
                defb $7F,$FE,$00,$0B            ; " "

UDKdesc         defb $80 or "C","S"             ;
                defb "ZXCV"                     ;
                defb "ASDFG"                    ;
                defb "QWERT"                    ;
                defb "12345"                    ;
                defb "09876"                    ;
                defb "POIUY"                    ;
                defb $80 or "C","r"             ;
                defb "LKJH"                     ;
                defb $80 or "S","p"             ;
                defb $80 or "S","S"             ;
                defb "MNB"                      ;

; Menu text

sEndDead        defb cCls,cCret,cCret,cYellow
                defb "You were killed , scoring "
                defb cWhite,0

sEndDead1       defb "0 "
                defb cYellow
                defb "points ."
                defb cCret,cCret,cCyan
                defb "Press SPACE",0

sEndEsc         defb cCls,cCret,cCret,cYellow
                defb "Congratulations ! You escaped from the planet"
                defb cCret,cCret,cCyan
                defb "If you can decode it , enter the key ."
                defb cCret,cCret,cMagenta,0

sWrongCode      defb $0D,$0D,$05
                defb "Sorry , this key does not decode the message"
                defb $0D,$0D,$06
                defb "Press SPACE",$00

sFuckUp         defb $0C,$06
                defb "Oh dear ! something's gone wrong !"
                defb $0D,$0D,$05
                defb "Please phone 061-205-6603 and quote this"
                defb $0D
                defb "number :- "
                defb $07
                defb "2.0:",$00

sHexMon         defb $0C,$05
                defb "Sorry , this option is not enabled at present"
                defb $0D,$0D,$07
                defb "Press ENTER",$00

sHexMon1        defb $0C,$05,$86,$83
                defb "Quaimon 2"
                defb $0D,$0D,$06
                defb "(m)od , (t)ab , (e)xec , (q)uit"
                defb $00

sMonError       defb $05
                defb "Error !"
                defb $00

        if def Original
sMainMenu       defb $07,$0C,$86,$86,$82
                defb "Forbidden Planet"
        else
sMainMenu       defb $07,$0C,$86,$84
                defb "Forbidden Planet 2008"
        endif
                defb $0D,$0D
                defb $03
                defb "    Part Three of the Dark Star Trilogy"
                defb $0D,$0D
                defb $07
                defb " 1 "
                defb $03
                defb " Play the game"
                defb $07
                defb $0D,$0D
                defb " 2 "
                defb $02
                defb " Instructions"
                defb $07
                defb $0D,$0D
                defb $0D,$0D
                defb " 3 "
                defb $06
                defb " Select the playing keys and joystick"
                defb $07
                defb $0D,$0D
                defb " 4 "
                defb $04
                defb " Change the game options"
                defb $07
                defb $0D,$0D
                defb $0D,$0D
                defb $0D
                defb " 5 "
                defb $05
                defb " Simple demo sheet"
                defb $0D,$0D
                defb $0D,$0D
                defb $03
                defb "Designed without the aid of a computer ."
                defb $0D,$0D
                defb "(c) Design Design Software"
                defb $00

	; These were disassembled back from the object, hence the ugly formatting.

sKeysMenu       defb $0C,$86,$83,$85,$06,"Present Controls",$0D,$0D,$07
                defb " 1  ",$04,"Turn left",$0D,$0D,$07," 2  ",$04
                defb "Turn right",$0D,$0D,$07," 3  ",$05
                defb "Move Up",$0D,$0D,$07," 4  ",$05,"Move Down",$0D,$0D,$07
                defb " 5  ",$06,"Accelerate",$0D,$0D,$07
                defb " 6  ",$06,"Decelerate",$0D,$0D,$07
                defb " 7  ",$05,"Fire",$0D,$0D,$07," 8  ",$03
                defb "Return to main menu  ",$07,"9 ",$03
                defb "Select Joystick",$0D,$0D,$05,"Press a number between ",$07
                defb "'1' ",$05,"and ",$07,"'7' ",$05,"to select the control that you wi"
                defb "sh to change .",$0D,$0D,$06," Then type all the keys that yo"
                defb "u want for",$0D,"that control and finish by typing the"
                defb " ",$07,"'1' ",$06,"key.",$00

sJoysticks      defb $0C,$86,$86,$83,$06,"Joystick Menu",$0D,$0D,$0D
                defb " 1  ",$04,"Kempston",$07,$0D,$0D," 2  ",$03
                defb "Fuller Box",$0D,$0D,$07," 3  ",$06
                defb "Protek ( any cursor joystick )",$0D,$0D,$07
                defb " 4  ",$05,"Sinclair Interface 2",$0D,$0D,$07
                defb " 5  ",$04,"IEEE Interface",$0D,$0D,$0D,$07
                defb " 8  ",$03,"Return to main menu ",$07
                defb " 9 ",$03,"Select keyboard",$0D,$0D,$0D,$06
                defb " Please note that even when you select",$0D
                defb "a joystick the keyboard is still used for",$0D
                defb "accelerate & deccelerate .",$0D,$0D,$05
                defb " If you have a programmable joystick then",$0D
                defb "select the Sinclair and define yours to be",$0D
                defb "6 = Left 7 = Right 9 = Up 8 = Down 0 = Fire",$00

sSkillLevels    defb $0C,$86,$86,$86,$81,$05,"Skill Levels",$0D,$0D,$0D,$0D,$07
                defb " 1  ",$05,"Easy",$0D,$0D,$07," 2  ",$06
                defb "Normal",$0D,$0D,$0D,$0D,$07," 3  ",$04
                defb "Nasty",$0D,$0D,$07," 4  ",$03,"Very nasty",$0D,$0D,$0D,$0D,$0D,$07
                defb " 5  ",$05,"Pretty damn devastating !",$00

sNoises         defb $0C,$86,$86,$86,$82,$06,"Noises",$0D,$0D,$0D,$0D,$07
                defb " 1  ",$05,"None",$0D,$0D,$07," 2  ",$06
                defb "Strange",$0D,$0D,$0D,$0D,$07," 3  ",$04
                defb "Very Strange",$00

sDisplay        defb $0C,$86,$86,$86,$82,$03,"Display",$0D,$0D,$0D,$0D,$07
                defb " 1  ",$05,"Normal",$0D,$0D,$07," 2  ",$06
                defb "Slimline",$0D,$0D,$0D,$0D,$07," 3  ",$04
                defb "Wideangle",$00

sOptiMenu       defb $0C,$86,$86,$84,$04,"Game Options",$0D,$0D,$0D,$0D,$07
                defb " 1  ",$05,"Change Skill Factors",$0D,$0D,$07
                defb " 2  ",$06,"Change Noises",$0D,$0D,$0D,$0D,$07
                defb " 3  ",$03,"Display Format",$0D,$0D,$0D,$0D,$0D,$0D,$0D,$0D,$0D,$0D

sBottom         defb $0D,$07," 8  ",$05,"Return to main menu",$0D,$0D,$07
                defb " 9  ",$03,"Return to options menu",$00

sInst           defb $0C,$86,$86,$84,"Instructions",$0D,$0D,$0D,$03
                defb " You must find the code segments and",$0D,$0D
                defb "decode them .",$0D,$0D,$04," All the keys are user-defined e"
                defb "xcept :-",$0D,$0D,$0D,$0D,$07," 1  ",$05
                defb "Displays map .",$0D,$0D,$07," 2  ",$06
                defb "Quit Game .",$0D,$0D,$07," 3  ",$04
                defb "Display codes found .",$07,$0D,$0D,$0D
                defb " 4  ",$05,"Returns to the game from these .",$00

sHighA          defb $0C,$86,$86,$82,"Forbidden Planet",$0D,$0D,$86,$86,$84,$05
                defb "Hall of Fame",$0D,$0D,$0D,$00

sHighB          defb $0D,$0D,"  Press ",$05,"SPACE ",$06
                defb "to play or ",$05,"ENTER ",$06,"for options",$00

sHighC          defb $07
HSChar          defb "1",$92,$03,$00

sAccept         defb $0D,$0D,$85,"Please type in your entry .",$03,$00

; The clues for the high-score table modifications...

sClues          defb "version",0
                defb "sex",0
                defb "laser",0
                defb "fuck",0
                defb "shit",0
                defb "help",0
                defb "designdesign",0
                defb "pinback",0
                defb "darkstar",0
                defb "mon",0
                defb "corwench",0
                defb $FF

; The text for the high-score table modifications...

Text            defb "Ver 2.0 Revised for Zeus-PC",0
                defb "Hmmm. . . tricky !",0
                defb "2mW Helium-Neon 633 nm",0
                defb "Oh yes please !",0
                defb "Shit somewhere else !",0
                defb "Help ?",0
                defb "What a what a silly silly name !",0
                defb "Want yer mouse ?",0
                defb $22," Hate it ! ",$22,0
                defb "Let go of my ears - I know my job !",0
                defb "Nibble nibble !",0
                defb $FF

; Fire up code. This deletes itself after running to hide the LD R,A instruction
;
; This code sets the top-bit of R, the loader starts the game here if it
; thinks the game hasn't been pirated. How does it know? In the quiet gap
; between sections of tape it looks at how noisy the tape is. An original
; is very quiet, most copies were made using AGC so they're noisy...
;
; Years later someone else claimed this idea as their own. Sic Transit...
;

        if def RandomHS
FireUpHack      ldir                            ;

FireUp          ld bc,$E7FE                     ; "I" key
                in a,(c)                        ;
                or $E0                          ;
                inc a                           ;
                jp nz SpaceInvaders             ;

                ld a,r                          ; Set the top bit
                or $80                          ;
;                and $7f                         ;
                ld r,a                          ;

                ld hl,Start                     ;
                ld (FireUpVector),hl            ;

                ld hl,FireUpHack                ;
                ld bc,38                        ;

                ld ix,$6B00                     ;

                ldir                            ;

                jp (ix)                         ;
        else
FireUpHack      ldir                            ;

FireUp          ld bc,$E7FE                     ; "I" key
                in a,(c)                        ;
                or $E0                          ;
                inc a                           ;
                jp nz SpaceInvaders             ;

                ld a,$80                        ; Set the top-bit of R
                ld r,a                          ; But this kills the random HS

                ld hl,Start                     ;
                ld (FireUpVector),hl            ;

                ld hl,FireUpHack                ;
                ld bc,36                        ;

                ld ix,$6B00                     ;

                ldir                            ;

                jp (ix)                         ;
        endif

;  Interrupt table here!
;
; The idea is that we fill a page with the same value then put the z80 in
; IM2, the vectored mode. It doesn't matter what the vector value is because
; all addresses point to the same place...
;
; Took bloody ages to get zxspin's joke of an assembler to do what I wanted
; here. It silently failed but reported problems elsewhere, which is just
; about the only unforgivable sin in an assembler...
;

                align 256                       ;

IntPage		equ $

	        defs $101,((IntPage/256)+1)     ;

		org IntPage+$100 + (IntPage/256)+1 ;
IntVec          jp IntRoutine                   ;

; The main game code

                org $9400

GameCode	call Options_Subs               ;

                call SetUpTabs                  ;

                call GenYTab                    ;

                call Gen192Tab                  ;

                call InitVars                   ;

                call InitStars                  ;

                call InitObjes                  ;

                call InitLines                  ;

                call CreateStars                ;

                call InitCodes                  ;

                call InitStats                  ;

                ld a,$47                        ;
                ld (GameAttr),a                 ;
                ld (Colour),a                   ;

                ld a,DamFSD                     ;
                ld (DDamage),a                  ;

                ld a,GameRunning                ;
                ld (EndState),a                 ;

                call CLS                        ;

                ld hl,$1000                     ;
                ld (Distance),hl                ;

                halt                            ;
                halt                            ;

                ld a,(Mode)                     ;
                cp ModeDemo                     ;
                jp z,DoDemo                     ;

                call InitMap                    ;

Loop            ld a,(ADamage)                  ;
                or a                            ;
                jr z,Exit                       ;

                ld a,(EndState)                 ;
                cp GameRunning                  ;
                jr nz,Exit                      ;

                call AlterSteps                 ;

                call DoVectors                  ;

                call DrawSights                 ;

                call ShowObje                   ;

                call ShowStars                  ;

                call PlayerFire                 ;

                call AddObjects                 ;

                ld bc,$EFFE                     ;
                in a,(c)                        ;
                or $E0                          ; 6,7,8,9,0
                inc a                           ;
                jp nz,Loop                      ;

                ld bc,$F7FE                     ;
                in a,(c)                        ;
                bit 3,a                         ;
                jr z,Loop                       ;

                or $F8                          ; 1,2,3
                inc a                           ;
                jp z,Loop                       ;

                call DispStats                  ;

                jp Loop                         ;

Exit            di                              ;

                ld bc,0                         ;

ExitLp          cpi                             ;
                jp pe,ExitLp                    ;

                ret                             ;

DoDemo          ld iy,DemoData                  ;

DemoLoop        ld l,(iy+dDemoText_L)           ;
                ld h,(iy+dDemoText_H)           ;

                ld a,l                          ;
                or h                            ;
                jr z,DemoQuit                   ;

                push iy                         ;
                call vAddScroll                 ;
                pop iy                          ;

                ld l,(iy+dDemoObje_L)           ;
                ld h,(iy+dDemoObje_H)           ;

                ld bc,4                         ;
                add iy,bc                       ;

                push hl                         ;
                pop ix                          ;

                push iy                         ;
                call NextObje                   ;
                pop iy                          ;

                ld hl,-$B0                      ;
                ld bc,$80                       ;

                call DemoFlyIn                  ;

                ld hl,-$10                      ;
                ld bc,$90                       ;

                call DemoFlyIn                  ;

                jp DemoLoop                     ;

DemoQuit        di                              ;
                ret                             ;

DemoFlyIn       ld (DeltaZ),hl                  ;

DemoLp          push iy                         ;
                push bc                         ;

                call ShowObje                   ;
                call ShowStars                  ;

                pop bc                          ;
                pop iy                          ;

                cpi                             ;
                jp pe,DemoLp                    ;

                ret                             ;

sdIris          defb cCyan,"Various holes in force fields which must be flo"
                defb "wn through .",0,$FF

sdHoles         defb cCyan,"yet more holes which must be flown through .",0,$FF

sdDef           defb cCyan,"Various defences .",0,$FF

sdCode          defb cYellow,"This is a code store , the code is revealed on "
                defb "impact ",0,$FF

DemoData        defw sdIris,IrisDemo            ;
                defw sdHoles,HoleDemo           ;
                defw sdDef,TowerDemo            ;
                defw sdCode,CodeDemo            ;
                defw 0,0                        ;

;  Start of MATHS

NegHL           ld a,l                          ;
                cpl                             ;
                ld l,a                          ;
                ld a,h                          ;
                cpl                             ;
                ld h,a                          ;
                inc hl                          ;
                ret                             ;

Rand            push hl                         ;
                push bc                         ;

                call Rand1                      ;

                pop bc                          ;
                pop hl                          ;
                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!"                     ;

DivHLDE         ld a,h                          ;
                cp d                            ;
                jr z,Div1                       ;
                jr nc,Div16                     ;
Div81           xor a                           ;
Div8            ld c,a                          ;
                add hl,hl                       ;
                sbc hl,de                       ;
                jr c,Div70                      ;
                adc a,a                         ;
                add hl,hl                       ;
                sbc hl,de                       ;
                jr c,Div60                      ;
Div61           adc a,a                         ;
                add hl,hl                       ;
                sbc hl,de                       ;
                jr c,Div50                      ;
Div51           adc a,a                         ;
                add hl,hl                       ;
                sbc hl,de                       ;
                jr c,Div40                      ;
Div41           adc a,a                         ;
                add hl,hl                       ;
                sbc hl,de                       ;
                jr c,Div30                      ;
Div31           adc a,a                         ;
                add hl,hl                       ;
                sbc hl,de                       ;
                jr c,Div20                      ;
Div21           adc a,a                         ;
                add hl,hl                       ;
                sbc hl,de                       ;
                jr c,Div10                      ;
Div11           adc a,a                         ;
                add hl,hl                       ;
                sbc hl,de                       ;
                adc a,a                         ;
                cpl                             ;
                ld l,a                          ;
                ld h,c                          ;
                ret                             ;

Div1            ld a,l                          ;
                cp e                            ;
                jr c,Div81                      ;
                jr z,Div0                       ;
Div16           ld a,l                          ;
                ld l,h                          ;
                ld h,$00                        ;
                ld b,$08                        ;
Div16a          add a,a                         ;
                adc hl,hl                       ;
                sbc hl,de                       ;
                jr nc,Div16b                    ;
                add hl,de                       ;
                djnz Div16a                     ;
                jp Div8                         ;

Div16b          inc a                           ;
                djnz Div16a                     ;
                jp Div8                         ;

Div70           adc a,a                         ;
                add hl,hl                       ;
                add hl,de                       ;
                ccf                             ;
                jr nc,Div61                     ;
Div60           adc a,a                         ;
                add hl,hl                       ;
                add hl,de                       ;
                ccf                             ;
                jr nc,Div51                     ;
Div50           adc a,a                         ;
                add hl,hl                       ;
                add hl,de                       ;
                ccf                             ;
                jr nc,Div41                     ;
Div40           adc a,a                         ;
                add hl,hl                       ;
                add hl,de                       ;
                ccf                             ;
                jr nc,Div31                     ;
Div30           adc a,a                         ;
                add hl,hl                       ;
                add hl,de                       ;
                ccf                             ;
                jr nc,Div21                     ;
Div20           adc a,a                         ;
                add hl,hl                       ;
                add hl,de                       ;
                ccf                             ;
                jr nc,Div11                     ;
Div10           adc a,a                         ;
                add hl,hl                       ;
                add hl,de                       ;
                ccf                             ;
                adc a,a                         ;
                cpl                             ;
                ld l,a                          ;
                ld h,c                          ;
                ret                             ;

Div0            ld hl,$0100                     ;
                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                    ;
                ld a,l                          ;
                cpl                             ;
                ld l,a                          ;
                ld a,h                          ;
                cpl                             ;
                ld h,a                          ;
                inc hl                          ;
                sra h                           ;
                rr l                            ;
                ret                             ;

ShapeDiv        push bc                         ;
                call ObjeDiv                    ;
                pop bc                          ;
                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,$08                        ;
                rra                             ;
Mul2            jr nc,Mul3                      ;
                add hl,de                       ;
Mul3            rr h                            ;
                rr l                            ;
                rra                             ;
                djnz Mul2                       ;
                ld h,l                          ;
                ld l,a                          ;
                ret                             ;

SignMult        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                          ;

SignDiv         bit 7,h                         ;
                jr z,SD1                        ;
                ld a,h                          ;
                cpl                             ;
                ld h,a                          ;
                ld a,l                          ;
                cpl                             ;
                ld l,a                          ;
                inc hl                          ;
                bit 7,d                         ;
                jr z,SDn                        ;
                ld a,d                          ;
                cpl                             ;
                ld d,a                          ;
                ld a,e                          ;
                cpl                             ;
                ld e,a                          ;
                inc de                          ;
SDp             jp DivHLDE                      ;

SDn             call DivHLDE                    ;
                ld a,h                          ;
                cpl                             ;
                ld h,a                          ;
                ld a,l                          ;
                cpl                             ;
                ld l,a                          ;
                inc hl                          ;
                ret                             ;

SD1             bit 7,d                         ;
                jp z,DivHLDE                    ;
                ld a,d                          ;
                cpl                             ;
                ld d,a                          ;
                ld a,e                          ;
                cpl                             ;
                ld e,a                          ;
                inc de                          ;
                jp SDn                          ;

;  End of MATHS

Options_Subs    ld a,(BType)                    ;
                ld b,a                          ;

                bit 0,b                         ;
                call GetSoundFlag               ;
                ld (SoundFlagHLX),a             ;

                bit 1,b                         ;
                call GetSoundFlag               ;
                ld (SoundFlagVL),a              ;

                bit 2,b                         ;
                call GetSoundFlag               ;
                ld (SoundFlagAL),a              ;
                ld (SoundFlagAL1),a             ;

                xor a                           ;
                ld (cSoundVal),a                ;
                ret                             ;

GetSoundFlag    ld a,0                          ;
                ret z                           ;

                ld a,$F8                        ;
                ret                             ;

        if not def Original
; If this is -1, ie, we are on the easy level, ignore damage unless we are firing

DoDamage        ld a,b                          ; If not -1 then do it
                cp -1                           ;
                jr nz AlwaysDoDamage            ;

                ; This is the smallest amount possible, easy level

                call kFire                      ; Are we firing?
                jr z DDx                        ; No, ignore this

                ; We are firing, so allow damage

                ld b,-1                         ; Do it

        ; Given a +- amount of damage in B, add it to the damage.
        else
DoDamage        equ *
        endif

AlwaysDoDamage  ld a,(DDamage)                  ;
                bit 7,b                         ;
                jr nz,DDa                       ;

                add a,b                         ;
                cp DamFSD                       ;
                jr c,DD1                        ;

                ld a,DamFSD                     ;

DD1             ld (DDamage),a                  ;
DDx             ret                             ;

DDa             add a,b                         ;
                jp p,DD1                        ;

                xor a                           ;
                jr DD1                          ;

AddScore        ld hl,(DScore)                  ;
                add a,l                         ;
                daa                             ;
                ld l,a                          ;

                ld a,h                          ;
                adc a,$00                       ;
                daa                             ;
                ld h,a                          ;

                jr nc,AS1                       ;

                ld hl,$9999                     ;

AS1             ld (DScore),hl                  ;
                ret                             ;

SubScore        ret                             ;

LimitStarCnt    ld b,a                          ;
                ld a,(cnStars)                  ;
                add a,b                         ;
                cp $1A                          ;
                ret nc                          ;

                ld (cnStars),a                  ;
                ret                             ;

ShowObje        ld hl,$0000                     ;
                ld (cObjeZ),hl                  ;

                xor a                           ;
                ld (ShuffledF),a                ;
                ld (cnObje),a                   ;

                ld iy,ObjeSeq                   ;

                ld hl,(pObjeList)               ;

SOlp            ld a,l                          ;
                or h                            ;
                jp z,ShowObje2                  ;

                ld (iy+2),l                     ;
                ld (iy+3),h                     ;

                push hl                         ;
                pop ix                          ;

                bit bKilled,(ix+dObjeFlags)     ;
                jp nz,SOMiss                    ;

                ld e,(ix+dObjedX_L)             ;
                ld d,(ix+dObjedX_H)             ;
                ld hl,(DeltaX)                  ;
                add hl,de                       ;
                ld e,(ix+dObjeX_L)              ;
                ld d,(ix+dObjeX_H)              ;

                ld (ix+dObjeOX_L),e             ;
                ld (ix+dObjeOX_H),d             ;
                add hl,de                       ;
                ld (ix+dObjeX_L),l              ;
                ld (ix+dObjeX_H),h              ;

                ld e,(ix+dObjedY_L)             ;
                ld d,(ix+dObjedY_H)             ;
                ld hl,(DeltaY)                  ;
                add hl,de                       ;
                ld e,(ix+dObjeY_L)              ;
                ld d,(ix+dObjeY_H)              ;

                ld (ix+dObjeOY_L),e             ;
                ld (ix+dObjeOY_H),d             ;
                add hl,de                       ;
                ld (ix+dObjeY_L),l              ;
                ld (ix+dObjeY_H),h              ;

                ld e,(ix+dObjedZ_L)             ;
                ld d,(ix+dObjedZ_H)             ;
                ld hl,(DeltaZ)                  ;
                add hl,de                       ;
                ld e,(ix+dObjeZ_L)              ;
                ld d,(ix+dObjeZ_H)              ;

                ld (ix+dObjeOZ_L),e             ;
                ld (ix+dObjeOZ_H),d             ;
                add hl,de                       ;
                ld (ix+dObjeZ_L),l              ;
                ld (ix+dObjeZ_H),h              ;

                bit 7,h                         ;
                jp nz,SOkill                    ;

                ld de,MinZ                      ;
                or a                            ;
                sbc hl,de                       ;
                jp m,SOkill                     ;

                ld de,$8000                     ;
                add hl,de                       ;

                ld (iy),l                       ;
                ld (iy+1),h                     ;

Test            ld de,(cObjeZ)                  ;
                ld (cObjeZ),hl                  ;

                or a                            ;
                sbc hl,de                       ;

                call c,SortObje                 ;

                ld bc,4                         ;
                add iy,bc                       ;

                ld a,(cnObje)                   ;
                inc a                           ;
                ld (cnObje),a                   ;

                ld l,(ix+dpnObje_L)             ;
                ld h,(ix+dpnObje_H)             ;
                jp SOlp                         ;

SOkill          ld a,(ix+dObjeFlags)            ;
                bit bCursorClip,a               ;
                jr nz,SOCurClip                 ;

                bit bScreenClip,a               ;
                jp z,SOMiss                     ;

                bit bOnScreen,a                 ;
                jr nz,SOHit                     ;

                ld l,(ix+dObjeDispXL_L)         ;
                ld h,(ix+dObjeDispXL_H)         ;
                ld de,-128                      ;
                add hl,de                       ;
                bit 7,h                         ;
                jp p,SOMiss                     ;

		; For some reason we call kLeft here. I think this was an editing mistake
		; in the original source <grin>

                call kLeft                      ; 

                ld l,(ix+dObjeDispYT_L)         ;
                ld h,(ix+dObjeDispYT_H)         ;
                add hl,de                       ;
                bit 7,h                         ;
                jp p,SOMiss                     ;

                ld l,(ix+dObjeDispXR_L)         ;
                ld h,(ix+dObjeDispXR_H)         ;
                ld de,128                       ;
                add hl,de                       ;
                bit 7,h                         ;
                jp m,SOMiss                     ;

                ld l,(ix+dObjeDispYB_L)         ;
                ld h,(ix+dObjeDispYB_H)         ;
                add hl,de                       ;
                bit 7,h                         ;
                jp m,SOMiss                     ;

                jp SOHit                        ;

SOCurClip       ld l,(ix+dObjeDispXL_L)         ;
                ld h,(ix+dObjeDispXL_H)         ;
                ld de,(XTurn)                   ;

                sra d                           ;
                rr e                            ;

                or a                            ;
                sbc hl,de                       ;
                jp p,SOMiss                     ;

                ld l,(ix+dObjeDispXR_L)         ;
                ld h,(ix+dObjeDispXR_H)         ;
                or a                            ;
                sbc hl,de                       ;
                jp m,SOMiss                     ;

                ld l,(ix+dObjeDispYT_L)         ;
                ld h,(ix+dObjeDispYT_H)         ;
                ld de,(YTurn)                   ;

                sra d                           ;
                rr e                            ;

                or a                            ;
                sbc hl,de                       ;
                jp p,SOMiss                     ;

                ld l,(ix+dObjeDispYB_L)         ;
                ld h,(ix+dObjeDispYB_H)         ;
                or a                            ;
                sbc hl,de                       ;
                jp m,SOMiss                     ;

SOHit           ld l,(ix+dObjeColl_L)           ;
                ld h,(ix+dObjeColl_H)           ;
                jp SO_k1                        ;

SOMiss          ld l,(ix+dObjeMiss_L)           ;
                ld h,(ix+dObjeMiss_H)           ;

SO_k1           call CallHL                     ;

                ld l,(ix+dpnObje_L)             ;
                ld h,(ix+dpnObje_H)             ;

                push iy                         ;
                push hl                         ;

                call KillObje                   ;

                pop hl                          ;
                pop iy                          ;

                ld a,(ix+dObjeStarComp)         ;
                call LimitStarCnt               ;

                jp SOlp                         ;

ShowObje2       ld a,0                          ;
ShuffledF       equ .-1                         ;

                or a                            ;

                call nz,ResortObje              ;

                ld hl,WindowTable               ;
                ld (pcWindow),hl                ;

                ld hl,$7FFF                     ;
                ld (WindowTable),hl             ;

                call ResMargin                  ;

                ld a,$FF                        ;
                ld (WindowMask),a               ;

                ld hl,(pObjeList)               ;

SOlp2           ld a,l                          ;
                or h                            ;
                ret z                           ;

                push hl                         ;
                pop ix                          ;

                ld l,(ix+dObjeAlter_L)          ;
                ld h,(ix+dObjeAlter_H)          ;
                call CallHL                     ;

                ld l,(ix+dObjeMove_L)           ;
                ld h,(ix+dObjeMove_H)           ;
                call CallHL                     ;

                res bOnScreen,(ix+dObjeFlags)   ;

                ld a,(WindowMask)               ;
                and (ix+dObjeCol)               ;
                ld (Colour),a                   ;

                ld l,(ix+dObjeDraw_L)           ;
                ld h,(ix+dObjeDraw_H)           ;
                call CallHL                     ;

                ld l,(ix+dpnObje_L)             ;
                ld h,(ix+dpnObje_H)             ;
                jp SOlp2                        ;

CallDE          push de                         ;

Ret0            ret                             ;

CallHL          jp (hl)                         ;

ResortObje      ld iy,ObjeSeq                   ;

                ld b,0                          ;
cnObje          equ .-1                         ;

                ld de,0                         ;

                ld l,(iy+2)                     ;
                ld h,(iy+3)                     ;

                ld (pObjeList),hl               ;

ROlp            inc iy                          ;
                inc iy                          ;
                inc iy                          ;
                inc iy                          ;

                push hl                         ;
                pop ix                          ;

                ld (ix+dppObje_L),e             ;
                ld (ix+dppObje_H),d             ;

                ex de,hl                        ;

                ld l,(iy+2)                     ;
                ld h,(iy+3)                     ;
                ld (ix+dpnObje_L),l             ;
                ld (ix+dpnObje_H),h             ;

                djnz ROlp                       ;

                ld hl,0                         ;
                ld (ix+dpnObje_L),l             ;
                ld (ix+dpnObje_H),h             ;

                ret                             ;

SortObje        ld a,$38                        ;
                ld (ShuffledF),a                ;

                ld e,(iy)                       ;
                ld d,(iy+1)                     ;

                push ix                         ;

                ld ix,ObjeSeq-4                 ;

                ld bc,4                         ;

SortLp          add ix,bc                       ;

                ld l,(ix)                       ;
                ld h,(ix+1)                     ;
                or a                            ;
                sbc hl,de                       ;
                jp m,SortLp                     ;

                ld a,(cnObje)                   ;
                add a,a                         ;
                add a,a                         ;
                add a,4                         ;
                ld c,a                          ;
                ld b,0                          ;

                push ix                         ;
                pop hl                          ;

                add hl,bc                       ;

                ld d,h                          ;
                ld e,l                          ;

                inc de                          ;
                inc de                          ;
                inc de                          ;
                inc de                          ;

                lddr                            ;

                ld l,(iy+4)                     ;
                ld h,(iy+5)                     ;
                ld (ix),l                       ;
                ld (ix+1),h                     ;

                ld l,(iy+6)                     ;
                ld h,(iy+7)                     ;
                ld (ix+2),l                     ;
                ld (ix+3),h                     ;

                pop ix                          ;
                ret                             ;

FFgetline       ld iy,(pFreeLines)              ;
                ld a,iyl                        ;
                or iyh                          ;
                scf                             ;
                ret z                           ;

                ld l,(iy+dpnLineFree_L)         ;
                ld h,(iy+dpnLineFree_H)         ;
                ld (pFreeLines),hl              ;

                ld hl,0                         ;
                ld (iy+dpnLine_L),l             ;
                ld (iy+dpnLine_H),h             ;

                ld hl,Ret02                     ; The various Ret's, Ret02 and so on are
                ld (iy+dpLineAlg_L),l           ; zxspin modifications - zeus could use Ret.
                ld (iy+dpLineAlg_H),h           ; zxspin can't distinguish symbols from mnemonics

                or a                            ; And as well as that there are scoping issues
                ret                             ; when the sources were combined, so several Ret's clashed.
		
AddFirstLine    ld iy,(pFreeLines)              ;
                ld a,iyl                        ;
                or iyh                          ;
                scf                             ;
                ret z                           ;

                ld l,(iy+dpnLineFree_L)         ;
                ld h,(iy+dpnLineFree_H)         ;
                ld (pFreeLines),hl              ;

                ld hl,0                         ;
                ld (iy+dpnLine_L),l             ;
                ld (iy+dpnLine_H),h             ;

                ld hl,Ret02                     ; 
                ld (iy+dpLineAlg_L),l           ;
                ld (iy+dpLineAlg_H),h           ;

                ld a,(ix+dObjepDraw)            ;
                inc a                           ;
                and $07                         ;
                ld (ix+dObjepDraw),a            ;

                add a,a                         ;
                add a,dObjepLines_L             ;
                add a,ixl                       ;
                ld l,a                          ;

                ld a,ixh                        ;
                adc a,0                         ;
                ld h,a                          ;

                ld a,iyl                        ;
                ld (hl),a                       ;
                inc hl                          ;
                ld a,iyh                        ;
                ld (hl),a                       ;

                or a                            ;
                ret                             ;

AddLine         ld hl,(pFreeLines)              ;
                ld (iy+dpnLine_L),l             ;
                ld (iy+dpnLine_H),h             ;

                ld a,l                          ;
                or h                            ;
                scf                             ;
                ret z                           ;

                push hl                         ;
                pop iy                          ;

                ld l,(iy+dpnLineFree_L)         ;
                ld h,(iy+dpnLineFree_H)         ;
                ld (pFreeLines),hl              ;

                ld hl,0                         ;
                ld (iy+dpnLine_L),l             ;
                ld (iy+dpnLine_H),h             ;

                ld hl,Ret02                     ;
                ld (iy+dpLineAlg_L),l           ;
                ld (iy+dpLineAlg_H),h           ;

                ret                             ;

UndrawLines     ld a,(ix+dObjepUnDraw)          ;
                inc a                           ;
                and $07                         ;
                ld (ix+dObjepUnDraw),a          ;

                add a,a                         ;
                add a,dObjepLines_L             ;
                add a,ixl                       ;
                ld l,a                          ;

                ld b,$00                        ;

                ld a,ixh                        ;
                adc a,b                         ;
                ld h,a                          ;

                ld a,(hl)                       ;
                ld (hl),b                       ;
                inc hl                          ;
                ld c,(hl)                       ;
                ld (hl),b                       ;
                ld h,c                          ;
                ld l,a                          ;

Undrawlp        ld a,l                          ;
                or h                            ;
                ret z                           ;

                push hl                         ;
                pop iy                          ;

                ld l,(iy+dpLineAlg_L)           ;
                ld h,(iy+dpLineAlg_H)           ;
                call CallHL                     ;

                ld hl,(pFreeLines)              ;
                ld (iy+dpnLineFree_L),l         ;
                ld (iy+dpnLineFree_H),h         ;
                ld (pFreeLines),iy              ;

                ld l,(iy+dpnLine_L)             ;
                ld h,(iy+dpnLine_H)             ;

                jp Undrawlp                     ;

InitObjes       ld hl,ObjeTable                 ;
                ld (pFreeObje),hl               ;

                ld b,nObjes                     ;
                ld de,lObje                     ;

IOlp            push hl                         ;
                pop ix                          ;

                add hl,de                       ;

                ld (ix+dpnFreeObje_L),l         ;
                ld (ix+dpnFreeObje_H),h         ;

                djnz IOlp                       ;

                ld hl,0                         ;
                ld (ix+dpnFreeObje_L),l         ;
                ld (ix+dpnFreeObje_H),h         ;

                ld (pObjeList),hl               ;

                ret                             ;

InitLines       ld hl,LineTable                 ;
                ld (pFreeLines),hl              ;

                ld b,nLines                     ;

                ld de,lLine                     ;

ILlp            push hl                         ;
                pop ix                          ;

                add hl,de                       ;

                ld (ix+dpnLineFree_L),l         ;
                ld (ix+dpnLineFree_H),h         ;

                djnz ILlp                       ;

                ld hl,0                         ;
                ld (ix+dpnLineFree_L),l         ;
                ld (ix+dpnLineFree_H),h         ;

                ret                             ;

AddObje         ex de,hl                        ;

                ld iy,(pFreeObje)               ;
                ld a,iyl                        ;
                or iyh                          ;
                scf                             ;
                ret z                           ;

                ld l,(iy+dpnFreeObje_L)         ;
                ld h,(iy+dpnFreeObje_H)         ;
                ld (pFreeObje),hl               ;

                ld hl,(pObjeList)               ;

                ld a,l                          ;
                or h                            ;
                jr nz,AOnz                      ;

                ld (iy+dppObje_L),l             ;
                ld (iy+dppObje_H),h             ;
                ld (iy+dpnObje_L),l             ;
                ld (iy+dpnObje_H),h             ;

                ld (pObjeList),iy               ;

                ex de,hl                        ;
                ld (iy+dObjeZ_L),l              ;
                ld (iy+dObjeZ_H),h              ;

                or a                            ;
                ret                             ;

AOlast          ld (iy+dpnObje_L),l             ;
                ld (iy+dpnObje_H),h             ;

                push ix                         ;
                pop hl                          ;

                ld (iy+dppObje_L),l             ;
                ld (iy+dppObje_H),h             ;

                push iy                         ;
                pop hl                          ;

                ld (ix+dpnObje_L),l             ;
                ld (ix+dpnObje_H),h             ;

                ex de,hl                        ;
                ld (iy+dObjeZ_L),l              ;
                ld (iy+dObjeZ_H),h              ;

                or a                            ;
                ret                             ;

AOnxt           ld l,(ix+dpnObje_L)             ;
                ld h,(ix+dpnObje_H)             ;

                ld a,l                          ;
                or h                            ;
                jr z,AOlast                     ;

AOnz            push hl                         ;
                pop ix                          ;

                ld l,(ix+dObjeZ_L)              ;
                ld h,(ix+dObjeZ_H)              ;
                or a                            ;
                sbc hl,de                       ;
                jp m,AOnxt                      ;

                ld l,(ix+dppObje_L)             ;
                ld h,(ix+dppObje_H)             ;
                ld (iy+dppObje_L),l             ;
                ld (iy+dppObje_H),h             ;

                push iy                         ;
                pop bc                          ;

                ld (ix+dppObje_L),c             ;
                ld (ix+dppObje_H),b             ;

                push ix                         ;
                push hl                         ;
                pop ix                          ;
                pop hl                          ;

                ld (iy+dpnObje_L),l             ;
                ld (iy+dpnObje_H),h             ;

                ld a,ixh                        ;
                or ixl                          ;
                jr z,AOb                        ;

                ld (ix+dpnObje_L),c             ;
                ld (ix+dpnObje_H),b             ;

                ex de,hl                        ;
                ld (iy+dObjeZ_L),l              ;
                ld (iy+dObjeZ_H),h              ;

                or a                            ;
                ret                             ;

AOb             ld hl,0                         ;
                ld (iy+dppObje_L),l             ;
                ld (iy+dppObje_H),h             ;

                ld (pObjeList),iy               ;

                ex de,hl                        ;
                ld (iy+dObjeZ_L),l              ;
                ld (iy+dObjeZ_H),h              ;

                or a                            ;
                ret                             ;

KillObje        ld de,dObjepLines_L             ;

                push ix                         ;
                pop iy                          ;

                add iy,de                       ;

                ld b,8                          ;

KOlines         push iy                         ;
                push bc                         ;

                ld l,(iy)                       ;
                ld h,(iy+1)                     ;
                call Undrawlp                   ;

                pop bc                          ;
                pop iy                          ;

                inc iy                          ;
                inc iy                          ;

                djnz KOlines                    ;

                ld l,(ix+dppObje_L)             ;
                ld h,(ix+dppObje_H)             ;
                ld a,l                          ;
                or h                            ;
                jr z,KOz                        ;

                push hl                         ;
                pop iy                          ;

                ld e,(ix+dpnObje_L)             ;
                ld d,(ix+dpnObje_H)             ;
                ld (iy+dpnObje_L),e             ;
                ld (iy+dpnObje_H),d             ;

                push de                         ;
                pop iy                          ;

                ld (iy+dppObje_L),l             ;
                ld (iy+dppObje_H),h             ;

KOx             ld hl,(pFreeObje)               ;
                ld (ix+dpnFreeObje_L),l         ;
                ld (ix+dpnFreeObje_H),h         ;

                ld (pFreeObje),ix               ;
                ret                             ;

KOz             ld e,(ix+dpnObje_L)             ;
                ld d,(ix+dpnObje_H)             ;
                ld (pObjeList),de               ;

                push de                         ;
                pop iy                          ;

                ld (iy+dppObje_L),l             ;
                ld (iy+dppObje_H),h             ;

                jp KOx                          ;

InitVectAdd     ld hl,(DeltaX)                  ;

                ld a,h                          ;
                ld (vaXh),a                     ;

                ld a,l                          ;
                ld (vaXl),a                     ;

                ld hl,(DeltaY)                  ;

                ld a,h                          ;
                ld (vaYh),a                     ;

                ld a,l                          ;
                ld (vaY1),a                     ;

                ld hl,(DeltaZ)                  ;

                ld a,h                          ;
                ld (vaZh),a                     ;

                ld a,l                          ;
                ld (vaZl),a                     ;

                ret                             ;

DoVectAdd       ld a,(hl)                       ;
                add a,0                         ;
vaXl            equ .-1                         ;
                ld (hl),a                       ;
                inc hl                          ;
                ld a,(hl)                       ;
                adc a,0                         ;
vaXh            equ .-1                         ;
                ld (hl),a                       ;
                inc hl                          ;

                ld a,(hl)                       ;
                add a,0                         ;
vaY1            equ .-1                         ;
                ld (hl),a                       ;
                inc hl                          ;
                ld a,(hl)                       ;
                adc a,0                         ;
vaYh            equ .-1                         ;
                ld (hl),a                       ;
                inc hl                          ;

                ld a,(hl)                       ;
                add a,0                         ;
vaZl            equ .-1                         ;
                ld (hl),a                       ;
                inc hl                          ;
                ld a,(hl)                       ;
                adc a,0                         ;
vaZh            equ .-1                         ;
                ld (hl),a                       ;

                ret                             ;

DoVectors       ld hl,(GroundX)                 ;
                ld de,(DeltaX)                  ;
                add hl,de                       ;
                ld (GroundX),hl                 ;

                ld hl,(GroundY)                 ;
                ld de,(DeltaY)                  ;
                add hl,de                       ;
                ld (GroundY),hl                 ;

                ld hl,(GroundZ)                 ;
                ld de,(DeltaZ)                  ;
                add hl,de                       ;
                ld (GroundZ),hl                 ;

                ret                             ;

ResMargin       ld hl,-127                      ;
                ld (MinX),hl                    ;
                ld (nMinX),hl                   ;
                ld (TopY),hl                    ;
                ld (nTopY),hl                   ;

                ld hl,127                       ;
                ld (MaxX),hl                    ;
                ld (BotY),hl                    ;

                ld hl,0                         ;
                ld (AMinX),hl                   ;
                ld (ATopY),hl                   ;

                ld hl,256                       ;
                ld (AMaxX),hl                   ;
                ld (ABotY),hl                   ;

                ret                             ;

SetRMargin      push hl                         ;
                push de                         ;

                ld de,(MaxX)                    ;
                or a                            ;
                sbc hl,de                       ;
                add hl,de                       ;

                jp p,SRMx                       ;

                ld de,128                       ;
                ld (MaxX),hl                    ;

                add hl,de                       ;
                ld (AMaxX),hl                   ;

SRMx            pop de                          ;
                pop hl                          ;
                ret                             ;

SetDMargin      push hl                         ;
                push de                         ;

                ld de,(BotY)                    ;
                or a                            ;
                sbc hl,de                       ;
                add hl,de                       ;

                jp p,SDMx                       ;

                ld de,128                       ;
                ld (BotY),hl                    ;

                add hl,de                       ;
                ld (ABotY),hl                   ;

SDMx            pop de                          ;
                pop hl                          ;
                ret                             ;

SetLMargin      push hl                         ;
                push de                         ;

                ld de,(MinX)                    ;
                or a                            ;
                sbc hl,de                       ;
                add hl,de                       ;

                jp m,SLMx                       ;

                ld de,128                       ;
                ld (MinX),hl                    ;

                add hl,de                       ;
                ld (AMinX),hl                   ;
                or a                            ;
                sbc hl,de                       ;

                call NegHL                      ;
                ld (nMinX),hl                   ;

SLMx            pop de                          ;
                pop hl                          ;
                ret                             ;

SetUMargin      push hl                         ;
                push de                         ;

                ld de,(TopY)                    ;
                or a                            ;
                sbc hl,de                       ;
                add hl,de                       ;

                jp m,SUMx                       ;

                ld de,128                       ;
                ld (TopY),hl                    ;

                add hl,de                       ;
                ld (ATopY),hl                   ;
                or a                            ;
                sbc hl,de                       ;

                call NegHL                      ;
                ld (nTopY),hl                   ;

SUMx            pop de                          ;
                pop hl                          ;
                ret                             ;

SetUpTabs       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                       ;
Ret02           ret                             ;

GenYTab         ld hl,YTable                    ;
                ld de,ScreenBase                ;
                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 a,(CType)                    ;
                ld hl,YTable+10                 ;
                ld b,156                        ;

                or a                            ;
                jr z,CLSa                       ;

                ld hl,YTable                    ;
                ld b,170                        ;

                cp 3                            ;
                jr c,CLSa                       ;

                ld hl,YTable                    ;
                ld b,192                        ;

CLSa            xor a                           ;

CLSlp           ld e,(hl)                       ;
                inc h                           ;
                ld d,(hl)                       ;
                dec h                           ;

                inc l                           ;

                push hl                         ;
                push bc                         ;

                ld h,d                          ;
                ld l,e                          ;
                inc de                          ;

                ld bc,$1F                       ;

                ld (hl),a                       ;

                ldir                            ;

                pop bc                          ;
                pop hl                          ;

                djnz CLSlp                      ;

                ld hl,$5820                     ;
                ld de,$5821                     ;
                ld bc,$27F                      ;

                ld (hl),$47                     ;
                ldir                            ;

                ret                             ;

Gen192Tab       ld bc,DivTab                    ;
                ld hl,$0D00                     ;
                ld de,$0099                     ;

                ld a,(CType)                    ;
                or a                            ;
                jr z,G192                       ;

                ld hl,$0000                     ;
                ld de,$00A7                     ; $a8 in v1.1
                cp 3                            ;
                jr c,G192                       ;

                ld hl,$0000                     ;
                ld de,191                       ;

G192            ld a,h                          ;
                ld (bc),a                       ;
                add hl,de                       ;
                inc c                           ;
                jr nz,G192                      ;

                ret                             ;

CAf             ld hl,0                         ;
                xor a                           ;

                scf                             ;
                ret                             ;

ClipAddr        ld bc,(BotY)                    ;
                or a                            ;
                sbc hl,bc                       ;
                jp p,CAf                        ;
                add hl,bc                       ;

                ld bc,(TopY)                    ;
                or a                            ;
                sbc hl,bc                       ;
                jp m,CAf                        ;
                add hl,bc                       ;

                ex de,hl                        ;

                ld bc,(MaxX)                    ;
                or a                            ;
                sbc hl,bc                       ;
                jp p,CAf                        ;
                add hl,bc                       ;

                ld bc,(MinX)                    ;
                or a                            ;
                sbc hl,bc                       ;
                jp m,CAf                        ;
                add hl,bc                       ;

                ex de,hl                        ;

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 $07                         ;
                ld e,a                          ;
                ld d,BitTab/256                 ;
                ld a,(de)                       ;
                ret                             ;

VB1             pop hl                          ;
                scf                             ;
                ret                             ;

VertLine        push hl                         ;

                or a                            ;
                sbc hl,de                       ;
                add hl,de                       ;

                jp p,HS1                        ;

                push bc                         ;

                ld bc,(BotY)                    ;
                or a                            ;
                sbc hl,bc                       ;

                jp p,HS1a                       ;

                ld hl,(TopY)                    ;
                or a                            ;
                sbc hl,de                       ;

                jp p,HS1a                       ;

                pop hl                          ;

                ld bc,(MaxX)                    ;
                or a                            ;
                sbc hl,bc                       ;
                jp p,HS1                        ;
                add hl,bc                       ;

                ld bc,(MinX)                    ;
                or a                            ;
                sbc hl,bc                       ;
                jp m,HS1                        ;
                add hl,bc                       ;

                ld bc,128                       ;
                add hl,bc                       ;

                ld a,l                          ;
                rrca                            ;
                rrca                            ;
                rrca                            ;
                and $1F                         ;
                ld (V1),a                       ;

                ld a,l                          ;
                rlca                            ;
                rlca                            ;
                rlca                            ;
                cpl                             ;
                and $38                         ;
                or $C6                          ;

                ld (vm0),a                      ;
                ld (vm1),a                      ;
                ld (vm2),a                      ;
                ld (vm3),a                      ;
                ld (vm4),a                      ;
                ld (vm5),a                      ;
                ld (vm6),a                      ;
                ld (vm7),a                      ;
                ld (vm8),a                      ;
                ld (vm9),a                      ;

                and $BF                         ;
                ld (iy+dLineBit),a              ;

                pop hl                          ;

                ld bc,(TopY)                    ;
                or a                            ;
                sbc hl,bc                       ;
                add hl,bc                       ;
                jp p,VS2                        ;

                ld h,b                          ;
                ld l,c                          ;

VS2             ld bc,128                       ;
                add hl,bc                       ;

                ex de,hl                        ;

                ld bc,(BotY)                    ;
                or a                            ;
                sbc hl,bc                       ;
                add hl,bc                       ;
                jp m,VS3                        ;

                ld h,b                          ;
                ld l,c                          ;

VS3             ld bc,128                       ;
                add hl,bc                       ;

                ex de,hl                        ;

                or a                            ;
                sbc hl,de                       ;
                add hl,de                       ;

                ret p                           ;

                ld h,DivTab/256                 ;
                ld d,DivTab/256                 ;
                ld a,(de)                       ;
                sub (hl)                        ;
                or a                            ;
                ret z                           ;

                inc a                           ;
                ld (iy+dLineB),a                ;
                ld b,a                          ;
                ld l,(hl)                       ;
                ld h,YTable/256                 ;
                ld a,0                          ;
V1              equ .-1                         ;
                ld c,a                          ;
                add a,(hl)                      ;
                ld (iy+dLineL),a                ;
                inc h                           ;
                ld a,(hl)                       ;
                ld (iy+dLineH),a                ;
                ld a,l                          ;
                rlca                            ;
                rlca                            ;
                and $03                         ;
                or $58                          ;
                ld (iy+dLineH1),a               ;
                ld d,a                          ;
                ld a,l                          ;
                rlca                            ;
                rlca                            ;
                and $E0                         ;
                or c                            ;
                ld (iy+dLineL1),a               ;
                ld e,a                          ;
                ld a,l                          ;
                and $07                         ;
                ld l,a                          ;
                ld h,BitTab/256                 ;
                ld a,(Colour)                   ;
                ld c,a                          ;
                ld a,(hl)                       ;
                ld (iy+dLineA),a                ;
                ex de,hl                        ;
                ld de,$0020                     ;
                exx                             ;
                ld c,$1F                        ;
                ld b,(iy+dLineB)                ;
                ld l,(iy+dLineL)                ;
                ld h,(iy+dLineH)                ;
                call vl1                        ;
VS4             ld (iy+dpLineAlg_L),Vert10 & $FF;
                ld (iy+dpLineAlg_H),Vert10 / 256;

                scf                             ;
                ret                             ;

vl1             dec b                           ;
                ret z                           ;
                set 0,(hl)                      ; SMC
vm0             equ .-1                         ;
                inc h                           ;
                rrca                            ;
                jp nc,vl1                       ;
                ld a,l                          ;
                adc a,c                         ;
                ld l,a                          ;
                jr c,vl2                        ;
                ld a,h                          ;
                sub 8                           ;
                ld h,a                          ;
vl2             exx                             ;
                ld (hl),c                       ;
                add hl,de                       ;
                exx                             ;
                ld a,b                          ;
                rrca                            ;
                rrca                            ;
                rrca                            ;
                and $1F                         ;
                jr z,vl3                        ;
vl4             set 0,(hl)                      ;
vm1             equ .-1                         ;
                inc h                           ;
                set 0,(hl)                      ;
vm2             equ .-1                         ;
                inc h                           ;
                set 0,(hl)                      ;
vm3             equ .-1                         ;
                inc h                           ;
                set 0,(hl)                      ;
vm4             equ .-1                         ;
                inc h                           ;
                set 0,(hl)                      ;
vm5             equ .-1                         ;
                inc h                           ;
                set 0,(hl)                      ;
vm6             equ .-1                         ;
                inc h                           ;
                set 0,(hl)                      ;
vm7             equ .-1                         ;
                inc h                           ;
                set 0,(hl)                      ;
vm8             equ .-1                         ;
                inc h                           ;
                ex af,af'                       ;
                ld a,(cSoundVal)                ;
                xor $F8                         ;
SoundFlagVL     equ .-1                         ;

                ld (cSoundVal),a                ;
                out (SoundPort),a               ;

                ld a,l                          ;
                add a,$20                       ;
                ld l,a                          ;
                jr c,vl6                        ;
                ld a,h                          ;
                sub $08                         ;
                ld h,a                          ;
vl6             exx                             ;
                ld (hl),c                       ;
                add hl,de                       ;
                exx                             ;
                ex af,af'                       ;
                dec a                           ;
                jr nz,vl4                       ;
vl3             ld a,b                          ;
                and $07                         ;
                ret z                           ;
                ld b,a                          ;
vl5             set 0,(hl)                      ;
vm9             equ .-1                         ;
                inc h                           ;
                djnz vl5                        ;
                exx                             ;
                ld (hl),c                       ;
                exx                             ;
                ret                             ;

Vert10          ld l,(iy+dLineL1)               ;
                ld h,(iy+dLineH1)               ;
                ld de,$0020                     ;
                ld a,(GameAttr)                 ;
                ld c,a                          ;
                exx                             ;
                ld a,(iy+dLineBit)              ;
                ld (vm0),a                      ;
                ld (vm1),a                      ;
                ld (vm2),a                      ;
                ld (vm3),a                      ;
                ld (vm4),a                      ;
                ld (vm5),a                      ;
                ld (vm6),a                      ;
                ld (vm7),a                      ;
                ld (vm8),a                      ;
                ld (vm9),a                      ;
                ld a,(iy+dLineA)                ;
                ld b,(iy+dLineB)                ;
                ld l,(iy+dLineL)                ;
                ld h,(iy+dLineH)                ;
                ld c,$1F                        ;
                jp vl1                          ;

HS1a            pop bc                          ;
HS1             pop hl                          ;
                or a                            ;
                ret                             ;

HpS             defw 0                          ;
HpA             defw 0                          ;

HoriLineEx      xor a                           ;

                ld (HLsmc),a                    ;

                out (SoundPort),a               ;

                call HoriLine                   ;

                ld a,$F8                        ;
SoundFlagHLX    equ .-1                         ;

                out (SoundPort),a               ;

                ld a,$FF                        ;
                ld (HLsmc),a                    ;

                ret                             ;

HoriLine        push hl                         ;

                or a                            ;
                sbc hl,de                       ;
                add hl,de                       ;

                jp p,HS1                        ;

                push bc                         ;

                ld bc,(MaxX)                    ;
                or a                            ;
                sbc hl,bc                       ;

                jp p,HS1a                       ;

                ld hl,(MinX)                    ;
                or a                            ;
                sbc hl,de                       ;

                jp p,HS1a                       ;

                pop bc                          ;

                ld hl,128                       ;
                add hl,bc                       ;

                ld bc,(ABotY)                   ;
                or a                            ;
                sbc hl,bc                       ;
                jp p,HS1                        ;
                add hl,bc                       ;

                ld bc,(ATopY)                   ;
                or a                            ;
                sbc hl,bc                       ;
                jp m,HS1                        ;
                add hl,bc                       ;

                ld h,DivTab/256                 ;
                ld l,(hl)                       ;

                ld h,YTable/256                 ;

                ld c,(hl)                       ;
                inc h                           ;
                ld b,(hl)                       ;

                ld (HpS),bc                     ;

                ld (iy+dLineH),b                ;

                ld a,l                          ;
                rlca                            ;
                rlca                            ;
                and $03                         ;
                or $58                          ;
                ld h,a                          ;

                ld a,l                          ;
                rlca                            ;
                rlca                            ;
                and $E0                         ;
                ld l,a                          ;
                ld (HpA),hl                     ;
                ld (iy+dLineD),h                ;

                pop hl                          ;

                ld bc,(MinX)                    ;
                or a                            ;
                sbc hl,bc                       ;
                add hl,bc                       ;
                jp p,HS2                        ;

                ld h,b                          ;
                ld l,c                          ;

HS2             ld bc,128                       ;
                add hl,bc                       ;

                ex de,hl                        ;

                ld bc,(MaxX)                    ;
                or a                            ;
                sbc hl,bc                       ;
                add hl,bc                       ;
                jp m,HS3                        ;

                ld h,b                          ;
                ld l,c                          ;

HS3             ld bc,128                       ;
                add hl,bc                       ;

                ex de,hl                        ;
                or a                            ;
                sbc hl,de                       ;
                add hl,de                       ;

                ret p                           ;

                ld a,e                          ;
                sub l                           ;
                or a                            ;
                ret z                           ;

                ld a,l                          ;
                and $07                         ;
                add a,8                         ;
                ld c,a                          ;
                ld b,BitTab/256                 ;
                ld a,(bc)                       ;
                ld (iy+dLineA),a                ;
                ld a,e                          ;
                and $07                         ;
                add a,16                        ;
                ld c,a                          ;
                ld a,(bc)                       ;
                ld (iy+dLineA1),a               ;
                ld a,l                          ;
                rrca                            ;
                rrca                            ;
                rrca                            ;
                and $1F                         ;
                ld l,a                          ;
                ld a,e                          ;
                rrca                            ;
                rrca                            ;
                rrca                            ;
                and $1F                         ;
                ld e,a                          ;
                ld a,(HpS)                      ;
                or l                            ;
                ld (HpS),a                      ;
                ld (iy+dLineL),a                ;
                ld a,(HpA)                      ;
                or l                            ;
                ld (HpA),a                      ;
                ld (iy+dLineE),a                ;
                ld a,e                          ;
                sub l                           ;
                jr z,HS4                        ;
                ld (iy+dLineB),a                ;
                ld hl,(HpS)                     ;
                ld de,(HpA)                     ;
                ld b,a                          ;
                ld a,(Colour)                   ;
                ld c,a                          ;
                ld a,(iy+dLineA1)               ;
                ex af,af'                       ;
                ld a,(iy+dLineA)                ;
                call HoriS                      ;
                ld (iy+dpLineAlg_L),HS6 & $FF   ;
                ld (iy+dpLineAlg_H),HS6 / 256   ;

                set bOnScreen,(ix+dObjeFlags)   ;

                scf                             ;
                ret                             ;

HS4             ld hl,(HpA)                     ;
                ld a,(Colour)                   ;
                ld (hl),a                       ;
                ld hl,(HpS)                     ;
                ld a,(iy+dLineA)                ;
                and (iy+dLineA1)                ;
                or (hl)                         ;
                ld (hl),a                       ;
                ld (iy+dpLineAlg_L),HS5 & $FF ;
                ld (iy+dpLineAlg_H),HS5 / 256   ;

                set bOnScreen,(ix+dObjeFlags)   ;

                scf                             ;
                ret                             ;

HS5             ld l,(iy+dLineE)                ;
                ld h,(iy+dLineD)                ;

                ld a,(GameAttr)                 ;
                ld (hl),a                       ;

                ld l,(iy+dLineL)                ;
                ld h,(iy+dLineH)                ;
                ld a,(iy+dLineA)                ;
                and (iy+dLineA1)                ;
                cpl                             ;
                and (hl)                        ;
                ld (hl),a                       ;

                ret                             ;

HS6             ld l,(iy+dLineL)                ;
                ld h,(iy+dLineH)                ;

                ld e,(iy+dLineE)                ;
                ld d,(iy+dLineD)                ;

                ld b,(iy+dLineB)                ;
                ld a,(iy+dLineA1)               ;
                cpl                             ;
                ex af,af'                       ;
                ld a,(GameAttr)                 ;
                ld c,a                          ;
                ld a,(iy+dLineA)                ;
                cpl                             ;
                and (hl)                        ;
                ld (hl),a                       ;
                ld a,c                          ;
                ld (de),a                       ;
                inc l                           ;
                inc e                           ;
                djnz Hori0a                     ;
                ld (de),a                       ;
                ex af,af'                       ;
                and (hl)                        ;
                ld (hl),a                       ;
                ret                             ;

Hori0a          ld c,$00                        ;
Hori1a          ld (hl),c                       ;
                ld (de),a                       ;
                inc l                           ;
                inc e                           ;
                djnz Hori1a                     ;
                ld (de),a                       ;
                ex af,af'                       ;
                and (hl)                        ;
                ld (hl),a                       ;
                ret                             ;

HoriS           or (hl)                         ;
                ld (hl),a                       ;
                ld a,c                          ;
                ld (de),a                       ;
                inc l                           ;
                inc e                           ;
                djnz Hori0                      ;
                ld (de),a                       ;
                ex af,af'                       ;
                or (hl)                         ;
                ld (hl),a                       ;
                ret                             ;

Hori0           ld c,$FF                        ;
HLsmc           equ .-1                         ;
Hori1           ld (hl),c                       ;
                ld (de),a                       ;
                inc l                           ;
                inc e                           ;
                djnz Hori1                      ;
                ld (de),a                       ;
                ex af,af'                       ;
                or (hl)                         ;
                ld (hl),a                       ;
                ret                             ;

CalcEdges       push bc                         ;

                xor a                           ;

                ld bc,(AMaxX)                   ;

                sbc hl,bc                       ;
                add hl,bc                       ;

                jp p,CEgx                       ;

                ld bc,(AMinX)                   ;

                or a                            ;
                sbc hl,bc                       ;
                jp m,CElx                       ;
                add hl,bc                       ;

CEY             ex de,hl                        ;

                ld bc,(ABotY)                   ;
                or a                            ;
                sbc hl,bc                       ;
                add hl,bc                       ;

                jp p,CEgy                       ;

                ld bc,(ATopY)                   ;

                or a                            ;
                sbc hl,bc                       ;
                jp m,CEly                       ;
                add hl,bc                       ;

                ex de,hl                        ;

                pop bc                          ;
                ret                             ;

CEgx            or $02                          ;
                jp CEY                          ;

CElx            or $01                          ;
                add hl,bc                       ;
                jp CEY                          ;

CEgy            or $04                          ;
                ex de,hl                        ;
                pop bc                          ;
                ret                             ;

CEly            or $08                          ;
                add hl,bc                       ;
                ex de,hl                        ;
                pop bc                          ;
                ret                             ;

ClipThing       ld bc,128                       ;
                add hl,bc                       ;
                ld (ctX2),hl                    ;
                ex de,hl                        ;
                add hl,bc                       ;
                ld (ctX1),hl                    ;
                exx                             ;
                ld bc,128                       ;
                add hl,bc                       ;
                ld (ctY2),hl                    ;
                ex de,hl                        ;
                add hl,bc                       ;
                ld (ctY1),hl                    ;
                ld hl,0                         ;
ctX1            equ .-2                         ;
                ld de,0                         ;
ctY1            equ .-2                         ;
                call CalcEdges                  ;
                ld b,a                          ;
                ld hl,0                         ;
ctX2            equ .-2                         ;
                ld de,0                         ;
ctY2            equ .-2                         ;
                call CalcEdges                  ;
                ld c,a                          ;
                or b                            ;
                ret z                           ;
                ld a,c                          ;
                and b                           ;
                scf                             ;
                ret nz                          ;
                ld hl,(ctX1)                    ;
                ld (PaX),hl                     ;
                ld hl,(ctY1)                    ;
                ld (PaY),hl                     ;
                ld hl,(ctX2)                    ;
                ld (PbX),hl                     ;
                ld hl,(ctY2)                    ;
                ld (PbY),hl                     ;
                call ClipInner                  ;
                ret c                           ;
                ld hl,(PaX)                     ;
                ld (ctX2),hl                    ;
                ld hl,(PaY)                     ;
                ld (ctY2),hl                    ;
                ld hl,(ctX1)                    ;
                ld (PbX),hl                     ;
                ld hl,(ctY1)                    ;
                ld (PbY),hl                     ;
                call ClipInner                  ;
                ret c                           ;
                ld hl,(PaX)                     ;
                ld (ctX1),hl                    ;
                ld hl,(PaY)                     ;
                ld (ctY1),hl                    ;
                or a                            ;
                ret                             ;

ClipInner       ld hl,0                         ;
PbX             equ .-2                         ;
                ld de,0                         ;
PbY             equ .-2                         ;
                ld (PmX),hl                     ;
                ld (PmY),de                     ;
                call CalcEdges                  ;
                or a                            ;
                jr nz,C2                        ;
                ld (PaX),hl                     ;
                ld (PaY),de                     ;
                ret                             ;

C2              ld hl,0                         ;
PaX             equ .-2                         ;
                ld de,0                         ;
PaY             equ .-2                         ;
                call CalcEdges                  ;
                ld b,a                          ;
                ld hl,0                         ;
PmX             equ .-2                         ;
                ld de,0                         ;
PmY             equ .-2                         ;
                call CalcEdges                  ;
                and b                           ;
                scf                             ;
                ret nz                          ;
                ld hl,(PmX)                     ;
                ld de,(PaX)                     ;
                or a                            ;
                sbc hl,de                       ;
                sra h                           ;
                rr l                            ;
                ld de,(PaX)                     ;
                add hl,de                       ;
                ld (PmX),hl                     ;
                ld hl,(PmY)                     ;
                ld de,(PaY)                     ;
                or a                            ;
                sbc hl,de                       ;
                sra h                           ;
                rr l                            ;
                ld de,(PaY)                     ;
                add hl,de                       ;
                ld (PmY),hl                     ;
                call TestPm                     ;
                ret z                           ;
                ld hl,(PbX)                     ;
                ld de,(PbY)                     ;
                call CalcEdges                  ;
                ld b,a                          ;
                ld hl,(PmX)                     ;
                ld de,(PmY)                     ;
                call CalcEdges                  ;
                and b                           ;
                jr z,C4a                        ;
                ld (PbX),hl                     ;
                ld (PbY),de                     ;
                jp C2                           ;

C4a             ld (PaX),hl                     ;
                ld (PaY),de                     ;
                ld hl,(PbX)                     ;
                ld de,(PbY)                     ;
                ld (PmX),hl                     ;
                ld (PmY),de                     ;
                jp C2                           ;

TestPm          ld hl,(PmX)                     ;
                ld de,(PaX)                     ;
                or a                            ;
                sbc hl,de                       ;
                jr nz,TPm1                      ;
                ld hl,(PmY)                     ;
                ld de,(PaY)                     ;
                or a                            ;
                sbc hl,de                       ;
                ret z                           ;
TPm1            ld hl,(PmX)                     ;
                ld de,(PbX)                     ;
                or a                            ;
                sbc hl,de                       ;
                ret nz                          ;
                ld hl,(PmY)                     ;
                ld de,(PbY)                     ;
                or a                            ;
                sbc hl,de                       ;
                ret                             ;

ALOld           push ix                         ;
                ld a,(iy+dLineSxx)              ;
                ld (OAxx),a                     ;
                ld a,(iy+dLineSyy)              ;
                ld (OAyy),a                     ;
                ld a,(iy+dLineHV)               ;
                ld (OAHV),a                     ;
                ld l,(iy+dLineIX_L)             ;
                ld h,(iy+dLineIX_H)             ;
                push hl                         ;
                pop ix                          ;
                ld c,(iy+dLineC1)               ;
                ld e,(iy+dLineE1)               ;
                ld l,(iy+dLineL1)               ;
                exx                             ;
                ld b,(iy+dLineB)                ;
                ld c,(iy+dLineC)                ;
                ld e,(iy+dLineE)                ;
                ld l,(iy+dLineL)                ;
                ld h,(iy+dLineH)                ;
                ld a,(GameAttr)                 ;
                ld d,a                          ;
                ld a,(hl)                       ;
OA1             cpl                             ;
                or c                            ;
                cpl                             ;
                exx                             ;
                ex af,af'                       ;
                ld a,l                          ;
                sub e                           ;
                jr c,OA3                        ;
                ld l,a                          ;
                exx                             ;
                ex af,af'                       ;
                call Incxx                      ;
OAHV            equ .-2                         ;
                djnz OA1                        ;
                ld (hl),a                       ;
OA3x            ld a,c                          ;
                and e                           ;
                jp m,OA3a                       ;
                ld (ix+dpnObje_L),d             ;
OA3a            pop ix                          ;
                ret                             ;

OA3             add a,c                         ;
                ld l,a                          ;
                ex af,af'                       ;
                exx                             ;
                call Incxx                      ;
OAxx            equ .-2                         ;
                call Incxx                      ;
OAyy            equ .-2                         ;
                ld (hl),a                       ;
                djnz OA1                        ;
                jp OA3x                         ;

AnyLine         call ClipThing                  ;
                ccf                             ;
                ret nc                          ;

                ld a,(ctX1)                     ;
                ld e,a                          ;
                srl e                           ;
                srl e                           ;
                srl e                           ;
                and $07                         ;
                ld l,a                          ;
                ld h,BitTab/256                 ;
                ld c,(hl)                       ;
                ld h,DivTab/256                 ;
                ld a,(ctY1)                     ;
                ld l,a                          ;
                ld a,(hl)                       ;
                ld (ctY1),a                     ;
                ld d,a                          ;
                rlca                            ;
                rlca                            ;
                and $03                         ;
                or $58                          ;
                ld (IX_h),a                     ;
                ld (iy+dLineIX_H),a             ;
                ld a,d                          ;
                rlca                            ;
                rlca                            ;
                and $E0                         ;
                or e                            ;
                ld (IX_l),a                     ;
                ld (iy+dLineIX_L),a             ;
                ld a,(ctY2)                     ;
                ld l,a                          ;
                ld a,(hl)                       ;
                ld (ctY2),a                     ;
                ld a,d                          ;
                and $07                         ;
                ld l,a                          ;
                ld h,BitTab/256                 ;
                ld b,(hl)                       ;
                exx                             ;
                push ix                         ;
                push iy                         ;
                ld iy,Incyy                     ;
                ld ix,Incxx                     ;
                ld de,(ctY1)                    ;
                ld hl,(ctY2)                    ;
                or a                            ;
                sbc hl,de                       ;
                jp p,LineA                      ;
                ld a,l                          ;
                cpl                             ;
                ld l,a                          ;
                ld a,h                          ;
                cpl                             ;
                ld h,a                          ;
                inc hl                          ;
                ld iy,Decyy                     ;
LineA           ld c,l                          ;
                ld b,h                          ;
                ld de,(ctX1)                    ;
                ld hl,(ctX2)                    ;
                or a                            ;
                sbc hl,de                       ;
                jp p,LineB                      ;
                ld a,l                          ;
                cpl                             ;
                ld l,a                          ;
                ld a,h                          ;
                cpl                             ;
                ld h,a                          ;
                inc hl                          ;
                ld ix,Decxx                     ;
LineB           ld (sxxVector),ix               ;
                ld (syyVector),iy               ;
                or a                            ;
                sbc hl,bc                       ;
                add hl,bc                       ;
                jp m,LineC                      ;
                ld (HorizVector),ix             ;
                ld e,c                          ;
                ld d,b                          ;
                ld c,l                          ;
                ld b,h                          ;
                jp LineD                        ;

LineC           ld (HorizVector),iy             ;
                ld e,l                          ;
                ld d,h                          ;
                ld l,c                          ;
                ld h,b                          ;
LineD           sra h                           ;
                rr l                            ;
                ld a,c                          ;
                exx                             ;
                pop iy                          ;
                pop ix                          ;
                scf                             ;
                ccf                             ;
                ret z                           ;
                ex af,af'                       ;
                ld h,YTable/256                 ;
                ld l,d                          ;
                ld a,(hl)                       ;
                add a,e                         ;
                inc h                           ;
                ld h,(hl)                       ;
                ld l,a                          ;
                ex af,af'                       ;
                ld e,b                          ;
                ld b,a                          ;
                ld (iy+dpLineAlg_L),ALOld & $FF;
                ld (iy+dpLineAlg_H),ALOld / 256 ;
                ld (iy+dLineL),l                ;
                ld (iy+dLineH),h                ;
                ld (iy+dLineE),e                ;
                ld (iy+dLineC),c                ;
                ld (iy+dLineB),b                ;
                exx                             ;
                ld (iy+dLineL1),l               ;
                ld (iy+dLineE1),e               ;
                ld (iy+dLineC1),c               ;
                exx                             ;
                ld a,(Colour)                   ;
                ld d,a                          ;
                push ix                         ;
                ld ix,$0000                     ;
IX_l            equ .-2                         ;
IX_h            equ .-1                         ;
                ld a,(hl)                       ;
LineAlg         or c                            ;
                exx                             ;
                ex af,af'                       ;
                ld a,l                          ;
                sub e                           ;
                jr c,LineAlg1                   ;
                ld l,a                          ;
                exx                             ;
                ex af,af'                       ;
                call Ret02                      ;
HorizVector     equ .-2                         ;
                djnz LineAlg                    ;
                jp LineX                        ;

LineAlg1        add a,c                         ;
                ld l,a                          ;
                exx                             ;
                ex af,af'                       ;
                call Ret02                      ;
sxxVector       equ .-2                         ;
                call Ret02                      ;
syyVector       equ .-2                         ;
                djnz LineAlg                    ;
LineX           ld (hl),a                       ;
                ld a,e                          ;
                and c                           ;
                jp m,LineXa                     ;
                ld (ix+dpnObje_L),d             ;
LineXa          pop ix                          ;
                ld a,(sxxVector)                ;
                ld (iy+dLineSxx),a              ;
                ld a,(syyVector)                ;
                ld (iy+dLineSyy),a              ;
                ld a,(HorizVector)              ;
                ld (iy+dLineHV),a               ;

                set bOnScreen,(ix+dObjeFlags)   ;

                scf                             ;
                ret                             ;

;  Align to a page boundary

                align 256			;

Incxx           rrc c                           ;
                ret nc                          ;
                ld (hl),a                       ;
                ld (ix),d                       ;
                inc ixl                         ;
                inc l                           ;

                ld a,r                          ;
                and $F8                         ;
SoundFlagAL     equ .-1                         ;

                out (SoundPort),a               ;

                ld a,(hl)                       ;
                ret                             ;

Decxx           rlc c                           ;
                ret nc                          ;
                ld (hl),a                       ;
                ld (ix),d                       ;
                dec ixl                         ;
                dec l                           ;

                ld a,r                          ;
                and $F8                         ;
SoundFlagAL1    equ .-1                         ;

                out (SoundPort),a               ;

                ld a,(hl)                       ;
                ret                             ;

Incyy           ld (hl),a                       ;
                inc h                           ;
                rrc e                           ;
                ld a,(hl)                       ;
                ret nc                          ;
                ld (ix),d                       ;
                push bc                         ;
                ld bc,$20                       ;
                add ix,bc                       ;
                pop bc                          ;
                ld a,l                          ;
                add a,$20                       ;
                ld l,a                          ;
                ld a,(hl)                       ;
                ret c                           ;
                ld a,h                          ;
                sub $08                         ;
                ld h,a                          ;
                ld a,(hl)                       ;
                ret                             ;

Decyy           ld (hl),a                       ;
                dec h                           ;
                rlc e                           ;
                ld a,(hl)                       ;
                ret nc                          ;
                ld (ix),d                       ;
                push bc                         ;
                ld bc,-$20                      ;
                add ix,bc                       ;
                pop bc                          ;
                ld a,l                          ;
                sub $20                         ;
                ld l,a                          ;
                ld a,(hl)                       ;
                ret c                           ;
                ld a,h                          ;
                add a,$08                       ;
                ld h,a                          ;
                ld a,(hl)                       ;
                ret                             ;

MinX            defs 2                          ;
nMinX           defs 2                          ;
MaxX            defs 2                          ;

TopY            defs 2                          ;
nTopY           defs 2                          ;
BotY            defs 2                          ;

AMinX           defs 2                          ;
AMaxX           defs 2                          ;
ATopY           defs 2                          ;
ABotY           defs 2                          ;

pFreeObje       defs 2                          ;

cObjeZ          defs 2                          ;

ObjeSeq         defs nObjes*4*2                 ;

pFreeLines      defs 2                          ;

;  End of SUBS

DoRhino         ld a,(DDamage)                  ;
                ld (RhinoDamage),a              ;

                ld a,DamFSD                     ;
                ld (DDamage),a                  ;

                ld hl,(DScore)                  ;
                ld (RhinoScore),hl              ;

                ld hl,0                         ;
                ld (DScore),hl                  ;

                ld hl,Ret0                      ;
                ld (cFlashRoutine),hl           ;

                ld hl,sRhino                    ;
                call vAddScroll                 ;

                halt                            ;
                halt                            ;

PlayRhino       xor a                           ;
                ld (nRhinos),a                  ;

RhinoPlay       call CLS                        ;

                call RhinoInc                   ;

                call RhinoInit                  ;

                call RhinoDisp                  ;

RhinoLoop       call RhinoManMove               ;

                call MoveRhino                  ;

                ld b,200                        ;
                djnz $                          ;

                ld a,(RhinoEnd)                 ;
                cp 1                            ;
                jr z,RhinoFini                  ;

                ld a,(ADamage)                  ;
                or a                            ;
                jr nz,RhinoLoop                 ;

                ld hl,sRhino1                   ;
                call vAddScroll                 ;

                ld b,170                        ;

Rlx             halt                            ;
                djnz Rlx                        ;

                ld hl,(RhinoScore)              ;
                ld (DScore),hl                  ;

                ld a,(RhinoDamage)              ;
                ld (DDamage),a                  ;

                ret                             ;

RhinoFini       ld a,$10                        ;
                call AddScore                   ;

                ld b,20                         ;
                call AlwaysDoDamage             ;

                jp RhinoPlay                    ;

RhinoClear      push hl                         ;

                call RhinoMUp                   ;
                ld (hl),1                       ;

                call RhinoMRight                ;
                ld (hl),1                       ;

                call RhinoMDown                 ;
                ld (hl),1                       ;

                call RhinoMDown                 ;
                ld (hl),1                       ;

                call RhinoMLeft                 ;
                ld (hl),1                       ;

                call RhinoMLeft                 ;
                ld (hl),1                       ;

                call RhinoMUp                   ;
                ld (hl),1                       ;

                call RhinoMUp                   ;
                ld (hl),1                       ;

                pop hl                          ;
                ret                             ;

RhinoInc        ld a,(nRhinos)                  ;
                inc a                           ;
                cp 16                           ;
                ret z                           ;
                ld (nRhinos),a                  ;
                ret                             ;

RhinoGetPos     push de                         ;

                call Rand                       ;

                ld a,e                          ;
                pop de                          ;

                ld l,a                          ;
                ld h,RhinoMap / 256             ;

                ld a,(hl)                       ;
                or a                            ;
                jr nz,RhinoGetPos               ;

                ret                             ;

RhinoInit       ld hl,RhinoMap                  ;
                ld b,0                          ;
                xor a                           ;
                ld (RhinoEnd),a                 ;

RIlp            ld (hl),a                       ;
                inc hl                          ;

                djnz RIlp                       ;

                ld hl,RhinoMap+$11              ;
                call RhinoClear                 ;
                ld (RhinoManPos),hl             ;

                ld a,cRhinoMan                  ;
                ld (hl),a                       ;
                call RhinoPrint                 ;

                ld hl,RhinoMap+$EE              ;
                call RhinoClear                 ;

                ld a,cRhinoExit                 ;
                ld (hl),a                       ;
                call RhinoPrint                 ;

                ld b,20                         ;

RIlp1           call RhinoGetPos                ;

                ld (hl),cRhinoTree              ;

                djnz RIlp1                      ;

                ld a,(nRhinos)                  ;
                ld b,a                          ;

                ld ix,RhinoList                 ;

RIlp2           push bc                         ;

                call RhinoGetPos                ;

                ld (hl),cRhinoTree              ;

                ld (ix+dRhinoPos_L),l           ;
                ld (ix+dRhinoPos_H),h           ;

                ld a,r                          ;
                and $7F                         ;
                add a,65                        ;
                ld (ix+dRhinoiSpeed),a          ;
                ld (ix+dRhinoSpeed),1           ;
                ld (ix+dRhinoFlag),0            ;

                ld bc,lRhino                    ;
                add ix,bc                       ;

                pop bc                          ;

                djnz RIlp2                      ;

                ld b,4                          ;

RIlp5           call RhinoGetPos                ;

                ld (hl),cRhinoFuel              ;

                djnz RIlp5                      ;

                ld hl,RhinoMap                  ;

RIlp3           ld a,(hl)                       ;
                dec a                           ;
                jr nz,RIlp3a                    ;
                ld (hl),a                       ;

RIlp3a          inc l                           ;
                jr nz,RIlp3                     ;

                ret                             ;

MoveRhino       ld a,(nRhinos)                  ;
                ld b,a                          ;
                ld ix,RhinoList                 ;

MRlp            push bc                         ;

                dec (ix+dRhinoSpeed)            ;
                jr nz,MR3                       ;

                ld a,(ix+dRhinoiSpeed)          ;
                ld (ix+dRhinoSpeed),a           ;

MR1             ld a,(ix+dRhinoFlag)            ;
                or a                            ;
                jr nz,MR2                       ;

                ld l,(ix+dRhinoPos_L)           ;
                ld h,(ix+dRhinoPos_H)           ;

                call RhinoVector                ;
                call RhinoLook                  ;
                jr nc,MR3                       ;

MR2             ld (ix+dRhinoFlag),1            ;

                ld l,(ix+dRhinoPos_L)           ;
                ld h,(ix+dRhinoPos_H)           ;

                call RhinoVector                ;

                call VectorAdd                  ;

                ld a,(hl)                       ;
                or a                            ;
                jr nz,MR3a                      ;

MR3c            ex de,hl                        ;
                ld l,(ix+dRhinoPos_L)           ;
                ld h,(ix+dRhinoPos_H)           ;
                ld a,(hl)                       ;
                cp cRhinoChar                   ;
                jr nz,MR2b                      ;

                xor a                           ;
                ld (hl),a                       ;
                call RhinoPrint                 ;

MR2b            ex de,hl                        ;
                ld a,cRhinoChar                 ;
                ld (hl),a                       ;
                call RhinoPrint                 ;

                ld (ix+dRhinoPos_L),l           ;
                ld (ix+dRhinoPos_H),h           ;

MR3             ld bc,lRhino                    ;
                add ix,bc                       ;

                pop bc                          ;

                djnz MRlp                       ;

                ret                             ;

MR3a            cp cRhinoFuel                   ;
                jr nz,MR3b                      ;

                sra (ix+dRhinoiSpeed)           ;

                jr MR3c                         ;

MR3b            cp cRhinoMan                    ;
                jr nz,MR3                       ;

                call RhinoHit                   ;

                jr MR3                          ;

RhinoVector     ld a,l                          ;
                and $0F                         ;
                ld e,a                          ;

                ld a,(RhinoManPos)              ;
                and $0F                         ;

                sub e                           ;

                ld d,0                          ;
                jr z,RVa                        ;

                ld d,$01                        ;
                jp p,RVa                        ;

                ld d,$02                        ;

RVa             ld a,l                          ;
                rrca                            ;
                rrca                            ;
                rrca                            ;
                rrca                            ;
                and $0F                         ;
                ld e,a                          ;

                ld a,(RhinoManPos)              ;
                rrca                            ;
                rrca                            ;
                rrca                            ;
                rrca                            ;
                and $0F                         ;
                sub e                           ;

                ret z                           ;

                set 2,d                         ;
                ret p                           ;

                ld a,d                          ;
                xor $0C                         ;
                ld d,a                          ;
                ret                             ;

VectorAdd       bit 0,d                         ;
                call nz,RhinoMRight             ;

                bit 1,d                         ;
                call nz,RhinoMLeft              ;

                bit 2,d                         ;
                call nz,RhinoMDown              ;

                bit 3,d                         ;
                call nz,RhinoMUp                ;

                ret                             ;

RhinoLook       ld b,h                          ;
                ld c,l                          ;

                call VectorAdd                  ;

                or a                            ;
                sbc hl,bc                       ;
                add hl,bc                       ;
                scf                             ;
                ccf                             ;
                ret z                           ;

                ld a,(hl)                       ;
                or a                            ;
                jr z,RhinoLook                  ;

                cp cRhinoMan                    ;
                scf                             ;
                ret z                           ;

                cp cRhinoTree                   ;
                jr nz,RhinoLook                 ;

                or a                            ;
                ret                             ;

RhinoDisp       ld hl,RhinoMap                  ;
                ld b,0                          ;

RDlp            ld a,(hl)                       ;
                call RhinoPrint                 ;

                inc hl                          ;

                djnz RDlp                       ;

                ret                             ;

RhinoPrint      push de                         ;
                push bc                         ;
                push af                         ;

                ld a,l                          ;
                and $0F                         ;
                ld e,a                          ;

                ld a,l                          ;
                rrca                            ;
                rrca                            ;
                rrca                            ;
                rrca                            ;
                and $0F                         ;
                ld d,a                          ;

                pop af                          ;

                or a                            ;
                jr z,RPa                        ;

                call PrintMap                   ;

                pop bc                          ;
                pop de                          ;
                ret                             ;

RPa             ld a,cRhinoBlank                ;
                call PrintMap                   ;

                pop bc                          ;
                pop de                          ;
                ret                             ;

RhinoManMove    ld hl,RhinoManSpeed             ;
                dec (hl)                        ;
                ret nz                          ;

                ld (hl),30                      ;

                ld hl,(RhinoManPos)             ;

                call kLeft                      ;
                call nz,RhinoMLeft              ;

                call kRight                     ;
                call nz,RhinoMRight             ;

                call kUp                        ;
                call nz,RhinoMUp                ;

                call kDown                      ;
                call nz,RhinoMDown              ;

                ld a,(hl)                       ;
                or a                            ;
                jr z,RMMa                       ;

                cp cRhinoExit                   ;
                jr nz,RMMb                      ;

                ld a,1                          ;
                ld (RhinoEnd),a                 ;

RMMa            ex de,hl                        ;
                ld hl,(RhinoManPos)             ;

                xor a                           ;
                ld (hl),a                       ;
                call RhinoPrint                 ;

                ex de,hl                        ;
                ld a,cRhinoMan                  ;
                ld (hl),a                       ;
                call RhinoPrint                 ;

                ld (RhinoManPos),hl             ;
                ret                             ;

RMMb            cp cRhinoFuel                   ;
                jr nz,RMMc                      ;

                push hl                         ;

                ld b,20                         ;
                call AlwaysDoDamage             ;

                ld a,1                          ;
                call AddScore                   ;

                pop hl                          ;

                jr RMMa                         ;

RMMc            cp cRhinoChar                   ;
                ret nz                          ;

RhinoHit        ld b,-1                         ;
                jp AlwaysDoDamage               ;

RhinoEnd        defs 1                          ;
RhinoManPos     defs 2                          ;
RhinoManSpeed   defs 1                          ;
nRhinos         defs 1                          ;
RhinoDamage     defs 1                          ;
RhinoScore      defs 2                          ;

RhinoMLeft      dec hl                          ;
                ld a,l                          ;
                cpl                             ;
                and $0F                         ;
                ret nz                          ;
                inc hl                          ;
                ret                             ;

RhinoMRight     inc hl                          ;
                ld a,l                          ;
                and $0F                         ;
                ret nz                          ;
                dec hl                          ;
                ret                             ;

RhinoMUp        ld e,-16                        ;
                ld a,l                          ;
                add a,e                         ;
                ld l,a                          ;
                cpl                             ;
                and $F0                         ;
                ret nz                          ;
                ld a,l                          ;
                sub e                           ;
                ld l,a                          ;
                ret                             ;

RhinoMDown      ld e,16                         ;
                ld a,l                          ;
                add a,e                         ;
                ld l,a                          ;
                and $F0                         ;
                ret nz                          ;
                ld a,l                          ;
                sub e                           ;
                ld l,a                          ;
                ret                             ;

InitStats       ld hl,$FFFF                     ;
                ld (CurrentStat),hl             ;

                ld hl,Ret0                      ;
                ld (cFlashRoutine),hl           ;

                ret                             ;

DispStatsInner  ld bc,$F7FE                     ;
                in a,(c)                        ;
                bit 3,a                         ;
                jr nz,DS1                       ;

StatsExit       ld hl,$FFFF                     ;
                ld (CurrentStat),hl             ;

                ld hl,Ret0                      ;
                ld (cFlashRoutine),hl           ;

                jp CLS                          ;

DS1             or $F8                          ;
                inc a                           ;
                jr nz,DispStats                 ;

                ld hl,0                         ;
cFlashValue     equ .-2                         ;

                dec hl                          ;
                ld (cFlashValue),hl             ;

                ld a,h                          ;
                or l                            ;

                call z,0                        ;
cFlashRoutine   equ .-2                         ;

                ld b,0                          ;
                djnz $                          ;

                jp DispStatsInner               ;

DispStats       dec a                           ;
                cpl                             ;
                and $07                         ;
                add a,a                         ;
                add a,pStats & $FF            ;
                ld l,a                          ;
                ld a,pStats / 256               ;
                adc a,0                         ;
                ld h,a                          ;

                ld a,(hl)                       ;
                inc hl                          ;
                ld h,(hl)                       ;
                ld l,a                          ;

                ; Has the display routine changed?

                ld de,(CurrentStat)             ;
                or a                            ;
                sbc hl,de                       ;
                add hl,de                       ;

                ld (CurrentStat),hl             ;

                call nz,CallHL                  ; If so, call it...

                jr DispStatsInner               ;

CurrentStat     defw $FFFF                      ;

pStats          defw DoMap                      ; Null
                defw DoMap                      ;
                defw DoOpt                      ;
                defw DoMap                      ;
                defw DoCode                     ;
                defw DoOpt                      ;
                defw DoCode                     ;
                defw DoRhino                    ;

SteppMapR       push bc                         ;
                push af                         ;

                ld a,l                          ;
                inc a                           ;
                and $1F                         ;
                ld c,a                          ;

                ld a,l                          ;
                and $E0                         ;
                or c                            ;
                ld l,a                          ;

                pop af                          ;
                pop bc                          ;
                ret                             ;


SteppMapL       push bc                         ;
                push af                         ;

                ld a,l                          ;
                dec a                           ;
                and $1F                         ;
                ld c,a                          ;

                ld a,l                          ;
                and $E0                         ;
                or c                            ;
                ld l,a                          ;

                pop af                          ;
                pop bc                          ;
                ret                             ;


SteppMapU       push bc                         ;
                push af                         ;

                ld a,l                          ;
                sub $20                         ;
                ld l,a                          ;

                jr nc,SpMU                      ;

                ld a,h                          ;
                cp Map / 256                    ;

                ld h,Map / 256                  ;

                jr nz,SpMU                      ;

                ld h,0+(Map+$100) / 256         ;

SpMU            pop af                          ;
                pop bc                          ;
                ret                             ;


SteppMapD       push bc                         ;
                push af                         ;

                ld a,l                          ;
                add a,$20                       ;
                ld l,a                          ;

                jr nc,SpMD                      ;

                ld a,h                          ;
                cp Map / 256                    ;

                ld h,Map / 256                  ;

                jr nz,SpMD                      ;

                ld h,0+(Map+$100) / 256         ;

SpMD            pop af                          ;
                pop bc                          ;
                ret                             ;


PrintMap        push hl                         ;
                push de                         ;
                push af                         ;

                ld a,d                          ;
                add a,MapoY                     ;
                add a,a                         ;
                add a,YTab & $FF              ;
                ld l,a                          ;

                ld a,YTab / 256                 ;
                adc a,0                         ;
                ld h,a                          ;

                ld a,(hl)                       ;
                inc hl                          ;
                ld h,(hl)                       ;
                ld l,a                          ;

                ld a,e                          ;
                add a,MapoX                     ;
                or l                            ;
                ld l,a                          ;

                pop af                          ;
                push af                         ;

                ld e,a                          ;

                add a,a                         ;
                add a,a                         ;
                add a,a                         ;
                add a,e                         ; *9

                add a,MapChars & $FF            ;
                ld e,a                          ;
                ld a,MapChars / 256             ;
                adc a,0                         ;
                ld d,a                          ;

                push hl                         ;

                ld a,h                          ;
                rrca                            ;
                rrca                            ;
                rrca                            ;
                and $03                         ;
                or $58                          ;
                ld h,a                          ;

                ld a,(de)                       ;
                inc de                          ;
                ld (hl),a                       ;

                pop hl                          ;

                ld b,8                          ;

MPlp            ld a,(de)                       ;
                ld (hl),a                       ;

                inc h                           ;
                inc de                          ;

                djnz MPlp                       ;

                pop af                          ;
                pop de                          ;
                pop hl                          ;
                ret                             ;

Print8x8        push hl                         ;
                push de                         ;
                push bc                         ;
                push af                         ;
                push hl                         ;

                ld l,a                          ;
                ld h,0                          ;
                ld d,h                          ;
                ld e,l                          ;

                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,de                       ;

                ld de,MapChars                  ;
                add hl,de                       ;

                ex de,hl                        ;

                pop hl                          ;

                push hl                         ;

                ld a,h                          ;
                rrca                            ;
                rrca                            ;
                rrca                            ;
                and $03                         ;
                or $58                          ;
                ld h,a                          ;

                ld a,(de)                       ;
                inc de                          ;
                ld (hl),a                       ;

                pop hl                          ;

                ld b,8                          ;

P8lp            ld a,(de)                       ;
                ld (hl),a                       ;

                inc h                           ;
                inc de                          ;

                djnz P8lp                       ;

                pop af                          ;
                pop bc                          ;
                pop de                          ;
                pop hl                          ;
                ret                             ;

ShowMap         ld hl,(pMap)                    ;

                ld b,7                          ;

OffsetL         call SteppMapL                  ;
                call SteppMapU                  ;

                djnz OffsetL                    ;

                ld d,0                          ;

SMlp1           ld e,0                          ;

                push hl                         ;

SMlp2           call GetMap                     ;

                call MapConvert                 ;

                call PrintMap                   ;

                call SteppMapR                  ;

                ld a,15                         ;

                inc e                           ;
                cp e                            ;
                jr nz,SMlp2                     ;

                pop hl                          ;

                call SteppMapD                  ;

                inc d                           ;
                cp d                            ;
                jr nz,SMlp1                     ;

                ld hl,(pMap)                    ;
                ld a,(hl)                       ;
                call MapConvert                 ;
                ld h,a                          ;

                ld a,(Angle)                    ;
                ld l,a                          ;

                ld (FlashChars),hl              ;

                ld hl,MapFlash                  ;
StartFlash      ld (cFlashRoutine),hl           ;

                ld hl,1                         ;
                ld (cFlashValue),hl             ;

                ret                             ;

MapFlash        ld hl,$F1F2                     ;
FlashChars      equ .-2                         ;

                ld a,h                          ;
                ld h,l                          ;
                ld l,a                          ;

                ld (FlashChars),hl              ;

                ld de,$0707                     ;
                call PrintMap                   ;

                ld hl,MapFlashRate              ;
                ld (cFlashValue),hl             ;

                ; If Fire and '5' we allow moving on the map

        if not def Original

                ; If Fire and '5' we allow moving on the map

                call kFire                      ; Fire?
                jr z MF_X                       ; No...

                ld bc,$F7FE                     ; '5'?
                in a,(c)                        ;
                bit 4,a                         ;
                jr nz MF_X                      ;


                call kUp                        ; Up?
                jr nz FC_Up                     ; Yes, skip

                call kDown                      ; Down
                jr nz FC_Down                   ; Yes, skip

                call kLeft                      ; Left?
                jr nz FC_Left                   ; Yes, skip

                call kRight                     ; Right?
                jr nz FC_Right                  ; Yes, skip

MF_X            ret                             ; Done

        ; Move UP

FC_Up           ld hl,(pMap)                    ;
                call SteppMapU                  ;
                ld (pMap),hl                    ;

                call DoMap                      ;

                call InitMapLocal               ;

                ret                             ;

        ; Move DOWN

FC_Down         ld hl,(pMap)                    ;
                call SteppMapD                  ;
                ld (pMap),hl                    ;

                call DoMap                      ;

                call InitMapLocal               ;

                ret                             ;

        ; Move LEFT

FC_Left         ld hl,(pMap)                    ;
                call SteppMapL                  ;
                ld (pMap),hl                    ;

                call DoMap                      ;

                call InitMapLocal               ;

                ret                             ;

        ; Move RIGHT

FC_Right        ld hl,(pMap)                    ;
                call SteppMapR                  ;
                ld (pMap),hl                    ;

                call DoMap                      ;

                call InitMapLocal               ;
        endif

                ret                             ;

GetMap          ld a,(hl)                       ;
                ret                             ;

MapConvert      cp $FA                          ;
                jr nc,MC1                       ;

                rrca                            ;
                rrca                            ;
                rrca                            ;
                and $1F                         ;

                add a,8                         ;

                ret                             ;

MC1             push bc                         ;

                sub $FA                         ;
                add a,$0E                       ;

                pop bc                          ;
                ret                             ;

YTab            defw $4000,$4020,$4040,$4060    ;
                defw $4080,$40A0,$40C0,$40E0    ;
                defw $4800,$4820,$4840,$4860    ;
                defw $4880,$48A0,$48C0,$48E0    ;
                defw $5000,$5020,$5040,$5060    ;
                defw $5080,$50A0,$50C0,$50E0    ;

DoMap           call CLS                        ;

                ld hl,sMap                      ;
                call vPrintStr                  ;

                ld hl,MapKeyTable               ;

DMlp            ld a,(hl)                       ;
                or a                            ;
                jr z,DMa                        ;
                inc hl                          ;

                ld e,(hl)                       ;
                inc hl                          ;
                ld d,(hl)                       ;
                inc hl                          ;

                call MapConvert                 ;
                call PrintMap                   ;

                jr DMlp                         ;

DMa             jp ShowMap                      ;

MapKeyTable     defb $FE                        ;
                defw $04F0                      ;
                defb $FB                        ;
                defw $06F0                      ;

                defb $18                        ;
                defw $08F0                      ;
                defb $08                        ;
                defw $08F1                      ;
                defb $10                        ;
                defw $08F2                      ;

                defb $FC                        ;
                defw $0AF0                      ;

                defb $FF                        ;
                defw $0CF0                      ;

                defb $28                        ;
                defw $0EF0                      ;

                defb $FD                        ;
                defw $10F0                      ;

                defb 0                          ;

DoOpt           call CLS                        ;

                ld hl,sIFF                      ;
                call vPrintStr                  ;

                ld hl,OptFlash                  ;
                jp StartFlash                   ;


OptFlash        ld bc,$0020                     ;
                call vScanOptiKeys              ;
                jr nc,OFx                       ;

                ld a,GameQuit                   ;
                ld (EndState),a                 ;

                pop hl                          ;
                ret                             ;

OFx             ld hl,1                         ;
                ld (cFlashValue),hl             ;

                ret                             ;


DoCode          call CLS                        ;

                ld hl,sCode                     ;
                call vPrintStr                  ;

                ld d,1                          ;
                call DisplayCodes               ;

                ld hl,CodeFlash                 ;
                jp StartFlash                   ;

CodeFlash       ld hl,CodeFlashRate             ;
                ld (cFlashValue),hl             ;

                ld d,0                          ;
                jp DisplayCodes                 ;

DisplayCodes    ld a,2                          ;
                ld (ppCurY),a                   ;

                ld hl,Codes                     ;
                ld c,nCodes                     ;

DClp            ld a,cCret                      ;
                call vPrint                     ;

                ld a,CodesX                     ;
                ld (pCurX),a                    ;

                ld e,(hl)                       ;
                inc hl                          ;

                bit 0,d                         ;
                jr z,DCa                        ;

                bit 0,e                         ;
                call nz,PrintFound              ;
                call z,PrintNotFound            ;

DCa             ld a,e                          ;
                cpl                             ;
                or d                            ;
                bit 0,a                         ;
                jr nz,DCb                       ;

                inc hl                          ;
                inc hl                          ;
                inc hl                          ;
                inc hl                          ;

                jr DCc                          ;

DCb             ld a,5                          ;
                call vPrint                     ;

                ld b,4                          ;

                ld a,CodesXc                    ;
                ld (pCurX),a                    ;

DClpA           ld a,(pCurX)                    ;
                ld ixl,a                        ;

                ld a,(hl)                       ;

                bit 0,d                         ;
                call z,vPrint                   ;

                ld a,ixl                        ;
                ld (pCurX),a                    ;

                ld a,(hl)                       ;

                bit 0,e                         ;
                call z,RandomChar               ;

                ld (hl),a                       ;
                inc hl                          ;

                call vPrint                     ;

                ld a,ixl                        ;
                add a,6                         ;
                ld (pCurX),a                    ;

                djnz DClpA                      ;

DCc             dec c                           ;
                jr nz,DClp                      ;

                ret                             ;

PrintFound      push af                         ;
                push hl                         ;

                ld hl,sFound                    ;
                call vPrintStr                  ;

                pop hl                          ;
                pop af                          ;
                ret                             ;

PrintNotFound   push hl                         ;

                ld hl,sNotFound                 ;
                call vPrintStr                  ;

                pop hl                          ;
                ret                             ;

RandomChar      ld a,r                          ;
                and $0F                         ;
                add a,"0"                       ;
                cp "9"+1                        ;
                ret c                           ;
                add a,"A"-("9"+1)               ;
                ret                             ;

InitCodes       ld hl,Codes                     ;
                ld de,5                         ;
                ld b,nCodes                     ;
                xor a                           ;

IClp            ld (hl),a                       ;
                add hl,de                       ;

                djnz IClp                       ;

                ld (nCodesFound),a              ;

                ret                             ;

AddCodes        ld a,(nCodesFound)              ;
                cp nCodes                       ;
                jr z,AddC1                      ;

                inc a                           ;

AddC1           ld (nCodesFound),a              ;

                ld hl,(pMap)                    ;
                ld a,(hl)                       ;
                cp $FB                          ;
                jr nz,AddC2                     ;

                dec (hl)                        ;

AddC2           ld hl,InitialCodes              ;
                ld de,Codes                     ;
                ld bc,4                         ;

AClp            ld a,(de)                       ;
                or a                            ;
                jr z,ACadd                      ;

                inc de                          ;
                add hl,bc                       ;

                ex de,hl                        ;
                add hl,bc                       ;
                ex de,hl                        ;

                jr AClp                         ;

ACadd           inc a                           ;
                ld (de),a                       ;

                inc de                          ;

                push hl                         ;
                push bc                         ;

                ldir                            ;

                pop bc                          ;
                pop hl                          ;

                ld de,AddCodeStr                ;
                ldir                            ;

                push ix                         ;

                ld hl,sScrollCodes              ;
                call vAddScroll                 ;

                pop ix                          ;
                ret                             ;

sScrollCodes    defb $06,"Code sequence",$05
AddCodeStr      defb "%%%%",$06,"recieved",$00,$FF
sFound          defb $06,"Recieved -",$00
sNotFound       defb $03," ",$00
sRhino          defb $05,"Welcome to",$07,"Whino Hunt",$00,$FF
sRhino1         defb $04,"Wavaged by a wampant whino !",$00,$FF
sMap            defb $0E,$0D,$0D,$0D,$05,"Terrain within scope",$0D,$0D,$03
                defb "Key to display",$0D,$0D,$06,"     = Unknown",$0D,$0D,$03
                defb "     = Code Stores",$0D,$0D,$06,"     = Plasma Guides",$0D,$0D,$03
                defb "     = Dislocations",$0D,$0D,$04,"     = Heavy Defences",$0D,$0D,$05
                defb "     = Energy Stores",$0D,$0D,$07,"     = Exit Linear Accele"
                defb "rator",$00
sCode           defb $0E,$0D,$0D,$0D,$05,"Escape Code Sequence",$0D,$00
sIFF            defb $0E,$0D,$0D,$0D,$05,"Various Options",$0D,$0D,$0D,$06
                defb "Press ",$07,"ENTER ",$06,"to quit game .",$0D,$0D,$05
                defb "Press ",$07,"4 ",$05,"to continue .",$00

MapChars        defb $05                        ;
                defb $10,$38,$54,$10,$10,$10,$10,$10;

                defb $05                        ;
                defb $07,$03,$05,$08,$10,$20,$40,$80;

                defb $05                        ;
                defb $00,$04,$02,$FF,$02,$04,$00,$00;

                defb $05                        ;
                defb $80,$40,$20,$10,$08,$05,$03,$07;

                defb $05                        ;
                defb $10,$10,$10,$10,$10,$54,$38,$10;

                defb $05                        ;
                defb $01,$02,$04,$08,$10,$A0,$C0,$E0;

                defb $05                        ;
                defb $00,$20,$40,$FF,$40,$20,$00,$00;

                defb $05                        ;
                defb $E0,$C0,$A0,$10,$08,$04,$02,$01;

                defb $06                        ;
                defb $00,$00,$00,$00,$00,$00,$00,$00;

                defb $06                        ;
                defb $00,$00,$3C,$00,$00,$3C,$00,$00;

                defb $06                        ;
                defb $00,$02,$42,$E2,$47,$42,$40,$00;

                defb $06                        ;
                defb $00,$40,$42,$47,$E2,$42,$02,$00;

                defb $43                        ;
                defb $00,$28,$10,$28,$10,$10,$10,$10;

                defb $45                        ;
                defb $00,$3C,$20,$38,$20,$20,$20,$00;

                defb $07                        ;
                defb $28,$00,$AA,$00,$AA,$00,$28,$00;

                defb $07                        ;
                defb $00,$28,$AA,$AA,$AA,$AA,$28,$00;

                defb $04                        ;
                defb $00,$6E,$89,$69,$19,$19,$6E,$00;

                defb $47                        ;
                defb $10,$54,$38,$EE,$38,$54,$10,$00;

                defb $43                        ;
                defb $00,$00,$00,$00,$00,$00,$00,$00;

                defb $44                        ;
                defb $28,$54,$AA,$55,$AA,$55,$2A,$14;

                defb $44                        ;
                defb $00,$00,$00,$00,$00,$00,$00,$00;

                defb $45                        ;
                defb $00,$00,$18,$3C,$3C,$18,$00,$00;

                defb $05                        ;
                defb $00,$18,$24,$42,$42,$24,$18,$00;

                defb $43                        ;
                defb $00,$00,$02,$7C,$A4,$24,$24,$00;

	; These are the codes that are displayed.
	;
	; I've forgotten how these are used to find the secret code :(
        ;

InitialCodes    defb "9472"                     ;
                defb "E602"                     ;
                defb "F627"                     ;
                defb "0227"                     ;
                defb "6756"                     ;
                defb "9647"                     ;
                defb "5602"                     ;
                defb "5726"                     ;
                defb "0237"                     ;
                defb "0226"                     ;
                defb "9647"                     ;
                defb "2696"                     ;
                defb "5656"                     ;
                defb "5666"                     ;
                defb "7237"                     ;
                defb "3786"                     ;

Codes           defs 5 * 16                     ;

;  End of STATS

InitStars       ld hl,StarTable                 ;
                ld (pFreeStars),hl              ;

                ld b,nStars                     ;

                ld de,lStar                     ;

ISlp            push hl                         ;
                pop ix                          ;

                add hl,de                       ;

                ld (ix+dpnStarFree_L),l         ;
                ld (ix+dpnStarFree_H),h         ;

                djnz ISlp                       ;

                ld hl,0                         ;
                ld (ix+dpnStarFree_L),l         ;
                ld (ix+dpnStarFree_H),h         ;

                ld (pStarList),hl               ;

                ld (pLastStar),hl               ;

                xor a                           ;
                ld (crStars),a                  ;

                ld a,nStars                     ;
                ld (cnStars),a                  ;

                ret                             ;

AddStar         ld hl,(pFreeStars)              ;

                ld a,l                          ;
                or h                            ;
                scf                             ;
                ret z                           ;

                ld ix,(pLastStar)               ;

                ld a,ixl                        ;
                or ixh                          ;
                jr nz,ASa                       ;

                ld (pStarList),hl               ;

ASa             ld (ix+dpnStar_L),l             ;
                ld (ix+dpnStar_H),h             ;

                ld (pLastStar),hl               ;

                push hl                         ;
                pop ix                          ;

                ld l,(ix+dpnStarFree_L)         ;
                ld h,(ix+dpnStarFree_H)         ;
                ld (pFreeStars),hl              ;

                xor a                           ;
                ld (ix+dpnStar_L),a             ;
                ld (ix+dpnStar_H),a             ;

                ld a,(crStars)                  ;
                inc a                           ;
                ld (crStars),a                  ;

                or a                            ;
                ret                             ;

CreateStars     ld b,nStars                     ;

                ld hl,$500                      ;

SUSlp           push bc                         ;

                push hl                         ;
                call AddStar                    ;
                pop hl                          ;

                ld (ix+dStarZ_L),l              ;
                ld (ix+dStarZ_H),h              ;

                ld de,$7000/nStars              ;
                add hl,de                       ;

                call Rand                       ;
                ld (ix+dStarX_L),e              ;
                ld (ix+dStarX_H),d              ;

                ld de,StartY                    ;
                ld (ix+dStarY_L),e              ;
                ld (ix+dStarY_H),d              ;

                ld (ix+dStarBit),0              ;
                ld (ix+dStarFlag),1             ;

                pop bc                          ;

                djnz SUSlp                      ;

                ret                             ;

ShowStars       call InitVectAdd                ;

                call ResMargin                  ;

                ld hl,WindowTable               ;
                ld (pcWindowLocal),hl           ;

                ld hl,(WindowTable)             ;
                ld (cWindZ),hl                  ;

                ld hl,0                         ;
                ld (pPrevStar),hl               ;

                ld hl,(pStarList)               ;

SSlp            ld a,l                          ;
                or h                            ;
                jp z,ReplaceStars               ;

                push hl                         ;
                pop ix                          ;

                ld de,dStarX_L                  ;
                add hl,de                       ;

                call DoVectAdd                  ;

SS0             ld l,(ix+dStarZ_L)              ;
                ld h,(ix+dStarZ_H)              ;
                ld de,(cWindZ)                  ;

                or a                            ;
                sbc hl,de                       ;

                jp m,SS1                        ;

                push ix                         ;

                ld ix,(pcWindowLocal)           ;

                ld l,(ix+dpnStarFree_H)         ;
                ld h,(ix+dStarX_L)              ;
                call SetLMargin                 ;

                ld l,(ix+dStarX_H)              ;
                ld h,(ix+dStarY_L)              ;
                call SetRMargin                 ;

                ld l,(ix+dStarY_H)              ;
                ld h,(ix+dStarZ_L)              ;
                call SetUMargin                 ;

                ld l,(ix+dStarZ_H)              ;
                ld h,(ix+dStarAddr_L)           ;
                call SetDMargin                 ;

                ld de,lWind                     ;
                add ix,de                       ;

                ld (pcWindowLocal),ix           ;

                ld l,(ix+dpnStar_L)             ;
                ld h,(ix+dpnStar_H)             ;

                ld (cWindZ),hl                  ;

                pop ix                          ;

                jp SS0                          ;

SS1             bit 7,(ix+dStarZ_H)             ;
                jp nz,SSn                       ;

                ld l,(ix+dStarX_L)              ;
                ld h,(ix+dStarX_H)              ;

                ld e,(ix+dStarZ_L)              ;
                ld d,(ix+dStarZ_H)              ;

                bit 7,h                         ;
                jr nz,SSW1                      ;

                or a                            ;
                sbc hl,de                       ;
                jp nc,SSn                       ;

                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,SSn                       ;

                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+dStarY_L)              ;
                ld h,(ix+dStarY_H)              ;

                ld e,(ix+dStarZ_L)              ;
                ld d,(ix+dStarZ_H)              ;

                bit 7,h                         ;
                jr nz,SSW1a                     ;

                or a                            ;
                sbc hl,de                       ;
                jp nc,SSna                      ;

                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,SSna                      ;

                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 ClipAddr                   ;

                ld e,(ix+dStarAddr_L)           ;
                ld d,(ix+dStarAddr_H)           ;
                ld b,(ix+dStarBit)              ;

                ld (ix+dStarAddr_L),l           ;
                ld (ix+dStarAddr_H),h           ;
                ld (ix+dStarBit),a              ;

                ld c,a                          ;

                ex de,hl                        ;
                ld a,b                          ;
                cpl                             ;
                and (hl)                        ;
                ld (hl),a                       ;
                ex de,hl                        ;

                ld a,c                          ;
                and (hl)                        ;
                jr nz,SS3                       ;

                ld a,c                          ;
                or (hl)                         ;

                ld (hl),a                       ;

SS3             ld (pPrevStar),ix               ;

                ld l,(ix+dpnStar_L)             ;
                ld h,(ix+dpnStar_H)             ;

                jp SSlp                         ;

SSna            pop hl                          ;

SSn             ld iy,(pPrevStar)               ;

                ld l,(ix+dStarAddr_L)           ;
                ld a,(ix+dStarBit)              ;
                ld h,(ix+dStarAddr_H)           ;

                cpl                             ;
                and (hl)                        ;
                ld (hl),a                       ;

                ld a,(crStars)                  ;
                dec a                           ;
                ld (crStars),a                  ;

                push ix                         ;
                pop hl                          ;
                ld de,(pLastStar)               ;
                or a                            ;
                sbc hl,de                       ;
                jr nz,SSnc                      ;

                ld (pLastStar),iy               ;

SSnc            ld l,(ix+dpnStar_L)             ;
                ld h,(ix+dpnStar_H)             ;
                ld (iy+dpnStar_L),l             ;
                ld (iy+dpnStar_H),h             ;

                ld a,iyl                        ;
                or iyh                          ;
                jr nz,SSnb                      ;

                ld (pStarList),hl               ;

SSnb            ld hl,(pFreeStars)              ;
                ld (ix+dpnStarFree_L),l         ;
                ld (ix+dpnStarFree_H),h         ;

                ld (pFreeStars),ix              ;

                ld l,(ix+dpnStar_L)             ;
                ld h,(ix+dpnStar_H)             ;

                jp SSlp                         ;

ReplaceStars    ld a,(cnStars)                  ;
                ld b,a                          ;
                ld a,(crStars)                  ;

                sub b                           ;
                ret nc                          ;

                call AddStar                    ;
                ret c                           ;

                ld hl,$7F00                     ;
                ld (ix+dStarZ_L),l              ;
                ld (ix+dStarZ_H),h              ;

                call Rand                       ;
                ld (ix+dStarX_L),e              ;
                ld (ix+dStarX_H),d              ;

                ld hl,(GroundY)                 ;
                ld (ix+dStarY_L),l              ;
                ld (ix+dStarY_H),h              ;

                ld (ix+dStarBit),0              ;

                ld (ix+dStarFlag),1             ;

                ret                             ;

pFreeStars      defs 2                          ;
pStarList       defs 2                          ;
pLastStar       defs 2                          ;
pPrevStar       defs 2                          ;

crStars         defs 1                          ;

pcWindowLocal   defs 2                          ;
cWindZ          defs 2                          ;

;  Spurious pop ix

		; For some reason there's a spurious pop ix here in the original source
		; an editing mistake? A joke? Misdirection? Who knows...

;                pop ix                          ;

;  Start of DRAW

vSmallX         equ 100                         ;
vSmallY         equ 160                         ;

vMediumX        equ 240                         ;
vMediumY        equ 320                         ;

vLargeX         equ 400                         ;
vLargeY         equ 500                         ;

ObjectDescs     defw aFixed    ,vSmallX  ,vSmallY  ,Hole
                defw aFixed    ,vMediumX ,vMediumY ,Hole
                defw aFixed    ,vLargeX  ,vLargeY  ,Hole

                defw aVari     ,CycleXY  ,vLargeX  ,Hole
                defw aVari     ,CycleY   ,vLargeX  ,Hole
                defw aVari     ,CycleX   ,vLargeX  ,Hole
                defw aVari1    ,CycleXmY ,vLargeX  ,Hole

                defw aVari     ,OneXY    ,0        ,Hole
                defw aVari     ,OneXY    ,vMediumX ,Hole

                defw aIris     ,CycleXY  ,vLargeX  ,Hole
                defw aIrisA    ,CycleXY  ,vLargeX  ,Hole
                defw aIrisB    ,CycleXY  ,vLargeX  ,Hole
                defw aIrisC    ,CycleXY  ,vLargeX  ,Hole

                defw aIrisC    ,CycleXY  ,vLargeX  ,Hole
                defw aIrisC    ,CycleXY  ,vLargeX  ,Hole
                defw aIrisC    ,CycleXY  ,vLargeX  ,Hole

;  #10

                defw aMiss     ,ChaserA  ,20       ,Miss
                defw aMiss     ,ChaserB  ,vSmallX  ,Miss

                defw aExpl     ,ExplTab1 ,0        ,Miss
                defw aExpl     ,ExplTab2 ,0        ,Miss

                defw Ret0       ,0        ,0        ,Slugs

                defw aSAM      ,20       ,-200     ,SAM
                defw aSAM      ,15       ,-300     ,SAM
                defw aSAM      ,10       ,-400     ,SAM

                defw aSAMa     ,20       ,-200     ,SAM
                defw aSAMa     ,15       ,-300     ,SAM
                defw aSAMa     ,10       ,-400     ,SAM

                defw aSAM      ,40       ,-100     ,SAM

                defw aMine     ,30       ,-200     ,TOW

                defw aBunker   ,20       ,-30      ,TOW
                defw aCodeXmit ,20       ,-100     ,TOW

                defw aSAMSqu   ,20       ,-200     ,SAM

;  #20

                defw aSquTow   ,10       ,-200     ,TOW
                defw aSquTow   ,20       ,-200     ,TOW
                defw aSquTow   ,30       ,-200     ,TOW

                defw aSquMiss  ,ChaserB  ,20       ,Miss

                defw aRising   ,10       ,-200     ,SAM

                defw aFuel     ,CycleXY  ,vLargeX  ,Hole

                defw aWarp     ,CycleXmY ,vLargeX  ,Hole

                defw aCodeXm1  ,20       ,-100     ,TOW


aFuel           ld bc,FuelHit                   ;
                ld (iy+dObjeColl_L),c           ;
                ld (iy+dObjeColl_H),b           ;

                jp aVari                        ;

aWarp           ld bc,WarpHit                   ;
                ld (iy+dObjeColl_L),c           ;
                ld (iy+dObjeColl_H),b           ;

                ld bc,Ret0                       ;
                ld (iy+dObjeShot_L),c           ;
                ld (iy+dObjeShot_H),b           ;

                ld bc,Ret0                       ;
                ld (iy+dObjeMiss_L),c           ;
                ld (iy+dObjeMiss_H),b           ;

                ld (iy+dObjeWindF),0            ;
                ld (iy+dObjeCol),$46            ;

                ld bc,DispSquareB               ;
                ld (iy+dObjeDraw_L),c           ;
                ld (iy+dObjeDraw_H),b           ;

                jp aVari1                       ;

aSquTow         ld (iy+dObjeBdYS_L),e           ;
                ld (iy+dObjeBdYS_H),d           ;
                ld (iy+dObjeCntA),l             ;

                ret                             ;

aBunker         ld bc,$0300                     ;
                ld (iy+dObjeAXS_L),c            ;
                ld (iy+dObjeAXS_H),b            ;

                ld bc,$C0                       ;
                ld (iy+dObjeAYS_L),c            ;
                ld (iy+dObjeAYS_H),b            ;

                jp aSquTow                      ;

aCodeXmit       ld bc,(pMap)                    ;
                ld a,(bc)                       ;

                cp $FB                          ;
                jr nz,aCodeXm1                  ;

                ld bc,CodeSend                  ;
                ld (iy+dObjeColl_L),c           ;
                ld (iy+dObjeColl_H),b           ;

aCodeXm1        ld (iy+dObjeCol),$43            ;

                ld bc,DispDiamond               ;
                ld (iy+dObjeDraw_L),c           ;
                ld (iy+dObjeDraw_H),b           ;

                ld (iy+dObjeClipFlags),0        ;

                jp aSquTow                      ;

aMine           ld bc,DispMiss                  ;
                ld (iy+dObjeDraw_L),c           ;
                ld (iy+dObjeDraw_H),b           ;

                jp aSquTow                      ;

aRising         set 0,(iy+dObjeStateF)          ;

aSAMSqu         ld a,tSquMiss                   ;
                ld (iy+dObjeWeapon),a           ;

                jr aSAM                         ;

aSAMa           ld a,tMiss                      ;
                ld (iy+dObjeWeapon),a           ;

aSAM            ld (iy+dObjeBdYS_L),e           ;
                ld (iy+dObjeBdYS_H),d           ;
                ld (iy+dObjeCntA),l             ;
                ld (iy+dObjeCntiA),l            ;

                ld bc,(GroundY)                 ;
                ld (iy+dObjeY_L),c              ;
                ld (iy+dObjeY_H),b              ;

                ret                             ;

aFixed          ld (iy+dObjeBXS_L),l            ;
                ld (iy+dObjeBXS_H),h            ;
                ld (iy+dObjeBYS_L),e            ;
                ld (iy+dObjeBYS_H),d            ;

                ret                             ;

aVari           ld (iy+dObjepSizeTab_L),l       ;
                ld (iy+dObjepSizeTab_H),h       ;

                ld (iy+dObjeBXS_L),e            ;
                ld (iy+dObjeBXS_H),d            ;
                ld (iy+dObjeBYS_L),e            ;
                ld (iy+dObjeBYS_H),d            ;
                ret                             ;

aVari1          ld (iy+dObjepSizeTab_L),l       ;
                ld (iy+dObjepSizeTab_H),h       ;

                ld (iy+dObjeBYS_L),e            ;
                ld (iy+dObjeBYS_H),d            ;

                ld de,0                         ;
                ld (iy+dObjeBXS_L),e            ;
                ld (iy+dObjeBXS_H),d            ;

                ret                             ;

aIris           ld bc,DispIris                  ;

aIrisCommon     ld (iy+dObjeDraw_L),c           ;
                ld (iy+dObjeDraw_H),b           ;

                ld bc,vLargeX                   ;
                ld (iy+dObjeAXS_L),c            ;
                ld (iy+dObjeAXS_H),b            ;
                ld (iy+dObjeAYS_L),c            ;
                ld (iy+dObjeAYS_H),b            ;

                jp aVari                        ;

aIrisA          ld bc,DispIrisA                 ;
                jp aIrisCommon                  ;

aIrisB          ld bc,DispIrisB                 ;
                jp aIrisCommon                  ;

aIrisC          ld bc,DispIrisC                 ;
                jp aIrisCommon                  ;

aSquMiss        ld bc,DispSquMiss               ;
                ld (iy+dObjeDraw_L),c           ;
                ld (iy+dObjeDraw_H),b           ;

aMiss           ld (iy+dObjeMove_L),l           ;
                ld (iy+dObjeMove_H),h           ;
                ld (iy+dObjeCntiA),e            ;
                ld hl,PlayerShot                ;
                ld (iy+dObjeColl_L),l           ;
                ld (iy+dObjeColl_H),h           ;

                set bScreenClip,(iy+dObjeFlags) ;
                res bCursorClip,(iy+dObjeFlags) ;

                ret                             ;

aProj           ld (iy+dObjeAXS_L),l            ;
                ld (iy+dObjeAXS_H),h            ;
                ld (iy+dObjeCntA),e             ;

                set bRepeat,(iy+dObjeFlags)     ;

                ld (iy+dObjepUnDraw),-2         ;

aExpl           ld bc,ExplTab1                  ;
                ld (iy+dObjepSizeTab_L),c       ;
                ld (iy+dObjepSizeTab_H),b       ;

                ld bc,Ret0                       ;
                ld (iy+dObjeColl_L),c           ;
                ld (iy+dObjeColl_H),b           ;
                ld (iy+dObjeShot_L),c           ;
                ld (iy+dObjeShot_H),b           ;
                ld (iy+dObjeMiss_L),c           ;
                ld (iy+dObjeMiss_H),b           ;
                ld (iy+dObjeAlter_L),c          ;
                ld (iy+dObjeAlter_H),b          ;
                ld (iy+dObjeMove_L),c           ;
                ld (iy+dObjeMove_H),b           ;

                ld bc,DispExpl                  ;
                ld (iy+dObjeDraw_L),c           ;
                ld (iy+dObjeDraw_H),b           ;

                ld (iy+dObjeClipFlags),0        ;

                ret                             ;

CycleXY         defb 30                         ;
                defw -13,-13                    ;

                defb 30                         ;
                defw 13,13                      ;

                defb 0                          ;
                defw CycleXY                    ;

CycleX          defb 30                         ;
                defw -13,0                      ;

                defb 30                         ;
                defw 13,0                       ;

                defb 0                          ;
                defw CycleX                     ;

CycleY          defb 30                         ;
                defw 0,-13                      ;

                defb 30                         ;
                defw 0,13                       ;

                defb 0                          ;
                defw CycleY                     ;

CycleXmY        defb 30                         ;
                defw 13,-13                     ;

                defb 30                         ;
                defw -13,13                     ;

                defb 0                          ;
                defw CycleXmY                   ;

OneXY           defb 30                         ;
                defw 13,13                      ;

                defb 30                         ;
                defw -13,-13                    ;

                defb 0                          ;
                defw FixedSize                  ;

ExplTab1        defb $1E,$0F,$04                ;
                defb $23,$16,$04                ;
                defb $28,$1E,$05                ;
                defb $2D,$25,$05                ;
                defb $32,$2D,$06                ;
                defb $37,$34,$06                ;
                defb $3C,$3C,$07                ;
                defb $41,$43,$07                ;
                defb $46,$4B,$06                ;
                defb $4B,$52,$05                ;
                defb $50,$5A,$04                ;
                defb $55,$61,$03                ;
                defb $5A,$69,$02                ;
                defb $5F,$70,$01                ;
                defb $00,$00,$00                ;

ExplTab2        defb $3C,$0F,$04                ;
                defb $46,$16,$04                ;
                defb $50,$1E,$05                ;
                defb $5A,$25,$05                ;
                defb $64,$2D,$06                ;
                defb $6E,$34,$06                ;
                defb $78,$3C,$07                ;
                defb $82,$43,$07                ;
                defb $8C,$4B,$06                ;
                defb $96,$52,$05                ;
                defb $A0,$5A,$04                ;
                defb $AA,$61,$03                ;
                defb $B4,$69,$02                ;
                defb $BE,$70,$01                ;
                defb $00,$00,$00                ;

ProjTab         defb $14,$0F,$44                ;
                defb $28,$1E,$45                ;
                defb $3C,$2D,$46                ;
                defb $55,$3C,$47                ;
                defb $55,$3C,$47                ;
                defb $3C,$2D,$46                ;
                defb $28,$1E,$45                ;
                defb $14,$0F,$44                ;
                defb $00,$00,$00                ;

Hole            defb -1                         ;
                defw DispForce                  ; Draw
                defw Ret0                       ; Shot
                defw HoleHit                    ; Coll
                defw HoleMissed                 ; Miss
                defw DoSizeCycle                ; Alter
                defw Ret0                       ; Move

                defb bbCursorClip               ; Flags
                defb 0                          ; StateF
                defb 0                          ; StarComp

                defw 0                          ; AXS
                defw 0                          ; AYS

                defw FixedSize                  ; SizeTab
                defb 1                          ; Cnt
                defw 0                          ; BdXS
                defw 0                          ; BdYS
                defw vMediumX                   ; BXS
                defw vMediumY                   ; BYS

                defb bbSetWind                  ; WindF

                defb $45                        ; Col

                defb 0                          ; CntA
                defb 0                          ; CntiA
                defb 0                          ; CntB
                defb 0                          ; CntiB

                defb 0                          ; WidthX
                defb 0                          ; WidthY
                defb 0                          ; ClipFlags

                defb 0                          ; Weapon

HoleEnd         equ $                           ; Length of a definition

Miss            defb -3                         ;
                defw DispMiss                   ;
                defw MissShot                   ;
                defw Ret0                       ;
                defw Ret0                       ;
                defw Ret0                       ;
                defw Ret0                       ;

                defb 0                          ;
                defb 0                          ;
                defb 3                          ;

                defw $100                       ;
                defw $100                       ;

                defw 0                          ;
                defb 1                          ;
                defw 0				;	
                defw 0				;			
                defw 0				;
                defw 0				;

                defb 0                          ;

                defb $45                        ;

                defb 1                          ;
                defb 20                         ;
                defb 0                          ;
                defb 0                          ;

                defb 2                          ;
                defb 2                          ;
                defb bbClipCent                 ;

                defb 0                          ;

SAM             defb -1                         ;

                defw DispSAM                    ;
                defw Ret0                       ;
                defw Ret0                       ;
                defw Ret0                       ;
                defw Ret0                       ;
                defw Ret0                       ;

                defb 0                          ;
                defb 0                          ;
                defb 3                          ;

                defw 0                          ;
                defw 0                          ;

                defw 0                          ;
                defb 1                          ;
                defw 0                          ;
                defw -140                       ;
                defw 0                          ;
                defw 0                          ;

                defb $00                        ;

                defb $45                        ;

                defb 40                         ;
                defb 40                         ;
                defb 2                          ;
                defb 0                          ;

                defb 2                          ;
                defb 2                          ;
                defb bbClipBelow                ;

                defb tMissA                     ;

TOW             defb -1                         ;
                defw DispSquTower               ;
                defw TowerShot                  ;
                defw TowerColl                  ;
                defw Ret0                       ;
                defw Ret0                       ;
                defw MoveTower                  ;

                defb bbScreenClip               ;
                defb 0                          ;
                defb 3                          ;

                defw $80                        ;
                defw $100                       ;

                defw 0                          ;
                defb 1                          ;
                defw MoveTower                  ;
                defw 0                          ;
                defw 0                          ;
                defw 0                          ;

                defb $00                        ;

                defb $45                        ;

                defb 40                         ;
                defb 40                         ;
                defb 2                          ;
                defb 0                          ;

                defb 2                          ;
                defb 2                          ;
                defb bbClipBelow                ;

                defb tMissA                     ;

Slugs           defb -3                         ;
                defw DispSlugs                  ;
                defw Ret0                       ;
                defw Ret0                       ;
                defw Ret0                       ;
                defw Ret0                       ;
                defw TestHit                    ;

                defb 0                          ;
                defb 0                          ;
                defb 0                          ;

                defw 0                          ;
                defw 0                          ;

                defw 0                          ;
                defb 28                         ;
                defw 200                        ;
                defw 0                          ;
                defw 0                          ;
                defw 0                          ;

                defb bSlug                      ;

                defb $45                        ;

                defb 40                         ;
                defb 1                          ;
                defb 0                          ;
                defb 0                          ;

                defb 0                          ;
                defb 0                          ;
                defb 0                          ;

                defb 0                          ;

MoveTower       ld a,(ix+dObjeStateF)           ;
                cp 1                            ;
                jr z,TowerFire                  ;

                dec (ix+dObjeCntA)              ;
                jr z,MTa                        ;

                ld l,(ix+dObjeY_L)              ;
                ld h,(ix+dObjeY_H)              ;
                ld e,(ix+dObjeBdYS_L)           ;
                ld d,(ix+dObjeBdYS_H)           ;

                add hl,de                       ;

                cp 2                            ;
                jr nz,MT0                       ;

                or a                            ;
                sbc hl,de                       ;
                or a                            ;
                sbc hl,de                       ;

MT0             ld (ix+dObjeY_L),l              ;
                ld (ix+dObjeY_H),h              ;

                ex de,hl                        ;
                ld hl,(GroundY)                 ;

                or a                            ;
                sbc hl,de                       ;
                ret p                           ;

                jp KillObject                   ;

MTa             ld (ix+dObjeStateF),$01         ;
                ret                             ;

TowerFire       ld a,r                          ;
                and $3F                         ;
                ret nz                          ;

                bit 7,(ix+dObjeY_H)             ;
                ret nz                          ;

                jp FireMissile                  ;

DispDiamond     ld l,(ix+dObjeX_L)              ;
                ld h,(ix+dObjeX_H)              ;

                ld e,(ix+dObjeZ_L)              ;
                ld d,(ix+dObjeZ_H)              ;
                ld (TempZ),de                   ;

                call ObjeDiv                    ;

                ld (X1),hl                      ;

                ld l,(ix+dObjeY_L)              ;
                ld h,(ix+dObjeY_H)              ;

                ld de,(TempZ)                   ;

                call ObjeDiv                    ;

                ld (Y1),hl                      ;

                ld hl,(X1)                      ;

                ld de,-128                      ;
                or a                            ;
                sbc hl,de                       ;
                jp m,KillObject                 ;

                ld de,255                       ;
                or a                            ;
                sbc hl,de                       ;
                jp p,KillObject                 ;

                set bOnScreen,(ix+dObjeFlags)   ;

                ld hl,300                       ;

                ld de,(TempZ)                   ;

                call ObjeDiv                    ;

                ex de,hl                        ;

                ld hl,(X1)                      ;
                add hl,de                       ;
                ld (X2),hl                      ;
                add hl,de                       ;
                ld (X3),hl                      ;

                ld hl,(X1)                      ;
                or a                            ;
                sbc hl,de                       ;
                ld (X4),hl                      ;
                or a                            ;
                sbc hl,de                       ;
                ld (X5),hl                      ;

                ld hl,(Y1)                      ;
                add hl,de                       ;
                ld (Y2),hl                      ;
                add hl,de                       ;
                ld (Y3),hl                      ;
                add hl,de                       ;
                ld (Y3a),hl                     ;

                ld hl,(Y1)                      ;
                or a                            ;
                sbc hl,de                       ;
                ld (Y4),hl                      ;
                or a                            ;
                sbc hl,de                       ;
                ld (Y5),hl                      ;
                or a                            ;
                sbc hl,de                       ;
                ld (Y5a),hl                     ;

                call UndrawLines                ;

                call AddFirstLine               ;
                ret c                           ;

                ld hl,(Y4)                      ;
                ld de,(Y2)                      ;
                ld bc,(X5)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(Y4)                      ;
                ld de,(Y2)                      ;
                ld bc,(X3)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(Y5)                      ;
                ld de,(Y3)                      ;
                ld bc,(X4)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,$0000                     ;
Y5a             equ .-2                         ;
                ld de,$0000                     ;
Y3a             equ .-2                         ;
                ld bc,(X1)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(Y5)                      ;
                ld de,(Y3)                      ;
                ld bc,(X2)                      ;

                jp VertLine                     ;

CodeSend        ld a,$10                        ;
                call AddScore                   ;

                jp AddCodes                     ;

DispSquMiss     call DispSquare                 ;
                bit 0,(ix+dObjeFlags)           ;
                ret nz                          ;

                jp KillObject                   ;

DispSquTower    ld l,(ix+dObjeX_L)              ;
                ld h,(ix+dObjeX_H)              ;
                ld (TempX),hl                   ;

                ld e,(ix+dObjeZ_L)              ;
                ld d,(ix+dObjeZ_H)              ;
                ld (TempZ),de                   ;

                ld c,(ix+dObjeAXS_L)            ;
                ld b,(ix+dObjeAXS_H)            ;
                or a                            ;
                sbc hl,bc                       ;

                ld (TempX1),hl                  ;

                push bc                         ;
                call ObjeDiv                    ;
                pop bc                          ;

                ld (X1),hl                      ;

                ld hl,(TempX)                   ;
                add hl,bc                       ;
                ld (TempXr),hl                  ;

                call ObjeDiv                    ;

                ld (X2),hl                      ;

                ld de,(X1)                      ;
                or a                            ;
                sbc hl,de                       ;

                ret m                           ;

                add hl,de                       ;
                ld bc,-128                      ;
                or a                            ;
                sbc hl,bc                       ;
                jp m,KillObject                 ;

                ld de,255                       ;
                or a                            ;
                sbc hl,de                       ;
                jp p,KillObject                 ;

                ld l,(ix+dObjeY_L)              ;
                ld h,(ix+dObjeY_H)              ;
                ld (TempY),hl                   ;
                ld de,(TempZ)                   ;

                call ObjeDiv                    ;

                ld (Y1),hl                      ;

                ld hl,(GroundY)                 ;
                ld de,(TempZ)                   ;

                call ObjeDiv                    ;

                ld (Y2),hl                      ;

                ld hl,(TempZ)                   ;
                ld c,(ix+dObjeAYS_L)            ;
                ld b,(ix+dObjeAYS_H)            ;

                add hl,bc                       ;

                ld (TempZ),hl                   ;

                ex de,hl                        ;

                ld hl,$0000                     ;
TempX1          equ .-2                         ;

                call ObjeDiv                    ;

                ld (X3),hl                      ;

                ld hl,$0000                     ;
TempXr          equ .-2                         ;

                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                      ;

                call UndrawLines                ;

                call AddFirstLine               ;
                ret c                           ;

                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                    ;

                ld de,(Y2)                      ;
                ld hl,(Y1)                      ;
                ld bc,(X1)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld de,(Y2)                      ;
                ld hl,(Y1)                      ;
                ld bc,(X2)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(X1)                      ;
                ld de,(X2)                      ;
                ld bc,(Y1)                      ;

                call HoriLine                   ;

                call c,AddLine                  ;

                ld hl,(X3)                      ;
                ld de,(X4)                      ;
                ld bc,(Y3)                      ;

                call HoriLine                   ;

                call c,AddLine                  ;

                ld hl,(X3)                      ;
                ld de,(X1)                      ;
                exx                             ;
                ld hl,(Y3)                      ;
                ld de,(Y1)                      ;
                exx                             ;

                call AnyLine                    ;

                call c,AddLine                  ;

                ld hl,(X4)                      ;
                ld de,(X2)                      ;
                exx                             ;
                ld hl,(Y3)                      ;
                ld de,(Y1)                      ;
                exx                             ;

                jp AnyLine                      ;

Towere          ld hl,(Y1)                      ;
                ld de,(Y2)                      ;
                ld bc,(X1)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(Y1)                      ;
                ld de,(Y2)                      ;
                ld bc,(X2)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(X1)                      ;
                ld de,(X2)                      ;
                ld bc,(Y1)                      ;

                jp HoriLine                     ;

Towerad         ld a,(Y1+1)                     ;
                bit 7,a                         ;
                jr nz,Towerd                    ;

                ld hl,(Y1)                      ;
                ld de,(Y2)                      ;
                ld bc,(X1)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(Y1)                      ;
                ld de,(Y2)                      ;
                ld bc,(X2)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(Y3)                      ;
                ld de,(Y4)                      ;
                ld bc,(X4)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(X1)                      ;
                ld de,(X2)                      ;
                ld bc,(Y1)                      ;

                call HoriLine                   ;

                call c,AddLine                  ;

                ld hl,(X3)                      ;
                ld de,(X4)                      ;
                ld bc,(Y3)                      ;

                call HoriLine                   ;

                call c,AddLine                  ;

                ld hl,(X3)                      ;
                ld de,(X1)                      ;
                exx                             ;
                ld hl,(Y3)                      ;
                ld de,(Y1)                      ;
                exx                             ;

                call AnyLine                    ;

                call c,AddLine                  ;

                ld hl,(X4)                      ;
                ld de,(X2)                      ;
                exx                             ;
                ld hl,(Y3)                      ;
                ld de,(Y1)                      ;
                exx                             ;

                jp AnyLine                      ;

Towerd          ld hl,(Y1)                      ;
                ld de,(Y2)                      ;
                ld bc,(X1)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(Y1)                      ;
                ld de,(Y2)                      ;
                ld bc,(X2)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(Y3)                      ;
                ld de,(Y4)                      ;
                ld bc,(X4)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(X1)                      ;
                ld de,(X2)                      ;
                ld bc,(Y1)                      ;

                call HoriLine                   ;

                call c,AddLine                  ;

                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                    ;

                ld hl,(Y1)                      ;
                ld de,(Y2)                      ;
                ld bc,(X1)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(Y1)                      ;
                ld de,(Y2)                      ;
                ld bc,(X2)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(Y3)                      ;
                ld de,(Y4)                      ;
                ld bc,(X3)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(X1)                      ;
                ld de,(X2)                      ;
                ld bc,(Y1)                      ;

                call HoriLine                   ;

                call c,AddLine                  ;

                ld hl,(X3)                      ;
                ld de,(X4)                      ;
                ld bc,(Y3)                      ;

                call HoriLine                   ;

                call c,AddLine                  ;

                ld hl,(X3)                      ;
                ld de,(X1)                      ;
                exx                             ;
                ld hl,(Y3)                      ;
                ld de,(Y1)                      ;
                exx                             ;

                call AnyLine                    ;

                call c,AddLine                  ;

                ld hl,(X4)                      ;
                ld de,(X2)                      ;
                exx                             ;
                ld hl,(Y3)                      ;
                ld de,(Y1)                      ;
                exx                             ;

                jp AnyLine                      ;

Towerf          ld hl,(Y1)                      ;
                ld de,(Y2)                      ;
                ld bc,(X1)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(Y1)                      ;
                ld de,(Y2)                      ;
                ld bc,(X2)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(Y3)                      ;
                ld de,(Y4)                      ;
                ld bc,(X3)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(X1)                      ;
                ld de,(X2)                      ;
                ld bc,(Y1)                      ;

                call HoriLine                   ;

                call c,AddLine                  ;

                ld hl,(X3)                      ;
                ld de,(X1)                      ;
                exx                             ;
                ld hl,(Y3)                      ;
                ld de,(Y1)                      ;
                exx                             ;

                jp AnyLine                      ;

TestHit         push ix                         ;

                ld a,(ix+dObjeOX_H)             ;
                add a,(ix+dObjeX_H)             ;
                rra                             ;
                ld d,a                          ;

                ld a,(ix+dObjeOY_H)             ;
                add a,(ix+dObjeY_H)             ;
                rra                             ;
                ld e,a                          ;

                exx                             ;

                ld e,(ix+dObjeOZ_L)             ;
                ld d,(ix+dObjeOZ_H)             ;
                ld b,0                          ;

TestH1p         ld (THtempIX),ix                ;

                ld l,(ix+dppObje_L)             ;
                ld h,(ix+dppObje_H)             ;
                ld a,h                          ;
                or l                            ;
                jr z,TestH1                     ;

                inc b                           ;

                push hl                         ;
                pop ix                          ;

                ld l,(ix+dObjeOZ_L)             ;
                ld h,(ix+dObjeOZ_H)             ;
                or a                            ;
                sbc hl,de                       ;

                jr nc,TestH1p                   ;

                ld ix,$0000                     ;
THtempIX        equ .-2                         ;

                dec b                           ;

                jp TestH2                       ;

TestH1          ld ix,(pObjeList)               ;

TestH2          ld a,b                          ;
                or a                            ;
                jr z,TestH4                     ;

                exx                             ;

                ld b,a                          ;

TestH3          ld a,(ix+dObjeClipFlags)        ;
                or a                            ;
                jr z,TestH3a                    ;

                ld a,(ix+dObjeOX_H)             ;
                add a,(ix+dObjeX_H)             ;
                rra                             ;

                sub d                           ;

                jp p,AbsX                       ;

                neg                             ;

AbsX            cp (ix+dObjeWidthX)             ;
                jr nc,TestH3a                   ;

                ld a,(ix+dObjeOY_H)             ;
                add a,(ix+dObjeY_H)             ;
                rra                             ;

                bit bClipCent,(ix+dObjeClipFlags);
                jr nz,TestCC                    ;

                cp e                            ;
                jp p,TestH3a                    ;

                jp TestTrue                     ;

TestCC          sub e                           ;

                jp p,AbsY                       ;

                neg                             ;

AbsY            cp (ix+dObjeWidthY)             ;
                jr nc,TestH3a                   ;

TestTrue        ld l,(ix+dObjeShot_L)           ;
                ld h,(ix+dObjeShot_H)           ;
                call CallHL                     ;

                push ix                         ;
                pop hl                          ;

                pop ix                          ;

                push iy                         ;

                push ix                         ;
                pop iy                          ;

                call aExpl                      ;

                push iy                         ;
                pop de                          ;

                pop iy                          ;

                ld bc,$000C                     ;
                add hl,bc                       ;

                ex de,hl                        ;
                add hl,bc                       ;
                ex de,hl                        ;

                ld bc,3*2                       ;
                ldir                            ;

                ret                             ;

TestH3a         ld l,(ix+dpnObje_L)             ;
                ld h,(ix+dpnObje_H)             ;
                push hl                         ;
                pop ix                          ;

                djnz TestH3                     ;

TestH4          pop ix                          ;
                ret                             ;

PlayerShot      ld a,(AType)                    ;
                ld b,a                          ;
                jp DoDamage                     ;

WarpHit         ld de,(pMap)                    ;

                ld iy,Tunnels                   ;

                ld bc,6                         ;

                ld a,12                         ;

FindTunnel      ld l,(iy+dTunnelPos1_L)         ;
                ld h,(iy+dTunnelPos1_H)         ;
                or a                            ;
                sbc hl,de                       ;
                jr z,WH1                        ;

                ld l,(iy+dTunnelPos2_L)         ;
                ld h,(iy+dTunnelPos2_H)         ;
                or a                            ;
                sbc hl,de                       ;
                jr z,WH2                        ;

                add iy,bc                       ;

                dec a                           ;
                jr nz,FindTunnel                ;

                ld hl,$6021                     ;
                ld a,3                          ;
                jr WH3                          ;

WH1             ld l,(iy+dTunnelPos2_L)         ;
                ld h,(iy+dTunnelPos2_H)         ;
                ld a,(iy+dTunnelAngle2)         ;

                jr WH3                          ;

WH2             ld l,(iy+dTunnelPos1_L)         ;
                ld h,(iy+dTunnelPos1_H)         ;
                ld a,(iy+dTunnelAngle1)         ;

WH3             ld (pMap),hl                    ;
                ld (Angle),a                    ;

                ld hl,(ArrowPos)                ;

                jp Print8x8                     ;

Tunnels         defw $6012                      ;
                defb $02                        ;
                defw $61FD                      ;
                defb $00                        ;

                defw $6106                      ;
                defb $00                        ;
                defw $61B2                      ;
                defb $06                        ;

                defw $6146                      ;
                defb $07                        ;
                defw $61C7                      ;
                defb $01                        ;

                defw $6063                      ;
                defb $02                        ;
                defw $6067                      ;
                defb $02                        ;

                defw $6098                      ;
                defb $02                        ;
                defw $617F                      ;
                defb $04                        ;

                defw $6095                      ;
                defb $02                        ;
                defw $615F                      ;
                defb $04                        ;

                defw $60F8                      ;
                defb $02                        ;
                defw $613F                      ;
                defb $04                        ;

                defw $605C                      ;
                defb $02                        ;
                defw $60D8                      ;
                defb $02                        ;

                defw $606E                      ;
                defb $01                        ;
                defw $60A5                      ;
                defb $05                        ;

                defw $616A                      ;
                defb $00                        ;
                defw $61E9                      ;
                defb $06                        ;

                defw $61B4                      ;
                defb $06                        ;
                defw $61CC                      ;
                defb $05                        ;

                defw $6076                      ;
                defb $04                        ;
                defw $61AE                      ;
                defb $04                        ;

HoleHit         bit bFake,(ix+dObjeStateF)      ;
                ret nz                          ;

                ld a,HoleScore                  ;
                jp AddScore                     ;

FuelHit         bit bFake,(ix+dObjeStateF)      ;
                ret nz                          ;

                ld b,FuelDam                    ;
                jp DoDamage                     ;

MissShot        ld a,MissScore                  ;
                call AddScore                   ;

                set bKilled,(ix+dObjeFlags)     ;
                ret                             ;

TowerShot       ld a,TowerScore                 ;
                call AddScore                   ;

                ld (ix+dObjeStateF),2           ;

                ld l,(ix+dObjeBdYS_L)           ;
                ld h,(ix+dObjeBdYS_H)           ;
                ld de,-20                       ;
                add hl,de                       ;
                ld (ix+dObjeBdYS_L),l           ;
                ld (ix+dObjeBdYS_H),h           ;

                ret                             ;

TowerColl       ld b,TowerDam                   ;
                call DoDamage                   ;

                ld a,TowerScore                 ;
                jp SubScore                     ;

HoleMissed      bit bFake,(ix+dObjeStateF)      ;
                ret nz                          ;

                ld a,(AType)                    ;
                ld b,a                          ;

                jp DoDamage                     ;

FixedSize       defb 255                        ;
                defw 0,0                        ;

                defb 0                          ;
                defw FixedSize                  ;

CreateObject    ld (TempAcc1),a                 ;
                and $3F                         ;
                ld (TempAcc),a                  ;

                push de                         ;
                push bc                         ;

                call AddObje                    ;

                pop bc                          ;
                pop de                          ;

                ret c                           ;

                call COinn                      ;

                ld a,0                          ;
TempAcc1        equ .-1                         ;

                and $C0                         ;
                or (iy+dObjeStateF)             ;
                ld (iy+dObjeStateF),a           ;

                ld a,(iy+dObjeStarComp)         ;
                neg                             ;
                jp LimitStarCnt                 ;

COinn           ld (iy+dObjeX_L),e              ;
                ld (iy+dObjeX_H),d              ;

                ld (iy+dObjeY_L),c              ;
                ld (iy+dObjeY_H),b              ;

                exx                             ;

                ld (iy+dObjedZ_L),l             ;
                ld (iy+dObjedZ_H),h             ;

                ld (iy+dObjedX_L),e             ;
                ld (iy+dObjedX_H),d             ;

                ld (iy+dObjedY_L),c             ;
                ld (iy+dObjedY_H),b             ;

                exx                             ;

                ld d,iyh                        ;
                ld e,iyl                        ;
                ld hl,dObjepLines_L             ;
                add hl,de                       ;

                ld b,8                          ;
                xor a                           ;

COlp            ld (hl),a                       ;
                inc hl                          ;
                ld (hl),a                       ;
                inc hl                          ;

                djnz COlp                       ;

                ld (hl),a                       ;
                inc hl                          ;

                ex de,hl                        ;

                ld l,0                          ;
TempAcc         equ .-1                         ;
                ld h,0                          ;

                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;

                ld bc,ObjectDescs               ;
                add hl,bc                       ;

                ld c,(hl)                       ;
                inc hl                          ;
                ld b,(hl)                       ;
                inc hl                          ;
                push bc                         ;

                ld c,(hl)                       ;
                inc hl                          ;
                ld b,(hl)                       ;
                inc hl                          ;
                push bc                         ;

                ld c,(hl)                       ;
                inc hl                          ;
                ld b,(hl)                       ;
                inc hl                          ;
                push bc                         ;

                ld a,(hl)                       ;
                inc hl                          ;
                ld h,(hl)                       ;
                ld l,a                          ;

                ld bc,HoleEnd-Hole              ;

                ldir                            ;

                pop de                          ;
                pop hl                          ;
                ret                             ;

CalcSquareA12   ld l,(ix+dObjeAXS_L)            ;
                ld h,(ix+dObjeAXS_H)            ;
                ld e,(ix+dObjeAYS_L)            ;
                ld d,(ix+dObjeAYS_H)            ;

                ld iy,X1                        ;

                jp CalcSquare                   ;

CalcSquareB12   ld l,(ix+dObjeBXS_L)            ;
                ld h,(ix+dObjeBXS_H)            ;
                ld e,(ix+dObjeBYS_L)            ;
                ld d,(ix+dObjeBYS_H)            ;

                ld iy,X1                        ;

                jp CalcSquare                   ;

CalcSquareA34   ld l,(ix+dObjeAXS_L)            ;
                ld h,(ix+dObjeAXS_H)            ;
                ld e,(ix+dObjeAYS_L)            ;
                ld d,(ix+dObjeAYS_H)            ;

                ld iy,X3                        ;

                jp CalcSquare                   ;

CalcSquareB34   ld l,(ix+dObjeBXS_L)            ;
                ld h,(ix+dObjeBXS_H)            ;
                ld e,(ix+dObjeBYS_L)            ;
                ld d,(ix+dObjeBYS_H)            ;

                ld iy,X3                        ;

                jp CalcSquare                   ;

CalcSquare      push de                         ;
                push hl                         ;

                ld c,(ix+dObjeX_L)              ;
                ld b,(ix+dObjeX_H)              ;

                add hl,bc                       ;

                ld e,(ix+dObjeZ_L)              ;
                ld d,(ix+dObjeZ_H)              ;

                push de                         ;
                push bc                         ;
                call ObjeDiv                    ;
                pop bc                          ;
                pop de                          ;

                ld (iy),l                       ;
                ld (iy+1),h                     ;

                pop hl                          ;

                ld a,l                          ;
                cpl                             ;
                ld l,a                          ;
                ld a,h                          ;
                cpl                             ;
                ld h,a                          ;
                inc hl                          ;

                add hl,bc                       ;

                push de                         ;
                call ObjeDiv                    ;
                pop de                          ;

                ld (iy+2),l                     ;
                ld (iy+3),h                     ;

                pop hl                          ;
                push hl                         ;

                ld c,(ix+dObjeY_L)              ;
                ld b,(ix+dObjeY_H)              ;

                add hl,bc                       ;

                ld e,(ix+dObjeZ_L)              ;
                ld d,(ix+dObjeZ_H)              ;

                push de                         ;
                push bc                         ;
                call ObjeDiv                    ;
                pop bc                          ;
                pop de                          ;

                ld (iy+4),l                     ;
                ld (iy+5),h                     ;

                pop hl                          ;

                ld a,l                          ;
                cpl                             ;
                ld l,a                          ;
                ld a,h                          ;
                cpl                             ;
                ld h,a                          ;
                inc hl                          ;

                add hl,bc                       ;

                push de                         ;
                call ObjeDiv                    ;
                pop de                          ;

                ld (iy+6),l                     ;
                ld (iy+7),h                     ;

                ret                             ;

ChaserA         dec (ix+dObjeCntA)              ;
                ret nz                          ;

                ld a,(ix+dObjeCntiA)            ;
                ld (ix+dObjeCntA),a             ;

                ld b,40                         ;
                ld c,57                         ;
                ld a,r                          ;
                and $31                         ;
                jp nz,OFAim                     ;

                ld (ix+dObjeCntiA),100          ;

                ld hl,ChaserB                   ;
                ld (ix+dObjeMove_L),l           ;
                ld (ix+dObjeMove_H),h           ;

ChaserB         dec (ix+dObjeCntA)              ;
                ret nz                          ;

                ld a,(ix+dObjeCntiA)            ;
                ld (ix+dObjeCntA),a             ;

                ld b,17                         ;
                ld c,20                         ;

                jp OFAim                        ;

OFAim           exx                             ;

                ld hl,(DeltaX)                  ;

                call NegHL                      ;
                call MissAimMult                ;

                ld e,(ix+dObjeX_L)              ;
                ld d,(ix+dObjeX_H)              ;
                or a                            ;
                sbc hl,de                       ;

                call MissAimDiv                 ;

                ld (ix+dObjedX_L),l             ;
                ld (ix+dObjedX_H),h             ;

                ld hl,(DeltaY)                  ;

                call NegHL                      ;
                call MissAimMult                ;

                ld e,(ix+dObjeY_L)              ;
                ld d,(ix+dObjeY_H)              ;
                or a                            ;
                sbc hl,de                       ;

                call MissAimDiv                 ;

                ld (ix+dObjedY_L),l             ;
                ld (ix+dObjedY_H),h             ;

                ld hl,(DeltaZ)                  ;

                call NegHL                      ;
                call MissAimMult                ;

                ld e,(ix+dObjeZ_L)              ;
                ld d,(ix+dObjeZ_H)              ;
                or a                            ;
                sbc hl,de                       ;

                call MissAimDiv                 ;

                ld (ix+dObjedZ_L),l             ;
                ld (ix+dObjedZ_H),h             ;

                ret                             ;

MissAimMult     exx                             ;
                ld a,c                          ;
                exx                             ;

                ld e,0                          ;
                ld d,a                          ;

                jp SignMult                     ;

MissAimDiv      exx                             ;
                ld a,b                          ;
                exx                             ;

                ld e,0                          ;
                ld d,a                          ;

                jp SignDiv                      ;

                dec (ix+dObjeCntA)              ;
                jr nz,DispExpl                  ;

KillObject      set bKilled,(ix+dObjeFlags)     ;
                ret                             ;

DispSlugs       dec (ix+dObjeCnt)               ;
                jp z,KillObject                 ;

                ld l,(ix+dObjeY_L)              ;
                ld h,(ix+dObjeY_H)              ;

                ld de,(GroundY)                 ;
                or a                            ;
                sbc hl,de                       ;

                jp p,KillObject                 ;

                add hl,de                       ;

                ld e,(ix+dObjeZ_L)              ;
                ld d,(ix+dObjeZ_H)              ;
                ld (TempZ),de                   ;

                call ObjeDiv                    ;

                ld (Y1),hl                      ;

                ld l,(ix+dObjeX_L)              ;
                ld h,(ix+dObjeX_H)              ;
                ld c,(ix+dObjeBdXS_L)           ;
                ld b,(ix+dObjeBdXS_H)           ;
                add hl,bc                       ;

                ld de,(TempZ)                   ;

                call ObjeDiv                    ;

                ld (X2),hl                      ;

                ld l,(ix+dObjeX_L)              ;
                ld h,(ix+dObjeX_H)              ;
                ld c,(ix+dObjeBdXS_L)           ;
                ld b,(ix+dObjeBdXS_H)           ;
                or a                            ;
                sbc hl,bc                       ;

                ld de,(TempZ)                   ;

                call ObjeDiv                    ;

                ld (X1),hl                      ;

                call UndrawLines                ;

                call AddFirstLine               ;
                ret c                           ;

                ld hl,(X1)                      ;
                ld de,(X2)                      ;
                ld bc,(Y1)                      ;

                call HoriLineEx                 ;

                bit bOnScreen,(ix+dObjeFlags)   ;
                ret nz                          ;

                jp KillObject                   ;

DispExpl        ld l,(ix+dObjeX_L)              ;
                ld h,(ix+dObjeX_H)              ;
                ld e,(ix+dObjeZ_L)              ;
                ld d,(ix+dObjeZ_H)              ;
                ld (TempZ),de                   ;

                call ObjeDiv                    ;

                ld (X1),hl                      ;

                ld bc,128                       ;
                add hl,bc                       ;
                ld a,h                          ;
                add a,2                         ;
                cp 4                            ;
                jp nc,KillObject                ;

                ld l,(ix+dObjeY_L)              ;
                ld h,(ix+dObjeY_H)              ;
                ld de,(TempZ)                   ;

                call ObjeDiv                    ;

                ld (Y1),hl                      ;

                ld bc,128                       ;
                add hl,bc                       ;

                ld a,h                          ;
                add a,2                         ;
                cp 4                            ;
                jp nc,KillObject                ;

                ld l,(ix+dObjepSizeTab_L)       ;
                ld h,(ix+dObjepSizeTab_H)       ;

                push hl                         ;
                pop iy                          ;

                ld hl,(TempZ)                   ;
                sra h                           ;
                rr l                            ;
                sra h                           ;
                rr l                            ;
                sra h                           ;
                rr l                            ;
                ld (TempZ),hl                   ;

                ld l,(iy)                       ;
                ld a,l                          ;
                or a                            ;
                jr nz,Expl1                     ;

                bit bRepeat,(ix+dObjeFlags)     ;
                jp z,KillObject                 ;

                ld l,(ix+dObjeAXS_L)            ;
                ld h,(ix+dObjeAXS_H)            ;
                push hl                         ;
                pop iy                          ;

                ld l,(iy)                       ;
Expl1           ld h,0                          ;
                inc iy                          ;

                ld de,(TempZ)                   ;

                call ObjeDiv                    ;
                ex de,hl                        ;

                ld hl,(X1)                      ;
                ld b,h                          ;
                ld c,l                          ;

                add hl,de                       ;
                ld (eX1),hl                     ;

                ld h,b                          ;
                ld l,c                          ;
                or a                            ;
                sbc hl,de                       ;

                ld (eX2),hl                     ;

                sra d                           ;
                rr e                            ;

                ld h,b                          ;
                ld l,c                          ;
                add hl,de                       ;

                ld (eX3),hl                     ;

                ld h,b                          ;
                ld l,c                          ;
                or a                            ;
                sbc hl,de                       ;

                ld (eX4),hl                     ;

                ld l,(iy)                       ;
                ld h,0                          ;

                inc iy                          ;

                ld de,(TempZ)                   ;

                call ObjeDiv                    ;
                ex de,hl                        ;

                ld hl,(Y1)                      ;
                ld b,h                          ;
                ld c,l                          ;
                add hl,de                       ;
                ld (eY1),hl                     ;

                ld h,b                          ;
                ld l,c                          ;
                or a                            ;
                sbc hl,de                       ;
                ld (eY2),hl                     ;

                sra d                           ;
                rr e                            ;

                ld h,b                          ;
                ld l,c                          ;
                add hl,de                       ;
                ld (eY3),hl                     ;

                ld h,b                          ;
                ld l,c                          ;
                or a                            ;
                sbc hl,de                       ;
                ld (eY4),hl                     ;

                ld a,(iy)                       ;
                ld (Colour),a                   ;

                inc iy                          ;

                push iy                         ;
                pop hl                          ;

                ld (ix+dObjepSizeTab_L),l       ;
                ld (ix+dObjepSizeTab_H),h       ;

                call UndrawLines                ;

                call AddFirstLine               ;
                ret c                           ;

                ld hl,(eX3)                     ;
                ld de,(eX1)                     ;
                ld bc,(eY4)                     ;

                call HoriLineEx                 ;

                call c,AddLine                  ;

                ld de,$0000                     ;
eX1             equ .-2                         ;
                ld hl,$0000                     ;
eX3             equ .-2                         ;
                ld bc,(eY3)                     ;

                call HoriLineEx                 ;

                call c,AddLine                  ;

                ld de,$0000                     ;
eX4             equ .-2                         ;
                ld hl,$0000                     ;
eX2             equ .-2                         ;
                ld bc,$0000                     ;
eY4             equ .-2                         ;

                call HoriLineEx                 ;

                call c,AddLine                  ;

                ld hl,(eX2)                     ;
                ld de,(eX4)                     ;
                ld bc,$0000                     ;
eY3             equ .-2                         ;

                call HoriLineEx                 ;

                call c,AddLine                  ;

                ld hl,(eX4)                     ;
                ld de,(eX3)                     ;
                ld bc,$0000                     ;
eY2             equ .-2                         ;

                call HoriLineEx                 ;

                call c,AddLine                  ;

                ld hl,(eX4)                     ;
                ld de,(eX3)                     ;
                ld bc,$0000                     ;
eY1             equ .-2                         ;

                jp HoriLineEx                   ;

ObjeNotShown    call UndrawLines                ;

                call AddFirstLine               ;

                ret                             ;

DispMiss        ld a,(ix+dObjeCol)              ;

                inc a                           ;
                and $03                         ;
                or $44                          ;
                ld (ix+dObjeCol),a              ;

                ld l,(ix+dObjeY_L)              ;
                ld h,(ix+dObjeY_H)              ;
                ld de,(GroundY)                 ;
                or a                            ;
                sbc hl,de                       ;
                or a                            ;
                bit 7,h                         ;
                jp z,KillObject                 ;

                ld e,(ix+dObjeZ_L)              ;
                ld d,(ix+dObjeZ_H)              ;
                ld (TempZ),de                   ;

                ld l,(ix+dObjeX_L)              ;
                ld h,(ix+dObjeX_H)              ;
                call ObjeDiv                    ;
                ld (X1),hl                      ;

                ld bc,128                       ;
                add hl,bc                       ;
                ld a,h                          ;
                add a,2                         ;
                cp 4                            ;
                jp nc,ObjeNotShown              ;

                ld l,(ix+dObjeY_L)              ;
                ld h,(ix+dObjeY_H)              ;
                ld de,(TempZ)                   ;
                call ObjeDiv                    ;
                ld (Y1),hl                      ;

                ld bc,128                       ;
                add hl,bc                       ;
                ld a,h                          ;
                add a,2                         ;
                cp 4                            ;
                jp nc,ObjeNotShown              ;

ShowMiss        ld hl,(TempZ)                   ;
                sra h                           ;
                rr l                            ;
                sra h                           ;
                rr l                            ;
                sra h                           ;
                rr l                            ;
                ld (TempZ),hl                   ;

                dec (ix+dObjeCnt)               ;
                ld a,(ix+dObjeCnt)              ;
                and $03                         ;

                jp z,Miss1                      ;

                dec a                           ;
                jp z,Miss2                      ;

                dec a                           ;
                jp z,Miss3                      ;

Miss4           ld hl,0                         ;
                exx                             ;
                ld hl,$28                       ;
                jp Miss0                        ;

Miss3           ld hl,$10                       ;
                exx                             ;
                ld hl,$24                       ;
                jp Miss0                        ;

Miss2           ld hl,$20                       ;
                exx                             ;
                ld hl,$20                       ;
                jp Miss0                        ;

Miss1           ld hl,$24                       ;
                exx                             ;
                ld hl,$10                       ;

Miss0           ld de,(TempZ)                   ;
                call ObjeDiv                    ;

                ex de,hl                        ;
                exx                             ;

                ld de,(TempZ)                   ;
                call ObjeDiv                    ;

                ex de,hl                        ;

                ld hl,(X1)                      ;
                add hl,de                       ;
                ld (mXa),hl                     ;

                or a                            ;
                sbc hl,de                       ;
                or a                            ;
                sbc hl,de                       ;

                ld (mXc),hl                     ;

                ld hl,(Y1)                      ;
                add hl,de                       ;
                ld (mYd),hl                     ;

                or a                            ;
                sbc hl,de                       ;
                or a                            ;
                sbc hl,de                       ;

                ld (mYb),hl                     ;

                exx                             ;

                ld hl,(X1)                      ;
                add hl,de                       ;
                ld (mXd),hl                     ;

                or a                            ;
                sbc hl,de                       ;
                or a                            ;
                sbc hl,de                       ;

                ld (mXb),hl                     ;

                ld hl,(Y1)                      ;
                add hl,de                       ;
                ld (mYc),hl                     ;

                or a                            ;
                sbc hl,de                       ;
                or a                            ;
                sbc hl,de                       ;

                ld (mYa),hl                     ;

                call UndrawLines                ;

                call AddFirstLine               ;
                ret c                           ;

                ld hl,$0000                     ;
mYa             equ .-2                         ;
                ld de,$0000                     ;
mYc             equ .-2                         ;
                exx                             ;
                ld hl,$0000                     ;
mXa             equ .-2                         ;
                ld de,$0000                     ;
mXc             equ .-2                         ;

                call AnyLine                    ;

                call c,AddLine                  ;

                ld a,(Colour)                   ;
                xor $03                         ;
                ld (Colour),a                   ;

                ld hl,$0000                     ;
mYb             equ .-2                         ;
                ld de,$0000                     ;
mYd             equ .-2                         ;
                exx                             ;
                ld hl,$0000                     ;
mXb             equ .-2                         ;
                ld de,$0000                     ;
mXd             equ .-2                         ;

                call AnyLine                    ;

                bit bOnScreen,(ix+dObjeFlags)   ;
                jp z,KillObject                 ;

                ret                             ;

DispSAM         dec (ix+dObjeCntA)              ;
                jp z,DispSAMns                  ;

                ld a,(ix+dObjeCntiB)            ;
                cp 1                            ;
                jr z,DispSAM1                   ;

                ld e,(ix+dObjeBdYS_L)           ;
                ld d,(ix+dObjeBdYS_H)           ;
                ld l,(ix+dObjeY_L)              ;
                ld h,(ix+dObjeY_H)              ;
                add hl,de                       ;
                ld (ix+dObjeY_L),l              ;
                ld (ix+dObjeY_H),h              ;

DispSAM1        ld l,(ix+dObjeX_L)              ;
                ld h,(ix+dObjeX_H)              ;
                ld e,(ix+dObjeZ_L)              ;
                ld d,(ix+dObjeZ_H)              ;
                ld (TempZ),de                   ;

                call ObjeDiv                    ;

                ld a,h                          ;
                add a,2                         ;
                cp 4                            ;
                jp nc,ObjeNotShown              ;

                ld (X1),hl                      ;

                ld l,(ix+dObjeY_L)              ;
                ld h,(ix+dObjeY_H)              ;
                ld de,(TempZ)                   ;
                call ObjeDiv                    ;
                ld (Y1),hl                      ;

                ld hl,(GroundY)                 ;
                ld de,(TempZ)                   ;
                call ObjeDiv                    ;
                ld (Y2),hl                      ;

                bit 0,(ix+dObjeStateF)          ;
                jr nz,SAMRising                 ;

                ld a,(ix+dObjeCntiB)            ;
                or a                            ;
                jr nz,SAMretreat                ;

                call ShowMiss                   ;

                res bKilled,(ix+dObjeFlags)     ;

                call AddLine                    ;

SAMa            ld hl,(Y1)                      ;
                ld de,(Y2)                      ;
                ld bc,(X1)                      ;

                jp VertLine                     ;

SAMretreat      call UndrawLines                ;

                call AddFirstLine               ;
                ret c                           ;

                jp SAMa                         ;

SAMRising       ld a,(ix+dObjeCntiB)            ;
                or a                            ;
                jr nz,SAMRisingret              ;

                call ShowMiss                   ;
                res bKilled,(ix+dObjeFlags)     ;

                call AddLine                    ;

SAMRisingA      ld de,(Y1)                      ;
                ld hl,(Y2)                      ;
                or a                            ;
                sbc hl,de                       ;

                sra h                           ;
                rr l                            ;

                ex de,hl                        ;

                ld hl,(X1)                      ;
                or a                            ;
                sbc hl,de                       ;
                push hl                         ;

                add hl,de                       ;
                add hl,de                       ;

                pop de                          ;
                ex de,hl                        ;
                ld bc,(Y2)                      ;

                jp HoriLine                     ;

SAMRisingret    call UndrawLines                ;

                call AddFirstLine               ;
                ret c                           ;

                jp SAMRisingA                   ;

DispSAMns       ld a,(ix+dObjeCntiB)            ;
                cp 2                            ;
                jp z,KillObject                 ;

                cp 1                            ;
                jr z,FireMiss                   ;

                inc (ix+dObjeCntiB)             ;

FireMiss        ld a,r                          ;
                and $07                         ;
                add a,4                         ;
                ld (ix+dObjeCntA),a             ;

                call FireMissile                ;

                dec (ix+dObjeCntB)              ;
                ret nz                          ;

DispSAMexit     ld (ix+dObjeCntiB),2            ;
                ld a,(ix+dObjeCntiA)            ;
                ld (ix+dObjeCntA),a             ;

                ld l,(ix+dObjeBdYS_L)           ;
                ld h,(ix+dObjeBdYS_H)           ;
                call NegHL                      ;
                ld (ix+dObjeBdYS_L),l           ;
                ld (ix+dObjeBdYS_H),h           ;

                ret                             ;

FireMissile     ld l,(ix+dObjeZ_L)              ;
                ld h,(ix+dObjeZ_H)              ;
                ld e,(ix+dObjeX_L)              ;
                ld d,(ix+dObjeX_H)              ;
                ld c,(ix+dObjeY_L)              ;
                ld b,(ix+dObjeY_H)              ;

                exx                             ;
                ld hl,0                         ;
                ld de,0                         ;
                ld bc,0                         ;
                exx                             ;

                push ix                         ;

                ld a,(ix+dObjeWeapon)           ;
                call CreateObject               ;

                pop ix                          ;

                ret                             ;

DispSquareB     call CalcSquareB34              ;

                ld hl,(X4)                      ;
                ld (ix+dObjeDispXL_L),l         ;
                ld (ix+dObjeDispXL_H),h         ;

                ld hl,(X3)                      ;
                ld (ix+dObjeDispXR_L),l         ;
                ld (ix+dObjeDispXR_H),h         ;

                ld hl,(Y4)                      ;
                ld (ix+dObjeDispYT_L),l         ;
                ld (ix+dObjeDispYT_H),h         ;

                ld hl,(Y3)                      ;
                ld (ix+dObjeDispYB_L),l         ;
                ld (ix+dObjeDispYB_H),h         ;

                jr DispSq1                      ;

DispSquare      call CalcSquareA34              ;

DispSq1         call UndrawLines                ;

                call AddFirstLine               ;
                ret c                           ;

                ld hl,(X4)                      ;
                ld de,(X3)                      ;
                ld bc,(Y3)                      ;

                call HoriLine                   ;

                call c,AddLine                  ;

                ld hl,(X4)                      ;
                ld de,(X3)                      ;
                ld bc,(Y4)                      ;

                call HoriLine                   ;

                call c,AddLine                  ;

                ld hl,(Y4)                      ;
                ld de,(Y3)                      ;
                ld bc,(X3)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(Y4)                      ;
                ld de,(Y3)                      ;
                ld bc,(X4)                      ;

                jp VertLine                     ;

DispIris        call CalcSquareB12              ;

                call DispSquare                 ;

                call c,AddLine                  ;

                ld hl,(X2)                      ;
                ld de,(X3)                      ;
                ld bc,(Y1)                      ;

                call HoriLine                   ;

                call c,AddLine                  ;

                ld hl,(X4)                      ;
                ld de,(X1)                      ;
                ld bc,(Y2)                      ;

                call HoriLine                   ;

                call c,AddLine                  ;

                ld hl,(Y2)                      ;
                ld de,(Y3)                      ;
                ld bc,(X2)                      ;

                call VertLine                   ;

                call c,AddLine                  ;

                ld hl,(Y4)                      ;
                ld de,(Y1)                      ;
                ld bc,(X1)                      ;

                call VertLine                   ;

                jp AlterWindow1                 ;

DispIrisA       call DispParaH                  ;

                jp AlterWindow1                 ;

DispIrisB       call CalcSquareB12              ;

                call DispSquare                 ;

                jp AlterWindow1                 ;

DispIrisC       call CalcSquareB12              ;

                jp AlterWindow1                 ;

DispParaH       call CalcSquareB12              ;

                call CalcSquareA34              ;

                call UndrawLines                ;

                call AddFirstLine               ;
                ret c                           ;

                ld hl,(X2)                      ;
                ld de,(X1)                      ;
                ld bc,(Y1)                      ;

                call HoriLine                   ;

                call c,AddLine                  ;

                ld hl,(X2)                      ;
                ld de,(X1)                      ;
                ld bc,(Y2)                      ;

                call HoriLine                   ;

                call c,AddLine                  ;

                ld hl,(X4)                      ;
                ld de,(X3)                      ;
                ld bc,(Y3)                      ;

                call HoriLine                   ;

                call c,AddLine                  ;

                ld hl,(X4)                      ;
                ld de,(X3)                      ;
                ld bc,(Y4)                      ;

                jp HoriLine                     ;

DispForce       call CalcSquareB12              ;

                ld l,(ix+dObjeFFH1_L)           ;
                ld h,(ix+dObjeFFH1_H)           ;
                ld de,0                         ;
                ld (ix+dObjeFFH1_L),e           ;
                ld (ix+dObjeFFH1_H),d           ;

                call Undrawlp                   ;

                call FFgetline                  ;
                ret c                           ;

                ld hl,(X2)                      ;
                ld de,(X1)                      ;
                ld bc,(Y1)                      ;

                call HoriLine                   ;

                push iy                         ;
                pop hl                          ;

                ld (ix+dObjeFFH1_L),l           ;
                ld (ix+dObjeFFH1_H),h           ;

                ld l,(ix+dObjeFFH2_L)           ;
                ld h,(ix+dObjeFFH2_H)           ;
                ld de,0                         ;

                call Undrawlp                   ;

                call FFgetline                  ;
                ret c                           ;

                ld hl,(X2)                      ;
                ld de,(X1)                      ;
                ld bc,(Y2)                      ;

                call HoriLine                   ;

                push iy                         ;
                pop hl                          ;

                ld (ix+dObjeFFH2_L),l           ;
                ld (ix+dObjeFFH2_H),h           ;

                ld l,(ix+dObjeFFV1_L)           ;
                ld h,(ix+dObjeFFV1_H)           ;
                ld de,0                         ;
                ld (ix+dObjeFFV1_L),e           ;
                ld (ix+dObjeFFV1_H),d           ;

                call Undrawlp                   ;

                call FFgetline                  ;
                ret c                           ;

                ld hl,(Y2)                      ;
                ld de,(Y1)                      ;
                ld bc,(X1)                      ;

                call VertLine                   ;

                push iy                         ;
                pop hl                          ;

                ld (ix+dObjeFFV1_L),l           ;
                ld (ix+dObjeFFV1_H),h           ;

                ld l,(ix+dObjeFFV2_L)           ;
                ld h,(ix+dObjeFFV2_H)           ;
                ld de,0                         ;
                ld (ix+dObjeFFV2_L),e           ;
                ld (ix+dObjeFFV2_H),d           ;

                call Undrawlp                   ;

                call FFgetline                  ;
                ret c                           ;

                ld hl,(Y2)                      ;
                ld de,(Y1)                      ;
                ld bc,(X2)                      ;

                call VertLine                   ;

                push iy                         ;
                pop hl                          ;

                ld (ix+dObjeFFV2_L),l           ;
                ld (ix+dObjeFFV2_H),h           ;

AlterWindow1    bit 6,(ix+dObjeStateF)          ;
                ret nz                          ;

                ld hl,(X2)                      ;
                ld (ix+dObjeDispXL_L),l         ;
                ld (ix+dObjeDispXL_H),h         ;

                ld hl,(X1)                      ;
                ld (ix+dObjeDispXR_L),l         ;
                ld (ix+dObjeDispXR_H),h         ;

                ld hl,(Y2)                      ;
                ld (ix+dObjeDispYT_L),l         ;
                ld (ix+dObjeDispYT_H),h         ;

                ld hl,(Y1)                      ;
                ld (ix+dObjeDispYB_L),l         ;
                ld (ix+dObjeDispYB_H),h         ;

AlterWindow     ld iy,(pcWindow)                ;

                ld l,(ix+dObjeZ_L)              ;
                ld h,(ix+dObjeZ_H)              ;
                ld (iy+dWindZ_L),l              ;
                ld (iy+dWindZ_H),h              ;

                ld hl,(X2)                      ;
                inc hl                          ;
                ld (iy+dWindL_L),l              ;
                ld (iy+dWindL_H),h              ;
                call SetLMargin                 ;

                ld hl,(X1)                      ;
                dec hl                          ;
                ld (iy+dWindR_L),l              ;
                ld (iy+dWindR_H),h              ;
                call SetRMargin                 ;

                ld hl,(Y2)                      ;
                inc hl                          ;
                ld (iy+dWindU_L),l              ;
                ld (iy+dWindU_H),h              ;
                call SetUMargin                 ;

                ld hl,(Y1)                      ;
                dec hl                          ;
                ld (iy+dWindD_L),l              ;
                ld (iy+dWindD_H),h              ;
                call SetDMargin                 ;

                ld bc,lWind                     ;
                add iy,bc                       ;
                ld hl,$7FFF                     ;
                ld (iy+dWindZ_L),l              ;
                ld (iy+dWindZ_H),h              ;

                ld (pcWindow),iy                ;

                ld a,$07                        ;
                ld (WindowMask),a               ;

                ret                             ;

AlterRHS        push hl                         ;

                ld hl,(pcWindow)                ;
                ld d,h                          ;
                ld e,l                          ;

                push hl                         ;
                pop iy                          ;

                ld bc,lWind                     ;
                or a                            ;
                sbc hl,bc                       ;

                ldir                            ;

                ld (pcWindow),de                ;

                pop hl                          ;
                dec hl                          ;

                ld (iy+dWindR_L),l              ;
                ld (iy+dWindR_H),h              ;
                call SetRMargin                 ;

                ld l,(ix+dObjeZ_L)              ;
                ld h,(ix+dObjeZ_H)              ;
                ld (iy+dWindZ_L),l              ;
                ld (iy+dWindZ_H),h              ;
                ld hl,$7FFF                     ;
                ld (iy+11),l                    ;
                ld (iy+12),h                    ;

                ret                             ;

DoSizeCycle     dec (ix+dObjeCnt)               ;
                jr z,NextCycle                  ;

                ld l,(ix+dObjeBdXS_L)           ;
                ld h,(ix+dObjeBdXS_H)           ;
                ld e,(ix+dObjeBXS_L)            ;
                ld d,(ix+dObjeBXS_H)            ;
                add hl,de                       ;
                ld (ix+dObjeBXS_L),l            ;
                ld (ix+dObjeBXS_H),h            ;

                ld l,(ix+dObjeBdYS_L)           ;
                ld h,(ix+dObjeBdYS_H)           ;
                ld e,(ix+dObjeBYS_L)            ;
                ld d,(ix+dObjeBYS_H)            ;
                add hl,de                       ;
                ld (ix+dObjeBYS_L),l            ;
                ld (ix+dObjeBYS_H),h            ;

                ret                             ;

NextCycle       ld hl,dObjepSizeTab_L           ;

                push ix                         ;
                pop de                          ;
                add hl,de                       ;

                ld e,(hl)                       ;
                inc hl                          ;
                ld d,(hl)                       ;
                inc hl                          ;

                ex de,hl                        ;

                ld a,(hl)                       ;
                or a                            ;
                jr z,NCloop                     ;

NCa             ld bc,5                         ;
                ldir                            ;

                ld (ix+dObjepSizeTab_L),l       ;
                ld (ix+dObjepSizeTab_H),h       ;

                ret                             ;

NCloop          inc hl                          ;
                ld a,(hl)                       ;
                inc hl                          ;
                ld h,(hl)                       ;
                ld l,a                          ;

                jp NCa                          ;

X1              defs 2                          ;
X2              defs 2                          ;
Y1              defs 2                          ;
Y2              defs 2                          ;

X3              defs 2                          ;
X4              defs 2                          ;
Y3              defs 2                          ;
Y4              defs 2                          ;

X5              defs 2                          ;
X6              defs 2                          ;
Y5              defs 2                          ;
Y6              defs 2                          ;

TempX           defs 2                          ;
TempY           defs 2                          ;
TempZ           defs 2                          ;

;  Start of PLAYER

PlayerFire      ld a,0                          ;
PFDel           equ .-1                         ;

                dec a                           ;
PFa             ld (PFDel),a                    ;

                and $03                         ;
                ret nz                          ;

                call kFire                      ;
                ld a,1                          ;
                jr z,PFa                        ;

                ld bc,0                         ;

                ld de,0                         ;

                ld hl,$0200                     ;

                exx                             ;

                ld hl,(FireDZ)                  ;
                ld de,(FireDX)                  ;
                ld bc,(FireDY)                  ;

                exx                             ;

                ld a,tProj                      ;
                jp CreateObject                 ;

AlterSteps      ld de,(XTurn)                   ;

                ld bc,0                         ;

                bit 7,d                         ;
                jr z,AX1                        ;

                dec bc                          ;

AX1             ld hl,(XTurnSum)                ;
                add hl,de                       ;
                ld (XTurnSum),hl                ;

                ld hl,(XTurnSum+2)              ;
                adc hl,bc                       ;
                ld (XTurnSum+2),hl              ;

                ld hl,(CellCount)               ;
                inc hl                          ;
                ld (CellCount),hl               ;

                call kDeccel                    ;
                jr nz,AlterSteps0               ;
                call kAccel                     ;
                jr z,AlterSteps2x               ;

                ld de,Zdvacc                    ;
                jr AlterSteps1                  ;

AlterSteps0     ld de,Zdvdec                    ;

AlterSteps1     ld hl,(DeltaZ)                  ;
                add hl,de                       ;

                ld de,MinSP                     ;
                or a                            ;
                sbc hl,de                       ;
                jp p,AlterSteps2                ;

                add hl,de                       ;
                ld de,MaxSP                     ;
                or a                            ;
                sbc hl,de                       ;
                jp m,AlterSteps2                ;

                add hl,de                       ;

                ex de,hl                        ;

AlterSteps2     ex de,hl                        ;
                ld (DeltaZ),hl                  ;

AlterSteps2x    call kLeft                      ;
                jr nz,AlterSteps2k              ;

                call kRight                     ;
                jp z,AlterSteps3x               ;

                ld a,2                          ;
                jr AlterSteps21                 ;

AlterSteps2k    call kRight                     ;
                jr nz,AlterSteps3x              ;

                ld a,1                          ;
AlterSteps21    ld b,a                          ;
                ld a,(OldX)                     ;
                cp b                            ;
                jr z,AlterSteps2a               ;

                ld hl,Xdtstep                   ;
                ld (Xvar),hl                    ;

AlterSteps2a    ld hl,(Xvar)                    ;
                ld de,dDX                       ;
                add hl,de                       ;
                ld (Xvar),hl                    ;

                ex de,hl                        ;
                ld hl,(XTurn)                   ;
                ld a,b                          ;
                ld (OldX),a                     ;

                bit 0,a                         ;
                call ASMakeTurn                 ;
                ld (XTurn),hl                   ;
                jr AlterSteps3                  ;

AlterSteps3x    ld de,Xdtstep                   ;
                ld (Xvar),de                    ;

AlterSteps3     call kUp                        ;
                jr nz,AlterSteps3k              ;

                call kDown                      ;
                jr z,AlterSteps4x               ;

                ld a,2                          ;
                jr AlterSteps31                 ;

AlterSteps3k    call kDown                      ;
                jr nz,AlterSteps4x              ;

                ld a,1                          ;
AlterSteps31    ld b,a                          ;
                ld a,(OldY)                     ;
                cp b                            ;
                jr z,AlterSteps3a               ;

                ld hl,Ydtstep                   ;
                ld (Yvar),hl                    ;

AlterSteps3a    ld hl,(Yvar)                    ;
                ld de,dDY                       ;
                add hl,de                       ;
                ld (Yvar),hl                    ;

                ld a,b                          ;
                ld (OldY),a                     ;

                bit 0,a                         ;
                ex de,hl                        ;

                ld hl,(YTurn)                   ;
                call ASMakeTurn                 ;
                ld (YTurn),hl                   ;
                jr AlterSteps4                  ;

AlterSteps4x    ld hl,Ydtstep                   ;
                ld (Yvar),hl                    ;

AlterSteps4     ld a,(YTurn+1)                  ;
                bit 7,a                         ;
                jr z,AlterSteps4a               ;

                ld hl,HighY                     ;
                call Inner                      ;
                jr nz,AlterSteps5               ;

                jr AlterSteps4c                 ;

AlterSteps4a    ld hl,LowY                      ;
                call Inner                      ;
                jr z,AlterSteps5                ;

AlterSteps4c    ld (YTurn),hl                   ;

AlterSteps5     ld hl,(DeltaZ)                  ;
                ld de,(YTurn)                   ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;

                call SignMult                   ;

                sra h                           ;
                rr l                            ;
                sra h                           ;
                rr l                            ;
                sra h                           ;
                rr l                            ;
                sra h                           ;
                rr l                            ;

                ld (DeltaY),hl                  ;

                call NegHL                      ;
                add hl,hl                       ;
                ld (FireDY),hl                  ;

                ld de,(XTurn)                   ;
                ld hl,(DeltaZ)                  ;

                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;

                call SignMult                   ;

                sra h                           ;
                rr l                            ;
                sra h                           ;
                rr l                            ;
                sra h                           ;
                rr l                            ;
                sra h                           ;
                rr l                            ;

                ld (DeltaX),hl                  ;

                call NegHL                      ;
                add hl,hl                       ;
                ld (FireDX),hl                  ;

                ld hl,(DeltaZ)                  ;
                call NegHL                      ;
                add hl,hl                       ;
                ld (FireDZ),hl                  ;

                ld de,ProjSP                    ;
                or a                            ;
                sbc hl,de                       ;
                or a                            ;
                bit 7,h                         ;
                ret z                           ;

                ld (FireDZ),de                  ;
                ld hl,ProjSP                    ;
                ld de,(YTurn)                   ;

                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;

                call SignMult                   ;

                sra h                           ;
                rr l                            ;
                sra h                           ;
                rr l                            ;
                sra h                           ;
                rr l                            ;
                sra h                           ;
                rr l                            ;

                ld (FireDY),hl                  ;

                ld hl,ProjSP                    ;
                ld de,(XTurn)                   ;

                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;

                call SignMult                   ;

                sra h                           ;
                rr l                            ;
                sra h                           ;
                rr l                            ;
                sra h                           ;
                rr l                            ;
                sra h                           ;
                rr l                            ;

                ld (FireDX),hl                  ;

                or a                            ;
                ret                             ;

Inner           ld de,(GroundY)                 ;
                or a                            ;
                sbc hl,de                       ;

                sra h                           ;
                rr l                            ;
                sra h                           ;
                rr l                            ;

                ld de,(DeltaZ)                  ;
                ex de,hl                        ;

                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;

                ex de,hl                        ;
                call SignDiv                    ;

                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;
                add hl,hl                       ;

                ld de,(YTurn)                   ;
                or a                            ;
                sbc hl,de                       ;

                bit 7,h                         ;
                add hl,de                       ;

                ret                             ;

Xvar            defw 3                          ;

AS4y            ld de,Ydtstep                   ;
                ld (Yvar),de                    ;
                jp AlterSteps4                  ;

Yvar            defw 1                          ;

OldX            defs 1                          ;
OldY            defs 1                          ;

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,$00FF                     ;

                ret                             ;

ASMT2           inc h                           ;
                jr nz,ASMT2a                    ;

                dec h                           ;
                ret                             ;

ASMT2a          ld hl,$FF00                     ;
                ret                             ;

DrawSights      ld de,(XTurn)                   ;

                ld a,(CType)                    ;
                add a,SightClipY & $FF        ;
                ld l,a                          ;

                ld a,SightClipY / 256           ;
                adc a,$00                       ;
                ld h,a                          ;

                ld b,(hl)                       ;

                ld hl,(YTurn)                   ;

                sra h                           ;
                rr l                            ;

                ld a,l                          ;
                xor $80                         ;
                ld l,a                          ;

                sra d                           ;
                rr e                            ;
                ld a,e                          ;

                xor $80                         ;
                cp 3                            ;

                jr nc,DrawSights1               ;

                ld a,3                          ;

                jp DrawSights3                  ;

DrawSights1     cp 251                          ;
                jr c,DrawSights3                ;

                ld a,251                        ;

DrawSights3     ld e,a                          ;

                ld h,DivTab / 256               ;
                ld a,(hl)                       ;

                sub 3                           ;
                jr nc,DrawSights3a              ;

                xor a                           ;

DrawSights3a    cp b                            ;
                jr c,DrawSights3b               ;

                ld a,b                          ;

DrawSights3b    ld l,a                          ;

                ld a,e                          ;
                sub 3                           ;
                rrca                            ;
                rrca                            ;
                rrca                            ;
                and $1F                         ;
                ld d,a                          ;
                ld a,e                          ;
                sub $03                         ;
                and $07                         ;
                add a,a                         ;
                add a,a                         ;
                add a,a                         ;
                add a,a                         ;
                ld c,a                          ;
                ld b,$00                        ;
                ld ix,Sights                    ;
                add ix,bc                       ;
                ld e,l                          ;
                ld hl,(SighDE)                  ;
                or a                            ;
                sbc hl,de                       ;
                ld a,l                          ;
                or h                            ;
                jr nz,PutS2                     ;
                push ix                         ;
                pop bc                          ;
                ld hl,(SighIX)                  ;
                or a                            ;
                sbc hl,bc                       ;
                ld a,l                          ;
                or h                            ;
                jr z,PutS1                      ;
PutS2           push ix                         ;
                push de                         ;
                call UnDrawSights               ;
                pop de                          ;
                pop ix                          ;
                ld (SighDE),de                  ;
                ld (SighIX),ix                  ;
PutS1           ld b,$07                        ;
PutClp          ld l,e                          ;
                ld h,YTable / 256               ;
                ld a,(hl)                       ;
                inc h                           ;
                ld h,(hl)                       ;
                add a,d                         ;
                ld l,a                          ;
                ld a,(ix)                       ;
                or (hl)                         ;
                ld (hl),a                       ;
                inc ix                          ;
                inc l                           ;
                ld a,(ix)                       ;
                or (hl)                         ;
                ld (hl),a                       ;
                inc e                           ;
                inc ix                          ;
                djnz PutClp                     ;
                ret                             ;

SightClipY      defb 159,159,161,185            ;

UnDrawSights    ld de,$0000                     ;
SighDE          equ .-2                         ;
                ld ix,$0000                     ;
SighIX          equ .-2                         ;

                ld b,7                          ;

RemClp          ld l,e                          ;
                ld h,YTable / 256               ;

                ld a,(hl)                       ;
                inc h                           ;
                ld h,(hl)                       ;
                add a,d                         ;
                ld l,a                          ;

                ld a,(ix)                       ; 
                cpl                             ;
                and (hl)                        ;
                ld (hl),a                       ;
                inc ix                          ;
                inc l                           ;
                ld a,(ix)                       ;
                cpl                             ;
                and (hl)                        ;
                ld (hl),a                       ;
                inc e                           ; 
                inc ix                          ; 
                djnz RemClp                     ;
                ret                             ;

Sights          defb $C6,$00,$C6,$00,$28,$00,$00,$00;
                defb $28,$00,$C6,$00,$C6,$00,$00,$00;
                defb $63,$00,$63,$00,$14,$00,$00,$00;
                defb $14,$00,$63,$00,$63,$00,$00,$00;
                defb $31,$80,$31,$80,$0A,$00,$00,$00;
                defb $0A,$00,$31,$80,$31,$80,$00,$00;
                defb $18,$C0,$18,$C0,$05,$00,$00,$00;
                defb $05,$00,$18,$C0,$18,$C0,$00,$00;
                defb $0C,$60,$0C,$60,$02,$80,$00,$00;
                defb $02,$80,$0C,$60,$0C,$60,$00,$00;
                defb $06,$30,$06,$30,$01,$40,$00,$00;
                defb $01,$40,$06,$30,$06,$30,$00,$00;
                defb $03,$18,$03,$18,$00,$A0,$00,$00;
                defb $00,$A0,$03,$18,$03,$18,$00,$00;
                defb $01,$8C,$01,$8C,$00,$50,$00,$00;
                defb $00,$50,$01,$8C,$01,$8C,$00,$00;

InitVars        ld hl,0                         ;
                ld (DeltaX),hl                  ;
                ld (DeltaY),hl                  ;
                ld (XTurn),hl                   ;
                ld (YTurn),hl                   ;

                ld hl,StartZ                    ;
                ld (DeltaZ),hl                  ;

                ld hl,0                         ;
                ld (GroundX),hl                 ;
                ld (GroundZ),hl                 ;

                ld hl,StartY                    ;
                ld (GroundY),hl                 ;

                xor a                           ;
                ld (OldX),a                     ;
                ld (OldY),a                     ;

                ld hl,$0F59                     ;
                ld (SighDE),hl                  ;

                ld hl,$A93F                     ;
                ld (SighIX),hl                  ;
                ret                             ;

;  End of PLAYER

lCodeA          defw vPsi9,$2000		;
                defw vPsi8,$2000		;
                defw vPsi7,$2000		;
                defw vPsi6,$2000		;
                defw vPsi5,$3000		;
                defw vPsi4,$3000		;
                defw vPsi3,$2000		;
                defw vPsi2,$2000		;
                defw vPsi1,$3000		;
                defw vPsi2,$3000		;
                defw vPsi2,$3000		;
                defw vPsi2,$3000		;
                defw 0				;

lCodeB          defw vPsi7,$2000		;
                defw vPsi9,$1000		;
                defw vPsi4,$2000		;
                defw vPsi18,$2000		;
                defw vPsi17,$3000		;
                defw vPsi16,$3000		;
                defw vPsi15,$2000		;
                defw vPsi13,$2000		;
                defw vPsi12,$3000		;
                defw vPsi5,$3000		;
                defw vPsi11,$2000		;
                defw vPsi10,$2000		;
                defw vPsi13,$4000		;
                defw vPsi2,$4000		;
                defw vPsi13,$4000		;
                defw 0				;

lCodeC          defw vPsi7,$2000		; Oh, to hell with these ;'s!
                defw vPsi13,$1000		; You want 'em. you add 'em...
                defw vPsi6,$2000
                defw vPsi5,$2000
                defw vPsi12,$3000
                defw vPsi19,$3000
                defw vPsi4,$2000
                defw vPsi8,$2000
                defw vPsi12,$3000
                defw vPsi8,$3000
                defw vPsi20,$2000
                defw vPsi5,$3000
                defw vPsi12,$3000
                defw vPsi24,$3000
                defw 0

lCodeD          defw vPsi27,$2000
                defw vPsi30,$1000
                defw vPsi11,$2000
                defw vPsi24,$2000
                defw vPsi28,$3000
                defw vPsi2,$3000
                defw vPsi5,$2000
                defw vPsi6,$2000
                defw vPsi2,$3000
                defw vPsi12,$3000
                defw vPsi27,$2000
                defw vPsi26,$2000
                defw vPsi24,$3000
                defw vPsi6,$2000
                defw vPsi12,$4000
                defw 0

lFuelA          defw vPsi46,$2000
                defw vPsi47,$1000
                defw vPsi46,$2000
                defw vPsi47,$2000
                defw vPsi46,$3000
                defw vPsi17,$3000
                defw vPsi46,$2000
                defw 0

lFuelB          defw vPsi46,$2000
                defw vPsi27,$1000
                defw vPsi46,$2000
                defw vPsi8,$2000
                defw vPsi47,$3000
                defw vPsi6,$3000
                defw vPsi3,$2000
                defw 0

lFuelC          defw vPsi46,$2000
                defw vPsi2,$1000
                defw vPsi46,$2000
                defw vPsi12,$2000
                defw vPsi46,$3000
                defw vPsi12,$3000
                defw vPsi46,$2000
                defw 0

lFuelD          defw vPsi46,$2000
                defw vPsi19,$1000
                defw vPsi46,$2000
                defw vPsi19,$2000
                defw vPsi12,$3000
                defw vPsi19,$3000
                defw vPsi46,$2000
                defw 0

lSAMA           defw vPsi8,$3220
                defw vPsi2,$2450
                defw vPsi11,$3430
                defw vPsi2,$3123
                defw vPsi28,$3760
                defw vPsi2,$3060
                defw vPsi5,$2900
                defw vPsi2,$2800
                defw vPsi15,$3030
                defw vPsi2,$3300
                defw vPsi2,$2323
                defw vPsi2,$3435
                defw vPsi6,$2123
                defw 0

lSAMB           defw vPsi12,$3235
                defw vPsi3,$2433
                defw vPsi5,$3463
                defw vPsi18,$3575
                defw vPsi19,$3320
                defw vPsi2,$3650
                defw vPsi12,$3550
                defw vPsi2,$3004
                defw vPsi24,$3043
                defw vPsi2,$3600
                defw 0

lSAMC           defw vPsi2,$4000
                defw vPsi12,$3000
                defw vPsi3,$4000
                defw vPsi24,$3000
                defw vPsi19,$4000
                defw vPsi2,$3000
                defw vPsi18,$4000
                defw vPsi2,$3000
                defw vPsi5,$4000
                defw vPsi2,$4400
                defw 0

lSAMD           defw vPsi13,$3100
                defw vPsi12,$3000
                defw vPsi13,$3430
                defw vPsi12,$3000
                defw vPsi16,$3330
                defw vPsi2,$3000
                defw vPsi16,$3456
                defw vPsi18,$3000
                defw vPsi5,$3650
                defw 0

lThreeA         defw vPsi27,$5000
                defw vPsi30,$5000
                defw vPsi11,$5000
                defw vPsi24,$5000
                defw vPsi28,$5000
                defw vPsi2,$5000
                defw vPsi2,$5500
                defw 0

lThreeB         defw vPsi16,$5000
                defw vPsi27,$5000
                defw vPsi11,$5000
                defw vPsi24,$5000
                defw vPsi17,$5000
                defw vPsi2,$5000
                defw vPsi5,$5000
                defw vPsi6,$5000
                defw 0

lThreeC         defw vPsi27,$5000
                defw vPsi11,$5000
                defw vPsi16,$5000
                defw vPsi24,$5000
                defw vPsi2,$5000
                defw vPsi2,$5000
                defw vPsi5,$5000
                defw vPsi15,$5000
                defw 0

lThreeD         defw vPsi2,$5000
                defw vPsi19,$5000
                defw vPsi13,$5000
                defw vPsi9,$5000
                defw vPsi5,$5000
                defw vPsi17,$5000
                defw vPsi28,$5000
                defw vPsi15,$5000
                defw 0

lDeath          defw vPsi2,$2000
                defw vPsi3,$2000
                defw vPsi4,$2000
                defw vPsi5,$2000
                defw vPsi6,$3000
                defw vPsi7,$2000
                defw vPsi8,$2000
                defw vPsi9,$2000
                defw vPsi11,$3000
                defw vPsi12,$3000
                defw 0

Abs             equ 0                           ; [relents] Oh, all right.
RelX            equ 1                           ; They give a nice, finished appearence
RelY            equ 2                           ; to the line.
RelXY           equ 3                           ;

IrisDemo        defb tIris or bbFake            ;
                defw -$2000,-800,$6000          ;

                defb Abs                        ;

                defb tIris or bbFake            ;
                defw $2000,-800,$6000           ;

                defb Abs                        ;

                defb tIris                      ;
                defw 0,-800,$6100               ;

                defb Abs                        ;

                defb $FF                        ;

HoleDemo        defb tFHoleL or bbFake          ;
                defw -$2000,-800,$6000          ;

                defb Abs                        ;

                defb tFHoleL or bbFake          ;
                defw $2000,-800,$6000           ;

                defb Abs                        ;

                defb tFHoleL                    ;
                defw 0,-800,$6100               ;

                defb Abs                        ;

                defb $FF                        ;

SAMDemo         defb tSAMSqu                    ;
                defw -$2000,0,$6000             ;

                defb Abs                        ;

                defb tSAMs                      ;
                defw 0,0,$6100                  ;

                defb Abs                        ;

                defb tSAMSqu                    ;
                defw $2000,0,$6000              ;

                defb Abs                        ;

                defb $FF                        ;

TowerDemo       defb tTowerL                    ;
                defw -$2000,0,$6000             ;

                defb Abs                        ;

                defb tTowerL                    ;
                defw $2000,0,$6000              ;

                defb Abs                        ;

                defb tBunker                    ;
                defw 0,0,$6100                  ;

                defb Abs                        ;

                defb $FF                        ;

CodeDemo        defb tCodeXmit1                 ;
                defw 0,0,$6400                  ;

                defb Abs                        ;

                defb $FF                        ;

vPsi1           defb tCodeXmit1                 ;
                defw 0,0,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi2           defb tSAMSqu                    ;
                defw -$3000,0,$6000             ;

                defb Abs                        ;

                defb tSAMSqu                    ;
                defw $3000,0,$6000              ;

                defb Abs                        ;

                defb $FF                        ;

vPsi3           defb tTowerM                    ;
                defw 0,0,$6000                  ;

                defb Abs                        ;

                defb $FF                        ;

vPsi4           defb tFHoleL or bbFake          ;
                defw -$3000,-1000,$6000         ;

                defb Abs                        ;

                defb tFHoleL or bbFake          ;
                defw $3000,-1000,$6000          ;

                defb Abs                        ;

                defb tFHoleL                    ;
                defw 0,-1000,$6080              ;

                defb Abs                        ;

                defb $FF                        ;

vPsi5           defb tTowerM                    ;
                defw -$3000,0,$5000             ;

                defb Abs                        ;

                defb tTowerM                    ;
                defw $3000,0,$5000              ;

                defb Abs                        ;

                defb tTowerS                    ;
                defw 0,0,$6000                  ;

                defb Abs                        ;

                defb $FF                        ;

vPsi6           defb tTowerM                    ;
                defw -$3000,0,$6000             ;

                defb Abs                        ;

                defb tTowerM                    ;
                defw $3000,0,$6000              ;

                defb Abs                        ;

                defb tTowerS                    ;
                defw 0,0,$6000                  ;

                defb Abs                        ;

                defb $FF                        ;

vPsi7           defb tBunker                    ;
                defw -$3000,0,$5000             ;

                defb Abs                        ;

                defb tBunker                    ;
                defw $3000,0,$5000              ;

                defb Abs                        ;

                defb tSAMs                      ;
                defw -$1000,0,$6000             ;

                defb Abs                        ;

                defb tSAMs                      ;
                defw $1000,0,$6000              ;

                defb Abs                        ;

                defb tSAMs                      ;
                defw 0,0,$6000                  ;

                defb Abs                        ;

                defb $FF                        ;

vPsi8           defb tFHoleM                    ;
                defw 0,-$500,$5000

                defb Abs                        ;

                defb tBunker                    ;
                defw 0,0,$5800

                defb Abs                        ;

                defb tFHoleM                    ;
                defw 0,-$1000,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi9           defb tTowerM                    ;
                defw -$3000,0,$6000

                defb Abs                        ;

                defb tTowerM                    ;
                defw $3000,0,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi10          defb tBunker                    ;
                defw -$3000,0,$5000

                defb Abs                        ;

                defb tBunker                    ;
                defw $3000,0,$5000

                defb Abs                        ;

                defb tBunker                    ;
                defw 0,0,$4000

                defb Abs                        ;

                defb tBunker                    ;
                defw 0,0,$6000

                defb Abs                        ;

                defb tCodeXmit                  ;
                defw 0,0,$5000

                defb Abs                        ;

                defb $FF                        ;

vPsi11          defb tFHoleL                    ;
                defw 0,-1000,$4800

                defb Abs                        ;

                defb tTowerM                    ;
                defw 0,0,$5000

                defb Abs                        ;

                defb tSAMs                      ;
                defw -$2000,0,$6000

                defb Abs                        ;

                defb tSAMs                      ;
                defw -$1000,0,$6000

                defb Abs                        ;

                defb tSAMs                      ;
                defw $1000,0,$6000

                defb Abs                        ;

                defb tSAMs                      ;
                defw $2000,0,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi12          defb tSAMSqu                    ;
                defw -$2000,0,$6000

                defb Abs                        ;

                defb tSAMSqu                    ;
                defw $2000,0,$6000

                defb Abs                        ;

                defb tSAMSqu                    ;
                defw 0,0,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi13          defb tRising                    ;
                defw -$2000,0,$6000

                defb Abs                        ;

                defb tRising                    ;
                defw $2000,0,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi14          defb $FF                        ;

vPsi15          defb tTowerM                    ;
                defw -$2000,0,$6000

                defb Abs                        ;

                defb tTowerM                    ;
                defw $2000,0,$6000

                defb Abs                        ;

                defb tTowerS                    ;
                defw 0,0,$5000

                defb Abs                        ;

                defb $FF                        ;

vPsi16          defb tTowerS                    ;
                defw 0,0,Attrs

                defb Abs                        ;

                defb tIris                      ;
                defw 0,$FC18,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi17          defb tTowerL                    ;
                defw -$1700,0,$5000

                defb Abs                        ;

                defb tTowerL                    ;
                defw $1700,0,$5000

                defb Abs                        ;

                defb tBunker                    ;
                defw -$3000,0,$6000

                defb Abs                        ;

                defb tBunker                    ;
                defw $3000,0,$6000

                defb Abs                        ;

                defb tBunker                    ;
                defw 0,0,$6000                  ;

                defb Abs                        ;

                defb $FF                        ;

vPsi18          defb tTowerL                    ;
                defw $E900,0,$5000

                defb Abs                        ;

                defb tTowerL                    ;
                defw $1700,0,$5000

                defb Abs                        ;

                defb tRising                    ;
                defw 0,0,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi19          defb tBunker                    ;
                defw -$1000,0,$6000

                defb Abs                        ;

                defb tBunker                    ;
                defw $1000,0,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi20          defb tCodeXmit                  ;
                defw 0,0,$6000

                defb Abs                        ;

                defb tRising                    ;
                defw -$2000,0,$6000

                defb Abs                        ;

                defb tRising                    ;
                defw $2000,0,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi21          defb tIris                      ;
                defw 0,$FC18,$5000

                defb Abs                        ;

                defb tSAMs                      ;
                defw -$1000,0,Attrs

                defb Abs                        ;

                defb tSAMs                      ;
                defw $1000,0,Attrs

                defb Abs                        ;

                defb tFHoleL                    ;
                defw 0,$FC18,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi24          defb tSAMSqu                    ;
                defw -$2000,0,$6000

                defb Abs                        ;

                defb tSAMSqu                    ;
                defw $2000,0,$6000

                defb Abs                        ;

                defb tSAMs                      ;
                defw -$1000,0,$6000

                defb Abs                        ;

                defb tSAMs                      ;
                defw 0,0,$6000

                defb Abs                        ;

                defb tSAMs                      ;
                defw $1000,0,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi25          defb tSAMSqu                    ;
                defw $E800,0,$6000

                defb Abs                        ;

                defb tSAMSqu                    ;
                defw $1800,0,$6000

                defb Abs                        ;

                defb tBunker                    ;
                defw 0,0,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi26          defb tBunker                    ;
                defw $E800,0,$6000

                defb Abs                        ;

                defb tIris                      ;
                defw 0,0,$6000

                defb Abs                        ;

                defb tBunker                    ;
                defw $1800,0,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi27          defb tBunker                    ;
                defw $E800,0,$6000

                defb Abs                        ;

                defb tBunker                    ;
                defw 0,0,$5000

                defb Abs                        ;

                defb tBunker                    ;
                defw $1800,0,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi28          defb tIris                      ;
                defw 0,$FC18,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi29          defb tTowerS                    ;
                defw 0,0,$6000

                defb Abs                        ;

                defb tSAMm                      ;
                defw $E800,0,$6000

                defb Abs                        ;

                defb tSAMs                      ;
                defw $D000,0,$6000

                defb Abs                        ;

                defb tSAMs                      ;
                defw $3000,0,$6000

                defb Abs                        ;

                defb tSAMm                      ;
                defw $1800,0,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi30          defb tRising                    ;
                defw -$2000,0,$6000

                defb Abs                        ;

                defb tRising                    ;
                defw $2000,0,$6000

                defb Abs                        ;

                defb tBunker                    ;
                defw 0,0,$6000

                defb Abs                        ;

                defb $FF                        ;

vPsi47          defb tFuel                      ;
                defw -$2000,$FC18,$6000

                defb Abs                        ;

                defb tFuel                      ;
                defw $2000,$FC18,$6000

                defb Abs                        ;

vPsi46          defb tFuel                      ;
                defw 0,$FC18,$6000

                defb Abs                        ;

                defb $FF                        ;

CellVectors     defw lThreeA                    ;
                defw lThreeB                    ;
                defw lThreeC                    ;
                defw lThreeA                    ;
                defw lThreeB                    ;
                defw lThreeC                    ;
                defw lThreeA                    ;
                defw lThreeC                    ;

                defw lStraightB                 ;
                defw lStraightC                 ;
                defw lStraightD                 ;
                defw lStraightE                 ;
                defw lWarpGate                  ;
                defw lWarpGate                  ;
                defw lStraightE                 ;
                defw lStraightC                 ;

                defw lStraightA                 ;
                defw lStraightA                 ;
                defw lStraightA                 ;
                defw lStraightA                 ;
                defw lStraightA                 ;
                defw lStraightA                 ;
                defw lStraightA                 ;
                defw lStraightA                 ;

                defw lAntiClock                 ;
                defw lAntiClock                 ;
                defw lAntiClock                 ;
                defw lAntiClock                 ;
                defw lAntiClock                 ;
                defw lAntiClock                 ;
                defw lAntiClock                 ;
                defw lAntiClock                 ;

                defw lSAMA                      ;
                defw lSAMB                      ;
                defw lSAMC                      ;
                defw lSAMD               
