├── .gitattributes ├── .gitignore ├── Makefile ├── README.md ├── crc32.py ├── data ├── DIALSHP.bin ├── P.(C)ASFT.bin ├── P.A-SOFT.bin ├── P.ELITE.bin ├── SHIPS.bin └── WORDS9.bin ├── elite-bcfs.asm ├── elite-checksum.py ├── elite-disc.asm ├── elite-loader.asm ├── elite-source.asm ├── elite.ssd ├── extracted ├── ELITE.bin ├── ELTA.bin ├── ELTB.bin ├── ELTC.bin ├── ELTD.bin ├── ELTE.bin ├── ELTF.bin ├── ELTG.bin └── ELTcode.bin ├── make.bat ├── make.exe ├── output ├── ELITE.bin ├── ELITE.unprot.bin ├── ELTA.bin ├── ELTB.bin ├── ELTC.bin ├── ELTD.bin ├── ELTE.bin ├── ELTF.bin ├── ELTG.bin ├── ELTcode.bin ├── ELTcode.unprot.bin └── ELThead.bin ├── sources ├── Cassette sources [A4080602].DSD ├── Cassette sources [disk image].zip ├── Cassette sources [text files].zip ├── ELITEA.TXT ├── ELITEB.TXT ├── ELITEC.TXT ├── ELITED.TXT ├── ELITEE.TXT ├── ELITEF.TXT ├── ELITEG.TXT └── ELITES.TXT └── verify.bat /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows thumbnail cache files 2 | Thumbs.db 3 | ehthumbs.db 4 | ehthumbs_vista.db 5 | 6 | # Folder config file 7 | Desktop.ini 8 | 9 | # Recycle Bin used on file shares 10 | $RECYCLE.BIN/ 11 | 12 | # Windows Installer files 13 | *.cab 14 | *.msi 15 | *.msm 16 | *.msp 17 | 18 | # Windows shortcuts 19 | *.lnk 20 | 21 | # ========================= 22 | # Operating System Files 23 | # ========================= 24 | .vscode/tasks.json 25 | compile.txt 26 | elite-beebasm.code-workspace 27 | run.bat 28 | elite-header.h.asm 29 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | BEEBASM?=beebasm 2 | PYTHON?=python 3 | 4 | .PHONY:build 5 | build: 6 | $(BEEBASM) -i elite-source.asm -v > compile.txt 7 | $(BEEBASM) -i elite-bcfs.asm -v >> compile.txt 8 | $(BEEBASM) -i elite-loader.asm -v >> compile.txt 9 | $(PYTHON) elite-checksum.py -u 10 | $(BEEBASM) -i elite-disc.asm -do elite.ssd -boot ELITE 11 | 12 | .PHONY:verify 13 | verify: 14 | @$(PYTHON) crc32.py extracted 15 | @$(PYTHON) crc32.py output 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # elite-beebasm 2 | A port of the original BBC Elite source code from BASIC assembler to BeebAsm assembler for modern PC development environment. 3 | 4 | ## Background 5 | The original source files for BBC Elite can be found on [Ian Bell's personal web](http://www.iancgbell.clara.net/elite/). 6 | 7 | The following archives are available: 8 | 9 | - [Cassette sources](http://www.elitehomepage.org/archive/a/a4080602.zip) as DFS disk image 10 | - [Cassette sources](http://www.elitehomepage.org/archive/a/a4080610.zip) as text files 11 | - [BBC 2nd processor sources](http://www.elitehomepage.org/archive/a/a5022201.zip) as DFS disk image 12 | - [Original Elite ship sources](http://www.elitehomepage.org/archive/a/a4100082.zip) as DFS disk image 13 | - [Elite 2 ship sources](http://www.elitehomepage.org/archive/a/b80000C0.zip) as DFS disk image 14 | - [Original BBC Disk version](http://www.elitehomepage.org/archive/a/a4100000.zip) of Elite (game only) 15 | - [Master 128 and 2nd Processor versions](http://www.elitehomepage.org/archive/a/b8020001.zip) of Elite (game only) 16 | 17 | As the game was written on 8-bit machines with very limited RAM and disk storage (the game started life on an Acorn Atom) the source code is incredibly terse, densely packed and effectively unreadable to anyone but the original authors (even then, I'd imagine both would struggle some 30+ years later..!) 18 | 19 | This project aims to develop a readable, fast and reproducible build of Elite that can be used for learning and non-profit modification purposes. 20 | 21 | ## Version 22 | 23 | The BBC Cassette version of the game but built for disk was chosen as the initial starting point for simplicity. It generates just two binary executable files `ELITE` (the loader) and `ELTcode` (the game) and will run on a standard issue Model B with DFS, which is the most common configuration of any BBC system and easily emulated. 24 | 25 | Future versions may include BBC Disk, Master and 2nd processor configurations. 26 | 27 | ## Files 28 | 29 | ### elite-source.asm 30 | 31 | This is the main source for the Elite game. It is made up of 7 original BASIC source files concatenated and converted to BeebAsm assembler syntax: 32 | 33 | - `ELITEA` outputting `ELTA` binary 34 | - `ELITEB` outputting `ELTB` binary 35 | - `ELITEC` outputting `ELTC` binary 36 | - `ELITED` outputting `ELTD` binary 37 | - `ELITEE` outputting `ELTE` binary 38 | - `ELITEF` outputting `ELTF` binary 39 | - `ELITEG` outputting `ELTG` binary 40 | 41 | It totals ~10,000 lines of 6502 assembler. 42 | 43 | ### elite-bcfs.asm 44 | 45 | The BASIC source file `S.BCFS` is responsible for creating the Big Code File, i.e. concatenating the `ELTA`..`ELTG` binaries plus the `SHIPS` data into a single executable for the Elite main game called `ELTcode`. 46 | 47 | There is a simple checksum test added to the start of the code. The checksum function cannot be performed in the BeebAsm source so has been reproduced in the `elite-checksum.py` Python script described below. 48 | 49 | ### elite-loader.asm 50 | 51 | The BASIC source file `ELITES` creates the executable Elite loader `ELITE`. This is responsible for displaying the title screen and planet, drawing the initial (static) HUD, setting up interrupt routines (for the MODE 4/5 split in the HUD), relocating many routines to lower memory (below `PAGE`) and loading the main executable. 52 | 53 | There are a number of checksum and protection routines that XOR the code and data with other parts of memory in an attempt to obfuscate and protect the game from tampering. This cannot be done in the BeebAsm source so has been reproduced in the `elite-checksum.py` Python script below. 54 | 55 | ### elite-checksum.py 56 | 57 | There are a number of checksum and simple XOR encryption routines that form part of the Elite build process. These are trivial to interleave with the assembly process in BBC BASIC but have had to be converted to a Python script to run as part of a modern development environment. 58 | 59 | The script has two parts. Firstly performing some functions from the `S.BCFS` source to generate a protected version of the `ELTcode` binary: 60 | 61 | - Concatenate all Elite game binaries 62 | - Compute checksum for Commander data 63 | - Poke Commander checksum value into binary 64 | - Compute checksum for all game code except boot header 65 | - Poke checksum value into binary 66 | - Encrypt all game code except boot header with cycling XOR value (0-255) 67 | - Compute final checksum for game code 68 | - Output `ELTcode` binary (protected) 69 | 70 | Secondly it performs the checksum and encryption functions from the `ELITES` loader source: 71 | 72 | - Reverse the bytes for a block of code that is placed on the stack 73 | - Compute checksum for MAINSUM 74 | ` Poke checksum value into binary 75 | - Comuter checksum for CHECKbyt 76 | - Poke checksum value into binary 77 | - Encrypt a block of code by XOR'ing with the code to be placed on the stack 78 | - Encrypt all code destined for lower RAM by XOR'ing with loader boot code 79 | - Encrypt binary data (HUD graphics etc.) by XOR'ing with loader boot code 80 | - Output `ELITE` binary (protected) 81 | 82 | ## Build 83 | 84 | For now a simple DOS Batch file `make.bat` will perform the following commands: 85 | 86 | ``` 87 | %BEEBASM% -i elite-source.asm -v 88 | %BEEBASM% -i elite-bcfs.asm -v 89 | %BEEBASM% -i elite-loader.asm -v 90 | %PYTHON% elite-checksum.py 91 | %BEEBASM% -i elite-disc.asm -do elite.ssd -boot ELITE 92 | ``` 93 | Simply define the location of your `beebasm.exe` and `python.exe` at the head of the batch file. All being well this will output `elite.ssd` which will boot the game. 94 | 95 | ## Verify 96 | 97 | The `crc32dos.exe` is included to verify that the output files are binary identical with the original sources. 98 | 99 | The following built binaries were extracted from the [Cassette sources disk image](http://www.elitehomepage.org/archive/a/a4080602.zip): 100 | 101 | ``` 102 | CRC 32 File Size Filename 103 | ------------------------------------------------- 104 | a88ca82b 5426 \extracted\ELITE.bin 105 | 0f1ad255 2228 \extracted\ELTA.bin 106 | 0d6f4900 2600 \extracted\ELTB.bin 107 | 97e338e8 2735 \extracted\ELTC.bin 108 | 01a00dce 20712 \extracted\ELTcode.bin 109 | 322b174c 2882 \extracted\ELTD.bin 110 | 29f7b8cb 2663 \extracted\ELTE.bin 111 | 8a4cecc2 2721 \extracted\ELTF.bin 112 | 7a6a5d1a 2340 \extracted\ELTG.bin 113 | ``` 114 | The following binaries are output from the BeebAsm build process: 115 | ``` 116 | CRC 32 File Size Filename 117 | ------------------------------------------------- 118 | a88ca82b 5426 \output\ELITE.bin 119 | f40816ec 5426 \output\ELITE.unprot.bin 120 | 0f1ad255 2228 \output\ELTA.bin 121 | 3f107178 2600 \output\ELTB.bin 122 | 97e338e8 2735 \output\ELTC.bin 123 | 01a00dce 20712 \output\ELTcode.bin 124 | 8de09f8f 20712 \output\ELTcode.unprot.bin 125 | 322b174c 2882 \output\ELTD.bin 126 | 29f7b8cb 2663 \output\ELTE.bin 127 | 8a4cecc2 2721 \output\ELTF.bin 128 | 7a6a5d1a 2340 \output\ELTG.bin 129 | 00d5bb7a 40 \output\ELThead.bin 130 | ``` 131 | ## Differences 132 | 133 | ### ELITEC 134 | 135 | It was discovered that the Text Files archive does not contain the identical source to the Disk Image archive. A couple of small differences in code in the `ELITEC` source: 136 | 137 | ``` 138 | .WARP LDAMANY+AST 139 | CLC 140 | ADCMANY+ESC 141 | CLC ; NOT IN ELITEC.TXT but is in ELITE SOURCE IMAGE 142 | 143 | ADCMANY+OIL 144 | TAX 145 | LDAFRIN+2,X 146 | ORASSPR 147 | ORAMJ 148 | BNEWA1 149 | LDYK%+8 150 | BMIWA3 151 | TAY 152 | JSRMAS2 153 | ;LSRA 154 | ;BEQWA1 155 | CMP #2 156 | BCC WA1 ; NOT IN ELITEC.TXT but is in ELITE SOURCE IMAGE 157 | .WA3 LDYK%+NI%+8 158 | BMIWA2 159 | LDY#NI% 160 | JSRm 161 | ;LSRA 162 | ;BEQWA1 163 | CMP #2 164 | BCC WA1 ; NOT IN ELITEC.TXT but is in ELITE SOURCE IMAGE 165 | ``` 166 | 167 | ### ELTB 168 | 169 | The `ELTB` binary output is not identical to the extracted file yet the final `ELTcode` binary is. What gives? 170 | 171 | This comes down to a single byte in the default Commander data and is related to whether the BASIC variable `Q%` is TRUE or FALSE. This appears to be a cheat flag used during testing. 172 | 173 | The implication is that the output binary files on the Cassette source disk were not produced at the same time but one was modified after the `ELTcode` file was created. (We can see that running the build process in an emulator results in a different output and checksum values.) 174 | 175 | A decision was made to structure the `elite-source.asm` file so that the final `ELTcode` executable output is binary identical to the file extracted from the Cassette Source disk image. 176 | 177 | ## Next Steps 178 | 179 | Although the binary files output are identical, the build process is *brittle* meaning that the source cannot be altered. The main problem is that the encrytion process does not have knowledge of the symbols produced by the assembler, so these values have been hard coded for temporary convenience. 180 | 181 | The next steps are: 182 | 183 | - Remove code requiring checksums and copy protection to allow source to be modified freely 184 | - ~~Improve whitespacing for readability~~ 185 | - Improve label names for readability 186 | - Commenting of critical functions 187 | - Add BBC Disk, Master and 2nd processor versions to build 188 | 189 | I am fully open to PR's if anyone feels like contributing to this project! 190 | 191 | --- 192 | #### Kieran Connell | July 2018 193 | -------------------------------------------------------------------------------- /crc32.py: -------------------------------------------------------------------------------- 1 | import sys,os,os.path,glob,zlib 2 | 3 | def main(): 4 | folder=sys.argv[1] if len(sys.argv)>=2 else "." 5 | names=os.listdir(folder) 6 | 7 | print ' CRC 32 File Size Filename' 8 | print '-------------------------------------------------' 9 | 10 | for name in names: 11 | full_name=os.path.join(folder,name) 12 | if not os.path.isfile(full_name): continue 13 | with open(full_name,'rb') as f: data=f.read() 14 | print '%08x %9d %s'%(zlib.crc32(data)&0xffffffff, 15 | len(data), 16 | full_name) 17 | 18 | if __name__=='__main__': main() 19 | -------------------------------------------------------------------------------- /data/DIALSHP.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/data/DIALSHP.bin -------------------------------------------------------------------------------- /data/P.(C)ASFT.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/data/P.(C)ASFT.bin -------------------------------------------------------------------------------- /data/P.A-SOFT.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/data/P.A-SOFT.bin -------------------------------------------------------------------------------- /data/P.ELITE.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/data/P.ELITE.bin -------------------------------------------------------------------------------- /data/SHIPS.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/data/SHIPS.bin -------------------------------------------------------------------------------- /data/WORDS9.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/data/WORDS9.bin -------------------------------------------------------------------------------- /elite-bcfs.asm: -------------------------------------------------------------------------------- 1 | \************************************************ 2 | \* Prepare the Big Code File 3 | \* ELTcode 4 | \************************************************ 5 | 6 | C%=&F40 ; assembly address of Elite game code (elite-source.asm) 7 | L%=&1128 ; load address of Elite game code (after LBL fn) 8 | D%=&563A ; hard-coded size of Elite game code (elite-source.asm) 9 | ZP=&70 10 | 11 | ORG &1100 ; load address of ELTcode 12 | 13 | \ ***************************************************************************** 14 | \ Code entered at LBL+1 (&1101) as defined in elite-loader.asm CHECKV 15 | \ Calculates checksum and compares to value in CHECKbyt (&B00) from loader 16 | \ Any trivial modification in this code results in a machine reset (&FFFC) 17 | \ ***************************************************************************** 18 | 19 | .LBL 20 | EQUB &6C ; JMP indirect 21 | LDX #&60 ; &A2 &60 (RTS) 22 | LDA #&B 23 | STA ZP+1 24 | LDY #0 25 | STY ZP 26 | TYA 27 | INY 28 | .CHK3 29 | CLC 30 | ADC (ZP),Y 31 | INY 32 | BNE CHK3 33 | INC ZP+1 34 | .CHK4 35 | CLC 36 | ADC (ZP),Y 37 | INY 38 | BPL CHK4 39 | CMP &B00 40 | BEQ LBL+2 ; RTS 41 | LDA #&7F 42 | STA &FE4E 43 | JMP (&FFFC) ; reset machine 44 | 45 | .elitea 46 | PRINT "elitea=",~P% 47 | INCBIN "output/ELTA.bin" 48 | .eliteb 49 | PRINT "eliteb=",~P% 50 | INCBIN "output/ELTB.bin" 51 | .elitec 52 | PRINT "elitec=",~P% 53 | INCBIN "output/ELTC.bin" 54 | .elited 55 | PRINT "elited=",~P% 56 | INCBIN "output/ELTD.bin" 57 | .elitee 58 | PRINT "elitee=",~P% 59 | INCBIN "output/ELTE.bin" 60 | .elitef 61 | PRINT "elitef=",~P% 62 | INCBIN "output/ELTF.bin" 63 | .eliteg 64 | PRINT "eliteg=",~P% 65 | INCBIN "output/ELTG.bin" 66 | .checksum0 67 | PRINT "checksum0=",~P% 68 | SKIP 1 ; byte skipped for checksum later 69 | .ships 70 | PRINT "ships=",~P% 71 | INCBIN "data/SHIPS.bin" 72 | .end 73 | 74 | PRINT "P%=",~P% 75 | 76 | \\ CHECKSUM PERFORMED IN BCFS.PY SCRIPT 77 | 78 | PRINT "S.ELTcode 1100 ", ~(L%+&6000-C%), " ", ~L%, ~L% 79 | 80 | \\ SAVE UNPROTECTED CODE 81 | 82 | SAVE "output/ELTcode.unprot.bin", &1100, (L%+&6000-C%), L% 83 | 84 | \\ SAVE JUST THE HEADER 85 | 86 | SAVE "output/ELThead.bin", &1100, elitea, &1100 87 | -------------------------------------------------------------------------------- /elite-checksum.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # 3 | # S.BCFS 4 | # Prepare the Big Code File 5 | # ELTcode 6 | # 7 | 8 | import sys 9 | from os.path import basename 10 | 11 | if (sys.version_info > (3, 0)): 12 | from io import BytesIO as ByteBuffer 13 | else: 14 | from StringIO import StringIO as ByteBuffer 15 | 16 | argv = sys.argv 17 | argc = len(argv) 18 | Encrypt = True 19 | 20 | if argc > 1 and argv[1] == '-u': 21 | Encrypt = False 22 | 23 | print "Elite Big Code File" 24 | print "Encryption = ", Encrypt 25 | 26 | data_block = bytearray() 27 | eliteb_offset = 0 28 | 29 | # Append all assembled code files 30 | 31 | elite_names = ('ELThead','ELTA','ELTB','ELTC','ELTD','ELTE','ELTF','ELTG') 32 | 33 | for file_name in elite_names: 34 | print str(len(data_block)), file_name 35 | if file_name == 'ELTB': 36 | eliteb_offset = len(data_block) 37 | elite_file = open('output/' + file_name + '.bin', 'rb') 38 | data_block.extend(elite_file.read()) 39 | elite_file.close() 40 | 41 | # Commander data checksum 42 | 43 | commander_offset = 0x52 44 | CH=0x4B - 2 45 | CY=0 46 | for i in range(CH,0,-1): 47 | CH = CH + CY + data_block[eliteb_offset + i + 7] 48 | CY = (CH > 255) & 1 49 | CH = CH % 256 50 | CH = CH ^ data_block[eliteb_offset + i + 8] 51 | 52 | print "Commander checksum = ", CH 53 | 54 | # Must have Commander checksum otherwise game will lock: 55 | 56 | data_block[eliteb_offset + commander_offset] = CH ^ 0xA9 57 | data_block[eliteb_offset + commander_offset + 1] = CH 58 | 59 | # Skip one byte for checksum0 60 | 61 | checksum0_offset = len(data_block) 62 | data_block.append(0) 63 | 64 | # Append SHIPS file 65 | 66 | ships_file = open('data/SHIPS.bin', 'rb') 67 | data_block.extend(ships_file.read()) 68 | ships_file.close() 69 | 70 | # Calculate checksum0 71 | 72 | checksum0 = 0 73 | for n in range(0x0, 0x4600): 74 | checksum0 += data_block[n + 0x28] 75 | 76 | print "checksum 0 = ", checksum0 77 | 78 | if Encrypt == True: 79 | data_block[checksum0_offset] = checksum0 % 256 80 | 81 | # Encrypt data block 82 | 83 | if Encrypt == True: 84 | for n in range(0x0, len(data_block) - 0x28): 85 | data_block[n + 0x28] ^= (n % 256) 86 | 87 | # Calculate checksum1 88 | 89 | checksum1 = 0 90 | for n in range(0x0, 0x28): 91 | checksum1 += data_block[n] 92 | 93 | print "checksum 1 = ", checksum1 94 | 95 | # Write output file for 'ELTcode' 96 | 97 | output_file = open('output/ELTcode.bin', 'wb') 98 | output_file.write(data_block) 99 | output_file.close() 100 | output_file = None 101 | 102 | data_block = None 103 | 104 | # Start again but for loader 105 | print "Elite Loader Encyption" 106 | 107 | loader_block = bytearray() 108 | 109 | loader_file = open('output/ELITE.unprot.bin', 'rb') 110 | loader_block.extend(loader_file.read()) 111 | loader_file.close() 112 | 113 | # Reverse bytes between BLOCK and ENDBLOCK 114 | 115 | BLOCK_offset = 0x14B0 116 | ENDBLOCK_offset = 0x1530 117 | 118 | for i in range(0,(ENDBLOCK_offset - BLOCK_offset)/2): 119 | temp = loader_block[BLOCK_offset + i] 120 | loader_block[BLOCK_offset + i] = loader_block[ENDBLOCK_offset - i - 1] 121 | loader_block[ENDBLOCK_offset - i - 1] = temp 122 | 123 | # Compute MAINSUM 124 | 125 | MAINSUM_offset = 0x1335 126 | 127 | MAINSUM = 0 128 | for i in range(0,0x400): 129 | MAINSUM += loader_block[i] 130 | 131 | print "MAINSUM = ", MAINSUM 132 | 133 | if Encrypt == True: 134 | loader_block[MAINSUM_offset + 1] = MAINSUM % 256 135 | 136 | # Compute CHECKbyt 137 | 138 | CHECKbyt_offset = 0x1334 139 | CHECKbyt = 0 140 | for i in range(1,384): 141 | CHECKbyt += loader_block[CHECKbyt_offset + i] 142 | 143 | print "CHECKbyt = ", CHECKbyt 144 | 145 | if Encrypt == True: 146 | loader_block[CHECKbyt_offset] = CHECKbyt % 256 147 | 148 | if Encrypt == True: 149 | print "Encypting..." 150 | 151 | # EOR TUT BLOCK (offset = 0x13e1) 152 | 153 | for i in range(0,ENDBLOCK_offset - BLOCK_offset): 154 | loader_block[0x13e1 + i] ^= loader_block[BLOCK_offset + i] 155 | 156 | # EOR CODE words (offset = 0xf86) 157 | 158 | for i in range(0,2): 159 | for j in range(0,256): 160 | if (j + i * 256 + CHECKbyt_offset) < len(loader_block): 161 | loader_block[j + i * 256 + CHECKbyt_offset] ^= loader_block[j + 0xf86] 162 | 163 | # EOR DATA block at beginning of loader 164 | 165 | for i in range(0,0xf): 166 | for j in range(0,256): 167 | loader_block[j + i * 256] ^= loader_block[j + 0xf86] 168 | 169 | # Write output file for 'ELITE' 170 | 171 | output_file = open('output/ELITE.bin', 'wb') 172 | output_file.write(loader_block) 173 | output_file.close() 174 | output_file = None 175 | -------------------------------------------------------------------------------- /elite-disc.asm: -------------------------------------------------------------------------------- 1 | ; Make Elite disc image 2 | PUTFILE "output/ELITE.bin", "ELITE", &1100, &2000 3 | PUTFILE "output/ELTcode.bin", "ELTcode", &1128, &1128 4 | -------------------------------------------------------------------------------- /elite-loader.asm: -------------------------------------------------------------------------------- 1 | \ ***************************************************************************** 2 | \* Source Code for ELITE (the loader) 3 | \ ***************************************************************************** 4 | 5 | DISC = TRUE ; load above DFS and relocate down 6 | PROT = FALSE ; TAPE protection 7 | 8 | _REMOVE_CHECKSUMS = TRUE 9 | 10 | HIMEM=&4000 11 | ;DIMTEMP%256 12 | LOD%=&1100 ; load address of ELTcode (elite-bcfs.asm) 13 | 14 | C%=&F40 ; assembly address of Elite game code (elite-source.asm) 15 | S%=C% 16 | L%=LOD%+&28 ; load address Elite game code (elite-bcfs.asm) 17 | D%=&563A ; hardcoded size of Elite game code (elite-source.asm) 18 | LC%=&6000-C% ; maximum size of Elite game code 19 | 20 | svn=&7FFD 21 | len1=15 22 | len2=18 23 | len=len1+len2 24 | 25 | LE%=&B00 ; address of second stage loader (containing ENTRY2) 26 | 27 | ;REM Move Mover to here while CODE loading 28 | 29 | IF DISC 30 | LL%=&E00+&300 ; load address of loader 31 | ELSE 32 | LL%=&E00 33 | ENDIF 34 | 35 | ;CODE=&4000 36 | CODE=LL% ; we can assemble in place 37 | 38 | ;REM Where this loader loads 39 | 40 | \ ***************************************************************************** 41 | \ MOS definitions 42 | \ ***************************************************************************** 43 | 44 | MOS=S%+8 ; unused - was part of OS version test 45 | TRTB%=4 ; MOS key translation table 46 | NETV=&224 47 | 48 | OSWRCH=&FFEE 49 | OSBYTE=&FFF4 50 | OSWORD=&FFF1 51 | SCLI=&FFF7 52 | IRQ1V=&204 53 | osprnt=&234 54 | 55 | \ ***************************************************************************** 56 | \ ZERO PAGE variables 57 | \ ***************************************************************************** 58 | 59 | ZP=&70 60 | P=&72 61 | Q=&73 62 | YY=&74 63 | T=&75 64 | sc=&76 65 | BLPTR=&78 66 | V219=&7A 67 | K3=&80 68 | BLCNT=&81 69 | BLN=&83 70 | EXCN=&85 71 | 72 | FF=&FF 73 | 74 | \ ***************************************************************************** 75 | \ SYSVIA definitions 76 | \ ***************************************************************************** 77 | 78 | VIA=&FE40 79 | USVIA=VIA 80 | VSCAN=57-1 81 | VEC=&7FFE 82 | 83 | \ ***************************************************************************** 84 | \ Concatenate data files used by loader 85 | \ ***************************************************************************** 86 | 87 | ;OSCLI("L.:0.WORDS9 "+STR$~CODE) 88 | ORG CODE 89 | PRINT "WORDS9=",~P% 90 | INCBIN "data/WORDS9.bin" 91 | 92 | ;OSCLI("L.:0.DIALSHP "+STR$~(CODE+&400)) 93 | ORG CODE+&400 94 | PRINT "DIALSHP=",~P% 95 | INCBIN "data/DIALSHP.bin" 96 | 97 | ;OSCLI("L.:2.P.ELITE "+STR$~(CODE+&C00)) 98 | ORG CODE+&C00 99 | PRINT "P.ELITE=",~P% 100 | INCBIN "data/P.ELITE.bin" 101 | 102 | ;OSCLI("L.:2.P.A-SOFT "+STR$~(CODE+&D00)) 103 | ORG CODE+&D00 104 | PRINT "P.A-SOFT=",~P% 105 | INCBIN "data/P.A-SOFT.bin" 106 | 107 | ;OSCLI("L.:2.P.(C)ASFT "+STR$~(CODE+&E00)) 108 | ORG CODE+&E00 109 | PRINT "P.(C)ASFT=",~P% 110 | INCBIN "data/P.(C)ASFT.bin" 111 | 112 | ;REMOSCLI("L.:2.P.NAME$ "+STR$~(CODE+&E00)) 113 | 114 | ORG LL%+&400+&800+&300 115 | O%=CODE+&400+&800+&300 116 | 117 | \ ***************************************************************************** 118 | \ LOADER CODE START 119 | \ ***************************************************************************** 120 | 121 | .run 122 | JMP ENTRY 123 | 124 | \ ***************************************************************************** 125 | \ VDU command data 126 | \ ***************************************************************************** 127 | 128 | B%=P% 129 | N%=67 ; DATA 67:READ N% 130 | 131 | EQUB 22,4,28,2,17,15,16 132 | EQUB 23,0, 6,31,0,0,0,0,0,0 133 | EQUB 23,0,12,12,0,0,0,0,0,0 134 | EQUB 23,0,13, 0,0,0,0,0,0,0 135 | EQUB 23,0, 1,32,0,0,0,0,0,0 136 | EQUB 23,0, 2,45,0,0,0,0,0,0 137 | EQUB 23,0,10,32,0,0,0,0,0,0 138 | 139 | \ ***************************************************************************** 140 | \ Sound envelope data 141 | \ ***************************************************************************** 142 | 143 | E%=P% 144 | 145 | EQUB 1,1,0,111,-8,4,1,8, 8,-2,0,-1,112,44 146 | EQUB 2,1,14,-18,-1,44,32,50, 6,1,0,-2,120,126 147 | EQUB 3,1,1,-1,-3,17,32,128,1,0,0,-1,1,1 148 | EQUB 4,1,4,-8,44,4,6,8,22,0,0,-127,126,0 149 | 150 | MACRO FNE I% 151 | LDX #((E%+I%*14)MOD256) 152 | LDY #((E%+I%*14)DIV256) 153 | LDA #8 154 | JSR OSWORD 155 | ENDMACRO 156 | 157 | \ ***************************************************************************** 158 | \ Machine reset 159 | \ ***************************************************************************** 160 | 161 | .swine 162 | LDA #&7F 163 | STA &FE4E 164 | JMP (&FFFC) 165 | 166 | \ This bit runs where it loads 167 | 168 | \ ***************************************************************************** 169 | \ OSBYTE call with Y=0 170 | \ ***************************************************************************** 171 | 172 | .OSB 173 | LDY #0 174 | JMP OSBYTE 175 | 176 | EQUS "R.ELITEcode" 177 | EQUB 13 178 | EQUS "By D.Braben/I.Bell" 179 | EQUB 13 180 | EQUB &B0 181 | 182 | \ ***************************************************************************** 183 | \ Addresses of various functions used by loader to obfuscate 184 | \ ***************************************************************************** 185 | 186 | .oscliv 187 | EQUW &FFF7 188 | 189 | .David9 190 | EQUW David5 ; used to direct decyrypt fn in stack to end of loop 191 | CLD 192 | 193 | .David23 194 | EQUW (512-len) ; start of DOMOVE fn pushed onto stack (&1DF) 195 | 196 | \ ***************************************************************************** 197 | \ Set up PROT1 fn to work correctly and set V219 to OSBPUT vector address 198 | \ ***************************************************************************** 199 | 200 | .doPROT1 ; enters with A=&48;X=255 201 | LDY#&DB 202 | STY TRTB% 203 | LDY #&EF \0.1 look-up keys 204 | STY TRTB%+1 205 | LDY #2 206 | STY V219+1 207 | STA PROT1-255,X ; self-mod PHA -> PROT1 208 | LDY #&18 209 | STY V219+1,X ; set V219 to &0218 210 | RTS 211 | 212 | .MHCA 213 | EQUB &CA 214 | 215 | .David7 216 | BCC Ian1 217 | 218 | \ ***************************************************************************** 219 | \ Boot code 220 | \ ***************************************************************************** 221 | 222 | .ENTRY 223 | SEI 224 | CLD 225 | 226 | \ ***************************************************************************** 227 | \ TAPE protection 228 | \ ***************************************************************************** 229 | 230 | IF DISC=FALSE 231 | LDA #0 232 | LDX #FF 233 | JSR OSBYTE 234 | TXA 235 | BEQ OS100 236 | LDY &FFB6 237 | LDA &FFB7 238 | STA ZP 239 | LDA &FFB8 240 | STA ZP+1 241 | DEY 242 | .ABCDEFG 243 | LDA (ZP),Y 244 | STA &200,Y 245 | DEY 246 | BPL ABCDEFG 247 | .OS100 248 | ENDIF 249 | 250 | \ ***************************************************************************** 251 | \ Disable all interupts 252 | \ ***************************************************************************** 253 | 254 | LDA #&7F 255 | STA &FE4E 256 | STA &FE6E 257 | 258 | \ ***************************************************************************** 259 | \ Set USERV, BRKV, IRQ2V and EVENTV to point to machine reset (&FFFC) 260 | \ ***************************************************************************** 261 | 262 | LDA &FFFC 263 | STA &200 264 | STA &202 265 | STA &206 266 | STA &220 267 | LDA &FFFD 268 | STA &201 269 | STA &203 270 | STA &207 271 | STA &221 \ Cold reset (Power on) on BRK,USER,& unrecog IRQ 272 | 273 | \ ***************************************************************************** 274 | \ Ensure all vectors are pointing into MOS (&C000 and upwards) 275 | \ ***************************************************************************** 276 | 277 | LDX #&2F-2 278 | .purge 279 | LDA &202,X 280 | ORA #&C0 281 | STA &202,X 282 | DEX 283 | DEX 284 | BPL purge 285 | 286 | \ ***************************************************************************** 287 | \ Make NETV an RTS 288 | \ ***************************************************************************** 289 | 290 | LDA #&60 291 | STA &232 292 | LDA #2 293 | STA NETV+1 294 | LDA #&32 295 | STA NETV \Knock out NETVEC 296 | 297 | \ ***************************************************************************** 298 | \ Poke JSR into David2 fn and set ADC to sample 2 channels 299 | \ ***************************************************************************** 300 | 301 | LDA #32 ; JSR absolute 302 | EQUB &2C ; BIT absolute (skip next 2 bytes) 303 | 304 | .Ian1 305 | BNE David3 306 | STA David2 ; self-mod code -> JSR at David2 307 | LSR A 308 | LDX #3 309 | STX BLPTR+1 310 | STX BLN+1 311 | STX EXCN+1 312 | DEX 313 | JSR OSBYTE \ADC 314 | 315 | EQUB &2C ; BIT absolute (skip next 2 bytes) 316 | 317 | .FRED1 318 | BNE David7 319 | 320 | \ ***************************************************************************** 321 | \ Poke PHA into PROT1 fn 322 | \ ***************************************************************************** 323 | 324 | LDX #255 325 | LDA #&48 326 | JSR doPROT1 327 | 328 | \ ***************************************************************************** 329 | \ Issue *TV 255,0 command (via OSBYTE 144) 330 | \ ***************************************************************************** 331 | 332 | LDA #144 333 | JSR OSB \TV 334 | 335 | \ ***************************************************************************** 336 | \ Remove BREAK intercept (via OSBYTE 247) 337 | \ ***************************************************************************** 338 | 339 | LDA #247 340 | LDX #0 341 | JSR OSB \BREAK vec 342 | 343 | \LDA#&81\LDY#FF\LDX#1\JSROSBYTE\TXA\BPLOS01 \Damn 0.1 344 | 345 | \ ***************************************************************************** 346 | \ Set ADC to 8-bit conversion (via OSBYTE 190) 347 | \ ***************************************************************************** 348 | 349 | LDA #190 350 | LDX #8 351 | JSR OSB \8bitADC 352 | 353 | EQUB &2C ; BIT absolute (skip next 2 bytes) 354 | .David8 355 | BNE FRED1 356 | 357 | \ ***************************************************************************** 358 | \ Issue paged ROM service call (via OSBYTE &8F) 359 | \ ***************************************************************************** 360 | 361 | LDA #&8F 362 | LDX #&C 363 | LDY #FF 364 | JSR OSBYTE \ claim NMIs 365 | 366 | \ ***************************************************************************** 367 | \ Disable output buffer empty event (via OSBYTE 13) 368 | \ ***************************************************************************** 369 | 370 | LDA #13 371 | .abrk 372 | LDX #0 373 | JSR OSB \otput bffer 374 | 375 | \ ***************************************************************************** 376 | \ Set character status flag (via OSBYTE 225) 377 | \ ***************************************************************************** 378 | 379 | LDA #225 380 | LDX #128 381 | JSR OSB \fn keys 382 | 383 | \ ***************************************************************************** 384 | \ Get address of MOS key translation table (via OSBYTE 172) 385 | \ ***************************************************************************** 386 | 387 | LDA #172 388 | LDX #0 389 | LDY #255 390 | JSR OSBYTE 391 | STX TRTB% 392 | STY TRTB%+1 \int-ascii table 393 | 394 | \ ***************************************************************************** 395 | \ Disable ESCAPE, memory cleared on BREAK (via OSBYTE 200) 396 | \ ***************************************************************************** 397 | 398 | LDA #200 399 | LDX #3 400 | JSR OSB 401 | 402 | IF PROT AND DISC=0 403 | CPX #3 404 | BNE abrk+1 \Clear memory on BREAK 405 | ENDIF 406 | 407 | \ ***************************************************************************** 408 | \ Disable character entering keyboard buffer event (via OSBYTE 13) 409 | \ ***************************************************************************** 410 | 411 | LDA #13 412 | LDX #2 413 | JSR OSB \kybrd buffer 414 | 415 | \ ***************************************************************************** 416 | \ Reset stack 417 | \ ***************************************************************************** 418 | 419 | .OS01 420 | LDX #FF 421 | TXS 422 | INX 423 | 424 | \ ***************************************************************************** 425 | \ Push 33 bytes from BEGIN% onto the stack 426 | \ NB. loops by indirecting through 5 branches! 427 | \ ***************************************************************************** 428 | 429 | .David3 430 | LDA BEGIN%,X 431 | 432 | .PROT1 433 | INY \PHA 434 | INX 435 | CPX #len 436 | BNE David8 \^stack 437 | 438 | \ ***************************************************************************** 439 | \ Issue 67 VDU commands to set up square MODE4 screen at &6000 440 | \ ***************************************************************************** 441 | 442 | LDA #(B% MOD256) 443 | STA ZP 444 | LDA #&C8 ; self-mod INY -> PROT1 445 | STA PROT1 446 | LDA #(B% DIV256) 447 | STA ZP+1 448 | 449 | LDY #0 450 | .LOOP 451 | LDA (ZP),Y 452 | JSR OSWRCH 453 | INY 454 | CPY #N% 455 | BNE LOOP \set up pokey-mode-4 456 | 457 | \ ***************************************************************************** 458 | \ Disable cursor editing, keys give ASCII values (via OSBYTE 4) 459 | \ ***************************************************************************** 460 | 461 | LDA #1 462 | TAX 463 | TAY 464 | STA (V219),Y 465 | LDA #4 466 | JSR OSB \cursor 467 | 468 | \ ***************************************************************************** 469 | \ Disable flashing colours (via OSBYTE 9) 470 | \ ***************************************************************************** 471 | 472 | LDA #9 473 | LDX #0 474 | JSR OSB \flashing 475 | 476 | \ ***************************************************************************** 477 | \ Poke JSR indirect into crunchit fn 478 | \ ***************************************************************************** 479 | 480 | LDA #&6C ; JMP indirect 481 | EOR crunchit 482 | STA crunchit 483 | 484 | \ ***************************************************************************** 485 | \ Define 4x sound envelopes (via OSWORD 8) 486 | \ ***************************************************************************** 487 | 488 | FNE 0 489 | FNE 1 490 | FNE 2 491 | FNE 3 \envelopes 492 | 493 | \ ***************************************************************************** 494 | \ Move & decrypt WORDS9 to language workspace (4x pages from &1100 to &0400) 495 | \ ***************************************************************************** 496 | 497 | LDX #4 498 | STX P+1 499 | LDA #(LL%DIV256) 500 | STA ZP+1 501 | LDY #0 502 | LDA #256-len1 503 | STA (V219-4,X) 504 | STY ZP 505 | STY P 506 | JSR crunchit \Move WORDS9 to &400 507 | 508 | \ ***************************************************************************** 509 | \ Move & decypt P.ELITE to screen (1x pages from &1D00 to &6300) 510 | \ ***************************************************************************** 511 | 512 | LDX #1 513 | LDA #((LL%DIV256)+&C) 514 | STA ZP+1 515 | LDA #&63 516 | STA P+1 517 | LDY #0 518 | JSR crunchit 519 | 520 | \ ***************************************************************************** 521 | \ Move & decypt P.A-SOFT to screen (1x pages from &1E00 to &6100) 522 | \ ***************************************************************************** 523 | 524 | LDX #1 525 | LDA #((LL%DIV256)+&D) 526 | STA ZP+1 527 | LDA #&61 528 | STA P+1 529 | LDY #0 530 | JSR crunchit 531 | 532 | \ ***************************************************************************** 533 | \ Move & decypt P.A-SOFT to screen (1x pages from &1F00 to &7600) 534 | \ ***************************************************************************** 535 | 536 | LDX #1 537 | LDA #((LL%DIV256)+&E) 538 | STA ZP+1 539 | LDA #&76 540 | STA P+1 541 | LDY #0 542 | JSR crunchit 543 | 544 | \ ***************************************************************************** 545 | \ Draw Saturn 546 | \ ***************************************************************************** 547 | 548 | JSR PLL1 \draw Saturn 549 | 550 | \ ***************************************************************************** 551 | \ Move & decypt DIALSHP to screen (1x pages from &1500 to &7800) 552 | \ ***************************************************************************** 553 | 554 | LDX #8 555 | LDA #((LL%DIV256)+4) 556 | STA ZP+1 557 | LDA #&78 558 | STA P+1 559 | LDY #0 560 | STY ZP 561 | STY BLCNT 562 | STY P 563 | JSR crunchit \Move DIALSHP to &7800 564 | 565 | \ ***************************************************************************** 566 | \ Move & decypt 2x pages of code from UU% down to &0B00 567 | \ ***************************************************************************** 568 | 569 | LDX #(3-(DISC AND1)) 570 | LDA #(UU%DIV256) 571 | STA ZP+1 572 | LDA #(UU%MOD256) 573 | STA ZP 574 | LDA #(LE%DIV256) 575 | STA P+1 576 | LDY #0 577 | STY P 578 | JSR crunchit \Move Part of this program to LE% 579 | 580 | \ ***************************************************************************** 581 | \ Poke BRK into OS01 fn and call OSBPUT with file handle Y=0... 582 | \ By now the address &01F1 has been sneakily placed into BPUTV (&218) 583 | \ So this call to OSBPUT actually calls the second function placed in stack 584 | \ ***************************************************************************** 585 | 586 | STY David3-2 587 | \LDY#0 588 | .David2 589 | EQUB &AC ; self moded to JSR &FFD4 590 | EQUW &FFD4 \JSR&FFD4 591 | 592 | \ ***************************************************************************** 593 | \ Code should never reach here if decryption is successful!! 594 | \ ***************************************************************************** 595 | 596 | .LBLa 597 | LDA C%,X 598 | EOR #&A5 599 | STA C%,X 600 | DEX 601 | BNE LBLa 602 | JMP (C%+&CF) 603 | 604 | .swine2 605 | JMP swine 606 | EQUW &4CFF 607 | 608 | \ ***************************************************************************** 609 | \ Call DOMOVE fn but inside the stack 610 | \ ***************************************************************************** 611 | 612 | .crunchit 613 | BRK ; JSR (David23) 614 | EQUW David23 615 | 616 | .RAND 617 | EQUD &6C785349 618 | 619 | \ ***************************************************************************** 620 | \ End of our decrypt fn inside the stack 621 | \ ***************************************************************************** 622 | 623 | .David5 624 | INY 625 | CPY #(ENDBLOCK-BLOCK) 626 | BNE David2 627 | 628 | \ ***************************************************************************** 629 | \ Enable interupts and set IRQ1V to IRQ1 fn 630 | \ ***************************************************************************** 631 | 632 | SEI 633 | LDA #&C2 634 | STA VIA+&E 635 | LDA #&7F 636 | STA &FE6E 637 | LDA IRQ1V 638 | STA VEC 639 | LDA IRQ1V+1 640 | BPL swine2 641 | STA VEC+1 642 | LDA #(IRQ1 DIV256) 643 | STA IRQ1V+1 644 | LDA #(IRQ1 MOD256) 645 | STA IRQ1V 646 | LDA #VSCAN 647 | STA USVIA+5 648 | CLI \ INTERRUPTS NOW OK 649 | 650 | \ ***************************************************************************** 651 | \ Read key with time limit (via OSBYTE &81) 652 | \ ***************************************************************************** 653 | 654 | IF DISC 655 | LDA #&81 656 | STA &FE4E 657 | LDY #20 658 | IF _REMOVE_CHECKSUMS 659 | NOP:NOP:NOP 660 | ELSE 661 | JSR OSBYTE 662 | ENDIF 663 | LDA #1 664 | STA &FE4E 665 | ENDIF 666 | 667 | \ ***************************************************************************** 668 | \ ENTRY2 already pushed onto stack at start of BLOCK code 669 | \ ***************************************************************************** 670 | 671 | RTS \ENTRY2 on stack already 672 | 673 | \ ***************************************************************************** 674 | \ Draw Saturn 675 | \ ***************************************************************************** 676 | 677 | .PLL1 678 | { 679 | LDA VIA+4 680 | STA RAND+1 681 | JSR DORND 682 | JSR SQUA2 683 | STA ZP+1 684 | LDA P 685 | STA ZP 686 | JSR DORND 687 | STA YY 688 | JSR SQUA2 689 | TAX 690 | LDA P 691 | ADC ZP 692 | STA ZP 693 | TXA 694 | ADC ZP+1 695 | BCS PLC1 696 | 697 | STA ZP+1 698 | LDA #1 699 | SBC ZP 700 | STA ZP 701 | LDA #&40 702 | SBC ZP+1 703 | STA ZP+1 704 | BCC PLC1 705 | JSR ROOT 706 | LDA ZP 707 | LSR A 708 | TAX 709 | LDA YY 710 | CMP #128 711 | ROR A 712 | JSR PIX 713 | 714 | .PLC1 715 | DEC CNT 716 | BNE PLL1 717 | DEC CNT+1 718 | BNE PLL1 719 | LDX #&C2 720 | STX EXCN 721 | 722 | .PLL2 723 | JSR DORND 724 | TAX 725 | JSR SQUA2 726 | STA ZP+1 727 | JSR DORND 728 | STA YY 729 | JSR SQUA2 730 | ADC ZP+1 731 | CMP #&11 732 | BCC PLC2 733 | LDA YY 734 | JSR PIX 735 | 736 | .PLC2 737 | DEC CNT2 738 | BNE PLL2 739 | DEC CNT2+1 740 | BNE PLL2 741 | LDX MHCA 742 | STX BLPTR 743 | LDX #&C6 744 | STX BLN 745 | 746 | .PLL3 747 | JSR DORND 748 | STA ZP 749 | JSR SQUA2 750 | STA ZP+1 751 | JSR DORND 752 | STA YY 753 | JSR SQUA2 754 | STA T 755 | 756 | ADC ZP+1 757 | STA ZP+1 758 | LDA ZP 759 | CMP #128 760 | ROR A 761 | CMP #128 762 | ROR A 763 | ADC YY 764 | TAX 765 | JSR SQUA2 766 | TAY 767 | ADC ZP+1 768 | 769 | BCS PLC3 770 | CMP #&50 771 | BCS PLC3 772 | CMP #&20 773 | BCC PLC3 774 | TYA 775 | ADC T 776 | CMP #&10 777 | BCS PL1 778 | LDA ZP 779 | BPL PLC3 780 | 781 | .PL1 782 | LDA YY 783 | JSR PIX 784 | 785 | .PLC3 786 | DEC CNT3 787 | BNE PLL3 788 | DEC CNT3+1 789 | BNE PLL3 790 | 791 | .DORND 792 | LDA RAND+1 793 | TAX 794 | ADC RAND+3 795 | STA RAND+1 796 | STX RAND+3 797 | LDA RAND 798 | TAX 799 | ADC RAND+2 800 | STA RAND 801 | STX RAND+2 802 | RTS 803 | 804 | .SQUA2 805 | BPL SQUA 806 | EOR #FF 807 | CLC 808 | ADC #1 809 | 810 | .SQUA 811 | STA Q 812 | STA P 813 | LDA #0 814 | LDY #8 815 | LSR P 816 | 817 | .SQL1 818 | BCC SQ1 819 | CLC 820 | ADC Q 821 | 822 | .SQ1 823 | ROR A 824 | ROR P 825 | DEY 826 | BNE SQL1 827 | RTS 828 | 829 | .PIX 830 | TAY 831 | EOR #128 832 | LSR A 833 | LSR A 834 | LSR A 835 | ORA #&60 836 | STA ZP+1 837 | TXA 838 | EOR #128 839 | AND #&F8 840 | STA ZP 841 | TYA 842 | AND #7 843 | TAY 844 | TXA 845 | AND #7 846 | TAX 847 | 848 | LDA TWOS,X 849 | ORA (ZP),Y 850 | STA (ZP),Y 851 | RTS 852 | 853 | .TWOS 854 | EQUD &10204080 855 | EQUD &01020408 856 | 857 | .CNT 858 | EQUW &500 859 | .CNT2 860 | EQUW &1DD 861 | .CNT3 862 | EQUW &500 863 | 864 | .ROOT 865 | LDY ZP+1 866 | LDA ZP 867 | STA Q 868 | LDX #0 869 | STX ZP 870 | LDA #8 871 | STA P 872 | 873 | .LL6 874 | CPX ZP 875 | BCC LL7 876 | BNE LL8 877 | CPY #&40 878 | BCC LL7 879 | 880 | .LL8 881 | TYA 882 | SBC #&40 883 | TAY 884 | TXA 885 | SBC ZP 886 | TAX 887 | 888 | .LL7 889 | ROL ZP 890 | ASL Q 891 | TYA 892 | ROL A 893 | TAY 894 | TXA 895 | ROL A 896 | TAX 897 | ASL Q 898 | TYA 899 | ROL A 900 | TAY 901 | TXA 902 | ROL A 903 | TAX 904 | DEC P 905 | BNE LL6 906 | RTS 907 | } 908 | 909 | \ ***************************************************************************** 910 | \ Copy BLOCK fn to stack and decrypt TUT fn 911 | \ ***************************************************************************** 912 | 913 | .BEGIN% 914 | EQUB (David9 DIV256) 915 | EQUB (David9 MOD256) 916 | EQUB &6C \JMP 917 | EQUB (TUT DIV256) 918 | EQUB (TUT MOD256) 919 | EQUB &99 \STA,Y 920 | EQUB (TUT DIV256) 921 | EQUB (TUT MOD256) 922 | IF _REMOVE_CHECKSUMS 923 | EQUB &B9 \LDA,Y 924 | ELSE 925 | EQUB &59 \EOR,Y 926 | ENDIF 927 | PHA 928 | EQUB ((BLOCK)DIV256) 929 | EQUB ((BLOCK)MOD256) 930 | EQUB &B9 \LDA,Y 931 | PLA 932 | PLA 933 | 934 | \ ***************************************************************************** 935 | \ Copy BLOCK fn to stack and decrypt TUT fn 936 | \ 937 | \ 01F1 : PLA 938 | \ 01F2 : PLA 939 | \ 01F3 : LDA 0C7C,Y ; BLOCK 940 | \ 01F6 : PHA 941 | \ 01F7 : EOR 0BAD,Y ; TUT 942 | \ 01FA : STA 0BAD,Y 943 | \ 01FD : JMP (20AD) 944 | \ 945 | \ ***************************************************************************** 946 | 947 | \ ***************************************************************************** 948 | \ Move memory fn with EOR against loader code from OSB onwards 949 | \ ***************************************************************************** 950 | 951 | .DOMOVE 952 | RTS 953 | EQUW &D0EF \BNEMVDL 954 | DEX 955 | EQUB ZP+1 956 | INC P+1 957 | EQUB &E6 \INCP+1 INCZP+1 958 | EQUW &D0F6 \BNEMVDL 959 | DEY 960 | EQUB P 961 | EQUB &91 \STA(),Y 962 | IF _REMOVE_CHECKSUMS 963 | NOP:NOP:NOP 964 | ELSE 965 | EQUB (OSB DIV256) 966 | EQUB (OSB MOD256) 967 | EQUB &59 \EOR 968 | ENDIF 969 | EQUB ZP 970 | EQUB &B1 \LDA(),Y \ 18 Bytes ^ Stack 971 | 972 | \ ***************************************************************************** 973 | \ DOMOVE fn as running on the stack 974 | \ 975 | \ 01DF : LDA (70),Y 976 | \ 01E1 : EOR 2086,Y 977 | \ 01E4 : STA (72),Y 978 | \ 01E6 : DEY 979 | \ 01E7 : BNE 01DF 980 | \ 01E9 : INC 73 981 | \ 01EB : INC 71 982 | \ 01ED : DEX 983 | \ 01EE : BNE 01DF 984 | \ 01F0 : RTS 985 | \ 986 | \ ***************************************************************************** 987 | 988 | \ ***************************************************************************** 989 | \ This code all located at &B00 990 | \ ***************************************************************************** 991 | 992 | .UU% 993 | 994 | Q%=P%-LE% 995 | ORG LE% ;P%=LE% 996 | 997 | .CHECKbyt 998 | BRK ; CHECKbyt checksum value calcuated in elite-checksum.py 999 | 1000 | .MAINSUM 1001 | EQUB &CB ; hard-coded checksum value of &28 bytes at LBL in elite-bcfs.asm (ELThead) 1002 | EQUB 0 ; MAINSUM checksum value calculated in elite-checksum.py 1003 | 1004 | .FOOLV 1005 | EQUW FOOL ; address of fn with just RTS 1006 | 1007 | .CHECKV 1008 | EQUW LOD%+1 ; address of LBL fn in elite-bcfs.asm (ELThead) 1009 | 1010 | \ ***************************************************************************** 1011 | \ ULA Palette colours for MODE 5 portion of screen 1012 | \ ***************************************************************************** 1013 | 1014 | .block1 1015 | EQUD &A5B5E5F5 1016 | EQUD &26366676 1017 | EQUD &8494C4D4 1018 | 1019 | \ ***************************************************************************** 1020 | \ ULA Palette colours for MODE 4 portion of screen 1021 | \ ***************************************************************************** 1022 | 1023 | .block2 1024 | EQUD &A0B0C0D0 1025 | EQUD &8090E0F0 1026 | EQUD &27376777 \ Colours for interrupts 1027 | 1028 | \ ***************************************************************************** 1029 | \ PRINT fn for OSPRNT 1030 | \ ***************************************************************************** 1031 | 1032 | .TT26\ PRINT Please tidy this up! 1033 | { 1034 | STA K3 1035 | TYA 1036 | PHA 1037 | TXA 1038 | PHA 1039 | 1040 | .rr 1041 | LDA K3 1042 | CMP #7 1043 | BEQ R5 1044 | CMP #32 1045 | BCS RR1 1046 | CMP #13 1047 | BEQ RRX1 1048 | INC YC 1049 | 1050 | .RRX1 1051 | LDX#7 1052 | STX XC 1053 | BNE RR4 1054 | 1055 | .RR1 1056 | LDX #&BF 1057 | ASL A 1058 | ASL A 1059 | BCC P%+4 1060 | LDX #&C1 1061 | ASL A 1062 | BCC P%+3 1063 | INX 1064 | STA P 1065 | STX P+1 1066 | 1067 | LDA XC 1068 | CMP #20 1069 | BCC NOLF 1070 | LDA #7 1071 | STA XC 1072 | INC YC 1073 | 1074 | .NOLF 1075 | ASL A 1076 | ASL A 1077 | ASL A 1078 | STA ZP 1079 | INC XC 1080 | LDA YC 1081 | CMP #19 1082 | BCC RR3 1083 | LDA #7 1084 | STA XC 1085 | LDA #&65 1086 | STA sc+1 1087 | LDY #7*8 1088 | LDX #14 1089 | STY sc 1090 | LDA #0 1091 | TAY 1092 | 1093 | .David1 1094 | sta (sc),Y 1095 | INY 1096 | CPY #14*8 1097 | BCC David1 1098 | TAY 1099 | inc sc+1 1100 | DEX 1101 | BPL David1 1102 | LDA #5 1103 | STA YC 1104 | 1105 | BNE rr 1106 | 1107 | .RR3 1108 | ORA #&60 1109 | STA ZP+1 1110 | LDY #7 1111 | 1112 | .RRL1 1113 | LDA (P),Y 1114 | STA (ZP),Y 1115 | DEY 1116 | BPL RRL1 1117 | } 1118 | 1119 | .RR4 1120 | PLA 1121 | TAX 1122 | PLA 1123 | TAY 1124 | LDA K3 1125 | 1126 | .FOOL 1127 | RTS 1128 | 1129 | .R5 1130 | lda #7 1131 | JSR osprint 1132 | JMP RR4 1133 | 1134 | \ ***************************************************************************** 1135 | \ Following code all encrypted in elite-checksum.py 1136 | \ ***************************************************************************** 1137 | 1138 | .TUT \EOR here onward 1139 | 1140 | .osprint 1141 | jmp (osprnt) 1142 | EQUB &6C 1143 | 1144 | .command 1145 | jmp(oscliv) 1146 | 1147 | .MESS1 1148 | IF DISC 1149 | EQUS "L.ELTcode 1100" 1150 | ELSE 1151 | EQUS "L.ELITEcode F1F" 1152 | ENDIF 1153 | EQUB13 \*LOAD ELITEcode 1154 | 1155 | \ ***************************************************************************** 1156 | \ Second entry point for loader after screen & irq set up 1157 | \ ***************************************************************************** 1158 | 1159 | .ENTRY2 1160 | 1161 | \ ***************************************************************************** 1162 | \ Set OSPRNT vector to TT26 fn 1163 | \ ***************************************************************************** 1164 | 1165 | lda &20E 1166 | STA osprnt 1167 | LDA #(TT26 MOD256) 1168 | STA &20E 1169 | LDX #(MESS1 MOD256) 1170 | LDA &20F 1171 | STA osprnt+1 1172 | LDA #(TT26 DIV256) 1173 | LDY #(MESS1 DIV256) 1174 | STA &20F \OSWRCH for loading messages 1175 | 1176 | JSR AFOOL 1177 | 1178 | \ ***************************************************************************** 1179 | \ Issue OSCLI command in MESS1 "*L.ELTcode 1100" 1180 | \ ***************************************************************************** 1181 | 1182 | JSR command 1183 | 1184 | \ ***************************************************************************** 1185 | \ Execute CHECKER fn but in stack 1186 | \ ***************************************************************************** 1187 | 1188 | JSR 512-len+CHECKER-ENDBLOCK 1189 | JSR AFOOL 1190 | \ (Gratuitous JSRs)- LOAD Mcode and checksum it. 1191 | 1192 | \ ***************************************************************************** 1193 | \ Issue *TAPE command (via OSBYTE 140) 1194 | \ ***************************************************************************** 1195 | 1196 | IF DISC 1197 | LDA #140 1198 | LDX #12 1199 | JSR OSBYTE \*TAPE 1200 | ENDIF 1201 | 1202 | LDA #0 1203 | STA svn 1204 | 1205 | \ ***************************************************************************** 1206 | \ Decrypt and copy down all ELITE game code from &1128 to &F40 1207 | \ ***************************************************************************** 1208 | 1209 | LDX #(LC% DIV256) 1210 | LDA #(L% MOD256) 1211 | STA ZP 1212 | LDA #(L% DIV256) 1213 | STA ZP+1 1214 | LDA #(C% MOD256) 1215 | STA P 1216 | LDA #(C% DIV256) 1217 | STA P+1 1218 | LDY #0 1219 | 1220 | .ML1 1221 | TYA 1222 | IF _REMOVE_CHECKSUMS 1223 | LDA (ZP),Y 1224 | ELSE 1225 | EOR (ZP),Y 1226 | ENDIF 1227 | STA (P),Y 1228 | INY 1229 | BNE ML1 1230 | INC ZP+1 1231 | INC P+1 1232 | DEX 1233 | BPL ML1 \Move code down (d) 1234 | 1235 | \ ***************************************************************************** 1236 | \ Set BRKV and WRCHV to point at BR1 and TT26 fns in elite-source.asm 1237 | \ ***************************************************************************** 1238 | 1239 | LDA S%+6 1240 | STA &202 1241 | LDA S%+7 1242 | STA &203 1243 | LDA S%+2 1244 | STA &20E 1245 | LDA S%+3 1246 | STA &20F \BRK,OSWRCH 1247 | 1248 | \ ***************************************************************************** 1249 | \ Calls final boot code from value copied to stack 1250 | \ ***************************************************************************** 1251 | 1252 | RTS \- ON STACK 1253 | 1254 | .AFOOL 1255 | JMP(FOOLV) 1256 | 1257 | .M2 1258 | EQUB 2 1259 | 1260 | \ ***************************************************************************** 1261 | \ IRQ1V handler for Timer 1 interrupt 1262 | \ ***************************************************************************** 1263 | 1264 | .VIA2 1265 | 1266 | \ ***************************************************************************** 1267 | \ Set ULA Control Register to 20 characters per line (MODE 5) 1268 | \ ***************************************************************************** 1269 | 1270 | LDA #4 1271 | STA &FE20 1272 | 1273 | \ ***************************************************************************** 1274 | \ Set ULA Palette Registers for MODE 5 colour scheme 1275 | \ ***************************************************************************** 1276 | 1277 | LDY #11 1278 | 1279 | .inlp1 1280 | LDA block1,Y 1281 | STA &FE21 1282 | DEY 1283 | BPL inlp1 1284 | PLA 1285 | TAY 1286 | JMP (VEC) 1287 | 1288 | \ ***************************************************************************** 1289 | \ IRQ1V handler 1290 | \ ***************************************************************************** 1291 | 1292 | .IRQ1 1293 | TYA 1294 | PHA 1295 | 1296 | \ ***************************************************************************** 1297 | \ TAPE protection 1298 | \ ***************************************************************************** 1299 | 1300 | IF PROT AND DISC=0 1301 | LDY #0 1302 | LDA (BLPTR),Y 1303 | BIT M2 1304 | BNE itdone 1305 | EOR#128+3 1306 | INC BLCNT 1307 | BNE ZQK 1308 | DEC BLCNT 1309 | 1310 | .ZQK 1311 | STA (BLPTR),Y 1312 | LDA #&23 1313 | CMP (BLN),Y 1314 | BEQ P%+4 1315 | EOR #17 1316 | CMP (EXCN),Y 1317 | BEQ itdone 1318 | DEC LOD% 1319 | .itdone 1320 | ENDIF 1321 | 1322 | \ ***************************************************************************** 1323 | \ Test which interrupt has occurred 1324 | \ ***************************************************************************** 1325 | 1326 | LDA VIA+&D 1327 | BIT M2 1328 | BNE LINSCN 1329 | AND #64 1330 | BNE VIA2 1331 | PLA 1332 | TAY 1333 | JMP (VEC) 1334 | 1335 | \ ***************************************************************************** 1336 | \ IRQ1V handler for Vsync interrupt 1337 | \ ***************************************************************************** 1338 | 1339 | .LINSCN 1340 | 1341 | \ ***************************************************************************** 1342 | \ Reset Timer 1 counter value Hi and Low bytes 1343 | \ ***************************************************************************** 1344 | 1345 | LDA #50 1346 | STA USVIA+4 1347 | LDA #VSCAN 1348 | STA USVIA+5 1349 | 1350 | \ ***************************************************************************** 1351 | \ Set ULA Control Register to 40 characters per line (MODE 4) 1352 | \ ***************************************************************************** 1353 | 1354 | LDA #8 1355 | STA &FE20 1356 | LDY #11 1357 | 1358 | \ ***************************************************************************** 1359 | \ Set ULA Palette Registers for MODE 4 black & white 1360 | \ ***************************************************************************** 1361 | 1362 | .inlp2 1363 | LDA block2,Y 1364 | STA &FE21 1365 | DEY 1366 | BPL inlp2 1367 | PLA 1368 | TAY 1369 | JMP (VEC) 1370 | 1371 | \ ***************************************************************************** 1372 | \ Entire BLOCK to ENDBLOCK copied into stack at location &15E 1373 | \ ***************************************************************************** 1374 | 1375 | .BLOCK \ Pushed onto stack for execution 1376 | EQUW ENTRY2-1 ; return address for ENTRY2 1377 | EQUW 512-len+BLOCK-ENDBLOCK+3 ; return address for final boot code (below) 1378 | 1379 | \ ***************************************************************************** 1380 | \ Final boot code starts at &163 1381 | \ ***************************************************************************** 1382 | 1383 | \ ***************************************************************************** 1384 | \ Disable SYSVIA interrupts Timer2, CB1, CB2, CA2 1385 | \ ***************************************************************************** 1386 | 1387 | LDA VIA+4 1388 | STA 1 1389 | SEI 1390 | LDA #&39 1391 | STA VIA+&E 1392 | \LDA#&7F 1393 | \STA&FE6E 1394 | \LDAIRQ1V 1395 | \STAVEC 1396 | \LDAIRQ1V+1 1397 | \STAVEC+1 Already done 1398 | 1399 | \ ***************************************************************************** 1400 | \ Set IRQ1V to IRQ1 fn in elite-source.asm & set Timer 1 Counter Hi value 1401 | \ ***************************************************************************** 1402 | 1403 | LDA S%+4 1404 | STA IRQ1V 1405 | LDA S%+5 1406 | STA IRQ1V+1 1407 | LDA #VSCAN 1408 | STA USVIA+5 1409 | CLI \Interrupt vectors 1410 | 1411 | \LDA#&81LDY#FFLDX#1JSROSBYTETXAEOR#FFSTAMOS \FF if MOS0.1 else 0 1412 | \BMIBLAST 1413 | 1414 | \ ***************************************************************************** 1415 | \ Disable ESCAPE, memory cleared on BREAK (via OSBYTE 200) 1416 | \ ***************************************************************************** 1417 | 1418 | LDY #0 1419 | LDA #200 1420 | LDX #3 1421 | JSR OSBYTE 1422 | 1423 | \ ***************************************************************************** 1424 | \ Calculate Checksum0 = 70x pages of all Elite code from &F40 to &5540 1425 | \ ***************************************************************************** 1426 | 1427 | .BLAST \break,escape 1428 | LDA #(S% DIV256) 1429 | STA ZP+1 1430 | LDA #(S% MOD256) 1431 | STA ZP 1432 | LDX #&45 1433 | LDY #0 1434 | TYA 1435 | 1436 | .CHK 1437 | CLC 1438 | ADC (ZP),Y 1439 | INY 1440 | BNE CHK 1441 | INC ZP+1 1442 | DEX 1443 | BPL CHK 1444 | IF _REMOVE_CHECKSUMS 1445 | LDA #0:NOP 1446 | ELSE 1447 | CMP D%-1 1448 | ENDIF 1449 | BEQ itsOK 1450 | 1451 | \ ***************************************************************************** 1452 | \ Checksum wrong - disable all interrupts and reset machine 1453 | \ ***************************************************************************** 1454 | 1455 | .nononono 1456 | STA S%+1 1457 | LDA #&7F 1458 | STA &FE4E 1459 | JMP (&FFFC) 1460 | 1461 | .itsOK 1462 | JMP(S%) 1463 | 1464 | \ ***************************************************************************** 1465 | \ CHECKER fn verifies checksum values 1466 | \ ***************************************************************************** 1467 | 1468 | .CHECKER 1469 | LDY#0 1470 | LDX #4 1471 | STX ZP+1 1472 | STY ZP 1473 | TYA 1474 | 1475 | \ ***************************************************************************** 1476 | \ Verify MAINSUM of WORDS9 = 4 pages from &400 to &800 1477 | \ ***************************************************************************** 1478 | 1479 | .CHKq 1480 | CLC 1481 | ADC (ZP),Y 1482 | INY 1483 | BNE CHKq 1484 | INC ZP+1 1485 | DEX 1486 | BNE CHKq 1487 | CMP MAINSUM+1 1488 | IF _REMOVE_CHECKSUMS 1489 | NOP:NOP 1490 | ELSE 1491 | BNE nononono 1492 | ENDIF 1493 | 1494 | \ ***************************************************************************** 1495 | \ Verify (hard coded) checksum of LBL in elite-bcfs.asm (ELThead) 1496 | \ ***************************************************************************** 1497 | 1498 | TYA 1499 | .CHKb 1500 | CLC 1501 | ADC LOD%,Y 1502 | INY 1503 | CPY #&28 1504 | BNE CHKb 1505 | CMP MAINSUM 1506 | IF _REMOVE_CHECKSUMS 1507 | NOP:NOP 1508 | ELSE 1509 | BNE nononono 1510 | ENDIF 1511 | 1512 | IF PROT AND DISC=0 1513 | LDA BLCNT 1514 | CMP #&4F 1515 | BCC nononono 1516 | ENDIF 1517 | 1518 | \ ***************************************************************************** 1519 | \ Call LBL in elite-bcfs.sm (ELThead) to verify CHECKbyt checksum 1520 | \ ***************************************************************************** 1521 | 1522 | IF _REMOVE_CHECKSUMS 1523 | RTS:NOP:NOP 1524 | ELSE 1525 | JMP (CHECKV) 1526 | ENDIF 1527 | 1528 | .ENDBLOCK \ no more on to stack 1529 | 1530 | \ ***************************************************************************** 1531 | \ Variables used by PRINT function 1532 | \ ***************************************************************************** 1533 | 1534 | .XC 1535 | EQUB 7 1536 | 1537 | .YC 1538 | EQUB 6 1539 | 1540 | \ ***************************************************************************** 1541 | \ LOADER END 1542 | \ ***************************************************************************** 1543 | 1544 | \\ We assembled a block of code at &B00 1545 | \\ Need to copy this up to end of main code 1546 | 1547 | COPYBLOCK LE%, P%, UU% 1548 | 1549 | PRINT "BLOCK_offset =", ~(BLOCK - LE%) + (UU% - CODE) 1550 | PRINT "ENDBLOCK_offset =",~(ENDBLOCK - LE%) + (UU% - CODE) 1551 | PRINT "MAINSUM_offset =",~(MAINSUM - LE%) + (UU% - CODE) 1552 | PRINT "TUT_ofset =",~(TUT - LE%) + (UU% - CODE) 1553 | PRINT "UU%=",~UU%," Q%=",~Q%, " OSB=",~OSB 1554 | 1555 | \\ Further processing completed by elite-checksum.py script 1556 | 1557 | PRINT "Memory usage: ", ~LE%, " - ",~P% 1558 | PRINT "Stack: ",len+ENDBLOCK-BLOCK 1559 | 1560 | ;OSCLI("S.:0.ELITE "+STR$~CODE +" "+STR$~O% +" "+STR$~run +" "+STR$~LL%) 1561 | 1562 | \ ***************************************************************************** 1563 | \ Save ELITE loader 1564 | \ ***************************************************************************** 1565 | 1566 | PRINT "S. ELITE ",~CODE," ",~UU%+(P%-LE%)," ",~run," ",~LL% 1567 | SAVE "output/ELITE.unprot.bin", CODE, UU%+(P%-LE%), run, LL% 1568 | -------------------------------------------------------------------------------- /elite.ssd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/elite.ssd -------------------------------------------------------------------------------- /extracted/ELITE.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/extracted/ELITE.bin -------------------------------------------------------------------------------- /extracted/ELTA.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/extracted/ELTA.bin -------------------------------------------------------------------------------- /extracted/ELTB.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/extracted/ELTB.bin -------------------------------------------------------------------------------- /extracted/ELTC.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/extracted/ELTC.bin -------------------------------------------------------------------------------- /extracted/ELTD.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/extracted/ELTD.bin -------------------------------------------------------------------------------- /extracted/ELTE.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/extracted/ELTE.bin -------------------------------------------------------------------------------- /extracted/ELTF.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/extracted/ELTF.bin -------------------------------------------------------------------------------- /extracted/ELTG.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/extracted/ELTG.bin -------------------------------------------------------------------------------- /extracted/ELTcode.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/extracted/ELTcode.bin -------------------------------------------------------------------------------- /make.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | SETLOCAL 3 | SET BEEBASM=..\..\bin\beebasm.exe 4 | SET PYTHON=C:\Home\Python27\python.exe 5 | make build 6 | -------------------------------------------------------------------------------- /make.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/make.exe -------------------------------------------------------------------------------- /output/ELITE.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/output/ELITE.bin -------------------------------------------------------------------------------- /output/ELITE.unprot.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/output/ELITE.unprot.bin -------------------------------------------------------------------------------- /output/ELTA.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/output/ELTA.bin -------------------------------------------------------------------------------- /output/ELTB.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/output/ELTB.bin -------------------------------------------------------------------------------- /output/ELTC.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/output/ELTC.bin -------------------------------------------------------------------------------- /output/ELTD.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/output/ELTD.bin -------------------------------------------------------------------------------- /output/ELTE.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/output/ELTE.bin -------------------------------------------------------------------------------- /output/ELTF.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/output/ELTF.bin -------------------------------------------------------------------------------- /output/ELTG.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/output/ELTG.bin -------------------------------------------------------------------------------- /output/ELTcode.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/output/ELTcode.bin -------------------------------------------------------------------------------- /output/ELTcode.unprot.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/output/ELTcode.unprot.bin -------------------------------------------------------------------------------- /output/ELThead.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/output/ELThead.bin -------------------------------------------------------------------------------- /sources/Cassette sources [A4080602].DSD: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/sources/Cassette sources [A4080602].DSD -------------------------------------------------------------------------------- /sources/Cassette sources [disk image].zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/sources/Cassette sources [disk image].zip -------------------------------------------------------------------------------- /sources/Cassette sources [text files].zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/sources/Cassette sources [text files].zip -------------------------------------------------------------------------------- /sources/ELITEA.TXT: -------------------------------------------------------------------------------- 1 | 1GOTO20 2 | 2*L.ELITEB 3 | 3GOTO20 4 | 4*L.ELITEA 5 | 5GOTO120 6 | 20REM ELITE 7 | 30MODE7:VDU28,0,23,39,19 8 | 40LOMEM=&3D70 9 | 100C%=&F40:W%=&7200:L%=&1128:HIMEM=W%:Z=0 10 | 120D%=&563A:WP=&D40:K%=&900:LS%=WP-1:QQ18=&400:T%=&300 11 | 220NOST=18:NOSH=12:COPS=2:SH3=COPS:CYL=7:THG=6:SST=8:MSL=9:AST=10:OIL=11:TGL=12:ESC=13:NI%=36:POW=15:B=&30 12 | 1000FF=&FF:OSWRCH=&FFEE:OSBYTE=&FFF4:OSWORD=&FFF1:OSFILE=&FFDD:SCLI=&FFF7:VIA=&FE40:USVIA=VIA:IRQ1V=&204:VSCAN=57:XX21=D% 13 | 1020ZP=0:X=128:Y=96:RAND=FNZT(4):TRTB%=FNZ2:T1=FNZ:SC=FNZ2:SCH=SC+1:XX16=FNZT(18):P=FNZT(3) 14 | 1060XX0=FNZ2:INF=FNZ2:V=FNZ2:XX=FNZ2:YY=FNZ2:SUNX=FNZ2:BETA=FNZ:BET1=FNZ:XC=FNZ:YC=FNZ:QQ22=FNZ2:ECMA=FNZ 15 | 1120XX15=FNZT(6):XX12=FNZT(6):X1=XX15:Y1=X1+1:X2=Y1+1:Y2=X2+1:K=FNZT(4) 16 | 1125KL=FNZT(16):LAS=FNZ:MSTG=FNZ 17 | 1126f0=&20:f1=&71:f2=&72:f3=&73:f4=&14:f5=&74:f6=&75:f7=&16:f8=&76:f9=&77 18 | 1128KY1=KL+1:KY2=KL+2:KY3=KL+3:KY4=KL+4:KY5=KL+5:KY6=KL+6:KY7=KL+7:KY12=KL+8:KY13=KL+9:KY14=KL+10:KY15=KL+11:KY16=KL+12:KY17=KL+13:KY18=KL+14:KY19=KL+15 19 | 1130INWK=FNZT(NI%):XX19=INWK+33:XX1=INWK:LSP=FNZ:QQ15=FNZT(6):XX18=FNZT(9):QQ17=XX18:QQ19=QQ17+1:K5=XX18:K6=K5+4:ALP1=FNZ:ALP2=FNZ2 20 | 1150BET2=FNZ2:DELTA=FNZ:DELT4=FNZ2:U=FNZ:Q=FNZ:R=FNZ:S=FNZ:XSAV=FNZ:YSAV=FNZ:XX17=FNZ 21 | 1160QQ11=FNZ:ZZ=FNZ:XX13=FNZ:MCNT=FNZ:DL=FNZ:TYPE=FNZ:JSTX=FNZ:JSTY=FNZ:ALPHA=FNZ 22 | 1195QQ12=FNZ:TGT=FNZ:SWAP=FNZ:COL=FNZ:FLAG=FNZ:CNT=FNZ:CNT2=FNZ:STP=FNZ:XX4=FNZ:XX20=FNZ:XX14=FNZ:RAT=FNZ:RAT2=FNZ:K2=FNZT(4) 23 | 1400P%=C%:O%=W%:H%=L%+P%-C% 24 | 1410IFZ=4THENZ=6ELSEZ=4 25 | 1450FRIN=FNWT(NOSH+1):MANY=FNWT(14):SSPR=MANY+SST 26 | 1460ECMP=FNW:MJ=FNW:CABTMP=MANY:LAS2=FNW:MSAR=FNW:VIEW=FNW:LASCT=FNW:GNTMP=FNW:HFX=FNW:EV=FNW:DLY=FNW 27 | 1465de=FNW:T=&D1:XX2=&D2:K3=XX2:K4=K3+14:REM16 28 | 1470LSO=FNWT(192):LSX=LSO:LSX2=FNWT(78):LSY2=FNWT(78):SY=FNWT(NOST+1):SYL=FNWT(NOST+1):SZ=FNWT(NOST+1):SZL=FNWT(NOST+1) 29 | 1480XSAV2=FNW:YSAV2=FNW 30 | 1500TP=FNTP:QQ0=FNTP:QQ1=FNTP:QQ21=FNTPT(6):CASH=FNTPT(4):QQ14=FNTP:COK=FNTP:GCNT=FNTP:LASER=FNTPT(6):CRGO=FNTP:QQ20=FNTPT(17):ECM=FNTP:BST=FNTP:BOMB=FNTP:ENGY=FNTP:DKCMP=FNTP:GHYP=FNTP:ESCP=FNTPT(5) 31 | 1520NOMSL=FNTP:FIST=FNTP:AVL=FNTPT(17):QQ26=FNTP:TALLY=FNTPT(2):SVC=FNTPT(3):NT%=SVC+2-TP:MCH=FNW 32 | 1600SX=T%:SXL=SX+NOST+1:XX3=256:REM&70 33 | 1628FSH=FNW:ASH=FNW:ENERGY=FNW:REMFF 34 | 1630LASX=FNW:LASY=FNW:COMX=FNW:COMY=FNW:QQ24=FNW:QQ25=FNW:QQ28=FNW:QQ29=FNW:gov=FNW:tek=FNW:SLSP=FNW2:XX24=FNW:ALTIT=FNW:VEC=&7FFE:svn=&7FFD 35 | 1650QQ2=FNWT(6):QQ3=FNW:QQ4=FNW:QQ5=FNW:QQ6=FNW2:QQ7=FNW2:QQ8=FNW2:QQ9=FNW:QQ10=FNW:NOSTM=FNW 36 | 1800[OPTZ:.S% EQUWTT170:EQUWTT26:EQUWIRQ1:EQUWBR1 37 | 1830.COMC brk:.DNOIZ brk:.DAMP brk:.DJD brk:.PATG brk:.FLH brk:.JSTGY brk:.JSTE brk:.JSTK brk 38 | 4000.M% LDAK%:STARAND 39 | 4020LDXJSTX:JSRcntr:JSRcntr:TXA:EOR#128:TAY:AND#128:STAALP2:STXJSTX:EOR#128:STAALP2+1:TYA:BPLP%+7:EOR#FF:CLC:ADC#1:LSRA:LSRA:CMP#8:BCSP%+4:LSRA:CLC:STAALP1:ORAALP2:STAALPHA 40 | 4030LDXJSTY:JSRcntr:TXA:EOR#128:TAY:AND#128:STXJSTY:STABET2+1:EOR#128:STABET2:TYA:BPLP%+4:EOR#FF:ADC#4:LSRA:LSRA:LSRA:LSRA:CMP#3:BCSP%+3:LSRA:STABET1:ORABET2:STABETA 41 | 4050LDAKY2:BEQMA17:LDADELTA:CMP#40:BCSMA17:INCDELTA:.MA17 LDAKY1:BEQMA4:DECDELTA:BNEMA4:INCDELTA:.MA4 42 | 4060LDAKY15:ANDNOMSL:BEQMA20:LDY#&EE:JSRABORT:LDA#40:JSRNOISE:.MA31 LDA#0:STAMSAR:.MA20 LDAMSTG:BPLMA25:LDAKY14:BEQMA25:LDXNOMSL:BEQMA25:STAMSAR:LDY#&E0:JSRMSBAR:.MA25 43 | 4064LDAKY16:BEQMA24:LDAMSTG:BMIMA64:JSRFRMIS:.MA24 LDAKY12:BEQMA76:ASLBOMB:.MA76 44 | 4070LDAKY13:ANDESCP:BEQP%+5:JMPESCAPE:LDAKY18:BEQP%+5:JSRWARP:LDAKY17:ANDECM:BEQMA64:LDAECMA:BNEMA64:DECECMP:JSRECBLB2:.MA64 45 | 4075LDAKY19:ANDDKCMP:ANDSSPR:BEQMA68:LDAK%+NI%+32:BMIMA68:JMPGOIN:.MA68 46 | 4080LDA#0:STALAS:STADELT4:LDADELTA:LSRA:RORDELT4:LSRA:RORDELT4:STADELT4+1 47 | 4090LDALASCT:BNEMA3:LDAKY7:BEQMA3:LDAGNTMP:CMP#242:BCSMA3:LDXVIEW:LDALASER,X:BEQMA3:PHA:AND#127:STALAS:STALAS2:LDA#0:JSRNOISE:JSRLASLI:PLA:BPLma1:LDA#0:.ma1 AND#&FA:STALASCT:.MA3 48 | 4100LDX#0:.MAL1 49 | 4105STXXSAV:LDAFRIN,X:BNEP%+5:JMPMA18:STATYPE:JSRGINF 50 | 4110LDY#(NI%-1):.MAL2 LDA(INF),Y:STAINWK,Y:DEY:BPLMAL2:LDATYPE:BMIMA21:ASLA:TAY:LDAXX21-2,Y:STAXX0:LDAXX21-1,Y:STAXX0+1 51 | 4115LDABOMB:BPLMA21:CPY#2*SST:BEQMA21:LDAINWK+31:AND#32:BNEMA21:LDAINWK+31:ORA#128:STAINWK+31:JSREXNO2 52 | 4130.MA21 JSRMVEIT:LDY#(NI%-1):.MAL3 LDAINWK,Y:STA(INF),Y:DEY:BPLMAL3 53 | 4134LDAINWK+31:AND#&A0:JSRMAS4:BNEMA65:LDAINWK:ORAINWK+3:ORAINWK+6:BMIMA65:LDXTYPE:BMIMA65:CPX#SST:BEQISDK:AND#&C0:BNEMA65:CPX#MSL:BEQMA65 54 | 4138CPX#OIL:BCSP%+5:JMPMA58:LDABST:ANDINWK+5:BPLMA58:LDA#3:CPX#TGL:BCCoily:BNEslvy2:LDA#16:BNEslvy2 55 | 4140.oily JSRDORND:AND#7:.slvy2 STAQQ29:LDA#1:JSRtnpr:LDY#78:BCSMA59:LDYQQ29:ADCQQ20,Y:STAQQ20,Y:TYA:ADC#208:JSRMESS 56 | 4141JMPMA60:.MA65 JMPMA26 57 | 4142.ISDK LDAK%+NI%+32:BMIMA62:LDAINWK+14:CMP#&D6:BCCMA62:JSRSPS4:LDAXX15+2:BMIMA62:CMP#89:BCCMA62:LDAINWK+16:AND#&7F:CMP#80:BCCMA62:.GOIN LDA#0:STAQQ22+1:LDA#8:JSRLAUN:JSRRES4:JMPBAY:.MA62 LDADELTA:CMP#5:BCCMA67:JMPDEATH 58 | 4143.MA59 JSREXNO3:.MA60 ASLINWK+31:SEC:RORINWK+31:.MA61 BNEMA26 59 | 4144.MA67 LDA#1:STADELTA:LDA#5:BNEMA63:.MA58 ASLINWK+31:SEC:RORINWK+31:LDAINWK+35:SEC:RORA:.MA63 JSROOPS:JSREXNO3:.MA26 60 | 4146LDAQQ11:BNEMA15:JSRPLUT 61 | 4150JSRHITCH:BCCMA8:LDAMSAR:BEQMA47:JSRBEEP:LDXXSAV:LDY#&E:JSRABORT2:.MA47 LDALAS:BEQMA8:LDX#15:JSREXNO:LDAINWK+35:SEC:SBCLAS:BCSMA14 62 | 4155LDATYPE:CMP#SST:BEQMA14+2:LDAINWK+31:ORA#128:STAINWK+31:BCSMA8:JSRDORND:BPLoh:LDY#0:AND(XX0),Y:STACNT:.um BEQoh:LDX#OIL:LDA#0:JSRSFS1:DECCNT:BPLum:.oh JSREXNO2 63 | 4160.MA14 STAINWK+35:LDATYPE:JSRANGRY:.MA8 64 | 4180JSRLL9:.MA15 LDY#35:LDAINWK+35:STA(INF),Y 65 | 4190LDAINWK+31:BPLMAC1:AND#&20:BEQNBOUN:LDATYPE:CMP#COPS:BNEq2:LDAFIST:ORA#64:STAFIST:.q2 LDADLY:ORAMJ:BNEKS1S:LDY#10:LDA(XX0),Y:BEQKS1S:TAX:INY:LDA(XX0),Y:TAY:JSRMCASH:LDA#0:JSRMESS:.KS1S JMPKS1:.NBOUN 66 | 4240.MAC1 LDATYPE:BMIMA27:JSRFAROF:BCCKS1S:.MA27 LDY#31:LDAINWK+31:STA(INF),Y:LDXXSAV:INX:JMPMAL1:.MA18 LDABOMB:BPLMA77:ASLBOMB:JSRWSCAN:LDA#&30:STA&FE21:.MA77 67 | 4250LDAMCNT:AND#7:BNEMA22:LDXENERGY:BPLb:LDXASH:JSRSHD:STXASH:LDXFSH:JSRSHD:STXFSH:.b SEC:LDAENGY:ADCENERGY:BCSP%+5:STAENERGY 68 | 4260LDAMJ:BNEMA23S:LDAMCNT:AND#31:BNEMA93:LDASSPR:BNEMA23S:TAY:JSRMAS2:BNEMA23S 69 | 4270LDX#28:.MAL4 LDAK%,X:STAINWK,X:DEX:BPLMAL4:INX:LDY#9:JSRMAS1:BNEMA23S:LDX#3:LDY#11:JSRMAS1:BNEMA23S:LDX#6:LDY#13:JSRMAS1:BNEMA23S 70 | 4280LDA#&C0:JSRFAROF2:BCCMA23S 71 | 4290LDAQQ11:BNEP%+5\!:JSRWPLS:JSRNWSPS:.MA23S JMPMA23 72 | 4300.MA22 LDAMJ:BNEMA23:LDAMCNT:AND#31:.MA93 CMP#10:BNEMA29:LDA#50:CMPENERGY:BCCP%+6:ASLA:JSRMESS:LDY#FF:STYALTIT:INY:JSRm:BNEMA23:JSRMAS3:BCSMA23:SBC#&24:BCCMA28:STAR:JSRLL5:LDAQ:STAALTIT:BNEMA23:.MA28 JMPDEATH 73 | 4310.MA29 CMP#20:BNEMA23:LDA#30:STACABTMP:LDASSPR:BNEMA23:LDY#NI%:JSRMAS2:BNEMA23:JSRMAS3:EOR#FF:ADC#30:STACABTMP:BCSMA28 74 | 4320CMP#&E0:BCCMA23:LDABST:BEQMA23:LDADELT4+1:LSRA:ADCQQ14:CMP#70:BCCP%+4:LDA#70:STAQQ14:LDA#160:JSRMESS 75 | 4350.MA23 LDALAS2:BEQMA16:LDALASCT:CMP#8:BCSMA16:JSRLASLI2:LDA#0:STALAS2:.MA16 76 | 4360LDAECMP:BEQMA69:JSRDENGY:BEQMA70:.MA69 LDAECMA:BEQMA66:DECECMA:BNEMA66:.MA70 JSRECMOF:.MA66 77 | 4380LDAQQ11:BNEMA9:JMPSTARS 78 | 4900.MAS1 LDAINWK,Y:ASLA:STAK+1:LDAINWK+1,Y:ROLA:STAK+2:LDA#0:RORA:STAK+3:JSRMVT3:STAINWK+2,X:LDYK+1:STYINWK,X:LDYK+2:STYINWK+1,X:AND#127:.MA9 RTS:.m LDA#0:.MAS2 ORAK%+2,Y:ORAK%+5,Y:ORAK%+8,Y:AND#127:RTS 79 | 4940.MAS3 LDAK%+1,Y:JSRSQUA2:STAR:LDAK%+4,Y:JSRSQUA2:ADCR:BCSMA30:STAR:LDAK%+7,Y:JSRSQUA2:ADCR:BCCP%+4:.MA30 LDA#FF:RTS 80 | 7000.MVEIT LDAINWK+31:AND#&A0:BNEMV30 81 | 7011LDAMCNT:EORXSAV:AND#15:BNEMV3:JSRTIDY:.MV3 LDXTYPE:BPLP%+5:JMPMV40:LDAINWK+32:BPLMV30:CPX#MSL:BEQMV26 82 | 7014LDAMCNT:EORXSAV:AND#7:BNEMV30:.MV26 JSRTACTICS:.MV30 JSRSCAN 83 | 7020LDAINWK+27:ASLA:ASLA:STAQ:LDAINWK+10:AND#127:JSRFMLTU:STAR:LDAINWK+10:LDX#0:JSRMVT1-2 84 | 7025LDAINWK+12:AND#127:JSRFMLTU:STAR:LDAINWK+12:LDX#3:JSRMVT1-2:LDAINWK+14:AND#127:JSRFMLTU:STAR:LDAINWK+14:LDX#6:JSRMVT1-2 85 | 7030LDAINWK+27:CLC:ADCINWK+28:BPLP%+4:LDA#0:LDY#15:CMP(XX0),Y:BCCP%+4:LDA(XX0),Y:STAINWK+27 86 | 7032LDA#0:STAINWK+28 87 | 7040LDXALP1:LDAINWK:EOR#FF:STAP:LDAINWK+1:JSRMLTU2-2:STAP+2:LDAALP2+1:EORINWK+2:LDX#3:JSRMVT6 88 | 7045STAK2+3:LDAP+1:STAK2+1:EOR#FF:STAP:LDAP+2:STAK2+2\K2=Y-aX 89 | 7050LDXBET1:JSRMLTU2-2:STAP+2:LDAK2+3:EORBET2:LDX#6:JSRMVT6:STAINWK+8:LDAP+1:STAINWK+6:EOR#FF:STAP:LDAP+2:STAINWK+7\Z=Z+bK2 90 | 7060JSRMLTU2:STAP+2:LDAK2+3:STAINWK+5:EORBET2:EORINWK+8:BPLMV43:LDAP+1:ADCK2+1:STAINWK+3:LDAP+2:ADCK2+2:STAINWK+4:JMPMV44:.MV43 91 | 7070LDAK2+1:SBCP+1:STAINWK+3:LDAK2+2:SBCP+2:STAINWK+4:BCSMV44:LDA#1:SBCINWK+3:STAINWK+3:LDA#0:SBCINWK+4:STAINWK+4:LDAINWK+5:EOR#128:STAINWK+5 92 | 7080.MV44\Y=K2-bZ:LDXALP1:LDAINWK+3:EOR#FF:STAP:LDAINWK+4:JSRMLTU2-2:STAP+2:LDAALP2:EORINWK+5:LDX#0:JSRMVT6:STAINWK+2:LDAP+2:STAINWK+1:LDAP+1:STAINWK\X=X+aY 93 | 7110.MV45 LDADELTA:STAR:LDA#128:LDX#6:JSRMVT1:LDATYPE:AND#&81:CMP#&81:BNEP%+3:RTS \Z=Z-d 94 | 7120LDY#9:JSRMVS4:LDY#15:JSRMVS4:LDY#21:JSRMVS4:LDAINWK+30:AND#128:STARAT2:LDAINWK+30:AND#127:BEQMV8:CMP#127:SBC#0:ORARAT2:STAINWK+30 95 | 7130LDX#15:LDY#9:JSRMVS5:LDX#17:LDY#11:JSRMVS5:LDX#19:LDY#13:JSRMVS5 96 | 7160.MV8 LDAINWK+29:AND#128:STARAT2:LDAINWK+29:AND#127:BEQMV5:CMP#127:SBC#0:ORARAT2:STAINWK+29 97 | 7170LDX#15:LDY#21:JSRMVS5:LDX#17:LDY#23:JSRMVS5:LDX#19:LDY#25:JSRMVS5 98 | 7210.MV5 LDAINWK+31:AND#&A0:BNEMVD1:LDAINWK+31:ORA#16:STAINWK+31:JMPSCAN:.MVD1 LDAINWK+31:AND#&EF:STAINWK+31:RTS 99 | 7300AND#128:.MVT1 ASLA:STAS:LDA#0:RORA:STAT:LSRS:EORINWK+2,X:BMIMV10:LDAR:ADCINWK,X:STAINWK,X:LDAS:ADCINWK+1,X:STAINWK+1,X:LDAINWK+2,X:ADC#0:ORAT:STAINWK+2,X:RTS 100 | 7310.MV10 LDAINWK,X:SEC:SBCR:STAINWK,X:LDAINWK+1,X:SBCS:STAINWK+1,X:LDAINWK+2,X:AND#127:SBC#0:ORA#128:EORT:STAINWK+2,X:BCSMV11 101 | 7320LDA#1:SBCINWK,X:STAINWK,X:LDA#0:SBCINWK+1,X:STAINWK+1,X:LDA#0:SBCINWK+2,X:AND#127:ORAT:STAINWK+2,X:.MV11 RTS 102 | 7400.MVT3 LDAK+3:STAS:AND#128:STAT:EORINWK+2,X:BMIMV13:LDAK+1:CLC:ADCINWK,X:STAK+1:LDAK+2:ADCINWK+1,X:STAK+2:LDAK+3:ADCINWK+2,X:AND#127:ORAT:STAK+3:RTS 103 | 7410.MV13 LDAS:AND#127:STAS:LDAINWK,X:SEC:SBCK+1:STAK+1:LDAINWK+1,X:SBCK+2:STAK+2:LDAINWK+2,X:AND#127:SBCS:ORA#128:EORT:STAK+3:BCSMV14 104 | 7420LDA#1:SBCK+1:STAK+1:LDA#0:SBCK+2:STAK+2:LDA#0:SBCK+3:AND#127:ORAT:STAK+3:.MV14 RTS 105 | 7500.MVS4 LDAALPHA:STAQ:LDXINWK+2,Y:STXR:LDXINWK+3,Y:STXS:LDXINWK,Y:STXP:LDAINWK+1,Y:EOR#128:JSRMAD:STAINWK+3,Y:STXINWK+2,Y:STXP \Y=Y-aX 106 | 7520LDXINWK,Y:STXR:LDXINWK+1,Y:STXS:LDAINWK+3,Y:JSRMAD:STAINWK+1,Y:STXINWK,Y:STXP \X=X+aY 107 | 7530LDABETA:STAQ:LDXINWK+2,Y:STXR:LDXINWK+3,Y:STXS:LDXINWK+4,Y:STXP:LDAINWK+5,Y:EOR#128:JSRMAD:STAINWK+3,Y:STXINWK+2,Y:STXP\Y=Y-bZ 108 | 7540LDXINWK+4,Y:STXR:LDXINWK+5,Y:STXS:LDAINWK+3,Y:JSRMAD:STAINWK+5,Y:STXINWK+4,Y:RTS\Z=Z+bY 109 | 7600.MVS5 LDAINWK+1,X:AND#127:LSRA:STAT:LDAINWK,X:SEC:SBCT:STAR:LDAINWK+1,X:SBC#0:STAS:LDAINWK,Y:STAP:LDAINWK+1,Y:AND#128:STAT:LDAINWK+1,Y:AND#127:LSRA:RORP:LSRA:RORP:LSRA:RORP:LSRA:RORP:ORAT:EORRAT2:STXQ:JSRADD:STAK+1:STXK 110 | 7610LDXQ:LDAINWK+1,Y:AND#127:LSRA:STAT:LDAINWK,Y:SEC:SBCT:STAR:LDAINWK+1,Y:SBC#0:STAS:LDAINWK,X:STAP:LDAINWK+1,X:AND#128:STAT:LDAINWK+1,X:AND#127:LSRA:RORP:LSRA:RORP:LSRA:RORP:LSRA:RORP:ORAT:EOR#128:EORRAT2 111 | 7620STXQ:JSRADD:STAINWK+1,Y:STXINWK,Y:LDXQ:LDAK:STAINWK,X:LDAK+1:STAINWK+1,X:RTS 112 | 7650.MVT6 TAY:EORINWK+2,X:BMIMV50:LDAP+1:CLC:ADCINWK,X:STAP+1:LDAP+2:ADCINWK+1,X:STAP+2:TYA:RTS 113 | 7660.MV50 LDAINWK,X:SEC:SBCP+1:STAP+1:LDAINWK+1,X:SBCP+2:STAP+2:BCCMV51:TYA:EOR#128:RTS:.MV51 LDA#1:SBCP+1:STAP+1:LDA#0:SBCP+2:STAP+2:TYA:RTS 114 | 7700.MV40 LDAALPHA:EOR#128:STAQ:LDAINWK:STAP:LDAINWK+1:STAP+1:LDAINWK+2:JSRMULT3:LDX#3:JSRMVT3\K=Y-aX 115 | 7710LDAK+1:STAK2+1:STAP:LDAK+2:STAK2+2:STAP+1:LDABETA:STAQ:LDAK+3:STAK2+3:JSRMULT3:LDX#6:JSRMVT3:LDAK+1:STAP:STAINWK+6:LDAK+2:STAP+1:STAINWK+7:LDAK+3:STAINWK+8\Z=Z+bK2 116 | 7720EOR#128:JSRMULT3:LDAK+3:AND#128:STAT:EORK2+3:BMIMV1 117 | 7730LDAK:\CLC:ADCK2:LDAK+1:ADCK2+1:STAINWK+3:LDAK+2:ADCK2+2:STAINWK+4:LDAK+3:ADCK2+3:JMPMV2 118 | 7740.MV1 LDAK:SEC:SBCK2:LDAK+1:SBCK2+1:STAINWK+3:LDAK+2:SBCK2+2:STAINWK+4:LDAK2+3:AND#127:STAP:LDAK+3:AND#127:SBCP:STAP:BCSMV2 119 | 7750LDA#1:SBCINWK+3:STAINWK+3:LDA#0:SBCINWK+4:STAINWK+4:LDA#0:SBCP:ORA#128:.MV2 EORT:STAINWK+5\Y=K2-bZ 120 | 7760LDAALPHA:STAQ:LDAINWK+3:STAP:LDAINWK+4:STAP+1:LDAINWK+5:JSRMULT3:LDX#0:JSRMVT3:LDAK+1:STAINWK:LDAK+2:STAINWK+1:LDAK+3:STAINWK+2\X=X+aY 121 | 7770JMPMV45:] 122 | 9510IFZ>4OSCLI"S.ELTA "+STR$~W%+" "+STR$~O%+" "+STR$~L%+" "+STR$~H% 123 | 9520PRINT"A d,";:GOTO2 124 | 10100DEFFNZ=FNZT(1) 125 | 10110DEFFNZ2=FNZT(2) 126 | 10120DEFFNZT(N%):ZP=ZP+N%:=ZP-N% 127 | 10300DEFFNW=FNWT(1) 128 | 10310DEFFNW2=FNWT(2) 129 | 10320DEFFNWT(N%):WP=WP+N%:=WP-N% 130 | 10400DEFFNTP=FNTPT(1) 131 | 10410DEFFNTPT(N%):T%=T%+N%:=T%-N% 132 | -------------------------------------------------------------------------------- /sources/ELITEB.TXT: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/sources/ELITEB.TXT -------------------------------------------------------------------------------- /sources/ELITEC.TXT: -------------------------------------------------------------------------------- 1 | 1GOTO20 2 | 2*L.ELITEB 3 | 3GOTO20 4 | 4*L.ELITEA 5 | 6*L.ELITEC 6 | 7GOTO20 7 | 8*L.ELITED 8 | 20REM ELITE 9 | 1000O%=W%:H%=L%+P%-C% 10 | 1010[OPTZ 11 | 1880.TA34 LDA#0:JSRMAS4:BEQP%+5:JMPTA21:JSRTA87+3:JSREXNO3:LDA#250:JMPOOPS 12 | 1900.TA18\msl 13 | 1910LDAECMA:BNETA35:LDAINWK+32:ASLA:BMITA34:LSRA 14 | 1915TAX:LDAUNIV,X:STAV:LDAUNIV+1,X:STAV+1:LDY#2:JSRTAS1:LDY#5:JSRTAS1:LDY#8:JSRTAS1 15 | 1920LDAK3+2:ORAK3+5:ORAK3+8:AND#127:ORAK3+1:ORAK3+4:ORAK3+7:BNETA64 16 | 1930LDAINWK+32:CMP#&82:BEQTA35:LDY#31:LDA(V),Y:BITM32+1:BNETA35:ORA#128:STA(V),Y:.TA35 LDAINWK:ORAINWK+3:ORAINWK+6:BNETA87:LDA#80:JSROOPS:.TA87 JSREXNO2:ASLINWK+31:SEC:RORINWK+31 17 | 1940.TA1 RTS 18 | 1944.TA64 JSRDORND:CMP#16:BCSTA19:.M32 LDY#32:LDA(V),Y:LSRA:BCCTA19:JMPECBLB2 19 | 2000.TACTICS 20 | 2005CPX#MSL:BEQTA18:CPX#ESC:BNEP%+8:JSRSPS1:JMPTA15:CPX#SST:BNETA13:JSRDORND:CMP#140:BCCTA14-1:LDAMANY+SH3:CMP#4:BCSTA14-1:LDX#COPS:LDA#&F1:JMPSFS1:.TA13 21 | 2008CPX#TGL:BNETA14:LDAMANY+THG:BNETA14:LSRINWK+32:ASLINWK+32:LSRINWK+27:RTS:.TA14 CPX#CYL:BCSTA62:CPX#COPS:BEQTA62:LDASSPR:BEQTA62:LDAINWK+32:AND#129:STAINWK+32 22 | 2010.TA62 LDY#14:LDAINWK+35:CMP(XX0),Y:BCSTA21:INCINWK+35:.TA21 23 | 2020LDX#8:.TAL1 LDAINWK,X:STAK3,X:DEX:BPLTAL1 24 | 2030.TA19 JSRTAS2\XX15=r~96 25 | 2040LDY#10:JSRTAS3:STACNT:LDATYPE:CMP#MSL:BNEP%+5:JMPTA20:JSRDORND:CMP#250:BCCTA7:JSRDORND:ORA#&68:STAINWK+29:.TA7\VRol 26 | 2100LDY#14:LDA(XX0),Y:LSRA:CMPINWK+35:BCCTA3:LSRA:LSRA:CMPINWK+35:BCCta3:JSRDORND:CMP#230:BCCta3:LDATYPE:CMP#THG:BEQta3:LDA#0:STAINWK+32:JMPSESCP 27 | 2102.ta3 LDAINWK+31:AND#7:BEQTA3:STAT:JSRDORND:AND#31:CMPT:BCSTA3:LDAECMA:BNETA3:DECINWK+31:LDATYPE:CMP#THG:BNETA16:LDX#TGL:LDAINWK+32:JMPSFS1:.TA16 JMPSFRMIS:.TA3 28 | 2110LDA#0:JSRMAS4:AND#&E0:BNETA4:LDXCNT:CPX#160:BCCTA4:LDAINWK+31:ORA#64:STAINWK+31:CPX#163:BCCTA4 29 | 2120LDY#19:LDA(XX0),Y:LSRA:JSROOPS:DECINWK+28:LDAECMA:BNETA10:LDA#8:JMPNOISE:\frLs 30 | 2190.TA4 LDAINWK+7:CMP#3:BCSTA5:LDAINWK+1:ORAINWK+4:AND#&FE:BEQTA15:.TA5 JSRDORND:ORA#128:CMPINWK+32:BCSTA15 31 | 2194.TA20 LDAXX15:EOR#128:STAXX15:LDAXX15+1:EOR#128:STAXX15+1:LDAXX15+2:EOR#128:STAXX15+2:LDACNT:EOR#128:STACNT 32 | 2200.TA15\^XX15 33 | 2220LDY#16:JSRTAS3:EOR#128:AND#128:ORA#3:STAINWK+30 34 | 2235LDAINWK+29:AND#127:CMP#16:BCSTA6 35 | 2240LDY#22:JSRTAS3:EORINWK+30:AND#128:EOR#&85:STAINWK+29 36 | 2260.TA6 LDACNT:BMITA9:CMP#22:BCCTA9:LDA#3:STAINWK+28:RTS 37 | 2280.TA9 AND#127:CMP#18:BCCTA10:LDA#FF:LDXTYPE:CPX#MSL:BNEP%+3:ASLA:STAINWK+28:.TA10 RTS 38 | 2900.TAS1 LDA(V),Y:EOR#128:STAK+3:DEY:LDA(V),Y:STAK+2:DEY:LDA(V),Y:STAK+1:STYU:LDXU:JSRMVT3:LDYU 39 | 2910STAK3+2,X:LDAK+2:STAK3+1,X:LDAK+1:STAK3,X:RTS 40 | 3000.HITCH CLC:LDAINWK+8:BNEHI1:LDATYPE:BMIHI1:LDAINWK+31:AND#32:ORAINWK+1:ORAINWK+4:BNEHI1 41 | 3005LDAINWK:JSRSQUA2:STAS:LDAP:STAR 42 | 3010LDAINWK+3:JSRSQUA2:TAX:LDAP:ADCR:STAR:TXA:ADCS:BCSFR1-2:STAS:LDY#2:LDA(XX0),Y:CMPS:BNEHI1:DEY:LDA(XX0),Y:CMPR:.HI1 RTS 43 | 3210.FRS1 JSRZINF:LDA#28:STAINWK+3:LSRA:STAINWK+6:LDA#128:STAINWK+5:LDAMSTG:ASLA:ORA#128:STAINWK+32 44 | 3220.fq1 LDA#96:STAINWK+14:ORA#128:STAINWK+22:LDADELTA:ROLA:STAINWK+27:TXA:JMPNWSHP 45 | 3230.FRMIS LDX#MSL:JSRFRS1:BCCFR1:LDXMSTG:JSRGINF:LDAFRIN,X:JSRANGRY:LDY#0:JSRABORT:DECNOMSL:LDA#48:JMPNOISE 46 | 3234.ANGRY CMP#SST:BEQAN2:BCSHI1:CMP#CYL:BNEP%+5:JSRAN2:LDY#32:LDA(INF),Y:BEQHI1:ORA#128:STA(INF),Y:LDY#28:LDA#2:STA(INF),Y:ASLA:LDY#30:STA(INF),Y:RTS 47 | 3236.AN2 ASLK%+NI%+32:SEC:RORK%+NI%+32:CLC:RTS:.FR1 LDA#201:JMPMESS 48 | 3310.SESCP LDX#ESC:LDA#&FE:.SFS1 STAT1:LDAXX0:PHA:LDAXX0+1:PHA:LDAINF:PHA:LDAINF+1:PHA:LDY#NI%-1:.FRL2 LDAINWK,Y:STAXX3,Y:LDA(INF),Y:STAINWK,Y:DEY:BPLFRL2 49 | 3315LDATYPE:CMP#SST:BNErx:TXA:PHA:LDA#32:STAINWK+27:LDX#0:LDAINWK+10:JSRSFS2:LDX#3:LDAINWK+12:JSRSFS2:LDX#6:LDAINWK+14:JSRSFS2:PLA:TAX:.rx 50 | 3320LDAT1:STAINWK+32:LSRINWK+29:ASLINWK+29:TXA:CMP#OIL:BNENOIL:JSRDORND:ASLA:STAINWK+30:TXA:AND#15:STAINWK+27:LDA#FF:RORA:STAINWK+29:LDA#OIL:.NOIL JSRNWSHP 51 | 3330PLA:STAINF+1:PLA:STAINF:LDX#NI%-1:.FRL3 LDAXX3,X:STAINWK,X:DEX:BPLFRL3:PLA:STAXX0+1:PLA:STAXX0:RTS 52 | 3350.SFS2 ASLA:STAR:LDA#0:RORA:JMPMVT1 53 | 3400.LL164 LDA#56:JSRNOISE:LDA#1:STAHFX:LDA#4:JSRHFS2:DECHFX:RTS 54 | 3410.LAUN LDA#48:JSRNOISE:LDA#8:.HFS2 STASTP:JSRTTX66:JSRHFS1 55 | 3510.HFS1 LDA#128:STAK3:LDX#Y:STXK4:ASLA:STAXX4:STAK3+1:STAK4+1:.HFL5 JSRHFL1:INCXX4:LDXXX4:CPX#8:BNEHFL5:RTS 56 | 3520.HFL1 LDAXX4:AND#7:CLC:ADC#8:STAK:.HFL2 LDA#1:STALSP:JSRCIRCLE2:ASLK:BCSHF8:LDAK:CMP#160:BCCHFL2:.HF8 RTS 57 | 4400.STARS2 LDA#0:CPX#2:RORA:STARAT:EOR#128:STARAT2:JSRST2 58 | 4410LDYNOSTM:.STL2 LDASZ,Y:STAZZ:LSRA:LSRA:LSRA:JSRDV41:LDAP:EORRAT2:STAS:LDASXL,Y:STAP:LDASX,Y:STAX1:JSRADD 59 | 4420STAS:STXR:LDASY,Y:STAY1:EORBET2:LDXBET1:JSRMULTS-2:JSRADD:STXXX:STAXX+1 60 | 4430LDXSYL,Y:STXR:LDXY1:STXS:LDXBET1:EORBET2+1:JSRMULTS-2:JSRADD:STXYY:STAYY+1 61 | 4440LDXALP1:EORALP2:JSRMULTS-2:STAQ:LDAXX:STAR:LDAXX+1:STAS:EOR#128:JSRMAD:STAXX+1:TXA:STASXL,Y 62 | 4450LDAYY:STAR:LDAYY+1:STAS:JSRMAD:STAS:STXR:LDA#0:STAP:LDAALPHA 63 | 4460JSRPIX1:LDAXX+1:STASX,Y:STAX1 64 | 4470AND#127:CMP#116:BCSKILL2:LDAYY+1:STASY,Y:STAY1:AND#127:CMP#116:BCSST5:.STC2 JSRPIXEL2:DEY:BEQST2:JMPSTL2 65 | 4480.ST2 LDAALPHA:EORRAT:STAALPHA:LDAALP2:EORRAT:STAALP2:EOR#128:STAALP2+1:LDABET2:EORRAT:STABET2:EOR#128:STABET2+1:RTS 66 | 4500.KILL2 JSRDORND:STAY1:STASY,Y:LDA#115:ORARAT:STAX1:STASX,Y:BNESTF1 67 | 4510.ST5 JSRDORND:STAX1:STASX,Y:LDA#110:ORAALP2+1:STAY1:STASY,Y:.STF1 JSRDORND:ORA#8:STAZZ:STASZ,Y:BNESTC2 68 | 4700.SNE:] 69 | 4720FORI%=0TO31:N=ABS(SIN(I%/64*2*PI)):IFN>=1 I%?O%=FF:ELSEI%?O%=INT(256*N+.5) 70 | 4730NEXT:O%=O%+32:P%=P%+32 71 | 4740[OPTZ 72 | 6040.MU5 STAK:STAK+1:STAK+2:STAK+3:CLC:RTS 73 | 6050.MULT3\K(4)=AP(2)*Q:STAR:AND#127:STAK+2:LDAQ:AND#127:BEQMU5:SEC:SBC#1:STAT:LDAP+1:LSRK+2:RORA:STAK+1:LDAP:RORA:STAK:LDA#0:LDX#24 74 | 6060.MUL2 BCCP%+4:ADCT:RORA:RORK+2:RORK+1:RORK:DEX:BNEMUL2:STAT:LDAR:EORQ:AND#128:ORAT:STAK+3:RTS 75 | 6070.MLS2 LDXXX:STXR:LDXXX+1:STXS:.MLS1 LDXALP1:STXP 76 | 6080.MULTS\AP=A*P(P+<32) 77 | 6090TAX:AND#128:STAT:TXA:AND#127:BEQMU6:TAX:DEX:STXT1:LDA#0 78 | 6100LSRP:BCCP%+4:ADCT1:RORA:RORP:BCCP%+4:ADCT1:RORA:RORP:BCCP%+4:ADCT1:RORA:RORP:BCCP%+4:ADCT1:RORA:RORP:BCCP%+4:ADCT1:RORA:RORP 79 | 6110LSRA:RORP:LSRA:RORP:LSRA:RORP:ORAT:RTS 80 | 6112.SQUA\AP=A*ApresQ:AND#127:.SQUA2 STAP:TAX:BNEMU11:.MU1 CLC:STXP:TXA:RTS 81 | 6114.MLU1 LDASY,Y:STAY1:.MLU2 AND#127:STAP 82 | 6116.MULTU\AP=P*Qunsg 83 | 6118LDXQ:BEQMU1:.MU11 DEX:STXT:LDA#0:LDX#8:LSRP:.MUL6 BCCP%+4:ADCT:RORA:RORP:DEX:BNEMUL6:RTS 84 | 6119.MU6 STAP+1:STAP:RTS 85 | 6120.FMLTU2 AND#31:TAX:LDASNE,X:STAQ:LDAK 86 | 6125.FMLTU\A=A*Q/256unsg:EOR#FF:SEC:RORA:STAP:LDA#0:.MUL3 BCSMU7:ADCQ:RORA:LSRP:BNEMUL3:RTS:.MU7 LSRA:LSRP:BNEMUL3:RTS 87 | 6130LDXQ:BEQMU1:DEX:STXT:LDA#0:LDX#8:LSRP:.MUL6 BCCP%+4:ADCT:RORA:RORP:DEX:BNEMUL6:RTS 88 | 6140STXQ:.MLTU2\AP(2)=AP*Qunsg(EORP) 89 | 6142EOR#FF:LSRA:STAP+1:LDA#0:LDX#16:RORP:.MUL7 BCSMU21:ADCQ:RORA:RORP+1:RORP:DEX:BNEMUL7:RTS:.MU21 LSRA:RORP+1:RORP:DEX:BNEMUL7:RTS 90 | 6146.MUT3 LDXALP1:STXP:.MUT2 LDXXX+1:STXS 91 | 6148.MUT1 LDXXX:STXR 92 | 6150.MULT1 \AP=Q*A 93 | 6160TAX:AND#127:LSRA:STAP:TXA:EORQ:AND#128:STAT:LDAQ:AND#127:BEQmu10:TAX:DEX:STXT1:LDA#0:LDX#7 94 | 6170.MUL4 BCCP%+4:ADCT1:RORA:RORP:DEX:BNEMUL4:LSRA:RORP:ORAT:RTS:.mu10 STAP:RTS 95 | 6190.MULT12 JSRMULT1:STAS:LDAP:STAR:RTS 96 | 6194.TAS3 LDXINWK,Y:STXQ:LDAXX15:JSRMULT12:LDXINWK+2,Y:STXQ:LDAXX15+1:JSRMAD:STAS:STXR 97 | 6196LDXINWK+4,Y:STXQ:LDAXX15+2:.MAD JSRMULT1 98 | 6200.ADD\AX=AP+SR 99 | 6210STAT1:AND#128:STAT:EORS:BMIMU8:LDAR:CLC:ADCP:TAX:LDAS:ADCT1:ORAT:RTS 100 | 6220.MU8 LDAS:AND#127:STAU:LDAP:SEC:SBCR:TAX:LDAT1:AND#127:SBCU:BCSMU9:STAU:TXA:EOR#FF:ADC#1:TAX:LDA#0:SBCU:ORA#128:.MU9 EORT:RTS 101 | 6330\DVIDT(A=AP/Q)inF 102 | 6345.TIS1 STXQ:EOR#128:JSRMAD 103 | 6350.DVID96\A=A/96:TAX:AND#128:STAT:TXA:AND#127:LDX#254:STXT1:.DVL3 ASLA:CMP#96:BCCDV4:SBC#96:.DV4 ROLT1:BCSDVL3:LDAT1:ORAT:RTS 104 | 6360.DV42 LDASZ,Y:.DV41 STAQ:LDADELTA 105 | 6370.DVID4\P-R=A/Qunsg 106 | 6380LDX#8:ASLA:STAP:LDA#0:.DVL4 ROLA:BCSDV8:CMPQ:BCCDV5:.DV8 SBCQ:SEC:.DV5 ROLP:DEX:BNEDVL4:JMPLL28+4 107 | 6395.DVID3B2 STAP+2:LDAINWK+6:STAQ:LDAINWK+7:STAR:LDAINWK+8:STAS 108 | 6400.DVID3B\K+1(3)-K=P(3)/SRQaprx 109 | 6410LDAP:ORA#1:STAP:LDAP+2:EORS:AND#128:STAT:LDY#0:LDAP+2:AND#127:.DVL9 CMP#&40:BCSDV14:ASLP:ROLP+1:ROLA:INY:BNEDVL9 110 | 6420.DV14 STAP+2:LDAS:AND#127:BMIDV9:.DVL6 DEY:ASLQ:ROLR:ROLA:BPLDVL6:.DV9 STAQ:LDA#254:STAR:LDAP+2:JSRLL31 111 | 6440LDA#0:STAK+1:STAK+2:STAK+3:TYA:BPLDV12:LDAR:.DVL8 ASLA:ROLK+1:ROLK+2:ROLK+3:INY:BNEDVL8:STAK:LDAK+3:ORAT:STAK+3:RTS 112 | 6450.DV13 LDAR:STAK:LDAT:STAK+3:RTS 113 | 6460.DV12 BEQDV13:LDAR:.DVL10 LSRA:DEY:BNEDVL10:STAK:LDAT:STAK+3:RTS 114 | 6500.cntr LDADAMP:BNERE1:TXA:BPLBUMP:DEX:BMIRE1 115 | 6530.BUMP INX:BNERE1 116 | 6540.REDU DEX:BEQBUMP:.RE1 RTS 117 | 6550.BUMP2 STAT:TXA:CLC:ADCT:TAX:BCCRE2:LDX#FF:.RE2 BPLRE3+2:LDAT:RTS 118 | 6560.REDU2 STAT:TXA:SEC:SBCT:TAX:BCSRE3:LDX#1:.RE3 BPLRE2+2:LDADJD:BNERE2+2:LDX#128:BMIRE2+2 119 | 6800.ARCTAN\A=TAN-1(P/Q) 120 | 6810LDAP:EORQ:STAT1:LDAQ:BEQAR2:ASLA:STAQ:LDAP:ASLA:CMPQ:BCSAR1:JSRARS1:SEC:.AR4 LDXT1:BMIAR3:RTS 121 | 6830.AR1 LDXQ:STAQ:STXP:TXA:JSRARS1:STAT:LDA#64:SBCT:BCSAR4:.AR2 LDA#63:RTS:.AR3 STAT:LDA#128:\SEC:SBCT:RTS 122 | 6845.ARS1 JSRLL28:LDAR:LSRA:LSRA:LSRA:TAX:LDAACT,X:RTS 123 | 6850.ACT:]FORI%=0TO31:I%?O%=INT(128/PI*ATN(I%/32)+.5):NEXT:P%=P%+32:O%=O%+32:[OPTZ 124 | 6900.WARP LDAMANY+AST:CLC:ADCMANY+ESC:ADCMANY+OIL:TAX:LDAFRIN+2,X:ORASSPR:ORAMJ:BNEWA1:LDYK%+8:BMIWA3:TAY:JSRMAS2:LSRA:BEQWA1:.WA3 LDYK%+NI%+8:BMIWA2:LDY#NI%:JSRm:LSRA:BEQWA1:.WA2 125 | 6910LDA#&81:STAS:STAR:STAP:LDAK%+8:JSRADD:STAK%+8:LDAK%+NI%+8:JSRADD:STAK%+NI%+8 126 | 6920LDA#1:STAQQ11:STAMCNT:LSRA:STAEV:LDXVIEW:JMPLOOK1:.WA1 LDA#40:JMPNOISE 127 | 7000.LASLI JSRDORND:AND#7:ADC#Y-4:STALASY:JSRDORND:AND#7:ADC#X-4:STALASX:LDAGNTMP:ADC#8:STAGNTMP:JSRDENGY 128 | 7005.LASLI2 LDAQQ11:BNEPU1-1:LDA#32:LDY#224:JSRlas:LDA#48:LDY#208 129 | 7050.las STAX2:LDALASX:STAX1:LDALASY:STAY1:LDA#2*Y-1:STAY2:JSRLOIN:LDALASX:STAX1:LDALASY:STAY1:STYX2:LDA#2*Y-1:STAY2:JMPLOIN 130 | 8500.PLUT LDXVIEW:BNEPU1:RTS:.PU1 DEX:BNEPU2 131 | 8510LDAINWK+2:EOR#128:STAINWK+2:LDAINWK+8:EOR#128:STAINWK+8:LDAINWK+10:EOR#128:STAINWK+10:LDAINWK+14:EOR#128:STAINWK+14:LDAINWK+16:EOR#128:STAINWK+16 132 | 8520LDAINWK+20:EOR#128:STAINWK+20:LDAINWK+22:EOR#128:STAINWK+22:LDAINWK+26:EOR#128:STAINWK+26:RTS 133 | 8530.PU2 LDA#0:CPX#2:RORA:STARAT2:EOR#128:STARAT 134 | 8540LDAINWK:LDXINWK+6:STAINWK+6:STXINWK:LDAINWK+1:LDXINWK+7:STAINWK+7:STXINWK+1:LDAINWK+2:EORRAT:TAX:LDAINWK+8:EORRAT2:STAINWK+2:STXINWK+8 135 | 8550LDY#9:JSRPUS1 136 | 8560LDY#15:JSRPUS1 137 | 8570LDY#21 138 | 8600.PUS1 LDAINWK,Y:LDXINWK+4,Y:STAINWK+4,Y:STXINWK,Y:LDAINWK+1,Y:EORRAT:TAX:LDAINWK+5,Y:EORRAT2:STAINWK+1,Y:STXINWK+5,Y:.LO2 RTS 139 | 8990.LQ STXVIEW:JSRTT66:JSRSIGHT:JMPNWSTARS 140 | 9000.LOOK1 LDA#0:LDYQQ11:BNELQ:CPXVIEW:BEQLO2:STXVIEW:JSRTT66:JSRFLIP:JSRWPSHPS 141 | 9010.SIGHT LDYVIEW:LDALASER,Y:BEQLO2:LDA#128:STAQQ19:LDA#Y-24:STAQQ19+1:LDA#20:STAQQ19+2:JSRTT15:LDA#10:STAQQ19+2:JMPTT15 142 | 9400LDA#1:.TT66 STAQQ11:.TTX66 LDA#128:STAQQ17:ASLA:STALAS2:STADLY:STAde:LDX#&60:.BOL1 JSRZES1:INX:CPX#&78:BNEBOL1 143 | 9410LDXQQ22+1:BEQBOX:JSRee3:.BOX LDY#1:STYYC:LDAQQ11:BNEtt66:LDY#11:STYXC:LDAVIEW:ORA#&60:JSRTT27:JSRTT162:LDA#175:JSRTT27:.tt66 144 | 9420LDX#0:STXX1:STXY1:STXQQ17:DEX:STXX2:JSRHLOIN 145 | 9430LDA#2:STAX1:STAX2:JSRBOS2 146 | 9440.BOS2 JSRBOS1:.BOS1 LDA#0:STAY1:LDA#2*Y-1:STAY2:DECX1:DECX2:JMPLOIN 147 | 9450LDY#2:EQUB&2C:.DEL8 LDY#8:.DELAY JSRWSCAN:DEY:BNEDELAY:RTS 148 | 9460.hm JSRTT103:JSRTT111:JSRTT103:LDAQQ11:BEQSC5:.CLYNS LDA#20:STAYC:LDA#&75:STASC+1:LDA#7:STASC:JSRTT67:LDA#0:JSRLYN:INCSC+1:JSRLYN:INCSC+1:INY:STYXC 149 | 9470.LYN LDY#233:.EE2 STA(SC),Y:DEY:BNEEE2:.SC5 RTS 150 | 9500.SCAN LDAINWK+31:AND#16:BEQSC5:LDATYPE:BMISC5:LDX#FF:\CMP#TGL\BEQSC49:CMP#MSL:BNEP%+4:LDX#&F0:\CMP#AST:\BCCP%+4:\LDX#&F:\SC49:STXCOL:LDAINWK+1:ORAINWK+4:ORAINWK+7:AND#&C0:BNESC5 151 | 9510LDAINWK+1:CLC:LDXINWK+2:BPLSC2:EOR#FF:ADC#1:.SC2 ADC#123:STAX1 152 | 9520LDAINWK+7:LSRA:LSRA:CLC:LDXINWK+8:BPLSC3:EOR#FF:SEC:.SC3 ADC#35:EOR#FF:STASC 153 | 9530LDAINWK+4:LSRA:CLC:LDXINWK+5:BMISCD6:EOR#FF:SEC:.SCD6 ADCSC:BPLld246:CMP#194:BCSP%+4:LDA#194:CMP#247:BCCP%+4:.ld246 LDA#246 154 | 9535STAY1:SEC:SBCSC:PHP:\BCSSC48:\EOR#FF:\ADC#1:.SC48 PHA:JSRCPIX4:LDACTWOS+1,X:ANDCOL:STAX1:PLA:PLP:TAX:BEQRTS:BCCRTS+1 155 | 9540.VLL1 DEY:BPLVL1:LDY#7:DECSC+1:.VL1 LDAX1:EOR(SC),Y:STA(SC),Y:DEX:BNEVLL1:.RTS RTS 156 | 9545INY:CPY#8:BNEP%+6:LDY#0:INCSC+1 157 | 9550.VLL2 INY:CPY#8:BNEVL2:LDY#0:INCSC+1:.VL2 LDAX1:EOR(SC),Y:STA(SC),Y:INX:BNEVLL2:RTS 158 | 9700.WSCAN LDA#0:STADL:LDADL:BEQP%-2:RTS 159 | 9900] 160 | 9910IFZ>4OSCLI("S.ELTC "+STR$~W%+" "+STR$~O%+" "+STR$~L%+" "+STR$~H%) 161 | 9920PRINT"C d,";:GOTO8 162 | 163 | -------------------------------------------------------------------------------- /sources/ELITED.TXT: -------------------------------------------------------------------------------- 1 | 1GOTO20 2 | 2*L.ELITEB 3 | 3GOTO20 4 | 4*L.ELITEA 5 | 6*L.ELITEC 6 | 7GOTO20 7 | 8*L.ELITED 8 | 9GOTO20 9 | 10*L.ELITEE 10 | 20REM ELITE 11 | 30H%=L%+P%-C%:O%=W% 12 | 300[OPTZ 13 | 700.tnpr pha:LDX#12:CPXQQ29:BCCkg:.Tml ADCQQ20,X:DEX:BPLTml:CMPCRGO:pla:RTS:.kg LDYQQ29:ADCQQ20,Y:cmp#200:pla:rts 14 | 840.TT20 JSRP%+3:JSRP%+3 15 | 850.TT54 LDAQQ15:CLC:ADCQQ15+2:TAX:LDAQQ15+1:ADCQQ15+3:TAY 16 | 860LDAQQ15+2:STAQQ15:LDAQQ15+3:STAQQ15+1:LDAQQ15+5:STAQQ15+3:LDAQQ15+4:STAQQ15+2:CLC:TXA:ADCQQ15+2:STAQQ15+4:TYA:ADCQQ15+3:STAQQ15+5:RTS 17 | 950.TT146 LDAQQ8:ORAQQ8+1:BNETT63:INCYC:RTS:.TT63 LDA#191:JSRTT68 18 | 955LDXQQ8:LDYQQ8+1:SEC:JSRpr5:LDA#195:.TT60 JSRTT27:.TTX69 INCYC:.TT69 LDA#128:STAQQ17:.TT67 LDA#13:JMPTT27 19 | 990.TT70 LDA#173:JSRTT27:JMPTT72:.spc JSRTT27:JMPTT162 20 | 1000.TT25\ DATA 21 | 1010JSRTT66-2:LDA#9:STAXC:LDA#163:JSRTT27:JSRNLIN:JSRTTX69:INCYC:JSRTT146:LDA#194 22 | 1030JSRTT68:LDAQQ3:CLC:ADC#1:LSRA:CMP#2:BEQTT70:LDAQQ3:BCCTT71 23 | 1040SBC#5:CLC:.TT71 ADC#170:JSRTT27:.TT72 LDAQQ3:LSRA:LSRA:CLC:ADC#168:JSRTT60:LDA#162:JSRTT68:LDAQQ4:CLC:ADC#177:JSRTT60:LDA#196:JSRTT68 24 | 1070LDXQQ5:INX:CLC:JSRpr2:JSRTTX69:LDA#192:JSRTT68:SEC:LDXQQ6:JSRpr2:LDA#198:JSRTT60:LDA#&28:JSRTT27:LDAQQ15+4:BMITT75:LDA#188:JSRTT27:JMPTT76:.TT75 LDAQQ15+5 25 | 1110LSRA:LSRA:PHA:AND#7:CMP#3:BCSTT205:ADC#227:JSRspc:.TT205 PLA:LSRA:LSRA:LSRA:CMP#6:BCSTT206:ADC#230:JSRspc:.TT206 LDAQQ15+3:EORQQ15+1:AND#7 26 | 1116STAQQ19:CMP#6:BCSTT207:ADC#236:JSRspc:.TT207 LDAQQ15+5:AND#3:CLC:ADCQQ19:AND#7:ADC#242:JSRTT27:.TT76 LDA#&53:JSRTT27:LDA#&29:JSRTT60 27 | 1127LDA#193:JSRTT68:LDXQQ7:LDYQQ7+1:JSRpr6:JSRTT162:LDA#0:STAQQ17:LDA#&4D:JSRTT27:LDA#226:JSRTT60:LDA#250:JSRTT68:LDAQQ15+5:LDXQQ15+3:AND#15:CLC:ADC#11:TAY 28 | 1150JSRpr5:JSRTT162:LDA#&6B:JSRTT26:LDA#&6D:JMPTT26 29 | 1200.TT24 30 | 1210LDAQQ15+1:AND#7:STAQQ3:LDAQQ15+2:LSRA:LSRA:LSRA:AND#7:STAQQ4:LSRA:BNETT77:LDAQQ3:ORA#2:STAQQ3:.TT77 LDAQQ3:EOR#7:CLC:STAQQ5:LDAQQ15+3:AND#3:ADCQQ5:STAQQ5 31 | 1240LDAQQ4:LSRA:ADCQQ5:STAQQ5:ASLA:ASLA:ADCQQ3:ADCQQ4:ADC#1:STAQQ6:LDAQQ3:EOR#7:ADC#3:STAP:LDAQQ4:ADC#4:STAQ:JSRMULTU:LDAQQ6:STAQ:JSRMULTU:ASLP:ROLA:ASLP:ROLA:ASLP:ROLA:STAQQ7+1:LDAP:STAQQ7:RTS 32 | 1400.TT22\Lng Sc 33 | 1410LDA#64:JSRTT66:LDA#7:STAXC:JSRTT81:LDA#199:JSRTT27:JSRNLIN:LDA#152:JSRNLIN2:JSRTT14 34 | 1460LDX#0:.TT83 STXXSAV:LDXQQ15+3:LDYQQ15+4:TYA:ORA#&50:STAZZ 35 | 1470LDAQQ15+1:LSRA:CLC:ADC#24:STAXX15+1:JSRPIXEL:JSRTT20:LDXXSAV:INX:BNETT83:LDAQQ9:STAQQ19:LDAQQ10:LSRA:STAQQ19+1:LDA#4:STAQQ19+2 36 | 1700.TT15 37 | 1705LDA#24:LDXQQ11:BPLP%+4:LDA#0:STAQQ19+5:LDAQQ19:SEC:SBCQQ19+2:BCSTT84:LDA#0:.TT84 STAXX15:LDAQQ19:CLC:ADCQQ19+2:BCCP%+4:LDA#FF:STAXX15+2 38 | 1725LDAQQ19+1:CLC:ADCQQ19+5:STAXX15+1:JSRHLOIN:LDAQQ19+1:SEC:SBCQQ19+2:BCSTT86:LDA#0:.TT86 CLC:ADCQQ19+5:STAXX15+1:LDAQQ19+1:CLC:ADCQQ19+2:ADCQQ19+5:CMP#152:BCCTT87 39 | 1750LDXQQ11:BMITT87:LDA#151:.TT87 STAXX15+3:LDAQQ19:STAXX15:STAXX15+2:JMPLL30 40 | 1800.TT126 LDA#104:STAQQ19:LDA#90:STAQQ19+1:LDA#16:STAQQ19+2:JSRTT15:LDAQQ14:STAK:JMPTT128 41 | 2000.TT14\Crcl/+ 42 | 2010LDAQQ11:BMITT126:LDAQQ14:LSRA:LSRA:STAK:LDAQQ0:STAQQ19:LDAQQ1:LSRA:STAQQ19+1:LDA#7:STAQQ19+2:JSRTT15:LDAQQ19+1:CLC:ADC#24:STAQQ19+1 43 | 2300.TT128 LDAQQ19:STAK3:LDAQQ19+1:STAK4:LDX#0:STXK4+1:STXK3+1:\STXLSX:INX:STXLSP:LDX#2:STXSTP 44 | 2310JSRCIRCLE2:\LDA#FFSTALSX:RTS 45 | 2650.TT219\Buy 46 | 2655\LDA#2:JSRTT66-2:JSRTT163:LDA#128:STAQQ17:\JSRFLKB:LDA#0:STAQQ29 47 | 2660.TT220 JSRTT151:LDAQQ25:BNETT224:JMPTT222:.TQ4 LDY#176:.Tc JSRTT162:TYA:JSRprq:.TTX224 JSRdn2:.TT224 48 | 2671JSRCLYNS:LDA#204:JSRTT27:LDAQQ29:CLC:ADC#208:JSRTT27:LDA#&2F:JSRTT27:JSRTT152:LDA#&3F:JSRTT27:JSRTT67:LDX#0:STXR:LDX#12:STXT1:.TT223 49 | 2700JSRgnum:BCSTQ4:STAP:JSRtnpr:LDY#206:BCSTc:LDAQQ24:STAQ:JSRGCASH:JSRLCASH:LDY#197:BCCTc 50 | 2708LDYQQ29:LDAR:PHA:CLC:ADCQQ20,Y:STAQQ20,Y:LDAAVL,Y:SEC:SBCR:STAAVL,Y:PLA:BEQTT222:JSRdn 51 | 2710.TT222 LDAQQ29:CLC:ADC#5:STAYC:LDA#0:STAXC:INCQQ29:LDAQQ29:CMP#17:BCSBAY2:JMPTT220:.BAY2 LDA#f9:JMPFRCE 52 | 2750.gnum LDX#0:STXR:LDX#12:STXT1:.TT223 JSRTT217:STAQ:SEC:SBC#&30:BCCOUT:CMP#10:BCSBAY2:STAS:LDAR:CMP#26:BCSOUT:ASLA:STAT:ASLA:ASLA:ADCT:ADCS:STAR:CMPQQ25:BEQTT226:BCSOUT:.TT226 LDAQ:JSRTT26:DECT1:BNETT223:.OUT LDAR:RTS 53 | 2850.TT208\Sel 54 | 2855LDA#4:JSRTT66:LDA#4:STAYC:STAXC:\JSRFLKB:LDA#205:JSRTT27:LDA#206:JSRTT68 55 | 2900.TT210\Crgo 56 | 2910LDY#0:.TT211 STYQQ29:LDXQQ20,Y:BEQTT212 57 | 2912TYA:ASLA:ASLA:TAY:LDAQQ23+1,Y:STAQQ19+1 58 | 2915TXA:PHA:JSRTT69:CLC:LDAQQ29:ADC#208 59 | 2917JSRTT27:LDA#14:STAXC:PLA:TAX:CLC:JSRpr2:JSRTT152 60 | 2922LDAQQ11:CMP#4:BNETT212:LDA#205:JSRTT214 61 | 2923BCCTT212:LDAQQ29:LDX#255:STXQQ17:JSRTT151 62 | 2925LDYQQ29:LDAQQ20,Y:STAP:LDAQQ24:STAQ:JSRGCASH:JSRMCASH 63 | 2935LDA#0:LDYQQ29:STAQQ20,Y:STAQQ17 64 | 2940.TT212 LDYQQ29:INY:CPY#17:BCSP%+5:JMPTT211:LDAQQ11:CMP#4:BNEP%+8:JSRdn2:JMPBAY2:RTS 65 | 2942.TT213\Invntry 66 | 2945LDA#8:JSRTT66:LDA#11:STAXC:LDA#164:JSRTT60:JSRNLIN4:JSRfwl 67 | 2950LDACRGO:CMP#26:BCCP%+7:LDA#&6B:JSRTT27:JMPTT210 68 | 2965.TT214 PHA:JSRTT162:PLA:.TT221 JSRTT27:LDA#225:JSRTT27 69 | 2966JSRTT217:ORA#32:CMP#&79:BEQTT218:LDA#&6E:JMPTT26:.TT218 JSRTT26:SEC:RTS 70 | 3000.TT16 TXA:PHA:DEY:TYA:EOR#255:PHA:JSRWSCAN:JSRTT103:PLA:STAQQ19+3 71 | 3010LDAQQ10:JSRTT123:LDAQQ19+4:STAQQ10:STAQQ19+1:PLA 72 | 3020STAQQ19+3:LDAQQ9:JSRTT123:LDAQQ19+4:STAQQ9:STAQQ19:.TT103 73 | 3030LDAQQ11:BEQTT180:BMITT105:LDAQQ9:STAQQ19:LDAQQ10:LSRA:STAQQ19+1 3040LDA#4:STAQQ19+2:JMPTT15 74 | 3045.TT123 STAQQ19+4:CLC:ADCQQ19+3:LDXQQ19+3:BMITT124:BCCTT125 75 | 3047RTS:.TT124 BCCTT180:.TT125 STAQQ19+4:.TT180 RTS 76 | 3050.TT105 LDAQQ9:SEC:SBCQQ0:CMP#38:BCCTT179:CMP#230:BCCTT180 77 | 3055.TT179 ASLA:ASLA:CLC:ADC#104:STAQQ19 78 | 3060LDAQQ10:SEC:SBCQQ1:CMP#38:BCCP%+6:CMP#220:BCCTT180 79 | 3065ASLA:CLC:ADC#90:STAQQ19+1:LDA#8:STAQQ19+2:JMPTT15 80 | 3300.TT23\ShrtSc 81 | 3310LDA#128:JSRTT66:LDA#7:STAXC:LDA#190:JSRNLIN3:JSRTT14:JSRTT103:JSRTT81 82 | 3349LDA#0:STAXX20:LDX#24:.EE3 STAINWK,X:DEX:BPLEE3 83 | 3350.TT182 LDAQQ15+3:SEC:SBCQQ0:BCSTT184:EOR#FF:ADC#1:.TT184 CMP#20:BCSTT187:LDAQQ15+1:SEC:SBCQQ1:BCSTT186:EOR#FF:ADC#1:.TT186 CMP#38:BCSTT187 84 | 3370LDAQQ15+3:SEC:SBCQQ0:ASLA:ASLA:ADC#104:STAXX12:LSRA:LSRA:LSRA:STAXC:INCXC:LDAQQ15+1:SEC:SBCQQ1:ASLA:ADC#90:STAK4:LSRA:LSRA:LSRA 85 | 3377TAY:LDXINWK,Y:BEQEE4:INY:LDXINWK,Y:BEQEE4:DEY:DEY:LDXINWK,Y:BNEee1:.EE4 STYYC:CPY#3:BCCTT187:DEX:STXINWK,Y 86 | 3380LDA#128:STAQQ17:JSRcpl:.ee1 87 | 3390\bigstars:LDA#0:STAK3+1:STAK4+1:STAK+1:LDAXX12:STAK3:LDAQQ15+5:AND#1:ADC#2:STAK:JSRFLFLLS:JSRSUN:JSRFLFLLS 88 | 3400.TT187 JSRTT20:INCXX20:BEQTT111-1:JMPTT182 89 | 3450.TT81 LDX#5:LDAQQ21,X:STAQQ15,X:DEX:BPLTT81+2 90 | 3500RTS:.TT111 JSRTT81:LDY#127:STYT:LDA#0:STAU 91 | 3510.TT130 LDAQQ15+3:SEC:SBCQQ9:BCSTT132:EOR#FF:ADC#1:.TT132 LSRA:STAS:LDAQQ15+1:SEC:SBCQQ10:BCSTT134:EOR#FF:ADC#1:.TT134 LSRA:CLC:ADCS:CMPT:BCSTT135 92 | 3550STAT:LDX#5:.TT136 LDAQQ15,X:STAQQ19,X:DEX:BPLTT136:.TT135 93 | 3560JSRTT20:INCU:BNETT130:LDX#5:.TT137 LDAQQ19,X:STAQQ15,X:DEX 94 | 3570BPLTT137:LDAQQ15+1:STAQQ10:LDAQQ15+3:STAQQ9 95 | 3575SEC:SBCQQ0:BCSTT139:EOR#FF:ADC#1:.TT139 JSRSQUA2:STAK+1:LDAP:STAK:LDAQQ10 96 | 3590SEC:SBCQQ1:BCSTT141:EOR#FF:ADC#1:.TT141 LSRA:JSRSQUA2:PHA:LDAP:CLC:ADCK 97 | 3610STAQ:PLA:ADCK+1:STAR:JSRLL5:LDAQ:ASLA:LDX#0:STXQQ8+1:ROLQQ8+1:ASLA:ROLQQ8+1:STAQQ8:JMPTT24 98 | 4340.hy6 JSRCLYNS:LDA#15:STAXC:JMPTT27 99 | 4350.hyp LDAQQ12:BNEhy6:LDAQQ22+1:BNEzZ+1:JSRCTRL:BMIGhy 100 | 4353JSRhm 101 | 4355LDAQQ8:ORAQQ8+1:BEQzZ+1:LDA#7:STAXC:LDA#23:STAYC:LDA#0:STAQQ17:LDA#189:JSRTT27:LDAQQ8+1:BNETT147:LDAQQ14:CMPQQ8:BCCTT147 102 | 4380LDA#&2D:JSRTT27:JSRcpl:.wW LDA#15:STAQQ22+1:STAQQ22:TAX:JMPee3\hy5 RTS 103 | 4392.Ghy JSRTT111:LDXGHYP:BEQhy5:INX:STXQQ8:STXQQ8+1:STXGHYP:STXFIST:JSRwW:LDX#5:INCGCNT:LDAGCNT:AND#7:STAGCNT:.G1 LDAQQ21,X:ASLA:ROLQQ21,X:DEX:BPLG1:\JSRDORND:.zZ LDA#&60:STAQQ9:STAQQ10:JSRTT110:LDA#116:JSRMESS:.jmp LDAQQ9:STAQQ0:LDAQQ10 104 | 4393STAQQ1:.hy5 RTS 105 | 4395.ee3 LDY#1:STYYC:DEY:STYXC:.pr6 CLC:.pr5 LDA#5:JMPTT11 106 | 4400.TT147 LDA#202:.prq JSRTT27:LDA#&3F:JMPTT27 107 | 5000.TT151\Pmk-A 108 | 5010PHA:STAQQ19+4:ASLA:ASLA:STAQQ19:LDA#1:STAXC:PLA:ADC#208 109 | 5015JSRTT27:LDA#14:STAXC:LDXQQ19:LDAQQ23+1,X:STAQQ19+1:LDAQQ26:ANDQQ23+3,X:CLC:ADCQQ23,X:STAQQ24:JSRTT152 110 | 5050JSRvar:LDAQQ19+1:BMITT155:LDAQQ24:ADCQQ19+3:JMPTT156 111 | 5060.TT155 LDAQQ24:SEC:SBCQQ19+3:.TT156 STAQQ24:STAP:LDA#0:JSRGC2 112 | 5070SEC:JSRpr5:LDYQQ19+4:LDA#5:LDXAVL,Y:STXQQ25 113 | 5100CLC:BEQTT172:JSRpr2+2:JMPTT152:.TT172 LDAXC:ADC#4:STAXC:LDA#&2D:BNETT162+2 114 | 5110.TT152 LDAQQ19+1:AND#96:BEQTT160:CMP#32:BEQTT161 115 | 5120JSRTT16a:.TT162 LDA#32:JMPTT27 116 | 5130.TT160 LDA#&74:JSRTT26:BCCTT162 117 | 5140.TT161 LDA#&6B:JSRTT26:.TT16a LDA#&67:JMPTT26 118 | 5160.TT163 LDA#17:STAXC:LDA#FF:BNETT162+2 119 | 5200.TT167\MktP 120 | 5210LDA#16:JSRTT66:LDA#5:STAXC:LDA#167:JSRNLIN3:LDA#3:STAYC:JSRTT163:LDA#0:STAQQ29:.TT168 LDX#128:STXQQ17:JSRTT151:INCYC 121 | 5250INCQQ29:LDAQQ29:CMP#17:BCCTT168:RTS 122 | 5900.var LDAQQ19+1:AND#31:LDYQQ28:STAQQ19+2:CLC:LDA#0:STAAVL+16:.TT153 DEY:BMITT154:ADCQQ19+2:JMPTT153:.TT154 STAQQ19+3:RTS 123 | 5980.hyp1 JSRTT111:JSRjmp:LDX#5:.TT112 LDAQQ15,X:STAQQ2,X:DEX:BPLTT112:INX:STXEV:LDAQQ3:STAQQ28:LDAQQ5:STAtek:LDAQQ4:STAgov:RTS 124 | 5990.GVL JSRDORND:STAQQ26:LDX#0:STXXX4:.hy9 LDAQQ23+1,X:STAQQ19+1:JSRvar:LDAQQ23+3,X:ANDQQ26:CLC:ADCQQ23+2,X:LDYQQ19+1:BMITT157:SEC:SBCQQ19+3:JMPTT158:.TT157 CLC:ADCQQ19+3:.TT158 BPLTT159:LDA#0:.TT159 125 | 5994LDYXX4:AND#63:STAAVL,Y:INY:TYA:STAXX4:ASLA:ASLA:TAX:CMP#63:BCChy9:.hyR RTS 126 | 5995.GTHG JSRZe:LDA#FF:STAINWK+32:LDA#THG:JSRNWSHP:LDA#TGL:JMPNWSHP 127 | 5996.ptg LSRCOK:SEC:ROLCOK 128 | 5998.MJP\LDA#1:JSRTT66-2:JSRLL164:JSRRES2:STYMJ:.MJP1 JSRGTHG:LDA#3:CMPMANY+THG:BCSMJP1:STANOSTM:LDX#0:JSRLOOK1:LDAQQ1:EOR#31:STAQQ1:RTS 129 | 6000.TT18\HSPC 130 | 6005LDAQQ14:SEC:SBCQQ8:STAQQ14:LDAQQ11:BNEee5:JSRTT66:JSRLL164:.ee5 JSRCTRL:ANDPATG:BMIptg:JSRDORND:CMP#253:BCSMJP\JSRTT111:JSRhyp1+3:JSRGVL:JSRRES2:JSRSOLAR 131 | 6500LDAQQ11:AND#63:BNEhyR:JSRTTX66:LDAQQ11:BNETT114:INCQQ11:.TT110 LDXQQ12:BEQNLUNCH:JSRLAUN:JSRRES2:JSRTT111:INCINWK+8:JSRSOS1:LDA#128:STAINWK+8:INCINWK+7:JSRNWSPS:LDA#12:STADELTA:JSRBAD:ORAFIST:STAFIST 132 | 6510.NLUNCH LDX#0:STXQQ12:JMPLOOK1:.TT114 BMITT115:JMPTT22:.TT115 JMPTT23 133 | 6530.LCASH STXT1:LDACASH+3:SEC:SBCT1:STACASH+3:STYT1:LDACASH+2:SBCT1:STACASH+2:LDACASH+1:SBC#0:STACASH+1:LDACASH:SBC#0:STACASH:BCSTT113 134 | 6540.MCASH TXA:CLC:ADCCASH+3:STACASH+3:TYA:ADCCASH+2:STACASH+2:LDACASH+1:ADC#0:STACASH+1:LDACASH:ADC#0:STACASH:CLC:.TT113 RTS 135 | 6550.GCASH JSRMULTU:.GC2 ASLP:ROLA:ASLP:ROLA:TAY:LDXP:RTS 136 | 6690.bay JMPBAY 137 | 6700.EQSHP JSRDIALS:LDA#32:JSRTT66:LDA#12:STAXC:LDA#207:JSRspc:LDA#185:JSRNLIN3:LDA#128:STAQQ17:INCYC:LDAtek:CLC:ADC#3:CMP#12:BCCP%+4:LDA#12:STAQ:STAQQ25:INCQ:LDA#70:SEC:SBCQQ14:ASLA:STAPRXS 138 | 6710LDX#1:.EQL1 STXXX13:JSRTT67:LDXXX13:CLC:JSRpr2:JSRTT162:LDAXX13:CLC:ADC#&68:JSRTT27:LDAXX13:JSRprx-3:SEC:LDA#25:STAXC:LDA#6:JSRTT11:LDXXX13:INX:CPXQ:BCCEQL1 139 | 6720JSRCLYNS:LDA#127:JSRprq:JSRgnum:beqbay:bcsbay:SBC#0:LDX#2:STXXC:INCYC:PHA:JSReq:PLA:BNEet0:STAMCNT:LDX#70:STXQQ14:.et0 CMP#1:BNEet1:LDXNOMSL:INX:LDY#&75:CPX#5:BCSpres 140 | 6730STXNOMSL:JSRmsblob:.et1 LDY#&6B:CMP#2:BNEet2:LDX#37:CPXCRGO:BEQpres:STXCRGO:.et2 CMP#3:BNEet3:INY:LDXECM:BNEpres:DECECM:.et3 CMP#4:BNEet4:JSRqv:LDA#4:LDYLASER,X:BEQed4:.ed7 LDY#187:BNEpres:.ed4 LDA#POW:STALASER,X:LDA#4:.et4 141 | 6740CMP#5:BNEet5:JSRqv:STXT1:LDA#5:LDYLASER,X:BEQed5:\BPLP%+4:BMIed7:LDA#4:JSRprx:JSRMCASH:.ed5 LDA#POW+128:LDXT1:STALASER,X:.et5 142 | 6750LDY#&6F:CMP#6:BNEet6:LDXBST:BEQed9:.pres STYK:JSRprx:JSRMCASH:LDAK:JSRspc:LDA#31:JSRTT27:.err JSRdn2:JMPBAY:.ed9 DECBST:.et6 INY:CMP#7:BNEet7:LDXESCP:BNEpres:DECESCP:.et7 INY:CMP#8:BNEet8:LDXBOMB:BNEpres:LDX#&7F:STXBOMB:.et8 143 | 6800INY:CMP#9:BNEetA:LDXENGY:BNEpres:INCENGY:.etA INY:CMP#10:BNEetB:LDXDKCMP:BNEpres:DECDKCMP:.etB:INY:CMP#11:BNEet9:LDXGHYP:BNEpres:DECGHYP:.et9 JSRdn:JMPEQSHP:.dn JSRTT162:LDA#119:JSRspc:.dn2 JSRBEEP:LDY#50:JMPDELAY 144 | 6900.eq JSRprx:JSRLCASH:BCSc:LDA#197:JSRprq:JMPerr:SEC:SBC#1:.prx ASLA:TAY:LDXPRXS,Y:LDAPRXS+1,Y:TAY:.c RTS 145 | 6910.qv LDY#16:STYYC:.qv1 LDX#12:STXXC:TYA:CLC:ADC#B-16:JSRspc:LDAYC:CLC:ADC#&50:JSRTT27:INCYC:LDYYC:CPY#20:BCCqv1:.qv3 JSRCLYNS:.qv2 LDA#175:JSRprq:JSRTT217:SEC:SBC#&30:CMP#4:BCSqv3:TAX:RTS 146 | 9900] 147 | 9910IFZ>4OSCLI("S.ELTD "+STR$~W%+" "+STR$~O%+" "+STR$~L%+" "+STR$~H%) 148 | 9920PRINT"D d,";:GOTO10 149 | -------------------------------------------------------------------------------- /sources/ELITEE.TXT: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/sources/ELITEE.TXT -------------------------------------------------------------------------------- /sources/ELITEF.TXT: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/sources/ELITEF.TXT -------------------------------------------------------------------------------- /sources/ELITEG.TXT: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kieranhj/elite-beebasm/6e01618a3b42213d950eea06a03c58ec481addff/sources/ELITEG.TXT -------------------------------------------------------------------------------- /sources/ELITES.TXT: -------------------------------------------------------------------------------- 1 | >L. 2 | 1 DISC=TRUE:PROT=(NOT DISC) 3 | 5REM Source Code for ELITE (the loader) 4 | 7MODE7 5 | 8HIMEM=&4000:CODE=&4000:DIMTEMP%256 6 | 10 IF NOT DISC THEN LOD%=&F1F ELSE LOD%=&1100 7 | 14C%=&F40:S%=C%:L%=LOD%+&28:D%=&563A:LC%=&6000-C%:svn=&7FFD:len1=15:len2=18:len=len1+len2 8 | 15LE%=&B00: REM Move Mover to here while CODE loading 9 | 16LL%=&E00+(DISC AND&300): REM Where this loader loads 10 | 20MOS=S%+8:TRTB%=4:NETV=&224 11 | 1000OSWRCH=&FFEE:OSBYTE=&FFF4:OSWORD=&FFF1:SCLI=&FFF7:IRQ1V=&204:osprnt=&234 12 | 1010ZP=&70:P=&72:Q=&73:YY=&74:T=&75:sc=&76:BLPTR=&78:V219=&7A:K3=&80:BLCNT=&81:BLN=&83:EXCN=&85 13 | 1020FF=&FF 14 | 1030VIA=&FE40:USVIA=VIA:VSCAN=57-1:VEC=&7FFE 15 | 2000OSCLI("L.:0.WORDS9 "+STR$~CODE) 16 | 2010OSCLI("L.:0.DIALSHP "+STR$~(CODE+&400)) 17 | 2020OSCLI("L.:2.P.ELITE "+STR$~(CODE+&C00)) 18 | 2030OSCLI("L.:2.P.A-SOFT "+STR$~(CODE+&D00)) 19 | 2040OSCLI("L.:2.P.(C)ASFT "+STR$~(CODE+&E00)) 20 | 2050REMOSCLI("L.:2.P.NAME$ "+STR$~(CODE+&E00)) 21 | 3000FORZ=4TO6STEP2 22 | 3010P%=LL%+&400+&800+&300:O%=CODE+&400+&800+&300 23 | 3012[OPTZ:.run JMPENTRY:] 24 | 3015RESTORE:READN% 25 | 3020B%=P%:FORI%=0TON%-1:READA:PROCP(A):NEXT 26 | 3100E%=P%:FORI%=1TO4:FORJ%=1TO14:READA:PROCP(A):NEXT, 27 | 4000[OPTZ:.swine LDA#&7F:STA&FE4E:JMP(&FFFC) 28 | 4010\ This bit runs where it loads 29 | 4900.OSB LDY#0:JMPOSBYTE:EQUS"R.ELITEcode":EQUB13:EQUS"By D.Braben/I.Bell":EQUB13:EQUB&B0:.oscliv EQUW&FFF7:.David9 EQUW David5:CLD:.David23 EQUW (512-len) 30 | 4910.doPROT1 LDY#&DB:STYTRTB%:LDY#&EF \0.1 look-up keys:STYTRTB%+1:LDY#2:STYV219+1:STAPROT1-255,X:LDY#&18:STYV219+1,X:RTS:.MHCA EQUB&CA:.David7 BCCIan1 31 | 5000.ENTRY SEI:CLD:]IF NOT DISC THEN[OPTZ:LDA#0:LDX#FF:JSROSBYTE:TXA:BEQOS100:LDY&FFB6:LDA&FFB7:STAZP:LDA&FFB8:STAZP+1:DEY:.ABCDEFG LDA(ZP),Y:STA&200,Y:DEY:BPLABCDEFG:.OS100:]IF0ELSE:[OPTZ 32 | 5002LDA#&7F:STA&FE4E:STA&FE6E:LDA&FFFC:STA&200:STA&202:STA&206:STA&220:LDA&FFFD:STA&201:STA&203:STA&207:STA&221 \ Cold reset (Power on) on BRK,USER,& unrecog IRQ 33 | 5003LDX#&2F-2:.purge LDA&202,X:ORA#&C0:STA&202,X:DEX:DEX:BPLpurge 34 | 5004LDA#&60:STA&232:LDA#2:STANETV+1:LDA#&32:STANETV \Knock out NETVEC 35 | 5005LDA#32:EQUB&2C:.Ian1 BNEDavid3:STADavid2:LSRA:LDX#3:STXBLPTR+1:STXBLN+1:STXEXCN+1:DEX:JSROSBYTE \ADC 36 | 5006EQUB&2C:.FRED1 BNEDavid7 37 | 5007LDX#255:LDA#&48:JSRdoPROT1:LDA#144:JSROSB \TV 38 | 5008LDA#247:LDX#0:JSROSB \BREAK vec 39 | 5009\LDA#&81\LDY#FF\LDX#1\JSROSBYTE\TXA\BPLOS01 \Damn 0.1 40 | 5010LDA#190:LDX#8:JSROSB \8bitADC 41 | 5012EQUB&2C:.David8 BNEFRED1 42 | 5015LDA#&8F:LDX#&C:LDY#FF:JSROSBYTE \ claim NMIs 43 | 5030LDA#13:.abrk LDX#0:JSROSB \otput bffer 44 | 5050LDA#225:LDX#128:JSROSB \fn keys 45 | 5055LDA#172:LDX#0:LDY#255:JSROSBYTE:STXTRTB%:STYTRTB%+1 \int-ascii table 46 | 5058LDA#200:LDX#3:JSROSB:]IF PROT AND NOT DISC THEN[OPTZ:CPX#3:BNEabrk+1 \Clear memory on BREAK :] 47 | 5059[OPTZ 48 | 5060LDA#13:LDX#2:JSROSB \kybrd buffer 49 | 5062.OS01 50 | 5065LDX#FF:TXS:INX:.David3 LDABEGIN%,X:.PROT1 INY \PHA:INX:CPX#len:BNEDavid8 \^stack 51 | 5070LDA#(B% MOD256):STAZP:LDA#&C8:STAPROT1:LDA#(B% DIV256):STAZP+1:LDY#0:.LOOP LDA(ZP),Y:JSROSWRCH:INY:CPY#N%:BNELOOP \set up pokey-mode-4 52 | 5080LDA#1:TAX:TAY:STA(V219),Y:LDA#4:JSROSB \cursor 53 | 5090LDA#9:LDX#0:JSROSB \flashing 54 | 5095LDA#&6C:EORcrunchit:STAcrunchit 55 | 5101EQUS FNE(0):EQUS FNE(1):EQUS FNE(2):EQUS FNE(3) \envelopes 56 | 5103\ 57 | 5110LDX#4:STXP+1:LDA#(LL%DIV256):STAZP+1:LDY#0:LDA#256-len1:STA(V219-4,X):STYZP:STYP:JSRcrunchit \Move WORDS9 to &400 58 | 5115LDX#1:LDA#((LL%DIV256)+&C):STAZP+1:LDA#&63:STAP+1:LDY#0:JSRcrunchit:LDX#1:LDA#((LL%DIV256)+&D):STAZP+1:LDA#&61:STAP+1:LDY#0:JSRcrunchit:LDX#1:LDA#((LL%DIV256)+&E):STAZP+1:LDA#&76:STAP+1:LDY#0:JSRcrunchit 59 | 5117JSRPLL1 \draw Saturn 60 | 5120LDX#8:LDA#((LL%DIV256)+4):STAZP+1:LDA#&78:STAP+1:LDY#0:STYZP:STYBLCNT:STYP:JSRcrunchit \Move DIALSHP to &7800 61 | 5130LDX#(3-(DISC AND1)):LDA#(UU%DIV256):STAZP+1:LDA#(UU%MOD256):STAZP:LDA#(LE%DIV256):STAP+1:LDY#0:STYP:JSRcrunchit \Move Part of this program to LE% 62 | 5135STYDavid3-2:\LDY#0:.David2 EQUB&AC:EQUW&FFD4 \JSR&FFD4:.LBLa LDAC%,X:EOR#&A5:STAC%,X:DEX:BNELBLa:JMP(C%+&CF):.swine2 jmpswine:EQUW&4CFF:.crunchit BRK:EQUW David23:.RAND EQUD &6C785349:.David5 INY:CPY#(ENDBLOCK-BLOCK):BNEDavid2 63 | 5140SEI:LDA#&C2:STAVIA+&E:LDA#&7F:STA&FE6E:LDAIRQ1V:STAVEC:LDAIRQ1V+1:BPLswine2:STAVEC+1:LDA#(IRQ1 DIV256):STAIRQ1V+1:LDA#(IRQ1 MOD256):STAIRQ1V:LDA#VSCAN:STAUSVIA+5:CLI \ INTERRUPTS NOW OK 64 | 5145:] IF DISC THEN [OPTZ:LDA#&81:STA&FE4E:LDY#20:JSROSBYTE:LDA#1:STA&FE4E:] 65 | 5146[OPTZ 66 | 5190RTS \ENTRY2 on stack already 67 | 5210.PLL1 LDAVIA+4:STARAND+1:JSRDORND:JSRSQUA2:STAZP+1:LDAP:STAZP:JSRDORND:STAYY:JSRSQUA2:TAX:LDAP:ADCZP:STAZP:TXA:ADCZP+1:BCSPLC1 68 | 5220STAZP+1:LDA#1:SBCZP:STAZP:LDA#&40:SBCZP+1:STAZP+1:BCCPLC1:JSRROOT:LDAZP:LSRA:TAX:LDAYY:CMP#128:RORA:JSRPIX 69 | 5230.PLC1 DECCNT:BNEPLL1:DECCNT+1:BNEPLL1:LDX#&C2:STXEXCN 70 | 5240.PLL2 JSRDORND:TAX:JSRSQUA2:STAZP+1:JSRDORND:STAYY:JSRSQUA2:ADCZP+1:CMP#&11:BCCPLC2:LDAYY:JSRPIX 71 | 5250.PLC2 DECCNT2:BNEPLL2:DECCNT2+1:BNEPLL2:LDXMHCA:STXBLPTR:LDX#&C6:STXBLN 72 | 5260.PLL3 JSRDORND:STAZP:JSRSQUA2:STAZP+1:JSRDORND:STAYY:JSRSQUA2:STAT 73 | 5270ADCZP+1:STAZP+1:LDAZP:CMP#128:RORA:CMP#128:RORA:ADCYY:TAX:JSRSQUA2:TAY:ADCZP+1 74 | 5280BCSPLC3:CMP#&50:BCSPLC3:CMP#&20:BCCPLC3:TYA:ADCT:CMP#&10:BCSPL1:LDAZP:BPLPLC3:.PL1 LDAYY:JSRPIX 75 | 5290.PLC3 DECCNT3:BNEPLL3:DECCNT3+1:BNEPLL3 76 | 5300.DORND LDARAND+1:TAX:ADCRAND+3:STARAND+1:STXRAND+3:LDARAND:TAX:ADCRAND+2:STARAND:STXRAND+2:RTS 77 | 5320.SQUA2 BPLSQUA:EOR#FF:CLC:ADC#1 78 | 5330.SQUA STAQ:STAP:LDA#0:LDY#8:LSRP:.SQL1 BCCSQ1:CLC:ADCQ:.SQ1 RORA:RORP:DEY:BNESQL1:RTS 79 | 5340.PIX TAY:EOR#128:LSRA:LSRA:LSRA:ORA#&60:STAZP+1:TXA:EOR#128:AND#&F8:STAZP:TYA:AND#7:TAY:TXA:AND#7:TAX 80 | 5350LDATWOS,X:ORA(ZP),Y:STA(ZP),Y:RTS 81 | 5360.TWOS EQUD &10204080:EQUD&01020408 82 | 5370.CNT EQUW&500:.CNT2 EQUW &1DD:.CNT3 EQUW &500 83 | 5380.ROOT LDYZP+1:LDAZP:STAQ:LDX#0:STXZP:LDA#8:STAP:.LL6 CPXZP:BCCLL7:BNELL8:CPY#&40:BCCLL7:.LL8 TYA:SBC#&40:TAY:TXA:SBCZP:TAX:.LL7 ROLZP:ASLQ:TYA:ROLA:TAY:TXA:ROLA:TAX:ASLQ:TYA:ROLA:TAY:TXA:ROLA:TAX:DECP:BNELL6:RTS 84 | 5390.BEGIN% EQUB(David9 DIV256):EQUB(David9 MOD256):EQUB&6C \JMP:EQUB(TUT DIV256):EQUB(TUT MOD256):EQUB&99 \STA,Y:EQUB(TUT DIV256):EQUB(TUT MOD256):EQUB&59 \EOR,Y:PHA:EQUB((BLOCK)DIV256):EQUB((BLOCK)MOD256):EQUB&B9 \LDA,Y:PLA:PLA 85 | 5394.DOMOVE RTS:EQUW&D0EF \BNEMVDL:DEX:EQUBZP+1:INCP+1:EQUB&E6 \INCP+1 INCZP+1:EQUW&D0F6 \BNEMVDL:DEY:EQUBP:EQUB&91 \STA(),Y:EQUB(OSB DIV256):EQUB(OSB MOD256):EQUB&59 \EOR:EQUBZP:EQUB&B1 \LDA(),Y \ 18 Bytes ^ Stack 86 | 5400.UU%:]:Q%=P%-LE%:P%=LE%:[OPTZ 87 | 5450.CHECKbyt BRK:.MAINSUM EQUB&CB:EQUB0:.FOOLV EQUW FOOL:.CHECKV EQUWLOD%+1 88 | 5460.block1 EQUD&A5B5E5F5:EQUD&26366676:EQUD&8494C4D4:.block2 EQUD&A0B0C0D0:EQUD&8090E0F0:EQUD&27376777 \ Colours for interrupts 89 | 5500.TT26\ PRINT Please tidy this up! 90 | 5510STAK3:TYA:PHA:TXA:PHA 91 | 5520.rr LDAK3:CMP#7:BEQR5:CMP#32:BCSRR1:CMP#13:BEQRRX1:INCYC:.RRX1 LDX#7:STXXC:BNERR4 92 | 5530.RR1 93 | 5540LDX#&BF:ASLA:ASLA:BCCP%+4:LDX#&C1:ASLA:BCCP%+3:INX:STAP:STXP+1 94 | 5550LDAXC:CMP#20:BCCNOLF:LDA#7:STAXC:INCYC:.NOLF ASLA:ASLA:ASLA:STAZP:INCXC:LDAYC:CMP#19:BCCRR3:LDA#7:STAXC:lda#&65:stasc+1:ldy#7*8:ldx#14:stysc:lda#0:tay:.David1 sta(sc),Y:iny:cpy#14*8:bccDavid1:tay:incsc+1:dex:bplDavid1:lda#5:STAYC 95 | 5560bnerr:.RR3 ORA#&60:STAZP+1:LDY#7:.RRL1 LDA(P),Y:STA(ZP),Y:DEY:BPLRRL1 96 | 5570.RR4 PLA:TAX:PLA:TAY:LDAK3:.FOOL RTS 97 | 5580.R5 lda#7:jsrosprint:JMPRR4 98 | 5590.TUT \EOR here onward:.osprint jmp(osprnt):EQUB&6C:.command jmp(oscliv):.MESS1 EQUS FNLSTR:EQUB13 \*LOAD ELITEcode 99 | 5800.ENTRY2 lda&20E:staosprnt:LDA#(TT26 MOD256):STA&20E:LDX#(MESS1 MOD256):lda&20F:staosprnt+1:LDA#(TT26 DIV256):LDY#(MESS1 DIV256):STA&20F \OSWRCH for loading messages 100 | 5805JSRAFOOL:JSRcommand:JSR512-len+CHECKER-ENDBLOCK :JSRAFOOL: \ (Gratuitous JSRs)- LOAD Mcode and checksum it. 101 | 5810]IF DISC THEN [OPTZ:LDA#140:LDX#12:JSROSBYTE \*TAPE :] 102 | 5811[OPTZ 103 | 5820LDA#0:STAsvn 104 | 5830LDX#(LC% DIV256):LDA#(L% MOD256):STAZP:LDA#(L% DIV256):STAZP+1:LDA#(C% MOD256):STAP:LDA#(C% DIV256):STAP+1:LDY#0 105 | 5840.ML1 TYA:EOR(ZP),Y:STA(P),Y:INY:BNEML1:INCZP+1:INCP+1:DEX:BPLML1 \Move code down (d) 106 | 5850LDAS%+6:STA&202:LDAS%+7:STA&203:LDAS%+2:STA&20E:LDAS%+3:STA&20F \BRK,OSWRCH :RTS - ON STACK :.AFOOL JMP(FOOLV) 107 | 5852.M2 EQUB2:.VIA2 LDA#4:STA&FE20:LDY#11:.inlp1 LDAblock1,Y:STA&FE21:DEY:BPLinlp1:PLA:TAY:JMP(VEC):.IRQ1:TYA:PHA:] 108 | 5853IF PROT AND NOT DISC THEN [OPTZ:LDY#0:LDA(BLPTR),Y:BITM2:BNEitdone:EOR#128+3:INCBLCNT:BNEZQK:DECBLCNT:.ZQK STA(BLPTR),Y:LDA#&23:CMP(BLN),Y:BEQP%+4:EOR#17:CMP(EXCN),Y:BEQitdone:DECLOD%:.itdone:] 109 | 5854[OPTZ:LDAVIA+&D:BITM2:BNELINSCN:AND#64:BNEVIA2:PLA:TAY:JMP(VEC) 110 | 5856.LINSCN LDA#50:STAUSVIA+4:LDA#VSCAN:STAUSVIA+5:LDA#8:STA&FE20:LDY#11:.inlp2 LDAblock2,Y:STA&FE21:DEY:BPLinlp2:PLA:TAY:JMP(VEC) 111 | 5857\ 112 | 5859.BLOCK \ Pushed onto stack for execution :EQUW ENTRY2-1:EQUW 512-len+BLOCK-ENDBLOCK+3 113 | 5860LDAVIA+4:STA1:SEI:LDA#&39:STAVIA+&E:\LDA#&7F:\STA&FE6E:\LDAIRQ1V:\STAVEC:\LDAIRQ1V+1:\STAVEC+1 Already done:LDAS%+4:STAIRQ1V:LDAS%+5:STAIRQ1V+1:LDA#VSCAN:STAUSVIA+5:CLI \Interrupt vectors 114 | 5870\LDA#&81LDY#FFLDX#1JSROSBYTETXAEOR#FFSTAMOS \FF if MOS0.1 else 0 115 | 5880\BMIBLAST:LDY#0:LDA#200:LDX#3:JSROSBYTE:.BLAST \break,escape 116 | 5890LDA#(S% DIV256):STAZP+1:LDA#(S% MOD256):STAZP:LDX#&45:LDY#0:TYA:.CHK CLC:ADC(ZP),Y:INY:BNECHK:INCZP+1:DEX:BPLCHK:CMPD%-1:BEQitsOK:.nononono STAS%+1:LDA#&7F:STA&FE4E:JMP(&FFFC):.itsOK JMP(S%) 117 | 5900.CHECKER LDY#0:LDX#4:STXZP+1:STYZP:TYA:.CHKq CLC:ADC(ZP),Y:INY:BNECHKq:INCZP+1:DEX:BNECHKq:CMPMAINSUM+1:BNEnononono 118 | 5905TYA:.CHKb CLC:ADCLOD%,Y:INY:CPY#&28:BNECHKb:CMPMAINSUM:BNEnononono 119 | 5910] IF PROT AND NOT DISC THEN [OPTZ:LDABLCNT:CMP#&4F:BCCnononono:] 120 | 5920[OPTZ:JMP(CHECKV) 121 | 6050.ENDBLOCK \ no more on to stack 122 | 6060.XC EQUB7:.YC EQUB6 123 | 7000] 124 | 7020NEXTZ 125 | 7040FORI%=0TO ENDBLOCK-BLOCK STEP4:I%!TEMP%=I%!(BLOCK-P%+O%):NEXT:FORI%=0TO ENDBLOCK-BLOCK-1:?(ENDBLOCK-P%+O%-I%-1)=I%?TEMP%:NEXT 126 | 7042A%=0:FORI%=CODE TOCODE+&3FF:A%=A%+?I%:NEXT:?(MAINSUM-P%+O%+1)=A% 127 | 7045A%=0:FORI%=LE%-P%+O%+1TOLE%-P%+O%+383:A%=A%+?I%:NEXT:?(CHECKbyt-P%+O%)=A% 128 | 7050FORI%=0TO ENDBLOCK-BLOCK-1:?(I%+TUT-P%+O%)=(?(I%+TUT-P%+O%))EOR(?(I%+BLOCK-P%+O%)):NEXT 129 | 7060FORI%=0TO2-(DISC AND1):FORJ%=0TO255STEP4:!(J%+I%*256+UU%-P%-Q%+O%)=(!(J%+I%*256+UU%-P%-Q%+O%))EOR(!(OSB-P%-Q%+O%+J%)):NEXT, 130 | 7070FORI%=0TO&E:FORJ%=0TO255STEP4:!(J%+I%*256+CODE)=(!(J%+I%*256+CODE))EOR(!(OSB-P%-Q%+O%+J%)):NEXT, 131 | 7100PRINT"Memory usage: B00 - ";~P%'~LL%;" - ";~P%+Q%'"Stack :";len+ENDBLOCK-BLOCK 132 | 7110INPUT'"Press to save on drive 0"A$ 133 | 7120OSCLI("S.:0.ELITE "+STR$~CODE +" "+STR$~O% +" "+STR$~run +" "+STR$~LL%) 134 | 7200END 135 | 8000DATA67 136 | 8100DATA 22,4,28,2,17,15,16 137 | 8110DATA 23,0, 6,31,0,0,0,0,0,0 138 | 8112DATA 23,0,12,12,0,0,0,0,0,0 139 | 8114DATA 23,0,13, 0,0,0,0,0,0,0 140 | 8116DATA 23,0, 1,32,0,0,0,0,0,0 141 | 8118DATA 23,0, 2,45,0,0,0,0,0,0 142 | 8120DATA 23,0,10,32,0,0,0,0,0,0 143 | 9100DATA1,1,0,111,-8,4,1,8, 8,-2,0,-1,112,44 144 | 9110DATA2,1,14,-18,-1,44,32,50, 6,1,0,-2,120,126 145 | 9120DATA3,1,1,-1,-3,17,32,128,1,0,0,-1,1,1 146 | 9130DATA4,1,4,-8,44,4,6,8,22,0,0,-127,126,0 147 | 10000DEFPROCP(A):?O%=A:O%=O%+1:P%=P%+1:ENDPROC 148 | 10100DEF FNE(I%) 149 | 10110[OPTZ 150 | 10120LDX#((E%+I%*14)MOD256):LDY#((E%+I%*14)DIV256):LDA#8:JSROSWORD 151 | 10130] 152 | 10140="" 153 | 10200DEFFNLSTR:IF DISC THEN ="L.ELTcode 1100" ELSE ="L.ELITEcode F1F" 154 | >*SPOOL 155 | -------------------------------------------------------------------------------- /verify.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | SETLOCAL 3 | SET PYTHON=C:\Home\Python27\python.exe 4 | make verify 5 | --------------------------------------------------------------------------------