ORG  &0100
fill 0

DEBUGSound EQU 0            ; 0 MTX sounds 1 dummy sounds
V2disc     EQU 1
splitINT   EQU 1
Testing    EQU 0

If testing
name       cheat/com
else
name       code/com
endif


VDPdata    EQU &01
VDPaddress EQU &02

PSGStrobe  EQU &03
PSG        EQU &06

keyDrive   EQU &05
keyScan1   EQU &05
keyScan2   EQU &06

CTC0       EQU &08              ; vDP interrupt connnected to CTC channel 0
CTC1       EQU &09              ; keyboard interrupt connnected to CTC channel 1
FPGA       EQU &3A


; VDP setup
pixels      EQU &0000
spriteAttr  EQU &1B00
colours     EQU &2000
spritePat   EQU &3800

spriteAttrW EQU &5B00          ; write bit pre set
spritePatW  EQU &7800

cross       EQU 4*4            ; crosshair is the 4th sprite

rg1         EQU %11100010      ; default reg 1 value, ... dispaly and VDP interrupt enabled, 16x16 sprite






TempHL     EQU &D600          ; temporary store for HL on start up
tempSP     EQU &D602          ; temporary store for the stack pointer on start up
FDB        EQU &D606          ; file data Buffer, 512 bytes in MSX guise
                              ; only 139 actually used for saved game data 



PlotBuffer EQU &D600          ; RAM based buffer for plotting prior to transfer to VRAM
                              ; 16 rows x 256 bytes = 4096 in total
plotBufferHi EQU plotBuffer>8

LE600 EQU &E600
LE601 EQU &E601
LE602 EQU &E602
LE603 EQU &E603
LE604 EQU &E604
LE605 EQU &E605
LE608 EQU &E608
LE609 EQU &E609
LE613 EQU &E613
LE615 EQU &E615
LE617 EQU &E617
LE619 EQU &E619
LE61B EQU &E61B

LE6C8 EQU &E6C8
LE6C9 EQU &E6C9
LE6CC EQU &E6CC
LE6CE EQU &E6CE
LE6D0 EQU &E6D0
LE6D2 EQU &E6D2
LE6D4 EQU &E6D4
LE6D6 EQU &E6D6
LE6D8 EQU &E6D8
LE6DA EQU &E6DA
LE6DC EQU &E6DC
LE6DE EQU &E6DE
LE6E0 EQU &E6E0
LE6E2 EQU &E6E2
LE6E4 EQU &E6E4
LE6E6 EQU &E6E6
LE6E8 EQU &E6E8
LE6EA EQU &E6EA
LE6EC EQU &E6EC
LE6EE EQU &E6EE
LE6EF EQU &E6EF
LE6F0 EQU &E6F0
LE6F1 EQU &E6F1
LE6F3 EQU &E6F3


bit7       EQU &E700          ; bit7 to bit0 in order
LE708 EQU &E708
LE709 EQU &E709
LE70A EQU &E70A
LE70B EQU &E70B
LE70C EQU &E70C
LE70D EQU &E70D
printPixel EQU &E70E          ; pixel for pixel accruate printing
printAddr  EQU &E70F          ; and the screen address
galaxyInfo EQU &E711          ; seems to have the 6 byte root data for the galaxy
decodeBuf  EQU &E717          ; text buffer for system name etc

LE722 EQU &E722
LE723 EQU &E723
LE724 EQU &E724
LE725 EQU &E725
LE727 EQU &E727
LE729 EQU &E729
LE72A EQU &E72A
hyperSystem EQU &E72B
posX       EQU &E72C
flashCounter EQU &E72D
flashFlag EQU &E72E
LE730 EQU &E730
SPsave     EQU &E732
LE734 EQU &E734
flashMesAdd EQU &E735
flashMesLen EQU &E737
LE738 EQU &E738
buyItemNo EQU &E73C
LE73D EQU &E73D
LE73E EQU &E73E
LE740 EQU &E740
LE742 EQU &E742
localAvail  EQU &E744
LE745 EQU &E745
laserPoints EQU &E749
LE74B EQU &E74B
LE74D EQU &E74D
LE74E EQU &E74E
LE750 EQU &E750
LE752 EQU &E752
LE75C EQU &E75C
LE75E EQU &E75E
LE760 EQU &E760
LE761 EQU &E761
LE762 EQU &E762
LE763 EQU &E763
LE764 EQU &E764
LE765 EQU &E765
LE766 EQU &E766
LE767 EQU &E767
LE768 EQU &E768
LE769 EQU &E769
LE76A EQU &E76A

LE774 EQU &E774
LE775 EQU &E775
LE776 EQU &E776
LE777 EQU &E777
LE778 EQU &E778
LE779 EQU &E779
LE77B EQU &E77B
LE77D EQU &E77D
LE77F EQU &E77F

LE784 EQU &E784
LE785 EQU &E785
LE7B6 EQU &E7B6
LE7B7 EQU &E7B7
LE7E8 EQU &E7E8
LE7E9 EQU &E7E9
LE7EA EQU &E7EA
LE7EC EQU &E7EC
LE7EE EQU &E7EE
LE7FC EQU &E7FC
LE800 EQU &E800
LE802 EQU &E802
LE804 EQU &E804
LE80C EQU &E80C
LE80D EQU &E80D
LE819 EQU &E819
LE81D EQU &E81D
LE81F EQU &E81F
LE821 EQU &E821
LE823 EQU &E823
LE824 EQU &E824
LE826 EQU &E826
LE827 EQU &E827
LE829 EQU &E829
LE82C EQU &E82C
LE82D EQU &E82D
LE82E EQU &E82E
LE82F EQU &E82F

LE830 EQU &E830
LE831 EQU &E831
LE832 EQU &E832
LE833 EQU &E833
LE834 EQU &E834
LE835 EQU &E835
LE836 EQU &E836
LE837 EQU &E837
LE838 EQU &E838
LE839 EQU &E839
LE83A EQU &E83A
LE83B EQU &E83B
LE83C EQU &E83C
LE83D EQU &E83D
LE83E EQU &E83E
LE83F EQU &E83F

LE844 EQU &E844
LE846 EQU &E846
LE848 EQU &E848
LE850 EQU &E850
LE857 EQU &E857
LE860 EQU &E860
LE861 EQU &E861
LE864 EQU &E864
LE865 EQU &E865
LE866 EQU &E866
LE867 EQU &E867
LE868 EQU &E868
LE869 EQU &E869
LE86A EQU &E86A
LE86C EQU &E86C
LE86E EQU &E86E
LE86F EQU &E86F
LE870 EQU &E870
LE871 EQU &E871
LE873 EQU &E873
LE874 EQU &E874
LE876 EQU &E876
LE878 EQU &E878
LE87A EQU &E87A
LE87B EQU &E87B
LE87C EQU &E87C
LE87D EQU &E87D
LE87F EQU &E87F
LE880 EQU &E880
LE884 EQU &E884
LE885 EQU &E885
LE886 EQU &E886
LE887 EQU &E887
LE888 EQU &E888
LE88A EQU &E88A
LE88B EQU &E88B
LE88C EQU &E88C
LE88E EQU &E88E
LE890 EQU &E890
LE892 EQU &E892

tempSoundBuff EQU &E894       ; used to build sound buffer
                              ; offset 00 activity flag? 
PSGtoneChan EQU &E895         ; offset 01 current tone channel 0,1,2
PSGvolChan  EQU &E896         ; offset 02 current tone volume channel 8,9,10
LE897 EQU &E897
PSGreg      EQU &E898
PSGaddress  EQU &E899
LE89B EQU &E89B
PSGpointer  EQU &E89C         ; offset 08/09  
LE89E EQU &E89E
PSGnote     EQU &E89F         ; offset 11/12 current frequency
Envelope    EQU &E8A1         ; offset 13 envelope active if &FF
LE8A2 EQU &E8A2

channel0    EQU &E8A3         ; sound control buffers
channel1    EQU &E8B2
channel2    EQU &E8C1

songPointer    EQU &E8D0
songFlag       EQU &E8D2
channelPointer EQU &E8D3      ; pointer to the current sound buffer in the 
                              ; temporary bufer
channelTask    EQU &E8D5      ; rotating pointer for sount updates
PSGactive      EQU &E8D6      ; 0 off, 1 = soundeffect, &FF = music ?
PSG7copy       EQU &E8D7
PSGinterrupt   EQU &E8D8      ; gets set to &FF on ths start of the interrupt code

textBuff     EQU &E8DC

MessageNo    EQU &E8F3          ; cycle through score,m elapsed time and game credits
stickData    EQU &E8F4 
keyASCII     EQU &E8F5
LE8F6 EQU &E8F6
keyBuffer    EQU &E8F7

LE900 EQU &E900
currentScreen EQU &E902       ; current infor screen being displayed
currentView   EQU &E903
systemInfo    EQU &E904       ; 6 bytes of system data 
flagFlight    EQU &E90A       ; possibly an in flight flag ?
LE90B EQU &E90B
condition     EQU &E90C
LE90D EQU &E90D
condColour    EQU &E90E
colFlag       EQU &E90F
LE910 EQU &E910
LE911 EQU &E911
LE912 EQU &E912
LE913 EQU &E913
gameFlagBits EQU &E914        ; bit 0 S/Q set = sound off
                              ; Bit 1 D
                              ; Bit 2 R
                              ; Bit 3 B
                              ; Bit 4 Y
                              ; Bit 5 F
                              ; bit 6 M   set = music off
LE915 EQU &E915
LE916 EQU &E916
LE917 EQU &E917
LE918 EQU &E918
screenCount EQU &E919
LE91A EQU &E91A
countdown   EQU &E91B
LE91C EQU &E91C
currentCount EQU &E91D
intActive   EQU &E91E
LE91F EQU &E91F
LE920 EQU &E920
LE921 EQU &E921
LE923 EQU &E923
LE925 EQU &E925
optionsActive equ &E924
LE925 EQU &E925
LE928 EQU &E928
LE929 EQU &E929
LE92A EQU &E92A
LE92B EQU &E92B
bufferPos EQU &E92C
LE92D EQU &E92D
LE92E EQU &E92E
LE92F EQU &E92F
LE930 EQU &E930
keyData    EQU &E931          ; keyboard row scanned
keyRow     EQU &E932          ; data returned
LE933 EQU &E933
LE934 EQU &E934
seed       EQU &E936          ; 3 bytes for RNG generation 

LE939 EQU &E939
LE93A EQU &E93A
LE93B EQU &E93B
LE93C EQU &E93C
missionStatus EQU &E93D
LE93E EQU &E93E

LE940 EQU &E940
LE941 EQU &E941
LE943 EQU &E943
LE944 EQU &E944
LE945 EQU &E945
LE946 EQU &E946
LE948 EQU &E948
LE949 EQU &E949
LE94A EQU &E94A
LE9D6 EQU &E9D6
LE9D7 EQU &E9D7

LEAD6 EQU &EAD6
LEAD7 EQU &EAD7
LEAD9 EQU &EAD9
LEADB EQU &EADB

LEB02 EQU &EB02
LEB03 EQU &EB03
LEB05 EQU &EB05
commander  EQU &EB06
comLength  EQU &EB11 
rating     EQU &EB12
currentScore EQU &EB13        ; 3 bytes
credits    EQU &EB16          ; 3 bytes
cargoSpace EQU &EB19          ; 17 or 18 x 4 Bytes ?
LEB55 EQU &EB55
LEB5D EQU &EB5D
LEB5E EQU &EB5E
LEB61 EQU &EB61
LEB63 EQU &EB63
LEB64 EQU &EB64
naughtynes EQU &EB65
LEB66 EQU &EB66
currentSystem EQU &EB67
LEB68 EQU &EB68
LEB6A EQU &EB6A
LEB6C EQU &EB6C
LEB6E EQU &EB6E
LEB6F EQU &EB6F
LEB76 EQU &EB76
LEB77 EQU &EB77
LEB7A EQU &EB7A
LEB7C EQU &EB7C
LEB7D EQU &EB7D
LEB80 EQU &EB80
LEB82 EQU &EB82
LEB83 EQU &EB83
LEB84 EQU &EB84
LEB85 EQU &EB85
LEB86 EQU &EB86
LEB87 EQU &EB87
LEB88 EQU &EB88
LEB89 EQU &EB89
LEB8A EQU &EB8A
LEB8C EQU &EB8C
LEB8E EQU &EB8E
LEB8F EQU &EB8F
LEB90 EQU &EB90
LEB92 EQU &EB92
LEB93 EQU &EB93
LEB94 EQU &EB94
LEB95 EQU &EB95
LEB96 EQU &EB96
LEB97 EQU &EB97
LEB98 EQU &EB98
LEB99 EQU &EB99
flightView EQU &EB9A
LEB9B EQU &EB9B
LEB9C EQU &EB9C
LEB9E EQU &EB9E
LEBA0 EQU &EBA0
LEBA1 EQU &EBA1
LEBA3 EQU &EBA3
LEBA5 EQU &EBA5
LEBC9 EQU &EBC9
LEC18 EQU &EC18

LEE03 EQU &EE03 
LEEC0 EQU &EEC0
spaceType  EQU &EEC1          ; non zero prints witchspace on the status screen
repairing  EQU &EEC2
LEEC3 EQU &EEC3
LEEC4 EQU &EEC4
LEEC5 EQU &EEC5
LEEC6 EQU &EEC6 

LEF8E EQU &EF8E
LEF8F EQU &EF8F
LEF90 EQU &EF90
LEF91 EQU &EF91
LEF92 EQU &EF92
LEF93 EQU &EF93
LEF94 EQU &EF94
frameCounter EQU &EF95
LEF96 EQU &EF96
LEF97 EQU &EF97
LEF98 EQU &EF98
LEF99 EQU &EF99
LEF9A EQU &EF9A
LEF9B EQU &EF9B
LEF9C EQU &EF9C
LEF9D EQU &EF9D
screenInUse EQU &EF9E         ; seems to flag screen access in progress if non zero
cloakFlag   EQU &EF9F
LEFA0 EQU &EFA0
LEFA1 EQU &EFA1
LEFA2 EQU &EFA2
LEFA3 EQU &EFA3
LEFA4 EQU &EFA4
starPointer EQU &EFA6         ; pointer to 15x 11 byte star motion buffers
jammerFlag  EQU &EFA8
LEFA9 EQU &EFA9
last  EQU &EFAA

; these may need moving so as not to over-write the CPM BIOS on CPM3
L0080 EQU &0080
L0087 EQu &0087
L009D EQU &009D

ComanderData equ &D3C0               ; 128 byte table copied from 7172

; cockpitData EQU &D440
timeSec    EQU &D442
timeMin    EQU &D443
timeHour   EQU &D444
timeDay    EQU &D445
LF746 EQU &D446
LF748 EQU &D448
LF749 EQU &D449
LF74A EQU &D44A


systemCopy EQU &D44B          ; copy of the 6 bytes of system info from the generator
inhabitant EQU &D44F          ; top bit set for non human
alienData  EQU &D450          ; bits 2-4=size 5-7=colour
LF751 EQU &D451
LF752 EQU &D452
government EQU &D453
economy    EQU &D454
LF755 EQU &D455
fragBuffer EQU &D456          ; 4 bytes of name fragments
LF75A EQU &D45A
LF760 EQU &D460
LF762 EQU &D462
techLevel  EQU &D464
LF769 EQU &D469
LF76B EQU &D46B
LF76D EQU &D46D
LF76F EQU &D46F
LF771 EQU &D471
LF773 EQU &D473
hyperFuel  EQU &D475
missiles   EQU &D476
LF777 EQU &D477
LF778 EQU &D478
LF779 EQU &D479
LF77A EQU &D47A
LF77B EQU &D47B
LF77C EQU &D47C
LF77D EQU &D47D
LF77E EQU &D47E
LF77F EQU &D47F
LF780 EQU &D480
LF781 EQU &D481
LF782 EQU &D482
jammerEquiped EQU &D483
cloakEquiped EQU &D484
LF785 EQU &D485
stockList EQU &D489             ; 4 bytes x 17 items = 68 bytes
LF78B EQU &D48B

LF7CD EQU &D4CD                 ; stocklist+68
LF7CE EQU &D4CE
LF7CF EQU &D4CF

LF7D0 EQU &D4D0
LF7D1 EQU &D4D1
LF7D2 EQU &D4D2
LF7D3 EQU &D4D3
LF7D4 EQU &D4D4
LF7D6 EQU &D4D6
LF7D8 EQU &D4D8
LF7DA EQU &D4DA
LF7DB EQU &D4DB
LF7DC EQU &D4DC
LF7DE EQU &D4DE
LF7DF EQU &D4DF
LF7E0 EQU &D4E0
LF7E2 EQU &D4E2
LF7E4 EQU &D4E4
LF7E6 EQU &D4E6
LF7E7 EQU &D4E7                ; somethign to do with ship type?
LF7E8 EQU &D4E8
LF7E9 EQU &D4E9
LF7EA EQU &D4EA
LF7EB EQU &D4EB
LF7EC EQU &D4EC
LF7ED EQU &D4ED
LF7EE EQU &D4EE
LF7EF EQU &D4EF
LF7F0 EQU &D4F0
LF7F1 EQU &D4F1
LF7F2 EQU &D4F2
LF7F3 EQU &D4F3
LF7F4 EQU &D4F4
ShipData   EQU &D4F5           ; 26 bytes of ship data 
LF7F7 EQU &D4F7
LF7F9 EQU &D4F9
shipTypeP  EQU shipdata+6      ; bytes 6 and 7 are a pointer to the name if there is one
LF7FD EQU &D4FD
LF7FE EQU &D4FE
LF7FF EQU &D4FF

LF800 EQU &D500
LF802 EQU &D502
LF803 EQU &D503
LF804 EQU &D504
LF805 EQU &D505
LF806 EQU &D506
LF807 EQU &D507
LF809 EQU &D509
LF80A EQU &D50A
LF80B EQU &D50B
LF80F EQU &D50F
LF810 EQU &D510
LF811 EQU &D511
altitude   EQU &D512
LF813 EQU &D513
LF814 EQU &D514
LF815 EQU &D515
LF816 EQU &D516
energyStore EQU &D517
LF818 EQU &D518
LF819 EQU &D519
LF81A EQU &D51A
LF81B EQU &D51B
endOfVariables EQU LF81B+2

; "illegal" opcodes

LD_A_IYH EQU &7CFD            ; FD 7C is LD A,IYh reversed for DW effect
LD_IYH_B EQU &60FD
LD_IYH_D EQU &62FD
LD_IYL_C EQU &69FD
LD_IYL_E EQU &6BFD

LD_IXH_B EQU &60DD
LD_IXL_C EQU &69DD
LD_IXH_A EQU &67DD
LD_IXL_A EQU &6FDD
DEC_IXL  EQU &2DDD
DEC_IXH  EQU &26DD

.L0100
; JR   L0106
;  
; DW   stack                  ; the loader uses these values
; DW   stack


; .L0106
LD   SP,stack
ld   hl,cockpit
;CALL setupRam
call setupCTC
.L010C
CALL L1C5C                    ; do the rotating letters thing
.L010F
LD   HL,(LF746)
INC  HL
LD   (LF746),HL
XOR  A
LD   (LF748),A
CALL readControls
LD   A,(flagFlight)
OR   A
CALL Z,L13FD
LD   A,(LF749)
OR   A
JR   Z,L010F
XOR  A
LD   (condition),A
LD   (missionStatus),A
CALL musicOff
LD   A,(LF74A)
CP   &03
CALL NZ,L1703
XOR  A
LD   (LF749),A
JP   L010C
zero 17
.markSpace
ret
zero 54


;  
; DS   "* GAME OVER *"
; DB   &00
; .L0151
; RET
;  

; ; print HL to the VDP as BCD

; .L0152
; LD   A,H
; CALL L0157
; LD   A,L
; .L0157
; PUSH AF
; RRA
; RRA
; RRA
; RRA
; CALL L0160
; POP  AF
; .L0160
; AND  &0F
; ADD  A,&30
; CP   &3A
; JR   C,L016A
; .L0168
; ADD  A,&07
; .L016A
; PUSH BC
; PUSH HL
; LD   L,A
; LD   H,&00
; ADD  HL,HL
; ADD  HL,HL
; ADD  HL,HL
; LD   BC,font-256            ; font starts with space not char 00
; ADD  HL,BC
; LD   B,&08
; .L0178
; LD   A,(HL)
; INC  HL
;  nop
;  nop
; OUT  (VDPdata),A
; DJNZ L0178
; POP  HL
; POP  BC
; RET
;  
; JP   &F420
;  
; DW   &EBDA
; DW   &EBD9



; lookup table of how many "active" bits in a byte
; 00000000 and 00000001 > 1
; 00000010 and 00000011 > 2
; 00000100, 00000101, 00000110 and 00000111 > 3 etc

; must be on a page boundary
align 256
.multiplyBits
DB   &01,&01,&02,&02,&03,&03,&03,&03,&04,&04,&04,&04,&04,&04,&04,&04
DB   &05,&05,&05,&05,&05,&05,&05,&05,&05,&05,&05,&05,&05,&05,&05,&05
DB   &06,&06,&06,&06,&06,&06,&06,&06,&06,&06,&06,&06,&06,&06,&06,&06
DB   &06,&06,&06,&06,&06,&06,&06,&06,&06,&06,&06,&06,&06,&06,&06,&06
DB   &07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07
DB   &07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07
DB   &07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07
DB   &07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07,&07
DB   &08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08
DB   &08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08
DB   &08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08
DB   &08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08
DB   &08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08
DB   &08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08
DB   &08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08
DB   &08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08,&08

; scalling table for converting -128 to +127 -96 to +95 
.scaleTable
DB   &00,&01,&02,&02,&03,&04,&05,&05,&06,&07,&08,&08,&09,&0A,&0B,&0B
DB   &0C,&0D,&0E,&0E,&0F,&10,&11,&11,&12,&13,&14,&14,&15,&16,&17,&17
DB   &18,&19,&1A,&1A,&1B,&1C,&1D,&1D,&1E,&1F,&20,&20,&21,&22,&23,&23
DB   &24,&25,&26,&26,&27,&28,&29,&29,&2A,&2B,&2C,&2C,&2D,&2E,&2F,&2F
DB   &30,&31,&32,&32,&33,&34,&35,&35,&36,&37,&38,&38,&39,&3A,&3B,&3B
DB   &3C,&3D,&3E,&3E,&3F,&40,&41,&41,&42,&43,&44,&44,&45,&46,&47,&47
DB   &48,&49,&4A,&4A,&4B,&4C,&4D,&4D,&4E,&4F,&50,&50,&51,&52,&53,&53
DB   &54,&55,&56,&56,&57,&58,&59,&59,&5A,&5B,&5C,&5C,&5D,&5E,&5F,&5F

DB   &A0,&A1,&A1,&A2,&A3,&A4,&A4,&A5,&A6,&A7,&A7,&A8,&A9,&AA,&AA,&AB
DB   &AC,&AD,&AD,&AE,&AF,&B0,&B0,&B1,&B2,&B3,&B3,&B4,&B5,&B6,&B6,&B7
DB   &B8,&B9,&B9,&BA,&BB,&BC,&BC,&BD,&BE,&BF,&BF,&C0,&C1,&C2,&C2,&C3
DB   &C4,&C5,&C5,&C6,&C7,&C8,&C8,&C9,&CA,&CB,&CB,&CC,&CD,&CE,&CE,&CF
DB   &D0,&D1,&D1,&D2,&D3,&D4,&D4,&D5,&D6,&D7,&D7,&D8,&D9,&DA,&DA,&DB
DB   &DC,&DD,&DD,&DE,&DF,&E0,&E0,&E1,&E2,&E3,&E3,&E4,&E5,&E6,&E6,&E7
DB   &E8,&E9,&E9,&EA,&EB,&EC,&EC,&ED,&EE,&EF,&EF,&F0,&F1,&F2,&F2,&F3
DB   &F4,&F5,&F5,&F6,&F7,&F8,&F8,&F9,&FA,&FB,&FB,&FC,&FD,&FE,&FE,&FF


; log table ?
; each entry is 2^(row/32)
.antiLog2Table
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0001
DW   &0002
DW   &0002
DW   &0002
DW   &0002
DW   &0002
DW   &0002
DW   &0002
DW   &0002
DW   &0002
DW   &0002
DW   &0002
DW   &0002
DW   &0002
DW   &0002
DW   &0002
DW   &0002
DW   &0002
DW   &0002
DW   &0002
DW   &0003
DW   &0003
DW   &0003
DW   &0003
DW   &0003
DW   &0003
DW   &0003
DW   &0003
DW   &0003
DW   &0003
DW   &0003
DW   &0003
DW   &0003
DW   &0004
DW   &0004
DW   &0004
DW   &0004
DW   &0004
DW   &0004
DW   &0004
DW   &0004
DW   &0004
DW   &0004
DW   &0004
DW   &0005
DW   &0005
DW   &0005
DW   &0005
DW   &0005
DW   &0005
DW   &0005
DW   &0005
DW   &0006
DW   &0006
DW   &0006
DW   &0006
DW   &0006
DW   &0006
DW   &0006
DW   &0007
DW   &0007
DW   &0007
DW   &0007
DW   &0007
DW   &0007
DW   &0008
DW   &0008
DW   &0008
DW   &0008
DW   &0008
DW   &0008
DW   &0009
DW   &0009
DW   &0009
DW   &0009
DW   &0009
DW   &000A
DW   &000A
DW   &000A
DW   &000A
DW   &000B
DW   &000B
DW   &000B
DW   &000B
DW   &000C
DW   &000C
DW   &000C
DW   &000C
DW   &000D
DW   &000D
DW   &000D
DW   &000E
DW   &000E
DW   &000E
DW   &000E
DW   &000F
DW   &000F
DW   &0010
DW   &0010
DW   &0010
DW   &0011
DW   &0011
DW   &0011
DW   &0012
DW   &0012
DW   &0013
DW   &0013
DW   &0013
DW   &0014
DW   &0014
DW   &0015
DW   &0015
DW   &0016
DW   &0016
DW   &0017
DW   &0017
DW   &0018
DW   &0018
DW   &0019
DW   &0019
DW   &001A
DW   &001A
DW   &001B
DW   &001C
DW   &001C
DW   &001D
DW   &001D
DW   &001E
DW   &001F
DW   &0020
DW   &0020
DW   &0021
DW   &0022
DW   &0022
DW   &0023
DW   &0024
DW   &0025
DW   &0026
DW   &0026
DW   &0027
DW   &0028
DW   &0029
DW   &002A
DW   &002B
DW   &002C
DW   &002D
DW   &002E
DW   &002F
DW   &0030
DW   &0031
DW   &0032
DW   &0033
DW   &0034
DW   &0035
DW   &0036
DW   &0038
DW   &0039
DW   &003A
DW   &003B
DW   &003D
DW   &003E
DW   &0040
DW   &0041
DW   &0042
DW   &0044
DW   &0045
DW   &0047
DW   &0048
DW   &004A
DW   &004C
DW   &004D
DW   &004F
DW   &0051
DW   &0052
DW   &0054
DW   &0056
DW   &0058
DW   &005A
DW   &005C
DW   &005E
DW   &0060
DW   &0062
DW   &0064
DW   &0067
DW   &0069
DW   &006B
DW   &006D
DW   &0070
DW   &0072
DW   &0075
DW   &0077
DW   &007A
DW   &007D
DW   &0080
DW   &0082
DW   &0085
DW   &0088
DW   &008B
DW   &008E
DW   &0091
DW   &0094
DW   &0098
DW   &009B
DW   &009E
DW   &00A2
DW   &00A5
DW   &00A9
DW   &00AD
DW   &00B1
DW   &00B5
DW   &00B8
DW   &00BD
DW   &00C1
DW   &00C5
DW   &00C9
DW   &00CE
DW   &00D2
DW   &00D7
DW   &00DB
DW   &00E0
DW   &00E5
DW   &00EA
DW   &00EF
DW   &00F5
DW   &00FA
DW   &0100
DW   &0105
DW   &010B
DW   &0111
DW   &0117
DW   &011D
DW   &0123
DW   &0129
DW   &0130
DW   &0137
DW   &013D
DW   &0144
DW   &014B
DW   &0153
DW   &015A
DW   &0162
DW   &016A
DW   &0171
DW   &017A
DW   &0182
DW   &018A
DW   &0193
DW   &019C
DW   &01A5
DW   &01AE
DW   &01B7
DW   &01C1
DW   &01CB
DW   &01D5
DW   &01DF
DW   &01EA
DW   &01F5
DW   &0200
DW   &020B
DW   &0216
DW   &0222
DW   &022E
DW   &023A
DW   &0247
DW   &0253
DW   &0260
DW   &026E
DW   &027B
DW   &0289
DW   &0297
DW   &02A6
DW   &02B5
DW   &02C4
DW   &02D4
DW   &02E3
DW   &02F4
DW   &0304
DW   &0315
DW   &0326
DW   &0338
DW   &034A
DW   &035D
DW   &036F
DW   &0383
DW   &0396
DW   &03AB
DW   &03BF
DW   &03D4
DW   &03EA
DW   &0400
DW   &0416
DW   &042D
DW   &0444
DW   &045C
DW   &0475
DW   &048E
DW   &04A7
DW   &04C1
DW   &04DC
DW   &04F7
DW   &0513
DW   &052F
DW   &054D
DW   &056A
DW   &0589
DW   &05A8
DW   &05C7
DW   &05E8
DW   &0609
DW   &062B
DW   &064D
DW   &0671
DW   &0695
DW   &06BA
DW   &06DF
DW   &0706
DW   &072D
DW   &0756
DW   &077F
DW   &07A9
DW   &07D4
DW   &0800
DW   &082C
DW   &085A
DW   &0889
DW   &08B9
DW   &08EA
DW   &091C
DW   &094F
DW   &0983
DW   &09B8
DW   &09EF
DW   &0A27
DW   &0A5F
DW   &0A9A
DW   &0AD5
DW   &0B12
DW   &0B50
DW   &0B8F
DW   &0BD0
DW   &0C12
DW   &0C56
DW   &0C9B
DW   &0CE2
DW   &0D2A
DW   &0D74
DW   &0DBF
DW   &0E0C
DW   &0E5B
DW   &0EAC
DW   &0EFE
DW   &0F52
DW   &0FA8
DW   &1000
DW   &1059
DW   &10B5
DW   &1113
DW   &1172
DW   &11D4
DW   &1238
DW   &129E
DW   &1306
DW   &1371
DW   &13DE
DW   &144E
DW   &14BF
DW   &1534
DW   &15AB
DW   &1624
DW   &16A0
DW   &171F
DW   &17A1
DW   &1825
DW   &18AC
DW   &1937
DW   &19C4
DW   &1A55
DW   &1AE8
DW   &1B7F
DW   &1C19
DW   &1CB7
DW   &1D58
DW   &1DFC
DW   &1EA4
DW   &1F50
DW   &2000
DW   &20B3
DW   &216A
DW   &2226
DW   &22E5
DW   &23A9
DW   &2470
DW   &253D
DW   &260D
DW   &26E3
DW   &27BD
DW   &289C
DW   &297F
DW   &2A68
DW   &2B56
DW   &2C48
DW   &2D41
DW   &2E3E
DW   &2F42
DW   &304B
DW   &3159
DW   &326E
DW   &3389
DW   &34AA
DW   &35D1
DW   &36FE
DW   &3833
DW   &396E
DW   &3AB0
DW   &3BF9
DW   &3D49
DW   &3EA0
DW   &4000
DW   &4166
DW   &42D5
DW   &444C
DW   &45CA
DW   &4752
DW   &48E1
DW   &4A7A
DW   &4C1B
DW   &4DC6
DW   &4F7A
DW   &5138
DW   &52FF
DW   &54D0
DW   &56AC
DW   &5891
DW   &5A82
DW   &5C7D
DW   &5E84
DW   &6096
DW   &62B3
DW   &64DC
DW   &6712
DW   &6954
DW   &6BA2
DW   &6DFD
DW   &7066
DW   &72DC
DW   &7560
DW   &77F2
DW   &7A92
DW   &7D41
DW   &8000
DW   &82CD
DW   &85AA
DW   &8898
DW   &8B95
DW   &8EA4
DW   &91C3
DW   &94F4
DW   &9837
DW   &9B8D
DW   &9EF5
DW   &A270
DW   &A5FE
DW   &A9A1
DW   &AD58
DW   &B123
DW   &B504
DW   &B8FB
DW   &BD08
DW   &C12C
DW   &C567
DW   &C9B9
DW   &CE24
DW   &D2A8
DW   &D745
DW   &DBFB
DW   &E0CC
DW   &E5B9
DW   &EAC0
DW   &EFE4
DW   &F525
DW   &FA83

.log2Table
DW   &FFFF
DW   &0001
DW   &0400
DW   &0657
DW   &0800
DW   &094A
DW   &0A57
DW   &0B3B
DW   &0C00
DW   &0CAE
DW   &0D4A
DW   &0DD6
DW   &0E57
DW   &0ECD
DW   &0F3B
DW   &0FA1
DW   &1000
DW   &105A
DW   &10AE
DW   &10FE
DW   &114A
DW   &1192
DW   &11D6
DW   &1218
DW   &1257
DW   &1293
DW   &12CD
DW   &1305
DW   &133B
DW   &136F
DW   &13A1
DW   &13D1
DW   &1400
DW   &142D
DW   &145A
DW   &1484
DW   &14AE
DW   &14D6
DW   &14FE
DW   &1524
DW   &154A
DW   &156E
DW   &1592
DW   &15B4
DW   &15D6
DW   &15F8
DW   &1618
DW   &1638
DW   &1657
DW   &1675
DW   &1693
DW   &16B1
DW   &16CD
DW   &16E9
DW   &1705
DW   &1720
DW   &173B
DW   &1755
DW   &176F
DW   &1788
DW   &17A1
DW   &17B9
DW   &17D1
DW   &17E9
DW   &1800
DW   &1817
DW   &182D
DW   &1844
DW   &185A
DW   &186F
DW   &1884
DW   &1899
DW   &18AE
DW   &18C2
DW   &18D6
DW   &18EA
DW   &18FE
DW   &1911
DW   &1924
DW   &1937
DW   &194A
DW   &195C
DW   &196E
DW   &1980
DW   &1992
DW   &19A3
DW   &19B4
DW   &19C6
DW   &19D6
DW   &19E7
DW   &19F8
DW   &1A08
DW   &1A18
DW   &1A28
DW   &1A38
DW   &1A48
DW   &1A57
DW   &1A66
DW   &1A75
DW   &1A84
DW   &1A93
DW   &1AA2
DW   &1AB1
DW   &1ABF
DW   &1ACD
DW   &1ADB
DW   &1AE9
DW   &1AF7
DW   &1B05
DW   &1B13
DW   &1B20
DW   &1B2D
DW   &1B3B
DW   &1B48
DW   &1B55
DW   &1B62
DW   &1B6F
DW   &1B7B
DW   &1B88
DW   &1B94
DW   &1BA1
DW   &1BAD
DW   &1BB9
DW   &1BC5
DW   &1BD1
DW   &1BDD
DW   &1BE9
DW   &1BF4
DW   &1C00
DW   &1C0B
DW   &1C17
DW   &1C22
DW   &1C2D
DW   &1C39
DW   &1C44
DW   &1C4F
DW   &1C5A
DW   &1C64
DW   &1C6F
DW   &1C7A
DW   &1C84
DW   &1C8F
DW   &1C99
DW   &1CA4
DW   &1CAE
DW   &1CB8
DW   &1CC2
DW   &1CCC
DW   &1CD6
DW   &1CE0
DW   &1CEA
DW   &1CF4
DW   &1CFE
DW   &1D08
DW   &1D11
DW   &1D1B
DW   &1D24
DW   &1D2E
DW   &1D37
DW   &1D40
DW   &1D4A
DW   &1D53
DW   &1D5C
DW   &1D65
DW   &1D6E
DW   &1D77
DW   &1D80
DW   &1D89
DW   &1D92
DW   &1D9B
DW   &1DA3
DW   &1DAC
DW   &1DB4
DW   &1DBD
DW   &1DC6
DW   &1DCE
DW   &1DD6
DW   &1DDF
DW   &1DE7
DW   &1DEF
DW   &1DF8
DW   &1E00
DW   &1E08
DW   &1E10
DW   &1E18
DW   &1E20
DW   &1E28
DW   &1E30
DW   &1E38
DW   &1E40
DW   &1E48
DW   &1E4F
DW   &1E57
DW   &1E5F
DW   &1E66
DW   &1E6E
DW   &1E75
DW   &1E7D
DW   &1E84
DW   &1E8C
DW   &1E93
DW   &1E9B
DW   &1EA2
DW   &1EA9
DW   &1EB1
DW   &1EB8
DW   &1EBF
DW   &1EC6
DW   &1ECD
DW   &1ED4
DW   &1EDB
DW   &1EE2
DW   &1EE9
DW   &1EF0
DW   &1EF7
DW   &1EFE
DW   &1F05
DW   &1F0C
DW   &1F13
DW   &1F19
DW   &1F20
DW   &1F27
DW   &1F2D
DW   &1F34
DW   &1F3B
DW   &1F41
DW   &1F48
DW   &1F4E
DW   &1F55
DW   &1F5B
DW   &1F62
DW   &1F68
DW   &1F6F
DW   &1F75
DW   &1F7B
DW   &1F82
DW   &1F88
DW   &1F8E
DW   &1F94
DW   &1F9A
DW   &1FA1
DW   &1FA7
DW   &1FAD
DW   &1FB3
DW   &1FB9
DW   &1FBF
DW   &1FC5
DW   &1FCB
DW   &1FD1
DW   &1FD7
DW   &1FDD
DW   &1FE3
DW   &1FE9
DW   &1FEF
DW   &1FF4
DW   &1FFA
DW   &2000
.L0A02
DB   &13,&82,&06,&01,&00
DB   &14,&81,&0A,&03,&00
DB   &41,&83,&02,&07,&00
DB   &28,&85,&E2,&1F,&04
DB   &53,&85,&FB,&0F,&00
DB   &C4,&08,&36,&03,&00
DB   &EB,&1D,&08,&78,&04
DB   &9A,&0E,&38,&03,&00
DB   &75,&06,&28,&07,&00
DB   &4E,&01,&11,&1F,&00
DB   &9C,&0D,&1D,&07,&02
DB   &B0,&89,&DC,&3F,&00
DB   &18,&A1,&60,&03,&00
DB   &61,&A1,&42,&07,&00
DB   &AB,&A2,&37,&1F,&00
DB   &2D,&C1,&FA,&0F,&00
DB   &35,&0F,&F8,&07,&00

; MSX original
; DB   "7","6","5","4","3","2","1","0"
; DB   ";","]","[","\","?","-","9","8"
; DB   "B","A","-","/",".",&2C,&27,&60
; DB   "J","I","H","G","F","E","D","C"
; DB   "R","Q","P","O","N","M","L","K"
; DB   "Z","Y","X","W","V","U","T","S"
; DB   &82,&81,&80,&00,&00,&00,&00,&00
; DB   &0D,&85,&7F,&86,&09,&1B,&84,&83
; DB   &8A,&8B,&8C,&8D,&89,&88,&87,&20

; Modified Memotech key table
; upper case with numbers
; row data port 5 7:0 then port6 1:0 for each row
;   5b7 5b6 5b5 5b4 5b3 5b2 5b1 5b0 6b1 6b0
.keyTable 
DB  "T","\","-","9","7","5","3","1",&80,"M"
DB  "U","~","0","8","6","4","2",&1B,&84,&7F
DB  &00,"[","P","I","Y","R","W",&09,&81,&09
DB  &00,&0A,&60,"O","U","T","E","Q",&85,"E"
DB  &00,"]",";","K","H","F","S",&00,&86,"^"
DB  &00,&0D,&2A,"L","J","G","D","A",&82,&27
DB  &00,&00,"/",&2C,"N","V","X",&00,&87,":"
DB  "J","C",&5F,",","M","B","C","Z",&83," "

.font
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00000000
DB   %00100000
DB   %00000000
DB   %01010000
DB   %01010000
DB   %01010000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %01010000
DB   %01010000
DB   %11111000
DB   %01010000
DB   %11111000
DB   %01010000
DB   %01010000
DB   %00000000
DB   %00100000
DB   %01111000
DB   %10100000
DB   %01110000
DB   %00101000
DB   %11110000
DB   %00100000
DB   %00000000
DB   %11000000
DB   %11001000
DB   %00010000
DB   %00100000
DB   %01000000
DB   %10011000
DB   %00011000
DB   %00000000
DB   %01000000
DB   %10100000
DB   %10100000
DB   %01000000
DB   %10101000
DB   %10010000
DB   %01101000
DB   %00000000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00100000
DB   %01000000
DB   %10000000
DB   %10000000
DB   %10000000
DB   %01000000
DB   %00100000
DB   %00000000
DB   %00100000
DB   %00010000
DB   %00001000
DB   %00001000
DB   %00001000
DB   %00010000
DB   %00100000
DB   %00000000
DB   %00100000
DB   %10101000
DB   %01110000
DB   %00100000
DB   %01110000
DB   %10101000
DB   %00100000
DB   %00000000
DB   %00000000
DB   %00100000
DB   %00100000
DB   %11111000
DB   %00100000
DB   %00100000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00100000
DB   %00100000
DB   %01000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %11111000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00010000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00001000
DB   %00010000
DB   %00100000
DB   %01000000
DB   %10000000
DB   %00000000
DB   %00000000
DB   %01110000
DB   %10001000
DB   %10011000
DB   %10101000
DB   %11001000
DB   %10001000
DB   %01110000
DB   %00000000
DB   %00100000
DB   %01100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %01110000
DB   %00000000
DB   %01110000
DB   %10001000
DB   %00001000
DB   %00010000
DB   %00100000
DB   %01000000
DB   %11111000
DB   %00000000
DB   %11111000
DB   %00001000
DB   %00010000
DB   %00110000
DB   %00001000
DB   %10001000
DB   %01110000
DB   %00000000
DB   %00010000
DB   %00110000
DB   %01010000
DB   %10010000
DB   %11111000
DB   %00010000
DB   %00010000
DB   %00000000
DB   %11111000
DB   %10000000
DB   %11110000
DB   %00001000
DB   %00001000
DB   %10001000
DB   %01110000
DB   %00000000
DB   %00110000
DB   %01000000
DB   %10000000
DB   %11110000
DB   %10001000
DB   %10001000
DB   %01110000
DB   %00000000
DB   %11111000
DB   %00001000
DB   %00010000
DB   %00100000
DB   %01000000
DB   %01000000
DB   %01000000
DB   %00000000
DB   %01110000
DB   %10001000
DB   %10001000
DB   %01110000
DB   %10001000
DB   %10001000
DB   %01110000
DB   %00000000
DB   %01110000
DB   %10001000
DB   %10001000
DB   %01111000
DB   %00001000
DB   %00010000
DB   %01100000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00100000
DB   %00000000
DB   %00000000
DB   %00100000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %00100000
DB   %00000000
DB   %00000000
DB   %00100000
DB   %00100000
DB   %01000000
DB   %00010000
DB   %00100000
DB   %01000000
DB   %10000000
DB   %01000000
DB   %00100000
DB   %00010000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %11111000
DB   %00000000
DB   %11111000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %01000000
DB   %00100000
DB   %00010000
DB   %00001000
DB   %00010000
DB   %00100000
DB   %01000000
DB   %00000000
DB   %01110000
DB   %10001000
DB   %00010000
DB   %00100000
DB   %00100000
DB   %00000000
DB   %00100000
DB   %00000000
DB   %01110000
DB   %10001000
DB   %10101000
DB   %10111000
DB   %10110000
DB   %10000000
DB   %01111000
DB   %00000000
DB   %00100000
DB   %01010000
DB   %10001000
DB   %10001000
DB   %11111000
DB   %10001000
DB   %10001000
DB   %00000000
DB   %11110000
DB   %10001000
DB   %10001000
DB   %11110000
DB   %10001000
DB   %10001000
DB   %11110000
DB   %00000000
DB   %01110000
DB   %10001000
DB   %10000000
DB   %10000000
DB   %10000000
DB   %10001000
DB   %01110000
DB   %00000000
DB   %11110000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %11110000
DB   %00000000
DB   %11111000
DB   %10000000
DB   %10000000
DB   %11110000
DB   %10000000
DB   %10000000
DB   %11111000
DB   %00000000
DB   %11111000
DB   %10000000
DB   %10000000
DB   %11110000
DB   %10000000
DB   %10000000
DB   %10000000
DB   %00000000
DB   %01111000
DB   %10000000
DB   %10000000
DB   %10000000
DB   %10011000
DB   %10001000
DB   %01111000
DB   %00000000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %11111000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %00000000
DB   %01110000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %01110000
DB   %00000000
DB   %00001000
DB   %00001000
DB   %00001000
DB   %00001000
DB   %00001000
DB   %10001000
DB   %01110000
DB   %00000000
DB   %10001000
DB   %10010000
DB   %10100000
DB   %11000000
DB   %10100000
DB   %10010000
DB   %10001000
DB   %00000000
DB   %10000000
DB   %10000000
DB   %10000000
DB   %10000000
DB   %10000000
DB   %10000000
DB   %11111000
DB   %00000000
DB   %10001000
DB   %11011000
DB   %10101000
DB   %10101000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %00000000
DB   %10001000
DB   %10001000
DB   %11001000
DB   %10101000
DB   %10011000
DB   %10001000
DB   %10001000
DB   %00000000
DB   %01110000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %01110000
DB   %00000000
DB   %11110000
DB   %10001000
DB   %10001000
DB   %11110000
DB   %10000000
DB   %10000000
DB   %10000000
DB   %00000000
DB   %01110000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %10101000
DB   %10010000
DB   %01101000
DB   %00000000
DB   %11110000
DB   %10001000
DB   %10001000
DB   %11110000
DB   %10100000
DB   %10010000
DB   %10001000
DB   %00000000
DB   %01110000
DB   %10001000
DB   %10000000
DB   %01110000
DB   %00001000
DB   %10001000
DB   %01110000
DB   %00000000
DB   %11111000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00000000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %01110000
DB   %00000000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %01010000
DB   %00100000
DB   %00000000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %10101000
DB   %10101000
DB   %11011000
DB   %10001000
DB   %00000000
DB   %10001000
DB   %10001000
DB   %01010000
DB   %00100000
DB   %01010000
DB   %10001000
DB   %10001000
DB   %00000000
DB   %10001000
DB   %10001000
DB   %01010000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00000000
DB   %11111000
DB   %00001000
DB   %00010000
DB   %00100000
DB   %01000000
DB   %10000000
DB   %11111000
DB   %00000000
DB   %01111000
DB   %01000000
DB   %01000000
DB   %01000000
DB   %01000000
DB   %01000000
DB   %01111000
DB   %00000000
DB   %00000000
DB   %10000000
DB   %01000000
DB   %00100000
DB   %00010000
DB   %00001000
DB   %00000000
DB   %00000000
DB   %11110000
DB   %00010000
DB   %00010000
DB   %00010000
DB   %00010000
DB   %00010000
DB   %11110000
DB   %00000000
DB   %00100000
DB   %01010000
DB   %10101000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00000000
DB   %00111000
DB   %01000000
DB   %01000000
DB   %01000000
DB   %11110000
DB   %01000000
DB   %11111000
DB   %00000000
DB   %00110000
DB   %01001000
DB   %10110100
DB   %10100100
DB   %10100100
DB   %10110100
DB   %01001000
DB   %00110000
DB   %00000000
DB   %00000000
DB   %01110000
DB   %00001000
DB   %01111000
DB   %10001000
DB   %01111000
DB   %00000000
DB   %10000000
DB   %10000000
DB   %11110000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %11110000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %01111000
DB   %10000000
DB   %10000000
DB   %10000000
DB   %01111000
DB   %00000000
DB   %00001000
DB   %00001000
DB   %01111000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %01111000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %01110000
DB   %10001000
DB   %11111000
DB   %10000000
DB   %01111000
DB   %00000000
DB   %00110000
DB   %01001000
DB   %01000000
DB   %11110000
DB   %01000000
DB   %01000000
DB   %01000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %01110000
DB   %10001000
DB   %10001000
DB   %01111000
DB   %00001000
DB   %01110000
DB   %10000000
DB   %10000000
DB   %11110000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %00000000
DB   %00100000
DB   %00000000
DB   %01100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %01110000
DB   %00000000
DB   %00010000
DB   %00000000
DB   %00110000
DB   %00010000
DB   %00010000
DB   %00010000
DB   %10010000
DB   %01100000
DB   %10000000
DB   %10000000
DB   %10001000
DB   %10010000
DB   %11100000
DB   %10010000
DB   %10001000
DB   %00000000
DB   %01100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %01110000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %11011000
DB   %10101000
DB   %10101000
DB   %10101000
DB   %10001000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %11110000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %01110000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %01110000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %11110000
DB   %10001000
DB   %10001000
DB   %11110000
DB   %10000000
DB   %10000000
DB   %00000000
DB   %00000000
DB   %01111000
DB   %10001000
DB   %10001000
DB   %01111000
DB   %00001000
DB   %00001000
DB   %00000000
DB   %00000000
DB   %10111000
DB   %11000000
DB   %10000000
DB   %10000000
DB   %10000000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %01111000
DB   %10000000
DB   %01110000
DB   %00001000
DB   %11110000
DB   %00000000
DB   %01000000
DB   %01000000
DB   %11110000
DB   %01000000
DB   %01000000
DB   %01001000
DB   %00110000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %10011000
DB   %01101000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %01010000
DB   %00100000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %10001000
DB   %10001000
DB   %10101000
DB   %10101000
DB   %11011000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %10001000
DB   %01010000
DB   %00100000
DB   %01010000
DB   %10001000
DB   %00000000
DB   %00000000
DB   %00000000
DB   %10001000
DB   %10001000
DB   %10001000
DB   %01111000
DB   %00001000
DB   %01110000
DB   %00000000
DB   %00000000
DB   %11111000
DB   %00010000
DB   %00100000
DB   %01000000
DB   %11111000
DB   %00000000
DB   %00111000
DB   %01100000
DB   %01100000
DB   %11000000
DB   %01100000
DB   %01100000
DB   %00111000
DB   %00000000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %00100000
DB   %11100000
DB   %00110000
DB   %00110000
DB   %00011000
DB   %00110000
DB   %00110000
DB   %11100000
DB   %00000000
DB   %10101000
DB   %01010100
DB   %10101000
DB   %01010100
DB   %10101000
DB   %01010100
DB   %10101000
DB   %01010100
DB   %11111100
DB   %11111100
DB   %11111100
DB   %11111100
DB   %11111100
DB   %11111100
DB   %11111100
DB   %00000000


.commoditiesList
DC   "Food"
DC   "Textiles"
DC   "Radioactives"
DC   "Slaves"
DC   "Liquor/Wines"
DC   "Luxuries"
DC   "Narcotics"
DC   "Computers"
DC   "Machinery"
DC   "Alloys"
DC   "Firearms"
DC   "Furs"
DC   "Minerals"
DC   "Gold"
DC   "Platinum"
DC   "Gem-Stones"
DC   "Alien Items"
DC   "Refugees"
DC   "Thargoid documents"

.TnameFragments
DS   "  "
DS   "le"
DS   "xe"
DS   "ge"
DS   "za"
DS   "ce"
DS   "bi"
DS   "so"
DS   "us"
DS   "es"
DS   "ar"
DS   "ma"
DS   "in"
DS   "di"
DS   "re"
DS   "a "
DS   "er"
DS   "at"
DS   "en"
DS   "be"
DS   "ra"
DS   "la"
DS   "ve"
DS   "ti"
DS   "ed"
DS   "or"
DS   "qu"
DS   "an"
DS   "te"
DS   "is"
DS   "ri"
DS   "on"

.ThumanColony
DZ   "Human Colonial)"

.TalienSize
DC   "Large "
DC   "Fierce "
DC   "Small "
DB   &80,&80,&80,&80
DB   &80

.TalienColour
DC   "Green "
DC   "Red "
DC   "Yellow "
DC   "Blue "
DC   "Black "
DC   "Harmless "
DB   &80

.TalienSkin
DC   "Slimy "
DC   "Bug-eyed "
DC   "Horned "
DC   "Bony "
DC   "Fat "
DC   "Furry "
DB   &80
DB   &80

.TalienType
DC   "Rodent"
DC   "Frog"
DC   "Lizard"
DC   "Lobster"
DC   "Bird"
DC   "Humanoid"
DC   "Feline"
DC   "Insect"

.RatingList
DC   "Harmless"
DC   "Mostly Harmless"
DC   "Poor"
DC   "Average"
DC   "Above average"
DC   "Competent"
DC   "Dangerous"
DC   "Deadly"
DC   "E-L-I-T-E"

.TwealthList
DC   "Poor "
DC   "Average"
DC   "Mainly "
DC   "Rich "

.Tagricultural
DZ   " Agricultural"

.Tindustrial
DZ   " Industrial"

.TgovernmentList
DC   "Anarchy"
DC   "Feudal"
DC   "Multi-government"
DC   "Dictatorship"
DC   "Communist"
DC   "Confederacy"
DC   "Democracy"
DC   "Corporate state"

.TshipSupplies
DC   "Fuel"
DC   "Missiles"
DC   "Large Cargo Bay"
DC   "ECM system"
DC   "Pulse Laser"
DC   "Beam Laser"
DC   "Fuel Scoop"
DC   "Escape Capsule"
DC   "Energy Bomb"
DC   "Extra Energy Unit"
DC   "Docking Computer"
DC   "Galactic Hyperdrive"
DC   "Mining laser"
DC   "Military laser"

.itemsList
DB   &80
DB   &80
DC   "Large Cargo Bay"
DC   "ECM System"
DC   "Pulse "
DC   "Beam "
DC   "Fuel Scoop"
DC   "Escape Capsule"
DC   "Energy Bomb"
DC   "Energy Unit"
DC   "Docking Computer"
DC   "Gal. Hyperdrive"
DC   "Mining "
DC   "Military "
DC   "ECM Jammer"
DC   "Cloaking Device"
DC   "Documents"

.TnavalUnit
DC   "Naval Energy Unt"

.DitemTechLevel
DB   &00,&00,&00,&02,&03,&04,&05,&06,&07,&08,&09,&0A,&0A,&0A,&FF

.DpriceList
DW       0
DW     300
DW    4000
DW    6000
DW    4000
DW   10000
DW    5250
DW   10000
DW    9000
DW   15000
DW   15000
DW   50000
DW    8000
DW   60000

.bitMasks
DB   &80,&40,&20,&10,&08,&04,&02,&01

.BfrontView
DB   %11111011
DB   %11000011
DB   %11110011
DB   %11000011
DB   %11000011

DB   %11000111
DB   %01101101
DB   %11001101
DB   %01001101
DB   %00100111

DB   %00100110
DB   %10110110
DB   %10111110
DB   %10110110
DB   %00110010

DB   %11110000
DB   %01100000
DB   %01100000
DB   %01100000
DB   %01100000

DB   %01101101
DB   %01101100
DB   %01101100
DB   %00101000
DB   %00010001

DB   %11101111
DB   %11001100
DB   %11001111
DB   %11001100
DB   %11101111

DB   %10110110
DB   %00110110
DB   %00110110
DB   %00111110
DB   %10010100

.BrearView
DB   %00111100
DB   %00110110
DB   %00111100
DB   %00110100
DB   %00110010

DB   %11111001
DB   %11000011
DB   %11110011
DB   %11000011
DB   %11111011

DB   %11001111
DB   %01101101
DB   %11101111
DB   %01101101
DB   %01101100

DB   %00000011
DB   %10000011
DB   %00000011
DB   %00000001
DB   %10000000

DB   %01101111
DB   %01100110
DB   %01100110
DB   %01000110
DB   %10001111

DB   %01111101
DB   %01100001
DB   %01111001
DB   %01100001
DB   %01111100

DB   %10110000
DB   %10110000
DB   %10110000
DB   %11110000
DB   %10100000

.BleftView
DB   %00110000
DB   %00110000
DB   %00110000
DB   %00110000
DB   %00111110

DB   %11111011
DB   %11000011
DB   %11110011
DB   %11000011
DB   %11111011

DB   %11101111
DB   %00000110
DB   %11000110
DB   %00000110
DB   %00000110

DB   %00000011
DB   %00000011
DB   %00000011
DB   %00000001
DB   %00000000

DB   %01101111
DB   %01100110
DB   %01100110
DB   %01000110
DB   %10001111

DB   %01111101
DB   %01100001
DB   %01111001
DB   %01100001
DB   %01111100

DB   %10110000
DB   %10110000
DB   %10110000
DB   %11110000
DB   %10100000

.BrightView
DB   %11110011
DB   %11011001
DB   %11110001
DB   %11010001
DB   %11001011

DB   %11001111
DB   %10011000
DB   %10011011
DB   %10011001
DB   %11001111

DB   %01101101
DB   %01101100
DB   %01111100
DB   %01101100
DB   %01101100

DB   %11100000
DB   %11000000
DB   %11000000
DB   %11000000
DB   %11000000

DB   %01101101
DB   %01101100
DB   %01101100
DB   %00101000
DB   %00010001

DB   %11101111
DB   %11001100
DB   %11001111
DB   %11001100
DB   %11101111

DB   %10110110
DB   %00110110
DB   %00110110
DB   %00111110
DB   %10010100

.L121B
DB   &00,&00,&40,&00,&00,&00
DB   &61,&FF,&3F,&FA,&8E,&00
DB   &82,&FD,&3F,&F1,&1D,&01
DB   &63,&FA,&3F,&E2,&AC,&01
DB   &06,&F6,&3F,&CB,&3B,&02
DB   &68,&F0,&3F,&A9,&CA,&02
DB   &8D,&E9,&3F,&79,&59,&03
DB   &71,&E1,&3F,&38,&E8,&03
DB   &17,&D8,&3F,&E4,&76,&04
DB   &7F,&CD,&3F,&79,&05,&05
DB   &A8,&C1,&3F,&F6,&93,&05
DB   &93,&B4,&3F,&56,&22,&06
DB   &40,&A6,&3F,&98,&B0,&06
DB   &AF,&96,&3F,&B9,&3E,&07
DB   &E1,&85,&3F,&B5,&CC,&07
DB   &D6,&73,&3F,&8B,&5A,&08
DB   &8E,&60,&3F,&36,&E8,&08
DB   &09,&4C,&3F,&B6,&75,&09
DB   &49,&36,&3F,&06,&03,&0A
DB   &4E,&1F,&3F,&24,&90,&0A
DB   &17,&07,&3F,&0D,&1D,&0B
DB   &A6,&ED,&3E,&BF,&A9,&0B
DB   &FB,&D2,&3E,&37,&36,&0C
DB   &17,&B7,&3E,&72,&C2,&0C
DB   &F9,&99,&3E,&6D,&4E,&0D
DB   &A3,&7B,&3E,&26,&DA,&0D
DB   &15,&5C,&3E,&99,&65,&0E
DB   &4F,&3B,&3E,&C5,&F0,&0E
DB   &54,&19,&3E,&A6,&7B,&0F
DB   &22,&F6,&3D,&3A,&06,&10
DB   &BB,&D1,&3D,&7E,&90,&10
DB   &1F,&AC,&3D,&6F,&1A,&11
DB   &50,&85,&3D,&0B,&A4,&11
DB   &4E,&5D,&3D,&4F,&2D,&12
DB   &19,&34,&3D,&38,&B6,&12
DB   &B3,&09,&3D,&C4,&3E,&13
DB   &1D,&DE,&3C,&EF,&C6,&13
DB   &56,&B1,&3C,&B8,&4E,&14
DB   &61,&83,&3C,&1C,&D6,&14
DB   &3D,&54,&3C,&18,&5D,&15
DB   &ED,&23,&3C,&A9,&E3,&15

.circleCoords
DB   &80,&00
DB   &7F,&0B
DB   &7E,&16
DB   &7B,&21
DB   &78,&2B
DB   &74,&36
DB   &6E,&40
DB   &68,&49
DB   &62,&52
DB   &5A,&5A
DB   &52,&62
DB   &49,&68
DB   &3F,&6E
DB   &36,&74
DB   &2B,&78
DB   &21,&7B
DB   &16,&7E
DB   &0B,&7F
DB   &00,&80
.defaultCommander
DS   "JAMESON"
DB   &00
.range0
DB   &01
DB   &00,&00
.range1
DB   &04
DB   &00,&02
DB   &01,&02
DB   &02,&00
DB   &02,&01
.range2
DB   &06
DB   &00,&04
DB   &01,&04
DB   &02,&02
DB   &02,&03
DB   &03,&00
DB   &03,&01
.range3
DB   &09
DB   &00,&06
DB   &01,&06
DB   &02,&05
DB   &02,&06
DB   &03,&04
DB   &04,&03
DB   &05,&00
DB   &05,&01
DB   &05,&02
.range4
DB   &0C
DB   &00,&08
DB   &01,&08
DB   &02,&07
DB   &02,&08
DB   &03,&07
DB   &04,&06
DB   &05,&05
DB   &06,&00
DB   &06,&01
DB   &06,&02
DB   &06,&03
DB   &06,&04
.range5
DB   &0E
DB   &00,&0A
DB   &01,&0A
DB   &02,&0A
DB   &03,&09
DB   &04,&09
DB   &05,&08
DB   &06,&06
DB   &06,&07
DB   &07,&04
DB   &07,&05
DB   &08,&00
DB   &08,&01
DB   &08,&02
DB   &08,&03
.range6
DB   &11
DB   &00,&0C
DB   &01,&0C
DB   &02,&0C
DB   &03,&0B
DB   &04,&0B
DB   &05,&0A
DB   &06,&09
DB   &06,&0A
DB   &07,&08
DB   &08,&06
DB   &08,&07
DB   &09,&04
DB   &09,&05
DB   &0A,&00
DB   &0A,&01
DB   &0A,&02
DB   &0A,&03
.range7
DB   &14
DB   &00,&0E
DB   &01,&0E
DB   &02,&0E
DB   &03,&0D
DB   &04,&0D
DB   &05,&0D
DB   &06,&0B
DB   &06,&0C
DB   &07,&0B
DB   &08,&0A
DB   &09,&08
DB   &09,&09
DB   &0A,&04
DB   &0A,&05
DB   &0A,&06
DB   &0A,&07
DB   &0B,&00
DB   &0B,&01
DB   &0B,&02
DB   &0B,&03
.RangePointers
DW   range0
DW   range1
DW   range2
DW   range3
DW   range4
DW   range5
DW   range6
DW   range7


.L13FD
LD   A,(currentView)
OR   A
JR   Z,L1409
CALL cleanBuffer
CALL L872E
.L1409
CALL L1651
CALL L6BE1
LD   A,(LF746)
RRA
JR   NC,L1437
LD   A,(cloakFlag)
OR   A
JR   Z,L1426
LD   B,&01
CALL L19EC
LD   HL,TcloakOn
CALL L39E9
.L1426
LD   A,(jammerFlag)
OR   A
JR   Z,L1437
LD   B,&01
CALL L19EC
LD   HL,TjammerOn
CALL L39E9
.L1437
LD   HL,LEB02
.L143A
LD   A,(HL)
OR   A
JR   NZ,L143A
LD   (LE948),A
LD   (LE943),A
LD   HL,LE94A
LD   (LE946),HL
LD   HL,&012C
LD   (LEB03),HL
LD   HL,LEBA0
LD   B,&14
.L1455
BIT  0,(HL)
JP   Z,L14AD
.L145A
LD   A,&14
SUB  B
LD   (LE911),A
PUSH BC
PUSH HL
LD   DE,LF7CD
LD   BC,&0028
LDIR
CALL L16E3
XOR  A
LD   (LE92D),A
CALL L883D
CALL L8755
CALL L8205
CALL L85FB
CALL L8B00
CALL L866D
CALL L422E
CALL L2528
CALL L28F6
CALL L43C2
LD   A,(LF815)
OR   A
CALL NZ,L22C0
LD   A,(LF816)
OR   A
CALL NZ,L221B
CALL L4503
POP  DE
LD   HL,LF7CD
LD   BC,&0028
LDIR
EX   DE,HL
POP  BC
JR   L14B1
 
.L14AD
LD   DE,&0028
ADD  HL,DE
.L14B1
DEC  B
JP   NZ,L1455
LD   A,(currentView)
LD   (LEB02),A
CALL L2DC8
LD   A,(LE918)
OR   A
JR   Z,L14EA
DEC  A
LD   (LE918),A
JR   NZ,L14EA
LD   (LE722),A
LD   (LEF8E),A
CALL L8B8F
CALL random
.L14D6
LD   C,A
LD   A,(missionStatus)
SUB  &21
JR   Z,L14E6
LD   A,(LF762)
ADD  A,A
ADD  A,A
ADD  A,A
ADD  A,A
ADD  A,A
.L14E6
CP   C
CALL C,L2C3C
.L14EA
LD   A,(LE933)
OR   A
JR   Z,L1503
XOR  A
LD   (LEF8E),A
LD   (LE933),A
LD   (LE918),A
LD   (LE722),A
CALL doBeep
CALL L8B8F
.L1503
LD   HL,LE92E
DEC  (HL)
JR   NZ,L150B
LD   (HL),&03
.L150B
LD   A,(spaceType)
OR   A
JR   NZ,L1517
CALL L1549
CALL L1577
.L1517
CALL L2B05
CALL L15E7
CALL L16BA
CALL L894D
CALL L323C
LD   A,(LE917)
OR   A
JR   Z,L1531
CALL L1873
JR   L1548
 
.L1531
CALL L18E6
.L1534
LD   A,(currentView)
OR   A
JR   Z,L1540
CALL displayBuffer
CALL markSpace
.L1540
LD   HL,LF748
.L1543
LD   A,(HL)
CP   &05
JR   C,L1543
.L1548
RET
 
.L1549
LD   HL,(LE727)
LD   DE,9000
OR   A
SBC  HL,DE
LD   HL,LEB05
JR   NC,L156D
LD   A,(HL)
OR   A
JR   NZ,L156B
LD   (HL),&01
.L155D
CALL L6ADC
LD   HL,LEF9C
LD   A,(HL)
OR   A
JR   NZ,L156B
DEC  (HL)
CALL L2C21
.L156B
JR   L1576
 
.L156D
LD   A,(HL)
.L156E
OR   A
JR   Z,L1576
LD   (HL),&00
CALL L6ADC
.L1576
RET
 
.L1577
LD   HL,(LE727)
LD   DE,&03E8
ADD  HL,DE
LD   BC,&04E0
LD   DE,&F000
CALL L15CB
LD   HL,altitude
CP   (HL)
LD   (HL),A
CALL NZ,L6AC4
LD   HL,(LE725)
.L1592
LD   BC,&03F0
LD   DE,LF800
CALL L15CB
SUB  &18
NEG
LD   HL,LF811
CP   (HL)
LD   (HL),A
CALL NZ,L6AD0
LD   A,(LF811)
CP   &15
RET  C
LD   A,(LF77B)
OR   A
RET  Z
LD   A,(LF814)
CP   &0F
RET  C
LD   A,(hyperFuel)
CP   &46
RET  Z
INC  A
LD   (hyperFuel),A
CALL L6AAD
LD   HL,TscoopOn
JP   L39E9
 
.L15CB
LD   A,H
AND  C
JR   Z,L15D2
LD   A,&18
RET
 
.L15D2
ADD  HL,DE
JR   C,L15D7
XOR  A
.L15D6
RET
 
.L15D7
ADD  HL,HL
ADD  HL,HL
ADD  HL,HL           ; HL x 8
LD   D,H
LD   E,L
ADD  HL,HL           ; HL x 16
ADD  HL,DE           ; HL x 24  
ADC  A,A
.L15DF
SRL  A
RR   H
.L15E3
DJNZ L15DF
LD   A,H
RET
 
.L15E7
XOR  A
LD   (condition),A
LD   A,(LE943)
OR   A
JR   Z,L15F6
LD   A,&01
LD   (condition),A

.L15F6
LD   A,(energyStore)
CP   &18
JR   NC,L1608
LD   HL,TenergyLow
CALL L39E9
LD   A,&02
LD   (condition),A

.L1608
LD   A,(spaceType)
OR   A
JR   NZ,L162E
LD   A,(altitude)
CP   &04
JR   NC,L1620
LD   HL,TaltitudeLow
CALL L39E9
LD   A,&02
LD   (condition),A

.L1620
LD   A,(LF811)
CP   &10
JR   C,L162C
LD   A,&02
LD   (condition),A
.L162C
JR   L163A
 
.L162E
LD   A,(repairing)
OR   A
JR   NZ,L163A
LD   HL,Trepaired
CALL L39E9
.L163A
LD   A,(missionStatus)
CP   &22
JR   Z,L1645
CP   &33
JR   NZ,L1650
.L1645
LD   HL,Tsupernova
CALL L39E9
LD   A,&02
LD   (condition),A
.L1650
RET
 
.L1651
LD   A,(countdown)
OR   A
RET  Z
LD   IX,Ncountdown
LD   A,(countdown)
LD   C,A
XOR  A
SBC  HL,HL
CALL numberToText
LD   A,(currentView)
OR   A
JR   Z,L1670
LD   HL,Tcountdown
JP   flashMessage
 
.L1670
LD   A,(countdown)
LD   HL,currentCount
.L1676
CP   (HL)
RET  Z
LD   (HL),A
CALL clearLower
LD   HL,Tcountdown
HALT 
JP   restart08
 
.L1683
LD   A,(currentView)
OR   A
JP   NZ,flashMessage
PUSH HL
CALL clearLower
POP  HL
JP   momentaryPrint
 
.L1692

if testing
; disable check for docking computer for beta testers
else
LD   A,(LF77F)
OR   A
JP   Z,doBeep
endif

LD   A,(LEB05)
OR   A
JP   Z,doBeep
.L16A0
LD   A,(LEF97)
OR   A
JP   NZ,doBeep
LD   A,(spaceType)
OR   A
RET  NZ
LD   A,(missionStatus)
CP   &52
.L16B1
JP   Z,doBeep
LD   A,&FF
LD   (LE917),A
RET
 
.L16BA
LD   BC,(LF749)
LD   A,(altitude)
OR   A
JR   NZ,L16C9
LD   BC,&00FF
JR   L16DE
 
.L16C9
LD   A,(energyStore)
OR   A
.L16CD
JR   NZ,L16D4
LD   BC,&01FF
JR   L16DE
 
.L16D4
LD   A,(LF811)
CP   &18
JR   NZ,L16DE
LD   BC,&02FF
.L16DE
LD   (LF749),BC
RET
 
.L16E3
LD   A,(LF7E7)
CP   &64
RET  NC
.L16E9
ADD  A,A
LD   L,A
LD   H,&00
LD   BC,stack                  ; ship data is immediatel above the stack
ADD  HL,BC
LD   A,(HL)
INC  HL
LD   H,(HL)
LD   L,A                       ; extract pointer to ship data
LD   DE,shipData
LD   BC,&001A                  ; ship data has a 26 byte header, of 4 pointers and ...
LDIR
RET
 
.doBeep
LD   A,&06
JP   soundSystem
 
.L1703
XOR  A
LD   (flagFlight),A
CALL DrawFrontView
LD   A,plotBufferHi+14
LD   (bufferPos),A
CALL L28D4
LD   A,&01
LD   (LF7CD),A
LD   (LF7E6),A
LD   (LE945),A
LD   A,&00
.L171F
LD   (LF7EE),A
LD   A,&07
LD   (LF7E7),A
LD   B,&04
.L1729
PUSH BC
LD   HL,&0000
LD   (LF7CE),HL
LD   (LF7D0),HL
LD   HL,&00C8
LD   (LF7D2),HL
LD   DE,LF7DA
LD   B,&03
.L173E
CALL random
LD   (DE),A
INC  DE
CALL random
AND  &BF
LD   (DE),A
INC  DE
DJNZ L173E
DEC  DE
EX   DE,HL
SET  7,(HL)
CALL L8E62
LD   A,&FA
.L1755
LD   (LF7E6),A
LD   B,&03
.L175A
PUSH BC
CALL L866D
POP  BC
DJNZ L175A
LD   DE,LF7DB
LD   B,&03
.L1766
LD   A,(DE)
XOR  &80
LD   (DE),A
INC  DE
INC  DE
DJNZ L1766
CALL L8E62
CALL L3037
POP  BC
DJNZ L1729
LD   HL,&0000
LD   (LF7CE),HL
LD   (LF7D0),HL
LD   HL,&00FA
LD   (LF7D2),HL
XOR  A
LD   (LF7E6),A
LD   A,&40
LD   (LF7EF),A
LD   A,&FF
LD   (LF7F0),A
LD   A,&01
LD   (LF7EE),A
LD   B,&02
.L179B
PUSH BC
CALL L3037
LD   HL,(LF7D2)
LD   DE,-100
ADD  HL,DE
LD   (LF7D2),HL
POP  BC
DJNZ L179B
LD   A,&02
CALL soundSystem
.L17B1
CALL cleanBuffer
LD   HL,LEBA0
LD   B,&06
.L17B9
PUSH BC
PUSH HL
LD   DE,LF7CD
LD   BC,&0028
LDIR
CALL L16E3
CALL L883D
LD   A,(LF7EE)
CP   &01
JR   Z,L17DD
LD   HL,LF7EF
INC  (HL)
LD   A,(HL)
AND  &03
JR   NZ,L17DD
LD   HL,LF7E6
DEC  (HL)
.L17DD
CALL L2528
CALL L422E
CALL L866D
POP  DE
LD   HL,LF7CD
LD   BC,&0028
LDIR
EX   DE,HL
POP  BC
DJNZ L17B9
LD   HL,TgameOver
CALL flashMessage
CALL displayBuffer
LD   A,(LE945)
OR   A
.L1800
CALL NZ,colourFillRand
LD   A,(LF7CD)
BIT  0,A
JR   NZ,L17B1
RET
 

; assuming the "active" display is 22 x 14 character cells
; this will fill the colour table with semi random colours

.colourFillRand
XOR  A
LD   (LE945),A
LD   HL,1*256+40+colours            ; &2128 row 1 cell 5
LD   C,&0E                           ; 14 rows
.L1814
DI
LD   A,L
OUT  (VDPaddress),A
LD   A,H
OR   &40
OUT  (VDPaddress),A
LD   B,&B0                           ; 22 characters worth of colour
.L181F
LD   A,R
AND  &0F
CP   &02
JR   C,L181F                         ; pick a colour 2 to 15
ADD  A,A
ADD  A,A
ADD  A,A
ADD  A,A                             ; make the pixel colour
OR   &01                             ; add black background
.L182D
OUT  (VDPdata),A
DJNZ L181F                           ; repeat for the rest of the 22 cells
EI
INC  H
DEC  C
JR   NZ,L1814                        ; do all 14 rows
RET
 
.DoLaunch
CALL testFlight          ; will not return if test fails
CALL L8D2A
CALL L707D
LD   A,&FF
LD   (LE929),A
LD   (LEF9C),A
LD   A,&04
LD   (LF815),A
CALL L2209
.L1850
LD   A,&FF
LD   (LE8F6),A
CALL DrawFrontView
XOR  A
LD   (LE8F6),A
LD   A,(missionStatus)
CP   &16
JR   NZ,L1868
INC  A
LD   (missionStatus),A
RET
 
.L1868
AND  &F0
CP   &30
.L186C
RET  NZ
SBC  HL,HL
.L186F
LD   (LE93E),HL
RET
 
.L1873
XOR  A
LD   (countdown),A
LD   (LE920),A
LD   A,(currentView)
OR   A
CALL Z,DrawFrontView
CALL L6CB2
.L1884
XOR  A
LD   (LE917),A
LD   (condition),A
LD   A,&FF
LD   (flagFlight),A
.L1890
CALL L1896
JP   statusPage
 
.L1896
LD   A,(missionStatus)
.L1899
CP   &10
JP   Z,L9120
CP   &20
JP   Z,L9120
CP   &15
JR   NZ,L18B4
LD   A,(currentSystem)
LD   HL,LEFA2
CP   (HL)
.L18AE
RET  NZ
LD   HL,missionStatus
INC  (HL)
RET
 
.L18B4
CP   &18
JR   NZ,L18BD
DEC  A
LD   (missionStatus),A
RET
 
.L18BD
CP   &19
JP   Z,constrictorDead
.L18C2
CP   &21
JR   NZ,L18D1
LD   A,(currentSystem)
LD   HL,LEFA2
CP   (HL)
RET  NZ
JP   L91DB
 
.L18D1
CP   &31
JP   Z,L909F
.L18D6
CP   &34
JP   Z,L90FB
CP   &50
JP   Z,L9220
CP   &53
JP   Z,L920F
RET
 
.L18E6
LD   HL,LE944
DEC  (HL)
.L18EA
RET  NZ
LD   A,(LF77E)
OR   A
JR   NZ,L18FF
LD   (HL),&10
CALL L190D
LD   A,(energyStore)
CP   &60
CALL Z,L1928
.L18FE
RET
 
.L18FF
DEC  A
LD   A,&08
JR   Z,L1906
.L1904
LD   A,&04
.L1906
LD   (HL),A
CALL L190D
JP   L1928
 
.L190D
LD   HL,LF813
LD   A,(HL)
.L1911
OR   A
JR   Z,L191D
DEC  (HL)
DEC  (HL)
JP   P,L191A
INC  (HL)
.L191A
CALL L6B60
.L191D
LD   HL,energyStore
LD   A,(HL)
CP   &60
RET  Z
.L1924
INC  (HL)
JP   L6A88
 
.L1928
LD   HL,LF80F
LD   A,(HL)
CP   &18
JR   Z,L1934
INC  (HL)
CALL L6B48
.L1934
LD   HL,LF810
.L1937
LD   A,(HL)
CP   &18
RET  Z
INC  (HL)
JP   L6B54
 
.L193F
PUSH AF
LD   A,(LE915)
OR   A
JR   NZ,L194B
LD   A,&04
CALL soundSystem
.L194B
LD   HL,LF80F
LD   A,(LF7D3)
OR   A
JP   P,L1958
LD   HL,LF810
.L1958
POP  BC
LD   A,(HL)
OR   A
JR   Z,L196F
SUB  B
LD   B,&00
JR   NC,L1966
NEG
LD   B,A
XOR  A
.L1966
LD   (HL),A
PUSH BC
CALL L6B48
CALL L6B54
.L196E
POP  BC
.L196F
LD   A,B
OR   A
RET  Z
CALL L19EC
CP   &48
RET  NC
CALL random
CP   &0F
RET  NC
.L197E
CALL random
AND  &0F
CP   &0D
JR   NC,L197E
CP   &0C
JR   NZ,L19A1
LD   HL,cargoSpace
LD   B,&48
.L1990
LD   A,(HL)
OR   A
.L1992
JR   Z,L199D
CALL clearCargo
LD   HL,TcargoLost
JP   flashMessage
 
.L199D
INC  HL
DJNZ L1990
RET
 
.L19A1
ADD  A,&02
.L19A3
LD   E,A
LD   D,&00
LD   HL,hyperFuel
ADD  HL,DE
.L19AA
LD   B,&0C
.L19AC
LD   A,(HL)
OR   A
JP   M,L19DD
JR   Z,L19DD
LD   A,E
.L19B4
CP   &02
JR   Z,L19DD
LD   (HL),&00
LD   A,E
LD   HL,itemsList
CALL scanList
LD   DE,textBuff
.L19C4
LD   A,(HL)
AND  &7F
LD   (DE),A
BIT  7,(HL)
INC  HL
INC  DE
JP   P,L19C4
LD   HL,Tlost
LD   BC,&0005
LDIR
LD   HL,textBuff
JP   flashMessage
 
.L19DD
INC  E
INC  HL
LD   A,E
CP   &0E
JR   NZ,L19E9
LD   E,&02
LD   HL,LF777
.L19E9
DJNZ L19AC
RET
 
.L19EC
LD   A,(energyStore)
SUB  B
JR   NC,L19F3
XOR  A
.L19F3
LD   (energyStore),A
PUSH AF
CALL L6A88
POP  AF
RET

.L19FC 
CALL checkDocked            ; does not return if docked
LD   A,(LF77C)
OR   A
JP   Z,doBeep
LD   A,(spaceType)
OR   A
JP   NZ,doBeep
LD   A,(missionStatus)
CP   &52
JP   Z,doBeep
XOR  A
LD   (countdown),A
LD   (LE920),A
LD   A,&01
LD   (LF7CD),A
LD   HL,L1C4A
LD   DE,LF7CE
LD   BC,&0012
LDIR
LD   A,&07
LD   (LF7EE),A
LD   A,&12
LD   (LF7EF),A
LD   A,&0A
.L1A38
LD   (LF7F0),A
LD   A,&12
LD   (LF7F1),A
LD   A,&06
LD   (LF7F2),A
LD   (LF7F4),A
.L1A48
LD   (LF7E6),A
LD   A,&0F
LD   (LF7F3),A
LD   A,&0E
LD   (LF7E7),A
.L1A55
CALL L3037
JR   NC,L1A77
XOR  A
LD   (LF77C),A
LD   (LF814),A
LD   (naughtynes),A
CALL L1A7D
CALL DrawFrontView
CALL clearCargo
LD   A,&0B
CALL soundSystem
LD   HL,TcapsuleRel
.L1A75
JR   L1A7A
 
.L1A77
LD   HL,Tmalfunction
.L1A7A
JP   flashMessage
 
.L1A7D
LD   A,&FF
LD   (LEF8E),A
XOR  A
LD   (LF815),A
LD   (LF816),A
RET
 
.doStatusInfo
CALL checkDocked            ; does not return if docked
LD   A,(messageNo)
OR   A
JR   NZ,flashScore         ; 0 flash the time move forward for 1-5
LD   A,&30
LD   (LEF96),A
LD   IX,Ttime              ; elapsed time
LD   A,(timeDay)
LD   C,A
LD   HL,&0000
LD   A,&82
CALL numberToText
RES  7,(IX-1)
INC  IX
LD   A,(timeHour)
LD   C,A
LD   HL,&0000
LD   A,&82
CALL numberToText
RES  7,(IX-1)
INC  IX
LD   A,(timeMin)
LD   C,A
LD   HL,&0000
LD   A,&82
CALL numberToText
LD   A,&20
LD   (LEF96),A
LD   HL,Telapsed
JR   doFlashMess
 
.flashScore
DEC  A
JR   NZ,flashCredit        ; 1 flash the time move forward for 2-5
LD   A,(currentScore)
LD   C,A
LD   HL,(currentScore+1)
XOR  A
LD   IX,scoreBuffer
CALL numberToText
LD   HL,Tscore
JR   doFlashMess
 
.flashCredit
DEC  A                     ; 2-5 flash the relevant line from the credits
ADD  A,A
LD   C,A
LD   B,&00
LD   HL,authorCredits
ADD  HL,BC
LD   A,(HL)
INC  HL
LD   H,(HL)
LD   L,A
.doFlashMess
CALL flashMessage
LD   A,&80+30
LD   (screenCount),A
LD   HL,messageNo
INC  (HL)
LD   A,(HL)
SUB  &05                   ; only 3 lines of credits for MTX version
JR   NZ,L1B0C
LD   (HL),A
.L1B0C
RET
 
.doIdentifyShip
LD   A,&FF
LD   (LEF9D),A
RET
 
.flipCloakStatus
LD   A,(cloakEquiped)
OR   A
JP   Z,doBeep               ; can't toggle the cloaking device status if its not fitted, 
CALL checkDocked            ; or if not in flight does not return if docked
LD   A,(cloakFlag)
CPL
LD   (cloakFlag),A
RET
 
.L1B25
CALL checkDocked            ; does not return if docked
LD   A,(jammerEquiped)
OR   A
JP   Z,doBeep
LD   A,(jammerFlag)
CPL
LD   (jammerFlag),A
RET
 
.TenergyLow
DC   "Energy Low"
.TaltitudeLow
DC   "Altitude Low"
.Tcountdown
DS   "Countdown:"
.Ncountdown
DB   &00
.L1B58
DB   &00
.TscoopOn
DC   "Fuel Scoop Activated"
.TcapsuleRel
DC   "Capsule released"
.TgameOver
DC   "Game Over"
.Tsupernova
DC   "Danger: Supernova!"
.Tmalfunction
DC   "Malfunction!!!"
.Telapsed
DS   "Game Time: "
.Ttime
DS   "00:00:00" 
.TcargoLost
DC   "Cargo lost"
.Tlost
DC   " lost"
.Tscore
DS   "Score: "
.scoreBuffer
DB   &00
DB   &00,&00,&00,&00,&00,&00,&00,&00
DB   &00
.Trepaired
DC   "Drive repaired"
.TcloakOn
DC   "Cloaking active"
.TjammerOn
DC   "Jammer active"

.TVersion
If testing
DC "Easy mode on"
ELSE
; DC   "Beta Version 4"
; When ready chnage to
DC   "Version 1.00 2026"
endif

.Tmsx
DC   "MTX Conversion"

.Trob
DC   "of MSX Elite"

; .TmrMicro
; DC   "From 1987"

.authorCredits 
DW   Tversion
DW   Tmsx
DW   Trob
; DW   TmrMicro

.L1C4A
DB   &00,&00,&6A,&FF,&32,&00
DB   &00,&40,&00,&00,&00,&00
DB   &00,&00,&00,&00,&00,&40


.L1C5C
DI
LD   A,&01
OUT  (VDPaddress),A
LD   A,&87
OUT  (VDPaddress),A          ; VDP register 7 - text colours/Border to black
EI
XOR  A
LD   (flagFlight),A
DEC  A
LD   (LE940),A
CALL DrawFrontView
LD   A,&FF
LD   (currentView),A
LD   (flagFlight),A
LD   A,(missionStatus)
CP   &10
JR   Z,L1C93
LD   HL,gameFlagBits 
RES  0,(HL)                 ; turn sounds on
LD   HL,songList
CALL PlaySong
.L1C8B
CALL L1E01
LD   HL,L1F40
JR   L1C96
 
.L1C93
LD   HL,L1F4F
.L1C96
LD   (LE890),HL
.L1C99
LD   A,&71 
CALL colourFill                ; cyan on black main screen
.L1C9E
LD   HL,(LE890)
LD   A,(HL)
OR   A
JR   Z,L1C8B
LD   A,(HL)
LD   (LF7E7),A
INC  HL
LD   (LE890),HL
LD   A,&01
LD   (LE886),A
LD   (LE887),A
LD   (LF7CD),A
.L1CB8
LD   HL,L1F2E
LD   DE,LF7CE
LD   BC,&0012
LDIR
CALL L16E3
XOR  A
LD   (LE88A),A
LD   (LE88C),A
LD   (LE884),A
LD   (LE885),A
LD   (LF7CD),A
.L1CD6
LD   (LF7EE),A
LD   A,&96
LD   (LE88B),A
LD   A,(LF805)
LD   H,A
LD   L,&00
SRL  H
RR   L
SRL  H
.L1CEA
RR   L
LD   A,&2C
CALL L2079
LD   (LE888),HL
.L1CF4
CALL cleanBuffer
LD   A,plotBufferHi
LD   (bufferPos),A
LD   HL,(shipTypeP)
CALL flashMessage
CALL L39F1
LD   A,plotBufferHi+14
LD   (bufferPos),A
LD   HL,TloadComm
LD   A,(missionStatus)
CP   &10
JR   NZ,L1D17
LD   HL,Tmission
.L1D17
CALL flashMessage
CALL L422E
CALL displayBuffer
LD   A,(LE88C)
OR   A
.L1D24
JR   Z,L1D3D
LD   HL,(LEB9E)
LD   DE,&0005
SBC  HL,DE
.L1D2E
JP   C,L1C9E
LD   HL,(LF7D2)
LD   DE,&00C8
.L1D37
ADD  HL,DE
LD   (LF7D2),HL
JR   L1D62
 
.L1D3D
LD   A,(LE88A)
.L1D40
OR   A
JR   NZ,L1D62
LD   HL,(LF7D2)
LD   DE,-120
ADC  HL,DE
LD   (LF7D2),HL
LD   DE,(LE888)
JP   M,L1D5A
OR   A
SBC  HL,DE
.L1D58
JR   NC,L1D62
.L1D5A
LD   (LF7D2),DE
LD   HL,LE88A
DEC  (HL)
.L1D62
LD   HL,LE884
.L1D65
LD   IX,LE886
CALL L1DDC
LD   HL,LE885
LD   IX,LE887
CALL L1DDC
LD   A,(LE884)
SRA  A
CALL L2365
LD   A,(LE885)
SRA  A
CALL L23D9
LD   A,(missionStatus)
.L1D89
CP   &10
JR   Z,L1D97
LD   HL,LE88B
DEC  (HL)
JR   NZ,L1D97
DEC  A
LD   (LE88C),A
.L1D97
CALL L4503
LD   HL,keyASCII
LD   A,(HL)
OR   A
JR   Z,L1DB2
LD   A,(missionStatus)
CP   &10
LD   A,(HL)
LD   (HL),&00
RET  Z
CP   "Y"
.L1DAC
JR   Z,L1DB5
CP   "N"
JR   Z,L1DB5
.L1DB2
JP   L1CF4
 
.L1DB5
PUSH AF
CALL musicOff
CALL storeLoadedData
LD   HL,gameFlagBits
SET  0,(HL)
XOR  A
LD   (spaceType),A
LD   (LE940),A
LD   (LEF8E),A
LD   (condition),A
.L1DCE
POP  AF
CP   "Y"
JP   NZ,statusPage
LD   A,&FF
.L1DD6
LD   (optionsActive),A
JP   showDiscMenu
 
.L1DDC
LD   A,(IX+0)
.L1DDF
OR   A
JP   M,L1DF3
INC  (HL)
CP   (HL)
RET  NZ
CALL random
AND  &0F
ADD  A,&14
NEG
.L1DEF
LD   (IX+0),A
RET
 
.L1DF3
DEC  (HL)
CP   (HL)
RET  NZ
CALL random
AND  &0F
ADD  A,&14
LD   (IX+0),A
.L1E00
RET
 
.L1E01
CALL L28D4
LD   A,&D1
CALL colourFill                ; magenta on black main screen
LD   A,&FF
LD   (LE892),A
LD   A,plotBufferHi+14
LD   (bufferPos),A
LD   HL,L1F0C
LD   B,&05
.L1E18
LD   A,(HL)
INC  HL
LD   (LF7E7),A
LD   E,(HL)
INC  HL
LD   D,(HL)
INC  HL
LD   (LF7CE),DE
PUSH BC
PUSH HL
LD   HL,L1F1E
LD   DE,LF7D0
LD   BC,&0010
LDIR
XOR  A
LD   (LF7EE),A
INC  A
LD   (LF7CD),A
CALL L3037
LD   (LE88E),HL
.L1E40
CALL L1E5A
JR   NC,L1E48
POP  HL
POP  HL
RET
 
.L1E48
POP  HL
POP  BC
DEC  B
JP   NZ,L1E18
.L1E4E
DEC  BC
.L1E4F
LD   A,B
OR   C
JR   NZ,L1E4E
XOR  A
LD   (LE892),A
.L1E57
JP   L1E5A
 
.L1E5A
LD   B,&18
.L1E5C
PUSH BC
CALL cleanBuffer
XOR  A
LD   (LF748),A
LD   HL,LEBA0
.L1E67
LD   A,(HL)
OR   A
JR   Z,L1EB3
PUSH HL
PUSH HL
LD   DE,LF7CD
LD   BC,&0028
LDIR
.L1E75
CALL L16E3
LD   A,(LE892)
OR   A
JR   Z,L1E96
POP  DE
LD   HL,(LE88E)
OR   A
SBC  HL,DE
JR   NZ,L1E94
LD   A,&7F
CALL L2365
.L1E8C
LD   A,(LF7D2)
SUB  &07
LD   (LF7D2),A
.L1E94
JR   L1EA4
 
.L1E96
POP  DE
LD   A,&81
CALL L2365
LD   A,(LF7D2)
ADD  A,&07
LD   (LF7D2),A
.L1EA4
CALL L422E
POP  DE
LD   HL,LF7CD
LD   BC,&0028
LDIR
EX   DE,HL
.L1EB1
JR   L1E67
 
.L1EB3
LD   HL,Tcopyright
CALL flashMessage
CALL displayBuffer
.L1EBC
LD   A,(LF748)
.L1EBF
CP   &07
JR   C,L1EBC
LD   A,(keyASCII)
.L1EC6
OR   A
JR   Z,L1ED0
XOR  A
LD   (keyASCII),A
.L1ECD
POP  HL
SCF
RET
 
.L1ED0
POP  BC
DEC  B
JP   NZ,L1E5C
OR   A
RET
 
.TloadComm
DC   "Load New Commander ?"
.Tcopyright
DC   "`1987 Firebird"
.Tmission
DC   "Hit key for mission"
.L1F0C
DB   &08,&E2,&FF        ; E -30
DB   &09,&F1,&FF        ; L -15
DB   &0A,&00,&00        ; I  0
DB   &0B,&0F,&00        ; T  15
DB   &08,&1E,&00        ; E  30
DB   &0A,&18,&FC        ; I - 1000
.L1F1E 
DB   &00,&00,&C0,&00,&00,&40,&00,&00,&00,&00,&00,&00,&00,&00,&00,&40
.L1F2E
DB   &00,&00,&00,&00,&D0,&07,&00,&C0,&00,&00,&00,&00,&00,&00,&00,&00
DB   &00,&C0
.L1F40
DB   &0E,&1B,&01,&04,&11,&15,&12,&18,&16,&1C,&1A,&1D,&0C,&05,&00 

.L1F4F
DB   &1F,&00 

; multiply D x E
; result in A
.multDxE
XOR  A
LD   B,E
.L1F53
SRL  B
JR   NC,L1F58
ADD  A,D
.L1F58
SLA  D
INC  B
DJNZ L1F53
RET
 

; multiply E x L
; result in HL
.multLxE
LD   A,L
LD   E,A

; multiply A x E
; result in HL
.multAxE
LD   L,A
LD   H,multiplyBits>8
LD   B,(HL)
LD   D,&00
LD   H,D
LD   L,D
.L1F68
RRA
JR   NC,L1F6C
ADD  HL,DE
.L1F6C
SLA  E
RL   D
DJNZ L1F68
RET
 
; multiply A x HL
; result in HL

.multAxHL
EX   DE,HL
LD   L,A
LD   H,multiplyBits>8
LD   B,(HL)
LD   HL,&0000
.L1F7B
RRA
JR   NC,L1F7F
ADD  HL,DE
.L1F7F
SLA  E
RL   D
DJNZ L1F7B
RET
 
; multiply A x HL
; 24 bit result in AHL

.multAxHL24
EX   DE,HL
LD   B,A
XOR  A
LD   H,A
LD   L,A
LD   C,A
.L1F8C
SRL  B
JR   NC,L1F92
ADD  HL,DE
ADC  A,C
.L1F92
SLA  E
RL   D
RL   C
INC  B
DJNZ L1F8C
RET
 
.L1F9C
ADD  HL,HL
RLA                 ; AHL now x2
ADD  HL,HL
RLA                 ; AHL now x4
ADD  HL,HL
RLA                 ; AHL now x8
ADD  HL,HL
RLA                 ; AHL now x16
ADD  HL,HL
RLA                 ; AHL now x32
ADD  HL,HL
RLA                 ; AHL now x64
PUSH HL
POP  IX
LD   L,A            ; LIX has the AHLx64 value
XOR  A
LD   H,A
LD   C,A
LD   DE,&0040
LD   B,&09
.L1FB4
SBC  HL,DE
SBC  A,C
JR   NC,L1FBB
ADD  HL,DE
ADC  A,C
.L1FBB
CCF
RL   D
RL   C
ADD  IX,IX
ADC  HL,HL
ADC  A,A
ADD  IX,IX
ADC  HL,HL
ADC  A,A
DJNZ L1FB4
LD   H,C
LD   L,D
RET
 
.findLog
BIT  7,H
EX   AF,AF'          ; save the sign bit
LD   A,H
RRA
RR   L
RRA
RR   L
RRA
RR   L
RRA
RR   L
RRA
RR   L
AND  &03
RES  0,L 
ADD  A,log2Table>8
LD   H,A  
LD   A,(HL)
INC  L
LD   H,(HL)
LD   L,A            ; HL =64 x log2(HL)
EX   AF,AF' 
RET  Z              ; all done if was zero
SET  6,H
RET
 
.findAntiLog8
LD   A,H
RRA
RR   L
RRA
RR   L     
RRA
RR   L    
RRA
RR   L      
AND  &03     
ADD  A,antiLog2Table>8 
LD   H,A
SET  0,L  
LD   L,(HL)         ; get just the high byte of the antiLog ?
LD   H,&00
RET
 

; signed multiply HL x DE
; result in HL
; format appears to be Sxxxxxxxx.xxxxxxx
.Multiply
LD   A,H
XOR  D                ; form the sign of the result
EX   AF,AF'           ; and save it
PUSH HL
RES  7,D
XOR  A
LD   IY,&0000
LD   H,A
LD   L,A
LD   B,A
LD   C,A
EXX                   ; HL'IY and BC' are zero
POP  BC               ; BC has the original HL
LD   H,multiplyBits>8
LD   A,B              ; original H
AND  &7F              ; get rid of the sign
JR   Z,L2028          ; only need to do a max 8 bit multiply if H has zero magnitude
LD   L,A              ; lookup how many bits in the high byte
LD   A,(HL)         
ADD  A,&08            ; add 8 for the low byte
JR   L202A            ; bit count will be 9 to 15 
 
.L2028
LD   L,C              ; HL is  0200+original L
LD   A,(HL)           ; lookup bit count for just the low byte
.L202A
LD   L,A              ; swap B and A
LD   A,B              ; so that A holds high byte, low byte still in C from the pop BC
LD   B,L              ; and B hold the bit count
.L202D
RRA                   ; 16 bit rotate of AC (which starts off as the incoming HL)
RR   C
EXX
JR   NC,L2037         ; leave if zero shifted out
ADD  IY,DE            ; 32 bit addition HLIY to BCDE
ADC  HL,BC
.L2037
SLA  E                ; double BCDE ready for next rotation
RL   D
RL   C
RL   B
EXX                   ; save the result back in the alternate registers
DJNZ L202D            ; repeat for the number of "active" bits in original HL
EXX
DW LD_A_IYH           ; "illegal" opcode IYH to A
RLA                   ; final rotates to ditch excess fraction bits?
ADC  HL,HL
RLA
ADC  HL,HL            ; HL is now the result of the miltiplication
EX   AF,AF'           ; get the sign back
RET  P                ; it's positive, we're done
XOR  A
SUB  L                ; HL goes to -HL
LD   L,A
SBC  A,A
SUB  H
LD   H,A
RET                   ; return the negative result
 
.L2054
CALL L205D
CALL L1F9C
ADD  HL,HL
ADD  HL,HL
RET
 
.L205D
LD   A,E
SUB  C
JR   NC,L2063
NEG
.L2063
LD   L,A
LD   A,D
SUB  B
JR   NC,L206A
NEG
.L206A
EX   AF,AF'
CALL multLxE
PUSH HL
EX   AF,AF'
LD   L,A
CALL multLxE
POP  DE
XOR  A
ADD  HL,DE
ADC  A,A
RET
 
.L2079
LD   E,A
LD   D,&00
LD   C,L
LD   A,H
LD   H,D
LD   L,D
LD   B,&10
.L2082
CCF
RL   C
RLA
ADC  HL,HL
.L2088
SBC  HL,DE
JR   NC,L208D
ADD  HL,DE
.L208D
DJNZ L2082
CCF
RL   C
RLA
LD   L,C
LD   H,A
RET
 

BIT  7,H
PUSH AF
JR   Z,L20A2
XOR  A
SUB  L
LD   C,A
SBC  A,A
SUB  H
JR   L20A4
 
.L20A2
LD   C,L
LD   A,H
.L20A4
LD   HL,&0000
LD   B,&10
.L20A9
RL   C
RLA
ADC  HL,HL
SBC  HL,DE
JR   NC,L20B3
ADD  HL,DE
.L20B3
DJNZ L20A9
RL   C
RLA
CPL
LD   H,A
LD   A,C
CPL
LD   L,A
POP  AF
RET  Z
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
RET
 
.L20C6
XOR  A
LD   B,&18
.L20C9
CCF
RL   C
RL   L
RL   H
RLA
SUB  &0A
JR   NC,L20D7
ADD  A,&0A
.L20D7
DJNZ L20C9
CCF
RL   C
RL   L
RL   H
RET
 
.L20E1
EXX
LD   C,&00
LD   H,C
LD   L,C
EXX
LD   B,&20
.L20E9
CCF
RL   E
RL   D
RL   L
RL   H
EXX
RL   C
RL   L
RL   H
PUSH BC
PUSH HL
LD   A,C
SUB  &A0
LD   C,A
LD   A,L
SBC  A,&86
LD   L,A
LD   A,H
SBC  A,&01
LD   H,A
JR   NC,L210D
POP  HL
POP  BC
JR   L210F
 
.L210D
POP  DE
POP  DE
.L210F
EXX
DJNZ L20E9
CCF
RL   E
RL   D
RL   L
RL   H
RET
 
.L211C
EXX
LD   HL,&0000
LD   BC,1000
EXX
LD   B,&20
.L2126
CCF
RL   E
RL   D
RL   L
RL   H
EXX
RL   L
RL   H
OR   A
SBC  HL,BC
JR   NC,L213A
ADD  HL,BC
.L213A
EXX
DJNZ L2126
CCF
RL   E
RL   D
RL   L
RL   H
RET
 
.spinInfo
LD   HL,(systemInfo)
LD   DE,(systemInfo+2)
LD   BC,(systemInfo+4)
ADD  HL,DE
ADD  HL,BC
LD   (systemInfo),DE
LD   (systemInfo+2),BC
LD   (systemInfo+4),HL
RET
 
.L2160
LD   A,H
XOR  B
ADD  A,A
EX   AF,AF'
ADD  HL,BC
JR   C,L2172
CALL findAntiLog8
.L216A
EX   AF,AF'
RET  P
XOR  A
SUB  L
LD   L,A
SBC  A,A
LD   H,A
RET
 
.L2172
LD   HL,&0000
RET
 
.random
LD   A,(seed+2)
LD   L,A
LD   A,(seed+1)
LD   (seed+2),A
CP   &80
RL   L
RRA
LD   A,(seed)
LD   (seed+1),A
RRA
XOR  L
LD   (seed),A
RET
 
.L2191
XOR  A
SLA  L
ADC  A,Log2Table>8
LD   H,A 
LD   A,(HL)
INC  L
LD   H,(HL)
LD   L,A
ADD  HL,HL          ; lookup value doubled so HL is squared?
JP   NC,findAntiLog       ; anti log lookup if top bit was not set
LD   HL,&0000       ; 
RET
 
.findAntiLog
LD   A,H 
BIT  6,A            ; check the sign bit or just range ?
JR   NZ,L21C0 
RRA
RR   L 
RRA
RR   L 
RRA
RR   L 
RRA
RR   L  
AND  &03   
ADD  A,antiLog2Table>8 
LD   H,A   
RES  0,L 
LD   A,(HL)
INC  L
LD   H,(HL)         ; lookup the antilog
LD   L,A
RET
 
.L21C0
LD   HL,&FFFF       ; out of range value ?? 
RET
 
.longAdd
OR   A
LD   B,&04
.L21C7
LD   A,(DE)
ADC  A,(HL)
LD   (DE),A
INC  HL
INC  DE
DJNZ L21C7
RET
 
.longSub
OR   A
LD   B,&04
.L21D2
LD   A,(DE)
SBC  A,(HL)
LD   (DE),A
INC  HL
INC  DE
DJNZ L21D2
RET
 
.L21DA
OR   A
PUSH AF
JP   P,L21E1
NEG
.L21E1
CP   &7F
JR   NZ,L21EA
LD   HL,L2522
JR   L21F6
 
.L21EA
LD   L,A
LD   H,&00              ; Zero extend A into HL
ADD  HL,HL              ; x2
LD   B,H
LD   C,L
ADD  HL,HL              ; x4
ADD  HL,BC              ; x6
LD   BC,L121B
ADD  HL,BC
.L21F6
LDI
LDI
LDI
LDI
LDI
LDI
POP  AF
RET  P
DEC  DE
EX   DE,HL
SET  7,(HL)
RET
 
.L2209
LD   A,(LF815)
LD   DE,LEB76
JP   L21DA
 
.L2212
LD   A,(LF816)
LD   DE,LEB7C
JP   L21DA
 
.L221B
LD   IX,LEB7C
LD   BC,(LF7D0)
LD   DE,(LF7D2)
CALL L2450
LD   (LF7D0),HL
LD   (LF7D2),DE
LD   HL,LF7CD
BIT  3,(HL)
RET  NZ
RES  7,(HL)
LD   HL,LF7E8
INC  (HL)
LD   HL,(LF7D6)
CALL L24D1
PUSH HL
LD   HL,(LF7D8)
CALL L24A7
POP  DE
EX   DE,HL
OR   A
SBC  HL,DE
JP   P,L225A
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L225A
PUSH HL
LD   HL,(LF7D6)
CALL L24A7
PUSH HL
LD   HL,(LF7D8)
CALL L24D1
POP  DE
OR   A
ADC  HL,DE
JP   P,L2277
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L2277
LD   (LF7D8),HL
POP  HL
LD   (LF7D6),HL
LD   HL,(LF7DC)
CALL L24D1
PUSH HL
LD   HL,(LF7DE)
CALL L24A7
POP  DE
EX   DE,HL
OR   A
SBC  HL,DE
JP   P,L229B
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L229B
PUSH HL
LD   HL,(LF7DC)
CALL L24A7
PUSH HL
LD   HL,(LF7DE)
CALL L24D1
POP  DE
OR   A
ADC  HL,DE
JP   P,L22B8
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L22B8
LD   (LF7DE),HL
POP  HL
LD   (LF7DC),HL
RET
 
.L22C0
LD   IX,LEB76
LD   BC,(LF7CE)
LD   DE,(LF7D0)
CALL L2450
LD   (LF7CE),HL
LD   (LF7D0),DE
LD   HL,LF7CD
BIT  3,(HL)
RET  NZ
RES  7,(HL)
LD   HL,LF7E8
INC  (HL)
LD   HL,(LF7D4)
.L22E5
CALL L24D1
PUSH HL
LD   HL,(LF7D6)
CALL L24A7
POP  DE
EX   DE,HL
OR   A
SBC  HL,DE
JP   P,L22FF
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L22FF
PUSH HL
LD   HL,(LF7D4)
CALL L24A7
PUSH HL
LD   HL,(LF7D6)
CALL L24D1
POP  DE
OR   A
ADC  HL,DE
JP   P,L231C
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L231C
LD   (LF7D6),HL
POP  HL
LD   (LF7D4),HL
LD   HL,(LF7DA)
CALL L24D1
PUSH HL
LD   HL,(LF7DC)
CALL L24A7
POP  DE
EX   DE,HL
OR   A
SBC  HL,DE
JP   P,L2340
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L2340
PUSH HL
LD   HL,(LF7DA)
CALL L24A7
PUSH HL
LD   HL,(LF7DC)
CALL L24D1
POP  DE
OR   A
ADC  HL,DE
JP   P,L235D
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L235D
LD   (LF7DC),HL
POP  HL
LD   (LF7DA),HL
RET
 
.L2365
LD   DE,LE7FC
CALL L21DA
LD   IX,LE7FC
CALL L4599
LD   HL,LF7CD
RES  7,(HL)
LD   HL,(LF7E0)
CALL L24A7
PUSH HL
LD   HL,(LF7DA)
CALL L24D1
POP  DE
OR   A
ADC  HL,DE
JP   P,L2393
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L2393
LD   (LF7DA),HL
LD   HL,(LF7E2)
CALL L24A7
PUSH HL
LD   HL,(LF7DC)
CALL L24D1
POP  DE
OR   A
ADC  HL,DE
JP   P,L23B2
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L23B2
LD   (LF7DC),HL
LD   HL,(LF7E4)
CALL L24A7
PUSH HL
LD   HL,(LF7DE)
CALL L24D1
POP  DE
OR   A
ADC  HL,DE
JP   P,L23D1
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L23D1
LD   (LF7DE),HL
LD   HL,LF7E8
INC  (HL)
RET
 
.L23D9
LD   DE,LE7FC
CALL L21DA
LD   IX,LE7FC
CALL L4599
LD   HL,LF7CD
RES  7,(HL)
LD   HL,(LF7D4)
CALL L24D1
PUSH HL
LD   HL,(LF7E0)
CALL L24A7
POP  DE
EX   DE,HL
OR   A
SBC  HL,DE
JP   P,L2408
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L2408
LD   (LF7D4),HL
LD   HL,(LF7D6)
CALL L24D1
PUSH HL
LD   HL,(LF7E2)
CALL L24A7
POP  DE
EX   DE,HL
OR   A
SBC  HL,DE
JP   P,L2428
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L2428
LD   (LF7D6),HL
LD   HL,(LF7D8)
CALL L24D1
PUSH HL
LD   HL,(LF7E4)
CALL L24A7
POP  DE
EX   DE,HL
OR   A
SBC  HL,DE
JP   P,L2448
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L2448
LD   (LF7D8),HL
LD   HL,LF7E8
INC  (HL)
RET
 
.L2450
BIT  7,B
JR   Z,L245C
XOR  A
SUB  C
LD   C,A
SBC  A,A
SUB  B
OR   &80
LD   B,A
.L245C
BIT  7,D
JR   Z,L2468
XOR  A
SUB  E
LD   E,A
SBC  A,A
SUB  D
OR   &80
LD   D,A
.L2468
PUSH DE
PUSH BC
PUSH DE
LD   H,B
LD   L,C
CALL L24D1
.L2470
EX   (SP),HL 
CALL L24A7
POP  DE
EX   DE,HL
OR   A
SBC  HL,DE
JP   PO,L2486
JR   C,L2483
LD   HL,&8000
JR   L2486
 
.L2483
LD   HL,&7FFF
.L2486
LD   (LE802),HL
POP  HL
CALL L24A7
EX   (SP),HL 
CALL L24D1
POP  DE
OR   A
ADC  HL,DE
JP   PO,L24A2
JR   C,L249F
LD   HL,&7FFF
JR   L24A2
 
.L249F
LD   HL,&7F92
.L24A2
EX   DE,HL
LD   HL,(LE802)
RET
 
.L24A7
LD   A,(IX+5)
XOR  H
EX   AF,AF'
RES  7,H
LD   (LE804),HL
LD   A,(IX+3)
CALL multAxHL24
PUSH AF
PUSH HL
LD   HL,(LE804)
LD   A,(IX+4)
CALL multAxHL24
PUSH AF
PUSH HL
LD   HL,(LE804)
LD   A,(IX+5)
AND  &7F
CALL multAxHL24
JR   L24F5
 
.L24D1
LD   A,H
OR   A
EX   AF,AF'
RES  7,H
LD   (LE804),HL
LD   A,(IX+0)
CALL multAxHL24
PUSH AF
PUSH HL
LD   HL,(LE804)
LD   A,(IX+1)
CALL multAxHL24
PUSH AF
PUSH HL
LD   HL,(LE804)
LD   A,(IX+2)
CALL multAxHL24
.L24F5
LD   IY,&0000
POP  BC
POP  DE
LD   E,B
LD   B,C
LD   C,&00
ADD  IY,BC
ADC  HL,DE
ADC  A,C
POP  BC
POP  DE
LD   E,D
LD   D,&00
ADD  IY,BC
ADC  HL,DE
ADC  A,D
ADD  HL,HL
RLA
ADD  HL,HL
RLA
RL   L
LD   L,H
LD   H,A
JR   NC,L2519
INC  HL
.L2519
EX   AF,AF'
RET  P
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
RET
 
.L2522
DB   &F5,&6C,&37,&00,&00,&20

.L2528
LD   A,(LF7CD)
AND  &20
JR   Z,L252F
LD   (LE943),A
.L252F
LD   A,(LF7EE)
ADD  A,A
LD   L,A
LD   H,&00
LD   BC,L288D
ADD  HL,BC
.L253D
LD   A,(HL)
INC  HL
LD   H,(HL)
LD   L,A
JP   (HL)
.L2542
LD   A,(LF7ED)
LD   HL,LE92E
CP   (HL)
RET  Z
POP  HL
.L254B 
RET

.L254C 
LD   A,(LEF98)
OR   A
RET  Z
LD   A,&04
JP   L23D9
 
.L2556
LD   HL,LF7EF
DEC  (HL)
JR   Z,L2578
LD   A,(HL)
RRA
RRA
RRA
AND  &1F
LD   C,A
.L2563
LD   A,(LF749)
OR   A
LD   A,(LF7F0)
JR   NZ,L2573
ADD  A,C
JR   NC,L2571
LD   A,&FF
.L2571
JR   L2574
 
.L2573
SUB  C
.L2574
LD   (LF7F0),A
RET
 
.L2578
CALL L30A9
LD   A,(LF7CD)
AND  &40
RET  NZ
LD   HL,(LF80B)
LD   A,H
OR   L
JR   Z,L25B3
LD   C,L
LD   L,H
LD   H,&00
LD   A,&C5
LD   IX,TbountyAmount
CALL numberToText
RES  7,(IX-1)
LD   HL,Tbounty
CALL flashMessage
LD   HL,(credits)
LD   A,(credits+2)
LD   DE,(LF80B)
ADD  HL,DE
ADC  A,&00
LD   (credits),HL
LD   (credits+2),A
RET
 
.L25B3
LD   HL,TnoBounty
JP   flashMessage
 
.L25B9
LD   A,(LF7EF)
CALL L2FF9
CALL L2EB2
LD   C,&0A
CALL L2869
LD   A,(IX+26)
CALL L2FE9
LD   A,(IY+19)
OR   A
JP   P,L25FF
LD   A,(IX+26)
CP   &01
JR   Z,L25E1
LD   A,(jammerFlag)
OR   A
JR   NZ,L25FF
.L25E1
LD   A,(LEB6F)
OR   A
JR   Z,L25ED
CALL random
CP   &19
RET  NC
.L25ED
LD   A,(LE912)
OR   A
RET  NZ
LD   A,&08
CALL soundSystem
LD   A,&FF
LD   (LEEC0),A
JP   L6B12
 
.L25FF
LD   E,(IY+16)
LD   D,&00
LD   HL,(LEB6E)
SBC  HL,DE
RET  NC
CALL L30A9
.L260D
CALL L31AD
CALL L8DB9
LD   A,&02
JP   soundSystem
 
.L2618
LD   HL,LEB88
LD   (HL),&00
LD   DE,LEB89
LD   BC,&0005
LDIR
CALL L2EB2
LD   C,&0A
CALL L2869
LD   HL,(LEB8E)
LD   DE,-100
ADD  HL,DE
RET  C
LD   IX,LF7CD
CALL L31AD
LD   A,&30
JP   L193F
 
.L2641
CALL L2869
CALL L2744
JR   C,L2656
CALL L2542
LD   A,&01
CALL L3113
LD   DE,-900
ADD  HL,DE
RET  NC
.L2656
LD   A,&08
LD   (LF7F3),A
JP   L281E
 
.L265E
CALL L2869
CALL L2744
JR   C,L2673
CALL L2542
LD   A,&01
CALL L3113
LD   DE,-900
ADD  HL,DE
RET  NC
.L2673
LD   HL,360
LD   A,(LF7E7)
SUB  &0E
RRA
JR   NC,L2681
LD   HL,540
.L2681
PUSH AF
LD   A,(LF806)
CALL L2079
.L2688
LD   A,L
LD   (LF7EF),A
POP  AF
RRA
LD   A,(LF806)
JR   NC,L2695
NEG
.L2695
SRA  A
LD   (LF7F0),A
XOR  A
LD   (LF7F1),A
LD   A,&07
LD   (LF7EE),A
LD   A,&0C
LD   (LF7F3),A
RET
 
.L26A9
LD   HL,LF7CD
SET  5,(HL)
LD   A,(LEB05)
OR   A
JR   Z,L26C2
LD   A,(LF807)
AND  &1C
CP   &04
JR   NZ,L26C2
LD   A,&0C
LD   (LF7EE),A
.L26C2
LD   HL,(LEB8E)
LD   DE,-1500
ADD  HL,DE
JR   C,L2716
LD   A,(LF7F4)
OR   A
JR   Z,L2716
LD   A,(cloakFlag)
OR   A
JR   NZ,L2716
CALL random
LD   HL,LF80A
CP   (HL)
JR   NC,L2716
LD   A,(LEF8E)
.L26E3
OR   A
JR   NZ,L2716
LD   A,&FF
LD   (LE92D),A
LD   A,&03
CALL soundSystem
CALL random
CP   &B4
JR   NC,L2716
LD   A,(LF7E7)
CP   &1F
LD   A,&06
JR   Z,L2713
LD   HL,(rating)
LD   H,&00
LD   BC,L28CB
ADD  HL,BC
LD   C,(HL)
.L270A
CALL random
AND  &07
CP   C
.L2710
JR   NC,L270A
INC  A
.L2713
CALL L193F
.L2716
CALL L2744
JR   NC,L2723
LD   A,&08
LD   (LF7F3),A
JP   L281E
 
.L2723
LD   A,(LF7E7)
CP   &1F
JR   Z,L272F
CP   &1E
CALL NZ,L2542
.L272F
LD   HL,LEB88
LD   (HL),&00
LD   DE,LEB89
LD   BC,&0005
LDIR
CALL L2EB2
LD   C,&0A
JP   L2869
 
.L2744
LD   HL,(LF806)
LD   H,&00
ADD  HL,HL
ADD  HL,HL
EX   DE,HL
LD   HL,&01E0
SBC  HL,DE
EX   DE,HL
LD   HL,(LEB8E)
SBC  HL,DE
RET
 
.L2758
CALL L2869
LD   C,&00
LD   A,(LF7EF)
OR   A
JR   Z,L2770
LD   HL,LF7EF
DEC  (HL)
PUSH BC
LD   A,(LF7F0)
CALL L2365
POP  BC
INC  C
.L2770
LD   A,(LF7F1)
OR   A
JR   Z,L2783
LD   HL,LF7F1
DEC  (HL)
PUSH BC
LD   A,(LF7F2)
CALL L23D9
POP  BC
INC  C
.L2783
LD   A,C
OR   A
RET  NZ
INC  A
LD   (LF7F4),A
LD   A,(LF7F3)
LD   (LF7EE),A
CP   &0C
RET  Z
CP   &0B
RET  Z
CP   &08
JP   Z,L2859
LD   A,&23
LD   (LF7EF),A
RET
 
.L27A1
CALL L2869
LD   HL,LF7EF
DEC  (HL)
RET  NZ
LD   A,&06
LD   (LF7EE),A
XOR  A
LD   (LF7F4),A
RET

.L27B3 
CALL L27F4
LD   A,(LEF98)
OR   A
RET  Z
LD   A,&0A
.L27BD
JP   L23D9

.L27C0 
CALL L2744
JR   NC,L27CD
LD   A,&0C
LD   (LF7F3),A
JP   L281E
 
.L27CD
CALL L2542
CALL L2869
XOR  A
CALL L3113
LD   DE,-3500
ADD  HL,DE
RET  C
JP   L30A9
 
.L27DF
CALL random
AND  &07
ADD  A,&0A
LD   (LF7EF),A
LD   A,&08
LD   (LF7EE),A
LD   A,&01
LD   (LF7F4),A
RET
 
.L27F4
LD   HL,LF7CD
RES  5,(HL)
CALL L2542
LD   A,&01
LD   (LF7F4),A
CALL L2869
LD   A,(LEB8F)
AND  &F0
RET  Z
CALL L30EA
JP   L30A9

.L2810 
LD   HL,LF7EF
DEC  (HL)
RET  NZ
XOR  A
LD   (LEF8E),A
DEC  A
LD   (LE917),A
RET
 
.L281E
LD   DE,LF7EF
LD   B,&02
.L2823
PUSH BC
PUSH DE
CALL random
LD   L,A
LD   H,&00
LD   DE,&002D
ADD  HL,DE
ADD  HL,HL
ADD  HL,HL
LD   A,(LF806)
CALL L2079
LD   A,L
POP  DE
LD   (DE),A
INC  DE
CALL random
OR   A
LD   A,(LF806)
JP   P,L2847
NEG
.L2847
SRA  A
LD   (DE),A
INC  DE
POP  BC
DJNZ L2823
LD   A,&07
LD   (LF7EE),A
LD   A,&01
LD   (LF7F4),A
RET
 
.L2859
CALL random
AND  &1F
ADD  A,&32
LD   (LF7EF),A
LD   A,&01
LD   (LF7F4),A
RET
 
.L2869
LD   A,(LF7F4)
OR   A
JR   Z,L287F
LD   A,(LF7E6)
ADD  A,&04
LD   HL,LF802
CP   (HL)
JR   Z,L287D
JR   C,L287D
LD   A,(HL)
.L287D
JR   L2889
 
.L287F
LD   A,(LF7E6)
SUB  &04
CP   C
JP   P,L2889
.L2888
LD   A,C
.L2889
LD   (LF7E6),A
RET
 
.L288D
DW   L254B
DW   L2556
DW   L254C
DW   L25B9
DW   L265E
DW   L2641
DW   L26A9
DW   L2758
DW   L27A1
DW   L27B3
DW   L27C0
DW   L27DF
DW   L27F4
DW   L254B
DW   L2618
DW   L2810

.Tbounty
DS   "Bounty:"
.TbountyAmount
DB   &00,&00,&00,&00
DB   &00
DC   " credits"
.TnoBounty
DC   "No bounty!"
.L28CB
DB   &02,&02,&02,&03,&03,&03,&04,&04,&04

.L28D4
LD   HL,LEBA0
LD   (HL),&00
LD   DE,LEBA0+1
LD   BC,&320-1
LDIR
LD   HL,LE844
LD   (HL),&00
LD   DE,LE844+1
LD   BC,&20-1
LDIR
XOR  A
LD   (LE939),A
LD   (LE93A),A
RET
 
.L28F6
LD   A,(LF81B)
OR   A
RET  P
LD   A,(LEF99)
OR   A
RET  Z
LD   A,(LE873)
OR   A
RET  NZ
LD   A,(LF7EE)
CP   &06
JR   Z,L292F
CP   &07
JR   Z,L292F
LD   A,(LF807)
AND  &03
JR   Z,L292F
DEC  A
JR   NZ,L291E
LD   A,&0C
JR   L2929
 
.L291E
LD   A,(LF7EE)
CP   &08
LD   A,&0B
JR   Z,L2929
LD   A,&06
.L2929
LD   (LF7F3),A
CALL L281E
.L292F
LD   A,(LF81A)
LD   C,A
LD   A,(LF7E7)
CP   &01
JR   NZ,L2959
LD   A,(naughtynes)
ADD  A,&0A
JR   NC,L2942
SBC  A,A
.L2942
LD   (naughtynes),A
LD   (LEF97),A
LD   A,(missionStatus)
CP   &52
JR   NZ,L2956
LD   A,C
SRL  A
SRL  A
JR   L2957
 
.L2956
XOR  A
.L2957
JR   L2977
 
.L2959
CP   &1F
JR   Z,L2961
CP   &1E
JR   NZ,L2968
.L2961
LD   A,C
SRL  A
SRL  A
JR   L2977
 
.L2968
CP   &03
JR   NZ,L2976
LD   A,(LF7EC)
OR   A
JP   P,L2976
XOR  A
JR   L2977
 
.L2976
LD   A,C
.L2977
LD   C,A
LD   A,(LF7E9)
SUB  C
LD   (LF7E9),A
.L297F
JR   NC,L29AE
LD   A,(LF7E7)
CP   &1F
JR   NZ,L298E
LD   HL,missionStatus
INC  (HL)
JR   L299A
 
.L298E
CP   &01
JR   NZ,L299A
LD   HL,LEFA9
DEC  (HL)
LD   HL,missionStatus
INC  (HL)
.L299A
LD   IX,LF7CD
CALL L31AD
LD   A,&02
CALL soundSystem
CALL L8DB9
CALL L30EA
JR   L29E0
 
.L29AE
SUB  C
JR   NC,L29C4
CALL random
CP   &0A
JR   NC,L29C4
LD   A,(LF807)
RRA
RRA
AND  &07
CP   &03
CALL C,L2A71
.L29C4
LD   A,(LF7EA)
OR   A
JR   Z,L29E0
CALL random
CP   &14
JR   NC,L29E0
LD   A,(LF7E7)
CP   &13
JR   NZ,L29DD
CALL L2A94
JR   L29E0
 
.L29DD
CALL L2A3A
.L29E0
LD   A,(LE850)
CP   &02
JR   NC,L2A13
LD   A,(LE934)
OR   A
JR   NZ,L2A13
LD   A,(LEB05)
OR   A
JR   Z,L2A13
LD   A,(LF7E7)
CP   &01
JR   Z,L2A10
LD   A,(LF807)
AND  &1C
JR   Z,L2A10
CP   &08
JR   Z,L2A10
CP   &1C
JR   NZ,L2A13
LD   A,(missionStatus)
CP   &52
JR   NZ,L2A13
.L2A10
CALL L2A1C
.L2A13
LD   HL,LE873
DEC  (HL)
LD   A,&09
JP   soundSystem
 
.L2A1C
LD   A,(rating)
INC  A
ADD  A,A
LD   C,A
.L2A22
CALL random
AND  &1F
CP   C
JR   NC,L2A22
INC  A
CP   &07
JR   C,L2A31
LD   A,&06
.L2A31
LD   (LE934),A
LD   A,&28
LD   (LE870),A
RET
 
.L2A3A
LD   A,(LEB8F)
CP   &02
RET  C
LD   A,(cloakFlag)
OR   A
RET  NZ
CALL L3341
LD   A,&41
LD   (LF7CD),A
LD   (LF7E6),A
LD   A,&0E
LD   (LF7EE),A
LD   A,&02
LD   (LF7E7),A
CALL L3037
JR   NC,L2A6E
LD   HL,Tincomming
CALL flashMessage
LD   HL,L009D 
DEC  (HL)
LD   A,&0B
CALL soundSystem
.L2A6E
JP   L334D
 
.L2A71
CALL L3341
LD   A,&01
LD   (LF7CD),A
LD   (LF7E6),A
LD   A,&05
LD   (LF7E7),A
LD   A,&03
LD   (LF7EC),A
CALL L8E45
LD   A,&0C
LD   (LF7EE),A
CALL L3037
JP   L334D
 
.L2A94
XOR  A
LD   (LF7EA),A
CALL L3341
LD   A,(LE911)
LD   (LF7EB),A
CALL random
AND  &03
ADD  A,&04
LD   B,A
LD   A,&01
LD   (LF7CD),A
LD   (LF7E6),A
LD   A,&08
LD   (LF7EE),A
LD   A,&06
LD   (LF7E7),A
LD   A,&10
LD   (LF7EC),A
.L2AC0
PUSH BC
CALL L8E45
CALL L2859
CALL L3037
POP  BC
DJNZ L2AC0
JP   L334D
 
.L2AD0
LD   A,(LF818)
OR   A
RET  M
LD   A,(LF813)
CP   &30
RET  Z
LD   HL,LF81B
LD   A,(HL)
OR   A
RET  NZ
LD   (LE873),A
LD   (HL),&80
LD   A,R
AND  &07
ADD  A,&55
LD   (LE867),A
LD   A,R
AND  &07
ADD  A,&3D
LD   (LE868),A
LD   HL,LF813
INC  (HL)
INC  (HL)
LD   A,&03
CALL soundSystem
JP   L6B60
 
.L2B05
LD   A,(spaceType)
OR   A
JR   Z,L2B24
LD   A,(LE857)
LD   HL,LEEC5
CP   (HL)
RET  Z
LD   A,&13
LD   (LF7E7),A
LD   A,&06
LD   (LF7EE),A
XOR  A
LD   (LF7F4),A
JP   L2D3B
 
.L2B24
CALL L315C
LD   A,(LEB05)
OR   A
JR   Z,L2B66
LD   A,(LE72A)
CP   &03
JR   C,L2B66
LD   A,(LE860)
OR   A
JR   NZ,L2B66
LD   A,(LE861)
OR   A
JR   NZ,L2B66
LD   A,(missionStatus)
CP   &52
JR   Z,L2B66
LD   HL,LEF8F
DEC  (HL)
JR   NZ,L2B66
LD   A,&01
LD   (LF7CD),A
LD   (LF7F4),A
LD   A,R
AND  &01
ADD  A,&1C
LD   (LF7E7),A
LD   A,&0A
LD   (LF7EE),A
CALL L3187
.L2B66
LD   A,(LEB05)
OR   A
JR   NZ,L2BAF
LD   A,(LE848)
OR   A
JR   NZ,L2BAF
LD   HL,LEF90
DEC  (HL)
JR   NZ,L2BAF
LD   A,&01
LD   (LF7CD),A
CALL random
AND  &07
LD   H,A
CALL random
LD   L,A
LD   DE,&1000
ADD  HL,DE
SCF
CALL L8F25
CALL L8D8E
LD   A,&04
LD   (LF7E7),A
LD   A,&0C
LD   (LF7EE),A
CALL L3037
CALL random
CP   &1A
JR   NC,L2BAB
AND  &03
INC  A
JR   L2BAC
 
.L2BAB
XOR  A
.L2BAC
LD   (IY+20),A
.L2BAF
LD   A,(LE93A)
OR   A
JR   NZ,L2BE9
LD   HL,LEF91
DEC  (HL)
JR   NZ,L2BE9
LD   A,&01
LD   (LF7CD),A
CALL random
AND  &03
ADD  A,&0E
LD   (LF7E7),A
LD   A,(LEB05)
OR   A
JR   NZ,L2BDA
LD   A,&0C
LD   (LF7EE),A
CALL L2D3B
JR   L2BE9
 
.L2BDA
LD   A,(LE72A)
CP   &03
JR   C,L2BE9
LD   A,&04
LD   (LF7EE),A
CALL L3187
.L2BE9
LD   A,(missionStatus)
CP   &17
JR   Z,L2BF4
CP   &40
JR   NZ,L2BFD
.L2BF4
CALL L2C3C
LD   HL,missionStatus
INC  (HL)
JR   L2C20
 
.L2BFD
LD   A,(LEB05)
OR   A
JR   NZ,L2C20
LD   A,(LE939)
CP   &02
.L2C08
JR   NC,L2C20
LD   HL,(LEF9A)
DEC  HL
LD   (LEF9A),HL
LD   A,H
OR   L
JR   NZ,L2C20
LD   A,(LF762)
ADD  A,&02
LD   (LEF9B),A
CALL L2C3C
.L2C20
RET
 
.L2C21
LD   A,(naughtynes)
OR   A
RET  Z
RRA
RRA
AND  &3F
LD   C,A
LD   A,(LF762)
ADD  A,A
ADD  A,A
ADD  A,A
ADD  A,A
ADD  A,C
LD   C,A
CALL random
CP   C
RET  NC
JP   L2A1C
 
.L2C3C
LD   HL,TredAlert
CALL flashMessage
LD   A,(missionStatus)
CP   &17
JR   NZ,L2C4D
LD   A,&1F
JR   L2C64
 
.L2C4D
CP   &21
JR   Z,L2C55
CP   &52
JR   NZ,L2C59
.L2C55
LD   A,&13
JR   L2C64
 
.L2C59
CP   &40
JR   NZ,L2C61
LD   A,&1E
JR   L2C64
 
.L2C61
CALL L3326
.L2C64
LD   (LF7E7),A
LD   A,&06
LD   (LF7EE),A
XOR  A
LD   (LF7F4),A
INC  A
LD   (LF7CD),A
LD   (LF7E6),A
CALL random
LD   L,A
AND  &07
LD   H,A
LD   DE,&0800
ADD  HL,DE
SCF
CALL L8F25
LD   (LF7DE),HL
LD   HL,(LF7CE)
LD   (LF7DA),HL
LD   HL,(LF7D0)
LD   (LF7DC),HL
CALL L8D8E
CALL L3037
RET  NC
LD   A,(missionStatus)
CP   &21
JR   Z,L2CB0
CP   &52
JR   Z,L2CB0
LD   A,(LF7E7)
CP   &13
RET  Z
CP   &1F
RET  Z
.L2CB0
CALL L4599
CALL L3341
LD   HL,L343B
LD   (LE871),HL
LD   A,(rating)
ADD  A,&03
RRA
LD   C,A
.L2CC3
CALL random
AND  &1F
CP   C
JR   NC,L2CC3
OR   A
RET  Z
LD   B,A
.L2CCE
PUSH BC
CALL L334D
LD   A,(missionStatus)
CP   &40
JR   NZ,L2CE0
LD   A,&19
LD   (LF7E7),A
JR   L2CEF
 
.L2CE0
CP   &21
JR   Z,L2CE8
CP   &52
JR   NZ,L2CEC
.L2CE8
LD   A,&13
JR   L2CEF
 
.L2CEC
CALL L3326
.L2CEF
LD   HL,(LE871)
LD   C,(HL)
INC  HL
LD   B,(HL)
INC  HL
PUSH BC
POP  IX
LD   E,(HL)
INC  HL
LD   D,(HL)
INC  HL
LD   A,(HL)
INC  HL
LD   (LE871),HL
LD   H,B
LD   L,C
LD   C,A
LD   B,&03
.L2D07
INC  HL
LD   A,(HL)
XOR  C
LD   (HL),A
INC  HL
DJNZ L2D07
EX   DE,HL
CALL L439D
PUSH HL
LD   HL,(LF7CE)
ADD  HL,BC
LD   (LF7CE),HL
LD   HL,(LF7D0)
ADD  HL,DE
LD   (LF7D0),HL
LD   HL,(LF7D2)
POP  DE
ADD  HL,DE
LD   (LF7D2),HL
LD   HL,L0087  
LD   DE,LF7D4
LD   BC,&0006
LDIR
CALL L3037
POP  BC
DJNZ L2CCE
RET
 
.L2D3B
LD   A,&01
LD   (LF7CD),A
LD   (LF7E6),A
CALL random
LD   L,A
AND  &07
LD   H,A
LD   DE,&0800
ADD  HL,DE
SCF
CALL L8F25
CALL L8E45
JP   L3037
 
.L2D58
CALL checkDocked            ; does not return if docked
LD   A,(LE910)
OR   A
JP   NZ,doBeep
LD   A,(missiles)
OR   A
JP   Z,doBeep
LD   HL,LE910
INC  (HL)
JP   L6B6E
 
.L2D70
LD   A,(LE910)
OR   A
JP   Z,doBeep
XOR  A
LD   (LE910),A
JP   L6B6E

.L2D7E 
LD   A,(LE910)
SUB  &02
JP   NZ,doBeep
LD   (LE910),A
LD   A,&41
LD   (LF7CD),A
LD   (LF7E6),A
LD   HL,L3429
LD   DE,LF7CE
LD   BC,&0012
LDIR
LD   A,&02
LD   (LF7E7),A
LD   A,&03
LD   (LF7EE),A
LD   A,(LE928)
LD   (LF7EF),A
CALL L3037
JR   NC,L2DBC
LD   A,&0B
CALL soundSystem
LD   HL,missiles
DEC  (HL)
JR   L2DC5
 
.L2DBC
CALL doBeep
LD   HL,Tjammed
CALL flashMessage
.L2DC5
JP   L6B6E
 
.L2DC8
CALL L6C9E
LD   HL,LF81B
LD   A,(HL)
OR   A
RET  Z
JP   P,L2DEF
LD   A,(LF819)
LD   (HL),A
LD   HL,L3365
LD   B,&04
.L2DDD
LD   E,(HL)
INC  HL
LD   D,(HL)
INC  HL
PUSH BC
PUSH HL
LD   BC,(LE867)
CALL L3C48
POP  HL
POP  BC
DJNZ L2DDD
RET
 
.L2DEF
DEC  (HL)
RET
 
.L2DF1
LD   HL,(LEB88)
LD   DE,(LF7CE)
OR   A
SBC  HL,DE
LD   A,H
LD   (LE864),A
JP   P,L2E08
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
.L2E08
LD   (LEB82),HL
LD   HL,(LEB8A)
LD   DE,(LF7D0)
OR   A
SBC  HL,DE
LD   A,H
LD   (LE865),A
JP   P,L2E22
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
.L2E22
LD   (LEB84),HL
LD   HL,(LEB8C)
LD   DE,(LF7D2)
OR   A
SBC  HL,DE
LD   A,H
LD   (LE866),A
JP   P,L2E3C
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
.L2E3C
LD   (LEB86),HL
CALL L84A6
LD   (LEB6E),HL
LD   A,(LEB9B)
OR   A
JR   Z,L2E52
LD   B,A
.L2E4C
SRL  H
RR   L
DJNZ L2E4C
.L2E52
LD   (LE86A),HL
RET
 
.L2E56
XOR  D
EX   AF,AF'
RES  7,D
LD   B,L
XOR  A
LD   H,A
LD   L,A
LD   C,A
.L2E5F
SRL  B
JR   NC,L2E65
ADD  HL,DE
ADC  A,C
.L2E65
SLA  E
RL   D
RL   C
INC  B
DJNZ L2E5F
LD   C,A
EX   AF,AF'
RET  P
LD   A,B
SUB  L
LD   L,A
LD   A,B
SBC  A,H
LD   H,A
LD   A,B
SBC  A,C
LD   C,A
RET
 
.L2E7B
PUSH AF
OR   A
JP   P,L2E8A
LD   C,A
XOR  A
LD   B,A
SUB  L
LD   L,A
LD   A,B
SBC  A,H
LD   H,A
LD   A,B
SBC  A,C
.L2E8A
LD   C,L
LD   L,A
LD   A,H
LD   H,&00
LD   DE,(LE86A)
LD   B,&10
.L2E95
RL   C
RLA
ADC  HL,HL
SBC  HL,DE
JR   NC,L2E9F
ADD  HL,DE
.L2E9F
DJNZ L2E95
RL   C
RLA
CPL
LD   H,A
LD   A,C
CPL
LD   L,A
POP  AF
AND  &80
OR   H
LD   H,A
LD   (LE86E),HL
RET
 
.L2EB2
XOR  A
LD   (LF7F4),A
PUSH IX
CALL L2DF1
LD   A,(LEB9B)
ADD  A,A
LD   C,A
LD   B,&00
LD   HL,L33C7
ADD  HL,BC
LD   DE,LE86C
LDI
LDI
LD   A,(LE864)
LD   HL,(LEF92)
LD   DE,(LF7D4)
CALL L2E56
PUSH BC
PUSH HL
LD   A,(LE865)
LD   HL,(LEF93)
LD   DE,(LF7D6)
CALL L2E56
PUSH BC
PUSH HL
LD   A,(LE866)
LD   HL,(LEF94)
LD   DE,(LF7D8)
CALL L2E56
LD   A,C
POP  DE
POP  BC
ADD  HL,DE
ADC  A,C
POP  DE
POP  BC
ADD  HL,DE
ADC  A,C
CALL L2E7B
LD   DE,(LE86C)
RES  7,H
OR   A
SBC  HL,DE
JR   C,L2F2F
CALL L2FBC
LD   A,(LF806)
LD   C,A
ADD  A,E
CP   &29
JR   C,L2F1F
LD   A,&28
SUB  E
LD   C,A
.L2F1F
LD   A,(LE86F)
OR   A
LD   A,C
JP   P,L2F29
NEG
.L2F29
CALL L23D9
JP   L2FB9
 
.L2F2F
CALL L4599
LD   A,(LE864)
LD   HL,(LEF92)
LD   DE,(LF7E0)
CALL L2E56
PUSH BC
PUSH HL
LD   A,(LE865)
LD   HL,(LEF93)
LD   DE,(LF7E2)
CALL L2E56
PUSH BC
PUSH HL
LD   A,(LE866)
LD   HL,(LEF94)
LD   DE,(LF7E4)
CALL L2E56
LD   A,C
POP  DE
POP  BC
ADD  HL,DE
ADC  A,C
POP  DE
POP  BC
ADD  HL,DE
ADC  A,C
CALL L2E7B
LD   A,(LE866)
LD   C,A
LD   A,(LF7DF)
XOR  C
JP   P,L2F85
LD   A,(LE86F)
OR   A
LD   A,(LF806)
JP   P,L2F80
NEG
.L2F80
CALL L2365
JR   L2FB9
 
.L2F85
LD   DE,(LE86C)
RES  7,H
OR   A
SBC  HL,DE
JR   C,L2FB4
CALL L2FBC
LD   A,(LF806)
LD   C,A
ADD  A,E
CP   &29
JR   C,L2FA5
LD   A,&28
SUB  E
LD   C,A
LD   A,&01
LD   (LF7F4),A
.L2FA5
LD   A,(LE86F)
OR   A
LD   A,C
JP   P,L2FAF
NEG
.L2FAF
CALL L2365
JR   L2FB9
 
.L2FB4
LD   A,&01
LD   (LF7F4),A
.L2FB9
POP  IX
RET
 
.L2FBC
EXX
LD   DE,(LE86E)
RES  7,D
LD   BC,L33D7
EXX
LD   BC,&0029  
.L2FCA
LD   A,B
ADD  A,C
RRA
LD   E,A
EXX
ADD  A,A
LD   L,A
LD   H,&00
ADD  HL,BC
LD   A,(HL)
INC  HL
LD   H,(HL)
LD   L,A
SBC  HL,DE
EXX
RET  Z
EX   AF,AF'
LD   A,E
CP   B
RET  Z
EX   AF,AF'
JR   NC,L2FE6
LD   C,E
JR   L2FE7
 
.L2FE6
LD   B,E
.L2FE7
JR   L2FCA
 
.L2FE9
ADD  A,A
LD   C,A
LD   B,&00
LD   HL,stack
ADD  HL,BC
LD   C,(HL)
INC  HL
LD   B,(HL)
DW   LD_IYH_B
DW   LD_IYL_C
RET
 
.L2FF9
LD   E,&28
CALL multAxE
LD   DE,LEBA0
ADD  HL,DE
PUSH HL
POP  IX
INC  HL
LD   DE,LEB88
LDI
LDI
LDI
LDI
LDI
LDI
RET
 
.L3016
LD   IX,LEBA0
LD   DE,&0028
LD   B,&14
.L301F
BIT  0,(IX+0)
JR   Z,L3031
LD   A,(IX+26)
CP   &02
JR   NZ,L3031
LD   A,(IX+34)
CP   C
RET  Z
.L3031
ADD  IX,DE
DJNZ L301F
INC  B
RET
 
.L3037
LD   HL,LEBA0
LD   DE,&0028
LD   B,&14
.L303F
BIT  0,(HL)
JR   NZ,L30A4
PUSH HL
PUSH HL
LD   A,(LE92F)
LD   (LF7ED),A
.L304B
INC  A
CP   &04
JR   NZ,L3052
LD   A,&01
.L3052
LD   (LE92F),A
LD   A,(LF7E7)
CALL L2FE9
LD   A,(IY+12)
LD   (LF7E9),A
LD   HL,LF7E6
LD   A,(HL)
OR   A
JR   Z,L306C
LD   A,(IY+13)
LD   (HL),A
.L306C
LD   A,(IY+19)
AND  &7F
LD   (LF7EA),A
LD   A,(LF7E7)
CP   &20
JR   NC,L3098
LD   C,A
LD   B,&00
LD   HL,LE844
ADD  HL,BC
INC  (HL)
LD   A,(IY+18)
AND  &1C
.L3088
JR   NZ,L3090
LD   HL,LE93A
INC  (HL)
JR   L3098
 
.L3090
CP   &04
JR   NZ,L3098
LD   HL,LE939
INC  (HL)
.L3098
POP  DE
LD   HL,LF7CD
LD   BC,&0028
LDIR
SCF
POP  HL
RET
 
.L30A4
ADD  HL,DE
DJNZ L303F
OR   A
RET
 
.L30A9
LD   HL,LF7CD
RES  0,(HL)
LD   A,(LF7E7)
CP   &20
RET  NC
LD   C,A
LD   B,&00
LD   HL,LE844
ADD  HL,BC
DEC  (HL)
LD   A,(spaceType)
OR   A
JR   Z,L30CA
LD   HL,repairing
LD   A,(HL)
OR   A
JR   Z,L30CA
DEC  (HL)
.L30CA
LD   A,(LF807)
AND  &1C
JR   NZ,L30D7
LD   HL,LE93A
DEC  (HL)
JR   L30DF
 
.L30D7
CP   &04
JR   NZ,L30DF
LD   HL,LE939
DEC  (HL)
.L30DF
LD   A,(LF7E7)
SUB  &1E
JR   NZ,L30E9
LD   (missionStatus),A
.L30E9
RET
 
.L30EA
LD   HL,LE911
LD   A,(LE910)
CP   &02
JR   C,L3100
LD   A,(LE928)
CP   (HL)
JR   NZ,L3100
CALL L2D70
JP   L310D
 
.L3100
LD   C,(HL)
CALL L3016
RET  NZ
RES  0,(IX+0)
LD   HL,LE846
DEC  (HL)
.L310D
LD   HL,TtarLost
JP   flashMessage
 
.L3113
CALL L2FF9
LD   HL,(LF7CE)
LD   DE,(LEB88)
SBC  HL,DE
JP   P,L3128
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
.L3128
LD   (LEB82),HL
LD   HL,(LF7D0)
LD   DE,(LEB8A)
SBC  HL,DE
JP   P,L313D
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
.L313D
LD   (LEB84),HL
LD   HL,(LF7D2)
LD   DE,(LEB8C)
SBC  HL,DE
JP   P,L3152
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
.L3152
LD   (LEB86),HL
CALL L84A6
LD   (LEB6E),HL
RET
 
.L315C
LD   A,(LE934)
OR   A
RET  Z
LD   HL,LE870
DEC  (HL)
RET  NZ
LD   (HL),&64
LD   HL,LE934
DEC  (HL)
LD   A,&01
LD   (LF7CD),A
LD   A,(missionStatus)
CP   &52
LD   A,&0C
JR   NZ,L317C
LD   A,&13
.L317C
LD   (LF7E7),A
LD   A,&05
LD   (LF7EE),A
JP   L3187
 
.L3187
LD   A,(LEFA9)
OR   A
RET  NZ
LD   HL,LEBC9
LD   DE,LF7CE
LD   BC,&0018
LDIR
LD   A,&01
CALL L2FE9
LD   A,(IY+16)
CALL L8685
XOR  A
LD   (LF7E6),A
INC  A
LD   (LF7F4),A
JP   L3037
 
.L31AD
PUSH BC
PUSH DE
PUSH HL
PUSH IX
LD   (IX+34),&40
LD   (IX+35),&28
LD   (IX+25),&00
LD   (IX+33),&01
SET  2,(IX+0)
SET  3,(IX+0)
LD   A,&FF
LD   (LE869),A
LD   A,(IX+26)
CALL L2FE9
CALL L32E7
LD   A,(LEFA1)
OR   A
JR   NZ,L31F4
LD   A,(IY+18)
AND  &1C
JR   Z,L31E9
CP   &10
JR   NZ,L31F4
.L31E9
LD   A,(naughtynes)
ADD  A,&40
JR   NC,L31F1
SBC  A,A
.L31F1
LD   (naughtynes),A
.L31F4
LD   A,(IX+26)
CP   &13
JR   NZ,L321D
LD   IX,LEBA0
LD   DE,&0028
LD   A,(LE911)
LD   C,A
LD   B,&14
.L3208
LD   A,(IX+26)
CP   &06
JR   NZ,L3219
LD   A,(IX+30)
CP   C
JR   NZ,L3219
LD   (IX+33),&0C
.L3219
ADD  IX,DE
DJNZ L3208
.L321D
POP  IX
POP  HL
POP  DE
POP  BC
RET
 
.L3223
CALL checkDocked            ; does not return if docked
LD   A,(LF778)
OR   A
JP   Z,doBeep
LD   A,(jammerFlag)
OR   A
JP   NZ,doBeep
LD   A,&08
CALL soundSystem
JP   L6B12
 
.L323C
LD   A,(LE912)
OR   A
RET  Z
JP   M,L3294
BIT  0,A
JR   Z,L325E
LD   A,(LEEC0)
OR   A
JR   NZ,L325E
LD   A,(LE915)
OR   A
JR   NZ,L3259
LD   A,&04
CALL soundSystem
.L3259
LD   B,&01
CALL L19EC
.L325E
XOR  A
LD   (LE869),A
LD   IX,LEBA0
LD   DE,&0028
LD   B,&14
.L326B
BIT  0,(IX+0)
JR   Z,L3285
BIT  3,(IX+0)
JR   NZ,L3285
LD   A,(IX+26)
CP   &02
JR   NZ,L3285
SET  6,(IX+0)
CALL L31AD
.L3285
ADD  IX,DE
DJNZ L326B
LD   A,(LE869)
OR   A
RET  Z
LD   A,&02
CALL soundSystem
RET
 
.L3294
XOR  A
LD   (LEEC0),A
LD   (LE912),A
JP   L6B12
 
.L329E
CALL checkDocked            ; does not return if docked
LD   A,(LF77D)
OR   A
JP   Z,doBeep
XOR  A
LD   (LF77D),A
LD   (LE869),A
LD   IX,LEC18
LD   B,&11
LD   A,(spaceType)
OR   A
JR   Z,L32C1
LD   IX,LEC18
LD   B,&14
.L32C1
LD   DE,&0028
.L32C4
BIT  0,(IX+0)
JR   Z,L32D8
LD   A,(IX+26)
CP   &13
JR   Z,L32D8
SET  6,(IX+0)
CALL L31AD
.L32D8
ADD  IX,DE
DJNZ L32C4
LD   A,(LE869)
OR   A
RET  Z
LD   A,&02
CALL soundSystem
RET
 
.L32E7
LD   HL,(currentScore)
LD   A,(currentScore+2)
LD   E,(IY+24)
LD   D,(IY+25)
ADD  HL,DE
ADC  A,&00
LD   (currentScore),HL
LD   (currentScore+2),A
PUSH AF
PUSH HL
LD   A,(rating)
ADD  A,A
LD   E,A
LD   D,&00
LD   HL,L336D
ADD  HL,DE
LD   E,&00
LD   D,(HL)
INC  HL
LD   C,(HL)
POP  HL
POP  AF
SBC  HL,DE
SBC  A,C
JR   C,L331B
LD   HL,rating
INC  (HL)
JR   L3320
 
.L331B
LD   HL,LE930
INC  (HL)
RET  NZ
.L3320
LD   HL,TrightOn
JP   flashMessage
 
.L3326
CALL random
AND  &0F
CP   &0A
JR   NC,L3326
ADD  A,&12
LD   (LF7E7),A
CP   &13
RET  NZ
LD   A,(LE939)
OR   A
JR   NZ,L3326
LD   A,(LF7E7)
RET
 
.L3341
LD   HL,LF7CD
LD   DE,L0080
LD   BC,&0028
LDIR
RET
 
.L334D
LD   HL,L0080 
LD   DE,LF7CD
LD   BC,&0028
LDIR
RET
 
.L3359
LD   A,(LE93A)
LD   HL,LE939
OR   (HL)
LD   HL,LE857
OR   (HL)
RET
 
.L3365
DB   &00
DB   &7F
DB   &00
DB   &76
DB   &AF
DB   &7F
DB   &AF
DB   &76

.L336D
DW &0008
DW &0010
DW &0020
DW &0040
DW &0080
DW &0200
DW &0A00
DW &1900

.TtarLost
DC   "Target Lost"
.TredAlert
DC   "Condition RED!"
.TrightOn
DC   "Right On Commander"
.Tjammed
DC   "Missile jammed!"
.Tincomming
DC   "Incoming missile"
.L33C7
DW   &0359
DW   &0594
DW   &07CD
DW   &0A03
DW   &0C36
DW   &0E66
DW   &1090
DW   &12B6
.L33D7
DW   &15E3
DW   &155D
DW   &14D6
DW   &144E
DW   &13C6
DW   &133E
DW   &12B6
DW   &122D
DW   &11A4
DW   &111A
DW   &1090
DW   &1006
DW   &0F7B
DW   &0EF0
DW   &0E65
DW   &0DDA
DW   &0D4E
DW   &0CC2
DW   &0C36
DW   &0BA9
DW   &0B1D
DW   &0A90
DW   &0A03
DW   &0975
DW   &08E8
DW   &085A
DW   &07CC
DW   &073E
DW   &06B0
DW   &0622
DW   &0593
DW   &0505
DW   &0476
DW   &03E8
DW   &0359
DW   &02CA
DW   &023B
DW   &01AC
DW   &011D
DW   &008E
DW   &0000
.L3429
DB   &00,&00,&CE,&FF,&14,&00
DB   &00,&40,&00,&00,&00,&00
DB   &00,&00,&00,&00,&00,&40 

.L343B
DW   LF7D4
DW   &02BC
DB   &00

DW   LF7D4
DW   &02BC
DB   &80

DW   LF7E0
DW   &02BC
DB   &00

DW   LF7E0
DW   &02BC
DB   &80



;Memotech version
; returns NZ if a key is down B= Row number, D = drive line, HL key bitmap in top 10 bits
; Z set if no key down, any other register is meaningless

.keyMatrixScan
LD   D,&FF                 ; no drive line selected
LD   B,8                   ; 8 drive lines
AND  A                     ; clear carry
.L3456
LD   A,D
RLA                        ; shift zero bit to the right
LD   D,A                   ; save drive line data for later
CALL scan10
CP   &FF
RET  NZ                    ; any bit set to zero is a key down
scf                        ; make sure there is only one clear bit
DJNZ L3456
INC  A                     ; DJNZ doesn't alter flags, A was &FF or
                           ; this step wouldn't be reached, so Z now set
RET

; input drive line data in A
; exit HL = key bitmap, A = key hash (A = H&L)

.scan10
OUT  (keyDrive),A
IN   A,(keyScan1)
LD   H,A                   ; first 8 keys
IN   A,(keyScan2)
RRCA
RRCA                       ; remaining 2 rows moved from bits 1/0 to 7/6
OR   &3F                   ; set bits 5:0
LD   L,A                   ; and save HL is now the 10 bits of key data
AND  H                     ; forma hash of the key bits
RET

.decodekey
LD   A,8                   ; B still has the row counter 8 down to 1
SUB  B                     ; A now 0 to 7
LD   B,A
ADD  A,A                   ; x2
ADD  A,A                   ; x4
ADD  A,B                   ; x5
ADD  A,A                   ; multiply the row number by 10
.L346A
ADD  HL,HL                 ; start shifting bits
JR   NC,lookup             ; C will be CLEAR if there was a key down
INC  A                     ; no key
JR   L346A                 ; test the next bit, somewhere in the top 10 bits is a zero
 
.lookup
LD   HL,keyTable           ; base address
LD   C,A
LD   B,&00                 ; zero extend A into BC
ADD  HL,BC                 ; point to the current key
LD   A,(HL)                ; and get the ASCII value
RET
 
.readKeyboard
LD   A,(keyRow)
INC  A
JR   Z,noKey               ; A was &FF for no drive line under test
DEC  A
CALL scan10                ; rescan the drive line indicated
LD   HL,keyData
AND  (HL)                  ; compare agaianst the last data returned
RET  Z                     ; its the same then exit

.NoKEy
CALL keyMatrixScan         ; returns NZ if a key is down in Row B 
JR   NZ,keyDown
LD   A,&FF
LD   (keyRow),A            ; reset key drive map
INC  A                     ; set Z
RET
 
.keyDown
CPL                        ; reverse the bit data so that a 1 is a key down and 0 for not
LD   E,A                   ; D already has the row bitmap
LD   (keyData),DE          ; save the current row and key down data
CALL decodekey
LD   (keyASCII),A
AND  A                     ; clear Z if there was an "active" key set it is table entry was blank
RET 

; print character A on the graphics screen with pixel accuracy

.restart00
PUSH AF
PUSH BC
PUSH DE
PUSH HL
LD   L,A
LD   H,&00
ADD  HL,HL
ADD  HL,HL
ADD  HL,HL
LD   BC,font-256             ; offset as font data starts with space
ADD  HL,BC
LD   DE,LE600
LD   BC,&0008
LDIR                         ; copy the character data for char A to E600
EX   DE,HL
LD   (HL),&00                ; 00 to E608
LD   DE,LE609
LD   C,&07
LDIR                         ; blank E609 to E60F
LD   A,(printPixel)
OR   A
JR   Z,L34E5                 ; bypass if the count is zero
LD   B,A                     ; number of steps
LD   HL,LE600                ; char data
LD   DE,LE608                ; blank data
LD   C,&08                   ; 8 bytes to action
.L34D7
PUSH BC
LD   A,(DE)
.L34D9
SRL  (HL)                     
RRA
DJNZ L34D9                   ; shift B bits from (HL) to (DE)
LD   (DE),A
INC  HL
INC  DE
POP  BC
DEC  C
JR   NZ,L34D7

.L34E5
LD   DE,(printAddr)          ; get the screen address
LD   HL,LE600                ; point to left half data
LD   C,&02                   ; 2 characters to print
.L34EE
PUSH DE
LD   B,&08
.L34F1
LD   A,E
DI
OUT  (VDPaddress),A
LD   A,D
OUT  (VDPaddress),A          ; set the VDP address to read
EI
PUSH HL
POP  HL
IN   A,(VDPdata)             ; get the screen info
XOR  (HL)                    ; add in the character data
INC  HL                      ; next row
EX   AF,AF'                  ; save the new screen data
LD   A,E
DI
OUT  (VDPaddress),A
LD   A,D
OR   &40
OUT  (VDPaddress),A          ; setup the VDP for writing
EI
EX   AF,AF'
OUT  (VDPdata),A             ; write the data
DEC  B                       ; 8 rows done ?      
JR   Z,L351C                 ; yes jump ahead
INC  E                       ; no
LD   A,E
AND  &07                     ; end of character row on screen?
JR   NZ,L351A                ; no
LD   A,E
DEC  A
AND  &F8                     ; yes point to to row
LD   E,A
INC  D                       ; of the next character block down
.L351A
JR   L34F1
 
.L351C
POP  DE                      ; get the screen address
LD   A,E
ADD  A,&08
LD   E,A                     ; point to the next character to the right
DEC  C
JR   NZ,L34EE                ; print the right half
LD   A,(printPixel)
CP   &02                     ; is the pixel offset 0 or 1
JR   C,L3534                 ; don;t update the screen address
LD   HL,(printAddr)
LD   C,&08
ADD  HL,BC
LD   (printAddr),HL          ; move the screen address 1 character right
.L3534
ADD  A,&06                   ; each character is 6 pixels screen space
CP   &08
JR   C,L353C                 ; did the sub pixel count roll over
SUB  &08                     ; yes so adjust
.L353C
LD   (printPixel),A          ; save the sub pixel value
LD   HL,posX
INC  (HL)                    ; move the cursor X position on 1 character
POP  HL
POP  DE
POP  BC
POP  AF
RET
 
; calculate the screen address of the 6x8 pixel block at B,C

.csrBC
PUSH HL
LD   H,C                     ; address of each row is row x 256
LD   A,B
LD   (posX),A                ; save the X position
ADD  A,A                     ; x2
ADD  A,B                     ; x3
ADD  A,A                     ; x6
PUSH AF                      ; save
AND  &F8                     ; mask off the sub character count
LD   L,A
LD   (printAddr),HL          ; save the start address
POP  AF                      ; get the data back
AND  &07                     ; create the pixel count
LD   (printPixel),A          ; and save
XOR  A
LD   (LE70D),A               ; not sure what this does
POP  HL
RET
 
; move the character cursor to column A in the current row
; assuming 6 pixel wide characters
 
.tabA
PUSH BC
LD   (posX),A
LD   B,A
ADD  A,A                     ; x2
ADD  A,B                     ; x3
ADD  A,A                     ; x6
PUSH AF                      ; save
AND  &F8                     ; mask off the sub character count
LD   (printAddr),A           ; update the low byte of the pixel address
POP  AF                      ; get the data back
AND  &07                     ; create the pixel count
LD   (printPixel),A          ; and save
POP  BC
RET
 
; print the string at (HL) onto the G2 screen with pixel accuracy

.restart08
LD   A,(HL)
OR   A
RET  Z                       ; 00 = end of string, so exit
AND  &7F                     ; ignore bit 7
CALL NZ,restart00            ; print anything other than &80 as 7 bit char
BIT  7,(HL)
RET  NZ                      ; top bit was set, also means end of string 
INC  HL
JR   restart08

.restart10 
CALL scanList
RST  &08                ; print it
RET

; scans the text stream for "A"th top bit set character or 00 
.scanList
DEC  A
RET  M
.L358F
BIT  7,(HL)
INC  HL
JR   Z,L358F
JR   scanList
 
; print string at indicated position, until 00 / top bit set char found
.restart20
LD   A,(HL)
OR   A
RET  M
LD   B,A
INC  HL
LD   C,(HL)
INC  HL
CALL csrBC
RST  &08                ; print it
INC  HL
JR   restart20
 

; output BC copies of byte in E

.sendBCcopies
LD   A,E
OUT  (VDPdata),A
DEC  BC
LD   A,B
OR   C
JR   NZ,sendBCcopies
RET
 
; output C rows of byte A
.outputCRows
LD   B,&00
.L35AF
OUT  (VDPdata),A
NOP
 nop
 nop
DJNZ L35AF
DEC  C
JR   NZ,outputCRows
RET
 
; fill B x C block from address HL
.blockFill
DI
LD   E,A
LD   D,&07
.L35BC
PUSH BC
PUSH HL
LD   A,L
OUT  (VDPaddress),A
LD   A,H
OR   &40
OUT  (VDPaddress),A         ; set HL as the write address
.L35C6
LD   A,E
OUT  (VDPdata),A            ; send the data
INC  L
LD   A,L                    ; move address down
AND  D
JR   NZ,L35DB               ; did it overflow to next column
LD   A,L                    ; yes
DEC  A
AND  &F8
LD   L,A                    ; move down one row
OUT  (VDPaddress),A
INC  H
LD   A,H
OR   &40
OUT  (VDPaddress),A         ; and set new write address
.L35DB
DJNZ L35C6                  ; repeat for B rows of pixells
POP  HL                     ; restore address
LD   A,L
ADD  A,&08
LD   L,A                    ; move to next column
POP  BC
DEC  C
JR   NZ,L35BC               ; repeat until all columns done
RET
 
.waitForKey
PUSH BC
PUSH DE
PUSH HL
XOR  A
LD   (flashFlag),A
INC  A
LD   (flashCounter),A
.L35F1
CALL flashCursor
HALT 
LD   A,(keyASCII)
OR   A
JR   Z,L35F1
PUSH AF
XOR  A
LD   (keyASCII),A
LD   A,(flashFlag)
OR   A
JR   Z,L3610
LD   A,&7F
RST  &00                 ; print A
LD   A,(posX)
DEC  A
CALL tabA
.L3610
ifnot splitINT
XOR  A                   ; LD   A,&00
CALL soundSystem 
endif
POP  AF
POP  HL
POP  DE
POP  BC
RET
 
.flashCursor
LD   HL,flashCounter
DEC  (HL)
RET  NZ
LD   (HL),25            ; 50Hz VDP flash once per second
LD   A,&7F
RST  &00                ; print A
LD   A,(posX)
DEC  A
CALL tabA
LD   HL,flashFlag
LD   A,(HL)
CPL
LD   (HL),A
RET
 

; read C characters to the input buffer
; D and E contain the lowest and highest allowed characters
.inputString
LD   HL,keyBuffer
LD   B,&00
.L3636
CALL waitForKey
CP   &0D
JR   NZ,L3643
LD   (HL),&00
SCF
JP   clearLower
 
.L3643
CP   &1B
JP   Z,clearLower
CP   &7F
JR   NZ,L3662
INC  B
DEC  B
JR   Z,L3660
LD   A,(posX)
DEC  A
PUSH AF
CALL tabA
DEC  HL
LD   A,(HL)
RST  &00                ; print A
POP  AF
CALL tabA
DEC  B
.L3660
JR   L3673
 
.L3662
LD   (HL),A
CP   D
JR   C,L3673
CP   E
JR   Z,L366B
JR   NC,L3673
.L366B
LD   A,C
CP   B
JR   Z,L3673
LD   A,(HL)
RST  &00                ; print A
INC  HL
INC  B
.L3673
JR   L3636
 
.numberToText
LD   (LE738),A
LD   E,&00
LD   A,&FF
PUSH AF
.L367D
CALL L20C6
PUSH AF
INC  E
LD   A,C
OR   H
OR   L
JR   NZ,L367D
LD   A,(LE738)
LD   D,A
BIT  6,A
JR   Z,L3696
LD   B,E
INC  E
DEC  B
JR   NZ,L3696
PUSH BC
INC  E
.L3696
OR   A
JP   P,L36AA
AND  &3F
SUB  E
JR   Z,L36AA
LD   B,A
LD   A,(LEF96)
.L36A3
LD   (IX+0),A
INC  IX
DJNZ L36A3
.L36AA
BIT  6,D
JR   NZ,L36C1
.L36AE
POP  AF
OR   A
JP   P,L36B8
SET  7,(IX-1)
RET
 
.L36B8
ADD  A,&30
LD   (IX+0),A
INC  IX
JR   L36AE
 
.L36C1
DEC  E
.L36C2
LD   A,E
DEC  A
JR   NZ,L36CD
LD   A,&2E
LD   (IX+0),A
INC  IX
.L36CD
POP  AF
OR   A
JP   P,L36D7
SET  7,(IX-1)
RET
 
.L36D7
ADD  A,&30
LD   (IX+0),A
INC  IX
DEC  E
JR   L36C2
 
.restart18
PUSH IX
LD   IX,decodeBuf
CALL numberToText
POP  IX
LD   HL,decodeBuf
RST  &08                ; print it
RET
 

; block fill the VRAM colour table from 6 x 8 char pos (IX+0),(IX+1)
; by (IX+2),(IX+3) with colour (IX+4)
.restart28
LD   A,(IX+0)
OR   A
RET  M                ; > &7F end of table marker
LD   B,A
ADD  A,A              ; x2
ADD  A,B              ; x3
ADD  A,A              ; x6
AND  &F8              ; mask down to colour table resolution
LD   L,A              ; low byte of address
LD   A,(IX+1)
ADD  A,&20            ; add in colour table offset
LD   H,A              ; no further translation needed
LD   A,B
ADD  A,(IX+2)         ; add the window width to the origin
LD   B,A
ADD  A,A              ; x2
ADD  A,B              ; x3
ADD  A,A              ; x6
AND  &F8              ; mask down to colour table resolution
ADD  A,&08            ; round up
SUB  L                ; subtact rounded down start position
RRA
RRA
RRA
AND  &1F              ; convert from pixe count to char cell count
LD   C,A              ; and save
LD   A,(IX+3)       
ADD  A,A
ADD  A,A
ADD  A,A              ; cell count x 8
LD   B,A              ; as the fill roputine works in pixel rows
LD   A,(IX+4)         ; get the colour
CALL blockFill
EI                    ; restart the inturrupt that was turned off in the block fill
LD   BC,&0005
ADD  IX,BC            ; popint to the next entry in the table
JR   restart28
 
.L372B
LD   IX,bit7
LD   (LE730),DE
LD   A,D
CP   B
JR   C,L373C
LD   D,B
LD   B,A
LD   A,E
LD   E,C
LD   C,A
.L373C
LD   A,E
SUB  C
LD   L,&01
JR   NC,L3746
NEG
LD   L,&FF
.L3746
LD   E,A
LD   A,B
SUB  D
LD   D,A
PUSH HL
CALL plotPixel
POP  HL
LD   A,E
CP   D
JR   C,L3773
LD   H,E
SRL  H
LD   A,E
OR   A
RET  Z
LD   (LE734),A
.L375C
LD   A,C
ADD  A,L
LD   C,A
LD   A,H
SUB  D
JR   NC,L3765
DEC  B
ADD  A,E
.L3765
LD   H,A
PUSH HL
CALL plotPixel
LD   HL,LE734
DEC  (HL)
POP  HL
JR   NZ,L375C
JR   L3792
 
.L3773
LD   H,D
SRL  H
LD   A,D
OR   A
RET  Z
LD   (LE734),A
.L377C
DEC  B
LD   A,H
SUB  E
LD   H,A
JR   NC,L3787
ADD  A,D
LD   H,A
LD   A,C
ADD  A,L
LD   C,A
.L3787
PUSH HL
CALL plotPixel
LD   HL,LE734
DEC  (HL)
POP  HL
JR   NZ,L377C
.L3792
RET
 
; Pixel plotting/unplotting
; L37BF+1 is changed from OR (plot) to XOR (unplot) within the code
; On input IX assimed to point to 8 bit table bit7-bit0
; B,C is the pixel to plot
; no range checking for B > 191
; if colFlag is non zero a check in made for black and white pixel colour 

.plotPixel
CALL calcPixelAddress
LD   A,(colFlag)
OR   A                   
JR   Z,L37AD             ; zero don't check the pixel colour
LD   A,L
DI
OUT  (VDPaddress),A
LD   A,H
ADD  A,&20               ; select colour data
OUT  (VDPaddress),A
PUSH HL
POP  HL
IN   A,(VDPdata)
EI
CP   &F1                 ; is it black and white ?
RET  NZ                  ; no, exit
.L37AD
LD   A,C
AND  &07                 ; get the row offset
LD   (L37BF+2),A         ; change the offset in the IX instruction ahead
DI
LD   A,L
OUT  (VDPaddress),A
LD   A,H
OUT  (VDPaddress),A      ; address set for reading
PUSH HL
POP  HL
IN   A,(VDPdata)         ; get the current pixel data
EI
.L37BF
OR   (IX+0)            ; self modifying code either OR (IX+x) or XOR (IX+x)
PUSH AF
DI
LD   A,L
OUT  (VDPaddress),A
LD   A,H
OR   &40
OUT  (VDPaddress),A      ; address set for writing
POP  AF
OUT  (VDPdata),A         ; write the modifies pixel
EI
RET
 

; convert pixel coordinate B,C to a VRAM address in HL

.calcPixelAddress
LD   A,B
RRA                      ; /2
RRA                      ; /4
RRA                      ; /8
AND  &1F                 ; mask off the low bits that were rotated high
LD   H,A                 ; that's the raw row address
LD   A,C
AND  &F8                 ; mask off the sub character pixel data
LD   L,A
LD   A,B
AND  &07                 ; add in the sub character row offset
ADD  A,L
LD   L,A                 ; HL is now the address of pixel B,C
RET
 
.L37E2
LD   BC,(LE730)
JP   L372B
 
.drawLinkedLines
LD   A,(HL)
CP   &FF
RET  Z
LD   B,A
INC  HL
LD   C,(HL)
INC  HL
LD   (LE730),BC
.L37F5
LD   A,(HL)
CP   &FF
JR   Z,L3805
LD   D,(HL)
INC  HL
LD   E,(HL)
INC  HL
PUSH HL
CALL L37E2
POP  HL
JR   L37F5
 
.L3805
INC  HL
JR   drawLinkedLines
 
.delay
LD   B,&03
.L380A
LD   HL,&0000
.L380D
DEC  HL
LD   A,H
OR   L
JR   NZ,L380D
DJNZ L380A
RET
 
.QyesNo
LD   HL,Tqm
RST  &08                ; print it
.L3819
CALL waitForKey
CP   &1B
RET  Z
CP   "Y"
JR   Z,PrintYesNo
CP   "N"
JR   Z,PrintYesNo
JR   L3819
 
.PrintYesNo
RST  &00                ; print A
SCF
RET
 
.Tqm
DZ " ? "


.VDUwriteBytes
LD   A,(HL)
INC  HL
OUT  (VDPdata),A
 nop
DJNZ VDUwriteBytes
RET
 
.writeBCbytes
DEC  B
INC  B
JR   Z,L383C
INC  C
.L383C
LD   A,(HL)
INC  HL
OUT  (VDPdata),A
 nop
DJNZ L383C
DEC  C
JR   NZ,L383C
RET
 

; copy screen buffer at D600 to the center 22 columns of the screen
; buffer us arraned in a linear fashion
; 22 bytes of pixel data 10 bytes skipped x 128 rows

; timing tweak for MTX as 32 cycles needed per byte
.displayBuffer
CALL L39F1
LD   DE,&4120               ; D &41  , E &20
LD   H,plotBuffer>8         ; OUTI source is D6xx
LD   C,VDPdata
LD   A,&10                  ; 16 passes
LD   (screenInUse),A
.L3855
EX   AF,AF'
DI
LD   A,&28
OUT  (VDPaddress),A
LD   A,D
OUT  (VDPaddress),A         ; Screen address 0128 = row 1 char 5 on pass 1 
EI
XOR  A
LD   B,&C6                  ; 22 x 9 (as 8 OUTI for each DJNZ
.L3862
LD   L,A                    ; HL = xx00+A
OUTI
 NOP
 NOP
ADD  A,E
LD   L,A                    ; HL = xx20+A
OUTI
 NOP
 NOP
ADD  A,E
LD   L,A                    ; HL = xx40+A
OUTI
 NOP
 NOP
ADD  A,E
LD   L,A                    ; HL = xx60+A
OUTI
 NOP
 NOP
ADD  A,E
LD   L,A                    ; HL = xx80+A
OUTI
 NOP
 NOP
ADD  A,E
LD   L,A                    ; HL = xxA0+A
OUTI
 NOP
 NOP
ADD  A,E
LD   L,A                    ; HL = xxC0+A
OUTI
 NOP
 NOP
ADD  A,E
LD   L,A                    ; HL = xxE0+A
OUTI
ADD  A,E
INC  A                      ; Cell range 0 to 21
DJNZ L3862
INC  H                      ; next source row
INC  D                      ; next screen row
EX   AF,AF'
DEC  A
JR   NZ,L3855
LD   (screenInUse),A        ; clear in use flag
RET
 



; zero the memory buffer using PUSH and a temporary stack for speed
.cleanBuffer
LD   (SPsave),SP
LD   HL,127*32+22+plotBuffer  ; E5F6
LD   DE,&0000
LD   BC,-32                 ; &FFE0
;LD   A,&10                  ; 16 x 8 = 128 rows of data
LD   A,&80                  ; MTX is faster, so shave the code side
.L389E
LD   SP,HL
PUSH DE
PUSH DE
PUSH DE
PUSH DE
PUSH DE
PUSH DE
PUSH DE
PUSH DE
PUSH DE
PUSH DE
PUSH DE
ADD  HL,BC
; LD   SP,HL
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; ADD  HL,BC
; LD   SP,HL
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; ADD  HL,BC
; LD   SP,HL
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; ADD  HL,BC
; LD   SP,HL
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; ADD  HL,BC
; LD   SP,HL
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; ADD  HL,BC
; LD   SP,HL
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; ADD  HL,BC
; LD   SP,HL
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; PUSH DE
; ADD  HL,BC
DEC  A
JR   NZ,L389E
LD   SP,(SPsave)
RET
 

; RLL image decompression HL being the source

.uncompressScreen
LD   A,&00
DI
OUT  (VDPaddress),A
LD   A,&40
OUT  (VDPaddress),A          ; write pixel data 0000 
EI
CALL uncompressBlock
LD   A,&00
DI
OUT  (VDPaddress),A
LD   A,&60
OUT  (VDPaddress),A          ; write colour data 2000
EI
JP   uncompressBlock
 
.uncompressBlock
LD   E,(HL)                  ; read RLL flag
INC  HL
.L392A
LD   A,(HL)                  ; read data
INC  HL
CP   E                       ; is this an RLL group?
JR   NZ,L393E                ; no output the data
LD   C,(HL)                  ; yes get the data
INC  HL
LD   B,(HL)                  ; get the count
INC  HL
LD   A,B
OR   A                       ; count of xero ?
RET  Z                       ; yes job done!
LD   A,C                     ; no output multiple data bytes
.L3937
call outA
DJNZ L3937
JR   L3940                   ; next block/byte
 
.L393E
OUT  (VDPdata),A
.L3940
JR   L392A
 
;on entry HL is the VDP address if the sprite attr table
;B will hold the number of sprite to set the horizontal to &DF
.killSprite
LD   DE,&0004
.L3945
LD   A,L
OUT  (VDPaddress),A
LD   A,H
OR   &40
OUT  (VDPaddress),A
LD   A,&DF
OUT  (VDPdata),A
ADD  HL,DE
DJNZ L3945
RET
 
; clear the lower 2 rows of the screen/input buffer

.clearLower
PUSH AF
PUSH BC
PUSH HL
LD   A,&FF
LD   (screenInUse),A
LD   A,&18
DI
OUT  (VDPaddress),A
LD   A,&56
OUT  (VDPaddress),A            ; VDP address 1618 pixel row 22 char 3
EI
LD   BC,&00D0
LD   E,&00
CALL sendBCcopies              ; blank 26 characters worth of screen 
XOR  A
LD   (screenInUse),A
LD   A,&FF
LD   (screenInUse),A
LD   A,&18
DI
OUT  (VDPaddress),A
LD   A,&76                     ; VDP address 3618 colour row 22 char 3
OUT  (VDPaddress),A
EI
LD   BC,&00D0
LD   E,&15
CALL sendBCcopies              ; set the colour data to black on light Blue
XOR  A
LD   (screenInUse),A
LD   HL,&351F                  ; colour row 21, char 3and a bit?
LD   BC,&011A                  ; fill 1 row of 26 characters
LD   A,&15                     ; black on light blue
CALL blockFill
EI                             ; block fill turned off interrupts
LD   BC,&0516
CALL csrBC
POP  HL
POP  BC
POP  AF
RET
 
; assumes the pointer to the sprite attribute table already been setup
.setSpriteData
LD   A,B                  ; sprite vertical
call outA                 ; ensure timing
LD   A,C                  ; sprite horizontal
call outA                 ; ensure timing
LD   A,D                  ; sprite patttern
call outA                 ; ensure timing
ADD  A,&04
LD   D,A                  ; point to the next pattern number for sucessive calls
LD   A,E                  ; sprite colour
.outA
NOP
OUT  (VDPdata),A
RET



; using the table in HL write the VDP data indicated by the byte pairs
.VDPwriteBulk
LD   A,(HL)
OR   A
RET  Z
LD   B,A
INC  HL
LD   A,(HL)
INC  HL
.L39C0
call outA
DJNZ L39C0
JR   VDPwritebulk
 
.flashMessage
LD   (flashMesAdd),HL
LD   C,&00
.L39CD
INC  C
LD   A,(HL)
OR   A
INC  HL
JP   P,L39CD
LD   A,C
BIT  0,A
JR   Z,L39DA
INC  A
.L39DA
SUB  &16
NEG
SRL  A
LD   (flashMesLen),A
LD   A,&8A
LD   (screenCount),A
RET
 
.L39E9
LD   A,(screenCount)
OR   A
RET  NZ
JP   flashMessage
 
.L39F1
LD   HL,screenCount
LD   A,(HL)
OR   A                      ; exit if zero
RET  Z
JP   M,L39FC                ; jump ahead if negative
DEC  (HL)                   ; if positive, decrease the count
RET                         ; and exit doing nothing
 
.L39FC
DEC  (HL)                   ; decrease the count
JP   M,L3A03                ; jump ahead if still negative
LD   (HL),&19               ; set to +25 otherwise
RET
 
.L3A03
LD   HL,(flashMesAdd)
LD   A,(flashMesLen)
LD   E,A
LD   A,(bufferPos)
LD   D,A
.L3A0E
LD   A,(HL)
INC  HL
PUSH AF
AND  &7F
PUSH DE
PUSH HL
LD   L,A
LD   H,&00
ADD  HL,HL
ADD  HL,HL
ADD  HL,HL
LD   BC,&1A80
ADD  HL,BC
DI
LD   A,L
OUT  (VDPaddress),A
LD   A,H
OUT  (VDPaddress),A
PUSH HL
POP  HL
LD   B,&08
.L3A2A
IN   A,(VDPdata)
LD   (DE),A
LD   A,E
ADD  A,&20
LD   E,A
DJNZ L3A2A
EI
POP  HL
POP  DE
POP  AF
OR   A
RET  M
INC  E
JR   L3A0E
 
.L3A3C
LD   HL,keyASCII
.L3A3F
LD   A,(HL)
OR   A
JR   Z,L3A3F
LD   (HL),&00
PUSH AF
LD   A,&00
CALL soundSystem
POP  AF
RET


; fill the main display area colour table with A 
; VDP on MTX needs 32 cycles for timing
.colourFill
LD   HL,&2128             ; colour data row 1 char 5
LD   E,A
LD   C,&10                ; 16 rows
.L3A53
DI
LD   A,L
OUT  (VDPaddress),A
LD   A,H
OR   &40
OUT  (VDPaddress),A
LD   B,&B0                ; 176 bytes to send
.L3A5E
LD   A,E                  ; (4)
OUT  (VDPdata),A          ; (11)
  nop                     ; (+4)
DJNZ L3A5E                ; (13)
EI
INC  H
DEC  C
JR   NZ,L3A53
RET
 
.stringComp
LD   A,(DE)
CP   (HL)
RET  NZ
INC  HL
INC  DE
OR   A
JR   NZ,stringComp
RET
 
.L3A72
LD   C,&00
LD   A,E
SUB  &8C
LD   B,A
LD   A,D
SBC  A,&7F
JP   NC,L3A82
SET  0,C
JR   L3A9D
 
.L3A82
OR   B
JP   NZ,L3A8A
SET  4,C
.L3A88
JR   L3A9D
 
.L3A8A
LD   A,E
SUB  &75
LD   B,A
LD   A,D
SBC  A,&80
JP   C,L3A9D
OR   B
JR   NZ,L3A9B
SET  5,C
JR   L3A9D
 
.L3A9B
SET  1,C
.L3A9D
LD   A,L
SUB  &C1
LD   B,A
LD   A,H
SBC  A,&7F
JP   NC,L3AAA
SET  2,C
RET
 
.L3AAA
OR   B
JP   NZ,L3AB1
SET  6,C
.L3AB0
RET
 
.L3AB1
LD   A,L
SUB  &40
LD   B,A
LD   A,H
SBC  A,&80
RET  C
OR   B
JR   NZ,L3ABF
SET  7,C
RET
 
.L3ABF
SET  3,C
RET
 
.L3AC2
LD   DE,(LEB92)
LD   A,D
ADD  A,&80
LD   D,A
LD   (LEB93),A
LD   HL,(LEB94)
LD   A,H
ADD  A,&80
LD   H,A
LD   (LEB95),A
CALL L3A72
LD   A,C
EX   AF,AF'
LD   DE,(LEB96)
LD   A,D
ADD  A,&80
LD   D,A
LD   (LEB97),A
LD   HL,(LEB98)
LD   A,H
ADD  A,&80
LD   H,A
LD   (LEB99),A
CALL L3A72
EX   AF,AF'
LD   B,A
OR   C
AND  &0F
JP   Z,L3C29
LD   A,B
AND  C
AND  &0F
RET  NZ
LD   A,C
AND  &0F
JR   NZ,L3B26
LD   A,C
LD   (LE827),DE
LD   (LE829),HL
EXX
LD   HL,(LEB92)
LD   (LEB96),HL
LD   HL,(LEB94)
LD   (LEB98),HL
EXX
LD   (LEB92),DE
LD   (LEB94),HL
JP   L3BDA
 
.L3B26
LD   A,B
AND  &0F
JR   NZ,L3B3B
LD   A,B
LD   HL,(LEB92)
LD   (LE827),HL
LD   HL,(LEB94)
LD   (LE829),HL
JP   L3BDA
 
.L3B3B
LD   B,A
LD   A,C
AND  &0F
LD   C,A
PUSH DE
PUSH HL
LD   HL,(LEB92)
PUSH HL
LD   HL,(LEB94)
PUSH HL
PUSH BC
EXX
POP  BC
EXX
LD   A,&10
LD   (LE826),A
.L3B53
LD   HL,(LEB92)
LD   DE,(LEB96)
ADD  HL,DE
RR   H
RR   L
JR   NC,L3B62
INC  HL
.L3B62
EX   DE,HL
LD   HL,(LEB94)
LD   BC,(LEB98)
ADD  HL,BC
RR   H
RR   L
JR   NC,L3B72
INC  HL
.L3B72
CALL L3A72
LD   A,C
AND  &0F
JR   NZ,L3BA9
LD   A,C
LD   (LE827),DE
LD   (LE829),HL
EXX
POP  HL
LD   (LEB98),HL
POP  HL
LD   (LEB96),HL
PUSH AF
CALL L3BE0
POP  AF
LD   (LEB92),DE
LD   (LEB94),HL
EXX
LD   (LE827),DE
LD   (LE829),HL
POP  HL
LD   (LEB98),HL
POP  HL
LD   (LEB96),HL
JR   L3BDA
 
.L3BA9
EXX
LD   E,A
AND  C
JR   Z,L3BB8
LD   A,E
AND  B
JR   Z,L3BC7
.L3BB2
LD   HL,&0008
ADD  HL,SP
LD   SP,HL
RET
 
.L3BB8
LD   A,E
AND  B
JR   Z,L3BC7
LD   B,E
EXX
LD   (LEB92),DE
LD   (LEB94),HL
JR   L3BD0
 
.L3BC7
LD   C,E
EXX
LD   (LEB96),DE
LD   (LEB98),HL
.L3BD0
LD   HL,LE826
DEC  (HL)
JP   NZ,L3B53
JP   L3BB2
 
.L3BDA
CALL L3BE0
JP   L3C29
 
.L3BE0
AND  &F0
JR   Z,L3BEC
LD   DE,(LE827)
LD   HL,(LE829)
RET
 
.L3BEC
LD   HL,(LEB96)
LD   DE,(LE827)
ADD  HL,DE
RR   H
RR   L
JR   NC,L3BFB
INC  HL
.L3BFB
EX   DE,HL
LD   HL,(LE829)
LD   BC,(LEB98)
ADD  HL,BC
RR   H
RR   L
.L3C08
JR   NC,L3C0B
INC  HL
.L3C0B
CALL L3A72
LD   A,C
AND  &0F
JR   NZ,L3C20
LD   A,C
AND  &F0
RET  NZ
LD   (LE827),DE
LD   (LE829),HL
JR   L3C27
 
.L3C20
LD   (LEB96),DE
LD   (LEB98),HL
.L3C27
JR   L3BEC
 
.L3C29
LD   D,L
LD   L,E
LD   H,scaleTable>8
LD   A,(HL)
ADD  A,&57
LD   E,A
LD   A,&40
SUB  D
LD   D,A
LD   A,(LEB92)
LD   L,A
LD   A,(HL)
ADD  A,&57
LD   C,A
LD   A,(LEB94)
SUB  &40
NEG
LD   B,A
JP   L3C48
 
.L3C48
LD   A,D
CP   B
JR   NC,L3C51
LD   D,B
LD   B,A
LD   A,E
LD   E,C
LD   C,A
.L3C51
LD   A,E
SUB  C
PUSH AF
JR   NC,L3C58
NEG
.L3C58
LD   E,A
LD   A,D
SUB  B
LD   D,A
CALL plot2Buffer               ; BC to buffer address in HL
LD   A,C
AND  &07
LD   (L3C65+1),A           ; change the address to LE00-LE07
.L3C65
LD   A,(bit7)
LD   C,A
LD   A,E
CP   D
JR   C,L3CAD
POP  AF
JR   C,L3C7C
LD   A,&09
LD   (L3C93+1),A           ; form RRC C ahead
LD   A,&2C
LD   (L3C98),A             ; poke in INC L
JR   L3C86
 
.L3C7C
LD   A,&01
LD   (L3C93+1),A           ; form RRC B ahead
LD   A,&2D
LD   (L3C98),A             ; poke in DEC L
.L3C86
LD   A,E
OR   A
RET  Z
LD   B,A
PUSH DE
EXX
POP  DE
RRA
LD   H,A
EXX
LD   DE,&0020
.L3C93
RRC  C
JP   NC,L3C99
.L3C98
INC  L
.L3C99
EXX
LD   A,H
SUB  D
JP   NC,L3CA5
ADD  A,E
LD   H,A
EXX
ADD  HL,DE
JR   L3CA7
 
.L3CA5
LD   H,A
EXX
.L3CA7
LD   A,(HL)
.L3CA8
OR   C
LD   (HL),A
DJNZ L3C93
RET
 
.L3CAD
POP  AF
JR   C,L3CBC
LD   A,&09
LD   (L3CDC+1),A           ; form RRC C ahead
LD   A,&2C
LD   (L3CE1),A             ; poke in INC L
JR   L3CC6
 
.L3CBC
LD   A,&01
LD   (L3CDC+1),A           ; form RRC B ahead
LD   A,&2D
LD   (L3CE1),A             ; poke in DEC L
.L3CC6
LD   A,D
OR   A
RET  Z
LD   B,A
PUSH DE
EXX
POP  DE
RRA
LD   H,A
EXX
LD   DE,&0020
.L3CD3
ADD  HL,DE
EXX
LD   A,H
SUB  E
JR   NC,L3CE4
ADD  A,D
LD   H,A
EXX
.L3CDC
RRC  C
JP   NC,L3CE2
.L3CE1
INC  L
.L3CE2
JR   L3CE6
 
.L3CE4
LD   H,A
EXX
.L3CE6
LD   A,(HL)
.L3CE7
OR   C
LD   (HL),A
DJNZ L3CD3
RET
 
; divides BC by 8 and adds the result
; to the start of the plotting buffer
.plot2Buffer
LD   H,B
LD   A,C
SRL  H
RRA
SRL  H
RRA
SRL  H
RRA
LD   L,A
LD   A,H
ADD  A,plotBuffer>8
LD   H,A
RET
 
; set point in BC in the buffer
.plotinBuffer 
CALL plot2Buffer               ; BC to buffer address in HL
LD   A,C
AND  &07
LD   (L3D06+1),A
.L3D06
LD   A,(bit7)
LD   C,A
LD   A,(HL)
OR   C
LD   (HL),A
RET
 
.L3D0E
LD   A,H
OR   A
JR   Z,L3D1D
LD   C,&00
.L3D14
INC  C
RRA
RR   L
OR   A
JP   NZ,L3D14
LD   A,C
.L3D1D
LD   (LEB9B),A
LD   A,L
LD   (LEB9C),A
LD   (LE80C),A
LD   (LE81F),IX
LD   (LE821),IY
LD   HL,circleCoords
.L3D32
PUSH BC
PUSH DE
LD   C,(HL)
INC  HL
LD   E,(HL)
INC  HL
PUSH HL
CALL L3D76
PUSH HL
LD   E,C
CALL L3D76
EX   DE,HL
POP  BC
LD   A,(LE80C)
OR   A
JR   Z,L3D4E
.L3D49
LD   HL,LE81D
JR   L3D51
 
.L3D4E
LD   HL,LE819
.L3D51
PUSH DE
CALL L3D8C
XOR  A
SUB  E
LD   E,A
SBC  A,A
SUB  D
LD   D,A
CALL L3D8C
XOR  A
SUB  C
LD   C,A
SBC  A,A
SUB  B
LD   B,A
CALL L3D8C
POP  DE
CALL L3D8C
XOR  A
LD   (LE80C),A
POP  HL
POP  DE
POP  BC
ADD  HL,DE
DJNZ L3D32
RET
 
.L3D76
LD   A,(LEB9C)
CALL multAxE
LD   A,(LEB9B)
SUB  &07
NEG
RET  Z
LD   B,A
.L3D85
SRL  H
RR   L
DJNZ L3D85
RET
 
.L3D8C
DI
LD   (LE81D),SP
LD   SP,HL
LD   A,(LE80C)
OR   A
JR   Z,L3DAC
LD   HL,(LE81F)
ADD  HL,DE
PUSH HL
LD   HL,(LE821)
ADD  HL,BC
PUSH HL
LD   HL,&0000
ADD  HL,SP
LD   SP,(LE81D)
EI
RET
 
.L3DAC
POP  HL
LD   (LEB98),HL
POP  HL
LD   (LEB96),HL
LD   HL,(LE81F)
ADD  HL,DE
LD   (LEB92),HL
PUSH HL
LD   HL,(LE821)
ADD  HL,BC
LD   (LEB94),HL
PUSH HL
LD   HL,-4
ADD  HL,SP
LD   SP,(LE81D)
EI
PUSH BC
PUSH DE
PUSH HL
CALL L3AC2
POP  HL
POP  DE
POP  BC
RET
 
.L3DD7
LD   A,D
ADD  A,&80
LD   D,A
LD   A,H
ADD  A,&80
LD   H,A
CALL L3A72
LD   A,C
AND  &0F
RET  NZ
LD   A,&40
SUB  L
LD   B,A
LD   L,E
LD   H,scaleTable>8
LD   A,(HL)
ADD  A,&57
LD   C,A
JP   plotinBuffer                  ; set point in BC in the buffer
 
.L3DF4
LD   A,H
OR   A
RET  NZ
LD   (LE600),A
LD   (LE603),A
LD   A,L
LD   (LEB9C),A
LD   (LE80C),A
LD   A,(LF7E7)
CP   &65
LD   A,&02
JR   Z,L3E0E
DEC  A
.L3E0E
LD   (LE604),A
LD   BC,&8000
ADD  IX,BC
LD   (LE81F),IX
ADD  IY,BC
LD   (LE821),IY
LD   IY,L4014
LD   HL,circleCoords
LD   B,&0A
.L3E29
PUSH BC
LD   C,(HL)
INC  HL
LD   E,(HL)
INC  HL
PUSH HL
LD   A,(LEB9C)
CALL multAxE
LD   A,H
RL   L
RLA
EX   AF,AF'
LD   A,(LEB9C)
LD   E,C
CALL multAxE
LD   A,H
RL   L
RLA
LD   C,A
EX   AF,AF'
LD   B,A
LD   A,(LE80C)
OR   A
JR   Z,L3E58
LD   (LE80D),BC
XOR  A
LD   (LE80C),A
JR   L3E63
 
.L3E58
LD   DE,(LE80D)
LD   (LE80D),BC
CALL L3E6A
.L3E63
POP  HL
POP  BC
INC  HL
INC  HL
DJNZ L3E29
RET
 
.L3E6A
LD   A,E
SUB  C
LD   L,&01
LD   E,A
LD   A,B
SUB  D
LD   D,A
LD   A,E
CP   D
JR   C,L3E92
LD   H,E
SRL  H
LD   A,E
OR   A
RET  Z
DW LD_IXL_A
.L3E7E  
LD   A,C
ADD  A,L
LD   C,A
LD   A,H
SUB  D
JR   NC,L3E87
DEC  B
ADD  A,E
.L3E87
LD   H,A
CALL L3EAD
DW DEC_IXL
JP   NZ,L3E7E
JR   L3EAC
 
.L3E92
LD   H,D
SRL  H
LD   A,D
OR   A
RET  Z
DW LD_IXL_A
.L3E9A
DEC  B
LD   A,H
SUB  E
LD   H,A
JR   NC,L3EA5
.L3EA0
ADD  A,D
LD   H,A
LD   A,C
ADD  A,L
LD   C,A
.L3EA5
CALL L3EAD
DW DEC_IXL
JR   NZ,L3E9A
.L3EAC
RET
 
.L3EAD
PUSH BC
PUSH DE
PUSH HL
LD   A,(LE600)
OR   A
JR   NZ,L3EC4
PUSH BC
CALL random
LD   L,A
CALL random
LD   H,A
POP  BC
LD   A,&10
JR   L3EC7
 
.L3EC4
LD   HL,(LE601)
.L3EC7
DEC  A
LD   (LE600),A
LD   A,(LE604)
LD   E,A
RR   H
RR   L
LD   (LE601),HL
SBC  A,A
JR   NZ,L3EDA
INC  A
.L3EDA
LD   HL,LE603
ADD  A,(HL)
JP   P,L3EE4
XOR  A
JR   L3EE8
 
.L3EE4
CP   E
JR   NZ,L3EE8
DEC  A
.L3EE8
LD   (HL),A
ADD  A,C
LD   C,A
LD   (LE823),BC
LD   B,&00
LD   HL,(LE81F)
OR   A
SBC  HL,BC
EX   DE,HL
LD   HL,&7F8A
ADD  HL,DE
JR   C,L3F64
LD   HL,&8074
ADD  HL,DE
JR   C,L3F06
LD   E,&8C
.L3F06
LD   D,scaleTable>8
LD   A,(DE)
ADD  A,&57
LD   (LEB92),A
LD   HL,(LE81F)
LD   BC,(LE823)
LD   B,&00
ADD  HL,BC
DEC  HL
EX   DE,HL
LD   HL,&8074
ADD  HL,DE
JR   NC,L3F64
LD   HL,&7F8A
ADD  HL,DE
JR   NC,L3F28
LD   E,&75
.L3F28
LD   D,scaleTable>8
LD   A,(DE)
ADD  A,&57
LD   (LEB96),A
LD   BC,(LE824)
LD   HL,(LE821)
ADD  HL,BC
LD   A,L
SUB  &C1
LD   A,H
SBC  A,&7F
JR   C,L3F49
LD   A,L
SUB  &41
LD   A,H
SBC  A,&80
CALL C,L3F68
.L3F49
LD   BC,(LE824)
LD   HL,(LE821)
OR   A
SBC  HL,BC
LD   A,L
SUB  &C1
LD   A,H
SBC  A,&7F
JR   C,L3F64
LD   A,L
SUB  &41
LD   A,H
SBC  A,&80
CALL C,L3F68
.L3F64
POP  HL
POP  DE
POP  BC
RET
 
.L3F68
LD   BC,&7FC0
ADD  HL,BC
LD   A,L
NEG
LD   B,A
LD   A,(LEB92)
LD   C,A
LD   A,(LEB96)
LD   D,A
CALL plot2Buffer               ; BC to buffer address in HL
LD   A,D
SUB  C
INC  A
LD   B,A
LD   A,C
AND  &07
JR   Z,L3FAA
LD   C,A
LD   A,B
ADD  A,C
SUB  &08
JR   NC,L3F9F
ADD  A,&07
LD   (L3F90+1),A
.L3F90
LD   A,(bit7)
LD   B,A
LD   A,C
LD   (L3F98+2),A
.L3F98
LD   A,(IY+0)
AND  B
OR   (HL)
LD   (HL),A
RET
 
.L3F9F
LD   B,A
LD   A,C
LD   (L3FA4+2),A
.L3FA4
LD   A,(IY+0)
OR   (HL)
LD   (HL),A
INC  L
.L3FAA
LD   A,B
RRA
RRA
RRA
AND  &1F
JP   Z,L4007
ADD  A,A
LD   C,A
SUB  &40
NEG
LD   (L3FC5+1),A
LD   A,C
ADD  A,A
ADD  A,A
SUB  B
NEG
LD   B,A
LD   A,&FF
.L3FC5
JR   L3FC5
 
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
.L4000
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
LD   (HL),A
INC  L
.L4007
LD   A,B
.L4008
OR   A
RET  Z
LD   (L400D+2),A
.L400D
LD   A,(IY+0)
CPL
OR   (HL)
LD   (HL),A
RET
 
.L4014
DB   &FF,&7F,&3F,&1F,&0F,&07,&03,&01

.readControls
LD   A,(LEF8E)
OR   A
JR   NZ,skipFlightKeys
LD   A,(currentView)
OR   A
JR   Z,skipFlightKeys
ld   a,&7F       
DI
out  (keyDrive),a
in   a,(keyScan2)        ; space on bit 0 of line 7 
EI
and  %00000001
CALL Z,L6956
ld   a,&BF       
DI
out  (keyDrive),a
in   a,(keyScan1)        ; /? on bit 5 of line 6 
EI
and  %00100000
CALL Z,L699C
                        ; Joystick direction mangling removed
LD   A,(stickData)      ; just load the data instead
BIT  2,A                ; left
CALL Z,L69E5
BIT  3,A                ; right
CALL Z,L69F8
BIT  1,A                ; backwards
CALL Z,L69FD
BIT  0,A                ; forwards
CALL Z,L6A10
BIT  4,A                ; trigger A
CALL Z,L2AD0
ld   a,&DF       
DI
out  (keyDrive),a
in   a,(keyScan1)        ; J on bit 3 of line 5 
EI 
and  %00001000
CALL Z,L86E6
.skipFlightKeys
LD   A,(keyASCII)
OR   A
RET  Z
LD   C,A
XOR  A
LD   (keyASCII),A
LD   A,(LEF8E)
.L4084
OR   A
JR   Z,L408B
LD   A,C
.L4088
CP   &86
RET  NZ
.L408B
LD   HL,commandTable
LD   DE,&0003
LD   A,C
LD   B,&21
.L4094
CP   (HL)
JR   Z,tableJump
ADD  HL,DE
DJNZ L4094
RET
 

.tableJump
LD   A,&00
CALL soundSystem
INC  HL               ; step over the key that was matched
LD   A,(HL)
INC  HL
LD   H,(HL)
LD   L,A              ; extract the address
JP   (HL)             ; and jump there


.doGameFrozen
LD   HL,countdown
LD   A,(HL)
PUSH AF
LD   (HL),&00
LD   A,(currentView)
OR   A
JR   Z,L40F9                 ; not a flight screen 
LD   HL,TgameFrozen
CALL flashMessage
CALL displayBuffer           ; flash the message on the 3d view
JR   FrozenStateActive
 
.L40F9
CALL clearLower
LD   HL,TgameFrozenX         ; print the shorter game frozen message on the status bar
call markSpace
CALL restart08

.FrozenStateActive
LD   HL,keyASCII
.L4105
LD   A,(HL)
OR   A
JR   Z,L4105                 ; wait for a key press
LD   (HL),&00                ; clear the key as it's been accepted
LD   HL,FrozenKeys
LD   BC,&000A
CPIR
JR   NZ,FrozenStateActive    ; hasn't pressed one of the 10 keys allowed
PUSH AF                      ; save the key for the next test
LD   A,&00
CALL soundSystem
POP  AF                      ; key back
CP   &86                     ; was it F7
JR   NZ,L412C                ; no jump ahead
.L4120
LD   A,(currentView)
OR   A
CALL Z,clearLower
POP  AF
LD   (countdown),A
RET
 
.L412C
CP   "1"                     ; test for load new commander
JR   NZ,L413C                ; no
   
POP  AF                      ; ditch the return to play address
LD   A,&FF
LD   (LF749),A
LD   A,&03
LD   (LF74A),A
RET
 
.L413C
LD   HL,gameFlagBits
CP   "S"                     ; sound off requested ?
JR   NZ,L414B                ; no
BIT  6,(HL)                  ; music enabled ?
JR   NZ,L4149                ; no
SET  0,(HL)                  ; set the sound inhibit
.L4149
JR   L4171
 
.L414B
CP   "Q"                     ; sound on requested ?
JR   NZ,L4157                ; no
BIT  6,(HL)                  ; music enabled ?
JR   NZ,L4155                ; no 
RES  0,(HL)                  ; clear sound inhibit
.L4155
JR   L4171
 
.L4157
CP   "M"
JR   NZ,L4165                ; music on/off ? 
LD   A,(HL)
XOR  &40
LD   (HL),A
JR   NZ,L4163                ; wasn't music on
SET  0,(HL)                  ; so flag sound off too
.L4163
JR   L4171
 
; process RDYBF
.L4165
EX   DE,HL 
.L4166
LD   A,&09 
SUB  C                        ; R=9 D=8 etc
LD   C,A                      ; R=0 D=1
LD   HL,L4208
ADD  HL,BC
LD   A,(DE)
XOR  (HL)
LD   (DE),A
.L4171
JR   FrozenStateActive

.CheckLaunchFront 
LD   A,(flagFlight)
OR   A
JP   NZ,DoLaunch
JP   DrawFrontView

.CheckBuyBack
LD   A,(flagFlight)
OR   A
JP   NZ,doBuyScreen
JP   DrawBackView
 
.CheckSellLeft
LD   A,(flagFlight)
OR   A
JP   NZ,doSellScreen
JP   DrawLeftView
 
.checkEquipRight
LD   A,(flagFlight)
OR   A
JP   NZ,doEquipScreen
JP   DrawRightView
 
; appears to be a command interpretation table
.commandTable
DB   "1"                ; 1 = launch, if docked     front view otherwise
DW   CheckLaunchFront
DB   "2"                ; 2 = Buy cargo, if docked  back view otherwise
DW   CheckBuyBack
DB   "3"                ; 3 = sell cargo, if docked left view otherwise
DW   CheckSellLeft
DB   "4"                ; 4 = Equip ship, if docked right view otherwise
DW   checkEquipRight
DB   "8"                ; 8 = Market Prices
DW   showPrices
DB   "["                ; [ = disc menu
DW   showDiscMenu
DB   "7"                ; 7 = data on system 
DW   L6164
DB   "0"                ; 0 = Inventory
DW   L5C8E
DB   "9"                ; 9 = status page
DW   statusPage
DB   "5"                ; 5 = galactic chart
DW   L4D0B
DB   &87
DW   doHomeCursor
DB   "B"                ; copy or "B" home cursor
DW   doHomeCursor
DB   "D"                ; D = distance to system
DW   L52CE
DB   "6"
DW   L4F64              ; 6 = Local cluster chart
DB   &80
DW   DrawFrontView
DB   &81
DW   DrawBackView
DB   &82
DW   DrawLeftView
DB   &83
DW   DrawRightView
DB   &86
DW   doGameFrozen
DB   "F"                ; F = find planet if docked
DW   L55A3
DB   "T"                ; T = target missile
DW   L2D58
DB   "U"                ; U = untarget missile
DW   L2D70
DB   "M"                ; M = fire missile
DW   L2D7E
DB   "H"                ; H = Hyperdrive
DW   L88AC
DB   "C"                ; C = Docking computer on
DW   L1692
DB   "E"                ; E = ECM
DW   L3223
DB   &09                ; tab = Energy bomb
DW   L329E
DB   "G"                ; G = Galactic Hyperdrive
DW   L8926
DB   &1B                ; esc = Escape capsule
DW   L19FC
DB   &84
DW   doStatusInfo
DB   "I"
DW   doIdentifyShip
DB   "Y"
DW   flipCloakStatus
DB   "L"
DW   L1B25
.FrozenKeys 
DS   "RDYBFMSQ1"         ; game frozen key list ?
DB   &86                 ; F7/Exit Frozen
.L4208
DB   &04,&02,&10,&08,&20 ; these are the RDYBF flag bits
.TgameFrozen
DC   "     Game Frozen      "
.TgameFrozenx
DC   "Game Frozen"
.L422E
XOR  A
LD   (LEF99),A
LD   (LEF98),A
LD   (LE6F0),A
LD   (LE6F3),A
LD   A,(LF7E7)
CP   &1E
JR   NZ,L4255
LD   A,(LF7EE)
CP   &01
JR   Z,L4255
LD   A,(LF746)
AND  &20
JR   NZ,L4255
DEC  A
LD   (LE6F3),A
RET
 
.L4255
LD   DE,(LF7CE)
LD   HL,(LF7D2)
CALL L44CE
LD   (LE6D8),DE
LD   (LE6DC),HL
LD   A,H
OR   A
RET  M
OR   L
RET  Z
ADD  HL,HL
LD   (LE6DA),HL
LD   A,(LF7EE)
CP   &01
JR   NZ,L427C
LD   A,(LF7F0)
LD   (LF800),A
.L427C
CALL L46CA
LD   A,(LF7EE)
CP   &01
JR   Z,L42BC
LD   HL,(LEB9E)
LD   A,H
OR   L
RET  Z
LD   DE,(LE6D8)
LD   BC,(LF7D0)
LD   HL,(LE6DA)
CALL L47C4
DW   LD_IXH_B
DW   LD_IXL_C
DW   LD_IYH_D
DW   LD_IYL_E
CALL L4A99
OR   A
RET  Z
LD   A,(LF7CD)
AND  &08
JP   NZ,L4A86
LD   HL,(LEB9E)
LD   DE,-4
ADD  HL,DE
JP   NC,L4A86
LD   A,(LF7E7)
.L42BC
CALL L4599
CALL L433F
LD   A,(LF7EE)
CP   &01
JP   Z,L4AEC
LD   A,&FF
LD   (LEF98),A
LD   HL,LE784
LD   DE,LE785
.L42D5
LD   BC,(LF7FF)
LD   B,&00
LD   (HL),B
DEC  C
LDIR
LD   HL,LE7B6
LD   DE,LE7B7
LD   BC,(LF7FE)
LD   B,&00
LD   (HL),B
DEC  C
LDIR
LD   A,&E6
LD   (LE6C9),A
LD   IX,LE7B6
LD   IY,LE784
LD   HL,(LF7F9)
LD   A,(LF7FD)
LD   B,A
.L4303
PUSH BC
LD   A,(LF804)
OR   A
JR   Z,L4325
LD   A,(HL)
INC  HL
LD   (LE7E8),A
LD   E,A
LD   D,multiplyBits>8
LD   A,(DE)
LD   (LE7E9),A
LD   DE,LE7EA
LDI
LDI
LDI
LDI
LDI
LDI
.L4325
LD   A,(LF804)
OR   A
JR   Z,L4331
CALL L4873
JP   P,L4336
.L4331
CALL L491A
JR   L433B
 
.L4336
LD   C,(HL)
INC  HL
LD   B,&00
ADD  HL,BC
.L433B
POP  BC
DJNZ L4303
RET
 
.L433F
LD   HL,(LF7D4)
CALL findLog
LD   (LE6CC),HL
LD   HL,(LF7D6)
CALL findLog
LD   (LE6CE),HL
LD   HL,(LF7D8)
CALL findLog
LD   (LE6D0),HL
LD   HL,(LF7E0)
CALL findLog
LD   (LE6D2),HL
LD   HL,(LF7E2)
CALL findLog
LD   (LE6D4),HL
LD   HL,(LF7E4)
CALL findLog
LD   (LE6D6),HL
LD   A,(LF7CD)
AND  &10
JR   NZ,L4397
LD   HL,(LF7DA)
CALL findLog
LD   (LEB68),HL
LD   HL,(LF7DC)
CALL findLog
LD   (LEB6A),HL
LD   HL,(LF7DE)
CALL findLog
LD   (LEB6C),HL
.L4397
LD   A,&FF
LD   (LE6F0),A
RET
 
.L439D
PUSH HL
EX   DE,HL
LD   L,(IX+0)
LD   H,(IX+1)
CALL Multiply
EX   (SP),HL 
PUSH HL
EX   DE,HL
LD   L,(IX+2)
LD   H,(IX+3)
CALL Multiply
EX   (SP),HL 
EX   DE,HL
LD   L,(IX+4)
LD   H,(IX+5)
CALL Multiply
POP  BC
POP  DE
RET
 
.L43C2
LD   A,(LE92D)
OR   A
RET  Z
LD   A,(LE6F3)
OR   A
RET  NZ
LD   A,(LE6F0)
OR   A
CALL Z,L433F
LD   HL,(LE6DC)
ADD  HL,HL
LD   (LE6DA),HL
LD   HL,&0BB8
LD   IX,LF7DA
CALL L439D
CALL L44CE
CALL L44D2
LD   (LF769),DE
LD   (LF76B),BC
LD   (LF76D),HL
JR   Z,L43FC
LD   A,H
OR   A
JP   P,L442A
.L43FC
LD   A,(LF803)
LD   E,A
CALL L4A5C
JR   NC,L4428
LD   (LF76F),DE
LD   (LF771),BC
LD   (LF773),HL
CALL L47C4
LD   (LEB92),BC
LD   (LEB94),DE
CALL L4B22
LD   (LEB96),BC
LD   (LEB98),HL
CALL L3AC2
.L4428
JR   L4463
 
.L442A
CALL L47C4
LD   (LEB92),BC
LD   (LEB94),DE
LD   A,(LF803)
LD   E,A
CALL L4A5C
JR   C,L4455
LD   (LF76F),DE
LD   (LF771),BC
LD   (LF773),HL
CALL L4B22
.L444C
LD   (LEB96),BC
LD   (LEB98),HL
JR   L4460
 
.L4455
CALL L47C4
LD   (LEB96),BC
LD   (LEB98),DE
.L4460
CALL L3AC2
.L4463
RET
 
.L4464
LD   HL,(LE7EA)
LD   BC,(LE6CC)
CALL L2160
EX   DE,HL
LD   HL,(LE7EC)
LD   BC,(LE6D2)
CALL L2160
ADD  HL,DE
EX   DE,HL
LD   HL,(LE7EE)
LD   BC,(LEB68)
CALL L2160
ADD  HL,DE
PUSH HL
LD   HL,(LE7EA)
LD   BC,(LE6CE)
CALL L2160
EX   DE,HL
LD   HL,(LE7EC)
LD   BC,(LE6D4)
CALL L2160
ADD  HL,DE
EX   DE,HL
LD   HL,(LE7EE)
LD   BC,(LEB6A)
CALL L2160
ADD  HL,DE
PUSH HL
LD   HL,(LE7EA)
LD   BC,(LE6D0)
CALL L2160
EX   DE,HL
LD   HL,(LE7EC)
LD   BC,(LE6D6)
CALL L2160
ADD  HL,DE
EX   DE,HL
LD   HL,(LE7EE)
LD   BC,(LEB6C)
CALL L2160
ADD  HL,DE
POP  BC
POP  DE
.L44CE
CALL &0000                ; modified by 64A1 etc
RET
 
.L44D2
PUSH HL
LD   HL,(LE6D8)
ADD  HL,DE
EX   DE,HL
LD   HL,(LF7D0)
ADD  HL,BC
EX   (SP),HL 
LD   BC,(LE6DA)
ADC  HL,BC
POP  BC
RET
 
.doRet
RET
 
.L44E6
XOR  A
SUB  E
LD   E,A
SBC  A,A
SUB  D
LD   D,A
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
RET
 
.L44F3
EX   DE,HL
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
RET
 
.L44FB
EX   DE,HL
XOR  A
SUB  E
LD   E,A
SBC  A,A
SUB  D
LD   D,A
RET
 
.L4503
LD   HL,LF7E8
LD   A,(HL)
CP   &C8
RET  C
LD   (HL),&00
LD   HL,LF7D4
CALL L4642
LD   HL,LF7DA
CALL L4642
LD   HL,LF7CD
RES  7,(HL)
CALL L4599
LD   HL,(LF7D6)
LD   DE,(LF7E4)
CALL Multiply
PUSH HL
LD   HL,(LF7E2)
LD   DE,(LF7D8)
CALL Multiply
EX   DE,HL
POP  HL
OR   A
SBC  HL,DE
JP   P,L4545
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L4545
LD   (LF7DA),HL
LD   HL,(LF7E0)
LD   DE,(LF7D8)
CALL Multiply
PUSH HL
LD   HL,(LF7D4)
LD   DE,(LF7E4)
CALL Multiply
EX   DE,HL
POP  HL
OR   A
SBC  HL,DE
JP   P,L456D
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L456D
LD   (LF7DC),HL
LD   HL,(LF7D4)
LD   DE,(LF7E2)
CALL Multiply
PUSH HL
LD   HL,(LF7E0)
LD   DE,(LF7D6)
CALL Multiply
EX   DE,HL
POP  HL
OR   A
SBC  HL,DE
JP   P,L4595
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L4595
LD   (LF7DE),HL
RET
 
.L4599
LD   HL,LF7CD
BIT  7,(HL)
RET  NZ
SET  7,(HL)
LD   HL,(LF7DC)
LD   DE,(LF7D8)
CALL Multiply
PUSH HL
LD   HL,(LF7D6)
LD   DE,(LF7DE)
CALL Multiply
EX   DE,HL
POP  HL
OR   A
SBC  HL,DE
JP   P,L45C6
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L45C6
LD   (LF7E0),HL
LD   HL,(LF7D4)
LD   DE,(LF7DE)
CALL Multiply
PUSH HL
LD   HL,(LF7DA)
LD   DE,(LF7D8)
CALL Multiply
EX   DE,HL
POP  HL
OR   A
SBC  HL,DE
JP   P,L45EE
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L45EE
LD   (LF7E2),HL
LD   HL,(LF7DA)
LD   DE,(LF7D6)
CALL Multiply
PUSH HL
LD   HL,(LF7D4)
LD   DE,(LF7DC)
CALL Multiply
EX   DE,HL
POP  HL
.L4608
OR   A
SBC  HL,DE
JP   P,L4616
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
SET  7,H
.L4616
LD   (LF7E4),HL
RET
 
.L461A
RES  7,D
PUSH DE
XOR  A
SBC  HL,HL
LD   IX,&0000
LD   B,A
LD   C,A
EXX
POP  BC
LD   A,B
LD   B,&0F
.L462B
RRA
RR   C
EXX
JR   NC,L4635
ADD  IX,DE
ADC  HL,BC
.L4635
SLA  E
RL   D
RL   C
RL   B
EXX
DJNZ L462B
EXX
RET
 
.L4642
PUSH HL
LD   B,&03
.L4645
LD   E,(HL)
INC  HL
LD   D,(HL)
INC  HL
PUSH HL
PUSH BC
CALL L461A
POP  BC
EX   (SP),HL 
PUSH IX
DJNZ L4645
LD   IX,&0000
LD   H,B
LD   L,B
LD   B,&03
.L465C
POP  DE
ADD  IX,DE
POP  DE
ADC  HL,DE
DJNZ L465C
LD   A,H
LD   C,L
LD   D,&00
LD   E,D
LD   H,D
LD   L,D
LD   B,&10
.L466D
SUB  &40
SBC  HL,DE
JR   NC,L4677
ADD  A,&40
ADC  HL,DE
.L4677
CCF
RL   E
RL   D
ADD  IX,IX
RL   C
RLA
ADC  HL,HL
ADD  IX,IX
RL   C
RLA
ADC  HL,HL
DJNZ L466D
POP  HL
LD   B,&03
.L468F
PUSH BC
PUSH HL
LD   A,(HL)
INC  HL
LD   H,(HL)
LD   L,A
CALL L46A1
POP  HL
LD   (HL),C
INC  HL
LD   (HL),A
INC  HL
POP  BC
DJNZ L468F
RET
 
.L46A1
PUSH HL
RES  7,H
XOR  A
LD   C,A
SRL  H
RR   L
RRA
SRL  H
RR   L
RRA
LD   B,&10
.L46B2
CCF
RL   C
RLA
ADC  HL,HL
SBC  HL,DE
JR   NC,L46BD
ADD  HL,DE
.L46BD
DJNZ L46B2
CCF
RL   C
RLA
POP  HL
BIT  7,H
RET  Z
OR   &80
RET
 
.L46CA
LD   DE,(LE6DA)
LD   A,(LF7CD)
AND  &08
JR   Z,L46D9
LD   DE,(LEB8E)
.L46D9
LD   A,D
OR   A
JR   Z,L46E7
LD   L,A
LD   H,multiplyBits>8
LD   B,(HL)
.L46E1
RRA
RR   E
DJNZ L46E1
LD   A,(HL)
.L46E7
LD   (LEB9B),A
XOR  A
SLA  E
ADC  A,&08
LD   H,A
LD   L,E
LD   E,(HL)
INC  L
LD   D,(HL)
LD   (LE6F1),DE
LD   A,(LF7CD)
AND  &08
JR   NZ,L4714
LD   HL,(LF800)
LD   H,&00
CALL L47F0
LD   (LE6EF),HL
LD   HL,(LF805)
LD   H,&00
CALL L47F0
JR   L4738
 
.L4714
LD   HL,L4C00
LD   A,(LF7E7)
CP   &65
JR   NZ,L4721
LD   HL,L4800
.L4721
OR   A
SBC  HL,DE
LD   A,(LEB9B)
NEG
ADD  A,A
ADD  A,A
ADD  A,H
JP   M,L4735
LD   H,A
CALL findAntiLog
JR   L4738
 
.L4735
LD   HL,&0000
.L4738
LD   (LEB9E),HL
LD   A,(LF818)
OR   A
RET  M
LD   HL,(LE6D8)
CALL L47F0
LD   HL,(LE6EF)
EX   DE,HL
OR   A
SBC  HL,DE
RET  NC
LD   HL,(LF7D0)
CALL L47F0
LD   HL,(LE6EF)
EX   DE,HL
OR   A
SBC  HL,DE
RET  NC
LD   A,(LF7CD)
AND  &04
RET  NZ
LD   A,(LEF9D)
OR   A
JR   Z,L4777
LD   HL,(shipTypeP)
CALL flashMessage
XOR  A
LD   (LEF9D),A
LD   A,&01
CALL soundSystem
.L4777
LD   A,&FF
LD   (LEF99),A
LD   A,(LE910)
DEC  A
RET  NZ
LD   A,(LE911)
LD   C,A
CALL L3016
RET  Z
LD   HL,LE910
INC  (HL)
CALL L6B6E
LD   A,(LE911)
LD   (LE928),A
LD   A,&01
CALL soundSystem
LD   HL,L4B9A
JP   flashMessage
 
.L47A1
LD   HL,(LE6DE)
LD   C,(HL)
INC  HL
LD   B,(HL)
INC  HL
PUSH HL
LD   HL,(LEB90)
CALL L2160
EX   (SP),HL 
LD   C,(HL)
INC  HL
LD   B,(HL)
INC  HL
LD   (LE6DE),HL
LD   HL,(LEB90)
CALL L2160
LD   B,H
LD   C,L
POP  DE
LD   HL,&0000
RET
 
.L47C4
PUSH BC
LD   A,H
OR   A
JR   Z,L47D5
LD   C,L
LD   L,A
LD   H,multiplyBits>8
LD   B,(HL)
.L47CE
RRA
RR   C
DJNZ L47CE
LD   A,(HL)
LD   L,C
.L47D5
LD   (LEB9B),A
XOR  A
SLA  L
ADC  A,&08
LD   H,A
LD   A,(HL)
INC  L
LD   H,(HL)
LD   L,A
LD   (LE6F1),HL
EX   DE,HL
CALL L47F0
EX   (SP),HL 
CALL L47F0
EX   DE,HL
POP  BC
RET
 
.L47F0
EX   DE,HL
LD   A,D
OR   A
PUSH AF
JP   P,L47FD
XOR  A
SUB  E
LD   E,A
SBC  A,A
SUB  D
LD   D,A
.L47FD
JR   Z,L4809
LD   L,A
.L4800
LD   H,multiplyBits>8
LD   B,(HL)
.L4803
RRA
RR   E
DJNZ L4803
.L4808
LD   A,(HL)
.L4809
LD   HL,LEB9B
.L480C
SUB  (HL)
ADD  A,A
ADD  A,A
EX   AF,AF'
XOR  A
SLA  E
ADC  A,&08
LD   L,E
LD   H,A
LD   A,(HL)
.L4818
INC  L
LD   H,(HL)
LD   L,A
LD   BC,&1C00
ADD  HL,BC
JR   C,L4839
LD   DE,(LE6F1)
SBC  HL,DE
EX   AF,AF'
ADD  A,H
JP   M,L4839
LD   H,A
CALL findAntiLog
BIT  7,H
JP   P,L4837
RES  7,H
.L4837
JR   L483C
 
.L4839
LD   HL,&0000
.L483C
LD   D,H
LD   E,L
POP  AF
RET  P
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
RET
 
.L4847
BIT  7,H
PUSH AF
JP   P,L4851
LD   A,L
NEG
LD   L,A
.L4851
LD   E,L
LD   D,&00
LD   A,(LE7E9)
LD   B,A
LD   A,(LE7E8)
LD   H,D
LD   L,D
.L485D
RRA
JR   NC,L4861
ADD  HL,DE
.L4861
SLA  E
RL   D
DJNZ L485D
POP  AF
LD   L,H
LD   H,&00
RET  P
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
RET
 
.L4873
PUSH HL
CALL L4464
LD   (LE7EA),DE
LD   (LE7EC),BC
LD   (LE7EE),HL
EX   DE,HL
CALL L4847
PUSH HL
LD   HL,(LE7EC)
CALL L4847
PUSH HL
LD   HL,(LE7EE)
CALL L4847
POP  BC
POP  DE
CALL L44D2
BIT  7,D
JR   Z,L48A5
XOR  A
SUB  E
LD   E,A
SBC  A,A
SUB  D
OR   &80
LD   D,A
.L48A5
BIT  7,B
JR   Z,L48B1
XOR  A
SUB  C
LD   C,A
SBC  A,A
SUB  B
OR   &80
LD   B,A
.L48B1
LD   (LE6EA),BC
BIT  7,H
JR   Z,L48C1
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
OR   &80
LD   H,A
.L48C1
LD   (LE6EC),HL
LD   HL,(LE7EA)
CALL L48EC
PUSH AF
PUSH HL
LD   DE,(LE6EA)
LD   HL,(LE7EC)
CALL L48EC
PUSH AF
PUSH HL
LD   DE,(LE6EC)
LD   HL,(LE7EE)
CALL L48EC
POP  DE
POP  BC
ADD  HL,DE
ADC  A,B
POP  DE
POP  BC
ADD  HL,DE
ADC  A,B
POP  HL
RET
 
.L48EC
LD   A,H
XOR  D
EX   AF,AF'
RES  7,D
BIT  7,H
JR   Z,L48F9
LD   A,L
NEG
LD   L,A
.L48F9
LD   B,L
XOR  A
LD   H,A
LD   L,A
LD   C,A
.L48FE
SRL  B
JR   NC,L4904
ADD  HL,DE
ADC  A,C
.L4904
SLA  E
RL   D
RL   C
INC  B
DJNZ L48FE
LD   C,A
EX   AF,AF'
LD   A,C
RET  P
LD   A,B
SUB  L
LD   L,A
LD   A,B
SBC  A,H
LD   H,A
LD   A,B
SBC  A,C
RET
 
.L491A
LD   B,(HL)
INC  HL
.L491C
LD   A,(HL)
LD   (L4920+2),A
.L4920
LD   A,(IX+0)
OR   A
JR   NZ,L4957
PUSH HL
LD   A,(HL)
LD   HL,(LF7F7)
ADD  A,A
ADD  A,L
LD   L,A
JP   NC,L4932
INC  H
.L4932
LD   A,(HL)
OR   A
JP   M,L4948
LD   E,A
INC  HL
LD   D,(HL)
CALL L496D
POP  HL
LD   A,(HL)
LD   (L4942+2),A
.L4942
LD   (IX+0),&01
JR   L4955
 
.L4948
LD   HL,LE6EE
INC  (HL)
POP  HL
LD   A,(HL)
LD   (L4951+2),A
.L4951
LD   (IX+0),&FF
.L4955
JR   L4969
 
.L4957
JP   P,L4969
LD   A,(HL)
LD   (L495E+2),A
.L495E
LD   (IX+0),&01
LD   A,(LE6EE)
DEC  A
LD   (LE6EE),A
.L4969
INC  HL
DJNZ L491C
RET
 
.L496D
PUSH BC
PUSH IX
PUSH DE
CALL L49FD
JR   C,L49B6
LD   (LF769),DE
LD   (LF76B),BC
LD   (LF76D),HL
EXX
LD   A,E
LD   (L4986+2),A
.L4986
LD   (IY+0),&00
POP  DE
LD   A,D
CALL L4A5C
JR   NC,L49B4
LD   (LF76F),DE
LD   (LF771),BC
LD   (LF773),HL
CALL L47C4
LD   (LEB92),BC
LD   (LEB94),DE
CALL L4B22
LD   (LEB96),BC
LD   (LEB98),HL
CALL L3AC2
.L49B4
JR   L49F9
 
.L49B6
LD   (LEB92),BC
LD   (LEB94),HL
POP  DE
PUSH DE
LD   E,D
CALL L49FD
JR   C,L49EE
LD   (LF769),DE
LD   (LF76B),BC
LD   (LF76D),HL
EXX
LD   A,E
LD   (L49D5+2),A
.L49D5
LD   (IY+0),&00
POP  DE
LD   A,E
CALL L4A5C
LD   (LF76F),DE
LD   (LF771),BC
LD   (LF773),HL
CALL L4B22
JR   L49EF
 
.L49EE
POP  DE
.L49EF
LD   (LEB96),BC
LD   (LEB98),HL
CALL L3AC2
.L49F9
POP  IX
POP  BC
RET
 
.L49FD
LD   A,E
LD   (L4A01+2),A
.L4A01
LD   A,(IY+0)
.L4A04
OR   A
JR   NZ,L4A4C
LD   A,E
LD   (L4A0B+2),A
.L4A0B
LD   (IY+0),&FF
EXX
LD   HL,(shipData)
ADD  A,A
LD   C,A
LD   B,&00
ADD  A,A
.L4A18
LD   (LE6C8),A
ADD  A,L
LD   L,A
JP   NC,L4A21
INC  H
.L4A21
ADD  HL,BC
LD   DE,LE7EA
LDI
LDI
LDI
LDI
LDI
LDI
CALL L4464
CALL L44D2
LD   A,H
OR   A
RET  M
OR   L
RET  Z
CALL L47C4
LD   HL,(LE6C8)
LD   (HL),C
INC  L
LD   (HL),B
INC  L
LD   (HL),E
INC  L
LD   (HL),D
EX   DE,HL
SCF
RET
 
.L4A4C
LD   A,E
ADD  A,A
ADD  A,A
LD   L,A
LD   H,LE600>8
LD   C,(HL)
INC  L
LD   B,(HL)
INC  L
LD   E,(HL)
INC  L
LD   D,(HL)
EX   DE,HL
SCF
RET
 
.L4A5C
LD   HL,(shipData)
ADD  A,A
LD   C,A
LD   B,&00
ADD  A,A
ADD  A,L
LD   L,A
JP   NC,L4A6A
INC  H
.L4A6A
ADD  HL,BC
LD   DE,LE7EA
LDI
LDI
LDI
LDI
LDI
LDI
.L4A7A
CALL L4464
CALL L44D2
RET  Z
LD   A,H
OR   A
RET  M
SCF
RET
 
.L4A86
LD   HL,(LEB9E)
LD   A,(LF7E7)
CP   &64
JP   NZ,L3DF4
LD   DE,&0002
LD   B,&0A
JP   L3D0E
 
.L4A99
LD   A,&80
ADD  A,D
LD   D,A
LD   A,&80
ADD  A,B
LD   B,A
PUSH DE
LD   DE,(LEB9E)
LD   H,B
LD   L,C
SBC  HL,DE
LD   (LE6E0),HL
LD   H,B
LD   L,C
ADD  HL,DE
LD   (LE6E2),HL
POP  BC
LD   H,B
LD   L,C
SBC  HL,DE
LD   (LE6E6),HL
LD   H,B
LD   L,C
ADD  HL,DE
LD   (LE6E4),HL
XOR  A
LD   HL,(LE6E0)
LD   DE,&8076
OR   A
SBC  HL,DE
RET  NC
LD   HL,(LE6E2)
LD   DE,&7F8C
OR   A
SBC  HL,DE
RET  C
LD   HL,(LE6E4)
LD   DE,&7FC1
OR   A
SBC  HL,DE
RET  C
LD   HL,(LE6E6)
LD   DE,&8041
OR   A
SBC  HL,DE
RET  NC
DEC  A
RET
 
.L4AEC
LD   A,(LF7F0)
ADD  A,A
LD   L,A
LD   A,&00
ADC  A,&08
LD   H,A
LD   DE,LEB90
LDI
LDI
LD   HL,LEEC6
LD   (LE6DE),HL
LD   A,(LF7EF)
INC  A
CP   &32
JR   C,L4B0D
LD   A,&32
.L4B0D
LD   B,A
.L4B0E
PUSH BC
CALL L47A1
CALL L44D2
CALL L47C4
EX   DE,HL
LD   D,B
LD   E,C
CALL L3DD7
POP  BC
DJNZ L4B0E
RET
 
.L4B22
LD   HL,(LF773)
LD   DE,(LF76D)
OR   A
SBC  HL,DE
JP   P,L4B35
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
.L4B35
EX   DE,HL
LD   HL,&0001
LD   BC,(LF76D)
OR   A
SBC  HL,BC
JP   P,L4B49
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
.L4B49
XOR  A
LD   C,H
LD   B,A
SUB  L
SBC  HL,BC
LD   B,&08
.L4B51
RLA
ADC  HL,HL
SBC  HL,DE
JR   NC,L4B59
ADD  HL,DE
.L4B59
DJNZ L4B51
RLA
CPL
LD   HL,(LF771)
LD   DE,(LF76B)
CALL L4B76
PUSH HL
LD   HL,(LF76F)
LD   DE,(LF769)
CALL L4B76
LD   B,H
LD   C,L
POP  HL
RET
 
.L4B76
PUSH AF
PUSH DE
EX   AF,AF'
OR   A
SBC  HL,DE
PUSH AF
JP   P,L4B86
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
.L4B86
EX   AF,AF'
CALL multAxHL24
LD   L,H
LD   H,A
POP  AF
JP   P,L4B96
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
.L4B96
POP  DE
ADD  HL,DE
POP  AF
RET
 
.L4B9A
DC   "Missile Locked"

.L4BA8
LD   A,(currentSystem)
CALL decodeSystem
LD   HL,systemCopy
LD   DE,LF75A
LD   BC,&000F
LDIR
LD   A,(economy)
XOR  &07
LD   E,A
LD   A,(systemInfo)
AND  &0F
LD   (LE724),A
LD   IX,L0A02
LD   IY,stockList
LD   A,(last)
LD   C,A
LD   B,&11
.L4BD5
PUSH BC
PUSH DE
LD   A,(IX+3)
AND  C
LD   L,A
LD   A,(IX+1)
AND  &1F
LD   D,A
CALL multDxE
LD   C,A
LD   H,B
PUSH HL
ADD  HL,BC
EX   DE,HL
POP  HL
SBC  HL,BC
BIT  7,(IX+1)
JR   NZ,L4BF4
EX   DE,HL
.L4BF4
LD   C,(IX+0)
ADD  HL,BC
LD   (IY+0),L
LD   C,(IX+2)
EX   DE,HL
ADD  HL,BC
.L4C00
LD   A,L
OR   A
JP   P,L4C08
XOR  A
JR   L4C0A
 
.L4C08
AND  &3F
.L4C0A
LD   (IY+1),A
LD   A,(IX+1)
.L4C10
RLCA
RLCA
RLCA
AND  &03
LD   (IY+2),A
.L4C18
LD   A,(IX+4)
.L4C1B
LD   (IY+3),A
LD   BC,&0005
ADD  IX,BC
DEC  C
ADD  IY,BC
POP  DE
POP  BC
DJNZ L4BD5
RET
 
.decodeSystemInfo
LD   HL,systemInfo          ; copy the system info as the name builder cortrupts
LD   DE,systemCopy
LD   BC,&0006
LDIR
LD   A,(systemInfo+1)
SRL  A
LD   (LF752),A
LD   A,(systemInfo+3)
LD   E,&FC
CALL multAxE
LD   A,&02
ADD  A,H
LD   (LF751),A
LD   A,(systemInfo+2)
RRCA
RRCA
RRCA
AND  &07
LD   (government),A
CP   &02
SBC  A,A
AND  &02
LD   C,A
LD   A,(systemInfo+1)
AND  &07
OR   C
XOR  &07
LD   (economy),A
ADD  A,&03
LD   HL,systemInfo+3
AND  (HL)
LD   B,A
LD   A,(systemInfo+4)
RRA
LD   A,B
ADC  A,&00
LD   (LF755),A
LD   IX,fragBuffer
JP   generateName
 
.L4C80
EXX
LD   A,(systemInfo+1)
.L4C84
SRL  A
PUSH AF
LD   A,(systemInfo+3)
LD   E,&FC
CALL multAxE
LD   A,&02
ADD  A,H
PUSH AF
CALL calculateNext
EXX
POP  AF
POP  BC
LD   C,A
RET
 
.decodeSystem
EXX
CALL copyGalaxynfo
OR   A
JR   Z,L4CAA            ; name 0 needs no mangling
.L4CA2
EX   AF,AF'
CALL calculateNext
EX   AF,AF'
DEC  A
JR   NZ,L4CA2
.L4CAA
CALL decodeSystemInfo
EXX
RET
 

; A holds the name
.decodeName
CALL decodeSystem
LD   HL,fragBuffer
JP   decodeFragment
 

; take 4 bytes of input data and form a planet name in the decode buffer
.decodeFragment
LD   DE,decodeBuf
LD   C,&00               ; name length
LD   B,&04               ; 4 byte pairs int he buffer
.L4CBF
LD   A,(HL)              ; read in data bytr
INC  HL
PUSH HL                  ; save the updated source pointer
ADD  A,A                 ; fragments are 2 characters each
ADD  A,TnameFragments
LD   L,A
LD   H,TnameFragments>8
JR   NC,L4CCB
INC  H                   ; deal with ponter overflowing page
.L4CCB
PUSH BC                  ; save byte count (B)
LD   B,&02
.L4CCE
LD   A,(HL)
INC  HL
CP   " "                 ; ignore leading or training spaces
JR   Z,L4CD7
LD   (DE),A              ; transfer to the buffer
INC  DE                  ; increment pointer
INC  C                   ; increment length
.L4CD7
DJNZ L4CCE
POP  AF                  ; get B back as A, C to flags
LD   B,A                 ; put B back, doing it this way does not disturb the length count in C
POP  HL                  ; get the source pointer back
DJNZ L4CBF
XOR  A                   ; end of word flag
LD   (DE),A              ; save
LD   HL,decodeBuf
RES  5,(HL)              ; capitalise the first letter
LD   A,C                 ; length to A
RET                      ; done
 

; generate a name from the 6 bytes of system info

.generateName
LD   A,(systemInfo)
PUSH AF
LD   B,&04
.L4CED
LD   A,(systemInfo+5)
AND  &1F                 ; there are 32 name fragments
LD   (IX+0),A          ; store
PUSH BC
CALL spinInfo            ; csrefully mangle the ststem info some more
POP  BC
LD   A,B
DEC  A                   
JR   NZ,L4D06            ; B wasn't 1, indicating the last fragment in progress
POP  AF                  ; it is the last, bet back original first byte
AND  &40                 ; bit 6 set
JR   NZ,L4D06            ; yes do nothing
LD   (IX+0),A          ; make the last fragment 0 which is "  "
.L4D06
INC  IX
DJNZ L4CED
RET
 
; Galactic chart Status screen

.L4D0B
LD   A,(currentScreen)
CP   &04
RET  Z
CALL resetView
LD   HL,Tgalaxy
RST  &20                ; print string(s) at given position
LD   A,(LEB66)
LD   C,A
INC  C
XOR  A
SBC  HL,HL
RST  &18                ; Print Number
LD   HL,&2118
LD   C,&14
.L4D26
DI
LD   A,L
OUT  (VDPaddress),A
LD   A,H
OR   &40
OUT  (VDPaddress),A
LD   A,R
LD   E,A
LD   B,&D0
.L4D34
LD   A,E
AND  &F0
CP   &11
JR   NC,L4D3D
LD   A,&F0
.L4D3D
OR   &01
OUT  (VDPdata),A
RLC  E
DJNZ L4D34
EI
INC  H
DEC  C
JR   NZ,L4D26
CALL copyGalaxynfo
LD   IX,bit7
.L4D51
PUSH BC
CALL L4C80
CALL L4EEC
CALL plotPixel
POP  BC
DJNZ L4D51
CALL showCrosshair
LD   A,(spaceType)
OR   A
JR   NZ,L4D6C
CALL L53FD
JR   L4D76
 
.L4D6C
LD   BC,(LEEC3)
CALL L4EEC
CALL L540D
.L4D76
LD   A,&FF
LD   (LE70B),A
CALL L4DAB
CALL L4E4D
LD   A,&04
LD   (currentScreen),A
LD   (LE91A),A
RET
 
; set the position and pattern for the crosshair sprite (sprite 4)
.showCrosshair
DI
LD   A,8*cross
OUT  (VDPaddress),A
LD   A,spritePatW>8
OUT  (VDPaddress),A
LD   HL,crosshairData
CALL VDPwritebulk

LD   A,cross
OUT  (VDPaddress),A
LD   A,spriteAttrW>8
OUT  (VDPaddress),A
LD   HL,spriteInit
LD   B,&04
CALL VDUwriteBytes
EI
RET
 
.L4DAB
LD   HL,PlotBuffer
LD   (HL),&00
LD   DE,plotBuffer+1
LD   BC,&007F
LDIR
LD   A,(spaceType)
OR   A
JR   NZ,L4DCA
LD   A,(currentSystem)
CALL decodeSystem
LD   BC,(LF751)
JR   L4DCE
 
.L4DCA
LD   BC,(LEEC3)
.L4DCE
CALL L4EEC
LD   (LE82E),BC
LD   HL,(hyperFuel)
LD   H,&00
LD   A,&0A
CALL L2079
ADD  HL,HL
LD   BC,rangePointers
ADD  HL,BC
LD   A,(HL)
INC  HL
LD   H,(HL)
LD   L,A
LD   B,(HL)
INC  HL
LD   IX,bit7
.L4DEE
PUSH BC
LD   E,(HL)
INC  HL
LD   D,(HL)
INC  HL
PUSH HL
LD   C,E
LD   B,D
CALL L4EA5
LD   A,E
NEG
LD   C,A
LD   B,D
CALL L4EA5
LD   A,E
NEG
LD   C,A
LD   A,D
NEG
.L4E08
LD   B,A
CALL L4EA5
LD   C,E
LD   A,D
NEG
LD   B,A
CALL L4EA5
POP  HL
POP  BC
DJNZ L4DEE
DI
LD   A,&00
OUT  (VDPaddress),A
LD   A,spritePatW>8
OUT  (VDPaddress),A
LD   HL,PlotBuffer
LD   DE,&0004
LD   C,&02
.L4E29
PUSH HL
LD   B,&02
.L4E2C
PUSH BC
PUSH HL
LD   C,&02
.L4E30
PUSH HL
LD   B,&10
.L4E33
LD   A,(HL)
ADD  HL,DE
OUT  (VDPdata),A
DJNZ L4E33
POP  HL
INC  HL
DEC  C
JR   NZ,L4E30
POP  HL
LD   C,&40
ADD  HL,BC
POP  BC
DJNZ L4E2C
POP  HL
INC  HL
INC  HL
DEC  C
JR   NZ,L4E29
EI
RET
 
.L4E4D
DI
LD   A,&00
OUT  (VDPaddress),A
LD   A,spriteAttrW>8
OUT  (VDPaddress),A
LD   D,&00
CALL L4E86
LD   B,&F0
CALL L4E9D
CALL setSpriteData
CALL L4E86
LD   B,&00
CALL L4E9D
CALL setSpriteData
CALL L4E95
LD   B,&F0
CALL L4E9D
CALL setSpriteData
CALL L4E95
LD   B,&00
CALL L4E9D
CALL setSpriteData
EI
RET
 
.L4E86
LD   E,&08
LD   A,(LE82E)
SUB  &0F
JR   NC,L4E93
LD   E,&88
ADD  A,&20
.L4E93
LD   C,A
RET
 
.L4E95
LD   E,&08
LD   A,(LE82E)
INC  A
LD   C,A
RET
 
.L4E9D
LD   E,&08
LD   A,(LE82F)
ADD  A,B
LD   B,A
RET
 
.L4EA5
LD   A,(LE82E)
BIT  7,C
JR   NZ,L4EAF
ADD  A,E
JR   L4EB0
 
.L4EAF
SUB  E
.L4EB0
RET  C
CP   &18
RET  C
CP   &E8
RET  NC
LD   A,(LE82F)
BIT  7,B
JR   NZ,L4EC1
ADD  A,D
JR   L4EC2
 
.L4EC1
SUB  D
.L4EC2
RET  C
CP   &08
RET  C
CP   &A8
RET  NC
LD   A,B
ADD  A,&0F
ADD  A,A
ADD  A,A
LD   L,A
LD   A,C
ADD  A,&0F
LD   C,A
RRA
RRA
RRA
AND  &1F
ADD  A,L
LD   L,A
LD   A,C
AND  &07
LD   (L4EE0+2),A
.L4EE0
LD   A,(IX+0)
LD   BC,plotBuffer
LD   H,&00
ADD  HL,BC
OR   (HL)
LD   (HL),A
RET
 
.L4EEC
PUSH BC
LD   A,B
LD   E,&9F
CALL multAxE
LD   A,&7F
CALL L2079
LD   A,L
ADD  A,&08
POP  BC
PUSH AF
LD   A,C
LD   E,&CF
CALL multAxE
LD   A,H
ADD  A,&18
POP  BC
LD   C,A
RET
 
.L4F09
LD   A,C
LD   HL,LE830
SUB  (HL)
LD   C,A
JP   P,L4F14
NEG
.L4F14
LD   E,A
ADD  A,A
ADD  A,E
BIT  7,C
JR   Z,L4F1D
NEG
.L4F1D
ADD  A,&81
LD   C,A
LD   A,B
LD   HL,LE831
SUB  (HL)
LD   B,A
JP   P,L4F2B
NEG
.L4F2B
ADD  A,A
ADD  A,A
BIT  7,B
JR   Z,L4F33
NEG
.L4F33
ADD  A,&59
LD   B,A
RET
 
.L4F37
PUSH BC
LD   A,B
SUB  &59
SRA  A
SRA  A
LD   HL,LE831
ADD  A,(HL)
POP  BC
PUSH AF
LD   A,C
SUB  &81
PUSH AF
JP   P,L4F4E
NEG
.L4F4E
LD   L,A
LD   H,&00
LD   A,&03
CALL L2079
POP  AF
LD   A,L
JP   P,L4F5D
NEG
.L4F5D
LD   HL,LE830
ADD  A,(HL)
POP  BC
LD   C,A
RET

; screen "6" local cluster chart
.L4F64
LD   A,(currentScreen)
CP   &06
JR   NZ,L4F78
LD   A,(spaceType)
OR   A
RET  NZ
CALL L538B
LD   A,(hyperSystem)
JR   L4F87
 
.L4F78
CP   &04
.L4F7A
JR   NZ,L4F84
CALL L541E
LD   A,(hyperSystem)
JR   L4F87
 
.L4F84
LD   A,(currentSystem)
.L4F87
LD   (LE83C),A
CALL resetView
LD   HL,L5688
RST  &20                ; print string(s) at given position
LD   A,(spaceType)
OR   A
JR   NZ,L4FA2
LD   A,(LE83C)
CALL decodeSystem
LD   HL,(LF751)
JR   L4FA5
 
.L4FA2
LD   HL,(LEEC3)
.L4FA5
LD   A,&FF
CALL L502C
LD   IY,(LEFA4)
LD   B,A
.L4FAF
PUSH BC
LD   A,(IY+0)
CALL decodeSystem
LD   A,(government)
ADD  A,&02
ADD  A,A
ADD  A,A
ADD  A,A
ADD  A,A
OR   &01
LD   (LE83B),A
LD   A,(IY+0)
CALL decodeName
ADD  A,A
LD   C,A
ADD  A,A
ADD  A,C
DEC  A
RRA
RRA
RRA
AND  &1F
INC  A
LD   (LE833),A
ADD  A,A
ADD  A,A
ADD  A,A
DEC  A
LD   (LE834),A
INC  A
SRL  A
LD   (LE835),A
LD   A,(IY+25)
ADD  A,&03
LD   (LEB9C),A
CALL L50CE
POP  BC
INC  IY
DJNZ L4FAF
LD   A,(LE83C)
LD   HL,currentSystem
CP   (HL)
CALL Z,L5524
LD   A,(LE83F)
OR   A
CALL Z,doHomeCursor
CALL showCrosshair
LD   A,(spaceType)
OR   A
JR   NZ,L5014
CALL L53ED
JR   L501E
 
.L5014
LD   BC,(LEEC3)
CALL L4F09
CALL L540D
.L501E
LD   A,&FF
LD   (LE70B),A
LD   A,&06
LD   (currentScreen),A
LD   (LE91A),A
RET
 
.L502C
LD   (LE82C),A
LD   (LE830),HL
LD   A,L
SUB  &19
JR   NC,L5038
XOR  A
.L5038
LD   E,A
LD   A,H
SUB  &0F
JR   NC,L503F
XOR  A
.L503F
LD   D,A
LD   A,&19
ADD  A,L
JR   NC,L5046
SBC  A,A
.L5046
LD   L,A
LD   A,&0F
ADD  A,H
JP   P,L504F
LD   A,&7F
.L504F
LD   H,A
EXX
CALL copyGalaxynfo
EXX
LD   IY,(LEFA4)
XOR  A
LD   (LE83F),A
LD   B,A
.L505E
PUSH BC
CALL L4C80
LD   A,C
CP   E
JR   C,L5098
CP   L
JR   Z,L506B
JR   NC,L5098
.L506B
LD   A,B
CP   D
JR   C,L5098
CP   H
JR   Z,L5074
JR   NC,L5098
.L5074
POP  AF
PUSH AF
PUSH DE
PUSH HL
NEG
LD   (IY+0),A
LD   HL,hyperSystem
CP   (HL)
JR   NZ,L5088
LD   A,&FF
LD   (LE83F),A
.L5088
LD   A,(LE82C)
OR   A
JR   Z,L5094
CALL L4F09
CALL L5204
.L5094
INC  IY
POP  HL
POP  DE
.L5098
POP  BC
DJNZ L505E
LD   BC,(LEFA4)
OR   A
PUSH IY
POP  HL
SBC  HL,BC
LD   A,L
LD   (LE832),A
RET
 
.L50AA
LD   HL,(LF760)
XOR  A
CALL L502C
.L50B1
CALL random
LD   E,L
LD   A,(LE832)
CALL multAxE
LD   L,H
LD   H,&00
LD   DE,(LEFA4)
ADD  HL,DE
LD   A,(HL)
LD   HL,currentSystem
CP   (HL)
JR   Z,L50B1
LD   (LEFA2),A
RET
 
.L50CE
LD   BC,(LF751)
CALL L4F09
LD   (LE82E),BC
XOR  A
LD   (LE83A),A
LD   (LE838),A
LD   (LE839),A
.L50E3
CALL L512F
JR   NC,L5104
LD   HL,LE83A
INC  (HL)
LD   A,(HL)
CP   &09
JR   NZ,L5102
LD   (HL),&00
LD   HL,LE838
LD   A,(HL)
XOR  &FF
LD   (HL),A
JR   NZ,L5102
INC  HL
LD   A,(HL)
XOR  &FF
RET  Z
LD   (HL),A
.L5102
JR   L50E3
 
.L5104
LD   HL,LE70D
INC  (HL)
LD   BC,(LE836)
CALL calcPixelAddress
LD   (printAddr),HL
LD   A,H
ADD  A,&20
LD   H,A
LD   A,(LE833)
LD   C,A
LD   B,&08
LD   A,(LE83B)
CALL blockFill
XOR  A
LD   (printPixel),A
LD   HL,decodeBuf
RST  &08                ; print it
LD   HL,LE70D
DEC  (HL)
RET
 
.L512F
LD   A,(LE83A)
LD   IX,L56BD
LD   (L5139+2),A
.L5139
LD   A,(IX+0)
PUSH AF
LD   DE,(LE835)
CALL multAxE
LD   A,&64
CALL L2079
LD   A,(LEB9C)
ADD  A,L
POP  DE
PUSH AF
LD   E,D
CALL multAxE
LD   A,&64
CALL L2079
LD   A,L
POP  DE
PUSH AF
LD   A,(LE83A)
LD   IX,L56C6
LD   (L5165+2),A
.L5165
LD   A,(IX+0)
LD   E,D
CALL multAxE
LD   A,&64
CALL L2079
POP  DE
LD   E,L
LD   A,(LE838)
OR   A
LD   A,(LE82E)
JR   NZ,L5180
ADD  A,D
RET  C
JR   L5182
 
.L5180
SUB  D
RET  C
.L5182
LD   C,A
LD   HL,LE835
SUB  (HL)
RET  C
LD   C,A
AND  &F8
LD   B,A
LD   A,C
AND  &07
CP   &04
LD   A,B
JR   C,L5196
ADD  A,&08
.L5196
CP   &18
RET  C
LD   (LE836),A
LD   HL,LE834
ADD  A,(HL)
RET  C
CP   &E8
JR   NC,L5202
LD   A,(LE839)
OR   A
LD   A,(LE82F)
JR   NZ,L51B2
ADD  A,E
RET  C
JR   L51B4
 
.L51B2
SUB  E
RET  C
.L51B4
SUB  &04
RET  C
CP   &08
RET  C
LD   (LE837),A
ADD  A,&07
RET  C
CP   &A8
JR   NC,L5202
LD   BC,(LE836)
CALL calcPixelAddress
LD   A,(LE833)
LD   C,A
.L51CF
PUSH HL
DI
LD   A,L
OUT  (VDPaddress),A
LD   A,H
OUT  (VDPaddress),A
PUSH HL
POP  HL
LD   B,&08
.L51DB
IN   A,(VDPdata)
OR   A
JR   Z,L51E4
POP  HL
EI
SCF
RET
 
.L51E4
INC  L
LD   A,L
AND  &07
JR   NZ,L51F6
LD   A,L
DEC  A
AND  &F8
LD   L,A
OUT  (VDPaddress),A
INC  H
LD   A,H
OUT  (VDPaddress),A
NOP
.L51F6
DJNZ L51DB
EI
POP  HL
LD   A,L
ADD  A,&08
LD   L,A
DEC  C
JR   NZ,L51CF
RET
 
.L5202
SCF
RET
 
.L5204
LD   (LE82E),BC
.L5208
LD   A,(IX+4)
AND  &03
INC  A
LD   (IY+25),A
ADD  A,A
LD   C,A
LD   B,&00
LD   HL,rangePointers
ADD  HL,BC
LD   A,(HL)
INC  HL
LD   H,(HL)
LD   L,A
LD   B,(HL)
INC  HL
.L521F
LD   A,(LE82E)
SUB  (HL)
JR   C,L522A
CP   &18
CALL NC,L523A
.L522A
LD   A,(LE82E)
ADD  A,(HL)
JR   C,L5235
CP   &E8
CALL C,L523A
.L5235
INC  HL
INC  HL
DJNZ L521F
RET
 
.L523A
PUSH BC
PUSH HL
LD   C,A
LD   A,(LE82F)
INC  HL
SUB  (HL)
JR   C,L5248
CP   &08
JR   NC,L524A
.L5248
LD   A,&08
.L524A
LD   B,A
LD   A,(LE82F)
ADD  A,(HL)
JR   C,L5255
CP   &A8
JR   C,L5257
.L5255
LD   A,&A7
.L5257
LD   D,A
LD   E,C
CALL L372B
POP  HL
POP  BC
RET
 
.L525F
PUSH BC
LD   A,C
SUB  &18
LD   E,&FF
CALL multAxE
LD   A,&CF
CALL L2079
POP  AF
PUSH HL
SUB  &08
LD   E,&7F
CALL multAxE
LD   A,&9F
CALL L2079
LD   A,L
POP  BC
LD   B,A
RET
 
.doHomeCursor
LD   A,(spaceType)
OR   A
JR   Z,L52A4
LD   BC,(LEEC3)
LD   A,(currentScreen)
CP   &06
JR   NZ,L5298
CALL L4F09
CALL L540D
JR   L52A2
 
.L5298
CP   &04
JR   NZ,L52A2
CALL L4EEC
CALL L540D
.L52A2
JR   L52CD
 
.L52A4
LD   A,(currentSystem)
LD   (hyperSystem),A
LD   A,(currentScreen)
CP   &06
JR   NZ,L52C8
LD   A,(currentSystem)
LD   HL,LE83C
CP   (HL)
JR   Z,L52C3
XOR  A
LD   (currentScreen),A
CALL L4F64
JR   L52C6
 
.L52C3
CALL L53ED
.L52C6
JR   L52CD
 
.L52C8
CP   &04
CALL Z,L53FD
.L52CD
RET
 
.L52CE
LD   A,(LE70B)
OR   A
RET  Z
LD   A,(currentScreen)
CP   &04
JR   NZ,L52EE
LD   A,(LE82D)
OR   A
JR   NZ,L52E8
CALL L5314
CALL L53FD
JR   L52EC
 
.L52E8
XOR  A
LD   (LE82D),A
.L52EC
JR   L52F4
 
.L52EE
CALL L538B
CALL L53ED
.L52F4
CALL clearLower
LD   A,(hyperSystem)
CALL decodeName
LD   HL,decodeBuf
RST  &08                ; print it
LD   HL,Tcolon
RST  &08                ; print it
CALL L6141
LD   C,L
LD   L,H
LD   H,&00
LD   A,&40
RST  &18                ; Print Number
LD   HL,L567B
RST  &08                ; print it
RET
 
.L5314
LD   HL,(LE709)
LD   A,L
ADD  A,&07
LD   C,A
LD   A,H
ADD  A,&08
LD   B,A
CALL L525F
JP   L5325
 
.L5325
LD   (LE61B),BC
LD   HL,&FFFF
LD   (LE613),HL
LD   (LE615),HL
INC  HL
LD   (LE617),HL
LD   (LE619),HL
CALL copyGalaxynfo
.L533C
PUSH BC
CALL L4C80
LD   DE,(LE61B)
CALL L205D
LD   E,A
PUSH HL
LD   BC,(LE613)
OR   A
SBC  HL,BC
LD   BC,(LE615)
SBC  A,C
POP  HL
POP  BC
JR   NC,L5366
LD   (LE613),HL
LD   (LE615),DE
LD   A,B
NEG
LD   (hyperSystem),A
.L5366
PUSH BC
PUSH HL
LD   BC,(LE617)
OR   A
SBC  HL,BC
LD   BC,(LE619)
SBC  A,C
POP  HL
POP  BC
JR   C,L5385
LD   (LE617),HL
LD   (LE619),DE
LD   A,B
NEG
LD   (LE83D),A
.L5385
DJNZ L533C
LD   A,(LE83D)
RET
 
.L538B
LD   HL,(LE709)
LD   A,L
ADD  A,&07
LD   C,A
LD   A,H
ADD  A,&08
LD   B,A
CALL L4F37
LD   (LE61B),BC
LD   HL,&FFFF
LD   (LE613),HL
LD   (LE615),HL
LD   IX,(LEFA4)
LD   A,(LE832)
LD   B,A
.L53AE
PUSH BC
PUSH IX
LD   A,(IX+0)
CALL decodeSystem
LD   DE,(LF751)
LD   BC,(LE61B)
CALL L205D
EX   DE,HL
PUSH IY
POP  HL
OR   A
LD   BC,(LE613)
SBC  HL,BC
LD   H,D
LD   L,E
LD   BC,(LE615)
SBC  HL,BC
POP  IX
POP  BC
JR   NC,L53E8
LD   (LE613),IY
LD   (LE615),DE
LD   A,(IX+0)
LD   (hyperSystem),A
.L53E8
INC  IX
DJNZ L53AE
RET
 
.L53ED
LD   A,(hyperSystem)
CALL decodeSystem
LD   BC,(LF751)
CALL L4F09
JP   L540D
 
.L53FD
LD   A,(hyperSystem)
CALL decodeSystem
LD   BC,(LF751)
CALL L4EEC
JP   L540D
 
.L540D
LD   A,C
SUB  &07
LD   L,A
LD   A,B
SUB  &08
LD   H,A
LD   (LE709),HL
.L5418
DI
CALL L73A6
EI
RET
 
.L541E
CALL L5314
CALL L53FD
LD   A,&AE                ; XOR (HL) opcode
LD   (L37BF+1),A          ; XOR opcode poked into plot pixel routine to unplot
LD   A,(LE709)
ADD  A,&07
LD   (LF769),A
LD   (LF76F),A
LD   A,(LE70A)
ADD  A,&10
LD   (LF76B),A
LD   (LF771),A
LD   A,&0F
LD   (LE83E),A
.L5444
LD   A,(LE83E)
OR   A
JP   Z,setPlotting
LD   B,&01
.L544D
PUSH BC
LD   HL,LE83E
BIT  0,(HL)
JR   Z,L5468
LD   A,(LF769)
LD   C,A
LD   A,(LF76B)
LD   B,A
LD   A,(LF76F)
LD   E,A
LD   A,(LF76B)
LD   D,A
CALL L372B
.L5468
LD   HL,LE83E
BIT  1,(HL)
JR   Z,L5482
LD   A,(LF76F)
LD   C,A
LD   A,(LF76B)
LD   B,A
LD   A,(LF76F)
LD   E,A
LD   A,(LF771)
LD   D,A
CALL L372B
.L5482
LD   HL,LE83E
BIT  2,(HL)
JR   Z,L549C
LD   A,(LF76F)
LD   C,A
LD   A,(LF771)
LD   B,A
LD   A,(LF769)
LD   E,A
LD   A,(LF771)
LD   D,A
CALL L372B
.L549C
LD   HL,LE83E
BIT  3,(HL)
JR   Z,L54B6
LD   A,(LF769)
LD   C,A
LD   A,(LF771)
LD   B,A
LD   A,(LF769)
LD   E,A
LD   A,(LF76B)
LD   D,A
CALL L372B
.L54B6
POP  BC
DEC  B
JR   NZ,L54C4
PUSH AF
LD   DE,2000
.L54BE
DEC  DE
LD   A,D
OR   E
JR   NZ,L54BE
POP  AF
.L54C4
JP   P,L544D
LD   A,(LF76B)
ADD  A,&F0
JR   NC,L54D2
CP   &08
.L54D0
JR   NC,L54D9
.L54D2
LD   A,&07
LD   HL,LE83E
RES  0,(HL)
.L54D9
LD   (LF76B),A
LD   A,(LF76F)
ADD  A,&10
JR   C,L54E7
CP   &E8
JR   C,L54EE
.L54E7
LD   A,&E8
LD   HL,LE83E
RES  1,(HL)
.L54EE
LD   (LF76F),A
LD   A,(LF771)
ADD  A,&10
JR   C,L54FC
CP   &A8
JR   C,L5503
.L54FC
LD   A,&A8
LD   HL,LE83E
RES  2,(HL)
.L5503
LD   (LF771),A
LD   A,(LF769)
ADD  A,&F0
JR   NC,L5511
CP   &18
JR   NC,L5518
.L5511
LD   A,&17
LD   HL,LE83E
RES  3,(HL)
.L5518
LD   (LF769),A
JP   L5444
 
.setPlotting
LD   A,&B6                      ; OR (HL) opcode
LD   (L37BF+1),A                ; OR opcode poke into plot pixel routine to set plotting
RET
 
.L5524
LD   A,(hyperFuel)
OR   A
RET  Z
LD   A,&FF
LD   (colFlag),A
LD   (LE602),A
LD   HL,circleCoords
LD   B,&13
.L5536
PUSH BC
LD   E,(HL)
INC  HL
LD   C,(HL)
INC  HL
PUSH HL
LD   A,(hyperFuel)
CALL multAxE
RL   L
RL   H
LD   L,H
LD   H,scaleTable>8
LD   E,C
LD   C,(HL)
LD   A,(hyperFuel)
CALL multAxE
RL   L
RL   H
LD   B,H
LD   HL,LE603
LD   D,B
LD   E,C
CALL L5584
LD   A,C
NEG
LD   E,A
EX   AF,AF'
LD   D,B
CALL L5584
LD   E,C
LD   A,B
NEG
LD   D,A
PUSH AF
CALL L5584
EX   AF,AF'
LD   E,A
POP  AF
LD   D,A
CALL L5584
XOR  A
LD   (LE602),A
POP  HL
POP  BC
DJNZ L5536
XOR  A
LD   (colFlag),A
RET
 
.L5584
PUSH BC
PUSH HL
LD   A,&80
ADD  A,E
LD   C,A
LD   A,&58
ADD  A,D
LD   B,A
PUSH BC
LD   A,(LE602)
OR   A
JR   NZ,L559B
LD   E,(HL)
INC  HL
LD   D,(HL)
CALL L372B
.L559B
POP  DE
POP  HL
POP  BC
LD   (HL),E
INC  HL
LD   (HL),D
INC  HL
RET
 
.L55A3
LD   A,(currentScreen)
CP   &04
RET  NZ
XOR  A
LD   (LE70B),A
CALL clearLower
LD   HL,TplanetName
RST  &08                ; print it
LD   DE,&415A
LD   C,&0A
CALL inputString
LD   A,&FF
LD   (LE70B),A
RET  NC
LD   HL,keyBuffer
LD   A,(HL)
OR   A
RET  Z
.L55C8
INC  HL
LD   A,(HL)
OR   A
JR   Z,L55D2
ADD  A,&20
LD   (HL),A
JR   L55C8
 
.L55D2
CALL copyGalaxynfo
.L55D5
PUSH BC
CALL decodeSystemInfo
LD   HL,fragBuffer
CALL decodeFragment
LD   HL,decodeBuf
LD   DE,keyBuffer
CALL stringComp
JR   Z,L55F6
POP  BC
DJNZ L55D5
LD   HL,keyBuffer
RST  &08                ; print it
LD   HL,TnotFound
RST  &08                ; print it
RET
 
.L55F6
POP  AF
DEC  A
CPL
LD   (hyperSystem),A
CALL L53FD
LD   A,&FF
LD   (LE82D),A
.L5604
JP   L52CE
 
.copyGalaxynfo
LD   HL,galaxyInfo
LD   DE,systemInfo
LD   BC,&0006
LDIR
RET
 
; so some predictable mangling to produce the next 6 bytes of system info
.calculateNext
LD   HL,(systemInfo)
LD   DE,(systemInfo+2)
LD   BC,(systemInfo+4)
ADD  HL,DE
ADD  HL,BC
EX   DE,HL
LD   A,B
LD   B,D
LD   D,A
LD   A,C
LD   C,E
LD   E,A
ADD  HL,DE
ADD  HL,BC
EX   DE,HL
LD   A,B
LD   B,D
LD   D,A
LD   A,C
LD   C,E
LD   E,A
ADD  HL,DE
ADD  HL,BC
EX   DE,HL
LD   A,B
LD   B,D
LD   D,A
LD   A,C
LD   C,E
LD   E,A
ADD  HL,DE
ADD  HL,BC
LD   (systemInfo),DE
LD   (systemInfo+2),BC
LD   (systemInfo+4),HL
RET
 
; compresssed data for a crosshair sprite
; 0000000100000000
; 0000000100000000
; 0000000100000000
; 0000000100000000
; 0000000100000000
; 0000000000000000
; 0000000000000000
; 1111100000111110
; 0000000000000000
; 0000000000000000
; 0000000100000000
; 0000000100000000
; 0000000100000000
; 0000000100000000
; 0000000100000000
; 0000000000000000
.crosshairData
DB   &05,&01               ; first byte count 2nd byte data
DB   &02,&00
DB   &01,&F8
DB   &02,&00
DB   &05,&01
DB   &08,&00
DB   &01,&3E
DB   &08,&00
DB   &00                   ; end of table marker

.spriteInit
DB   &DF,&00,cross,&05     ; initial crosshair sprite attributes
DB   &DF,&00,&00,&08
DB   &DF,&00,&04,&08
DB   &DF,&00,&08,&08
DB   &DF,&00,&0C,&08

.Tgalaxy
DB   &11
DB   &16
DS   "Galaxy #"
DB   &00
DB   &FF
.Tcolon
DB   ":",&20
DB   &00
.L567B
DS   " Light Years"
DB   &00
.L5688
DB   &0A
DB   &16
DS   "Local Nagivation Chart"
DB   &00
DB   &FF
.TplanetName
DZ   "Planet name ? "

.TnotFound
DZ   " not found."

.L56BD
DB   &64,&62,&5E,&57,&4D,&40,&32,&22,&11
.L56C6
DB   &00,&11,&22,&32,&40,&4D,&57,&5E,&62

.TmarketPrices
DC   " Market Prices"
.TquantityOf
DC   "Quantity of "
DC   "Amount to sell"
.TdataOn
DC   "Data On "
.Tbillion
DC   " Billion"
.TMcr
DC   " M CR"
.Tkm
DC   " km"
.LTnoCargo
DC   "* No Cargo To Sell *"
.TfullStop
DC   ". "
.TtankFull
DC   "Tank Already Full."
.TlauncherFull
DC   "Missile launcher full."
.highlander
DC   "Only 1 "
.Tallowed
DC   " allowed"
.TtoPurchase
DB   &05
DB   &16
DC   "Item to purchase"
DB   &FF
.TallLasers
DC   "All lasers mounted."
.Tposition
DC   "Position ("
.TinvalidPos
DC   "Invalid position."
.TinvalidItem
DC   "Invalid item."
.TequipShip
DB   &10
DB   &01
DC   "Equip Ship"
DB   &FF
.TnoFuel
DC   "No fuel available!"
.TwitchSpace
DC   "Witchspace"

.Tcommander
DC   "Commander "

.Tfblr
DS   "FBLR"
.Tqm2
DC   " ? "
.TcantAfford
DC   "Insufficient credits!"
.TspCresits
DC   " credits, "
.TcreditsLeft
DC   " credits left."
.TnoSpace
DC   "Insufficient cargo space!"
.TnoStock
DC   "Insufficient stock!"
.Ttonnes
DC   " tonnes."
.TlightYears
DC   " Light Years"
.Tcredits
DC   " Credits"
.Tsell
DC   "Sell"
.TnastyShip
DB   &05
DB   &0F
DC   "There's a mean, nasty, vicious"
DB   &05
DB   &10
DC   "ship out there!"
DB   &FF

.Tproduct
DB   &05,&02
DC   "Product"
DB   &15
DB   &02
DC   "Unit    Quantity"
DB   &15
DB   &03
DC   "Price   For Sale"
DB   &FF

.productColours
DB   &05,&01,&20,&01,&91
DB   &05,&02,&20,&02,&21
DB   &05,&04,&0C,&11,&D1
DB   &15,&04,&05,&11,&71
DB   &1F,&04,&04,&11,&51
DB   &FF

.inventoryText
DB   &10,&01
DC   "Inventory"
DB   &05,&03
DC   "Fuel:"
DB   &05,&04
DC   "Cash:"
DB   &05,&05
DC   "Hold:"
DB   &FF

.InventoryColours
DB   &10,&01,&09,&01,&91
DB   &05,&03,&05,&03,&21
DB   &0B,&03,&11,&03,&51
DB   &05,&07,&0C,&0E,&D1
DB   &12,&07,&05,&0E,&71
DB   &FF

.cargoTest
DB   &10,&01
DC   "Sell Cargo"
DB   &05,&03
DC   "Product      Cargo Price"
DB   &FF

.cargoColours
DB   &10,&01,&0A,&01,&91
DB   &05,&03,&18,&01,&21
DB   &05,&05,&0C,&10,&D1
DB   &12,&05,&05,&10,&71
DB   &19,&05,&04,&10,&51
DB   &FF

.TplanetText
DB   &05
DB   &03
DC   "Distance:"
DB   &05
DB   &05
DC   "Economy:"
DB   &05
DB   &06
DC   "Government:"
DB   &05
DB   &07
DC   "Tech. Level:"
DB   &05
DB   &09
DC   "Population:"
DB   &05
DB   &0C
DC   "Gross Productivity:"
DB   &05
DB   &0D
DC   "Average Radius:"
DB   &FF

.TplanetColours
DB   &05,&01,&21,&01,&91
DB   &05,&03,&13,&0F,&21
DB   &0F,&03,&16,&01,&71
DB   &12,&05,&14,&03,&71
DB   &11,&09,&0C,&01,&71
DB   &05,&0A,&21,&01,&51
DB   &19,&0C,&0A,&02,&71
DB   &05,&0F,&21,&05,&D1
DB   &FF

.Tstatus
DB   &05
DB   &03
DC   "Present System    :"
DB   &05
DB   &04
DC   "Hyperspace System :"
DB   &05
DB   &05
DC   "Condition         :"
DB   &05
DB   &06
DC   "Fuel:"
DB   &05
DB   &07
DC   "Cash:"
DB   &05
DB   &08
DC   "Legal Status:"
DB   &05
DB   &09
DC   "Rating:"
DB   &05
DB   &0B
DC   "Equipment:"
DB   &FF
 
.colourStatus
DB   &05,&01,&20,&01,&91
DB   &05,&03,&13,&09,&21
DB   &18,&03,&0A,&02,&71
DB   &0B,&06,&14,&02,&71
DB   &13,&08,&08,&01,&71
DB   &0D,&09,&14,&01,&71
DB   &05,&0C,&21,&08,&D1
DB   &FF

.colourMarketplace
DB   &05,&01,&20,&01,&91
DB   &05,&03,&02,&0E,&D1
DB   &08,&03,&13,&0E,&21
DB   &1E,&03,&06,&0E,&71
Db   &FF

.Nmillion
DD   1000000
.Nthousand 
DD   1000
.None
DD   1
.N20million
DD   20000000
.N35million
DD   35000000

.conditionList
DC   "Green"
DC   "Red"
DC   "Red"
.statusList
DC   "Clean"
DC   "Offender"
DC   "Fugitive"
.weightsList
DC   "t"
DC   "kg"
DC   "g"

.L5AC3
DB   &04,&0C,&05,&0D

.restart30
LD   HL,Tqm2
RST  &08                ; print it
LD   DE,&3039
LD   C,&04
CALL inputString
RET  NC
LD   DE,keyBuffer
LD   A,(DE)
OR   A
SCF
RET  Z
LD   HL,&0000
.L5ADE
LD   A,(DE)
OR   A
JR   Z,L5AF4
LD   A,&0A
PUSH DE
CALL multAxHL
POP  DE
LD   A,(DE)
SUB  &30
INC  DE
ADD  A,L
LD   L,A
JR   NC,L5AF2
INC  H
.L5AF2
JR   L5ADE
 
.L5AF4
LD   A,H
OR   L
SCF
RET
 
.showItemPrice
LD   E,A                ; item number
ADD  A,&04
LD   C,A
LD   B,&05
CALL csrBC              ; print at row (item+4), column 5
LD   A,E
LD   HL,commoditiesList
RST  &10                ; print a Ath item on the list
LD   A,&15
CALL tabA               ; move to column 21
LD   A,E
ADD  A,A
ADD  A,A                ; item number x 4
LD   C,A
LD   B,&00
LD   HL,stockList
ADD  HL,BC              ; presumably each slock item is 4 bytes
PUSH HL
PUSH HL                 ; save the list pointer twice
LD   L,(HL)             ; get the price
LD   H,B                ; extend to 16 bits as B is zero
ADD  HL,HL
ADD  HL,HL              ; x4 to extend price range ?
LD   C,L
LD   L,H
LD   H,B                ; HLC is now the price 
LD   A,&C5              ; print the price as 1 DP
PUSH DE
RST  &18                ; Print Number
POP  DE
POP  HL                 ; get the stock pointer back 
INC  HL
LD   A,(HL)
OR   A
LD   A,&1F              ; column 31 for stock numbers
JR   NZ,L5B2C
INC  A                  ; column 32 if no stock
.L5B2C
CALL tabA
LD   A,(HL)
OR   A                  ; check the stock again
JR   Z,noStock          ; none, jmp ahead to print "-" and exit
LD   C,A
PUSH HL
LD   HL,&0000
LD   A,&82              ; print the amount in stock
PUSH DE
RST  &18                ; Print Number
POP  DE
POP  HL                 ; retieve the stocklist pointer again
INC  HL                
LD   A,(HL)             ; get the weight type
LD   HL,weightsList
RST  &10                ; and print
JR   L5B49              ; then exti via tidy up
 
.noStock
LD   A,"-"
RST  &00                ; print A
.L5B49
LD   A,E
POP  IX                 ; IX now has the stock pointer for the current item
RET
 
.L5B4D
LD   A,B
PUSH AF
PUSH BC
PUSH DE
PUSH HL
PUSH AF
LD   B,&05
CALL csrBC
POP  AF
LD   HL,commoditiesList
RST  &10
LD   A,&12
CALL tabA
POP  HL
POP  DE
LD   A,&02
.L5B66
PUSH HL
PUSH DE
OR   A
EX   DE,HL
LD   BC,&03E8
SBC  HL,BC
EX   DE,HL
LD   BC,&0000
SBC  HL,BC
POP  DE
POP  HL
JR   C,L5B81
PUSH AF
CALL L211C
POP  AF
DEC  A
JR   L5B66
 
.L5B81
LD   (LE73D),A
LD   (LE73E),DE
PUSH AF
LD   C,E
LD   L,D
LD   H,&00
LD   A,&83
RST  &18                ; Print Number
POP  AF
LD   HL,weightsList
RST  &10
POP  BC
POP  AF
INC  C
RET

.showPrices 
LD   A,(currentScreen)
CP   &02      
RET  Z                   ; already on the prices screen so quit
LD   A,(spaceType)
OR   A
RET  NZ                  ; no prices while in witchspace
CALL resetView
CALL printMarketView
XOR  A
CALL showPriceList
LD   A,&02
LD   (currentScreen),A   ; set the current screen is market prices
RET
 
.showPriceList
CP   &11                 ; 17 items available
RET  Z
CALL showItemPrice
INC  A
JR   showPriceList
 
.doBuyScreen
CALL testFlight          ; will not return if test fails
CALL resetView
CALL printMarketView
XOR  A
LD   (buyItemNo),A
.L5BCA
LD   A,(buyItemNo)
CALL showItemPrice       ; returns with IX pointing to the stock list
LD   A,(IX+1)            ; 2nd byte is the stock amount
OR   A
JR   Z,L5BF5             ; there is no stock, so skip 
.L5BD6
LD   BC,&0516
CALL csrBC
LD   HL,TquantityOf
RST  &08                 ; print it
LD   A,(buyItemNo)
LD   HL,commoditiesList
RST  &10
RST  &30
JP   NC,L5C8E
JR   NZ,L5BF0
SCF
JR   L5BF3
 
.L5BF0
CALL L5C01
.L5BF3
JR   NC,L5BD6
.L5BF5
LD   HL,buyItemNo
INC  (HL)
LD   A,(HL)
CP   &11
JR   NZ,L5BCA
JP   L5C8E
 
.L5C01
LD   A,H
OR   A
JR   NZ,L5C0B
LD   A,(IX+1)
.L5C08
CP   L
JR   NC,L5C12
.L5C0B
LD   HL,TnoStock
OR   A
JP   L5C88
 
.L5C12
LD   A,L
LD   (LE752),A
LD   L,(IX+0)
ADD  HL,HL
ADD  HL,HL
CALL multAxHL
EX   DE,HL
LD   HL,(credits)
LD   A,(credits+2)
OR   A
SBC  HL,DE
SBC  A,&00
JR   NC,L5C33
LD   HL,TcantAfford
OR   A
JP   L5C88
 
.L5C33
PUSH AF
PUSH HL
CALL L63BA
LD   A,(IX+2)
CALL L639C
LD   BC,(LE752)
CALL L63E0
LD   A,(LEB64)
OR   A
JP   P,L5C55
POP  HL
POP  AF
LD   HL,TnoSpace
OR   A
JP   L5C88
 
.L5C55
EX   DE,HL
LD   A,(buyItemNo)
ADD  A,A
ADD  A,A
LD   C,A
LD   HL,cargoSpace
ADD  HL,BC
EX   DE,HL
LD   A,(LE752)
LD   C,A
LD   A,(IX+1)
SUB  C
LD   (IX+1),A
.L5C6C
PUSH DE
PUSH HL
CALL longAdd
POP  HL
POP  DE
DEC  C
JR   NZ,L5C6C
LD   A,(LE752)
CALL L63AA
POP  HL
.L5C7D
POP  AF
LD   (credits),HL
LD   (credits+2),A
CALL L612D
SCF
.L5C88
PUSH AF
CALL momentaryPrint
POP  AF
RET
 
.L5C8E
LD   A,(currentScreen)
CP   &05
RET  Z
CALL resetView
LD   IX,inventoryColours
RST  &28                ; block fill using table at IX
LD   HL,inventoryText
RST  &20                ; print string(s) at given position
LD   BC,&0B03
CALL csrBC
CALL printFuel

LD   BC,&0B04
CALL csrBC
CALL printCredits

LD   HL,Tcredits
RST  &08                ; print it
LD   BC,&0B05
CALL csrBC
CALL L6051

LD   HL,Ttonnes
RST  &08                ; print it

LD   IX,cargoSpace
LD   BC,&0007
.L5CCA
LD   E,(IX+0)
LD   D,(IX+1)
LD   L,(IX+2)
LD   H,(IX+3)
LD   A,E
OR   D
OR   L
OR   H
CALL NZ,L5B4D
LD   DE,&0004
ADD  IX,DE
INC  B
LD   A,B
CP   &12
JR   NZ,L5CCA
LD   A,&05
LD   (currentScreen),A
RET
 
.doSellScreen
CALL testFlight          ; will not return if test fails
LD   HL,cargoSpace
XOR  A
LD   B,&44
.L5CF7
OR   (HL)
INC  HL
DJNZ L5CF7
OR   A
JR   NZ,L5D07
CALL clearLower
LD   HL,LTnoCargo
JP   momentaryPrint
 
.L5D07
CALL resetView
LD   IX,cargoColours
RST  &28                ; block fill using table at IX
LD   HL,cargoTest
RST  &20                ; print string(s) at given position
LD   IX,cargoSpace
LD   BC,&0005
.L5D1A
LD   E,(IX+0)
LD   D,(IX+1)
LD   L,(IX+2)
LD   H,(IX+3)
LD   A,E
OR   D
OR   L
OR   H
JR   Z,L5D64
CALL L5B4D
PUSH BC
LD   A,&18
CALL tabA
LD   A,B
ADD  A,A
ADD  A,A
LD   E,A
LD   D,&00
LD   HL,stockList
ADD  HL,DE
LD   A,(HL)
LD   L,A
LD   H,D
ADD  HL,HL
ADD  HL,HL
LD   (LE740),HL
LD   C,L
LD   L,H
LD   H,D
LD   A,&C5
RST  &18                ; Print Number
LD   A,&1E
CALL tabA
LD   HL,Tsell
RST  &08                ; print it
CALL QyesNo
POP  BC
JP   NC,L5C8E
PUSH BC
CP   &59
CALL Z,L5D72
POP  BC
.L5D64
LD   DE,&0004
ADD  IX,DE
INC  B
LD   A,B
CP   &11
JR   NZ,L5D1A
JP   L5C8E
 
.L5D72
LD   HL,(LE740)
LD   A,&13
CALL multAxHL
LD   A,&14
CALL L2079
LD   (LE742),HL
LD   BC,(LE73E)
PUSH BC
LD   DE,(LE742)
.L5D8B
LD   HL,(credits)
LD   A,(credits+2)
ADD  HL,DE
ADC  A,&00
LD   (credits),HL
LD   (credits+2),A
DEC  BC
LD   A,B
OR   C
JR   NZ,L5D8B
LD   A,(LE73D)
CALL L639C
POP  BC
.L5DA6
PUSH BC
PUSH HL
PUSH IX
POP  DE
CALL longSub
POP  HL
POP  BC
DEC  BC
LD   A,B
OR   C
JR   NZ,L5DA6
CALL L612D
JP   momentaryPrint
 
.doEquipScreen
CALL testFlight          ; will not return if test fails
CALL resetView
LD   IX,colourMarketplace
RST  &28                ; block fill using table at IX
LD   HL,TequipShip
RST  &20                ; print string(s) at given position
LD   B,&00
LD   HL,DitemTechLevel
LD   A,(techLevel)
.L5DD2
CP   (HL)
JR   C,L5DD9
INC  B
INC  HL
JR   L5DD2
 
.L5DD9
LD   A,B
LD   (localAvail),A    ; the number of items available at the tech level
LD   IX,DpriceList
LD   C,&03             ; star on row 3 
.L5DE3
PUSH BC
PUSH BC
LD   B,&05
CALL csrBC
POP  BC
DEC  C
DEC  C
LD   A,C                ; item number is 2 less than the row number so atart from 1
PUSH AF
LD   HL,&0000
LD   A,&82
RST  &18                ; Print Number H L C
LD   HL,TfullStop
RST  &08                ; print it
POP  AF
DEC  A                  ; list is zero biased so decrement again to start from entry zero
LD   HL,TshipSupplies
RST  &10                ; print from list
LD   A,&1E
CALL tabA
.L5E04
LD   C,(IX+0)
LD   L,(IX+1)
LD   A,C
OR   L
JR   NZ,L5E12           ; fuel price entry is zero 
LD   A,(LE724)
LD   C,A                ; local fuel price ?
.L5E12
LD   H,&00
LD   A,&C6
RST  &18                ; Print Number
POP  BC
.L5E18
INC  IX
INC  IX
INC  C
DJNZ L5DE3              ; only items 1 to "B" get printed
.L5E1F
LD   HL,TtoPurchase
RST  &20                ; print string(s) at given position
RST  &30                ; input a number
JP   NC,statusPage
JP   Z,statusPage
LD   A,H
OR   A
JR   NZ,L5E63           ; anything non zero in H is too big
LD   A,L
OR   A
JR   Z,L5E63            ; there is no item zero
LD   HL,localAvail
CP   (HL)
JR   Z,L5E3A            ; at the limit is fine
JR   NC,L5E63           ; above it isn't
.L5E3A
DEC  A
JR   NZ,L5E43           ; didn't select fuel
CALL L5E6B              ; buy fuel, IF possible
JP   L5E69              ; jump to the menu re-entry point
 
.L5E43
DEC  A
JR   NZ,L5E4C           ; didn't select missiles
CALL L5ED1              ; buy missiles if possible
JP   L5E69              ; jump to the menu re-entry point
 
.L5E4C
INC  A
LD   C,A
LD   B,&00
LD   HL,hyperFuel
ADD  HL,BC
LD   A,(HL)
OR   A
JP   P,L5E5E
CALL L5EFE
JR   L5E61              ; jump to the jump to the menu re-entry point
 
.L5E5E
CALL L5EE4
.L5E61
JR   L5E69              ; jump to the menu re-entry point
 
.L5E63
LD   HL,TinvalidItem
CALL momentaryPrint
.L5E69
JR   L5E1F             ; await onother purchace
 
.L5E6B
LD   A,(missionStatus)
AND  &F0
CP   &30
JR   NZ,L5E7D
CALL doBeep
LD   HL,TnoFuel
JP   momentaryPrint
 
.L5E7D
LD   A,(hyperFuel)
SUB  &46
NEG
.L5E84
JR   NZ,L5E8B
LD   HL,TtankFull
JR   L5ECD
 
.L5E8B
PUSH AF
LD   DE,(LE724)
CALL multAxE
LD   C,L
LD   L,H
LD   H,&00
CALL L20C6
LD   E,C
LD   D,L
LD   HL,(credits)
LD   A,(credits+2)
OR   A
SBC  HL,DE
SBC  A,&00
JR   NC,L5EBB
POP  AF
LD   A,(credits)
LD   E,&0A
CALL multAxE
LD   A,(LE724)
CALL L2079
LD   A,L
JR   L5E8B
 
.L5EBB
LD   (credits),HL
LD   (credits+2),A
POP  AF
LD   HL,hyperFuel
ADD  A,(HL)
LD   (HL),A
CALL printCredits
LD   HL,TcreditsLeft
.L5ECD
CALL momentaryPrint
RET
 
.L5ED1
LD   HL,missiles
LD   A,(HL)
CP   &04
JR   NZ,L5EDF
LD   HL,TlauncherFull
JP   momentaryPrint
 
.L5EDF
LD   A,&01              ; item 1 on the priice list is missiles
JP   buyIt
 
.L5EE4
LD   A,(HL)
OR   A
JR   NZ,L5EEF
PUSH BC
LD   A,C
CALL buyIt
POP  BC
RET
 
.L5EEF
LD   HL,highlander      ; there can be only one :)
RST  &08                ; print it
LD   A,C
LD   HL,TshipSupplies
RST  &10
LD   HL,Tallowed
JP   momentaryPrint
 
.L5EFE
LD   (laserPoints),HL
AND  &0F
CP   &0F
JR   NZ,L5F0D
LD   HL,TallLasers
JP   momentaryPrint
 
.L5F0D
LD   B,&00
.L5F0F
OR   A
JR   Z,L5F18
INC  B
LD   E,A
DEC  A
AND  E
JR   L5F0F
 
.L5F18
LD   A,C
LD   (LF818),A
LD   A,B
CP   &03
JR   NZ,L5F28
LD   A,(HL)
CPL
AND  &0F
LD   C,A
JR   L5F85
 
.L5F28
LD   C,(HL)
LD   A,&04
SUB  B
LD   B,A
.L5F2D
PUSH BC
LD   HL,Tposition
RST  &08                ; print it
LD   HL,Tfblr
LD   DE,LE745
.L5F38
RR   C
JR   NC,L5F3F
INC  HL
JR   L5F38
 
.L5F3F
LD   A,(HL)
INC  HL
LD   (DE),A
INC  DE
RST  &00                ; print A
LD   A,B
DEC  A
LD   A,&2C
JR   NZ,L5F4C
LD   A,&29
.L5F4C
RST  &00                ; print A
DJNZ L5F38
LD   HL,Tqm2
RST  &08                ; print it
LD   DE,&415A
LD   C,&05
CALL inputString
POP  BC
RET  NC
LD   A,(keyBuffer)
OR   A
RET  Z
PUSH BC
LD   HL,LE745
LD   C,B
LD   B,&00
CPIR
JR   Z,L5F75
PUSH AF
LD   HL,TinvalidPos
CALL momentaryPrint
POP  AF
.L5F75
POP  BC
JR   NZ,L5F2D
LD   HL,Tfblr
LD   C,&01
.L5F7D
CP   (HL)
JR   Z,L5F85
INC  HL
SLA  C
JR   L5F7D
 
.L5F85
LD   HL,L5AC3
XOR  A
LD   (LE74D),A
LD   B,&04
.L5F8E
LD   A,(LF818)
CP   (HL)
JR   Z,L5FCD
PUSH HL
LD   E,(HL)
LD   D,&00
LD   HL,hyperFuel
ADD  HL,DE
LD   A,(HL)
AND  C
JR   Z,L5FCC
LD   (LE74E),HL
LD   A,(HL)
LD   (LE74D),A
LD   A,C
CPL
AND  (HL)
LD   (HL),A
LD   HL,DpriceList
ADD  HL,DE
ADD  HL,DE
LD   E,(HL)
INC  HL
LD   D,(HL)
LD   HL,(credits)
LD   A,(credits+2)
LD   (LE750),HL
LD   (LE752),A
ADD  HL,DE
ADC  A,&00
LD   (credits),HL
LD   (credits+2),A
POP  HL
JP   L5FD0
 
.L5FCC
POP  HL
.L5FCD
INC  HL
DJNZ L5F8E
.L5FD0
LD   HL,(laserPoints)
PUSH BC
PUSH HL
LD   A,(LF818)
CALL buyIt
POP  HL
POP  BC
JR   C,L5FE4
LD   A,(HL)
OR   C
LD   (HL),A
JR   L5FFA
 
.L5FE4
LD   A,(LE74D)
OR   A
JR   Z,L5FFA
LD   HL,(LE74E)
LD   (HL),A
LD   HL,(LE750)
LD   A,(LE752)
LD   (credits),HL
LD   (credits+2),A
.L5FFA
RET

; print the text at HL, then clear after a short delay 
.momentaryPrint
RST  &08                ; print it
CALL delay
JP   clearLower
 
.buyIt
EXX
LD   HL,DpriceList
ADD  A,A
LD   C,A
.L6008
LD   B,&00
ADD  HL,BC
LD   E,(HL)
.L600C
INC  HL
LD   D,(HL)
LD   HL,(credits)
LD   A,(credits+2)
SBC  HL,DE
SBC  A,B
JR   NC,L601E
LD   HL,TcantAfford
JR   L6031
 
.L601E
LD   (credits),HL
LD   (credits+2),A
EXX
BIT  7,(HL)
JR   NZ,L602A
INC  (HL)
.L602A
CALL printCredits
LD   HL,TcreditsLeft
OR   A
.L6031
PUSH AF
CALL momentaryPrint
POP  AF
RET
 
.printCredits
LD   A,(credits)
LD   HL,(credits+1)
LD   C,A
LD   A,&40
RST  &18                ; Print Number
RET
 
.printFuel
LD   A,(hyperFuel)
LD   C,A
LD   HL,&0000
LD   A,&40
RST  &18                ; Print Number
LD   HL,TlightYears
RST  &08                ; print it
RET
 
.L6051
CALL L63BA
LD   DE,(LEB61)
LD   HL,(LEB63)
CALL L20E1
LD   C,E
LD   L,D
.L6060
LD   H,&00
LD   A,&40
RST  &18                ; Print Number
RET
 
.printMarketView
LD   A,&01
LD   (PrintAddr+1),A
LD   A,(currentSystem)
CALL decodeName
SUB  &1C
NEG
SRL  A
CALL tabA
LD   HL,decodeBuf
RST  &08                ; print it
LD   HL,TmarketPrices
RST  &08                ; print it
LD   IX,productColours
RST  &28                ; block fill using table at IX
LD   HL,Tproduct
RST  &20                ; print string(s) at given position
RET
 
.resetView
LD   A,(currentView)
OR   A
JR   Z,L6097
CALL L60B1
JR   L60B0
 
.L6097
LD   HL,LE70B
LD   A,(HL)
OR   A
JR   Z,L60AA
LD   (HL),&00
LD   HL,spriteAttr
LD   B,&05
DI
CALL killSprite
EI
.L60AA
CALL clearCentre
CALL clearLower
.L60B0
RET
 
.L60B1
XOR  A
LD   (LEB02),A
LD   B,&20
LD   HL,spriteAttr
DI
CALL killSprite
EI
CALL fullScreenCLS
CALL clearLower
XOR  A
LD   (currentView),A
RET

; partial clear screen
; clear centre of the screen from row 1 to row 20, columns 3 to 28
  
.clearCentre
XOR  A
LD   (currentScreen),A
LD   HL,&0118                 ; pixel row 1 cell 3
LD   BC,&A01A                 ; 160 rows of 26 cells wide
XOR  A
CALL blockFill                ; clear the pixel data
LD   HL,&2118                 ; colour row 1 cell 2
LD   BC,&A01A                 ; 160 rows of 26 cells wide
LD   A,&F1
JP   blockfill                ; set the colours to white on black
 
.printRace
LD   BC,&050A
CALL csrBC
LD   A,"("
RST  &00                      ; print A
LD   A,(inhabitant)
OR   A
JP   M,printAlienRace         ; top bit set - non human
LD   HL,ThumanColony
RST  &08                      ; print it
RET
 
.printAlienRace
LD   A,(alienData)
RRA
RRA
PUSH AF
AND  &07                      ; decode bits 2 to 4
LD   HL,TalienSize            ; 3 sizes 5 blanks
RST  &10                      ; print item A from list
POP  AF
RRA
RRA
RRA
AND  &07                      ; decode bits 5 to 7
LD   HL,TalienColour          ; 6 colours 1 blank 1 from skin list ??
RST  &10                      ; print item A from list
LD   A,(systemCopy+3)
LD   HL,systemCopy+1
XOR  (HL)
AND  &07                      ; 6 skin types 2 blanks
PUSH AF
LD   HL,TalienSkin
RST  &10                      ; print item A from list
LD   A,(alienData)
AND  &03
POP  BC
ADD  A,B
AND  &07                      ; 8 creature types
LD   HL,TalienType
RST  &10                      ; print item A from list
LD   A,")"
RST  &00                      ; print A
RET
 
.L612D
LD   BC,&0516
CALL csrBC
CALL printCredits
LD   HL,TspCresits
RST  &08                      ; print it
CALL L6051
LD   HL,Ttonnes
RET
 
.L6141
LD   A,(spaceType)
OR   A
JR   NZ,L6153
LD   A,(currentSystem)
CALL decodeSystem
LD   DE,(LF751)
JR   L6157
 
.L6153
LD   DE,(LEEC3)
.L6157
LD   A,(hyperSystem)
CALL decodeSystem
LD   BC,(LF751)
JP   L2054
 
.L6164
LD   A,(missionStatus)
CP   &11
JR   NZ,L6170
CALL L9190
JR   L6175
 
.L6170
CP   &13
CALL Z,L91AA
.L6175
LD   A,(currentScreen)
CP   &01
RET  Z
CP   &04
JR   NZ,L6184
CALL L5314
JR   L6189
 
.L6184
CP   &06
CALL Z,L538B
.L6189
CALL resetView
LD   IX,TplanetColours
RST  &28                ; block fill using table at IX
LD   HL,TplanetText
RST  &20                ; print string(s) at given position
LD   A,&01
LD   (PrintAddr+1),A
LD   A,(hyperSystem)
CALL decodeName
SUB  &22
NEG
SRL  A
CALL tabA
LD   HL,TdataOn
RST  &08                ; print it
LD   HL,decodeBuf
RST  &08                ; print it
LD   BC,&0F03
CALL csrBC
CALL L6141
LD   C,L
LD   L,H
LD   H,&00
LD   A,&40
RST  &18                ; Print Number
LD   HL,TlightYears
RST  &08                ; print it
LD   BC,&1205
CALL csrBC
LD   DE,Tagricultural
LD   A,(economy)
CP   &04
JR   C,L61DA
SUB  &04
LD   DE,Tindustrial
.L61DA
LD   HL,TwealthList
RST  &10
EX   DE,HL
RST  &08                ; print it
LD   BC,&1206
CALL csrBC
LD   A,(government)
LD   HL,TgovernmentList
RST  &10
LD   BC,&1207
CALL csrBC
LD   A,(LF755)
LD   C,A
XOR  A
SBC  HL,HL
RST  &18                ; Print Number
LD   BC,&1109
CALL csrBC
LD   A,(LF755)
.L6204
LD   E,A
LD   A,(economy)
LD   D,A
CALL multDxE
SRL  A
ADD  A,&14
LD   C,A
LD   A,(systemCopy+2)
RRA
RRA
RRA
AND  &07
ADD  A,C
PUSH AF
LD   C,A
SBC  HL,HL
LD   A,&40
RST  &18                ; Print Number
LD   HL,Tbillion
RST  &08                ; print it
CALL printRace
LD   BC,&190C
CALL csrBC
LD   A,(government)
ADD  A,&08
LD   E,A
LD   D,A
CALL multDxE
LD   E,A
POP  AF
CALL multAxE
SRL  H
RR   L
SRL  H
RR   L
LD   C,L
LD   L,H
XOR  A
LD   H,A
RST  &18                ; Print Number
LD   HL,TMcr
RST  &08                ; print it
LD   BC,&190D
CALL csrBC
LD   BC,(systemCopy+3)
LD   L,B
XOR  A
LD   H,A
RST  &18                ; Print Number
LD   HL,Tkm
RST  &08                ; print it
LD   A,(missionStatus)
CP   &16
JR   NZ,L626D
LD   HL,TnastyShip
RST  &20                ; print string(s) at given position
JR   L6270
 
.L626D
CALL L9A4B
.L6270
LD   A,&01
LD   (currentScreen),A
RET
 
.statusPage
LD   A,(currentScreen)
CP   &03
RET  Z
CALL resetView
LD   IX,colourStatus
RST  &28                ; block fill using table at IX
LD   HL,Tstatus
RST  &20                ; print string(s) at given position
CALL printName
LD   BC,&1903           ; cursor to where system name will go
CALL csrBC
LD   A,(spaceType)
OR   A
JR   Z,L629C
LD   HL,TwitchSpace
JR   L62A5
 
.L629C
LD   A,(currentSystem)  ; not witchspace so decode the current
CALL decodeName         ; system name into the temp buffer for printing
LD   HL,decodeBuf
.L62A5
RST  &08                ; print it
LD   BC,&1904           ; cursor to where hyperspace system name will go
CALL csrBC
LD   A,(hyperSystem)
CALL decodeName
LD   HL,decodeBuf
RST  &08                ; print it
LD   BC,&1905           ; cursor to where condition will go
CALL csrBC
LD   A,(condition)
LD   HL,conditionList
PUSH AF
RST  &10                ; print Ath item on the list
DI
LD   A,&90
OUT  (VDPaddress),A
LD   A,&65
OUT  (VDPaddress),A     ; colour table location of the text just printed
POP  AF
OR   A
LD   A,&31              ; light Green text
JR   Z,L62D8            ; if contition zero
LD   A,&81              ; medium red
LD   (condColour),A
.L62D8
LD   B,&40              ; 40 bytes, 5 character cells worth
.L62DA
OUT  (VDPdata),A        ; set the colour of the text to match the status
NOP
nop
DJNZ L62DA
EI
LD   BC,&0B06           ; cursor to where fuel amount will go
CALL csrBC
CALL printFuel
LD   BC,&0B07           ; cursor to where cash value will go
CALL csrBC
CALL printCredits
LD   HL,Tcredits
RST  &08                ; print it
LD   BC,&1308           ; cursor to where status will go
CALL csrBC
LD   A,(naughtynes)
OR   A
JR   Z,L6309            ; 0   = clean
CP   &32                ; 50+ = figitive
LD   A,&02
JR   NC,L6309
DEC  A                  ; 1-50= offender
.L6309
LD   HL,statusList
RST  &10
LD   BC,&0D09           ; cursor to where current rating will go
CALL csrBC
LD   A,(rating)
LD   HL,RatingList
RST  &10
LD   HL,&050C           ; cursor to equipment list start
LD   (LE74B),HL
LD   HL,LF777
LD   B,&0F
.L6325
PUSH HL
LD   A,(HL)
LD   E,A
AND  &7F
JR   Z,L636D
PUSH BC
LD   BC,(LE74B)
CALL csrBC
LD   A,B
ADD  A,&11
LD   B,A
CP   &27
JR   NZ,L633F
LD   B,&05
INC  C
.L633F
LD   (LE74B),BC
POP  BC
LD   A,&11
SUB  B
CP   &09
JR   NZ,L6355
BIT  1,E
JR   Z,L6355
LD   HL,TnavalUnit
RST  &08                ; print it
JR   L6359
 
.L6355
LD   HL,itemsList
RST  &10
.L6359
BIT  7,E
JR   Z,L636D
PUSH BC
LD   HL,Tfblr
LD   B,&04
.L6363
RR   E
JR   NC,L6369
LD   A,(HL)
RST  &00                ; print A
.L6369
INC  HL
DJNZ L6363
POP  BC
.L636D
POP  HL
INC  HL
DJNZ L6325
LD   A,&03
LD   (currentScreen),A
RET
 
.printName
LD   A,&01
LD   (PrintAddr+1),A    ; screen row 1
LD   A,(comLength)      ; length of the commander's name
ADD  A,&0A              ; length of "Commander "
SUB  42                 ; screen columns
NEG                     ; flip result
SRL  A                  ; halve it
CALL tabA               ; text will now print centres
LD   HL,Tcommander
RST  &08                ; print it
LD   HL,commander
RST  &08                ; print it
RET
 
.testFlight 
LD   A,(flagFlight)
OR   A
RET  NZ                 ; return if test passed
POP  HL                 ; get rid of the return address its not needed
JP   doBeep              ; exit via error beep ?
 
.L639C
LD   HL,Nmillion
OR   A
RET  Z
LD   HL,Nthousand
DEC  A
RET  Z
LD   HL,None
RET
 
.L63AA
LD   D,A
LD   E,(IX+3)
CALL multDxE
LD   HL,naughtynes
ADD  A,(HL)
JR   NC,L63B8
SBC  A,A
.L63B8
LD   (HL),A
RET
 
.L63BA
LD   HL,N20million
LD   A,(LF777)
OR   A
JR   Z,L63C6
LD   HL,N35million
.L63C6
LD   DE,LEB61
LD   BC,&0004
LDIR
LD   HL,cargoSpace
LD   A,&12
.L63D3
EX   AF,AF'
LD   BC,&0001
CALL L63E0
EX   DE,HL
EX   AF,AF'
DEC  A
JR   NZ,L63D3
RET
 
.L63E0
PUSH BC
PUSH HL
LD   DE,LEB61
CALL longSub
EX   DE,HL
POP  HL
POP  BC
DEC  BC
LD   A,B
OR   C
JR   NZ,L63E0
RET
 
.L63F1
XOR  A
LD   (LE70B),A
LD   (currentScreen),A
LD   (LE949),A
DEC  A
LD   (screenInUse),A
LD   (currentView),A
LD   HL,spriteAttr
LD   B,&20
DI
.L6408
CALL killSprite
LD   A,&80
OUT  (VDPaddress),A
LD   A,spritePatW>8
OUT  (VDPaddress),A
LD   HL,L6EC7
CALL VDPwritebulk
LD   A,&C0
OUT  (VDPaddress),A
LD   A,spritePatW>8
OUT  (VDPaddress),A
LD   HL,L6ED4
CALL VDPwritebulk
EI
CALL drawCockpit
CALL L6433
XOR  A
LD   (screenInUse),A
RET
 
.L6433
CALL L6A59
CALL L6BB3
CALL L6BCA
CALL L6A88
CALL L6B48
CALL L6B54
CALL L6B60
CALL L6AAD
CALL L6B6E
CALL L6AC4
CALL L6AD0
CALL L6ADC
CALL L6B12
RET
 
.L645B
LD   (L6944+1),HL
PUSH DE
LD   A,(currentView)
OR   A
JR   NZ,L646F
PUSH BC
CALL L63F1
LD   A,&FF
LD   (flightView),A
POP  BC
.L646F
POP  DE
LD   A,B
LD   HL,flightView
CP   (HL)
JR   Z,L6496
LD   (HL),A
LD   A,&61
LD   C,&07
.L647C
PUSH AF
DI
OUT  (VDPaddress),A
LD   A,&40
OUT  (VDPaddress),A
LD   B,&05
.L6486
LD   A,(DE)
INC  DE
.L6488
OUT  (VDPdata),A
DJNZ L6486
EI
POP  AF
ADD  A,&08
DEC  C
JR   NZ,L647C
CALL L6882
.L6496
LD   A,(LE8F6)
OR   A
CALL NZ,L6CB2
CALL L6D24
RET
 
.DrawFrontView
CALL checkDocked            ; does not return if docked
LD   HL,doRet
LD   (L44CE+1),HL
LD   B,&00
LD   HL,L64F1
LD   DE,BfrontView
JP   L645B
 
.DrawBackView
CALL checkDocked            ; does not return if docked
LD   HL,L44E6
LD   (L44CE+1),HL
LD   B,&01
LD   HL,L656B
LD   DE,BrearView
JP   L645B
 
.DrawLeftView
CALL checkDocked            ; does not return if docked
LD   HL,L44F3
LD   (L44CE+1),HL
LD   B,&02
LD   HL,L6628
LD   DE,BleftView
JP   L645B
 
.DrawRightView
CALL checkDocked            ; does not return if docked
LD   HL,L44FB
LD   (L44CE+1),HL
LD   B,&03
LD   HL,L6682
LD   DE,BrightView
JP   L645B
 
.L64F1
JR   Z,L6520
CALL random
LD   L,A
AND  &3F
LD   C,A
RL   L
JR   NC,L6500
NEG
.L6500
LD   (IX+0),&00
LD   (IX+1),A
CALL random
LD   L,A
AND  &3F
LD   B,A
RL   L
JR   NC,L6514
NEG
.L6514
LD   (IX+2),&00
LD   (IX+3),A
CALL L6805
JR   L656A
 
.L6520
LD   L,(IX+0)
LD   H,(IX+1)
LD   E,(IX+4)
LD   D,(IX+5)
LD   A,H
OR   A
JP   P,L6533
NEG
.L6533
SRL  A
SRL  A
LD   C,A
LD   B,&02
LD   A,(BC)
LD   B,A
.L653C
ADD  HL,DE
DJNZ L653C
LD   (IX+0),L
LD   (IX+1),H
LD   L,(IX+2)
LD   H,(IX+3)
LD   E,(IX+6)
LD   D,(IX+7)
LD   A,H
OR   A
JP   P,L6558
NEG
.L6558
SRL  A
SRL  A
LD   C,A
LD   B,&02
LD   A,(BC)
LD   B,A
.L6561
ADD  HL,DE
DJNZ L6561
LD   (IX+2),L
LD   (IX+3),H
.L656A
RET
 
.L656B
JR   Z,L65C1
CALL random
AND  &03
LD   C,A
CP   &02
JR   NC,L6594
EX   AF,AF'
.L6578
CALL random
LD   L,A
OR   A
JP   P,L6582
NEG
.L6582
CP   &58
JR   NC,L6578
LD   C,A
LD   H,&40
LD   B,H
EX   AF,AF'
OR   A
JR   Z,L6592
LD   H,&C1
LD   B,&3F
.L6592
JR   L65AE
 
.L6594
EX   AF,AF'
.L6595
CALL random
LD   H,A
OR   A
JP   P,L659F
NEG
.L659F
CP   &40
JR   NC,L6595
LD   B,A
LD   L,&58
LD   C,L
EX   AF,AF'
JR   NZ,L65AE
LD   L,&C1
LD   C,&3F
.L65AE
LD   (IX+0),&00
LD   (IX+1),L
LD   (IX+2),&00
LD   (IX+3),H
CALL L6805
JR   L6627
 
.L65C1
LD   L,(IX+0)
LD   H,(IX+1)
LD   C,H
LD   A,H
OR   A
JP   P,L65CF
NEG
.L65CF
SRL  A
SRL  A
LD   E,A
LD   D,multiplyBits>8
LD   A,(DE)
LD   B,A
LD   E,(IX+4)
LD   D,(IX+5)
.L65DE
OR   A
SBC  HL,DE
DJNZ L65DE
LD   A,H
XOR  C
JP   P,L65EE
LD   (IX+8),&FF
JR   L65F4
 
.L65EE
LD   (IX+0),L
LD   (IX+1),H
.L65F4
LD   L,(IX+2)
LD   H,(IX+3)
LD   C,H
LD   A,H
OR   A
JP   P,L6602
NEG
.L6602
SRL  A
SRL  A
LD   E,A
LD   D,multiplyBits>8
LD   A,(DE)
LD   B,A
LD   E,(IX+6)
LD   D,(IX+7)
.L6611
OR   A
SBC  HL,DE
DJNZ L6611
LD   A,H
XOR  C
JP   P,L6621
LD   (IX+8),&FF
JR   L6627
 
.L6621
LD   (IX+2),L
LD   (IX+3),H
.L6627
RET
 
.L6628
JR   Z,L665C
.L662A
CALL random
LD   L,A
OR   A
JP   P,L6634
NEG
.L6634
CP   &40
JR   NC,L662A
LD   (IX+2),&00
LD   (IX+3),L
LD   (IX+0),&00
LD   (IX+1),&58
CALL random
AND  &03
ADD  A,&04
LD   B,A
CALL random
AND  &03
ADD  A,&04
LD   C,A
CALL L6805
JR   L6681
 
.L665C
LD   L,(IX+0)
LD   H,(IX+1)
LD   E,(IX+6)
LD   D,(IX+7)
BIT  7,D
JP   M,L6677
SBC  HL,DE
SBC  HL,DE
SBC  HL,DE
SBC  HL,DE
JR   L667B
 
.L6677
ADD  HL,DE
ADD  HL,DE
ADD  HL,DE
ADD  HL,DE
.L667B
LD   (IX+0),L
LD   (IX+1),H
.L6681
RET
 
.L6682
JR   Z,L66B6
.L6684
CALL random
LD   L,A
OR   A
JP   P,L668E
NEG
.L668E
CP   &40
JR   NC,L6684
LD   (IX+2),&00
LD   (IX+3),L
LD   (IX+0),&00
LD   (IX+1),&A9
CALL random
AND  &03
ADD  A,&04
LD   B,A
CALL random
AND  &03
ADD  A,&04
LD   C,A
CALL L6805
JR   L66DB
 
.L66B6
LD   L,(IX+0)
LD   H,(IX+1)
LD   E,(IX+6)
LD   D,(IX+7)
BIT  7,D
JP   M,L66CD
ADD  HL,DE
ADD  HL,DE
ADD  HL,DE
ADD  HL,DE
JR   L66D5
 
.L66CD
SBC  HL,DE
SBC  HL,DE
SBC  HL,DE
SBC  HL,DE
.L66D5
LD   (IX+0),L
LD   (IX+1),H
.L66DB
RET
 
.L66DC
CALL findLog
LD   (LE779),HL
EX   DE,HL
CALL findLog
LD   (LE77B),HL
LD   IX,(starPointer)
LD   B,&0F
.L66EF
PUSH BC
LD   A,(IX+1)
OR   A
PUSH AF
JP   P,L66FA
NEG
.L66FA
ADD  A,A
LD   (L66FE+1),A
.L66FE
LD   HL,(&0800)
POP  AF
JP   P,L6707
SET  6,H
.L6707
LD   (LE77D),HL
LD   A,(IX+3)
OR   A
PUSH AF
JP   P,L6714
.L6712
NEG
.L6714
ADD  A,A
LD   (L6718+1),A
.L6718
LD   HL,(&0800)
POP  AF
JP   P,L6721
SET  6,H
.L6721
LD   (LE77F),HL
LD   BC,(LE77B)
CALL L2160
EX   DE,HL
LD   HL,(LE77D)
LD   BC,(LE779)
CALL L2160
OR   A
SBC  HL,DE
LD   (IX+1),L
LD   HL,(LE77D)
LD   BC,(LE77B)
CALL L2160
EX   DE,HL
LD   HL,(LE77F)
LD   BC,(LE779)
CALL L2160
ADD  HL,DE
LD   (IX+3),L
LD   A,L
OR   A
JP   P,L675C
NEG
.L675C
LD   B,A
LD   A,(IX+1)
OR   A
JP   P,L6766
NEG
.L6766
LD   C,A
CALL L6805
LD   DE,&000B
ADD  IX,DE
POP  BC
DEC  B
JP   NZ,L66EF
RET
 
.L6775
LD   A,H
RL   L
RLA
JR   NC,L677D
NEG
.L677D
LD   C,A
LD   IX,(starPointer)
LD   B,&0F
.L6784
LD   A,(IX+3)
ADD  A,C
LD   (IX+3),A
PUSH BC
JP   P,L6791
NEG
.L6791
LD   B,A
LD   A,(IX+1)
OR   A
JP   P,L679B
NEG
.L679B
LD   C,A
CALL L6805
LD   DE,&000B
ADD  IX,DE
POP  BC
DJNZ L6784
RET
 
.L67A8
LD   A,(flightView)
ADD  A,A
LD   C,A
LD   B,&00
ADD  HL,BC
LD   A,(HL)
INC  HL
LD   H,(HL)
LD   L,A
JP   (HL)

.L67B5
LD   HL,(LEB77)
LD   DE,(LEB7A)
LD   A,D
XOR  &80
LD   D,A
JP   L66DC

.L67C3
LD   HL,(LEB77)
LD   DE,(LEB7A)
JP   L66DC
 
.L67CD
LD   HL,(LEB7A)
JP   L6775
 
.L67D3
LD   HL,(LEB7A)
LD   A,H
XOR  &80
LD   H,A
JP   L6775

.L67DD 
LD   HL,(LEB80)
JP   L6775
 
.L67E3
LD   HL,(LEB80)
LD   A,H
XOR  &80
LD   H,A
JP   L6775

.L67ED
LD   HL,(LEB7D)
LD   DE,(LEB80)
JP   L66DC
 
.L67F7
LD   HL,(LEB7D)
LD   DE,(LEB80)
LD   A,D
XOR  &80
LD   D,A
JP   L66DC
 
.L6805
LD   A,C
OR   B
LD   L,A
LD   H,multiplyBits>8
LD   A,(HL)
SUB  &04
JP   M,L6818
INC  A
.L6811
SRL  C
SRL  B
DEC  A
JR   NZ,L6811
.L6818
PUSH BC
LD   A,C
ADD  A,A
ADD  A,A
ADD  A,A
ADD  A,B
ADD  A,A
LD   C,A
LD   B,&00
LD   HL,L6F1F
ADD  HL,BC
LD   A,(HL)
INC  HL
LD   C,(HL)
BIT  7,(IX+1)
JR   Z,L6831
NEG
.L6831
LD   L,A
RLA
SBC  A,A
LD   H,A
LD   D,H
LD   E,L
SRA  D
RR   E
SRA  D
RR   E
LD   A,(LF814)
OR   A
JR   Z,L6849
LD   B,A
.L6846
ADD  HL,DE
DJNZ L6846
.L6849
LD   (IX+4),L
LD   (IX+5),H
LD   (IX+9),E
LD   A,C
BIT  7,(IX+3)
JR   Z,L685B
NEG
.L685B
LD   L,A
RLA
SBC  A,A
LD   H,A
LD   D,H
LD   E,L
SRA  D
RR   E
SRA  D
RR   E
LD   A,(LF814)
OR   A
JR   Z,L6873
LD   B,A
.L6870
ADD  HL,DE
DJNZ L6870
.L6873
LD   (IX+6),L
LD   (IX+7),H
LD   (IX+10),E
LD   (IX+8),&00
POP  BC
RET
 
.L6882
LD   IX,(starPointer)
LD   B,&0F
.L6888
PUSH BC
.L6889
CALL random
LD   L,A
OR   A
JP   P,L6893
NEG
.L6893
CP   &58
JR   NC,L6889
LD   (IX+0),&00
LD   (IX+1),L
EX   AF,AF'
.L689F
CALL random
LD   L,A
OR   A
JP   P,L68A9
NEG
.L68A9
CP   &40
JR   NC,L689F
LD   (IX+2),&00
LD   (IX+3),L
LD   B,A
EX   AF,AF'
LD   C,A
CALL L6805
LD   A,C
CP   &04
JR   C,L68C2
LD   A,B
CP   &04
.L68C2
JR   C,L6889
LD   DE,&000B
ADD  IX,DE
POP  BC
DJNZ L6888
RET
 
.L68CD
LD   A,(spaceType)
OR   A
RET  NZ
LD   A,(LF815)
OR   A
JR   Z,L68DE
LD   HL,L6EDD
CALL L67A8
.L68DE
LD   A,(LF816)
OR   A
JR   Z,L68EA
LD   HL,L6EE5
CALL L67A8
.L68EA
LD   IX,(starPointer)
LD   B,&0F
.L68F0
PUSH BC
LD   E,(IX+1)
LD   D,(IX+3)
LD   A,E
OR   A
JP   M,L6902
CP   &59
JR   NC,L6950
JR   L6906
 
.L6902
CP   &A9
JR   C,L6950
.L6906
LD   A,D
OR   A
JP   M,L6911
CP   &41
JR   NC,L6950
JR   L6915
 
.L6911
CP   &C1
JR   C,L6950
.L6915
LD   A,(flightView)
DEC  A
JR   NZ,L6931
LD   A,E
OR   A
JP   P,L6922
NEG
.L6922
CP   &0A
JR   NC,L6931
LD   A,D
OR   A
JP   P,L692D
NEG
.L692D
CP   &0A
JR   C,L6950
.L6931
LD   A,E
ADD  A,&57
LD   C,A
LD   A,D
ADD  A,&3F
LD   B,A
PUSH IX
CALL plotinBuffer                  ; set point in BC in the buffer
POP  IX
.L6940
LD   A,(IX+8)
OR   A
.L6944
CALL &0000                  ; modified @ 645B
LD   DE,&000B
ADD  IX,DE
POP  BC
DJNZ L68F0
RET
 
.L6950
LD   (IX+8),&FF
.L6954
JR   L6940
 
.L6956
PUSH AF
LD   HL,LF814
LD   A,(HL)
CP   &1E
JR   NC,L699A
INC  (HL)
CALL L6A59
LD   IX,(starPointer)
LD   DE,&000B
LD   B,&0F
.L696C
PUSH BC
LD   A,(IX+9)
LD   C,A
RLA
SBC  A,A
LD   B,A
LD   L,(IX+4)
LD   H,(IX+5)
ADD  HL,BC
LD   (IX+4),L
LD   (IX+5),H
LD   A,(IX+10)
LD   C,A
RLA
SBC  A,A
LD   B,A
LD   L,(IX+6)
LD   H,(IX+7)
ADD  HL,BC
LD   (IX+6),L
LD   (IX+7),H
ADD  IX,DE
POP  BC
DJNZ L696C
.L699A
POP  AF
RET
 
.L699C
PUSH AF
LD   HL,LF814
LD   A,(HL)
OR   A
JR   Z,L69E3
DEC  (HL)
CALL L6A59
LD   IX,(starPointer)
LD   DE,&000B
LD   B,&0F
.L69B1
PUSH BC
LD   A,(IX+9)
LD   C,A
RLA
SBC  A,A
LD   B,A
LD   L,(IX+4)
LD   H,(IX+5)
OR   A
SBC  HL,BC
LD   (IX+4),L
LD   (IX+5),H
LD   A,(IX+10)
LD   C,A
RLA
SBC  A,A
LD   B,A
LD   L,(IX+6)
LD   H,(IX+7)
OR   A
SBC  HL,BC
LD   (IX+6),L
LD   (IX+7),H
ADD  IX,DE
POP  BC
DJNZ L69B1
.L69E3
POP  AF
RET
 
.L69E5
LD   E,&F0
.L69E7
LD   HL,LF815
LD   BC,LE774
LD   IX,L6BB3
LD   IY,L2209
JP   L6A15
 
.L69F8
LD   E,&10
JP   L69E7
 
.L69FD
LD   E,&10
.L69FF
LD   HL,LF816
LD   BC,LE775
LD   IX,L6BCA
LD   IY,L2212
JP   L6A15
 
.L6A10
LD   E,&F0
JP   L69FF
 
.L6A15
PUSH AF
LD   A,&FF
LD   (BC),A
LD   A,(HL)
CP   E
JR   Z,L6A56
BIT  7,E
JR   NZ,L6A36
OR   A
JP   P,L6A30
LD   A,(gameFlagBits)
AND  &04
JR   Z,L6A30
LD   (HL),&00
JR   L6A34
 
.L6A30
LD   A,(HL)
ADD  A,&02
LD   (HL),A
.L6A34
JR   L6A4A
 
.L6A36
CP   &01
JP   M,L6A46
LD   A,(gameFlagBits)
AND  &04
JR   Z,L6A46
LD   (HL),&00
JR   L6A4A
 
.L6A46
LD   A,(HL)
ADD  A,&FE
LD   (HL),A
.L6A4A
PUSH IY
PUSH IX
POP  HL
CALL L6A58
POP  HL
CALL L6A58
.L6A56
POP  AF
RET
 
.L6A58
JP   (HL)
.L6A59
LD   A,(LE92B)
OR   A
RET  Z
LD   A,(LF814)
CP   &1A
LD   A,&B1
JR   C,L6A69
LD   A,&81
.L6A69
LD   (LE913),A
LD   C,&03
LD   HL,&31B3
CALL L6CA8
LD   A,(LF814)
LD   E,&18
CALL multAxE
LD   A,&1E
CALL L2079
LD   A,L
LD   HL,&11B3
JP   L6C37
 
.L6A88
CALL L6C9E
LD   HL,&17B0
LD   A,(energyStore)
LD   B,&04
.L6A93
CP   &19
JR   C,L6A9C
LD   C,&18
SUB  C
JR   L6A9E
 
.L6A9C
LD   C,A
XOR  A
.L6A9E
PUSH AF
PUSH BC
PUSH HL
LD   A,C
CALL L6C37
POP  HL
POP  BC
POP  AF
DEC  H
INC  L
DJNZ L6A93
RET
 
.L6AAD
CALL L6C9E
LD   A,(hyperFuel)
LD   E,&18
CALL multAxE
LD   A,&46
CALL L2079
LD   A,L
LD   HL,&1339
JP   L6C37
 
.L6AC4
CALL L6C9E
LD   A,(altitude)
LD   HL,&1639
JP   L6C37
 
.L6AD0
CALL L6C9E
LD   A,(LF811)
LD   HL,&1439
JP   L6C37
 
.L6ADC
CALL L6C9E
LD   A,(LEB05)
DEC  A
JR   NZ,L6B05
DI
LD   A,&A0
OUT  (VDPaddress),A
LD   A,&56
OUT  (VDPaddress),A
LD   HL,L6EFF
LD   B,&08
CALL VDUwriteBytes
LD   A,&A0
OUT  (VDPaddress),A
LD   A,&57
OUT  (VDPaddress),A
LD   B,&04
.L6B00
CALL VDUwriteBytes
JR   L6B10
 
.L6B05
LD   HL,L16A0
LD   B,&0C
LD   C,&01
XOR  A
CALL blockFill
.L6B10
EI
RET
 
.L6B12
CALL L6C9E
LD   A,(LE912)
OR   A
JR   Z,L6B3B
DI
LD   A,&50
OUT  (VDPaddress),A
LD   A,&56
OUT  (VDPaddress),A
LD   HL,L6F0B
LD   B,&08
CALL VDUwriteBytes
LD   A,&50
OUT  (VDPaddress),A
LD   A,&57
OUT  (VDPaddress),A
LD   B,&04
CALL VDUwriteBytes
JR   L6B46
 
.L6B3B
LD   HL,L1650
LD   B,&0C
LD   C,&01
XOR  A
CALL blockFill
.L6B46
EI
RET
 
.L6B48
CALL L6C9E
LD   A,(LF80F)
LD   HL,&113B
JP   L6C37
 
.L6B54
CALL L6C9E
LD   A,(LF810)
LD   HL,&123A
JP   L6C37
 
.L6B60
CALL L6C9E
LD   A,(LF813)
SRL  A
LD   HL,&1539
JP   L6C37
 
.L6B6E
CALL L6C9E
DI
LD   A,&10
OUT  (VDPaddress),A
LD   A,spriteAttrW>8
OUT  (VDPaddress),A
EI
LD   BC,&B838
LD   HL,(missiles)
LD   H,&01
.L6B83
LD   A,H
CP   L
JR   Z,L6B8F
JR   C,L6B8F
LD   D,&14
LD   E,&0F
JR   L6BA5
 
.L6B8F
LD   D,&10
JR   NZ,L6BA3
LD   A,(LE910)
OR   A
JR   Z,L6BA3
CP   &02
LD   E,&09
JR   NZ,L6BA1
LD   E,&06
.L6BA1
JR   L6BA5
 
.L6BA3
LD   E,&02
.L6BA5
CALL setSpriteData
LD   A,C
ADD  A,&06
LD   C,A
INC  H
LD   A,H
CP   &05
JR   NZ,L6B83
RET
 
.L6BB3
LD   A,(LF815)
ADD  A,&10
LD   E,&16
CALL multAxE
LD   A,&20
CALL L2079
LD   A,L
INC  A
LD   HL,&12B3
JP   L6C71
 
.L6BCA
LD   A,(LF816)
ADD  A,&10
LD   E,&16
CALL multAxE
LD   A,&20
CALL L2079
LD   A,L
INC  A
LD   HL,&13B3
JP   L6C71
 
.L6BE1
LD   A,(LE929)
OR   A
JR   Z,L6BFE
LD   A,(LF815)
OR   A
JR   Z,L6BFA
JP   M,L6BFA
DEC  A
LD   (LF815),A
CALL L6BB3
JP   L2209
 
.L6BFA
XOR  A
LD   (LE929),A
.L6BFE
LD   A,(gameFlagBits)
BIT  1,A
JR   Z,L6C2F
LD   A,(LE774)
.L6C08
OR   A
JR   NZ,L6C1A
LD   HL,LF815
LD   A,(HL)
OR   A
JR   Z,L6C1A
LD   (HL),&00
CALL L6BB3
CALL L2209
.L6C1A
LD   A,(LE775)
OR   A
JR   NZ,L6C2F
LD   HL,LF816
LD   A,(HL)
OR   A
JR   Z,L6C2F
LD   (HL),&00
CALL L6BCA
CALL L2212
.L6C2F
XOR  A
LD   (LE774),A
LD   (LE775),A
RET
 
.L6C37
CALL L6C9E
LD   E,A
LD   D,&00
RRA
RRA
RRA
AND  &1F
JR   Z,L6C52
LD   C,A
LD   D,A
ADD  A,A
ADD  A,A
ADD  A,A
SUB  E
NEG
LD   E,A
LD   A,&FF
CALL L6CA8
.L6C52
LD   A,E
OR   A
JR   Z,L6C66
INC  D
LD   IX,bargraph
LD   (L6C5E+2),A
.L6C5E
LD   A,(IX+0)
LD   C,&01
CALL L6CA8
.L6C66
LD   A,&03
SUB  D
JR   Z,L6C70
LD   C,A
XOR  A
CALL L6CA8
.L6C70
RET
 
.L6C71
CALL L6C9E
LD   D,&01
LD   E,A
RRA
RRA
RRA
AND  &1F
JR   Z,L6C85
LD   C,A
ADD  A,D
LD   D,A
XOR  A
CALL L6CA8
.L6C85
LD   A,E
AND  &07
LD   (L6C8B+1),A
.L6C8B
LD   A,(bit7)
LD   C,&01
CALL L6CA8
LD   A,&03
SUB  D
JR   Z,L6C9D
LD   C,A
XOR  A
CALL L6CA8
.L6C9D
RET
 
.L6C9E
EX   AF,AF'
LD   A,(currentView)
OR   A
JR   NZ,L6CA6
POP  AF
.L6CA6
EX   AF,AF'
RET
 
.L6CA8
PUSH DE
LD   E,A
LD   B,&04
CALL blockFill
EI
POP  DE
RET
 
.L6CB2
CALL cleanBuffer
LD   A,&A9
LD   (L3CA8),A
LD   (L3CE7),A
LD   A,&07
CALL soundSystem
LD   B,&04
.L6CC4
PUSH BC
LD   A,&02
LD   (LE776),A
LD   A,&1A
LD   (LE777),A
LD   A,&44
LD   (LE778),A
LD   B,&06
.L6CD6
PUSH BC
LD   C,&04
LD   HL,LE776
LD   B,&03
.L6CDE
PUSH BC
PUSH HL
LD   L,(HL)
LD   H,&00
LD   B,&03
LD   DE,&0010
LD   IX,&0000
LD   IY,&0000
LD   (LE921),HL
CALL L3D0E
POP  HL
POP  BC
LD   A,(HL)
ADD  A,C
LD   (HL),A
INC  HL
INC  C
INC  C
INC  C
DJNZ L6CDE
LD   A,(screenCount)
OR   A
JP   P,L6D0D
LD   A,&FF
LD   (screenCount),A
.L6D0D
CALL displayBuffer
POP  BC
DJNZ L6CD6
POP  BC
DJNZ L6CC4
LD   A,&FF
LD   (LE923),A
LD   A,&B1
LD   (L3CA8),A
LD   (L3CE7),A
RET
 
.L6D24
LD   C,&FF
LD   A,(LE940)
OR   A
JR   NZ,L6D6E
LD   A,(flightView)
LD   B,A
INC  B
LD   A,&80
.L6D33
RLCA
DJNZ L6D33
LD   D,B
LD   C,&FF
LD   E,A
LD   A,(LF779)
AND  &0F
JR   Z,L6D46
LD   D,B
AND  E
JR   Z,L6D46
LD   C,B
.L6D46
INC  B
LD   A,(LF781)
AND  &0F
JR   Z,L6D53
LD   D,B
AND  E
JR   Z,L6D53
LD   C,B
.L6D53
INC  B
LD   A,(LF77A)
AND  &0F
JR   Z,L6D60
LD   D,B
AND  E
JR   Z,L6D60
LD   C,B
.L6D60
INC  B
LD   A,(LF782)
AND  &0F
JR   Z,L6D6D
LD   D,B
AND  E
JR   Z,L6D6D
LD   C,B
.L6D6D
INC  B
.L6D6E
LD   A,D
LD   (LEFA0),A
LD   A,C
LD   (LF818),A
OR   A
JP   P,L6D82
LD   HL,spriteAttr
LD   B,&04
JP   killSprite
 
.L6D82
LD   E,A
ADD  A,A           ; A x 2
ADD  A,A           ; A x 4
ADD  A,E           ; A x 5
LD   E,A
LD   D,&00
LD   HL,crosshairDataList
ADD  HL,DE
LD   A,(HL)
INC  HL
LD   (LF819),A
LD   A,(HL)
INC  HL
LD   (LF81A),A
LD   E,(HL)
INC  HL
LD   A,(HL)
INC  HL
LD   H,(HL)
LD   L,A
DI
LD   A,&00
OUT  (VDPaddress),A
LD   A,spritePatW>8
OUT  (VDPaddress),A
CALL VDPwritebulk
LD   A,&00
OUT  (VDPaddress),A
LD   A,spriteAttrW>8
OUT  (VDPaddress),A
LD   BC,&3870
LD   D,&00
LD   L,&02
.L6DB8
PUSH BC
LD   H,&02
.L6DBB
CALL setSpriteData
LD   A,B
ADD  A,&10
LD   B,A
DEC  H
JR   NZ,L6DBB
POP  BC
LD   A,C
ADD  A,&10
LD   C,A
DEC  L
JR   NZ,L6DB8
EI
RET
 


.checkDocked
LD   A,(flagFlight)
OR   A
JR   Z,L6DE2
CALL doBeep
CALL clearLower
LD   HL,Tdocked
CALL momentaryPrint
POP  HL                    ; pop the return adderess so does not return if docked
.L6DE2
RET
 
.bargraph
DB   %00000000
DB   %10000000
DB   %11000000
DB   %11100000
DB   %11110000
DB   %11111000
DB   %11111100
DB   %11111110

.crosshair1
DB   &0F,&00,&01,&3F,&02,&00,&07,&01,&06,&00,&01,&80
DB   &01,&3F,&0F,&00,&01,&80,&06,&00,&07,&01,&04,&00
DB   &07,&80,&06,&00,&01,&01,&0F,&00,&01,&FC
DB   &01,&01,&06,&00,&07,&80,&02,&00,&01,&FC,&0F,&00
DB   &00
; compressed sprite data for 32x32 crosshair #1
; sprite 1           sprite3
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000001 1000000000000000
;  0000000000000001 1000000000000000
;  0000000000000001 1000000000000000
;  0000000000000001 1000000000000000
;  0000000000000001 1000000000000000
;  0000000000000001 1000000000000000
;  0000000000000001 1000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0011111110000000 0000000111111100
; sprite 2           sprite 4
;  0011111110000000 0000000111111100
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000001 1000000000000000
;  0000000000000001 1000000000000000
;  0000000000000001 1000000000000000
;  0000000000000001 1000000000000000
;  0000000000000001 1000000000000000
;  0000000000000001 1000000000000000
;  0000000000000001 1000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000


.crosshair2
Db   &05,&00,&01,&0F,&05,&0C,&05,&00,&05,&00,&01,&FF,&0F,&00
DB   &05,&0C,&01,&0F,&0F,&00,&01,&FF,&0A,&00
DB   &01,&FF,&0F,&00,&01,&F0,&05,&30,&0F,&00
DB   &01,&FF,&0A,&00,&05,&30,&01,&F0,&05,&00
DB   &00
; compressed sprite data for 32x32 crosshair #2
; sprite 1           sprite3
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000111111111111 1111111111110000
;  0000110000000000 0000000000110000
;  0000110000000000 0000000000110000
;  0000110000000000 0000000000110000
;  0000110000000000 0000000000110000
;  0000110000000000 0000000000110000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
; sprite 2           sprite 4
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000110000000000 0000000000110000
;  0000110000000000 0000000000110000
;  0000110000000000 0000000000110000
;  0000110000000000 0000000000110000
;  0000110000000000 0000000000110000
;  0000111111111111 1111111111110000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000

.crosshair3
DB   &01,&00,&01,&60,&01,&30,&01,&18,&01,&0C,&01,&06,&01,&03,&22,&00
DB   &01,&03,&01,&06,&01,&0C,&01,&18,&01,&30,&01,&60,&22,&00
DB   &01,&06,&01,&0C,&01,&18,&01,&30,&01,&60,&01,&C0,&22,&00
DB   &01,&C0,&01,&60,&01,&30,&01,&18,&01,&0C,&01,&06
DB   &00

; compressed sprite data for 32x32 crosshair #3
; sprite 1           sprite3
;  0000000000000000 0000000000000000
;  0110000000000000 0000000000000110
;  0011000000000000 0000000000001100
;  0001100000000000 0000000000011000
;  0000110000000000 0000000000110000
;  0000011000000000 0000000001100000
;  0000001100000000 0000000011000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000

; sprite 2           sprite 4
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000001100000000 0000000011000000
;  0000011000000000 0000000001100000
;  0000110000000000 0000000000110000
;  0001100000000000 0000000000011000
;  0011000000000000 0000000000001100
;  0110000000000000 0000000000000110
;  0000000000000000 0000000000000000

.crosshair4
DB   &07,&00,&01,&0F,&03,&0C,&09,&00,&03,&01,&01,&FF,&0D,&00
DB   &03,&0C,&01,&0F,&0F,&00,&01,&FF,&03,&01,&08,&00
DB   &03,&80,&01,&FF,&0F,&00,&01,&F0,&03,&30,&0D,&00
DB   &01,&FF,&03,&80,&09,&00,&03,&30,&01,&F0,&07,&00
DB   &00
; compressed sprite data for 32x32 crosshair #4
; sprite 1           sprite3
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000001 1000000000000000
;  0000000000000001 1000000000000000
;  0000000000000001 1000000000000000
;  0000111111111111 1111111111110000
;  0000110000000000 0000000000110000
;  0000110000000000 0000000000110000
;  0000110000000000 0000000000110000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000

; sprite 2           sprite 4
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000110000000000 0000000000110000
;  0000110000000000 0000000000110000
;  0000110000000000 0000000000110000
;  0000111111111111 1111111111110000
;  0000000000000001 1000000000000000
;  0000000000000001 1000000000000000
;  0000000000000001 1000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000
;  0000000000000000 0000000000000000

.crosshairDataList
DB   &05,&05,&02
DW   crosshair1

DB   &04,&0A,&06
DW   crosshair2

DB   &02,&05,&07
DW   crosshair3

DB   &00,&0A,&0D
DW   crosshair4

.L6EC7
DB   &05,&F8,&1B,&00,&01,&F8,&03,&88,&01,&F8,&1B,&00,&00
.L6ED4
DB   &01,&40,&02,&E0,&01,&40,&1C,&00,&00
.L6EDD
DW   L67B5,L67C3,L67CD,L67D3
.L6EE5
DW   L67DD,L67E3,L67ED,L67F7
.L6EED
DB   &00,&40,&00,&00,&00,&00,&00,&00,&00,&40,&00,&00,&00,&00
DB   &00,&00,&00,&40
.L6EFF
DB   &1F,&3F,&30,&30,&30,&3E,&1F,&03,&03,&03,&3F,&3E
.L6F0B
DB   &1F,&1F,&18,&18,&18,&1E,&1E,&18,&18,&18,&1F,&1F
.Tdocked
DS   "Docked!"
DB   &00

.L6F1F
DB   &00,&3F,&00,&3F,&00,&3F,&00,&3F,&00,&3F,&00,&3F,&00,&3F,&00,&3F
DB   &3F,&00,&2D,&2D,&1C,&38,&14,&3C,&0F,&3D,&0C,&3E,&0A,&3E,&09,&3E
.L6F3F
DB   &3F,&00,&38,&1C,&2D,&2D,&23,&34,&1C,&38,&17,&3A,&14,&3C,&11,&3D
DB   &3F,&00,&3C,&14,&34,&23,&2D,&2D,&26,&32,&20,&36,&1C,&38,&19,&3A
.L6F5F
DB   &3F,&00,&3D,&0F,&38,&1C,&32,&26,&2D,&2D,&27,&31,&23,&34,&1F,&37
DB   &3F,&00,&3E,&0C,&3A,&17,&36,&20,&31,&27,&2D,&2D,&28,&30,&25,&33
.L6F7F
DB   &3F,&00,&3E,&0A,&3C,&14,&38,&1C,&34,&23,&30,&28,&2D,&2D,&29,&30
DB   &3F,&00,&3E,&09,&3D,&11,&3A,&19,&37,&1F,&33,&25,&30,&29,&2D,&2D

.setupRam
DI
; LD   (cockpitData),HL           ; start address of cockpit.dat on the MSX version
LD   HL,highRam
LD   (HL),&00
LD   DE,highRam+1
LD   BC,last-highRam            ; zero the D400 to EFAB block
LDIR
LD   HL,rstTable
LD   DE,&0000
LD   B,3*8                      ; 8 restarts to setup, 3 bytes each 
.setupRST
LD   A,&C3
LD   (DE),A                     ; poke in JP opcode
INC  DE
LDI
LDI                             ; poke in the address from the table
LD   A,E
ADD  A,&05                      ; skip 5 bytes, as RSTs take 8 and JP xxxx only uses 3
LD   E,A                        ; meaning CALL &0005 doesn't get overwitten for BIOS calls
DJNZ setupRST                   ; CMP3 doesn't use any RSTs

LD   HL,bitMasks
LD   DE,bit7
LD   BC,&0008
LDIR
LD   A,&FF
LD   (LE92B),A
LD   (keyRow),A
LD   A,&01
LD   (LE70C),A
LD   (LE708),A
LD   (LE92A),A
LD   (LE92E),A
LD   (LE92F),A
LD   (LE944),A
LD   A,&20
LD   (LEF96),A
CALL initState            ; sets up things like the commander name
CALL L7045
LD   A,R                  ; start with a semi random value
LD   (seed),A             ; and set the RNG seed 
LD   (seed+1),A
LD   (seed+2),A
LD   HL,setupRam
LD   (starPointer),HL
LD   DE,&00A5
ADD  HL,DE
LD   (LEFA4),HL
LD   HL,LEEC6
LD   B,100
.L7015
PUSH HL
CALL random
LD   L,A                   ; L - random 0 to FF
XOR  A
SLA  L                     ; L *2
ADC  A,&08                 ; 08 or 09 if the top bit shifted out of L
LD   H,A                   ; HL is now a random pointer between 0800 and 09FE
LD   E,(HL)                ; get the value at the pointer
INC  L                     ; which are all between 0000 and 1FFF
LD   D,(HL)
CALL random
OR   A
JP   P,L702C
SET  6,D                   ; make range 0000 to 1FFF  4000 to 5FFF about half the time
.L702C
POP  HL  
LD   (HL),E                 
INC  HL                    ; store result in table at EEC6
LD   (HL),D
INC  HL
DJNZ L7015                 ; repeat 100 times
;LD   A,(rg1Sav)            ; copy of VDP register 1
;AND  &FC                   ; clear size and mag bits
;OR   &02                   ; set size bit
;LD   (rg1Sav),A            ; update copy
LD   A,rg1
OUT  (VDPaddress),A
LD   A,&81                 ; output to VDP reg 1
OUT  (VDPaddress),A
EI
RET
 

; appears to be modifying the shape data
.L7045
LD   HL,-256
LD   DE,stack
ADD  HL,DE                 ; calulate an offset for the start of the table - 100
LD   (LE600),HL            ; so presumably the original is based on 0100
LD   HL,stack              ; point to the start of the shape data
LD   B,&20                 ; 32 ships ?
.L7054
CALL L7068                 ; returns Z if the data word above the stack is zero
JR   Z,L7065               ; nul pointer so skip 
PUSH BC                    ; save counter
PUSH HL                    ; save offset pointer
EX   DE,HL                 ; modified ship data pointer
LD   B,&04
.L705E
CALL L7068                 ; now update 4 pointers within the ship defintion
DJNZ L705E
POP  HL
POP  BC                    ; restor ships info
.L7065
DJNZ L7054                 ; complete for 32 ships
RET
 
; read a ship data pointer, if its non zero adjust for the new position in memory 
.L7068
LD   E,(HL)               ; read the pointer
INC  HL
LD   D,(HL)
INC  HL
LD   A,D
OR   E
RET  Z                    ; return if nul
PUSH HL
LD   HL,(LE600)           ; get the biased start address
ADD  HL,DE                ; form the actual start address
EX   DE,HL                ; back to DE
POP  HL
DEC  HL
LD   (HL),D
DEC  HL
LD   (HL),E               ; update the pointer to true address of the data
INC  HL
INC  HL                   ; point to the next offset
RET

zero 11                   ; setup code is shorter than the original,
                          ; but also used as a data buffer so extend the 
                          ; space just in case
 
.L707D
XOR  A
LD   (LEFA9),A
LD   (jammerFlag),A
LD   (cloakFlag),A
LD   (LEF9D),A
LD   (LEF97),A
LD   (LEF8E),A
LD   (LE934),A
LD   (screenCount),A
LD   (LE722),A
LD   (LE918),A
LD   (countdown),A
LD   (LE91F),A
LD   (LE920),A
LD   (LE917),A
LD   (flagFlight),A
LD   (LE910),A
LD   (LF813),A
LD   (LF815),A
LD   (LF816),A
LD   (LE929),A
LD   (LEF9C),A
LD   DE,LEF8F
LD   B,&03
.L70C2
CALL random
OR   &80
LD   (DE),A
INC  DE
DJNZ L70C2
LD   A,(LF762)
ADD  A,&02
LD   (LEF9B),A
LD   A,&16
LD   (LF814),A
LD   A,&60
LD   (energyStore),A
LD   A,&18
LD   (LF80F),A
LD   (LF810),A
JP   L6882
 
.fullScreenCLS
LD   A,rg1
AND  &BF
DI
OUT  (VDPaddress),A
LD   A,&81
OUT  (VDPaddress),A
EI
LD   A,&FF
LD   (screenInUse),A
LD   A,&00
DI
OUT  (VDPaddress),A
LD   A,&40
OUT  (VDPaddress),A
EI
LD   C,&18
LD   A,&00
CALL outputCRows
XOR  A
LD   (screenInUse),A
LD   A,&FF
LD   (screenInUse),A
LD   A,&00
DI
OUT  (VDPaddress),A
LD   A,&60
OUT  (VDPaddress),A
EI
LD   C,&18
LD   A,&F1
CALL outputCRows
XOR  A
LD   (screenInUse),A
LD   HL,lineList
CALL drawLinkedLines
LD   A,rg1
DI
OUT  (VDPaddress),A
LD   A,&81
OUT  (VDPaddress),A
EI
RET
 
.drawCockpit
LD   A,rg1
AND  &BF
DI
OUT  (VDPaddress),A
LD   A,&81
OUT  (VDPaddress),A
EI
LD   HL,cockpit              ; cockpit date is in the file, no need to store in a variable
CALL uncompressScreen
LD   A,(spaceType)
OR   A
JR   Z,L7157
LD   A,&51
CALL colourFill              ; light blue on black main screen
.L7157
LD   A,rg1
DI
OUT  (VDPaddress),A
LD   A,&81
OUT  (VDPaddress),A
EI
RET
 
.lineList
DB   &03,&16,&03,&E9,&BC,&E9,&BC,&16,&03,&16,&FF
DB   &AB,&17,&AB,&E8,&FF
DB   &FF

.DefaultComanderData
DB   &00,&4A,&5A,&48,&02,&53,&B7,&07,&03,&E8,&03,&00,&00,&2D,&31,&01
DB   &FF,&46,&03,&00,&00,&81,&80,&00,&00,&00,&00,&00,&00,&80,&80,&00
DB   &00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00
DB   &00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00
DB   &00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00
DB   &00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00
DB   &00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00,&00
DB   &00,&00,&00,&00,&00,&01,&00,&00,&40,&00,&00,&00,&00,&00,&00,&00

.RSTtable
DW restart00
DW restart08
DW restart10
DW restart18
DW restart20
DW restart28
DW restart30
DW restart38
 
.restart38
PUSH AF
PUSH BC
PUSH DE
PUSH HL
PUSH IX
PUSH IY
EXX
EX   AF,AF'
PUSH AF
PUSH BC
PUSH DE
PUSH HL
IN   A,(VDPaddress)
LD   A,&01
LD   (intActive),A           ; flag inerrupt in progress
LD   HL,LE90B
INC  (HL)
LD   HL,LF748
INC  (HL)
LD   A,(countdown)
OR   A
JR   Z,L723F
LD   HL,LE91C
DEC  (HL)
JR   NZ,L723D
LD   (HL),&32
LD   A,&01
CALL soundSystem
LD   HL,countdown
DEC  (HL)
JR   NZ,L723D
LD   A,&FF
LD   (LE920),A
.L723D
JR   L7246
 
.L723F
LD   A,(screenInUse)
OR   A
CALL Z,L73BA
.L7246
LD   A,(LE912)
OR   A
JR   Z,L7256
JP   M,L7256
DEC  A
JR   NZ,L7253
DEC  A
.L7253
LD   (LE912),A
.L7256
CALL updateTime
CALL L7645
LD   A,(condition)
CP   &02
JR   NZ,L726E
LD   A,(LE916)
OR   A
JR   NZ,L726E
LD   A,&05
CALL soundSystem
.L726E
LD   A,(screenInUse)
OR   A
JR   NZ,L7283
LD   HL,LEB02
LD   A,(HL)
OR   A
JR   Z,L7280
LD   (HL),&00
CALL L8380
.L7280
CALL L72C1
.L7283
  If splitINT
  ; control interrupts on separate counter
  else
  CALL readKeyboard
  CALL readStick 
  ENDIF
XOR  A
LD   (intActive),A           ; clear inerrupt in progress flag
POP  HL
POP  DE
POP  BC
POP  AF
EXX
EX   AF,AF'
POP  IY
POP  IX
POP  HL
POP  DE
POP  BC
POP  AF
EI   
RETI                      ; use RETI to rearm the CTC
 
.updateTime
LD   HL,frameCounter             
DEC  (HL)
RET  NZ                   ; frame counter hasn't reached zero, done
LD   (HL),50              ; assume PAL frame rate
LD   HL,timeSec
INC  (HL)                 ; increment seconds
LD   A,(HL)
CP   60                   ; second count not 60, done 
RET  NZ
LD   (HL),&00             ; seconds to zero
INC  HL
INC  (HL)                 ; increment minutes
LD   A,(HL)
CP   60                   ; minute count not 60, done
RET  NZ
LD   (HL),&00             ; minutes to zero
INC  HL
INC  (HL)                 ; increment hours
LD   A,(HL)
CP   24                   ; hour count not 24 done
RET  NZ
LD   (HL),&00             ; hours to zero
INC  HL
INC  (HL)                 ; increment days
RET
 
.L72C1
LD   HL,LE90D
DEC  (HL)
RET  NZ
LD   (HL),&19
LD   A,(currentView)
OR   A
JR   Z,L72EE
LD   A,(gameFlagBits)
BIT  5,A
JR   Z,L72EE
LD   A,(LF814)
CP   &1A
JR   C,L72EE
.L72DC
LD   A,(LE913)
XOR  &30
LD   (LE913),A
LD   HL,&31B3
LD   E,A
LD   BC,&0403
CALL blockFill
.L72EE
LD   A,(currentScreen)
CP   &03
JR   NZ,L7311
LD   A,(condition)
OR   A
JR   Z,L7311
LD   A,&90
OUT  (VDPaddress),A
LD   A,&65
OUT  (VDPaddress),A
LD   HL,condColour
LD   A,(HL)
XOR  &90
LD   (HL),A
LD   B,&40
.L730C
OUT  (VDPdata),A
NOP
NOP
nop
DJNZ L730C
.L7311
RET
 
;

;MTX joystick/cursor keys read routine
.readStick
ld   e,&FF
ld   a,&FB
out  (keyDrive),a
in   a,(keyScan1)
and  &80
jr   NZ notUp
res  0,e                ; up/forward is pressed
.notUp
ld   a,&BF
out  (keyDrive),a
in   a,(keyScan1) 
and  &80
jr   NZ notDown
res  1,e                ; down/back is pressed
.notDown
ld   a,&F7
out  (keyDrive),a
in   a,(keyScan1)
and  &80
jr   NZ notLeft
res  2,e                ; left is pressed
.notLeft
ld   a,&EF
out  (keyDrive),a
in   a,(keyScan1)
and  &80
jr   NZ notRight
res  3,e                ; right is pressed
.notRight
ld   a,&DF
out  (keyDrive),a
in   a,(keyScan1)       ; HOME on bit 7, A on bit 0 both are fire 
OR   %01111110          ; if neither key was down A = &FF
INC  A                  ; A now 0 if no keys were down
jr   Z notFire
res  4,e                ; home/fire OR A is pressed
.notFire     

; now test for the keyboard flight keys
ld   a,&EF
out  (keyDrive),a
in   a,(keyScan1)
and  2
jr   NZ notSkey
res  0,e                ; S / Climb is pressed
.notSkey
ld   a,&BF
out  (keyDrive),a
in   a,(keyScan1)
bit  1,a
jr   NZ notXkey
res  1,e                ; X / dive is pressed
.notXkey
bit  4,a
jr   NZ notLeftkey
res  2,e                ; < / left is pressed
.notleftkey
ld   a,&7F
out  (keyDrive),a
in   a,(keyScan1)
and  16
jr   NZ notRightkey
res  3,e                ; > / right is pressed
.notRightkey

ld    A,E
LD   (stickData),A
RET
 
.L7373
EX   AF,AF'
PUSH BC
LD   HL,cursorStep
LD   B,&00
ADD  HL,BC
LD   E,(HL)
INC  HL
LD   D,(HL)
INC  HL
LD   A,(DE)
CP   (HL)
JR   Z,L73A3
LD   C,A
LD   A,(LE708)
INC  HL
BIT  7,(HL)
DEC  HL
JR   NZ,L7396
ADD  A,C
JR   C,L7393
CP   (HL)
JR   C,L7394
.L7393
LD   A,(HL)
.L7394
JR   L739F
 
.L7396
NEG
ADD  A,C
JR   NC,L739E
CP   (HL)
JR   NC,L739F
.L739E
LD   A,(HL)
.L739F
LD   (DE),A
CALL L73A6
.L73A3
EX   AF,AF'
POP  BC
RET
 
.L73A6
LD   A,&10
OUT  (VDPaddress),A
LD   A,spriteAttrW>8
OUT  (VDPaddress),A
LD   HL,(LE709)
LD   A,H
OUT  (VDPdata),A
push HL
pop  hl
LD   A,L
OUT  (VDPdata),A
RET
 
.L73BA
LD   A,(LE70B)
OR   A
RET  Z
LD   A,(stickData)
AND  &0F
CP   &0F
JR   NZ,L73CE
LD   A,&01
LD   (LE708),A
RET
 
.L73CE
LD   B,A
LD   C,&00
.L73D1
RR   B
JR   C,L73D8
CALL L7373
.L73D8
LD   A,C
ADD  A,&04
LD   C,A
AND  &10
JR   Z,L73D1
LD   HL,LE70C
DEC  (HL)
JR   NZ,L73F1
LD   (HL),&07
LD   HL,LE708
LD   A,(HL)
CP   &08
JR   NC,L73F1
INC  (HL)
.L73F1
RET
 
; alternate flight keys ???
; .L73F2
; DB   &02,&40
; DB   &02,&08
; DB   &02,&04
; DB   &05,&20
; DB   &05,&01

.cursorStep
DW   LE70A
DB   &00,&FF
DW   LE70A
DB   &9F,&01
DW   LE709
DB   &11,&FF
DW   LE709
DB   &E0,&01

IF DEBUGsound
    INCLUDE soundDummy
ELSE
    Include SoundSystemMTX 
ENDIF

.L8205
LD   A,(gameFlagBits)
AND  &20
JR   Z,L8212
LD   A,(LE92E)
AND  &01
RET  NZ
.L8212
LD   A,(LF7CD)
BIT  3,A
RET  NZ
LD   A,(currentView)
OR   A
RET  Z
LD   A,(LF7E7)
CP   &1E
RET  Z
CP   &1F
RET  Z
LD   A,(LEB83)
AND  &F0
RET  NZ
LD   A,(LEB85)
AND  &F0
RET  NZ
LD   A,(LEB87)
AND  &F0
RET  NZ
LD   A,(LF7D3)
LD   HL,(LEB86)
LD   C,&0F
CALL L848D
LD   (LE601),A
LD   A,(LF7CF)
LD   HL,(LEB82)
LD   C,&23
CALL L848D
LD   (LE600),A
LD   A,(LF7D1)
LD   HL,(LEB84)
LD   C,&1C
CALL L848D
LD   BC,(LE600)
PUSH AF
OR   A
JP   M,L8288
JR   NZ,L826B
INC  A
.L826B
LD   D,A
ADD  A,B
LD   B,A
SUB  &1D
JP   M,L8283
JR   Z,L8277
LD   A,&FF
.L8277
INC  A
LD   E,A
LD   A,&1D
SUB  B
ADD  A,D
SUB  E
LD   D,A
LD   B,&1C
JR   L8286
 
.L8283
LD   E,&02
DEC  D
.L8286
JR   L82A7
 
.L8288
CP   &FF
JR   NZ,L828D
DEC  A
.L828D
LD   D,A
ADD  A,B
SUB  &F1
JP   P,L82A0
LD   E,&00
JR   NZ,L8299
INC  E
.L8299
LD   A,B
SUB  &F0
SUB  E
LD   D,A
JR   L82A7
 
.L82A0
LD   E,&02
LD   A,D
NEG
DEC  A
LD   D,A
.L82A7
LD   A,D
ADD  A,E
LD   (LE602),A
LD   A,C
ADD  A,&7A
LD   C,A
LD   A,&A5
SUB  B
LD   B,A
CALL calcPixelAddress
PUSH DE
EX   DE,HL
LD   HL,(LE946)
LD   (HL),E
INC  HL
LD   B,D
POP  DE
POP  AF
AND  &80
OR   B
LD   (HL),A
LD   A,E
RRCA
RRCA
RRCA
OR   D
LD   E,A
LD   A,C
AND  &07
CP   &02
JR   C,L82F3
INC  HL
LD   (HL),E
INC  HL
LD   E,A
INC  HL
LD   IX,L8654
LD   (L82DE+2),A
.L82DE
LD   A,(IX+0)
LD   (HL),A
INC  HL
INC  HL
LD   IX,L865C
LD   A,E
LD   (L82EC+2),A
.L82EC
LD   A,(IX+0)
LD   (HL),A
INC  HL
JR   L8332
 
.L82F3
LD   D,A
LD   A,(LE602)
ADD  A,A
LD   (LE602),A
DEC  HL
LD   A,(HL)
SUB  &08
LD   (HL),A
INC  HL
INC  HL
SET  7,E
LD   (HL),E
INC  HL
LD   IX,L8654
LD   A,D
LD   (L830E+2),A
.L830E
LD   A,(IX+0)
LD   (HL),A
INC  HL
LD   A,D
OR   A
LD   A,&03
JR   Z,L831A
RRA
.L831A
LD   (HL),A
INC  HL
LD   IX,L865C
LD   A,D
LD   (L8324+2),A
.L8324
LD   A,(IX+0)
LD   (HL),A
INC  HL
LD   A,D
OR   A
LD   A,&01
JR   Z,L8330
XOR  A
.L8330
LD   (HL),A
INC  HL
.L8332
EX   DE,HL
LD   A,(LE602)
ADD  A,&05
LD   C,A
XOR  A
LD   B,A
LD   HL,(LEB03)
SBC  HL,BC
RET  C
LD   (LE946),DE
LD   (LEB03),HL
LD   HL,LE948
INC  (HL)
RET
 
.L834D
LD   A,(LE949)
OR   A
RET  Z
LD   HL,(LE75C)
.L8355
LD   E,(HL)
INC  HL
LD   D,(HL)
INC  HL
PUSH DE
LD   E,(HL)
INC  HL
LD   D,(HL)
INC  HL
LD   A,(HL)
INC  HL
PUSH AF
AND  &7F
LD   B,A
EX   DE,HL
PUSH BC
PUSH HL
XOR  A
CALL L854B
POP  HL
POP  BC
POP  AF
OR   A
JP   P,L837A
LD   A,L
ADD  A,&08
LD   L,A
XOR  A
CALL L854B
.L837A
POP  HL
LD   A,H
OR   L
JR   NZ,L8355
RET
 
.L8380
CALL L834D
LD   A,(LE948)
LD   (LE949),A
OR   A
JP   Z,L845C
LD   HL,&0000
LD   (LE75E),HL
LD   HL,LE94A
LD   DE,LE9D6
LD   B,A
.L839A
LD   (LE75C),DE
PUSH BC
PUSH HL
PUSH DE
LD   HL,LE75E
LDI
LDI
POP  BC
LD   (LE75E),BC
POP  HL
LD   A,(HL)
LD   (DE),A
LD   (LE760),A
INC  HL
INC  DE
LD   A,(HL)
LD   (LE762),A
AND  &7F
LD   (DE),A
INC  HL
INC  DE
LD   (LE761),A
LD   A,(HL)
INC  HL
LD   C,A
AND  &80
LD   (LE763),A
LD   A,C
RLCA
RLCA
RLCA
AND  &03
LD   (LE764),A
LD   B,A
LD   A,C
AND  &1F
LD   (LE765),A
ADD  A,B
LD   B,A
EX   AF,AF'
LD   A,(LE763)
OR   B
LD   (DE),A
INC  DE
LD   (LE76A),DE
LD   DE,LE766
LDI
LDI
LDI
LDI
EX   AF,AF'
LD   B,A
EX   AF,AF'
PUSH HL
LD   HL,(LE760)
LD   DE,(LE76A)
CALL L8528
EX   AF,AF'
LD   B,A
LD   A,(LE763)
OR   A
JP   P,L8412
LD   HL,(LE760)
LD   A,L
ADD  A,&08
LD   L,A
CALL L8528
.L8412
LD   HL,(LE760)
LD   DE,(LE76A)
LD   A,(LE762)
OR   A
JP   M,L843C
CALL L845D
CALL L8469
LD   A,(LE763)
OR   A
JP   P,L843A
LD   HL,(LE760)
LD   A,L
ADD  A,&08
LD   L,A
CALL L8475
CALL L8481
.L843A
JR   L8456
 
.L843C
CALL L8469
CALL L845D
LD   A,(LE763)
OR   A
JP   P,L8456
LD   HL,(LE760)
LD   A,L
ADD  A,&08
LD   L,A
CALL L8481
CALL L8475
.L8456
POP  HL
POP  BC
DEC  B
JP   NZ,L839A
.L845C
RET
 
.L845D
LD   A,(LE764)
OR   A
RET  Z
LD   B,A
LD   A,(LE767)
JP   L854B
 
.L8469
LD   A,(LE765)
.L846C
OR   A
RET  Z
LD   B,A
LD   A,(LE769)
JP   L854B
 
.L8475
LD   A,(LE764)
OR   A
RET  Z
LD   B,A
LD   A,(LE766)
JP   L854B
 
.L8481
LD   A,(LE765)
OR   A
RET  Z
LD   B,A
LD   A,(LE768)
JP   L854B
 
.L848D
EX   AF,AF'
LD   A,C
CALL multAxHL24
RL   H
RLA
RL   H
RLA
RL   H
RLA
RL   H
RLA
LD   L,A
EX   AF,AF'
OR   A
LD   A,L
RET  P
NEG
RET
 
.L84A6
LD   A,(LEB83)
LD   HL,LEB85
OR   (HL)
LD   HL,LEB87
OR   (HL)
JR   Z,L84B7
LD   L,A
LD   H,multiplyBits>8
LD   A,(HL)
.L84B7
LD   (LEB9B),A
LD   HL,(LEB82)
CALL L8515
LD   (LEF92),A
PUSH HL
LD   HL,(LEB84)
CALL L8515
LD   (LEF93),A
PUSH HL
LD   HL,(LEB86)
CALL L8515
LD   (LEF94),A
XOR  A
LD   B,A
POP  DE
ADD  HL,DE
ADC  A,B
POP  DE
ADD  HL,DE
EX   DE,HL
ADC  A,B
JR   Z,L84E6
LD   E,D
LD   D,A
LD   A,&08
.L84E6
LD   C,A
LD   A,D
OR   A
JR   Z,L84F5
LD   L,A
LD   H,multiplyBits>8
LD   B,(HL)
.L84EF
RRA
RR   E
DJNZ L84EF
LD   A,(HL)
.L84F5
ADD  A,C
ADD  A,A
ADD  A,A
EX   AF,AF'
XOR  A
SLA  E
ADC  A,&08
LD   L,E
LD   H,A
LD   A,(HL)
INC  L
LD   H,(HL)
LD   L,A
EX   AF,AF'
ADD  A,H
LD   H,A
SRL  H
RR   L
LD   A,(LEB9B)
ADD  A,A
ADD  A,A
ADD  A,H
LD   H,A
JP   findAntiLog
 
.L8515
LD   A,(LEB9B)
OR   A
JR   Z,L8522
LD   B,A
LD   A,H
.L851D
RRA
RR   L
DJNZ L851D
.L8522
LD   E,L
CALL L2191
LD   A,E
RET
 
.L8528
LD   A,L
OUT  (VDPaddress),A
LD   A,H
OUT  (VDPaddress),A
PUSH HL
POP  HL
LD   C,&07
.L8532
IN   A,(VDPdata)
LD   (DE),A
INC  DE
INC  L
LD   A,L
AND  C
JR   NZ,L8548
LD   A,L
DEC  A
AND  &F8
LD   L,A
OUT  (VDPaddress),A
INC  H
LD   A,H
OUT  (VDPaddress),A
PUSH HL
POP  HL
.L8548
DJNZ L8532
RET
 
.L854B
LD   C,A
LD   A,L
OUT  (VDPaddress),A
LD   A,H
OR   &40
OUT  (VDPaddress),A
.L8554
LD   A,(DE)
INC  DE
OR   C
OUT  (VDPdata),A
INC  L
LD   A,L
AND  &07
JP   NZ,L856D
LD   A,L
DEC  A
AND  &F8
LD   L,A
OUT  (VDPaddress),A
INC  H
LD   A,H
OR   &40
OUT  (VDPaddress),A
.L856D
DJNZ L8554
RET
 
.L8570
PUSH HL
PUSH AF
BIT  7,H
JR   Z,L857C
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
.L857C
PUSH HL
LD   A,(LEB87)
OR   H
JR   Z,L8587
LD   C,A
LD   B,&02
LD   A,(BC)
.L8587
LD   (LEB9B),A
OR   A
JR   Z,L8594
LD   B,A
LD   A,H
.L858F
RRA
RR   L
DJNZ L858F
.L8594
CALL multLxE
PUSH HL
LD   HL,(LEB86)
LD   A,(LEB9B)
OR   A
JR   Z,L85A8
LD   B,A
LD   A,H
.L85A3
RRA
RR   L
DJNZ L85A3
.L85A8
CALL multLxE
POP  DE
XOR  A
ADD  HL,DE
ADC  A,A
CALL L1F9C
LD   A,(LEB9B)
OR   A
JR   Z,L85BC
LD   B,A
.L85B9
ADD  HL,HL
DJNZ L85B9
.L85BC
EX   DE,HL
POP  HL
POP  AF
CP   &08
JR   NZ,L85CC
XOR  A
ADD  HL,HL
RLA
ADD  HL,HL
RLA
ADD  HL,HL
RLA
JR   L85DA
 
.L85CC
LD   B,A
XOR  A
DEC  B
JR   Z,L85DA
PUSH DE
LD   D,H
LD   E,L
.L85D4
ADD  HL,DE
ADC  A,&00
DJNZ L85D4
POP  DE
.L85DA
LD   C,L
LD   L,H
LD   H,A
XOR  A
LD   B,&08
.L85E0
RL   C
ADC  HL,HL
RLA
SBC  HL,DE
SBC  A,&00
JR   NC,L85EE
ADD  HL,DE
ADC  A,&00
.L85EE
DJNZ L85E0
LD   A,C
RLA
CPL
POP  HL
LD   L,A
BIT  7,H
RET  Z
NEG
RET
 
.L85FB
LD   A,(spaceType)
OR   A
RET  NZ
LD   A,(LE911)
LD   HL,LEB05
CP   (HL)
RET  NZ
CALL L6C9E
LD   HL,(LF7D2)
BIT  7,H
JR   Z,L8618
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
.L8618
LD   (LEB86),HL
LD   HL,(LF7D0)
LD   A,&08
CALL L8570
PUSH AF
LD   H,&00
LD   BC,L8664
ADD  HL,BC
LD   A,(HL)
LD   HL,(LF7CE)
CALL L8570
POP  BC
ADD  A,&A5
LD   C,A
LD   A,&91
SUB  B
LD   B,A
LD   E,&02
LD   A,(LF7D3)
OR   A
JP   P,L8644
LD   E,&05
.L8644
LD   D,&18
DI
LD   A,&20
OUT  (VDPaddress),A
LD   A,spriteAttrW>8
OUT  (VDPaddress),A
CALL setSpriteData
EI
RET
 
.L8654
DB   &80,&C0,&E0,&70
DB   &38,&1C,&0E,&07
.L865C
DB   &80,&C0,&60,&30
DB   &18,&0C,&06,&03
.L8664
DB   &06,&06,&06,&05
DB   &05,&04,&04,&03
DB   &01
.L866D
LD   HL,LF7CD
RES  4,(HL)
LD   A,(LF7E6)
OR   A
.L8676
RET  Z
CALL L8B66
LD   B,A
LD   A,(LF7E6)
.L867E
SRL  A
DJNZ L867E
JP   L8685
 
.L8685
LD   L,A
LD   H,&00
ADD  HL,HL
LD   BC,&0800
ADD  HL,BC
LD   DE,LE874
LDI
LDI
LD   HL,(LF7DA)
CALL findLog
LD   (LEB68),HL
LD   HL,(LF7DC)
.L86A0
CALL findLog
LD   (LEB6A),HL
LD   HL,(LF7DE)
CALL findLog
LD   (LEB6C),HL
LD   HL,LF7CD
SET  4,(HL)
LD   HL,(LF7CE)
LD   BC,(LEB68)
CALL L86DC
LD   (LF7CE),HL
LD   HL,(LF7D0)
LD   BC,(LEB6A)
CALL L86DC
LD   (LF7D0),HL
LD   HL,(LF7D2)
LD   BC,(LEB6C)
CALL L86DC
LD   (LF7D2),HL
RET
 
.L86DC
PUSH HL
LD   HL,(LE874)
CALL L2160
POP  DE
ADD  HL,DE
RET
 
.L86E6
LD   A,(spaceType)
OR   A
JP   NZ,doBeep
CALL L3359
JP   NZ,doBeep
LD   DE,(LE727)
LD   HL,L2710
OR   A
SBC  HL,DE
JP   NC,doBeep
LD   A,(LF814)
LD   (LE87A),A
CALL L1A7D
CALL L8B7B
LD   A,&19
LD   (LE918),A
LD   A,&02
LD   (LE722),A
LD   HL,&00C8
LD   (LE878),HL
LD   A,&05
LD   (LE87C),A
LD   A,&01
LD   (LE723),A
LD   (LE87B),A
LD   A,&0A
JP   soundSystem
 
.L872E
LD   A,(LE722)
OR   A
JP   Z,L68CD
LD   A,(LE723)
LD   B,A
LD   HL,LE87B
DEC  (HL)
JR   NZ,L874D
LD   A,(LE87C)
LD   (HL),A
LD   A,&07
CP   B
JR   Z,L874D
INC  B
LD   A,B
LD   (LE723),A
.L874D
PUSH BC
CALL L68CD
POP  BC
DJNZ L874D
RET
 
.L8755
LD   A,(LF7E7)
CP   &02
RET  Z
CP   &1E
RET  Z
LD   A,(LF7EE)
CP   &01
RET  Z
LD   A,(LF7CD)
AND  &08
RET  NZ
LD   A,(LEF8E)
OR   A
RET  NZ
LD   DE,(LEB8E)
LD   HL,(LF805)
LD   H,&00
SBC  HL,DE
RET  C
LD   A,(LEF97)
OR   A
JR   NZ,L878F
LD   A,(missionStatus)
CP   &52
JR   Z,L878F
LD   A,(LF7E7)
CP   &01
JR   Z,L87DD
.L878F
LD   A,(LF7E7)
CP   &03
JR   Z,L879E
CP   &05
JR   Z,L879E
CP   &06
JR   NZ,L87A2
.L879E
CALL L8BA6
RET  C
.L87A2
LD   A,(LF7E7)
CP   &01
JR   Z,L87CF
LD   A,(LF7E9)
SUB  &32
LD   (LF7E9),A
JR   NC,L87CF
LD   IX,LF7CD
SET  6,(IX+0)
LD   A,&FF
LD   (LEFA1),A
CALL L31AD
LD   HL,LEFA1
INC  (HL)
CALL L30EA
LD   A,&02
CALL soundSystem
.L87CF
LD   A,(LF7E7)
CP   &1F
LD   A,&14
JR   NZ,L87DA
LD   A,&FF
.L87DA
JP   L193F
 
.L87DD
LD   A,(LF7D3)
OR   A
JP   M,L87EA
LD   HL,&006E
SBC  HL,DE
RET  C
.L87EA
LD   HL,(LEB82)
LD   DE,&001E
OR   A
SBC  HL,DE
JR   NC,L8838
LD   HL,(LEB84)
LD   DE,&0014
OR   A
SBC  HL,DE
JR   NC,L8838
LD   HL,(LF7DE)
LD   A,(LF7D3)
OR   A
JP   P,L8810
BIT  7,H
JR   NZ,L8838
JR   L8816
 
.L8810
BIT  7,H
JR   Z,L8838
RES  7,H
.L8816
LD   DE,&3DD1
SBC  HL,DE
JR   C,L8838
LD   HL,(LF7D6)
RES  7,H
LD   DE,&3DD1
SBC  HL,DE
JP   C,L8838
.L882A
LD   HL,(LF7D2)
LD   DE,-80
ADD  HL,DE
RET  C
.L8832
LD   A,&FF
LD   (LE917),A
RET
 
.L8838
LD   A,&0A
JP   L193F
 
.L883D
LD   HL,(LF7CE)
BIT  7,H
JR   Z,L884A
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
.L884A
LD   (LEB82),HL
LD   HL,(LF7D0)
BIT  7,H
JR   Z,L885A
.L8854
XOR  A
SUB  L
.L8856
LD   L,A
SBC  A,A
SUB  H
LD   H,A
.L885A
LD   (LEB84),HL
LD   HL,(LF7D2)
BIT  7,H
JR   Z,L886A
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
.L886A
LD   (LEB86),HL
LD   (LE941),HL
CALL L84A6
LD   A,(LF7E7)
CP   &64
JR   NZ,L887F
LD   (LE727),HL
JR   L88A8
 
.L887F
CP   &65
JR   NZ,L88A1
LD   A,(missionStatus)
CP   &32
JR   Z,L888E
CP   &33
JR   NZ,L889C
.L888E
LD   DE,(LE93E)
ADD  HL,DE
PUSH HL
LD   HL,-100
ADD  HL,DE
.L8898
LD   (LE93E),HL
POP  HL
.L889C
LD   (LE725),HL
JR   L88A8
 
.L88A1
CP   &01
JR   NZ,L88A8
LD   (LE729),HL
.L88A8
LD   (LEB8E),HL
RET
 
.L88AC
CALL checkDocked            ; does not return if docked
LD   A,(countdown)
OR   A
JP   NZ,doBeep
LD   A,(spaceType)
OR   A
JR   Z,L88C3
LD   A,(repairing)
OR   A
JP   NZ,doBeep
.L88C3
LD   A,(LE91A)
OR   A
JR   NZ,L88D2
.L88C9
CALL doBeep
LD   HL,TselectSystem
JP   L1683
 
.L88D2
LD   A,(currentScreen)
CP   &06
JR   NZ,L88E1
CALL L538B
CALL L53ED
JR   L88EB
 
.L88E1
CP   &04
JR   NZ,L88EB
CALL L5314
CALL L53FD
.L88EB
LD   A,(spaceType)
OR   A
JR   NZ,L88FA
LD   A,(hyperSystem)
LD   HL,currentSystem
CP   (HL)
JR   Z,L88C9
.L88FA
CALL L6141
EX   DE,HL
LD   HL,(hyperFuel)
XOR  A
LD   H,A
SBC  HL,DE
JR   NC,L8910
CALL doBeep
LD   HL,TbeyondRange
JP   L1683
 
.L8910
LD   A,E
LD   (LE87F),A
LD   A,&32
LD   (LE91C),A
LD   A,&0A
LD   (countdown),A
XOR  A
LD   (currentCount),A
LD   (LE925),A
RET
 
.L8926
CALL checkDocked            ; does not return if docked
LD   A,(LF780)
OR   A
JP   Z,doBeep
LD   A,(countdown)
OR   A
JP   NZ,doBeep
XOR  A
LD   (currentCount),A
LD   (LE87F),A
INC  A
LD   (LE925),A
LD   A,&32
LD   (LE91C),A
LD   A,&1E
LD   (countdown),A
RET
 
.L894D
LD   A,(LE920)
OR   A
RET  Z
CALL L8AC8
CALL L1A7D
CALL DrawFrontView
CALL L8B7B
XOR  A
LD   (LE920),A
LD   (spaceType),A
LD   (condition),A
LD   (LEB05),A
LD   A,&01
LD   (LE722),A
LD   (LE723),A
LD   (LE87B),A
LD   A,&0A
LD   (LE87C),A
LD   A,&21
LD   (LE880),A
LD   A,&0C
CALL soundSystem
.L8985
PUSH BC
CALL cleanBuffer
LD   HL,Twoooosh
CALL flashMessage
CALL L872E
CALL displayBuffer
LD   A,(LE880)
ADD  A,&10
JR   NC,L899E
LD   A,&21
.L899E
LD   (LE880),A
CALL colourFill
POP  BC
LD   A,(LE723)
CP   &07
JR   NC,L89AE
LD   B,&3C
.L89AE
DJNZ L8985
CALL random
CP   &0C
JR   NC,L89C0
LD   A,&FF
LD   (spaceType),A
LD   A,&51
JR   L89C2
 
.L89C0
LD   A,&A1
.L89C2
CALL colourFill                ;,light yellow on black main screen
XOR  A
LD   (screenCount),A
CALL L6CB2
LD   A,(LE925)
OR   A
JR   Z,L8A05
XOR  A
LD   (LF780),A
LD   A,(LEB66)
INC  A
AND  &07
LD   (LEB66),A
LD   HL,galaxyInfo
LD   B,&06
.L89E4
RLC  (HL)
INC  HL
DJNZ L89E4
LD   BC,L6060
CALL L5325
LD   A,(missionStatus)
CP   &12
JR   NZ,L8A05
INC  A
LD   (missionStatus),A
LD   A,(hyperSystem)
LD   (LEFA2),A
LD   A,&05
LD   (LEFA3),A
.L8A05
CALL L707D
LD   A,(spaceType)
OR   A
JR   Z,L8A4D
LD   DE,(LF760)
LD   A,(hyperSystem)
CALL decodeSystem
LD   BC,(LF751)
LD   A,C
ADD  A,E
RR   A
LD   (LEEC3),A
LD   A,B
ADD  A,D
RR   A
LD   (LEEC4),A
LD   A,(rating)
INC  A
ADD  A,A
LD   (repairing),A
LD   A,(naughtynes)
RLCA
RLCA
AND  &03
INC  A
LD   (LEEC5),A
CALL L28D4
LD   HL,TdriveMalfunction
CALL flashMessage
LD   HL,LE87F
SRL  (HL)
JR   L8A76
 
.L8A4D
LD   A,(LEB66)
OR   A
JR   Z,L8A64
LD   A,(missionStatus)
OR   A
JR   NZ,L8A64
LD   HL,LE93B
DEC  (HL)
JR   NZ,L8A64
LD   (HL),&40
CALL L908C
.L8A64
CALL random
LD   (last),A
LD   A,(hyperSystem)
LD   (currentSystem),A
CALL L4BA8
CALL L8C94
.L8A76
XOR  A
LD   (LE91A),A
LD   HL,naughtynes
SRL  (HL)
LD   A,(hyperFuel)
LD   HL,LE87F
SUB  (HL)
LD   (hyperFuel),A
CALL L6433
LD   A,(missionStatus)
CP   &30
RET  NZ
CALL cleanBuffer
LD   A,&F8
CALL colourFill                ; white on medium red main screen
LD   HL,Tleak
CALL flashMessage
CALL displayBuffer
LD   A,&46
LD   HL,hyperFuel
SUB  (HL)
PUSH AF
.L8AAA
LD   HL,hyperFuel
LD   A,(HL)
OR   A
JR   Z,L8AB9
DEC  (HL)
CALL L6AAD
HALT 
HALT 
JR   L8AAA
 
.L8AB9
POP  BC
.L8ABA
HALT 
HALT 
HALT 
DJNZ L8ABA
LD   HL,missionStatus
INC  (HL)
LD   A,&A1        
JP   colourFill                ;dark yellow on black main screen
 
.L8AC8
LD   A,(missionStatus)
OR   A
RET  Z
.L8ACD
CP   &14
JR   Z,L8AD5
CP   &18
JR   NZ,L8ADA
.L8AD5
DEC  A
LD   (missionStatus),A
RET
 
.L8ADA
LD   C,A
AND  &F0
CP   &30
JR   NZ,L8AEE
LD   A,C
CP   &33
JR   NZ,L8AE9
INC  A
JR   L8AEA
 
.L8AE9
XOR  A
.L8AEA
LD   (missionStatus),A
RET
 
.L8AEE
CP   &40
JR   NZ,L8AF6
LD   (missionStatus),A
RET
 
.L8AF6
LD   A,C
CP   &51
JR   NZ,L8AFF
INC  A
LD   (missionStatus),A
.L8AFF
RET
 
.L8B00
LD   A,(LF7E7)
CP   &01
JR   NZ,L8B0D
LD   DE,(LE876)
JR   L8B58
 
.L8B0D
CALL L8B66
LD   B,A
LD   A,(LE918)
OR   A
JR   Z,L8B4F
LD   A,(LF7D3)
OR   A
JP   P,L8B27
LD   A,B
SUB  &05
JR   NZ,L8B27
LD   D,A
LD   E,A
JR   L8B4D
 
.L8B27
LD   DE,(LE878)
LD   A,(LF7E7)
CP   &64
JR   NZ,L8B4D
LD   HL,(LEB8E)
OR   A
SBC  HL,DE
LD   BC,L2710
OR   A
SBC  HL,BC
JR   NC,L8B4D
LD   HL,(LEB8E)
OR   A
SBC  HL,BC
LD   (LE878),HL
EX   DE,HL
LD   (LE933),A
.L8B4D
JR   L8B58
 
.L8B4F
LD   A,(LF814)
.L8B52
SRL  A
DJNZ L8B52
LD   E,A
LD   D,B
.L8B58
LD   (LE876),DE
LD   HL,(LF7D2)
OR   A
SBC  HL,DE
LD   (LF7D2),HL
RET
 
.L8B66
LD   BC,(LE941)
LD   A,&01
LD   HL,L2710
.L8B6F
LD   D,H
LD   E,L
SBC  HL,BC
RET  NC
LD   HL,L1676
ADD  HL,DE
INC  A
JR   L8B6F
 
.L8B7B
XOR  A
LD   (LE92B),A
.L8B7F
LD   A,(LF814)
OR   A
JR   Z,L8B8A
CALL L699C
JR   L8B7F
 
.L8B8A
LD   HL,LE92B
DEC  (HL)
RET
 
.L8B8F
XOR  A
LD   (LE92B),A
.L8B93
LD   A,(LF814)
LD   HL,LE87A
CP   (HL)
JR   Z,L8BA1
CALL L6956
JR   L8B93
 
.L8BA1
LD   HL,LE92B
DEC  (HL)
RET
 
.L8BA6
LD   A,(LF77B)
OR   A
RET  Z
LD   A,(LF7D3)
OR   A
RET  M
LD   A,(LF7D1)
OR   A
RET  P
LD   A,(LF7EC)
OR   A
JP   P,L8BC7
LD   A,&01
LD   (cloakEquiped),A
LD   HL,TCloakDev
JP   L8C2F
 
.L8BC7
ADD  A,A
ADD  A,A
LD   E,A
LD   D,&00
LD   HL,LF78B
ADD  HL,DE
LD   A,(HL)
CALL L639C
LD   (LE87D),HL
LD   A,R
AND  &03
INC  A
LD   C,A
LD   B,&00
.L8BDF
PUSH BC
PUSH BC
CALL L63BA
POP  BC
LD   HL,(LE87D)
CALL L63E0
POP  BC
LD   A,(LEB64)
OR   A
JP   P,L8BF9
DEC  BC
LD   A,B
OR   C
JR   NZ,L8BDF
RET
 
.L8BF9
LD   A,C
PUSH AF
LD   A,(LF7EC)
ADD  A,A
ADD  A,A
LD   E,A
LD   D,&00
LD   HL,cargoSpace
ADD  HL,DE
EX   DE,HL
.L8C08
PUSH DE
LD   HL,(LE87D)
CALL longAdd
POP  DE
DEC  C
JR   NZ,L8C08
LD   A,(LF7EC)
ADD  A,A
ADD  A,A
DW   LD_IXL_A
DW   DEC_IXH
NOP
LD   DE,stockList
ADD  IX,DE
POP  AF
CALL L63AA
LD   A,(LF7EC)
LD   HL,commoditiesList
CALL scanList
.L8C2F
CALL flashMessage
CALL L30A9
LD   A,&0D
CALL soundSystem
SCF
RET
 
.TselectSystem
DC   "Select System!"
.TbeyondRange
DC   "Beyond Range!"
.Twoooosh
DC   "Hyperdrive Engaged"
.Tleak
DC   "Fuel Leak!"
.TdriveMalfunction
DC   "Drive malfunction!"
.TCloakDev
DC   "Cloaking device"

.L8C94
CALL L28D4
LD   A,&0D
LD   (LF7CD),A
.L8C9C
LD   HL,&5FB4
SCF
CALL L8F25
BIT  7,H
JR   NZ,L8CAF
LD   DE,&E2B4
ADC  HL,DE
JP   P,L8CB1
.L8CAF
JR   L8C9C
 
.L8CB1
LD   A,&00
LD   (LF7EE),A
LD   A,&64
LD   (LF7E7),A
XOR  A
LD   (LF7E6),A
CALL L3037
LD   A,&01
LD   (LF7CD),A
.L8CC7
LD   HL,&1D4C
SCF
CALL L8F25
CALL L8D8E
LD   BC,(LEBA1)
LD   HL,(LF7CE)
ADD  HL,BC
LD   (LF7CE),HL
LD   BC,(LEBA3)
LD   HL,(LF7D0)
ADD  HL,BC
LD   (LF7D0),HL
LD   BC,(LEBA5)
LD   HL,(LF7D2)
ADD  HL,BC
LD   (LF7D2),HL
CALL L883D
LD   DE,&5FB4
SBC  HL,DE
JR   C,L8CC7
LD   A,&01
LD   (LF7E7),A
LD   A,&02
LD   (LF7EE),A
CALL L3037
LD   A,&0D
LD   (LF7CD),A
LD   HL,LF7CE
LD   B,&03
.L8D13
XOR  A
SUB  (HL)
LD   (HL),A
INC  HL
SBC  A,A
SUB  (HL)
LD   (HL),A
INC  HL
DJNZ L8D13
LD   A,&00
LD   (LF7EE),A
LD   A,&65
LD   (LF7E7),A
JP   L3037
 
.L8D2A
CALL L28D4
LD   A,&0D
LD   (LF7CD),A
LD   HL,&0000
LD   (LF7CE),HL
LD   (LF7D0),HL
LD   HL,L1B58
LD   (LF7D2),HL
LD   A,&00
LD   (LF7EE),A
LD   A,&64
LD   (LF7E7),A
XOR  A
LD   (LF7E6),A
CALL L3037
LD   A,&01
LD   (LF7CD),A
LD   HL,-500
LD   (LF7D2),HL
LD   HL,L9080
LD   DE,LF7D4
LD   BC,&000C
LDIR
LD   A,&01
LD   (LF7E7),A
LD   A,&02
LD   (LF7EE),A
CALL L3037
LD   A,&0D
LD   (LF7CD),A
LD   HL,&5FB4
OR   A
CALL L8F25
LD   A,&00
LD   (LF7EE),A
LD   A,&65
LD   (LF7E7),A
JP   L3037
 
.L8D8E
LD   HL,LF7CE
LD   DE,LF7DA
LD   BC,&0006
LDIR
LD   HL,LF7DA
LD   B,&03
.L8D9E
LD   E,(HL)
INC  HL
LD   D,(HL)
LD   A,D
OR   A
JP   P,L8DAD
XOR  A
SUB  E
LD   E,A
SBC  A,A
SUB  D
JR   L8DAF
 
.L8DAD
OR   &80
.L8DAF
LD   (HL),A
DEC  HL
LD   (HL),E
INC  HL
INC  HL
DJNZ L8D9E
JP   L8E62
 
.L8DB9
LD   A,(LF809)
OR   A
RET  Z
CALL L3341
LD   C,A
CP   &FF
JR   NZ,L8DCA
LD   A,&01
JR   L8DD9
 
.L8DCA
AND  &0F
LD   B,A
.L8DCD
CALL random
AND  &07
CP   B
JR   Z,L8DD7
JR   NC,L8DCD
.L8DD7
OR   A
RET  Z
.L8DD9
LD   B,A
LD   A,C
RRA
RRA
RRA
RRA
AND  &0F
LD   C,A
LD   L,(IX+1)
LD   H,(IX+2)
LD   (LF7CE),HL
LD   L,(IX+3)
LD   H,(IX+4)
LD   (LF7D0),HL
LD   L,(IX+5)
LD   H,(IX+6)
LD   (LF7D2),HL
LD   A,&41
LD   (LF7CD),A
LD   A,(IX+26)
CP   &04
LD   A,&07
JR   Z,L8E0D
LD   A,&03
.L8E0D
LD   (LF7E7),A
LD   A,&09
LD   (LF7EE),A
LD   A,&FF
LD   (LF7E6),A
.L8E1A
CALL L8E45
LD   A,(LF7E7)
CP   &03
LD   A,C
JR   NZ,L8E38
SUB  &0F
JR   Z,L8E37
CALL random
CP   &E5
JR   NC,L8E33
LD   A,C
JR   L8E35
 
.L8E33
AND  &0F
.L8E35
JR   L8E38
 
.L8E37
DEC  A
.L8E38
LD   (LF7EC),A
PUSH BC
CALL L3037
POP  BC
DJNZ L8E1A
JP   L334D
 
.L8E45
PUSH BC
LD   DE,LF7DA
CALL L8E51
CALL L8E62
POP  BC
RET
 
.L8E51
LD   B,&03
.L8E53
CALL random
LD   (DE),A
INC  DE
CALL random
AND  &BF
LD   (DE),A
INC  DE
DJNZ L8E53
RET
 
.L8E62
LD   HL,LF7DA
CALL L4642
.L8E68
LD   DE,LF7E0
CALL L8E51
LD   HL,LF7E0
LD   HL,(LF7DA)
LD   DE,(LF7E0)
CALL Multiply
PUSH HL
LD   HL,(LF7DC)
LD   DE,(LF7E2)
CALL Multiply
PUSH HL
LD   HL,(LF7DE)
LD   DE,(LF7E4)
CALL Multiply
POP  DE
ADD  HL,DE
POP  DE
OR   A
ADC  HL,DE
JP   M,L8EA2
LD   DE,&C0F9
ADD  HL,DE
JR   NC,L8EAA
JR   L8EA8
 
.L8EA2
LD   DE,&3F07
ADD  HL,DE
JR   C,L8EAA
.L8EA8
JR   L8E68
 
.L8EAA
LD   HL,(LF7E2)
LD   DE,(LF7DE)
CALL Multiply
PUSH HL
LD   HL,(LF7E4)
LD   DE,(LF7DC)
CALL Multiply
EX   DE,HL
POP  HL
XOR  A
SBC  HL,DE
JP   P,L8ECE
SUB  L
LD   L,A
SBC  A,A
SUB  H
OR   &80
LD   H,A
.L8ECE
LD   (LF7D4),HL
LD   HL,(LF7E4)
LD   DE,(LF7DA)
CALL Multiply
PUSH HL
LD   HL,(LF7E0)
LD   DE,(LF7DE)
CALL Multiply
EX   DE,HL
POP  HL
XOR  A
SBC  HL,DE
JP   P,L8EF5
SUB  L
LD   L,A
SBC  A,A
SUB  H
OR   &80
LD   H,A
.L8EF5
LD   (LF7D6),HL
LD   HL,(LF7E0)
LD   DE,(LF7DC)
CALL Multiply
PUSH HL
LD   HL,(LF7E2)
LD   DE,(LF7DA)
CALL Multiply
EX   DE,HL
POP  HL
XOR  A
SBC  HL,DE
JP   P,L8F1C
SUB  L
LD   L,A
SBC  A,A
SUB  H
OR   &80
LD   H,A
.L8F1C
LD   (LF7D8),HL
LD   HL,LF7D4
JP   L4642
 
.L8F25
LD   (LE600),HL
JR   NC,L8F3C
.L8F2A
CALL random
LD   E,A
CALL random
AND  &01
LD   D,A
LD   HL,-361
ADD  HL,DE
JR   C,L8F2A
JR   L8F3F
 
.L8F3C
LD   DE,&0000
.L8F3F
CALL L8FBB
LD   (LE602),A
LD   A,E
LD   (LE603),A
.L8F49
CALL random
LD   E,A
CALL random
AND  &01
LD   D,A
LD   HL,-361
ADD  HL,DE
JR   C,L8F49
CALL L8FBB
LD   (LE604),A
LD   A,E
LD   (LE605),A
LD   HL,(LE600)
LD   A,(LE603)
CALL L8F94
LD   A,(LE605)
CALL L8F94
LD   (LF7CE),HL
LD   HL,(LE600)
LD   A,(LE604)
CALL L8F94
LD   (LF7D0),HL
LD   HL,(LE600)
LD   A,(LE602)
CALL L8F94
LD   A,(LE605)
CALL L8F94
LD   (LF7D2),HL
RET
 
.L8F94
LD   C,A
XOR  H
EX   AF,AF'
BIT  7,H
JR   Z,L8FA1
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
.L8FA1
LD   A,C
OR   A
JP   P,L8FA8
NEG
.L8FA8
CALL multAxHL24
RL   L
RL   H
RLA
LD   L,H
LD   H,A
EX   AF,AF'
RET  P
XOR  A
SUB  L
LD   L,A
SBC  A,A
SUB  H
LD   H,A
RET
 
.L8FBB
LD   HL,-91
ADD  HL,DE
JR   C,L8FCE
LD   A,E
CALL lookupSinA
EX   AF,AF'
LD   A,90
SUB  E
CALL lookupSinA
JR   L9019
 
.L8FCE
LD   HL,-181
ADD  HL,DE
JR   C,L8FE5
LD   A,180
SUB  E
CALL lookupSinA
EX   AF,AF'
LD   A,E
SUB  &5A
CALL lookupSinA
NEG
JR   L9019
 
.L8FE5
LD   HL,-271
ADD  HL,DE
JR   C,L9004
LD   HL,-180
ADD  HL,DE
LD   A,L
CALL lookupSinA
NEG
EX   AF,AF'
LD   HL,270
OR   A
SBC  HL,DE
LD   A,L
CALL lookupSinA
NEG
JR   L9019
 
.L9004
LD   HL,360
OR   A
.L9008
SBC  HL,DE
LD   A,L
CALL lookupSinA
NEG
.L9010
EX   AF,AF'
LD   HL,-270
ADD  HL,DE
LD   A,L
CALL lookupSinA
.L9019
LD   E,A
EX   AF,AF'
RET
 
.lookupSinA
LD   C,A
LD   B,&00
LD   HL,sinTable
ADD  HL,BC
LD   A,(HL)
RET
 
; table of SIN(A)*128 for A=0 to 90 
.sinTable
DB   &00,&02,&04,&07,&09,&0B,&0D,&0F,&12,&14
Db   &16,&18,&1A,&1D,&1F,&21,&23,&25,&27,&29
DB   &2B,&2E,&30,&32,&34,&36,&38,&3A,&3C,&3E
DB   &40,&41,&43,&45,&47,&49,&4B,&4C,&4E,&50
DB   &52,&53,&55,&57,&58,&5A,&5B,&5D,&5E,&60
DB   &61,&63,&64,&65,&67,&68,&69,&6B,&6C,&6D
DB   &6E,&6F,&70,&71,&72,&73,&74,&75,&76,&77
DB   &77,&78,&79,&79,&7A,&7B,&7B,&7C,&7C,&7D
DB   &7D,&7D,&7E,&7E,&7E,&7F,&7F,&7F,&7F,&7F
DB   &7F

.L9080
DB   &00,&40,&00,&00,&00,&00,&00,&00,&00,&00,&00,&40


Include MissionFile

Include Dictionary

if V2Disc
Include DiscIO2
else
Include DiscIO3
endif


.end

zero 148
.stack  

; thise files are inserted by the loader based on the value of the stack pointer in 
; in the DW words at 102 and 104

insert extractedfiles.shapes/dat
.cockpit
insert extractedfiles.cockpit/dat



ALIGN 16
.CTC
DW   restart38              ; mimic a type 1 interrupt
  IF splitINT
  DW   keyint
  else
  DW   noint
  EndIF
DW   noint
DW   noint

.noint
ei                          ; reenable the interrupt
reti                        ; rearm the CTC

.setupCTC
call doCTC
jp   setupRam               ; will enable interrups on exit

.doCTC
DI
IM   2                      ; Set Z80 to use vectored interrupts
ld   a,%11110000            ; VDP mode saturated colour, 60Hz
out  (fpga),a
ld   a,CTC>8
ld   i,a
ld   a,ctc
;setup CTC0 for the VDP interupt
out  (CTC0),a               ; set the CTC vector
ld   a,&C5                  ; %11000101    Enable,counter,N/A,falling edge
out  (CTC0),a               ;              auto,constant follows,continuous op,control word
ld   a,1
out  (CTC0),a               ; count is one
  if splitINT
  ; setup CTC1 for the keyboard/joystick 
  ; count of 250 = 62.5Hz interrupt
  LD   A,&A5
  OUT  (ctc1),A
  LD   A,250
  OUT  (ctc1),A
  ENDIF
reti                        ; arm CTC

  IF splitInt
  .keyint
  PUSH AF
  PUSH BC
  PUSH DE
  PUSH HL
  CALL readKeyboard
  CALL readStick
  POP  HL
  POP  DE
  POP  BC
  IN   A,(VDPaddress)         ; force a VDP interrupt acknowledge in case one was lost
  POP  AF
  EI   
  RETI                        ; use RETI to rearm the CTC
  endIF

.highram

end