===== Classic BBC Elite Disk flight code ======= Code authors Ian Bell and David Braben, Sep 1984. Commentary (and any errors in understanding) Paul Brink, Sep 2014. Code Block info (All memory address hexadecimal numbers prefixed by &) D.CODE &11E3 &11E3 &441D Over-writes Docked code from &11E3 onwards. Flight code ends 3 bytes before &5600, start of Ship data files memory. Ship data files loaded separately at &5600 onwards once flight code is running. Labels based on Tape version or 2nd Processor source, or guessed as needed. Earliest code written on Acorn Atom, hence assembly labels use fixed array names, AAtoZZ1to255. Flight code below has been unscrambled so 'scramble' code shouldn't be run on this version of the bytes. Format is BBC BASIC's raw bytes 6502 assembler \ labels \ comments \******* D.CODE ******* Called to Fly by docked T.CODE .x11E3 \ -> &11E3 4C 01 12 JMP &1201 \ scramble \ Reset ships .x11E6 4C 01 12 JMP &1201 \ scramble \ Reset ships .x11E9 4C FC 1E JMP &1EFC \ TT26 \ character print .x11EC 4B 11 EQUW &114B \ IRQ1 screen interrupt 4C D5 11 JMP &11D5 \ brk vector e.g. msg at (&FD) .DODOCK \ -> &11F1 \ *LOAD or *RUN T.CODE A2 F8 LDX #&F8 \ #(LOADI MOD 256) A0 11 LDY #&11 \ #(LOADI DIV 256) 20 F7 FF JSR &FFF7 \ OSCLI \ MOS visit then roll into .LOADI \ -> &11F8 \ replaced by Docked DEATH2 code 4C 2E 74 2E 43 4F 44 45 EQUS "L.t.CODE" \ flight code is T.CODE, *LOAD not *RUN until 'L' overwritten by 'R'. 0D EQUB &0D \ string return .scramble \ -> &1201 \ Reset ships A0 00 LDY #0 84 07 STY &07 \ SC \ lo byte of pointer A2 13 LDX #&13 \ flight code pages above &13 scrambled .scrl \ counters X,Y 86 08 STX &08 \ SC+1 \ hi byte of pointer 98 TYA \ = 0 51 07 EOR (&07),Y \ (SC),Y 49 33 EOR #&33 \ '#' unscramble rest of flight D.CODE 91 07 STA (&07),Y \ (SC),Y 88 DEY D0 F4 BNE scrl \ inner loop Y E8 INX \ next page X E0 56 CPX #&56 \ up to page #&55 for flight code. D0 EF BNE scrl \ outer loop X 4C 44 42 JMP &4244 \ RSHIPS \ reset ships .DOENTRY \ -> &121B \ Docking about to succeed A9 52 LDA #&52 \ 'R' to replace 'L' so goes to &11E3 of docked code 8D F8 11 STA &11F8 \ LOADI \ *RUN t.CODE, from &11E3 DOENTRY, not just load. .DEATH2 \ -> &1220 \ reset2, onto Docked code. 20 E1 3E JSR &3EE1 \ RES2 \ reset2 20 7A 0D JSR &0D7A \ reload disc cat into pages &E,&F D0 C9 BNE DODOCK \ guaranteed up, onto Docked Code. .MPERC \ -> &1228 \ line 4000 M%. Some flight controls AD 00 09 LDA &0900 \ allwk \ INWK storage, planet xlo 85 00 STA &00 \ RAND \ seed AE 4C 03 LDX &034C \ JSTX \ Joystick X 20 FF 29 JSR &29FF \ cntr \ Center indicators 20 FF 29 JSR &29FF \ cntr \ Center indicators 8A TXA \ Joystick X 49 80 EOR #&80 \ flip roll A8 TAY \ Yreg = Joystick X flip 29 80 AND #&80 \ keep sign 85 32 STA &32 \ ALP2 \ roll sign 8E 4C 03 STX &034C \ JSTX \ Joystick X updated 49 80 EOR #&80 \ flip 85 33 STA &33 \ ALP2+1 \ flipped roll sign 98 TYA \ Joystick X flip 10 05 BPL P%+7 \ skip -ve 49 FF EOR #&FF 18 CLC 69 01 ADC #1 4A LSR A 4A LSR A \ roll magnitude/4 C9 08 CMP #8 B0 01 BCS P%+3 \ skip lsr 4A LSR A 85 31 STA &31 \ ALP1 \ lower7 bits, roll magnitude 05 32 ORA &32 \ ALP2 \ roll sign 85 8D STA &8D \ ALPHA \ Roll done. AE 4D 03 LDX &034D \ JSTY \ Joystick Y 20 FF 29 JSR &29FF \ cntr \ Center indicators 8A TXA \ Joystick Y 49 80 EOR #&80 \ flip pitch A8 TAY \ Yreg = Joystick Y flip 29 80 AND #&80 \ pitch sign 8E 4D 03 STX &034D \ JSTY \ Joystick Y updated 85 7C STA &7C \ BET2+1 \ flipped pitch sign 49 80 EOR #&80 \ flip 85 7B STA &7B \ BET2 \ pitch sign 98 TYA \ Joystick Y flip 10 02 BPL P%+4 \ skipped -ve 49 FF EOR #&FF 69 04 ADC #4 \ offset will be divided by 16 4A LSR A 4A LSR A 4A LSR A 4A LSR A \ /=16 C9 03 CMP #3 B0 01 BCS P%+3 \ skip lsr 4A LSR A 85 2B STA &2B \ BET1 \ lower7 bits, pitch magnitude 05 7B ORA &7B \ BET2 \ pitch sign 85 2A STA &2A \ BETA \ pitch done. AD CE 03 LDA &03CE \ JDB \ @ = toggle between keyboard and bitpaddle F0 14 BEQ MA12 \ no paddle Speed A2 03 LDX #3 \ joystick channel #3 A9 80 LDA #&80 \ *FX 128 20 F4 FF JSR &FFF4 \ OSBYTE 98 TYA 4A LSR A 4A LSR A \ Yreg/4 C9 28 CMP #40 \ max speed 90 02 BCC P%+4 \ skip lda max A9 28 LDA #40 \ max speed 85 7D STA &7D \ DELTA \ speed D0 18 BNE MA4 \ guaranteed, speed done. .MA12 \ no paddle Speed AD 02 03 LDA &0302 \ KL+2 \ key space_bar, speed up. F0 08 BEQ MA17 \ not hit, sped up A5 7D LDA &7D \ DELTA \ speed C9 28 CMP #40 \ max speed B0 02 BCS MA17 \ speed-up key E6 7D INC &7D \ DELTA \ speed .MA17 \ sped-up key AD 01 03 LDA &0301 \ KL+1 \ key '?' slow-down F0 06 BEQ MA4 \ speed done C6 7D DEC &7D \ DELTA \ speed D0 02 BNE MA4 \ speed done E6 7D INC &7D \ DELTA \ speed back to 1 .MA4 \ speed done AD 0B 03 LDA &030B \ KL+11 \ key 'U' unarm missile 2D 8B 03 AND &038B \ NOMSL \ number of missiles F0 0F BEQ MA20 \ check target a missile A0 EE LDY #&EE \ Green 20 05 38 JSR &3805 \ ABORT \ draw missile block A9 28 LDA #40 \ warning 20 F3 43 JSR &43F3 \ NOISE .MA31 \ disarm missile A9 00 LDA #0 \ missile disarmed 8D 44 03 STA &0344 \ MSAR \ missiles are armed .MA20 \ check target a missile A5 45 LDA &45 \ MSTG \ = #FF if missile NOT targeted 10 12 BPL MA25 \ missile has target, can fire AD 0A 03 LDA &030A \ KL+10 \ key 'T' target missile F0 0D BEQ MA25 \ ignore, can fire AE 8B 03 LDX &038B \ NOMSL \ number of missiles F0 08 BEQ MA25 \ ignore, can fire 8D 44 03 STA &0344 \ MSAR \ #&FF to arm missile and allow possile hitch A0 E0 LDY #&E0 \ Yellow 20 3D 38 JSR &383D \ MSBAR \ draw missile bar .MA25 \ ignore T being hit, can fire missile AD 0C 03 LDA &030C \ KL+12 \ key 'M' for launch missile F0 07 BEQ MA24 \ missile not fired A5 45 LDA &45 \ MSTG \ #FF if missile NOT targeted 30 3A BMI MA64 \ no target, skip a few key tests to check dock C key 20 2E 25 JSR &252E \ FRMIS \ Fire missile .MA24 \ missile not fired AD 08 03 LDA &0308 \ KL+8 \ tab key F0 03 BEQ MA76 \ none, onto docking 0E 82 03 ASL &0382 \ BOMB \ *=2 &7F => &FE .MA76 \ docking AD 10 03 LDA &0310 \ KL+16 \ auto docking F0 05 BEQ MA78 \ check Escape key A9 00 LDA #0 8D 3F 30 STA &033F \ DAUTO \ auto docking \ ** last byte +&11D at &1300 30 eor 33 = 03 From here on unscrambled ** .MA78 \ check Escape key AD 09 03 LDA &0309 \ KL+9 \ key 'ESC' escape capsule 2D 86 03 AND &0386 \ ESCP \ escape pod allowed in misjump F0 03 BEQ P%+5 \ escape not possible 4C C1 20 JMP &20C1 \ ESCAPE \ Launch the escape capsule AD 0E 03 LDA &030E \ KL+14 \ else 'J' try to jump F0 03 BEQ P%+5 \ no J key hit hop to E-key test, lda. 20 4E 43 JSR &434E \ WARP \ else execute a jump AD 0D 03 LDA &030D \ KL+13 \ 'E' ECM system 2D 80 03 AND &0380 \ ECM \ have an ECM? F0 0A BEQ MA64 \ else, check dock C key A5 30 LDA &30 \ ECMA \ ECM already active D0 06 BNE MA64 \ check dock C key CE 40 03 DEC &0340 \ ECMP \ ECM on is player's 20 13 38 JSR &3813 \ ECBLB2 \ start any ECM, bulb set. .MA64 \ check dock C key AD 0F 03 LDA &030F \ KL+15 \ key 'C' docking computer 2D 84 03 AND &0384 \ DKCMP \ have a docking computer? F0 03 BEQ MA68 \ onto Laser 8D 3F 03 STA &033F \ DAUTO \ auto docking set .MA68 \ onto Laser A9 00 LDA #0 \ Laser power per pulse 85 44 STA &44 \ LAS 85 7E STA &7E \ DELT4 \ dust speed lo A5 7D LDA &7D \ DELTA \ speed 4A LSR A \ speed/2 66 7E ROR &7E \ DELT4 4A LSR A 66 7E ROR &7E \ DELT4 85 7F STA &7F \ DELT4+1 \ hi, speed/4 AD 46 03 LDA &0346 \ LASCT \ laser count =9 for pulse, cooled off? D0 2E BNE MA3 \ skip laser AD 07 03 LDA &0307 \ KL+7 \ key 'A' fire laser F0 29 BEQ MA3 \ skip laser AD 47 03 LDA &0347 \ GNTMP \ gun temperature C9 F2 CMP #242 \ overheated B0 22 BCS MA3 \ skip laser AE 45 03 LDX &0345 \ VIEW \ index for laser mount BD 68 03 LDA &0368,X \ LASER,X F0 1A BEQ MA3 \ skip as no laser 48 PHA \ store laser info 29 7F AND #&7F \ laser power 85 44 STA &44 \ LAS 8D 43 03 STA &0343 \ LAS2 A9 00 LDA #0 \ laser fire 20 F3 43 JSR &43F3 \ NOISE 20 82 2A JSR &2A82 \ LASLI \ laser lines 68 PLA \ restore laser sign 10 02 BPL ma1 \ bit7 not set so reset slowly A9 00 LDA #0 \ military or beam reset quick .ma1 \ cool slowly 29 FA AND #&FA \ gives 9 for pulse, 0 for beam 8D 46 03 STA &0346 \ LASCT \ laser count =9 for pulse .MA3 \ skip laser A2 00 LDX #0 .MAL1 \ -> &1376 \ Counter X slot for each nearby ship 86 84 STX &84 \ XSAV \ save nearby slot BD 11 03 LDA &0311,X \ FRIN,X \ nearby ship type D0 03 BNE P%+5 \ skip exit 4C 3F 15 JMP &153F \ MA18 \ exit, onto check Your ship 85 8C STA &8C \ TYPE \ nearby ship type 20 32 37 JSR &3732 \ GINF \ get INF pointer for ship X from UNIV. A0 24 LDY #36 \ #(NI%-1) \ counter, last byte of inwk for ship .MAL2 \ counter Y B1 20 LDA (&20),Y \ (INF),Y \ load ship's univ data into inwk 99 46 00 STA &0046,Y \ INWK,Y \ inner workspace 88 DEY \ next byte 10 F8 BPL MAL2 \ loop Y A5 8C LDA &8C \ TYPE 30 23 BMI MA21 \ planet or sun, move it 0A ASL A \ build hull pointer A8 TAY \ type*2 B9 FE 55 LDA &55FE,Y \ XX21-2,Y \ get ship file entry into 85 1E STA &1E \ XX0 \ hull pointer lo B9 FF 55 LDA &55FF,Y \ XX21-1,Y \ hi 85 1F STA &1F \ XX0+1 \ hull pointer hi AD 82 03 LDA &0382 \ BOMB 10 12 BPL MA21 \ it didn't go off, planet sun move it. C0 04 CPY #4 \ #SST*2 \ is type space station F0 0E BEQ MA21 \ bomb going off had no effect, move it. A5 65 LDA &65 \ INWK+31 \ display|missiles explosion state 29 20 AND #&20 \ bit5 is already exploding D0 08 BNE MA21 \ bomb had no effect, move it. 06 65 ASL &65 \ INWK+31 38 SEC \ set bit7 to Kill ship with debris 66 65 ROR &65 \ INWK+31 20 CE 43 JSR &43CE \ EXNO2 \ faint death noise, player killed ship. .MA21 \ planet or sun, move it 20 A0 50 JSR &50A0 \ MVEIT \ move it A0 24 LDY #36 \ #(NI%-1) .MAL3 \ counter Y B9 46 00 LDA &0046,Y \ INWK,Y \ store inwk back to ship's univ data 91 20 STA (&20),Y \ (INF),Y 88 DEY \ next byte 10 F8 BPL MAL3 \ loop Y A5 65 LDA &65 \ INWK+31 \ display|missiles explosion state 29 A0 AND #&A0 \ kill with debris or already exploding 20 BF 41 JSR &41BF \ MAS4 \ all hi or'd D0 51 BNE MA65 \ ignore as far away, or already killed, exploding. A5 46 LDA &46 \ INWK+0 \ x coordinate lo 05 49 ORA &49 \ INWK+3 \ y coordinate lo 05 4C ORA &4C \ INWK+6 \ z coordinate lo 30 49 BMI MA65 \ ignore as far away, Try targetting missile A6 8C LDX &8C \ TYPE \ nearby ship type 30 45 BMI MA65 \ ignore as sun/planet E0 02 CPX #2 \ is #SST space station F0 44 BEQ ISDK \ is docking 29 C0 AND #&C0 \ else Back to INWK lo bit6 for scooping D0 3D BNE MA65 \ ignore as far away, Try targetting missile E0 01 CPX #1 \ #MSL missile F0 39 BEQ MA65 \ ignore as missile AD 81 03 LDA &0381 \ BST \ fuel scoops Barrel status 25 4B AND &4B \ INWK+5 \ y coordinate sign +ve? 10 79 BPL MA58 \ Big collision, down, as cargo is above E0 05 CPX #5 \ #OIL cargo canister F0 0E BEQ oily \ scoop canister below A0 00 LDY #0 \ else scoop something else. B1 1E LDA (&1E),Y \ (XX0),Y \ Hull data byte#0 of scooped debris 4A LSR A 4A LSR A \ look at upper Nibble 4A LSR A 4A LSR A \ Acc = escape capsule/tharglet? F0 6B BEQ MA58 \ cant scoop, Big collision 69 01 ADC #1 \ gives slave for esc, alien for thargon D0 05 BNE slvy2 \ guaranteed to hop to pieces to scoop .oily \ scoop cannister 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 29 07 AND #7 \ 7 choices to scoop, computers max. .slvy2 \ pieces to scoop 20 EC 2A JSR &2AEC \ tnpr \ ton count, Acc = item becomes Acc = 1 A0 4E LDY #78 \ noise, not used B0 49 BCS MA59 \ Scooping failed, below AC AD 03 LDY &03AD \ QQ29 \ cargo item 79 6F 03 ADC &036F,Y \ QQ20,Y \ cargo counts 99 6F 03 STA &036F,Y \ QQ20,Y 98 TYA \ scooped item 69 D0 ADC #&D0 \ token = FOOD .. GEM-STONES 20 C6 45 JSR &45C6 \ MESS \ message 06 6A ASL &6A \ INWK+36 \ NEWB 38 SEC \ set bit7, remove cannister with no debris 66 6A ROR &6A \ INWK+36 .MA65 \ ignored as far away 4C 73 14 JMP &1473 \ MA26 \ Try targeting missile, down. .ISDK \ is docking to SST nearby AD 49 09 LDA &0949 \ allwk+37+36 \ UNIV #SST last byte NEWB, K%+NI%+36 29 04 AND #4 \ keep bit2, is space station angry? D0 22 BNE MA62 \ Failed dock A5 54 LDA &54 \ INWK+14 \ rotmat0z hi, face normal C9 D6 CMP #&D6 \ z_unit -ve &56 to -ve &60, 26 degrees. 90 1C BCC MA62 \ Failed dock 20 AE 42 JSR &42AE \ SPS1 \ XX15 vector to planet A5 36 LDA &36 \ XX15+2 \ z_unit away from planet C9 56 CMP #&56 \ < #&60 ? 90 13 BCC MA62 \ Failed dock A5 56 LDA &56 \ INWK+16 \ rotmat1x hi, slit roll 29 7F AND #&7F \ clear sign C9 50 CMP #&50 \ < #&60 ? 90 0B BCC MA62 \ Failed dock .GOIN \ -> &143E \ do Dock entry, escape capsule arrives 20 E1 3E JSR &3EE1 \ RES2 \ reset2 A9 08 LDA #8 \ octagon rings 20 3D 26 JSR &263D \ HFS2 \ circles for tunnel 4C 1B 12 JMP &121B \ DOENTRY \ docking about to succeed .MA62 \ Failed dock A5 7D LDA &7D \ DELTA \ speed C9 05 CMP #5 \ < 5? 90 0D BCC MA67 \ slow enough, only damage to player. 4C C6 41 JMP &41C6 \ DEATH \ else death .MA59 \ -> &1452 \ Scooping failed 20 B1 43 JSR &43B1 \ EXNO3 \ ominous noises .MA60 \ kill it 06 65 ASL &65 \ INWK+31 \ display|missiles explosion state 38 SEC \ set bit7 to kill it with debris 66 65 ROR &65 \ INWK+31 .MA61 D0 17 BNE MA26 \ guaranteed, onto Try targeting missile. .MA67 \ slow enough, damage to player A9 01 LDA #1 \ slow speed 85 7D STA &7D \ DELTA A9 05 LDA #5 \ small dent D0 09 BNE MA63 \ guaranteed, little Oops. .MA58 \ -> &1464 \ Big Collision, cargo destroyed. 06 65 ASL &65 \ INWK+31 \ display|missiles explosion state 38 SEC \ set bit to kill it with debris 66 65 ROR &65 \ INWK+31 A5 69 LDA &69 \ INWK+35 \ Energy of nearby ship 38 SEC \ damage to player is 6A ROR A \ dent = 128+energy/2 .MA63 \ little Oops 20 E4 36 JSR &36E4 \ OOPS \ Lose some shield strength, cargo, could die. 20 B1 43 JSR &43B1 \ EXNO3 \ ominous noises .MA26 \ -> &1473 \ Try targeting missile, several arrive to continue. A5 6A LDA &6A \ INWK+36 \ NEWB bit 7 remove ship? 10 03 BPL P%+5 \ no skip scan 20 58 55 JSR &5558 \ SCAN \ remove ship on scanner A5 87 LDA &87 \ QQ11 \ space view? D0 72 BNE MA15 \ maybe Remove ship AE 45 03 LDX &0345 \ VIEW \ else set space view direction F0 03 BEQ P%+5 \ skip if view = forward 20 04 54 JSR &5404 \ PU1 \ inwk not forward view 20 C7 24 JSR &24C7 \ HITCH \ Carry set if ship collides or missile locks. 90 62 BCC MA8 \ else just Draw object AD 44 03 LDA &0344 \ MSAR \ hitched, is missile already armed? F0 0A BEQ MA47 \ onto laser lock 20 BA 43 JSR &43BA \ BEEP \ missile found a target A6 84 LDX &84 \ XSAV \ nearby ship slot id becomes missile target A0 0E LDY #&0E \ missile red 20 07 38 JSR &3807 \ ABORT2 \ Xreg stored as missile target .MA47 \ onto laser lock A5 44 LDA &44 \ LAS \ Laser power F0 4F BEQ MA8 \ no laser, just draw object A2 0F LDX #&0F \ distance far 20 DD 43 JSR &43DD \ EXNO \ explosion noise distance X A5 8C LDA &8C \ TYPE \ ship type hit C9 02 CMP #2 \ #SST is Space Station? F0 3F BEQ vang \ visit angry C9 1F CMP #31 \ #CON is Constrictor? D0 0A BNE BURN \ else Constrictor needs military laser A5 44 LDA &44 \ LAS \ Laser power per pulse C9 17 CMP #&17 \ military laser #Armlas with bit7 clear D0 3A BNE MA8 \ else just draw object 46 44 LSR &44 \ LAS \ Laser power/2 46 44 LSR &44 \ LAS \ Laser power/4 .BURN \ Laser burn, also not constrictor. A5 69 LDA &69 \ INWK+35 \ ship energy 38 SEC E5 44 SBC &44 \ LAS \ Laser power B0 28 BCS MA14 \ Survived, else killed it 06 65 ASL &65 \ INWK+31 \ display|missiles explosion state 38 SEC \ set bit7 to kill it with debris 66 65 ROR &65 \ INWK+31 A5 8C LDA &8C \ TYPE \ ship type hit C9 07 CMP #7 \ #AST Asteroid killed? D0 10 BNE nosp \ no splinter, else A5 44 LDA &44 \ LAS \ Laser power C9 32 CMP #&32 \ Mining laser #Mlas with bit7 clear D0 0A BNE nosp \ no splinter 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. A2 08 LDX #8 \ #SPL reload new type is splinter 29 03 AND #3 \ 0to3 rnd splinters 20 87 16 JSR &1687 \ SPIN2 \ use Acc as counter, X = type .nosp \ no splinter, splinters have lower nibble 0 A0 04 LDY #4 \ #PLT generate plate 20 78 16 JSR &1678 \ SPIN \ plate, type is Y A0 05 LDY #5 \ #OIL generate cargo cannister 20 78 16 JSR &1678 \ SPIN \ plate, type is Y 20 CE 43 JSR &43CE \ EXNO2 \ faint death noise, player killed ship. .MA14 \ also Survived 85 69 STA &69 \ INWK+35 \ update ship energy .vang \ visit angry, let other ships know you fired a missile, hit it with laser fire. A5 8C LDA &8C \ TYPE \ ship type 20 4D 25 JSR &254D \ ANGRY .MA8 \ else just Draw object 20 8C 48 JSR &488C \ LL9 \ object ENTRY .MA15 \ maybe Remove ship, legal affect A0 23 LDY #35 \ hull byte#35 A5 69 LDA &69 \ INWK+35 \ ship energy 91 20 STA (&20),Y \ (INF),Y \ update A5 6A LDA &6A \ INWK+36 \ NEWB bit7 remove ship quietly with no debris 30 2D BMI KS1S \ Kill ship A5 65 LDA &65 \ INWK+31 \ display|missiles explosion state 10 2C BPL MAC1 \ maybe far away, else bit7 set, kill with debris 29 20 AND #&20 \ is bit5 set, explosion finished? F0 28 BEQ MAC1 \ maybe far away. Else #&A0, explosion done, you killed it. A5 6A LDA &6A \ INWK+36 \ NEWB 29 40 AND #&40 \ keep bit 6, was victim a cop? 0D 8C 03 ORA &038C \ FIST \ fugitative/innocent status 8D 8C 03 STA &038C \ FIST .q2 AD 4A 03 LDA &034A \ DLY \ delay printing as cash updating will scramble text 0D 41 03 ORA &0341 \ MJ \ mis-jump D0 13 BNE KS1S \ just Kill ship, else display bounty. A0 0A LDY #10 \ hull byte#10 bounty lo B1 1E LDA (&1E),Y \ (XX0),Y F0 0D BEQ KS1S \ just Kill ship1 if multiple of 25.6 Cr AA TAX \ cash lo C8 INY \ hull byte#11 bounty hi B1 1E LDA (&1E),Y \ (XX0),Y A8 TAY \ cash hi 20 D0 32 JSR &32D0 \ MCASH \ more cash, add Xlo.Yhi to cash A9 00 LDA #0 \ token =0, print player cash 20 C6 45 JSR &45C6 \ MESS \ message .KS1S \ Kill ship1 4C 7F 3D JMP &3D7F \ KS1 \ Kill ship1 .MAC1 \ maybe far away A5 8C LDA &8C \ TYPE \ ship type 30 05 BMI MA27 \ planet 20 B2 41 JSR &41B2 \ FAROF \ carry cleared 90 F4 BCC KS1S \ up, kill ship1 as far away. .MA27 \ ship is near, or planet. A0 1F LDY #31 \ (INF)#31 state|missiles explosion state A5 65 LDA &65 \ INWK+31 \ display|missiles explosion state 91 20 STA (&20),Y \ (INF),Y \ allwk state updated A6 84 LDX &84 \ XSAV \ nearby ship slot count E8 INX \ next nearby ship 4C 76 13 JMP &1376 \ MAL1 \ loop X .MA18 \ -> &153F \ check Your ship AD 82 03 LDA &0382 \ BOMB 10 0B BPL MA77 \ no working bomb 0E 82 03 ASL &0382 \ BOMB \ else &FE -> & FC still on. 20 F7 55 JSR &55F7 \ WSCAN \ Wait for line scan, ie whole frame completed. A9 30 LDA #&30 \ colour, logical 0(011) set to actual 0000. white vertical bars 8D 21 FE STA &FE21 \ Sheila+&21 .MA77 \ no working bomb A5 8A LDA &8A \ MCNT \ move count 29 07 AND #7 D0 6D BNE MA22 \ skip updates AE A7 03 LDX &03A7 \ ENERGY \ players energy 10 12 BPL b \ recharge energy only if <50% AE A6 03 LDX &03A6 \ ASH \ else recharge aft shield 20 26 36 JSR &3626 \ SHD \ shield recover 8E A6 03 STX &03A6 \ ASH AE A5 03 LDX &03A5 \ FSH \ forward shield 20 26 36 JSR &3626 \ SHD \ shield recover 8E A5 03 STX &03A5 \ FSH .b \ recharge energy 38 SEC AD 83 03 LDA &0383 \ ENGY \ energy unit recharge rate 6D A7 03 ADC &03A7 \ ENERGY \ player's energy B0 03 BCS P%+5 \ overflowed 8D A7 03 STA &03A7 \ ENERGY AD 41 03 LDA &0341 \ MJ \ witchspace mis-jump D0 42 BNE MA23S \ skip to big distance, else regular space A5 8A LDA &8A \ MCNT \ move count 29 1F AND #&1F \ #31 D0 48 BNE MA93 \ skip space station check at #31 AD 20 03 LDA &0320 \ MANY+2 \ +#SST = SSPR \ space station present D0 37 BNE MA23S \ if true, skip to big distance A8 TAY \ = 0 outside S-range 20 43 1C JSR &1C43 \ MAS2 \ or'd x,y,z coordinate of &902+Y to Acc, Y=planet. D0 31 BNE MA23S \ skip to planet big distance, else build space station as planet is close. A2 1C LDX #28 \ planet 0 up to 28, dont need rot counters or state. .MAL4 \ counter X BD 00 09 LDA &0900,X \ allwk,X \ planet coordinates 95 46 STA &46,X \ INWK,X \ template for space station CA DEX 10 F8 BPL MAL4 \ loop X E8 INX \ Xreg =0 A0 09 LDY #9 \ offset x coord with x inc 20 20 1C JSR &1C20 \ MAS1 \ add 2*INWK(Y+0to1) to INWK(0to2+X) D0 1F BNE MA23S \ Acc = xsg7, too big, skip to big distance A2 03 LDX #3 A0 0B LDY #11 \ offset y coord with y inc 20 20 1C JSR &1C20 \ MAS1 \ add 2*INWK(Y+0to1) to INWK(0to2+X) D0 16 BNE MA23S \ Acc = ysg7, too big, skip to big distance A2 06 LDX #6 A0 0D LDY #13 \ offset z coord with z inc 20 20 1C JSR &1C20 \ MAS1 \ add 2*INWK(Y+0to1) to INWK(0to2+X) D0 0D BNE MA23S \ Acc = zsg7, too big, skip to big distance A9 C0 LDA #&C0 20 B4 41 JSR &41B4 \ FAROF2 \ carry clear if hi > #&C0 90 06 BCC MA23S \ skip to big distance, else close enough to planet to 20 30 3C JSR &3C30 \ WPLS \ wipe sun 20 40 37 JSR &3740 \ NWSPS \ New space station at INWK, S bulb appears. .MA23S \ jmp MA23 as big distance or mis-jump 4C 48 16 JMP &1648 \ MA23 \ big distance .MA22 \ arrived from above when checking own ship and skipped updates. AD 41 03 LDA &0341 \ MJ \ mis-jump D0 F8 BNE MA23S \ MA23 \ to MA23 big distance or mis-jump A5 8A LDA &8A \ MCNT \ move count 29 1F AND #&1F \ #31 .MA93 \ skipped space station check arrives here C9 0A CMP #10 \ every MCNT tenth D0 2E BNE MA29 \ skip altitude checks A9 32 LDA #50 \ player's energy low? CD A7 03 CMP &03A7 \ ENERGY 90 04 BCC P%+6 \ skip message 0A ASL A \ #&64 token = ENERGY LOW 20 C6 45 JSR &45C6 \ MESS \ message A0 FF LDY #&FF \ Altimeter set to max 8C D1 0F STY &0FD1 \ ALTIT C8 INY \ Y = 0 is planet info 20 41 1C JSR &1C41 \ m \ max of x,y,z of Yreg=0 planet D0 63 BNE MA23 \ skip to big distance 20 4F 1C JSR &1C4F \ MAS3 \ get hsb distance squared of &900+Y = planet B0 5E BCS MA23 \ skip to big distance E9 24 SBC #36 \ 6^2 = planet radius^2 90 0C BCC MA28 \ death, Crashed into planet. 85 82 STA &82 \ R \ else update altimeter 20 B8 47 JSR &47B8 \ LL5 \ Q = SQR(Qlo.Rhi) A5 81 LDA &81 \ Q 8D D1 0F STA &0FD1 \ ALTIT D0 4E BNE MA23 \ big distance, else .MA28 \ death, Crashed into planet 4C C6 41 JMP &41C6 \ DEATH .MA29 \ skipped altitude checks earlier C9 0F CMP #15 \ every MCNT=15 D0 09 BNE MA33 \ skip docking message AD 3F 03 LDA &033F \ DAUTO \ auto docking F0 42 BEQ MA23 \ skip to big distance A9 7B LDA #&7B \ token = Docking Computers On D0 3B BNE MA34 \ guaranteed Message .MA33 \ MCNT not 15, skipped docking message C9 14 CMP #20 \ every MCNT=20 D0 3A BNE MA23 \ skip to big distance, else check on Sun A9 1E LDA #30 \ default cabin temperature 8D 42 03 STA &0342 \ CABTMP AD 20 03 LDA &0320 \ SSPR \ space station present D0 30 BNE MA23 \ skip to big distance, as sun not present. A0 25 LDY #37 \ #NI% is offset to Sun info 20 43 1C JSR &1C43 \ MAS2 \ find max of &902 x,y,z coordinate, Sun. D0 29 BNE MA23 \ skip to big distance 20 4F 1C JSR &1C4F \ MAS3 \ get hsb distance squared of &900+Y to Sun 49 FF EOR #&FF \ flip 69 1E ADC #30 8D 42 03 STA &0342 \ CABTMP B0 CF BCS MA28 \ up to Death, too hot. C9 E0 CMP #&E0 \ close enough to sun? 90 19 BCC MA23 \ skip to big distance AD 81 03 LDA &0381 \ BST \ fuel scoops Barrel status F0 14 BEQ MA23 \ skip to big distance A5 7F LDA &7F \ DELT4+1 \ hi, speed/4, 10 max 4A LSR A \ speed/8 is fuel scooped 6D 65 03 ADC &0365 \ QQ14 \ ship fuel C9 46 CMP #&46 \ max fuel allowed #70 = #&46 90 02 BCC P%+5 \ not full A9 46 LDA #&46 \ max fuel allowed #70 = #&46 8D 65 03 STA &0365 \ QQ14 A9 A0 LDA #&A0 \ token = FUEL SCOOPS ON .MA34 \ Message 20 C6 45 JSR &45C6 \ MESS \ message .MA23 \ -> &1648 \ big distance, many arrive here to continue. AD 43 03 LDA &0343 \ LAS2 F0 0F BEQ MA16 \ already switched laser Off AD 46 03 LDA &0346 \ LASCT \ laser count C9 08 CMP #8 \ reached 8 for pulse laser B0 08 BCS MA16 \ laser off 20 A1 2A JSR &2AA1 \ LASLI2 \ stops drawing laser lines early for pulse laser A9 00 LDA #0 \ counter reached 8 8D 43 03 STA &0343 \ LAS2 \ so pulse laser doesn't restart .MA16 \ already switched laser Off AD 40 03 LDA &0340 \ ECMP \ ECM on is player's? F0 05 BEQ MA69 \ ecm finished 20 29 36 JSR &3629 \ DENGY \ else drain energy by 1 for active ECM pulse F0 08 BEQ MA70 \ no energy, ecm off. .MA69 \ ecm finished A5 30 LDA &30 \ ECMA \ someone's ECM active? F0 07 BEQ MA66 \ skip ecm off C6 30 DEC &30 \ ECMA \ ECM on counter was started at #32 D0 03 BNE MA66 \ skip ecm off .MA70 \ ecm off 20 A3 43 JSR &43A3 \ ECMOF .MA66 \ skipped ecm off A5 87 LDA &87 \ QQ11 \ menu i.d. D0 1F BNE oh \ not a space view, rts 4C 25 1A JMP &1A25 \ STARS \ Dust Field .SPIN \ -> &1678 \ debris oil plate, type = Yreg 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 10 17 BPL oh \ rts 50% prob no plate, cargo. 48 PHA \ push rnd 98 TYA \ Acc = ship type AA TAX \ Xreg = ship type 68 PLA \ pull rnd A0 00 LDY #0 \ hull byte#0 has debris counter 31 1E AND (&1E),Y \ (XX0),Y 29 0F AND #&0F \ in lower nibble .SPIN2 \ -> &1687 \ use Acc as counter, Xreg = type, splinter arrives here. 85 93 STA &93 \ CNT \ count .spl \ counter CNT F0 09 BEQ oh \ rts A9 00 LDA #0 \ dumb rock, counter CNT \ spl+2 20 92 25 JSR &2592 \ SFS1 \ spawn ship from parent ship, Acc is ai_attack_univ_ecm. Xreg is type created. C6 93 DEC &93 \ CNT \ count-- D0 F7 BNE spl+2 \ loop CNT .oh \ rts 60 RTS \ ----====== end of Block A === onto Block B ======----- .UNIV \ -> &1695 \ address pointers for 13 ships INF on pages &9 &A &B &C. 37 bytes each. 00 09 EQUW allwk+37*0 \ copied to inner worskpace INWK on zero page when needed 25 09 EQUW allwk+37*1 4A 09 EQUW allwk+37*2 6F 09 EQUW allwk+37*3 94 09 EQUW allwk+37*4 B9 09 EQUW allwk+37*5 DE 09 EQUW allwk+37*6 03 0A EQUW allwk+37*7 28 0A EQUW allwk+37*8 4D 0A EQUW allwk+37*9 72 0A EQUW allwk+37*10 97 0A EQUW allwk+37*11 BC 0A EQUW allwk+37*12 \ allwk up to &0ABC while heap for edges working down from &CFF. .TWOS \ -> &16AF \ Mode 4 single pixel 80 40 20 10 EQUD &10204080 08 04 02 01 EQUD &01020408 .TWOS2 \ -> &16B7 \ Mode 4 double-width pixel approx as contained in 1 column C0 60 30 18 EQUD &183060C0 0C 06 03 03 EQUD &0303060C .CTWOS \ -> &16BF \ Mode 5 coloured pixel 88 44 22 11 EQUD &11224488 88 EQUB &88 \ need extra for compass .LL30 \ draw Line using (X1,Y1) , (X2,Y2) .LOIN \ -> &16C4 84 85 STY &85 \ YSAV \ will be restored at the end A9 80 LDA #&80 \ set bit7 85 83 STA &83 \ S 0A ASL A \ = 0 85 90 STA &90 \ SWAP A5 36 LDA &36 \ X2 E5 34 SBC &34 \ X1 B0 05 BCS LI1 \ deltaX 49 FF EOR #&FF \ else negate 69 01 ADC #1 38 SEC .LI1 \ deltaX 85 1B STA &1B \ P \ delta-X A5 37 LDA &37 \ Y2 E5 35 SBC &35 \ Y1 B0 04 BCS LI2 \ deltaY 49 FF EOR #&FF \ else negate 69 01 ADC #1 .LI2 \ deltaY 85 81 STA &81 \ Q \ delta-Y C5 1B CMP &1B \ P \ is Q < P ? 90 03 BCC STPX \ if yes will Step along x 4C 97 17 JMP &1797 \ STPY \ else will step along y .STPX \ Step along x for line A6 34 LDX &34 \ X1 E4 36 CPX &36 \ X2 90 11 BCC LI3 \ is X1 < X2 ? hop down, order correct C6 90 DEC &90 \ SWAP \ set flag A5 36 LDA &36 \ X2 85 34 STA &34 \ X1 86 36 STX &36 \ X2 AA TAX A5 37 LDA &37 \ Y2 A4 35 LDY &35 \ Y1 85 35 STA &35 \ Y2 84 37 STY &37 \ Y1 .LI3 \ order correct Xreg = X1 A5 35 LDA &35 \ Y1 4A LSR A \ build screen index 4A LSR A 4A LSR A 09 60 ORA #&60 \ high byte of screen memory set to page &60+ Y1/8 85 08 STA &08 \ SC+1 A5 35 LDA &35 \ Y1 29 07 AND #7 \ build lo A8 TAY \ row in char 8A TXA \ X1 29 F8 AND #&F8 \ keep upper 5 bits 85 07 STA &07 \ SC \ screen lo 8A TXA \ X1 29 07 AND #7 \ keep lower 3 bits AA TAX \ index mask BD AF 16 LDA &16AF,X \ TWOS,X \ Mode 4 single pixel 85 82 STA &82 \ R \ mask byte A5 81 LDA &81 \ Q \ delta-Y A2 FE LDX #&FE \ roll counter 86 81 STX &81 \ Q .LIL1 \ roll Q 0A ASL A \ highest bit of delta-Y B0 04 BCS LI4 \ steep C5 1B CMP &1B \ P \ delta-X 90 03 BCC LI5 \ shallow .LI4 \ steep E5 1B SBC &1B \ P 38 SEC .LI5 \ shallow 26 81 ROL &81 \ Q \ #&FE B0 F2 BCS LIL1 \ loop Q, end with some low bits in Q A6 1B LDX &1B \ P E8 INX \ Xreg is width A5 37 LDA &37 \ Y2 E5 35 SBC &35 \ Y1 B0 2C BCS DOWN \ draw line to the right and down A5 90 LDA &90 \ SWAP D0 07 BNE LI6 \ else Xreg was correct after all, no need to update R CA DEX .LIL2 \ counter X width A5 82 LDA &82 \ R \ mask byte 51 07 EOR (&07),Y \ (SC),Y 91 07 STA (&07),Y \ (SC),Y .LI6 \ Xreg correct 46 82 LSR &82 \ R \ mask byte 90 08 BCC LI7 \ else moving to next column to right. Bring carry in back 66 82 ROR &82 \ R A5 07 LDA &07 \ SC 69 08 ADC #8 \ next column 85 07 STA &07 \ SC .LI7 \ S += Q. this is like an overflow monitor to update Y A5 83 LDA &83 \ S 65 81 ADC &81 \ Q \ some low bits 85 83 STA &83 \ S 90 07 BCC LIC2 \ skip Y adjustment 88 DEY 10 04 BPL LIC2 \ skip Y adjustment C6 08 DEC &08 \ SC+1 A0 07 LDY #7 .LIC2 \ skip Y adjustment CA DEX D0 DC BNE LIL2 \ loop X width A4 85 LDY &85 \ YSAV \ restore Yreg 60 RTS .DOWN \ Line is going to the right and down A5 90 LDA &90 \ SWAP F0 07 BEQ LI9 \ no swap CA DEX .LIL3 \ counter X width A5 82 LDA &82 \ R \ mask byte 51 07 EOR (&07),Y \ (SC),Y 91 07 STA (&07),Y \ (SC),Y .LI9 \ no swap 46 82 LSR &82 \ R 90 08 BCC LI10 \ still in correct column, hop 66 82 ROR &82 \ R A5 07 LDA &07 \ SC 69 08 ADC #8 \ next column 85 07 STA &07 \ SC .LI10 \ this is like an overflow monitor to update Y A5 83 LDA &83 \ S 65 81 ADC &81 \ Q 85 83 STA &83 \ S 90 09 BCC LIC3 \ skip Y adjustment C8 INY C0 08 CPY #8 D0 04 BNE LIC3 \ have not reached bottom byte of char, hop E6 08 INC &08 \ SC+1 A0 00 LDY #0 .LIC3 \ skipped Y adjustment CA DEX D0 DA BNE LIL3 \ loop X width A4 85 LDY &85 \ YSAV \ restore Yreg 60 RTS .STPY \ -> &1797 \ Step along y for line, goes down and to right A4 35 LDY &35 \ Y1 98 TYA A6 34 LDX &34 \ X1 C4 37 CPY &37 \ Y2 B0 10 BCS LI15 \ skip swap if Y1 >= Y2 C6 90 DEC &90 \ SWAP A5 36 LDA &36 \ X2 85 34 STA &34 \ X1 86 36 STX &36 \ X2 AA TAX A5 37 LDA &37 \ Y2 85 35 STA &35 \ Y1 84 37 STY &37 \ Y2 A8 TAY .LI15 \ Y1 Y2 order is now correct 4A LSR A 4A LSR A 4A LSR A 09 60 ORA #&60 85 08 STA &08 \ SC+1 \ screen hi 8A TXA \ X1 29 F8 AND #&F8 85 07 STA &07 \ SC \ screen lo 8A TXA 29 07 AND #7 \ mask index AA TAX BD AF 16 LDA &16AF,X \ TWOS,X \ Mode4 single pixel 85 82 STA &82 \ R \ mask A5 35 LDA &35 \ Y1 29 07 AND #7 A8 TAY A5 1B LDA &1B \ P \ delta-X A2 01 LDX #1 \ roll counter 86 1B STX &1B \ P .LIL4 \ roll P 0A ASL A B0 04 BCS LI13 \ do subtraction C5 81 CMP &81 \ Q \ delta-Y 90 03 BCC LI14 \ less than Q .LI13 \ do subtraction E5 81 SBC &81 \ Q 38 SEC .LI14 \ less than Q 26 1B ROL &1B \ P 90 F2 BCC LIL4 \ loop P, end with some low bits in P A6 81 LDX &81 \ Q E8 INX \ adjust height A5 36 LDA &36 \ X2 E5 34 SBC &34 \ X1 90 2D BCC LFT \ if C cleared then line moving to the left - hop down 18 CLC A5 90 LDA &90 \ SWAP F0 07 BEQ LI17 \ skip first point CA DEX .LIL5 \ skipped first point, counter X A5 82 LDA &82 \ R \ mask byte 51 07 EOR (&07),Y \ (SC),Y 91 07 STA (&07),Y \ (SC),Y .LI17 \ skipped first point 88 DEY 10 04 BPL LI16 \ skip hi adjust C6 08 DEC &08 \ SC+1 A0 07 LDY #7 \ new char .LI16 \ skipped hi adjust A5 83 LDA &83 \ S 65 1B ADC &1B \ P 85 83 STA &83 \ S 90 0C BCC LIC5 \ skip, still in same column 46 82 LSR &82 \ R \ mask 90 08 BCC LIC5 \ no mask bit hop 66 82 ROR &82 \ R \ else moved over to next column, reset mask A5 07 LDA &07 \ SC \ screen lo 69 08 ADC #8 \ next char below 85 07 STA &07 \ SC .LIC5 \ same column CA DEX D0 DC BNE LIL5 \ loop X height A4 85 LDY &85 \ YSAV \ restore Yreg 60 RTS .LFT \ going left A5 90 LDA &90 \ SWAP F0 07 BEQ LI18 \ skip first point CA DEX \ reduce height .LIL6 \ counter X height A5 82 LDA &82 \ R \ mask byte 51 07 EOR (&07),Y \ (SC),Y 91 07 STA (&07),Y \ (SC),Y .LI18 88 DEY 10 04 BPL LI19 \ skip hi adjust C6 08 DEC &08 \ SC+1 A0 07 LDY #7 \ rest char row .LI19 \ skipped hi adjust A5 83 LDA &83 \ S 65 1B ADC &1B \ P \ some low bits 85 83 STA &83 \ S 90 0D BCC LIC6 \ no overflow 06 82 ASL &82 \ R \ else move byte mask to the left 90 09 BCC LIC6 \ no overflow 26 82 ROL &82 \ R A5 07 LDA &07 \ SC E9 07 SBC #7 \ down 1 char 85 07 STA &07 \ SC 18 CLC .LIC6 \ no overflow CA DEX \ height D0 DB BNE LIL6 \ loop X A4 85 LDY &85 \ YSAV \ restore Yreg .HL6 60 RTS \ end Line drawing .FLKB \ Flush keyboard A9 0F LDA #&0F \ flush input buffer AA TAX 4C F4 FF JMP &FFF4 \ OSBYTE .NLIN3 \ -> &1847 \ Title string and draw line underneath 20 9A 33 JSR &339A \ TT27 \ process flight token .NLIN4 \ -> &184A \ draw Line at Y = #19 A9 13 LDA #19 D0 04 BNE NLIN2 \ guaranteed, next horizontal line drawn at Y1=19. .NLIN \ -> &184E \ Horizontal line A9 17 LDA #23 \ at Y1 = 23. E6 2D INC &2D \ YC \ Y text cursor .NLIN2 \ -> &1852 \ Horizontal line at height Acc 85 35 STA &35 \ Y1 A2 02 LDX #2 \ left edge 86 34 STX &34 \ X1 A2 FE LDX #&FE \ right edge 86 36 STX &36 \ X2 D0 0A BNE HLOIN \ guaranteed, horizontal line only uses X1,Y1,X2. .HLOIN2 \ -> &185E \ Horizontal line X1,X2 using YY as mid-point, Acc is half-wdith. 20 4F 3C JSR &3C4F \ EDGES \ Clips Horizontal lines 84 35 STY &35 \ Y1 A9 00 LDA #0 \ flag in line buffer solar at height Y1 99 00 0E STA &0E00,Y \ LSO,Y .HLOIN \ -> &1868 \ Draw a horizontal lines that only needs X1,Y1,X2 84 85 STY &85 \ YSAV \ protect Yreg A6 34 LDX &34 \ X1 E4 36 CPX &36 \ X2 F0 D0 BEQ HL6 \ no line rts 90 07 BCC HL5 \ no swap needed A5 36 LDA &36 \ X2 85 34 STA &34 \ X1 86 36 STX &36 \ X2 AA TAX \ Xreg=X1 .HL5 \ no swap needed C6 36 DEC &36 \ X2 A5 35 LDA &35 \ Y1 4A LSR A \ build screen hi 4A LSR A 4A LSR A 09 60 ORA #&60 85 08 STA &08 \ SC+1 A5 35 LDA &35 \ Y1 29 07 AND #7 85 07 STA &07 \ SC \ screen lo 8A TXA \ X1 29 F8 AND #&F8 A8 TAY \ upper 5 bits of X1 .HL1 8A TXA \ X1 29 F8 AND #&F8 85 D1 STA &D1 \ T A5 36 LDA &36 \ X2 29 F8 AND #&F8 38 SEC E5 D1 SBC &D1 \ T F0 37 BEQ HL2 \ within one column 4A LSR A 4A LSR A 4A LSR A 85 82 STA &82 \ R \ wide count A5 34 LDA &34 \ X1 29 07 AND #7 AA TAX \ mask index BD F5 18 LDA &18F5,X \ TWFR,X \ right 51 07 EOR (&07),Y \ (SC),Y 91 07 STA (&07),Y \ (SC),Y 98 TYA 69 08 ADC #8 A8 TAY \ next column A6 82 LDX &82 \ R \ wide count CA DEX F0 0E BEQ HL3 \ approaching end 18 CLC .HLL1 \ counter X wide count A9 FF LDA #&FF \ mask full line 51 07 EOR (&07),Y \ (SC),Y 91 07 STA (&07),Y \ (SC),Y 98 TYA 69 08 ADC #8 \ next column A8 TAY CA DEX D0 F3 BNE HLL1 \ loop X wide .HL3 \ approaching end R =1 in HL1 A5 36 LDA &36 \ X2 29 07 AND #7 AA TAX \ mask index BD EE 18 LDA &18EE,X \ TWFL,X \ left 51 07 EOR (&07),Y \ (SC),Y 91 07 STA (&07),Y \ (SC),Y A4 85 LDY &85 \ YSAV \ restore Yreg 60 RTS .HL2 \ wide done, X1 and X2 within 1 column A5 34 LDA &34 \ X1 29 07 AND #7 AA TAX \ mask index BD F5 18 LDA &18F5,X \ TWFR,X \ right 85 D1 STA &D1 \ T \ temp mask A5 36 LDA &36 \ X2 29 07 AND #7 AA TAX \ mask index BD EE 18 LDA &18EE,X \ TWFL,X \ left 25 D1 AND &D1 \ T \ temp mask 51 07 EOR (&07),Y \ (SC),Y 91 07 STA (&07),Y \ (SC),Y A4 85 LDY &85 \ YSAV \ restore Y reg 60 RTS \ end horizontal line .TWFL \ -> &18EE \ mask left of horizontal line. 80 C0 E0 F0 EQUD &F0E0C080 F8 FC FE EQUW &FCF8: EQUB &FE .TWFR \ -> &18F5 \ mask right of horizontal line. FF 7F 3F 1F EQUD &1F3F7FFF 0F 07 03 01 EQUD &0103070F .PX3 \ Draw 1 pixel for the case ZZ >= &90 BD AF 16 LDA &16AF,X \ TWOS,X \ Mode 4 single pixel 51 07 EOR (&07),Y \ (SC),Y 91 07 STA (&07),Y \ (SC),Y A4 06 LDY &06 \ T1 \ restore Yreg 60 RTS .PIX1 \ -> &1907 \ dust Pixel, Acc has ALPHA or BETA in it 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S 85 27 STA &27 \ YY+1 \ hi 8A TXA \ lo 99 95 0F STA &0F95,Y \ SYL,Y \ dust ylo .PIXEL2 \ -> &1910 \ dust (X1,Y1) from middle A5 34 LDA &34 \ X1 \ xscreen 10 05 BPL PX1 \ +ve X dust 49 7F EOR #&7F \ else negate 18 CLC 69 01 ADC #1 .PX1 \ +ve X dust 49 80 EOR #&80 \ flip bit7 of X1 AA TAX \ xscreen A5 35 LDA &35 \ Y1 29 7F AND #&7F C9 60 CMP #&60 \ #Y screen half height B0 46 BCS PX4 \ too high, rts A5 35 LDA &35 \ Y1 10 04 BPL PX2 \ +ve Y dust 49 7F EOR #&7F \ else negate 69 01 ADC #1 .PX2 \ +ve Y dust 85 D1 STA &D1 \ T \ temp y dust A9 61 LDA #&61 \ #Y+1 above mid-point E5 D1 SBC &D1 \ T .PIXEL \ -> &1932 \ at (X,A) ZZ away. Yreg protected 84 06 STY &06 \ T1 \ save Yreg A8 TAY \ copy of ycoord 4A LSR A 4A LSR A 4A LSR A 09 60 ORA #&60 85 08 STA &08 \ SC+1 \ screen hi 8A TXA \ xscreen 29 F8 AND #&F8 \ column given by upper 5 bits of X 85 07 STA &07 \ SC \ screen lo 98 TYA \ copy of ycoord 29 07 AND #7 \ char row is lower 3 bits of Yreg A8 TAY 8A TXA 29 07 AND #7 AA TAX \ mask index is lower 3 bits of Xreg A5 88 LDA &88 \ ZZ \ distance C9 90 CMP #&90 \ Bigger number is further away B0 AE BCS PX3 \ for the case ZZ >= &90. Draw 1 pixel BD B7 16 LDA &16B7,X \ TWOS2,X \ Mode 4 double-width pixel 51 07 EOR (&07),Y \ (SC),Y 91 07 STA (&07),Y \ (SC),Y A5 88 LDA &88 \ ZZ C9 50 CMP #&50 B0 0C BCS PX13 \ middle distance pixel ended 88 DEY \ char row below 10 02 BPL PX14 \ double-size A0 01 LDY #1 \ add row above not below .PX14 \ double size BD B7 16 LDA &16B7,X \ TWOS2,X \ double-width pixel 51 07 EOR (&07),Y \ (SC),Y 91 07 STA (&07),Y \ (SC),Y .PX13 \ middle distance pixel ended A4 06 LDY &06 \ T1 \ restore Yreg .PX4 \ rts 60 RTS \ end Pixel .BLINE \ -> &196B \ Ball line for Circle2 uses (X.T) as next y offset for arc 8A TXA 65 E0 ADC &E0 \ K4 \ y0 offset from circle2 is (X,T) 85 78 STA &78 \ K6+2 \ y2 lo = X + K4 lo A5 E1 LDA &E1 \ K4+1 65 D1 ADC &D1 \ T 85 79 STA &79 \ K6+3 \ y2 hi = T + K4 hi A5 92 LDA &92 \ FLAG \ set to #FF at beginning of CIRCLE2 F0 12 BEQ BL1 \ flag 0 E6 92 INC &92 \ FLAG .BL5 \ counter LSP supplied and updated A4 6B LDY &6B \ LSP A9 FF LDA #&FF D9 0D 0F CMP &0F0D,Y \ LSY2-1,Y F0 68 BEQ BL7 \ end, move K6 to K5 99 0E 0F STA &0F0E,Y \ LSY2,Y E6 6B INC &6B \ LSP D0 61 BNE BL7 \ end, move K6 to K5 .BL1 \ flag 0 \ Prepare to clip A5 72 LDA &72 \ K5 85 34 STA &34 \ XX15+0 \ x1 lo A5 73 LDA &73 \ K5+1 85 35 STA &35 \ XX15+1 \ x1 hi A5 74 LDA &74 \ K5+2 85 36 STA &36 \ XX15+2 \ y1 lo A5 75 LDA &75 \ K5+3 85 37 STA &37 \ XX15+3 \ y1 hi A5 76 LDA &76 \ K6 85 38 STA &38 \ XX15+4 \ x2 lo A5 77 LDA &77 \ K6+1 85 39 STA &39 \ XX15+5 \ x2 hi A5 78 LDA &78 \ K6+2 85 3A STA &3A \ XX12+0 \ y2 lo A5 79 LDA &79 \ K6+3 85 3B STA &3B \ XX12+1 \ y2 hi 20 19 4E JSR &4E19 \ LL145 \ Clip XX15 XX12 vector B0 CB BCS BL5 \ no line visible, loop LSP A5 90 LDA &90 \ SWAP F0 10 BEQ BL9 \ skip swap A5 34 LDA &34 \ X1 A4 36 LDY &36 \ X2 85 36 STA &36 \ X2 84 34 STY &34 \ X1 A5 35 LDA &35 \ Y1 A4 37 LDY &37 \ Y2 85 37 STA &37 \ Y2 84 35 STY &35 \ Y1 .BL9 \ swap done A4 6B LDY &6B \ LSP B9 0D 0F LDA &0F0D,Y \ LSY2-1,Y C9 FF CMP #&FF D0 0B BNE BL8 \ skip stores to line buffers A5 34 LDA &34 \ X1 99 C0 0E STA &0EC0,Y \ LSX2,Y A5 35 LDA &35 \ Y1 99 0E 0F STA &0F0E,Y \ LSY2,Y C8 INY \ LSP+1 other end of line segment .BL8 \ skipped stores A5 36 LDA &36 \ X2 99 C0 0E STA &0EC0,Y \ LSX2,Y A5 37 LDA &37 \ Y2 99 0E 0F STA &0F0E,Y \ LSY2,Y C8 INY \ next LSP 84 6B STY &6B \ LSP 20 C4 16 JSR &16C4 \ LOIN \ draw line using (X1,Y1), (X2,Y2) A5 89 LDA &89 \ XX13 \ flag from clip D0 8F BNE BL5 \ loop LSP as XX13 clip .BL7 \ end, move K6 to K5, cnt+=stp A5 76 LDA &76 \ K6 85 72 STA &72 \ K5 A5 77 LDA &77 \ K6+1 85 73 STA &73 \ K5+1 A5 78 LDA &78 \ K6+2 85 74 STA &74 \ K5+2 A5 79 LDA &79 \ K6+3 85 75 STA &75 \ K5+3 A5 93 LDA &93 \ CNT \ count 18 CLC \ cnt += step 65 95 ADC &95 \ STP \ step for ring 85 93 STA &93 \ CNT 60 RTS \ ball line done. .FLIP \ -> &1A05 \ switch dusty and dustx AC C3 03 LDY &03C3 \ NOSTM \ number of dust particles .FLL1 \ counter Y BE 82 0F LDX &0F82,Y \ SY,Y \ dusty B9 5C 0F LDA &0F5C,Y \ SX,Y \ dustx 85 35 STA &35 \ Y1 99 82 0F STA &0F82,Y \ SY,Y \ dusty 8A TXA \ old dusty 85 34 STA &34 \ X1 99 5C 0F STA &0F5C,Y \ SX,Y B9 A8 0F LDA &0FA8,Y \ SZ,Y 85 88 STA &88 \ ZZ \ dust distance 20 10 19 JSR &1910 \ PIXEL2 \ dust (X1,Y1) from middle 88 DEY \ next buffer entry D0 E4 BNE FLL1 \ loop Y 60 RTS .STARS \ -> &1A25 \ Dust Field Enter AE 45 03 LDX &0345 \ VIEW \ laser mount F0 09 BEQ STARS1 \ Forward Dust CA DEX D0 03 BNE ST11 \ Left or Right dust 4C 20 1B JMP &1B20 \ STARS6 \ Rear dust .ST11 \ Left or Right dust 4C 79 26 JMP &2679 \ STARS2 \ Left or Right dust .STARS1 \ Forward Dust AC C3 03 LDY &03C3 \ NOSTM \ number of dust particles .STL1 \ -> &1A36 \ counter Y 20 5E 29 JSR &295E \ DV42 \ P.R = speed/SZ(Y) \ travel step of dust particle front/rear A5 82 LDA &82 \ R \ remainder 46 1B LSR &1B \ P \ hi 6A ROR A 46 1B LSR &1B \ P \ hi is now emptied out. 6A ROR A \ remainder 09 01 ORA #1 85 81 STA &81 \ Q \ upper 2 bits above remainder B9 BB 0F LDA &0FBB,Y \ SZL,Y \ dust zlo E5 7E SBC &7E \ DELT4 \ upper 2 bits are lowest 2 of speed 99 BB 0F STA &0FBB,Y \ SZL,Y \ dust zlo B9 A8 0F LDA &0FA8,Y \ SZ,Y \ dustz 85 88 STA &88 \ ZZ \ old distance E5 7F SBC &7F \ DELT4+1 \ hi, speed/4, 10 max 99 A8 0F STA &0FA8,Y \ SZ,Y \ dustz 20 17 28 JSR &2817 \ MLU1 \ Y1 = SY,Y and P.A = Y1 7bit * Q 85 27 STA &27 \ YY+1 A5 1B LDA &1B \ P \ lo 79 95 0F ADC &0F95,Y \ SYL,Y \ dust ylo 85 26 STA &26 \ YY 85 82 STA &82 \ R \ offsetY lo A5 35 LDA &35 \ Y1 \ old SY,Y 65 27 ADC &27 \ YY+1 85 27 STA &27 \ YY+1 85 83 STA &83 \ S B9 5C 0F LDA &0F5C,Y \ SX,Y \ dustx 85 34 STA &34 \ X1 20 1C 28 JSR &281C \ MLU2 \ P.A = A7bit*Q 85 25 STA &25 \ XX+1 A5 1B LDA &1B \ P 79 6F 0F ADC &0F6F,Y \ SXL,Y \ dust xlo 85 24 STA &24 \ XX A5 34 LDA &34 \ X1 65 25 ADC &25 \ XX+1 85 25 STA &25 \ XX+1 45 33 EOR &33 \ ALP2+1 \ roll sign 20 C6 27 JSR &27C6 \ MLS1 \ P.A = A*alp1 (alp1+<32) 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S 85 27 STA &27 \ YY+1 86 26 STX &26 \ YY 45 32 EOR &32 \ ALP2 \ roll sign 20 BE 27 JSR &27BE \ MLS2 \ R.S = XX(0to1) and P.A = A*alp1 (alp1+<32) 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S 85 25 STA &25 \ XX+1 86 24 STX &24 \ XX A6 2B LDX &2B \ BET1 \ pitch lower7 bits A5 27 LDA &27 \ YY+1 45 7C EOR &7C \ BET2+1 \ flipped pitch sign 20 C8 27 JSR &27C8 \ MULTS-2 \ AP=A*bet1 (bet1+<32) 85 81 STA &81 \ Q 20 9E 28 JSR &289E \ MUT2 \ S = XX+1, R = XX, A.P=Q*A 06 1B ASL &1B \ P 2A ROL A 85 D1 STA &D1 \ T A9 00 LDA #0 6A ROR A 05 D1 ORA &D1 \ T 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S 85 25 STA &25 \ XX+1 8A TXA 99 6F 0F STA &0F6F,Y \ SXL,Y \ dust xlo A5 26 LDA &26 \ YY 85 82 STA &82 \ R A5 27 LDA &27 \ YY+1 85 83 STA &83 \ S \ offset for pix1 A9 00 LDA #0 85 1B STA &1B \ P A5 2A LDA &2A \ BETA 49 80 EOR #&80 20 07 19 JSR &1907 \ PIX1 \ dust, X1 has xscreen. yscreen = R.S+P.A A5 25 LDA &25 \ XX+1 85 34 STA &34 \ X1 99 5C 0F STA &0F5C,Y \ SX,Y \ dustx 29 7F AND #&7F \ drop sign C9 78 CMP #&78 \ #120 B0 20 BCS KILL1 \ kill the forward dust A5 27 LDA &27 \ YY+1 99 82 0F STA &0F82,Y \ SY,Y \ dusty 85 35 STA &35 \ Y1 29 7F AND #&7F \ drop sign C9 78 CMP #&78 \ #120 B0 13 BCS KILL1 \ kill the forward dust B9 A8 0F LDA &0FA8,Y \ SZ,Y \ dustz C9 10 CMP #&10 \ #16 90 0C BCC KILL1 \ kill the forward dust 85 88 STA &88 \ ZZ \ old distance .STC1 \ -> &1AF3 \ Re-enter after kill 20 10 19 JSR &1910 \ PIXEL2 \ dust (X1,Y1) from middle 88 DEY \ next dust particle F0 03 BEQ P%+5 \ rts 4C 36 1A JMP &1A36 \ STL1 \ loop Y forward dust 60 RTS .KILL1 \ kill the forward dust 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 09 04 ORA #4 \ flick up/down 85 35 STA &35 \ Y1 \ ydistance from middle 99 82 0F STA &0F82,Y \ SY,Y \ dusty 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 09 08 ORA #8 \ flick left/right 85 34 STA &34 \ X1 99 5C 0F STA &0F5C,Y \ SX,Y \ dustx 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 09 90 ORA #&90 \ flick distance 99 A8 0F STA &0FA8,Y \ SZ,Y \ dustz 85 88 STA &88 \ ZZ \ old distance A5 35 LDA &35 \ Y1 \ ydistance from middle 4C F3 1A JMP &1AF3 \ STC1 \ guaranteed, Re-enter forward dust loop .STARS6 \ -> &1B20 \ Rear dust AC C3 03 LDY &03C3 \ NOSTM \ number of dust particles .STL6 \ -> &1B23 \ counter Y 20 5E 29 JSR &295E \ DV42 \ P.R = speed/SZ(Y) \ travel step of dust particle front/rear A5 82 LDA &82 \ R \ remainder 46 1B LSR &1B \ P \ hi 6A ROR A 46 1B LSR &1B \ P \ hi is now emptied out 6A ROR A 09 01 ORA #1 85 81 STA &81 \ Q \ upper 2 bits above remainder B9 5C 0F LDA &0F5C,Y \ SX,Y \ dustx 85 34 STA &34 \ X1 20 1C 28 JSR &281C \ MLU2 \ P.A = A7bit*Q 85 25 STA &25 \ XX+1 B9 6F 0F LDA &0F6F,Y \ SXL,Y \ dust xlo E5 1B SBC &1B \ P 85 24 STA &24 \ XX A5 34 LDA &34 \ X1 E5 25 SBC &25 \ XX+1 85 25 STA &25 \ XX+1 20 17 28 JSR &2817 \ MLU1 \ Y1 = SY,Y and P.A = Y1 7bit * Q 85 27 STA &27 \ YY+1 B9 95 0F LDA &0F95,Y \ SYL,Y \ dust ylo E5 1B SBC &1B \ P 85 26 STA &26 \ YY 85 82 STA &82 \ R A5 35 LDA &35 \ Y1 E5 27 SBC &27 \ YY+1 85 27 STA &27 \ YY+1 85 83 STA &83 \ S B9 BB 0F LDA &0FBB,Y \ SZL,Y \ dust zlo 65 7E ADC &7E \ DELT4 \ upper 2 bits are lowest 2 of speed 99 BB 0F STA &0FBB,Y \ SZL,Y \ dust zlo B9 A8 0F LDA &0FA8,Y \ SZ,Y \ dustz 85 88 STA &88 \ ZZ \ old distance 65 7F ADC &7F \ DELT4+1 \ hi, speed/4, 10 max 99 A8 0F STA &0FA8,Y \ SZ,Y \ dustz A5 25 LDA &25 \ XX+1 45 32 EOR &32 \ ALP2 \ roll sign 20 C6 27 JSR &27C6 \ MLS1 \ P.A = A*alp1 (alp1+<32) 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S 85 27 STA &27 \ YY+1 86 26 STX &26 \ YY 45 33 EOR &33 \ ALP2+1 \ flipped roll sign 20 BE 27 JSR &27BE \ MLS2 \ R.S = XX(0to1) and P.A = A*alp1 (alp1+<32) 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S 85 25 STA &25 \ XX+1 86 24 STX &24 \ XX A5 27 LDA &27 \ YY+1 45 7C EOR &7C \ BET2+1 \ flipped pitch sign A6 2B LDX &2B \ BET1 \ pitch lower7 bits 20 C8 27 JSR &27C8 \ MULTS-2 \ AP=A*bet1 (bet1+<32) 85 81 STA &81 \ Q A5 25 LDA &25 \ XX+1 85 83 STA &83 \ S 49 80 EOR #&80 20 A2 28 JSR &28A2 \ MUT1 \ R = XX, A.P=Q*A 06 1B ASL &1B \ P 2A ROL A 85 D1 STA &D1 \ T A9 00 LDA #0 6A ROR A 05 D1 ORA &D1 \ T 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S 85 25 STA &25 \ XX+1 8A TXA 99 6F 0F STA &0F6F,Y \ SXL,Y \ dust xlo A5 26 LDA &26 \ YY 85 82 STA &82 \ R A5 27 LDA &27 \ YY+1 85 83 STA &83 \ S \ offset for pix1 A9 00 LDA #0 85 1B STA &1B \ P A5 2A LDA &2A \ BETA 20 07 19 JSR &1907 \ PIX1 \ dust, X1 has xscreen. yscreen = R.S+P.A A5 25 LDA &25 \ XX+1 85 34 STA &34 \ X1 99 5C 0F STA &0F5C,Y \ SX,Y \ dustx A5 27 LDA &27 \ YY+1 99 82 0F STA &0F82,Y \ SY,Y \ dusty 85 35 STA &35 \ Y1 29 7F AND #&7F \ ignore sign C9 6E CMP #&6E \ #110 B0 13 BCS KILL6 \ rear dust kill B9 A8 0F LDA &0FA8,Y \ SZ,Y \ dustz C9 A0 CMP #&A0 \ #160 B0 0C BCS KILL6 \ rear dust kill 85 88 STA &88 \ ZZ \ old distance .STC6 \ -> &1BE0 \ Re-enter after kill 20 10 19 JSR &1910 \ PIXEL2 \ dust (X1,Y1) from middle 88 DEY F0 03 BEQ ST3 \ rts 4C 23 1B JMP &1B23 \ STL6 \ loop Y rear dust .ST3 \ rts 60 RTS .KILL6 \ rear dust kill 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 29 7F AND #&7F 69 0A ADC #10 99 A8 0F STA &0FA8,Y \ SZ,Y \ dustz 85 88 STA &88 \ ZZ \ old distance 4A LSR A \ get carry B0 14 BCS ST4 \ half of the new dust 4A LSR A A9 FC LDA #&FC \ new dustx at edges 6A ROR A \ may get a carry 85 34 STA &34 \ X1 99 5C 0F STA &0F5C,Y \ SX,Y \ dustx 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 85 35 STA &35 \ Y1 99 82 0F STA &0F82,Y \ SY,Y \ dusty 4C E0 1B JMP &1BE0 \ STC6 \ Re-enter rear dust loop .ST4 \ half of the new dust 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 85 34 STA &34 \ X1 99 5C 0F STA &0F5C,Y \ SX,Y \ dustx 4A LSR A \ get carry A9 E6 LDA #&E6 \ new dusty at edges 6A ROR A 85 35 STA &35 \ Y1 99 82 0F STA &0F82,Y \ SY,Y \ dusty D0 C0 BNE STC6 \ guaranteed, Re-enter rear loop .MAS1 \ -> &1C20 \ Add 2*INWK(0to1+Y) to INWK(0to2+X), add x inc to x coord etc. B9 46 00 LDA &0046,Y \ INWK+0,Y \ lo 0A ASL A \ 2*lo 85 41 STA &41 \ K+1 B9 47 00 LDA &0047,Y \ INWK+1,Y \ hi 2A ROL A \ 2*hi 85 42 STA &42 \ K+2 A9 00 LDA #0 6A ROR A \ carry into bit7 is 85 43 STA &43 \ K+3 \ sign of inc 20 4C 1D JSR &1D4C \ MVT3 \ add INWK(0to2+X) to K(1to3) X = 0, 3, 6 95 48 STA &48,X \ INWK+2,X \ sg A4 41 LDY &41 \ K+1 \ coord lo 94 46 STY &46,X \ INWK+0,X A4 42 LDY &42 \ K+2 \ coord hi 94 47 STY &47,X \ INWK+1,X 29 7F AND #&7F \ Acc = big distance sg lower7 60 RTS .m \ -> &1C41 \ max of x,y,z of &902+Y A9 00 LDA #0 .MAS2 \ -> &1C43 \ or'd x,y,z coordinate of &902+Y 19 02 09 ORA &0902,Y \ allwk+2,Y \ xsg 19 05 09 ORA &0905,Y \ allwk+5,Y \ ysg 19 08 09 ORA &0908,Y \ allwk+8,Y \ zsg 29 7F AND #&7F \ Acc is sg7 distance 60 RTS .MAS3 \ -> &1C4F \ find hsb squared of &901+Y B9 01 09 LDA &0901,Y \ allwk+1,Y \ xhi 20 0D 28 JSR &280D \ SQUA2 \ P.A =A*A unsigned 85 82 STA &82 \ R B9 04 09 LDA &0904,Y \ allwk+4,Y \ yhi 20 0D 28 JSR &280D \ SQUA2 \ P.A =A*A unsigned 65 82 ADC &82 \ R B0 0C BCS MA30 \ sat #&FF 85 82 STA &82 \ R B9 07 09 LDA &0907,Y \ allwk+7,Y \ zhi 20 0D 28 JSR &280D \ SQUA2 \ P.A =A*A unsigned 65 82 ADC &82 \ R \ Acc = z^2 + y^2 + x^2 90 02 BCC P%+4 \ not sat, rts. .MA30 \ sat #&FF A9 FF LDA #&FF 60 RTS .st4 \ tally high of Status code A2 09 LDX #9 \ Elite 9 C9 19 CMP #25 \ 256*25=6400 kills B0 59 BCS st3 \ Xreg = 9 Elite CA DEX \ Deadly 8 C9 0A CMP #10 \ 256*10=2560 kills B0 54 BCS st3 \ Xreg = 8 Deadly CA DEX \ Dangerous 7 C9 02 CMP #2 \ 256*2= 512 kills B0 4F BCS st3 \ Xreg = 7 Dangerous CA DEX \ else Xreg = 6 Competent D0 4C BNE st3 \ guaranteed down, tally continue .STATUS \ -> &1C83 \ Status screen Start #f8 red key A9 08 LDA #8 \ menu i.d. 20 C8 54 JSR &54C8 \ TT66 \ box border with QQ11 set to Acc 20 75 2F JSR &2F75 \ TT111 \ closest to QQ9,10 target system A9 07 LDA #7 \ indent 85 2C STA &2C \ XC \ X text cursor A9 7E LDA #&7E \ token = COMMANDER .....PRESENT SYSTEM...HYPERSPACE SYSTEM...CONDITION 20 47 18 JSR &1847 \ NLIN3 \ Title string and draw line underneath A9 E6 LDA #&E6 \ token = GREEN AC 3E 03 LDY &033E \ JUNK \ not ships, get offset to others nearby BE 13 03 LDX &0313,Y \ FRIN+2,Y \ any other ship types nearby? F0 07 BEQ st6 \ only junk, so have message = GREEN AC A7 03 LDY &03A7 \ ENERGY \ players energy C0 80 CPY #&80 \ (token E7 is red, E8 is yellow) 69 01 ADC #1 \ 1 or 2 .st6 \ have message 20 8F 33 JSR &338F \ plf \ TT27 process flight token followed by rtn A9 7D LDA #&7D \ token = LEGAL STATUS: 20 6D 2B JSR &2B6D \ spc \ Acc to TT27 process flight token, followed by white space A9 13 LDA #&13 \ token = CLEAN AC 8C 03 LDY &038C \ FIST \ Fugitive/Innocent legal status F0 04 BEQ st5 \ clean C0 32 CPY #&32 \ if Y >= #50 then C is set 69 01 ADC #1 \ token OFFENDER or FUGITIVE .st5 \ clean 20 8F 33 JSR &338F \ plf \ TT27 process flight token followed by rtn A9 10 LDA #&10 \ token = RATING: 20 6D 2B JSR &2B6D \ spc \ Acc to TT27 process flight token, followed by white space AD A0 03 LDA &03A0 \ TALLY+1 D0 AB BNE st4 \ tally high, >= Competent, up AA TAX \ else less than 256 kills, set Xreg = 0 AD 9F 03 LDA &039F \ TALLY \ the number of kills lo byte 4A LSR A 4A LSR A \ /=4 so keep upper 6 bits .st5L \ roll kills lo/4 highest bit 54321 E8 INX 4A LSR A \ roll out tally lo bits D0 FC BNE st5L \ loop, max Xreg =5 .st3 \ tally continue, also arrive from st4 tally hi 8A TXA \ tally status Xreg = 0 to 9 18 CLC 69 15 ADC #21 \ Acc = 30 is Elite 20 8F 33 JSR &338F \ plf \ TT27 process flight token followed by rtn A9 12 LDA #&12 \ token = 0x0c SHIP : 20 44 1D JSR &1D44 \ plf2 \ process flight token then rts then tab AD 6E 03 LDA &036E \ CRGO \ cargo bay size C9 1A CMP #26 \ < 25 tonnes? 90 05 BCC P%+7 \ onto fuel scoop A9 6B LDA #&6B \ token = Large Cargo Bay 20 44 1D JSR &1D44 \ plf2 \ process flight token then rts then tab AD 81 03 LDA &0381 \ BST \ Barrel status, fuel scoops F0 05 BEQ P%+7 \ not present, onto e.c.m. A9 6F LDA #&6F \ token = FUEL SCOOPS 20 44 1D JSR &1D44 \ plf2 \ process flight token then rts then tab AD 80 03 LDA &0380 \ ECM \ have an ecm? F0 05 BEQ P%+7 \ not present, onto other equipment A9 6C LDA #&6C \ token = E.C.M.SYSTEM 20 44 1D JSR &1D44 \ plf2 \ process flight token then rts then tab A9 71 LDA #&71 \ start other equipment 85 96 STA &96 \ XX4 \ equip start token .stEL \ counter XX4 A8 TAY \ equipment token BE 11 03 LDX &0311,Y \ equipstart =#&382-#&71,Y F0 03 BEQ P%+5 \ equip not present, skip item 20 44 1D JSR &1D44 \ plf2 \ process flight token then rts then tab E6 96 INC &96 \ XX4 A5 96 LDA &96 \ XX4 C9 75 CMP #&75 \ end equip list 90 EF BCC stEL \ loop XX4 A2 00 LDX #0 \ onto listing lasers .stQL \ counter X 86 93 STX &93 \ CNT \ laser view counter BC 68 03 LDY &0368,X \ LASER,X F0 23 BEQ stQC \ hop as no laser 8A TXA \ laser view 18 CLC 69 60 ADC #&60 \ token = FRONT .. 20 6D 2B JSR &2B6D \ spc \ Acc to TT27 process flight token, followed by white space A9 67 LDA #&67 \ token = PULSE LASER A6 93 LDX &93 \ CNT BC 68 03 LDY &0368,X \ LASER,X \ laser type C0 8F CPY #&8F \ #128+POW = beam? D0 02 BNE P%+4 \ skip token update A9 68 LDA #&68 \ token = BEAM LASER C0 97 CPY #&97 \ #Armlas = military? D0 02 BNE P%+4 \ skip token update A9 75 LDA #&75 \ token = MILITARY LASER C0 32 CPY #&32 \ #Mlas = mining? D0 02 BNE P%+4 \ skip token update A9 76 LDA #&76 \ token = MINING LASER 20 44 1D JSR &1D44 \ plf2 \ process text token then rts then tab .stQC \ hopped as no laser A6 93 LDX &93 \ CNT E8 INX \ next laser view E0 04 CPX #4 \ 4 views max for lasers 90 CF BCC stQL \ loop X 60 RTS .plf2 \ -> &1D44 \ process flight text token then rts then tab 20 8F 33 JSR &338F \ plf \ TT27 flight token followed by rtn A2 06 LDX #6 \ indent for next item 86 2C STX &2C \ XC 60 RTS .MVT3 \ -> &1D4C \ add INWK(0to2+X) to K(1to3) X = 0, 3, 6 A5 43 LDA &43 \ K+3 85 83 STA &83 \ S 29 80 AND #&80 \ sign only 85 D1 STA &D1 \ T 55 48 EOR &48,X \ INWK+2,X 30 18 BMI MV13 \ sg -ve A5 41 LDA &41 \ K+1 18 CLC \ add lo 75 46 ADC &46,X \ INWK+0,X 85 41 STA &41 \ K+1 A5 42 LDA &42 \ K+2 \ hi 75 47 ADC &47,X \ INWK+1,X 85 42 STA &42 \ K+2 A5 43 LDA &43 \ K+3 \ sg 75 48 ADC &48,X \ INWK+2,X 29 7F AND #&7F 05 D1 ORA &D1 \ T \ sign only 85 43 STA &43 \ K+3 60 RTS .MV13 \ sg -ve A5 83 LDA &83 \ S 29 7F AND #&7F \ keep 7 bits 85 83 STA &83 \ S B5 46 LDA &46,X \ INWK+0,X 38 SEC \ sub lo E5 41 SBC &41 \ K+1 85 41 STA &41 \ K+1 B5 47 LDA &47,X \ INWK+1,X E5 42 SBC &42 \ K+2 \ hi 85 42 STA &42 \ K+2 B5 48 LDA &48,X \ INWK+2,X 29 7F AND #&7F E5 83 SBC &83 \ S 09 80 ORA #&80 \ set bit7 45 D1 EOR &D1 \ T \ sign only 85 43 STA &43 \ K+3 \ sg B0 16 BCS MV14 \ rts A9 01 LDA #1 \ else need to flip sign E5 41 SBC &41 \ K+1 \ lo 85 41 STA &41 \ K+1 A9 00 LDA #0 \ hi E5 42 SBC &42 \ K+2 85 42 STA &42 \ K+2 A9 00 LDA #0 \ sg E5 43 SBC &43 \ K+3 29 7F AND #&7F 05 D1 ORA &D1 \ T \ sign only 85 43 STA &43 \ K+3 .MV14 \ rts 60 RTS \ MVT3 done .MVS5 \ -> &1DA8 \ Moveship5, small rotation in matrix (1-1/2/256 = cos 1/16 = sine) B5 47 LDA &47,X \ INWK+1,X 29 7F AND #&7F \ hi7 4A LSR A \ hi7/2 85 D1 STA &D1 \ T B5 46 LDA &46,X \ INWK+0,X 38 SEC \ lo E5 D1 SBC &D1 \ T 85 82 STA &82 \ R \ Xindex one is 1-1/512 B5 47 LDA &47,X \ INWK+1,X E9 00 SBC #0 \ hi 85 83 STA &83 \ S B9 46 00 LDA &0046,Y \ INWK+0,Y 85 1B STA &1B \ P \ Prepare to divide Yindex one by 16 B9 47 00 LDA &0047,Y \ INWK+1,Y 29 80 AND #&80 \ sign bit 85 D1 STA &D1 \ T B9 47 00 LDA &0047,Y \ INWK+1,Y 29 7F AND #&7F \ hi7 4A LSR A \ hi7/2 66 1B ROR &1B \ P \ lo 4A LSR A 66 1B ROR &1B \ P 4A LSR A 66 1B ROR &1B \ P 4A LSR A 66 1B ROR &1B \ P \ divided by 16 05 D1 ORA &D1 \ T \ sign bit 45 9A EOR &9A \ RAT2 \ rot sign 86 81 STX &81 \ Q \ protect Xindex 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S 85 41 STA &41 \ K+1 \ hi 86 40 STX &40 \ K+0 \ lo, save for later A6 81 LDX &81 \ Q \ restore Xindex B9 47 00 LDA &0047,Y \ INWK+1,Y 29 7F AND #&7F \ hi7 4A LSR A \ hi7/2 85 D1 STA &D1 \ T B9 46 00 LDA &0046,Y \ INWK,Y 38 SEC \ sub lo E5 D1 SBC &D1 \ T 85 82 STA &82 \ R \ Yindex one is 1-1/512 B9 47 00 LDA &0047,Y \ INWK+1,Y E9 00 SBC #0 \ sub hi 85 83 STA &83 \ S B5 46 LDA &46,X \ INWK,X 85 1B STA &1B \ P \ Prepare to divide Xindex one by 16 B5 47 LDA &47,X \ INWK+1,X 29 80 AND #&80 \ sign bit 85 D1 STA &D1 \ T B5 47 LDA &47,X \ INWK+1,X 29 7F AND #&7F \ hi7 4A LSR A 66 1B ROR &1B \ P 4A LSR A 66 1B ROR &1B \ P 4A LSR A 66 1B ROR &1B \ P 4A LSR A 66 1B ROR &1B \ P \ divided by 16 05 D1 ORA &D1 \ T \ sign bit 49 80 EOR #&80 \ flip sign 45 9A EOR &9A \ RAT2 \ rot sign 86 81 STX &81 \ Q \ protect Xindex 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S 99 47 00 STA &0047,Y \ INWK+1,Y 96 46 STX &46,Y \ INWK+0,Y \ Yindex one now updated by 1/16th of a radian rotation A6 81 LDX &81 \ Q \ restore Xindex A5 40 LDA &40 \ K \ restore Xindex one lo 95 46 STA &46,X \ INWK+0,X A5 41 LDA &41 \ K+1 \ Xindex one now updated by 1/16th of a radian rotation 95 47 STA &47,X \ INWK+1,X 60 RTS \ MVS5 done .TENS \ -> &1E34 \ print decimal data 48 76 E8 00 EQUD &E87648 \ TENS(0-3) \ 100Billion = 0x17 4876E800 => highest S=23 .pr2 \ -> &1E38 \ number Xreg to printable characters, include decimal if carry set. A9 03 LDA #3 \ number of digits A0 00 LDY #0 \ hi byte = 0 .TT11 \ -> &1E3C \ Print Xlo.Yhi, C set will make decimal point. 85 80 STA &80 \ U \ number of digits A9 00 LDA #0 85 40 STA &40 \ K \ 4-byte Big-endian buffer 85 41 STA &41 \ K+1 84 42 STY &42 \ K+2 86 43 STX &43 \ K+3 \ lsb .BPRNT \ -> &1E48 \ Buffer K print (for cash, A=U=9 cash stored in K buffer) A2 0B LDX #11 \ maximum text width 86 D1 STX &D1 \ T 08 PHP \ copy of Carry flag for decimal point 90 04 BCC TT30 \ no decimal point for galaxy or equipment item C6 D1 DEC &D1 \ T C6 80 DEC &80 \ U \ number of digits .TT30 \ no decimal point A9 0B LDA #11 \ text width 38 SEC \ prepare subtraction 85 86 STA &86 \ XX17 E5 80 SBC &80 \ U 85 80 STA &80 \ U E6 80 INC &80 \ U A0 00 LDY #0 84 83 STY &83 \ S \ highest byte for buffer overflow 4C A4 1E JMP &1EA4 \ TT36 \ skip *10 down into loop .TT35 \ -> &1E65 \ another *10 06 43 ASL &43 \ K+3 26 42 ROL &42 \ K+2 26 41 ROL &41 \ K+1 26 40 ROL &40 \ K+0 26 83 ROL &83 \ S \ msb A2 03 LDX #3 \ use 5-byte buffer XX15 .tt35 \ counter X move K*2 to XX15 B5 40 LDA &40,X \ K,X 95 34 STA &34,X \ XX15,X CA DEX 10 F9 BPL tt35 \ loop X A5 83 LDA &83 \ S \ msb 85 38 STA &38 \ XX15+4 \ overflow byte 06 43 ASL &43 \ K+3 26 42 ROL &42 \ K+2 26 41 ROL &41 \ K+1 26 40 ROL &40 \ K+0 26 83 ROL &83 \ S 06 43 ASL &43 \ K+3 26 42 ROL &42 \ K+2 26 41 ROL &41 \ K+1 26 40 ROL &40 \ K+0 26 83 ROL &83 \ S 18 CLC \ K*=4 done A2 03 LDX #3 \ build K*8+K*2 .tt36 \ counter X K=K*10 B5 40 LDA &40,X \ K,X 75 34 ADC &34,X \ XX15,X 95 40 STA &40,X \ K,X CA DEX 10 F7 BPL tt36 \ loop X A5 38 LDA &38 \ XX15+4 \ overflow byte 65 83 ADC &83 \ S 85 83 STA &83 \ S A0 00 LDY #0 \ K*10 to get next column's digit .TT36 \ -> &1EA4 \ counter Y, skipped *10 done A2 03 LDX #3 38 SEC .tt37 \ counter X, subtract tens off. B5 40 LDA &40,X \ K,X FD 34 1E SBC &1E34,X \ TENS,X \ 100 Billion = & 17 48 76 E8 00 95 34 STA &34,X \ XX15,X CA DEX \ load XX15(3,2,1,0) with K(3,2,1,0) but with 'tens' subtracted off 10 F6 BPL tt37 \ loop X A5 83 LDA &83 \ S E9 17 SBC #&17 \ if reached 100 Billion C is still set. 85 38 STA &38 \ XX15+4 \ overflow byte 90 11 BCC TT37 \ exit, subtractions took Y loops A2 03 LDX #3 \ 4 bytes .tt38 \ counter X, copy XX15(3,2,1,0) back to K(3,2,1,0) B5 34 LDA &34,X \ XX15,X 95 40 STA &40,X \ K,X CA DEX 10 F9 BPL tt38 \ loop X A5 38 LDA &38 \ XX15+4 \ overflow byte 85 83 STA &83 \ S \ XX15(4), with a '23' lopped off of it C8 INY \ counter Y, build digit. 4C A4 1E JMP &1EA4 \ TT36 \ loop Y *10 done, up .TT37 \ subtractions took Y loops 98 TYA \ loop count is digit D0 0C BNE TT32 \ digit Acc to ascii A5 D1 LDA &D1 \ T \ (T=10 for fuel) F0 08 BEQ TT32 \ =0 is digit Acc to ascii C6 80 DEC &80 \ U 10 0E BPL TT34 \ U +ve with U =8 or 9 (for fuel) A9 20 LDA #&20 \ white space, no leading zeros. D0 07 BNE tt34 \ guaranteed TT26 print charcter .TT32 \ digit Acc to ascii A0 00 LDY #0 84 D1 STY &D1 \ T \ = 0 18 CLC \ add ascii '0' 69 30 ADC #&30 \ base B .tt34 \ print character 20 FC 1E JSR &1EFC \ TT26 \ print character .TT34 \ U +ve C6 D1 DEC &D1 \ T 10 02 BPL P%+4 \ skip inc E6 D1 INC &D1 \ T \ min 0 C6 86 DEC &86 \ XX17 \ text width 30 6E BMI rT9 \ rts D0 08 BNE P%+10 \ jmp to TT35 *10 again 28 PLP \ recall carry flag, if clear, no decimal point. 90 05 BCC P%+7 \ jmp to TT35 *10 again A9 2E LDA #&2E \ char '.' is decimal point 20 FC 1E JSR &1EFC \ TT26 \ print character 4C 65 1E JMP &1E65 \ TT35 \ multiply K(0:3) S, by (another) *10. .BELL \ -> &1EFA \ VDU 7 sound A9 07 LDA #7 .TT26 \ -> &1EFC \ PRINT character, also some cases Acc= 11to15. 85 D2 STA &D2 \ K3 \ character 8C 4F 03 STY &034F \ YSAV2 \ store Yreg 8E 4E 03 STX &034E \ XSAV2 \ store Xreg .RRNEW \ visits here from below if New screen A4 72 LDY &72 \ QQ17 \ printing flag, if 128 start Capital. C0 FF CPY #&FF \ print nothing F0 48 BEQ RR4 \ #&0D end, as QQ17 was #&FF C9 07 CMP #7 \ bell? F0 4E BEQ R5 \ further down, beep, restore. C9 20 CMP #&20 \ is Acc >= #32? B0 0C BCS RR1 \ render this ascii character C9 0A CMP #&0A \ down to line F0 04 BEQ RRX1 \ #&0A A2 01 LDX #1 \ others including #&0C to 86 2C STX &2C \ XC \ beginning of line .RRX1 \ #&0A down line E6 2D INC &2D \ YC \ next Y cursor line D0 34 BNE RR4 \ prepare to exit including #&0D. .RR1 \ >= #&20, render this ascii character A2 BF LDX #&BF \ first font page in ROM 0A ASL A 0A ASL A 90 02 BCC P%+4 \ bit6 clear hop page #&C1 A2 C1 LDX #&C1 \ font page 0A ASL A 90 01 BCC P%+3 \ if bit5 clear skip inx E8 INX 85 1C STA &1C \ P+1 \ font address lo 86 1D STX &1D \ P+2 \ font address hi A5 2C LDA &2C \ XC .RR5 0A ASL A 0A ASL A 0A ASL A \ XC*8 is screen lo 85 07 STA &07 \ SC .RR2 \ next char E6 2C INC &2C \ XC A5 2D LDA &2D \ YC C9 18 CMP #24 \ Acc = YC has reached bottom? 90 06 BCC RR3 \ text on this screen 20 C8 54 JSR &54C8 \ TT66 \ else new box border with QQ11 set to Acc 4C 52 1F JMP &1F52 \ RR4 \ prepare to exit .RR3 \ text on this screen 09 60 ORA #&60 \ screen hi byte .RREN \ -> &1F45 \ Acc has destination page for 8 bytes from (P+1) 85 08 STA &08 \ SC+1 \ screen hi A0 07 LDY #7 \ get 8 bytes of font char .RRL1 \ counter Y B1 1C LDA (&1C),Y \ (P+1),Y \ font 51 07 EOR (&07),Y \ (SC),Y 91 07 STA (&07),Y \ (SC),Y 88 DEY \ next byte 10 F7 BPL RRL1 \ loop Y .RR4 \ -> &1F52 \ #&0D end, prepare to exit. AC 4F 03 LDY &034F \ YSAV2 AE 4E 03 LDX &034E \ XSAV2 A5 D2 LDA &D2 \ K3 \ restore these earlier values. 18 CLC .rT9 60 RTS .R5 \ beep, restore. 20 BA 43 JSR &43BA \ BEEP 4C 52 1F JMP &1F52 \ RR4 \ prepare to exit .DIALS \ -> &1F62 \ update displayed Dials A9 D0 LDA #&D0 \ screen lo 85 07 STA &07 \ SC \ bottom console (SC) = &78D0 A9 78 LDA #&78 \ screen hi 85 08 STA &08 \ SC+1 20 26 20 JSR &2026 \ PZW \ flashing X.A = F0.0F or F0.0? 86 41 STX &41 \ K+1 85 40 STA &40 \ K A9 0E LDA #14 \ threshold to change colour 85 06 STA &06 \ T1 A5 7D LDA &7D \ DELTA \ player ship's speed 20 39 20 JSR &2039 \ DIL-1 \ only /2 A9 00 LDA #0 85 82 STA &82 \ R \ lo 85 1B STA &1B \ P \ lo A9 08 LDA #8 \ center indicator 85 83 STA &83 \ S \ = 8 hi A5 31 LDA &31 \ ALP1 \ roll magnitude 4A LSR A 4A LSR A 05 32 ORA &32 \ ALP2 \ roll sign 49 80 EOR #&80 \ flipped 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S 20 8D 20 JSR &208D \ DIL2 \ roll/pitch indicator takes X.A A5 2A LDA &2A \ BETA \ pitch A6 2B LDX &2B \ BET1 \ pitch sign F0 02 BEQ P%+4 \ skip sbc #1 E9 01 SBC #1 \ will add S=8 to Acc to center 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S 20 8D 20 JSR &208D \ DIL2 \ roll/pitch indicator takes X.A A5 8A LDA &8A \ MCNT \ movecount 29 03 AND #3 \ only 1in4 times D0 B5 BNE rT9 \ continue, else rts A0 00 LDY #0 20 26 20 JSR &2026 \ PZW \ flashing X.A = F0.0F or F0.0 86 40 STX &40 \ K 85 41 STA &41 \ K+1 A2 03 LDX #3 \ 4 energy banks 86 06 STX &06 \ T1 \ threshold .DLL23 \ counter X 94 3A STY &3A,X \ XX12,X CA DEX \ energy bank 10 FB BPL DLL23 \ loop X A2 03 LDX #3 \ player's energy AD A7 03 LDA &03A7 \ ENERGY 4A LSR A 4A LSR A \ = ENERGY/4 85 81 STA &81 \ Q .DLL24 \ counter X 38 SEC E9 10 SBC #16 \ each bank 90 0D BCC DLL26 \ exit subtraction with valid Q, X 85 81 STA &81 \ Q \ bank fraction A9 10 LDA #&10 \ full bank 95 3A STA &3A,X \ XX12,X A5 81 LDA &81 \ Q CA DEX \ next energy bank, 0 will be top one. 10 F0 BPL DLL24 \ loop X 30 04 BMI DLL9 \ guaranteed hop, all full. .DLL26 \ exit subtraction with valid Q, X A5 81 LDA &81 \ Q \ bank fraction 95 3A STA &3A,X \ XX12,X .DLL9 \ all full, counter Y B9 3A 00 LDA &003A,Y \ XX12,X 84 1B STY &1B \ P \ store Y 20 3A 20 JSR &203A \ DIL \ energy bank A4 1B LDY &1B \ P \ restore Y C8 INY C0 04 CPY #4 \ reached last energy bank? D0 F1 BNE DLL9 \ loop Y A9 78 LDA #&78 \ move to top left row 85 08 STA &08 \ SC+1 A9 10 LDA #&10 \ some comment about in range 0to80, shield range 85 07 STA &07 \ SC AD A5 03 LDA &03A5 \ FSH \ forward shield 20 36 20 JSR &2036 \ DILX \ shield bar AD A6 03 LDA &03A6 \ ASH \ aft shield 20 36 20 JSR &2036 \ DILX \ shield bar AD 65 03 LDA &0365 \ QQ14 \ ship fuel #70 = #&46 20 38 20 JSR &2038 \ DILX+2 \ /8 not /16 bar 20 26 20 JSR &2026 \ PZW \ flashing X.A = F0.0F or F0.0 86 41 STX &41 \ K+1 85 40 STA &40 \ K A2 0B LDX #11 \ ambient cabin temperature 86 06 STX &06 \ T1 \ threshold to change bar colour AD 42 03 LDA &0342 \ CABTMP \ cabin temperature 20 36 20 JSR &2036 \ DILX \ shield bar AD 47 03 LDA &0347 \ GNTMP \ laser temperature 20 36 20 JSR &2036 \ DILX \ shield bar A9 F0 LDA #&F0 \ high altitude 85 06 STA &06 \ T1 \ threshold to change bar colour 85 41 STA &41 \ K+1 AD D1 0F LDA &0FD1 \ ALTIT \ Altimeter 20 36 20 JSR &2036 \ DILX \ shield bar 4C 34 36 JMP &3634 \ COMPAS \ space compass. .PZW \ -> &2026 \ Flashing X.A = F0.0F or F0.0? A2 F0 LDX #&F0 \ yellow A5 8A LDA &8A \ MCNT \ movecount 29 08 AND #8 2D CA 03 AND &03CA \ FLH \ flash toggle F0 02 BEQ P%+4 \ if zero default to lda #&0F 8A TXA \ else return A = X 2C EQUB &2C \ bit2 skip load A9 0F LDA #&0F \ red 60 RTS .DILX \ -> &2036 \ shield bar 4A LSR A \ /= 2 4A LSR A \ fuel bar starts here 4A LSR A \ DILX+2 4A LSR A \ DIL-1 .DIL \ -> &203A \ energy bank 85 81 STA &81 \ Q \ bar value 0to15 A2 FF LDX #&FF \ mask 86 82 STX &82 \ R C5 06 CMP &06 \ T1 \ threshold to change bar colour B0 04 BCS DL30 \ Acc >= threshold colour will be K A5 41 LDA &41 \ K+1 \ other colour D0 02 BNE DL31 \ skip lda K .DL30 \ threshold colour will be K A5 40 LDA &40 \ K .DL31 85 91 STA &91 \ COL \ the colour A0 02 LDY #2 \ height offset A2 03 LDX #3 \ height of bar-1 .DL1 \ counter X height A5 81 LDA &81 \ Q \ bar value 0to15 C9 04 CMP #4 90 1A BCC DL2 \ exit, Q < 4 E9 04 SBC #4 85 81 STA &81 \ Q A5 82 LDA &82 \ R \ mask .DL5 \ -> &205C \ loop Mask 25 91 AND &91 \ COL 91 07 STA (&07),Y \ (SC),Y C8 INY 91 07 STA (&07),Y \ (SC),Y C8 INY 91 07 STA (&07),Y \ (SC),Y 98 TYA \ step to next char 18 CLC 69 06 ADC #6 \ +=6 A8 TAY CA DEX \ reduce height 30 1C BMI DL6 \ ended, next bar. 10 E0 BPL DL1 \ else guaranteed loop X height .DL2 \ exited, Q < 4 49 03 EOR #3 \ counter 85 81 STA &81 \ Q A5 82 LDA &82 \ R \ load up mask colour byte = &FF .DL3 \ counter small Q 0A ASL A \ empty out mask 29 EF AND #&EF C6 81 DEC &81 \ Q 10 F9 BPL DL3 \ loop Q 48 PHA \ store mask A9 00 LDA #0 \ black 85 82 STA &82 \ R A9 63 LDA #99 \ into Q 85 81 STA &81 \ Q 68 PLA \ restore mask 4C 5C 20 JMP &205C \ DL5 \ up, loop mask .DL6 \ next bar E6 08 INC &08 \ SC+1 .DL9 60 RTS .DIL2 \ -> &208D \ roll/pitch indicator takes X.A A0 01 LDY #1 \ counter Y = 1 85 81 STA &81 \ Q \ xpos .DLL10 \ counter Y til #30 38 SEC A5 81 LDA &81 \ Q \ xpos E9 04 SBC #4 \ xpos-4 B0 0E BCS DLL11 \ blank A9 FF LDA #&FF \ else indicator A6 81 LDX &81 \ Q \ palette index 85 81 STA &81 \ Q \ = #&FF BD BF 16 LDA &16BF,X \ CTWOS,X 29 F0 AND #&F0 \ Mode5 colour yellow 4C AA 20 JMP &20AA \ DLL12 \ fill .DLL11 \ blank 85 81 STA &81 \ Q \ new xpos A9 00 LDA #0 .DLL12 \ -> &20AA \ fill 91 07 STA (&07),Y \ (SC),Y C8 INY 91 07 STA (&07),Y \ (SC),Y C8 INY 91 07 STA (&07),Y \ (SC),Y C8 INY 91 07 STA (&07),Y \ (SC),Y 98 TYA \ step to next char 18 CLC 69 05 ADC #5 A8 TAY \ Y updated to next char C0 1E CPY #30 90 D3 BCC DLL10 \ loop Y E6 08 INC &08 \ SC+1 \ next row, at end. 60 RTS .ESCAPE \ -> &20C1 \ your Escape capsule launch 20 E1 3E JSR &3EE1 \ RES2 \ reset2 A2 0B LDX #11 \ Cobra Mk3 # CYL 86 8C STX &8C \ TYPE 20 08 25 JSR &2508 \ FRS1 \ escape capsule launch, missile launch. B0 05 BCS ES1 \ room for view of Cobra, else try other hull. A2 18 LDX #24 \ #CYL2 20 08 25 JSR &2508 \ FRS1 .ES1 \ room for ship A9 08 LDA #8 \ modest speed 85 61 STA &61 \ INWK+27 A9 C2 LDA #&C2 \ rotz, pitch counter 85 64 STA &64 \ INWK+30 4A LSR A \ #&61 = ai dumb but has ecm, also counter. 85 66 STA &66 \ INWK+32 .ESL1 \ ai counter INWK+32, ship flys out of view. 20 A0 50 JSR &50A0 \ MVEIT 20 8C 48 JSR &488C \ LL9 \ object ENTRY C6 66 DEC &66 \ INWK+32 D0 F6 BNE ESL1 \ loop ai counter 20 58 55 JSR &5558 \ SCAN \ ships on scanner A9 00 LDA #0 \ zero-out cargo, including gems. A2 10 LDX #16 \ start at alien items .ESL2 \ counter X 9D 6F 03 STA &036F,X \ QQ20,X \ cargo CA DEX 10 FA BPL ESL2 \ loop X 8D 8C 03 STA &038C \ FIST \ fugitative/innocent status, make clean 8D 86 03 STA &0386 \ ESCP \ no escape pod A9 46 LDA #&46 \ max fuel allowed #70 = #&46 8D 65 03 STA &0365 \ QQ14 4C 3E 14 JMP &143E \ GOIN \ dock code \ ---====== end block B === onto block C =====-------- .TA34 \ Tactics, missile attacking player, from TA18 A9 00 LDA #0 \ all hi or'd 20 BF 41 JSR &41BF \ MAS4 F0 03 BEQ P%+5 \ this ship is nearby 4C C5 21 JMP &21C5 \ TA21 \ else rest of tactics, thargons can die. 20 60 21 JSR &2160 \ TA87+3 \ set bit7 of INWK+31, kill missile with debris 20 B1 43 JSR &43B1 \ EXNO3 \ ominous noises A9 FA LDA #250 \ Huge dent in player's shield. 4C E4 36 JMP &36E4 \ OOPS \ Lose some shield strength, cargo, could die. .TA18 \msl their comment Missile tactics A5 30 LDA &30 \ ECMA \ any ECM on ? D0 35 BNE TA35 \ kill this missile A5 66 LDA &66 \ INWK+32 \ ai_attack_univ_ecm 0A ASL A \ is bit6 set, player under attack? 30 E2 BMI TA34 \ yes, missile attacking player, up. 4A LSR A \ else bits 7 and 6 are now clear, can use as an index. AA TAX \ missile's target in univ. BD 95 16 LDA &1695,X \ UNIV,X 85 22 STA &22 \ V \ is pointer to target info. BD 96 16 LDA &1696,X \ UNIV+1,X 20 09 24 JSR &2409 \ VCSUB \ vector subtraction K3(1to9) = ship - UNIV_slotX_coord A5 D4 LDA &D4 \ K3+2 \ xsubhi 05 D7 ORA &D7 \ K3+5 \ ysubhi 05 DA ORA &DA \ K3+8 \ zsubhi 29 7F AND #&7F \ ignore signs 05 D3 ORA &D3 \ K3+1 \ xsublo 05 D6 ORA &D6 \ K3+4 \ ysublo 05 D9 ORA &D9 \ k3+7 \ zsublo D0 29 BNE TA64 \ missile far away, maybe ecm, then K3 heading. A5 66 LDA &66 \ INWK+32 \ ai_attack_univ_ecm, else missile close to hitting target C9 82 CMP #&82 \ are only ai bit 7 and bit 1 set F0 0D BEQ TA35 \ if attacking target 1 = #SST, kill missile. A0 1F LDY #31 \ display state|missiles state of target ship V. B1 22 LDA (&22),Y \ (V),Y 2C 6E 21 BIT M32+1 \ used as mask #&20 = bit5 of V, target already exploding? D0 04 BNE TA35 \ kill this missile 09 80 ORA #&80 \ else set bit7 display state of V, kill target ship V with debris. 91 22 STA (&22),Y \ (V),Y .TA35 \ kill this missile A5 46 LDA &46 \ INWK+0 \ xlo 05 49 ORA &49 \ INWK+3 \ ylo 05 4C ORA &4C \ INWK+6 \ zlo D0 05 BNE TA87 \ far away, down, set bit7 of INWK+31, kill this missile with debris A9 50 LDA #80 \ else near player so large dent 20 E4 36 JSR &36E4 \ OOPS \ Lose some shield strength, cargo, could die. .TA87 \ -> &215D \ kill inwk with noise 20 CE 43 JSR &43CE \ EXNO2 \ faint death noise, player killed inwk. 06 65 ASL &65 \ INWK+31 \ display explosion state|missiles 38 SEC \ set bit7 to kill inwk with debris 66 65 ROR &65 \ INWK+31 .TA1 60 RTS .TA64 \ missile far away, maybe ecm, then K3 heading. 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. C9 10 CMP #16 \ rnd >= #16 most likely B0 07 BCS TA19S \ down, Attack K3. .M32 \ -> &216D \ else ship V activates its ecm A0 20 LDY #32 \ M32+1 \ #&20 used as mask in bit5 test of TA18 B1 22 LDA (&22),Y \ (V),Y \ ai_attack_univ_ecm for ship V 4A LSR A \ does ship V has ecm in bit0 of ai? B0 03 BCS P%+5 \ ecm on, bulb2. .TA19S \ step to Attack K3 4C 1A 22 JMP &221A \ TA19 \ down, Attack K3. 4C 13 38 JMP &3813 \ ECBLB2 \ ecm on, bulb2. .TACTICS \ -> &217A \ Xreg is ship type, called by mveit if ai inwk+32 has bit7 set, slot in XSAV. A0 03 LDY #3 \ counter sizes 84 99 STY &99 \ RAT C8 INY \ #4 84 9A STY &9A \ RAT2 A9 16 LDA #22 \ dot product target #22, 52 degrees away 85 94 STA &94 \ CNT2 E0 01 CPX #1 \ #MSL missile F0 8E BEQ TA18 \ up, Missile tactics E0 02 CPX #2 \ #SST space station D0 2E BNE TA17 \ not space station, Other craft. A5 6A LDA &6A \ INWK+36 \ NEWB 29 04 AND #4 \ is bit2 of space station angry? D0 13 BNE TN5 \ angry, maybe launch cop. AD 28 03 LDA &0328 \ MANY+#10 \ else peaceful launch, any SHU+1 = transporters? D0 CD BNE TA1 \ rts, else no transporters so far 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. C9 FD CMP #&FD \ rare to launch 90 C6 BCC TA1 \ rts 29 01 AND #1 \ also carry is set 69 08 ADC #8 \ #SHU-1 AA TAX \ type 9 or 10, shuttle or transporter. D0 10 BNE TN6 \ guaranteed, launch Xreg from Space Station .TN5 \ angry, maybe launch cop. 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. C9 F0 CMP #&F0 \ #240 \ fairly rare to launch 90 B8 BCC TA1 \ rts AD 2E 03 LDA &032E \ MANY+COPS any so far? C9 04 CMP #4 \ no more than 4 cops max B0 20 BCS TA22 \ rts A2 10 LDX #16 \ #COPS .TN6 \ -> &21B6 \ launch Xreg from parent, will attack player, inc. transporter? A9 F1 LDA #&F1 \ ai_attack_univ_ecm, has ai, fairly aggressive, has ecm. 4C 92 25 JMP &2592 \ SFS1 \ spawn ship from parent ship, Acc is ai, Xreg is type created. .TA17 \ not space station, Other craft. A0 0E LDY #14 \ hull byte#14 max Hull energy A5 69 LDA &69 \ INWK+35 \ ship energy D1 1E CMP (&1E),Y \ (XX0),Y \ max Hull energy B0 02 BCS TA21 \ full energy, thargons can die E6 69 INC &69 \ INWK+35 \ ship energy recovers .TA21 \ -> &21C5 full energy, thargons can die E0 1E CPX #30 \ #TGL D0 0C BNE TA14 \ not thargon, start NEWB checks. AD 3B 03 LDA &033B \ MANY+THG \ number of thargoids #THG so far? D0 07 BNE TA14 \ mother ship(s) still present, skip to not thargon 46 66 LSR &66 \ INWK+32 \ thargon ai 06 66 ASL &66 \ cleared bit0, thargon now have no ecm system. 46 61 LSR &61 \ INWK+27 \ speed halved .TA22 60 RTS .TA14 \ not thargon, Start NEWB checks 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. A5 6A LDA &6A \ INWK+36 \ NEWB bit 0 is Trader? 4A LSR A \ NEWB bit0 into carry 90 04 BCC TN1 \ not Trader E0 64 CPX #100 \ old random < #100? B0 F3 BCS TA22 \ rts most likely .TN1 \ not Trader 4A LSR A \ bit1 is Bounty Hunter? 90 0F BCC TN2 \ not Bounty Hunter AE 8C 03 LDX &038C \ FIST \ Fugitative/Innocent legal status E0 28 CPX #40 \ player fugitive? 90 08 BCC TN2 \ leave player alone A5 6A LDA &6A \ INWK+36 \ NEWB 09 04 ORA #4 \ set bit2 angry, bounty hunter attacks you if you are fugitive. 85 6A STA &6A \ INWK+36 \ keep in NEWB but also 4A LSR A \ slide 4A LSR A \ slide .TN2 \ not Bounty Hunter 4A LSR A \ carry is NEWB bit2, angry? B0 0D BCS TN3 \ yes, attack player. 4A LSR A \ NEWB bit3 into carry (pirate) 4A LSR A \ NEWB bit4 into carry, docking? 90 03 BCC GOPL \ not docking, ai goto planet. 4C 46 23 JMP &2346 \ DOCKIT \ else ai is docking ship .GOPL \ -> &21FD \ ai goto planet 20 AE 42 JSR &42AE \ SPS1 \ XX15 vector to planet 4C 24 23 JMP &2324 \ TA151 \ fly towards XX15 .TN3 \ angry, attack player. 4A LSR A \ NEWB bit3 into carry, is Pirate? 90 0B BCC TN4 \ not Pirate, attacking player (e.g. bounty hunter) AD 20 03 LDA &0320 \ SSPR \ in space station range? F0 06 BEQ TN4 \ no, pirate attacks player A5 66 LDA &66 \ INWK+32 \ ai_attack_univ_ecm 29 81 AND #&81 \ only keep bit0 and bit7, else pirate ai set to no attack, fly away, 85 66 STA &66 \ INWK+32 \ because pirate in space station range. .TN4 \ also not Pirate attacking player A2 08 LDX #8 \ Build local XX15 .TAL1 \ counter X B5 46 LDA &46,X \ INWK,X 95 D2 STA &D2,X \ K3,X \ K3(0to8) loaded with INWK(0to8) coords CA DEX 10 F9 BPL TAL1 \ loop X .TA19 \ -> &221A \ Attack K3, spawn worms, others arrive. 20 BD 42 JSR &42BD \ TAS2 \ XX15=r~96 \their comment \ build XX15 max 0x60 from K3 20 DE 28 JSR &28DE \ TAS3-2 \ Y = 10, for TAS3 XX15.inwk,y dot product. max Acc 0x24 = 36. 85 93 STA &93 \ CNT \ dot product. max Acc 0x24 = 36. A5 8C LDA &8C \ TYPE \ ship type C9 01 CMP #1 \ #MSL missile D0 03 BNE P%+5 \ not missile 4C DD 22 JMP &22DD \ TA20 \ missile heading XX15 and CNT has dot product C9 0E CMP #14 \ else type #ANA Anaconda? D0 0C BNE TN7 \ not Anaconda attacking player 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. C9 C8 CMP #200 \ most likely 90 05 BCC P%+7 \ TN7 Not Anaconda attacking player A2 17 LDX #23 \ #WRM, else launch worms. 4C B6 21 JMP &21B6 \ TN6 \ launch X from parent, will attack player. .TN7 \ not Anaconda attacking player 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. C9 FA CMP #250 \ very likely 90 07 BCC TA7 \ Vrol 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 09 68 ORA #&68 \ large roll 85 63 STA &63 \ INWK+29 \ rotx counter .TA7 \ VRol \ their comment \ likely A0 0E LDY #14 \ Hull byte#14 energy B1 1E LDA (&1E),Y \ (XX0),Y 4A LSR A \ Acc = max_energy/2 C5 69 CMP &69 \ INWK+35 \ ship energy 90 42 BCC TA3 \ Good energy 4A LSR A 4A LSR A \ Acc = max_energy/8 C5 69 CMP &69 \ INWK+35 90 15 BCC ta3 \ not Low energy, else ship in trouble .. 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. C9 E6 CMP #230 \ likely 90 0E BCC ta3 \ not Low energy, else respond to crisis .. A6 8C LDX &8C \ TYPE \ restore ship type BD 3D 56 LDA &563D,X \ XX21-1+2*31,X \ E%-1,X Hull NEWB byte 10 07 BPL ta3 \ Hull NEWB bit7 set is escape pod, so A9 00 LDA #0 \ ship ai goes dumb. 85 66 STA &66 \ INWK+32 4C 8E 25 JMP &258E \ SESCP \ ships launch Escape pod. .ta3 \ not Low energy, try to fire missiles. A5 65 LDA &65 \ INWK+31 \ display explosion state|missiles 29 07 AND #7 \ number of missiles F0 21 BEQ TA3 \ none, continue to Good energy 85 D1 STA &D1 \ T \ number of missiles 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 29 1F AND #31 \ likely exceed C5 D1 CMP &D1 \ T \ number of missiles B0 16 BCS TA3 \ continue to Good energy A5 30 LDA &30 \ ECMA \ any ECM on? D0 12 BNE TA3 \ continue to Good energy C6 65 DEC &65 \ INWK+31 \ reduce by 1 missile A5 8C LDA &8C \ TYPE \ ship type C9 1D CMP #&1D \ Thargoid? D0 07 BNE TA16 \ not Thargoid, launch missile. A2 1E LDX #30 \ #TGL thargon launch A5 66 LDA &66 \ INWK+32 \ Acc = Thargoid mother ai 4C 92 25 JMP &2592 \ SFS1 \ spawn ship from parent ship, Acc is ai, Xreg is type created. .TA16 \ not Thargoid, launch missile. 4C BE 43 JMP &43BE \ SFRMIS \ Sound fire missile .TA3 \ Good energy > max/2 A9 00 LDA #0 20 BF 41 JSR &41BF \ MAS4 \ all hi or'd 29 E0 AND #&E0 \ keep big distance bits D0 29 BNE TA4 \ just Manoeuvre A6 93 LDX &93 \ CNT \ has a dot product to player E0 A0 CPX #&A0 \ -ve &20 vs max &24 90 23 BCC TA4 \ not lined up, Manoeuvre A0 13 LDY #19 \ Hull byte#19 laser | missile B1 1E LDA (&1E),Y \ (XX0),Y 29 F8 AND #&F8 \ keep laser power F0 1B BEQ TA4 \ no laser, onto Manoeuvre. A5 65 LDA &65 \ INWK+31 \ display explosion state|missiles 09 40 ORA #&40 \ set bit6, laser Firing at player. 85 65 STA &65 \ INWK+31 E0 A3 CPX #&A3 \ dot product -ve &23 vs max &24 90 11 BCC TA4 \ missed, onto Manoeuvre. .HIT \ laser Hitting player B1 1E LDA (&1E),Y \ (XX0),Y 4A LSR A \ laser power/2 = size of dent on player 20 E4 36 JSR &36E4 \ OOPS \ Lose some shield strength, cargo, could die. C6 62 DEC &62 \ INWK+28 \ accel, attacking ship slows down. A5 30 LDA &30 \ ECMA \ ECM on D0 50 BNE TA9-1 \ rts, sound of ECM already. A9 08 LDA #8 \ frLs \ their comment, sound of laser strike 4C F3 43 JMP &43F3 \ NOISE .TA4 \ Manoeuvre A5 4D LDA &4D \ INWK+7 \ zhi C9 03 CMP #3 B0 08 BCS TA5 \ Far z A5 47 LDA &47 \ INWK+1 \ xhi 05 4A ORA &4A \ INWK+4 \ yhi 29 FE AND #&FE \ > hi1 F0 12 BEQ TA15 \ Near .TA5 \ Far z 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 09 80 ORA #&80 \ set bit 7 as ai active. C5 66 CMP &66 \ INWK+32 \ compare to actual ai_attack_univ_ecm B0 09 BCS TA15 \ weak (non-missile) ai head away, Near. .TA20 \ -> &22DD \ Also arrive here if missile, heading XX15 and CNT has dot product 20 5D 24 JSR &245D \ TAS6 \ flip sign of XX15 vector to point back at player A5 93 LDA &93 \ CNT 49 80 EOR #&80 \ flip dot product .TA152 \ -> &22E4 \ Change rolls for auto docking, heading towards sp+ arrives here. 85 93 STA &93 \ CNT .TA15 \ Near \^XX15, both towards and away from player A0 10 LDY #16 \ XX15.inwk,16 dot product 20 E0 28 JSR &28E0 \ TAS3 AA TAX \ dot product for rotz pitch 20 32 23 JSR &2332 \ nroll \ returns Acc = new counter 85 64 STA &64 \ INWK+30 \ new rotz counter pitch A5 63 LDA &63 \ INWK+29 \ rotx counter roll 0A ASL A \ remove roll sign C9 20 CMP #32 \ #16 magnitude B0 0D BCS TA6 \ big pitch leave roll, onto Far away. A0 16 LDY #22 \ XX15.inwk,22 dot product 20 E0 28 JSR &28E0 \ TAS3 AA TAX \ dot product for rotx roll 45 64 EOR &64 \ INWK+30 \ rotz counter, affects roll. 20 32 23 JSR &2332 \ nroll \ returns Acc = new counter 85 63 STA &63 \ INWK+29 \ new rotx counter roll .TA6 \ default, Far away. A5 93 LDA &93 \ CNT \ dot product 30 09 BMI TA9 \ target is far behind, maybe Slow down. C5 94 CMP &94 \ CNT2 \ angle in front not too large 90 05 BCC TA9 \ maybe Slow down .fast A9 03 LDA #3 \ speed up a lot 85 62 STA &62 \ INWK+28 \ accel 60 RTS \ TA9-1 .TA9 \ maybe Slow down 29 7F AND #&7F \ drop dot product sign C9 12 CMP #18 \ angle to axis not too large 90 0B BCC TA10 \ slow enough, rts .slow \ slowdown A9 FF LDA #&FF \ slow A6 8C LDX &8C \ TYPE \ ship type E0 01 CPX #1 \ #MSL missile D0 01 BNE accel \ skip asl if not missile 0A ASL A \ #&FE = -2 for missile .accel 85 62 STA &62 \ INWK+28 \ accel, #&FF=-1 if not missile. .TA10 60 RTS .TA151 \ -> &2324 \ fly towards XX15 \ head for sp+ 20 DE 28 JSR &28DE \ TAS3-2 \ Y = 10, for TAS3 XX15.inwk,10 dot product C9 98 CMP #&98 \ if nearly in front, nr max -ve &18 90 04 BCC ttt \ keep rat2 sign A2 00 LDX #0 \ else big counter required 86 9A STX &9A \ RAT2 \ roll counter = 0 .ttt \ keep rat2 sign 4C E4 22 JMP &22E4 \ TA152 \ up, Change rolls. .nroll \ -> &2332 \ returns Acc = new Roll counter. 49 80 EOR #&80 29 80 AND #&80 \ keep flipped sign 85 D1 STA &D1 \ T \ of old roll counter 8A TXA \ a dot product 0A ASL A \ ignore sign C5 9A CMP &9A \ RAT2 \ doubled dot product 90 05 BCC TA11 \ small enough, small roll counter A5 99 LDA &99 \ RAT \ max counter allowed 05 D1 ORA &D1 \ T \ with sign from T 60 RTS .TA11 \ small roll counter A5 D1 LDA &D1 \ T 60 RTS .DOCKIT \ -> &2346 \ ai is docking a ship at space station A9 06 LDA #6 \ max doubled dot product 85 9A STA &9A \ RAT2 4A LSR A \ #3 85 99 STA &99 \ RAT \ max counter allowed A9 1D LDA #29 \ 36 degrees away 85 94 STA &94 \ CNT2 \ dot product target AD 20 03 LDA &0320 \ SSPR \ space station present? D0 03 BNE P%+5 \ skip jmp .GOPLS \ goto planet stepping stone 4C FD 21 JMP &21FD \ GOPL \ up, outside SS range, ai goto planet. 20 03 24 JSR &2403 \ VCSU1 \ K3=ship-spc.stn \ K3(0to8) = ship - space_station A5 D4 LDA &D4 \ K3+2 \ xsub sg 05 D7 ORA &D7 \ K3+5 \ ysub sg 05 DA ORA &DA \ K3+8 \ zsub sg 29 7F AND #&7F \ dop sign D0 F0 BNE GOPLS \ far away, ai goto planet. Else docking to SS. 20 E0 42 JSR &42E0 \ TA2 \ build XX15(0to2) from raw K3(1to8) A5 81 LDA &81 \ Q \ norm hi 85 40 STA &40 \ K 20 BD 42 JSR &42BD \ TAS2 \ XX15=r~96 \their comment \ build XX15 from K3 A0 0A LDY #10 20 3B 24 JSR &243B \ TAS4 \ X.A = dot product to space station 30 23 BMI PH1 \ fly to station C9 23 CMP #&23 \ nr max &24 90 1F BCC PH1 \ fss.r fly to station 20 DE 28 JSR &28DE \ TAS3-2 \ Y = 10, for XX15.inwk,y dot product C9 A2 CMP #&A2 \ nr max -ve &22 fpl.r \ fly to planet B0 32 BCS PH3 \ adjust approach A5 40 LDA &40 \ K C9 9D CMP #&9D \ norm hi < &9D ? 90 04 BCC PH2 \ abort and fly away from Space Station A5 8C LDA &8C \ TYPE \ ship type 30 28 BMI PH3 \ bit7 set if player on auto, adjust approach. .PH2 \ fly away from Space Station 20 5D 24 JSR &245D \ TAS6 \ flip sign of XX15 3-vector 20 24 23 JSR &2324 \ TA151 \ fly towards XX15, away from ss. .PH22 \ -> &2392 \ Slow speed A2 00 LDX #0 \ zero 86 62 STX &62 \ INWK+28 \ accel E8 INX \ X =1 86 61 STX &61 \ INWK+27 \ speed 60 RTS .PH1 \ fly to station 20 03 24 JSR &2403 \ VCSU1 \ K3=ship-spc.stn \ K3(0to8) = ship - space_station 20 70 24 JSR &2470 \ DCS1 \ adjust subtracted vector K3 as moving 20 70 24 JSR &2470 \ DCS1 \ twice .. 20 BD 42 JSR &42BD \ TAS2 \ XX15=r~96 \their comment \ build XX15 from K3 20 5D 24 JSR &245D \ TAS6 \ flip sign of XX15 3-vector 4C 24 23 JMP &2324 \ TA151 \ fly towards XX15 \ up \ head for sp+ .TN11 \ arrive from PH32 below, finish computer docking, big Zoom. E6 62 INC &62 \ INWK+28 \ accel A9 7F LDA #&7F \ no damping in roll 85 63 STA &63 \ INWK+29 \ rotx counter D0 45 BNE TN13 \ guaranteed, down check docking. .PH3 \ adjust approach A2 00 LDX #0 \ zeroed dot product 86 9A STX &9A \ RAT2 86 64 STX &64 \ INWK+30 \ rotz counter pitch A5 8C LDA &8C \ TYPE \ ship type, player on auto? 10 20 BPL PH32 \ no, other ship, fly to slit with old roll 45 34 EOR &34 \ XX15 \ xunit 45 35 EOR &35 \ XX15+1 0A ASL A \ x^y sign into carry A9 02 LDA #2 \ slow roll 6A ROR A \ could be signed to #&81 85 63 STA &63 \ INWK+29 \ rotx counter A5 34 LDA &34 \ XX15 \ xunit 0A ASL A \ drop sign C9 0C CMP #12 \ xunit was >=6 ? B0 C3 BCS PH22 \ up, Slow speed, else update pitch. A5 35 LDA &35 \ XX15+1 \ yunit 0A ASL A \ y sign A9 02 LDA #2 \ slow pitch 6A ROR A \ could be signed to #&81 85 64 STA &64 \ INWK+30 \ rotz counter A5 35 LDA &35 \ XX15+1 \ yunit 0A ASL A \ drop sign C9 0C CMP #12 \ yunit was >=6 ? B0 B4 BCS PH22 \ up, Slow speed, else well aligned so .PH32 \ fly to Slit 86 63 STX &63 \ INWK+29 \ rotx counter could be 0 A5 5C LDA &5C \ INWK+22 \ rotmat2x hi 85 34 STA &34 \ XX15 A5 5E LDA &5E \ INWK+24 \ rotmat2y hi 85 35 STA &35 \ XX15+1 A5 60 LDA &60 \ INWK+26 \ rotmat2z hi 85 36 STA &36 \ XX15+2 A0 10 LDY #16 \ X.A = dot product to slit 20 3B 24 JSR &243B \ TAS4 0A ASL A \ ignore sign C9 42 CMP #&42 \ &21 nr max &24 B0 B6 BCS TN11 \ up, big Zoom. 20 92 23 JSR &2392 \ PH22 \ else visit slow speed .TN13 \ Also continue TN11 bit Zoom A5 DC LDA &DC \ K3 + 10 \ hi or'd (missing) D0 05 BNE TNRTS \ still far away, rts. \TNRTS-5 \ set bit7 of NEWB, docked, disappear. 06 6A ASL &6A \ INWK+36 \ NEWB 38 SEC \ set bit7 remove ship no debris 66 6A ROR &6A \ INWK+36 .TNRTS 60 RTS .VCSU1 \ -> &2403 \ K3=ship-spc.stn \ K3(0to8) = ship - space_station A9 25 LDA #37 \ NI% is offset to ss info 85 22 STA &22 \ V \ pointer lo &0925 A9 09 LDA #9 \ hi Page &9 .VCSUB \ -> &2409 \ vector subtraction K3(0to8) = ship - V_coords 85 23 STA &23 \ V+1 \ pointer hi A0 02 LDY #2 \ xsg 20 17 24 JSR &2417 \ TAS1 \ below, K3(0to8) = inwk(0to8)-V_coords(0to8) A0 05 LDY #5 \ ysg 20 17 24 JSR &2417 \ TAS1 A0 08 LDY #8 \ zsg .TAS1 \ -> &2417 \ K3(0to8) = inwk(0to8) -V_coords(0to8) B1 22 LDA (&22),Y \ (V),Y 49 80 EOR #&80 \ flip sg 85 43 STA &43 \ K+3 88 DEY \ hi B1 22 LDA (&22),Y \ (V),Y 85 42 STA &42 \ K+2 \ hi V_coord 88 DEY \ lo B1 22 LDA (&22),Y \ (V),Y 85 41 STA &41 \ K+1 \ K(1to3) gets V_coord(Y) 84 80 STY &80 \ U \ index = lo A6 80 LDX &80 \ U 20 4C 1D JSR &1D4C \ MVT3 \ add INWK(0to2+X) to K(1to3) X = 0, 3, 6 A4 80 LDY &80 \ U \ restore Yreg 95 D4 STA &D4,X \ K3+2,X \ sg A5 42 LDA &42 \ K+2 95 D3 STA &D3,X \ K3+1,X \ hi A5 41 LDA &41 \ K+1 95 D2 STA &D2,X \ K3+0,X \ lo 60 RTS .TAS4 \ -> &243B \ X.A = dot product to space station \ Y=10=inc, Y=22 = rot. BE 25 09 LDX &0925,Y \ allwk+37+0,Y \ xcoord for Yreg=0 is planet 86 81 STX &81 \ Q \ inc for Yreg=10, rot for Yreg=22. A5 34 LDA &34 \ XX15+0 \ unit_x 20 D4 28 JSR &28D4 \ MULT12 \ R.S = unit_x * A BE 27 09 LDX &0927,Y \ allwk+37+2,Y \ ycoord 86 81 STX &81 \ Q A5 35 LDA &35 \ XX15+1 \ unit_y 20 FC 28 JSR &28FC \ MAD \ X.A = unit_y * A + R.S 85 83 STA &83 \ S 86 82 STX &82 \ R BE 29 09 LDX &0929,Y \ allwk+37+4,Y \ zcoord 86 81 STX &81 \ Q A5 36 LDA &36 \ XX15+2 \ unit_z 4C FC 28 JMP &28FC \ MAD \ X.A = init_z * A + R.S .TAS6 \ -> &245D \ flip sign of XX15 A5 34 LDA &34 \ XX15+0 49 80 EOR #&80 \ flip unit_x 85 34 STA &34 \ XX15+0 A5 35 LDA &35 \ XX15+1 49 80 EOR #&80 \ flip unit_y 85 35 STA &35 \ XX15+1 A5 36 LDA &36 \ XX15+2 49 80 EOR #&80 \ flip unit_z 85 36 STA &36 \ XX15+2 60 RTS .DCS1 \ -> &2470 \ adjust as vec K3 moving 20 73 24 JSR &2473 \ P%+3 \ twice AD 2F 09 LDA &092F \ allwk+37+10 \ xinc_hi/2 A2 00 LDX #0 20 88 24 JSR &2488 \ TAS7 \ below AD 31 09 LDA &0931 \ allwk+37+12 \ yinc_hi/2 A2 03 LDX #3 20 88 24 JSR &2488 \ TAS7 AD 33 09 LDA &0933 \ allwk+37+14 \ zinc_hi/2 A2 06 LDX #6 .TAS7 \ -> &2488 \ now Xreg = 0,3,6 Acc = inc_hi x,y,z 0A ASL A \ sign into carry 85 82 STA &82 \ R \ hi7*2 = inc coord lo A9 00 LDA #0 6A ROR A \ Acc bit7 = sign 49 80 EOR #&80 \ flip sign 55 D4 EOR &D4,X \ K3+2,X \ sign of subtracted vector 30 0B BMI TS71 \ moving close, reduce vector. A5 82 LDA &82 \ R \ else increase vector by inc coord 75 D2 ADC &D2,X \ K3+0,X \ lo 95 D2 STA &D2,X \ K3+0,X 90 02 BCC TS72 \ no overflow, rts F6 D3 INC &D3,X \ K3+1,X \ fix hi .TS72 \ -> &249E 60 RTS .TS71 \ moving closer, reduce vector. B5 D2 LDA &D2,X \ K3+0,X 38 SEC \ sub inc coord lo7 E5 82 SBC &82 \ R 95 D2 STA &D2,X \ K3+0,X B5 D3 LDA &D3,X \ K3+1,X E9 00 SBC #0 \ sub hi 95 D3 STA &D3,X \ K3+1,X B0 F0 BCS TS72 \ no underflow, rts B5 D2 LDA &D2,X \ K3+0,X 49 FF EOR #&FF \ flip lo 69 01 ADC #1 \ carry was clear 95 D2 STA &D2,X \ K3+0,X B5 D3 LDA &D3,X \ K3+1,X 49 FF EOR #&FF \ flip hi 69 00 ADC #0 \ any carry 95 D3 STA &D3,X \ K3+1,X B5 D4 LDA &D4,X \ K3+2,X 49 80 EOR #&80 \ flip sg 95 D4 STA &D4,X \ K3+2,X 4C 9E 24 JMP &249E \ TS72 \ = rts .HITCH \ -> &24C7 \ Carry set if ship collides or missile locks. 18 CLC A5 4E LDA &4E \ INWK+8 \ zsg D0 39 BNE HI1 \ rts with C clear as -ve or big zg A5 8C LDA &8C \ TYPE \ ship type 30 35 BMI HI1 \ rts with C clear as planet or sun A5 65 LDA &65 \ INWK+3 \ display explosion state|missiles 29 20 AND #&20 \ keep bit5, is target exploding? 05 47 ORA &47 \ INWK+1 \ xhi 05 4A ORA &4A \ INWK+4 \ yhi D0 2B BNE HI1 \ rts with C clear as too far away A5 46 LDA &46 \ INWK+0 \ xlo 20 0D 28 JSR &280D \ SQUA2 \ P.A = xlo^2 85 83 STA &83 \ S \ x2 hi A5 1B LDA &1B \ P \ x2 lo 85 82 STA &82 \ R A5 49 LDA &49 \ INWK+3 \ ylo 20 0D 28 JSR &280D \ SQUA2 \ P.A = ylo^2 AA TAX \ y^2 hi A5 1B LDA &1B \ P \ y^2 lo 65 82 ADC &82 \ R \ x^2 lo 85 82 STA &82 \ R \ = x^2 +y^2 lo 8A TXA \ y^2 hi 65 83 ADC &83 \ S \ x^2 hi B0 10 BCS TN10 \ too far off, clc rts 85 83 STA &83 \ S \ x^2 + y^2 hi A0 02 LDY #2 \ Hull byte#2 area hi of ship type B1 1E LDA (&1E),Y \ (XX0),Y C5 83 CMP &83 \ S \ area hi D0 05 BNE HI1 \ carry set if Hull hi > area 88 DEY \ else hi equal, look at area lo, Hull byte#1 B1 1E LDA (&1E),Y \ (XX0),Y C5 82 CMP &82 \ R \ carry set if Hull lo > area .HI1 \ rts 60 RTS .TN10 \ too far off, no hitch. 18 CLC \ no hitch 60 RTS .FRS1 \ -> &2508 \ escape capsule Launched, see Cobra Mk3 ahead, or player missile launch. 20 26 3F JSR &3F26 \ ZINF \ zero info A9 1C LDA #28 \ ylo distance 85 49 STA &49 \ INWK+3 4A LSR A \ #14 = zlo 85 4C STA &4C \ INWK+6 A9 80 LDA #&80 \ ysg -ve is below 85 4B STA &4B \ INWK+5 A5 45 LDA &45 \ MSTG \ = #FF if missile NOT targeted 0A ASL A \ convert to univ index, no ecm. 09 80 ORA #&80 \ set bit7, ai_active 85 66 STA &66 \ INWK+32 .fq1 \ -> &251D \ type Xreg cargo/alloys in explosion arrives here A9 60 LDA #&60 \ unit +1 85 54 STA &54 \ INWK+14 \ rotmat0z hi 09 80 ORA #&80 \ unit -1 85 5C STA &5C \ INWK+22 \ rotmat2x hi A5 7D LDA &7D \ DELTA \ speed 2A ROL A \ missile speed is double 85 61 STA &61 \ INWK+27 \ speed 8A TXA \ ship type 4C 68 37 JMP &3768 \ NWSHP \ New ship type X .FRMIS \ -> &252E \ Player fires missile A2 01 LDX #1 \ #MSL Missile 20 08 25 JSR &2508 \ FRS1 \ player missile launch attempt, up. 90 54 BCC FR1 \ no room, missile jammed message, down. A6 45 LDX &45 \ MSTG \ nearby id for missile target 20 32 37 JSR &3732 \ GINF \ get address, INF, for ship X nearby from UNIV. BD 11 03 LDA &0311,X \ FRIN,X \ get nearby ship type 20 4D 25 JSR &254D \ ANGRY \ for ship type Acc., visit down. A0 00 LDY #0 \ black missile block as gone 20 05 38 JSR &3805 \ ABORT \ draw missile block CE 8B 03 DEC &038B \ NOMSL \ reduce number of player's missles A9 30 LDA #48 \ noisfr \ their comment 4C F3 43 JMP &43F3 \ NOISE \ for sound of missile launching .ANGRY \ -> &254D \ Acc already loaded with ship type C9 02 CMP #2 \ #SST, space station. F0 2F BEQ AN2 \ space station Angry A0 24 LDY #36 \ Byte#36 = NEWB from info B1 20 LDA (&20),Y \ (INF),Y 29 20 AND #&20 \ keep bit 5, is Cop? F0 03 BEQ P%+5 \ if not hop visit to 20 80 25 JSR &2580 \ AN2 \ space station Angry in support of police only A0 20 LDY #32 \ Byte#32 = ai_attack_univ_ecm from info B1 20 LDA (&20),Y \ (INF),Y F0 A3 BEQ HI1 \ rts if dumb 09 80 ORA #&80 \ else some ai bits exist. So set bit7, enable ai for tactics. 91 20 STA (&20),Y \ (INF),Y A0 1C LDY #28 \ accel A9 02 LDA #2 \ speed up 91 20 STA (&20),Y \ (INF),Y 0A ASL A \ #4 pitch A0 1E LDY #30 \ rotz counter 91 20 STA (&20),Y \ (INF),Y A5 8C LDA &8C \ TYPE \ ship type C9 0B CMP #11 \ #CYL cobra 90 08 BCC AN3 \ transport or below rts, else trader ship or higher. A0 24 LDY #36 \ Byte#36 NEWB B1 20 LDA (&20),Y \ (INF),Y 09 04 ORA #4 \ set bit2 of NEWB, Angry. 91 20 STA (&20),Y \ (INF),Y .AN3 60 RTS .AN2 \ -> &2580 \ space station Angry AD 49 09 LDA &0949 \ allwk+37+36 \ space station info NEWB 09 04 ORA #4 \ set bit 2 angry 8D 49 09 STA &0949 \ allwk+37+36 60 RTS .FR1 \ missile jammed message. A9 C9 LDA #&C9 \ token = missile jammed 4C C6 45 JMP &45C6 \ MESS \ message .SESCP \ -> &258E \ from tactics, ships launch Escape pod A2 03 LDX #3 \ #ESC type escape capsule. On next line missiles. A9 FE LDA #&FE \ SFRMIS arrives \ SFS1-2 \ ai has bit6 set, attack player. No ecm. .SFS1 \ -> &2592 \ spawn ship from parent ship, Acc is ai, Xreg is type created. 85 06 STA &06 \ T1 \ daughter ai_attack_univ_ecm 8A TXA \ daughter Type 48 PHA \ store A5 1E LDA &1E \ XX0 48 PHA \ pointer lo to Hull data A5 1F LDA &1F \ XX0+1 48 PHA \ pointer hi to Hull data A5 20 LDA &20 \ INF 48 PHA A5 21 LDA &21 \ INF+1 48 PHA \ parent INF pointer A0 24 LDY #36 \ #(NI%-1) whole workspace .FRL2 \ counter Y B9 46 00 LDA &0046,Y \ INWK,Y 99 00 01 STA &0100,Y \ XX3,Y \ move inwk to heap B1 20 LDA (&20),Y \ (INF),Y 99 46 00 STA &0046,Y \ INWK,Y \ get parent info 88 DEY \ next bytes 10 F2 BPL FRL2 \ loop Y A5 6A LDA &6A \ INWK+36 \ NEWB of parent 29 1C AND #&1C \ keep bits 4,3,2 docking, pirate, angry, for debris. 85 6A STA &6A \ INWK+36 A5 8C LDA &8C \ TYPE \ ship type of parent C9 02 CMP #2 \ #SST space station D0 1D BNE rx \ skip as space station not parent 8A TXA \ else ship launched by space station 48 PHA \ second copy of new type pushed A9 20 LDA #32 \ speed quite fast 85 61 STA &61 \ INWK+27 A2 00 LDX #0 \ xcoord A5 50 LDA &50 \ INWK+10 20 1A 26 JSR &261A \ SFS2 \ xincrot added to inwk coord, below A2 03 LDX #3 \ ycoord A5 52 LDA &52 \ INWK+12 20 1A 26 JSR &261A \ SFS2 \ yincrot added to inwk coord A2 06 LDX #6 \ zcoord A5 54 LDA &54 \ INWK+14 20 1A 26 JSR &261A \ SFS2 \ zincrot added to inwk coord 68 PLA AA TAX \ second copy of type restored .rx \ skipped space station not parent A5 06 LDA &06 \ T1 \ daughter ai_attack_univ_ecm. 85 66 STA &66 \ INWK+32 \ ai_attack_univ_ecm 46 63 LSR &63 \ INWK+29 \ rotx counter 06 63 ASL &63 \ INWK+29 \ clear bit0 to start damping roll. 8A TXA \ second copy of daughter Yype restored C9 09 CMP #9 \ #SPL+1 B0 16 BCS NOIL \ type is >= splinter C9 04 CMP #4 \ #PLT alloy 90 12 BCC NOIL \ type < plate ie escape capsule, space station or missile. 48 PHA \ else type Cargo, Boulder, Asteroid 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 0A ASL A \ pitch damped, and need rnd carry later. 85 64 STA &64 \ INWK+30 \ rotz counter 8A TXA \ Xrnd 29 0F AND #&0F \ keep lower 4 bits as 85 61 STA &61 \ INWK+27 \ speed A9 FF LDA #&FF \ no damping 6A ROR A \ rnd carry gives sign 85 63 STA &63 \ INWK+29 \ rotx counter roll has no damping 68 PLA \ reload Type .NOIL \ not cargo, launched missile or escape capsule. 20 68 37 JSR &3768 \ NWSHP \ New ship type Acc 68 PLA \ restore parent info pointer 85 21 STA &21 \ INF+1 68 PLA 85 20 STA &20 \ INF A2 24 LDX #36 \ #(NI%-1) whole workspace .FRL3 \ counter X BD 00 01 LDA &0100,X \ XX,3 \ heap 95 46 STA &46,X \ INWK,X \ restore initial inwk. CA DEX \ next byte 10 F8 BPL FRL3 \ loop X 68 PLA \ restore Hull data pointer 85 1F STA &1F \ XX0+1 68 PLA \ lo 85 1E STA &1E \ XX0 68 PLA \ restore ship type daughter AA TAX \ needed for spin debris master. 60 RTS .SFS2 \ -> &261A \ X=0,3,6 for Acc = inc added to x,y,z coords 0A ASL A \ sign into carry 85 82 STA &82 \ R \ inc A9 00 LDA #0 6A ROR A \ bring any carry back into bit 7 4C 4C 52 JMP &524C \ MVT1 \ Add R|sgnA to inwk,x+0to2 .LL164 \ -> &2623 \ hyperspace noise and Tunnel inc. misjump A9 38 LDA #56 \ Hyperspace 20 F3 43 JSR &43F3 \ NOISE A9 01 LDA #1 \ toggle Mode 4 to 5 colours for Hyperspace effects 8D 48 03 STA &0348 \ HFX A9 04 LDA #4 \ finer circles for launch code tunnel 20 3D 26 JSR &263D \ HFS2 CE 48 03 DEC &0348 \ HFX \ = 0 60 RTS .LAUN \ -> &2636 \ Launch rings from space station A9 30 LDA #48 \ noisfr 20 F3 43 JSR &43F3 \ NOISE A9 08 LDA #8 \ crude octagon rings .HFS2 \ -> &263D \ Rings for tunnel 85 95 STA &95 \ STP \ step for ring .HFS1 \ -> &263F \ Rings of STP 20 CA 54 JSR &54CA \ TTX66 \ new box A2 80 LDX #&80 \ half of xcreen 86 D2 STX &D2 \ K3 A2 60 LDX #&60 \ #Y half of yscreen 86 E0 STX &E0 \ K4 A2 00 LDX #0 86 96 STX &96 \ XX4 \ ring counter 86 D3 STX &D3 \ K3+1 \ x hi 86 E1 STX &E1 \ K4+1 \ y hi .HFL5 \ counter XX4 0..7 20 5E 26 JSR &265E \ HFL1 \ One ring E6 96 INC &96 \ XX4 A6 96 LDX &96 \ XX4 E0 08 CPX #8 \ 8 rings D0 F5 BNE HFL5 \ loop X, next ring. 60 RTS .HFL1 \ -> &265E \ One ring A5 96 LDA &96 \ XX4 \ ring counter 29 07 AND #7 18 CLC 69 08 ADC #8 \ ring radius 8..15 85 40 STA &40 \ K .HFL2 \ roll K radius A9 01 LDA #1 \ arc step 85 6B STA &6B \ LSP 20 90 3B JSR &3B90 \ CIRCLE2 06 40 ASL &40 \ K B0 06 BCS HF8 \ big ring, exit rts A5 40 LDA &40 \ K \ radius*=2 C9 A0 CMP #&A0 \ radius max 90 EF BCC HFL2 \ loop K .HF8 \ exit 60 RTS .STARS2 \ -> &2679 \ Left view has Xreg=1, Right has Xreg=2. A9 00 LDA #0 E0 02 CPX #2 \ if X >=2 then C is set 6A ROR A \ if left view, RAT=0, if right view, RAT=128 85 99 STA &99 \ RAT 49 80 EOR #&80 \ flip other rat sign 85 9A STA &9A \ RAT2 \ if left view, RAT2=128, if right view, RAT2=0 20 2D 27 JSR &272D \ ST2 \ flip alpha, bet2 AC C3 03 LDY &03C3 \ NOSTM \ number of stars .STL2 \ -> &268A \ counter Y B9 A8 0F LDA &0FA8,Y \ SZ,Y \ dustz 85 88 STA &88 \ ZZ \ distance away of dust particles 4A LSR A 4A LSR A 4A LSR A \ /=8 20 61 29 JSR &2961 \ DV41 \ P.R = speed/ (ZZ/8) A5 1B LDA &1B \ P 45 9A EOR &9A \ RAT2 \ view sign 85 83 STA &83 \ S \ delta hi B9 6F 0F LDA &0F6F,Y \ SXL,Y \ dust xlo 85 1B STA &1B \ P B9 5C 0F LDA &0F5C,Y \ SX,Y \ dustx 85 34 STA &34 \ X1 \ x middle 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S = dustx+delta/z_distance 85 83 STA &83 \ S \ new x hi 86 82 STX &82 \ R \ new x lo B9 82 0F LDA &0F82,Y \ SY,Y \ dusty 85 35 STA &35 \ Y1 \ yhi old 45 7B EOR &7B \ BET2 \ pitch sign A6 2B LDX &2B \ BET1 \ lower7 bits 20 C8 27 JSR &27C8 \ MULTS-2 \ AP=A*bet1 (bet1+<32) 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S 86 24 STX &24 \ XX 85 25 STA &25 \ XX+1 BE 95 0F LDX &0F95,Y \ SYL,Y \ dust ylo 86 82 STX &82 \ R A6 35 LDX &35 \ Y1 \ yhi old 86 83 STX &83 \ S A6 2B LDX &2B \ BET1 \ lower7 bits 45 7C EOR &7C \ BET2+1 \ flipped pitch sign 20 C8 27 JSR &27C8 \ MULTS-2 \ AP=A*~bet1 (~bet1+<32) 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S 86 26 STX &26 \ YY \ ylo 85 27 STA &27 \ YY+1 \ yhi A6 31 LDX &31 \ ALP1 \ lower7 bits of roll 45 32 EOR &32 \ ALP2 \ roll sign 20 C8 27 JSR &27C8 \ MULTS-2 \ AP=A*~alp1(~alp1+<32) 85 81 STA &81 \ Q \ roll step A5 24 LDA &24 \ XX 85 82 STA &82 \ R A5 25 LDA &25 \ XX+1 85 83 STA &83 \ S 49 80 EOR #&80 \ flip sign 20 FC 28 JSR &28FC \ MAD \ X.A = Q*A -XX 85 25 STA &25 \ XX+1 8A TXA \ dust xlo 99 6F 0F STA &0F6F,Y \ SXL,Y A5 26 LDA &26 \ YY \ ylo 85 82 STA &82 \ R A5 27 LDA &27 \ YY+1 \ yhi 85 83 STA &83 \ S 20 FC 28 JSR &28FC \ MAD \ X.A = Q*A + YY \ offset for pix1 85 83 STA &83 \ S \ yhi a 86 82 STX &82 \ R \ ylo a A9 00 LDA #0 \ add yinc due to roll 85 1B STA &1B \ P \ ylo b A5 8D LDA &8D \ ALPHA \ yhi b 20 07 19 JSR &1907 \ PIX1 \ dust, X1 has xscreen. yscreen = R.S+P.A A5 25 LDA &25 \ XX+1 99 5C 0F STA &0F5C,Y \ SX,Y \ dustx 85 34 STA &34 \ X1 \ X from middle 29 7F AND #&7F \ Acc left with bottom 7 bits of X hi C9 74 CMP #&74 \ approaching left or right edge of screen. deltatX=11 B0 31 BCS KILL2 \ left or right edge A5 27 LDA &27 \ YY+1 99 82 0F STA &0F82,Y \ SY,Y \ dusty 85 35 STA &35 \ Y1 \ Y from middle 29 7F AND #&7F \ Acc left with bottom 7 bits of Y hi C9 74 CMP #&74 \ approaching top or bottom of screen B0 37 BCS ST5 \ ydust kill .STC2 \ Back in 20 10 19 JSR &1910 \ PIXEL2 \ dust (X1,Y1) from middle 88 DEY \ next dust F0 03 BEQ ST2 \ all dust done, exit loop 4C 8A 26 JMP &268A \ STL2 \ loop Y .ST2 \ -> &272D \ exited dust loop, flip alpha, bet2 A5 8D LDA &8D \ ALPHA 45 99 EOR &99 \ RAT \ view sign 85 8D STA &8D \ ALPHA A5 32 LDA &32 \ ALP2 \ roll sign 45 99 EOR &99 \ RAT 85 32 STA &32 \ ALP2 \ roll sign 49 80 EOR #&80 \ flip 85 33 STA &33 \ ALP2+1 \ flipped roll sign A5 7B LDA &7B \ BET2 \ pitch sign2 45 99 EOR &99 \ RAT \ view sign 85 7B STA &7B \ BET2 \ pitch sign 49 80 EOR #&80 \ flip 85 7C STA &7C \ BET2+1 \ flipped pitch sign 60 RTS .KILL2 \ kill dust, left or right edge. 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 85 35 STA &35 \ Y1 99 82 0F STA &0F82,Y \ SY,Y \ dusty rnd A9 73 LDA #&73 \ new xstart 05 99 ORA &99 \ RAT \ view sign 85 34 STA &34 \ X1 99 5C 0F STA &0F5C,Y \ SX,Y \ dustx D0 11 BNE STF1 \ guaranteed, Set new distance .ST5 \ ydust kill 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 85 34 STA &34 \ X1 99 5C 0F STA &0F5C,Y \ SX,Y \ dustx rnd A9 6E LDA #&6E \ new ystart 05 33 ORA &33 \ ALP2+1 \ flipped roll sign 85 35 STA &35 \ Y1 99 82 0F STA &0F82,Y \ SY,Y \ dusty .STF1 \ Set new distance 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 09 08 ORA #8 \ not too close 85 88 STA &88 \ ZZ 99 A8 0F STA &0FA8,Y \ SZ,Y \ dustz D0 AC BNE STC2 \ guaranteed Back in for left/right dust .MU5 \ load Acc into K(0to3) 85 40 STA &40 \ K+0 85 41 STA &41 \ K+1 \ MU5+2 does K1to3 85 42 STA &42 \ K+2 85 43 STA &43 \ K+3 18 CLC 60 RTS .MULT3 \ -> &2782 \ K(4)=AP(2)*Q Move planet 85 82 STA &82 \ R \ sg 29 7F AND #&7F 85 42 STA &42 \ K+2 \ hi A5 81 LDA &81 \ Q 29 7F AND #&7F \ Q7 F0 EA BEQ MU5 \ set K to zero 38 SEC E9 01 SBC #1 85 D1 STA &D1 \ T \ Q7-1 as carry will be set A5 1C LDA &1C \ P+1 \ mid 46 42 LSR &42 \ K+2 6A ROR A 85 41 STA &41 \ K+1 \ mid A5 1B LDA &1B \ P 6A ROR A 85 40 STA &40 \ K \ lo A9 00 LDA #0 A2 18 LDX #24 \ 3 bytes .MUL2 \ counter X for 3 bytes 90 02 BCC P%+4 \ skip add 65 D1 ADC &D1 \ T \ add Q7 6A ROR A 66 42 ROR &42 \ K+2 66 41 ROR &41 \ K+1 66 40 ROR &40 \ K CA DEX D0 F2 BNE MUL2 \ loop X 85 D1 STA &D1 \ T \ sg7 A5 82 LDA &82 \ R \ sg 45 81 EOR &81 \ Q 29 80 AND #&80 \ sign bit 05 D1 ORA &D1 \ T \ sg7 85 43 STA &43 \ K+3 60 RTS .MLS2 \ -> &27BE \ assign from stars R.S = XX(0to1), and P.A = A*alp1 (alp1+<32) A6 24 LDX &24 \ XX 86 82 STX &82 \ R \ lo A6 25 LDX &25 \ XX+1 86 83 STX &83 \ S \ hi .MLS1 \ -> &27C6 \ P.A = A*alp1 (alp1+<32) A6 31 LDX &31 \ ALP1 \ roll magnitude \MULTS-2 \ P.A =A*X(X+<32) 86 1B STX &1B \ P .MULTS \ -> &27CA \ P.A =A*P(P+<32) AA TAX \ Acc in 29 80 AND #&80 85 D1 STA &D1 \ T \ sign 8A TXA 29 7F AND #&7F F0 64 BEQ MU6 \ set Plo.Phi = Acc = 0 AA TAX \ Acc in CA DEX 86 06 STX &06 \ T1 \ A7-1 as carry will be set A9 00 LDA #0 46 1B LSR &1B \ P 90 02 BCC P%+4 65 06 ADC &06 \ T1 \ +4 6A ROR A 66 1B ROR &1B \ P 90 02 BCC P%+4 65 06 ADC &06 \ T1 \ +3 6A ROR A 66 1B ROR &1B \ P 90 02 BCC P%+4 65 06 ADC &06 \ T1 \ +2 6A ROR A 66 1B ROR &1B \ P 90 02 BCC P%+4 65 06 ADC &06 \ T1 \ +1 6A ROR A 66 1B ROR &1B \ P 90 02 BCC P%+4 65 06 ADC &06 \ T1 \ +0 6A ROR A 66 1B ROR &1B \ P 4A LSR A \ divide by 8 after loop exited 66 1B ROR &1B \ P 4A LSR A 66 1B ROR &1B \ P 4A LSR A 66 1B ROR &1B \ P 05 D1 ORA &D1 \ T \ sign 60 RTS .SQUA \ -> &280B \ AP=A*ApresQ \ P.A =A7*A7 29 7F AND #&7F .SQUA2 \ -> &280D \ AP=A*A unsigned 85 1B STA &1B \ P AA TAX \ is 0? D0 12 BNE MU11 \ X*A will be done .MU1 \ else P = Acc = Xreg 18 CLC 86 1B STX &1B \ P 8A TXA \ Acc = Xreg 60 RTS .MLU1 \ Y1 = SY,Y and P.A = Y1 7bit * Q B9 82 0F LDA &0F82,Y \ SY,Y 85 35 STA &35 \ Y1 \ dusty .MLU2 \ -> &281C \ P.A = A7*Q 29 7F AND #&7F 85 1B STA &1B \ P .MULTU \ -> &2820 \ AP=P*Qunsg A6 81 LDX &81 \ Q F0 EE BEQ MU1 \ up, P = Acc = Xreg = 0 .MU11 \ P*X will be done CA DEX \ Q-1 as carry will be set for addition 86 D1 STX &D1 \ T A9 00 LDA #0 A2 08 LDX #8 \ counter unwind? 46 1B LSR &1B \ P .MUL6 \ counter X 90 02 BCC P%+4 \ low bit of P lo clear 65 D1 ADC &D1 \ T \ +=Q as carry set 6A ROR A \ hi 66 1B ROR &1B \ P CA DEX D0 F6 BNE MUL6 \ loop X unwind? 60 RTS \ Xreg = 0 .MU6 \ set Plo.Phi = Acc 85 1C STA &1C \ P+1 85 1B STA &1B \ P 60 RTS .FMLTU2 \ -> &283D \ for CIRCLE2, A=K*sin(X)/256unsg 29 1F AND #&1F \ table max #31 AA TAX \ sine table index BD C0 07 LDA &07C0,X \ SNE,X 85 81 STA &81 \ Q \ 0to255 for sine(0to pi) A5 40 LDA &40 \ K \ the radius .FMLTU \ -> &2847 \ A=A*Q/256unsg Fast multiply 49 FF EOR #&FF 38 SEC 6A ROR A \ bring a carry into bit7 85 1B STA &1B \ P \ slide counter A9 00 LDA #0 .MUL3 \ roll P B0 08 BCS MU7 \ carry set, don't add Q 65 81 ADC &81 \ Q \ maybe a carry 6A ROR A 46 1B LSR &1B \ P D0 F7 BNE MUL3 \ loop P 60 RTS .MU7 \ carry set, don't add Q 4A LSR A \ not ROR A 46 1B LSR &1B \ P D0 F1 BNE MUL3 \ loop P 60 RTS .MULTU6 \ -> &285F \ AP=P*Qunsg \ Repeat of multu not needed? A6 81 LDX &81 \ Q F0 AF BEQ MU1 \ up, P = Acc = Xreg = 0 .MU116 \ P*X will be done CA DEX 86 D1 STX &D1 \ T \ = Q-1 as carry will be set for addition A9 00 LDA #0 A2 08 LDX #8 \ counter 46 1B LSR &1B \ P .MUL66 \ counter X 90 02 BCC P%+4 \ low bit of P lo clear 65 D1 ADC &D1 \ T \ +=Q as carry set 6A ROR A \ hi 66 1B ROR &1B \ P CA DEX D0 F6 BNE MUL66 \ loop X 60 RTS \ Repeat of mul6 not needed ? \ MLTU2-2 \ AP(2)= AP* Xunsg(EOR P) 86 81 STX &81 \ Q .MLTU2 \ -> &2879 \ AP(2)= AP* Qunsg(EOR P) 49 FF EOR #&FF \ use 2 bytes of P and A for result 4A LSR A \ hi 85 1C STA &1C \ P+1 A9 00 LDA #0 A2 10 LDX #16 \ 2 bytes 66 1B ROR &1B \ P \ lo .MUL7 \ counter X B0 0B BCS MU21 \ carry set, don't add Q 65 81 ADC &81 \ Q 6A ROR A \ 3 byte result 66 1C ROR &1C \ P+1 66 1B ROR &1B \ P CA DEX D0 F4 BNE MUL7 \ loop X 60 RTS .MU21 \ carry set, don't add Q 4A LSR A \ not ROR A 66 1C ROR &1C \ P+1 66 1B ROR &1B \ P CA DEX D0 EB BNE MUL7 \ loop X 60 RTS .MUT3 \ -> &289A \ R.S = XX(2), A.P=A*Q A6 31 LDX &31 \ ALP1 \ roll magnitude 86 1B STX &1B \ P \ over-written .MUT2 \ -> &289E \ R.S = XX(2), A.P=A*Q A6 25 LDX &25 \ XX+1 86 83 STX &83 \ S \ hi .MUT1 \ Rlo = XX(1), A.P=A*Q A6 24 LDX &24 \ XX 86 82 STX &82 \ R \ lo .MULT1 \ -> &28A6 \ A.P=Q*A first part of MAD, multiply and add. Visited Quite often. AA TAX \ Acc in 29 7F AND #&7F 4A LSR A 85 1B STA &1B \ P 8A TXA \ Acc in 45 81 EOR &81 \ Q 29 80 AND #&80 \ extract sign 85 D1 STA &D1 \ T A5 81 LDA &81 \ Q 29 7F AND #&7F F0 18 BEQ mu10 \ zero down AA TAX \ Q7 CA DEX \ Q7-1 as carry will be set for addition 86 06 STX &06 \ T1 A9 00 LDA #0 A2 07 LDX #7 \ counter X .MUL4 \ Could unroll this loop 90 02 BCC P%+4 \ skip add 65 06 ADC &06 \ T1 \ Q7-1 as carry set 6A ROR A \ both arrive 66 1B ROR &1B \ P CA DEX D0 F6 BNE MUL4 \ loop X 4A LSR A \ hi 66 1B ROR &1B \ P 05 D1 ORA &D1 \ T \ sign 60 RTS .mu10 \ zero down 85 1B STA &1B \ P 60 RTS .MULT12 \ -> &28D4 \ R.S = Q * A \ visited quite often 20 A6 28 JSR &28A6 \ MULT1 \ visit above, (P,A)= Q * A 85 83 STA &83 \ S \ hi A5 1B LDA &1B \ P 85 82 STA &82 \ R \ lo 60 RTS \ TAS3-2 \ -> &28DE \ set Y to #10 before-hand. A0 0A LDY #10 .TAS3 \ -> &28E0 \ returns XX15.inwk,y Dot product B6 46 LDX &46,Y \ INWK+0,Y 86 81 STX &81 \ Q A5 34 LDA &34 \ XX15+0 \ xunit 20 D4 28 JSR &28D4 \ MULT12 \ R.S = inwk*xx15 B6 48 LDX &48,Y \ INWK+2,Y 86 81 STX &81 \ Q A5 35 LDA &35 \ XX15+1 \ yunit 20 FC 28 JSR &28FC \ MAD \ X.A = inwk*xx15 + R.S 85 83 STA &83 \ S 86 82 STX &82 \ R B6 4A LDX &4A,Y \ INWK+4,Y 86 81 STX &81 \ Q A5 36 LDA &36 \ XX15+2 \ zunit .MAD \ -> &28FC \ Multiply and Add X.A = Q*A + R.S 20 A6 28 JSR &28A6 \ MULT1 \ AP=Q * A, protects Y. .ADD \ -> &28FF \ X.A = P.A + R.S 85 06 STA &06 \ T1 \ store hi 29 80 AND #&80 \ extract sign 85 D1 STA &D1 \ T 45 83 EOR &83 \ S 30 0D BMI MU8 \ different signs A5 82 LDA &82 \ R \ lo 18 CLC \ add lo 65 1B ADC &1B \ P AA TAX \ Xreg=lo A5 83 LDA &83 \ S \ hi 65 06 ADC &06 \ T1 \ stored hi 05 D1 ORA &D1 \ T \ sign 60 RTS .MU8 \ different signs A5 83 LDA &83 \ S \ hi 29 7F AND #&7F \ hi S7 85 80 STA &80 \ U A5 1B LDA &1B \ P \ lo 38 SEC \ sub E5 82 SBC &82 \ R AA TAX \ Xreg=lo A5 06 LDA &06 \ T1 \ restore hi 29 7F AND #&7F \ hi T17 E5 80 SBC &80 \ U B0 0E BCS MU9 \ sign ok 85 80 STA &80 \ U 8A TXA \ lo 49 FF EOR #&FF \ flip 69 01 ADC #1 AA TAX \ negated lo A9 00 LDA #0 \ negate hi E5 80 SBC &80 \ U 09 80 ORA #&80 \ set sign .MU9 \ sign ok 45 D1 EOR &D1 \ T 60 RTS .TIS1 \ -> &293B \ Tidy subroutine 1 X.A = (-X*A + (R.S))/96 86 81 STX &81 \ Q 49 80 EOR #&80 \ flip sign of Acc 20 FC 28 JSR &28FC \ MAD \ multiply and add (X,A) = -X*A + (R,S) .DVID96 \ Their comment A=A/96: answer is A*255/96 AA TAX 29 80 AND #&80 \ hi sign 85 D1 STA &D1 \ T 8A TXA 29 7F AND #&7F \ hi A7 A2 FE LDX #&FE \ slide counter 86 06 STX &06 \ T1 .DVL3 \ roll T1 clamp Acc to #96 for rotation matrix unity 0A ASL A C9 60 CMP #&60 \ max 96 90 02 BCC DV4 \ skip subtraction E9 60 SBC #&60 .DV4 \ skip subtraction 26 06 ROL &06 \ T1 B0 F5 BCS DVL3 \ loop T1 A5 06 LDA &06 \ T1 05 D1 ORA &D1 \ T \ hi sign 60 RTS .DV42 \ -> &295E \ travel step of dust particle front/rear B9 A8 0F LDA &0FA8,Y \ SZ,Y \ dustz .DV41 \ -> &2961 \ P.R = speed/ (ZZ/8) Called by STARS2 left/right 85 81 STA &81 \ Q A5 7D LDA &7D \ DELTA \ speed, how far has dust moved based on its z-coord .DVID4 \ -> &2965 \ P-R=A/Qunsg \ P.R = A/Q unsigned called by compass in Block E A2 08 LDX #8 \ counter 0A ASL A 85 1B STA &1B \ P A9 00 LDA #0 .DVL4 \ counter X 2A ROL A B0 04 BCS DV8 \ Acc carried C5 81 CMP &81 \ Q 90 03 BCC DV5 \ skip subtraction .DV8 \ Acc carried E5 81 SBC &81 \ Q 38 SEC \ carry gets set .DV5 \ skip subtraction 26 1B ROL &1B \ P \ hi CA DEX D0 F1 BNE DVL4 \ loop X, hi left in P. 4C F3 47 JMP &47F3 \ LL28+4 \ Block G remainder R for A*256/Q .DVID3B2 \ -> &297E \ Divide 3 bytes by 2 bytes, K = P.A/INWK_z for planet, Xreg protected. 85 1D STA &1D \ P+2 \ num sg A5 4C LDA &4C \ INWK+6 \ z coord lo 85 81 STA &81 \ Q A5 4D LDA &4D \ INWK+7 \ z coord hi 85 82 STA &82 \ R A5 4E LDA &4E \ INWK+8 \ z coord sg 85 83 STA &83 \ S .DVID3B \ -> &298C \ K (3bytes)=P(3bytes)/S.R.Q. aprx Acc equiv K(0) A5 1B LDA &1B \ P \ num lo 09 01 ORA #1 \ avoid 0 85 1B STA &1B \ P A5 1D LDA &1D \ P+2 \ num sg 45 83 EOR &83 \ S \ zsg 29 80 AND #&80 \ extract sign 85 D1 STA &D1 \ T A0 00 LDY #0 \ counter A5 1D LDA &1D \ P+2 \ num sg 29 7F AND #&7F \ will look at lower 7 bits of Acc in. .DVL9 \ counter Y up C9 40 CMP #&40 \ object very far away? B0 08 BCS DV14 \ scaled, exit Ycount 06 1B ASL &1B \ P 26 1C ROL &1C \ P+1 2A ROL A \ 3 bytes C8 INY D0 F4 BNE DVL9 \ loop Y .DV14 \ scaled, exited Ycount 85 1D STA &1D \ P+2 \ big numerator A5 83 LDA &83 \ S \ zsg 29 7F AND #&7F \ denom sg7 30 08 BMI DV9 \ can't happen .DVL6 \ counter Y back down, roll S. 88 DEY \ scale Y back 06 81 ASL &81 \ Q \ denom lo 26 82 ROL &82 \ R 2A ROL A \ hi S 10 F8 BPL DVL6 \ loop roll S until Abit7 set. .DV9 \ bmi cant happen? 85 81 STA &81 \ Q \ mostly empty so now reuse as hi denom A9 FE LDA #&FE \ Xreg protected so can't LL28+4 85 82 STA &82 \ R A5 1D LDA &1D \ P+2 \ big numerator 20 F7 47 JSR &47F7 \ LL31\ R now =A*256/Q A9 00 LDA #0 \ K1to3 = 0 85 41 STA &41 \ K+1 85 42 STA &42 \ K+2 85 43 STA &43 \ K+3 98 TYA \ Y counter for scale 10 1E BPL DV12 \ Ycount +ve A5 82 LDA &82 \ R \ else Y count is -ve, Acc = remainder. .DVL8 \ counter Y up 0A ASL A \ boost up 26 41 ROL &41 \ K+1 26 42 ROL &42 \ K+2 26 43 ROL &43 \ K+3 C8 INY D0 F6 BNE DVL8 \ loop Y up 85 40 STA &40 \ K \ lo A5 43 LDA &43 \ K+3 \ sign 05 D1 ORA &D1 \ T 85 43 STA &43 \ K+3 60 RTS .DV13 \ Ycount zero \ K(1to2) already = 0 A5 82 LDA &82 \ R \ already correct 85 40 STA &40 \ K \ lo A5 D1 LDA &D1 \ T \ sign 85 43 STA &43 \ K+3 60 RTS .DV12 \ Ycount +ve F0 F5 BEQ DV13 \ Ycount zero, up. A5 82 LDA &82 \ R \ else reduce remainder .DVL10 \ counter Y reduce 4A LSR A 88 DEY D0 FC BNE DVL10 \ loop Y reduce 85 40 STA &40 \ K \ lo A5 D1 LDA &D1 \ T \ sign 85 43 STA &43 \ K+3 60 RTS .cntr \ -> &29FF \ Center ship indicators AD 3F 03 LDA &033F \ DAUTO \ auto docking D0 05 BNE cnt2 AD C7 03 LDA &03C7 \ DAMP \ damping toggle D0 0C BNE RE1 \ rts .cnt2 8A TXA 10 03 BPL BUMP \ nudge up CA DEX 30 06 BMI RE1 \ rts .BUMP \ counter X nudge up E8 INX D0 03 BNE RE1 \ rts .REDU \ reduce, nudge down. CA DEX F0 FA BEQ BUMP \ nudge up .RE1 \ rts 60 RTS .BUMP2 \ -> &2A16 \ increase X by A 85 D1 STA &D1 \ T 8A TXA 18 CLC 65 D1 ADC &D1 \ T AA TAX \ sum of A and X that BUMP2 was called with 90 02 BCC RE2 \ not sat A2 FF LDX #&FF \ else sat .RE2 \ not sat 10 10 BPL RE3+2 \ if +ve, lda djd A5 D1 LDA &D1 \ T \ restore \ RE2+2 \ finish REDU2 60 RTS .REDU2 \ -> &2A26 \ reduce X by A 85 D1 STA &D1 \ T 8A TXA 38 SEC E5 D1 SBC &D1 \ T AA TAX \ subtracted B0 02 BCS RE3 \ no underflow A2 01 LDX #1 \ else minimum .RE3 \ no underflow 10 F0 BPL RE2+2 \ not negative up, finish. AD C8 03 LDA &03C8 \ DJD \ Toggle Keyboard auto re-centering D0 EB BNE RE2+2 \ no centering, finish. A2 80 LDX #&80 \ middle 30 E7 BMI RE2+2 \ guaranteed up, finish. .ARCTAN \ -> &2A3C \ A=TAN-1(P/Q) \ A=arctan (P/Q) called from block E A5 1B LDA &1B \ P 45 81 EOR &81 \ Q 85 06 STA &06 \ T1 \ quadrant info A5 81 LDA &81 \ Q F0 25 BEQ AR2 \ Q=0 so set angle to 63, pi/2 0A ASL A \ drop sign 85 81 STA &81 \ Q A5 1B LDA &1B \ P 0A ASL A \ drop sign C5 81 CMP &81 \ Q B0 09 BCS AR1 \ swop A and Q as A >= Q 20 75 2A JSR &2A75 \ ARS1 \ get Angle for A*32/Q from table. 38 SEC .AR4 \ sub o.k A6 06 LDX &06 \ T1 30 16 BMI AR3 \ -ve quadrant 60 RTS .AR1 \ swop A and Q A6 81 LDX &81 \ Q 85 81 STA &81 \ Q 86 1B STX &1B \ P 8A TXA 20 75 2A JSR &2A75 \ ARS1 \ get Angle for A*32/Q from table. 85 D1 STA &D1 \ T \ angle A9 40 LDA #64 \ next range of angle, pi/4 to pi/2 E5 D1 SBC &D1 \ T B0 E9 BCS AR4 \ sub o.k .AR2 \ set angle to 90 degrees A9 3F LDA #&3F \ #63 60 RTS .AR3 \ -ve quadrant 85 D1 STA &D1 \ T \ angle A9 80 LDA #&80 \ pi E5 D1 SBC &D1 \ T \ A = 128-T, so now covering range pi/2 to pi correctly 60 RTS .ARS1 \ -> &2A75 \ get Angle for A*32/Q from table. 20 EF 47 JSR &47EF \ LL28 \ BFRDIV R=A*256/Q A5 82 LDA &82 \ R 4A LSR A 4A LSR A 4A LSR A \ 31 max. AA TAX \ index into table at end of words data BD E0 07 LDA &07E0,X \ ACT,X .ARSR \ rts used by laser lines below 60 RTS .LASLI \ -> &2A82 \ laser lines 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 29 07 AND #7 69 5C ADC #&5C \ #Y-4 \ below center of screen 8D CF 0F STA &0FCF \ LASY 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 29 07 AND #7 69 7C ADC #&7C \ #&80-4 \ left of center 8D CE 0F STA &0FCE \ LASX AD 47 03 LDA &0347 \ GNTMP \ gun temperature 69 08 ADC #8 \ heat up laser temperature 8D 47 03 STA &0347 \ GNTMP 20 29 36 JSR &3629 \ DENGY \ drain energy by 1 for active ECM pulse .LASLI2 \ -> &2AA1 A5 87 LDA &87 \ QQ11 \ If not zero then not a space view D0 DC BNE ARSR \ rts A9 20 LDA #&20 \ xleft A0 E0 LDY #&E0 \ xright 20 B0 2A JSR &2AB0 \ las \ (a few lines below) twice A9 30 LDA #&30 \ new xleft A0 D0 LDY #&D0 \ new xright .las \ -> &2AB0 85 36 STA &36 \ X2 AD CE 0F LDA &0FCE \ LASX \ center-X 85 34 STA &34 \ X1 AD CF 0F LDA &0FCF \ LASY \ center-Y 85 35 STA &35 \ Y1 A9 BF LDA #&BF \ #2*Y-1 \ bottom of screen 85 37 STA &37 \ Y2 20 C4 16 JSR &16C4 \ LOIN \ from center (X1,Y1) to bottom left (X2,Y2) AD CE 0F LDA &0FCE \ LASX 85 34 STA &34 \ X1 AD CF 0F LDA &0FCF \ LASY 85 35 STA &35 \ Y1 84 36 STY &36 \ X2 A9 BF LDA #&BF \ #2*Y-1 85 37 STA &37 \ Y2 4C C4 16 JMP &16C4 \ LOIN 8C E7 8D ED \ junk similar in Tcode, similar 22 bytes 8A E6 C1 C8 \ similar in EltCode end of Block D C8 8B E0 8A E6 D6 C5 C6 C1 CA 95 9D 9C 97 \ ---===== end of block C === onto block D =====------ &2AEC .tnpr \ -> &2AEC \ ton count, Acc = item. Exits with Acc = 1 8D AD 03 STA &03AD \ QQ29 \ market item, 0to16 A9 01 LDA #1 \ scooping adds one item 48 PHA \ store #1 A2 0C LDX #12 \ above minerals EC AD 03 CPX &03AD \ QQ29 90 0B BCC kg \ treated as kg .Tml \ Count tonnes, counter X start at 12 7D 6F 03 ADC &036F,X \ QQ20,X \ tonnes added to Acc initial =1 CA DEX 10 FA BPL Tml \ loop X CD 6E 03 CMP &036E \ CRGO \ max cargo, carry set is too much. 68 PLA \ scooping added one item 60 RTS .kg \ scooped item QQ29 > 12 AC AD 03 LDY &03AD \ QQ29 \ market item, 0to16 B9 6F 03 LDA &036F,Y \ QQ20,Y C9 C8 CMP #200 \ 199 kg max, carry set is too much. 68 PLA \ scooping added one item 60 RTS .TT20 \ -> &2B0E \ TWIST on QQ15 to next system 20 11 2B JSR &2B11 \ P%+3 \ do four times 20 14 2B JSR &2B14 \ TT54 \ do twice .TT54 \ -> &2B14 \ Twist seed for next digram in QQ15 A5 6C LDA &6C \ QQ15+0 18 CLC 65 6E ADC &6E \ QQ15+2 AA TAX \ partial sum lo A5 6D LDA &6D \ QQ15+1 65 6F ADC &6F \ QQ15+3 A8 TAY \ partial sum hi A5 6E LDA &6E \ QQ15+2 85 6C STA &6C \ QQ15+0 A5 6F LDA &6F \ QQ15+3 85 6D STA &6D \ QQ15+1 A5 71 LDA &71 \ QQ15+5 85 6F STA &6F \ QQ15+3 A5 70 LDA &70 \ QQ15+4 85 6E STA &6E \ QQ15+2 18 CLC 8A TXA \ sum lo will be new w2_l 65 6E ADC &6E \ QQ15+2 85 70 STA &70 \ QQ15+4 98 TYA \ sum hi will be new w2_h 65 6F ADC &6F \ QQ15+3 85 71 STA &71 \ QQ15+5 60 RTS .TT146 \ -> &2B3B \ Distance in Light years AD BF 03 LDA &03BF \ QQ8 \ distance in 0.1 LY units 0D C0 03 ORA &03C0 \ QQ8+1 D0 03 BNE TT63 \ if not zero, Distance in Light years E6 2D INC &2D \ YC \ else just new text line 60 RTS .TT63 \ Distance in Light years A9 BF LDA #&BF \ token = DISTANCE 20 95 33 JSR &3395 \ TT68 \ process token followed by colon AE BF 03 LDX &03BF \ QQ8 AC C0 03 LDY &03C0 \ QQ8+1 38 SEC \ with decimal point 20 B4 30 JSR &30B4 \ pr5 \ print 4 digits of XloYhi A9 C3 LDA #&C3 \ token = LIGHT YEARS .TT60 \ -> &2B57 \ process TT27 token then next row 20 9A 33 JSR &339A \ TT27 \ process text token .TTX69 \ -> &2B5A \ next Row E6 2D INC &2D \ YC .TT69 \ -> &2B5C \ next Row with QQ17 set A9 80 LDA #&80 \ set bit7 for Upper case 85 72 STA &72 \ QQ17 .TT67 \ -> &2B60 \ next Row A9 0C LDA #&0C 4C 9A 33 JMP &339A \ TT27 \ process text token .TT70 \ Economy is mainly.. A9 AD LDA #&AD \ token for Economy = 'Mainly' 20 9A 33 JSR &339A \ TT27 \ process text token 4C A9 2B JMP &2BA9 \ TT72 \ back down to work out if Ind or Agr .spc \ -> &2B6D \ Acc to TT27, followed by white space 20 9A 33 JSR &339A \ TT27 \ process text token 4C 42 31 JMP &3142 \ TT162 \ then visit TT27 again but with A=#32, print white space. .TT25 \ -> &2B73 \ display DATA on system A9 01 LDA #1 \ menu id not space view 20 C8 54 JSR &54C8 \ TT66 \ box border with QQ11 set to Acc A9 09 LDA #9 \ indent text xcursor 85 2C STA &2C \ XC A9 A3 LDA #&A3 \ token = DATA ON .. 20 9A 33 JSR &339A \ TT27 \ process text token (could have used nlin3) 20 4E 18 JSR &184E \ NLIN \ no token just horizontal line at 23 20 5A 2B JSR &2B5A \ TTX69 \ next row then tab E6 2D INC &2D \ YC \ Y cursor 20 3B 2B JSR &2B3B \ TT146 \ Non-zero distance in Light years A9 C2 LDA #&C2 \ token = ECONOMY 20 95 33 JSR &3395 \ TT68 \ process token followed by colon AD B8 03 LDA &03B8 \ QQ3 \ Economy of target system 18 CLC 69 01 ADC #1 \ Economy+1 4A LSR A C9 02 CMP #2 \ is Economy 'mainly..' ? F0 C9 BEQ TT70 \ hop up several lines then down to TT72 AD B8 03 LDA &03B8 \ QQ3 \ else reload Economy 90 03 BCC TT71 \ hop over sbc if QQ3 was <4, Industrial E9 05 SBC #5 \ else Agricultural 18 CLC .TT71 69 AA ADC #&AA \ #170 to #172 token = Rich Average Poor 20 9A 33 JSR &339A \ TT27 \ process text token .TT72 \ -> &2BA9 Ind or Agr AD B8 03 LDA &03B8 \ QQ3 4A LSR A 4A LSR A \ Economy/4 18 CLC 69 A8 ADC #&A8 \ token = Ind..Agr 20 57 2B JSR &2B57 \ TT60 \ = TT27 token then next row A9 A2 LDA #&A2 \ token = GOVERNMENT 20 95 33 JSR &3395 \ TT68 \ process token followed by colon AD B9 03 LDA &03B9 \ QQ4 \ Government, 0 is Anarchy. 18 CLC 69 B1 ADC #&B1 \ token = Anarchy..Corporate State 20 57 2B JSR &2B57 \ TT60 \ = TT27 token then next row A9 C4 LDA #&C4 \ token = TECH.LEVEL 20 95 33 JSR &3395 \ TT68 \ process token followed by colon AE BA 03 LDX &03BA \ QQ5 \ TechLevel-1 E8 INX \ displayed tech level is 1 higher 18 CLC \ no decimal point 20 38 1E JSR &1E38 \ pr2 \ number X to printable characters 20 5A 2B JSR &2B5A \ TTX69 \ next row then tab A9 C0 LDA #&C0 \ token = POPULATION 20 95 33 JSR &3395 \ TT68 \ process token followed by colon 38 SEC \ decimal point AE BB 03 LDX &03BB \ QQ6 \ population*10 20 38 1E JSR &1E38 \ pr2 \ number X to printable characters A9 C6 LDA #&C6 \ token = BILLION 20 57 2B JSR &2B57 \ TT60 \ process TT27 token then next row A9 28 LDA #&28 \ ascii '(' 20 9A 33 JSR &339A \ TT27 \ process text token A5 70 LDA &70 \ QQ15+4 \ seed w2_l for species type 30 08 BMI TT75 \ bit7 set Other species A9 BC LDA #&BC \ else token = HUMAN COLONIAL 20 9A 33 JSR &339A \ TT27 \ process text token 4C 30 2C JMP &2C30 \ TT76 \ jump over Other to Both species .TT75 \ bit7 set, Other species A5 71 LDA &71 \ QQ15+5 \ seed w2 hsb for Other species 4A LSR A 4A LSR A \ bits 8,9 dropped, 48 PHA \ upper 6 onto stack. 29 07 AND #7 C9 03 CMP #3 \ >=3 ? B0 05 BCS TT205 \ skip first adjective 69 E3 ADC #&E3 \ else 0=Large, 1=Fierce, 2=Small -> 227,228,229 20 6D 2B JSR &2B6D \ spc \ Acc to TT27 followed by white space .TT205 \ skipped first adjective 68 PLA \ restore upper 6 bits of w2 hsb 4A LSR A 4A LSR A 4A LSR A \ throw 3 used bits away C9 06 CMP #6 \ >=6? B0 05 BCS TT206 \ skip second adjective 69 E6 ADC #&E6 \ else Green=0, Red=1, Yellow=2, Blue=3, Black=4, Harmless=5 20 6D 2B JSR &2B6D \ spc \ Acc to TT27 followed by white space .TT206 \ skipped second adjective A5 6F LDA &6F \ QQ15+3 45 6D EOR &6D \ QQ15+1 29 07 AND #7 85 73 STA &73 \ QQ19 \ temp C9 06 CMP #6 \ >=6? B0 05 BCS TT207 \ skip third adjective 69 EC ADC #&EC \ else Slimy=0, Bug-Eyed=1, 2=Horned, 3=Bony, 4=Fat, 5=Furry 20 6D 2B JSR &2B6D \ spc \ Acc to TT27 followed by white space .TT207 \ skipped third adjective A5 71 LDA &71 \ QQ15+5 \ w2_h 29 03 AND #3 18 CLC 65 73 ADC &73 \ QQ19 \ temp 0to7 29 07 AND #7 \ some adjective combinations not allowed 69 F2 ADC #&F2 \ 0=Rodents 1=Frogs 2=Lizards 3=Lobsters 4=Birds 5=Humanoids 6=Felines 7=Insects 20 9A 33 JSR &339A \ TT27 \ process text token .TT76 \ -> &2C30 \ Both species options arrive here A9 53 LDA #&53 \ ascii 'S' 20 9A 33 JSR &339A \ TT27 \ process text token A9 29 LDA #&29 \ ascii ')' 20 57 2B JSR &2B57 \ TT60 \ TT27 token then next row A9 C1 LDA #&C1 \ token = GROSS PRODUCTIVITY 20 95 33 JSR &3395 \ TT68 \ process token followed by colon AE BD 03 LDX &03BD \ QQ7 \ productivity*10 AC BE 03 LDY &03BE \ QQ7+1 \ hi 20 B3 30 JSR &30B3 \ pr6 \ 5 digits of XloYhi, no decimal point. 20 42 31 JSR &3142 \ TT162 \ white space A9 00 LDA #0 \ clear 85 72 STA &72 \ QQ17 \ printing format for all Upper Case A9 4D LDA #&4D \ ascii 'M' 20 9A 33 JSR &339A \ TT27 \ process text token A9 E2 LDA #&E2 \ token = 'CR' 20 57 2B JSR &2B57 \ TT60 \ TT27 token then next row A9 FA LDA #&FA \ token = AVERAGE RADIUS 20 95 33 JSR &3395 \ TT68 \ process token followed by colon A5 71 LDA &71 \ QQ15+5 \ seed w2_h A6 6F LDX &6F \ QQ15+3 \ seed w1_h radius lo 29 0F AND #&0F \ lower 4 bits of w2_h determine planet radius 18 CLC 69 0B ADC #11 \ radius min = 256*11 = 2816 km A8 TAY \ radius hi 20 B4 30 JSR &30B4 \ pr5 \ print 4 digits of XloYhi 20 42 31 JSR &3142 \ TT162 \ white space A9 6B LDA #&6B \ ascii 'k' 20 FC 1E JSR &1EFC \ TT26 \ print character A9 6D LDA #&6D \ ascii 'm' 4C FC 1E JMP &1EFC \ TT26 \ print character \ no planet description during flight .TT24 \ -> &2C78 \ Calculate system Data A5 6D LDA &6D \ QQ15+1 \ seed w0_h 29 07 AND #7 \ Economy build 8D B8 03 STA &03B8 \ QQ3 \ 0 is Rich Industrial. A5 6E LDA &6E \ QQ15+2 \ seed w1_l 4A LSR A \ Gov build 4A LSR A 4A LSR A \ /=8 29 07 AND #7 8D B9 03 STA &03B9 \ QQ4 \ Government, 0 is Anarchy 4A LSR A D0 08 BNE TT77 \ above feudal, economy can be Rich. AD B8 03 LDA &03B8 \ QQ3 \ else reload economy build 09 02 ORA #2 \ Adjust Eco for Anarchy and Feudal, set bit 1. 8D B8 03 STA &03B8 \ QQ3 .TT77 \ above Feudal, can be Rich. AD B8 03 LDA &03B8 \ QQ3 \ Economy of target system 49 07 EOR #7 \ flip economy so Rich is now 7 18 CLC \ onto tech level 8D BA 03 STA &03BA \ QQ5 \ Flipped Eco, EcoEOR7, Rich Ind = 7 A5 6F LDA &6F \ QQ15+3 \ seed w1_h 29 03 AND #3 \ add flipped eco 6D BA 03 ADC &03BA \ QQ5 8D BA 03 STA &03BA \ QQ5 AD B9 03 LDA &03B9 \ QQ4 \ Government, 0 is Anarchy 4A LSR A \ gov/2 6D BA 03 ADC &03BA \ QQ5 8D BA 03 STA &03BA \ QQ5 \ Techlevel-1 = 0to14 0A ASL A \ Onto Population 0A ASL A \ (TL-1)*= 4 6D B8 03 ADC &03B8 \ QQ3 \ TechLevel*4 + Eco 7-56 6D B9 03 ADC &03B9 \ QQ4 \ Government, 0 is Anarchy. 69 01 ADC #1 \ +1 = population*10 8D BB 03 STA &03BB \ QQ6 AD B8 03 LDA &03B8 \ QQ3 \ Economy 49 07 EOR #7 \ Onto productivity 69 03 ADC #3 \ (Flipped eco +3) 85 1B STA &1B \ P AD B9 03 LDA &03B9 \ QQ4 \ Government, 0 is Anarchy 69 04 ADC #4 \ = (Gov +4) 85 81 STA &81 \ Q 20 20 28 JSR &2820 \ MULTU \ P.A = P*Q, Productivity part 1. has hsb in A, lsb in P. AD BB 03 LDA &03BB \ QQ6 \ population*10 85 81 STA &81 \ Q \ Population, P retains (3to10)*(4to11) = 110 max 20 20 28 JSR &2820 \ MULTU \ P.A = P*Q = Productivity part 1 * Population 06 1B ASL &1B \ P 2A ROL A \ hi *=2 06 1B ASL &1B \ P 2A ROL A 06 1B ASL &1B \ P 2A ROL A \ *= 8 hi 8D BE 03 STA &03BE \ QQ7+1 \ have to use 2 bytes for Productivity, max 7041 A5 1B LDA &1B \ P 8D BD 03 STA &03BD \ QQ7+0 \ 8*(P-A) = Productivity (768to56320) M Cr 60 RTS .TT22 \ -> &2CEB \ Lng Sc \ their comment, Long range galactic chart. A9 40 LDA #&40 \ bit6 set for menu i.d. 20 C8 54 JSR &54C8 \ TT66 \ box border with QQ11 set to A A9 07 LDA #7 \ indent 85 2C STA &2C \ XC 20 6A 2F JSR &2F6A \ TT81 \ QQ15 loaded with rolled planet seed. A9 C7 LDA #&C7 \ token = GALACTIC CHART. 20 9A 33 JSR &339A \ TT27 \ process text token 20 4E 18 JSR &184E \ NLIN \ no token just horizontal line at 23 A9 98 LDA #152 \ second horizontal line 20 52 18 JSR &1852 \ NLIN2 \ horizontal line drawn at A = #152 20 A1 2D JSR &2DA1 \ TT14 \ Circle with a cross hair A2 00 LDX #0 .TT83 \ counter X 256 systems 86 84 STX &84 \ XSAV \ store counter A6 6F LDX &6F \ QQ15+3 \ seed w1_h is Xcoord of star A4 70 LDY &70 \ QQ15+4 \ seed w2_l is star size 98 TYA 09 50 ORA #&50 \ minimum distance away 85 88 STA &88 \ ZZ \ pixel distance sets star size A5 6D LDA &6D \ QQ15+1 \ seed w0_h is Ycoord*2 4A LSR A \ /2=Ycoord 18 CLC \ add offset to 69 18 ADC #&18 \ Ycoord of star 85 35 STA &35 \ Y1 20 32 19 JSR &1932 \ PIXEL \ at (X,Y) ZZ away, Yreg protected. 20 0E 2B JSR &2B0E \ TT20 \ TWIST operation on QQ15(0to5) A6 84 LDX &84 \ XSAV \ restore counter E8 INX \ next system D0 E2 BNE TT83 \ loop X, 256 stars AD C1 03 LDA &03C1 \ QQ9 \ target planet X 85 73 STA &73 \ QQ19 \ xorg for cross-hair AD C2 03 LDA &03C2 \ QQ10 \ target planet Y 4A LSR A \ /= 2 org for cross-hair 85 74 STA &74 \ QQ19+1 \ Y1 calculated again with this A9 04 LDA #4 \ target cross-hair size 85 75 STA &75 \ QQ19+2 .TT15 \ -> &2D36 \ cross hair using QQ19(0to2) for laser or chart A9 18 LDA #24 \ default cross size A6 87 LDX &87 \ QQ11 \ menu i.d. 10 02 BPL TT178 \ if bit7 clear hop over lda #0 A9 00 LDA #0 \ else Short range chart .TT178 85 78 STA &78 \ QQ19+5 \ Ycross could be #24 A5 73 LDA &73 \ QQ19 \ Xorg 38 SEC E5 75 SBC &75 \ QQ19+2 \ cross-hair size B0 02 BCS TT84 \ Xorg-cross-hair ok A9 00 LDA #0 .TT84 \ Xorg-cross-hair ok 85 34 STA &34 \ X1 \ left A5 73 LDA &73 \ QQ19 \ Xorg 18 CLC \ Xorg+cross-hair size 65 75 ADC &75 \ QQ19+2 90 02 BCC TT85 \ no X overflow A9 FF LDA #&FF \ else right edge .TT85 \ No X overflow 85 36 STA &36 \ X2 \ right A5 74 LDA &74 \ QQ19+1 18 CLC \ Yorg + Ycross 65 78 ADC &78 \ QQ19+5 \ could be #24 85 35 STA &35 \ Y1 \ Yorg + Ycross 20 68 18 JSR &1868 \ HLOIN \ horizontal line X1,Y1,X2 Yreg protected. A5 74 LDA &74 \ QQ19+1 38 SEC \ Yorg - cross-hair size E5 75 SBC &75 \ QQ19+2 B0 02 BCS TT86 \ Yorg-cross-hair ok A9 00 LDA #0 .TT86 \ Yorg-cross-hair ok 18 CLC 65 78 ADC &78 \ QQ19+5 \ could be #24 85 35 STA &35 \ Y1 \ the top-most extent A5 74 LDA &74 \ QQ19+1 \ Yorg 18 CLC 65 75 ADC &75 \ QQ19+2 \ cross-hair size 65 78 ADC &78 \ QQ19+5 \ could be #24 C9 98 CMP #&98 \ Ytop 90 06 BCC TT87 \ Yscreen sum ok A6 87 LDX &87 \ QQ11 \ menu id = short range chart? 30 02 BMI TT87 \ Yscreen sum ok A9 97 LDA #151 \ else ymax .TT87 \ Yscreen sum ok 85 37 STA &37 \ Y2 \ Y cross top A5 73 LDA &73 \ QQ19 \ Xorg 85 34 STA &34 \ X1 85 36 STA &36 \ X2 4C C4 16 JMP &16C4 \ LOIN \ draw vertical line using (X1,Y1), (X2,Y2) .TT126 \ default Circle with a cross-hair A9 68 LDA #104 \ Xorg 85 73 STA &73 \ QQ19 A9 5A LDA #90 \ Yorg 85 74 STA &74 \ QQ19+1 A9 10 LDA #16 \ cross-hair size 85 75 STA &75 \ QQ19+2 20 36 2D JSR &2D36 \ TT15 \ the cross hair using QQ19(0to2) AD 65 03 LDA &0365 \ QQ14 \ ship fuel #70 = #&46 85 40 STA &40 \ K \ radius 4C C5 2D JMP &2DC5 \ TT128 \ below. QQ19(0,1) and K for Circle .TT14 \ -> &2DA1 \ Crcl/+ Circle with a cross hair A5 87 LDA &87 \ QQ11 \ menu i.d. 30 E5 BMI TT126 \ if bit7 set up, Short range chart default. AD 65 03 LDA &0365 \ QQ14 \ else ship fuel #70 = #&46 4A LSR A \ Long range chart uses 4A LSR A \ /=4 85 40 STA &40 \ K \ radius AD 59 03 LDA &0359 \ QQ0 \ present X 85 73 STA &73 \ QQ19 \ Xorg AD 5A 03 LDA &035A \ QQ1 \ present Y 4A LSR A \ Y /=2 85 74 STA &74 \ QQ19+1 \ Yorg A9 07 LDA #7 \ cross-hair size 85 75 STA &75 \ QQ19+2 20 36 2D JSR &2D36 \ TT15 \ present cross hair using QQ19 A5 74 LDA &74 \ QQ19+1 \ Yorg 18 CLC 69 18 ADC #24 85 74 STA &74 \ QQ19+1 \ Ytop .TT128 \ -> &2DC5 \ QQ19(0,1) and K for circle A5 73 LDA &73 \ QQ19 85 D2 STA &D2 \ K3 \ Xorg A5 74 LDA &74 \ QQ19+1 85 E0 STA &E0 \ K4 \ Yorg A2 00 LDX #0 \ hi 86 E1 STX &E1 \ K4+1 86 D3 STX &D3 \ K3+1 E8 INX \ step size for circle = 1 86 6B STX &6B \ LSP A2 02 LDX #2 \ load step =2, fairly big circle with small step size. 86 95 STX &95 \ STP 20 90 3B JSR &3B90 \ CIRCLE2 60 RTS \ could have used jmp .TT210 \ -> &2DDE \ Cargo list Inventory (no sell) A0 00 LDY #0 .TT211 \ counter Y = QQ29 for item 8C AD 03 STY &03AD \ QQ29 .NWDAVxx BE 6F 03 LDX &036F,Y \ QQ20,Y \ ship cargo count F0 24 BEQ TT212 \ skip cargo item 98 TYA \ build index base 0A ASL A 0A ASL A \ Y*4 A8 TAY \ build index base Y*4 B9 1A 46 LDA &461A,Y \ QQ23+1,Y \ Prxs 85 74 STA &74 \ QQ19+1 \ byte1 of Market Prxs info 8A TXA \ ship cargo count 48 PHA \ store 20 5C 2B JSR &2B5C \ TT69 \ next Row with QQ17 set 18 CLC \ item index used to build token AD AD 03 LDA &03AD \ QQ29 69 D0 ADC #&D0 \ token = FOOD .. GEM-STONES 20 9A 33 JSR &339A \ TT27 \ process flight text token A9 0E LDA #14 \ indent 85 2C STA &2C \ XC 68 PLA \ restore AA TAX \ ship cargo count 18 CLC \ no decimal point 20 38 1E JSR &1E38 \ pr2 \ number X to printable characters 20 35 31 JSR &3135 \ TT152 \ t kg g from QQ19+1 byte1 .TT212 \ skipped item AC AD 03 LDY &03AD \ QQ29 \ market item, 0to16 C8 INY \ next market item C0 11 CPY #17 \ last cargo type? 90 CC BCC TT211 \ loop, next QQ29 60 RTS .TT213 \ -> &2E15 \ Invntry Inventory A9 08 LDA #8 \ menu i.d. 20 C8 54 JSR &54C8 \ TT66 \ box border with QQ11 set to A A9 0B LDA #11 \ indent 85 2C STA &2C \ XC A9 A4 LDA #&A4 \ token = INVENTORY 20 57 2B JSR &2B57 \ TT60 \ TT27 token then next row 20 4A 18 JSR &184A \ NLIN4 \ draw line at Y = #19 20 66 33 JSR &3366 \ fwl \ fuel and cash AD 6E 03 LDA &036E \ CRGO C9 1A CMP #26 \ size of cargo bay? 90 05 BCC P%+7 \ jmp TT210 list Cargo A9 6B LDA #&6B \ token = Large cargo bay 20 9A 33 JSR &339A \ TT27 \ process text token 4C DE 2D JMP &2DDE \ TT210 \ List Cargo, up. .TT16 \ -> &2E38 \ Arrive with X and Y values values to shift cross-hairs on charts by 8A TXA 48 PHA \ Xinc 88 DEY \ negate Yinc 98 TYA 49 FF EOR #&FF 48 PHA \ negate Yinc 20 F7 55 JSR &55F7 \ WSCAN \ wait for line scan, ie whole frame completed. 20 65 2E JSR &2E65 \ TT103 \ erase small cross hairs at target hyperspace 68 PLA \ negated Yinc 85 76 STA &76 \ QQ19+3 \ inc AD C2 03 LDA &03C2 \ QQ10 \ target y 20 7B 2E JSR &2E7B \ TT123 \ coordinate update, fix overflow A5 77 LDA &77 \ QQ19+4 \ result 8D C2 03 STA &03C2 \ QQ10 \ target y 85 74 STA &74 \ QQ19+1 \ new Y 68 PLA \ Xinc 85 76 STA &76 \ QQ19+3 \ inc AD C1 03 LDA &03C1 \ QQ9 \ target x 20 7B 2E JSR &2E7B \ TT123 \ coordinate update, fix overflow A5 77 LDA &77 \ QQ19+4 \ result 8D C1 03 STA &03C1 \ QQ9 \ target x 85 73 STA &73 \ QQ19 \ new X .TT103 \ -> &2E65 \ Draw small cross hairs at target hyperspace system. A5 87 LDA &87 \ QQ11 \ menu i.d. 30 23 BMI TT105 \ bit7 set is Short range chart cross-hair clip AD C1 03 LDA &03C1 \ QQ9 \ target x 85 73 STA &73 \ QQ19 AD C2 03 LDA &03C2 \ QQ10 \ target y 4A LSR A \ Y /=2 85 74 STA &74 \ QQ19+1 A9 04 LDA #4 \ small cross hair 85 75 STA &75 \ QQ19+2 4C 36 2D JMP &2D36 \ TT15 \ cross hairs for laser or chart .TT123 \ -> &2E7B \ coordinate update, fix overflow 85 77 STA &77 \ QQ19+4 \ coordinate to update 18 CLC \ add inc 65 76 ADC &76 \ QQ19+3 A6 76 LDX &76 \ QQ19+3 30 03 BMI TT124 \ shift was -ve 90 03 BCC TT125 \ else addition went o.k. 60 RTS .TT124 \ shift was -ve 90 02 BCC TT180 \ shift was -ve, RTS. .TT125 \ update ok 85 77 STA &77 \ QQ19+4 \ updated coordinate .TT180 \ rts 60 RTS .TT105 \ Short range chart cross-hair clip AD C1 03 LDA &03C1 \ QQ9 \ target X 38 SEC ED 59 03 SBC &0359 \ QQ0 \ present X C9 26 CMP #&26 90 04 BCC TT179 \ targetX-presentX, X is close C9 E6 CMP #&E6 90 F0 BCC TT180 \ rts .TT179 \ X is close 0A ASL A 0A ASL A \ X*4 18 CLC 69 68 ADC #&68 \ cross X 85 73 STA &73 \ QQ19 AD C2 03 LDA &03C2 \ QQ10 \ target Y 38 SEC ED 5A 03 SBC &035A \ QQ1 \ present Y C9 26 CMP #&26 90 04 BCC P%+6 \ targetY-presentY, underflowY C9 DC CMP #&DC 90 DA BCC TT180 \ rts 0A ASL A \ Y*2 18 CLC 69 5A ADC #&5A \ cross Y 85 74 STA &74 \ QQ19+1 A9 08 LDA #8 \ big cross 85 75 STA &75 \ QQ19+2 4C 36 2D JMP &2D36 \ TT15 \ the cross hair using QQ19(0to2) .TT23 \ -> &2EBE \ ShrtSc Short range chart A9 80 LDA #&80 \ Set bit7 of menu i.d. 20 C8 54 JSR &54C8 \ TT66 \ box border with QQ11 set to A A9 07 LDA #7 \ indent 85 2C STA &2C \ XC A9 BE LDA #&BE \ token = SHORT RANGE CHART 20 47 18 JSR &1847 \ NLIN3 \ title string and draw line underneath 20 A1 2D JSR &2DA1 \ TT14 \ Circle+cross hair, small cross at target 20 65 2E JSR &2E65 \ TT103 \ draw small cross hairs at target hyperspace system 20 6A 2F JSR &2F6A \ TT81 \ QQ15 loaded with rolled planet seed A9 00 LDA #0 \ future counter 85 97 STA &97 \ XX20 A2 18 LDX #&18 \ Clear 24 row to label stars .EE3 \ counter X 95 46 STA &46,X \ INWK,X CA DEX 10 FB BPL EE3 \ loop X .TT182 \ -> &2EE0 \ Counter XX20 through 256 stars A5 6F LDA &6F \ QQ15+3 38 SEC \ Xcoord of star ED 59 03 SBC &0359 \ QQ0 B0 04 BCS TT184 \ xsubtracted 49 FF EOR #&FF \ else negate 69 01 ADC #1 .TT184 \ xsubtracted C9 14 CMP #20 \ x distance close? B0 70 BCS TT187 \ skip star plotting A5 6D LDA &6D \ QQ15+1 38 SEC \ Ycoord of star ED 5A 03 SBC &035A \ QQ1 \ Ypresent B0 04 BCS TT186 \ ysubtracted 49 FF EOR #&FF \ else negate 69 01 ADC #1 .TT186 \ ysubstracted C9 26 CMP #&26 \ y distance close? B0 60 BCS TT187 \ skip star plotting A5 6F LDA &6F \ QQ15+3 38 SEC \ X coord of star ED 59 03 SBC &0359 \ QQ0 0A ASL A \ X present 0A ASL A \ *=4 69 68 ADC #104 \ xplot 85 3A STA &3A \ XX12 4A LSR A 4A LSR A \ x text cursor 4A LSR A 85 2C STA &2C \ XC E6 2C INC &2C \ XC A5 6D LDA &6D \ QQ15+1 38 SEC \ Y coord of star ED 5A 03 SBC &035A \ QQ1 0A ASL A \ Y present 69 5A ADC #90 \ yplot 85 E0 STA &E0 \ K4 4A LSR A 4A LSR A 4A LSR A A8 TAY \ y text cursor B6 46 LDX &46,Y \ INWK,Y F0 0B BEQ EE4 \ empty label row C8 INY \ else try row above B6 46 LDX &46,Y \ INWK,Y F0 06 BEQ EE4 \ empty label row 88 DEY \ else try row below 88 DEY B6 46 LDX &46,Y \ INWK,Y D0 12 BNE ee1 \ no label, just the star. .EE4 \ found empty label row 84 2D STY &2D \ YC C0 03 CPY #3 \ < 3rd row? 90 29 BCC TT187 \ skip star plotting A9 FF LDA #&FF \ row occupied by label 99 46 00 STA &0046,Y \ INWK,Y A9 80 LDA #&80 \ First label letter capital 85 72 STA &72 \ QQ17 20 0A 33 JSR &330A \ cpl \ Planet name for seed QQ15 .ee1 \bigstars \ no label, just the star. A9 00 LDA #0 \ hi = 0 85 D3 STA &D3 \ K3+1 85 E1 STA &E1 \ K4+1 85 41 STA &41 \ K+1 A5 3A LDA &3A \ XX12 \ xplot for star 85 D2 STA &D2 \ K3 A5 71 LDA &71 \ QQ15+5 \ seed w2_h 29 01 AND #1 \ use lowest bit of w2_h for star size, lowest 4 did planet radius 69 02 ADC #2 \ sun radius 85 40 STA &40 \ K 20 0A 36 JSR &360A \ FLFLLS \ clear lines 20 54 3A JSR &3A54 \ SUN 20 0A 36 JSR &360A \ FLFLLS .TT187 \ skipped star plotting 20 0E 2B JSR &2B0E \ TT20 \ Twist galaxy seed E6 97 INC &97 \ XX20 F0 0D BEQ TT111-1 \ all 256 done, rts 4C E0 2E JMP &2EE0 \ TT182 \ loop XX20 next row .TT81 \ -> &2F6A \ QQ15 loaded with galaxy seeds A2 05 LDX #5 \ Galaxy root seeds, counter X. BD 5B 03 LDA &035B,X \ QQ21,X 95 6C STA &6C,X \ QQ15,X CA DEX \ to planet seeds to twist 10 F8 BPL TT81+2 \ loop X 60 RTS .TT111 \ -> &2F75 \ rectangle Closest to QQ9,10. Could be arriving in new galaxy with initial (96,96) 20 6A 2F JSR &2F6A \ TT81 \ QQ15 loaded with galaxy seeds A0 7F LDY #&7F \ distance tracker, starts at half of screen width. 84 D1 STY &D1 \ T A9 00 LDA #0 \ trial system id starts at 0 85 80 STA &80 \ U .TT130 \ counter U, visit each trial system. A5 6F LDA &6F \ QQ15+3 38 SEC \ Xsystem ED C1 03 SBC &03C1 \ QQ9 B0 04 BCS TT132 \ skip xnegate 49 FF EOR #&FF 69 01 ADC #1 .TT132 \ skip xnegate 4A LSR A \ halve this x-distance 85 83 STA &83 \ S A5 6D LDA &6D \ QQ15+1 38 SEC \ Ysystem ED C2 03 SBC &03C2 \ QQ10 B0 04 BCS TT134 \ skip ynegate 49 FF EOR #&FF 69 01 ADC #1 .TT134 \ skip ynegate 4A LSR A \ halve y distance, 18 CLC \ so total mag will fit in 1 byte 65 83 ADC &83 \ S \ sum of abs(delta_x/2) + abs(delta_y/4) C5 D1 CMP &D1 \ T \ distance tracker B0 0B BCS TT135 \ not close, else update distance tracker 85 D1 STA &D1 \ T A2 05 LDX #5 \ and new best seeds update .TT136 \ counter X B5 6C LDA &6C,X \ QQ15,X 95 73 STA &73,X \ QQ19,X CA DEX \ present best system seed values 10 F9 BPL TT136 \ loop X for 6 bytes. Index U not saved as ZZ unlike docked code. .TT135 \ not close 20 0E 2B JSR &2B0E \ TT20 \ Twist galaxy seed E6 80 INC &80 \ U D0 CB BNE TT130 \ loop U next sys id, not 256 yet. A2 05 LDX #5 \ finished .TT137 \ counter X, copy out present best seeds B5 73 LDA &73,X \ QQ19,X 95 6C STA &6C,X \ QQ15,X CA DEX 10 F9 BPL TT137 \ loop X .TT138 \ use QQ15 to QQ9,10 to set distance QQ8 A5 6D LDA &6D \ QQ15+1 8D C2 03 STA &03C2 \ QQ10 \ target y-coordinate updated to closest system A5 6F LDA &6F \ QQ15+3 8D C1 03 STA &03C1 \ QQ9 \ target x-coordinate updated to closest system 38 SEC \ present X ED 59 03 SBC &0359 \ QQ0 B0 04 BCS TT139 \ x dist-org 49 FF EOR #&FF \ else negate 69 01 ADC #1 .TT139 \ x dist-org 20 0D 28 JSR &280D \ SQUA2 \ (P,A) = A*A 85 41 STA &41 \ K+1 A5 1B LDA &1B \ P \ xlo 85 40 STA &40 \ K AD C2 03 LDA &03C2 \ QQ10 38 SEC \ Y subtracted ED 5A 03 SBC &035A \ QQ1 B0 04 BCS TT141 \ y dist-org 49 FF EOR #&FF \ else negate 69 01 ADC #1 .TT141 \ y dist-org 4A LSR A \ Acc = abs(delta_y)/2 20 0D 28 JSR &280D \ SQUA2 \ (P,A) = A*A 48 PHA \ highest bytes for delta_y ^2 A5 1B LDA &1B \ P 18 CLC \ y lo 65 40 ADC &40 \ K 85 81 STA &81 \ Q \ sum of lowest bytes. \ r^2 lo 68 PLA \ highest bytes for delta_y ^2 65 41 ADC &41 \ K+1 85 82 STA &82 \ R \ sum of higher two bytes \ r^2 hi 20 B8 47 JSR &47B8 \ LL5 \ SQRT Q = SQR(Q,R) A5 81 LDA &81 \ Q 0A ASL A \ distance lo *=2 A2 00 LDX #0 \ distance hi 8E C0 03 STX &03C0 \ QQ8+1 2E C0 03 ROL &03C0 \ QQ8+1 0A ASL A 2E C0 03 ROL &03C0 \ QQ8+1 8D BF 03 STA &03BF \ QQ8 \ QQ8(0,1) is 4*distance in x-units 4C 78 2C JMP &2C78 \ TT24 \ Calculate System Data from QQ15(0to5). .hyp \ -> &3011 \ hyperspace start, key H hit. A5 2F LDA &2F \ QQ22+1 \ hyp countdown hi 05 8E ORA &8E \ QQ12 \ hyp countdown lo D0 6E BNE zZ+1 \ rts ! \ countdown already going on 20 37 44 JSR &4437 \ CTRL \ scan from ctrl key upwards on keyboard 30 42 BMI Ghy \ Galactic hyperdrive for ctrl-H A5 87 LDA &87 \ QQ11 \ menu i.d. if not zero then not a space view. D0 03 BNE P%+5 \ jsr hm 4C C3 30 JMP &30C3 \ TTH111 \ space view, move to QQ9,10, hyp continue space view 20 FE 32 JSR &32FE \ hm \ move hyperspace cross on chart .TTX111 \ -> &3026 \ hyperspace continue space view AD BF 03 LDA &03BF \ QQ8 \ distance in 0.1 LY units 0D C0 03 ORA &03C0 \ QQ8+1 \ zero? F0 57 BEQ zZ+1 \ rts! A9 07 LDA #7 \ indent 85 2C STA &2C \ XC A9 17 LDA #23 \ near bottom row for hyperspace message 85 2D STA &2D \ YC A9 00 LDA #0 \ All upper case 85 72 STA &72 \ QQ17 A9 BD LDA #&BD \ token = HYPERSPACE 20 9A 33 JSR &339A \ TT27 \ process flight text token AD C0 03 LDA &03C0 \ QQ8+1 \ distance hi D0 75 BNE TT147 \ hyperspace too far AD 65 03 LDA &0365 \ QQ14 \ ship fuel #70 = #&46 CD BF 03 CMP &03BF \ QQ8 \ distance lo 90 6D BCC TT147 \ hyperspace too far A9 2D LDA #&2D \ ascii '-' in "HYPERSPACE -ISINOR" 20 9A 33 JSR &339A \ TT27 20 0A 33 JSR &330A \ cpl \ Planet name for seed QQ15 .wW \ -> &3054 \ Also Galactic hyperdrive countdown starting A9 0F LDA #15 \ counter for inner and outer hyperspace countdown loops 85 2F STA &2F \ QQ22+1 85 2E STA &2E \ QQ22 \ inner hyperspace countdown AA TAX \ starts at 15 4C AC 30 JMP &30AC \ ee3 \ digit in top left hand corner, using Xreg. .Ghy \ Galactic hyperdrive for ctrl-H AE 85 03 LDX &0385 \ GHYP \ possess galactic hyperdrive F0 22 BEQ zZ+1 \ rts ! E8 INX \ Xreg = 0 8E 85 03 STX &0385 \ GHYP \ works once 8E 8C 03 STX &038C \ FIST \ clean Fugitive/Innocent status 20 54 30 JSR &3054 \ wW \ start countdown A2 05 LDX #5 \ 6 seeds EE 67 03 INC &0367 \ GCNT \ next galaxy AD 67 03 LDA &0367 \ GCNT 29 07 AND #7 \ round count to just 8 8D 67 03 STA &0367 \ GCNT .G1 \ counter X ROLL galaxy seeds BD 5B 03 LDA &035B,X \ QQ21,X \ Galaxy seeds, 6 bytes 0A ASL A \ to get carry to load back into bit 0 3E 5B 03 ROL &035B,X \ QQ21,X \ rolled galaxy seeds CA DEX 10 F6 BPL G1 \ loop X .zZ \ Arrive closest to (96,96) A9 60 LDA #&60 \ zZ+1 is an rts ! 8D C1 03 STA &03C1 \ QQ9 8D C2 03 STA &03C2 \ QQ10 20 92 32 JSR &3292 \ TT110 \ Launch ship decision 20 75 2F JSR &2F75 \ TT111 \ Closest to QQ9,10 A2 00 LDX #0 \ distance to system 8E BF 03 STX &03BF \ QQ8 8E C0 03 STX &03C0 \ QQ8+1 A9 74 LDA #&74 \ token = Galactic Hyperspace 20 C6 45 JSR &45C6 \ MESS \ message .jmp \ -> &309F \ move target coordinates to become new present AD C1 03 LDA &03C1 \ QQ9 8D 59 03 STA &0359 \ QQ0 AD C2 03 LDA &03C2 \ QQ10 8D 5A 03 STA &035A \ QQ1 60 RTS .ee3 \ -> &30AC \ digit in top left hand corner, using Xreg. A0 01 LDY #1 \ top left 84 2C STY &2C \ XC 84 2D STY &2D \ YC 88 DEY \ Yhi = 0 .pr6 \ -> &30B3 \ 5 digits of XloYhi, no decimal point. 18 CLC .pr5 \ -> &30B4 \ 5 digits A9 05 LDA #5 4C 3C 1E JMP &1E3C \ TT11 \ print XloYhi, carry set will make decimal point. .TT147 \ hyperspace too far A9 CA LDA #&CA \ token = (HYPERSPACE) 'RANGE' (?) .prq \ -> &30BB \ print Acc then question mark 20 9A 33 JSR &339A \ TT27 \ process text token A9 3F LDA #&3F \ ascii '?' 4C 9A 33 JMP &339A \ TT27 .TTH111 \ -> &30C3 \ space view, move to QQ9,10, hyp continue, up. 20 75 2F JSR &2F75 \ TT111 \ closest to QQ9,10 4C 26 30 JMP &3026 \ TTX111 \ hyperspace continue .TT151 \ -> &30C9 \ Pmk-A \ Market prices on one item 48 PHA \ index for item 85 77 STA &77 \ QQ19+4 0A ASL A \ build index for QQ23 table 0A ASL A \ item*4 85 73 STA &73 \ QQ19 A9 01 LDA #1 \ left 85 2C STA &2C \ XC 68 PLA \ restore item 69 D0 ADC #&D0 \ token = FOOD..GEM-STONES 20 9A 33 JSR &339A \ TT27 \ process flight text token A9 0E LDA #14 \ next column 85 2C STA &2C \ XC A6 73 LDX &73 \ QQ19 \ item*4 index for QQ23 table BD 1A 46 LDA &461A,X \ QQ23+1,X \ Prxs Market prices info 85 74 STA &74 \ QQ19+1 \ byte 1 AD 9E 03 LDA &039E \ QQ26 \ random byte each system visit 3D 1C 46 AND &461C,X \ QQ23+3,X \ byte3 Market mask 18 CLC 7D 19 46 ADC &4619,X \ QQ23+0,X \ byte0 Market base 8D AA 03 STA &03AA \ QQ24 \ price 20 35 31 JSR &3135 \ TT152 \ t kg g from QQ19+1 20 8E 31 JSR &318E \ var \ slope QQ19+3 = economy * gradient A5 74 LDA &74 \ QQ19+1 \ byte1 30 08 BMI TT155 \ subtract QQ19,3 from QQ24 AD AA 03 LDA &03AA \ QQ24 \ price, else add 65 76 ADC &76 \ QQ19+3 \ economy * gradient 4C 0A 31 JMP &310A \ TT156 \ both prices .TT155 \ subtract QQ19,3 from QQ24 AD AA 03 LDA &03AA \ QQ24 \ price 38 SEC E5 76 SBC &76 \ QQ19+3 \ economy * gradient .TT156 \ -> &310A \ both price cases 8D AA 03 STA &03AA \ QQ24 \ price 85 1B STA &1B \ P \ price_lo A9 00 LDA #0 20 F4 32 JSR &32F4 \ GC2 \ get cash Xlo.Yhi = P.A *=4 max 1024 38 SEC \ decimal point in max 102.4 20 B4 30 JSR &30B4 \ pr5 \ 4 digits of XloYhi A4 77 LDY &77 \ QQ19+4 \ index for item A9 05 LDA #5 \ 5 digits BE 8D 03 LDX &038D,Y \ AVL,Y \ availability 8E AB 03 STX &03AB \ QQ25 \ max available 18 CLC F0 06 BEQ TT172 \ tab '-' as none available 20 3A 1E JSR &1E3A \ pr2+2 \ else print available Xreg to 5 places 4C 35 31 JMP &3135 \ TT152 \ t kg g from QQ19+1 .TT172 \ tab '-' as none available A5 2C LDA &2C \ XC 69 04 ADC #4 \ move by 4 85 2C STA &2C \ XC A9 2D LDA #&2D \ ascii '-' D0 0F BNE TT162+2 \ guaranteed jmp TT27 .TT152 \ -> &3135 \ t kg g from QQ19+1 A5 74 LDA &74 \ QQ19+1 \ byte1 29 60 AND #&60 \ mask info, no bits set? F0 0C BEQ TT160 \ 't' for tonne C9 20 CMP #&20 \ mask info, bit5 set? F0 0F BEQ TT161 \ 'kg' 20 53 31 JSR &3153 \ TT16a \ else 'g' for gram .TT162 \ -> &3142 \ white space A9 20 LDA #&20 \ ascii ' ' 4C 9A 33 JMP &339A \ TT27 \ process flight text token \ TT162+2 .TT160 \ 't' for tonne A9 74 LDA #&74 \ ascii 't' for tonne 20 FC 1E JSR &1EFC \ TT26 \ print character 90 F4 BCC TT162 \ guaranteed, trailing space. .TT161 \ 'kg' A9 6B LDA #&6B \ ascii 'k' 20 FC 1E JSR &1EFC \ TT26 \ print character lower case .TT16a \ -> &3153 \ 'g' for gram A9 67 LDA #&67 \ ascii 'g' 4C FC 1E JMP &1EFC \ TT26 \ print character lower case .TT163 \ -> &3158 \ table Headings for market place A9 11 LDA #17 \ indent 85 2C STA &2C \ XC A9 FF LDA #&FF \ token = unit quantity product unit price for sale D0 E4 BNE TT162+2 \ jmp tt27 guaranteed .TT167 \ -> &3160 \ MktP Market place menu screen A9 10 LDA #&10 \ menu i.d. bit4 set 20 C8 54 JSR &54C8 \ TT66 \ box border with QQ11 set to A A9 05 LDA #5 \ indent 85 2C STA &2C \ XC A9 A7 LDA #&A7 \ token = MARKET PRICES 20 47 18 JSR &1847 \ NLIN3 \ title and draw line underneath A9 03 LDA #3 \ few lines down 85 2D STA &2D \ YC 20 58 31 JSR &3158 \ TT163 \ table headings for market place, up A9 00 LDA #0 \ counter 8D AD 03 STA &03AD \ QQ29 .TT168 \ counter QQ29 market items A2 80 LDX #&80 \ set bit7, first letter Upper case. 86 72 STX &72 \ QQ17 20 C9 30 JSR &30C9 \ TT151 \ Pmk-A display the line for one market item E6 2D INC &2D \ YC EE AD 03 INC &03AD \ QQ29 AD AD 03 LDA &03AD \ QQ29 C9 11 CMP #17 \ still <17 items? 90 ED BCC TT168 \ loop QQ29 60 RTS .var \ -> &318E \ market price slope QQ19+3 = economy * gradient A5 74 LDA &74 \ QQ19+1 \ byte1 gradient info bits. 29 1F AND #&1F \ gradient 0to31. AC AC 03 LDY &03AC \ QQ28 \ the economy byte of present system (0 is Rich Ind.) 85 75 STA &75 \ QQ19+2 \ gradient 0to31. 18 CLC \ build product A9 00 LDA #0 \ availability of Alien items 8D 9D 03 STA &039D \ AVL+16 .TT153 \ -> &319D \ counter Y, eco 88 DEY \ Take economy byte down by 1 30 05 BMI TT154 \ exit product 65 75 ADC &75 \ QQ19+2 \ gradient 0to31 4C 9D 31 JMP &319D \ TT153 \ guaranteed loop Y to build product .TT154 \ exit product 85 76 STA &76 \ QQ19+3 \ economy * gradient 60 RTS .hyp1 \ -> &31A8 \ Arrive in system 20 75 2F JSR &2F75 \ TT111 \ closest to QQ9,10 20 9F 30 JSR &309F \ jmp \ move home coordinates to present A2 05 LDX #5 \ 6 bytes .TT112 \ counter X B5 6C LDA &6C,X \ QQ15,X \ safehouse,X target seeds 9D B2 03 STA &03B2,X \ QQ2,X \ copied over to home seeds CA DEX \ next seed 10 F8 BPL TT112 \ loop X E8 INX \ X = 0 8E 49 03 STX &0349 \ EV \ 0 extra vessels AD B8 03 LDA &03B8 \ QQ3 \ economy of target system 8D AC 03 STA &03AC \ QQ28 \ economy of present system AD BA 03 LDA &03BA \ QQ5 \ Tech 8D AF 03 STA &03AF \ tek \ techlevel-1 of present system AD B9 03 LDA &03B9 \ QQ4 \ Government, 0 is Anarchy 8D AE 03 STA &03AE \ gov \ gov of present system 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 8D 9E 03 STA &039E \ QQ26 \ random byte for each system vist (for market) A2 00 LDX #0 \ set up availability 86 96 STX &96 \ XX4 .hy9 \ counter XX4 availability table BD 1A 46 LDA &461A,X \ QQ23+1,Y \ byte1 of Market Prxs info 85 74 STA &74 \ QQ19+1 20 8E 31 JSR &318E \ var \ slope QQ19+3 = economy * gradient BD 1C 46 LDA &461C,X \ QQ23+3,Y \ byte3 of Market Prxs info 2D 9E 03 AND &039E \ QQ26 \ random byte for system market 18 CLC \ masked by market byte3 7D 1B 46 ADC &461B,X \ QQ23+2,Y \ base price byte2 of Market Prxs info A4 74 LDY &74 \ QQ19+1 30 06 BMI TT157 \ -ve byte1 38 SEC \ else subtract E5 76 SBC &76 \ QQ19+3 \ slope 4C F7 31 JMP &31F7 \ TT158 \ hop over to both avail .TT157 \ -ve byte1 18 CLC \ add slope 65 76 ADC &76 \ QQ19+3 .TT158 \ -> &31F7 \ both avail 10 02 BPL TT159 A9 00 LDA #0 \ else negative avail, set to zero. .TT159 \ both options arrive here A4 96 LDY &96 \ XX4 \ counter as index 29 3F AND #&3F \ take lower 6 bits as quantity available 99 8D 03 STA &038D,Y \ AVL,Y \ availability C8 INY \ next item 98 TYA \ counter 85 96 STA &96 \ XX4 0A ASL A \ build index 0A ASL A \ *=4 AA TAX \ X = Y*4 to index table C9 3F CMP #&3F \ XX4 < 63? 90 CB BCC hy9 \ loop XX4 availability .hyR 60 RTS .GTHG \ -> &320E \ get Thargoid ship 20 62 3F JSR &3F62 \ Ze \ Zero for new ship, new inwk coords, ends with dornd and T1 = rnd too. A9 FF LDA #&FF \ ai attack everyone, has ecm. 85 66 STA &66 \ INWK+32 A9 1D LDA #29 \ #THG thargoid ship 20 68 37 JSR &3768 \ NWSHP \ new ship type Acc A9 1E LDA #30 \ #TGL accompanying thargon 4C 68 37 JMP &3768 \ NWSHP \ new ship type Acc .ptg \ shift forced hyperspace misjump 4E 66 03 LSR &0366 \ COK \ file check cash/competition 38 SEC \ set bit0 2E 66 03 ROL &0366 \ COK .MJP \ miss jump A9 03 LDA #3 \ ship file S.D for thargoids 20 7E 42 JSR &427E \ SHIPinA \ load ship file S.'A'+ Acc A9 03 LDA #3 \ no title for menu id 20 C8 54 JSR &54C8 \ TT66 \ box border with QQ11 set to A 20 23 26 JSR &2623 \ LL164 \ hyperspace noise and tunnel 20 E1 3E JSR &3EE1 \ RES2 \ reset2 8C 41 03 STY &0341 \ MJ \ mis-jump flag set #&FF .MJP1 \ counter MANY + #29 thargoids 20 0E 32 JSR &320E \ GTHG \ get Thargoid ship A9 03 LDA #3 \ 3 Thargoid ships CD 3B 03 CMP &033B \ MANY+29 \ thargoids B0 F6 BCS MJP1 \ loop if thargoids < 3 8D C3 03 STA &03C3 \ NOSTM \ number of stars, dust = 3 A2 00 LDX #0 \ forward view 20 93 54 JSR &5493 \ LOOK1 AD 5A 03 LDA &035A \ QQ1 \ present Y 49 1F EOR #&1F \ flip lower y coord bits 8D 5A 03 STA &035A \ QQ1 60 RTS .TT18 \ -> &3254 \ HSPC \ Countdown finished, (try) go through Hyperspace AD 65 03 LDA &0365 \ QQ14 \ ship fuel #70 = #&46 38 SEC \ Subtract distance in 0.1 LY units ED BF 03 SBC &03BF \ QQ8 8D 65 03 STA &0365 \ QQ14 A5 87 LDA &87 \ QQ11 D0 06 BNE ee5 \ menu i.d. not a space view 20 C8 54 JSR &54C8 \ TT66 \ else box border with QQ11 set to Acc 20 23 26 JSR &2623 \ LL164 \ hyperspace noise and tunnel .ee5 \ not a space view 20 37 44 JSR &4437 \ CTRL \ scan from ctrl on keyboard 2D C9 03 AND &03C9 \ PATG \ toggle to scan keyboard X-key, for misjump. 30 AF BMI ptg \ shift key forced misjump, up. 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. C9 FD CMP #253 \ also small chance that B0 AF BCS MJP \ miss-jump to Thargoids in witchspace 20 AB 31 JSR &31AB \ hyp1+3 \ else don't move to QQ9,10 but do Arrive in system. 20 E1 3E JSR &3EE1 \ RES2 \ reset2, MJ flag cleared. 20 80 35 JSR &3580 \ SOLAR \ Set up planet and sun 20 55 42 JSR &4255 \ LSHIPS \ loads ship(s) files A5 87 LDA &87 \ QQ11 29 3F AND #&3F \ menu i.d. not space views, but maybe charts. D0 67 BNE TT113 \ rts 20 CA 54 JSR &54CA \ TTX66 \ else new box for space view or new chart. A5 87 LDA &87 \ QQ11 D0 38 BNE TT114 \ menu i.d. not space view, a new chart. E6 87 INC &87 \ QQ11 \ else space, menu id = 1 for new dust view. .TT110 \ -> &3292 \ Launch ship decision. Also arrive here after galactic hyperdrive jump, and after f0 hit. A6 8E LDX &8E \ QQ12 \ Docked flag F0 2B BEQ NLUNCH \ not launched 20 36 26 JSR &2636 \ LAUN \ launched from space station 20 E1 3E JSR &3EE1 \ RES2 \ reset2, small reset. 20 75 2F JSR &2F75 \ TT111 \ Closest to QQ9,10 then Sys Data E6 4E INC &4E \ INWK+8 \ zsg, push away planet in front. 20 6D 35 JSR &356D \ SOS1 \ set up planet A9 80 LDA #&80 \ space station behind you 85 4E STA &4E \ INWK+8 E6 4D INC &4D \ INWK+7 \ zhi=1 20 40 37 JSR &3740 \ NWSPS \ New space station at INWK, S bulb appears. A9 0C LDA #12 \ launch speed 85 7D STA &7D \ DELTA 20 A6 41 JSR &41A6 \ BAD \ scan for QQ20(3,6,10), 32 tons of Slaves, Narcotics 0D 8C 03 ORA &038C \ FIST \ fugitive/innocent status 8D 8C 03 STA &038C \ FIST A9 FF LDA #&FF \ menu i.d. 85 87 STA &87 \ QQ11 20 42 26 JSR &2642 \ HFS1+3 \ rings of STP, no new box. .NLUNCH \ also not launched A2 00 LDX #0 \ forward 86 8E STX &8E \ QQ12 \ check messages 4C 93 54 JMP &5493 \ LOOK1 \ start view Xreg = 0 .TT114 \ not space view, a chart. 30 03 BMI TT115 \ menu i.d. bit7 Short range chart 4C EB 2C JMP &2CEB \ TT22 \ else Long range galactic chart .TT115 \ Short range chart 4C BE 2E JMP &2EBE \ TT23 \ Short range chart .MCASH \ -> &32D0 \ More cash, add Xlo.Yhi 8A TXA \ lo 18 CLC 6D 64 03 ADC &0364 \ CASH+3 8D 64 03 STA &0364 \ CASH+3 98 TYA \ hi 6D 63 03 ADC &0363 \ CASH+2 8D 63 03 STA &0363 \ CASH+2 AD 62 03 LDA &0362 \ CASH+1 69 00 ADC #0 8D 62 03 STA &0362 \ CASH+1 AD 61 03 LDA &0361 \ CASH+0 69 00 ADC #0 \ (big-endian) 8D 61 03 STA &0361 \ CASH+0 18 CLC .TT113 60 RTS .GCASH \ -> &32F1 \ Xlo.Yhi = P*Q*4 20 20 28 JSR &2820 \ MULTU \ P.A = P*Q, lsb in P. .GC2 \ -> &32F4 \ Xlo.Yhi = P.A *=4 06 1B ASL &1B \ P 2A ROL A 06 1B ASL &1B \ P 2A ROL A .GC3 \ X.Y = P.A A8 TAY \ Yhi A6 1B LDX &1B \ P \ Xlo 60 RTS .hm \ -> &32FE \ move hyperspace cross-hairs 20 65 2E JSR &2E65 \ TT103 \ erase small cross hairs at target hyperspace system 20 75 2F JSR &2F75 \ TT111 \ closest to QQ9,10, then Sys Data. 20 65 2E JSR &2E65 \ TT103 \ draw small cross hairs at target hyperspace system 4C 37 55 JMP &5537 \ CLYNS \ Clear some screen rows \ ---====== end block D === onto block E =====------- &330A .cpl \ -> &330A \ print Planet name for seed QQ15. Acc == 3 A2 05 LDX #5 \ 6 seeds .TT53 \ counter X B5 6C LDA &6C,X \ QQ15,X \ system seeds 95 73 STA &73,X \ QQ19,X \ temp store CA DEX \ next seed 10 F9 BPL TT53 \ loop X A0 03 LDY #3 \ 4 pairs 24 6C BIT &6C \ QQ15 70 01 BVS P%+3 \ 6th bit of w0_l set is all 4 pairs wanted. 88 DEY \ else 3 pairs 84 D1 STY &D1 \ T .TT55 \ counter T digrams A5 71 LDA &71 \ QQ15+5 29 1F AND #&1F \ keep bottom 5 bits of w2_h (planet name) F0 05 BEQ P%+7 \ lose 2 chars, twist. 09 80 ORA #&80 \ flight digram ..LA.. 20 9A 33 JSR &339A \ TT27 \ process text token 20 14 2B JSR &2B14 \ TT54 \ twist seed for next digram in QQ15 C6 D1 DEC &D1 \ T \ next digram 10 EE BPL TT55 \ loop T A2 05 LDX #5 \ 6 seeds .TT56 \ counter X B5 73 LDA &73,X \ QQ19,X \ restore 95 6C STA &6C,X \ QQ15,X \ system seeds CA DEX \ next seed 10 F9 BPL TT56 \ loop X 60 RTS .cmn \ commander name Acc == 4 A0 00 LDY #0 .QUL4 \ counter Y B9 50 03 LDA &0350,Y \ NAME,Y C9 0D CMP #&0D \ end of string F0 06 BEQ ypl-1 \ found, rts. 20 FC 1E JSR &1EFC \ TT26 \ else print character C8 INY \ next char D0 F3 BNE QUL4 \ loop Y 60 RTS \ ypl-1 .ypl \ present, your, planet name Acc == 2 20 4E 33 JSR &334E \ TT62 \ swop present QQ2 seeds into QQ15 20 0A 33 JSR &330A \ cpl \ Planet name for seed QQ15 .TT62 \ -> &334E \ QQ2 present seeds swopped with QQ15 A2 05 LDX #5 \ 6 bytes .TT78 \ counter X B5 6C LDA &6C,X \ QQ15,X \ planet seeds 6 bytes BC B2 03 LDY &03B2,X \ QQ2,X \ seeds for present system (6 bytes) 9D B2 03 STA &03B2,X \ QQ2,X 94 6C STY &6C,X \ QQ15,X CA DEX \ next seed 10 F3 BPL TT78 \ loop X .ypl16 \ rts 60 RTS .tal \ print Galaxy number Acc == 1 18 CLC \ no decimal point AE 67 03 LDX &0367 \ GCNT \ galaxy count E8 INX \ X is Galaxy number+1 4C 38 1E JMP &1E38 \ pr2 \ number X to printable characters .fwl \ fuel and cash Acc == 5 A9 69 LDA #&69 \ token = FUEL 20 95 33 JSR &3395 \ TT68 \ process token followed by colon AE 65 03 LDX &0365 \ QQ14 38 SEC \ light years with decimal point 20 38 1E JSR &1E38 \ pr2 \ number X to printable characters A9 C3 LDA #&C3 \ token = LIGHT YEARS 20 8F 33 JSR &338F \ plf \ TT27 text token followed by rtn then .PCASH \ print Cash A9 77 LDA #&77 \ token = CASH colon D0 1F BNE TT27 \ guaranteed hop to process text token .csh \ Cash, 'Cr' and return. Acc == 0 A2 03 LDX #3 \ 4 bytes .pc1 \ counter X \ big endian BD 61 03 LDA &0361,X \ CASH,X 95 40 STA &40,X \ K,X CA DEX \ Cash to Kbuffer to print 10 F8 BPL pc1 \ loop X A9 09 LDA #9 \ print K, 9 sig figs. 85 80 STA &80 \ U 38 SEC \ carry set for decimal point 20 48 1E JSR &1E48 \ BPRNT \ Buffer print (4 bytes of K) A9 E2 LDA #&E2 \ token = ' CR' .plf \ -> &338F \ TT27 process text token then new line 20 9A 33 JSR &339A \ TT27 \ process text token 4C 60 2B JMP &2B60 \ TT67 \ next Row .TT68 \ -> &3395 \ process token followed by colon 20 9A 33 JSR &339A \ TT27 \ process text token .TT73 \ print Colon A9 3A LDA #&3A \ ascii ':' .TT27 \ -> &36E0 \ process flight text Token in Acc AA TAX \ copy token to count down F0 DE BEQ csh \ Acc = 0, up to Cash 30 74 BMI TT43 \ if token is > 127 down, page4 token or digram CA DEX F0 BC BEQ tal \ Acc == 1, up, print Galaxy number. CA DEX F0 A3 BEQ ypl \ Acc == 2, up, present planet in QQ2. CA DEX D0 03 BNE P%+5 \ hop over, else X == 0 4C 0A 33 JMP &330A \ cpl \ Acc = 3 print Planet name for seed QQ15 CA DEX F0 8A BEQ cmn \ Acc == 4, up, commander name. CA DEX F0 B5 BEQ fwl \ Acc == 5, up, fuel followed by cash. CA DEX D0 05 BNE P%+7 \ hop over, else X == 0 A9 80 LDA #&80 \ Acc == 6, set bit 7 TT27m 85 72 STA &72 \ QQ17 60 RTS CA DEX \ skip Acc ==7 CA DEX D0 03 BNE P%+5 \ hop over to continue Acc 9to127 86 72 STX &72 \ QQ17 \ else Acc ==8, QQ17 set to X = 0 60 RTS CA DEX \ continue 9to127 tokens F0 38 BEQ crlf \ Acc == 9, down, colon on right. C9 60 CMP #&60 \ discard X, look at Acc = token >= 96 B0 66 BCS ex \ extra >= #&60, far down C9 0E CMP #14 \ < 14 ? 90 04 BCC P%+6 \ goes to Token < 14 or > 31 C9 20 CMP #32 \ < 32 ? 90 28 BCC qw \ 14 <= token A < 32 becomes 128to145 page4 digram \ Token < 14 or > 31 A6 72 LDX &72 \ QQ17 F0 3D BEQ TT74 \ if QQ17 = 0 Upper case, jmp TT26, print character. 30 11 BMI TT41 \ if bit7 set 24 72 BIT &72 \ QQ17 has bit6 set too 70 30 BVS TT46 \ If only bit6 set, clear bit6 and print as Upper .TT42 \ Uppercase to lowercase C9 41 CMP #&41 \ < ascii 'A' 90 06 BCC TT44 \ jmp TT26, print character C9 5B CMP #&5B \ >= ascii 'Z'+1 B0 02 BCS TT44 \ jmp TT26, print character 69 20 ADC #&20 \ else Upper to lowercase .TT44 \ print character as is with TT26 4C FC 1E JMP &1EFC \ TT26 \ print character .TT41 \ QQ17 bit7 set 24 72 BIT &72 \ QQ17 70 17 BVS TT45 \ bit6 set too, Nothing or lower. C9 41 CMP #&41 \ < ascii 'A' 90 22 BCC TT74 \ print as is using TT26 48 PHA \ else store token Acc 8A TXA \ QQ17 copy 09 40 ORA #&40 \ set bit6 in QQ17 so subsequent ones lower 85 72 STA &72 \ QQ17 68 PLA \ restore token D0 EC BNE TT44 \ guaranteed up, print as Uppercase with TT26. .qw \ Acc = 14to31 becomes 128to145 page4 digram 69 72 ADC #&72 \ A+=114 becomes 128to145 page4 digram D0 32 BNE ex \ guaranteed down, extra. .crlf \ Acc == 9, colon on right A9 15 LDA #21 \ on right 85 2C STA &2C \ XC D0 97 BNE TT73 \ guaranteed up, print colon. .TT45 \ QQ17 bits 7,6 set. Nothing or lower. E0 FF CPX #&FF \ if QQ17 = #&FF F0 63 BEQ TT48 \ rts C9 41 CMP #&41 \ >= ascii 'A' ? B0 D0 BCS TT42 \ Uppercase to lowercase, up. .TT46 \ clear bit6 QQ17 and print as is using TT26 48 PHA \ push token 8A TXA \ QQ17 copy 29 BF AND #&BF \ clear bit6 85 72 STA &72 \ QQ17 68 PLA \ pull token .TT74 \ TT26, print character. 4C FC 1E JMP &1EFC \ TT26 .TT43 \ Token > 127 page4 token or planet digram. C9 A0 CMP #&A0 \ >= #160 ? B0 14 BCS TT47 \ more page4, subtract #160 29 7F AND #&7F \ else token 128to159 -> 0 to 31 0A ASL A \ *= 2 A8 TAY \ digram index = 0to62 B9 80 08 LDA &0880,Y \ QQ16,Y \ ALLEXEGEZACEBISOUSESARMAINDIREA?ER etc. 20 9A 33 JSR &339A \ TT27 \ process text token B9 81 08 LDA &0881,Y \ QQ16+1,Y \ 2nd character of diagram. Flight copied down from docked code. C9 3F CMP #&3F \ is second letter '?' F0 40 BEQ TT48 \ rts, name has odd-number of letters. 4C 9A 33 JMP &339A \ TT27 \ process text token .TT47 \ more page4, subtract #160 E9 A0 SBC #&A0 \ -= 160 .ex \ -> &342D \ extra, token >= 96 or Acc = 128to145 or -=160 AA TAX \ copy of word index A9 00 LDA #0 \ page 4 words lo #QQ18 MOD 256 85 22 STA &22 \ V A9 04 LDA #4 \ page 4 words hi #QQ18 DIV 256 85 23 STA &23 \ V+1 A0 00 LDY #0 8A TXA \ token = word index F0 13 BEQ TT50 \ if X=0 then Y offset to word correct .TT51 \ counters Y letter, X token B1 22 LDA (&22),Y \ (V),Y F0 07 BEQ TT49 \ exit as word ended C8 INY \ letter count D0 F9 BNE TT51 \ loop Y E6 23 INC &23 \ V+1 \ next page as Y reached 256 D0 F5 BNE TT51 \ guaranteed, loop Y letter .TT49 \ word ended C8 INY D0 02 BNE TT59 \ next word E6 23 INC &23 \ V+1 \ next page as Y reached 256 .TT59 \ next word CA DEX \ token count D0 ED BNE TT51 \ loop X token .TT50 \ token X = 0, counter Y offset to word correct 98 TYA 48 PHA \ store Yindex A5 23 LDA &23 \ V+1 48 PHA \ correct pointer hi B1 22 LDA (&22),Y \ (V),Y 49 23 EOR #&23 \ decode '#' 20 9A 33 JSR &339A \ TT27 \ process text token to next depth 68 PLA \ restore this depth's Vhi 85 23 STA &23 \ V+1 68 PLA A8 TAY \ restore this depth's Yindex C8 INY \ next letter D0 02 BNE P%+4 \ not zero so skip next page E6 23 INC &23 \ V+1 B1 22 LDA (&22),Y \ (V),Y D0 E6 BNE TT50 \ loop Y for next letter of page4 token .TT48 \ rts 60 RTS \ end of flight token printing TT27 .EX2 \ ready to remove - Explosion Code A5 65 LDA &65 \ INWK+31 \ exploding/display state|missiles 09 A0 ORA #&A0 \ bit7 to kill it, bit5 finished exploding. 85 65 STA &65 \ INWK+31 60 RTS .DOEXP \ -> &3470 \ Do Explosion as bit5 set by LL9 A5 65 LDA &65 \ INWK+31 29 40 AND #&40 \ display state keep bit6 F0 03 BEQ P%+5 \ exploding not started, skip ptcls 20 D3 34 JSR &34D3 \ PTCLS \ else exploding has started, remove old plot Cloud. A5 4C LDA &4C \ INWK+6 \ zlo. All do a round of cloud counter. 85 D1 STA &D1 \ T A5 4D LDA &4D \ INWK+7 C9 20 CMP #&20 \ zhi < 32, boost*8 90 04 BCC P%+6 \ skip default A9 FE LDA #&FE \ furthest cloud distance D0 08 BNE yy \ guaranteed Cloud 06 D1 ASL &D1 \ T \ else use zlo 2A ROL A \ *=2 06 D1 ASL &D1 \ T 2A ROL A \ z lo.hi*=4 38 SEC \ ensure cloud distance not 0 2A ROL A .yy \ Cloud 85 81 STA &81 \ Q \ cloud distance A0 01 LDY #1 \ get ship heap byte1, which started at #18 B1 67 LDA (&67),Y \ (XX19),Y 69 04 ADC #4 \ +=4 Cloud counter B0 D0 BCS EX2 \ until overflow and ready to removed, up. 91 67 STA (&67),Y \ (XX19),Y \ else update Cloud counter 20 65 29 JSR &2965 \ DVID4 \ P.R = cloud counter/cloud distance A5 1B LDA &1B \ P C9 1C CMP #&1C \ hi < #28 ? 90 04 BCC P%+6 \ cloud radius < 28 skip max A9 FE LDA #&FE \ else max radius D0 09 BNE dash \ guaranteed Acc = Cloud radius 06 82 ASL &82 \ R 2A ROL A \ *=2 06 82 ASL &82 \ R 2A ROL A \ *=4 06 82 ASL &82 \ R 2A ROL A \ *=8 .dash \ Acc = Cloud radius 88 DEY \ Y = 0, save ship heap byte0 = Cloud radius 91 67 STA (&67),Y \ (XX19),Y A5 65 LDA &65 \ INWK+31 \ display explosion state|missiles 29 BF AND #&BF \ clear bit6 in case can't start 85 65 STA &65 \ INWK+31 29 08 AND #8 \ keep bit3 of display state, something to erase? F0 AA BEQ TT48 \ rts, up. A0 02 LDY #2 \ else ship heap byte2 = hull byte#7 dust B1 67 LDA (&67),Y \ (XX19),Y A8 TAY \ Y counter multiples of 4, greater than 6. .EXL1 \ counter Y B9 F9 00 LDA &00F9,Y \ XX3-7,Y \ from (all visible) vertex heap 91 67 STA (&67),Y \ (XX19),Y \ to ship heap 88 DEY \ next vertex C0 06 CPY #6 \ until down to 7 D0 F6 BNE EXL1 \ loop Y A5 65 LDA &65 \ INWK+31 09 40 ORA #&40 \ set bit6 so this dust will be erased 85 65 STA &65 \ INWK+31 .PTCLS \ -> &34D3 \ plot Cloud A0 00 LDY #0 \ ship heap byte0 = Cloud radius B1 67 LDA (&67),Y \ (XX19),Y 85 81 STA &81 \ Q \ Cloud radius C8 INY \ ship byte1 = Cloud counter B1 67 LDA (&67),Y \ (XX19),Y 10 02 BPL P%+4 \ Cloud counter not half way, skip flip 49 FF EOR #&FF \ else more than half way through cloud counter 4A LSR A 4A LSR A 4A LSR A \ cloud counter/8 max = 15 pixels .PTCNT \ pixel count set 09 01 ORA #1 \ 1 min 85 80 STA &80 \ U \ number of pixels per vertex C8 INY \ ship byte2 = dust = counter target B1 67 LDA (&67),Y \ (XX19),Y 85 8F STA &8F \ TGT \ = hull byte#7 dust = counter target A5 01 LDA &01 \ RAND+1 48 PHA \ restrict random A0 06 LDY #6 \ ship heap index at vertex-1 .EXL5 \ counter Y=CNT Outer loop +=4 for each vertex on ship heap A2 03 LDX #3 .EXL3 \ counter X, K3 loaded with reversed vertex from heap. C8 INY \ Y++ = 7 start is a vertex on ship heap B1 67 LDA (&67),Y \ (XX19),Y 95 D2 STA &D2,X \ K3,X \ Yorg hi,lo, Xorg hi,lo CA DEX \ next coord 10 F8 BPL EXL3 \ loop X 84 93 STY &93 \ CNT \ store index for vertex on ship heap A0 02 LDY #2 .EXL2 \ inner counter Y to set rnd for each vertex C8 INY \ Y++ = 3 start, the 4 randoms on ship heap. B1 67 LDA (&67),Y \ (XX19),Y 45 93 EOR &93 \ CNT \ rnd seeded for each vertex CNT 99 FD FF STA &FFFD,Y \ RAND-3,Y \ using bytes 3,4,5,6. C0 06 CPY #6 \ 6 is last one D0 F4 BNE EXL2 \ loop next inner Y rnd seed A4 80 LDY &80 \ U \ number of pixels per vertex .EXL4 \ counter Y for pixels at each (reversed) vertex in K3 20 85 3F JSR &3F85 \ DORND2 \ leave bit0 of RAND+2 at 0 85 88 STA &88 \ ZZ \ restricted pixel depth A5 D3 LDA &D3 \ K3+1 \ Yorg lo 85 82 STA &82 \ R A5 D2 LDA &D2 \ K3+0 \ Yorg hi 20 4B 35 JSR &354B \ EXS1 \ Xlo.Ahi = Ylo+/-rnd*Cloud radius D0 28 BNE EX11 \ Ahi too big, skip but new rnd E0 BF CPX #&BF \ #2*Y-1 = Y screen range B0 24 BCS EX11 \ too big, skip but new rnd. 86 35 STX &35 \ Y1 \ Y coord A5 D5 LDA &D5 \ K3+3 \ Xorg lo 85 82 STA &82 \ R A5 D4 LDA &D4 \ K3+2 \ Xorg hi 20 4B 35 JSR &354B \ EXS1 \ Xlo.Ahi = Xlo+/-rnd*Cloud radius D0 05 BNE EX4 \ skip pixel A5 35 LDA &35 \ Y1 \ reload Y coord 20 32 19 JSR &1932 \ PIXEL \ at (X,Y1) ZZ away .EX4 \ -> &3533 \ skipped pixel 88 DEY \ loop Y 10 D7 BPL EXL4 \ next pixel at vertex A4 93 LDY &93 \ CNT \ reload index for vertex on ship heap C4 8F CPY &8F \ TGT \ counter target 90 B5 BCC EXL5 \ Outer loop, next vertex on ship heap 68 PLA \ restore random 85 01 STA &01 \ RAND+1 AD 06 09 LDA &0906 \ allwk+6 \ planet zlo seed 85 03 STA &03 \ RAND+3 60 RTS .EX11 \ skipped pixel as Y too big, but new rnd 20 85 3F JSR &3F85 \ DORND2 \ new restricted rnd 4C 33 35 JMP &3533 \ EX4 \ skipped pixel, up. .EXS1 \ -> &354B \ Xlo.Ahi = Rlo.Ahi+/-rnd*Q 85 83 STA &83 \ S \ store origin hi 20 85 3F JSR &3F85 \ DORND2 \ restricted rnd, carry. 2A ROL A \ rnd hi B0 0B BCS EX5 \ negative 20 47 28 JSR &2847 \ FMLTU \ Xlo = Arnd*Q=Cloud radius/256 65 82 ADC &82 \ R AA TAX \ Xlo = R+Arnd*Cloud radius/256 A5 83 LDA &83 \ S 69 00 ADC #0 \ Ahi = S 60 RTS .EX5 \ rnd hi negative 20 47 28 JSR &2847 \ FMLTU \ A=A*Q/256unsg 85 D1 STA &D1 \ T A5 82 LDA &82 \ R E5 D1 SBC &D1 \ T \ Arnd*Q=Cloud radius/256 AA TAX \ Xlo = Rlo-T A5 83 LDA &83 \ S E9 00 SBC #0 \ Ahi = S 60 RTS \ end of explosion code .SOS1 \ -> &356D \ Set up planet 20 3B 3F JSR &3F3B \ msblob \ draw all missile blocks A9 7F LDA #&7F \ no damping of rotation 85 63 STA &63 \ INWK+29 \ rotx counter 85 64 STA &64 \ INWK+30 \ rotz counter AD AF 03 LDA &03AF \ tek \ techlevel of present system 29 02 AND #2 \ bit1 determines planet type 80..82 09 80 ORA #&80 \ type is planet 4C 68 37 JMP &3768 \ NWSHP \ new ship type Acc .SOLAR \ -> &3580 \ Set up planet and sun 4E 8C 03 LSR &038C \ FIST \ reduce Fugitative/Innocent legal status 20 26 3F JSR &3F26 \ ZINF \ zero info A5 6D LDA &6D \ QQ15+1 \ w0_h is Economy 29 03 AND #3 \ furthest are poor agr or mainly ind. 69 03 ADC #3 \ tape had and 7, adc 6, lsr a 85 4E STA &4E \ INWK+8 \ zsg is planet distance 6A ROR A \ planet off to top right 85 48 STA &48 \ INWK+2 \ xsg 85 4B STA &4B \ INWK+5 \ ysg 20 6D 35 JSR &356D \ SOS1 \ set up planet,up. A5 6F LDA &6F \ QQ15+3 \ w1_h 29 07 AND #7 09 81 ORA #&81 \ sun behind you 85 4E STA &4E \ INWK+8 \ zsg A5 71 LDA &71 \ QQ15+5 \ w2_h 29 03 AND #3 85 48 STA &48 \ INWK+2 \ xsg 85 47 STA &47 \ INWK+1 \ xhi A9 00 LDA #0 \ no rotation for sun 85 63 STA &63 \ INWK+29 \ rotx counter 85 64 STA &64 \ INWK+30 \ rotz counter A9 81 LDA #&81 \ type is Sun 20 68 37 JSR &3768 \ NWSHP \ new ship type Acc .NWSTARS \ -> &35B1 \ New dust field A5 87 LDA &87 \ QQ11 \ menu i.d. QQ11 == 0 is space view D0 23 BNE WPSHPS \ if not space view skip over to Wipe Ships .nWq \ -> &35B5 \ also New dust at Death AC C3 03 LDY &03C3 \ NOSTM \ number of dust particles .SAL4 \ counter Y 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 09 08 ORA #8 \ flick out in z 99 A8 0F STA &0FA8,Y \ SZ,Y \ dustz 85 88 STA &88 \ ZZ \ distance 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 99 5C 0F STA &0F5C,Y \ SX,Y \ dustx 85 34 STA &34 \ X1 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 99 82 0F STA &0F82,Y \ SY,Y \ dusty 85 35 STA &35 \ Y1 20 10 19 JSR &1910 \ PIXEL2 \ dust (X1,Y1) from middle 88 DEY \ next dust D0 E0 BNE SAL4 \ loop Y .WPSHPS \ -> &35D8 \ Wipe Ships on scanner A2 00 LDX #0 .WSL1 \ outer counter X BD 11 03 LDA &0311,X \ FRIN,X \ the Type for each of the 12 ships allowed F0 23 BEQ WS2 \ exit as Nothing 30 1E BMI WS1 \ loop as Planet or Sun 85 8C STA &8C \ TYPE \ ship type 20 32 37 JSR &3732 \ GINF \ Get info on ship X, update INF pointer A0 1F LDY #31 \ load some INWK from (INF) .WSL2 \ inner counter Y B1 20 LDA (&20),Y \ (INF),Y 99 46 00 STA &0046,Y \ INWK,Y 88 DEY \ next byte of univ inf to inwk 10 F8 BPL WSL2 \ inner loop Y 86 84 STX &84 \ XSAV \ store nearby ship count outer 20 58 55 JSR &5558 \ SCAN \ ships on scanner A6 84 LDX &84 \ XSAV \ restore A0 1F LDY #31 \ need to adjust INF display state B1 20 LDA (&20),Y \ (INF),Y 29 A7 AND #&A7 \ clear bits 6,4,3 (explode,invisible,dot) 91 20 STA (&20),Y \ (INF),Y \ keep bits 7,5,2,1,0 (kill,exploding,missiles) .WS1 \ loop as Planet or Sun E8 INX \ next nearby slot D0 D8 BNE WSL1 \ outer loop X .WS2 \ exit as Nothing A2 FF LDX #&FF \ clear line buffers 8E C0 0E STX &0EC0 \ LSX2 \ lines X2 8E 0E 0F STX &0F0E \ LSY2 \ lines Y2 .FLFLLS \ -> &360A \ New Flood-filled Sun, ends with Acc=0 A0 BF LDY #191 \ #2*Y-1 is top of Yscreen A9 00 LDA #0 \ clear each line .SAL6 \ counter Y 99 00 0E STA &0E00,Y \ LSO,Y \ line buffer solar 88 DEY \ fill next line with zeros D0 FA BNE SAL6 \ loop Y 88 DEY \ Yreg = #&FF 8C 00 0E STY &0E00 \ LSX \ overlaps with LSO vector 60 RTS .DET1 \ -> &3619 \ Death with X = 24 text rows A9 06 LDA #6 \ R6 number of displayed Character rows 78 SEI \ disable other interrupts 8D 00 FE STA &FE00 \ 6845 register 8E 01 FE STX &FE01 \ 6845 data 58 CLI \ enable interrupts 60 RTS CA DEX \ cap Shield = #&FF \ SHD-2 60 RTS \ Shield = #&FF .SHD \ -> &3626 \ let Shield X recharge E8 INX F0 FB BEQ SHD-2 \ cap Shield up = #&FF if too big else .DENGY \ -> &3629 \ Drain player's Energy CE A7 03 DEC &03A7 \ ENERGY 08 PHP \ push dec flag D0 03 BNE P%+5 \ skip inc, else underflowing EE A7 03 INC &03A7 \ ENERGY \ energy set back to 1 28 PLP \ pull dec flag 60 RTS .COMPAS \ -> &3634 \ space Compass 20 94 36 JSR &3694 \ DOT \ compass dot remove AD 20 03 LDA &0320 \ SSPR \ space station present? 0 is SUN. D0 31 BNE SP1 \ compass point to space station, down. 20 AE 42 JSR &42AE \ SPS1 \ XX15 vector to planet 4C 70 36 JMP &3670 \ SP2 \ compass point to XX15 .SPS2 \ -> &3642 \ X.Y = A/10 for space compass display 0A ASL A \ A is signed unit vector AA TAX \ X = 7bits A9 00 LDA #0 \ Acc gets sign in bit7 6A ROR A \ from any carry A8 TAY \ Yreg = bit7 sign A9 14 LDA #20 \ denominator 85 81 STA &81 \ Q 8A TXA \ 7bits 20 65 29 JSR &2965 \ DVID4 \ Phi.Rlo=A/20 A6 1B LDX &1B \ P 98 TYA \ sign bit 30 03 BMI LL163 \ flip sign of X A0 00 LDY #0 \ hi +ve 60 RTS .LL163 \ flip sign of X A0 FF LDY #&FF \ hi -ve 8A TXA \ 7bits 49 FF EOR #&FF AA TAX \ flipped E8 INX \ -ve P 60 RTS \ X -> -X, Y = #FF. .SPS4 \ -> &3660 \ XX15 vector to #SST A2 08 LDX #8 \ 9 coords .SPL1 \ counter X BD 25 09 LDA &0925,X \ allwk+37,X 95 D2 STA &D2,X \ K3,X CA DEX \ next coord 10 F8 BPL SPL1 \ loop X 4C BD 42 JMP &42BD \ TAS2 \ XX15=r~96 \their comment \ build XX15 from K3 .SP1 \ compass point to space station 20 60 36 JSR &3660 \ SPS4 \ XX15 vector to #SST, up. .SP2 \ -> &3670 \ compass point to XX15 A5 34 LDA &34 \ XX15 \ xunit 20 42 36 JSR &3642 \ SPS2 \ X.Y = xunit/10 for space compass display 8A TXA \ left edge of compass 69 C3 ADC #195 \ X-1 \ their comment 8D A8 03 STA &03A8 \ COMX \ compass-x A5 35 LDA &35 \ XX15+1 \ yunit 20 42 36 JSR &3642 \ SPS2 \ X.Y = yunit/10 for space compass display 86 D1 STX &D1 \ T A9 CC LDA #204 \ needs to be flipped around E5 D1 SBC &D1 \ T 8D A9 03 STA &03A9 \ COMY \ compass-y A9 F0 LDA #&F0 \ default compass colour yellow A6 36 LDX &36 \ XX15+2 \ zunit 10 02 BPL P%+4 \ its in front A9 FF LDA #&FF \ else behind colour is green 8D C5 03 STA &03C5 \ COMC \ compass colour .DOT \ -> &3694 \ Compass dot AD A9 03 LDA &03A9 \ COMY \ compass-y 85 35 STA &35 \ Y1 AD A8 03 LDA &03A8 \ COMX \ compass-x 85 34 STA &34 \ X1 AD C5 03 LDA &03C5 \ COMC \ compass colour 85 91 STA &91 \ COL \ the colour C9 F0 CMP #&F0 \ yellow is in front? D0 05 BNE CPIX2 \ hop ahead 4 lines if behind you, narrower bar .CPIX4 \ stick head on scanner at height Y1 20 AC 36 JSR &36AC \ CPIX2 \ two visits, Y1 then Y1-1 to make twice as thick. C6 35 DEC &35 \ Y1 \ next bar .CPIX2 \ -> &36AC \ Colour Pixel Mode 5 A5 35 LDA &35 \ Y1 \ yscreen A8 TAY \ build screen page 4A LSR A 4A LSR A \ upper 5 bits 4A LSR A \ Y1/8 09 60 ORA #&60 \ screen hi 85 08 STA &08 \ SC+1 A5 34 LDA &34 \ X1 \ xscreen 29 F8 AND #&F8 \ upper 5 bits 85 07 STA &07 \ SC 98 TYA \ yscreen 29 07 AND #7 \ lower 3 bits A8 TAY \ byte row set A5 34 LDA &34 \ X1 29 06 AND #6 \ build mask index bits 2,1 4A LSR A \ /=2, carry cleared. AA TAX \ color mask index for Mode 5, coloured. BD BF 16 LDA &16BF,X \ CTWOS,X 25 91 AND &91 \ COL \ the colour 51 07 EOR (&07),Y \ (SC),Y 91 07 STA (&07),Y \ (SC),Y BD C0 16 LDA &16C0,X \ CTWOS+1,X 10 09 BPL CP1 \ same column A5 07 LDA &07 \ SC 69 08 ADC #8 \ next screen column 85 07 STA &07 \ SC BD C0 16 LDA &16C0,X \ CTWOS+1,X .CP1 \ same column 25 91 AND &91 \ COL \ the colour 51 07 EOR (&07),Y \ (SC),Y 91 07 STA (&07),Y \ (SC),Y 60 RTS .OOPS \ -> &36E4 \ Lose some shield strength, cargo, could die. 85 D1 STA &D1 \ T \ dent was in Acc A2 00 LDX #0 \ min A0 08 LDY #8 \ get zsg of ship hit B1 20 LDA (&20),Y \ (INF),Y 30 10 BMI OO1 \ aft shield hit AD A5 03 LDA &03A5 \ FSH \ forward shield E5 D1 SBC &D1 \ T \ dent 90 04 BCC OO2 \ clamp forward at 0 8D A5 03 STA &03A5 \ FSH \ forward shield .ORTS \ rts 60 RTS .OO2 \ clamp forward at 0 8E A5 03 STX &03A5 \ FSH \ forward shield = 0 90 0E BCC OO3 \ guaranteed, Shield gone .OO1 \ Aft shield hit AD A6 03 LDA &03A6 \ ASH \ aft shield = 0 E5 D1 SBC &D1 \ T \ dent 90 04 BCC OO5 \ clamp aft at 0 8D A6 03 STA &03A6 \ ASH \ aft shield 60 RTS .OO5 \ clamp aft at 0 8E A6 03 STX &03A6 \ ASH \ aft shield .OO3 \ Shield gone 6D A7 03 ADC &03A7 \ ENERGY \ some energy added, wraps as small dent. 8D A7 03 STA &03A7 \ ENERGY F0 02 BEQ P%+4 \ if 0, DEATH B0 03 BCS P%+5 \ overflow just noise EXNO3, OUCH 4C C6 41 JMP &41C6 \ DEATH 20 B1 43 JSR &43B1 \ EXNO3 \ ominous noises 4C EA 45 JMP &45EA \ OUCH \ lose cargo/equipment .SPS3 \ -> &371F \ planet if Xreg=0 for space compass into K3(0to8) BD 01 09 LDA &0901,X \ allwk+1,X 95 D2 STA &D2,X \ K3,X \ hi BD 02 09 LDA &0902,X \ allwk+2,X A8 TAY \ sg 29 7F AND #&7F \ sg far7 95 D3 STA &D3,X \ K3+1,X 98 TYA \ sg 29 80 AND #&80 \ bit7 sign 95 D4 STA &D4,X \ K3+2,X 60 RTS .GINF \ -> &3732 \ Get ship Info pointer into allwk for nearby ship X 8A TXA \ nearby slot 0A ASL A \ X*2 A8 TAY \ index table at UNIV B9 95 16 LDA &1695,Y \ UNIV,Y 85 20 STA &20 \ INF B9 96 16 LDA &1696,Y \ UNIV+1,Y 85 21 STA &21 \ INF+1 60 RTS .NWSPS \ -> &3740 \ New Space Station 20 21 38 JSR &3821 \ SPBLB \ space station bulb A2 81 LDX #&81 \ has ai and ecm 86 66 STX &66 \ INWK+32 A2 00 LDX #0 \ rotz counter, no pitch. 86 64 STX &64 \ INWK+30 86 6A STX &6A \ INWK+36 \ NEWB = 0, not angry 8E 12 03 STX &0312 \ FRIN+1 \ use sun slot CA DEX \ X = #&FF, rotx counter roll with no damping 86 63 STX &63 \ INWK+29 A2 0A LDX #10 \ 10, 12, 14 for x,y,z inc hi 20 FC 37 JSR &37FC \ NwS1 \ Flip sign of INWK(10) 20 FC 37 JSR &37FC \ NwS1 \ Flip sign of INWK(12) 20 FC 37 JSR &37FC \ NwS1 \ Flip sign of INWK(14) A9 00 LDA #0 \ #(LSO MOD 256) \ solar line buffer 85 67 STA &67 \ XX19+0 \ #SST pointer lo A9 0E LDA #&0E \ #(LSO DIV 256) 85 68 STA &68 \ XX19+1 \ pointer hi A9 02 LDA #2 \ #SST Type is space station .NWSHP \ -> &3768 \ New Ship, type Acc. 85 D1 STA &D1 \ T \ Type stored A2 00 LDX #0 .NWL1 \ while slot occupied, counter X BD 11 03 LDA &0311,X \ FRIN,X F0 07 BEQ NW1 \ if empty, found Room for Xth ship to be added E8 INX \ next slot E0 0C CPX #12 \ < #NOSH max number of ships 90 F6 BCC NWL1 \ loop X .NW3 \ else exited loop with no slot found, so ship not added. 18 CLC \ ship not added 60 RTS \ NW3+1 .NW1 \ found Room, a FRIN(X) that is still empty. Allowed to add ship, type is in T. 20 32 37 JSR &3732 \ GINF \ Get INFo pointer for slot X from UNIV A5 D1 LDA &D1 \ T \ the ship type 30 52 BMI NW2 \ Planet/sun, hop inner workspace to just store ship type. 0A ASL A \ type*=2 to get A8 TAY \ hull index for table at XX21= &5600 B9 FF 55 LDA &55FF,Y \ XX21-1,Y F0 F0 BEQ NW3 \ no address hi, ship not added. 85 1F STA &1F \ XX0+1 \ hull pointer hi B9 FE 55 LDA &55FE,Y \ XX21-2,Y 85 1E STA &1E \ XX0 \ hull pointer lo C0 04 CPY #4 \ #2*SST F0 30 BEQ NW6 \ if ship type #SST space station A0 05 LDY #5 \ hull byte#5 = maxlines for using ship lines stack B1 1E LDA (&1E),Y \ (XX0),Y 85 06 STA &06 \ T1 AD B0 03 LDA &03B0 \ SLSP \ ship lines pointer 38 SEC \ ship lines pointer - maxlines E5 06 SBC &06 \ T1 85 67 STA &67 \ XX19 \ temp pointer lo for lines AD B1 03 LDA &03B1 \ SLSP+1 E9 00 SBC #0 \ hi 85 68 STA &68 \ XX19+1 A5 67 LDA &67 \ XX19 E5 20 SBC &20 \ INF \ info pointer gives present top of all workspace heap A8 TAY \ compare later to number of bytes, 37, needed for ship workspace A5 68 LDA &68 \ XX19+1 E5 21 SBC &21 \ INF+1 90 C6 BCC NW3+1 \ rts if too low, not enough space. D0 04 BNE NW4 \ enough space, else if hi match look at lo C0 25 CPY #&25 \ NI% = #37 each ship workspace size 90 C0 BCC NW3+1 \ rts if too low, not enough space .NW4 \ Enough space for lines A5 67 LDA &67 \ XX19 \ temp pointer lo for lines 8D B0 03 STA &03B0 \ SLSP \ ship lines pointer A5 68 LDA &68 \ XX19+1 8D B1 03 STA &03B1 \ SLSP+1 .NW6 \ also New Space Station #SST arrives here A0 0E LDY #14 \ Hull byte#14 = energy B1 1E LDA (&1E),Y \ (XX0),Y 85 69 STA &69 \ INWK+35 \ energy A0 13 LDY #19 \ Hull byte#19 = laser|missile info B1 1E LDA (&1E),Y \ (XX0),Y 29 07 AND #7 \ only lower 3 bits are number of missiles 85 65 STA &65 \ INWK+31 \ display exploding state|missiles A5 D1 LDA &D1 \ T \ reload ship Type .NW2 \ also Planet/sun store ship type 9D 11 03 STA &0311,X \ FRIN,X \ the type for each nearby ship AA TAX \ slot info lost, X is now ship type. 30 0E BMI NW8 \ hop over as planet E0 03 CPX #3 \ #ESC 90 07 BCC NW7 \ < 3 type is not junk E0 0B CPX #11 \ #CYL B0 03 BCS NW7 \ >= 11 type is not junk EE 3E 03 INC &033E \ JUNK \ esc plate oil boulder asteroid splinter shuttle transporter .NW7 \ not junk FE 1E 03 INC &031E,X \ MANY,X \ the total number of ships of type X .NW8 \ hopped as planet/sun A4 D1 LDY &D1 \ T \ the ship type, index to ship type NEWB at E% B9 3D 56 LDA &563D,Y \ XX21-1+2*31,Y \ E%-1,Y 29 6F AND #&6F \ clear bits7,4 of hull's NEWB, has escape capsule and ? 05 6A ORA &6A \ INWK+36 \ NEWB 85 6A STA &6A \ INWK+36 \ NEWB \ keep previous bits for remove, inno, docking, pirate, angry .. A0 24 LDY #36 \ #(NI%-1) start Y counter for inner workspace .NWL3 \ move workspace out, counter Y B9 46 00 LDA &0046,Y \ INWK,Y 91 20 STA (&20),Y \ (INF),Y 88 DEY \ next byte 10 F8 BPL NWL3 \ loop Y 38 SEC \ success in creating new ship, keep carry set. 60 RTS .NwS1 \ -> &37FC \ flip signs and X+=2 needed by new space station B5 46 LDA &46,X \ INWK,X 49 80 EOR #&80 \ flip sg coordinate 95 46 STA &46,X \ INWK,X E8 INX E8 INX \ X+=2 60 RTS .ABORT \ -> &3805 \ draw Missile block, Unarm missile A2 FF LDX #&FF .ABORT2 \ -> &3807 \ Xreg stored as Missile target 86 45 STX &45 \ MSTG \ missile targeted 12 choices AE 8B 03 LDX &038B \ NOMSL \ number of missiles 20 3D 38 JSR &383D \ MSBAR \ draw missile bar, returns with Y = 0. 8C 44 03 STY &0344 \ MSAR \ missiles armed status 60 RTS .ECBLB2 \ -> &3813 \ set ECM bulb A9 20 LDA #&20 \ #32 85 30 STA &30 \ ECMA \ ECM on 0A ASL A \ #64 20 F3 43 JSR &43F3 \ NOISE .ECBLB \ -> &381B \ ECM bulb switch A9 38 LDA #&38 \ #(7*8) \ SC lo for E on left of row A2 32 LDX #&32 \ #(ECBT MOD256) D0 04 BNE BULB-2 \ guaranteed, but assume same Y page .SPBLB \ -> &3821 \ Space Station bulb A9 C0 LDA #&C0 \ Screen lo destination SC on right of row A2 35 LDX #&35 \ #(SPBT MOD256) \ font source A0 38 LDY #&38 \ #(ECBT DIV256) \ BULB-2 .BULB 85 07 STA &07 \ SC \ screen lo 86 1C STX &1C \ P+1 \ font pointer lo 84 1D STY &1D \ P+2 \ font pointer hi A9 7D LDA #&7D \ screen hi SC+1 destination (SC) = &7DC0 4C 45 1F JMP &1F45 \ RREN \ Acc has screen hi for 8 bytes from (P+1) .ECBT \ -> &3832 E0 E0 80 EQUW &E0E0: EQUB &80 \ 'E' displayed in lower console .SPBT \ -> &3835 \ make sure same page ! E0 E0 80 E0 EQUD &E080E0E0 \ 'S' displayed in lower console E0 20 E0 E0 EQUD &E0E020E0 .MSBAR \ -> &383D \ draw Missile bar. X is number of missiles. Y is strip design. 8A TXA \ missile i.d. 0A ASL A 0A ASL A 0A ASL A \ X*8 move over to missile block of interest 85 D1 STA &D1 \ T A9 31 LDA #&31 \ far right E5 D1 SBC &D1 \ T 85 07 STA &07 \ SC \ screen low byte in console A9 7E LDA #&7E \ bottom row of visible console 85 08 STA &08 \ SC+1 98 TYA \ strip mask A0 05 LDY #5 \ 5 strips .MBL1 \ counter Y to build block 91 07 STA (&07),Y \ (SC),Y 88 DEY \ next strip D0 FB BNE MBL1 \ loop Y 60 RTS .PROJ \ -> &3856 \ Project K+INWK(x,y)/z to K3,K4 for center to screen A5 46 LDA &46 \ INWK+0 \ xlo 85 1B STA &1B \ P A5 47 LDA &47 \ INWK+1 \ xhi 85 1C STA &1C \ P+1 A5 48 LDA &48 \ INWK+2 \ xsg 20 FA 3C JSR &3CFA \ PLS6 \ Klo.Xhi = P.A/INWK_z, C set if big B0 28 BCS PL2-1 \ rts as x big A5 40 LDA &40 \ K 69 80 ADC #&80 \ add xcenter 85 D2 STA &D2 \ K3 8A TXA \ xhi 69 00 ADC #0 \ K3 is xcenter of planet 85 D3 STA &D3 \ K3+1 A5 49 LDA &49 \ INWK+3 \ ylo 85 1B STA &1B \ P A5 4A LDA &4A \ INWK+4 \ yhi 85 1C STA &1C \ P+1 A5 4B LDA &4B \ INWK+5 \ ysg 49 80 EOR #&80 \ flip yscreen 20 FA 3C JSR &3CFA \ PLS6 \ Klo.Xhi = P.A/INWK_z, C set if big B0 0C BCS PL2-1 \ rts as y big A5 40 LDA &40 \ K 69 60 ADC #&60 \ #Y for add ycenter 85 E0 STA &E0 \ K4 8A TXA \ y hi 69 00 ADC #0 \ K4 is ycenter of planet 85 E1 STA &E1 \ K4+1 18 CLC \ carry clear is center is on screen 60 RTS \ PL2-1 .PL2 \ planet/sun behind A5 8C LDA &8C \ TYPE \ ship type 4A LSR A \ bit0 B0 03 BCS P%+5 \ sun has bit0 set 4C ED 3B JMP &3BED \ WPLS2 \ bit0 clear Wipe Planet 4C 30 3C JMP &3C30 \ WPLS \ Wipe Sun .PLANET \ -> &3899 \ Planet or Sun type to screen A5 4E LDA &4E \ INWK+8 \ zsg if behind 30 F1 BMI PL2 \ wipe planet/sun C9 30 CMP #&30 \ very far away? B0 ED BCS PL2 \ wipe planet/sun 05 4D ORA &4D \ INWK+7 \ zhi F0 E9 BEQ PL2 \ else too close, wipe planet/sun 20 56 38 JSR &3856 \ PROJ \ Project K+INWK(x,y)/z to K3,K4 for center to screen B0 E4 BCS PL2 \ if center large offset wipe planet/sun A9 60 LDA #&60 \ default radius hi 85 1C STA &1C \ P+1 A9 00 LDA #0 \ radius lo 85 1B STA &1B \ P 20 7E 29 JSR &297E \ DVID3B2 \ divide 3bytes by 2, K = P(2).A/INWK_z A5 41 LDA &41 \ K+1 \ radius hi F0 04 BEQ PL82 \ radius hi fits A9 F8 LDA #&F8 \ else too big 85 40 STA &40 \ K \ radius .PL82 \ radius fits A5 8C LDA &8C \ TYPE \ ship type 4A LSR A \ sun has bit0 set 90 03 BCC PL9 \ planet radius K 4C 54 3A JMP &3A54 \ SUN \ else Sun #&81 #&83 .. with radius Ks .PL9 \ Planet radius K 20 ED 3B JSR &3BED \ WPLS2 \ wipe planet 20 76 3B JSR &3B76 \ CIRCLE \ for planet B0 04 BCS PL20 \ rts, else circle done A5 41 LDA &41 \ K+1 F0 01 BEQ PL25 \ planet on screen .PL20 60 RTS .PL25 \ Planet on screen A5 8C LDA &8C \ TYPE \ ship type C9 80 CMP #&80 \ Lave 2-rings is #&80 D0 3C BNE PL26 \ Other planet #&82 is crater A5 40 LDA &40 \ K C9 06 CMP #6 \ very small radius ? 90 F3 BCC PL20 \ rts A5 54 LDA &54 \ INWK+14 \ rotmat0z hi. Start first meridian 49 80 EOR #&80 \ flipped rotmat0z hi 85 1B STA &1B \ P \ meridian width A5 5A LDA &5A \ INWK+20 \ rotmat1z hi, for meridian1 20 DB 3C JSR &3CDB \ PLS4 \ CNT2 = angle of P_opp/A_adj for Lave A2 09 LDX #9 \ rotmat0.x for both meridians 20 69 39 JSR &3969 \ PLS1 \ INWK+10 is rotmat0x hi \ A.Y = INWK(X+=2)/INWK_z 85 9B STA &9B \ K2 \ mag 0.x used in final x of arc 84 09 STY &09 \ XX16 \ sign 0.x 20 69 39 JSR &3969 \ PLS1 \ INWK+12 is rotmat0y hi \ A.Y = INWK(X+=2)/INWK_z 85 9C STA &9C \ K2+1 \ mag 0.y used in final y of arc 84 0A STY &0A \ XX16+1 \ sign 0.y A2 0F LDX #15 \ rotmat1.x for first meridian 20 EB 3C JSR &3CEB \ PLS5 \ mag K2+2,3 sign XX16+2,3 = NWK(X+=2)/INWK_z 20 87 39 JSR &3987 \ PLS2 \ Lave half ring, phase offset CNT2. A5 54 LDA &54 \ INWK+14 \ rotmat0z hi. Start second meridian 49 80 EOR #&80 \ flipped rotmat0z hi 85 1B STA &1B \ P \ meridian width again A5 60 LDA &60 \ INWK+26 \ rotmat2z hi, for meridian2 at 90 degrees. 20 DB 3C JSR &3CDB \ PLS4 \ CNT2 = angle of P_opp/A_adj for Lave A2 15 LDX #21 \ rotmat2.x for second meridian 20 EB 3C JSR &3CEB \ PLS5 \ mag K2+2,3 sign XX16+2,3 = NWK(X+=2)/INWK_z 4C 87 39 JMP &3987 \ PLS2 \ Lave half ring, phase offset CNT2. .PL26 \ Other planet e.g. #&82 \ crtr their comment, has One crater. A5 5A LDA &5A \ INWK+20 \ rotmat1z hi 30 B9 BMI PL20 \ rts, crater on far side A2 0F LDX #15 \ rotmat1.x (same as meridian1) 20 BA 3C JSR &3CBA \ PLS3 \ A.Y = 222* INWK(X+=2)/INWK_z. 222 is xoffset of crater 18 CLC \ add xorg lo 65 D2 ADC &D2 \ K3 85 D2 STA &D2 \ K3 98 TYA \ xoffset hi of crater center updated 65 D3 ADC &D3 \ K3+1 85 D3 STA &D3 \ K3+1 20 BA 3C JSR &3CBA \ PLS3 \ A.Y = 222* INWK(X+=2)/INWK_z. 222 is yoffset of crater 85 1B STA &1B \ P A5 E0 LDA &E0 \ K4 38 SEC \ sub Plo from yorg lo E5 1B SBC &1B \ P 85 E0 STA &E0 \ K4 84 1B STY &1B \ P \ yoffset hi temp A5 E1 LDA &E1 \ K4+1 \ yorg hi E5 1B SBC &1B \ P \ yoffset hi temp 85 E1 STA &E1 \ K4+1 \ y of crater center updated A2 09 LDX #9 \ rotmat0.x (same as both meridians) 20 69 39 JSR &3969 \ PLS1 \ INWK+10 is rotmat0x hi \ A.Y = INWK(X+=2)/INWK_z 4A LSR A \ /2 used in final x of ring 85 9B STA &9B \ K2+0 \ mag 0.x/2 84 09 STY &09 \ XX16+0 \ sign 0.x 20 69 39 JSR &3969 \ PLS1 \ INWK+12 is rotmat0y hi \ A.Y = INWK(X+=2)/INWK_z 4A LSR A \ /2 used in final y of ring 85 9C STA &9C \ K2+1 \ mag 0.y/2 84 0A STY &0A \ XX16+1 \ sign 0.y A2 15 LDX #21 \ rotmat2.x (same as second meridian) 20 69 39 JSR &3969 \ PLS1 \ INWK+14 is rotmat2x hi \ A.Y = INWK(X+=2)/INWK_z 4A LSR A \ /2 used in final x of ring 85 9D STA &9D \ K2+2 \ mag 2.x/2 84 0B STY &0B \ XX16+2 \ sign 2.x 20 69 39 JSR &3969 \ PLS1 \ INWK+16 is rotmat2y hi \ A.Y = INWK(X+=2)/INWK_z 4A LSR A \ /2 used in final y of ring 85 9E STA &9E \ K2+3 \ mag 2.y/2 84 0C STY &0C \ XX16+3 \ sign 2.y A9 40 LDA #64 \ full circle 85 8F STA &8F \ TGT \ count target A9 00 LDA #0 \ no phase offset for crater ring 85 94 STA &94 \ CNT2 F0 22 BEQ PLS22 \ guaranteed crater with TGT = #64 .PLS1 \ -> &3969 \ X = 9 etc. A.Y = INWK(X+=2)/INWK_z B5 46 LDA &46,X \ INWK+0,X 85 1B STA &1B \ P B5 47 LDA &47,X \ INWK+1,X 29 7F AND #&7F \ 7bits of hi 85 1C STA &1C \ P+1 B5 47 LDA &47,X \ INWK+1,X \ again, get sign for 3rd byte 29 80 AND #&80 \ sign only 20 7E 29 JSR &297E \ DVID3B2 \ divide 3bytes by 2, K = P(2).A/INWK_z A5 40 LDA &40 \ K \ lo A4 41 LDY &41 \ K+1 \ hi F0 02 BEQ P%+4 A9 FE LDA #&FE \ else sat Acc and keep Y = K+1 non-zero A4 43 LDY &43 \ K+3 \ sign E8 INX E8 INX \ X+=2 60 RTS .PLS2 \ -> &3987 \ Lave half ring, mags K2+0to3, signs XX16+0to3, xy(0)xy(1), phase offset CNT2 A9 1F LDA #31 \ half-circle 85 8F STA &8F \ TGT \ count target .PLS22 \ also crater with TGT = #64 A2 00 LDX #0 86 93 STX &93 \ CNT \ count CA DEX \ X = #&FF 86 92 STX &92 \ FLAG .PLL4 \ -> &3992 \ counter CNT+= STP > TGT planet ring A5 94 LDA &94 \ CNT2 \ for arc 29 1F AND #&1F \ angle index AA TAX \ sine table BD C0 07 LDA &07C0,X \ SNE,X 85 81 STA &81 \ Q \ sine A5 9D LDA &9D \ K2+2 \ mag x1 20 47 28 JSR &2847 \ FMLTU \ A=A*Q/256unsg 85 82 STA &82 \ R \ part2 lo x = mag x1 * sin A5 9E LDA &9E \ K2+3 \ mag y1 20 47 28 JSR &2847 \ FMLTU \ A=A*Q/256unsg 85 40 STA &40 \ K \ part2 lo y = mag y1 * sin A6 94 LDX &94 \ CNT2 E0 21 CPX #33 \ for arc A9 00 LDA #0 \ any sign 6A ROR A \ into 7th bit 85 0E STA &0E \ XX16+5 \ ysign A5 94 LDA &94 \ CNT2 18 CLC \ for arc 69 10 ADC #16 \ cosine 29 1F AND #&1F \ index AA TAX \ sinetable BD C0 07 LDA &07C0,X \ SNE,X 85 81 STA &81 \ Q \ cosine A5 9C LDA &9C \ K2+1 \ mag y0 20 47 28 JSR &2847 \ FMLTU \ A=A*Q/256unsg 85 42 STA &42 \ K+2 \ part1 lo y = mag y0 * cos A5 9B LDA &9B \ K2+0 \ mag x0 20 47 28 JSR &2847 \ FMLTU \ A=A*Q/256unsg 85 1B STA &1B \ P \ part1 lo x = mag x0 * cos A5 94 LDA &94 \ CNT2 69 0F ADC #15 \ for arc 29 3F AND #&3F \ 63 max C9 21 CMP #33 \ > 32 ? A9 00 LDA #0 \ any carry is sign 6A ROR A \ into 7th bit 85 0D STA &0D \ XX16+4 \ xsign A5 0E LDA &0E \ XX16+5 \ ysign 45 0B EOR &0B \ XX16+2 \ x1 sign 85 83 STA &83 \ S \ S = part2 hi x A5 0D LDA &0D \ XX16+4 \ xsign 45 09 EOR &09 \ XX16+0 \ x0 sign \ A = part1 hi x 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S \ lo x = mag x0 * cos + mag x1 * sin 85 D1 STA &D1 \ T \ sum hi 10 0F BPL PL42 \ hop xplus 8A TXA \ else minus, sum lo 49 FF EOR #&FF 18 CLC 69 01 ADC #1 AA TAX \ flipped lo A5 D1 LDA &D1 \ T \ sum hi 49 7F EOR #&7F 69 00 ADC #0 85 D1 STA &D1 \ T \ flip sum hi and continue .PL42 \ hop xplus 8A TXA \ sum x lo 65 D2 ADC &D2 \ K3 \ xcenter lo 85 76 STA &76 \ K6 \ xfinal lo A5 D1 LDA &D1 \ T \ sum x hi 65 D3 ADC &D3 \ K3+1 \ xcenter hi 85 77 STA &77 \ K6+1 \ xfinal hi A5 40 LDA &40 \ K \ part2 lo y 85 82 STA &82 \ R \ part2 lo y A5 0E LDA &0E \ XX16+5 \ ysign 45 0C EOR &0C \ XX16+3 \ y1 sign 85 83 STA &83 \ S \ part2 hi y A5 42 LDA &42 \ K+2 \ part1 lo y 85 1B STA &1B \ P \ part1 lo y A5 0D LDA &0D \ XX16+4 \ xsign 45 0A EOR &0A \ XX16+1 \ y0 sign \ A = part1 hi y 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S \ lo y = mag y0 * cos + mag y1 * sin 49 80 EOR #&80 \ flip 85 D1 STA &D1 \ T \ yfinal hi 10 0F BPL PL43 \ hop yplus 8A TXA \ else minus, sum lo 49 FF EOR #&FF 18 CLC 69 01 ADC #1 AA TAX \ flipped lo, yfinal lo A5 D1 LDA &D1 \ T \ yfinal hi 49 7F EOR #&7F 69 00 ADC #0 85 D1 STA &D1 \ T \ flipped sum hi and continue, yfinal hi .PL43 \ hop yplus 20 6B 19 JSR &196B \ BLINE \ ball line uses (X.T) as next y offset for arc C5 8F CMP &8F \ TGT \ count target \ CNT+= STP > TGT F0 02 BEQ P%+4 \ = TGT, next. B0 0C BCS PL40 \ > TGT exit arc rts A5 94 LDA &94 \ next, CNT2 18 CLC \ +step for ring 65 95 ADC &95 \ STP 29 3F AND #&3F \ round 85 94 STA &94 \ CNT2 4C 92 39 JMP &3992 \ PLL4 \ loop planet ring .PL40 60 RTS \ end Crater ring \ PLF3-3 \ Wipe Sun 4C 30 3C JMP &3C30 \ WPLS .PLF3 \ flip height for planet/sun fill 8A TXA \ Yscreen height lo 49 FF EOR #&FF \ flip 18 CLC 69 01 ADC #1 AA TAX \ height flipped .PLF17 \ up A = #&FF as Xlo =0 A9 FF LDA #&FF \ fringe flag will run up D0 45 BNE PLF5 \ guaranteed, Xreg = height ready .SUN \ -> &3A54 \ Sun with radius K A9 01 LDA #1 8D 00 0E STA &0E00 \ LSX \ overlaps with LSO vector 20 80 3C JSR &3C80 \ CHKON \ P+1 set to maxY B0 E8 BCS PLF3-3 \ jmp wpls Wipe Sun A9 00 LDA #0 \ fill up Acc bits based on size A6 40 LDX &40 \ K \ radius E0 60 CPX #&60 \ any carry becomes low bit 2A ROL A E0 28 CPX #&28 \ 4 if K >= 40 2A ROL A E0 10 CPX #&10 \ 2 if K >= 16 2A ROL A \ extent of fringes set .PLF18 85 93 STA &93 \ CNT \ bits are extent of fringes A9 BF LDA #191 \ 2*#Y-1 is Yscreen A6 1D LDX &1D \ P+2 D0 0A BNE PLF2 \ big height C5 1C CMP &1C \ P+1 \ is Y screen < P+1 90 06 BCC PLF2 \ big height A5 1C LDA &1C \ P+1 \ now Acc loaded D0 02 BNE PLF2 \ big height A9 01 LDA #1 \ else Acc=1 is bottom end of Yscreen .PLF2 \ big height 85 8F STA &8F \ TGT \ top of screen for Y height A9 BF LDA #191 \ #2*Y-1 is Yscreen 38 SEC \ subtract E5 E0 SBC &E0 \ K4 \ Yorg AA TAX \ lo Yscreen lo A9 00 LDA #0 \ hi E5 E1 SBC &E1 \ K4+1 30 BE BMI PLF3 \ flip height then ready to run up D0 08 BNE PLF4 \ if Yscreen hi not zero then height is full radius E8 INX CA DEX \ ysub lo F0 BF BEQ PLF17 \ if ylo = 0 then ready to run up with A = #&FF E4 40 CPX &40 \ K \ Yscreen lo < radius ? 90 04 BCC PLF5 \ if ylo < radius then ready to run down .PLF4 \ height is full radius A6 40 LDX &40 \ K \ counter V height is radius A9 00 LDA #0 \ fringe flag will run down .PLF5 \ Xreg = height ready, Acc is flag for run direction 86 22 STX &22 \ V \ counter height 85 23 STA &23 \ V+1 \ flag 0 (up) or FF (down) A5 40 LDA &40 \ K 20 0D 28 JSR &280D \ SQUA2 \ P.A =A*A unsigned 85 9C STA &9C \ K2+1 \ squared 16-bit radius hi A5 1B LDA &1B \ P \ lo 85 9B STA &9B \ K2 \ squared 16-bit stored in K2 A0 BF LDY #191 \ 2*#Y-1 is Yscreen is counter start A5 28 LDA &28 \ SUNX 85 26 STA &26 \ YY \ old mid-point of horizontal line A5 29 LDA &29 \ SUNX+1 85 27 STA &27 \ YY+1 \ hi .PLFL2 \ counter Y down erase top Disc C4 8F CPY &8F \ TGT \ Yheight top reached? F0 0B BEQ PLFL \ exit to Start, Y height = TGT top. B9 00 0E LDA &0E00,Y \ LSO,Y F0 03 BEQ PLF13 \ if half width zero skip line drawing 20 5E 18 JSR &185E \ HLOIN2 \ line X1,X2 using YY as mid-point, Acc is half-width .PLF13 \ skipped line drawing 88 DEY \ erase top Disc D0 F1 BNE PLFL2 \ loop Y .PLFL \ -> &3AC1 \ exited as reached Start. Y = TGT, counter V height. Work out extent. A5 22 LDA &22 \ V \ counter height 20 0D 28 JSR &280D \ SQUA2 \ P.A =A*A unsigned 85 D1 STA &D1 \ T \ squared height hi A5 9B LDA &9B \ K2 \ squared 16-bit radius lo 38 SEC E5 1B SBC &1B \ P \ height squared lo 85 81 STA &81 \ Q \ radius^2-height^2 lo A5 9C LDA &9C \ K2+1 \ radius^2 hi E5 D1 SBC &D1 \ T \ height squared hi 85 82 STA &82 \ R \ extent^2 hi 84 35 STY &35 \ Y1 \ Y store line height 20 B8 47 JSR &47B8 \ LL5 \ SQRT Q = SQR(Q,R) = sqrt(sub) A4 35 LDY &35 \ Y1 \ restore line counter 20 86 3F JSR &3F86 \ DORND \ do random number 25 93 AND &93 \ CNT \ trim fringe 18 CLC 65 81 ADC &81 \ Q \ new extent 90 02 BCC PLF44 \ not saturated A9 FF LDA #&FF \ fringe max extent .PLF44 \ fringes not saturated BE 00 0E LDX &0E00,Y \ LSO,Y 99 00 0E STA &0E00,Y \ LSO,Y F0 4A BEQ PLF11 \ updated extent, if zero No previous old line A5 28 LDA &28 \ SUNX 85 26 STA &26 \ YY \ Old mid-point of line A5 29 LDA &29 \ SUNX+1 85 27 STA &27 \ YY+1 \ hi 8A TXA \ old lso,y half-width extent 20 4F 3C JSR &3C4F \ EDGES \ horizontal line old extent clip A5 34 LDA &34 \ X1 85 24 STA &24 \ XX \ old left A5 36 LDA &36 \ X2 85 25 STA &25 \ XX+1 \ old right A5 D2 LDA &D2 \ K3 \ Xcenter 85 26 STA &26 \ YY \ new mid-point A5 D3 LDA &D3 \ K3+1 85 27 STA &27 \ YY+1 \ hi B9 00 0E LDA &0E00,Y \ LSO,Y 20 4F 3C JSR &3C4F \ EDGES \ horizontal line new extent clip B0 0B BCS PLF23 \ No new line A5 36 LDA &36 \ X2 A6 24 LDX &24 \ XX \ old left 86 36 STX &36 \ X2 85 24 STA &24 \ XX \ swopped old left and new X2 right 20 68 18 JSR &1868 \ HLOIN \ horizontal line X1,Y1,X2 Left fringe .PLF23 \ also No new line A5 24 LDA &24 \ XX \ old left or new right 85 34 STA &34 \ X1 A5 25 LDA &25 \ XX+1 \ old right 85 36 STA &36 \ X2 .PLF16 \ Draw New line, also from PLF11 20 68 18 JSR &1868 \ HLOIN \ horizontal line X1,Y1,X2 Whole old, or new Right fringe. .PLF6 \ tail Next line 88 DEY \ next height Y F0 3F BEQ PLF8 \ Exit Sun fill A5 23 LDA &23 \ V+1 \ if flag already set D0 1D BNE PLF10 \ take height counter V back up to radius K C6 22 DEC &22 \ V \ else counter height down D0 8C BNE PLFL \ loop V, Work out extent C6 23 DEC &23 \ V+1 \ finished down, set flag to go other way. .PLFLS \ loop back to Work out extent 4C C1 3A JMP &3AC1 \ PLFL \ loop V back, Work out extent. .PLF11 \ No previous old line at Y1 screen A6 D2 LDX &D2 \ K3 \ Xcenter 86 26 STX &26 \ YY \ new mid-point A6 D3 LDX &D3 \ K3+1 86 27 STX &27 \ YY+1 \ hi 20 4F 3C JSR &3C4F \ EDGES \ horizontal line X1,Y1,X2 90 E0 BCC PLF16 \ Draw New line, up. A9 00 LDA #0 \ else no line at height Y 99 00 0E STA &0E00,Y \ LSO,Y F0 DC BEQ PLF6 \ guaranteed, tail Next line up .PLF10 \ V flag set to take height back up to radius K A6 22 LDX &22 \ V \ counter height E8 INX \ next 86 22 STX &22 \ V E4 40 CPX &40 \ K \ if height < radius 90 E0 BCC PLFLS \ loop V, Work out extent F0 DE BEQ PLFLS \ if height = radius, loop V, Work out extent A5 28 LDA &28 \ SUNX 85 26 STA &26 \ YY \ Onto remaining erase. Old mid-point of line A5 29 LDA &29 \ SUNX+1 85 27 STA &27 \ YY+1 \ hi .PLFL3 \ rest of counter Y screen line B9 00 0E LDA &0E00,Y \ LSO,Y F0 03 BEQ PLF9 \ no fringe, skip draw line 20 5E 18 JSR &185E \ HLOIN2 \ line X1,X2 using YY as mid-point, Acc is half-width .PLF9 \ skipped erase line 88 DEY \ rest of screen D0 F5 BNE PLFL3 \ loop Y erase bottom Disc .PLF8 \ Exit Planet fill 18 CLC \ update mid-point of line A5 D2 LDA &D2 \ K3 85 28 STA &28 \ SUNX A5 D3 LDA &D3 \ K3+1 85 29 STA &29 \ SUNX+1 .RTS2 60 RTS \ End of Sun fill .CIRCLE \ -> &3B76 \ Circle for planet 20 80 3C JSR &3C80 \ CHKON \ P+1 set to maxY B0 FA BCS RTS2 \ rts A9 00 LDA #0 8D C0 0E STA &0EC0 \ LSX2 A6 40 LDX &40 \ K \ radius A9 08 LDA #8 \ set up STP size based on radius E0 08 CPX #8 \ is radius X < 8 ? 90 06 BCC PL89 \ small 4A LSR A \ STP #4 E0 3C CPX #60 90 01 BCC PL89 \ small 4A LSR A \ bigger circles get smaller step .PL89 \ small 85 95 STA &95 \ STP \ step for ring .CIRCLE2 \ -> &3B90 \ also on chart at origin (K3,K4) STP already set A2 FF LDX #&FF 86 92 STX &92 \ FLAG E8 INX \ X = 0 86 93 STX &93 \ CNT .PLL3 \ -> &3B97 \ counter CNT until = 64 A5 93 LDA &93 \ CNT 20 3D 28 JSR &283D \ FMLTU2 \ Get K*sin(CNT) in Acc A2 00 LDX #0 \ hi 86 D1 STX &D1 \ T A6 93 LDX &93 \ CNT \ the count around the circle E0 21 CPX #33 \ <= #32 ? 90 0D BCC PL37 \ right-half of circle 49 FF EOR #&FF \ else Xreg = A lo flipped 69 00 ADC #0 AA TAX \ lo A9 FF LDA #&FF \ hi flipped 69 00 ADC #0 \ any carry 85 D1 STA &D1 \ T 8A TXA \ lo flipped, later moved into K6(0,1) for BLINE x offset 18 CLC .PL37 \ right-half of circle, Acc = xlo 65 D2 ADC &D2 \ K3 \ Xorg 85 76 STA &76 \ K6 \ K3(0) + Acc = lsb of X for bline A5 D3 LDA &D3 \ K3+1 \ hi 65 D1 ADC &D1 \ T \ hi 85 77 STA &77 \ K6+1 \ K3(1) + T + C = hsb of X for bline A5 93 LDA &93 \ CNT 18 CLC \ onto Y 69 10 ADC #&10 \ Go ahead a quarter of a quadrant for cosine index 20 3D 28 JSR &283D \ FMLTU2 \ Get K*sin(CNT) into A AA TAX \ y lo = K*sin(CNT) A9 00 LDA #0 \ y hi = 0 85 D1 STA &D1 \ T A5 93 LDA &93 \ CNT 69 0F ADC #15 \ count +=15 29 3F AND #&3F \ round within 64 C9 21 CMP #33 \ <= 32 ? 90 0D BCC PL38 \ if true skip y flip 8A TXA \ Ylo 49 FF EOR #&FF \ flip 69 00 ADC #0 AA TAX \ Ylo flipped A9 FF LDA #&FF \ hi flipped 69 00 ADC #0 \ any carry 85 D1 STA &D1 \ T 18 CLC .PL38 \ skipped Y flip 20 6B 19 JSR &196B \ BLINE \ ball line uses (X.T) as next y C9 41 CMP #65 \ > #64? B0 03 BCS P%+5 \ hop to exit 4C 97 3B JMP &3B97 \ PLL3 \ loop CNT back 18 CLC 60 RTS \ End Circle .WPLS2 \ -> &3BED \ Wipe Planet AC C0 0E LDY &0EC0 \ LSX2 \ 78 bytes used by bline Xcoords D0 34 BNE WP1 \ Avoid lines down .WPL1 \ -> &3BF2 \ counter Y starts at 0 C4 6B CPY &6B \ LSP B0 30 BCS WP1 \ arc step reached, exit to Avoid lines. B9 0E 0F LDA &0F0E,Y \ LSY2,Y \ buffer Ycoords C9 FF CMP #&FF \ flag F0 1A BEQ WP2 \ move into X1,Y1 85 37 STA &37 \ Y2 \ else move into X2,Y2 B9 C0 0E LDA &0EC0,Y \ LSX2,Y \ buffer Xcoords 85 36 STA &36 \ X2 20 C4 16 JSR &16C4 \ LOIN \ draw line using (X1,Y1), (X2,Y2) C8 INY \ next vertex A5 90 LDA &90 \ SWAP D0 E6 BNE WPL1 \ loop Y through buffer A5 36 LDA &36 \ X2 \ else swap (X2,Y2) -> (X1,Y1) 85 34 STA &34 \ X1 A5 37 LDA &37 \ Y2 85 35 STA &35 \ Y1 4C F2 3B JMP &3BF2 \ WPL1 \ loop Y through buffer .WP2 \ flagged move into X1,Y1 C8 INY \ next vertex B9 C0 0E LDA &0EC0,Y \ LSX2,Y 85 34 STA &34 \ X1 B9 0E 0F LDA &0F0E,Y \ LSY2,Y 85 35 STA &35 \ Y1 C8 INY \ next vertex 4C F2 3B JMP &3BF2 \ WPL1 \ loop Y through buffer .WP1 \ Avoid lines, used by wipe planet code A9 01 LDA #1 85 6B STA &6B \ LSP \ arc step A9 FF LDA #&FF 8D C0 0E STA &0EC0 \ LSX2 60 RTS \ WPLS-1 .WPLS \ -> &3C30 \ Wipe Sun AD 00 0E LDA &0E00 \ LSO 30 FA BMI WPLS-1 \ rts A5 28 LDA &28 \ SUNX 85 26 STA &26 \ YY \ mid-point of line lo A5 29 LDA &29 \ SUNX+1 85 27 STA &27 \ YY+1 \ hi A0 BF LDY #191 \ #2*Y-1 = Yscreen top .WPL2 \ counter Y B9 00 0E LDA &0E00,Y \ LSO,Y F0 03 BEQ P%+5 \ skip hline2 20 5E 18 JSR &185E \ HLOIN2 \ line using YY as mid-point, A is half-width. 88 DEY D0 F5 BNE WPL2 \ loop Y 88 DEY \ Yreg = #&FF, solar empty. 8C 00 0E STY &0E00 \ LSO 60 RTS .EDGES \ -> &3C4F \ Clip Horizontal line centered on YY to X1 X2 85 D1 STA &D1 \ T 18 CLC \ trial halfwidth 65 26 ADC &26 \ YY \ add center of line X mid-point 85 36 STA &36 \ X2 \ right A5 27 LDA &27 \ YY+1 \ hi 69 00 ADC #0 \ any carry 30 1D BMI ED1 \ right overflow F0 04 BEQ P%+6 \ no hsb present, hop to LDA YY A9 FE LDA #&FE \ else saturate right 85 36 STA &36 \ X2 A5 26 LDA &26 \ YY \ center of line X mid-point 38 SEC \ subtract trial halfwidth E5 D1 SBC &D1 \ T 85 34 STA &34 \ X1 \ left A5 27 LDA &27 \ YY+1 \ hi E9 00 SBC #0 \ any carry D0 02 BNE ED3 \ left underflow 18 CLC \ else, ok draw line 60 RTS \ X1 and X2 now known .ED3 \ left underflow 10 06 BPL ED1 \ X1 left under flow, dont draw. A9 02 LDA #2 \ else saturate left 85 34 STA &34 \ X1 18 CLC \ ok draw line 60 RTS .ED1 \ right overflow, also left dont draw A9 00 LDA #0 \ clear line buffer solar 99 00 0E STA &0E00,Y \ LSO,Y 38 SEC \ dont draw 60 RTS \ end of Clipped edges .CHKON \ -> &3C80 \ check extent of circles, P+1 set to maxY, Y protected. A5 D2 LDA &D2 \ K3 \ Xorg 18 CLC 65 40 ADC &40 \ K \ radius A5 D3 LDA &D3 \ K3+1 \ hi 69 00 ADC #0 30 2D BMI PL21 \ overflow to right, sec rts A5 D2 LDA &D2 \ K3 \ Xorg 38 SEC E5 40 SBC &40 \ K \ radius A5 D3 LDA &D3 \ K3+1 \ hi E9 00 SBC #0 30 02 BMI PL31 \ Xrange ok D0 20 BNE PL21 \ underflow to left, sec rts .PL31 \ Xrange ok A5 E0 LDA &E0 \ K4 \ Yorg 18 CLC 65 40 ADC &40 \ K \ radius 85 1C STA &1C \ P+1 \ maxY = Yorg+radius A5 E1 LDA &E1 \ K4+1 \ hi 69 00 ADC #0 30 13 BMI PL21 \ overflow top, sec rts 85 1D STA &1D \ P+2 \ maxY hi A5 E0 LDA &E0 \ K4 \ Yorg 38 SEC E5 40 SBC &40 \ K \ radius AA TAX \ bottom lo A5 E1 LDA &E1 \ K4+1 \ hi E9 00 SBC #0 30 6A BMI PL44 \ ok to draw, clc D0 03 BNE PL21 \ bottom underflowed, sec rts E0 BF CPX #191 \ #2*Y-1, bottom Ylo >= screen Ytop? 60 RTS .PL21 \ dont draw 38 SEC 60 RTS .PLS3 \ -> &3CBA \ only Crater uses this, A.Y = 222* INWK(X+=2)/INWK_z 20 69 39 JSR &3969 \ PLS1 \ A.Y = INWK(X+=2)/INWK_z 85 1B STA &1B \ P A9 DE LDA #222 \ offset to crater, divide/256 * unit to offset crater center 85 81 STA &81 \ Q 86 80 STX &80 \ U \ store index 20 20 28 JSR &2820 \ MULTU \ P.A = P*Q = 222* INWK(X+=2)/INWK_z A6 80 LDX &80 \ U \ restore index A4 43 LDY &43 \ K+3 \ sign 10 0A BPL PL12 \ +ve 49 FF EOR #&FF \ else flip A hi 18 CLC 69 01 ADC #1 F0 03 BEQ PL12 \ +ve A0 FF LDY #&FF \ else A flipped 60 RTS .PL12 \ +ve A0 00 LDY #0 60 RTS .PLS4 \ -> &3CDB \ CNT2 = angle of P_opp/A_adj for Lave 85 81 STA &81 \ Q 20 3C 2A JSR &2A3C \ ARCTAN \ A=arctan (P/Q) A6 54 LDX &54 \ INWK+14 \ rotmat0z hi 30 02 BMI P%+4 \ -ve rotmat0z hi keeps arctan +ve 49 80 EOR #&80 \ else arctan -ve 4A LSR A 4A LSR A \ /4 85 94 STA &94 \ CNT2 \ phase offset 60 RTS .PLS5 \ -> &3CEB \ mag K2+2,3 sign XX16+2,3 = NWK(X+=2)/INWK_z for Lave 20 69 39 JSR &3969 \ PLS1 \ A.Y = INWK(X+=2)/INWK_z 85 9D STA &9D \ K2+2 \ mag 84 0B STY &0B \ XX16+2 \ sign 20 69 39 JSR &3969 \ PLS1 \ A.Y = INWK(X+=2)/INWK_z 85 9E STA &9E \ K2+3 \ mag 84 0C STY &0C \ XX16+3 \ sign 60 RTS .PLS6 \ -> &3CFA \ visited from PROJ \ Klo.Xhi = P.A/INWK_z, C set if big 20 7E 29 JSR &297E \ DVID3B2 \ divide 3bytes by 2, K = P(2).A/INWK_z A5 43 LDA &43 \ K+3 29 7F AND #&7F \ sg 7bits 05 42 ORA &42 \ K+2 D0 B3 BNE PL21 \ sec rts as too far off A6 41 LDX &41 \ K+1 E0 04 CPX #4 \ hi >= 4 ? ie >= 1024 B0 13 BCS PL6 \ rts as too far off A5 43 LDA &43 \ K+3 \ sign 10 0F BPL PL6 \ rts C clear ok A5 40 LDA &40 \ K \ else flip K lo 49 FF EOR #&FF 69 01 ADC #1 \ flipped lo 85 40 STA &40 \ K 8A TXA \ K+1 49 FF EOR #&FF \ flip hi 69 00 ADC #0 AA TAX \ X = K+1 hi flipped .PL44 \ ok to draw 18 CLC .PL6 60 RTS \ end of Planet, onto keyboard block E --- .TT17 \ -> &3D1F \ returns with X,Y from arrow keys or joystick used 20 AF 44 JSR &44AF \ DOKEY \ KL has force key AD CD 03 LDA &03CD \ JSTK \ or joystick used F0 25 BEQ TJ1 \ hop down, Arrows from keyboard, else joystick AD 4C 03 LDA &034C \ JSTX 49 FF EOR #&FF \ flip sign 20 34 3D JSR &3D34 \ TJS1 \ Yreg = -2 to +2 for -JSTX 98 TYA \ Acc = -2 to +2 for -JSTX AA TAX \ Xreg = -2 to +2 for -JSTX AD 4D 03 LDA &034D \ JSTY .TJS1 \ -> &3D34 \ Acc scaled to -2 to +2 for 0 to FF A8 TAY \ JST X Y A9 00 LDA #0 C0 10 CPY #&10 \ set C if Y>= #&10 E9 00 SBC #0 C0 40 CPY #&40 E9 00 SBC #0 C0 C0 CPY #&C0 69 00 ADC #0 C0 E0 CPY #&E0 69 00 ADC #0 A8 TAY \ Yreg = -2 to +2 AD 00 03 LDA &0300 \ KL \ Acc = keyboard logger 60 RTS .TJ1 \ -> &3D4C \ Arrows from keyboard AD 00 03 LDA &0300 \ KL \ keyboard logger A2 00 LDX #0 A0 00 LDY #0 C9 19 CMP #&19 \ left cursor D0 01 BNE P%+3 \ skip dex CA DEX C9 79 CMP #&79 \ right cursor D0 01 BNE P%+3 \ skip inx E8 INX C9 39 CMP #&39 \ up cursor D0 01 BNE P%+3 \ skip iny C8 INY C9 29 CMP #&29 \ down cursor D0 01 BNE P%+3 \ skip dey 88 DEY 60 RTS \ no shift boost in Flight code .ping \ -> &3D68 \ move to home coordinates A2 01 LDX #1 .pl1 \ counter X BD 59 03 LDA &0359,X \ QQ0,X \ present system 9D C1 03 STA &03C1,X \ QQ9,X \ target system CA DEX \ next coord 10 F7 BPL pl1 \ loop X 60 RTS .KS3 \ exit as end found, temp P correct. A5 1B LDA &1B \ P \ temp pointer lo 8D B0 03 STA &03B0 \ SLSP+0 \ last ship lines stack pointer A5 1C LDA &1C \ P+1 \ temp pointer hi 8D B1 03 STA &03B1 \ SLSP+1 60 RTS .KS1 \ Kill ships from Block A loop Enters here A6 84 LDX &84 \ XSAV \ nearby ship index 20 D8 3D JSR &3DD8 \ KILLSHP \ Kill target X, down. A6 84 LDX &84 \ XSAV \ reload ship index 4C 76 13 JMP &1376 \ MAL1 \ rejoin loop in Block A .KS4 \ removing Space Station to make new Sun 20 26 3F JSR &3F26 \ ZINF \ zero info, ends with A = #&C0. 20 0A 36 JSR &360A \ FLFLLS \ ends with A=0 8D 12 03 STA &0312 \ FRIN+1 \ #SST slot emptied 8D 20 03 STA &0320 \ SSPR \ space station present, 0 is SUN. 20 21 38 JSR &3821 \ SPBLB \ erase space station bulb 'S' symbol A9 06 LDA #6 \ sun location up in the sky 85 4B STA &4B \ INWK+5 \ ysg A9 81 LDA #&81 \ new Sun 4C 68 37 JMP &3768 \ NWSHP \ new ship type Acc .KS2 \ -> &3DA1 \ frin shuffled, update Missiles A2 FF LDX #&FF .KSL4 \ counter X E8 INX \ starts at X=0 BD 11 03 LDA &0311,X \ FRIN,X \ nearby ship types F0 CB BEQ KS3 \ exit as end found, up temp P correct. C9 01 CMP #1 \ #MSL \ else this slot is a missile? D0 F6 BNE KSL4 \ not missile, loop X 8A TXA \ else, missile 0A ASL A \ slot*2 A8 TAY \ build index Y into B9 95 16 LDA &1695,Y \ UNIV,Y 85 07 STA &07 \ SC \ missile info lo B9 96 16 LDA &1696,Y \ UNIV+1,Y 85 08 STA &08 \ SC+1 \ missile info hi A0 20 LDY #32 \ info byte#32 is ai_attack_univ_ecm B1 07 LDA (&07),Y \ (SC),Y 10 E3 BPL KSL4 \ ai dumb, loop X 29 7F AND #&7F \ else, drop ai active bit 4A LSR A \ bit6, attack you, can be ignored here C5 96 CMP &96 \ XX4 \ kill target id 90 DC BCC KSL4 \ loop if missile doesn't have target XX4 F0 09 BEQ KS6 \ else found missile X with kill target XX4 E9 01 SBC #1 \ else update target -=1 0A ASL A \ update missile ai 09 80 ORA #&80 \ set bit7, ai is active. 91 07 STA (&07),Y \ (SC),Y D0 D1 BNE KSL4 \ guaranteed loop X .KS6 \ found missile X with kill target XX4 A9 00 LDA #0 \ missile dumb, no attack target. 91 07 STA (&07),Y \ (SC),Y F0 CB BEQ KSL4 \ guaranteed loop X .KILLSHP \ -> &3DD8 \ Kill target X Entry 86 96 STX &96 \ XX4 \ store kill target slot id E4 45 CPX &45 \ MSTG \ was targeted by player's missile? D0 0A BNE KS5 \ dstar, else no target for player's missile A0 EE LDY #&EE \ colour strip green for missile block 20 05 38 JSR &3805 \ ABORT \ draw missile block A9 C8 LDA #&C8 \ token = target lost 20 C6 45 JSR &45C6 \ MESS \ message and rejoin .KS5 \ dstar A4 96 LDY &96 \ XX4 \ kill target slot id BE 11 03 LDX &0311,Y \ FRIN,Y \ target ship type E0 02 CPX #2 \ #SST space station? F0 98 BEQ KS4 \ removing Space Station, up E0 1F CPX #&1F \ #CON D0 08 BNE lll \ not Constrictor, else AD 58 03 LDA &0358 \ TP \ mission uses lower 4 bits 09 02 ORA #2 \ set bit1 needed for constrictor kill. 8D 58 03 STA &0358 \ TP .lll \ not Constrictor E0 03 CPX #3 \ #ESC escape capsule is junk low 90 07 BCC KS7 \ not junk E0 0B CPX #11 \ #CYL cobra Mk3 is junk high B0 03 BCS KS7 \ not junk CE 3E 03 DEC &033E \ JUNK \ else removed plate, cargo, rock, shuttle, transporters .KS7 \ not junk, needs X = type DE 1E 03 DEC &031E,X \ MANY,X \ remove from sums of each type A6 96 LDX &96 \ XX4 \ reload kill target id, lost type. A0 05 LDY #5 \ target Hull byte#5 maxlines B1 1E LDA (&1E),Y \ (XX0),Y A0 21 LDY #33 \ info byte#33 is XX19, the ship heap pointer lo 18 CLC \ unwind lines pointer 71 20 ADC (&20),Y \ (INF),Y 85 1B STA &1B \ P \ new pointer lo C8 INY \ info byte#34 is XX19 hi B1 20 LDA (&20),Y \ (INF),Y 69 00 ADC #0 \ new pointer hi 85 1C STA &1C \ P+1 .KSL1 \ counter X shuffle higher ships down E8 INX \ above target id BD 11 03 LDA &0311,X \ FRIN,X \ nearby ship types 9D 10 03 STA &0310,X \ FRIN-1,X \ down one D0 03 BNE P%+5 \ type present, skip exit 4C A1 3D JMP &3DA1 \ KS2 \ else exit as frin shuffled, update Missiles up 0A ASL A \ build index A8 TAY \ for hull type B9 FE 55 LDA &55FE,Y \ XX21-2,Y 85 07 STA &07 \ SC \ hull data lo B9 FF 55 LDA &55FF,Y \ XX21-1,Y 85 08 STA &08 \ SC+1 \ hull data hi A0 05 LDY #5 \ higher Hull byte#5 maxlines B1 07 LDA (&07),Y \ (SC),Y 85 D1 STA &D1 \ T \ maxlines for ship heap after XX4 A5 1B LDA &1B \ P \ pointer temp lo 38 SEC E5 D1 SBC &D1 \ T \ maxlines for ship heap after XX4 85 1B STA &1B \ P \ pointer temp lo -= maxlines A5 1C LDA &1C \ P+1 E9 00 SBC #0 \ any carry 85 1C STA &1C \ P+1 8A TXA \ slot above target 0A ASL A \ build index A8 TAY \ for ship info B9 95 16 LDA &1695,Y \ UNIV,Y 85 07 STA &07 \ SC \ inf pointer of higher ship B9 96 16 LDA &1696,Y \ UNIV+1,Y 85 08 STA &08 \ SC+1 \ hi A0 24 LDY #36 \ NEWB of higher ship B1 07 LDA (&07),Y \ (SC),Y 91 20 STA (&20),Y \ (INF),Y 88 DEY \ info#byte35 = energy B1 07 LDA (&07),Y \ (SC),Y 91 20 STA (&20),Y \ (INF),Y 88 DEY \ info byte#34 = XX19 ship heap pointer hi B1 07 LDA (&07),Y \ (SC),Y 85 41 STA &41 \ K+1 \ heap pointer temp hi A5 1C LDA &1C \ P+1 \ pointer temp hi - maxlines 91 20 STA (&20),Y \ (INF),Y \ new XX19 hi 88 DEY \ info byte#33 = XX19 ship heap pointer lo B1 07 LDA (&07),Y \ (SC),Y 85 40 STA &40 \ K \ heap pointer temp lo A5 1B LDA &1B \ P \ pointer temp lo - maxlines 91 20 STA (&20),Y \ (INF),Y \ new XX19 lo 88 DEY \ #32 = rest of inwk, ai downwards. .KSL2 \ counter Y B1 07 LDA (&07),Y \ (SC),Y 91 20 STA (&20),Y \ (INF),Y 88 DEY \ next inwk byte 10 F9 BPL KSL2 \ loop Y A5 07 LDA &07 \ SC \ pointer for inf in slot above 85 20 STA &20 \ INF A5 08 LDA &08 \ SC+1 \ hi 85 21 STA &21 \ INF+1 A4 D1 LDY &D1 \ T \ maxlines for ship heap after XX4 counter .KSL3 \ counter Y 88 DEY \ move entries B1 40 LDA (&40),Y \ (K),Y \ on old heap to 91 1B STA (&1B),Y \ (P),Y \ new temp heap 98 TYA D0 F8 BNE KSL3 \ loop Y F0 8F BEQ KSL1 \ guaranteed up, shuffle higher slots remaining \ ---====== end of block E ==== onto block F ====---- &3E90 .SFX \ -> &3E90 \ block F1 Sound data 12 01 00 10 EQUD &10000112 \ Laser you fired Flush2 uses Envelope #1 Acc= 0 12 02 2C 08 EQUD &082C0212 \ Laset hit you Flush2 uses Envelope #2 Acc= 4 11 03 F0 18 EQUD &18F00311 \ Death_initial Flush1 uses Envelope #3 Acc= 8 10 F1 07 1A EQUD &1A07F110 \ Death_later or Kill Flush07 Acc=12 03 F1 BC 01 EQUD &01BCF103 \ Beep, high short NoFlush3 Acc=16 13 F4 0C 08 EQUD &080CF413 \ Beep, low long Flush3 Acc=20 10 F1 06 0C EQUD &0C06F110 \ Missile/Launch Flush06 Acc=24 10 02 60 10 EQUD &10600210 \ Hyperspace Flush0 uses Envelope #2 Acc=28 13 04 C2 FF EQUD &FFC20413 \ ECM_ON Flush3 uses Envelope #4 Acc=32 13 00 00 00 EQUD &00000013 \ ECM_OFF Acc=36 .THERE \ -> &3EB8 \ carry set if Gal 2 (144,33) for #CON mission AE 67 03 LDX &0367 \ GCNT \ galaxy count CA DEX D0 0E BNE THEX \ clc AD 59 03 LDA &0359 \ QQ0 \ present X C9 90 CMP #&90 \ #144 D0 07 BNE THEX \ clc AD 5A 03 LDA &035A \ QQ1 \ present Y C9 21 CMP #&21 \ #33 F0 01 BEQ P%+3 \ carry set .THEX 18 CLC 60 RTS .RESET \ -> &3ECE \ New player ship, reset controls 20 96 42 JSR &4296 \ ZERO \ zero-out &311-&34B A2 08 LDX #8 .SAL3 \ counter X 95 2A STA &2A,X \ BETA,X CA DEX 10 FB BPL SAL3 \ loop X .RES4 8A TXA \ Acc = #&FF A2 02 LDX #2 \ Restore forward, aft shields, and energy .REL5 \ counter X 9D A5 03 STA &03A5,X \ FSH,X \ forward shield CA DEX 10 FA BPL REL5 \ loop X .RES2 \ -> &3EE1 \ Reset2, done after launch or hyper, new dust. A9 12 LDA #18 \ #NOST 8D C3 03 STA &03C3 \ NOSTM \ number of stars, dust. A2 FF LDX #&FF \ bline buffers cleared, 78 bytes. 8E C0 0E STX &0EC0 \ LSX2 8E 0E 0F STX &0F0E \ LSY2 86 45 STX &45 \ MSTG \ missile has no target A9 80 LDA #&80 \ center joysticks 8D 4C 03 STA &034C \ JSTX \ joystick X 8D 4D 03 STA &034D \ JSTY \ joystick Y 0A ASL A \ = 0 85 8A STA &8A \ MCNT \ move count 85 2F STA &2F \ QQ22+1 \ outer hyperspace countdown A9 03 LDA #3 \ speed, but not alpha gentle roll 85 7D STA &7D \ DELTA AD 20 03 LDA &0320 \ SSPR \ space station present, 0 is SUN. F0 03 BEQ P%+5 \ if none, leave bulb off 20 21 38 JSR &3821 \ SPBLB \ space station bulb A5 30 LDA &30 \ ECMA \ any ECM on? F0 03 BEQ yu \ hop over as ECM not on 20 A3 43 JSR &43A3 \ ECMOF \ silence E.C.M. sound .yu \ hopped over 20 D8 35 JSR &35D8 \ WPSHPS \ wipe ships on scanner 20 96 42 JSR &4296 \ ZERO \ zero-out &311-&34B A9 FF LDA #&FF \ #(LS% MOD 256) 8D B0 03 STA &03B0 \ SLSP \ ship lines pointer reset to top LS% = &0CFF A9 0C LDA #&0C \ #(LS% DIV 256) 8D B1 03 STA &03B1 \ SLSP+1 \ hi 20 62 1F JSR &1F62 \ DIALS \ update flight console 20 A4 44 JSR &44A4 \ Uperc \ clear keyboard logger .ZINF \ -> &3F26 \ Zero information, ends with Acc = #&E0 A0 24 LDY #36 \ #(NI%-1) \ NI%=37 is size of inner working space A9 00 LDA #0 .ZI1 \ counter Y 99 46 00 STA &0046,Y \ INWK,Y 88 DEY 10 FA BPL ZI1 \ loop Y A9 60 LDA #&60 \ unity in rotation matrix 85 58 STA &58 \ INWK+18 \ rotmat1y hi 85 5C STA &5C \ INWK+22 \ rotmat2x hi 09 80 ORA #&80 \ -ve unity = #&E0 85 54 STA &54 \ INWK+14 \ rotmat0z hi = -1 60 RTS .msblob \ -> &3F3B \ update Missile blocks on console A2 04 LDX #4 \ number of missile blocks .ss \ counter X EC 8B 03 CPX &038B \ NOMSL \ compare Xreg to number of missiles F0 09 BEQ SAL8 \ remaining missiles are green A0 00 LDY #0 \ else black bar 20 3D 38 JSR &383D \ MSBAR \ draw missile block Xreg CA DEX \ next missile D0 F3 BNE ss \ loop X 60 RTS .SAL8 \ remaining missiles are green, counter X A0 EE LDY #&EE \ green 20 3D 38 JSR &383D \ MSBAR \ draw missile block Xreg CA DEX \ next missile D0 F8 BNE SAL8 \ loop X 60 RTS .me2 \ erase message from TT100 AD A4 03 LDA &03A4 \ MCH \ message id 20 C6 45 JSR &45C6 \ MESS \ message A9 00 LDA #0 8D 4A 03 STA &034A \ DLY \ delay printing = 0 4C CD 3F JMP &3FCD \ me3 \ back to TT100 .Ze \ -> &3F62 \ Zero ship and set coordinates, ends with dornd. 20 26 3F JSR &3F26 \ ZINF \ zero information 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 85 06 STA &06 \ T1 29 80 AND #&80 \ keep bit7 sign 85 48 STA &48 \ INWK+2 \ xsg left/right 8A TXA \ Xrnd = old rnd 29 80 AND #&80 \ keep bit7 sign 85 4B STA &4B \ INWK+5 \ ysg up/down A9 19 LDA #25 \ distance away 85 47 STA &47 \ INWK+1 \ xhi 85 4A STA &4A \ INWK+4 \ yhi 85 4D STA &4D \ INWK+7 \ zhi 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. C9 F5 CMP #245 \ carry set rarely 2A ROL A \ and goes into bit0, has ecm. 09 C0 ORA #&C0 \ set AI active and turn to attack 50% probability 85 66 STA &66 \ INWK+32 \ ai_attack_univ_ecm .DORND2 \ -> &3F85 \ Restricted for explosion dust. 18 CLC \ leave bit0 of RAND+2 at 0. .DORND \ -> &3F86 \ do random, new A, X. A5 00 LDA &00 \ RAND \ seed 0 2A ROL A AA TAX \ double lo 65 02 ADC &02 \ RAND+2 85 00 STA &00 \ RAND 86 02 STX &02 \ RAND+2 \ dornd2 would leave bit0 of RAND+2 at 0. A5 01 LDA &01 \ RAND+1 AA TAX \ store hi 65 03 ADC &03 \ RAND+3 \ bvs will see bit6 set here 85 01 STA &01 \ RAND+1 \ A rnd 86 03 STX &03 \ RAND+3 \ Xrnd = old A rnd 60 RTS .MTT4 \ -> &3F9A \ Spawn freighters 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 4A LSR A \ clear bit7, dumb ship, 50% prob has ecm. 85 66 STA &66 \ INWK+32 \ ai_attack_univ_ecm 85 63 STA &63 \ INWK+29 \ rotx counter, roll right usually damped 26 65 ROL &65 \ INWK+31 \ display exploding state|missiles = Arnd 29 0F AND #&0F \ max #15 09 10 ORA #&10 \ #16 min, #31 max. 85 61 STA &61 \ INWK+27 \ speed 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 30 0A BMI nodo \ 50% chance left dumb A5 66 LDA &66 \ INWK+32 \ ai_attack_univ_ecm 09 C0 ORA #&C0 \ 50% chance make ai active and aggresive 85 66 STA &66 \ INWK+32 \ ai_attack_univ_ecm A2 10 LDX #&10 \ set bit4 to docking, head to planet. 86 6A STX &6A \ INWK+36 \ NEWB .nodo \ 50% chance left dumb 29 02 AND #2 \ 0 or 2 of Arnd 69 0B ADC #11 \ type 11 or 13 + Crnd gives freighters 11to14 20 68 37 JSR &3768 \ NWSHP \ new ship type Acc .TT100 \ -> &3FC0 \ Start MAIN LOOP Spawnings 20 28 12 JSR &1228 \ MPERC \ M% in Block A has some flight controls CE 4A 03 DEC &034A \ DLY \ reduce delay F0 8C BEQ me2 \ if 0 erase messages, up 10 03 BPL me3 \ Spawnings EE 4A 03 INC &034A \ DLY \ else undershot, set to 0. .me3 \ -> &3FCD \ Spawnings C6 8A DEC &8A \ MCNT \ move count F0 03 BEQ P%+5 \ rarely do spawning, test misjump .ytq \ jmp mloop, yet to quit. 4C DB 40 JMP &40DB \ MLOOP \ usually down to clear stack, look at keys, up TT100. AD 41 03 LDA &0341 \ MJ \ mis-jump D0 F8 BNE ytq \ if stuck in witchspace, jmp mloop 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. C9 23 CMP #35 \ >= usually B0 4E BCS MTT1 \ down 80% of the time AD 3E 03 LDA &033E \ JUNK \ not ships C9 03 CMP #3 \ else junk rarely B0 47 BCS MTT1 \ already >= 3 enough junk 20 26 3F JSR &3F26 \ ZINF \ zero info A9 26 LDA #38 \ coordinates of new junk spawn 85 4D STA &4D \ INWK+7 \ zhi far away 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 85 46 STA &46 \ INWK \ xlo Arnd 86 49 STX &49 \ INWK+3 \ ylo Xrnd 29 80 AND #&80 \ bit7 of A rnd 85 48 STA &48 \ INWK+2 \ xsg left or right 8A TXA \ old rnd 29 80 AND #&80 \ bit7 of X rnd 85 4B STA &4B \ INWK+5 \ ysg 26 47 ROL &47 \ INWK+1 \ xhi rnd Carry 26 47 ROL &47 \ INWK+1 \ xhi not far off center 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 70 93 BVS MTT4 \ 50% prob up, Spawn freighters. 4C 9A 3F JMP &3F9A \ MTT4 \ else Spawn freighters also. Other versions just continue? \ This code not used in disc version 09 6F ORA #&6F \ set bits 6,5 3to0 85 63 STA &63 \ INWK+29 \ rotx counter, max roll with 50% prob no damping AD 20 03 LDA &0320 \ SSPR \ in space station present range? 0 is SUN. D0 1B BNE MTT1 \ down, else rocks exist. 8A TXA \ X rnd B0 08 BCS MTT2 \ 50% prob no speed max spin 29 1F AND #&1F \ speed max 31 09 10 ORA #&10 \ min 16 max 31 85 61 STA &61 \ INWK+27 90 04 BCC MTT3 \ guaranteed, speed done for junk .MTT2 \ 50% prob no speed, max spin 09 7F ORA #&7F \ max rotation, no damping, only sign clock/anti random. 85 64 STA &64 \ INWK+30 \ rotz counter pitch .MTT3 \ speed done for junk 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. C9 0A CMP #10 \ likely carry set 90% of time. 29 01 AND #1 \ 0 or 1 + carry 69 05 ADC #5 \ 6 or 7 = Asteroid or boulder or cargo rarely 20 68 37 JSR &3768 \ NWSHP \ new ship type Acc .MTT1 \ 80% of the time or junk >= 3, or in SS range. AD 20 03 LDA &0320 \ SSPR F0 03 BEQ P%+5 \ hop over jump to main loop if In deep space .MLOOPS \ -> &4032 \ Main loop step 4C DB 40 JMP &40DB \ MLOOP \ main loop \ In deep space 20 A6 41 JSR &41A6 \ BAD \ affected by QQ20(3,6,10), 32 tons of Slaves, Narcotics 0A ASL A \ boost to possible FIST. AE 2E 03 LDX &032E \ MANY + 16 \ number of COPS F0 03 BEQ P%+5 \ if no cops present no change to legal status 0D 8C 03 ORA &038C \ FIST \ else Fugitative/Innocent status or'd to Acc of BAD 85 D1 STA &D1 \ T \ new legal 20 62 3F JSR &3F62 \ Ze \ Zero for new ship, new inwk coords, ends with dornd and T1 = rnd too. C5 D1 CMP &D1 \ T \ if rnd >= new legal B0 05 BCS anycop \ if mild unlikely to make Cop A9 10 LDA #16 \ else make COPS 20 68 37 JSR &3768 \ NWSHP \ new ship type Acc .anycop \ -> &404F AD 2E 03 LDA &032E \ MANY+16 \ number of COPS D0 DE BNE MLOOPS \ jump to main loop if cops now present CE 49 03 DEC &0349 \ EV \ else reduce extra vessels spawning delay 10 D9 BPL MLOOPS \ jump to main loop if +ve EE 49 03 INC &0349 \ EV \ else undershot, set extra vessels = 0 AD 58 03 LDA &0358 \ TP \ No cops. Mission uses lower 4 bits 29 0C AND #&0C \ keep bit3,2 C9 08 CMP #8 \ only bit3 set? D0 0A BNE nopl \ not thargoid plans mission 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. C9 C8 CMP #200 \ < 200 more likely 90 03 BCC nopl \ rnd >= 200 makes thargoid not just pirates .fothg2 \ found thargoid 20 0E 32 JSR &320E \ GTHG \ get thargoid ship .nopl \ not thargoid plans mission 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. AC AE 03 LDY &03AE \ gov \ government of present system F0 0B BEQ anarchy C9 78 CMP #120 \ else safer systems B0 B7 BCS MLOOPS \ likely to main loop 29 07 AND #7 \ rnd7 CD AE 03 CMP &03AE \ gov 90 B0 BCC MLOOPS \ main loop likely for large governments .anarchy \ -> &4082 20 62 3F JSR &3F62 \ Ze \ Zero for new ship, new inwk coords, ends with dornd and T1 = rnd too. C9 64 CMP #100 \ Arnd >= 100 ? B0 28 BCS mt1 \ likely Pirates EE 49 03 INC &0349 \ EV \ else extra vessels delayed 29 03 AND #3 \ rnd3 for bounty hunter 69 18 ADC #24 \ CYL#2 +0to3 A8 TAY \ store type hunter 20 B8 3E JSR &3EB8 \ THERE \ carry set if Gal 2 (144,33) 90 11 BCC NOCON \ no Constrictor A9 F9 LDA #&F9 \ set active ai, quite aggressive, has ecm. 85 66 STA &66 \ INWK+32 \ ai_attack_univ_ecm AD 58 03 LDA &0358 \ TP \ mission uses lower 4 bits 29 03 AND #3 \ keep bits 1,0. 4A LSR A \ if bit0 clear 90 05 BCC NOCON \ no Constrictor 0D 3D 03 ORA &033D \ MANY+31 \ Constrictor already present or done F0 02 BEQ YESCON \ else create Constrictor .NOCON \ no Constrictor 98 TYA \ else restore type other bounty hunter 2C EQUB &2C \ bit2 skip load to NWSHP .YESCON \ create Constrictor A9 1F LDA #31 \ type #CON is Constrictor 20 68 37 JSR &3768 \ NWSHP \ New Ship type Acc .mj1 \ main loop jump 4C DB 40 JMP &40DB \ MLOOP \ Main Loop .mt1 \ -> &40B2 \ Pirates 29 03 AND #3 \ rnd 0to3 8D 49 03 STA &0349 \ EV \ extra vessels, delay further spawnings. 85 89 STA &89 \ XX13 \ pirate counter .mt3 \ counter XX13 ships needed 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 85 D1 STA &D1 \ T 20 86 3F JSR &3F86 \ DORND 25 D1 AND &D1 \ T 29 07 AND #7 \ 0to7 towards low end 8D D2 0F STA &0FD2 \ CPIR \ pirate range .more \ counter CPIR, find valid ship. AD D2 0F LDA &0FD2 \ CPIR \ pirate offset 69 11 ADC #&11 \ #17+0to7 = #17to#24, if they exist in ship data. 20 68 37 JSR &3768 \ NWSHP \ new ship type Acc B0 05 BCS P%+7 \ success, next XX13 ev CE D2 0F DEC &0FD2 \ CPIR \ else reduce range pirate offset 10 F1 BPL more \ loop CPIR offset, find valid ship. C6 89 DEC &89 \ XX13 \ next ship needed 10 DE BPL mt3 \ loop XX13 .MLOOP \ -> &40DB \ MAIN loop ending A2 FF LDX #&FF \ Clear Stack 9A TXS \ to Stack AE 47 03 LDX &0347 \ GNTMP \ gun temperature F0 03 BEQ EE20 \ cold laser CE 47 03 DEC &0347 \ GNTMP .EE20 \ cold laser 20 62 1F JSR &1F62 \ DIALS \ update flight console A5 87 LDA &87 \ QQ11 \ menu i.d. F0 0B BEQ P%+13 \ if space view skip small delay and visit TT17 2D C9 03 AND &03C9 \ PATG \ Mask to scan keyboard X-key, for misjump. 4A LSR A \ carry loaded? B0 05 BCS P%+7 \ skip delay A0 02 LDY #2 \ small length of delay counter 20 30 55 JSR &5530 \ DELAY 20 1F 3D JSR &3D1F \ TT17 \ returns with X,Y from arrow keys or joystick used .FRCE \ -> &40FB \ forced Key entry into main loop 20 01 41 JSR &4101 \ TT102 \ Switchyard for Red keys 4C C0 3F JMP &3FC0 \ TT100 \ loop up to Start MAIN LOOP Spawnings .TT102 \ -> &4101 \ Switchyard for Red keys C9 76 CMP #&76 \ red key #f8 D0 03 BNE P%+5 \ commander 4C 83 1C JMP &1C83 \ STATUS C9 14 CMP #&14 \ red key #f4 D0 03 BNE P%+5 \ Long range galactic chart 4C EB 2C JMP &2CEB \ TT22 C9 74 CMP #&74 \ red key #f5 D0 03 BNE P%+5 \ Short range chart 4C BE 2E JMP &2EBE \ TT23 C9 75 CMP #&75 \ red key #f6 D0 06 BNE TT92 \ switchyard continue 20 75 2F JSR &2F75 \ TT111 \ closest to QQ9,10 4C 73 2B JMP &2B73 \ TT25 \ DATA on system .TT92 \ switchyard continue C9 77 CMP #&77 \ red key #f9 D0 03 BNE P%+5 \ Inventory 4C 15 2E JMP &2E15 \ TT213 C9 16 CMP #&16 \ red key #f7 D0 03 BNE P%+5 \ MktP Market place menu screen 4C 60 31 JMP &3160 \ TT167 C9 20 CMP #&20 \ red key #f0 D0 03 BNE fvw \ forward view not 4C 92 32 JMP &3292 \ TT110 \ else Launch ship decision .fvw \ forward view not C9 71 CMP #&71 \ red key #f1 90 0A BCC keys \ not red key C9 74 CMP #&74 \ > #f4 B0 06 BCS keys \ not red key 29 03 AND #3 \ else #f1 #f2 #f3 AA TAX \ views 1to3 4C 93 54 JMP &5493 \ LOOK1 \ start view X .keys \ not red key C9 54 CMP #&54 \ key 'H' D0 03 BNE NWDAV5 \ not H else 4C 11 30 JMP &3011 \ hyp \ Start hyperspace code .NWDAV5 \ not H C9 32 CMP #&32 \ key 'D' F0 3D BEQ T95 \ Distance to system 85 06 STA &06 \ T1 \ protect Acc key A5 87 LDA &87 \ QQ11 \ menu i.d. 29 C0 AND #&C0 \ short or long range chart? F0 16 BEQ TT107 \ no, just run Countdown A5 2F LDA &2F \ QQ22+1 \ outer hyperspace countdown D0 12 BNE TT107 \ lock chart keys, running Countdown A5 06 LDA &06 \ T1 \ restore Acc key C9 36 CMP #&36 \ key 'O' D0 09 BNE ee2 \ not O, else recenter cursor 20 65 2E JSR &2E65 \ TT103 \ erase small cross hairs at target hyperspace system 20 68 3D JSR &3D68 \ ping \ move to home coordinates 20 65 2E JSR &2E65 \ TT103 \ draw small cross hairs at target hyperspace .ee2 \ not O 20 38 2E JSR &2E38 \ TT16 \ Xreg and Yreg values used to shift cross-hairs on charts by .TT107 \ run Countdown A5 2F LDA &2F \ QQ22+1 \ outer hyperspace countdown F0 1A BEQ t95 \ rts C6 2E DEC &2E \ QQ22+0 \ inner-countdown D0 16 BNE t95 \ rts A6 2F LDX &2F \ QQ22+1 CA DEX \ decrease outer hyperspace countdown 20 AC 30 JSR &30AC \ ee3 \ print hyperspace countdown in X A9 05 LDA #5 \ reset inner countdown 85 2E STA &2E \ QQ22+0 \ inner-countdown A6 2F LDX &2F \ QQ22+1 \ old outer hyperspace countdown 20 AC 30 JSR &30AC \ ee3 \ erase old hyperspace countdown C6 2F DEC &2F \ QQ22+1 \ decrease old outer hyperspace countdown D0 03 BNE t95 \ rts 4C 54 32 JMP &3254 \ TT18 \ else HSPC Countdown finished, (try) go through Hyperspace. .t95 \ rts 60 RTS .T95 \ 'D' pressed, Distance to system A5 87 LDA &87 \ QQ11 29 C0 AND #&C0 \ short or long range chart? F0 F9 BEQ t95 \ no, rts 20 FE 32 JSR &32FE \ hm \ move hyperspace cross-hairs to QQ9,10 target 85 72 STA &72 \ QQ17 \ All letters Uppercase 20 0A 33 JSR &330A \ cpl \ print Planet name for seed QQ15 A9 80 LDA #&80 \ Only first letter Uppercase 85 72 STA &72 \ QQ17 A9 01 LDA #1 \ left 85 2C STA &2C \ XC E6 2D INC &2D \ YC \ next row 4C 3B 2B JMP &2B3B \ TT146 \ Non-zero distance in Light years .BAD \ -> &41A6 \ Legal status from Cargo scan AD 72 03 LDA &0372 \ QQ20+3 \ cargo slaves 18 CLC 6D 75 03 ADC &0375 \ QQ20+6 \ narcotics 0A ASL A \ slaves and narcotics penalty doubled 6D 79 03 ADC &0379 \ QQ20+10 \ add firearms 60 RTS \ FIST = 64 is cop-killer. Same as 32 tons of Slave or Narcotics. .FAROF \ -> &41B2 \ for docking computer, Carry is clear if hi >= #&E0 A9 E0 LDA #&E0 \ distance hi far enough away .FAROF2 \ -> &41B4 \ carry set if Acc >= hi C5 47 CMP &47 \ INWK+1 \ xhi 90 06 BCC MA34 \ rts C5 4A CMP &4A \ INWK+4 \ yhi 90 02 BCC MA34 \ rts C5 4D CMP &4D \ INWK+7 \ zhi .MA34 \ rts 60 RTS .MAS4 \ -> &41BF \ All hi coord or'd 05 47 ORA &47 \ INWK+1 \ xhi 05 4A ORA &4A \ INWK+4 \ yhi 05 4D ORA &4D \ INWK+7 \ zhi 60 RTS .DEATH \ -> &41C6 \ Player killed in Flight 20 B1 43 JSR &43B1 \ EXNO3 \ ominous noises 20 E1 3E JSR &3EE1 \ RES2 \ reset2 06 7D ASL &7D \ DELTA \ speed 06 7D ASL &7D \ DELTA \ *=4 A2 18 LDX #24 \ 24 text rows 20 19 36 JSR &3619 \ DET1 20 C8 54 JSR &54C8 \ TT66 \ box border with QQ11 menu id set to Acc = 6 20 EB 54 JSR &54EB \ BOX \ border removed 20 B5 35 JSR &35B5 \ nWq \ new dust A9 0C LDA #12 \ middle 85 2D STA &2D \ YC 85 2C STA &2C \ XC A9 92 LDA #&92 \ Token = Game Over 20 2D 34 JSR &342D \ ex \ extra tokens .D1 \ counter FRIN+4 empty 20 62 3F JSR &3F62 \ Ze \ Zero for new ship, new inwk coords 4A LSR A \ ends with dornd and T1 = rnd too. /=2 4A LSR A \ Arnd 63 max 85 46 STA &46 \ INWK+0 \ xlo reduced A0 00 LDY #0 \ set below to 0 84 87 STY &87 \ QQ11 \ menu id now space view. 84 47 STY &47 \ INWK+1 \ xhi 84 4A STY &4A \ INWK+4 \ yhi 84 4D STY &4D \ INWK+7 \ zhi 84 66 STY &66 \ INWK+32 \ ai dumb, no ecm. 88 DEY \ #&FF 84 8A STY &8A \ MCNT \ move count 8C 46 03 STY &0346 \ LASCT \ laser count 49 2A EOR #&2A \ flip every other bit below 64 0010 1010 85 49 STA &49 \ INWK+3 \ ylo 09 50 ORA #&50 \ flick away 85 4C STA &4C \ INWK+6 \ zlo 8A TXA \ rnd X 29 8F AND #&8F \ keep sign, but max 15 85 63 STA &63 \ INWK+29 \ rotx counter roll 6A ROR A \ might set carry 29 87 AND #&87 \ keep sign, but max 7 85 64 STA &64 \ INWK+30 \ rotz counter pitch A2 05 LDX #5 \ Type #OIL cargo default AD 07 56 LDA &5607 \ XX21-1+2*4 \ pointer to plate info F0 03 BEQ D3 \ no plate in ship data file, use cargo cannister 90 01 BCC D3 \ 50% rnd no plate CA DEX \ else plate .D3 \ no plate 20 1D 25 JSR &251D \ fq1 \ type X cargo/alloys in explosion 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 29 80 AND #&80 \ keep bit7 rnd to remove ship A0 1F LDY #31 \ display explosion state|missiles 91 20 STA (&20),Y \ (INF),Y \ Prob 50% to kill AD 15 03 LDA &0315 \ FRIN+4 \ 4th slot for nearby craft F0 BA BEQ D1 \ loop next debris 20 A4 44 JSR &44A4 \ Uperc \ clear keyboard logger 85 7D STA &7D \ DELTA \ speed .D2 \ counter LASCT laser count 20 28 12 JSR &1228 \ MPERC \ M% block A. Some flight controls AD 46 03 LDA &0346 \ LASCT \ laser count was reduced in M% D0 F8 BNE D2 \ loop A2 1F LDX #31 \ restore all 31 20 19 36 JSR &3619 \ DET1 \ text rows 4C 20 12 JMP &1220 \ DEATH2 \ reset2 maybe load Dock code .RSHIPS \ -> &4244 \ Reset ships, flight code about to start. 20 55 42 JSR &4255 \ LSHIPS \ Load ship(s) files 20 CE 3E JSR &3ECE \ RESET \ new player ship, controls, dust field. A9 FF LDA #&FF \ Docked flag set 85 8E STA &8E \ QQ12 85 87 STA &87 \ QQ11 \ menu id max A9 20 LDA #&20 \ red key #f0, forward view. 4C FB 40 JMP &40FB \ FRCE \ forced entry into keyboard main loop .LSHIPS \ -> &4255 \ Load ship(s) files 20 B8 3E JSR &3EB8 \ THERE \ carry set if Gal 2 (144,33) #CON mission A9 06 LDA #6 \ added to file 'A' B0 22 BCS SHIPinA \ #CON mission, File 'G' is of interest. 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 29 03 AND #3 \ rnd0to3 AE AE 03 LDX &03AE \ gov \ of present system E0 03 CPX #3 \ high gov leaves carry set 2A ROL A \ odd ones are high gov, 7 max. AE AF 03 LDX &03AF \ tek \ techlevel of present system E0 0A CPX #10 \ if tl > 10 leaves carry set for dodo station 2A ROL A \ 15 max, odd ones are dodo AA TAX \ Xreg = 15 max AD 58 03 LDA &0358 \ TP \ mission uses lower 4 bits 29 0C AND #&0C \ keep both bits 3,2 C9 08 CMP #8 \ bit 3 set but not bit 2 D0 06 BNE TPnot8 \ else thargoid plan mission ongoing 8A TXA \ recall 15 max 29 01 AND #1 \ keep bit for Dodo vs Coriolis 09 02 ORA #2 \ need Thargoid ship data files AA TAX \ 2or3 = 'C' or 'D' for Coriolis or Dodo with Thargoids. .TPnot8 \ also not Thargoid plans allows Xreg=15 max 8A TXA \ ship file name char offset .SHIPinA \ -> &427E \ Load ship file 'A' + Acc 18 CLC 69 41 ADC #&41 \ 'A' first ship file 8D 94 42 STA &4294 \ SHIPI+6 \ '0' replaced by AtoM 20 7A 0D JSR &0D7A \ reload disc cat A2 8E LDX #&8E \ #(SHIPI MOD 256) A0 42 LDY #&42 \ #(SHIPI DIV 256) 4C F7 FF JMP &FFF7 \ OSCLI \ MOS command using SHIPI string .SHIPI \ -> &428E \ MOS command string 4C 2E 44 EQUS "L.D \ *LOAD from Directory D 2E 4D 4F EQUS ".MO" 30 0D EQUS "0": EQUB &0D \ SHIPI+6 \ becomes MOA etc .ZERO \ -> &4296 \ Zero-out &311-&34B A2 3A LDX #&3A \ #(de-FRIN) \ de = &34B A9 00 LDA #0 \ zero-out .ZEL2 \ counter X 9D 11 03 STA &0311,X \ FRIN,X CA DEX \ the slot for each ship and onwards to de. 10 FA BPL ZEL2 \ loop X 60 RTS .ZES1 \ -> &42A1 \ Zero page X 86 08 STX &08 \ SC+1 \ pointer hi A9 00 LDA #0 \ zero-out 85 07 STA &07 \ SC A8 TAY \ Y = 0 .ZEL1 \ counter Y 91 07 STA (&07),Y \ (SC),Y 88 DEY \ next byte D0 FB BNE ZEL1 \ loop Y 60 RTS .SPS1 \ -> &42AE \ XX15 vector to planet A2 00 LDX #0 \ xcoord planet 20 1F 37 JSR &371F \ SPS3 \ planet for space compass into K3(0to8) A2 03 LDX #3 \ ycoord 20 1F 37 JSR &371F \ SPS3 A2 06 LDX #6 \ zcoord 20 1F 37 JSR &371F \ SPS3 .TAS2 \ -> &42BD \ XX15=r~96 \ their comment build XX15 from K3 A5 D2 LDA &D2 \ K3+0 05 D5 ORA &D5 \ K3+3 05 D8 ORA &D8 \ K3+6 09 01 ORA #1 \ not zero 85 DB STA &DB \ K3+9 \ lo or'd max A5 D3 LDA &D3 \ K3+1 \ x hi 05 D6 ORA &D6 \ K3+4 \ y hi 05 D9 ORA &D9 \ k3+7 \ z hi .TAL2 \ roll Acc = xyz hi 06 DB ASL &DB \ K3+9 \ all lo max 2A ROL A \ all hi max B0 0E BCS TA2 \ exit when xyz hi*=2 overflows 06 D2 ASL &D2 \ K3+0 \ xlo 26 D3 ROL &D3 \ K3+1 \ xhi*=2 06 D5 ASL &D5 \ K3+3 \ ylo 26 D6 ROL &D6 \ K3+4 \ yhi*=2 06 D8 ASL &D8 \ K3+6 \ zlo 26 D9 ROL &D9 \ k3+7 \ zhi*=2 90 ED BCC TAL2 \ loop roll Acc xyz hi .TA2 \ -> &42E0 \ exited, Build XX15(0to2) from (raw) K3(1to8) A5 D3 LDA &D3 \ K3+1 \ xhi 4A LSR A \ clear bit7 for sign 05 D4 ORA &D4 \ K3+2 \ xsg 85 34 STA &34 \ XX15+0 \ xunit, bit7 is xsign A5 D6 LDA &D6 \ K3+4 \ yhi 4A LSR A 05 D7 ORA &D7 \ K3+5 \ ysg 85 35 STA &35 \ XX15+1 \ yunit, bit7 is ysign A5 D9 LDA &D9 \ k3+7 \ zhi 4A LSR A 05 DA ORA &DA \ K3+8 \ zsg 85 36 STA &36 \ XX15+2 \ zunit, bit7 is zsign .NORM \ -> &42F5 \ Normalize 3-vector length of XX15 A5 34 LDA &34 \ XX15+0 20 0B 28 JSR &280B \ SQUA \ P.A =A7*A7 x^2 85 82 STA &82 \ R \ hi sum A5 1B LDA &1B \ P \ lo 85 81 STA &81 \ Q \ lo sum A5 35 LDA &35 \ XX15+1 20 0B 28 JSR &280B \ SQUA \ P.A =A7*A7 y^2 85 D1 STA &D1 \ T \ temp hi A5 1B LDA &1B \ P \ lo 65 81 ADC &81 \ Q 85 81 STA &81 \ Q A5 D1 LDA &D1 \ T \ hi 65 82 ADC &82 \ R 85 82 STA &82 \ R A5 36 LDA &36 \ XX15+2 20 0B 28 JSR &280B \ SQUA \ P.A =A7*A7 z^2 85 D1 STA &D1 \ T A5 1B LDA &1B \ P \ lo 65 81 ADC &81 \ Q 85 81 STA &81 \ Q \ xlo2 + ylo2 + zlo2 A5 D1 LDA &D1 \ T \ temp hi 65 82 ADC &82 \ R 85 82 STA &82 \ R 20 B8 47 JSR &47B8 \ LL5 \ Q = SQR(Qlo.Rhi), Q <~127 A5 34 LDA &34 \ XX15+0 20 FF 46 JSR &46FF \ TIS2 \ *96/Q 85 34 STA &34 \ XX15+0 \ xunit A5 35 LDA &35 \ XX15+1 20 FF 46 JSR &46FF \ TIS2 85 35 STA &35 \ XX15+1 \ yunit A5 36 LDA &36 \ XX15+2 20 FF 46 JSR &46FF \ TIS2 85 36 STA &36 \ XX15+2 \ zunit .NO1 60 RTS \ end of norm .RDKEY \ -> &433F \ read Key from #16 upwards A2 10 LDX #16 \ Keyboard Scan will start from #16, Q,3,4 etc .Rd1 \ counter X 20 39 44 JSR &4439 \ DKS4 \ keyboard scan from X, returned in X and A. 30 04 BMI Rd2 \ -ve Acc key found, Drop to Rd2 E8 INX \ = 0? 10 F8 BPL Rd1 \ loop X else 8A TXA \ #&FF if nothing found .Rd2 \ -ve Acc key 49 80 EOR #&80 \ #&7F is nothing found AA TAX \ Xreg is key for storing in KL 60 RTS .WARP \ -> &434E \ Jump J key was hit. Esc, cargo, asteroid, transporter dragged with you. AE 3E 03 LDX &033E \ JUNK \ not ships BD 13 03 LDA &0313,X \ FRIN+2,X \ more entries than just junk? 0D 20 03 ORA &0320 \ SSPR \ space station present 0D 41 03 ORA &0341 \ MJ \ mis-jump D0 43 BNE WA1 \ Warning noise #40 jump failed AC 08 09 LDY &0908 \ allwk+8 \ planet zsg 30 07 BMI WA3 \ planet behind A8 TAY \ A = Y = 0 for planet 20 43 1C JSR &1C43 \ MAS2 \ or'd x,y,z coordinate of &902+Y to A. 4A LSR A \ ignore lowest bit of sg F0 37 BEQ WA1 \ Warning, as planet too close .WA3 \ planet behind AC 2D 09 LDY &092D \ allwk+37+8 \ Sun zsg 30 08 BMI WA2 \ sun behind A0 25 LDY #37 \ NI% for Sun 20 41 1C JSR &1C41 \ m \ max of x,y,z at &902+Y to A. 4A LSR A \ ignore lowest bit of sg F0 2A BEQ WA1 \ Warning, as Sun too close .WA2 \ sun behind, Shift. A9 81 LDA #&81 \ shift sun and planet zsg 85 83 STA &83 \ S \ hi 85 82 STA &82 \ R \ lo 85 1B STA &1B \ P \ lo AD 08 09 LDA &0908 \ allwk+8 \ planet zsg 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S = &81.zsg + &81.&81 8D 08 09 STA &0908 \ allwk+8 AD 2D 09 LDA &092D \ allwk+37+8 \ Sun zsg 20 FF 28 JSR &28FF \ ADD \ X.A = P.A + R.S 8D 2D 09 STA &092D \ allwk+37+8 A9 01 LDA #1 \ menu id 85 87 STA &87 \ QQ11 85 8A STA &8A \ MCNT \ move count 4A LSR A \ #0 8D 49 03 STA &0349 \ EV \ extra vessels AE 45 03 LDX &0345 \ VIEW \ forward 4C 93 54 JMP &5493 \ LOOK1 \ start view X .WA1 \ Warning sound A9 28 LDA #40 \ noise #40 D0 50 BNE NOISE \ guaranteed hop .ECMOF \ -> &43A3 \ Sound of ECM system off A9 00 LDA #0 \ not active 85 30 STA &30 \ ECMA 8D 40 03 STA &0340 \ ECMP \ player's not on 20 1B 38 JSR &381B \ ECBLB \ ecm bulb switch A9 48 LDA #72 \ becomes noise Yindex = 39 D0 42 BNE NOISE \ guaranteed hop .EXNO3 \ -> &43B1 \ called when DEATH occurs. Ominous noises, two noises, A=16,24 A9 10 LDA #16 \ becomes Yindex = 11 20 F3 43 JSR &43F3 \ NOISE A9 18 LDA #24 \ becomes Yindex = 15 rumble D0 39 BNE NOISE \ guaranteed hop .BEEP \ -> &43BA \ Missile lock target A9 20 LDA #32 \ becomes Y= 19 D0 35 BNE NOISE \ guaranteed hop .SFRMIS \ -> &43BE \ Sound fire missile A2 01 LDX #1 \ #MSL missile 20 90 25 JSR &2590 \ SFS1-2 \ spawn missile with ai=#&FE max but no ecm 90 53 BCC KYTB \ rts as failed to launch A9 78 LDA #&78 \ token = incoming missile 20 C6 45 JSR &45C6 \ MESS \ message .NOISFR \ -> &42CA \ Fired noise A9 30 LDA #48 \ becomes Y = 27 D0 25 BNE NOISE \ guaranteed hop .EXNO2 \ -> &43CE \ faint death noise, player killed ship. EE 9F 03 INC &039F \ TALLY \ kills lo D0 08 BNE EXNO-2 \ no carry hop to ldx #7 EE A0 03 INC &03A0 \ TALLY+1 \ kills hi A9 65 LDA #&65 \ token = right on commander ! 20 C6 45 JSR &45C6 \ MESS \ message A2 07 LDX #7 \ mask for sound distance .EXNO \ -> &43DD \ Explosion noise distance X 86 D1 STX &D1 \ T \ distance A9 18 LDA #24 \ Rumble later becomes Yindex = 15 20 04 44 JSR &4404 \ NOS1 \ build sound y index A5 4D LDA &4D \ INWK+7 \ zhi 4A LSR A \ /=2 4A LSR A \ #&3F max 25 D1 AND &D1 \ T \ could be #7 09 F1 ORA #&F1 \ adjust sound amplitude by distance away 85 0B STA &0B \ XX16+2 20 F6 43 JSR &43F6 \ NO3 \ Sound block ready A9 10 LDA #16 \ becomes Yindex = 11 .NOISE \ -> &43F3 \ Sound based on Acc 20 04 44 JSR &4404 \ NOS1 \ build sound y index .NO3 \ -> &43F6 \ Sound block ready AE C6 03 LDX &03C6 \ DNOIZ \ sound toggle D0 1D BNE KYTB \ rts A2 09 LDX #9 \ #(XX16 MOD 256) A0 00 LDY #0 \ #(XX16 DIV 256) on zero page A9 07 LDA #7 \ SOUND 4C F1 FF JMP &FFF1 \ OSWORD .NOS1 \ -> &4404 \ build sound y index 4A LSR A \ /=2 and carry cleared 69 03 ADC #3 \ +=3 top of block A8 TAY \ Yindex = last byte needed from group of A2 07 LDX #7 \ 4 words .NOL1 \ counters X,Y A9 00 LDA #0 \ upper byte 95 09 STA &09,X \ XX16,X CA DEX \ Sound parameter block B9 90 3E LDA &3E90,Y \ SFX,Y \ lower byte 95 09 STA &09,X \ XX16,X 88 DEY \ next lo CA DEX \ next byte 10 F2 BPL NOL1 \ loop Y,X .KYTB \ -> &4418 \ Starting point for keyboard table 60 RTS E8 E2 E6 E7 EQUD &E7E6E2E8 \ ? <> C2 D1 C1 60 EQUD &60C1D1C2 \ XSA tab 70 23 35 65 EQUD &65352370 \ esc TUM 22 45 52 37 EQUD &37524511 \ EJCP .DKS1 \ -> &4429 \ Detect flight keystroke Y for use in MPERC M% BE 18 44 LDX &4418,Y \ KYTB,Y 20 39 44 JSR &4439 \ DKS4 \ scan from key X, returned in X and A. 10 20 BPL DKS2-1 \ rts A9 FF LDA #&FF \ keyboard logger 99 00 03 STA &0300,Y \ KL,Y 60 RTS .CTRL \ -> &4437 \ Scan all keys from Ctrl upwards A2 01 LDX #1 .DKS4 \ -> &4439 \ Keyboard scan from X upwards, returned in X and A. A9 03 LDA #3 78 SEI \ set interrupt 8D 40 FE STA &FE40 \ keyboard write enable A9 7F LDA #&7F 8D 43 FE STA &FE43 \ set write to 7 lines of DDRA 8E 4F FE STX &FE4F \ send #1 (CTRL (scan from 1)) or #16 (Q,3,4 (scan from 16))) or >&80 to ORA AE 4F FE LDX &FE4F \ read whole IRA, A searched key found gives -ve. Otherwise get the key hit. Or #&FF for nothing. A9 0B LDA #&0B \ Send 1 to bit3 as latch bit 8D 40 FE STA &FE40 \ to ORB so keyboard write disable 58 CLI \ clear interrupt 8A TXA \ Acc = -ve if key hit 60 RTS .DKS2 \ -> &4452 \ Joystick *FX 128 channel X A9 80 LDA #&80 \ return 16bit ADC value X-low Y-high (all filled ADC 10 bit) 20 F4 FF JSR &FFF4 \ OSBYTE #&80 98 TYA \ if 1-4 ADVAL channels will return 16bit ADC value X-low Y-high (all filled ADC 10 bit) 4D CC 03 EOR &03CC \ JSTE \ move Y to A then EOR A with JSTE if flip toggle needed 60 RTS .DKS3 \ -> &445C \ toggle Damping key Y whilst game frozen 84 D1 STY &D1 \ T \ store Y to compare to key hit X E4 D1 CPX &D1 \ T \ test against CAPS-LOCK, A, X, F, Y, J, K. D0 10 BNE Dk3 \ rts BD 87 03 LDA &0387,X \ DAMP-&40,X 49 FF EOR #&FF \ flip toggle 9D 87 03 STA &0387,X \ DAMP-&40,X 20 FA 1E JSR &1EFA \ BELL \ vdu 7 20 30 55 JSR &5530 \ DELAY \ with large Y = #40 to #48 A4 D1 LDY &D1 \ T \ restore key .Dk3 60 RTS \ #&46 Does K toggle keyboard/joystick control - certainly makes keyboard not work anymore. \ #&45 Does J reverse both joystick channels \ #&44 Does Y reverse joystick Y channel \ #&43 Does F toggle flashing information \ #&42 Does X toggle startup message display ? PATG? \ #&41 Does A toggle keyboard auto-recentering ? \ #&40 Caps-lock toggles keyboard flight damping .DKJ1 \ JSTK not zero. Joystick option - but speed still done by ? and SPACE AD 3F 03 LDA &033F \ DAUTO D0 4F BNE auton \ auto docking A0 01 LDY #1 \ Key '?' = slow down 20 29 44 JSR &4429 \ DKS1 \ Detect keystroke Y C8 INY \ #2 Key SPACE = speed up 20 29 44 JSR &4429 \ DKS1 \ Detect keystroke Y .BS1 \ Bitpaddle AD 40 FE LDA &FE40 \ ORB. PB4,5 Joystick 1,2 fire buttons, to zero when button pressed. AA TAX \ not used? 29 10 AND #&10 \ bit4 49 10 EOR #&10 \ flipped 8D 07 03 STA &0307 \ KL+7 \ keyboard logger A2 01 LDX #1 \ *FX #&80,1 ADC channel 1 20 52 44 JSR &4452 \ DKS2 09 01 ORA #1 \ hi is at least 1 8D 4C 03 STA &034C \ JSTX \ joystick X A2 02 LDX #2 \ *FX #&80,1 ADC channel 2 20 52 44 JSR &4452 \ DKS2 4D CB 03 EOR &03CB \ JSTGY \ Y reverse joystick Y channel 8D 4D 03 STA &034D \ JSTY \ joystick Y 4C 55 45 JMP &4555 \ DK4 \ done pitch & roll, keys need to be scanned. .Uperc \ -> &44A4 \ Clear keyboard logger A9 00 LDA #0 A0 10 LDY #16 \ set all 16 (not 15 of tape) keys to zero .DKL3 \ counter Y 99 00 03 STA &0300,Y \ KL,Y \ keyboard logger 88 DEY \ next key D0 FA BNE DKL3 \ loop Y 60 RTS .DOKEY \ -> &44AF \ return with X,Y from arrow keys or joystick used. KL has force key. 20 A4 44 JSR &44A4 \ Uperc \ Clear keyboard logger AD CD 03 LDA &03CD \ JSTK \ K toggle keyboard/joystick D0 BC BNE DKJ1 \ not zero is Joystick option, up. Speed still done by ? and SPACE 8D CE 03 STA &03CE \ JDB \ else @ toggle between keyboard and bitpaddle A0 07 LDY #7 \ key 'A' fire the laser. .DKL2 \ counter Y, first 7 keys are primary flight controls 20 29 44 JSR &4429 \ DKS1 \ Detect keystroke Y 88 DEY \ next primary flight controls D0 FA BNE DKL2 \ loop Y AD 3F 03 LDA &033F \ DAUTO \ auto docking = 0? F0 5F BEQ DK15 \ Manual flight, down. .auton \ player Auto docking 20 26 3F JSR &3F26 \ ZINF \ zero info, ends with A = #&E0. A9 60 LDA #&60 \ unity +1 85 54 STA &54 \ INWK+14 \ rotmat0z hi 09 80 ORA #&80 \ unity -1 85 5C STA &5C \ INWK+22 \ rotmat2x hi 85 8C STA &8C \ TYPE \ ship type = #&E0 if player docking A5 7D LDA &7D \ DELTA \ speed 85 61 STA &61 \ INWK+27 20 46 23 JSR &2346 \ DOCKIT \ docking ai updates this player's inwk A5 61 LDA &61 \ INWK+27 C9 16 CMP #22 \ clamp speed? 90 02 BCC P%+4 A9 16 LDA #22 \ clamp speed 85 7D STA &7D \ DELTA A9 FF LDA #&FF \ key hit in logger A2 00 LDX #0 \ key request A4 62 LDY &62 \ INWK+28 \ accel F0 06 BEQ DK11 \ Cruise 30 01 BMI P%+3 \ skip inx so key1 SPC speed up E8 INX \ else #1 = key2, Key ? slow down 9D 01 03 STA &0301,X \ KL+1,X \ keyboard logger+1 = #&FF .DK11 \ Cruise A9 80 LDA #&80 \ rotx sign mask also KL A2 00 LDX #0 \ key request 06 63 ASL &63 \ INWK+29 \ rotx counter F0 14 BEQ DK12 \ done Roll 90 01 BCC P%+3 \ skip inx so key3 < left E8 INX \ else #1 = key4 > right 24 63 BIT &63 \ INWK+29 \ rotx counter 10 07 BPL DK14 \ bit6 clear Moderate roll A9 40 LDA #&40 \ else big roll 8D 4C 03 STA &034C \ JSTX A9 00 LDA #0 \ clear key .DK14 \ Moderate roll A= #&80 9D 03 03 STA &0303,X \ KL+3,X \ '<' or '>' = 0 or #&80 AD 4C 03 LDA &034C \ JSTX .DK12 \ done Roll 8D 4C 03 STA &034C \ JSTX \ could be #&80 A9 80 LDA #&80 \ KL input A2 00 LDX #0 \ key request 06 64 ASL &64 \ INWK+30 \ rotz counter F0 09 BEQ DK13 \ done Pitch B0 01 BCS P%+3 \ skip inx so key5 X up E8 INX \ else #1 = key6 S down 9D 05 03 STA &0305,X \ KL+5,X \'X' or 'S' = #&80 AD 4D 03 LDA &034D \ JSTY .DK13 \ done Pitch 8D 4D 03 STA &034D \ JSTY \ could by #&80 .DK15 \ also Manual flight from above AE 4C 03 LDX &034C \ JSTX A9 07 LDA #7 \ twitch size AC 03 03 LDY &0303 \ KL+3 \ used '<' ? F0 03 BEQ P%+5 \ else skip bump2 20 16 2A JSR &2A16 \ BUMP2 \ increase X by Acc AC 04 03 LDY &0304 \ KL+4 \ used '>' ? F0 03 BEQ P%+5 \ else skip redu2 20 26 2A JSR &2A26 \ REDU2 \ reduce X by Acc 8E 4C 03 STX &034C \ JSTX \ Roll updated 0A ASL A \ twitch = #14 AE 4D 03 LDX &034D \ JSTY AC 05 03 LDY &0305 \ KL+5 \ used 'X' for climb? F0 03 BEQ P%+5 \ else skip redu2 20 26 2A JSR &2A26 \ REDU2 \ reduce X by Acc AC 06 03 LDY &0306 \ KL+6 \ used 'S' for dive? F0 03 BEQ P%+5 \ skip bump2 20 16 2A JSR &2A16 \ BUMP2 \ increase X by Acc 8E 4D 03 STX &034D \ JSTY \ Pitch updated .DK4 \ -> &4555 \ also Other keys need to be scanned 20 3F 43 JSR &433F \ RDKEY \ read key from #16 upwards 8E 00 03 STX &0300 \ KL \ store X in keyboard logger E0 69 CPX #&69 \ key 'COPY', the freeze game key. D0 3D BNE DK2 \ if no freeze requested Skip over .FREEZE \ start loop while game frozen, key X not 'DELETE' 20 F7 55 JSR &55F7 \ WSCAN \ Wait for line scan, ie whole frame completed. 20 3F 43 JSR &433F \ RDKEY \ read key from #16 upwards E0 51 CPX #&51 \ key 'S' D0 05 BNE DK6 \ not S A9 00 LDA #0 \ if non-zero will end noise 8D C6 03 STA &03C6 \ DNOIZ \ toggle .DK6 \ not S A0 40 LDY #&40 \ key CAPS-LOCK .DKL4 \ counter Y toggle 20 5C 44 JSR &445C \ DKS3 \ Toggle Damping key Y whilst game frozen C8 INY \ Counter Y increments through inkeys of A, X, F, Y, J, K C0 47 CPY #&47 \ until in-key value '@' D0 F8 BNE DKL4 \ loop Y, fall through afterwards. .DK55 E0 10 CPX #&10 \ key 'Q' quiet D0 03 BNE DK7 \ not Q 8E C6 03 STX &03C6 \ DNOIZ \ if non-zero will end noise .DK7 \ not Q E0 70 CPX #&70 \ key 'ESCAPE' D0 03 BNE P%+5 \ Hop over jmp death2 4C 20 12 JMP &1220 \ DEATH2 \ reset2 maybe load dock code E0 64 CPX #&64 \ key 'B' D0 0E BNE nobit \ not bitpaddle AD CE 03 LDA &03CE \ BSTK 49 FF EOR #&FF \ flip 8D CE 03 STA &03CE \ BSTK 8D CD 03 STA &03CD \ JSTK \ K toggle keyboard/joystick 8D CC 03 STA &03CC \ JSTE \ Joystick eor .nobit \ not bitpaddle E0 59 CPX #&59 \ key 'DELETE' was hit to un-freeze D0 C3 BNE FREEZE \ loop key X .DK2 \ else freeze Skipped over A5 87 LDA &87 \ QQ11 \ menu i.d. D0 14 BNE DK5 \ not a space view, rts A0 10 LDY #16 \ Space view. Y = Top of logged keys A9 FF LDA #&FF \ flag for keyboard logger .DKL1 \ counter Y for Upper logged keys needed for flight BE 18 44 LDX &4418,Y \ KYTB,Y EC 00 03 CPX &0300 \ KL \ key stored in keyboard logger D0 03 BNE DK1 \ hop key hit 99 00 03 STA &0300,Y \ KL,Y \ flag key X to keyboard logger .DK1 \ hopped key hit 88 DEY C0 07 CPY #7 \ only Upper logged keys D0 F0 BNE DKL1 \ loop Y .DK5 \ rts 60 RTS .me1 \ onto new message 8E 4A 03 STX &034A \ DLY \ delay set to 0 48 PHA \ store new token AD A4 03 LDA &03A4 \ MCH \ old message to erase 20 DD 45 JSR &45DD \ mes9 \ message output now 68 PLA \ restore new token 2C EQUB &2C \ bit2 skip lda .ou2 \ equipment lost is ecm A9 6C LDA #&6C \ token = ecm 2C EQUB &2C \ bit2 skip lda .ou3 \ equipment lost is fuel scoops A9 6F LDA #&6F \ token = fuel_scoops .MESS \ -> &45C6 \ Message start A2 00 LDX #0 \ all capital letters 86 72 STX &72 \ QQ17 A0 09 LDY #9 \ indent 84 2C STY &2C \ XC A0 16 LDY #22 \ near bottom row 84 2D STY &2D \ YC EC 4A 03 CPX &034A \ DLY \ is delay printing zero? D0 DE BNE me1 \ up, onto new message 8C 4A 03 STY &034A \ DLY \ new delay set to 22 8D A4 03 STA &03A4 \ MCH \ copy of token to erase .mes9 \ -> &45DD \ also message to erase 20 9A 33 JSR &339A \ TT27 \ process text token 4E 4B 03 LSR &034B \ de \ message flag for item + destroyed 90 CF BCC DK5 \ rts, else append A9 FD LDA #&FD \ token = ' DESTROYED' 4C 9A 33 JMP &339A \ TT27 .OUCH \ -> &45EA \ Shield depleted and taking hits to energy, lose cargo/equipment. 20 86 3F JSR &3F86 \ DORND \ do random, new A, X. 30 C5 BMI DK5 \ rts, 50% prob E0 16 CPX #22 \ max equipment B0 C1 BCS DK5 \ rts \ item too high BD 6F 03 LDA &036F,X \ QQ20,X \ cargo or equipment F0 BC BEQ DK5 \ dont have, rts. AD 4A 03 LDA &034A \ DLY \ delay printing already going on D0 B7 BNE DK5 \ rts A0 03 LDY #3 \ also Acc now 0 8C 4B 03 STY &034B \ de \ message flag for item + destroyed 9D 6F 03 STA &036F,X \ QQ20,X \ = 0 E0 11 CPX #17 \ max cargo B0 05 BCS ou1 \ if yes, equipment Lost, down. 8A TXA \ else cargo lost, carry is clear. 69 D0 ADC #&D0 \ add to token = food D0 B8 BNE MESS \ guaranteed up, Message start. .ou1 \ equipment Lost F0 B1 BEQ ou2 \ equipment lost is X=17 ecm, up. E0 12 CPX #18 \ equipment item is F0 B0 BEQ ou3 \ fuel scoops, up. 8A TXA \ else carry set probably 69 5D ADC #&5D \ #113-20, token = Bomb, energy unit, docking computer D0 AD BNE MESS \ guaranteed up, Message start. .QQ23 \ Prxs -> &4619 \ Market prices info \ base_price, gradient sign+5bits, base_quantity, mask, units 2bits 13 82 06 01 EQUD &01068213 \ Food 14 81 0A 03 EQUD &030A8114 \ Textiles 41 83 02 07 EQUD &07028341 \ Radioactives 28 85 E2 1F EQUD &1FE28528 \ Slaves 53 85 FB 0F EQUD &0FFB8553 \ Liquor/Wines C4 08 36 03 EQUD &033608C4 \ Luxuries EB 1D 08 78 EQUD &78081DEB \ Narcotics 9A 0E 38 03 EQUD &03380E9A \ Computers 75 06 28 07 EQUD &07280675 \ Machinery 4E 01 11 1F EQUD &1F11014E \ Alloys 7C 0D 1D 07 EQUD &071D0D7C \ Firearms B0 89 DC 3F EQUD &3FDC89B0 \ Furs 20 81 35 03 EQUD &03358120 \ Minerals 61 A1 42 07 EQUD &0742A161 \ Gold AB A2 37 1F EQUD &1F37A2AB \ Platinum 2D C1 FA 0F EQUD &0FFAC12D \ Gem-Stones 35 0F C0 07 EQUD &07C00F35 \ Alien Items .TI2 \ Tidy2 \ yunit small, used to renormalize rotation matrix Xreg = index1 = 0 98 TYA \ Acc index3 = 4 A0 02 LDY #2 \ Yreg index2 = 2 20 2C 47 JSR &472C \ TIS3 \ below, denom is z 85 5A STA &5A \ INWK+20 \ Uz=-(FxUx+FyUy)/Fz Their comment \ rotmat1z hi 4C A5 46 JMP &46A5 \ TI3 \ Tidy3 .TI1 \ Tidy1 \ xunit small, with Y = 4 AA TAX \ Xreg = index1 = 0 A5 35 LDA &35 \ XX15+1 29 60 AND #&60 \ is yunit vector small F0 EE BEQ TI2 \ up, Tidy2 Y = 4 A9 02 LDA #2 \ else index2 = 4, index3 = 2 20 2C 47 JSR &472C \ TIS3 \ below, denom is y 85 58 STA &58 \ INWK+18 \ Uy = -(FxUx+FzUz)/Fy \ rotmat1 hi 4C A5 46 JMP &46A5 \ TI3 \ Tidy3 \ returns INWK(16,18,20) = INWK(12*18+14*20, 10*16+14*20, 10*16+12*18) / INWK(10,12,14) \ Ux,Uy,Uz = -(FyUy+FzUz, FxUx+FzUz, FxUx+FyUy)/ Fx,Fy,Fz .TIDY \ -> &4679 \ Orthogonalize rotation matrix that uses 0x60 as unity A5 50 LDA &50 \ INWK+10 \ rotmat0x hi 85 34 STA &34 \ XX15+0 \ XX15(0,1,2) = Fx,Fy,Fz A5 52 LDA &52 \ INWK+12 \ rotmat0y hi 85 35 STA &35 \ XX15+1 A5 54 LDA &54 \ INWK+14 \ rotmat0z hi 85 36 STA &36 \ XX15+2 20 F5 42 JSR &42F5 \ NORM \ normalize F= Rotmat0 A5 34 LDA &34 \ XX15+0 85 50 STA &50 \ INWK+10 \ rotmat0x hi A5 35 LDA &35 \ XX15+1 85 52 STA &52 \ INWK+12 \ rotmat0y hi A5 36 LDA &36 \ XX15+2 85 54 STA &54 \ INWK+14 \ rotmat0z hi A0 04 LDY #4 \ Y=#4 A5 34 LDA &34 \ XX15+0 29 60 AND #&60 \ is xunit small? F0 CC BEQ TI1 \ up to Tidy1 with Y = 4 A2 02 LDX #2 \ index1 = 2 A9 00 LDA #0 \ index3 = 0 20 2C 47 JSR &472C \ TIS3 \ below with Yreg = index2 = 4, denom = x 85 56 STA &56 \ INWK+16 \ rotmat1x hi .TI3 \ -> &46A5 \ Tidy3 \ All 3 choices continue with rotmat1? updated A5 56 LDA &56 \ INWK+16 \ rotmat1x hi 85 34 STA &34 \ XX15+0 A5 58 LDA &58 \ INWK+18 \ rotmat1y hi 85 35 STA &35 \ XX15+1 A5 5A LDA &5A \ INWK+20 \ rotmat1z hi 85 36 STA &36 \ XX15+2 \ XX15(0,1,2) = Ux,Uy,Uz 20 F5 42 JSR &42F5 \ NORM \ normalize Rotmat1 A5 34 LDA &34 \ XX15+0 85 56 STA &56 \ INWK+16 \ rotmat1x hi A5 35 LDA &35 \ XX15+1 85 58 STA &58 \ INWK+18 \ rotmat1y hi A5 36 LDA &36 \ XX15+2 85 5A STA &5A \ INWK+20 \ rotmat1z hi A5 52 LDA &52 \ INWK+12 \ rotmat0y hi 85 81 STA &81 \ Q \ = Fy A5 5A LDA &5A \ INWK+20 \ = Uz \ rotmat1z hi 20 D4 28 JSR &28D4 \ MULT12 \ R.S = P.A = Q * A = FyUz A6 54 LDX &54 \ INWK+14 \ = Fz \ rotmat0z hi A5 58 LDA &58 \ INWK+18 \ = Uy \ rotmat1y hi 20 3B 29 JSR &293B \ TIS1 \ X.A = -X*A + (R.S)/96 49 80 EOR #&80 \ flip 85 5C STA &5C \ INWK+22 \ hsb(FzUy-FyUz)/96*255 \ rotmat2x hi A5 56 LDA &56 \ INWK+16 \ = Ux \ rotmat1x hi 20 D4 28 JSR &28D4 \ MULT12 \ R.S = Q * A = FyUx A6 50 LDX &50 \ INWK+10 \ = Fx \ rotmat0x hi A5 5A LDA &5A \ INWK+20 \ = Uz \ rotmat1z hi 20 3B 29 JSR &293B \ TIS1 \ X.A = -X*A + (R.S)/96 49 80 EOR #&80 \ flip 85 5E STA &5E \ INWK+24 \ rotmat2y hi A5 58 LDA &58 \ INWK+18 \ = Uy \ rotmat1y hi 20 D4 28 JSR &28D4 \ MULT12 \ R.S = Q * A = FyUy A6 52 LDX &52 \ INWK+12 \ = Fy \ rotmat0y hi A5 56 LDA &56 \ INWK+16 \ = Ux \ rotmat1x hi 20 3B 29 JSR &293B \ TIS1 \ X.A = -X*A + (R.S)/96 49 80 EOR #&80 \ flip 85 60 STA &60 \ INWK+26 \ rotmat2z hi A9 00 LDA #0 \ clear matrix lo's A2 0E LDX #14 \ except 2z's .TIL1 \ counter X 95 4F STA &4F,X \ INWK+9,X CA DEX CA DEX \ skip hi's 10 FA BPL TIL1 \ loop X 60 RTS .TIS2 \ -> &46FF \ Reduce Acc in NORM routine i.e. *96/Q A8 TAY \ copy of Acc 29 7F AND #&7F \ ignore sign C5 81 CMP &81 \ Q B0 20 BCS TI4 \ clean to +/- unity A2 FE LDX #&FE \ division roll 86 D1 STX &D1 \ T .TIL2 \ roll T 0A ASL A C5 81 CMP &81 \ Q 90 02 BCC P%+4 \ skip sbc E5 81 SBC &81 \ Q 26 D1 ROL &D1 \ T B0 F5 BCS TIL2 \ loop T A5 D1 LDA &D1 \ T 4A LSR A 4A LSR A \ result/4 85 D1 STA &D1 \ T 4A LSR A \ result/8 65 D1 ADC &D1 \ T 85 D1 STA &D1 \ T = 3/8*Acc (max = 96) 98 TYA \ copy of Acc 29 80 AND #&80 \ sign 05 D1 ORA &D1 \ T 60 RTS .TI4 \ clean to +/- unity 98 TYA \ copy of Acc 29 80 AND #&80 \ sign 09 60 ORA #&60 \ +/- unity 60 RTS .TIS3 \ -> &472C \ visited by TI1,TI2 \ A = INWK(12*18+14*20, 10*16+14*20, 10*16+12*18) / INWK(10,12,14) \ Ux,Uy,Uz = -(FyUy+FzUz, FxUx+FzUz, FxUx+FyUy)/ Fx,Fy,Fz \ Xreg = index1, Yreg = index2, Acc = index3 85 1D STA &1D \ P+2 \ store index3 B5 50 LDA &50,X \ INWK+10,X \ rotmat0x,X hi 85 81 STA &81 \ Q B5 56 LDA &56,X \ INWK+16,X \ rotmat1x,X hi 20 D4 28 JSR &28D4 \ MULT12 \ R.S = Q * rotmat1x B6 50 LDX &50,Y \ INWK+10,Y \ rotmat0x,Y hi 86 81 STX &81 \ Q B9 56 00 LDA &0056,Y \ INWK+16,Y \ rotmat1x,Y hi 20 FC 28 JSR &28FC \ MAD \ X.A = rotmat0x*rotmat1y + R.S 86 1B STX &1B \ P \ num lo A4 1D LDY &1D \ P+2 \ index3 B6 50 LDX &50,Y \ INWK+10,Y \ rotmat0x,A hi 86 81 STX &81 \ Q \ is denominator 49 80 EOR #&80 \ num -hi .DVIDT \ A=AP/Q \ their comment. A = (P,A)/Q 85 1C STA &1C \ P+1 \ num hi 45 81 EOR &81 \ Q 29 80 AND #&80 \ sign bit 85 D1 STA &D1 \ T A9 00 LDA #0 A2 10 LDX #16 \ counter 2 bytes 06 1B ASL &1B \ P \ num lo 26 1C ROL &1C \ P+1 \ num hi 06 81 ASL &81 \ Q \ denom 46 81 LSR &81 \ Q \ lose sign bit, clear carry .DVL2 \ counter X 2A ROL A C5 81 CMP &81 \ Q 90 02 BCC P%+4 \ skip sbc E5 81 SBC &81 \ Q 26 1B ROL &1B \ P \ result 26 1C ROL &1C \ P+1 CA DEX D0 F2 BNE DVL2 \ loop X A5 1B LDA &1B \ P 05 D1 ORA &D1 \ T \ sign bit 60 RTS \ -- end of TIDY \ --==== end of block F ==== onto block G =====--- &4772 .SHPPT \ -> &4772 \ ship plot as point from LL10 20 DE 48 JSR &48DE \ EE51 \ if bit3 set draw to erase lines in XX19 heap 20 56 38 JSR &3856 \ PROJ \ Project K+INWK(x,y)/z to K3,K4 for craft center 05 D3 ORA &D3 \ K3+1 D0 21 BNE nono \ xorg hi present, clear bit3 no draw A5 E0 LDA &E0 \ K4 C9 BE CMP #&BE \ #Y*2-2 96*2-2 screen height B0 1B BCS nono \ yorg lo >= y_screen, no draw. A0 02 LDY #2 \ index for edge heap 20 A4 47 JSR &47A4 \ Shpt \ Ship is point, Acc= K4 = ylo, could end if nono-2 A0 06 LDY #6 \ index for edge heap A5 E0 LDA &E0 \ K4 \ reload ylo 69 01 ADC #1 \ 1 pixel up 20 A4 47 JSR &47A4 \ Shpt \ Ship is point, could end if nono-2 A9 08 LDA #8 \ set bit3 (to erase later) and plot as Dot 05 65 ORA &65 \ INWK+31 \ display|missiles explosion state 85 65 STA &65 \ INWK+31 A9 08 LDA #8 \ Dot uses #8 not U 4C 74 4F JMP &4F74 \ LL81+2 \ skip first two edges on XX19 heap 68 PLA \ nono-2 \ Changing return address 68 PLA \ ending routine early .nono \ clear bit3 nothing to erase in next round, no draw. A9 F7 LDA #&F7 \ clear bit3 25 65 AND &65 \ INWK+31 \ display/exploding state|missiles 85 65 STA &65 \ INWK+31 60 RTS .Shpt \ -> &47A4 \ ship is point at Acc = K4 91 67 STA (&67),Y \ (XX19),Y \ Y coord to ship lines heap C8 INY C8 INY \ next Y coord 91 67 STA (&67),Y \ (XX19),Y A5 D2 LDA &D2 \ K3 \ Xscreen-mid 88 DEY \ 2nd X coord 91 67 STA (&67),Y \ (XX19),Y 69 03 ADC #3 \ 1st X coord B0 E8 BCS nono-2 \ overflowed to right remove 2 from address stack and clear bit 3 88 DEY 88 DEY \ first entry in group of 4 added to ship line heap 91 67 STA (&67),Y \ (XX19),Y 60 RTS .LL5 \ -> &47B8 \ 2BSQRT Q=SQR(RQ) two-byte square root, R is hi, Q is lo. A4 82 LDY &82 \ R \ hi A5 81 LDA &81 \ Q 85 83 STA &83 \ S \ lo A2 00 LDX #0 \ result 86 81 STX &81 \ Q A9 08 LDA #8 \ counter 85 D1 STA &D1 \ T .LL6 \ counter T E4 81 CPX &81 \ Q 90 0E BCC LL7 \ no carry D0 04 BNE LL8 \ hop ne C0 40 CPY #&40 \ hi 90 08 BCC LL7 \ no carry .LL8 \ hop ne 98 TYA E9 40 SBC #&40 A8 TAY \ new hi 8A TXA E5 81 SBC &81 \ Q AA TAX \ maybe carry into .LL7 \ no carry 26 81 ROL &81 \ Q \ result 06 83 ASL &83 \ S \ maybe carry into Yreg 98 TYA 2A ROL A A8 TAY \ Yhi *2 8A TXA 2A ROL A AA TAX \ Xlo *2 06 83 ASL &83 \ S \ maybe carry into Yreg 98 TYA 2A ROL A A8 TAY \ Yhi *2 8A TXA 2A ROL A AA TAX \ Xlo *2 C6 D1 DEC &D1 \ T D0 D8 BNE LL6 \ loop T 60 RTS \ Q left with root .LL28 \ -> &47EF \ BFRDIV R=A*256/Q byte from remainder of division C5 81 CMP &81 \ Q \ is A >= Q ? B0 1A BCS LL2 \ if yes, answer too big for 1 byte, R=#&FF A2 FE LDX #&FE \ else C is clear \ LL28+4 \ remainder R for AofQ *256/Q 86 82 STX &82 \ R \ div roll counter .LL31 \ roll R 0A ASL A B0 0B BCS LL29 \ hop to Reduce C5 81 CMP &81 \ Q 90 02 BCC P%+4 \ skip sbc E5 81 SBC &81 \ Q 26 82 ROL &82 \ R B0 F3 BCS LL31 \ loop R 60 RTS \ R left with remainder of division .LL29 \ Reduce E5 81 SBC &81 \ Q 38 SEC 26 82 ROL &82 \ R B0 EB BCS LL31 \ loop R 60 RTS \ R left with remainder of division .LL2 \ answer too big for 1 byte, R=#&FF A9 FF LDA #&FF 85 82 STA &82 \ R 60 RTS .LL38 \ -> &4812 \ BADD(S)A=R+Q(SA) \ byte add (subtract) (Sign S)A = R + Q*(Sign from A^S) 45 83 EOR &83 \ S \ sign of operator is A xor S 30 06 BMI LL39 \ 1 byte subtraction A5 81 LDA &81 \ Q \ else addition, S already correct 18 CLC 65 82 ADC &82 \ R 60 RTS .LL39 \ 1 byte subtraction (S)A = R-Q A5 82 LDA &82 \ R 38 SEC E5 81 SBC &81 \ Q 90 02 BCC P%+4 \ sign of S needs correcting, hop over rts 18 CLC 60 RTS 48 PHA \ store subtraction result A5 83 LDA &83 \ S 49 80 EOR #&80 \ flip 85 83 STA &83 \ S 68 PLA \ restore subtraction result 49 FF EOR #&FF 69 01 ADC #1 \ negate 60 RTS .LL51 \ -> &4832 \ XX12=XX15.XX16 each vector is 16-bit x,y,z A2 00 LDX #0 A0 00 LDY #0 \XX16_hsb[ 1 3 5 highest XX16 done below is 5, then X taken up by 6, Y taken up by 2. \ 7 9 11 \ 13 15 17=0 ?] .ll51 \ counter X+=6 < 17 Y+=2 A5 34 LDA &34 \ XX15+0 \ xmag 85 81 STA &81 \ Q B5 09 LDA &09,X \ XX16,X 20 47 28 JSR &2847 \ FMLTU \ Acc= XX15 *XX16 /256 assume unsigned 85 D1 STA &D1 \ T A5 35 LDA &35 \ XX15+1 55 0A EOR &0A,X \ XX16+1,X 85 83 STA &83 \ S \ xsign A5 36 LDA &36 \ XX15+2 \ ymag 85 81 STA &81 \ Q B5 0B LDA &0B,X \ XX16+2,X 20 47 28 JSR &2847 \ FMLTU \ Acc= XX15 *XX16 /256 assume unsigned 85 81 STA &81 \ Q A5 D1 LDA &D1 \ T 85 82 STA &82 \ R \ move T to R A5 37 LDA &37 \ XX15+3 \ ysign 55 0C EOR &0C,X \ XX16+3,X 20 12 48 JSR &4812 \ LL38 \ BADD(S)A=R+Q(SA) \ 1byte add (subtract) 85 D1 STA &D1 \ T A5 38 LDA &38 \ XX15+4 \ zmag 85 81 STA &81 \ Q B5 0D LDA &0D,X \ XX16+4,X 20 47 28 JSR &2847 \ FMLTU \ Acc= XX15 *XX16 /256 assume unsigned 85 81 STA &81 \ Q A5 D1 LDA &D1 \ T 85 82 STA &82 \ R \ move T to R A5 39 LDA &39 \ XX15+5 \ zsign 55 0E EOR &0E,X \ XX16+5,X 20 12 48 JSR &4812 \ LL38 \ BADD(S)A=R+Q(SA) \ 1byte add (subtract) 99 3A 00 STA &003A,Y \ XX12,Y A5 83 LDA &83 \ S \ result sign 99 3B 00 STA &003B,Y \ XX12+1,Y C8 INY C8 INY \ Y +=2 8A TXA 18 CLC 69 06 ADC #6 AA TAX \ X +=6 C9 11 CMP #17 \ X finished? 90 AE BCC ll51 \ loop for second half of matrix 60 RTS .LL25 \ planet 4C 99 38 JMP &3899 \ PLANET .LL9 \ -> &488C \ object ENTRY for displaying, including debris. A5 8C LDA &8C \ TYPE \ ship type 30 F9 BMI LL25 \ planet as bit7 set A9 1F LDA #&1F \ max visibility 85 96 STA &96 \ XX4 A5 6A LDA &6A \ INWK+36 \ NEWB bit 7 remove ship? 30 46 BMI EE51 \ if bit3 set erase old lines in XX19 heap A9 20 LDA #&20 \ mask for bit 5, exploding 24 65 BIT &65 \ INWK+31 \ display explosion state|missiles D0 2D BNE EE28 \ bit5 set, explosion ongoing 10 2B BPL EE28 \ bit7 clear, else Start blowing up! 05 65 ORA &65 \ INWK+31 29 3F AND #&3F \ clear bit7,6 85 65 STA &65 \ INWK+31 A9 00 LDA #0 \ acceleration & pitch zeroed. A0 1C LDY #28 \ byte #28 accel 91 20 STA (&20),Y \ (INF),Y A0 1E LDY #30 \ byte #30 rotz counter 91 20 STA (&20),Y \ (INF),Y 20 DE 48 JSR &48DE \ EE51 \ if bit3 set erase old lines in XX19 heap A0 01 LDY #1 \ edge heap byte1 A9 12 LDA #18 \ counter for explosion radius 91 67 STA (&67),Y \ (XX19),Y A0 07 LDY #7 \ Hull byte#7 explosion of ship type e.g. &2A B1 1E LDA (&1E),Y \ (XX0),Y A0 02 LDY #2 \ edge heap byte2 91 67 STA (&67),Y \ (XX19),Y .EE55 \ counter Y, 4 rnd bytes to edge heap C8 INY \ #3 start 20 86 3F JSR &3F86 \ DORND 91 67 STA (&67),Y \ (XX19),Y C0 06 CPY #6 \ bytes 3to6 = random bytes for seed D0 F6 BNE EE55 \ loop Y .EE28 \ bit5 set do explosion, or bit7 clear, dont kill. A5 4E LDA &4E \ INWK+8 \ sign of Z coord .EE49 \ In view? 10 1D BPL LL10 \ hop over as object in front .LL14 \ Test to remove object A5 65 LDA &65 \ INWK+31 \ display explosion state|missiles 29 20 AND #&20 \ bit5 ongoing explosion? F0 09 BEQ EE51 \ if no then if bit3 set erase old lines in XX19 heap A5 65 LDA &65 \ INWK+31 \ else exploding 29 F7 AND #&F7 \ clear bit3 85 65 STA &65 \ INWK+31 4C 70 34 JMP &3470 \ DOEXP \ Explosion .EE51 \ -> &48DE \ if bit3 set draw lines in XX19 heap A9 08 LDA #8 \ mask for bit 3 24 65 BIT &65 \ INWK+31 \ exploding/display state|missiles F0 07 BEQ LL10-1 \ if bit3 clear, just rts 45 65 EOR &65 \ INWK+31 \ else toggle bit3 to allow lines 85 65 STA &65 \ INWK+31 4C 78 4F JMP &4F78 \ LL155 \ clear LINEstr. Draw lines in XX19 heap. 60 RTS \ needed by beq \ LL10-1 .LL10 \ object in front of you A5 4D LDA &4D \ INWK+7 \ zhi C9 C0 CMP #&C0 \ far in front B0 DD BCS LL14 \ test to remove object A5 46 LDA &46 \ INWK+0 \ xlo C5 4C CMP &4C \ INWK+6 \ zlo A5 47 LDA &47 \ INWK+1 \ xhi E5 4D SBC &4D \ INWK+7 \ zhi, gives angle to object B0 D3 BCS LL14 \ test to remove object A5 49 LDA &49 \ INWK+3 \ ylo C5 4C CMP &4C \ INWK+6 \ zlo A5 4A LDA &4A \ INWK+4 \ yhi E5 4D SBC &4D \ INWK+7 \ zhi B0 C9 BCS LL14 \ test to remove object A0 06 LDY #6 \ Hull byte6, node gun*4 B1 1E LDA (&1E),Y \ (XX0),Y AA TAX \ node heap index A9 FF LDA #&FF \ flag on node heap at gun 9D 00 01 STA &0100,X \ XX3+0,X 9D 01 01 STA &0101,X \ XX3+1,X A5 4C LDA &4C \ INWK+6 \ zlo 85 D1 STA &D1 \ T A5 4D LDA &4D \ INWK+7 \ zhi 4A LSR A 66 D1 ROR &D1 \ T 4A LSR A 66 D1 ROR &D1 \ T 4A LSR A 66 D1 ROR &D1 \ T 4A LSR A D0 0A BNE LL13 \ hop as far A5 D1 LDA &D1 \ T 6A ROR A \ bring in hi bit0 4A LSR A 4A LSR A \ small zlo 4A LSR A \ updated visibility 85 96 STA &96 \ XX4 10 11 BPL LL17 \ guaranteed hop to Draw wireframe .LL13 \ hopped to as far A0 0D LDY #&0D \ Hull byte#13, distance point at which ship becomes a dot B1 1E LDA (&1E),Y \ (XX0),Y C5 4D CMP &4D \ INWK+7 \ dot_distance >= z_hi will leave carry set B0 09 BCS LL17 \ hop over to draw Wireframe A9 20 LDA #&20 \ mask bit 5 exploding 25 65 AND &65 \ INWK+31 \ exploding/display state|missiles D0 03 BNE LL17 \ hop over to Draw wireframe or exploding 4C 72 47 JMP &4772 \ SHPPT \ else ship plot point, up. .LL17 \ draw Wireframe (including nodes exploding) A2 05 LDX #5 \ load rotmat into XX16 .LL15 \ counter X B5 5B LDA &5B,X \ INWK+21,X 95 09 STA &09,X \ XX16,X B5 55 LDA &55,X \ INWK+15,X 95 0F STA &0F,X \ XX16+6,X B5 4F LDA &4F,X \ INWK+9,X 95 15 STA &15,X \ XX16+12,X CA DEX 10 F1 BPL LL15 \ loop X A9 C5 LDA #197 \ comment here about NORM 85 81 STA &81 \ Q A0 10 LDY #16 .LL21 \ counter Y -=2 B9 09 00 LDA &0009,Y \ XX16+0,Y 0A ASL A \ get carry, only once. B9 0A 00 LDA &000A,Y \ XX16+1,Y 2A ROL A 20 EF 47 JSR &47EF \ LL28 \ BFRDIV R=A*256/197 A6 82 LDX &82 \ R 96 09 STX &09,Y \ XX16,Y 88 DEY 88 DEY \ Y -=2 10 ED BPL LL21 \ loop Y A2 08 LDX #8 \ load craft coords into XX18 .ll91 \ counter X B5 46 LDA &46,X \ INWK,X 95 72 STA &72,X \ XX18,X CA DEX 10 F9 BPL ll91 \ loop X A9 FF LDA #&FF \ last normal is always visible 85 E1 STA &E1 \ XX2+15 A0 0C LDY #&0C \ Hull byte 12 = normals*4 A5 65 LDA &65 \ INWK+31 29 20 AND #&20 \ mask bit5 exploding F0 12 BEQ EE29 \ no, only Some visible B1 1E LDA (&1E),Y \ (XX0),Y 4A LSR A \ else do explosion needs all vertices 4A LSR A \ /=4 AA TAX \ Xreg = number of normals, faces A9 FF LDA #&FF \ all faces visible .EE30 \ counter X for each face 95 D2 STA &D2,X \ XX2,X CA DEX 10 FB BPL EE30 \ loop X E8 INX \ X = 0 86 96 STX &96 \ XX4 \ visibility .LL41 \ visibilities now set in XX2,X Transpose matrix. 4C 04 4B JMP &4B04 \ LL42 \ jump to transpose matrix .EE29 \ only Some visible Yreg =Hull byte12, normals*4 B1 1E LDA (&1E),Y \ (XX0),Y F0 F9 BEQ LL41 \ if no normals visibilities now set in XX2,X Transpose matrix. 85 97 STA &97 \ XX20 \ normals*4 A0 12 LDY #&12 \ Hull byte #18 normals scaled by 2^Q% \DtProd^XX2 their comment Dot product gives normals' visibility in XX2 B1 1E LDA (&1E),Y \ (XX0),Y AA TAX \ normals are scaled by 2^X plus A5 79 LDA &79 \ XX18+7 \ z_hi .LL90 \ scaling object distance A8 TAY \ z_hi F0 0F BEQ LL91 \ object close/small, hop E8 INX \ LL90+3 \ repeat INWK z brought closer, take X up 46 76 LSR &76 \ XX18+4 \ yhi 66 75 ROR &75 \ XX18+3 \ ylo 46 73 LSR &73 \ XX18+1 \ xhi 66 72 ROR &72 \ XX18+0 \ xlo 4A LSR A \ zhi /=2 66 78 ROR &78 \ XX18+6 \ z_lo A8 TAY \ zhi D0 F1 BNE LL90+3 \ again as z_hi too big .LL91 \ object close/small 86 86 STX &86 \ XX17 \ keep Scale required A5 7A LDA &7A \ XX18+8 \ last member of INWK copied over 85 39 STA &39 \ XX15+5 \ zsign 6 members A5 72 LDA &72 \ XX18 85 34 STA &34 \ XX15+0 \ xscaled A5 74 LDA &74 \ XX18+2 85 35 STA &35 \ XX15+1 \ xsign A5 75 LDA &75 \ XX18+3 85 36 STA &36 \ XX15+2 \ yscaled A5 77 LDA &77 \ XX18+5 85 37 STA &37 \ XX15+3 \ ysign A5 78 LDA &78 \ XX18+6 85 38 STA &38 \ XX15+4 \ zscaled 20 32 48 JSR &4832 \ LL51 \ XX12=XX15.XX16 each vector is 16-bit x,y,z A5 3A LDA &3A \ XX12+0 85 72 STA &72 \ XX18+0 \ load result back in A5 3B LDA &3B \ XX12+1 85 74 STA &74 \ XX18+2 \ xsg A5 3C LDA &3C \ XX12+2 85 75 STA &75 \ XX18+3 A5 3D LDA &3D \ XX12+3 85 77 STA &77 \ XX18+5 \ ysg A5 3E LDA &3E \ XX12+4 85 78 STA &78 \ XX18+6 A5 3F LDA &3F \ XX12+5 85 7A STA &7A \ XX18+8 \ zsg A0 04 LDY #4 \ Hull byte#4 = lsb of offset to normals B1 1E LDA (&1E),Y \ (XX0),Y 18 CLC \ lo 65 1E ADC &1E \ XX0 85 22 STA &22 \ V \ will point to start of normals A0 11 LDY #&11 \ Hull byte#17 = hsb of offset to normals B1 1E LDA (&1E),Y \ (XX0),Y 65 1F ADC &1F \ XX0+1 85 23 STA &23 \ V+1 \ hi of pointer to normals data A0 00 LDY #0 \ byte#0 of normal .LL86 \ -> &49F8 \ counter Y/4 go through all normals B1 22 LDA (&22),Y \ (V),Y 85 3B STA &3B \ XX12+1 \ byte#0 29 1F AND #&1F \ lower 5 bits are face visibility C5 96 CMP &96 \ XX4 B0 0F BCS LL87 \ >= XX4 visibility, skip over jump LL88 98 TYA \ face*4 count 4A LSR A \ else visible 4A LSR A \ counter/4 AA TAX \ Xreg is normal count A9 FF LDA #&FF \ visible face 95 D2 STA &D2,X \ XX2,X 98 TYA \ next face*4 69 04 ADC #4 \ +=4 A8 TAY \ Yreg +=4 next normal 4C FD 4A JMP &4AFD \ LL88 \ to near end of normal's visibility loop .LL87 \ normal visibility>= XX4 A5 3B LDA &3B \ XX12+1 \ byte#0 of normal 0A ASL A \ get sign y 85 3D STA &3D \ XX12+3 0A ASL A \ get sign z 85 3F STA &3F \ XX12+5 C8 INY \ byte#1 of normal B1 22 LDA (&22),Y \ (V),Y 85 3A STA &3A \ XX12+0 \ xnormal lo C8 INY \ byte#2 of normal B1 22 LDA (&22),Y \ (V),Y 85 3C STA &3C \ XX12+2 \ ynormal lo C8 INY \ byte#3 of normal B1 22 LDA (&22),Y \ (V),Y 85 3E STA &3E \ XX12+4 \ znormal lo A6 86 LDX &86 \ XX17 \ kept Scale required E0 04 CPX #4 \ is XX17 < 4 ? 90 23 BCC LL92 \ scale required is Quite close .LL143 \Face offset< &4AAF \ START also arrive from LL143 Face offset< &4AFD \ near end of normals visibility loop C4 97 CPY &97 \ XX20 \ number of normals*4 B0 03 BCS LL42 \ If Y >= XX20 all normals' visibilities set, onto Transpose. 4C F8 49 JMP &49F8 \ LL86 \ loop normals visibility Y \ -- All normals' visibilities now set in XX2,X .LL42 \ -> &4B04 \ DO nodeX-Ycoords their comment \ TrnspMat A4 0B LDY &0B \ XX16+2 \ Transpose Matrix A6 0C LDX &0C \ XX16+3 A5 0F LDA &0F \ XX16+6 85 0B STA &0B \ XX16+2 A5 10 LDA &10 \ XX16+7 85 0C STA &0C \ XX16+3 84 0F STY &0F \ XX16+6 86 10 STX &10 \ XX16+7 A4 0D LDY &0D \ XX16+4 A6 0E LDX &0E \ XX16+5 A5 15 LDA &15 \ XX16+12 85 0D STA &0D \ XX16+4 A5 16 LDA &16 \ XX16+13 85 0E STA &0E \ XX16+5 84 15 STY &15 \ XX16+12 86 16 STX &16 \ XX16+13 A4 13 LDY &13 \ XX16+10 A6 14 LDX &14 \ XX16+11 A5 17 LDA &17 \ XX16+14 85 13 STA &13 \ XX16+10 A5 18 LDA &18 \ XX16+15 85 14 STA &14 \ XX16+11 84 17 STY &17 \ XX16+14 86 18 STX &18 \ XX16+15 \XX16 got INWK 9..21..26 up at LL15 . The ROTMAT has 18 bytes, for 3x3 matrix \XX16_lsb[ 0 2 4 highest XX16 done below is 5, then X taken up by 6, Y taken up by 2. \ 6 8 10 \ 12 14 16=0 ?] A0 08 LDY #8 \ Hull byte#8 = number of vertices *6 B1 1E LDA (&1E),Y \ (XX0),Y 85 97 STA &97 \ XX20 A5 1E LDA &1E \ XX0 \ pointer to ship type data 18 CLC \ build 69 14 ADC #&14 \ vertex data fixed offset 85 22 STA &22 \ V \ pointer to start of hull vertices A5 1F LDA &1F \ XX0+1 69 00 ADC #0 \ any carry 85 23 STA &23 \ V+1 A0 00 LDY #0 \ index for XX3 heap 84 93 STY &93 \ CNT .LL48 \ -> &4B4B \ Start loop on Nodes for visibility, each node has 4 faces associated with it. 84 86 STY &86 \ XX17 \ vertex*6 counter B1 22 LDA (&22),Y \ (V),Y 85 34 STA &34 \ XX15 \ lo C8 INY \ vertex byte#1 B1 22 LDA (&22),Y \ (V),Y 85 36 STA &36 \ XX15+2 C8 INY \ vertex byte#2 B1 22 LDA (&22),Y \ (V),Y 85 38 STA &38 \ XX15+4 C8 INY \ vertex byte#3 B1 22 LDA (&22),Y \ (V),Y 85 D1 STA &D1 \ T \ sign bits of vertex 29 1F AND #&1F \ visibility C5 96 CMP &96 \ XX4 90 2E BCC LL49-3 \ if yes jmp LL50, next vertex. C8 INY \ vertex byte#4, first 2 faces B1 22 LDA (&22),Y \ (V),Y 85 1B STA &1B \ P \ two 4-bit indices 0:15 into XX2 for 2 of the 4 normals 29 0F AND #&0F \ face 1 AA TAX \ face visibility index B5 D2 LDA &D2,X \ XX2,X D0 25 BNE LL49 \ vertex is visible A5 1B LDA &1B \ P \ restore 4A LSR A 4A LSR A 4A LSR A 4A LSR A \ hi nibble AA TAX \ face 2 B5 D2 LDA &D2,X \ XX2,X D0 1A BNE LL49 \ vertex is visible C8 INY \ vertex byte#5, other 2 faces B1 22 LDA (&22),Y \ (V),Y 85 1B STA &1B \ P \ two 4-bit indices 0:15 into XX2 29 0F AND #&0F \ face 3 AA TAX \ face visibility index B5 D2 LDA &D2,X \ XX2,X D0 0E BNE LL49 \ vertex is visible A5 1B LDA &1B \ P \ restore 4A LSR A 4A LSR A 4A LSR A 4A LSR A \ hi nibble AA TAX \ face 4 B5 D2 LDA &D2,X \ XX2,X D0 03 BNE LL49 \ vertex is visible 4C 0C 4D JMP &4D0C \ LL50 \ both arrive here \ LL49-3 \ next vertex. \ This jump can only happen if got 4 zeros from XX2 normals visibility. .LL49 \ Else vertex is visible, update info on XX3 node heap. A5 D1 LDA &D1 \ T \ 4th byte read for vertex, sign bits. 85 35 STA &35 \ XX15+1 0A ASL A \ y sgn 85 37 STA &37 \ XX15+3 0A ASL A \ z sgn 85 39 STA &39 \ XX15+5 20 32 48 JSR &4832 \ LL51 \ XX12=XX15.XX16 Rotated. A5 48 LDA &48 \ INWK+2 \ x-sign 85 36 STA &36 \ XX15+2 45 3B EOR &3B \ XX12+1 \ rotated xnode hi 30 10 BMI LL52 \ hop as -ve x sign 18 CLC \ else x +ve A5 3A LDA &3A \ XX12 \ rotated xnode lo 65 46 ADC &46 \ INWK+0 \ xorg lo 85 34 STA &34 \ XX15+0 \ new x A5 47 LDA &47 \ INWK+1 69 00 ADC #0 \ hi x 85 35 STA &35 \ XX15+1 4C DF 4B JMP &4BDF \ LL53 \ Onto y .LL52 \ -ve x sign A5 46 LDA &46 \ INWK+0 \ xorg lo 38 SEC E5 3A SBC &3A \ XX12 \ rotated xnode lo 85 34 STA &34 \ XX15+0 \ new x A5 47 LDA &47 \ INWK+1 E9 00 SBC #0 \ hi x 85 35 STA &35 \ XX15+1 B0 14 BCS LL53 \ usually ok Onto y 49 FF EOR #&FF \ else fix x negative 85 35 STA &35 \ XX15+1 A9 01 LDA #1 \ negate E5 34 SBC &34 \ XX15 85 34 STA &34 \ XX15 90 02 BCC P%+4 \ skip x hi E6 35 INC &35 \ XX15+1 A5 36 LDA &36 \ XX15+2 49 80 EOR #&80 \ flip xsg 85 36 STA &36 \ XX15+2 .LL53 \ -> &4BDF \ Both x signs arrive here, Onto y A5 4B LDA &4B \ INWK+5 \ ysg 85 39 STA &39 \ XX15+5 45 3D EOR &3D \ XX12+3 \ rotated ynode hi 30 10 BMI LL54 \ hop as -ve y sign 18 CLC \ else y +ve A5 3C LDA &3C \ XX12+2 \ rotated ynode lo 65 49 ADC &49 \ INWK+3 \ yorg lo 85 37 STA &37 \ XX15+3 \ new y A5 4A LDA &4A \ INWK+4 69 00 ADC #0 \ hi y 85 38 STA &38 \ XX15+4 4C 1C 4C JMP &4C1C \ LL55 \ Onto z .LL54 \ -ve y sign A5 49 LDA &49 \ INWK+3 \ yorg lo 38 SEC E5 3C SBC &3C \ XX12+2 \ rotated ynode lo 85 37 STA &37 \ XX15+3 \ new y A5 4A LDA &4A \ INWK+4 E9 00 SBC #0 \ hi y 85 38 STA &38 \ XX15+4 B0 16 BCS LL55 \ usually ok Onto z 49 FF EOR #&FF \ else fix y negative 85 38 STA &38 \ XX15+4 A5 37 LDA &37 \ XX15+3 49 FF EOR #&FF \ negate y lo 69 01 ADC #1 85 37 STA &37 \ XX15+3 A5 39 LDA &39 \ XX15+5 49 80 EOR #&80 \ flip ysg 85 39 STA &39 \ XX15+5 90 02 BCC LL55 \ Onto z E6 38 INC &38 \ XX15+4 .LL55 \ -> &4C1C \ Both y signs arrive here, Onto z A5 3F LDA &3F \ XX12+5 \ rotated znode hi 30 4A BMI LL56 \ -ve Z node A5 3E LDA &3E \ XX12+4 \ rotated znode lo 18 CLC 65 4C ADC &4C \ INWK+6 \ zorg lo 85 D1 STA &D1 \ T \ z new lo A5 4D LDA &4D \ INWK+7 69 00 ADC #0 \ hi 85 80 STA &80 \ U \ z new hi 4C 89 4C JMP &4C89 \ LL57 \ Node additions done, z = U.T \ Doing additions and scalings for each visible node around here .LL61 \ -> &4C30 \ Handling division R=A/Q for case further down A6 81 LDX &81 \ Q F0 1C BEQ LL84 \ div by zero div error A2 00 LDX #0 .LL63 \ roll Acc count Xreg 4A LSR A E8 INX \ counts required will be stored in S C5 81 CMP &81 \ Q B0 FA BCS LL63 \ loop back if Acc >= Q 86 83 STX &83 \ S 20 EF 47 JSR &47EF \ LL28 \ BFRDIV R=A*256/Q byte from remainder of division A6 83 LDX &83 \ S \ restore Xcount A5 82 LDA &82 \ R \ remainder .LL64 \ counter Xreg 0A ASL A \ lo boost 26 80 ROL &80 \ U \ hi 30 06 BMI LL84 \ bit7 set, overflowed, div error CA DEX \ bring X back down D0 F8 BNE LL64 \ loop X 85 82 STA &82 \ R \ remainder 60 RTS .LL84 \ div error R=U=#50 A9 32 LDA #50 85 82 STA &82 \ R 85 80 STA &80 \ U 60 RTS .LL62 \ Arrive from LL65 just below, screen for -ve RU onto XX3 heap, index X=CNT A9 80 LDA #&80 \ x-screen mid-point 38 SEC \ xcoord lo E5 82 SBC &82 \ R 9D 00 01 STA &0100,X \ XX3,X E8 INX \ hi A9 00 LDA #0 \ xcoord hi E5 80 SBC &80 \ U 9D 00 01 STA &0100,X \ XX3,X 4C C9 4C JMP &4CC9 \ LL66 \ xccord shoved, go back down .LL56 \ Enter XX12+5 -ve Z node case from above A5 4C LDA &4C \ INWK+6 \ z org lo 38 SEC E5 3E SBC &3E \ XX12+4 \ rotated z node lo 85 D1 STA &D1 \ T A5 4D LDA &4D \ INWK+7 \ zhi E9 00 SBC #0 85 80 STA &80 \ U 90 08 BCC LL140 \ underflow, make node close D0 0E BNE LL57 \ Enter Node additions done, UT=z A5 D1 LDA &D1 \ T \ restore z lo C9 04 CMP #4 \ >= 4 ? B0 08 BCS LL57 \ zlo big enough, Enter Node additions done. .LL140 \ else make node close A9 00 LDA #0 \ hi 85 80 STA &80 \ U A9 04 LDA #4 \ lo 85 D1 STA &D1 \ T .LL57 \ -> &4C89 \ Enter Node additions done, z=T.U set up from LL55 A5 80 LDA &80 \ U \ z hi 05 35 ORA &35 \ XX15+1 \ x hi 05 38 ORA &38 \ XX15+4 \ y hi F0 0F BEQ LL60 \ exit loop down once hi U rolled to 0 46 35 LSR &35 \ XX15+1 66 34 ROR &34 \ XX15+0 46 38 LSR &38 \ XX15+4 66 37 ROR &37 \ XX15+3 46 80 LSR &80 \ U \ z hi 66 D1 ROR &D1 \ T \ z lo 4C 89 4C JMP &4C89 \ LL57 \ loop U .LL60 \ hi U rolled to 0, exited loop above. A5 D1 LDA &D1 \ T 85 81 STA &81 \ Q \ zdist lo A5 34 LDA &34 \ XX15 \ rolled x lo C5 81 CMP &81 \ Q 90 06 BCC LL69 \ if xdist < zdist hop over jmp to small x angle 20 30 4C JSR &4C30 \ LL61 \ visit up R = A/Q = x/z 4C B3 4C JMP &4CB3 \ LL65 \ hop over small xangle .LL69 \ small x angle 20 EF 47 JSR &47EF \ LL28 \ BFRDIV R=A*256/Q byte for remainder of division .LL65 \ -> &4CB3 \ both continue for scaling based on z A6 93 LDX &93 \ CNT \ index for XX3 heap A5 36 LDA &36 \ XX15+2 \ sign of X dist 30 9E BMI LL62 \ up, -ve Xdist, RU screen onto XX3 heap A5 82 LDA &82 \ R \ xscaled 18 CLC \ xcoord lo to XX3 heap 69 80 ADC #&80 \ x screen mid-point 9D 00 01 STA &0100,X \ XX3,X E8 INX \ x hi onto node heap A5 80 LDA &80 \ U 69 00 ADC #0 \ any carry to hi 9D 00 01 STA &0100,X \ XX3,X .LL66 \ -> &4CC9 \ also from LL62, XX3 node heap has xscreen node so far. 8A TXA \ Onto y coord 48 PHA \ push XX3 heap pointer A9 00 LDA #0 \ y hi = 0 85 80 STA &80 \ U A5 D1 LDA &D1 \ T 85 81 STA &81 \ Q \ zdist lo A5 37 LDA &37 \ XX15+3 \ rolled y low C5 81 CMP &81 \ Q 90 19 BCC LL67 \ if ydist < zdist hop to small yangle 20 30 4C JSR &4C30 \ LL61 \ else visit up R = A/Q = y/z 4C F5 4C JMP &4CF5 \ LL68 \ hop over small y yangle .LL70 \ arrive from below, Yscreen for -ve RU onto XX3 node heap, index X=CNT A9 60 LDA #&60 \ #Y = #96 mid Yscreen \ also rts at LL70+1 18 CLC \ ycoord lo to XX3 node heap 65 82 ADC &82 \ R \ yscaled 9D 00 01 STA &0100,X \ XX3,X E8 INX \ y hi to node heap A9 00 LDA #0 \ any carry to y hi 65 80 ADC &80 \ U 9D 00 01 STA &0100,X \ XX3,X 4C 0C 4D JMP &4D0C \ LL50 \ down XX3 heap has yscreen node .LL67 \ Arrive from LL66 above if XX15+3 < Q \ small yangle 20 EF 47 JSR &47EF \ LL28 \ BFRDIV R=A*256/Q byte from remainder of division .LL68 \ -> &4CF5 both carry on, also arrive from LL66, yscaled based on z 68 PLA \ restore AA TAX \ XX3 heap index E8 INX \ take XX3 heap index up A5 39 LDA &39 \ XX15+5 \ rolled Ydist sign 30 E3 BMI LL70 \ up, -ve RU onto XX3 heap A9 60 LDA #&60 \ #Y = #96 Yscreen 38 SEC \ subtracted yscaled and store on heap E5 82 SBC &82 \ R 9D 00 01 STA &0100,X \ XX3,X E8 INX \ y screen hi A9 00 LDA #0 \ any carry E5 80 SBC &80 \ U 9D 00 01 STA &0100,X \ XX3,X .LL50 \ -> &4D0C \ also from LL70, Also from LL49-3. XX3 heap has yscreen, Next vertex. 18 CLC \ reload XX3 heap index base A5 93 LDA &93 \ CNT 69 04 ADC #4 \ +=4, next 16bit xcoord,ycoord pair on XX3 heap 85 93 STA &93 \ CNT A5 86 LDA &86 \ XX17 \ vertex*6 count 69 06 ADC #6 \ +=6 A8 TAY \ Y taken up to next vertex B0 07 BCS LL72 \ down Loaded if maxed out number of vertices (42) C5 97 CMP &97 \ XX20 \ number of vertices*6 B0 03 BCS LL72 \ done Loaded if all vertices done, exit loop 4C 4B 4B JMP &4B4B \ LL48 \ loop Y back to next vertex at transpose matrix .LL72 \ XX3 node heap already loaded with 16bit xy screen A5 65 LDA &65 \ INWK+31 \ display/exploding state|missiles 29 20 AND #&20 \ bit5 of mask F0 09 BEQ EE31 \ if zero no explosion A5 65 LDA &65 \ INWK+31 09 08 ORA #8 \ else set bit3 to erase old line 85 65 STA &65 \ INWK+31 4C 70 34 JMP &3470 \ DOEXP \ explosion .EE31 \ no explosion A9 08 LDA #8 \ mask bit 3 set of 24 65 BIT &65 \ INWK+31 \ exploding/display state|missiles F0 05 BEQ LL74 \ clear is hop to do New lines 20 78 4F JSR &4F78 \ LL155 \ else erase lines in XX19 heap at LINEstr down A9 08 LDA #8 \ set bit3, as new lines .LL74 \ do New lines 05 65 ORA &65 \ INWK+31 85 65 STA &65 \ INWK+31 A0 09 LDY #9 \ Hull byte#9, number of edges B1 1E LDA (&1E),Y \ (XX0),Y 85 97 STA &97 \ XX20 \ number of edges A0 00 LDY #0 \ ship lines heap offset to 0 for XX19 84 80 STY &80 \ U 84 86 STY &86 \ XX17 \ edge counter E6 80 INC &80 \ U \ ship lines heap offset = 1 24 65 BIT &65 \ INWK+31 50 54 BVC LL170 \ bit6 of display state clear (laser not firing) \ Calculate new lines A5 65 LDA &65 \ INWK+31 29 BF AND #&BF \ else laser is firing, clear bit6. 85 65 STA &65 \ INWK+31 A0 06 LDY #6 \ Hull byte#6, gun vertex*4 B1 1E LDA (&1E),Y \ (XX0),Y A8 TAY \ index to gun on XX3 heap BE 00 01 LDX &0100,Y \ XX3,Y 86 34 STX &34 \ XX15+0 \ x1 lo E8 INX \ was heap entry updated from #255? F0 41 BEQ LL170 \ skip the rest (laser node not visible) BE 01 01 LDX &0101,Y \ XX3+1,Y 86 35 STX &35 \ XX15+1 \ x1 hi E8 INX \ was heap entry updated from #255? F0 39 BEQ LL170 \ skip the rest (laser node not visible) BE 02 01 LDX &0102,Y \ XX3+2,Y 86 36 STX &36 \ XX15+2 \ y1 lo BE 03 01 LDX &0103,Y \ XX3+3,Y 86 37 STX &37 \ XX15+3 \ y1 hi A9 00 LDA #0 \ x2 lo.hi = 0 85 38 STA &38 \ XX15+4 85 39 STA &39 \ XX15+5 85 3B STA &3B \ XX12+1 \ y2 high = 0 A5 4C LDA &4C \ INWK+6 \ z ship lo 85 3A STA &3A \ XX12 \ y2 low = z-lo A5 48 LDA &48 \ INWK+2 \ xship sgn 10 02 BPL P%+4 \ skip dec C6 38 DEC &38 \ XX15+4 \ else x2 lo =#255 to right across screen 20 19 4E JSR &4E19 \ LL145 \ clip test on XX15 XX12 vector B0 18 BCS LL170 \ if carry set skip the rest (laser not firing) A4 80 LDY &80 \ U \ ship lines heap offset A5 34 LDA &34 \ X1 \ push (now clipped) to clipped lines ship heap 91 67 STA (&67),Y \ (XX19),Y C8 INY A5 35 LDA &35 \ Y1 91 67 STA (&67),Y \ (XX19),Y C8 INY A5 36 LDA &36 \ X2 91 67 STA (&67),Y \ (XX19),Y C8 INY A5 37 LDA &37 \ Y2 91 67 STA (&67),Y \ (XX19),Y C8 INY 84 80 STY &80 \ U \ ship lines heap offset updated .LL170 \ (laser not firing) \ Calculate new lines \ their comment A0 03 LDY #3 \ Hull byte#3 edges lo 18 CLC \ build base pointer B1 1E LDA (&1E),Y \ (XX0),Y 65 1E ADC &1E \ XX0 85 22 STA &22 \ V \ is pointer to where edges data start A0 10 LDY #&10 \ Hull byte #16 edges hi B1 1E LDA (&1E),Y \ (XX0),Y 65 1F ADC &1F \ XX0+1 85 23 STA &23 \ V+1 A0 05 LDY #5 \ Hull byte#5 is 4*MAXLI + 1, for ship lines stack B1 1E LDA (&1E),Y \ (XX0),Y 85 06 STA &06 \ T1 \ 4*MAXLI + 1, edge counter limit. A4 86 LDY &86 \ XX17 \ edge counter .LL75 \ -> &4DBE \ count Visible edges B1 22 LDA (&22),Y \ (V),Y \ edge data byte#0 C5 96 CMP &96 \ XX4 \ visibility 90 18 BCC LLx78 \ edge not visible C8 INY B1 22 LDA (&22),Y \ (V),Y \ edge data byte#1 C8 INY \ Y = 2 85 1B STA &1B \ P \ store byte#1 29 0F AND #&0F AA TAX \ lower 4 bits are face1 B5 D2 LDA &D2,X \ XX2,X \ face visibility D0 0E BNE LL79 \ hop down to Visible edge A5 1B LDA &1B \ P \ restore byte#1 4A LSR A 4A LSR A 4A LSR A 4A LSR A \ /=16 upper nibble AA TAX \ upper 4 bits are face2 B5 D2 LDA &D2,X \ XX2,X \ face visibility D0 03 BNE LL79 \ Visible edge, else .LLx78 \ edge not visible 4C 5B 4F JMP &4F5B \ LL78 \ edge not visible .LL79 \ Visible edge B1 22 LDA (&22),Y \ (V),Y \ edge data byte#2 AA TAX \ index into heap for first node of edge C8 INY \ Y = 3 B1 22 LDA (&22),Y \ (V),Y \ edge data byte#3 85 81 STA &81 \ Q \ index into node heap for other node of edge BD 01 01 LDA &0101,X \ XX3+1,X 85 35 STA &35 \ XX15+1 \ x1 hi BD 00 01 LDA &0100,X \ XX3+0,X 85 34 STA &34 \ XX15+0 \ x1 lo BD 02 01 LDA &0102,X \ XX3+2,X 85 36 STA &36 \ XX15+2 \ y1 lo BD 03 01 LDA &0103,X \ XX3+3,X 85 37 STA &37 \ XX15+3 \ y1 hi A6 81 LDX &81 \ Q \ other index into node heap for second node BD 00 01 LDA &0100,X \ XX3+0,X 85 38 STA &38 \ XX15+4 \ x2 lo BD 03 01 LDA &0103,X \ XX3+3,X 85 3B STA &3B \ XX12+1 \ y2 hi BD 02 01 LDA &0102,X \ XX3+2,X 85 3A STA &3A \ XX12+0 \ y2 lo BD 01 01 LDA &0101,X \ XX3+1,X 85 39 STA &39 \ XX15+5 \ x2 hi 20 1F 4E JSR &4E1F \ LL147 \ CLIP2, take care of swop and clips B0 C6 BCS LLx78 \ jmp LL78 edge not visible 4C 3F 4F JMP &4F3F \ LL80 \ else continue down to Shove visible edge onto \ (XX19) heap, loop next data edge .LL145 \ -> &4E19 CLIP XX15 XX12 line \ BLINE etc. waiting for (X1,Y1), (X2,Y2) to draw a line. \ Before clipping, XX15(0,1) was x1. XX15(2,3) was y1. XX15(4,5) was x2. XX12(0,1) was y2. A9 00 LDA #0 85 90 STA &90 \ SWAP A5 39 LDA &39 \ XX15+5 \ x2 hi .LL147 \ -> &4E1F \ CLIP2 arrives from LL79 to do swop and clip A2 BF LDX #&BF \ #Y*2-1 yClip = screen height 05 3B ORA &3B \ XX12+1 \ y2 hi D0 06 BNE LL107 \ skip yClip reset E4 3A CPX &3A \ XX12+0 \ is screen height < y2 lo? 90 02 BCC LL107 \ if yes, skip yClip A2 00 LDX #0 \ else yClip = 0 .LL107 \ skipped yClip 86 89 STX &89 \ XX13 \ yClip A5 35 LDA &35 \ XX15+1 \ x1 hi 05 37 ORA &37 \ XX15+3 \ y1 hi D0 1C BNE LL83 \ no hi bits in coord 1 present A9 BF LDA #&BF \ #Y*2-1 screen height C5 36 CMP &36 \ XX15+2 \ y1 lo 90 16 BCC LL83 \ if screen height < y1 lo skip A top A5 89 LDA &89 \ XX13 \ yClip D0 10 BNE LL108 \ hop down, yClip not zero .LL146 \ -> &4E3D \ Finished clipping, Shuffle XX15 down to (X1,Y1) (X2,Y2) A5 36 LDA &36 \ XX15+2 \ y1 lo 85 35 STA &35 \ XX15+1 \ new Y1 A5 38 LDA &38 \ XX15+4 \ x2 lo 85 36 STA &36 \ XX15+2 \ new X2 A5 3A LDA &3A \ XX12+0 \ y2 lo 85 37 STA &37 \ XX15+3 \ new Y2 18 CLC \ valid to plot is in XX15(0to3) 60 RTS \ 2nd pro different, it swops based on swop flag around here. .LL109 \ clipped line Not visible 38 SEC 60 RTS .LL108 \ arrived as yClip not zero in LL107 clipping 46 89 LSR &89 \ XX13 \ yClip = Ymid .LL83 \ also arrive from LL107 if bits in hi present or y1_lo > screen height, A top A5 89 LDA &89 \ XX13 \ yClip 10 2F BPL LL115 \ yClip < 128 A5 35 LDA &35 \ XX15+1 \ x1 hi 25 39 AND &39 \ XX15+5 \ x2 hi 30 F2 BMI LL109 \ clipped line Not visible A5 37 LDA &37 \ XX15+3 \ y1 hi 25 3B AND &3B \ XX12+1 \ y2 hi 30 EC BMI LL109 \ clipped line Not visible A6 35 LDX &35 \ XX15+1 \ x1 hi CA DEX 8A TXA \ Acc = x1 hi -1 A6 39 LDX &39 \ XX15+5 \ x2 hi CA DEX 86 3C STX &3C \ XX12+2 \ x2 hi -- 05 3C ORA &3C \ XX12+2 \ (x1 hi -1) or (x2 hi -1) 10 DF BPL LL109 \ clipped line not visible A5 36 LDA &36 \ XX15+2 \ y1 lo C9 C0 CMP #&C0 \ #Y*2 screen height, maybe carry set A5 37 LDA &37 \ XX15+3 \ y1 hi E9 00 SBC #0 \ any carry 85 3C STA &3C \ XX12+2 \ y1 hi-- A5 3A LDA &3A \ XX12+0 \ y2 lo C9 C0 CMP #&C0 \ #Y*2 screen height, maybe carry set A5 3B LDA &3B \ XX12+1 \ y2 hi E9 00 SBC #0 \ any carry 05 3C ORA &3C \ XX12+2 \ (y1 hi -1) or (y2 hi -1) 10 C9 BPL LL109 \ clipped line Not visible .LL115 \ also arrive from LL83 with yClip < 128 need to trim. 98 TYA \ index for edge data 48 PHA \ protect offset A5 38 LDA &38 \ XX15+4 \ x2 lo 38 SEC E5 34 SBC &34 \ XX15 \ x1 lo 85 3C STA &3C \ XX12+2 \ delta_x lo A5 39 LDA &39 \ XX15+5 \ x2 hi E5 35 SBC &35 \ XX15+1 \ x1 hi 85 3D STA &3D \ XX12+3 \ delta_x hi A5 3A LDA &3A \ XX12+0 \ y2 lo 38 SEC E5 36 SBC &36 \ XX15+2 \ y1 lo 85 3E STA &3E \ XX12+4 \ delta_y lo A5 3B LDA &3B \ XX12+1 \ y2 hi E5 37 SBC &37 \ XX15+3 \ y1 hi 85 3F STA &3F \ XX12+5 \ delta_y hi 45 3D EOR &3D \ XX12+3 \ delta_x hi 85 83 STA &83 \ S \ quadrant relationship for gradient A5 3F LDA &3F \ XX12+5 \ delta_y hi 10 0D BPL LL110 \ hop down if delta_y positive A9 00 LDA #0 \ else flip sign of delta_y 38 SEC \ delta_y lo E5 3E SBC &3E \ XX12+4 85 3E STA &3E \ XX12+4 A9 00 LDA #0 \ delta_y hi E5 3F SBC &3F \ XX12+5 85 3F STA &3F \ XX12+5 .LL110 \ delta_y positive A5 3D LDA &3D \ XX12+3 \ delta_x hi 10 0B BPL LL111 \ hop down if positive to GETgrad 38 SEC \ else flip sign of delta_x A9 00 LDA #0 \ delta_x lo E5 3C SBC &3C \ XX12+2 85 3C STA &3C \ XX12+2 A9 00 LDA #0 \ Acc will have delta_x hi +ve E5 3D SBC &3D \ XX12+3 \GETgrad \ get Gradient for trimming .LL111 \ -> &4EC2 \ roll Acc delta_x hi AA TAX \ delta_x hi D0 04 BNE LL112 \ skip if delta_x hi not zero A6 3F LDX &3F \ XX12+5 \ delta_y hi F0 0A BEQ LL113 \ Exit when both delta hi zero .LL112 \ skipped as delta_x hi not zero 4A LSR A \ delta_x hi/=2 66 3C ROR &3C \ XX12+2 \ delta_x lo/=2 46 3F LSR &3F \ XX12+5 \ delta_y hi/=2 66 3E ROR &3E \ XX12+4 \ delta_y lo/=2 4C C2 4E JMP &4EC2 \ LL111 \ loop GETgrad .LL113 \ Exited as both delta hi zero for trimming 86 D1 STX &D1 \ T \ delta_y hi = 0 A5 3C LDA &3C \ XX12+2 \ delta_x lo C5 3E CMP &3E \ XX12+4 \ delta_y lo 90 0A BCC LL114 \ hop to STEEP as x < y 85 81 STA &81 \ Q \ else shallow, Q = delta_x lo A5 3E LDA &3E \ XX12+4 \ delta_y lo 20 EF 47 JSR &47EF \ LL28 \ BFRDIV R=A*256/Q = delta_y / delta_x \ Use Y/X grad. \ as not steep 4C F0 4E JMP &4EF0 \ LL116 \ gradient now known, go a few lines down .LL114 \ else STEEP A5 3E LDA &3E \ XX12+4 \ delta_y lo 85 81 STA &81 \ Q A5 3C LDA &3C \ XX12+2 \ delta_x lo 20 EF 47 JSR &47EF \ LL28 \ BFRDIV R=A*256/Q = delta_x / delta_y \ Use X/Y grad. C6 D1 DEC &D1 \ T \ steep toggle updated T = #&FF .LL116 \ -> &4EF0 \ arrive here for both options with known gradient A5 82 LDA &82 \ R \ gradient 85 3C STA &3C \ XX12+2 A5 83 LDA &83 \ S \ quadrant info 85 3D STA &3D \ XX12+3 A5 89 LDA &89 \ XX13 F0 02 BEQ LL138 \ yClip = 0 or 191?, skip bpl 10 13 BPL LLX117 \ yClip+ve, swop nodes .LL138 \ yClip = 0 or or >127 need to fit x1,y1 into bounding box 20 9F 4F JSR &4F9F \ LL118 \ Trim XX15,XX15+2 to screen grad=XX12+2 A5 89 LDA &89 \ XX13 10 31 BPL LL124 \ yClip+ve, finish clip .LL117 \ yClip > 127 A5 35 LDA &35 \ XX15+1 \ x1 hi 05 37 ORA &37 \ XX15+3 \ y1 hi D0 30 BNE LL137 \ some hi bits present, no line. A5 36 LDA &36 \ XX15+2 \ y1 lo C9 C0 CMP #&C0 \ #Y*2 Yscreen full height B0 2A BCS LL137 \ if y1 lo >= Yscreen, no line. .LLX117 \ yClip+ve from LL116, swop nodes then trim nodes, XX12+2 = gradient, XX12+3 = quadrant info. A6 34 LDX &34 \ XX15+0 \ x1 lo A5 38 LDA &38 \ XX15+4 \ x2 lo 85 34 STA &34 \ XX15+0 86 38 STX &38 \ XX15+4 A5 39 LDA &39 \ XX15+5 \ x2 hi A6 35 LDX &35 \ XX15+1 \ x1 hi 86 39 STX &39 \ XX15+5 85 35 STA &35 \ XX15+1 A6 36 LDX &36 \ XX15+2 \ y1 lo \ Onto swopping y A5 3A LDA &3A \ XX12+0 \ y2 lo 85 36 STA &36 \ XX15+2 86 3A STX &3A \ XX12+0 A5 3B LDA &3B \ XX12+1 \ y2 hi A6 37 LDX &37 \ XX15+3 \ y1 hi 86 3B STX &3B \ XX12+1 85 37 STA &37 \ XX15+3 \ finished swop of (x1 y1) and (x2 y2) 20 9F 4F JSR &4F9F \ LL118 \ Trim XX15,XX15+2 to screen grad=XX12+2 C6 90 DEC &90 \ SWAP .LL124 \ also yClip+ve from LL138, finish clip 68 PLA \ restore ship edge index A8 TAY 4C 3D 4E JMP &4E3D \ LL146 \ up, Finished clipping, Shuffle XX15 down to (x1,y1) (x2,y2) .LL137 \ no line 68 PLA \ restore ship edge index A8 TAY 38 SEC \ not visible 60 RTS \ -- Finished clipping \ Back to edges (visible) loop .LL80 \ -> &4F3F \ Shove visible edge onto XX19 ship lines heap counter U A4 80 LDY &80 \ U \ clipped edges heap index A5 34 LDA &34 \ X1 91 67 STA (&67),Y \ (XX19),Y C8 INY A5 35 LDA &35 \ Y1 91 67 STA (&67),Y \ (XX19),Y C8 INY A5 36 LDA &36 \ X2 91 67 STA (&67),Y \ (XX19),Y C8 INY A5 37 LDA &37 \ Y2 91 67 STA (&67),Y \ (XX19),Y C8 INY 84 80 STY &80 \ U \ clipped ship lines heap index C4 06 CPY &06 \ T1 \ >= 4*MAXLI + 1 counter limit B0 17 BCS LL81 \ hop over jmp to Exit edge data loop .LL78 \ -> &46D6 \ also arrive here if Edge not visible, loop next data edge. E6 86 INC &86 \ XX17 \ edge counter A4 86 LDY &86 \ XX17 C4 97 CPY &97 \ XX20 \ number of edges B0 0F BCS LL81 \ hop over jmp to Exit edge data loop A0 00 LDY #0 \ else next edge A5 22 LDA &22 \ V 69 04 ADC #4 \ take edge data pointer up to next edge 85 22 STA &22 \ V 90 02 BCC ll81 \ skip inc hi E6 23 INC &23 \ V+1 .ll81 \ skip inc hi 4C BE 4D JMP &4DBE \ LL75 \ Loop Next Edge .LL81 \ -> &4F72 \ Exited edge data loop A5 80 LDA &80 \ U \ clipped ship lines heap index for (XX19),Y \ LL81+2 \ SHPPT ship is a point arrives here with Acc=8, bottom entry in heap A0 00 LDY #0 \ first entry in ship edges heap is number of bytes 91 67 STA (&67),Y \ (XX19),Y .LL155 \ -> &46F3 \ CLEAR LINEstr visited by EE31 when XX3 heap ready to draw/erase lines in XX19 heap. A0 00 LDY #0 \ number of bytes B1 67 LDA (&67),Y \ (XX19),Y 85 97 STA &97 \ XX20 \ valid length of heap XX19 C9 04 CMP #4 \ If < 4 then 90 1C BCC LL118-1 \ rts C8 INY \ #1 .LL27 \ counter Y, Draw clipped lines in XX19 ship lines heap B1 67 LDA (&67),Y \ (XX19),Y 85 34 STA &34 \ X1 C8 INY B1 67 LDA (&67),Y \ (XX19),Y 85 35 STA &35 \ Y1 C8 INY B1 67 LDA (&67),Y \ (XX19),Y 85 36 STA &36 \ X2 C8 INY B1 67 LDA (&67),Y \ (XX19),Y 85 37 STA &37 \ Y2 20 C4 16 JSR &16C4 \ LOIN \ draw line using (X1,Y1), (X2,Y2) C8 INY \ +=4 C4 97 CPY &97 \ XX20 \ number of edges in heap XX19 90 E5 BCC LL27 \ loop Y 60 RTS \ --- Wireframe end \ LL118-1 .LL118 \ -> &4F9F \ Trim XX15,XX15+2 to screen grad=XX12+2 for CLIP A5 35 LDA &35 \ XX15+1 \ x1 hi 10 17 BPL LL119 \ x1 hi+ve skip down 85 83 STA &83 \ S \ else x1 hi -ve 20 19 50 JSR &5019 \ LL120 \ X1<0 their comment \ X.Y = x1_lo.S * M/2566 8A TXA \ step Y1 lo 18 CLC 65 36 ADC &36 \ XX15+2 \ Y1 lo 85 36 STA &36 \ XX15+2 98 TYA \ step Y1 hi 65 37 ADC &37 \ XX15+3 \ Y1 hi 85 37 STA &37 \ XX15+3 A9 00 LDA #0 \ xleft min 85 34 STA &34 \ XX15+0 \ X1 lo 85 35 STA &35 \ XX15+1 \ X1 = 0 AA TAX \ Xreg = 0, will skip to Ytrim .LL119 \ x1 hi +ve from LL118 F0 19 BEQ LL134 \ if x1 hi = 0 skip to Ytrim 85 83 STA &83 \ S \ else x1 hi > 0 C6 83 DEC &83 \ S \ x1 hi-1 20 19 50 JSR &5019 \ LL120 \ X1>255 their comment \ X.Y = x1lo.S * M/256 8A TXA \ step Y1 lo 18 CLC 65 36 ADC &36 \ XX15+2 \ Y1 lo 85 36 STA &36 \ XX15+2 98 TYA \ step Y1 hi 65 37 ADC &37 \ XX15+3 \ Y1 hi 85 37 STA &37 \ XX15+3 A2 FF LDX #&FF \ xright max 86 34 STX &34 \ XX15+0 \ X1 lo E8 INX \ X = 0 86 35 STX &35 \ XX15+1 \ X1 = 255 .LL134 \ Ytrim A5 37 LDA &37 \ XX15+3 \ y1 hi 10 1A BPL LL135 \ y1 hi +ve 85 83 STA &83 \ S \ else y1 hi -ve A5 36 LDA &36 \ XX15+2 \ y1 lo 85 82 STA &82 \ R \ Y1<0 their comment 20 48 50 JSR &5048 \ LL123 \ X.Y=R.S*256/M (M=grad.) \where 256/M is gradient 8A TXA \ step X1 lo 18 CLC 65 34 ADC &34 \ XX15+0 \ X1 lo 85 34 STA &34 \ XX15+0 98 TYA \ step X1 hi 65 35 ADC &35 \ XX15+1 \ X1 hi 85 35 STA &35 \ XX15+1 A9 00 LDA #0 \ Y bottom min 85 36 STA &36 \ XX15+2 \ Y1 lo 85 37 STA &37 \ XX15+3 \ Y1 = 0 .LL135 \ y1 hi +ve from LL134 A5 36 LDA &36 \ XX15+2 \ Y1 lo 38 SEC E9 C0 SBC #&C0 \ #Y*2 screen y height 85 82 STA &82 \ R \ Y1>191 their comment A5 37 LDA &37 \ XX15+3 \ Y1 hi E9 00 SBC #0 \ any hi 85 83 STA &83 \ S 90 16 BCC LL136 \ failed, rts .LL139 20 48 50 JSR &5048 \ LL123 \ X.Y=R.S*256/M (M=grad.) \where 256/M is gradient 8A TXA \ step X1 lo 18 CLC 65 34 ADC &34 \ XX15+0 \ X1 lo 85 34 STA &34 \ XX15+0 98 TYA \ step X1 hi 65 35 ADC &35 \ XX15+1 \ X1 hi 85 35 STA &35 \ XX15+1 A9 BF LDA #&BF \ #Y*2-1 = y top max 85 36 STA &36 \ XX15+2 \ Y1 lo A9 00 LDA #0 \ Y1 hi = 0 85 37 STA &37 \ XX15+3 \ Y1 = 191 .LL136 \ rts 60 RTS \ -- trim for CLIP done .LL120 \ -> &5019 \ X.Y=x1lo.S*M/256 \ where M/256 is gradient A5 34 LDA &34 \ XX15+0 \ x1 lo 85 82 STA &82 \ R 20 84 50 JSR &5084 \ LL129 \ RS = abs(x1=RS) and return with 48 PHA \ store Acc = hsb x1 EOR quadrant_info, Q = (1/)gradient A6 D1 LDX &D1 \ T \ steep toggle = 0 or FF for steep/shallow down D0 2B BNE LL121 \ down Steep .LL122 \ else Shallow return step, also arrive from LL123 for steep stepX A9 00 LDA #0 AA TAX A8 TAY \ all = 0 at start 46 83 LSR &83 \ S \ hi /=2 66 82 ROR &82 \ R \ lo /=2 06 81 ASL &81 \ Q \ double 1/gradient 90 09 BCC LL126 \ hop first half of loop .LL125 \ roll Q up 8A TXA \ increase step 18 CLC 65 82 ADC &82 \ R AA TAX \ lo 98 TYA \ hi 65 83 ADC &83 \ S A8 TAY \ hi .LL126 \ first half of loop done 46 83 LSR &83 \ S \ hi /=2 66 82 ROR &82 \ R \ lo /=2 06 81 ASL &81 \ Q \ double 1/gradient B0 EF BCS LL125 \ if gradient not too small, loop Q D0 F6 BNE LL126 \ half loop as Q not emptied yet. 68 PLA \ restore quadrant info 10 30 BPL LL133 \ flip XY sign 60 RTS .LL123 \ -> &5048 \ X.Y=R.S*256/M (M=grad.) \ where 256/M is gradient 20 84 50 JSR &5084 \ LL129 \ RS = abs(y1=RS) and return with 48 PHA \ store Acc = hsb x1 EOR hi, Q = (1/)gradient A6 D1 LDX &D1 \ T \ steep toggle = 0 or FF for steep/shallow up D0 D5 BNE LL122 \ up Shallow .LL121 \ T = #&FF for Steep return stepY, shallow stepX A9 FF LDA #&FF A8 TAY 0A ASL A \ #&FE AA TAX \ Step X.Y= &FFFE at start .LL130 \ roll Y 06 82 ASL &82 \ R \ lo *=2 26 83 ROL &83 \ S \ hi *=2 A5 83 LDA &83 \ S B0 04 BCS LL131 \ if S overflowed skip Q test and do subtractions C5 81 CMP &81 \ Q 90 0B BCC LL132 \ if S < Q = 256/gradient skip subtractions .LL131 \ skipped Q test E5 81 SBC &81 \ Q 85 83 STA &83 \ S \ lo A5 82 LDA &82 \ R E9 00 SBC #0 \ hi 85 82 STA &82 \ R 38 SEC .LL132 \ skipped subtractions 8A TXA \ increase step 2A ROL A AA TAX \ stepX lo 98 TYA 2A ROL A A8 TAY \ stepX hi B0 E1 BCS LL130 \ loop Y if bit fell out of Y 68 PLA \ restore quadrant info 30 0C BMI LL128 \ down rts .LL133 \ flip XY sign, quadrant info +ve in LL120 arrives here too 8A TXA 49 FF EOR #&FF 69 01 ADC #1 AA TAX \ flip sign of x 98 TYA 49 FF EOR #&FF 69 00 ADC #0 A8 TAY \ flip sign of y .LL128 60 RTS .LL129 \ -> &5084 \ RS = abs(RS) and return Acc = hsb x1 EOR hi, Q = (1/)gradient A6 3C LDX &3C \ XX12+2 \ gradient 86 81 STX &81 \ Q A5 83 LDA &83 \ S \ hi 10 11 BPL LL127 \ hop to eor A9 00 LDA #0 \ else flip sign of R 38 SEC E5 82 SBC &82 \ R 85 82 STA &82 \ R A5 83 LDA &83 \ S 48 PHA \ push old S 49 FF EOR #&FF \ flip S 69 00 ADC #0 85 83 STA &83 \ S 68 PLA \ pull old S for eor .LL127 45 3D EOR &3D \ XX12+3 \ Acc ^= quadrant info 60 RTS \ -- CLIP, bounding box is now done, \ ----===== End of Block G ====== Below is Flight block H --- &50A0 .MVEIT \ -> &50A0 \ Move It, data in INWK and hull XXX0 A5 65 LDA &65 \ INWK+31 \ exploding/display state|missiles 29 A0 AND #&A0 \ kill or in explosion? D0 25 BNE MV30 \ Dumb ship or exploding A5 8A LDA &8A \ MCNT \ move count 45 84 EOR &84 \ XSAV \ nearby ship slot 29 0F AND #&0F \ only tidy ship if slot survives D0 03 BNE MV3 \ else skip tidy 20 79 46 JSR &4679 \ TIDY \ re-orthogonalize rotation matrix .MV3 \ skipped tidy A6 8C LDX &8C \ TYPE \ ship type 10 03 BPL P%+5 \ not planet 4C 3D 53 JMP &533D \ MV40 \ else, move Planet. A5 66 LDA &66 \ INWK+32 \ ai_attack_univ_ecm 10 0F BPL MV30 \ Dumb ship E0 01 CPX #1 \ #MSL F0 08 BEQ MV26 \ missile done every mcnt A5 8A LDA &8A \ MCNT \ move count 45 84 EOR &84 \ XSAV \ nearby ship slot 29 07 AND #7 \ else tactics only needed every 8 D0 03 BNE MV30 \ Dumb ship .MV26 \ missile done every mcnt 20 7A 21 JSR &217A \ TACTICS .MV30 \ Dumb ship or exploding 20 58 55 JSR &5558 \ SCAN \ erase inwk ship on scanner A5 61 LDA &61 \ INWK+27 \ speed 0A ASL A 0A ASL A \ *=4 speed 85 81 STA &81 \ Q A5 50 LDA &50 \ INWK+10 29 7F AND #&7F \ x_inc/2 hi 20 47 28 JSR &2847 \ FMLTU \ x_inc*speed/256unsg 85 82 STA &82 \ R A5 50 LDA &50 \ INWK+10 A2 00 LDX #0 \ x_inc/2 hi 20 4A 52 JSR &524A \ MVT1-2 \ use Abit7 for x+=R A5 52 LDA &52 \ INWK+12 29 7F AND #&7F \ y_inc/2 hi 20 47 28 JSR &2847 \ FMLTU \ y_inc*speed/256unsg 85 82 STA &82 \ R A5 52 LDA &52 \ INWK+12 A2 03 LDX #3 \ y_inc/2 hi 20 4A 52 JSR &524A \ MVT1-2 \ use Abit7 for y+=R A5 54 LDA &54 \ INWK+14 29 7F AND #&7F \ z_inc/2 hi 20 47 28 JSR &2847 \ FMLTU \ z_inc*speed/256unsg 85 82 STA &82 \ R A5 54 LDA &54 \ INWK+14 A2 06 LDX #6 \ z_inc/2 hi 20 4A 52 JSR &524A \ MVT1-2 \ use Abit7 for z+=R A5 61 LDA &61 \ INWK+27 18 CLC \ update speed with 65 62 ADC &62 \ INWK+28 \ accel used for 1 frame 10 02 BPL P%+4 \ keep speed +ve A9 00 LDA #0 \ cant go -ve A0 0F LDY #&15 \ hull byte#15 is max speed D1 1E CMP (&1E),Y \ (XX0),Y 90 02 BCC P%+4 \ else clamp speed to hull max B1 1E LDA (&1E),Y \ (XX0),Y 85 61 STA &61 \ INWK+27 \ speed A9 00 LDA #0 \ accel was used for 1 frame 85 62 STA &62 \ INWK+28 A6 31 LDX &31 \ ALP1 \ roll mag lower7 bits A5 46 LDA &46 \ INWK+0 49 FF EOR #&FF \ flip xlo 85 1B STA &1B \ P A5 47 LDA &47 \ INWK+1 \ xhi 20 77 28 JSR &2877 \ MLTU2-2 \ AP(2)= AP* alp1_unsg(EOR P) 85 1D STA &1D \ P+2 A5 33 LDA &33 \ ALP2+1 \ flipped roll sign 45 48 EOR &48 \ INWK+2 \ xsg A2 03 LDX #3 \ y_shift 20 08 53 JSR &5308 \ MVT6 \ P(1,2) += inwk,x (A is protected but with new sign) 85 9E STA &9E \ K2+3 \ sg for Y-aX A5 1C LDA &1C \ P+1 85 9C STA &9C \ K2+1 49 FF EOR #&FF \ flip 85 1B STA &1B \ P A5 1D LDA &1D \ P+2 85 9D STA &9D \ K2+2 \K2=Y-aX \ their comment \ Yinwk corrected for alpha roll A6 2B LDX &2B \ BET1 \ pitch mag lower7 bits 20 77 28 JSR &2877 \ MLTU2-2 \ AP(2)= AP* bet1_unsg(EOR P) 85 1D STA &1D \ P+2 A5 9E LDA &9E \ K2+3 45 7B EOR &7B \ BET2 \ pitch sign A2 06 LDX #6 \ z_shift 20 08 53 JSR &5308 \ MVT6 \ P(1,2) += inwk,x (A is protected but with new sign) 85 4E STA &4E \ INWK+8 \ zsg A5 1C LDA &1C \ P+1 85 4C STA &4C \ INWK+6 \ zlo 49 FF EOR #&FF \ flip 85 1B STA &1B \ P A5 1D LDA &1D \ P+2 85 4D STA &4D \ INWK+7 \ zhi \Z=Z+bK2 \ their comment 20 79 28 JSR &2879 \ MLTU2 \ AP(2)= AP* Qunsg(EOR P) \ Q = speed 85 1D STA &1D \ P+2 A5 9E LDA &9E \ K2+3 85 4B STA &4B \ INWK+5 \ ysg 45 7B EOR &7B \ BET2 \ pitch sign 45 4E EOR &4E \ INWK+8 \ zsg 10 0F BPL MV43 \ +ve zsg A5 1C LDA &1C \ P+1 65 9C ADC &9C \ K2+1 85 49 STA &49 \ INWK+3 \ ylo A5 1D LDA &1D \ P+2 65 9D ADC &9D \ K2+2 85 4A STA &4A \ INWK+4 \ yhi 4C 9D 51 JMP &519D \ MV44 \ roll&pitch continue .MV43 \ +ve ysg zsg A5 9C LDA &9C \ K2+1 E5 1C SBC &1C \ P+1 85 49 STA &49 \ INWK+3 \ ylo A5 9D LDA &9D \ K2+2 E5 1D SBC &1D \ P+2 85 4A STA &4A \ INWK+4 \ yhi B0 12 BCS MV44 \ roll&pitch continue A9 01 LDA #1 \ ylo flipped E5 49 SBC &49 \ INWK+3 85 49 STA &49 \ INWK+3 A9 00 LDA #0 \ any carry into yhi E5 4A SBC &4A \ INWK+4 85 4A STA &4A \ INWK+4 A5 4B LDA &4B \ INWK+5 49 80 EOR #&80 \ flip ysg 85 4B STA &4B \ INWK+5 \ ysg \Y=K2-bZ \ their comment .MV44 \ -> &519D \ roll&pitch continue A6 31 LDX &31 \ ALP1 \ roll mag lower7 bits A5 49 LDA &49 \ INWK+3 49 FF EOR #&FF \ flip ylo 85 1B STA &1B \ P A5 4A LDA &4A \ INWK+4 \ yhi 20 77 28 JSR &2877 \ MLTU2-2 \ AP(2)= AP* alp1_unsg(EOR P) 85 1D STA &1D \ P+2 A5 32 LDA &32 \ ALP2 \ roll sign 45 4B EOR &4B \ INWK+5 \ ysg A2 00 LDX #0 \ x_shift 20 08 53 JSR &5308 \ MVT6 \ P(1,2) += inwk,x (A is protected but with new sign) 85 48 STA &48 \ INWK+2 \ xsg A5 1D LDA &1D \ P+2 85 47 STA &47 \ INWK+1 \ xhi A5 1C LDA &1C \ P+1 85 46 STA &46 \ INWK+0 \ xlo \X=X+aY \ their comment .MV45 \ -> &51BF \ move inwk by speed A5 7D LDA &7D \ DELTA \ speed 85 82 STA &82 \ R A9 80 LDA #&80 \ force inc sign to be -ve A2 06 LDX #6 \ z_shift 20 4C 52 JSR &524C \ MVT1 \ Add R|sgnA to inwk,x+0to2 A5 8C LDA &8C \ TYPE \ ship type 29 81 AND #&81 \ sun bits C9 81 CMP #&81 \ is sun? D0 01 BNE notsun 60 RTS \Z=Z-d \ their comment .notsun \ All except Suns A0 09 LDY #9 \ select row 20 A1 52 JSR &52A1 \ MVS4 \ moveship4 \ pitch&roll update to rotmat A0 0F LDY #15 20 A1 52 JSR &52A1 \ MVS4 \ moveship4 \ pitch&roll update to rotmat A0 15 LDY #21 20 A1 52 JSR &52A1 \ MVS4 \ moveship4 \ pitch&roll update to rotmat A5 64 LDA &64 \ INWK+30 \ rotz counter 29 80 AND #&80 \ rotz sign 85 9A STA &9A \ RAT2 A5 64 LDA &64 \ INWK+30 29 7F AND #&7F \ pitch mag lower 7bits F0 1D BEQ MV8 \ rotz=0, Other rotation. C9 7F CMP #&7F \ C set if equal, no damping of pitch E9 00 SBC #0 \ reduce z pitch, rotz 05 9A ORA &9A \ RAT2 \ reinclude rotz sign 85 64 STA &64 \ INWK+30 \ rotz counter A2 0F LDX #15 \ select column A0 09 LDY #9 \ select row 20 A8 1D JSR &1DA8 \ MVS5 \ moveship5, small rotation in matrix A2 11 LDX #17 A0 0B LDY #11 20 A8 1D JSR &1DA8 \ MVS5 A2 13 LDX #19 A0 0D LDY #13 20 A8 1D JSR &1DA8 \ MVS5 .MV8 \ Other rotation, roll. A5 63 LDA &63 \ INWK+29 \ rotx counter 29 80 AND #&80 \ rotx sign 85 9A STA &9A \ RAT2 A5 63 LDA &63 \ INWK+29 \ rotx counter 29 7F AND #&7F \ roll mag lower 7 bits F0 1D BEQ MV5 \ rotations Done C9 7F CMP #&7F \ C set if equal, no damping of x roll E9 00 SBC #0 \ reduce x roll 05 9A ORA &9A \ RAT2 \ reinclude sign 85 63 STA &63 \ INWK+29 \ rotx counter A2 0F LDX #15 \ select column A0 15 LDY #21 \ select row 20 A8 1D JSR &1DA8 \ MVS5 \ moveship5, small rotation in matrix A2 11 LDX #17 A0 17 LDY #23 20 A8 1D JSR &1DA8 \ MVS5 A2 13 LDX #19 A0 19 LDY #25 20 A8 1D JSR &1DA8 \ MVS5 .MV5 \ rotations Done A5 65 LDA &65 \ INWK+31 \ display explosion state|missiles 29 A0 AND #&A0 \ do kill at end of explosion D0 09 BNE MVD1 \ end explosion A5 65 LDA &65 \ INWK+31 09 10 ORA #&10 \ else keep visible on scanner, set bit4. 85 65 STA &65 \ INWK+31 4C 58 55 JMP &5558 \ SCAN \ ships inwk on scanner .MVD1 \ end explosion A5 65 LDA &65 \ INWK+31 29 EF AND #&EF \ clear bit4, now invisible. 85 65 STA &65 \ INWK+31 60 RTS \ &524A \ MVT1-2 \ x=0,3,6 for x,y,z coord 29 80 AND #&80 \ use Abit7 for x+=R .MVT1 \ -> &524C \ Add Rlo.Ahi.sg to inwk,x+0to2 ship translation 0A ASL A \ bit7 into carry 85 83 STA &83 \ S \ A6to0 A9 00 LDA #0 6A ROR A \ sign bit from Acc 85 D1 STA &D1 \ T 46 83 LSR &83 \ S \ A6to0 55 48 EOR &48,X \ INWK+2,X 30 15 BMI MV10 \ -ve sg eor T A5 82 LDA &82 \ R \ lo 75 46 ADC &46,X \ INWK+0,X 95 46 STA &46,X \ INWK+0,X A5 83 LDA &83 \ S \ A6to0 \ hi 75 47 ADC &47,X \ INWK+1,X 95 47 STA &47,X \ INWK+1,X B5 48 LDA &48,X \ INWK+2,X 69 00 ADC #0 \ sign bit from Acc 05 D1 ORA &D1 \ T 95 48 STA &48,X \ INWK+2,X 60 RTS .MV10 \ -ve sg eor T B5 46 LDA &46,X \ INWK+0,X 38 SEC \ lo sub E5 82 SBC &82 \ R 95 46 STA &46,X \ INWK+0,X B5 47 LDA &47,X \ INWK+1,X E5 83 SBC &83 \ S \ sub A6to0 \ hi 95 47 STA &47,X \ INWK+1,X B5 48 LDA &48,X \ INWK+2,X 29 7F AND #&7F \ keep far E9 00 SBC #0 \ any carry 09 80 ORA #&80 \ sign 45 D1 EOR &D1 \ T 95 48 STA &48,X \ INWK+2,X B0 16 BCS MV11 \ rts A9 01 LDA #1 \ else need to flip sign F5 46 SBC &46,X \ INWK+0,X 95 46 STA &46,X \ INWK+0,X A9 00 LDA #0 \ hi F5 47 SBC &47,X \ INWK+1,X 95 47 STA &47,X \ INWK+1,X A9 00 LDA #0 \ sg F5 48 SBC &48,X \ INWK+2,X 29 7F AND #&7F \ keep far 05 D1 ORA &D1 \ T 95 48 STA &48,X \ INWK+2,X .MV11 60 RTS \ MVT1 done \ roll alpha=a pitch beta=b, z in direction of travel, y is vertical. \ [ ca sa 0 ] [ 1 a 0] [x] [x + ay ] \ [ -sa.cb ca.cb -sb ] -> [- a 1 -b] so [y] -> [y - ax -bz ] \ [ -sa.sb ca.sb cb ] [-ab b 1] [z] [z + b(y - ax)] .MVS4 \ -> &52A1 \ Moveship4, Y is matrix row, pitch&roll update to coordinates A5 8D LDA &8D \ ALPHA 85 81 STA &81 \ Q \ player ship's roll B6 48 LDX &48,Y \ INWK+2,Y 86 82 STX &82 \ R \ lo B6 49 LDX &49,Y \ INWK+3,Y 86 83 STX &83 \ S \ hi B6 46 LDX &46,Y \ INWK+0,Y 86 1B STX &1B \ P \ over-written B9 47 00 LDA &0047,Y \ INWK+1,Y 49 80 EOR #&80 \ flip sign 20 FC 28 JSR &28FC \ MAD \ X.A = alpha*INWK+1,Y + INWK+2to3,Y 99 49 00 STA &0049,Y \ INWK+3,Y \ hi 96 48 STX &48,Y \ INWK+2,Y \ Y=Y-aX \ their comment 86 1B STX &1B \ P B6 46 LDX &46,Y \ INWK+0,Y 86 82 STX &82 \ R \ lo B6 47 LDX &47,Y \ INWK+1,Y 86 83 STX &83 \ S \ hi B9 49 00 LDA &0049,Y \ INWK+3,Y 20 FC 28 JSR &28FC \ MAD \ X.A = alpha*INWK+3,Y + INWK+0to1,Y 99 47 00 STA &0047,Y \ INWK+1,Y \ hi 96 46 STX &46,Y \ INWK+0,Y \ X=X+aY \ their comment 86 1B STX &1B \ P A5 2A LDA &2A \ BETA 85 81 STA &81 \ Q \ player ship's pitch B6 48 LDX &48,Y \ INWK+2,Y 86 82 STX &82 \ R \ lo B6 49 LDX &49,Y \ INWK+3,Y 86 83 STX &83 \ S \ hi B6 4A LDX &4A,Y \ INWK+4,Y 86 1B STX &1B \ P \ lo B9 4B 00 LDA &004B,Y \ INWK+5,Y 49 80 EOR #&80 \ flip sign hi 20 FC 28 JSR &28FC \ MAD \ X.A =-beta*INWK+5,Y + INWK+2to3,Y 99 49 00 STA &0049,Y \ INWK+3,Y \ hi 96 48 STX &48,Y \ INWK+2,Y \ Y=Y-bZ \ their comment 86 1B STX &1B \ P B6 4A LDX &4A,Y \ INWK+4,Y 86 82 STX &82 \ R \ lo B6 4B LDX &4B,Y \ INWK+5,Y 86 83 STX &83 \ S \ hi B9 49 00 LDA &0049,Y \ INWK+3,Y 20 FC 28 JSR &28FC \ MAD \ X.A = beta*INWK+3,Y + INWK+4,5,Y 99 4B 00 STA &004B,Y \ INWK+5,Y \ hi 96 4A STX &4A,Y \ INWK+4,Y \ Z=Z+bY \ their comment 60 RTS \ MVS4 done .MVT6 \ -> &5308 \ Planet P(1,2) += inwk,x for planet (Asg is protected but with new sign) A8 TAY \ Yreg = sg 55 48 EOR &48,X \ INWK+2,X 30 0F BMI MV50 \ sg -ve A5 1C LDA &1C \ P+1 18 CLC \ add lo 75 46 ADC &46,X \ INWK,X 85 1C STA &1C \ P+1 A5 1D LDA &1D \ P+2 \ add hi 75 47 ADC &47,X \ INWK+1,X 85 1D STA &1D \ P+2 98 TYA \ restore old sg ok 60 RTS .MV50 \ sg -ve B5 46 LDA &46,X \ INWK+0,X 38 SEC \ sub lo E5 1C SBC &1C \ P+1 85 1C STA &1C \ P+1 B5 47 LDA &47,X \ INWK+1,X E5 1D SBC &1D \ P+2 \ sub hi 85 1D STA &1D \ P+2 90 04 BCC MV51 \ fix -ve 98 TYA \ restore Asg 49 80 EOR #&80 \ but flip sign 60 RTS .MV51 \ fix -ve A9 01 LDA #1 \ carry was clear E5 1C SBC &1C \ P+1 85 1C STA &1C \ P+1 A9 00 LDA #0 \ sub hi E5 1D SBC &1D \ P+2 85 1D STA &1D \ P+2 98 TYA \ old Asg ok 60 RTS \ MVT6 done. .MV40 \ -> &533D \ move Planet A5 8D LDA &8D \ ALPHA 49 80 EOR #&80 \ flip roll 85 81 STA &81 \ Q A5 46 LDA &46 \ INWK 85 1B STA &1B \ P \ xlo A5 47 LDA &47 \ INWK+1 85 1C STA &1C \ P+1 \ xhi A5 48 LDA &48 \ INWK+2 \ xsg 20 82 27 JSR &2782 \ MULT3 \ K(4)= -AP(2)*alpha A2 03 LDX #3 \ Y coords 20 4C 1D JSR &1D4C \ MVT3 \ add INWK(0to2+X) to K(1to3) \ K=Y-a*X \ their comment A5 41 LDA &41 \ K+1 85 9C STA &9C \ K2+1 85 1B STA &1B \ P \ lo A5 42 LDA &42 \ K+2 85 9D STA &9D \ K2+2 85 1C STA &1C \ P+1 \ hi A5 2A LDA &2A \ BETA 85 81 STA &81 \ Q A5 43 LDA &43 \ K+3 85 9E STA &9E \ K2+3 \ sg 20 82 27 JSR &2782 \ MULT3 \ K(4)= AP(2)*beta A2 06 LDX #6 \ Z coords 20 4C 1D JSR &1D4C \ MVT3 \ add INWK(0to2+X) to K(1to3) \ K = Z+b*K2 A5 41 LDA &41 \ K+1 85 1B STA &1B \ P \ zlo 85 4C STA &4C \ INWK+6 A5 42 LDA &42 \ K+2 85 1C STA &1C \ P+1 \ zhi 85 4D STA &4D \ INWK+7 A5 43 LDA &43 \ K+3 85 4E STA &4E \ INWK+8 \ zsg \Z=Z+b*K2 \ their comment 49 80 EOR #&80 \ -Z sgn 20 82 27 JSR &2782 \ MULT3 \ K(4)= -Z*beta A5 43 LDA &43 \ K+3 29 80 AND #&80 \ sign 85 D1 STA &D1 \ T 45 9E EOR &9E \ K2+3 30 18 BMI MV1 \ planet y = -Z*beta-K2 A5 40 LDA &40 \ K 18 CLC \ else y = -Z*beta+K2 65 9B ADC &9B \ K2 A5 41 LDA &41 \ K+1 65 9C ADC &9C \ K2+1 85 49 STA &49 \ INWK+3 \ ylo A5 42 LDA &42 \ K+2 65 9D ADC &9D \ K2+2 85 4A STA &4A \ INWK+4 \ yhi A5 43 LDA &43 \ K+3 65 9E ADC &9E \ K2+3 4C DB 53 JMP &53DB \ MV2 \ continue pitch Planet .MV1 \ planet y = -Z*beta-K2 A5 40 LDA &40 \ K 38 SEC \ yre E5 9B SBC &9B \ K2 A5 41 LDA &41 \ K+1 E5 9C SBC &9C \ K2+1 85 49 STA &49 \ INWK+3 \ ylo A5 42 LDA &42 \ K+2 E5 9D SBC &9D \ K2+2 85 4A STA &4A \ INWK+4 \ yhi A5 9E LDA &9E \ K2+3 29 7F AND #&7F \ mag of K2+3 85 1B STA &1B \ P A5 43 LDA &43 \ K+3 29 7F AND #&7F \ mag of K+3 E5 1B SBC &1B \ P 85 1B STA &1B \ P B0 12 BCS MV2 \ continue pitch Planet A9 01 LDA #1 \ carry clear, fix ylo E5 49 SBC &49 \ INWK+3 85 49 STA &49 \ INWK+3 A9 00 LDA #0 \ yhi E5 4A SBC &4A \ INWK+4 85 4A STA &4A \ INWK+4 A9 00 LDA #0 \ mag of K2+3 E5 1B SBC &1B \ P 09 80 ORA #&80 \ set bit7 .MV2 \ -> &53DB \ continue pitch planet 45 D1 EOR &D1 \ T 85 4B STA &4B \ INWK+5 \ ysg \Y=K2-bZ \ their comment A5 8D LDA &8D \ ALPHA 85 81 STA &81 \ Q A5 49 LDA &49 \ INWK+3 85 1B STA &1B \ P \ ylo A5 4A LDA &4A \ INWK+4 85 1C STA &1C \ P+1 \ yhi A5 4B LDA &4B \ INWK+5 \ ysg 20 82 27 JSR &2782 \ MULT3 \ K(4)=AP(2)*alpha A2 00 LDX #0 \ X coords 20 4C 1D JSR &1D4C \ MVT3 \ add INWK(0to2+X) to K(1to3) \ K = X+Ya A5 41 LDA &41 \ K+1 85 46 STA &46 \ INWK+0 \ xlo A5 42 LDA &42 \ K+2 85 47 STA &47 \ INWK+1 \ xhi A5 43 LDA &43 \ K+3 85 48 STA &48 \ INWK+2 \ xsg \X=X+aY \ their comment 4C BF 51 JMP &51BF \ MV45 \ move inwk by speed, end of MV40 move planet. .PU1 \ -> &5404 \ INWK not forward view, X >0 CA DEX \ view-- D0 31 BNE PU2 \ view was 2,3 not rear which needs x and z flipped A5 48 LDA &48 \ INWK+2 49 80 EOR #&80 \ flip xsg 85 48 STA &48 \ INWK+2 A5 4E LDA &4E \ INWK+8 49 80 EOR #&80 \ flip zsg 85 4E STA &4E \ INWK+8 A5 50 LDA &50 \ INWK+10 49 80 EOR #&80 \ flip rotmat0x hi 85 50 STA &50 \ INWK+10 A5 54 LDA &54 \ INWK+14 49 80 EOR #&80 \ flip rotmat0z hi 85 54 STA &54 \ INWK+14 A5 56 LDA &56 \ INWK+16 49 80 EOR #&80 \ rotmat1x hi 85 56 STA &56 \ INWK+16 A5 5A LDA &5A \ INWK+20 49 80 EOR #&80 \ rotmat1z hi 85 5A STA &5A \ INWK+20 A5 5C LDA &5C \ INWK+22 49 80 EOR #&80 \ rotmat2x hi 85 5C STA &5C \ INWK+22 A5 60 LDA &60 \ INWK+26 49 80 EOR #&80 \ rotmat2z hi 85 60 STA &60 \ INWK+26 60 RTS .PU2 \ other views 2,3 A9 00 LDA #0 E0 02 CPX #2 \ if X >= 2 then C set. Right View. 6A ROR A \ any carry 85 9A STA &9A \ RAT2 \ 0 for view 3, 128 for view 4 49 80 EOR #&80 \ flip 85 99 STA &99 \ RAT \ 128 for view 3, 0 for view 4 A5 46 LDA &46 \ INWK+0 \ xlo A6 4C LDX &4C \ INWK+6 \ zlo 85 4C STA &4C \ INWK+6 86 46 STX &46 \ INWK+0 \ xlo and zlo swopped A5 47 LDA &47 \ INWK+1 \ xhi A6 4D LDX &4D \ INWK+7 \ zhi 85 4D STA &4D \ INWK+7 86 47 STX &47 \ INWK+1 \ xhi and zhi swopped A5 48 LDA &48 \ INWK+2 \ xsg 45 99 EOR &99 \ RAT AA TAX \ xsg flipped A5 4E LDA &4E \ INWK+8 \ zsg 45 9A EOR &9A \ RAT2 85 48 STA &48 \ INWK+2 \ xsg 86 4E STX &4E \ INWK+8 \ zsg swopped with xsg flipped A0 09 LDY #9 \ rotmat0x lo 20 6C 54 JSR &546C \ PUS1 \ swop rotmat x and z A0 0F LDY #15 \ rotmat1x lo 20 6C 54 JSR &546C \ PUS1 \ swop rotmat x and z A0 15 LDY #21 \ rotmat2x lo .PUS1 \ -> &546C \ swop rotmat x and z B9 46 00 LDA &0046,Y \ INWK+0,Y B6 4A LDX &4A,Y \ INWK+4,Y 99 4A 00 STA &004A,Y \ INWK+4,Y 96 46 STX &46,Y \ INWK+0,Y \ lo swopped B9 47 00 LDA &0047,Y \ INWK+1,Y 45 99 EOR &99 \ RAT \ 128 for view 3, 0 for view 4 AA TAX \ flipped inwk+1,y B9 4B 00 LDA &004B,Y \ INWK+5,Y 45 9A EOR &9A \ RAT2 \ 0 for view 3, 128 for view 4 99 47 00 STA &0047,Y \ INWK+1,Y 96 4B STX &4B,Y \ INWK+5,Y .LO2 60 RTS .LQ \ new view X, Acc = 0 8E 45 03 STX &0345 \ VIEW \ laser mount 20 C8 54 JSR &54C8 \ TT66 \ box border with menu id QQ11 set to Acc 20 AA 54 JSR &54AA \ SIGHT \ laser cross-hairs 4C B1 35 JMP &35B1 \ NWSTARS \ new dust field .LOOK1 \ -> &5493 \ Start view X A9 00 LDA #0 \ menu id is space view A4 87 LDY &87 \ QQ11 D0 EE BNE LQ \ new view X, Acc = 0. EC 45 03 CPX &0345 \ VIEW F0 E8 BEQ LO2 \ rts as view unchanged 8E 45 03 STX &0345 \ VIEW \ else new view 20 C8 54 JSR &54C8 \ TT66 \ box border with QQ11 set to Acc 20 05 1A JSR &1A05 \ FLIP \ switch dusty and dustx 20 D8 35 JSR &35D8 \ WPSHPS \ wipe ships on scanner .SIGHT \ -> &54AA \ Laser cross-hairs AC 45 03 LDY &0345 \ VIEW B9 68 03 LDA &0368,Y \ LASER,Y F0 D4 BEQ LO2 \ no laser cross-hairs, rts A9 80 LDA #&80 \ xscreen mid 85 73 STA &73 \ QQ19 A9 48 LDA #&48 \ #Y-24 = #72 yscreen mid 85 74 STA &74 \ QQ19+1 A9 14 LDA #20 \ size of cross hair 85 75 STA &75 \ QQ19+2 20 36 2D JSR &2D36 \ TT15 \ the cross hair using QQ19(0to2) A9 0A LDA #10 \ negate out small cross-hairs 85 75 STA &75 \ QQ19+2 4C 36 2D JMP &2D36 \ TT15 \ again, negate out small cross-hairs. .TT66 \ -> &54C8 \ Box border with QQ11 set to Acc 85 87 STA &87 \ QQ11 \ menu id, zero is a titled space view. .TTX66 \ -> &54CA \ New box A9 80 LDA #&80 \ set bit7 One uppercase letter 85 72 STA &72 \ QQ17 \ flag for flight tokens 20 0A 36 JSR &360A \ FLFLLS \ clear line solar buffer 8D 43 03 STA &0343 \ LAS2 \ Acc =0 8D 4A 03 STA &034A \ DLY \ delay printing 8D 4B 03 STA &034B \ de \ clear flag for item + destroyed A2 60 LDX #&60 \ screen hi page start .BOL1 \ box loop 1, counter X 20 A1 42 JSR &42A1 \ ZES1 \ zero page X E8 INX \ next page E0 78 CPX #&78 \ last screen page D0 F8 BNE BOL1 \ loop X A6 2F LDX &2F \ QQ22+1 F0 03 BEQ BOX \ skip if no outer hyperspace countdown 20 AC 30 JSR &30AC \ ee3 \ else reprint hyperspace countdown in X .BOX \ -> &54EB \ front view box but no title if menu id > 0 A0 01 LDY #1 \ Y text cursor to top 84 2D STY &2D \ YC A5 87 LDA &87 \ QQ11 \ menu id D0 14 BNE tt66 \ if not zero then no view title A0 0B LDY #11 \ X text cursor indent 84 2C STY &2C \ XC AD 45 03 LDA &0345 \ VIEW 09 60 ORA #&60 \ build token = front rear 20 9A 33 JSR &339A \ TT27 \ process flight text token 20 42 31 JSR &3142 \ TT162 \ white space A9 AF LDA #&AF \ token = VIEW 20 9A 33 JSR &339A \ TT27 .tt66 \ no view title A2 00 LDX #0 \ top horizontal line 86 34 STX &34 \ X1 86 35 STX &35 \ Y1 86 72 STX &72 \ QQ17 \ printing flag all Upper case CA DEX \ #255 86 36 STX &36 \ X2 20 68 18 JSR &1868 \ HLOIN \ horizontal line X1,X2,Y1. Yreg protected. A9 02 LDA #2 \ 2 then 1, 0, 255, 254 85 34 STA &34 \ X1 85 36 STA &36 \ X2 20 1E 55 JSR &551E \ BOS2 \ do twice .BOS2 \ -> &551E 20 21 55 JSR &5521 \ BOS1 \ do twice .BOS1 \ -> &5521 A9 00 LDA #0 \ bottom of screen 85 35 STA &35 \ Y1 A9 BF LDA #&BF \ #(2*Y-1) is top of screen 85 37 STA &37 \ Y2 C6 34 DEC &34 \ X1 C6 36 DEC &36 \ X2 4C C4 16 JMP &16C4 \ LOIN \ line using (X1,Y1), (X2,Y2) Yreg protected. .DELAY \ -> &5530 \ Yreg loaded with length of delay counter 20 F7 55 JSR &55F7 \ WSCAN \ Wait for line scan, ie whole frame completed. 88 DEY D0 FA BNE DELAY \ loop Y 60 RTS .CLYNS \ -> &5537 \ Clear screen rows, Yreg set to 0. A9 14 LDA #20 \ Y text cursor set few lines from bottom 85 2D STA &2D \ YC A9 75 LDA #&75 \ page near bottom of screen 85 08 STA &08 \ SC+1 A9 07 LDA #7 \ screen lo 85 07 STA &07 \ SC 20 60 2B JSR &2B60 \ TT67 \ Next row A9 00 LDA #0 \ most of bytes on Row set to Acc 20 50 55 JSR &5550 \ LYN \ Row 1 E6 08 INC &08 \ SC+1 C8 INY \ X text cursor = 1 84 2C STY &2C \ XC .LYN \ -> &5550 \ most of bytes on Row (2) set to Acc. A0 E9 LDY #233 \ near far right .EE2 \ counter Y 233to0 91 07 STA (&07),Y \ (SC),Y 88 DEY \ next column to left D0 FB BNE EE2 \ loop Y .SC5 60 RTS .SCAN \ -> &5558 \ ships on Scanner - last code written A5 65 LDA &65 \ INWK+31 \ display explosion state|missiles 29 10 AND #&10 \ dont show on scanner if bit4 clear, invisible. F0 F9 BEQ SC5 \ rts A5 8C LDA &8C \ TYPE \ ship type 30 F5 BMI SC5 \ dont show planet, rts A2 FF LDX #&FF \ default scanner colour Yellow C9 01 CMP #1 \ #MSL D0 02 BNE P%+4 \ not missile A2 F0 LDX #&F0 \ scanner colour updated for missile to Red 86 91 STX &91 \ COL \ the colour for stick A5 47 LDA &47 \ INWK+1 \ xhi 05 4A ORA &4A \ INWK+4 \ yhi 05 4D ORA &4D \ INWK+7 \ zhi 29 C0 AND #&C0 \ too far away? D0 E1 BNE SC5 \ rts A5 47 LDA &47 \ INWK+1 \ xhi 18 CLC \ build stick xcoord A6 48 LDX &48 \ INWK+2 \ xsg 10 04 BPL SC2 \ xsg +ve 49 FF EOR #&FF \ else flip 69 01 ADC #1 .SC2 \ xsg +ve 69 7B ADC #123 \ xhi+#123 85 34 STA &34 \ X1 \ Xscreen for stick A5 4D LDA &4D \ INWK+7 4A LSR A \ zhi 4A LSR A \ Acc = zhi /4 18 CLC \ onto zsg A6 4E LDX &4E \ INWK+8 10 03 BPL SC3 \ z +ve 49 FF EOR #&FF \ else 38 SEC \ flip zhi/4 .SC3 \ z +ve 69 23 ADC #35 \ zhi/4+ #35 49 FF EOR #&FF \ flip to screen lo 85 07 STA &07 \ SC \ store Z component of stick base A5 4A LDA &4A \ INWK+4 \ yhi 4A LSR A \ Acc = yhi/2 18 CLC \ onto ysg A6 4B LDX &4B \ INWK+5 30 03 BMI SCD6 \ y +ve 49 FF EOR #&FF \ else flip yhi/2 38 SEC .SCD6 \ y +ve , now add to z-component 65 07 ADC &07 \ SC \ add Z component of stick base 10 0A BPL FIXIT \ stick goes up C9 C2 CMP #&C2 \ >= #194 ? B0 02 BCS P%+4 \ skip min at #194 A9 C2 LDA #194 \ clamp y min C9 F7 CMP #&F7 \ < #247 ? 90 02 BCC P%+4 \ skip max at #246 .FIXIT \ stick goes up A9 F6 LDA #246 \ clamp y max 85 35 STA &35 \ Y1 \ Yscreen for stick head 38 SEC \ sub z-component to leave y length E5 07 SBC &07 \ SC 08 PHP \ push sign 48 PHA \ sub result used as counter 20 A7 36 JSR &36A7 \ CPIX4 \ big flag on stick, at (X1,Y1) BD C0 16 LDA &16C0,X \ CTWOS+1,X \ recall mask 25 91 AND &91 \ COL \ the colour 85 34 STA &34 \ X1 \ colour temp 68 PLA \ sub result used as counter 28 PLP \ sign info AA TAX \ sub result used as counter F0 12 BEQ SCRTS \ no stick height, rts 90 11 BCC SCRTS+1 \ -ve stick length .VLL1 \ positive stick counter X. 88 DEY \ Y was running through byte char in CPIX4 10 04 BPL VL1 \ else reset Y to 7 for A0 07 LDY #7 \ next row C6 08 DEC &08 \ SC+1 \ screen hi .VL1 \ Y reset done A5 34 LDA &34 \ X1 \ colour temp for stick 51 07 EOR (&07),Y \ (SC),Y 91 07 STA (&07),Y \ (SC),Y CA DEX \ next dot of stick up D0 F0 BNE VLL1 \ loop X .SCRTS 60 RTS \SCRTS+1 \ -ve stick length C8 INY \ Y was running through byte char in CPIX4 C0 08 CPY #8 \ hop reset D0 04 BNE VLL2 \ Y continue A0 00 LDY #0 \ else reset for next row E6 08 INC &08 \ SC+1 \ screen hi .VLL2 \ Y continue, counter X C8 INY \ Y was running through byte char in CPIX4 C0 08 CPY #8 \ hop reset D0 04 BNE VL2 \ same row A0 00 LDY #0 \ else reset for next row E6 08 INC &08 \ SC+1 \ screen hi .VL2 \ same row A5 34 LDA &34 \ X1 \ colour temp for stick 51 07 EOR (&07),Y \ (SC),Y 91 07 STA (&07),Y \ (SC),Y E8 INX \ next dot of stick down D0 EE BNE VLL2 \ loop X 60 RTS .WSCAN \ -> &55F7 \ Wait for line scan A9 00 LDA #0 \ updated by interrupt routine 85 8B STA &8B \ DL .WSCNL \ repeat if DL = 0 A5 8B LDA &8B \ DL F0 FC BEQ WSCNL \ loop DL 60 RTS \ === BBC disk flight code ends at &55FF next free byte is &5600 for ships data === .XX21 \ -> &5600 \ Table of pointers to ships' data given to XX0 00 7F EQUW &7F00 \ type 1 is #MSL Missile data on page off bottom of screen 00 00 EQUW 0 \ type 2 is #SST Space Station, Coriolis or Dodo. 00 00 EQUW 0 \ type 3 is #ESC Escape capsule 00 00 EQUW 0 \ type 4 is #PLT Plate, alloys 00 00 EQUW 0 \ type 5 is #OIL Cargo cannister 00 00 EQUW 0 \ type 6 is Boulder 00 00 EQUW 0 \ type 7 is #AST Asteroid 00 00 EQUW 0 \ type 8 is #SPL Splinter, rock. 00 00 EQUW 0 \ type 9 is #SHU Shuttle 00 00 EQUW 0 \ type 10 is Transporter 00 00 EQUW 0 \ type 11 is #CYL Cobra Mk III, Boa 00 00 EQUW 0 \ type 12 is Python 00 00 EQUW 0 \ type 13 is Last of three traders 00 00 EQUW 0 \ type 14 is #ANA Anaconda 00 00 EQUW 0 \ type 15 is #WRM Worm with Anaconda 00 00 EQUW 0 \ type 16 is #COP Viper 00 00 EQUW 0 \ type 17 is First pirate 00 00 EQUW 0 \ type 18 is 00 00 EQUW 0 \ type 19 is #KRA Krait small pirate 00 00 EQUW 0 \ type 20 is #ADA Adder 00 00 EQUW 0 \ type 21 is 00 00 EQUW 0 \ type 22 is 00 00 EQUW 0 \ type 23 is 00 00 EQUW 0 \ type 24 is #CYL2 Last strong pirate 00 00 EQUW 0 \ type 25 is #ASP Asp Mk II 00 00 EQUW 0 \ type 26 is #FER Fer de Lance 00 00 EQUW 0 \ type 27 is 00 00 EQUW 0 \ type 28 is Last of three bounty hunters 00 00 EQUW 0 \ type 29 is #THG Thargoid 00 00 EQUW 0 \ type 30 is #TGL Thargon 00 00 EQUW 0 \ type 31 is #CON Constrictor .E% \ -> &563E \ Hull NEWB bits are escpod, cop, inno, ?, pirate, angry, hunter, trader. \ NEWB examples \ 21 EQUB &21 \ 0010 0001 9 Shuttle has no escape pod, inno, trader. \ 61 EQUB &61 \ 0110 0001 10 Tansporter no escape pod, Cop, inno, trader. \ A0 EQUB &A0 \ 1010 0000 11 Cobra has Escape pod, inno, not a trader. \ C2 EQUB &C2 \ 1100 0010 16 Viper has Escape pod, Cop, hunter. \ 8C EQUB &8C \ 1000 1100 19 Krait pirate has escape pod, is pirate and angry. \ -> &565D \ Start of ship data. \ First 20 bytes of each ship data give header info. \ hull byte#0 high nibble is scoop info, lower nibble is debris spin info \ hull byte#1-2 area for missile lock, lo, hi \ hull byte#3 edges data info offset lo \ hull byte#4 faces data info offset lo \ hull byte#5 4*maxlines+1 for ship lines stack \ hull byte#6 gun vertex*4 \ hull byte#7 explosion count e.g. &2A = 4*n+6 \ hull byte#8 vertices*6 \ hull bytes#10-11 bounty lo hi \ hull byte#12 faces*4 \ hull byte#13 dot beyond distance \ hull byte#14 energy \ hull byte#15 speed (end of 4th row) \ hull byte#16 edges offset hi (goes -ve to use other's edge net). \ hull byte#17 faces offset hi \ hull byte#18 Q% scaling of normals to make large objects' normals flare out further away \ hull bute#19 laser|missile(=lower 3 bits) \ -> & 565D \ See ship data files chosen and loaded after flight code starts running. \ ==============================================================================================\