;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;   1:57 pm 27/3/84   Dark Star (?)
;   3:39 pm 29/3/84   Began towers
;   9:26 pm  6/4/84   Finished Towers
;
;   Spectrum version
;
;   I've grafted the FP front end on to
;   provide user defined keys.
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Assemble this with the zeus.exe assembler
; from www.desdes.com
;

; This command tells Zeus where to put the code it generates
; change the filename to suit yourself

		output_szx "c:\ds1.szx",$0000,Main 	; The szx file

; 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                           ;

; 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                  ;

; These are the Krell meter 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;

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 DispMain                   ; 2
                defw DispCont                   ; 3
                defw DispMain                   ; 4
                defw DispMain                   ; 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                  ;

	jr 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                  ;

                ; Carry on

                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                  ;
                defb "Energy",0

                ld a,$CE                        ;
                ld (pCurX),a                    ;

                call PrintStr1                  ;
                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                  ;
                defb "Angle",0

                xor a                           ;
                ld (pCurX),a                    ;

                ld hl,$50A0                     ;
                ld (pCurY),hl                   ;

                call PrintStr1                  ;
                defb "Energy",0

                ld a,$B8                        ;
                ld (pCurX),a                    ;

                call PrintStr1                  ;
                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

sMainMenu       defb $07,$0C,$86
                defb "Dark Star - Demo"
                defb $0D,$0D
                defb $03
                defb "An early version with the FP front end"
                defb $0D
                defb "bolted on to provide keys.."
		defb $0D,$0D
                defb $07
                defb " 1 "
                defb $03
                defb " Play the game"
                defb $07
                defb $0D,$0D
                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 $07
                defb $0D,$0D
                defb $0D,$0D
                defb $0D
                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 [Massaged for zx-spin :( ]",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...
;

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)                         ;

;  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                   ;






; This is where the Dark Star source starts, it is unmodified from 1984...
; - oh, except that I changed the number of shields to 10, it was 1.

;
;
nStar          EQU 18
lStar          EQU 9
StarX          EQU 0
StarY          EQU 2
StarZ          EQU 4
StarAddr       EQU 6
StarBit        EQU 8
;
;
nProj          EQU 14
lProj          EQU 19
ProjX          EQU 0
ProjY          EQU 2
ProjZ          EQU 4
ProjAddr       EQU 6
ProjBit        EQU 8
ProjLife       EQU 9
ProjDX         EQU 10
ProjDY         EQU 12
ProjDZ         EQU 14
ProjOldX       EQU 17
ProjOldZ       EQU 16
ProjOldY       EQU 18
Range          EQU 30
FireDelay      EQU 1
ProjSp         EQU 1400
;
;
StartY         EQU  700
LowY           EQU  500
HighY          EQU  24000
MinSp          EQU  180
MaxSp          EQU  1200
StartZ         EQU  -MinSp-1
Zdvstep        EQU  -28
Xdtstep        EQU  5
dDX            EQU  2
Ydtstep        EQU  5
dDY            EQU  2
;
;
nObje          EQU 6
lObje          EQU 256
ObjeX          EQU 0
ObjeY          EQU 2
ObjeZ          EQU 4
ObjeDY         EQU 6
ObjeState      EQU 8
ObjeCnt        EQU 9
ObjepMove      EQU 10
ObjeFlag       EQU 12
; Bit 0 1 = Alive
; Bit 1 1 = Can Fire
; Bit 2 1 = Can be shot
; Bit 3 1 = Can be hit
; Bit 4 1 = Can explode
; Bit 5 1 = Does not stop bullets
; Bit 6 1 = Scores if flown through
ObjeOldX       EQU 14
ObjeHSize      EQU 13
ObjeOldZ       EQU 15
ObjepShp       EQU 16
ObjenShp       EQU 18
ObjedX         EQU 19
ObjedY         EQU 21
ObjedZ         EQU 23
ObjeCol        EQU 25
ObjeMiss       EQU 26
ObjeOldLines   EQU 27
GrowthRate     EQU -400
ShrinkRate     EQU -200
lObjeLine      EQU 21
TWidth         EQU #100
GWidth         EQU #200
TMAWidth       EQU #680
HoriBitl       EQU 2
HoriBitr       EQU 3
HoriLeng       EQU 4
HoriAddr       EQU 5
AnyA           EQU 2
AnyB           EQU 3
AnyC           EQU 4
AnyD           EQU 5
AnyE           EQU 6
AnyL           EQU 7
AnyH           EQU 8
AnyA1          EQU 9
AnyB1          EQU 10
AnyC1          EQU 11
AnyD1          EQU 12
AnyE1          EQU 13
AnyL1          EQU 14
AnyH1          EQU 15
AnySxx         EQU 16
AnyBit         EQU 16
AnySyy         EQU 17
AnyHV          EQU 18
AnyIXl         EQU 19
AnyIXh         EQU 20
;
;
OneSht         EQU #8000
TTrdSht        EQU #5800
TQrdSht        EQU #6400
X13            EQU #C000
X23            EQU #0000
X33            EQU #4000
X14            EQU #C000
X24            EQU #E800
X34            EQU #1800
X44            EQU #4000
X15            EQU #C000
X25            EQU #E000
X35            EQU #0000
X45            EQU #2000
X55            EQU #4000
sTri           EQU 0
sSqu           EQU 1
sTMA           EQU 2
sGun           EQU 3
sShape         EQU 4
;
;
               ORG #9400

GameCode       CALL GenYTab
               CALL Gen192Tab
               LD HL,0
               LD (DeltaX),HL
               LD (DeltaY),HL
               LD (XTurnRatio),HL
               LD (YDiveRatio),HL
               LD HL,StartZ
               LD (DeltaZ),HL
               XOR A
               LD (OldX),A
               LD (OldY),A
               LD (nMiss),A
               LD A,10				; Changed 2008
               LD (nShields),A
               LD HL,BitTab
               LD A,#80
GenXTab        LD (HL),A
               INC L
               RRCA
               JR NC GenXTab
               LD A,#FF
GenXTab1       LD (HL),A
               INC L
               SRL A
               OR A
               JR NZ GenXTab1
               LD A,#80
GenXTab2       LD (HL),A
               INC L
               SRA A
               CP #FF
               JR NZ GenXTab2
               LD (HL),A
               CALL SetUpStars
               CALL SetUpProj
               CALL SetUpObje
               LD HL,SheetI
               LD (pSheet),HL
               LD HL,#FF00
               LD (SheetZ),HL
               CALL CLS
Loop1          CALL SetUpSheet
Loop           LD HL,(GroundY)
               LD DE,(DeltaY)
               ADD HL,DE
               LD (GroundY),HL
               CALL ShowStars
               CALL ShowProj
               CALL ShowObje
               CALL AlterSteps
               CALL DrawSights
               CALL FireIfNess
               CALL Rand
               LD A,E
               LD R,A
               IN A,(#3F)
               OR #FC
               INC A
;              JR NZ EndIt
               LD HL,(SheetZ)
               LD DE,(DeltaZ)
               ADD HL,DE
               LD (SheetZ),HL
               BIT 7,H
               JR Z Loop1
               LD A,(nShields)
               OR A
               JR NZ Loop
EndIt          LD HL,#0200
vRet           RET
;
;
HitMan         LD A,(nShields)
               DEC A
               LD (nShields),A
               RET
SetUpSheet     LD IX,(pSheet)
               LD L,(IX)
               LD H,(IX+1)
               LD (pSheet),HL
               LD L,(IX+2)
               LD H,(IX+3)
               LD DE,(SheetZ)
               ADD HL,DE
               LD (SheetZ),HL
               LD DE,4
               ADD IX,DE
SUS            CALL gpObje
               RET C
               CALL CreateObje
               LD L,(IX)
               LD H,(IX+1)
               LD (IY+ObjeX),L
               LD (IY+ObjeX+1),H
               INC IX
               INC IX
               LD L,(IX)
               INC IX
               LD H,0
               ADD HL,HL
               ADD HL,HL
               ADD HL,HL
               ADD HL,HL
               LD DE,ObjeData
               ADD HL,DE
               LD A,(HL)
               LD (IY+ObjepMove),A
               INC HL
               LD A,(HL)
               LD (IY+ObjepMove+1),A
               INC HL
               LD A,(HL)
               LD (IY+ObjeHSize),A
               INC HL
               LD A,(HL)
               LD (IY+ObjeCol),A
               INC HL
               LD E,(HL)
               INC HL
               LD D,(HL)
               INC HL
               CALL CallDE
               LD A,(IX)
               OR A
               RET Z
               INC IX
               JR SUS
CallDE         PUSH DE
               RET
gpObje         LD IY,ObjeTable
               LD B,nObje
               LD DE,lObje
gpOlp          OR A
               BIT 0,(IY+ObjeFlag)
               RET Z
               ADD IY,DE
               DJNZ gpOlp
               SCF
               RET
hShape         LD A,(IX)
               INC IX
               LD (IY+ObjepShp),A
               LD A,(IX)
               INC IX
               LD (IY+ObjepShp+1),A
               LD A,(IX)
               INC IX
               LD (IY+ObjenShp),A
               RET
hGun           SET 1,(IY+ObjeFlag)
               RET
hTMA           LD (IY+ObjeFlag),#49
               RET
ObjeData       DEFW pTriTow
               DEFB 2
               DEFB #46
               DEFW vRet
               DEFS 16-6
               DEFW pSquTow
               DEFB 2
               DEFB #45
               DEFW vRet
               DEFS 16-6
               DEFW pTMATow
               DEFB 8
               DEFB #47
               DEFW hTMA
               DEFS 16-6
               DEFW pTriTow
               DEFB 2
               DEFB #43
               DEFW hGun
               DEFS 16-6
               DEFW pShape
               DEFB 2
               DEFB #45
               DEFW hShape
               DEFS 16-6
DrawSights     LD DE,(XTurnRatio)
               LD HL,(YDiveRatio)
               SRA H
               RR L
               LD A,L
               XOR #80
               LD L,A
               SRA D
               RR E
               LD A,E
               XOR #80
               CP 4
               JR NC DS1
               LD A,4
               JP DS3
DS1            CP 251
               JR C DS3
               LD A,251
DS3            LD E,A
               LD H,DivTab/256
               LD L,(HL)
               DEC L
               DEC L
               DEC L
               LD A,E
               SUB 3
               RRCA
               RRCA
               RRCA
               AND #1F
               LD D,A
               LD A,E
               SUB 3
               AND #07
               ADD A,A
               ADD A,A
               ADD A,A
               ADD A,A
               LD C,A
               LD B,0
               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,7
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
UnDrawSights   LD DE,(SighDE)
               LD IX,(SighIX)
               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 #10,#00,#10,#00,0,0
               DEFB #C6,#00,0,0
               DEFB #10,#00,#10,#00,0,0
               DEFB #08,#00,#08,#00,0,0
               DEFB #63,#00,0,0
               DEFB #08,#00,#08,#00,0,0
               DEFB #04,#00,#04,#00,0,0
               DEFB #31,#80,0,0
               DEFB #04,#00,#04,#00,0,0
               DEFB #02,#00,#02,#00,0,0
               DEFB #18,#C0,0,0
               DEFB #02,#00,#02,#00,0,0
               DEFB #01,#00,#01,#00,0,0
               DEFB #0C,#60,0,0
               DEFB #01,#00,#01,#00,0,0
               DEFB #00,#80,#00,#80,0,0
               DEFB #06,#30,0,0
               DEFB #00,#80,#00,#80,0,0
               DEFB #00,#40,#00,#40,0,0
               DEFB #03,#18,0,0
               DEFB #00,#40,#00,#40,0,0
               DEFB #00,#20,#00,#20,0,0
               DEFB #01,#8C,0,0
               DEFB #00,#20,#00,#20,0,0
CallHL         JP (HL)
GenYTab        LD HL,YTable
               LD DE,#4000
               LD C,24
CharLp         LD B,8
CharLp1        LD (HL),E
               INC H
               LD (HL),D
               DEC H
               INC L
               INC D
               DJNZ CharLp1
               LD A,D
               SUB 8
               LD D,A
               DEC C
               JR Z GYT1
               LD A,E
               ADD A,32
               LD E,A
               JR NC CharLp
               LD A,D
               ADD A,8
               LD D,A
               JR CharLp
GYT1           LD B,#40
GYT2           LD (HL),0
               INC H
               LD (HL),0
               DEC H
               INC L
               DJNZ GYT2
               RET
CLS            LD HL,#4000
               LD DE,#4001
               LD BC,#1800
               LD (HL),0
               LDIR
               LD BC,#2FF
               LD A,(GameAttr)
               LD (HL),A
               LDIR
               XOR A
               OUT (#FE),A
               RET
Rand           CALL Rand1
               LD DE,(Seed)
               RET
Rand1          LD HL,(Seed+2)
               RL L
               RL H
               RL L
               RL H
               LD C,H
               LD A,(Seed)
               RLA
               LD B,A
               LD DE,(Seed+1)
               RL E
               RL D
               RES 7,D
               LD HL,(Seed)
               ADD HL,BC
               LD (Seed),HL
               LD HL,(Seed+2)
               ADC HL,DE
               RES 7,H
               LD (Seed+2),HL
               RET M
               LD HL,Seed
Rand2          INC (HL)
               RET NZ
               INC HL
               JR Rand2
Seed           DEFB "Nig!"
GameAttr       DEFB #07
Gen192Tab      LD BC,DivTab
               LD HL,0
               LD DE,#00B0
G192           LD A,H
               LD (BC),A
               ADD HL,DE
               INC C
               JR NZ G192
               RET
DivHLDE        XOR A
               SBC HL,DE
               ADD HL,DE
               JR C Div6
               JR Z Div1
               LD A,D
               OR A
               JR NZ Div2
               LD A,H
               CP E
               JR NC Div3
Div2           LD A,L
               LD L,H
               LD H,0
               LD B,8
Div4           ADD A,A
               ADC HL,HL
               SBC HL,DE
               JR NC Div5
               ADD HL,DE
               DJNZ Div4
               JP Div6
Div5           INC A
               DJNZ Div4
Div6           LD C,A
               LD B,8
Div7           ADD A,A
               ADD HL,HL
               SBC HL,DE
               JR NC Div8
               ADD HL,DE
               DJNZ Div7
               LD H,C
               LD L,A
               RET
Div8           INC A
               DJNZ Div7
               LD H,C
               LD L,A
               RET
Div1           LD HL,#0100
               RET
Div3           RET
ObjeDiv        BIT 7,H
               JR NZ OD1
               CALL DivHLDE
               SRL H
               RR L
               RET
OD1            LD A,L
               CPL
               LD L,A
               LD A,H
               CPL
               LD H,A
               INC HL
               CALL DivHLDE
               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,8
               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
CalcAddr       LD BC,128
               ADD HL,BC
               EX DE,HL
               ADD HL,BC
               EX DE,HL
               LD H,DivTab/256
               LD L,(HL)
               LD H,YTable/256
               LD A,(HL)
               INC H
               LD H,(HL)
               LD L,A
               LD A,E
               RRCA
               RRCA
               RRCA
               AND #1F
               OR L
               LD L,A
               LD A,E
               AND #7
               LD E,A
               LD D,BitTab/256
               LD A,(DE)
               RET
NegHL          LD A,L
               CPL
               LD L,A
               LD A,H
               CPL
               LD H,A
               INC HL
               RET
;
;
SetUpStars     LD IX,StarTable
               LD B,nStar
SUSlp          PUSH BC
               CALL Rand
               LD (IX+StarX),E
               LD (IX+StarX+1),D
               CALL Rand
               LD (IX+StarZ),E
               LD (IX+StarZ+1),D
               LD DE,StartY
               LD (IX+StarY),E
               LD (IX+StarY+1),D
               LD (IX+StarBit),0
               LD BC,lStar
               ADD IX,BC
               POP BC
               DJNZ SUSlp
               LD HL,StartY
               LD (GroundY),HL
               RET
ShowStars      LD IX,StarTable
               LD HL,(DeltaX)
               LD DE,(DeltaY)
               LD BC,(DeltaZ)
               EXX
               LD B,nStar
SSlp           PUSH BC
               EXX
               LD A,L
               ADD A,(IX+StarX)
               LD (IX+StarX),A
               LD A,H
               ADC A,(IX+StarX+1)
               LD (IX+StarX+1),A
               LD A,E
               ADD A,(IX+StarY)
               LD (IX+StarY),A
               LD A,D
               ADC A,(IX+StarY+1)
               LD (IX+StarY+1),A
               LD A,C
               ADD A,(IX+StarZ)
               LD (IX+StarZ),A
               LD A,B
               ADC A,(IX+StarZ+1)
               LD (IX+StarZ+1),A
               EXX
               LD L,(IX+StarAddr)
               LD A,(IX+StarBit)
               LD H,(IX+StarAddr+1)
               CPL
               AND (HL)
               LD (HL),A
               LD (IX+StarBit),0
SS1            BIT 7,(IX+StarZ+1)
               JR NZ SSn
               LD L,(IX+StarX)
               LD H,(IX+StarX+1)
               LD E,(IX+StarZ)
               LD D,(IX+StarZ+1)
               BIT 7,H
               JR NZ SSW1
               OR A
               SBC HL,DE
               JR NC SSn
               ADD HL,DE
               CALL DivHLDE
               SRL H
               RR L
               JP SS2
SSn1           POP AF
SSn            LD A,R
               ADD A,A
               LD (IX+StarX+1),A
               LD (IX+StarZ+1),#7F
               JP SSlpx
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+StarY)
               LD H,(IX+StarY+1)
               LD E,(IX+StarZ)
               LD D,(IX+StarZ+1)
               BIT 7,H
               JR NZ SSW1a
               OR A
               SBC HL,DE
               JP NC SSn1
               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 SSn1
               ADD HL,DE
               CALL DivHLDE
               SRL H
               RR L
               LD A,L:CPL:LD L,A
               LD H,#FF
               INC HL
SS2a           POP DE
               CALL CalcAddr
               LD (IX+StarAddr),L
               LD (IX+StarAddr+1),H
               LD (IX+StarBit),A
               OR (HL)
               LD (HL),A
SSlpx          LD BC,lStar
               ADD IX,BC
               POP BC
               DEC B
               JP NZ SSlp
               RET
SSlpx1         POP AF
               LD BC,lStar
               ADD IX,BC
               POP BC
               DEC B
               JP NZ SSlp
               RET
SetUpProj      LD IX,ProjTable
               LD B,nProj
               LD DE,lProj
               XOR A
SUPlp          LD (IX+ProjLife),A
               ADD IX,DE
               DJNZ SUPlp
               LD HL,FireDelay
               LD (FireDel),HL
               XOR A
               LD (SideSel),A
               LD A,#40
               LD (TopSel),A
               RET
               DEFB "Here we go again!"
ShowProj       LD IX,ProjTable
               LD B,nProj
SPlp           PUSH BC
               LD A,(IX+ProjLife)
               OR A
               JP Z SPlpx
               XOR A
               OUT (#FE),A
               LD L,(IX+ProjX)
               LD H,(IX+ProjX+1)
               LD (IX+ProjOldX),H
               LD BC,(DeltaX)
               ADD HL,BC
               LD C,(IX+ProjDX)
               LD B,(IX+ProjDX+1)
               ADD HL,BC
               LD (IX+ProjX),L
               LD (IX+ProjX+1),H
               LD L,(IX+ProjY)
               LD H,(IX+ProjY+1)
               LD (IX+ProjOldY),H
               LD BC,(DeltaY)
               ADD HL,BC
               LD C,(IX+ProjDY)
               LD B,(IX+ProjDY+1)
               ADD HL,BC
               LD (IX+ProjY),L
               LD (IX+ProjY+1),H
               LD BC,(GroundY)
               OR A
               SBC HL,BC
               BIT 7,H
               JR NZ SPa
               LD (IX+ProjY+1),B
               LD (IX+ProjLife),1
SPa            LD L,(IX+ProjZ)
               LD H,(IX+ProjZ+1)
               LD (IX+ProjOldZ),H
               LD BC,(DeltaZ)
               ADD HL,BC
               LD C,(IX+ProjDZ)
               LD B,(IX+ProjDZ+1)
               ADD HL,BC
               LD (IX+ProjZ),L
               LD (IX+ProjZ+1),H
               LD A,(IX+ProjBit)
               LD L,(IX+ProjAddr)
               LD H,(IX+ProjAddr+1)
               CPL
               AND (HL)
               LD (HL),A
               LD (IX+ProjBit),0
               LD A,0
FireNoiseF     EQU $-1
               OUT (#FE),A
SP1            BIT 7,(IX+ProjZ+1)
               JP NZ SPKill
               DEC (IX+ProjLife)
               JP Z SPlpx
               ; Now do collisions
               LD IY,ObjeTable
               LD B,nObje
Hitlp          LD A,(IY+ObjeFlag)
               XOR #01
               AND #21
               JP NZ Hitlpx1
               PUSH BC
               LD A,(IX+ProjZ+1)
               LD C,A
               SUB (IY+ObjeZ+1)
               LD B,A
               LD A,(IX+ProjOldZ)
               SUB (IY+ObjeOldZ)
               XOR B
               JP P Hitlpx
               LD A,(IX+ProjOldX)
               ADD A,(IX+ProjX+1)
               RRA
               LD B,A
               LD A,(IY+ObjeOldX)
               ADD A,(IY+ObjeX+1)
               RRA
               SUB B
               JP P Hita
               NEG
Hita           CP (IY+ObjeHSize)
               JR NC Hitlpx
               LD L,(IX+ProjY)
               LD H,(IX+ProjY+1)
               LD E,(IY+ObjeY)
               LD D,(IY+ObjeY+1)
               OR A
               SBC HL,DE
               BIT 7,H
               JR Z Moved
Hitlpx         POP BC
Hitlpx1        LD DE,lObje
               ADD IY,DE
               DJNZ Hitlp
HO3            LD L,(IX+ProjX)
               LD H,(IX+ProjX+1)
               LD E,(IX+ProjZ)
               LD D,(IX+ProjZ+1)
               BIT 7,H
               JR NZ SPW1
               OR A
               SBC HL,DE
               JP NC SPlpx
               ADD HL,DE
               CALL DivHLDE
               SRL H
               RR L
               JP SP2
Moved          PUSH IY
               LD (IX+ProjLife),0
               BIT 2,(IY+ObjeFlag)
               JR Z HO2
               LD A,(IY+ObjeState)
               CP 2
               JR Z HO1
               LD (IY+ObjeState),2
               JR HO2
HO1            LD L,(IY+ObjeDY)
               LD H,(IY+ObjeDY+1)
               LD DE,ShrinkRate
               ADD HL,DE
               LD (IY+ObjeDY),L
               LD (IY+ObjeDY+1),H
HO2            POP IY
               POP BC
               JP SPlpx
SPW1           LD A,L:CPL:LD L,A
               LD A,H:CPL:LD H,A
               INC HL
               OR A
               SBC HL,DE
               JP NC SPlpx
               ADD HL,DE
               CALL DivHLDE
               SRL H
               RR L
               LD A,L:CPL:LD L,A
               LD H,#FF
               INC HL
SP2            PUSH HL
               LD L,(IX+ProjY)
               LD H,(IX+ProjY+1)
               LD E,(IX+ProjZ)
               LD D,(IX+ProjZ+1)
               BIT 7,H
               JR NZ SPW1a
               OR A
               SBC HL,DE
               JP NC SPlpx1
               ADD HL,DE
               CALL DivHLDE
               SRL H
               RR L
               JP SP2a
SPW1a          LD A,L:CPL:LD L,A
               LD A,H:CPL:LD H,A
               INC HL
               OR A
               SBC HL,DE
               JP NC SPlpx1
               ADD HL,DE
               CALL DivHLDE
               SRL H
               RR L
               LD A,L:CPL:LD L,A
               LD H,#FF
               INC HL
SP2a           POP DE
               CALL CalcAddr
               LD (IX+ProjAddr),L
               LD (IX+ProjAddr+1),H
               LD (IX+ProjBit),A
               OR (HL)
               LD (HL),A
SPlpx          LD BC,lProj
               ADD IX,BC
               POP BC
               DEC B
               JP NZ SPlp
               RET
SPKill         LD (IX+ProjLife),0
               LD A,(IX+ProjBit)
               CPL
               LD L,(IX+ProjAddr)
               LD H,(IX+ProjAddr+1)
               AND (HL)
               LD (HL),A
               LD (IX+ProjBit),0
               PUSH AF
SPlpx1         POP AF
               LD BC,lProj
               ADD IX,BC
               POP BC
               DEC B
               JP NZ SPlp
               RET
FireIfNess     LD HL,(FireDel)
               XOR A
               LD (FireNoiseF),A
               LD A,L
               OR H
               JR Z FIN1
               DEC HL
               LD (FireDel),HL
               CALL kFire
               RET Z
               LD A,#F8
               LD (FireNoiseF),A
               RET
FIN1           CALL kFire
               RET Z
               LD A,#F8
               LD (FireNoiseF),A
               LD IX,ProjTable
               LD B,nProj
               LD DE,lProj
FINlp          LD A,(IX+ProjLife)
               OR A
               JR Z FIN2
               ADD IX,DE
               DJNZ FINlp
               RET
FIN2           LD (IX+ProjLife),Range
               XOR A
               LD (IX+ProjY+1),A
               LD (IX+ProjZ),A
               LD (IX+ProjZ+1),A
               LD (IX+ProjBit),A
               LD HL,(FireDX)
               LD (IX+ProjDX),L
               LD (IX+ProjDX+1),H
               LD HL,(FireDY)
               LD (IX+ProjDY),L
               LD (IX+ProjDY+1),H
               LD HL,(FireDZ)
               LD (IX+ProjDZ),L
               LD (IX+ProjDZ+1),H
               LD A,(SideSel)
               CPL
               LD (SideSel),A
               OR A
               JR NZ FIN3
               LD A,(TopSel)
               XOR #80
               LD (TopSel),A
FIN3           LD A,(SideSel)
               LD (IX+ProjX+1),A
               LD (IX+ProjX),#80
               LD A,(TopSel)
               LD (IX+ProjY),A
               LD HL,FireDelay
               LD (FireDel),HL
               RET
SetUpObje      LD HL,ObjeTable+ObjeFlag
               LD DE,lObje
               LD B,nObje
SUOlp          LD (HL),0
               ADD HL,DE
               DJNZ SUOlp
               RET
CreateObje     LD HL,ObjeTemp
               PUSH IY
               POP DE
               LD BC,#80
               LDIR
               LD (IY+ObjeZ),#00
               LD (IY+ObjeZ+1),#7F
               LD HL,(GroundY)
               LD (IY+ObjeY),L
               LD (IY+ObjeY+1),H
               RET
ShowObje       LD IX,ObjeTable
               LD B,nObje
SOlp           PUSH BC
               BIT 0,(IX+ObjeFlag)
               JP Z SOlpx
               LD A,(IX+ObjeCol)
               LD (Colour),A
               LD L,(IX+ObjeX)
               LD H,(IX+ObjeX+1)
               LD (IX+ObjeOldX),H
               LD BC,(DeltaX)
               ADD HL,BC
               LD C,(IX+ObjedX)
               LD B,(IX+ObjedX+1)
               ADD HL,BC
               LD (IX+ObjeX),L
               LD (IX+ObjeX+1),H
               LD L,(IX+ObjeY)
               LD H,(IX+ObjeY+1)
               LD BC,(DeltaY)
               ADD HL,BC
               LD C,(IX+ObjedY)
               LD B,(IX+ObjedY+1)
               ADD HL,BC
               LD (IX+ObjeY),L
               LD (IX+ObjeY+1),H
               LD L,(IX+ObjeZ)
               LD H,(IX+ObjeZ+1)
               LD (IX+ObjeOldZ),H
               LD BC,(DeltaZ)
               ADD HL,BC
               LD C,(IX+ObjedZ)
               LD B,(IX+ObjedZ+1)
               ADD HL,BC
               LD (IX+ObjeZ),L
               LD (IX+ObjeZ+1),H
               BIT 7,(IX+ObjeZ+1)
               JP NZ SOlpx1
               LD A,(nMiss)
               CP 3
               JR Z NF
               BIT 1,(IX+ObjeFlag)
               JR Z NF
               LD A,R
               AND #17
               CALL Z OFire
NF             LD A,(IX+ObjeState)
               OR A
               JR Z SOGrow
               DEC A
               JR Z SOdraw
               DEC A
               JR NZ SOdraw
               LD L,(IX+ObjeY)
               LD H,(IX+ObjeY+1)
               LD E,(IX+ObjeDY)
               LD D,(IX+ObjeDY+1)
               OR A
               SBC HL,DE
               LD (IX+ObjeY),L
               LD (IX+ObjeY+1),H
               LD DE,(GroundY)
               OR A
               SBC HL,DE
               BIT 7,H
               JR NZ SOdraw
               RES 0,(IX+ObjeFlag)
               JR SOlpxz
SOGrow         DEC (IX+ObjeCnt)
               JR Z SOnState
               LD L,(IX+ObjeY)
               LD H,(IX+ObjeY+1)
               LD E,(IX+ObjeDY)
               LD D,(IX+ObjeDY+1)
               ADD HL,DE
               LD (IX+ObjeY),L
               LD (IX+ObjeY+1),H
               JR SOdraw
SOnState       INC (IX+ObjeState)
               LD HL,ShrinkRate
               LD (IX+ObjeDY),L
               LD (IX+ObjeDY+1),H
SOdraw         LD A,(IX+ObjeZ+1)
               CP #7E
               JR NC SOlpx
               RES 0,(IX+ObjeFlag)
               LD L,(IX+ObjepMove)
               LD H,(IX+ObjepMove+1)
               CALL CallHL
               JR C SOlpz
SOlpxz         PUSH IX
               POP IY
               LD BC,ObjeOldLines
               ADD IY,BC
               PUSH IY
               CALL RemoveLines
               POP IY
               CALL TidyMiss
SOlpz          LD (IY),nLine&#FF
               LD (IY+1),nLine/256
SOlpx          LD BC,lObje
               ADD IX,BC
               POP BC
               DEC B
               JP NZ SOlp
               RET
SOlpx1         RES 0,(IX+ObjeFlag)
               CALL TidyMiss
               BIT 3,(IX+ObjeFlag)
               JR Z SOlpxz
               JR SOlpx2
               LD A,(IX+ObjeOldX)
               SUB (IX+ObjeX+1)
               LD H,A
               LD L,0
               LD D,(IX+ObjeZ+1)
               LD E,0
               CALL SignMult
               LD D,(IX+ObjeOldZ)
               LD E,0
               CALL SignDiv
               LD A,(IX+ObjeX+1)
               SUB H
               BIT 7,A
               JR Z SOlpa
               NEG
SOlpa          CP (IX+ObjeHSize)
               JR NC SOlpxz
SOlpx1a        LD A,(IX+ObjeY+1)
               BIT 7,A
               JR NZ SOlpx2
               OR A
               JR NZ SOlpxz
               LD A,(IX+ObjeY)
               CP 64
;              JR NC SOlpxz
SOlpx2         BIT 6,(IX+ObjeFlag)
               JR Z HM1
               JR SOlpxz
HM1            CALL HitMan
               JR SOlpxz
TidyMiss       BIT 0,(IX+ObjeMiss)
               RET Z
               LD HL,nMiss
               DEC (HL)
               RET
OFire          CALL gpObje
               RET C
               CALL CreateObje
               LD A,(IX+ObjeX)
               LD (IY+ObjeX),A
               LD A,(IX+ObjeY)
               LD (IY+ObjeY),A
               LD A,(IX+ObjeZ)
               LD (IY+ObjeZ),A
               LD A,(IX+ObjeX+1)
               LD (IY+ObjeX+1),A
               LD A,(IX+ObjeY+1)
               LD (IY+ObjeY+1),A
               LD A,(IX+ObjeZ+1)
               LD (IY+ObjeZ+1),A
               LD (IY+ObjepMove),pMiss&#FF
               LD (IY+ObjepMove+1),pMiss/256
               LD (IY+ObjepShp),Miss1&#FF
               LD (IY+ObjepShp+1),Miss1/256
               LD (IY+ObjenShp),1
               LD (IY+ObjeState),4
               LD (IY+ObjeFlag),#D
               LD (IY+ObjeCol),#45
               LD (IY+ObjeMiss),1
               LD HL,nMiss
               INC (HL)
               LD A,R
               AND #1F
               ADD A,14
OFAim          EX AF,AF'
               LD HL,(DeltaX)
               CALL NegHL
               CALL OFM
               LD E,(IY+ObjeX)
               LD D,(IY+ObjeX+1)
               OR A
               SBC HL,DE
               CALL OFD
               LD (IY+ObjedX),L
               LD (IY+ObjedX+1),H
               LD HL,(DeltaY)
               CALL NegHL
               CALL OFM
               LD E,(IY+ObjeY)
               LD D,(IY+ObjeY+1)
               OR A
               SBC HL,DE
               CALL OFD
               LD (IY+ObjedY),L
               LD (IY+ObjedY+1),H
               LD HL,(DeltaZ)
               CALL NegHL
               CALL OFM
               LD E,(IY+ObjeZ)
               LD D,(IY+ObjeZ+1)
               OR A
               SBC HL,DE
               CALL OFD
               LD (IY+ObjedZ),L
               LD (IY+ObjedZ+1),H
               RET
OFM            LD E,0
               EX AF,AF'
               LD D,A
               EX AF,AF'
               CALL SignMult
               RET
OFD            LD E,0
               EX AF,AF'
               LD D,A
               EX AF,AF'
               CALL SignDiv
               RET
pMiss          LD A,(IX+ObjeCol)
               INC A
               AND #7
               JR NZ pM1
               LD A,4
pM1            OR #40
               LD (IX+ObjeCol),A
pShape         LD L,(IX+ObjeX)
               LD H,(IX+ObjeX+1)
               LD E,(IX+ObjeZ)
               LD D,(IX+ObjeZ+1)
               LD (TempZ),DE
               CALL ObjeDiv
               LD (X1),HL
               LD BC,128
               ADD HL,BC
               OR A
               BIT 7,H
               RET NZ
               LD A,H
               OR A
               RET NZ
               LD L,(IX+ObjeY)
               LD H,(IX+ObjeY+1)
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (Y1),HL
               LD BC,128
               ADD HL,BC
               OR A
               BIT 7,H
               RET NZ
               LD A,H
               OR A
               RET NZ
               LD HL,(TempZ)
               SRA H:RR L
               SRA H:RR L
               SRA H:RR L
               LD (TempZ),HL
               SET 0,(IX+ObjeFlag)
               LD L,(IX+ObjepShp)
               LD H,(IX+ObjepShp+1)
               DEC (IX+ObjenShp)
               JR NZ DS0
               LD A,(HL)
               INC HL
               LD H,(HL)
               INC HL
               LD L,A
               LD (IX+ObjepShp),L
               LD (IX+ObjepShp+1),H
               INC HL:INC HL
               LD A,(HL)
               LD (IX+ObjenShp),A
               DEC HL:DEC HL
DS0            PUSH IX
               PUSH IX
               PUSH HL
               POP IX
               INC IX:INC IX:INC IX
               LD B,(IX)
               INC IX
               LD IY,X2
DSlp1          LD L,(IX)
               LD H,(IX+1)
               LD DE,(TempZ)
               CALL ShapeDiv
               LD DE,(X1)
               ADD HL,DE
               LD (IY),L
               LD (IY+1),H
               LD L,(IX+2)
               LD H,(IX+3)
               LD DE,(TempZ)
               CALL ShapeDiv
               LD DE,(Y1)
               ADD HL,DE
               LD (IY+2),L
               LD (IY+3),H
               LD DE,4
               ADD IX,DE
               ADD IY,DE
               DJNZ DSlp1
               POP IY
               LD DE,ObjeOldLines
               ADD IY,DE
               CALL RemoveLines
               LD B,(IX)
               INC IX
DSlp2          PUSH BC
               LD DE,X2
               LD L,(IX)
               INC IX
               LD H,0
               ADD HL,HL
               ADD HL,HL
               ADD HL,DE
               LD C,(HL)
               INC HL
               LD B,(HL)
               INC HL
               LD (DSx1),BC
               LD C,(HL)
               INC HL
               LD B,(HL)
               INC HL
               LD (DSy1),BC
               LD L,(IX)
               INC IX
               LD H,0
               ADD HL,HL
               ADD HL,HL
               ADD HL,DE
               LD C,(HL)
               INC HL
               LD B,(HL)
               INC HL
               LD (DSx2),BC
               LD C,(HL)
               INC HL
               LD B,(HL)
               INC HL
               LD (DSy2),BC
               DEFB #21
DSy1           DEFW 0
               DEFB #11
DSy2           DEFW 0
               EXX
               DEFB #21
DSx1           DEFW 0
               DEFB #11
DSx2           DEFW 0
               CALL AnyLine
               POP BC
               DJNZ DSlp2
               POP IX
               SCF
               RET
pSquTow        EQU $
               LD L,(IX+ObjeX)
               LD H,(IX+ObjeX+1)
               LD (TempX),HL
               LD E,(IX+ObjeZ)
               LD D,(IX+ObjeZ+1)
               LD (TempZ),DE
               LD BC,TWidth
               OR A
               SBC HL,BC
               LD (TempXl),HL
               CALL ObjeDiv
               LD (X1),HL
               LD HL,(TempX)
               LD BC,TWidth
               ADD HL,BC
               LD (TempXr),HL
               CALL ObjeDiv
               LD (X2),HL
               LD DE,(X1)
               OR A
               SBC HL,DE
               OR A
               BIT 7,H
               RET NZ
               ADD HL,DE
               LD BC,128
               ADD HL,BC
               OR A
               BIT 7,H
               RET NZ
               LD HL,-127
               ADD HL,DE
               OR A
               BIT 7,H
               RET Z
               ;X windowed
               LD L,(IX+ObjeY)
               LD H,(IX+ObjeY+1)
               LD (TempY),HL
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (Y1),HL
               LD HL,(GroundY)
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (Y2),HL
               LD DE,(Y1)
               OR A
               SBC HL,DE
               OR A
               BIT 7,H
               RET NZ
               ADD HL,DE
               LD BC,128
               ADD HL,BC
               OR A
               BIT 7,H
               RET NZ
               EX DE,HL
               LD BC,-127
               ADD HL,BC
               OR A
               BIT 7,H
               RET Z
               ;Y windowed
               SET 0,(IX+ObjeFlag)
               LD HL,(TempZ)
               LD BC,TWidth * 2
               ADD HL,BC
               LD (TempZ),HL
               EX DE,HL
               LD HL,(TempXl)
               CALL ObjeDiv
               LD (X3),HL
               LD HL,(TempXr)
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (X4),HL
               LD HL,(TempY)
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (Y3),HL
               LD HL,(GroundY)
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (Y4),HL
               PUSH IX
               POP IY
               LD BC,ObjeOldLines
               ADD IY,BC
               CALL RemoveLines
               LD HL,(X4)
               LD BC,(X2)
               DEC BC
               DEC HL
               OR A
               SBC HL,BC
               JP P Towerad
               LD HL,(X1)
               LD BC,(X3)
               DEC HL
               OR A
               SBC HL,BC
               JP P Towercf
Towerbe        LD A,(Y1+1)
               BIT 7,A
               JR NZ Towere
Towerb         LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X1)
               CALL VertLine
               LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X2)
               CALL VertLine
               LD HL,(X2)
               LD DE,(X1)
               LD BC,(Y1)
               CALL HoriLine
               LD HL,(X4)
               LD DE,(X3)
               LD BC,(Y3)
               CALL HoriLine
               LD HL,(X3)
               LD DE,(X1)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               CALL AnyLine
               LD HL,(X4)
               LD DE,(X2)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               JP AnyLine
Towere         LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X1)
               CALL VertLine
               LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X2)
               CALL VertLine
               LD HL,(X2)
               LD DE,(X1)
               LD BC,(Y1)
               JP HoriLine
Towerad        LD A,(Y1+1)
               BIT 7,A
               JR NZ Towerd
Towera         LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X1)
               CALL VertLine
               LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X2)
               CALL VertLine
               LD HL,(Y4)
               LD DE,(Y3)
               LD BC,(X4)
               CALL VertLine
               LD HL,(X2)
               LD DE,(X1)
               LD BC,(Y1)
               CALL HoriLine
               LD HL,(X4)
               LD DE,(X3)
               LD BC,(Y3)
               CALL HoriLine
               LD HL,(X3)
               LD DE,(X1)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               CALL AnyLine
               LD HL,(X4)
               LD DE,(X2)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               JP AnyLine
Towerd         LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X1)
               CALL VertLine
               LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X2)
               CALL VertLine
               LD HL,(Y4)
               LD DE,(Y3)
               LD BC,(X4)
               CALL VertLine
               LD HL,(X2)
               LD DE,(X1)
               LD BC,(Y1)
               CALL HoriLine
               LD HL,(X4)
               LD DE,(X2)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               JP AnyLine
Towercf        LD A,(Y1+1)
               BIT 7,A
               JR NZ Towerf
Towerc         LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X1)
               CALL VertLine
               LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X2)
               CALL VertLine
               LD HL,(Y4)
               LD DE,(Y3)
               LD BC,(X3)
               CALL VertLine
               LD HL,(X2)
               LD DE,(X1)
               LD BC,(Y1)
               CALL HoriLine
               LD HL,(X4)
               LD DE,(X3)
               LD BC,(Y3)
               CALL HoriLine
               LD HL,(X3)
               LD DE,(X1)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               CALL AnyLine
               LD HL,(X4)
               LD DE,(X2)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               JP AnyLine
Towerf         LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X1)
               CALL VertLine
               LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X2)
               CALL VertLine
               LD HL,(Y4)
               LD DE,(Y3)
               LD BC,(X3)
               CALL VertLine
               LD HL,(X2)
               LD DE,(X1)
               LD BC,(Y1)
               CALL HoriLine
               LD HL,(X3)
               LD DE,(X1)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               JP AnyLine
pTriTow        LD L,(IX+ObjeX)
               LD H,(IX+ObjeX+1)
               LD (TempX),HL
               LD E,(IX+ObjeZ)
               LD D,(IX+ObjeZ+1)
               LD (TempZ),DE
               CALL ObjeDiv
               LD (X1),HL
               LD HL,(TempZ)
               LD DE,TWidth*2
               ADD HL,DE
               LD (TempZ),HL
               EX DE,HL
               LD HL,(TempX)
               LD BC,-TWidth
               ADD HL,BC
               LD (TempXl),HL
               CALL ObjeDiv
               LD (X2),HL
               LD HL,(TempX)
               LD BC,TWidth
               ADD HL,BC
               LD (TempXr),HL
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (X3),HL
               LD DE,(X2)
               OR A
               SBC HL,DE
               OR A
               BIT 7,H
               RET NZ
               ADD HL,DE
               LD BC,128
               ADD HL,BC
               OR A
               BIT 7,H
               RET NZ
               LD HL,-127
               ADD HL,DE
               OR A
               BIT 7,H
               RET Z
               ;X windowed
               LD E,(IX+ObjeZ)
               LD D,(IX+ObjeZ+1)
               PUSH DE
               LD L,(IX+ObjeY)
               LD H,(IX+ObjeY+1)
               LD (TempY),HL
               CALL ObjeDiv
               LD (Y1),HL
               LD HL,(GroundY)
               POP DE
               CALL ObjeDiv
               LD (Y2),HL
               LD DE,(Y1)
               OR A
               SBC HL,DE
               OR A
               BIT 7,H
               RET NZ
               ADD HL,DE
               LD BC,128
               ADD HL,BC
               OR A
               BIT 7,H
               RET NZ
               LD HL,-127
               ADD HL,DE
               OR A
               BIT 7,H
               RET Z
               ;Y windowed
               SET 0,(IX+ObjeFlag)
               LD HL,(TempY)
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (Y3),HL
               LD HL,(GroundY)
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (Y4),HL
               PUSH IX
               POP IY
               LD BC,ObjeOldLines
               ADD IY,BC
               CALL RemoveLines
               LD HL,(X3)
               LD DE,(X1)
               DEC HL
               OR A
               SBC HL,DE
               BIT 7,H
               JR NZ Tricd
               LD HL,(X2)
               EX DE,HL
               DEC HL
               OR A
               SBC HL,DE
               BIT 7,H
               JP NZ Trief
               LD A,(Y1+1)
               BIT 7,A
               JR NZ Trib
               LD HL,(X3)
               LD DE,(X2)
               LD BC,(Y3)
               CALL HoriLine
Trib           LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X1)
               CALL VertLine
               LD HL,(Y4)
               LD DE,(Y3)
               LD BC,(X2)
               CALL VertLine
               LD HL,(Y4)
               LD DE,(Y3)
               LD BC,(X3)
               CALL VertLine
               LD HL,(X2)
               LD DE,(X1)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               CALL AnyLine
               LD HL,(X3)
               LD DE,(X1)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               JP AnyLine
Tricd          LD A,(Y1+1)
               BIT 7,A
               JR NZ Trid
               LD HL,(X3)
               LD DE,(X2)
               LD BC,(Y3)
               CALL HoriLine
               LD HL,(X3)
               LD DE,(X1)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               CALL AnyLine
Trid           LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X1)
               CALL VertLine
               LD HL,(Y4)
               LD DE,(Y3)
               LD BC,(X2)
               CALL VertLine
               LD HL,(X2)
               LD DE,(X1)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               JP AnyLine
Trief          LD A,(Y1+1)
               BIT 7,A
               JR NZ Trif
               LD HL,(X3)
               LD DE,(X2)
               LD BC,(Y3)
               CALL HoriLine
               LD HL,(X2)
               LD DE,(X1)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               CALL AnyLine
Trif           LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X1)
               CALL VertLine
               LD HL,(Y4)
               LD DE,(Y3)
               LD BC,(X3)
               CALL VertLine
               LD HL,(X3)
               LD DE,(X1)
               EXX
               LD HL,(Y3)
               LD DE,(Y1)
               EXX
               JP AnyLine
pGunTow        LD L,(IX+ObjeX)
               LD H,(IX+ObjeX+1)
               LD (TempX),HL
               LD E,(IX+ObjeZ)
               LD D,(IX+ObjeZ+1)
               LD (TempZ),DE
               CALL ObjeDiv
               LD (X1),HL
               LD HL,(TempZ)
               LD DE,TWidth
               ADD HL,DE
               LD (TempZ),HL
               EX DE,HL
               LD HL,(TempX)
               LD BC,-GWidth
               ADD HL,BC
               CALL ObjeDiv
               LD (X2),HL
               LD HL,(TempX)
               LD BC,GWidth
               ADD HL,BC
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (X3),HL
               LD DE,(X2)
               OR A
               SBC HL,DE
               OR A
               BIT 7,H
               RET NZ
               ADD HL,DE
               LD BC,128
               ADD HL,BC
               OR A
               BIT 7,H
               RET NZ
               LD HL,-127
               ADD HL,DE
               OR A
               BIT 7,H
               RET Z
               ;X windowed
               LD L,(IX+ObjeY)
               LD H,(IX+ObjeY+1)
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (Y3),HL
               LD HL,(GroundY)
               LD E,(IX+ObjeZ)
               LD D,(IX+ObjeZ+1)
               CALL ObjeDiv
               LD (Y2),HL
               LD DE,(Y3)
               OR A
               SBC HL,DE
               OR A
               BIT 7,H
               RET NZ
               ;Y windowed
               SET 0,(IX+ObjeFlag)
               LD HL,(GroundY)
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (Y4),HL
               PUSH IX
               POP IY
               LD BC,ObjeOldLines
               ADD IY,BC
               CALL RemoveLines
               LD HL,(X3)
               LD DE,(X2)
               LD BC,(Y3)
               CALL HoriLine
               LD HL,(Y4)
               LD DE,(Y3)
               LD BC,(X2)
               CALL VertLine
               LD HL,(Y4)
               LD DE,(Y3)
               LD BC,(X3)
               JP VertLine
pTMATow        LD L,(IX+ObjeX)
               LD H,(IX+ObjeX+1)
               LD (TempX),HL
               LD DE,-TMAWidth
               ADD HL,DE
               LD E,(IX+ObjeZ)
               LD D,(IX+ObjeZ+1)
               LD (TempZ),DE
               CALL ObjeDiv
               LD (X1),HL
               LD HL,(TempX)
               LD DE,TMAWidth
               ADD HL,DE
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (X2),HL
               LD DE,(X1)
               OR A
               SBC HL,DE
               OR A
               BIT 7,H
               RET NZ
               ADD HL,DE
               LD BC,128
               ADD HL,BC
               OR A
               BIT 7,H
               RET NZ
               LD HL,-127
               ADD HL,DE
               OR A
               BIT 7,H
               RET Z
               ;X windowed
               LD L,(IX+ObjeY)
               LD H,(IX+ObjeY+1)
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (Y1),HL
               LD HL,(GroundY)
               LD DE,(TempZ)
               CALL ObjeDiv
               LD (Y2),HL
               LD DE,(Y1)
               OR A
               SBC HL,DE
               OR A
               BIT 7,H
               RET NZ
               ADD HL,DE
               LD BC,128
               ADD HL,BC
               OR A
               BIT 7,H
               RET NZ
               EX DE,HL
               LD BC,-127
               ADD HL,BC
               OR A
               BIT 7,H
               RET Z
               ;Y windowed
               SET 0,(IX+ObjeFlag)
               PUSH IX
               POP IY
               LD BC,ObjeOldLines
               ADD IY,BC
               CALL RemoveLines
               LD HL,(X2)
               LD DE,(X1)
               LD BC,(Y1)
               CALL HoriLine
               LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X2)
               CALL VertLine
               LD HL,(Y2)
               LD DE,(Y1)
               LD BC,(X1)
               CALL VertLine
               LD HL,(X2)
               LD DE,(X1)
               LD BC,(Y2)
               JP HoriLine
RemoveLines    PUSH IY
RLlp           LD L,(IY)
               LD H,(IY+1)
               CALL CallHL
               LD BC,lObjeLine
               ADD IY,BC
               JP RLlp
nLine          POP AF
               POP IY
               RET
VS1            POP HL
               SCF
               RET
VertLine       PUSH HL
               LD L,C
               LD H,B
               LD BC,128
               ADD HL,BC
               BIT 7,H
               JR NZ VS1
               INC H
               DEC H
               JR NZ VS1
               LD A,L
               RRCA
               RRCA
               RRCA
               AND #1F
               LD (V1),A
               LD A,L
               RLCA
               RLCA
               RLCA
               CPL
               AND #38
               OR #C6
               LD (Vert4+1),A
               AND #BF
               LD (IY+AnyBit),A
               POP HL
               LD BC,128
               ADD HL,BC
               EX DE,HL
               ADD HL,BC
               LD A,H
               OR A
               JR Z VS2
               LD L,0
               JP M VS2
               LD L,#FF
VS2            LD H,DivTab/256
               LD A,D
               OR A
               JR Z VS3
               LD E,0
               JP M VS3
               LD E,#FF
VS3            LD D,DivTab/256
               LD A,(DE)
               SUB (HL)
               SCF
               RET Z
               INC A
               LD (IY+AnyB),A
               LD B,A
               LD L,(HL)
               LD H,YTable/256
               LD A,(V1)
               LD C,A
               ADD A,(HL)
               LD (IY+AnyL),A
               INC H
               LD A,(HL)
               LD (IY+AnyH),A
               LD A,L
               RLCA
               RLCA
               AND #3
               OR #58
               LD (IY+AnyH1),A
               LD D,A
               LD A,L
               RLCA
               RLCA
               AND #E0
               OR C
               LD (IY+AnyL1),A
               LD E,A
               LD A,L
               AND #07
               LD L,A
               LD H,BitTab/256
               LD A,(HL)
               LD (IY+AnyA),A
               EX DE,HL
               LD C,(IX+ObjeCol)
               LD DE,#20
               EXX
               LD C,#20
               LD B,(IY+AnyB)
               LD L,(IY+AnyL)
               LD H,(IY+AnyH)
               CALL Vert2
               BIT 7,A
               JR NZ VS4
               EXX
               LD (HL),C
               EXX
VS4            LD (IY+0),Vert10&#FF
               LD (IY+1),Vert10/256
               LD BC,lObjeLine
               ADD IY,BC
               SCF
               RET
V1             DEFB 0
Vert1          EXX
               LD (HL),C
               ADD HL,DE
               EXX
Vert3          LD A,#80
Vert2          DEC B
               RET Z
Vert4          SET 0,(HL) ;SMC
               INC H
               RRCA
               JP NC Vert2
               LD A,L
               ADD A,C
               LD L,A
               JR C Vert1
               LD A,H
               SUB 8
               LD H,A
               JP Vert1
Vert10         LD L,(IY+AnyL1)
               LD H,(IY+AnyH1)
               LD DE,#20
               LD A,(GameAttr)
               LD C,A
               EXX
               LD A,(IY+AnyBit)
               LD (Vert4+1),A
               LD A,(IY+AnyA)
               LD B,(IY+AnyB)
               LD L,(IY+AnyL)
               LD H,(IY+AnyH)
               LD C,#20
               CALL Vert2
               BIT 7,A
               RET NZ
               EXX
               LD (HL),C
               EXX
               RET
HS1            POP HL
               SCF
               RET
HpS            DEFW 0
HpA            DEFW 0
HoriLine       PUSH HL
               LD L,C
               LD H,B
               LD BC,128
               ADD HL,BC
               INC H
               DEC H
               JR NZ HS1
               LD H,DivTab/256
               LD L,(HL)
               LD H,YTable/256
               LD C,(HL)
               INC H
               LD B,(HL)
               LD (HpS),BC
               LD (IY+AnyH),B
               LD A,L
               RLCA
               RLCA
               AND #3
               OR #58
               LD H,A
               LD A,L
               RLCA
               RLCA
               AND #E0
               LD L,A
               LD (HpA),HL
               LD (IY+AnyD),H
               POP HL
               LD BC,128
               ADD HL,BC
               LD A,H
               OR A
               JR Z HS2
               LD L,0
               JP M HS2
               LD L,#FF
HS2            EX DE,HL
               ADD HL,BC
               LD A,H
               OR A
               JR Z HS3
               LD L,0
               JP M HS3
               LD L,#FF
HS3            LD A,L
               SUB E
               SCF
               RET Z
               LD A,L
               AND #7
               ADD A,8
               LD C,A
               LD B,BitTab/256
               LD A,(BC)
               LD (IY+AnyA),A
               LD A,E
               AND #7
               ADD A,16
               LD C,A
               LD A,(BC)
               LD (IY+AnyA1),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+AnyL),A
               LD A,(HpA)
               OR L
               LD (HpA),A
               LD (IY+AnyE),A
               LD A,E
               SUB L
               JR Z HS4
               LD (IY+AnyB),A
               LD HL,(HpS)
               LD DE,(HpA)
               LD B,A
               LD C,(IX+ObjeCol)
               LD A,(IY+AnyA1)
               EX AF,AF'
               LD A,(IY+AnyA)
               CALL HoriS
               LD (IY+0),HS6&#FF
               LD (IY+1),HS6/256
               LD BC,lObjeLine
               ADD IY,BC
               SCF
               RET
HS4            LD HL,(HpA)
               LD C,(IX+ObjeCol)
               LD (HL),C
               LD HL,(HpS)
               LD A,(IY+AnyA)
               AND (IY+AnyA1)
               OR (HL)
               LD (HL),A
               LD (IY+0),HS5&#FF
               LD (IY+1),HS5/256
               LD BC,lObjeLine
               ADD IY,BC
               SCF
               RET
HS5            LD L,(IY+AnyE)
               LD H,(IY+AnyD)
               LD A,(GameAttr)
               LD (HL),A
               LD L,(IY+AnyL)
               LD H,(IY+AnyH)
               LD A,(IY+AnyA)
               AND (IY+AnyA1)
               CPL
               AND (HL)
               LD (HL),A
               RET
HS6            LD L,(IY+AnyL)
               LD H,(IY+AnyH)
               LD E,(IY+AnyE)
               LD D,(IY+AnyD)
               LD B,(IY+AnyB)
               LD A,(IY+AnyA1)
               CPL
               EX AF,AF'
               LD A,(GameAttr)
               LD C,A
               LD A,(IY+AnyA)
               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
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      XOR A
               INC H
               DEC H
               JR Z CalcC1b
               BIT 7,H
               JR NZ CalcC1a
               OR #02
               JP CalcC1b
CalcC1a        OR #01
CalcC1b        INC D
               DEC D
               RET Z
               BIT 7,D
               JR NZ CalcC1c
               OR #04
               RET
CalcC1c        OR #08
               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,(ctX1)
               LD DE,(ctY1)
               CALL CalcEdges
               LD B,A
               LD HL,(ctX2)
               LD DE,(ctY2)
               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,(ctX2)
               LD (PaX),HL
               LD HL,(ctY2)
               LD (PaY),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,(PbX)
               LD DE,(PbY)
               LD (PmX),HL
               LD (PmY),DE
               CALL CalcEdges
               OR A
               JR NZ C2
               LD (PaX),HL
               LD (PaY),DE
               RET
C2             LD HL,(PaX)
               LD DE,(PaY)
               CALL CalcEdges
               LD B,A
               LD HL,(PmX)
               LD DE,(PmY)
               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+AnySxx)
               LD (OAxx),A
               LD A,(IY+AnySyy)
               LD (OAyy),A
               LD A,(IY+AnyHV)
               LD (OAHV),A
               LD L,(IY+AnyIXl)
               LD H,(IY+AnyIXh)
               PUSH HL
               POP IX
               LD B,(IY+AnyB1)
               LD C,(IY+AnyC1)
               LD E,(IY+AnyE1)
               LD D,(IY+AnyD1)
               LD L,(IY+AnyL1)
               LD H,(IY+AnyH1)
               EXX
               LD B,(IY+AnyB)
               LD C,(IY+AnyC)
               LD E,(IY+AnyE)
               LD L,(IY+AnyL)
               LD H,(IY+AnyH)
               LD A,(GameAttr)
               LD D,A
               LD A,(HL)
OA1            CPL
               OR C
               CPL
               EXX
               SBC HL,DE
               JR C OA3
               EXX
               DEFB #CD
OAHV           DEFW Incxx
               DJNZ OA1
               LD (HL),A
OA3x           LD A,C
               AND E
               JP M OA3a
               LD (IX),D
OA3a           POP IX
               RET
OA3            ADD HL,BC
               EXX
               DEFB #CD
OAxx           DEFW Incxx
               DEFB #CD
OAyy           DEFW Incxx
               LD (HL),A
               DJNZ OA1
               JP OA3x
AnyLine        CALL ClipThing
               RET C
               LD A,(ctX1)
               LD E,A
               SRL E
               SRL E
               SRL E
               AND #7
               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+AnyIXh),A
               LD A,D
               RLCA
               RLCA
               AND #E0
               OR E
               LD (IX_l),A
               LD (IY+AnyIXl),A
               LD A,(ctY2)
               LD L,A
               LD A,(HL)
               LD (ctY2),A
               LD A,D
               AND #7
               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
               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+0),ALOld&#FF
               LD (IY+1),ALOld/256
               LD (IY+AnyL),L
               LD (IY+AnyH),H
               LD (IY+AnyE),E
               LD (IY+AnyC),C
               LD (IY+AnyB),B
               EXX
               LD (IY+AnyL1),L
               LD (IY+AnyH1),H
               LD (IY+AnyE1),E
               LD (IY+AnyD1),D
               LD (IY+AnyC1),C
               LD (IY+AnyB1),B
               EXX
               LD A,(Colour)
               LD D,A
               PUSH IX
               DEFB #DD,#21
IX_l           DEFB 0
IX_h           DEFB 0
               LD A,(HL)
LineAlg        OR C
               EXX
               SBC HL,DE
               JR C LineAlg1
               EXX
               DEFB #CD
HorizVector    DEFW vRet
               DJNZ LineAlg
               JP LineX
LineAlg1       ADD HL,BC
               EXX
               DEFB #CD
sxxVector      DEFW vRet
               DEFB #CD
syyVector      DEFW vRet
               DJNZ LineAlg
LineX          LD (HL),A
               LD A,E
               AND C
               JP M LineXa
               LD (IX),D
LineXa         POP IX
               LD A,(sxxVector)
               LD (IY+AnySxx),A
               LD A,(syyVector)
               LD (IY+AnySyy),A
               LD A,(HorizVector)
               LD (IY+AnyHV),A
               LD BC,lObjeLine
               ADD IY,BC
               SCF
               RET
               ALIGN $100
Incxx          RRC C
               RET NC
               LD (HL),A
               LD (IX),D
               INC IXL
               INC L
               LD A,(HL)
               RET
Decxx          RLC C
               RET NC
               LD (HL),A
               LD (IX),D
               DEC IXL
               DEC L
               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 8
               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,8
               LD H,A
               LD A,(HL)
               RET
AlterSteps     CALL kDeccel
               JR NZ AS0
               CALL kAccel
               JR Z AS2
               LD DE,Zdvstep
               JR AS1
AS0            LD DE,-Zdvstep
AS1            LD HL,(DeltaZ)
               ADD HL,DE
               LD DE,MinSp
               ADD HL,DE
               BIT 7,H
               JR Z AS2
               OR A
               SBC HL,DE
               LD DE,MaxSp
               ADD HL,DE
               BIT 7,H
               JR NZ AS2
               OR A
               SBC HL,DE
               LD (DeltaZ),HL
AS2            CALL kLeft
               LD A,1
               JR NZ AS21
               CALL kRight
               LD A,2
               JP Z AS3x
AS21           LD B,A
               LD A,(OldX)
               CP B
               JR Z AS2a
               LD HL,Xdtstep
               LD (Xvar),HL
AS2a           LD HL,(Xvar)
               LD DE,dDX
               ADD HL,DE
               LD (Xvar),HL
               EX DE,HL
               LD HL,(XTurnRatio)
               LD A,B
               LD (OldX),A
               BIT 0,A
               CALL ASMakeTurn
               LD (XTurnRatio),HL
AS3            CALL kUp
               LD A,1
               JR NZ AS31
               CALL kDown
               LD A,2
               JR Z AS4
AS31           LD B,A
               LD A,(OldY)
               CP B
               JR Z AS3a
               LD HL,Ydtstep
               LD (Yvar),HL
AS3a           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,(YDiveRatio)
               CALL ASMakeTurn
               LD (YDiveRatio),HL
AS4            LD A,(YDiveRatio+1)
               BIT 7,A
               JR Z AS4a
               LD HL,HighY
               CALL Inner
               JR NZ AS5
               JR AS4c
AS4a           LD HL,LowY
               CALL Inner
               JR Z AS5
AS4c           LD (YDiveRatio),HL
AS5            LD HL,(DeltaZ)
               LD DE,(YDiveRatio)
               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,(XTurnRatio)
               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
               BIT 7,H
               RET Z
               LD (FireDZ),DE
               LD HL,ProjSp
               LD DE,(YDiveRatio)
               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,(XTurnRatio)
               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
               RET
AS3x           LD DE,Xdtstep
               LD (Xvar),DE
               JP AS3
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,(YDiveRatio)
               OR A
               SBC HL,DE
               BIT 7,H
               ADD HL,DE
               RET
Xvar           DEFW 3
OldX           DEFB 0
AS4y           LD DE,Ydtstep
               LD (Yvar),DE
               JP AS4
Yvar           DEFW 1
OldY           DEFB 0
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
ObjeTemp       DEFW 0
               DEFW -500
               DEFW 0
               DEFW GrowthRate
               DEFB 0
               DEFB 15
               DEFW pTriTow
               DEFB #F  ;F
               DEFB 2,#FF,#FF
               DEFB #FF,#FF,#FF
               DEFW 0,0,0
               DEFB #45
               DEFB 0
               DEFW nLine,0,0,0
Miss1          DEFW Miss2
               DEFB 2
               DEFB 4
               DEFW #28,#00
               DEFW 0,-#28
               DEFW -#28,0
               DEFW 0,#28
               DEFB 2
               DEFB 0,2
               DEFB 1,3
Miss2          DEFW Miss1
               DEFB 2
               DEFB 4
               DEFW #20,#20
               DEFW #20,-#20
               DEFW -#20,-#20
               DEFW -#20,#20
               DEFB 2
               DEFB 0,2
               DEFB 1,3
;
;
SheetI         DEFW Sheett,0
;
               DEFW X23
               DEFB sTri
               DEFB 0
;
;
Sheett         DEFW Sheet0,OneSht
;
               DEFW X23
               DEFB sShape
               DEFW Miss1
               DEFB 6
               DEFB 1
;
               DEFW X14
               DEFB sSqu
               DEFB 1
;
               DEFW X44
               DEFB sTri
               DEFB 0
;
;
Sheet0         DEFW Sheet1,OneSht
;
               DEFW X13
               DEFB sGun
               DEFB 1
;
               DEFW X23
               DEFB sSqu
               DEFB 1
;
               DEFW X33
               DEFB sGun
               DEFB 0
;
;
Sheet1         DEFW Sheet2,OneSht
;
               DEFW X14
               DEFB sTri
               DEFB 1
;
               DEFW X24
               DEFB sTMA
               DEFB 1
;
               DEFW X34
               DEFB sTMA
               DEFB 1
;
               DEFW X44
               DEFB sTri
               DEFB 0
;
;
Sheet2         DEFW Sheet3,TQrdSht
;
               DEFW X25
               DEFB sTMA
               DEFB 1
;
               DEFW X35
               DEFB sSqu
               DEFB 1
;
               DEFW X45
               DEFB sTMA
               DEFB 0
;
;
Sheet3         DEFW Sheet4,OneSht
;
               DEFW X24
               DEFB sTri
               DEFB 1
;
               DEFW X34
               DEFB sTri
               DEFB 0
;
;
Sheet4         DEFW Sheet5,OneSht
;
               DEFW X24
               DEFB sTri
               DEFB 1
;
               DEFW X34
               DEFB sTri
               DEFB 0
;
;
Sheet5         DEFW Sheet6,OneSht
;
               DEFW X13
               DEFB sTri
               DEFB 1
;
               DEFW X23
               DEFB sSqu
               DEFB 1
;
               DEFW X33
               DEFB sTri
               DEFB 0
;
;
Sheet6         DEFW Sheet7,OneSht
;
               DEFW X15
               DEFB sTMA
               DEFB 0
;
;
Sheet7         DEFW Sheet8,OneSht
;
               DEFW X55
               DEFB sTMA
               DEFB 0
;
;
Sheet8         DEFW Sheett,OneSht
;
               DEFW X35
               DEFB sTMA
               DEFB 0
;
;
; Vars
SighDE         DEFW 0
SighIX         DEFW 0
               ALIGN $100
DivTab         DEFS #100
YTable         DEFS #200
BitTab         DEFS 24
DeltaX         DEFW 0
FireDX         DEFW 0
DeltaY         DEFW 0
FireDY         DEFW 0
DeltaZ         DEFW 0
FireDZ         DEFW 0
XTurnRatio     DEFW 0
YDiveRatio     DEFW 0
nShields       DEFB 0
SheetZ         DEFW 0
pSheet         DEFW 0
FireDel        DEFW 0
SideSel        DEFB 0
TopSel         DEFB 0
TempX          DEFW 0
TempXl         DEFW 0
TempXr         DEFW 0
TempY          DEFW 0
TempZ          DEFW 0
X1             DEFW 0
Y1             DEFW 0
X2             DEFW 0
Y2             DEFW 0
X3             DEFW 0
Y3             DEFW 0
X4             DEFW 0
Y4             DEFW 0,0,0
ctX1           DEFW 0
ctX2           DEFW 0
ctY1           DEFW 0
ctY2           DEFW 0
PaX            DEFW 0
PaY            DEFW 0
PbX            DEFW 0
PbY            DEFW 0
PmX            DEFW 0
PmY            DEFW 0
P1X            DEFW 0
P1Y            DEFW 0
P2X            DEFW 0
P2Y            DEFW 0
Colour         DEFB 0
nMiss          DEFB 0
;
               ALIGN $100
ObjeTable      DEFS nObje * lObje
GroundY        DEFW StartY ; moved
StarTable      DEFS nStar * lStar
ProjTable      DEFS nProj * lProj

