├── orig ├── D8572.jpg ├── RedLabelROMChart.png └── RedLabelROMBoardSchema.png ├── src ├── unknown.bin ├── brutsum2.src ├── info.src ├── samexap7.src ├── phr6.src ├── romf8.src ├── blk71.src ├── romc8.src ├── mess0.src └── romc0.src ├── .gitmodules ├── PatchROM.py ├── ChainFilesToRom.py ├── Makefile └── README.md /orig/D8572.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mwenge/defender/HEAD/orig/D8572.jpg -------------------------------------------------------------------------------- /src/unknown.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mwenge/defender/HEAD/src/unknown.bin -------------------------------------------------------------------------------- /orig/RedLabelROMChart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mwenge/defender/HEAD/orig/RedLabelROMChart.png -------------------------------------------------------------------------------- /orig/RedLabelROMBoardSchema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mwenge/defender/HEAD/orig/RedLabelROMBoardSchema.png -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "asm6809"] 2 | path = asm6809 3 | url = https://www.6809.org.uk/git/asm6809.git 4 | [submodule "vasm-mirror"] 5 | path = vasm-mirror 6 | url = https://github.com/mbitsnbites/vasm-mirror.git 7 | -------------------------------------------------------------------------------- /src/brutsum2.src: -------------------------------------------------------------------------------- 1 | ORG $8000 2 | BASE RMB 2 STORE BASE ADDRESS OF 2K ROM 3 | LOCA RMB 2 STORE CHECKSUM DESTINATION 4 | ROMN RMB 1 STORE ROM NUMBER 5 | CSUM CLR [LOCA] CHECKSUM PROGRAM START ADDRESS 6 | CSUMA LDX BASE 7 | LDY #$800 8 | LDA ROMN 9 | CLRB 10 | CSUM1 ADCA ,X+ 11 | LEAY -1,Y 12 | BNE CSUM1 13 | CMPA #$80 14 | BEQ CSUM2 15 | INC [LOCA] 16 | BNE CSUMA 17 | BRA * 18 | CSUM2 JMP [$FF16] 19 | END 20 | -------------------------------------------------------------------------------- /PatchROM.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | """ 4 | Patch a rom file with the given bytes at the given position 5 | """ 6 | 7 | import sys 8 | import os 9 | 10 | if len(sys.argv) < 2: 11 | print("Not enough filenames given") 12 | exit() 13 | 14 | romname = sys.argv[1] 15 | bs = bytearray(open(romname, 'rb').read()) 16 | 17 | for a in sys.argv[2:]: 18 | args = a.split(',') 19 | to = int(args[0],16) 20 | p = bytearray.fromhex(args[1]) 21 | bs[to:to+len(p)] = p 22 | 23 | # Write the patched bytes 24 | rom = open(romname, 'wb') 25 | rom.write(bs) 26 | 27 | -------------------------------------------------------------------------------- /ChainFilesToRom.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | """ 4 | Chain together the relevant parts of the compiled binaries into a complete defender rom 5 | """ 6 | 7 | import sys 8 | import os 9 | 10 | if len(sys.argv) < 2: 11 | print("Not enough filenames given") 12 | exit() 13 | 14 | romname = sys.argv[1] 15 | rom = open(romname, 'wb') 16 | 17 | romlength = int(sys.argv[2],16) 18 | 19 | rom_data = bytearray([0xff] * romlength) 20 | for a in sys.argv[3:]: 21 | args = a.split(',') 22 | fn = args[0] 23 | nm = args[-1:] 24 | fr,to,ln = [int(x,16) for x in args[1:-1]] 25 | 26 | bs = open(fn, 'rb').read()[fr-1:fr+ln-1] 27 | rom_data[to:to+len(bs)] = bs 28 | rom.write(rom_data) 29 | -------------------------------------------------------------------------------- /src/info.src: -------------------------------------------------------------------------------- 1 | TO ASSEMBLE THE DEFENDER MESS 2 | 3 | RASM PHR2,DEFA2,DEFB2,AMODE0;-X (ELSE CREF SYMBOL OVERFLOW) 4 | RASM PHR2,SAMEXPA7 5 | RASM PHR2,DEFA2,DEFB2 6 | TO GET THE DIAGS, CHAIN ALL.CF 7 | LOAD IT ALL AND THEN PRAY IT WORKS 8 | (NOTE: BEWARE OF ORDER OF LOADING 9 | LOOK OUT FOR THE SELECTED BLOCK SHIT 10 | 11 | DR J. 1/21/81 12 | 13 | INFORMATION ABOUT THESE FILES: 14 | 15 | ROM1 THRU ROM12 ARE THE WHITE SOFTWARE (1ST RELEASE WITHOUT CHECKSUMS) 16 | ROM1A THRU ROM12A ARE THE BLUE SOFTWARE (1ST RELEASE WITH CHECKSUMS) 17 | ROM1B, ROM2A, ROM3B, ROM4B, AND ROM6A THRU ROM12A ARE THE GREEN SOFTWARE 18 | (2ND RELEASE FOR 2 2716'S INSTEAD OF 1 2532 AT D000) 19 | ROM1C, ROM4E, AND ALL OTHER ROMXC ARE THE RED SOFTWARE (COCKTAIL SOFTWARE- 20 | ALSO RELEASED FOR ROM). NOTE THAT ROM4C AND ROM4D ARE VERSIONS OF RED THAT 21 | ARE INCORRECT DUE TO THE MULTIPLE COIN PRICING ERROR. 22 | ROM4F IS THE GREEN SOFTWARE PRICING FIX. 23 | ROM10Z IS TAITO ROM10C WITH DEFAULT OF 5 SHIPS. 24 | 25 | 26 | THESE FILES ARE EITHER 2K/4K AND LOAD AT $6000-$67FF/$6000-$6FFF 27 | 28 | 3/26/81 29 | 30 | PHR6.SRC 636 LINES 31 | DEFA7.SRC 3,375 LINES 32 | DEFB6.SRC 2,252 LINES 33 | AMODE1.SRC 1,310 LINES 34 | BLK71.SRC 723 LINES 35 | SAMEXAP7.SRC 382 LINES 36 | MESS0.SRC 955 LINES 37 | ROMF8.SRC 692 LINES 38 | ROMC0.SRC 925 LINES 39 | ROMC8.SRC 839 LINES 40 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: all clean 2 | 3 | DIRS=bin 4 | REDLABEL=redlabel 5 | 6 | all: clean 7 | 8 | defender: 9 | # Build notes from info.src ('DR J.' is presumably Eugene Jarvis!): 10 | # 11 | # "TO ASSEMBLE THE DEFENDER MESS 12 | # 13 | # RASM PHR2,DEFA2,DEFB2,AMODE0;-X (ELSE CREF SYMBOL OVERFLOW) 14 | # RASM PHR2,SAMEXPA7 15 | # RASM PHR2,DEFA2,DEFB2 16 | # TO GET THE DIAGS, CHAIN ALL.CF 17 | # LOAD IT ALL AND THEN PRAY IT WORKS 18 | # (NOTE: BEWARE OF ORDER OF LOADING 19 | # LOOK OUT FOR THE SELECTED BLOCK SHIT 20 | # 21 | # DR J. 1/21/81" 22 | 23 | $(shell mkdir -p $(DIRS)) 24 | # 25 | # Build amode1 # The equivalent of: RASM PHR2,DEFA2,DEFB2,AMODE0;-X (ELSE CREF SYMBOL OVERFLOW) 26 | ./asm6809/src/asm6809 -B src/phr6.src src/defa7.src src/defb6.src src/amode1.src\ 27 | -l bin/defa7-defb6-amode1.lst -o bin/defa7-defb6-amode1.o 28 | # 29 | # Build samexamp 30 | # The equivalent of: RASM PHR2,SAMEXPA7 31 | ./asm6809/src/asm6809 -B src/phr6.src src/samexap7.src\ 32 | -l bin/samexap7.lst -o bin/samexap7.o 33 | # 34 | # Build defa7 and defb6 35 | # The equivalent of: RASM PHR2,DEFA2,DEFB2 36 | ./asm6809/src/asm6809 -B src/phr6.src src/defa7.src src/defb6.src\ 37 | -l bin/defa7-defb6.lst -o bin/defa7-defb6.o 38 | # 39 | # Build blk71 40 | ./asm6809/src/asm6809 -B --6309 src/blk71.src -l bin/blk71.lst -o bin/blk71.o 41 | # 42 | # Build roms 43 | ./asm6809/src/asm6809 -B src/mess0.src src/romf8.src src/romc0.src src/romc8.src\ 44 | -l bin/roms.lst -o bin/roms.o 45 | # 46 | # Build sound 47 | ./vasm-mirror/vasm6800_oldstyle -Fbin -ast -unsshift src/vsndrm1.src\ 48 | -L bin/vsndrm1.lst -o bin/vsndrm1.o 49 | 50 | # Recreate the binaries in the Red Label ROM board from the objects we assembled in 51 | # the 'defender' section above. Store them in the 'redlabel' directory. 52 | # 53 | redlabel: defender 54 | $(shell mkdir -p $(REDLABEL)) 55 | # defend.1 56 | ./ChainFilesToRom.py redlabel/defend.1 0x800\ 57 | bin/defa7-defb6-amode1.o,0xb001,0x0000,0x0800,"defa7" 58 | echo "c9eb365411ca8452debe66e7b7657f44 redlabel/defend.1" | md5sum -c 59 | # defend.2 60 | ./ChainFilesToRom.py redlabel/defend.2 0x1000\ 61 | bin/defa7-defb6-amode1.o,0xc001,0x0000,0x1000,"defa7" 62 | ./PatchROM.py redlabel/defend.2\ 63 | 0x07c5,'27fc' 64 | echo "5e85f9851217645508c36cf33762342f redlabel/defend.2" | md5sum -c 65 | # defend.3 66 | ./ChainFilesToRom.py redlabel/defend.3 0x1000\ 67 | bin/defa7-defb6-amode1.o,0xd001,0x0000,0x0c60,"defa7"\ 68 | bin/samexap7.o,0x0001,0x0c60,0x02f8,"samexap"\ 69 | bin/defa7-defb6-amode1.o,0xdf59,0x0f58,0x0230,"defa7" 70 | echo "f20a652ed2f1497fe899c414d15245a8 redlabel/defend.3" | md5sum -c 71 | # defend.4 72 | ./ChainFilesToRom.py redlabel/defend.4 0x0800\ 73 | bin/defa7-defb6-amode1.o,0xb801,0x0000,0x0800,"defa7" 74 | echo "a652dd9a550e1d33f55e76ba954f8999 redlabel/defend.4" | md5sum -c 75 | # defend.6 76 | ./ChainFilesToRom.py redlabel/defend.6 0x0800\ 77 | bin/blk71.o,0x0001,0x0000,0x0772,"blk71"\ 78 | bin/roms.o,0xa779,0x0778,0x0088,"romc0" 79 | ./PatchROM.py redlabel/defend.6\ 80 | 0x0772,'000000000000'\ 81 | 0x00de,'afb4'\ 82 | 0x07f0,'17' 83 | echo "fadaacee0e506f701ea3e61dfa23c548 redlabel/defend.6" | md5sum -c 84 | # defend.7 85 | ./ChainFilesToRom.py redlabel/defend.7 0x0800\ 86 | bin/roms.o,0xa001,0x0000,0x0800,"roms" 87 | echo "5b9d4e0664e01c48560b05d5941ee908 redlabel/defend.7" | md5sum -c 88 | # defend.8 89 | ./ChainFilesToRom.py redlabel/defend.8 0x0800\ 90 | bin/roms.o,0x0001,0x0000,0x0800,"roms" 91 | echo "dd4d18f5d3d14ab94f09b05335da3bf4 redlabel/defend.8" | md5sum -c 92 | # defend.9 93 | ./ChainFilesToRom.py redlabel/defend.9 0x0800\ 94 | bin/defa7-defb6-amode1.o,0x0001,0x0000,0x0800,"defa7" 95 | echo "3de0cf05f6ee1fd7da6ccaba93fce3fc redlabel/defend.9" | md5sum -c 96 | # defend.10 97 | ./ChainFilesToRom.py redlabel/defend.10 0x0800\ 98 | bin/roms.o,0xa801,0x0000,0x0800,"roms" 99 | ./PatchROM.py redlabel/defend.10\ 100 | 0x07f0,'4a' 101 | echo "7bd2ddcb4ce8c5ceb8150b61cb2a2335 redlabel/defend.10" | md5sum -c 102 | # defend.11 103 | ./ChainFilesToRom.py redlabel/defend.11 0x0800\ 104 | bin/roms.o,0x0801,0x0000,0x0800,"roms"\ 105 | src/unknown.bin,0x0001,0x0450,0x0800,"roms" 106 | echo "0fda70334d594b58cd26ad032be16c4b redlabel/defend.11" | md5sum -c 107 | # defend.12 108 | ./ChainFilesToRom.py redlabel/defend.12 0x0800\ 109 | bin/defa7-defb6-amode1.o,0x0801,0x0000,0x0800,"defa7"\ 110 | bin/defa7-defb6-amode1.o,0xaeea,0x06e9,0x0117,"amode tail" 111 | echo "8115fdb8540e93d38e036f007e19459a redlabel/defend.12" | md5sum -c 112 | # defend.snd 113 | ./ChainFilesToRom.py redlabel/defend.snd 0x0800\ 114 | bin/vsndrm1.o,0xf801,0x0000,0x0800,"vsndrm1" 115 | # This should be 8a, but the assembler used for the ROM has calculated the product 116 | # of (61857>>1)/3/1*1)*2) as '508b' instead of '508a'. See ORGTAB in vsndrm1.src. 117 | ./PatchROM.py redlabel/defend.snd\ 118 | 0x05b6,'8b' 119 | echo "ec5b36f80f7bd93ba9e6269f0376efd6 redlabel/defend.snd" | md5sum -c 120 | 121 | clean: 122 | -rm bin/*.o 123 | -rm bin/*.lst 124 | -rm defender.rom 125 | -rm defend*.bin 126 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Defender (1981) by Eugene Jarvis and Sam Dicker 2 | 3 | 4 | This is the source code for the Williams arcade game Defender. 5 | 6 | The source code can be assembled into the 11 rom files that would have been 7 | loaded onto the arcade cabinet's ROM board. Today, these rom files can be used 8 | to play the game in an emulator such as 9 | [MAME](https://www.mamedev.org/release.html). 10 | 11 | 12 | 13 | 14 | * [Build Instructions](#build-instructions) 15 | * [Build Requirements](#build-requirements) 16 | * [Build the assembler toolchain](#build-the-assembler-toolchain) 17 | * [Build Defender](#build-defender) 18 | * [Play Defender](#play-defender) 19 | * [Notes on the Source Code, ROM Files, and the Physical Circuit Boards](#notes-on-the-source-code-rom-files-and-the-physical-circuit-boards) 20 | * [About the source code](#about-the-source-code) 21 | * [ROM Part Table with Corresponding Assembled Object Files](#rom-part-table-with-corresponding-assembled-object-files) 22 | * [Changes required for the source to assemble](#changes-required-for-the-source-to-assemble) 23 | 24 | 25 | ## Build Instructions 26 | 27 | ### Build Requirements 28 | ```sh 29 | sudo apt install build-essential wine python3 flex 30 | ``` 31 | 32 | ### Build the assembler toolchain 33 | 34 | We use [`asm6809`](https://www.6809.org.uk/asm6809/) to assembler the source code for the main game and [`vasm`](http://www.compilers.de/vasm.html) to compile 35 | the sound module. 36 | 37 | First you must run the following to set up the git submodules containing the assembler toolchain: 38 | 39 | ```sh 40 | git submodule init 41 | git submodule update 42 | ``` 43 | 44 | Now you can build the toolchain, as follows: 45 | 46 | ```sh 47 | cd asm6809 48 | ./autogen.sh 49 | ./configure 50 | make 51 | cd .. 52 | cd vasm-mirror 53 | make CPU=6800 SYNTAX=oldstyle 54 | cd .. 55 | ``` 56 | 57 | ### Build Defender 58 | 59 | To build the Red Label rom files (see below for more information on what these are), do: 60 | ```sh 61 | make redlabel 62 | ``` 63 | These will get written to a directory called `redlabel`. 64 | 65 | ## Play Defender 66 | 67 | Once you've built defender you can now use the rom files in the `redlabel` directory to play defender on [MAME](https://www.mamedev.org/release.html). If you're on Ubuntu you can also install MAME with apt: 68 | ```sh 69 | sudo apt install mame 70 | ``` 71 | 72 | ## Notes on the Source Code, ROM Files, and the Physical Circuit Boards 73 | 74 | ### About the source code 75 | The game source code for Defender in [src](src) was originally retrieved from 76 | https://github.com/historicalsource/defender. It is the Motorola 6809 assembly language 77 | source code for the 'Red Label' version of the game. 78 | 79 | The source code for the [sound module](src/vsndrm1.src) was retrieved from https://github.com/historicalsource/williams-soundroms. 80 | 81 | There were four versions of the game released: 82 | White Label, Blue Label, Green Label, and Red Label, in that order. Each 83 | release was a circuit board with the assembled code split across a number of 84 | different ROM chips, also referred to as 'ICs'. This image of the Red Label ROM 85 | board from [Scott Tunstall's 86 | site](https://www.robotron-2084.co.uk/techwilliamshardwareid.html) gives you an 87 | idea of what such a board looks like: 88 | 89 | 90 | 91 | If you compare this image to [the file listing for the Red Label 92 | roms](orig/defender-redlabel) you'll notice that the missing chip on the board 93 | corresponds to a missing file `defend.5`: 94 | ```sh 95 | [robert@mwenge-desktop defender-redlabel (master)]$ ls -al 96 | total 64 97 | drwxrwxr-x 2 robert robert 4096 Jul 11 10:32 . 98 | drwxrwxr-x 8 robert robert 4096 Jul 11 11:02 .. 99 | -rw-rw-r-- 1 robert robert 2048 Dec 24 1996 defend.1 100 | -rw-rw-r-- 1 robert robert 2048 Dec 24 1996 defend.10 101 | -rw-rw-r-- 1 robert robert 2048 Dec 24 1996 defend.11 102 | -rw-rw-r-- 1 robert robert 2048 Dec 24 1996 defend.12 103 | -rw-rw-r-- 1 robert robert 4096 Dec 24 1996 defend.2 104 | -rw-rw-r-- 1 robert robert 4096 Dec 24 1996 defend.3 105 | -rw-rw-r-- 1 robert robert 2048 Dec 24 1996 defend.4 106 | -rw-rw-r-- 1 robert robert 2048 Dec 24 1996 defend.6 107 | -rw-rw-r-- 1 robert robert 2048 Dec 24 1996 defend.7 108 | -rw-rw-r-- 1 robert robert 2048 Dec 24 1996 defend.8 109 | -rw-rw-r-- 1 robert robert 2048 Dec 24 1996 defend.9 110 | ``` 111 | 112 | So each file `defend.[x]` corresponds to a matching chip on the board and 113 | because there is a missing chip in slot 5 we have no `defend.5` in the rom dump 114 | listing. 115 | 116 | In the [Defender product documentation](https://www.robotron-2084.co.uk/manuals/defender/defender_later_pcb_drawing_set.pdf) a 117 | chart lists the part numbers for each chip and confirms that IC5 (i.e. `defend.5`) is unused: 118 | 119 | 120 | 121 | When we assemble the Defender source with `make redlabel` we create a bunch of 122 | object files and then split them across the 11 files to match the 11 in the Red 123 | Label ROM dump listing above. 124 | 125 | Eugene Jarvis left a slightly cryptic note to how we assemble the source in [`info.src`](src/info.src): 126 | 127 | ``` 128 | TO ASSEMBLE THE DEFENDER MESS 129 | 130 | RASM PHR2,DEFA2,DEFB2,AMODE0;-X (ELSE CREF SYMBOL OVERFLOW) 131 | RASM PHR2,SAMEXPA7 132 | RASM PHR2,DEFA2,DEFB2 133 | TO GET THE DIAGS, CHAIN ALL.CF 134 | LOAD IT ALL AND THEN PRAY IT WORKS 135 | (NOTE: BEWARE OF ORDER OF LOADING 136 | LOOK OUT FOR THE SELECTED BLOCK SHIT 137 | 138 | DR J. 1/21/81 139 | 140 | ``` 141 | 142 | Since the `RASM` assembler is no longer available to us we use [`asm6809`](asm6809) instead. Fortunately this 143 | does a good job of assembling the source faithfully and [only very minor modifications to the source files are 144 | required to produce binaries](#changes-required-for-the-source-to-assemble). We recreate the steps in Eugene's notes as follows: 145 | 146 | ``` 147 | # Build amode1 # The equivalent of: RASM PHR2,DEFA2,DEFB2,AMODE0;-X (ELSE CREF SYMBOL OVERFLOW) 148 | ./asm6809/src/asm6809 -B src/phr6.src src/defa7.src src/defb6.src src/amode1.src\ 149 | -l bin/defa7-defb6-amode1.lst -o bin/defa7-defb6-amode1.o 150 | ``` 151 | This is the main game code with the attract mode module assembled in. `phr6.src` is a file containing definitions, 152 | while `defa7.src` and `defb6/src` contain the main game code; `amode1.src` contains the attract mode code. 153 | 154 | We also have to build a version of this game code without the attract mode module: 155 | 156 | ``` 157 | 158 | # Build defa7 and defb6 159 | # The equivalent of: RASM PHR2,DEFA2,DEFB2 160 | ./asm6809/src/asm6809 -B src/phr6.src src/defa7.src src/defb6.src\ 161 | -l bin/defa7-defb6.lst -o bin/defa7-defb6.o 162 | ``` 163 | 164 | The final module the notes mention is `samexpa7` a bunch of explosion routines added by Sam Dicker: 165 | 166 | ``` 167 | # Build samexamp 168 | # The equivalent of: RASM PHR2,SAMEXPA7 169 | ./asm6809/src/asm6809 -B src/phr6.src src/samexap7.src\ 170 | -l bin/samexap7.lst -o bin/samexap7.o 171 | ``` 172 | 173 | Eugene's notes are much less clear on how we go about assembling the reamining source files: 174 | 175 | ``` 176 | mess0.src 177 | blk71.src 178 | romf8.src 179 | romc0.src 180 | romc8.src 181 | ``` 182 | 183 | However the way he lists them in the notes turns out to provide a clue to the order in which they 184 | shoud be assembled: 185 | 186 | ``` 187 | PHR6.SRC 636 LINES 188 | DEFA7.SRC 3,375 LINES 189 | DEFB6.SRC 2,252 LINES 190 | AMODE1.SRC 1,310 LINES 191 | BLK71.SRC 723 LINES 192 | SAMEXAP7.SRC 382 LINES 193 | MESS0.SRC 955 LINES 194 | ROMF8.SRC 692 LINES 195 | ROMC0.SRC 925 LINES 196 | ROMC8.SRC 839 LINES 197 | ``` 198 | 199 | We assemble the last four together in the order that they appear above: 200 | 201 | ``` 202 | # Build roms 203 | ./asm6809/src/asm6809 -B src/mess0.src src/romf8.src src/romc0.src src/romc8.src\ 204 | -l bin/roms.lst -o bin/roms.o 205 | ``` 206 | 207 | And we assemble `blk71.src` by itself: 208 | 209 | ``` 210 | # Build blk71 211 | ./asm6809/src/asm6809 -B src/blk71.src -l bin/blk71.lst -o bin/blk71.o 212 | ``` 213 | 214 | ### ROM Part Table with Corresponding Assembled Object Files 215 | This table shows how the contents of each ROM chip relates back to the assembled code. 216 | 217 | ROM Chip| Part Number|File Name|Build Binary|Start Position in Build Binary|End Position in Build Binary 218 | | --- | --- | --- | --- | --- | --- | 219 | IC1|A5343-09636 |defend.1|bin/defa7-defb6-amode1.o|0xb000|0xb800 220 | IC2|A5343-09637 |defend.2|bin/defa7-defb6-amode1.o|0xc000|0xd000 221 | IC3|A5343-09638 |defend.3|bin/defa7-defb6-amode1.o|0xd000|0xdc60 222 | IC3|A5343-09638 |defend.3|bin/samexpa7.o|0x0000|0x02f8 223 | IC3|A5343-09638 |defend.3|bin/defa7-defb6-amode1.o|0xdf59|0x0230 224 | IC4|A5343-09639 |defend.4|bin/defa7-defb6-amode1.o|0xb800|0x0800 225 | IC5|Not Used|||| 226 | IC6|A5343-09640 |defend.6|bin/blk71.o|0x0000|0x0772 227 | IC6|A5343-09640 |defend.6|bin/roms.o|0xa778|0x0088 228 | IC7|A5343-09641 |defend.7|bin/roms.o|0xa000|0x0800 229 | IC8|A5343-09642 |defend.8|bin/roms.o|0x0000|0x0800 230 | IC9|A5343-09642 |defend.9|bin/defa7-defb6-amode1.o|0x0000|0x0800 231 | IC10|A5343-09643 |defend.10|bin/roms.o|0xa800|0x0800 232 | IC11|A5343-09644 |defend.11|bin/roms.o|0x0800|0x0800 233 | IC11|A5343-09644 |defend.11|Unknown||0x0800 234 | IC12|A5343-09645 |defend.12|bin/defa7-defb6-amode1.o|0x0800|0x0800 235 | IC12|A5343-09645 |defend.12|bin/defa7-defb6-amode1.o|0xaee9|0x0117 236 | 237 | Replicating this arrangement of the binaries is achieved by [`ChainFilesToRom.py`](ChainFilesToRom.py) in the 238 | project's [Makefile](Makefile). It's a simple python script that extracts the relevant segments from each of the 239 | binaries built in the `bin` folder when you run `make redlabel`. 240 | 241 | ### Changes required for the source to assemble 242 | There were a few modifications to the source required along the way to get this to work. 243 | 244 | 1. Replacing macro arguments to make them compatible `asm6809`,e.g.: 245 | ```diff 246 | -NAPP MACRO \0,\1 247 | - LDA #\0 248 | - LDX #\1 249 | +NAPP MACRO \1,\2 250 | + LDA #\1 251 | + LDX #\2 252 | JMP SLEEPP 253 | ENDM 254 | ``` 255 | 256 | 2. Replacing the use of `$` in label names, e.g.: 257 | ```diff 258 | -INIT$V EQU HOFV+2 259 | -HALLDV EQU INIT$V+2 260 | +INITSSV EQU HOFV+2 261 | +HALLDV EQU INITSSV+2 262 | ``` 263 | 3. Replacing the use of '.' in label names, e.g.: 264 | ```diff 265 | - LDY #.P1SCR ;START WITH PLAYER 1 266 | + LDY #P1SCR ;START WITH PLAYER 1 267 | ``` 268 | 269 | 4. Work around the fact that `RASM` seems to have allowed you to assemble code sections into overlapping 270 | memory segments. For example both `amode1.src` and `defa7.src` want to assemble into position `$C000` in 271 | the ROM, meaning that one will overwrite the other. This explains why the main game files get assembled 272 | twice, once with attract mode (`amode1.src`) and once without: they wanted a binary with some segments 273 | overwritten with attract mode features and one without. We achieve this ourselves by modifying the source 274 | to assemble and place the attract mode code to position `$2000` in memory, and when we later split the 275 | object files into the `defend.x` files pick the chunk of code we're interested in: 276 | ```diff 277 | @@ -111,6 +111,8 @@ YSHIP EQU $5000 278 | AMTYPE EQU 0 279 | 280 | ORG $C000 281 | + PUT $2000 282 | + 283 | JMP HALLOF ;VECTORS 284 | JMP SCNR 285 | ``` 286 | 5. In `amode1.src` I had to replace a few hard-coded constant values to match what was in the binary: 287 | ```diff 288 | diff --git a/src/amode1.src b/src/amode1.src 289 | index 543cb7e..cdaeb1e 100755 290 | --- a/src/amode1.src 291 | +++ b/src/amode1.src 292 | @@ -145,19 +147,19 @@ HALL1 STA PNUMB ;PLAYER NUMBER 293 | HALL1A JSR P2SW 294 | HALL1B LDB #$85 ;LIGHT BLUE LETTERS 295 | STB PCRAM+1 296 | - LDA #$FE ;TODAYS SOUND - PHANTOM 297 | + LDA #$3E ;TODAYS SOUND - PHANTOM 298 | LDX #THSTAB ;TODAYS TOP SCORE 299 | JSR CPXCY ;COMPARE 300 | BHS HALL2 ;NOT THE BEST? 301 | - LDA #$FD ;HIGH SCORE SOUND - TOCCATA 302 | + LDA #$3D ;HIGH SCORE SOUND - TOCCATA 303 | HALL2 LDX #$CC02 ;SOUND PIAS 304 | - LDB #$FF ;CLEAR LINES 305 | + LDB #$3F ;CLEAR LINES 306 | JSR STBXBV 307 | - LDB #$E4 ;SELECT ORGAN 308 | + LDB #$24 ;SELECT ORGAN 309 | JSR STBXBV 310 | -HALL3 DECB DELAY 311 | +HALL3 DECB ;DELAY 312 | BNE HALL3 313 | - LDB #$FF ;CLEAR LINES 314 | + LDB #$3F ;CLEAR LINES 315 | JSR STBXBV 316 | TFR A,B 317 | JSR STBXBV ;PLAY SOUND 318 | ``` 319 | 320 | 7. Update the bit-shift and bit-wise comparison notation to be compatible with syntax expected by `asm6809`, e.g.: 321 | ```diff 322 | - LDX #WCURS!.$C35A ;CONFUSION 323 | - LDD #WCURS!.$3CA5 ;MORE CONFUSION 324 | + LDX #WCURS&$C35A ;CONFUSION 325 | + LDD #WCURS&$3CA5 ;MORE CONFUSION 326 | @@ -1206,7 +1208,7 @@ MT1 LDD BGL ;CALC SCANL 327 | LDA STATUS 328 | BITA #2 ;NO TERRAIN??? 329 | BNE MTX ;NONE 330 | - LDA #SCANER!>8 331 | + LDA #SCANER>>8 332 | LDY #STETAB ;ERASE TABLE 333 | ``` 334 | 8. Comment out some directives not used by `asm6809`, e.g.: 335 | ```diff 336 | index d2d7212..86d4bf0 100755 337 | --- a/src/blk71.src 338 | +++ b/src/blk71.src 339 | @@ -1,6 +1,6 @@ 340 | - TTL D E F E N D E R 1.0 341 | - NMLIST 342 | - NOGEN 343 | +* TTL D E F E N D E R 1.0 344 | +* NMLIST 345 | +* NOGEN 346 | ``` 347 | 348 | 349 | 10. This one may be worth investingating further. The code references `P1LAS` when it needs to be `P1LAT` to match 350 | the Red Label binaries. Would be interesting to know if this sheds any light on the version of the source code as it 351 | looks very like a typo that was bug-fixed. 352 | ```diff 353 | @@ -831,14 +831,14 @@ CSCX RTS 354 | *DISPLAY LASERS 355 | * 356 | LDISP PSHS D,X,Y,U ;PLAYER 1 357 | - LDX #P1LAS 358 | - LDA .P1LAS 359 | + LDX #P1LAT ;Fixme was: #P1LAS 360 | + LDA P1LAS 361 | BSR LDSP 362 | LDA PLRCNT 363 | DECA 364 | BEQ LDPX 365 | - LDX #P2LAS 366 | - LDA .P2LAS 367 | + LDX #P2LAT 368 | + LDA P2LAS 369 | BSR LDSP 370 | ``` 371 | 372 | 11. I needed to modify the `KILP` and `KILO` macros to assembly properly with `asm6809`. Removing the addition of `$` 373 | to the argument in the macro itself and instead adding it before passing the argument: 374 | ```diff 375 | -KILP MACRO \0,\1 376 | +KILP MACRO \1,\2 377 | JSR KILPOS 378 | - FDB $\0 379 | FDB \1 380 | + FDB \2 381 | ENDM 382 | -KILO MACRO \0,\1 383 | +KILO MACRO \1,\2 384 | JSR KILOS 385 | - FDB $\0 386 | FDB \1 387 | + FDB \2 388 | ENDM 389 | index 33665f5..3f4c5ac 100755 390 | --- a/src/defb6.src 391 | +++ b/src/defb6.src 392 | @@ -73,13 +73,13 @@ UFONV4 ADDA #10 393 | CLRB 394 | LDA XTEMP+1 395 | ADDD PLAYV 396 | - ASRA DIVIDE ;BY 2 397 | + ASRA ; DIVIDE BY 2 398 | RORB 399 | STD OYV,X 400 | UFONVX RTS 401 | *UFOKILL 402 | UFOKIL DEC UFOCNT 403 | - KILP 0120,UFHSND 404 | + KILP $0120,UFHSND 405 | RTS 406 | * 407 | ``` 408 | 409 | 12. Replace some single-quotes with double-quotes for compatibility with `asm6809`, e.g.: 410 | ```diff 411 | @@ -780,21 +780,21 @@ A28 FCC "SPECIAL ;FUNCTION/" 412 | * DEFAULT HERE FOR NOW 413 | * 414 | DEFALT FCB $02,$12,$70 ;CRHSTD 415 | - FCC 'DRJ' 416 | + FCC "DRJ" 417 | FCB $01,$83,$15 ;CRHST1 418 | - FCC 'SAM' 419 | + FCC "SAM" 420 | FCB $01,$59,$20 ;THSTD2 421 | - FCC 'LED' 422 | + FCC "LED" 423 | ``` 424 | 425 | 13. `blk71.src` has to be assembled with 6309 extensions and `STX [,Y]` has to be changed to the `COMF' instruction 426 | in order to get it to match with the ROM binaries. 427 | 428 | ```asm 429 | ./src/blk71.src:191: TTER03 COMF ;Was: STX [,Y] ;FAST OUTPUT 430 | ``` 431 | 432 | 14. In a few cases I've had to replace the values of constants in the code to match the ROM binaries. These are: 433 | ```asm 434 | ./src/romc0.src:78: FDB $D9FF ;Fixme was: $FFFF 435 | ./src/defb6.src:2170: FDB $0000,$00FE,$C300 ; Fixme: $C300 was $6600 436 | ./src/mess0.src:68: FDB $5BFF ;Fixme was: $FFFF 437 | ./src/mess0.src:654: FDB $84FF ;Fixme was: $FFFF 438 | ``` 439 | 440 | 441 | -------------------------------------------------------------------------------- /src/samexap7.src: -------------------------------------------------------------------------------- 1 | ;NLIST 2 | ;LIST 3 | ;TTL D E F E N D E R 1.0 SAMEXAP7.SRC 4 | ***************************************************** 5 | * 6 | * SAM EXPLOSIONS AND APPEARANCES 7 | * 8 | * ASSEMBLE WITH PHRED 9 | ***************************************************** 10 | SETDP $A0 11 | * 12 | * EXPLOSION/APPEAR VECTORS 13 | * 14 | ORG APVCT 15 | JMP APST ;APPEAR START 16 | JMP EXST ;EXPLOSION START 17 | JMP EXPU ;EXPANDED UPDATE 18 | * 19 | * APPEAR START 20 | * X=OBJECT POINTER 21 | * 22 | APST PSHS U,Y,D 23 | LDD OPICT,X ;GET OBJECT PICTURE 24 | PSHS D ;SAVE IT 25 | LDD NULOBV ;GET NULL OBJECT PICTURE 26 | STD OPICT,X ;REPLACE OBJECT PICTURE WITH NU 27 | STX OPTR ;ADD OBJECT TO LIST 28 | LDD OX16,X ;GET 16 BIT X COORDINATE 29 | SUBD BGL ;FIND SCREEN POSITION 30 | CMPD #$2600 ;CHECK IF ON SCREEN 31 | BHI APST5 ;OFF SCREEN?, ABORT APPEAR 32 | * GET RAM ALLOCATION 33 | LDY LSEXPL ;GET LAST EXPLOSION RAM ALLOCAT 34 | BEQ APST3 ;ZERO?, INITIALIZE RAM ALLOCATI 35 | APST2 LEAY RAMSIZ,Y ;ADVANCE TO NEXT RAM ALLOCATION 36 | CMPY #RAMEND ;CHECK FOR END 37 | BNE APST4 ;NO?, CONTINUE SEARCH 38 | APST3 LDY #RAMALS ;RESET TO START 39 | APST4 CMPY LSEXPL ;CHECK FOR ALL APPEARS 40 | BNE APST6 ;NO?, CONTINUE SEARCH 41 | APST5 PULS D ;GET OBJECT PICTURE 42 | STD OPICT,X ;RESTORE IT 43 | BRA APST8 ;ABORT APPREAR, QUIT 44 | APST6 LDA RSIZE,Y ;CHECK FOR APPEAR 45 | BMI APST2 ;YES?, TRY NEXT ALLOCATION 46 | * 47 | BEQ APST7 ;OLD EXPLOSION COMPLETED? 48 | JSR EERASE ;NO?, ERASE OLD IMAGE 49 | APST7 LDA STATUS ;CHECK IF IN GAME 50 | BITA #$80 51 | BNE APST7A ;NO?, SKIP SOUND 52 | LDD APSNDV ;PLAY APPEAR SOUND 53 | JSR SNDLDV 54 | APST7A LDA OTYP,X ;SET HYPER NOT FLAG 55 | ORA #2 56 | STA OTYP,X 57 | LDD #$AF00 ;INTIALIZE SIZE 58 | STD RSIZE,Y 59 | PULS D ;SET OBJECT PICTURE 60 | STD OBDESC,Y 61 | LEAU RAMSIZ,Y ;INITIALIZE ERASE TABLE START 62 | STU ERASES,Y 63 | STX OBJPTR,Y ;SAVE OBJECT POINTER 64 | APST8 PULS D,Y,U,PC 65 | * 66 | * EXPLOSION START 67 | * X=OBJECT POINTER 68 | * 69 | EXST PSHS U,Y,D 70 | * GET RAM ALLOCATION 71 | LDD OX16,X ;GET 16 BIT X COORDINATE 72 | SUBD BGL ;FIND SCREEN POSITION 73 | CMPA #$26 ;CHECK IF OFF SCREEN 74 | BHI EXST8 ;YES?, QUIT 75 | STD XSTART ;SAVE RELATIVE X COORDINATE 76 | LDY LSEXPL ;GET LAST EXPLOSION RAM ALLOCAT 77 | BEQ EXST2 ;ZERO?, INITIALIZE RAM ALLOCATI 78 | EXST1 LEAY RAMSIZ,Y ;ADVANCE TO NEXT RAM ALLOCATION 79 | CMPY #RAMEND ;CHECK FOR END 80 | BNE EXST3 ;NO?, CONTINUE SEARCH 81 | EXST2 LDY #RAMALS ;RESET TO START 82 | EXST3 CMPY LSEXPL ;CHECK FOR ALL APPEARS 83 | BEQ EXST8 ;YES?, QUIT 84 | EXST4 LDA RSIZE,Y ;CHECK FOR APPEAR 85 | BMI EXST1 ;YES?, TRY NEXT ALLOCATION 86 | * 87 | BEQ EXST5 ;OLD EXPLOSION COMPLETED? 88 | JSR EERASE ;NO?, ERASE OLD IMAGE 89 | EXST5 STY LSEXPL ;SAVE LAST EXPLOSION RAM ALLOCA 90 | LDD #$100 ;INITIALIZE SIZE 91 | STD RSIZE,Y 92 | LDD OPICT,X ;SAVE OBJECT PICTURE 93 | STD OBDESC,Y 94 | LEAU RAMSIZ,Y ;INITIALIZE ERASE TABLE START 95 | STU ERASES,Y 96 | LDD XSTART ;GET RELATIVE X COORD 97 | ASLB 98 | ROLA 99 | ASLB 100 | ROLA 101 | LDB OY16,X ;GET OBJECT Y COORDINATE 102 | STD TOPLFT,Y ;INITIALIZE TOP LEFT 103 | * CHECK FOR VALID CENTER 104 | SUBD CENTMP ;FIND OFFSET 105 | LDU OBDESC,Y ;GET OBJECT PICTURE 106 | ADDA ,U ;CHECK IF WITHIN PICTURE WIDTH 107 | BHS EXST6 ;NO?, MAKE NEW CENTER 108 | ADDB 1,U ;CHECK IF WITHIN PICTURE HEIGHT 109 | BHS EXST6 ;NO?, MAKE NEW CENTER 110 | LDD CENTMP ;GET CENTER 111 | BRA EXST7 ;USE IT 112 | EXST6 LDD ,U ;GET PICTURE WIDTH, HEIGHT 113 | LSRA ;DIVIDE BY 2 114 | LSRB 115 | ADDD TOPLFT,Y ;ADD TO TOP LEFT 116 | EXST7 STD CENTER,Y ;SAVE EXPLOSION CENTER 117 | EXST8 PULS D,Y,U,PC 118 | * 119 | * 120 | * EXPANDED EXPLOSION/APPEAR UPDATE ROUTINE 121 | * 122 | EXPU LDY #RAMALS ;GET START OF RAM BLOCKS 123 | EXPU1 LDA STATUS ;CHECK SYSTEM STATUS 124 | BITA #4 125 | BEQ EXPU2 ;IN PLAY?, CONTINUE EXPLOSION/A 126 | LDA RSIZE,Y ;CHECK IF EXPLOSION OR APPEAR 127 | BMI EXPU6 ;APPEAR?, KILL IT 128 | LDD #0 ;KILL EXPLOSION 129 | STD RSIZE,Y 130 | JMP EXPU9 ;NEXT OBJECT 131 | EXPU2 LDD RSIZE,Y ;CHECK SIZE 132 | LBEQ EXPU9 ;DEAD?, SKIP TO NEXT 133 | BMI EXPU4 ;APPEAR?, SKIP TO APPEAR UPDATE 134 | * EXPLOSION UPDATE 135 | ADDD #$AA ;INCREASE SIZE 136 | STD RSIZE,Y 137 | CMPA #$30 ;CHECK IF FINISHED 138 | BLS EXPU3 ;NO?, CONTINUE EXPLOSION 139 | JSR EERASE ;ERASE OBJECT 140 | LDD #0 ;KILL EXPLOSION 141 | STD RSIZE,Y 142 | BRA EXPU9 ;NEXT OBJECT 143 | EXPU3 LDD BGL ;SCROLL TOP LEXT AND CENTER 144 | ANDB #$C0 145 | PSHS D 146 | LDD BGLX 147 | ANDB #$C0 148 | SUBD ,S++ 149 | ASLB 150 | ROLA 151 | ASLB 152 | ROLA 153 | PSHS A 154 | LDA CENTER,Y 155 | ADDA ,S 156 | STA CENTER,Y 157 | LDA TOPLFT,Y 158 | ADDA ,S+ 159 | STA TOPLFT,Y 160 | BRA EXPU8 161 | * APPEAR UPDATE 162 | EXPU4 SUBD #$100 ;DECREASE SIZE 163 | STD RSIZE,Y 164 | BPL EXPU6 ;FINISHED APPEARING?, KILL APPEAR 165 | EXPU5 LDX OBJPTR,Y ;GET OBJECT POINTER 166 | LDD OX16,X ;GET 16 BIT X COORDINATE 167 | SUBD BGL ;FIND SCREEN POSITION 168 | ADDA #$C ;CHECK IF NEAR SCREEN 169 | BITA #$C0 170 | BEQ EXPU7 ;ON SCREEN?, CONTINUE 171 | EXPU6 LDD #0 ;ZERO SIZE 172 | STD RSIZE,Y 173 | LDD OBDESC,Y ;GET OBJECT PICTURE, KILL APPEAR 174 | LDX OBJPTR,Y ;GET OBJECT POINTER 175 | STD OPICT,X ;RESTORE OLD OBJECT PICTURE 176 | LDA OTYP,X ;CLEAR HYPER NOT FLAG 177 | ANDA #$FD 178 | STA OTYP,X 179 | JSR EERASE ;ERASE OBJECT 180 | BRA EXPU9 ;NEXT OBJECT 181 | EXPU7 SUBA #$C 182 | ASLB 183 | ROLA 184 | ASLB 185 | ROLA 186 | LDB OY16,X ;GET OBJECT Y COORDINATE 187 | STD TOPLFT,Y ;SET TOP LEFT 188 | LDB #$DA ;COMPUTE PHONEY CENTER 189 | MUL 190 | ASLA 191 | LDU OBDESC,Y 192 | LDB ,U 193 | MUL 194 | LDB 1,U 195 | LSRB 196 | ADDD TOPLFT,Y ;ADD TO TOP LEFT 197 | STD CENTER,Y ;SET CENTER OF APPEAR 198 | EXPU8 JSR EERASE ;ERASE EXPANDED OBJECT 199 | JSR EWRITE ;WRITE EXPANDED OBJECT 200 | EXPU9 LEAY RAMSIZ,Y ;NEXT RAM ALLOCATION 201 | CMPY #RAMEND ;CHECK FOR END 202 | LBNE EXPU1 ;NO?, CONTINUE 203 | RTS 204 | ***************************************************** 205 | * 206 | * EXPANDED ERASE ROUTINE 207 | * 208 | EERASE PSHS X,D 209 | LDD #0 ;ZERO ACCUMULATOR A 210 | LEAX RAMSIZ,Y ;GET ERASE TABLE END 211 | STX DATPTR ;SAVE ERASE TABLE END 212 | LDX ERASES,Y ;GET ERASE TABLE START 213 | CMPX DATPTR ;CHECK FOR NO BLOCKS 214 | BEQ EERAS2 ;YES?, QUIT 215 | EERAS1 STD [,X++] ;ERASE BLOCK 216 | CMPX DATPTR ;CHECK IF FINISHED 217 | BNE EERAS1 ;NO, ERASE NEXT BLOCK 218 | STX ERASES,Y ;SET ERASE TABLE START TO SAME 219 | EERAS2 PULS D,X,PC 220 | * 221 | * EXPANDED WRITE ROUTINE 222 | * 223 | EWRITE PSHS U,Y,X,D 224 | STY BLKADD ;SAVE BLOCK ADDRESS 225 | LDA RSIZE,Y ;GET SIZE 226 | ANDA #$7F ;REMOVE APPEAR/EXPLOSION FLAG 227 | STA SIZE 228 | LEAU RAMSIZ,Y ;GET ERASE TABLE END 229 | CLR FLAVOR ;ZERO FLAVOR 230 | LDX OBDESC,Y ;GET OBJECT DESCRIPTER ADDRESS 231 | LDD 2,X ;GET DATA ADDRESS 232 | STD DATPTR ;INITIALIZE DATA POINTER 233 | LDD ,X ;GET OBJECT WIDTH,LENGTH 234 | STA WIDTHC ;INITIALIZE OBJECT WIDTH COUNTE 235 | STB LENGTC ;INITIALIZE OBJECT LENGTH COUNT 236 | BITB #1 ;CHECK ODD/EVEN 237 | BNE EXPN2 238 | LDX #NEXCOL ;EVEN 239 | BRA EXPN3 240 | EXPN2 LDX #ODD ;ODD 241 | EXPN3 STX ODDEVN 242 | LDD CENTER,Y ;GET EXPANSION CENTER 243 | SUBD TOPLFT,Y ;SUBTRACT TOP LEFT ADDRESS 244 | STA XOFF ;SAVE X OFFSET 245 | LSRB ;DIVIDE Y OFFSET BY TWO 246 | STB YOFF ;SAVE Y OFFSET 247 | ROL FLAVOR ;SAVE FLAVOR 248 | LDA SIZE ;GET SIZE 249 | LDB XOFF ;GET X OFFSET 250 | MUL ;MULTIPLY 251 | STD XSTART ;SAVE X OFFSET * SIZE 252 | LDB CENTER,Y ;GET X COMPONENT OF CENTER 253 | CLRA 254 | SUBD XSTART ;SUBTRACT X OFFSET * SIZE 255 | STD XSTART ;SAVE X STARTING POSITION 256 | EXPN4 TSTA ;CHECK IF ON SCREEN 257 | BEQ EXPN5 ;YES?, CONTINUE 258 | LDD DATPTR ;GET DATA POINTER 259 | ADDB LENGTC ;SKIP FIRST COLUMN 260 | ADCA #0 261 | STD DATPTR ;SAVE DATA POINTER 262 | DEC WIDTHC ;DECREMENT WIDTH COUNTER 263 | LBEQ DONE ;NOT ON SCREEN?, QUIT 264 | LDD XSTART ;GET X STARTING POSITION 265 | ADDB SIZE ;ADVANCE X TO NEXT STARTING POS 266 | ADCA #0 267 | STD XSTART ;SAVE X STARTING POSITION 268 | BRA EXPN4 269 | EXPN5 CMPB #$98 ;CHECK IF OFF SCREEN 270 | LBHI DONE ;YES?, QUIT 271 | LDA SIZE ;GET SIZE 272 | ASLA ;MULTIPLY BY 2 273 | STA DSIZE ;SAVE DOUBLE SIZE 274 | LDB YOFF ;GET Y OFFSET 275 | MUL ;MULTIPLY 276 | STD YSTART ;SAVE Y OFFSET * DOUBLE SIZE 277 | LDB CENTER+1,Y ;GET Y COMPONENT OF CENTER 278 | CLRA 279 | SUBD YSTART ;SUBTRACT Y OFFSET * SIZE 280 | SUBB FLAVOR ;SUBTRACT FLAVOR 281 | ADCA #0 282 | CLR YSKIP ;ZERO Y SKIP COUNTER 283 | EXPN6 TSTA ;CHECK IF ON SCREEN 284 | BNE EXPN7 ;NOT YET?, FIND FIRST Y BLOCK 285 | CMPB #$2A ;CHECK IF IN SCANNER 286 | BHS EXPN8 ;NO?, CONTINUE 287 | EXPN7 INC YSKIP ;ADVANCE Y SKIP COUNTER 288 | DEC LENGTC ;DECREMENT LENGTH COUNTER TWICE 289 | DEC LENGTC 290 | LBLE DONE ;NOT ON SCREEN?, QUIT 291 | ADDB DSIZE ;ADVANCE Y TO NEXT STARTING POS 292 | ADCA #0 293 | BRA EXPN6 294 | EXPN8 STD YSTART ;SAVE Y STARTING POSITION 295 | LDA LENGTC ;GET LENGTH COUNTER 296 | ANDA #$FE ;TRUNCATE ODD/EVEN 297 | LDX #STARTS ;GET STARTING POINT TABLE ADDRE 298 | LDX A,X ;GET STARTING POINT 299 | STX VSTART ;SAVE STARTING ADDRESS 300 | LDX DATPTR ;GET DATA POINTER 301 | ASL YSKIP ;DOUBLE Y SKIP COUNTER 302 | LDA XSTART+1 ;GET X SCREEN POSITION 303 | * MAIN LOOP 304 | EXPN9 LDB YSKIP ;GET Y SKIP 305 | ABX ;ADD TO DATA POINTER 306 | LDB YSTART+1 ;GET Y SCREEN POSITION 307 | JMP [VSTART] ;JUMP TO WRITING 308 | STRTEF STD ,--U ;SAVE ON ERASE TABLE 309 | LDY ,X++ ;GET DATA BLOCK 310 | STY [,U] ;WRITE TO SCREEN 311 | ADDB DSIZE ;MOVE POINTER DOWN 312 | BCS EXPN10 ;OFF SCREEN?, QUIT THIS COLUMN 313 | STRTCD STD ,--U ;SAVE ON ERASE TABLE 314 | LDY ,X++ ;GET DATA BLOCK 315 | STY [,U] ;WRITE TO SCREEN 316 | ADDB DSIZE ;MOVE POINTER DOWN 317 | BCS EXPN11 ;OFF SCREEN?, QUIT THIS COLUMN 318 | STRTAB STD ,--U ;SAVE ON ERASE TABLE 319 | LDY ,X++ ;GET DATA BLOCK 320 | STY [,U] ;WRITE TO SCREEN 321 | ADDB DSIZE ;MOVE POINTER DOWN 322 | BCS EXPN12 ;OFF SCREEN?, QUIT THIS COLUMN 323 | STRT89 STD ,--U ;SAVE ON ERASE TABLE 324 | LDY ,X++ ;GET DATA BLOCK 325 | STY [,U] ;WRITE TO SCREEN 326 | ADDB DSIZE ;MOVE POINTER DOWN 327 | BCS EXPN13 ;OFF SCREEN?, QUIT THIS COLUMN 328 | STRT67 STD ,--U ;SAVE ON ERASE TABLE 329 | LDY ,X++ ;GET DATA BLOCK 330 | STY [,U] ;WRITE TO SCREEN 331 | ADDB DSIZE ;MOVE POINTER DOWN 332 | BCS EXPN14 ;OFF SCREEN?, QUIT THIS COLUMN 333 | STRT45 STD ,--U ;SAVE ON ERASE TABLE 334 | LDY ,X++ ;GET DATA BLOCK 335 | STY [,U] ;WRITE TO SCREEN 336 | ADDB DSIZE ;MOVE POINTER DOWN 337 | BCS EXPN15 ;OFF SCREEN?, QUIT THIS COLUMN 338 | STRT23 STD ,--U ;SAVE ON ERASE TABLE 339 | LDY ,X++ ;GET DATA BLOCK 340 | STY [,U] ;WRITE TO SCREEN 341 | ADDB DSIZE ;MOVE POINTER DOWN 342 | BCS EXPN16 ;OFF SCREEN?, QUIT THIS COLUMN 343 | STRT01 JMP [ODDEVN] ;ODD?, WRITE MORE, EVEN?, NEXT 344 | ODD BCS EXPN17 ;OFF SCREEN?, INCREMENT DATA PO 345 | STD ,--U ;SAVE ON ERASE TABLE 346 | LDB ,X+ ;GET DATA BYTE 347 | STB [,U] ;WRITE TO SCREEN 348 | BRA NEXCOL 349 | EXPN10 LEAX 12,X ;SKIP DATA POINTER PAST BELOW S 350 | JMP [ODDEVN] ;ODD?, INCREMENT DATA POINTER, 351 | EXPN11 LEAX 10,X ;SKIP DATA POINTER PAST BELOW S 352 | JMP [ODDEVN] ;ODD?, INCREMENT DATA POINTER, 353 | EXPN12 LEAX 8,X ;SKIP DATA POINTER PAST BELOW S 354 | JMP [ODDEVN] ;ODD?, INCREMENT DATA POINTER, 355 | EXPN13 LEAX 6,X ;SKIP DATA POINTER PAST BELOW S 356 | JMP [ODDEVN] ;ODD?, INCREMENT DATA POINTER, 357 | EXPN14 LEAX 4,X ;SKIP DATA POINTER PAST BELOW S 358 | JMP [ODDEVN] ;ODD?, INCREMENT DATA POINTER, 359 | EXPN15 LEAX 2,X ;SKIP DATA POINTER PAST BELOW S 360 | JMP [ODDEVN] ;ODD?, INCREMENT DATA POINTER, 361 | EXPN16 JMP [ODDEVN] ;ODD?, INCREMENT DATA POINTER, 362 | EXPN17 LEAX 1,X ;SKIP DATA POINTER PAST BOTTOM 363 | NEXCOL DEC WIDTHC ;DECREMENT WIDTH COUNTER 364 | BEQ DONE ;END OF OBJECT?, QUIT 365 | ADDA SIZE ;NEXT COLUMN 366 | BCS DONE ;WAY OFF SCREEN?, QUIT 367 | CMPA #$98 ;CHECK IF OFF SCREEN 368 | LBLS EXPN9 ;NO?, NEXT COLUMN 369 | DONE LDX BLKADD ;GET BLOCK ADDRESS 370 | STU ERASES,X ;SAVE ERASE TABLE START 371 | LDD CENTER,X ;GET CENTER BLOCK ADDRESS 372 | CMPA #$98 ;CHECK IF OFF SCREEN 373 | BHI DONE1 ;YES?, DO NOT ERASE 374 | SUBB FLAVOR ;SUBTRACT FLAVOR 375 | LDX #0 ;ERASE CENTER BLOCK 376 | STX D,X 377 | DONE1 PULS D,X,Y,U,PC ;RESTORE REGISTERS, QUIT 378 | * STARTING POINT TABLE 379 | STARTS FDB STRT01,STRT23,STRT45,STRT67 380 | FDB STRT89,STRTAB,STRTCD,STRTEF 381 | END 382 | -------------------------------------------------------------------------------- /src/phr6.src: -------------------------------------------------------------------------------- 1 | * TTL ; D E F E N D E R 1.0 2 | * NMLIST 3 | * NOGEN 4 | * 5 | * RAM DECLARATIONS AND CONSTANTS 6 | * 7 | * HARDWARE CONSTANTS 8 | * 9 | CKBYT EQU $FF ;CHECKSUM 10 | HSTK EQU $BFFF 11 | MAPC EQU $D000 ;MAP CONTROL 12 | RAM EQU $A000 13 | CRAM EQU $C000 ;COLOR RAM ADDR 14 | WDOG EQU $C3FC 15 | WDATA EQU $38 ;NORMAL SCREEN;($39=FLIPPED) 16 | DIABLK EQU 3 17 | CMOS EQU $C400 18 | SOUND EQU $CC02 19 | VERTCT EQU $C800 ;6-BIT VERTICAL BEAM ADDR 20 | YMAX EQU 240 21 | YMIN EQU 42 ;MIN Y COORD 22 | * 23 | *BLOCK 7 24 | *TERRAIN,PLAYER EXPLOSION,WAVE TABLE 25 | BGINIT EQU $C000 26 | BGOUT EQU $C003 27 | ALINIT EQU $C006 ;ALTITUDE INIT 28 | BGERAS EQU $C009 ;HYPER ROUTINE 29 | PXVCT EQU $C00E ;PLAYER EXPLOSION 30 | WVTAB EQU $C011 ;WAVE DATA TABLE 31 | WVTEND EQU $C013 32 | * 33 | *BLOCK 2 34 | *TEXT AND CHARACTERS 35 | N0V EQU $C000 ;NUMERALS 36 | WTBV EQU $C002 ;WRITE BLOCK 37 | WNBV EQU $C00E 38 | *MESSAGES 39 | PLYR1 EQU $C0EF ;PLAYER 1 40 | PLYR2 EQU $C0F1 ;PLAYER 2 41 | BONSX EQU $C0F3 ;BONUS X 42 | GO EQU $C075 ;GAME OVER 43 | ATWV EQU $C0F9 ;ATTACK WAVE 44 | COMPV EQU $C0FB ;COMPLETED 45 | * 46 | *DIAGNOSTIC BLOCK VECTORS 47 | *BLK 3 48 | VORAOK EQU $C000 ;ROM RAM OK 49 | VOOKRB EQU $C003 ;ROM OK, RAM BAD 50 | VOMBAD EQU $C006 ;ROM BAD 51 | VPWRUP EQU $C009 ;PWRUP 52 | VAUD EQU $C00C ;AUDIT 53 | VAUD1 EQU $C00F ;ADD 1 TO AUDIT 54 | LCOINV EQU $C012 ;LEFT COIN 55 | RCOINV EQU $C015 ;RIGHT COIN 56 | CCOINV EQU $C018 ;CENTER COIN 57 | RHSTDV EQU $C01B ;RESET HSTD 58 | VCMOSM EQU $C01E 59 | VUDITG EQU $C021 60 | VUTOCY EQU $C024 ;AUTO CYCLE 61 | VCROM0 EQU $C027 ;FAILURE MODES 62 | VRAM10 EQU $C02A 63 | VRAM20 EQU $C02D 64 | VOUND0 EQU $C030 65 | RHSTDS EQU $C033 ;RESET TODAYS GREATS 66 | * 67 | *ATTRACT MODE VECTORS 68 | *BLK 1 69 | ATTRV EQU $C000 ;START ATTRACT 70 | SCNRV EQU $C003 ;SCANNER SUBROUTINE 71 | * 72 | *MAIN PROGRAM VECTORS 73 | * 74 | NULOBV EQU $FF9D 75 | RMAPV EQU $FF9F ;ROM MAP 76 | RCAV EQU $FFA1 ;READ CMOS IN A 77 | RCBV EQU $FFA4 ;READ CMOS IN B 78 | RCDV EQU $FFA7 ;READ CMOS IN D 79 | WCAV EQU $FFAA ;WRITE IN A 80 | WCBV EQU $FFAD ;WRITE IN B 81 | WCDV EQU $FFB0 ;WRITE IN D 82 | CWRITV EQU $FFB3 ;CWRITE 83 | COFFV EQU $FFB6 ;COFF 84 | BLKCLV EQU $FFB9 85 | SCRCLV EQU $FFBC ;SCREEN CLEAR 86 | ROMOV EQU $FFBF 87 | ROM9V EQU $FFC2 88 | RAM2V EQU $FFC5 89 | VAMEOV EQU $FFC8 ;TEST EXIT 90 | BGIV EQU $FFCB ;BACKGROUND INIT 91 | LJSRV EQU $FFCE ;LONG JSR W/ BLOCK SWAP+SAVE 92 | SLEPPV EQU $FFD1 ;SLEEP WITH BLOCK SAVE 93 | STBXBV EQU $FFD4 ;STORE B AT X BLOCK ZERO 94 | LDBXBV EQU $FFD7 ;LOAD B AT X BLOCK ZERO 95 | SNDLDV EQU $FFDA ;SOUND ROUTINE 96 | APSNDV EQU $FFDD ;APPEAR SOUND 97 | * 98 | *EXPLOSION, APPEAR VECTORS 99 | * 100 | APVCT EQU $FC60 ;APPEAR 101 | XSVCT EQU $FC63 ;EXPLOSION 102 | XUVCT EQU $FC66 ;EXPLOSION UPDATE 103 | ALTBL EQU $B300 104 | * 105 | * EXPLOSION,APPEAR EQUATES 106 | * 107 | RSIZE EQU 0 ;SIZE (MSB IS APPEAR FLAG) 108 | OBDESC EQU 2 ;OBJECT DESCRIPTER ADDRESS 109 | ERASES EQU 4 ;ERASE TABLE START 110 | CENTER EQU 6 ;CENTER OF EXPANSION 111 | TOPLFT EQU 8 ;NORMAL SIZE TOP LEFT ADDRESS 112 | OBJPTR EQU 10 ;OBJECT LIST POINTER (APPEAR ONLY) 113 | RAMSIZ EQU $40 ;LENGTH OF RAM ALLOCATION 114 | RAMEND EQU $A000 ;RAM ALLOCATION END + 1 115 | EXPLSV EQU $DC00 ;EXPLOSION START VECTOR 116 | APERSV EQU $DC02 ;APPEAR START VECTOR 117 | EXPNUV EQU $DC04 ;EXPANDED UPDATE VECTOR 118 | * 119 | *PIA DEFINITIONS 120 | * 121 | PIA0 EQU $CC00 122 | *B0 AUTO UP 123 | *B1 ADVANCE 124 | *B2 RCOIN 125 | *B3 HSRESET 126 | *B4 LCOIN 127 | *B5 CCOIN 128 | *B6 LED1 129 | *B7 LED2 130 | *CA2 SLAM 131 | *CA1 IRQ 132 | PIA1 EQU $CC02 133 | *B0-B5 SOUND 134 | *B6-B7 LEDS 135 | *CB2 IRQ 136 | PIA2 EQU $CC04 137 | *B0 FIRE 138 | *B1 THRUST 139 | *B2 SMART BOMB 140 | *B3 HYPERSPACE 141 | *B4 START 2 142 | *B5 START 1 143 | *B6 REV 144 | *B7 DOWN 145 | * 146 | PIA3 EQU $CC06 147 | *B0 UP 148 | *B7 INPUT 1=COCKTAIL 149 | *CB2 OUTPUT SWITCH MUX CONTROL 1=PLAYER1,0=PLAYER2 150 | *SCORE DISPLAY CONSTANTS 151 | P1SBD EQU $291B 152 | P2SBD EQU $8B1B 153 | P1DISP EQU $0F1C ;TOP LEFT PLAYER 1 154 | P2DISP EQU $711C ;TOP LEFT PLAYER 2 155 | DIGLTH EQU 4*256 ;DIGIT LENGTH 156 | P1LAT EQU $0F14 157 | P2LAT EQU $7114 158 | SCANH EQU YMIN-34 ;SCANNER HEIGHT 159 | SCANER EQU $3000+SCANH ;SCANNER 160 | * 161 | * CMOS RAM ALLOCATION 162 | * 163 | ORG CMOS 164 | DIPFLG RMB 1 ;DIPSW SET FLAG 165 | SLOT1 RMB 4 ;LEFT COIN TOTAL 166 | SLOT2 RMB 4 ;CENTER COIN TOTAL 167 | SLOT3 RMB 4 ;RIGHT COIN TOTAL 168 | TOTPDC RMB 4 ;TOTAL PAID CREDITS 169 | TOTRPL RMB 4 ;TOTAL REPLAYS 170 | BLLTIM RMB 4 ;BALL TIME IN MINS 171 | BLLCNT RMB 4 ;TOTAL "BALLS" PLAYED 172 | CMSDEF EQU * 173 | CRHSTD RMB 12 ;FOR ALL TIME HSTD 174 | RMB 12 ;ALL TIME #2 175 | RMB 12 176 | RMB 12 177 | RMB 12 178 | RMB 12 179 | RMB 12 180 | RMB 12 181 | CREDST EQU * ;CREDITS BACKUP 182 | DIPSW RMB 2 ;DIPSW FUNCTIONS WHEN DIPFLG SET 183 | ORG CMOS+$7F ;PUT IT ACCROSS BOUNDARY 184 | CMOSCK RMB 2 ;FOR BOUNDARY BYTE 185 | REPLAY RMB 4 ;REPLAY LEVEL 186 | NSHIP RMB 2 ;# OF SHIPS/GAME 187 | COINSL RMB 2 ;FOR COINAGE SELECT MODE 188 | SLOT1M RMB 2 ;LEFT COIN MULT 189 | SLOT2M RMB 2 ;CENTER COIN MULT 190 | SLOT3M RMB 2 ;RIGHT COIN MULT 191 | CUNITC RMB 2 ;COIN UNITS PER CREDIT 192 | CUNITB RMB 2 ;COIN UNITS FOR BONUS 193 | MINUNT RMB 2 ;MINIMUM REQD 194 | FREEPL RMB 2 ;FREE PLAY MODE 195 | GA1 RMB 2 ;GAME ADJUSTS - 1 DIFFICULTY 196 | RMB 2 ;2 DIFFICULTY CEILING 197 | RMB 2 ;3 BGSND 198 | RMB 2 ;4 RESTORE WAVE # 199 | RMB 2 ;5 200 | RMB 2 ;6 201 | RMB 2 ;7 202 | RMB 2 ;8 203 | RMB 2 ;9 204 | RMB 2 ;10 205 | * 206 | *EXPLOSION RAM ALLOCATION 207 | * 208 | ORG $9C00 209 | RAMALS RMB RAMEND-RAMALS 210 | * 211 | *BASE PAGE RAM AREA 212 | * 213 | ORG RAM 214 | BGSAV RMB 32 ;RESERVED FOR TERRAIN 215 | BGL RMB 2 ;TERRAIN LEFT POINTER 216 | BGLX RMB 2 ;OLD TERRAIN LEFT 217 | GTIME RMB 1 ;GAME TIMER 218 | PDFLG RMB 1 ;SPACE HOLDER PLAYER DIED 219 | PCRAM RMB 16 ;PSEUDO COLOR RAM 220 | MAPCR RMB 1 221 | CREDIT RMB 1 222 | CUNITS RMB 1 223 | BUNITS RMB 1 224 | TEMP1A RMB 1 225 | TEMP1B RMB 1 226 | TEMP1C RMB 1 227 | TEMP2A RMB 2 228 | TEMP2B RMB 2 229 | TEMP2C RMB 2 230 | TEMP2D RMB 2 231 | TEMP2E RMB 2 232 | ASBUFF RMB 1 ;ADVANCE SWITCH WITH AUTO BUFFER 233 | ASLAST RMB 1 ;ADVANCE SWITCH WITH AUTO LAST POSITION 234 | ASCNTR RMB 1 ;ADVANCE SWITCH WITH AUTO COUNTER 235 | CURSR2 RMB 2 ;USER CURSER 236 | CHARSP RMB 1 ;HORIZONTAL SPACE BETWEEN CHARACTERS(TEXT ROUTINE) 237 | LINESP RMB 1 ;VERTICAL SPACING BETWEEN LINE CENTERS(TEXT ROUTINE) 238 | TOPL RMB 2 ;TOP LEFT ADDRESS(TEXT ROUTINE) 239 | CURSER RMB 2 ;CURSER ADDRESS(TEXT ROUTINE) 240 | MESPT RMB 2 ;MESSAGE POINTER(TEXT ROUTINE) 241 | WORDPT RMB 2 ;WORD POINTER(TEXT ROUTINE) 242 | MESEND RMB 2 ;MESSAGE END(TEXT ROUTINE) 243 | SPACEF RMB 1 ;SPACE FLAG(TEST ROUTINE) 244 | NUMBER RMB 2 ;NUMBER(NUMBER ROUTINE) 245 | ROMPTR RMB 2 ;ROM TABLE POINTER(COMPREHENSIVE ROM TEST) 246 | TIMER RMB 1 ;FIRQ TIMER 247 | OVCNT RMB 1 248 | ACTIVE RMB 2 ;POINTER TO LIST OF CURRENTLY ACTIVE (SLEEPING) PROCS. 249 | FREE RMB 2 ;POINTER TO LIST OF UNALLOCATED PROCESS SLEEP SPACE. 250 | CRPROC RMB 2 ;POINTER TO SLEEP AREA OF CURRENTLY EXECUTING PROCESS. 251 | OPTR RMB 2 ;OBJECT LIST POINTER 252 | OFREE RMB 2 ;FREE LIST POINTER 253 | SPFREE RMB 2 ;SUPER PROCESS FREE LIST 254 | IPTR RMB 2 ;INACITVE OBJECT LIST PTR 255 | SPTR RMB 2 ;SHELL LIST POINTER 256 | ITEMP RMB 2 ;INTERUPT TEMP 257 | ITEMP2 RMB 2 258 | XTEMP RMB 2 ;SAVE AREA FOR QUICK TEMPORARY 259 | XTEMP2 RMB 2 260 | TEMP48 RMB 2 ;OUTPUT ROUTINE TEMP 261 | PIA01 RMB 1 262 | PIA02 RMB 1 263 | PIA21 RMB 1 ;N-1 PIA2 264 | PIA22 RMB 1 ;N-2 PIA2 265 | PIA31 RMB 1 ;N-1 PIA3 266 | SLMCNT RMB 1 ;SLAM,COIN DEBOUNCERS 267 | LCCNT RMB 1 268 | RCCNT RMB 1 269 | CCCNT RMB 1 270 | SWPROC RMB 8 ;SWITCH SCAN TEMP 271 | SCRFLG RMB 1 ;PLAYER SCORE FLAG 272 | CURPLR RMB 1 ;CURRENT 273 | PLRCNT RMB 1 ;NUMBER OF PLAYERS 274 | PLRX RMB 2 ;CURRENT PLAYER INDEX STORE 275 | IRQHK RMB 3 ;IRQ RAM VECTOR 276 | IFLG RMB 1 ;IRQ FLAG 277 | PCX RMB 2 278 | BGDELT RMB 2 279 | SETEND RMB 2 ;SCANNER ERASE TABLE END 280 | BMBCNT RMB 1 ;BOMBS ACTIVE 281 | SBFLG RMB 1 ;SMART BOMB FLAG 282 | TPTR RMB 2 ;TARGET LIST INDEX 283 | SHTEMP RMB 2 ;SHELL ROUTINE 284 | THX RMB 2 ;THRUST TABLE INDEX 285 | XXX1 RMB 1 ;SCREEN OUTPUT PARAMS 286 | XXX2 RMB 1 287 | XXX3 RMB 1 288 | FISX RMB 2 ;LAS FISSLE TABLE INDEX 289 | BAX RMB 2 ;BOMB IMAGE PTR 290 | FBX RMB 2 ;FIREBALL INDEX 291 | TFLG RMB 1 ;TIE DIRECTION 292 | REPLA RMB 2 ;REPLAY LEVEL 293 | THFLG RMB 1 ;THRUST SOUND FLAG 294 | STRCNT RMB 1 ;STARS ACTIVE COUNT 295 | REVFLG RMB 1 ;REV SWITCH DEBOUNCE 296 | *SOUND RAM 297 | SNDX RMB 2 ;TABLE INDEX 298 | SNDPRI RMB 1 ;PRIORITY 299 | SNDTMR RMB 1 300 | SNDREP RMB 1 301 | *LASER DATA STRUCTURE 302 | LFLG RMB 1 303 | LCOLRX RMB 1 304 | PWRFLG RMB 1 ;POWER ON FLAG 305 | WCURS RMB 2 ;WILLI CURSER CHECK 306 | * 307 | *STATUS FLAG 308 | *B7=GAME OVER 309 | *B6=PLAYER CONTROLS INACTIVE 310 | *B5=STARS,OBJECTS,SHELLS 311 | *B4=PLAYER IMAGE COLLISION INACTIVE 312 | *B3=PLAYER DEAD 313 | *B2=APPEARS,EXPLOSIONS DISABLE 314 | *B1=TERRAIN INACTIVE 315 | *B0=PLAYER START DELAY-NO HYPER 316 | STATUS RMB 1 317 | * 318 | *PLAYER DIRECTION+THRUST 319 | NPLAD RMB 2 ;NEW PLAYER DIRECTION 320 | PLADIR RMB 2 321 | *PLAYER COORDINATES 322 | *UPPER LEFT 323 | PLAXC RMB 1 324 | PLAYC RMB 1 325 | *NEW 326 | NPLAXC RMB 1 327 | NPLAYC RMB 1 328 | *16 BIT 329 | PLAX16 RMB 2 330 | PLAY16 RMB 2 331 | *PLAYER VELOCITY 332 | PLAXV RMB 3 333 | PLAYV RMB 2 334 | *ABSOLUTE X 335 | PLABX RMB 2 336 | * 337 | *COLLISION ROUTINE PARAMETERS 338 | * 339 | XCNT RMB 1 ;SCAN COUNTS 340 | YCNT RMB 1 341 | OX1 RMB 1 ;OFFSETS 342 | OY1 RMB 1 343 | PX1 RMB 1 344 | PY1 RMB 1 345 | OBHT RMB 1 ;HT TEMPS 346 | PLHT RMB 1 347 | ULX RMB 1 ;UPPER LEFT COORD 348 | ULY RMB 1 ;" 349 | LRX RMB 1 350 | LRY RMB 1 351 | CTEMP RMB 2 ;INDEX TEMP 352 | CTEMP2 RMB 2 353 | PCFLG RMB 1 ;PLAYER COLLISION 354 | *RANDOM VARIABLES 355 | SEED RMB 1 356 | HSEED RMB 1 357 | LSEED RMB 1 358 | * 359 | *EXPLOSION DIRECT PAGE VARIABLES 360 | * 361 | LSEXPL RMB 2 ;LAST EXPLOSION RAM 362 | XOFF RMB 1 363 | YOFF RMB 1 364 | FLAVOR RMB 1 365 | SIZE RMB 1 366 | DSIZE RMB 1 367 | XSTART RMB 2 368 | YSTART RMB 2 369 | ODDEVN RMB 2 370 | VSTART RMB 2 371 | WIDTHC RMB 1 372 | LENGTC RMB 1 373 | DATPTR RMB 2 374 | YSKIP RMB 1 375 | BLKADD RMB 2 376 | CENTMP RMB 2 377 | *ASTRONAUT COUNT 378 | ASTCNT RMB 1 379 | * 380 | *ENEMIES LIST 381 | *WARNING DO NOT CHANGE ORDER OF COUNTS 382 | ELIST EQU * 383 | *RESERVE COUNTS 384 | LNDRES RMB 1 ;# OF LANDERS 385 | TIERES RMB 1 ;" 386 | PRBRES RMB 1 387 | SCZRES RMB 1 388 | SWMRES RMB 1 389 | ELIST1 EQU * 390 | WAVTIM RMB 1 ;TIME FOR NEXT WAVE 391 | WAVSIZ RMB 1 ;SIZE OF WAVE 392 | LNDXV RMB 1 ;LANDER HORIZ VEL 393 | LNDYV RMB 2 394 | LDSTIM RMB 1 ;LANDER SHOOT TIME 395 | TIEXV RMB 1 396 | SZRY RMB 1 ;SHITZO RANDOM Y JUMP 397 | SZYV RMB 2 ;Y VEL 398 | SZXV RMB 1 399 | SZSTIM RMB 1 ;SHOT TIMER 400 | SWXV RMB 1 ;SWARM X V 401 | SWSTIM RMB 1 ;SWARM SHOT TIMER 402 | SWAC RMB 1 ;SWARM ACCEL MASK 403 | UFOTIM RMB 1 ;UFO TIMER 404 | UFSTIM RMB 1 ;" SHOTS 405 | UFOSK RMB 1 ;UFO SEEK PROBABILITY 406 | ELEND EQU * 407 | *ACTIVE COUNTS, NON RESTORE 408 | ECNTS EQU * 409 | LNDCNT RMB 1 410 | TIECNT RMB 1 411 | PRBCNT RMB 1 412 | SCZCNT RMB 1 413 | SWCNT RMB 1 414 | WAVTMR RMB 1 415 | UFOTMR RMB 1 416 | UFOCNT RMB 1 417 | ECEND EQU * 418 | * 419 | *TARGET LIST 420 | * 421 | TLIST EQU * 422 | RMB 40 423 | TLEND EQU * 424 | * 425 | *LASER FISSLE TABLE 426 | * 427 | FISTAB RMB 32 428 | FISEND EQU * 429 | * 430 | *THRUST TABLE 431 | * 432 | HSRFLG EQU * ;HIGH SCORE RESET FLAG(ATTRACT MODE) 433 | THTAB RMB 64 434 | THTEND EQU * 435 | *FIREBALL TABLE 436 | FBTAB RMB 32 437 | FBTEND EQU * 438 | * 439 | *PLAYER DATA TABLE 440 | * 441 | PLDATA EQU * 442 | P1SCR RMB 4 ;SCORE MSB 1ST 443 | P1RP RMB 3 ;NEXT REPLAY LEVEL 444 | P1LAS RMB 1 ;#OF LASERS 445 | P1WAV RMB 1 ;WAVE # IN HEX 446 | P1SBC RMB 1 ;SMART BOMBS 447 | P1TRG RMB 1 ;ASTRONAUTS 448 | P1ENM RMB 50 ;ENEMY STATE 449 | P1END EQU * 450 | P2SCR RMB 4 451 | P2RP RMB 3 452 | P2LAS RMB 1 453 | P2WAV RMB 1 454 | P2SBC RMB 1 455 | P2TRG RMB 1 456 | P2ENM RMB 50 457 | PLDEND EQU * ;END OF PLAYER DATA 458 | PLDLEN EQU P1END-PLDATA 459 | PSCOR EQU P1SCR-PLDATA 460 | PRPLA EQU P1RP-PLDATA 461 | PLAS EQU P1LAS-PLDATA 462 | PWAV EQU P1WAV-PLDATA 463 | PSBC EQU P1SBC-PLDATA 464 | PTARG EQU P1TRG-PLDATA 465 | PENEMY EQU P1ENM-PLDATA 466 | * 467 | *MASTER OBJECT LIST 468 | * 469 | OLIST EQU * 470 | OSIZE EQU $17 471 | * 472 | *INDEX OFFSETS 473 | * 474 | OLINK EQU 0 ;LINK TO NEXT 475 | OPICT EQU 2 ;PICTURE DESCRIPTOR ADDR 476 | OBJX EQU 4 ;UPPER LEFT SCREEN X 477 | OBJY EQU 5 ;UPPER LEFT SCREEN Y 478 | OBJID EQU 6 ;ASSOCIATED PROCESS ID (IF ANY) 479 | OCVECT EQU 8 ;COLLISION ROUTINE ADDR 480 | OX16 EQU $A ;16 BIT X WORLD COORD 481 | OY16 EQU $C ;16 BIT Y WORLD COORD 482 | OXV EQU $E ;X VELOCITY 483 | OYV EQU $10 ;Y VELOCITY 484 | OBJCOL EQU $12 ;SCANNER BLIP 485 | OTYP EQU $14 ;OBJECT TYPE 486 | ODATA EQU $15 ;MISC. DATA 487 | *RESERVE AREA 488 | RMB (95)*OSIZE 489 | OLEND EQU * 490 | * 491 | *USER DEFINED OBJECT TYPES 492 | *0=NORMAL,HYPERABLE 493 | *1=LANDER PICKING UP NON-HYP 494 | *2(BIT 1)= APPEAR NON-HYP 495 | *$10=EARTHLING NON-HYP,NON SMART BOMB 496 | *$11=SIGN POST NON-HYP,NON SB 497 | * 498 | *USER DEFINED PROCESS TYPES 499 | * 500 | STYPE EQU $00 ;SYSTEM PROCESS 501 | ATYPE EQU $01 502 | CTYPE EQU $02 503 | * 504 | *SLEEPING PROCESS TABLE 505 | * 506 | PTAB EQU * 507 | * 508 | *OFFSET CONSTANTS 509 | * 510 | PLINK EQU 0 511 | PADDR EQU 2 512 | PTIME EQU 4 513 | PTYPE EQU 5 514 | PCOD EQU 6 515 | PDATA EQU 7 516 | PD EQU 7 517 | PD1 EQU 8 518 | PD2 EQU 9 519 | PD3 EQU 10 520 | PD4 EQU 11 521 | PD5 EQU 12 522 | PD6 EQU 13 523 | PD7 EQU 14 524 | PSIZE EQU 15 525 | RMB 15*(75) 526 | TABEND EQU * 527 | * 528 | *SUPER PROCESSES 529 | * 530 | SPSIZE EQU PSIZE+8 531 | SPTAB RMB SPSIZE*5 532 | SPTEND EQU * 533 | * 534 | *STAR DATA STRUCTURE 535 | * 536 | SMAP EQU * 537 | SSX RMB 1 538 | SSY RMB 1 ;X,Y COORDS 539 | SSCOL RMB 1 540 | RMB 1 ;WASTER 541 | SNUM EQU 16 542 | SLGTH EQU 4 543 | RMB (SNUM-1)*SLGTH ;RESERVE SPACE 544 | SMEND EQU * 545 | *OFFSET CONSTANTS 546 | SX EQU 0 547 | SY EQU SSY-SSX 548 | SCOL EQU SSCOL-SSX 549 | * 550 | *MONOCHROME TABLE 551 | * 552 | MONOTB RMB 128 553 | * 554 | *SCANNER ERASE TABLES 555 | * 556 | SETAB RMB 200 ;OBJECTS 557 | STETAB RMB 128 ;TERRAIN 558 | * 559 | *OBJECT PICTURE STRUCTURE 560 | * 561 | OBJW EQU 0 562 | OBJH EQU 1 563 | OBJP0 EQU 2 564 | OBJP1 EQU OBJP0+2 565 | OBJWRT EQU OBJP0+4 566 | OBJDEL EQU OBJP0+6 567 | OBJL EQU OBJDEL+2 568 | * 569 | *HI SCORE TABLE 570 | *STORED MSB-LSB XYZ 571 | ORG $B260 572 | THSTAB RMB 12*8 ;TODAYS 573 | * 574 | *M A C R O S 575 | * 576 | SHL MACRO \1,\2,\3 577 | JSR GETSHL 578 | FDB \1,\2,\3 579 | ENDM 580 | KILP MACRO \1,\2 581 | JSR KILPOS 582 | FDB \1 583 | FDB \2 584 | ENDM 585 | KILO MACRO \1,\2 586 | JSR KILOS 587 | FDB \1 588 | FDB \2 589 | ENDM 590 | *INIT OBJECT 591 | OBI MACRO \1,\2,\3 592 | JSR OBINIT 593 | FDB \1,\2,\3 594 | ENDM 595 | CLRD MACRO 596 | CLRA 597 | CLRB 598 | ENDM 599 | 600 | DIE MACRO 601 | JMP SUCIDE ;DIE! 602 | ENDM 603 | * 604 | NAP MACRO \1,\2 605 | LDA #\1 ;TIME 606 | LDX #\2 ;WAKEUP ADDR 607 | JMP SLEEP 608 | ENDM 609 | 610 | * 611 | *MAKE A NEW PROCESS 612 | * 613 | NEWP MACRO \1,\2 614 | LDX #\1 ;ADDR 615 | LDA #\2 ;TYPE 616 | JSR MKPROC 617 | ENDM 618 | * 619 | *OBJECT OFF MACRO 620 | * 621 | OBJOFF MACRO \1 622 | IFEQ NARG-1 623 | LDY #\1 624 | ENDC 625 | JSR COFF 626 | ENDM 627 | * 628 | *OBJECT ON MACRO 629 | * 630 | OBJON MACRO \1 631 | IFEQ NARG-1 632 | LDY #\1 633 | ENDC 634 | JSR CWRIT 635 | ENDM 636 | PAGE 637 | -------------------------------------------------------------------------------- /src/romf8.src: -------------------------------------------------------------------------------- 1 | * TTL ROMF8 ;- CONTROL AT FXXX - 12/22/80 2 | SETDP $A0 3 | * 4 | * SYSTEM EQUATES 5 | * 6 | DIAORG EQU $C000 7 | DIABLK EQU 3 ;DIAGNOSTIC BLOCK 8 | CMOS EQU $C400 9 | CMOSS EQU $C480 ;WRITE PROTECTED 10 | MAPC EQU $D000 ;FLOPPING ADDRESS 11 | MAPCR EQU $A036 12 | CREDIT EQU $A037 13 | CUNITS EQU $A038 14 | BUNITS EQU $A039 15 | 16 | * CMOS RAM ALLOCATION 17 | * 18 | ORG CMOS 19 | DIPFLG RMB 1 ;DIP SWITCH SET FLAG 20 | SLOT1 RMB 4 ;LEFT COIN TOTAL 21 | SLOT2 RMB 4 ;CENTER COIN TOTAL 22 | SLOT3 RMB 4 ;RIGHT COIN TOTAL 23 | TOTPDC RMB 4 ;TOTAL PAID CREDITS 24 | TOTRPL RMB 4 ;TOTAL REPLAYS 25 | BLLTIM RMB 4 ;BALL TIME IN MINS 26 | BLLCNT RMB 4 ;TOTAL "BALLS" PLAYED 27 | CMSDEF EQU * 28 | CRHSTD RMB 12 ;FOR ALL TIME HSTD 29 | CRHST1 RMB 12 ;ALL TIME #2 30 | CRHST2 RMB 12 31 | CRHST3 RMB 12 32 | CRHST4 RMB 12 33 | CRHST5 RMB 12 34 | CRHST6 RMB 12 35 | CRHST7 RMB 12 36 | CREDST EQU * ;CREDITS BACKUP 37 | DIPSW RMB 2 ;FOR DIPSW FUNCTIONS 38 | ORG CMOSS-1 ;PUT IT ACCROSS BOUNDARY 39 | CMOSCK RMB 2 ;FOR BOUNDARY BYTE 40 | REPLAY RMB 4 ;REPLAY LEVEL 41 | NSHIP RMB 2 ;NUMBER OF SHIPS/GAME 42 | COINSL RMB 2 ;FOR COINAGE SELECT MODE 43 | SLOT1M RMB 2 ;LEFT COIN MULT 44 | SLOT2M RMB 2 ;CENTER COIN MULT 45 | SLOT3M RMB 2 ;RIGHT COIN MULT 46 | CUNITC RMB 2 ;COIN UNITS PER CREDIT 47 | CUNITB RMB 2 ;COIN UNITS FOR BONUS 48 | MINUNT RMB 2 ;MINIMUM REQD 49 | FREEPL RMB 2 ;FREE PLAY MODE 50 | GA1 RMB 2 ;GAME ADJUSTS - 1 51 | GA2 RMB 2 52 | GA3 RMB 2 53 | GA4 RMB 2 54 | GA5 RMB 2 55 | GA6 RMB 2 56 | GA7 RMB 2 57 | GA8 RMB 2 58 | GA9 RMB 2 59 | GA10 RMB 2 60 | * 61 | * RESET PROCESSING 62 | * 63 | ORG $FB00 ;TEMPORARY!!!!!! 64 | RESET CLR MAPC ;SETUP PIAS 65 | LDX #$CC00 66 | CLR 1,X 67 | CLR 3,X 68 | CLR 5,X 69 | CLR 7,X 70 | LDA #$C0 71 | STA ,X 72 | LDA #$FF 73 | STA 2,X 74 | CLR 4,X 75 | CLR 6,X 76 | LDA #4 77 | STA 3,X 78 | STA 5,X 79 | STA 7,X 80 | ORA #$10 ;SET FOR SLAM SW ON ^TRANS 81 | STA 1,X ;AND PROGRAM 82 | LDX #$C000 ;SET INTERESTING SCREEN COLORS 83 | LDA #$C0 84 | RESET1 STA ,X+ 85 | LDB #$B5 86 | MUL 87 | CMPX #$C010 88 | BNE RESET1 89 | ORCC #$80 ;SET AUTO CYCLE NOT FLAG <=================TEMPORARY 90 | ANDCC #$EF ;CLEAR COMPREHENSIVE/INITIAL FLAG(I BIT) 91 | * 92 | * POWER UP RAM TEST 93 | * 94 | LDY #7 ;SET TEST COUNTER 95 | CLRA 96 | TFR A,DP ;CLEAR BAD RAM MAP(BIT 0-BLOCK 1, B1-BL2 , B2-BL3) 97 | ANDCC #$BF ;INITIALIZE BAD RAM IN PAGE FLAG(F BIT) 98 | CLRB 99 | RAM2 TFR D,U ;SAVE SEED 100 | LDX #0 ;GET STARTING ADDRESS INTO POINTER 101 | RAM3 COMB ;RANDOM NUMBER ROUTINE 102 | BITB #9 103 | BNE RAM4 104 | COMB 105 | RORA 106 | RORB 107 | BRA RAM6 108 | RAM4 COMB 109 | BITB #9 110 | BNE RAM5 111 | RORA 112 | RORB 113 | BRA RAM6 114 | RAM5 LSRA 115 | RORB 116 | RAM6 STD ,X++ ;LOAD INTO ADDRESS AND ADVANCE 117 | EXG X,D ;WATCHDOG TEST 118 | TSTB 119 | BNE RAM6B 120 | LDB #$38 ;RESET WATCHDOG 121 | STB $C3FC 122 | TFR CC,B ;CHECK COMPREHENSIVE/INITIAL FLAG 123 | BITB #$10 124 | BEQ RAM6A ;SKIP IF INITIAL 125 | CLR MAPC ;SELECT PIA BLOCK 126 | LDB $CC00 ;CHECK IF ADVANCE PRESSED AND AUTO UP 127 | COMB 128 | BITB #3 129 | BEQ RAM11A ;TEST ABORTED, RETURN TO COMPREHENSIVE 130 | RAM6A CLRB 131 | RAM6B EXG X,D 132 | CMPX #$C000 ;ADDRESS POINTER DONE? 133 | BNE RAM3 ;NO, LOOP 134 | TFR U,D ;GET SEED 135 | LDX #0 ;GET STARTING ADDRESS INTO POINTER 136 | RAM7 COMB ;RANDOM NUMBER ROUTINE 137 | BITB #9 138 | BNE RAM8 139 | COMB 140 | RORA 141 | RORB 142 | BRA RAM10 143 | RAM8 COMB 144 | BITB #9 145 | BNE RAM9 146 | RORA 147 | RORB 148 | BRA RAM10 149 | RAM9 LSRA 150 | RORB 151 | RAM10 CMPD ,X++ ;CHECK FOR MATCH 152 | BEQ RAM11 ;NO, ERROR 153 | EXG D,Y ;SAVE ERROR 154 | TFR CC,A ;CHECK COMPREHENSIVE/INITIAL FLAG 155 | BITA #$10 156 | BEQ RAM10A ;SKIP IF INITIAL 157 | LDA #DIABLK ;ERROR, RETURN TO COMPREHENSIVE 158 | STA MAPCR 159 | STA MAPC ;AND IN HARDWARE 160 | JMP VRAM10 161 | RAM10A CLRA 162 | EXG Y,D ;RECOVER COUNTER 163 | ORCC #$40 ;SET BAD RAM IN PAGE FLAG 164 | RAM11 EXG X,D ;END OF PAGE TEST 165 | TSTB 166 | BNE RAM17 ;PAGE NOT DONE 167 | TFR CC,B ;CHECK COMPREHENSIVE/INITIAL FLAG 168 | BITB #$10 169 | BEQ RAM11B ;SKIP IF INITIAL 170 | LDB $CC00 ;CHECK IF ADVANCE PRESSED AND AUTO UP 171 | COMB 172 | BITB #3 173 | BNE RAM16 ;NOT YET, SKIP ERROR PROCESSING SAVE DP 174 | RAM11A LDA #DIABLK ;TEST ABORTED, RETURN TO COMPREHENSIVE 175 | STA MAPCR ;IN FLAG 176 | STA MAPC 177 | JMP VRAM20 178 | RAM11B TFR CC,B ;GET CONDITION CODES 179 | BITB #$40 ;CHECK BAD RAM IN PAGE FLAG 180 | BEQ RAM16 ;RAM PAGE OK-SKIP ERROR PROCESSING 181 | * ERROR PROCESSING 182 | ANDCC #$BF ;CLEAR BAD RAM IN PAGE FLAG 183 | TFR DP,B ;GET BAD RAM MAP 184 | TFR A,DP ;SAVE ADDRESS 185 | RAM12 SUBA #3 ;FIND BLOCK NUMBER 186 | BCC RAM12 187 | INCA 188 | BNE RAM13 189 | ORB #2 ;BLOCK 2 190 | BRA RAM15 191 | RAM13 INCA 192 | BNE RAM14 193 | ORB #1 ;BLOCK 1 194 | BRA RAM15 195 | RAM14 ORB #4 ;BLOCK 3 196 | RAM15 TFR DP,A ;RECOVER ADDRESS 197 | TFR B,DP ;SAVE BAD RAM MAP 198 | * 199 | RAM16 LDB #$38 ;RESET WATCHDOG 200 | STB $C3FC 201 | CLRB 202 | RAM17 EXG X,D 203 | CMPX #$C000 ;CHECK FOR END OF MEMORY 204 | LBNE RAM7 ;NO?, LOOP 205 | LEAY -1,Y 206 | LBNE RAM2 ;REPEAT TEST 207 | TFR CC,B 208 | TSTB ;CHECK AUTO CYCLE NOT FLAG <================TEMPORARY 209 | BMI RAM17B ;CLEAR, CONTINUE RAM TEST 210 | LDB #DIABLK ;SELECT DIAGNOSTIC BLOCK 211 | STB MAPCR ;IN FLAG 212 | STB MAPC 213 | JSR INIT ;INITIALIZE DIRECT PAGE VARIABLES 214 | JMP VOUND0 ;NEXT TEST IN AUTO CYCLE 215 | RAM17B BITB #$10 ;CHECK COMPREHENSIVE/INITIAL FLAG-SAVE RANDOM NUMBER 216 | LBNE RAM2 ;COMPREHENSIVE, CONTINUE 217 | * FIND GOOD RAM 218 | LDA #$9E 219 | TFR DP,B ;GET BAD RAM MAP 220 | TSTB 221 | BEQ RAM19 ;DP <= $9E, IF ALL RAM OK 222 | RAM18 INCA ;DP <= $9F, IF (BLOCK 2 OR 3 BAD) AND 1 OK 223 | LSRB ;DP <= $A0, IF BLOCK 1 BAD AND 2 OK 224 | BCS RAM18 ;DP <= $A1, IF ONLY BLOCK 3 OK 225 | RAM19 TFR A,DP ;DP <= $A2, IF ALL BLOCKS BAD, GOOD LUCK! 226 | ADDA #$1C ;SET HARDWARE STACK AT TOP OF GOOD RAM BLOCK 227 | CLRB 228 | TFR D,S 229 | JSR INIT ;SET UP FOR TEXT ROUTINES 230 | * 231 | * POWER UP ROM TEST 232 | * 233 | ROM0 LDU #ROMMAP ;GET ROM MAP ADDRESS 234 | ROM1 LDA ,U ;GET ROM DESCRIPTOR BYTE 235 | BEQ ROM9 ;NO ROM AT POSITION 236 | ANDA #$70 ;EXTRACT ADDRESS 237 | LSRA 238 | ADDA #$C0 239 | CLRB 240 | TFR D,X ;INTO X REGESTER 241 | LDD #0 ;ZERO CHECKSUM COUNTER 242 | ROM2 ADDD ,X ;FAST CHECKSUM ADDER 243 | BCC ROM3 244 | ADDD #1 245 | ROM3 ADDD 2,X 246 | BCC ROM4 247 | ADDD #1 248 | ROM4 ADDD 4,X 249 | BCC ROM5 250 | ADDD #1 251 | ROM5 ADDD 6,X 252 | BCC ROM6 253 | ADDD #1 254 | ROM6 LEAX 8,X ;ADVANCE POINTER 255 | EXG D,X ;CHECK IF DONE 256 | TSTB 257 | BNE ROM7 258 | LDB #$38 ;RESET WATCHDOG 259 | STB $C3FC 260 | CLRB 261 | BITA #7 262 | BEQ ROM8 263 | ROM7 EXG D,X 264 | BRA ROM2 ;CONTINUE TESTING 265 | ROM8 CMPX #0 ;CHECK CHECKSUM 266 | BEQ ROM9 267 | TFR CC,A ;GET COMPREHENSIVE/INITIAL FLAG 268 | BITA #$10 ;TEST IT 269 | BEQ IDIS20 ;DISPLAY INITIAL ERROR 270 | LDA #DIABLK ;SELECT DIAGNOSTIC BLOCK 271 | STA MAPCR ;IN FLAG 272 | STA MAPC 273 | RTS ;RETURN TO COMPREHENSIVE DIAGNOSTICS 274 | ROM9 LEAU 1,U 275 | CMPU #ROMMAP+24 276 | BNE ROM1 277 | TFR CC,A 278 | BITA #$10 ;TEST COMPREHENSIVE/INITIAL FLAG 279 | BEQ IDIS1 ;DISPLAY INITIAL ROM OK 280 | LDA #DIABLK ;SELECT DIAGNOSTIC BLOCK 281 | STA MAPC 282 | RTS ;RETURN TO COMPREHENSIVE DIAGNOSTICS 283 | * 284 | * INITIAL TEST RESULTS DISPLAY 285 | * 286 | IDIS1 TFR DP,A ;CHECK IF RAM OK <== ROM OK STARTING POINT 287 | CMPA #$9E 288 | BNE IDIS10 ;BRANCH IF RAM BAD 289 | * ROM OK, RAM OK 290 | LDA #DIABLK 291 | STA MAPCR ;SAVE STATUS 292 | STA MAPC ;SELECT DIAGNOSTIC BLOCK 293 | JSR VORAOK 294 | JMP GAMEOV ;NOW GO TO GAME OVER 295 | * ROM OK, RAM BAD 296 | IDIS10 LDB #$40 ;BAD RAM INDICATION LEDS 297 | STB $CC00 298 | STB $CC02 299 | LDA #DIABLK ;SELECT DIAGNOSTIC BLOCK 300 | STA MAPCR ;IN FLAG 301 | STA MAPC 302 | JSR VOOKRB 303 | JMP GAMEOV ;NOW GO TO GAME OVER 304 | * ROM BAD 305 | IDIS20 LDB #$80 ;BAD ROM INDICATION LEDS 306 | STB $CC00 307 | STB $CC02 308 | LDA #DIABLK ;SELECT DIAGNOSTIC BLOCK 309 | STA MAPCR ;IN FLAG 310 | STA MAPC 311 | JSR VOMBAD 312 | JMP GAMEOV ;NOW TO GAME OVER 313 | * 314 | * STORE B,X BLOCK 0 315 | * 316 | STBXB0 PSHS A,CC 317 | LDA MAPCR 318 | PSHS A 319 | CLR MAPCR 320 | CLR MAPC 321 | STB ,X 322 | STBXB PULS A 323 | STA MAPCR 324 | STA MAPC 325 | PULS CC,A,PC 326 | * 327 | * LOAD B ,X - BLOCK 0 328 | * 329 | LDBXB0 PSHS A,CC ;SAVE STATE 330 | LDA MAPCR ;GET CURRENT ACTIVE BLOCK 331 | PSHS A ;SAVE IT 332 | CLR MAPCR ;MAKE IT 0 333 | CLR MAPC ;AND IN HARDWARE 334 | LDB ,X ;GET THE DATA 335 | BRA STBXB ;FINISH ABOVE 336 | * 337 | * GAME OVER- ASSUMES BLOCK 3 REMAINS SELECTED!!!! 338 | * 339 | GAMEOV ORCC #$90 ;SET TO COMPR/NOT AUTO CYCLE 340 | LDB #$38 ;GET DOGGY 341 | LDX #$C3FC 342 | BSR STBXB0 ;DO IT 343 | CLR CREDIT ;REMOVE ANY LEFTOVERS 344 | CLR BUNITS 345 | CLR CUNITS 346 | JSR SCRCLR ;CLEAR UP 347 | JSR VPWRUP 348 | LDB #$A5 ;COLOR LETTERS WHITE 349 | LDX #LETCOL ;POINT TO IT 350 | BSR STBXB0 ;SET COLOR UP 351 | LDU #VGAMOV ;"GAME OVER" 352 | LDX #$3880 ;SCREEN ADDRESS 353 | JSR LJSR ;DO IT 354 | FDB TV1 355 | FCB 2 ;IN BLOCK 2 WRITE TEXT 356 | LDB #$38 ;GET DOGGY 357 | LDX #$C3FC 358 | BSR STBXB0 ;DO IT 359 | LDY #IGAMEO ;GIVE INSTRUCTIONS 360 | JSR LJSR ;DO IT 361 | FDB TV12 362 | FCB 2 363 | GAMOV1 LDX #$CC01 ;READ FOR SLAM TILT 364 | JSR LDBXB0 ;AND SEE WHAT'S HAPPENING 365 | BITB #$40 ;SLAM? 366 | BEQ GAMOV2 ;NO 367 | JMP RESET ;YES, GO BACK 368 | GAMOV2 LDX #$CC00 ;NOW READ SWS 369 | JSR LDBXB0 ;AND SEE IF ANY? 370 | BITB #$2 ;ADV? 371 | BEQ GAMOV3 ;NO, SEE IF ANY OTHERS 372 | BITB #1 ;AUTO/MANUAL 373 | BNE GAMOV4 ;AUTO-GO TO AUDIT 374 | JMP VCROM0 ;MANUAL GO TO SELF TEST 375 | GAMOV4 JMP VUDITG 376 | GAMOV3 BITB #$04 ;RIGHT COIN? 377 | BEQ GAMOV5 ;NO 378 | JSR RCOINV 379 | GOVERX LDY #100 ;DELAY 380 | GOVER1 LDA #$B2 381 | GOVER2 DECA 382 | BNE GOVER2 383 | LDB #$38 ;RESET WATCHDOG 384 | LDX #$C3FC 385 | JSR STBXB0 ;DO IT 386 | LEAY -1,Y 387 | BNE GOVER1 ;LOOP AROUND 388 | BRA GAMOV1 ;MONITOR SWITCHES ONLY 389 | GAMOV5 BITB #$20 ;CENTER COIN? 390 | BEQ GAMOV6 ;NO 391 | JSR CCOINV 392 | BRA GOVERX ;DELAY THEN BACK 393 | GAMOV6 BITB #$10 ;LEFT COIN? 394 | BEQ GOVERX ;NO, DELAY 395 | JSR LCOINV 396 | BRA GOVERX ;EXIT AFTER 1/2 SEC 397 | * 398 | * SYSTEM FIRMWARE 399 | * 400 | *WRITE AN OBJECT TO SCREEN 401 | *Y=OBJECT DESCRIPTOR ADDR 402 | *D=SCREEN ADDR 403 | *ALL SAVED 404 | *REENTRANT 405 | * 406 | * 407 | CWRIT PSHS A,B,X,Y,U 408 | TFR D,X 409 | LDD ,Y ;GET WIDTH,LENGTH 410 | LDY 2,Y ;GET DATA 411 | PSHS D ;SAVE WIDTH,HEIGHT 412 | BITB #1 ;ODD LENGTH? 413 | BNE CWRT1 414 | *EVEN BYTE COUNT 415 | CWRT00 SUBB #2 416 | CWRT0 LDU B,Y 417 | STU B,X 418 | SUBB #2 419 | BPL CWRT0 420 | LDB 1,S 421 | LEAX $100,X 422 | LEAY B,Y 423 | DECA 424 | BNE CWRT00 425 | BRA CWRTX 426 | *ODD BYTE COUNT 427 | CWRT1 DECB 428 | LDA B,Y 429 | STA B,X 430 | SUBB #2 431 | BMI CWRT3 432 | CWRT2 LDU B,Y 433 | STU B,X 434 | SUBB #2 435 | BPL CWRT2 436 | CWRT3 LDB 1,S ;GET HEIGHT 437 | LEAX $100,X 438 | LEAY B,Y 439 | DEC ,S ;DEC WIDTH 440 | BNE CWRT1 441 | CWRTX LEAS 2,S ;PULL TWO 442 | PULS A,B,X,Y,U,PC 443 | * 444 | *COFF 445 | *Y=OBJECT DESCRIPTOR ADDR 446 | *D=SCREEN ADDR 447 | * 448 | COFF PSHS A,B,X,U 449 | TFR D,X 450 | LDD ,Y ;GET WIDTH ,HEIGHT 451 | COFFA LDU #0 452 | PSHS B ;SAVE HT 453 | BITB #1 ;ODD LENGTH? 454 | BNE COFF1 ;YES 455 | *EVEN BYTE COUNT 456 | COFF00 SUBB #2 457 | COFF0 STU B,X 458 | SUBB #2 459 | BPL COFF0 460 | LDB ,S ;GET HT 461 | LEAX $100,X 462 | DECA 463 | BNE COFF00 464 | BRA COFFX 465 | *ODD BYTE COUNT 466 | COFF1 DECB 467 | CLR B,X 468 | SUBB #2 469 | BMI COFF3 470 | COFF2 STU B,X 471 | SUBB #2 472 | BPL COFF2 473 | COFF3 LDB ,S ;GET HT 474 | LEAX $100,X 475 | DECA 476 | BNE COFF1 477 | COFFX LEAS 1,S ;PULL HEIGHT 478 | PULS A,B,X,U,PC 479 | * 480 | *BLOCK CLEAR 481 | *X=ADDR, D=W,H 482 | * 483 | BLKCLR PSHS A,B,X,U 484 | LDA MAPCR ;SAVE MAP 485 | PSHS A 486 | LDA 1,S 487 | BRA COFFA 488 | * 489 | *SCREEN CLEAR 490 | * 491 | SCRCLR PSHS D,X,Y,U 492 | LDU #$9C00 493 | LDX #0 494 | TFR X,Y 495 | TFR X,D 496 | SCLRLP PSHU X,Y,D 497 | PSHU X,Y,D 498 | PSHU X,Y,D 499 | PSHU X,Y,D 500 | PSHU X,Y,D 501 | PSHU X ;32 AT A CRACK 502 | CMPU #0 503 | BNE SCLRLP 504 | PULS D,X,Y,U,PC 505 | * 506 | * INITIALIZE DP VARIABLES FOR TEXT/DIAG USE 507 | * 508 | INIT PSHS D ;SAVE STATE 509 | CLR MESPT 510 | CLR ASCNTR 511 | LDA #DIABLK ;SELECT DIAG BLOCK 512 | STA MAPCR ;INTO CURRENT 513 | STA ASLAST 514 | LDD #$FFFF ;INIT NUMBER 515 | STD NUMBER 516 | PULS D,PC ;GO BACK 517 | * 518 | * CMOS PRIMITIVE FOR READING 519 | * 520 | RCMOS LDA 1,X ;GET LSB 521 | ANDA #$0F ;LEAVE ONLY LS 522 | PSHS A ;SAVE IT 523 | LDA ,X++ ;GET MSB + AUTO INC 524 | ASLA 525 | ASLA 526 | ASLA 527 | ASLA ;SHIFT LS TO MSB 528 | ADDA ,S+ ;GET LSB + FIX STACK 529 | RTS ;BYE 530 | * 531 | * READ CMOS INTO A 532 | * 533 | RCMOSA PSHS B ;SAVE A WHILE 534 | LDB MAPCR ;GET CURRENT 535 | PSHS B ;SAVE IT 536 | CLR MAPCR ;NOW SET TO BLOCK 0 537 | CLR MAPC ;AND HARDWARE 538 | BSR RCMOS ;GO READ IT IN A 539 | RCMOSX PULS B ;GET OLD BLOCK # 540 | STB MAPCR ;SAVE IT AGAIN 541 | STB MAPC ;AND IN HARDWARE 542 | PULS B,PC ;CLEAN + GO 543 | * 544 | * READ CMOS INTO D POINTED TO BY X: A=X,X+1; B=X+2,X+3 545 | * 546 | RCMOSD BSR RCMOSA ;GET THE FIRST BYTE+FALL THRU FOR 2ND 547 | * 548 | * READ CMOS INTO B POINTED TO BY X 549 | * 550 | RCMOSB PSHS A ;SAVE A 551 | BSR RCMOSA ;GET IN A 552 | TFR A,B ;PUT IT IN B 553 | PULS A,PC ;DONE 554 | * 555 | * WRITE TO CMOS PRIMITIVE 556 | * 557 | WCMOS PSHS A ;SAVE WHATS TO BE WRITTEN 558 | STA 1,X ;SAVE LSB 559 | LSRA ;SHIFT MS TO LS 560 | LSRA 561 | LSRA 562 | LSRA 563 | STA ,X++ ;SAVE MSB AND AUTO INC 564 | PULS A,PC ;DONE 565 | * 566 | * WRITE TO CMOS FROM A AT X 567 | * 568 | WCMOSA PSHS B ;SAVE STATE 569 | LDB MAPCR ;GET CURRENT MAP 570 | PSHS B ;SAVE ON STACK 571 | CLR MAPCR ;POINT TO BLOCK 0 572 | CLR MAPC ;AND IN HARDWARE 573 | BSR WCMOS ;WRITE A TO CMOS 574 | PULS B ;GET BLOCK SAVED 575 | STB MAPCR ;SAVE IT 576 | STB MAPC ;AND IN HARDWARE 577 | PULS B,PC ;CLEAN UP + GO 578 | * 579 | * WRITE CMOS FROM D TO X: A=X,X+1; B=X+2,X+3 580 | * 581 | WCMOSD BSR WCMOSA ;DO IT AND FALL THRU FOR 2ND 582 | * 583 | * WRITE CMOS FROM B TO X 584 | * 585 | WCMOSB PSHS A ;SAVE A 586 | TFR B,A ;MOVE B TO A 587 | BSR WCMOSA ;FAKE IT 588 | PULS A,PC ;DONE 589 | * 590 | * LJSR HERE 591 | * 592 | LJSR LEAS -3,S ;MAKE ROOM 593 | PSHS A,U ;SAVE TEMPS 594 | LDA MAPCR ;GET BLOCK 595 | STA 5,S ;PUT WITH RETURN ADDR 596 | LDU 6,S ;GET "RETURN ADDR" 597 | LDA 2,U ;GET NEW BLOCK 598 | LDU ,U 599 | STU 3,S 600 | STA MAPCR ;MAKE NEW BLOCK 601 | STA MAPC ;AND IN HARDWARE 602 | PULS A,U ;RESTORE 603 | JSR [0,S] ;DO IT INDIRECT 604 | PSHS A,U ;SAVE AGAIN 605 | LDA 5,S ;GET OLD BLOCK BACK 606 | STA MAPCR ;HOW BORING 607 | STA MAPC 608 | LDU 6,S ;GET "RETURN ADDR" 609 | LEAU 3,U ;MAKE REAL 610 | STU 6,S ;PUT BACK ON STACK 611 | PULS A,U ;RESTORE 612 | LEAS 3,S ;TAKE AWAY BYTEE 613 | RTS ;AND GET THE PHUCK OUT OF HERE. 614 | * 615 | * ROM ADDRESS MAP - ONE BYTE EVERY 2K 616 | * FIRST 2 BYTES FOR ROM1, 617 | * NEXT 2 BYTES FOR ROM2, ETC. 618 | * 619 | * BITS 0-3 BLOCK NUMBER (USE $F FOR MAIN MEMORY) 620 | * BITS 6-4 ADDRESS 0 FOR $C000 621 | * 1 FOR $C800 622 | * 2 FOR $D000 623 | * 3 FOR $D800 624 | * 4 FOR $E000 625 | * 5 FOR $E800 626 | * 6 FOR $F000 627 | * 7 FOR $F800 628 | * 00 FOR NO ROM 629 | * 630 | ROMMAP FCB $00,$00 ;ROM 1 631 | FCB $00,$00 ;ROM 2 632 | FCB $00,$00 ;ROM 3 633 | FCB $00,$00 ;ROM 4 634 | FCB $00,$00 ;ROM 5 635 | FCB $00,$00 ;ROM 6 636 | FCB $00,$00 ;ROM 7 637 | FCB $00,$00 ;ROM 8 638 | FCB $00,$00 ;ROM 9 639 | FCB $00,$00 ;ROM 10 640 | FCB $00,$00 ;ROM 11 641 | FCB $00,$00 ;ROM 12 642 | * 643 | * I/O EQUATES HERE 644 | * 645 | VORAOK EQU DIAORG ;RORAOK 646 | VOOKRB EQU DIAORG+3 ;ROOKRB 647 | VOMBAD EQU DIAORG+6 ;ROMBAD 648 | VPWRUP EQU DIAORG+9 ;PWRUP 649 | VAUD EQU DIAORG+12 ;AUD 650 | VAUD1 EQU DIAORG+15 ;AUD1 651 | LCOINV EQU DIAORG+18 ;COINL 652 | RCOINV EQU DIAORG+21 ;COINR 653 | CCOINV EQU DIAORG+24 ;COINC 654 | RHSTDV EQU DIAORG+27 ;RHSTD 655 | VCMOSM EQU DIAORG+30 ;CMOSMV 656 | VUDITG EQU DIAORG+33 ;AUDITG 657 | VUTOCY EQU DIAORG+36 ;AUTOCY 658 | VCROM0 EQU DIAORG+39 ;CROM0 659 | VRAM10 EQU DIAORG+42 ;CRAM10 660 | VRAM20 EQU DIAORG+45 ;CRAM20 661 | VOUND0 EQU DIAORG+48 ;SOUND0 662 | * 663 | * VECTORS TO ROUTINES HERE 664 | * 665 | ORG $FF9D ;FOR NOW 666 | RMB 2 ;NULOBV 667 | RMAPV FDB ROMMAP 668 | RCAV JMP RCMOSA 669 | RCBV JMP RCMOSB 670 | RCDV JMP RCMOSD 671 | WCAV JMP WCMOSA 672 | WCBV JMP WCMOSB 673 | WCDV JMP WCMOSD 674 | CWRITV JMP CWRIT 675 | COFFV JMP COFF 676 | BLKCLV JMP BLKCLR 677 | SCRCLV JMP SCRCLR 678 | ROM0V JMP ROM0 679 | ROM9V JMP ROM9 680 | RAM2V JMP RAM2 681 | VAMEOV JMP GAMEOV 682 | RMB 3 ;"BGIV" 683 | LJSRV JMP LJSR 684 | RMB 3 ;"SLEPPV" 685 | STBXBV JMP STBXB0 686 | LDBXBV JMP LDBXB0 687 | * 688 | * RESET VECTOR 689 | * 690 | ORG $FFFC 691 | FDB RESET ;NMI TOO 692 | FDB RESET 693 | PAGE 694 | -------------------------------------------------------------------------------- /src/blk71.src: -------------------------------------------------------------------------------- 1 | * TTL D E F E N D E R 1.0 2 | * NMLIST 3 | * NOGEN 4 | *********************************************************** 5 | * 6 | * TERRAIN , MINI-TERRAIN DATA 7 | * AND PLAYER EXPLOSION 8 | * 9 | *********************************************************** 10 | * 11 | *SYSTEM EQUATES 12 | * 13 | SLEEPP EQU $FFD1 ;LONG SLEEP VECTOR 14 | PD2 EQU 9 15 | * 16 | * TERRAIN EQUATES 17 | * 18 | TLEN EQU $100 19 | * 20 | * PLAYER EXPLOSION EQUATES 21 | * 22 | PXPOST EQU 2 ;X POSITION TABLE 23 | PYPOST EQU 4 ;Y POSITION TABLE 24 | PXVELT EQU 6 ;X VELOCITY TABLE 25 | PYVELT EQU 8 ;Y VELOCITY TABLE 26 | PNBITS EQU $80 ;NUMBER OF PIECES 27 | * 28 | * TERRAIN VARIABLES 29 | * 30 | SETDP $A0 31 | ORG $A000 32 | TEMP1A RMB 1 33 | TEMP1B RMB 1 34 | TEMP1C RMB 1 35 | TEMP2A RMB 2 36 | TTBLP0 RMB 2 ;TERRAIN TABLE POINTER-FLAVOR 0 37 | TTBLP1 RMB 2 ;TERRAIN TABLE POINTER-FLAVOR 1 38 | LTPTR RMB 2 ;LEFT TERRAIN DATA POINTER 39 | RTPTR RMB 2 ;RIGHT TERRAIN DATA POINTER 40 | LTBYTE RMB 1 ;LEFT TERRAIN DATA BYTE 41 | RTBYTE RMB 1 ;RIGHT TERRAIN DATA BYTE 42 | LTCNT RMB 1 ;LEFT TERRAIN BIT COUNTER 43 | RTCNT RMB 1 ;RIGHT TERRAIN BIT COUNTER 44 | LOFF RMB 1 ;LEFT VERTICAL OFFSET 45 | ROFF RMB 1 ;RIGHT VERTICAL OFFSET 46 | SSTACK RMB 2 ;HARDWARE STACK 47 | BGLX RMB 2 ;OLD SCREEN LEFT ADDRESS 48 | TEMP2B RMB 2 49 | * 50 | * PLAYER EXPLOSION VARIABLES 51 | * 52 | ORG $A000 53 | PCENT RMB 1 ;PLAYER CENTER 54 | PCOLC RMB 1 ;COLOR COUNTER 55 | PCOLP RMB 2 ;COLOR POINTER 56 | PSED RMB 1 ;RANDOM SEED MS BYTE 57 | LPSED RMB 1 ;RANDOM SEED LS BYTE 58 | PSED2 RMB 1 ;RANDOM SEED 2 MS BYTE 59 | LPSED2 RMB 1 ;RANDOM SEED 2 LS BYTE 60 | * 61 | * SYSTEM VARIABLES 62 | * 63 | BGL EQU $A020 ;BACKGROUND LEFT 64 | IRQHK EQU $A024 ;IRQ HOOK 65 | PCRAM EQU $A026 ;COLOR RAM BUFFER TABLE 66 | * 67 | * TERRAIN TABLES 68 | * 69 | ORG $B300 70 | ALTTBL RMB TLEN*4 ;ALTITUDE TABLE 71 | TERTF0 RMB $390 ;TERRAIN TABLE FLAVOR 0 72 | TERTF1 RMB $390 ;TERRAIN TABLE FLAVOR 1 73 | STBL RMB $130 ;SCREEN ADDRESS TABLE 74 | * 75 | * PLAYER EXPLOSION TABLE 76 | * 77 | ORG $B300 78 | TABLE RMB 10*PNBITS 79 | * 80 | * VECTORS 81 | * 82 | ORG $C000 83 | JMP BGINIT ;TERRAIN GENERATION 84 | JMP BGOUT ;TERRAIN OUTPUT ROUTINE 85 | JMP BGALT ;TERRAIN ALTITUDE TABLE GENERATOR 86 | JMP BGERAS ;TERRAIN ERASE 87 | FDB MTERR ;MINI TERRAIN DATA 88 | JMP PLEX ;PLAYER EXPLOSION 89 | FDB WVTAB ;WAVE DATA TABLE 90 | FDB WVTEND ;" 91 | ********************************************************* 92 | * 93 | * TERRAIN GENERATION 94 | * 95 | BGINIT LDD BGL ;GET LEFT TERRAIN POINTER 96 | ANDB #$E0 ;FIND NEAREST PIXEL 97 | STD TEMP2B 98 | ADDD #$2610 ;START ON RIGHT EDGE OF SCREEN 99 | STD BGLX 100 | CLR LTCNT ;FIND TERRAIN POSITION 101 | LDX #TDATA-1 102 | STX LTPTR 103 | LDA #$E0 ;BASE OFFSET 104 | STA LOFF 105 | JSR RFONL1 ;SETUP LEFT BYTE 106 | LDX #$10 ;ROTATE PLANET TO FIND OFFSET 107 | TGEN1 CMPX BGLX 108 | BEQ TGEN4 109 | LDA LTBYTE 110 | BPL TGEN2 111 | DEC LOFF 112 | BRA TGEN3 113 | TGEN2 INC LOFF 114 | TGEN3 JSR RFONL1 115 | LEAX $20,X 116 | BRA TGEN1 117 | TGEN4 LDD LTPTR ;SAVE TERRAIN POINTER 118 | STD TEMP2A 119 | LDA LTCNT ;SAVE COUNTER 120 | STA TEMP1A 121 | LDA LTBYTE ;SAVE TERRAIN DATA BYTE 122 | STA TEMP1B 123 | LDA LOFF ;SAVE TERRAIN OFFSET 124 | STA TEMP1C 125 | LDX #TERTF0 ;INITIALIZE TERRAIN TABLE POINTERS 126 | STX TTBLP0 127 | LDX #TERTF1 128 | STX TTBLP1 129 | TGEN5 LDD BGLX ;INITIAL TERRAIN GENERATING LOOP 130 | SUBD #$20 131 | STD BGLX 132 | CMPD TEMP2B 133 | BMI TGEN6 134 | JSR ADDL01 135 | BRA TGEN5 136 | TGEN6 LDD TEMP2A ;SET RIGHT TERRAIN POINTER 137 | STD RTPTR 138 | LDA TEMP1A ;SET RIGHT TERRAIN COUNTER 139 | STA RTCNT 140 | LDA TEMP1B ;SET RIGHT TERRAIN BYTE 141 | STA RTBYTE 142 | LDA TEMP1C ;SET RIGHT OFFSET 143 | STA ROFF 144 | LDY #STBL ;ZERO SCREEN ADDRESS TABLE 145 | LDX #0 146 | TGEN10 STX ,Y++ 147 | CMPY #STBL+$130 148 | BNE TGEN10 149 | RTS 150 | 151 | ********************************************************* 152 | * 153 | * TERRAIN OUTPUT ROUTINE 154 | * 155 | BGOUT LDD BGL ;UPDATE TABLES 156 | ANDB #$E0 157 | SUBD BGLX 158 | ASLB 159 | ROLA 160 | ASLB 161 | ROLA 162 | ASLB 163 | ROLA 164 | STA TEMP1A 165 | BEQ TTER08 166 | BMI TTER09 167 | TTER10 LDD BGLX 168 | ADDD #$20 169 | STD BGLX 170 | JSR ADDR01 171 | DEC TEMP1A 172 | BNE TTER10 173 | BRA TTER08 174 | TTER09 LDD BGLX 175 | SUBD #$20 176 | STD BGLX 177 | JSR ADDL01 178 | INC TEMP1A 179 | BNE TTER09 180 | TTER08 LDD BGL 181 | ANDB #$E0 182 | STD BGLX 183 | LDX #0 184 | LDY #STBL 185 | STS SSTACK ;SAVE HARDWARE STACK 186 | LDS TTBLP0 ;FOR FLAVOR 0 187 | BITB #$20 ;CHECK FLAVOR 188 | BNE TTER02 189 | LDS TTBLP1 ;CHANGE TO FLAVOR 1 190 | TTER02 LDA #$98 191 | TTER03 COMF ;Was: 'STX [,Y]' ;FAST OUTPUT 192 | PULS B,U 193 | STD ,Y 194 | STU [,Y++] 195 | DECA 196 | STX [,Y] 197 | PULS B,U 198 | STD ,Y 199 | STU [,Y++] 200 | DECA 201 | STX [,Y] 202 | PULS B,U 203 | STD ,Y 204 | STU [,Y++] 205 | DECA 206 | STX [,Y] 207 | PULS B,U 208 | STD ,Y 209 | STU [,Y++] 210 | DECA 211 | STX [,Y] 212 | PULS B,U 213 | STD ,Y 214 | STU [,Y++] 215 | DECA 216 | STX [,Y] 217 | PULS B,U 218 | STD ,Y 219 | STU [,Y++] 220 | DECA 221 | STX [,Y] 222 | PULS B,U 223 | STD ,Y 224 | STU [,Y++] 225 | DECA 226 | STX [,Y] 227 | PULS B,U 228 | STD ,Y 229 | STU [,Y++] 230 | DECA 231 | BNE TTER03 232 | TTER04 LDS SSTACK ;RECOVER HARDWARE STACK 233 | RTS 234 | * 235 | * ADD LEFT PIXEL ROUTINE 236 | * 237 | ADDL01 JSR LFONR1 ;LEFT FUNCTION ON RIGHT SIDE 238 | BMI ADDL07 239 | DEC ROFF ;UP 240 | BRA ADDL08 241 | ADDL07 INC ROFF ;DOWN 242 | ADDL08 LDA #$20 ;CHECK FLAVOR 243 | BITA BGLX+1 244 | BNE ADDL02 245 | LDX TTBLP1 ;FLAVOR 1 246 | JSR LFONL1 ;LEFT FUNCTION ON LEFT SIDE 247 | BMI ADDL04 248 | DEC LOFF ;UP 249 | LDA LOFF 250 | STA ,X 251 | STA $1C8,X 252 | LDD #$7007 253 | STD 1,X 254 | STD $1C9,X 255 | LEAX 3,X ;MOVE TABLE POINTER 256 | CMPX #TERTF1+$1C8 257 | BNE ADDL09 258 | LDX #TERTF1 259 | ADDL09 STX TTBLP1 260 | RTS 261 | ADDL04 LDA LOFF ;DOWN 262 | STA ,X 263 | STA $1C8,X 264 | INCA 265 | STA LOFF 266 | LDD #$0770 267 | STD 1,X 268 | STD $1C9,X 269 | LEAX 3,X ;MOVE TABLE POINTER 270 | CMPX #TERTF1+$1C8 271 | BNE ADDL03 272 | LDX #TERTF1 273 | ADDL03 STX TTBLP1 274 | RTS 275 | ADDL02 LDX TTBLP0 ;FLAVOR 0 276 | JSR LFONL1 ;LEFT FUNCTION ON LEFT SIDE 277 | BMI ADDL06 278 | DEC LOFF ;UP 279 | LDA LOFF 280 | STA ,X 281 | STA $1C8,X 282 | LDD #$7007 283 | STD 1,X 284 | STD $1C9,X 285 | LEAX 3,X ;MOVE TABLE POINTER 286 | CMPX #TERTF0+$1C8 287 | BNE ADDL10 288 | LDX #TERTF0 289 | ADDL10 STX TTBLP0 290 | RTS 291 | ADDL06 LDA LOFF ;DOWN 292 | STA ,X 293 | STA $1C8,X 294 | INCA 295 | STA LOFF 296 | LDD #$0770 297 | STD 1,X 298 | STD $1C9,X 299 | LEAX 3,X ;MOVE TABLE POINTER 300 | CMPX #TERTF0+$1C8 301 | BNE ADDL05 302 | LDX #TERTF0 303 | ADDL05 STX TTBLP0 304 | RTS 305 | * 306 | * ADD RIGHT PIXEL ROUTINE 307 | * 308 | ADDR01 LDA LTBYTE ;CHECK LEFT SIDE 309 | BPL ADDR07 310 | DEC LOFF ;UP 311 | BRA ADDR08 312 | ADDR07 INC LOFF ;DOWN 313 | ADDR08 JSR RFONL1 ;RIGHT FUNCTION ON LEFT SIDE 314 | LDA #$20 ;CHECK FLAVOR 315 | BITA BGLX+1 316 | BEQ ADDR02 317 | LDX TTBLP1 ;FLAVOR 1 318 | LEAX -3,X ;MOVE TABLE POINTER 319 | CMPX #TERTF1-3 320 | BNE ADDR03 321 | LDX #TERTF1+$1C5 322 | ADDR03 STX TTBLP1 323 | LDA RTBYTE ;CHECK ON RIGHT SIDE 324 | BPL ADDR04 325 | DEC ROFF ;UP 326 | LDA ROFF 327 | STA ,X 328 | STA $1C8,X 329 | LDD #$0770 330 | STD 1,X 331 | STD $1C9,X 332 | JSR RFONR1 ;RIGHT FUNCTION ON RIGHT SIDE 333 | RTS 334 | ADDR04 LDA ROFF ;DOWN 335 | STA ,X 336 | STA $1C8,X 337 | INCA 338 | STA ROFF 339 | LDD #$7007 340 | STD 1,X 341 | STD $1C9,X 342 | JSR RFONR1 ;RIGHT FUNCTION ON RIGHT SIDE 343 | RTS 344 | ADDR02 LDX TTBLP0 ;FLAVOR 0 345 | LEAX -3,X ;MOVE TABLE POINTER 346 | CMPX #TERTF0-3 347 | BNE ADDR05 348 | LDX #TERTF0+$1C5 349 | ADDR05 STX TTBLP0 350 | LDA RTBYTE ;CHECK RIGHT SIDE 351 | BPL ADDR06 352 | DEC ROFF ;UP 353 | LDA ROFF 354 | STA ,X 355 | STA $1C8,X 356 | LDD #$0770 357 | STD 1,X 358 | STD $1C9,X 359 | JSR RFONR1 ;RIGHT FUNCTION ON RIGHT SIDE 360 | RTS 361 | ADDR06 LDA ROFF ;DOWN 362 | STA ,X 363 | STA $1C8,X 364 | INCA 365 | STA ROFF 366 | LDD #$7007 367 | STD 1,X 368 | STD $1C9,X 369 | JSR RFONR1 ;RIGHT FUNCTION ON RIGHT SIDE 370 | RTS 371 | ********************************************************* 372 | * 373 | * TERRAIN ALTITUDE TABLE GENERATOR 374 | * 375 | BGALT LDX #TDATA ;SET DATA POINTER 376 | STX RTPTR 377 | LDA ,X ;SET TERRAIN BYTE 378 | STA RTBYTE 379 | LDA #7 ;SET TERRAIN BIT COUNTER 380 | STA RTCNT 381 | LDA #$E0 ;SET BASE OFFSET 382 | STA ROFF 383 | LDX #ALTTBL ;SET ALTITUDE TABLE POINTER 384 | ALTT1 LDA ROFF 385 | STA ,X+ ;STORE IN TABLE 386 | LDA RTBYTE ;CHECK BYTE 387 | BPL ALTT2 388 | DEC ROFF ;UP 389 | BRA ALTT3 390 | ALTT2 INC ROFF ;DOWN 391 | ALTT3 JSR RFONR1 ;NEXT BIT 392 | LDA RTBYTE ;CHECK BYTE 393 | BPL ALTT4 394 | DEC ROFF ;UP 395 | BRA ALTT5 396 | ALTT4 INC ROFF ;DOWN 397 | ALTT5 JSR RFONR1 ;NEXT BIT 398 | CMPX #ALTTBL+4*TLEN ;CHECK FOR DONE 399 | BNE ALTT1 400 | RTS 401 | ******************************************************** 402 | * 403 | * TERRAIN ERASE 404 | * 405 | BGERAS LDX #0 ;ZERO 406 | LDY #STBL ;ERASE TABLE START 407 | ERAS1 STX [,Y++] ;ERASE AT TABLE 408 | CMPY #STBL+$130 ;DONE? 409 | BNE ERAS1 410 | RTS 411 | * 412 | * RIGHT TERRAIN FUNCTION ON LEFT SIDE 413 | * 414 | RFONL1 LDA LTCNT 415 | BEQ RFONL2 416 | DEC LTCNT 417 | LDA LTBYTE 418 | ASLA 419 | ADCA #0 420 | STA LTBYTE 421 | RTS 422 | RFONL2 LDU LTPTR 423 | LEAU 1,U 424 | CMPU #TDATA+TLEN 425 | BNE RFONL3 426 | LDU #TDATA 427 | RFONL3 STU LTPTR 428 | LDA #7 429 | STA LTCNT 430 | LDA ,U 431 | STA LTBYTE 432 | RTS 433 | * 434 | * RIGHT TERRAIN FUNCTION ON RIGHT SIDE 435 | * 436 | RFONR1 LDA RTCNT 437 | BEQ RFONR2 438 | DEC RTCNT 439 | LDA RTBYTE 440 | ASLA 441 | ADCA #0 442 | STA RTBYTE 443 | RTS 444 | RFONR2 LDU RTPTR 445 | LEAU 1,U 446 | CMPU #TDATA+TLEN 447 | BNE RFONR3 448 | LDU #TDATA 449 | RFONR3 STU RTPTR 450 | LDA #7 451 | STA RTCNT 452 | LDA ,U 453 | STA RTBYTE 454 | RTS 455 | * 456 | * LEFT TERRAIN FUNCTION ON LEFT SIDE 457 | * 458 | LFONL1 LDA LTCNT 459 | CMPA #7 460 | BEQ LFONL3 461 | INC LTCNT 462 | LDA LTBYTE 463 | LSRA 464 | BCC LFONL2 465 | ADDA #$80 466 | LFONL2 STA LTBYTE 467 | RTS 468 | LFONL3 LDU LTPTR 469 | CMPU #TDATA 470 | BNE LFONL4 471 | LDU #TDATA+TLEN 472 | LFONL4 LEAU -1,U 473 | STU LTPTR 474 | CLR LTCNT 475 | LDA ,U 476 | LSRA 477 | BCC LFONL5 478 | ADDA #$80 479 | LFONL5 STA LTBYTE 480 | RTS 481 | * 482 | * LEFT TERRAIN FUNCTION ON RIGHT SIDE 483 | * 484 | LFONR1 LDA RTCNT 485 | CMPA #7 486 | BEQ LFONR3 487 | INC RTCNT 488 | LDA RTBYTE 489 | LSRA 490 | BCC LFONR2 491 | ADDA #$80 492 | LFONR2 STA RTBYTE 493 | RTS 494 | LFONR3 LDU RTPTR 495 | CMPU #TDATA 496 | BNE LFONR4 497 | LDU #TDATA+TLEN 498 | LFONR4 LEAU -1,U 499 | STU RTPTR 500 | CLR RTCNT 501 | LDA ,U 502 | LSRA 503 | BCC LFONR5 504 | ADDA #$80 505 | LFONR5 STA RTBYTE 506 | RTS 507 | * 508 | * TERRAIN DATA TABLE 509 | * 510 | TDATA FCB $2A,$AA,$AA,$AA,$AA,$AA,$AB,$A1,$D5,$55,$55,$55,$55,$55,$AA,$BF 511 | FCB $FF,$FF,$FF,$C0,$00,$00,$00,$55,$55,$57,$FF,$C0,$01,$55,$55,$55 512 | FCB $55,$55,$55,$5F,$E0,$15,$55,$55,$57,$FF,$F0,$00,$15,$55,$5F,$FF 513 | FCB $FF,$FF,$FF,$00,$00,$00,$00,$05,$55,$7F,$FF,$E0,$00,$05,$55,$55 514 | FCB $55,$55,$FC,$05,$55,$55,$50,$01,$FF,$FF,$FF,$C0,$00,$0A,$AA,$AA 515 | FCB $AA,$FF,$00,$00,$FF,$FF,$FF,$FF,$F0,$00,$00,$1F,$E0,$00,$55,$55 516 | FCB $55,$40,$AA,$AA,$AA,$AA,$AA,$AA,$B5,$57,$AA,$AA,$AA,$F5,$7F,$D5 517 | FCB $55,$55,$57,$FF,$80,$07,$E0,$7F,$F1,$55,$7F,$FF,$FF,$00,$00,$00 518 | FCB $00,$00,$0F,$EF,$76,$91,$11,$11,$5E,$DB,$E9,$84,$77,$EC,$C4,$87 519 | FCB $47,$98,$08,$98,$3F,$C3,$CB,$DB,$9F,$C7,$5F,$2F,$C7,$7D,$EF,$BF 520 | FCB $FA,$4C,$57,$2B,$61,$EF,$EF,$FB,$F7,$E8,$00,$20,$40,$00,$14,$04 521 | FCB $04,$3C,$06,$00,$1D,$07,$3C,$E1,$A5,$55,$55,$45,$2A,$AA,$AA,$AA 522 | FCB $A8,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$56,$AA,$AA,$FE,$AA 523 | FCB $AA,$AA,$AA,$AA,$AA,$AA,$AA,$EA,$AA,$AA,$A8,$02,$AA,$AA,$AA,$AA 524 | FCB $BF,$BE,$3E,$63,$FF,$E0,$D8,$1C,$18,$2A,$AB,$1E,$77,$7A,$AF,$A8 525 | FCB $40,$70,$7D,$40,$0B,$FB,$FA,$FF,$C1,$53,$54,$75,$70,$03,$00,$00 526 | ******************************************************** 527 | * 528 | * MINI TERRAIN 529 | * 530 | MTERR FCB $25,$70,$07,$26,$77,$00,$26,$07,$70,$24,$07,$70 531 | FCB $23,$07,$70,$23,$70,$07,$24,$07,$70,$25,$70,$07 532 | FCB $26,$77,$00,$25,$07,$70,$24,$07,$70,$23,$07,$70 533 | FCB $21,$07,$70,$22,$70,$07,$24,$77,$00,$24,$70,$07 534 | FCB $26,$77,$00,$26,$77,$00,$25,$77,$00,$25,$70,$07 535 | FCB $26,$77,$00,$24,$07,$70,$23,$70,$07,$25,$77,$00 536 | FCB $26,$70,$07,$26,$77,$00,$26,$77,$00,$25,$07,$70 537 | FCB $23,$07,$70,$22,$07,$70,$21,$77,$00,$21,$70,$07 538 | FCB $23,$70,$07,$25,$70,$07,$25,$07,$70,$25,$77,$00 539 | FCB $25,$77,$00,$24,$77,$00,$22,$07,$70,$20,$07,$70 540 | FCB $1E,$07,$70,$1C,$07,$70,$1D,$70,$07,$1F,$70,$07 541 | FCB $21,$70,$07,$22,$70,$07,$24,$70,$07,$26,$70,$07 542 | FCB $26,$77,$00,$26,$77,$00,$26,$77,$00,$26,$77,$00 543 | FCB $26,$77,$00,$25,$77,$00,$25,$70,$07,$26,$77,$00 544 | FCB $24,$07,$70,$23,$77,$00,$24,$77,$00,$22,$07,$70 545 | FCB $23,$70,$07,$22,$07,$70,$21,$70,$07,$23,$70,$07 546 | FCB $25,$70,$07,$26,$77,$00,$26,$07,$70,$24,$07,$70 547 | FCB $23,$07,$70,$23,$70,$07,$24,$07,$70,$25,$70,$07 548 | FCB $26,$77,$00,$25,$07,$70,$24,$07,$70,$23,$07,$70 549 | FCB $21,$07,$70,$22,$70,$07,$24,$77,$00,$24,$70,$07 550 | FCB $26,$77,$00,$26,$77,$00,$25,$77,$00,$25,$70,$07 551 | FCB $26,$77,$00,$24,$07,$70,$23,$70,$07,$25,$77,$00 552 | FCB $26,$70,$07,$26,$77,$00,$26,$77,$00,$25,$07,$70 553 | FCB $23,$07,$70,$22,$07,$70,$21,$77,$00,$21,$70,$07 554 | FCB $23,$70,$07,$25,$70,$07,$25,$07,$70,$25,$77,$00 555 | FCB $25,$77,$00,$24,$77,$00,$22,$07,$70,$20,$07,$70 556 | FCB $1E,$07,$70,$1C,$07,$70,$1D,$70,$07,$1F,$70,$07 557 | FCB $21,$70,$07,$22,$70,$07,$24,$70,$07,$26,$70,$07 558 | FCB $26,$77,$00,$26,$77,$00,$26,$77,$00,$26,$77,$00 559 | FCB $26,$77,$00,$25,$77,$00,$25,$70,$07,$26,$77,$00 560 | FCB $24,$07,$70,$23,$77,$00,$24,$77,$00,$22,$07,$70 561 | FCB $23,$70,$07,$22,$07,$70,$21,$70,$07,$23,$70,$07 562 | ********************************************************** 563 | * 564 | * PLAYER EXPLOSION X = PLAYER CENTER 565 | * 566 | PLEX PULS D 567 | STD PD2,U ;SAVE RETURN ADDR 568 | STX PCENT ;SAVE PLAY CENTER 569 | LDD #$0808 570 | STD PSED ;INITIALIZE SEED 571 | LDD #$1732 572 | STD PSED2 ;INITIALIZE SEED2 573 | * INITIALIZE PIECES 574 | LDY #TABLE 575 | PINIT1 LDA PCENT ;X POSITION 576 | CLRB 577 | STD PXPOST,Y 578 | LDA PCENT+1 ;Y POSITION 579 | STD PYPOST,Y 580 | PINIT2 LDA LPSED ;RANDOM NUMBER 581 | LSRA 582 | EORA LPSED 583 | LSRA 584 | LSRA 585 | ROR PSED 586 | ROR LPSED 587 | LDA PSED 588 | ANDA #1 ;TOP X VELOCITY 589 | SUBA #1 ;FOR FOUR QUADRANTS 590 | LDB LPSED 591 | STD PXVELT,Y 592 | BPL PINIT3 ;FIND ABSOLUTE X VELOCITY 593 | COMA 594 | COMB 595 | PINIT3 PSHS D ;SAVE ABSOLUTE VELOCITY 596 | LDA LPSED2 ;RANDOM NUMBER 2 597 | LSRA 598 | EORA LPSED2 599 | LSRA 600 | LSRA 601 | ROR PSED2 602 | ROR LPSED2 603 | LDA PSED2 604 | ANDA #3 ;TOP Y VELOCITY 605 | SUBA #2 ;FOR FOUR QUADRANTS 606 | LDB LPSED2 607 | STD PYVELT,Y 608 | BPL PINIT4 ;FIND ABSOLUTE Y VELOCITY 609 | COMA 610 | COMB 611 | PINIT4 LSRA ;DIVIDE BY 2 612 | RORB 613 | ADDD ,S++ ;ADD TO ABSOLUTE X VELOCITY 614 | CMPD #$016A ;CHECK FOR CORNERS 615 | BHS PINIT1 ;IF CORNER GET ANOTHER RANDOM NUMBER 616 | LDX #0 617 | STX ,Y ;ZERO SCREEN ADDRESS 618 | LEAY 10,Y ;NEXT POINT 619 | CMPY #TABLE+10*PNBITS 620 | BNE PINIT1 621 | * PLAYER EXPLOSION 622 | LDX #PXCOL ;INITIALIZE COLOR POINTER 623 | STX PCOLP 624 | LDA #56 ;INITIALIZE COLOR COUNTER 625 | STA PCOLC 626 | PX1 LDA #1 ;SLEEEP!!!!!! 627 | LDX #PX1A 628 | JMP SLEEPP 629 | PX1A LDX #0 ;ALWAYS ZERO 630 | LDY #TABLE ;INITIALIZE TABLE POINTER 631 | LDA [PCOLP] ;GET COLOR 632 | STA PCRAM+$B ;SET IN PSEUDO COLOR RAM 633 | BEQ PX8 ;ZERO COLOR, QUIT 634 | PX2 LDU ,Y ;ERASE OLD PIECE 635 | STX ,U 636 | STX $100,U 637 | LDD PYVELT,Y ;GET Y VELOCITY 638 | ADDD PYPOST,Y ;ADD Y POSITION 639 | CMPA #$2A ;CHECK IF OFF SCREEN 640 | BLO PX7 ;OFF SCREEN, NEXT PIECE 641 | STD PYPOST,Y ;SAVE NEW Y POSITION 642 | STA 1,Y ;UPDATE Y SCREEN ADDRESS 643 | LDD PXVELT,Y ;GET X VELOCITY 644 | ADDD PXPOST,Y ;ADD X POSITION 645 | CMPA #$98 ;CHECK IF OFF SCREEN 646 | BHI PX7 ;OFF SCREEN, NEXT PIECE 647 | STD PXPOST,Y ;SAVE NEW X POSITION 648 | STA ,Y ;UPDATE X SCREEN ADDRESS 649 | TSTB ;CHECK LEFT OR RIGHT FLAVOR 650 | BMI PX6 651 | LDD #$BBBB ;LEFT FLAVOR 652 | STD [,Y] 653 | BRA PX7 654 | PX6 LDU ,Y 655 | LDD #$0B0B ;RIGHT FLAVOR 656 | STD ,U 657 | LDD #$B0B0 658 | STD $100,U 659 | PX7 LEAY 10,Y ;NEXT PIECE 660 | CMPY #TABLE+10*PNBITS ;CHECK FOR LAST PIECE 661 | BNE PX2 ;NO, LOOP 662 | DEC PCOLC ;NEXT COLOR COUNT 663 | BNE PX1 ;NEXT PIECE 664 | LDU PCOLP ;NEXT COLOR 665 | LEAU 1,U 666 | STU PCOLP 667 | LDA #4 ;RE-INITIALIZE COLOR COUNTER 668 | STA PCOLC 669 | BRA PX1 ;CONTINUE 670 | PX8 JMP [PD2,U] ;RETURN 671 | * PLAYER EXPLOSION COLOR TABLE 672 | PXCOL FCB $FF,$7F,$3F,$37,$2F,$27,$1F,$17,7,6,5,4,3,2,0 673 | * 674 | *WAVE DATA 675 | *MAX,MIN,INTRADELT,INTERDELT 676 | *W1,W2,W3,W4 677 | WVTAB FCB 20,0,0,0 678 | FCB 15,20,20,20 ;LANDERS 679 | FCB 3,0,0,0 680 | FCB 0,3,4,5 ;TIES 681 | FCB 6,0,0,0 682 | FCB 0,1,3,4 ;PROBES 683 | FCB 10,0,0,0 684 | FCB 0,0,0,0 ;SCHITZOS 685 | FCB 10,0,0,0 686 | FCB 0,0,0,0 ;SWARMERS 687 | FCB 30,0,0,0 688 | FCB 30,25,20,16 ;WAVE TIME 689 | FCB 5,0,0,0 690 | FCB 5,5,5,5 ;WAVE SIZE 691 | FCB $60,0,3,2 692 | FCB $16,$1E,$26,$2E ;LANDER XV 693 | FCB $01,0,0,0 694 | FCB $00,$00,$01,$01 ;LANDER YV MSB 695 | FCB $FF,0,$10,$00 696 | FCB $70,$B0,$00,$00 ;LSB 697 | FCB $80,$10,$FC,$FE 698 | FCB $4A,$3A,$2A,$2A ;LDSTIM 699 | FCB $30,0,0,0 700 | FCB $20,$28,$2C,$30 ;TIE XV 701 | FCB 2,0,0,0 702 | FCB 1,1,2,2 ;SZRY 703 | FCB 1,0,0,0 704 | FCB $00,$00,$01,$01 ;SZYV MSB 705 | FCB $FF,$0,$08,$06 706 | FCB $62,$E0,$02,$12 ;" LSB 707 | FCB $60,$0,$8,$4 708 | FCB $0C,$1C,$24,$28 ;SZXV 709 | FCB $FF,$08,$FE,$FE 710 | FCB $2A,$22,$1E,$1C ;SZSTIM 711 | FCB $60,$0,$08,$02 712 | FCB $16,$1E,$20,$22 ;SWXV 713 | FCB 40,10,-2,-1 714 | FCB 25,25,25,25 ;SWSTIM 715 | FCB $3F,0,0,0 716 | FCB $1F,$1F,$1F,$3F ;SWAC 717 | FCB $C0,$18,$F4,$FC 718 | FCB $D4,$C4,$A4,$94 ;UFOTIM 719 | FCB 10,3,$FF,$FF 720 | FCB 15,13,12,10 ;UFSTIM 721 | FCB 200,40,$F4,$F8 722 | FCB 240,220,200,200 ;UFOSK 723 | WVTEND EQU * 724 | END 725 | -------------------------------------------------------------------------------- /src/romc8.src: -------------------------------------------------------------------------------- 1 | * TTL ROMC8 ;- DIAG ROM UPPER HALF - 12/22/80 2 | * 3 | * AUDIT / GAME ADJUSTS 4 | * 5 | AUDITG JSR WATCHD ;RESET DOGGY 6 | JSR NEWTST ;CLEAR SCREEN 7 | BSR WHITE ;SET LETTERS 8 | LDU #VINS15 ;"WILLIAMS DEFENDER" 9 | LDX #$2820 ;SCREEN ADDRESS AT TOP 10 | JSR WATCHD ;RESET DOGGY 11 | JSR VWTEXT ;WRITE IT OUT 12 | LDY #IAUD1 ;GIVE INSTRUCTIONS PART 1 13 | JSR VOPERI ;ON SCREEN 14 | LDY #1500 ;1.5 SEC DELAY 15 | JSR DELAY 16 | TST ASCNTR ;CHECK FOR ADV W AUTO 17 | BNE AUDC1 ;YES, GO BACK 18 | CLR TEMP1C ;SET TO BASE FUNCTION # 19 | LDA #1 ;SET TO INIT DISAUD 20 | STA TEMP1B ;INTO TEMPORARY 21 | LEAS -32,S ;MAKE ROOM ON THE STACK 22 | JSR SCRCLV 23 | LDU #VINS15 ;"WILLIAMS DEFENDER" 24 | LDX #$2820 ;TOP OF SCREEN 25 | JSR WATCHD ;DOGGY 26 | JSR VWTEXT ;WRITE IT OUT 27 | CLR TEMP1A ;ZERO SCAN DELAY TIME 28 | LDY #IAUD2 ;POINT TO PART 2 29 | JSR VOPERS ;TRANSFER THEM TO THE BOTTOM 30 | JSR WATCHD ;RESET DOGGY 31 | LDA #$20 ;FOR SPACE CODE 32 | TFR A,B 33 | DECB ;DO ONLY 31 34 | LEAX ,S ;GET DESTIN 35 | CLRBU STA ,X+ 36 | DECB 37 | BNE CLRBU 38 | LDA #$2F ;SLASH 39 | STA ,X+ 40 | LEAX ,S ;POINT TO START 41 | AUDIT0 JSR DELY10 ;REFRESH WATCHDOG SLOWLY 42 | LDX #$CC00 ;SEE IF ADVANCE PRESSED 43 | JSR INB0 44 | BITB #2 ;CHECK FOR ADVANCE 45 | BEQ AUDIT2 ;NO, REFRESH+MONITOR CHANGES 46 | BITB #1 ;AUTO/MANUAL 47 | BNE AUDT1A ;AUTO 48 | INC TEMP1B ;MAKE IT REFRESH HERE 49 | DEC TEMP1C ;BUMP FUNCTION DOWN 50 | BPL AUDIT2 ;STILL OK 51 | LDB #27 ;WRAP AROUND 52 | STB TEMP1C ;SAVE IT+FALL THRU 53 | BRA AUDIT2 54 | AUDT1A INC TEMP1C ;YES, GO TO NEXT FUNCTION 55 | INC TEMP1B ;DISPLAY NEW FUNCTION TOO 56 | LDA #28 ;AT MAX? 57 | CMPA TEMP1C 58 | BNE AUDIT2 ;NO, GET NEXT ONE 59 | LEAS 32,S ;REMOVE BUFFER FROM STACK 60 | AUDC1 JSR WATCHD ;RESET WATCHDOG HERE 61 | JMP VAMEOV ;RETURN TO CALLER!! 62 | AUDIT2 JSR ALTER ;SEE IF ANY CHANGES! 63 | TST TEMP1B ;WAS A CHANGE MADE? 64 | BEQ AUDIT0 ;NO, DON'T CHANGE DISPLAY 65 | LDB TEMP1C ;GET FUNCTION # 66 | CMPB #9 ;WAS IT CSELECT 67 | BNE AUDIT3 ;NO 68 | LDX #COINSL ;POINT TO IT 69 | JSR RCBV 70 | TSTB ;WAS IT 0 71 | BEQ AUDIT3 ;YES, SKIP 72 | CMPB #8 ;WAS IT 8 73 | BHI AUDIT4 ;USE MODE 1 74 | JSR COININ ;TRANSFER THESE 75 | BRA AUDIT3 ;SKIP DOWN 76 | AUDIT4 LDX #COINSL ;POINT TO SELECT 77 | PSHS X ;SAVE FOR LATER 78 | LDB #$01 ;GET COIN MODE 1 79 | JSR WCBV 80 | JSR COININ ;TRANSFER 6 BYTES 81 | CLRB ;NOW SET SELECT TO 0 82 | PULS X ;AT SELECT 83 | JSR WCBV 84 | AUDIT3 BSR DISAUD ;GO SHOW UPDATES 85 | AUDT3A LDA TEMP1A 86 | CMPA #6 ;CHECK IF ALREADY SCANNING 87 | BEQ AUDT3D ;CONTINUE SCANNING 88 | TSTA ;CHECK IF SECOND DELAY 89 | BNE AUDT3B ;START SCANNING 90 | LDA #100 ;FIRST DELAY MAKE NEXT DELAY LONG 91 | BRA AUDT3C 92 | AUDT3B LDA #6 ;SCANNING RATE 93 | AUDT3C STA TEMP1A ;SAVE RATE 94 | * DELAY 95 | INCA 96 | LDB #$FF ;INITIALIZE DEBOUNCE SHIFT REGISTER 97 | AUDT3D JSR DELY10 ;10 MILLISECOND DELAY 98 | DECA ;COUNT 99 | BEQ AUDT3G ;DONE? 100 | LDX #$CC00 ;CHECK FOR STOP CHANGES 101 | PSHS B ;SAVE SHIFT REGISTER 102 | JSR INB0 ;UPDATE SHIFT REGISTER 103 | BITB #$A 104 | BNE AUDT3E 105 | ANDCC #$FE 106 | BRA AUDT3F 107 | AUDT3E ORCC #1 108 | AUDT3F PULS B ;GET SHIFT REGISTER 109 | RORB ;SHIFT 110 | BNE AUDT3D ;NOT DEFINITELY OPEN?, CONTINUE DELAY 111 | CLR TEMP1A ;DEFINITELY OPEN - ZERO SCAN DELAY TIME 112 | AUDT3G CLR TEMP1B ;WE DID IT, DON'T REPEAT TILL NEXT CHANGE 113 | JMP AUDIT0 ;STAY IN LOOP FOR A WHILE 114 | * 115 | * DISPLAY AUDIT HERE 116 | * 117 | DISAUD LEAY 2,S ;POINT TO START FOR ERASE 118 | LDX #$1080 ;POINT TO SCREEN START 119 | JSR VERAST ;ERASE A STACK FULL 120 | JSR CLRBUF ;MAKE IT NULL 121 | * NOW GET FUNCTION # 122 | LDA TEMP1C ;GET IT 123 | INCA ;MAKE IT 1-32 124 | JSR BINBCD ;MAKE IT BCD 125 | JSR ASCII ;MAKE IT ASCII 126 | STD 0,X ;SAVE IN BUFFER 127 | * GET MESSAGE FOR SCREEN 128 | LDB TEMP1C ;GET FUNCTION NUMBER 129 | ASLB ;X2 130 | ASLB ;X4 PER DISPLAY 131 | LDX #MSGAUD ;POINT TO AUDIT MESSAGES 132 | ABX ;ADD OFFSET 133 | LDY 0,X ;GET SOURCE POINTER 134 | LDU 2,X ;GET CHAR/ADDRESS CHARACTERIZER 135 | LEAX 14,S ;RESET TO VALID AREA 136 | DISAU3 LDA ,Y+ ;GET SOURCE 137 | CMPA #$2F ;SLASH? 138 | BEQ DISAU2 ;YES, DONE 139 | STA ,X+ ;SAVE IN DESTINATION 140 | BRA DISAU3 ;LOOP 141 | * NOW PUT UP SOME DIGITS 142 | DISAU2 TFR U,D ;MOVE TO A/B PAIR 143 | LEAU 2,S ;POINT TO START 144 | LDX #CMOS ;POINT TO START 145 | ABX ;ADD TO GET CORRECT START ADDRESS 146 | JSR RCBV ;GET DATA IN B 147 | PSHS D ;SAVE FOR A BIT 148 | LDB TEMP1C ;GET FUNCTION # 149 | INCB ;WORK IN HUMAN NUMBERS 150 | CMPB #7 ;4 DIGITS TO DISPLAY? 151 | BHI DISAU4 ;NO 152 | DISAU9 PULS D ;GET OUR BCD BACK IN B 153 | DISAU7 TFR B,A ;MOVE FOR ASCII 154 | JSR ASCII ;MAKE IT INTO 2 DIGITS 155 | STD 7,U ;SAVE 1ST SET 156 | JSR RCAV ;GET 2ND SET 157 | DISAU6 JSR ASCII ;MAKE THEM INTO A PAIR TOO 158 | STD 9,U ;SAVE THEM TOO 159 | BRA DISAUE ;GO TO THE END NOW 160 | DISAU4 CMPB #8 ;6 WITH DUMMY 0? 161 | BNE DISAU8 ;NO, HANDLE AS 2 DIGIT 162 | * FUNCTION 10 REQUIRES DUMMY 0 163 | LDD #$3030 ;PUT IN DUMMY 0 164 | STD 9,U ;PUT IN LSD 165 | LEAU -2,U ;BACK UP TWO PLACES 166 | BRA DISAU9 ;SHOW THEM ABOVE 167 | DISAU8 PULS D ;JUST 2 168 | TFR B,A ;MOVE IT FOR ASCII 169 | BRA DISAU6 ;GO PUT DOWN 2ND SET 170 | * NOW DISPLAY THE ENTIRE BUFFER 171 | DISAUE LDX #$1080 ;POINT TO CENTER SCREEN 172 | LEAY 2,S ;GET THE START 173 | JMP VDISST ;GO PLAY IT OUT!! 174 | * 175 | * MAKE BINARY IN A INTO BCD IN A 176 | * 177 | BINBCD PSHS B ;NEED B 178 | TFR A,B ;FOR COUNTER 179 | LDA #$99 ;START-1 180 | BINBC1 ADDA #$01 ;MAKE IT BCD 181 | DAA ;HUMANIZE 182 | DECB ;COUNT OFF 183 | BPL BINBC1 ;LOOP TILL DONE 184 | PULS B,PC ;RESTORE STATE 185 | * 186 | * MAKE DOUBLE ASCII FROM BCD IN A 187 | * 188 | ASCII TFR A,B ;SAVE IN B 189 | ANDA #$F0 ;LEAVE ONLY MSD 190 | LSRA 191 | LSRA 192 | LSRA 193 | LSRA ;SHIFT TO LS 194 | ADDA #$30 195 | ANDB #$0F ;LEAVE ONLY LSD 196 | ADDB #$30 ;MAKE IT ASCII 197 | RTS ;DONE 198 | * 199 | * SET BUFFER TO SPACE CODES AND EOW CODE 200 | * 201 | CLRBUF LDA #$20 ;32 TO INIT 202 | TFR A,B ;AND ITS THE SPACE CODE TOO 203 | DECB ;LEAVE LAST ONE OUT 204 | LEAX 4,S ;GET TO BUFFER START(2DEEP IN STACK) 205 | CLRBU1 STA ,X+ ;INIT IT 206 | DECB ;DONE 207 | BNE CLRBU1 ;NO, LOOP 208 | LDA #$2F ;SLASH CODE 209 | STA ,X+ ;SAVE IT 210 | LEAX 4,S ;RESTORE TO START(2DEEP IN STACK) 211 | RTS ;DONE HERE 212 | * 213 | * CMOS INTERFACE ROUTINES FOR ADJUSTMENTS 214 | * 215 | * 216 | * ADD 1 TO BCD NUMBER IN CMOS AT X 217 | * 218 | BMPNUP CMPX #REPLAY ;SPECIAL CASE? 219 | BNE BMP1 ;NO 220 | JSR RCDV ;GET MS,LS 221 | LEAX -4,X ;DEFEAT AUTO INC 222 | EXG A,B ;BECAUSE OF DAA 223 | ADDA #$10 ;ADD 10 224 | DAA ;HUMANIZE 225 | BCC BMP2 ;NO CARRY 226 | EXG A,B ;RESTORE TO ORIG 227 | ADDA #$01 ;BUMP BY 1 228 | BMP7 DAA ;STAY BCD 229 | EXG A,B ;DOUBLE EXCHANGE 230 | BMP2 EXG A,B ;RESTORE TO ORIG 231 | BMP3 INC TEMP1B ;SHOW CHANGE MADE 232 | BMP6 JMP WCDV ;PUT IT BACK 233 | * ORDINARY CASE 234 | BMP1 JSR RCAV ;GET A BCD NUMBER 235 | ADDA #$01 ;ADD 1 TO IT 236 | BMP0 DAA ;HUMANIZE 237 | BMP4 LEAX -2,X ;DEFEAT AUTO INC 238 | INC TEMP1B ;SET FLAG SINCE CHANGE 239 | JMP WCAV ;RETURN IT TO ITS PLACE 240 | * 241 | * SUBTRACT 1 FROM BCD NUMBER IN CMOS AT X 242 | * 243 | BMPNDN CMPX #REPLAY ;SPECIAL CASE? 244 | BNE BMP5 ;NO 245 | JSR RCDV ;GET 2 DIGITS 246 | LEAX -4,X ;REMOVE OFFSET 247 | EXG A,B ;SWAP LS,MS 248 | ADDA #$90 ;SET TO 90 249 | DAA ;ADJUST TO HUMAN 250 | EXG A,B ;UNDERFLOW 251 | ADCA #$99 ;SUBTRACT UNDERFLOW 252 | BRA BMP7 ;FINISH ABOVE 253 | BMP5 JSR RCAV ;GET A BCD NUMBER 254 | ADDA #$99 ;SUBTRACT 1 FROM IT 255 | BRA BMP0 ;FINISH ABOVE 256 | * 257 | * ALTER - CHANGE CMOS VALUE IF SW MADE AND ALTERABLE 258 | * 259 | ALTER LDB TEMP1C ;GET FUNCTION # 260 | INCB ;NORMALIZE 261 | CMPB #7 ;UNCHANGEABLE? 262 | BHI ALTER1 ;YES 263 | ALTERX RTS ;FOR NOW ON FUNNY CASE 264 | ALTER1 CMPB #9 ;1ST 2 DIGIT ADJUST?? 265 | BLS ALTER2 ;YES, ALLOWED 266 | CMPB #16 ;COINAGE MODE? 267 | BHI ALTER2 ;NO, OK TO DO IT 268 | CMPB #10 ;SELECT? 269 | BEQ ALTER2 ;YES, IT CAN BE CHANGEE 270 | * HERE WHEN COIN FUNCTION BUT NOT COINAGE SELECT 271 | LDX #COINSL ;GRAB THE DATA 272 | JSR RCAV ;GET IT 273 | TSTA ;SET FLAGS 274 | BNE ALTERX ;NOT AT ZERO, NO CHANGE ALLOWED 275 | ALTER2 DECB ;REMOVE OFFSET 276 | ASLB 277 | ASLB ;SHIFT X4 FOR ADDRESS 278 | LDX #MSGAUD ;POINT TO AUDIT MESSAGES 279 | ABX ;POINT TO CORRECT ADDRESS 280 | LDB 3,X ;GET OFFSET 281 | LDX #CMOS ;POINT TO CMOS START 282 | ABX ;GET CMOS ADDRESS + FALL THRU 283 | * 284 | * CHECK USING THE HIGH SCORE RESET 285 | * 286 | HYSCRE PSHS X ;SAVE CMOS 287 | HYSCR1 JSR DELY10 ;REFRESH WATCHDOG SLOWLY 288 | LDX #$CC00 ;POINT TO PIA 289 | JSR INB0 290 | BITB #$02 ;ADV? 291 | BEQ HYSCR2 ;NO 292 | PULS X,PC ;GO BACK 293 | HYSCR2 BITB #$08 ;HSRESET? 294 | BNE HYSCR4 ;YES, DO IT 295 | CLR TEMP1A ;RESET SCAN TIME 296 | BRA HYSCR1 ;LOOP 297 | HYSCR4 PULS X ;GET CMOS ADDRESS 298 | CMPX #DIPSW ;CHECK IF DIP SWITCH FUNCTION 299 | BNE HYSCR3 ;NO 300 | PSHS B,X ;SAVE REGISTERS 301 | LDX #DIPFLG ;SET DIP SWITCH FLAG 302 | LDB #1 303 | JSR OUTB0 304 | PULS B,X ;RESTORE REGISTERS 305 | HYSCR3 LSRB ;UP/DOWN 306 | LBCS BMPNUP ;UP 307 | JMP BMPNDN ;DOWN 308 | * 309 | * TABLES/SUBROUTINES 310 | * 311 | * COLOR RAM TEST TABLE 312 | COLRMT FCB $02,$03,$04,$10,$18,$20,$40,$80 313 | * COLOR RAM TEST DATA TABLE 314 | COLRMD FCB $00,$FF,$11,$EE,$22,$DD,$33,$CC 315 | FCB $44,$BB,$55,$AA,$66,$99,$77,$88 316 | * SKIP SOUND TABLE 317 | SKIPSN FCB $13,$1B,$1C 318 | FCB 0 ;ZERO-END OF TABLE 319 | * MONITOR TEST PATTERN VECTOR TABLE 320 | PATTBL FDB CROSS,RFIELD,GFIELD,BFIELD,COLBAR 321 | * COLOR BARS 322 | CBARCL FCB $05,$05,$28,$28,$80,$80,$00,$00 323 | FCB $AD,$AD,$2D,$2D,$A8,$A8,$85,$85 324 | * WAIT FOR ADVANCE SWITCH TO BE PRESSED AGAIN 325 | ADVSW LDX #$CC00 ;READ COIN DOOR SWITCHES 326 | LDY #100 ;DELAY 100 MS 327 | ADVSW1 JSR DELAY 328 | JSR INB0 329 | BITB #2 ;CHECK ADVANCE SWITCH 330 | BNE ADVSW1 ;STILL CLOSED 331 | ADVSW2 JSR DELAY 332 | JSR INB0 333 | BITB #2 ;CHECK ADVANCE SWITCH 334 | BEQ ADVSW2 ;STILL OPEN 335 | RTS ;CLOSED AGAIN-RETURN 336 | * NEW TEST 337 | NEWTST JSR SCRCLV ;CLEAR SCREEN 338 | BSR WATCHD ;RESET WATCHDOG 339 | JSR ZEROCL ;CLEAR ALL COLORS 340 | DEC ASCNTR ;DECREMENT SWITCH COUNTER 341 | BPL NEWTS1 342 | CLR ASCNTR 343 | NEWTS1 RTS 344 | * NEXT TEST WAIT FOR SWITCH WITH AUTO 345 | NEXTST LDY #1 ;MINIMUM DELAY 346 | NEXTS1 BSR DELAY 347 | TST ASCNTR ;CHECK FOR ADVANCE WITH AUTO 348 | BEQ NEXTS1 349 | RTS 350 | * TIME DELAX ROUTINE Y REGISTER IN MS 351 | DELAY PSHS Y,A,CC 352 | DELAY2 BSR WATCHD ;RESET WATCHDOG 353 | TST ASCNTR ;CHECK FOR ABORT DELAY 354 | BNE DELAY4 355 | LDA #$B2 356 | DELAY3 DECA 357 | BNE DELAY3 358 | LEAY -1,Y 359 | BNE DELAY2 360 | DELAY4 PULS CC,A,Y,PC ;RETURN-ALL REGISTERS SAVED 361 | * DELAY 10 MILLISECONDS ALWAYS 362 | DELY10 PSHS Y,B 363 | LDB ASCNTR ;GET ADV W AUTO COUNTER 364 | CLR ASCNTR ;CLEAR IT 365 | LDY #10 ;DELAY 10 MILLISECONDS 366 | BSR DELAY 367 | ADDB ASCNTR ;ADD ANY NEW ADV W AUTO COUNTS 368 | STB ASCNTR ;SAVE ADV W AUTO COUNTER 369 | PULS B,Y,PC 370 | * RESET WATCHDOG - CHECK FOR ADVANCE SWITCH WITH AUTO 371 | WATCHD PSHS X,B,CC 372 | LDB #$38 ;RESET WATCHDOG 373 | LDX #$C3FC 374 | JSR OUTB0 375 | LDX #$CC00 ;READ COIN DOOR SWITCHES 376 | JSR INB0 377 | COMB ;CHECK STATE OF SWITCHES 378 | ANDB #3 379 | BEQ WATCH1 ;SHIFT ONTO BUFFER 380 | ANDCC #$FE 381 | WATCH1 LDB ASBUFF 382 | RORB 383 | STB ASBUFF 384 | BNE WATCH2 ;CHECK BUFFER 385 | STB ASLAST ;DEFINITELY OPEN, UPDATE LAST POSITION 386 | WATCH2 COMB ;CHECK IF DEFINITELY CLOSED 387 | BNE WATCH3 ;NO?, QUIT 388 | LDB ASLAST ;CHECK LAST POSITION 389 | BNE WATCH3 ;STILL CLOSED, QUIT 390 | COMB ;NEW CLOSURE 391 | STB ASLAST ;UPDATE LAST POSITION 392 | INC ASCNTR ;INCREMENT ADV. W AUTO COUNTER 393 | WATCH3 PULS CC,B,X,PC ;RESTORE REGISTERS, RETURN 394 | * ZERO COLORS 395 | * SET COLORS Y POINTS TO TABLE 396 | SCOLOR PSHS Y,X,B 397 | LDX #$C000 398 | SCOLR1 LDB ,Y+ 399 | JSR OUTB0 400 | LEAX 1,X 401 | CMPX #$C010 402 | BNE SCOLR1 403 | PULS B,X,Y,PC 404 | * LED DISPLAY DATA IN ACCUMULATOR B 405 | LEDS PSHS X,B 406 | LSRB 407 | RORB 408 | RORB 409 | RORB 410 | BPL LED1 411 | INCB 412 | LED1 RORB 413 | RORB 414 | LDX #$CC00 415 | JSR OUTB0 416 | ASLB 417 | ASLB 418 | ASLB 419 | ORB #$3F 420 | LDX #$CC02 421 | JSR OUTB0 422 | PULS B,X,PC ;RESTORE B, RETURN 423 | * FLASH LEDS TWICE RIGHT NIBBLE OF ACCUMULATOR B 424 | FLASHL PSHS Y,D 425 | LDA #2 ;FLASH LEDS TWICE 426 | LDY #500 ;1/2 SECOND DELAY 427 | FLASH1 JSR LEDS ;LEDS ON 428 | JSR DELAY 429 | CLRB 430 | JSR LEDS ;LEDS OFF 431 | JSR DELAY 432 | LDB 1,S ;GET LED DATA 433 | DECA 434 | BNE FLASH1 435 | PULS D,Y 436 | * INITIALIZE DIRECT PAGE VARIABLES 437 | INITDP PSHS D 438 | CLR MESPT ;INITIALIZE MESSAGE POINTER 439 | CLR ASCNTR ;ZERO ADV W AUTO SWITCH COUNTER 440 | LDA #1 441 | STA ASLAST ;SET ADV W AUTO SWITCH LAST POSITION 442 | LDA #DIABLK ;SET BLOCK NUMBER 443 | STA MAPCR ;INTO RAM 444 | LDD #$FFFF ;INITIALIZE NUMBER 445 | STD NUMBER 446 | PULS D,PC 447 | * ZERO COLORS 448 | ZCOLRS EQU * 449 | ZEROCL PSHS X,B 450 | CLRB 451 | LDX #$C000 452 | ZEROC1 JSR OUTB0 453 | LEAX 1,X 454 | CMPX #$C010 455 | BNE ZEROC1 456 | PULS B,X,PC 457 | * PLAY SOUND IN B 458 | PLAYB PSHS X,B 459 | COMB 460 | ANDB #$3F ;MASK BITS 6 AND 7 461 | LDX #$CC02 462 | JSR OUTB0 463 | JSR DELY10 ;WAIT 10 MILLISECONDS 464 | LDB #$3F 465 | JSR OUTB0 466 | JSR DELY10 ;WAIT 10 MILLISECONDS 467 | PULS B,X,PC 468 | * CONVERT B FROM HEX TO DECIMAL 469 | CONVTB PSHS A 470 | TFR B,A 471 | ANDA #$0F 472 | ADDA #0 473 | DAA 474 | ANDB #$F0 475 | CONVR1 BEQ CONVR2 476 | ADDA #$16 477 | DAA 478 | SUBB #$10 479 | BRA CONVR1 480 | CONVR2 TFR A,B 481 | PULS A,PC 482 | * COLOR BARS - USED TEMP2A 483 | COLORB PSHS X,D 484 | LDD #0 ;INITIALIZE SECTION COUNTER 485 | LDX #0 ;INITIALIZE SCREEN POINTER 486 | COLOR1 STX TEMP2A ;SAVE END OF BAR 487 | LEAX $F00,X ;GET START OF BAR 488 | COLOR2 STD ,--X ;STORE COLOR TO SCREEN 489 | CMPX TEMP2A ;CHECK IF BAR FINISHED 490 | BNE COLOR2 491 | LEAX $900,X 492 | TSTA ;CHECK FOR FIRST BAR 493 | BNE COLOR3 494 | LDX #$F00 ;WIDEN IT 495 | COLOR3 JSR WATCHD ;RESET WATCHDOG 496 | TST ASCNTR ;CHECK FOR ADV W AUTO 497 | BNE COLOR4 ;YES?, ABORT 498 | ADDD #$1111 ;NEXT COLOR 499 | BCC COLOR1 ;NOT DONE, NEXT BAR 500 | COLOR4 PULS D,X,PC ;RETURN 501 | * 502 | * COLOR RAM BARS 503 | * 504 | RAMBAR JSR ZCOLRS ;SET TO BLACK 505 | LDX #$0000 506 | LDY #COLRMD ;POINT TO DATA 507 | RAMBA1 STX TEMP2A ;SAVE END OF BAR 508 | LEAX $F00,X ;GET START OF BAR 509 | LDA ,Y+ ;GET COLOR DATA 510 | TFR A,B ;FOR D 511 | RAMBA2 STD ,--X ;STORE COLOR DATA 512 | CMPX TEMP2A ;BAR FINISHED? 513 | BNE RAMBA2 514 | LEAX $900,X 515 | TSTA ;1ST BAR? 516 | BNE RAMBA3 ;NO 517 | LDX #$F00 ;WIDEN IT 518 | RAMBA3 JSR WATCHD ;RESET DOG 519 | TST ASCNTR ;ADV W AUTO? 520 | BNE RAMBA4 ;YES, ABORT 521 | CMPY #COLRMD+16 ;DONE ALL BARS? 522 | BNE RAMBA1 ;NO, LOOP 523 | RAMBA4 RTS ;GO BACK 524 | * 525 | * COIN SELECT SUBROUTINE HERE 526 | * 527 | COININ LDX #COINSL ;POINT TO SELECT MODE 528 | JSR WCBV ;WRITE IT 529 | ASLB ;X2 530 | PSHS B ;FOR LATER 531 | ASLB ;X4 532 | ADDB ,S+ ;2X+4X=6X 533 | LDX #CSELCT-6 ;POINT TO SOURCE 534 | ABX ;ADD TO IT 535 | LDY #SLOT1M ;POINT TO DESTINATION 536 | LDB #$06 ;6 BYTES TO MOVE 537 | * FALL THRU TO MOVE 538 | * 539 | * CMOS MOVE: DESTINATION=Y, SOURCE=X, COUNT=B 540 | * 541 | CMOSMV PSHS A ;NEED A 542 | CMMV1 LDA ,X+ ;GET SOURCE 543 | EXG X,Y ;SWAP 544 | JSR WCAV ;WRITE IT 545 | EXG X,Y ;SWAP BACK 546 | DECB ;DONE? 547 | BNE CMMV1 ;NO,LOOP 548 | PULS A,PC ;RETURN CLEAN 549 | * 550 | * CLEAR CMOS: CRASHES A,B,X 551 | * 552 | CLRAUD LDB #$0E ;28 TOTAL BYTES 553 | BRA CMSCLR 554 | CLRALL CLRB ;DO 128 555 | CMSCLR LDX #CMOS ;POINT TO START 556 | STOR0X CLRA ;DO IT SO STORRA IS GEN PURPOSE 557 | STORRA JSR WCAV ;WRITE INDIRECT 558 | DECB ;DONE? 559 | BNE STORRA ;NO, LOOP 560 | RTS ;BYE 561 | * 562 | * INIT CMOS: SAVES STATE 563 | * 564 | CMINIT PSHS X,Y,D ;SAVE STATE 565 | BSR CLRALL ;CLEAR FIRST 566 | LDX #DEFALT ;POINT TO ROM 567 | LDY #CMSDEF ;POINT TO DESTINATION 568 | LDB #DEFSIZ ;LENGTH 569 | BSR CMOSMV ;MOVE THEM ALL 570 | PULS X,Y,D,PC ;ALL DONE 571 | * 572 | * AUDIT: COUNT=A, COUNTER=B (1-7) 573 | * 574 | AUD1 PSHS D,X ;SAVE STATE 575 | LDA #$01 ;BUMP BY COUNT OF 1 576 | BRA AUD2 577 | AUD PSHS D,X ;SAVE STATE 578 | AUD2 ANDB #$07 ;LIMIT TO 0-7 579 | BEQ AUDX ;AND EXIT ON 0(INVALID COUNTER) 580 | ASLB ;MAKE INTO 4X 581 | ASLB 582 | LDX #CMOS-3 ;POINT TO START-3 (BECAUSE OF RMB 1) 583 | ABX ;GET THE CORRECT DESTINATION 584 | JSR RCBV 585 | PSHS B ;SAVE IT 586 | JSR RCBV ;GET LSBYTE 587 | PSHS B ;SAVE IT 588 | ADDA ,S+ ;DO LSB FIRST 589 | DAA ;HUMANIZE 590 | EXG A,B ;DAA ONLY WORKS ON A 591 | PULS A ;GET MSBYTE 592 | ADCA #$0 ;PROPOGATE CARRY 593 | DAA ;HUMANIZE 594 | LEAX -4,X ;DEFEAT AUTO INC 595 | JSR WCDV ;SAVE MS/LS 596 | AUDX PULS D,X,PC ;CLEAN UP 597 | * 598 | * ACRED: ADDS A CREDITS TO TOTAL CREDITS; 99 MAX 599 | * 600 | ACRED PSHS A,X ;SAVE 601 | ADDA CREDIT ;GET PRESENT 602 | DAA ;HUMANIZE 603 | BCC ACRD0 ;NO OVERFLOW 604 | LDA #$99 ;YES, STAY AT 99 605 | ACRD0 STA CREDIT ;SAVE NEW COUNT 606 | LDX #CREDST ;BACKUP CREDITS 607 | JSR WCAV 608 | PULS X,A,PC ;GO BACK CLEAN 609 | * 610 | * COIN SLOT ROUTINES 611 | * 612 | COINR PSHS D,X ;SAVE STATE 613 | LDB #$03 ;3RD TOTALS(RIGHT COIN) 614 | BRA COIN ;HANDLE BELOW 615 | COINC PSHS D,X ;SAVE STATE 616 | LDB #$02 ;2ND TOTALS(CENTER COIN) 617 | BRA COIN ;HANDLE BELOW 618 | COINL PSHS D,X ;SAVE STATE 619 | LDB #$01 ;1ST TOTALS(LEFT COIN) 620 | COIN JSR AUD1 ;BUMP COUNT BY 1 621 | ASLB ;DOUBLE FOR CMOS 622 | LDX #SLOT1M-2 ;POINT TO START-2 623 | ABX ;REMOVE OFFSET 624 | JSR RCBV ;GET CORRECT SLOT X 625 | BSR BCDBIN ;CONVERT TO BINARY 626 | LDA BUNITS ;GET PRESENT BONUS UNITS 627 | PSHS B ;AND ADD PRESENT COUNT TO IT 628 | ADDA ,S 629 | STA BUNITS ;UPDATE 630 | LDA CUNITS 631 | ADDA ,S+ ;GET PRESENT 632 | STA CUNITS ;UPDATE 633 | LDX #MINUNT ;GET MINIMUM UNITS 634 | JSR RCBV ;FROM CMOS 635 | BSR BCDBIN ;WORK IN BINARY!! 636 | PSHS B ;FOR CBA 637 | CMPA ,S+ ;ENOUGH? 638 | BCC COIN1 ;YES, GIVE IT 639 | PULS D,X,PC ;NOT ENOUGH SO FAR, BYE!! 640 | COIN1 LDX #CUNITC ;HOW MANY? 641 | JSR RCBV ;GET IT 642 | BSR BCDBIN ;CONVERT TO HEX 643 | BSR DIVAB ;SAVE REMAINDER IN B 644 | PSHS A ;SAVE COUNT TO BE AWARDED FOR A WHILE 645 | STB CUNITS ;SAVE REMAINDER 646 | LDX #CUNITB ;BONUS REQUIRES HOW MANY? 647 | JSR RCBV ;IN B 648 | LDA BUNITS ;GET BONUS SO FAR 649 | BSR BCDBIN ;CONVERT TO BINARY 650 | BSR DIVAB ;DIVIDE 651 | TSTA ;ANY YET? 652 | BEQ COIN2 ;NO 653 | CLR CUNITS ;YES, RESET ANY EXTRA 654 | CLR BUNITS 655 | COIN2 ADDA ,S+ ;GET OTHER CREDITS EARNED 656 | DAA ;HUMANIZE 657 | LDB #$04 ;BUMP TOTPDC 658 | JSR AUD ;BY THE COUNT PAID FOR 659 | JSR ACRED ;ADD TO CREDITS COUNTER 660 | PULS D,X,PC ;CLEAN + GO 661 | * 662 | * DIVAB: A/B, REMAINDER IN B 663 | * 664 | DIVAB PSHS B ;SAVE 665 | TSTB ;ANY? 666 | BNE DIVAB0 ;YES, HANDLE 667 | CLRA ;NO,SET TO 0 668 | PULS B,PC ;CLEAN RETURN 669 | DIVAB0 EXG A,B ;FOR DAA 670 | LDA #$99 ;START-1 671 | DIVAB1 ADDA #$01 ;NEXT 672 | DAA ;HUMANIZE 673 | SUBB ,S ;TAKE AWAY N 674 | BCC DIVAB1 ;LOOP TILL OVERFLOW 675 | ADDB ,S+ ;ADD REMAINDER + FIX STACK 676 | RTS ;BTE 677 | * 678 | * BCDBIN: BCD=B, BINARY=B 679 | * 680 | BCDBIN PSHS A ;SAVE STATE 681 | EXG A,B ;MOVE B TO A FOR DAA 682 | CLRB ;SET COUNT TO ZERO 683 | BCDBN1 TSTA ;DONE? 684 | BNE BCDBN2 ;NO 685 | PULS A,PC ;CLEAN UP + GO 686 | BCDBN2 ADDA #$99 ;SUBTRACT 1 687 | DAA ;HUMANIZE 688 | INCB ;BUMP COUNTER 689 | BRA BCDBN1 ;LOOP TILL A=0 690 | * 691 | * RESET HIGH SCORES BACK TO DEFAULT+BACKUP HSTD 692 | * ALSO JAMS INTO RAM TABLE FOR TODAYS HSTD 693 | * 694 | RHSTD PSHS X,Y,D ;SAVE STATE 695 | LDX #DEFALT ;GET SOURCE 696 | LDY #CRHSTD ;POINT TO DESTINATION 697 | LDB #48 ;6X8 TO MOVE 698 | JSR CMOSMV ;MOVE IT 699 | BSR RHSTDS ;MOVE DEFALTS TO TODAY RAM 700 | PULS X,Y,D,PC ;GO BACK 701 | * 702 | * MOVE DEFALTS TO TODAYS HSTD AREA 703 | * 704 | RHSTDS PSHS X,Y,D ;SAVE STATE 705 | LDY #DEFALT ;POINT TO DEFALTS 706 | LDX #THSTAB ;DESTINATION 707 | LDB #48 ;6X8 TO MOVE 708 | RHSTD1 LDA ,Y+ ;GET SOURCE 709 | JSR WCAV ;OUTPUT AS DOUBLE BYTE 710 | DECB ;DONE? 711 | BNE RHSTD1 ;NO 712 | PULS X,Y,D,PC ;CLEAN UP + GO BACK 713 | * 714 | * AUDIT MESSAGES LITERALLY HERE FOR NOW 715 | * 716 | MSGAUD FDB A1,$1 717 | FDB A2,$5 718 | FDB A3,$9 719 | FDB A4,$D 720 | FDB A5,$11 721 | FDB A6,$15 722 | FDB A7,$19 723 | FDB A8,$81 724 | FDB A9,$85 725 | FDB A10,$87 726 | FDB A11,$89 727 | FDB A12,$8B 728 | FDB A13,$8D 729 | FDB A14,$8F 730 | FDB A15,$91 731 | FDB A16,$93 732 | FDB A17,$95 733 | FDB A18,$97 734 | FDB A19,$99 735 | FDB A20,$9B 736 | FDB A21,$9D 737 | FDB A22,$9F 738 | FDB A23,$A1 739 | FDB A24,$A3 740 | FDB A25,$A5 741 | FDB A26,$A7 742 | FDB A27,$A9 743 | FDB A28,$7D 744 | * 745 | * ACTUAL MESSAGES HERE 746 | * 747 | A1 FCC "COINS LEFT/" 748 | A2 FCC "COINS CENTER/" 749 | A3 FCC "COINS RIGHT/" 750 | A4 FCC "TOTAL PAID/" 751 | A5 FCC "SHIPS WON/" 752 | A6 FCC "TOTAL TIME/" 753 | A7 FCC "TOTAL SHIPS/" 754 | A8 FCC "BONUS SHIP LEVEL/" 755 | A9 FCC "NUMBER OF SHIPS/" 756 | A10 FCC "COINAGE SELECT/" 757 | A11 FCC "LEFT COIN MULT/" 758 | A12 FCC "CENTER COIN MULT/" 759 | A13 FCC "RIGHT COIN MULT/" 760 | A14 FCC "COINS FOR CREDIT/" 761 | A15 FCC "COINS FOR BONUS/" 762 | A16 FCC "MINIMUM COINS/" 763 | A17 FCC "FREE PLAY/" 764 | A18 FCC "GAME ADJUST 1/" 765 | A19 FCC "GAME ADJUST 2/" 766 | A20 FCC "GAME ADJUST 3/" 767 | A21 FCC "GAME ADJUST 4/" 768 | A22 FCC "GAME ADJUST 5/" 769 | A23 FCC "GAME ADJUST 6/" 770 | A24 FCC "GAME ADJUST 7/" 771 | A25 FCC "GAME ADJUST 8/" 772 | A26 FCC "GAME ADJUST 9/" 773 | A27 FCC "GAME ADJUST 10/" 774 | A28 FCC "SPECIAL FUNCTION/" 775 | * 776 | * UPPER HALF CHECKBYTE 777 | * 778 | FDB $FFFF 779 | * 780 | * DEFAULT HERE FOR NOW 781 | * 782 | DEFALT FCB $02,$12,$70 ;CRHSTD 783 | FCC "DRJ" 784 | FCB $01,$83,$15 ;CRHST1 785 | FCC "SAM" 786 | FCB $01,$59,$20 ;THSTD2 787 | FCC "LED" 788 | FCB $01,$42,$85 ;THSTD3 789 | FCC "PGD" 790 | FCB $01,$25,$20 ;THSTD4 791 | FCC "CRB" 792 | FCB $01,$10,$35 ;THSTD5 793 | FCC "MRS" 794 | FCB $00,$82,$65 ;THSTD6 795 | FCC "SSR" 796 | FCB $00,$60,$10 ;THSTD7 797 | FCC "TMH" 798 | HSDEFE EQU * ;END OF HIGH SCORE DEFAULTS 799 | FCB $00 ;DIPSW 800 | FCB $5A ;CMOSCK 801 | FCB $01,$00 ;REPLAY @10,000 802 | FCB $03 ;NSHIP 803 | FCB $03 ;CSELCT 804 | FCB $01 ;SLOT1M 805 | FCB $04 ;SLOT2M 806 | FCB $01 ;SLOT3M 807 | FCB $01 ;CUNITC 808 | FCB $00 ;CUNITB 809 | FCB $00 ;MINUNT 810 | FCB $00 ;FREEPL 811 | FCB $05 ;GA1 INITIAL DIFFICULTY 812 | FCB $15 ;GA2 DIFFICULTY CEILING 813 | FCB $01 ;GA3 UNUSED 814 | FCB $05 ;GA4 RESTORE WAVE # 815 | FCB $00 ;GA5 816 | FCB $00 ;GA6 817 | FCB $00 ;GA7 818 | FCB $00 ;GA8 819 | FCB $00 ;GA9 820 | FCB $00 ;GA10 821 | DEFSIZ EQU *-DEFALT 822 | * 823 | * COINAGE SELECT TABLE 824 | * 825 | CSELCT FCB $01,$04,$01,$02,$04,$00 ;50C..3/$1.00 826 | FCB $06,$00,$01,$01,$00,$00 ;NEWNEW GERMAN 827 | FCB $01,$04,$01,$01,$00,$00 ;25C 828 | FCB $01,$16,$06,$02,$00,$00 ;NEW FRENCH 829 | FCB $01,$04,$01,$02,$00,$00 ;50C 830 | FCB $01,$00,$04,$01,$00,$00 831 | FCB $01,$00,$02,$01,$00,$00 832 | FCB $01,$00,$02,$02,$00,$00 833 | * 834 | * COPYRIGHT 835 | * 836 | CRIGHT FCC "COPYRIGHT 1980 - WILLIAMS ELECTRONICS" 837 | ENDPGM EQU * 838 | END 839 | -------------------------------------------------------------------------------- /src/mess0.src: -------------------------------------------------------------------------------- 1 | * TTL MESS0 ;- MESSAGE BLOCK REV 0 - 12/22/80 2 | * NMLIST 3 | * NOGEN 4 | SETDP $A0 5 | * 6 | * EQUATES 7 | * 8 | INITS EQU $A000 9 | PNUMB EQU INITS+6 10 | INITDS EQU PNUMB+2 11 | SCOREN EQU INITDS+4 12 | ORG $A03A ;LOCAL RAM HERE 13 | * 14 | * LOCAL RAM VARIABLES DURING DIAGS 15 | * 16 | TEMP1A RMB 1 17 | TEMP1B RMB 1 18 | TEMP1C RMB 1 19 | TEMP2A RMB 2 20 | TEMP2B RMB 2 21 | TEMP2C RMB 2 22 | TEMP2D RMB 2 23 | TMPAD RMB 2 ;XHATCH 24 | ASBUFF RMB 1 ;ADVANCE SWITCH WITH AUTO BUFFER 25 | ASLAST RMB 1 ;ADVANCE SWITCH WITH AUTO LAST POSITION 26 | ASCNTR RMB 1 ;ADVANCE SWITCH WITH AUTO COUNTER 27 | CURSR2 RMB 2 ;USER CURSER 28 | CHARSP RMB 1 ;HORIZONTAL SPACE BETWEEN CHARACTERS(TEXT ROUTINE) 29 | LINESP RMB 1 ;VERTICAL SPACING BETWEEN LINE CENTERS(TEXT ROUTINE) 30 | TOPL RMB 2 ;TOP LEFT ADDRESS(TEXT ROUTINE) 31 | CURSER RMB 2 ;CURSER ADDRESS(TEXT ROUTINE) 32 | MESPT RMB 2 ;MESSAGE POINTER(TEXT ROUTINE) 33 | WORDPT RMB 2 ;WORD POINTER(TEXT ROUTINE) 34 | MESEND RMB 2 ;MESSAGE END(TEXT ROUTINE) 35 | SPACEF RMB 1 ;SPACE FLAG(TEST ROUTINE) 36 | NUMBER RMB 2 ;NUMBER(NUMBER ROUTINE) 37 | ROMPTR RMB 2 ;ROM TABLE POINTER(COMPREHENSIVE ROM TEST) 38 | LSCC00 RMB 1 ;LAST STATE OF PAI AT CC00 39 | LSCC04 RMB 1 ;LAST STATE OF PAI AT CC04 PLAYER 1 40 | LSCC06 RMB 1 ;LAST STATE OF PAI AT CC06 PLAYER 1 41 | LCC042 RMB 1 ;LAST STATE OF PAI AT CC04 PLAYER 2 42 | LCC062 RMB 1 ;LAST STATE OF PAI AT CC06 PLAYER 2 43 | DISTBL RMB 38 ;DISPLAY TABLE(SWITCH TEST) 44 | * 45 | * 46 | ORG $C000 47 | PUT $2000 48 | * 49 | * VECTORS INTO MESSAGE ROM 50 | * 51 | N0V FDB N0 52 | TV1 JMP WTEXTB 53 | TV2 JMP ETEXTB 54 | TV3 JMP WTEXTC 55 | TV4 JMP ETEXTC 56 | TV5 JMP WNUMBB 57 | TV6 JMP ENUMBB 58 | TV7 JMP WNUMBC 59 | TV8 JMP ENUMBC 60 | TV9 JMP ERASTK 61 | TV10 JMP DISSTK 62 | TV11 JMP OPERS 63 | TV12 JMP OPERIN 64 | RMB 9 ;EXPANSION FOR 3 MORE 65 | * 66 | * CHECKBYTE 67 | * 68 | FDB $5BFF ;Fixme was: $FFFF 69 | * 70 | * OPERATOR INSTRUCTION TABLE 71 | * 72 | IGAMEO FDB VINS2,VINS3 ;GAME OVER 73 | IROMFL FDB VINS4,0 ;ROM FAILURE 74 | IROMDO FDB VINS4,0 ;ROM TEST DONE 75 | IRAMTS FDB VINS5,0 ;RAM TEST 76 | IRAMFL FDB VINS6,0 ;RAM FAILURE 77 | IRAMDO FDB VINS6,0 ;RAM TEST DONE 78 | ICMSDO FDB VINS7,0 ;CMOS RAM TEST DONE 79 | ICOLTS FDB VINS5,0 ;COLOR RAM TEST 80 | ICOLDO FDB VINS8,0 ;COLOR RAM TEST DONE 81 | IAUDTS FDB VINS9,VINS10 ;AUDIO TEST 82 | ISWTTS FDB VINS11,0 ;SWITCH TEST 83 | IMONTS FDB VINS2,VINS12 ;MONITOR TEST 84 | IAUD1 FDB VINS13,VINS14 ;AUDIT/GAME ADJUST 85 | IAUD2 FDB VINS17,0 ;PART TWO 86 | * 87 | * MESSAGE VECTORS 88 | * 89 | VINITT FDB INITT ;"INITIAL TESTS INDICATE " 90 | VUNIOK FDB UNIOK ;"UNIT OK " 91 | VWROM FDB WROM ;"ROM " 92 | VWRAM FDB WRAM ;"RAM " 93 | VROMFL FDB ROMFL ;"ROM FAILURE " 94 | VRAMFL FDB RAMFL ;"RAM FAILURE " 95 | VGAMOV FDB GAMOV ;"GAME OVER " 96 | VALROM FDB ALROM ;"ALL ROMS OK " 97 | VRAMTS FDB RAMTS ;"RAM TEST " 98 | VNORAM FDB NORAM ;"NO RAM ERRORS DETECTED " 99 | VCMSFL FDB CMSFL ;"CMOS RAM FAILURE 100 | * TEST MUST BE ENTERED 101 | * WITH COIN DOOR OPEN " 102 | VCMSOK FDB CMSOK ;"CMOS RAM OK " 103 | VCMSAB FDB CMSAB ;"MULTIPLE RAM FAILURE, 104 | * CMOS RAM CAN NOT BE TESTED " 105 | VCOLTS FDB COLTS ;"COLOR RAM TEST 106 | * VERTICAL COLOR BARS INDICATE 107 | * COLOR RAM FAILURE " 108 | VAUDTS FDB AUDTS ;"AUDIO TEST 109 | * SOUND " 110 | VSWTTS FDB SWTTS ;"SWITCH TEST " 111 | VMONTS FDB MONTS ;"MONITOR TEST PATTERNS " 112 | VSW0 FDB SW0 ;"AUTO UP " 113 | VSW1 FDB SW1 ;"ADVANCE " 114 | VSW2 FDB SW2 ;"RIGHT COIN " 115 | VSW3 FDB SW3 ;"HIGHSCORE RESET " 116 | VSW4 FDB SW4 ;"LEFT COIN " 117 | VSW5 FDB SW5 ;"CENTER COIN " 118 | VSW6 FDB SW6 ;"INVALID SWITCH " 119 | VSW7 FDB SW7 ;"INVALID SWITCH " 120 | VSW8 FDB SW8 ;"FIRE " 121 | VSW9 FDB SW9 ;"THRUST " 122 | VSWA FDB SWA ;"SMART BOMB " 123 | VSWB FDB SWB ;"HYPERSPACE " 124 | VSWC FDB SWC ;"TWO PLAYERS " 125 | VSWD FDB SWD ;"ONE PLAYER " 126 | VSWE FDB SWE ;"REVERSE " 127 | VSWF FDB SWF ;"DOWN " 128 | VSW10 FDB SW10 ;"UP " 129 | VSW11 FDB SW11 ;"INVALID SWITCH " 130 | VSW12 FDB SW12 ;"INVALID SWITCH " 131 | VSW13 FDB SW13 ;"INVALID SWITCH " 132 | VSW14 FDB SW14 ;"INVALID SWITCH " 133 | VSW15 FDB SW15 ;"INVALID SWITCH " 134 | VSW16 FDB SW16 ;"INVALID SWITCH " 135 | VSW17 FDB SW17 ;"INVALID SWITCH " 136 | VINS1 FDB INS1 ;"PRESS ADVANCE WITH SWITCH SET FOR: " 137 | VINS2 FDB INS2 ;"AUTO FOR GAME AUDIT, GAME ADJUSTMENT " 138 | VINS3 FDB INS3 ;"MANUAL FOR ROM TEST " 139 | VINS4 FDB INS4 ;"AUTO FOR RAM TEST " 140 | VINS5 FDB INS5 ;"AUTO TO EXIT TEST " 141 | VINS6 FDB INS6 ;"AUTO FOR CMOS RAM TEST " 142 | VINS7 FDB INS7 ;"AUTO FOR COLOR RAM TEST " 143 | VINS8 FDB INS8 ;"AUTO FOR AUDIO TEST " 144 | VINS9 FDB INS9 ;"AUTO FOR SWITCH TEST " 145 | VINS10 FDB INS10 ;"MANUAL TO TEST AN INDIVIDUAL SOUND " 146 | VINS11 FDB INS11 ;"AUTO FOR MONITOR TEST PATTERNS " 147 | VINS12 FDB INS12 ;"MANUAL TO STEP THRU PATTERNS " 148 | VINS13 FDB INS13 ;"AUTO FOR GAME OVER" 149 | VINS14 FDB INS14 ;"MANUAL TO STEP THRU ADJUST" 150 | VINS15 FDB INS15 ;"WILLIAMS DEFENDER" 151 | VINS16 FDB INS16 ;"PRESS ADV TO STEP THRU TEST" 152 | VINS17 FDB INS17 ;"PRESS HIGH SCORE RESET" 153 | * 154 | * AMODE MESSAGE VECTORS 155 | * 156 | LANDV FDB LAND 157 | MUTV FDB MUT 158 | SWRMPV FDB SWRMP 159 | BOMBV FDB BOMBR 160 | SWARMV FDB SWARM 161 | BAITV FDB BAIT 162 | CREDV FDB CRED 163 | SCANV FDB SCAN 164 | ELECV FDB ELEC 165 | * 166 | * EUGENE'S VECTORS 167 | * 168 | PLYR1 FDB PLAYR1 169 | PLYR2 FDB PLAYR2 170 | BONSX FDB BONUSX 171 | P1S FDB P1STA 172 | P12S FDB P12STA 173 | ATWV FDB ATW ;"ATTACK WAVE" 174 | COMPV FDB COMP ;"COMPLETED" 175 | * 176 | * SAM'S VECTORS 177 | * 178 | HOFV FDB HOF 179 | INITSSV FDB INITSS 180 | HALLDV FDB HALLD 181 | HALENV FDB HALEN 182 | VMEND FDB MEND ;END OF MESSAGES 183 | * 184 | * MESSAGES 185 | * 186 | INITT FDB INITAL,TESTS,INDCAT 187 | UNIOK FDB UNIT,OK 188 | WROM FDB ROM 189 | WRAM FDB RAM 190 | ROMFL FDB ROM,FAILUR 191 | RAMFL FDB RAM,FAILUR 192 | GAMOV FDB GAME,OVER 193 | ALROM FDB ALL,ROMS,OK 194 | RAMTS FDB RAM,TEST 195 | NORAM FDB NO,RAM,ERRORS,DETECT 196 | CMSFL FDB CMOSW,RAM,FAILUR 197 | FCB RTC,$28,$A0 198 | FDB TEST,MUST,BE,ENTERD 199 | FCB RLF 200 | FDB WITH,COINW,DOOR,OPEN 201 | CMSOK FDB CMOSW,RAM,OK 202 | CMSAB FDB MULTIP,RAM,FAILUR 203 | FCB HMC,$FE 204 | FDB CCOMA 205 | FCB VMT,$10,HMT,$F8 206 | FDB CMOSW,RAM,CAN,NOT,BE,TESTED 207 | COLTS FDB COLOR,RAM,TEST 208 | FCB VMT,$30,HMT,$E8 209 | FDB VERTIC,COLOR,BARS,INDCAT 210 | FCB RLF,HMC,$FC 211 | FDB COLOR,RAM,FAILUR 212 | AUDTS FDB AUDIO,TEST 213 | FCB RLF,RLF,HMC,4 214 | FDB SOUND 215 | SWTTS FDB SWITCH,TEST 216 | MONTS FDB MONITR,TEST,PATRNS 217 | SW0 FDB AUTO,UP 218 | SW1 FDB ADVANC 219 | SW2 FDB RIGHT,COINW 220 | SW3 FDB HSR 221 | SW4 FDB LEFT,COINW 222 | SW5 FDB CENTER,COINW 223 | SW6 FDB INVSW 224 | SW7 FDB INVSW 225 | SW8 FDB FIRE 226 | SW9 FDB THRUST 227 | SWA FDB SMART,BOMB 228 | SWB FDB HYPERS 229 | SWC FDB TWO,PLAYRS 230 | SWD FDB ONE,PLAYER 231 | SWE FDB REVERS 232 | SWF FDB DOWN 233 | SW10 FDB UP 234 | SW11 FDB INVSW 235 | SW12 FDB INVSW 236 | SW13 FDB INVSW 237 | SW14 FDB INVSW 238 | SW15 FDB INVSW 239 | SW16 FDB INVSW 240 | SW17 FDB INVSW 241 | INS1 FDB PRESS,ADVANC,WITH,SWITCH,SET,FOR 242 | FCB HMC,$FE 243 | FDB CCOLON 244 | INS2 FDB AUTO,FOR,AUDIT 245 | FCB HMC,$FE 246 | FDB CCOMA,GAME,ADJUST 247 | INS3 FDB MANUAL,FOR,ROM,TEST 248 | INS4 FDB AUTO,FOR,RAM,TEST 249 | INS5 FDB AUTO,TO,EXIT,TEST 250 | INS6 FDB AUTO,FOR,CMOSW,RAM,TEST 251 | INS7 FDB AUTO,FOR,COLOR,RAM,TEST 252 | INS8 FDB AUTO,FOR,AUDIO,TEST 253 | INS9 FDB AUTO,FOR,SWITCH,TEST 254 | INS10 FDB MANUAL,TO,TEST,INDIVL,SOUNDS 255 | INS11 FDB AUTO,FOR,MONITR,TEST,PATRNS 256 | INS12 FDB MANUAL,TO,STEP,THRU,PATRNS 257 | INS13 FDB AUTO,FOR,GAME,OVER 258 | INS14 FDB MANUAL,TO,STEP,THRU,ADJUST 259 | INS15 FDB WILLAM,DEFEND 260 | INS16 FDB PRESS,ADVANC,TO,STEP,THRU,TEST 261 | INS17 FDB PRESS,HSR,TO,MAKE,CHANGE 262 | * 263 | * AMODE MESSAGES 264 | * 265 | LAND FDB LANDER 266 | FCB RLF,HMC,6 267 | FDB N150 268 | MUT FDB MUTANT 269 | FCB RLF,HMC,6 270 | FDB N150 271 | SWRMP FDB POD 272 | FCB RLF,HMC,0 273 | FDB N1000 274 | BOMBR FDB BOMBER 275 | FCB RLF,HMC,6 276 | FDB N250 277 | SWARM FDB SWARMR 278 | FCB RLF,HMC,8 279 | FDB N150 280 | BAIT FDB BAITER 281 | FCB RLF,HMC,6 282 | FDB N200 283 | CRED FDB CREDWS 284 | SCAN FDB SCANER 285 | ELEC FDB ELECTR 286 | FCB RLF,RLF,HMC,12 287 | FDB PRESEN 288 | * 289 | * EUGENE'S MESSAGES 290 | * 291 | PLAYR1 FDB PLAYER,ONE 292 | PLAYR2 FDB PLAYER,TWO 293 | BONUSX FDB BX 294 | P1STA FDB PRESS,ONE,PLAYER,START 295 | P12STA FDB PRESS,ONE,OR,TWO,PLAYER,START 296 | ATW FDB ATTACK,WAVE 297 | COMP FDB COMPLE 298 | * 299 | * SAM'S MESSAGES 300 | * 301 | HOF FDB YOU,HAVE,QUALIF,FOR 302 | FCB RLF 303 | FDB THE,DEFEND,HAOFFA 304 | FCB RLF,RLF 305 | FDB SELECT,INITLS,WITH,UP,DOWN,STICK 306 | FCB RLF,RLF 307 | FDB PRESS,FIRE,TO,ENTER,INITAL 308 | INITSS FDB INITS 309 | FCB HMT,8 310 | FDB INITS+2 311 | FCB HMT,16 312 | FDB INITS+4 313 | HALLD FDB HAOFFA 314 | FCB RTC,$22,$68 315 | FDB TODAYS 316 | FCB HMT,$3E 317 | FDB ALL,TIME 318 | FCB RLF,HMC,$FC 319 | FDB GREAT 320 | FCB HMT,$3D 321 | FDB GREAT 322 | HALEN FDB PNUMB 323 | FCB HMT,$5 324 | FDB INITDS 325 | FCB HMT,$13 326 | FDB SCOREN 327 | MEND EQU * 328 | * 329 | * WORDS 330 | * 331 | ADJUST FCC "ADJUSTMENT/" 332 | ADVANC FCC "ADVANCE/" 333 | ALL FCC "ALL/" 334 | ATTACK FCC "ATTACK/" 335 | AUDIO FCC "AUDIO/" 336 | AUDIT FCC "AUDIT/" 337 | AUTO FCC "AUTO/" 338 | BAITER FCC "BAITER/" 339 | BARS FCC "BARS/" 340 | BE FCC "BE/" 341 | BOMB FCC "BOMB/" 342 | BOMBER FCC "BOMBER/" 343 | BX FCC "BONUS X/" 344 | CAN FCC "CAN/" 345 | CCOMA FCC ",/" 346 | CCOLON FCC ":/" 347 | CENTER FCC "CENTER/" 348 | CHANGE FCC "CHANGE/" 349 | CMOSW FCC "CMOS/" 350 | COINW FCC "COIN/" 351 | COLOR FCC "COLOR/" 352 | COMPLE FCC "COMPLETED/" 353 | CREDW FCC "CREDIT/" 354 | CREDWS FCC "CREDITS:/" 355 | DEFEND FCC "DEFENDER/" 356 | DETECT FCC "DETECTED/" 357 | DOOR FCC "DOOR/" 358 | DOWN FCC "DOWN/" 359 | ELECTR FCC "ELECTRONICS INC./" 360 | ENTER FCC "ENTER/" 361 | ENTERD FCC "ENTERED/" 362 | ERRORS FCC "ERRORS/" 363 | EXIT FCC "EXIT/" 364 | FAILUR FCC "FAILURE/" 365 | FIRE FCC "FIRE/" 366 | FOR FCC "FOR/" 367 | GAME FCC "GAME/" 368 | GREAT FCC "GREATEST/" 369 | HAOFFA FCC "HALL OF FAME/" 370 | HAVE FCC "HAVE/" 371 | HSR FCC "HIGHSCORE RESET/" 372 | HYPERS FCC "HYPERSPACE/" 373 | INDCAT FCC "INDICATE/" 374 | INDIVL FCC "INDIVIDUAL/" 375 | INITAL FCC "INITIAL/" 376 | INITLS FCC "INITIALS/" 377 | INVSW FCC "INVALID SWITCH/" 378 | LANDER FCC "LANDER/" 379 | LEFT FCC "LEFT/" 380 | MAKE FCC "MAKE/" 381 | MANUAL FCC "MANUAL/" 382 | MONITR FCC "MONITOR/" 383 | MULTIP FCC "MULTIPLE/" 384 | MUST FCC "MUST/" 385 | MUTANT FCC "MUTANT/" 386 | N150 FCC "150/" 387 | N200 FCC "200/" 388 | N250 FCC "250/" 389 | N1000 FCC "1000/" 390 | NO FCC "NO/" 391 | NOT FCC "NOT/" 392 | OK FCC "OK/" 393 | ONE FCC "ONE/" 394 | OPEN FCC "OPEN/" 395 | OR FCC "OR/" 396 | OVER FCC "OVER/" 397 | PATRNS FCC "PATTERNS/" 398 | PLAYER FCC "PLAYER/" 399 | PLAYRS FCC "PLAYERS/" 400 | POD FCC " POD/" 401 | PRESEN FCC "PRESENTS/" 402 | PRESS FCC "PRESS/" 403 | QUALIF FCC "QUALIFIED/" 404 | RAM FCC "RAM/" 405 | REVERS FCC "REVERSE/" 406 | RIGHT FCC "RIGHT/" 407 | ROM FCC "ROM/" 408 | ROMS FCC "ROMS/" 409 | SCANER FCC "SCANNER/" 410 | SELECT FCC "SELECT/" 411 | SET FCC "SET/" 412 | SLAM FCC "SLAM/" 413 | SMART FCC "SMART/" 414 | SOUND FCC "SOUND/" 415 | SOUNDS FCC "SOUNDS/" 416 | START FCC "START/" 417 | STEP FCC "STEP/" 418 | STICK FCC "STICK/" 419 | SWARMR FCC "SWARMER/" 420 | SWITCH FCC "SWITCH/" 421 | TEST FCC "TEST/" 422 | TESTED FCC "TESTED/" 423 | TESTS FCC "TESTS/" 424 | THE FCC "THE/" 425 | THRU FCC "THRU/" 426 | THRUST FCC "THRUST/" 427 | TILT FCC "TILT/" 428 | TIME FCC "TIME/" 429 | TO FCC "TO/" 430 | TODAYS FCC "TODAYS/" 431 | TWO FCC "TWO/" 432 | UNIT FCC "UNIT/" 433 | UP FCC "UP/" 434 | VERTIC FCC "VERTICAL/" 435 | WAVE FCC "WAVE/" 436 | WILLAM FCC "WILLIAMS/" 437 | WITH FCC "WITH/" 438 | YOU FCC "YOU/" 439 | * 440 | * CHARACTER DESCRIPTOR TABLE 441 | * 442 | CHRTBL FDB $0108,SPACE ;SPACE DESCRIPTER TABLE 443 | FDB $0108,EXCLPT ;ESCLAMATION POINT 444 | FDB $0108,COMMA ;COMMA 445 | FDB $0308,QUESMK ;QUESTION MARK 446 | FDB $0108,PERIOD ;PERIOD 447 | FDB $0308,QUESMK ;QUESTION MARK 448 | N0 FDB $0308,NUMBR0 ;NUMBER 0 449 | FDB $0308,NUMBR1 ;NUMBER 1 450 | FDB $0308,NUMBR2 ;NUMBER 2 451 | FDB $0308,NUMBR3 ;NUMBER 3 452 | FDB $0308,NUMBR4 ;NUMBER 4 453 | FDB $0308,NUMBR5 ;NUMBER 5 454 | FDB $0308,NUMBR6 ;NUMBER 6 455 | FDB $0308,NUMBR7 ;NUMBER 7 456 | FDB $0308,NUMBR8 ;NUMBER 8 457 | FDB $0308,NUMBR9 ;NUMBER 9 458 | FDB $0108,COLON ;COLON 459 | FDB $0308,QUESMK ;QUESTION MARK 460 | ALPHA0 FDB $0308,BLANK ;BLANK BLOCK 461 | FDB $0308,LETTRA ;LETTER A 462 | FDB $0308,LETTRB ;LETTER B 463 | FDB $0308,LETTRC ;LETTER C 464 | FDB $0308,LETTRD ;LETTER D 465 | FDB $0308,LETTRE ;LETTER E 466 | FDB $0308,LETTRF ;LETTER F 467 | FDB $0308,LETTRG ;LETTER G 468 | FDB $0308,LETTRH ;LETTER H 469 | FDB $0208,LETTRI ;LETTER I 470 | FDB $0308,LETTRJ ;LETTER J 471 | FDB $0308,LETTRK ;LETTER K 472 | FDB $0308,LETTRL ;LETTER L 473 | FDB $0408,LETTRM ;LETTER M 474 | FDB $0308,LETTRN ;LETTER N 475 | FDB $0308,LETTRO ;LETTER O 476 | FDB $0308,LETTRP ;LETTER P 477 | FDB $0308,LETTRQ ;LETTER Q 478 | FDB $0308,LETTRR ;LETTER R 479 | FDB $0308,LETTRS ;LETTER S 480 | FDB $0308,LETTRT ;LETTER T 481 | FDB $0308,LETTRU ;LETTER U 482 | FDB $0308,LETTRV ;LETTER V 483 | FDB $0408,LETTRW ;LETTER W 484 | FDB $0308,LETTRX ;LETTER X 485 | FDB $0308,LETTRY ;LETTER Y 486 | FDB $0308,LETTRZ ;LETTER Z 487 | * 488 | * CHARACTERS 489 | * 490 | *SPACE AND BLANK 491 | SPACE EQU * 492 | BLANK FDB 0,0,0,0,0,0 493 | FDB 0,0,0,0,0,0 ;(BSZ 3*8) 494 | * EXCLAMATION POINT 495 | EXCLPT FDB $0101,$0101,$0100,$0100 496 | * COMMA 497 | COMMA FDB $0000,$0000,$0001,$0110 498 | * PERIOD 499 | PERIOD FDB $0000,$0000,$0000,$0100 500 | * NUMBER 0 501 | NUMBR0 FDB $0101,$0101,$0101,$0100 502 | FDB $1100,$0000,$0000,$1100 503 | FDB $1111,$1111,$1111,$1100 504 | * NUMBER 1 505 | NUMBR1 FDB $0000,$0100,$0000,$0000 506 | FDB $0111,$1000,$0000,$0000 507 | FDB $1111,$1111,$1111,$1100 508 | * NUMBER 2 509 | NUMBR2 FDB $0101,$0000,$0001,$0100 510 | FDB $1100,$0001,$1000,$1100 511 | FDB $1111,$1110,$0000,$1100 512 | * NUMBER 3 513 | NUMBR3 FDB $0100,$0000,$0000,$0100 514 | FDB $1100,$0011,$0000,$1100 515 | FDB $1111,$1111,$1111,$1100 516 | * NUMBER 4 517 | NUMBR4 FDB $0000,$0101,$0000,$0000 518 | FDB $0110,$0011,$0000,$0000 519 | FDB $1111,$1111,$1111,$1100 520 | * NUMBER 5 521 | NUMBR5 FDB $0101,$0101,$0000,$0100 522 | FDB $1110,$1011,$0000,$1100 523 | FDB $1100,$0011,$0101,$1100 524 | * NUMBER 6 525 | NUMBR6 FDB $0101,$0101,$0101,$0100 526 | FDB $1110,$1011,$1010,$1100 527 | FDB $1100,$0011,$0101,$1100 528 | * NUMBER 7 529 | NUMBR7 FDB $0100,$0000,$0001,$0100 530 | FDB $1100,$0001,$1110,$1000 531 | FDB $1111,$1110,$0000,$0000 532 | * NUMBER 8 533 | NUMBR8 FDB $0101,$0100,$0101,$0100 534 | FDB $1110,$1011,$1010,$1100 535 | FDB $1101,$0110,$0101,$1100 536 | * NUMBER 9 537 | NUMBR9 FDB $0101,$0101,$0000,$0100 538 | FDB $1110,$1011,$0000,$1100 539 | FDB $1101,$0111,$0101,$1100 540 | * COLON 541 | COLON FDB $0000,$0100,$0001,$0000 542 | * QUESTION MARK 543 | QUESMK FDB $0101,$0000,$0000,$0000 544 | FDB $1100,$0001,$0100,$0100 545 | FDB $1111,$1110,$0000,$0000 546 | * LETTER A 547 | LETTRA FDB $0101,$0101,$0101,$0100 548 | FDB $1100,$0011,$0000,$0000 549 | FDB $1111,$1111,$1111,$1100 550 | * LETTER B 551 | LETTRB FDB $0101,$0101,$0101,$0100 552 | FDB $1100,$0011,$0000,$1100 553 | FDB $1111,$1111,$1111,$1100 554 | * LETTER C 555 | LETTRC FDB $0101,$0101,$0101,$0100 556 | FDB $1110,$1010,$1010,$1100 557 | FDB $1100,$0000,$0000,$1100 558 | * LETTER D 559 | LETTRD FDB $0101,$0101,$0101,$0100 560 | FDB $1100,$0000,$0000,$1100 561 | FDB $1011,$1111,$1111,$1000 562 | * LETTER E 563 | LETTRE FDB $0101,$0101,$0101,$0100 564 | FDB $1110,$1011,$1010,$1100 565 | FDB $1100,$0010,$0000,$1100 566 | * LETTER F 567 | LETTRF FDB $0101,$0101,$0101,$0100 568 | FDB $1110,$1011,$1010,$1000 569 | FDB $1100,$0010,$0000,$0000 570 | * LETTER G 571 | LETTRG FDB $0101,$0101,$0101,$0100 572 | FDB $1110,$1010,$1010,$1100 573 | FDB $1100,$0011,$0101,$1100 574 | * LETTER H 575 | LETTRH FDB $0101,$0101,$0101,$0100 576 | FDB $1010,$1011,$1010,$1000 577 | FDB $0101,$0111,$0101,$0100 578 | * LETTER I 579 | LETTRI FDB $0101,$0101,$0101,$0100 580 | FDB $1010,$1010,$1010,$1000 581 | * LETTER J 582 | LETTRJ FDB $0000,$0000,$0001,$0100 583 | FDB $0000,$0000,$0000,$1100 584 | FDB $1111,$1111,$1111,$1100 585 | * LETTER K 586 | LETTRK FDB $0101,$0101,$0101,$0100 587 | FDB $0000,$0111,$0100,$0000 588 | FDB $0110,$0000,$0010,$0100 589 | * LETTER L 590 | LETTRL FDB $0101,$0101,$0101,$0100 591 | FDB $1010,$1010,$1010,$1100 592 | FDB $0000,$0000,$0000,$1100 593 | * LETTER M 594 | LETTRM FDB $0101,$0101,$0101,$0100 595 | FDB $1110,$1010,$1010,$1000 596 | FDB $1110,$1010,$0000,$0000 597 | FDB $1111,$1111,$1111,$1100 598 | * LETTER N 599 | LETTRN FDB $0101,$0101,$0101,$0100 600 | FDB $1110,$1010,$1010,$1000 601 | FDB $1101,$0101,$0101,$0100 602 | * LETTER O 603 | LETTRO FDB $0101,$0101,$0101,$0100 604 | FDB $1110,$1010,$1010,$1100 605 | FDB $1101,$0101,$0101,$1100 606 | * LETTER P 607 | LETTRP FDB $0101,$0101,$0101,$0100 608 | FDB $1110,$1011,$1010,$1000 609 | FDB $1101,$0111,$0000,$0000 610 | * LETTER Q 611 | LETTRQ FDB $0101,$0101,$0101,$0100 612 | FDB $1110,$1010,$1010,$1100 613 | FDB $1101,$0101,$0111,$1110 614 | * LETTER R 615 | LETTRR FDB $0101,$0101,$0101,$0100 616 | FDB $1110,$1011,$1010,$1000 617 | FDB $1101,$0111,$1001,$0100 618 | * LETTER S 619 | LETTRS FDB $0101,$0101,$0000,$0100 620 | FDB $1110,$1011,$0000,$1100 621 | FDB $1100,$0011,$1111,$1100 622 | * LETTER T 623 | LETTRT FDB $1100,$0000,$0000,$0000 624 | FDB $1111,$1111,$1111,$1100 625 | FDB $1100,$0000,$0000,$0000 626 | * LETTER U 627 | LETTRU FDB $0101,$0101,$0101,$0100 628 | FDB $1010,$1010,$1010,$1100 629 | FDB $0101,$0101,$0101,$1100 630 | * LETTER V 631 | LETTRV FDB $0101,$0101,$0100,$0000 632 | FDB $0000,$0000,$0010,$0100 633 | FDB $0101,$0101,$0110,$0000 634 | * LETTER W 635 | LETTRW FDB $0101,$0101,$0101,$0000 636 | FDB $1010,$1010,$1010,$0100 637 | FDB $1010,$1010,$1010,$0100 638 | FDB $1010,$1010,$1010,$0000 639 | * LETTER X 640 | LETTRX FDB $0101,$0000,$0001,$0100 641 | FDB $0000,$1001,$1000,$0000 642 | FDB $0101,$1000,$1001,$0100 643 | * LETTER Y 644 | LETTRY FDB $0101,$0000,$0000,$0000 645 | FDB $0000,$1001,$0101,$0100 646 | FDB $0101,$1000,$0000,$0000 647 | * LETTER Z 648 | LETTRZ FDB $0100,$0000,$0101,$0100 649 | FDB $1100,$0110,$0000,$1100 650 | FDB $1110,$0000,$0000,$1100 651 | * 652 | * UPPER HALF CHECKBYTE 653 | * 654 | FDB $84FF ;Fixme was: $FFFF 655 | * 656 | * MESSAGE INSTRUCTION TABLE 657 | * 658 | RSP EQU 0 ;RESET SPACE BETWEEN CHARACTERS <2 BYTES> 659 | RLS EQU 1 ;RESET LINE SPACING <2 BYTES> 660 | HMT EQU 2 ;HORIZONTAL MOVE RELATIVE TO TOP LEFT <2 BYTES> 661 | HMC EQU 3 ;HORIZONTAL MOVE RELATIVE TO CURSER <2 BYTES> 662 | VMT EQU 4 ;VERTICAL MOVE RELATIVE TO TOP LEFT <2 BYTES> 663 | VMC EQU 5 ;VERTICAL MOVE RELATIVE TO CURSER <2 BYTES> 664 | RTC EQU 6 ;RESET TOP LEFT AND CURSER <3 BYTES> 665 | RLF EQU 7 ;RETURN(TO TOPL LEFT), LINE FEED <1 BYTE> 666 | PIC EQU 8 ;PICTURE <3 BYTES> 667 | * 668 | * OPERATOR INSTRUCTIONS 669 | * 670 | * Y POINTING TO TABLE 671 | * 672 | * 673 | OPERS PSHS U,X,Y ;SAVE STATE 674 | LDU #VINS16 ;"PRESS ADVANCE TO STEP" 675 | BRA OPER0 ;DO BELOW 676 | OPERIN PSHS U,X,Y 677 | LDU #VINS1 ;"PRESS ADVANCE WITH SW..." 678 | OPER0 LDX #$18CE ;SCREEN ADDRESS 679 | JSR WTEXTB ;OUTPUT IT 680 | LDU ,Y++ ;GET POINTER 681 | BEQ OPER1 ;NO, INSTRUCTION SKIP 682 | LDX #$10DA ;SCREEN ADDRESS 683 | JSR WTEXTB ;WRITE IT OUT 684 | OPER1 LDU ,Y++ 685 | BEQ OPER2 ;DONE! 686 | LDX #$10E4 ;SCREEN ADDRESS 687 | JSR WTEXTB ;DO IT 688 | OPER2 PULS X,Y,U,PC ;GO BACK CLEAN 689 | * 690 | * ERASE A "WORD FROM THE SCREEN 691 | * 692 | ERASTK PSHS U,Y,X,D,CC 693 | LDY #COFFV 694 | BRA DISST0 ;DO BELOW 695 | * 696 | * OUTPUT A "WORD" FROM 32 BYTES OF STACK 697 | * 698 | DISSTK PSHS U,Y,X,D,CC 699 | LDY #CWRITV 700 | DISST0 LDD #TEXT3 ;POINT TO HANDLER 701 | STY TEMP2A 702 | STD TEMP2B 703 | STX CURSER ;PUT DOWN CURSER 704 | STX TOPL ;SET TOP LEFT 705 | LDX #$010A ;STANDARD SPACING 706 | STX CHARSP 707 | CLR SPACEF 708 | LDU 5,S ;GET IT 709 | STU WORDPT ;SAVE AS POINTER 710 | LEAU 32,U ;MOVE IT TO END 711 | STU MESEND ;SAVE AS END 712 | STU MESPT ;AND POINTER 713 | BRA TEXT3 ;GO DO BELOW 714 | * 715 | * TEXT ROUTINE X IS TOP LEFT ADDRESS 716 | * U IS MESSAGE VECTOR ADDRESS 717 | * 718 | * ALL REGISTERS SAVED 719 | * EXCEPT CARRY BIT(0-MESSAGE IN PROGRESS 720 | * 1-MESSAGE COMPLETED) 721 | * 722 | * WRITE TEXT BLOCK 723 | WTEXTB PSHS U,Y,X,D,CC ;<=START HERE TO WRITE TEXT BLOCK 724 | LDY #CWRITV 725 | LDD #TEXT3 726 | BRA TEXT1 727 | * ERASE TEXT BLOCK 728 | ETEXTB PSHS U,Y,X,D,CC ;<=START HERE TO ERASE TEXT BLOCK 729 | LDY #COFFV 730 | LDD #TEXT3 731 | BRA TEXT1 732 | * WRITE TEXT CHARACTER 733 | WTEXTC PSHS U,Y,X,D,CC ;<=START HERE TO WRITE TEXT CHARACTER 734 | LDY #CWRITV 735 | LDD #TEXT8 736 | BRA TEXT1 737 | * ERASE TEXT CHARACTER 738 | ETEXTC PSHS U,Y,X,D,CC ;<=START HERE TO ERASE TEXT CHARACTER 739 | LDY #COFFV 740 | LDD #TEXT8 741 | TEXT1 STY TEMP2A ;SAVE WRITE/ERASE SELECT 742 | STD TEMP2B ;SAVE BLOCK/CHARACTER SELECT 743 | TEXT2 TST MESPT ;CHECK IF NEW MESSAGE 744 | BNE TEXT3 ;NO, SKIP INITIALIZATION 745 | * NEW MESSAGE 746 | STX CURSER ;SET CURSOR 747 | STX TOPL ;SET TOP LEFT 748 | LDX #$010A ;SET CHARACTER AND LINE SPACINGS 749 | STX CHARSP 750 | CLR SPACEF ;CLEAR SPACE FLAG 751 | LDX 2,U ;GET END OF MESSAGE 752 | STX MESEND ;SAVE IT 753 | LDX ,U ;GET MESSAGE POINTER 754 | BRA TEXT5 ;BRANCH TO NEXT WORD OR INSTRUCTION 755 | * NEXT CHARACTER 756 | TEXT3 TST SPACEF ;CHECK SPACE FLAG 757 | BNE TEXT9 ;YES SPACE?, PROCESS NEXT WORD OR INSTRUCTION 758 | LDX WORDPT ;GET WORD POINTER 759 | LDB ,X+ ;GET ASCII CHARACTER AND ADVANCE WORD POINTER 760 | CMPB #$2F ;CHECK FOR END OF WORD "/" 761 | BNE TEXT7 ;BRANCH TO CHARACTER PROCESSING 762 | LDB #$20 ;MAKE CHARACTER A SPACE 763 | STB SPACEF ;SET SPACE FLAG 764 | BRA TEXT7 ;PROCESS SPACE 765 | * NEXT WORD OR INSTRUCTION 766 | TEXT9 CLR SPACEF ;CLEAR SPACE FLAG 767 | LDX MESPT ;GET MESSAGE POINTER 768 | TEXT4 CMPX MESEND ;CHECK IF DONE 769 | BNE TEXT5 ;CONTINUE 770 | TEXT4A CLR MESPT ;ZERO MESSAGE POINTER 771 | PULS CC,D,X,Y,U 772 | ORCC #1 ;SET CARRY-MESSAGE COMPLETED 773 | RTS 774 | TEXT5 LDU ,X++ ;GET NEXT WORD OR INSTRUCTION 775 | BMI TEXT6 ;BRANCH TO WORD PROCESSING 776 | * INSTRUCTION PROCESSING 777 | LEAX -1,X ;BACKUP MESSAGE POINTER 778 | TFR U,D ;TRANSFER INSTRUCION INTO A 779 | CMPA #8 ;CHECK IF INSTRUCTION IS VALID 780 | BHI TEXT4A ;NO? QUIT MESSAGE 781 | ASLA ;MULTIPLY BY 2 782 | LDY #INSTBL ;GET INSTRUCTION TABLE ADDRESS 783 | JSR [A,Y] ;EXECUTE INSTRUCTION 784 | BRA TEXT4 ;NEXT WORD OR INSTRUCTION 785 | * WORD PROCESSING 786 | TEXT6 STX MESPT ;SAVE MESSAGE POINTER 787 | STU WORDPT ;SAVE WORD POINTER 788 | BRA TEXT3 ;BRANCH TO NEXT CHARACTER 789 | * CHARACTER PROCESSING 790 | TEXT7 STX WORDPT ;SAVE WORD POINTER 791 | SUBB #$20 792 | CMPB #1 ;CHECK IF SPACE OR EXCLAMATION PT. 793 | BLS TEXT7B ;YES?, WRITE IT 794 | CMPB #11 ;CHECK INVALID 795 | BLS TEXT7A ;YES?, CHANGE TO QUEST MK 796 | SUBB #10 797 | CMPB #16 ;CHECK FOR NEXT VALID GROUP 798 | BLS TEXT7B ;YES?, WRITE IT 799 | CMPB #20 ;CHECK INVALID 800 | BLS TEXT7A ;YES?, CHANGE TO QUEST MK 801 | SUBB #4 802 | CMPB #44 ;CHECK FOR LAST VALID GROUP 803 | BLS TEXT7B ;YES?, WRITE IT 804 | TEXT7A LDB #3 ;CHANGE INVALID CHAR TO QUEST MK 805 | TEXT7B ASLB ;MULTIPLY CHARACTER BY 4 806 | ASLB 807 | LDX #CHRTBL ;GET CHARACTER DESCRIPTER TABLE 808 | ABX ;FIND CHARACTER DESCRIPTER 809 | TFR X,Y ;SET CHARACTER DESCRIPTER POINTER 810 | LDD CURSER ;SET CURSER 811 | LDX TEMP2A ;WRITE/ERASE CHARACTER 812 | JSR ,X 813 | ADDA ,Y ;ADVANCE CURSER CHARACTER WIDTH 814 | ADDA CHARSP ;ADVANCE CURSER CHARACTER SPACING 815 | STA CURSER ;SAVE CURSER 816 | LDX TEMP2B ;NEXT TEXT BYTE / QUIT 817 | JMP ,X 818 | TEXT8 PULS CC,D,X,Y,U 819 | ANDCC #$FE ;CLEAR CARRY-MESSAGE NOT COMPLETED 820 | RTS ;RETURN FROM WRITE/ERASE CHARACTER 821 | * INSTRUCTION ADDRESS TABLE 822 | INSTBL FDB RSP1,RLS1,HMT1,HMC1,VMT1,VMC1,RTC1,RLF1,PIC1 823 | * RESET SPACE BETWEEN CHARACTERS 824 | RSP1 LDA ,X+ ;GET NEXT TEXT BYTE 825 | STA CHARSP ;RESET CHARSP 826 | RTS 827 | * RESET LINE SPACING 828 | RLS1 LDB ,X+ ;GET NEXT TEXT BYTE 829 | STB LINESP ;RESET LINESP 830 | RTS 831 | * HORIZONTAL MOVE RELATIVE TO TOP LEFT 832 | HMT1 LDA TOPL ;GET TOP LEFT HORIZONTAL 833 | ADDA ,X+ ;ADD NEXT TEXT BYTE 834 | STA CURSER ;RESET CURSER HORIZONTAL 835 | RTS 836 | * HORIZONTAL MOVE RELATIVE TO CURSER 837 | HMC1 LDA CURSER ;GET CURSER HORIZONTAL 838 | ADDA ,X+ ;ADD NEXT TEXT BYTE 839 | STA CURSER ;RESET CURSER HORIZONTAL 840 | RTS 841 | * VERTICAL MOVE RELATIVE TO TOP LEFT 842 | VMT1 LDB TOPL+1 ;GET TOP LEFT VERTICAL 843 | ADDB ,X+ ;ADD NEXT TEXT BYTE 844 | STB CURSER+1 ;RESET CURSER VERTICAL 845 | RTS 846 | * VERTICAL MOVE RELATIVE TO CURSER 847 | VMC1 LDB CURSER+1 ;GET CURSER VERTICAL 848 | ADDB ,X+ ;ADD NEXT TEXT BYTE 849 | STB CURSER+1 ;RESET CURSER VERTICAL 850 | RTS 851 | * RESET TOP LEFT AND CURSER 852 | RTC1 LDD ,X++ ;GET NEXT TWO TEXT BYTES 853 | STD TOPL ;RESET TOP LEFT 854 | STD CURSER ;RESET CURSER 855 | RTS 856 | * RETURN(TO TOPL LEFT), LINE FEED 857 | RLF1 LDA TOPL ;GET TOP LEFT HORIZONTAL 858 | LDB CURSER+1 ;GET CURSER VERTICAL 859 | ADDB LINESP ;ADD LINE SPACING TO VERTICAL 860 | STD CURSER ;RESET CURSER 861 | RTS 862 | * PICTURE 863 | PIC1 LDY ,X++ ;GET NEXT TWO TEXT BYTES 864 | STX MESPT ;SAVE MESSAGE POINTER 865 | LDX TEMP2A ;WRITE/ERASE PICTURE 866 | JSR ,X 867 | ADDA ,Y ;ADVANCE CURSER PICTURE WIDTH 868 | ADDA CHARSP ;ADVANCE CURSER CHARACTER SPACING 869 | STA CURSER ;SAVE CURSER 870 | LEAS 2,S ;POP STACK 871 | LDX TEMP2B ;NEXT TEXT BYTE / QUIT 872 | JMP ,X 873 | * 874 | * NUMBER ROUTINE X IS TOP LEFT ADDRESS, 875 | * CHANGED AFTER NUMBER COMPLETED 876 | * D IS BCD NUMBER 877 | * CHARSP IS USED AS SPACING 878 | * 879 | * NUMBER IS SHIFTED ONE NIBBLE AT A TIME LEFT 880 | * AND REPLACED BY F, AS IT IS WRITTEN TO SCREEN 881 | * (EX. 5349 => 349F => 49FF => 9FFF => FFFF DONE) 882 | * 883 | * WRITE NUMBER BLOCK 884 | WNUMBB PSHS U,Y,X,D,CC ;<=START HERE TO WRITE NUMBER BLOCK 885 | LDY #CWRITV 886 | LDU #NUMB4 887 | BRA NUMB1 888 | * ERASE NUMBER BLOCK 889 | ENUMBB PSHS U,Y,X,D,CC ;<=START HERE TO ERASE NUMBER BLOCK 890 | LDY #COFFV 891 | LDU #NUMB4 892 | BRA NUMB1 893 | * WRITE NUMBER DIGIT 894 | WNUMBC PSHS U,Y,X,D,CC ;<=START HERE TO WRITE NUMBER DIGIT 895 | LDY #CWRITV 896 | LDU #NUMB6 897 | BRA NUMB1 898 | * ERASE NUMBER DIGIT 899 | ENUMBC PSHS U,Y,X,D,CC ;<=START HERE TO ERASE NUMBER DIGIT 900 | LDY #COFFV 901 | LDU #NUMB6 902 | NUMB1 STY TEMP2A ;SAVE WRITE/ERASE SELECT 903 | STU TEMP2B ;SAVE BLOCK/DIGIT SELECT 904 | LDU NUMBER 905 | CMPU #$FFFF ;CHECK IF NEW NUMBER 906 | BNE NUMB3A ;CONTINUE OLD NUMBER 907 | STX CURSER ;SAVE SCREEN POSITION 908 | STD NUMBER ;SAVE NUMBER 909 | BNE NUMB2 ;CHECK FOR >0 910 | LDD #$0FFF ;DISPLAY ONE DIGIT "0" 911 | BRA NUMB3 ;SKIP LEADING 0 SUPRESSION 912 | NUMB2 BITA #$F0 ;TEST LEADING DIGIT 913 | BNE NUMB3 ;NOT 0 914 | BSR NUMB10 ;SHIFT ONE NIBBLE LEFT 915 | BRA NUMB2 916 | NUMB3 STD NUMBER ;SAVE NUMBER 917 | NUMB3A LDD NUMBER ;GET NUMBER 918 | NUMB4 ANDA #$F0 ;EXTRACT NEXT DIGIT 919 | CMPA #$F0 ;CHECK IF FINISHED 920 | BNE NUMB5 ;NO, CONTINUE 921 | PULS CC,D,X,Y,U 922 | LDX CURSER ;NEW SCREEN POSITION 923 | ORCC #1 ;SET CARRY BIT(NUMBER COMPLETED) 924 | RTS ;RETURN 925 | NUMB5 LSRA ;DIVIDE NUMBER BY 4 926 | LSRA 927 | LDX #N0 ;SET DIGIT DESCRIPTER 928 | LEAY A,X 929 | LDD CURSER ;SET SCREEN POSITION 930 | LDX TEMP2A ;WRITE/ERASE DIGIT 931 | JSR ,X 932 | ADDA ,Y ;ADVANCE CURSER DIGIT WIDTH 933 | ADDA CHARSP ;ADVANCE CURSER CHARACTER SPACING 934 | STA CURSER ;SAVE CURSER 935 | LDD NUMBER ;GET NUMBER 936 | BSR NUMB10 ;SHIFT ONE NIBBLE LEFT 937 | STD NUMBER 938 | LDX TEMP2B ;NEXT DIGIT / QUIT 939 | JMP ,X 940 | NUMB6 PULS CC,D,X,Y,U 941 | ANDCC #$FE ;CLEAR CARRY BIT(NUMBER NOT FINISHED) 942 | RTS ;RETURN 943 | NUMB10 ASLB ;SHIFT ONE NIBBLE LEFT 944 | ROLA 945 | ASLB 946 | ROLA 947 | ASLB 948 | ROLA 949 | ASLB 950 | ROLA 951 | ORB #$0F 952 | RTS 953 | PAGE 954 | -------------------------------------------------------------------------------- /src/romc0.src: -------------------------------------------------------------------------------- 1 | * TTL ROMC0 ;- DIAG ROM AT C000 - 12/22/80 2 | * 3 | * SYSTEM EQUATES 4 | * 5 | LETCOL EQU $C001 ;USE COLOR 1!!! 6 | THSTAB EQU $B260 ;HOME!! 7 | KILSND EQU $13 ;SOUND NUMBER TO TURN OFF SOUNDS 8 | LSOUND EQU $1F ;LAST SOUND TO BE TESTED 9 | SWSND EQU $08 ;SOUND MADE FOR SWCLOSURE 10 | 11 | * 12 | * 13 | * DIAGNOSTIC ROM 14 | * 15 | * 16 | ORG DIAORG ;POINT TO START 17 | * 18 | * VECTORED JUMPS INTO ROM HERE 19 | * 20 | JMP RORAOK 21 | JMP ROOKRB 22 | JMP ROMBAD 23 | JMP PWRUP 24 | JMP AUD 25 | JMP AUD1 26 | JMP COINL 27 | JMP COINR 28 | JMP COINC 29 | JMP RHSTD 30 | JMP CMOSMV 31 | JMP AUDITG 32 | JMP AUTOCY 33 | JMP CROM0 34 | JMP CRAM10 35 | JMP CRAM20 36 | JMP SOUND0 37 | JMP RHSTDS 38 | OUTB0 JMP STBXBV ;DIRECT 39 | INB0 JMP LDBXBV ;DIRECT 40 | * 41 | * INDIRECT TO BLOCK 2 TEXT ROUTINES 42 | * 43 | VWTEXT JSR LJSRV ;GO TO BLOCK 2 44 | FDB TV1 45 | FCB 2 46 | RTS 47 | VETEXT JSR LJSRV 48 | FDB TV2 49 | FCB 2 50 | RTS 51 | VWNUMB JSR LJSRV 52 | FDB TV5 53 | FCB 2 54 | RTS 55 | VENUMB JSR LJSRV 56 | FDB TV6 57 | FCB 2 58 | RTS 59 | VERAST JSR LJSRV 60 | FDB TV9 61 | FCB 2 62 | RTS 63 | VDISST JSR LJSRV 64 | FDB TV10 65 | FCB 2 66 | RTS 67 | VOPERS JSR LJSRV 68 | FDB TV11 69 | FCB 2 70 | RTS 71 | VOPERI JSR LJSRV 72 | FDB TV12 73 | FCB 2 74 | RTS 75 | * 76 | * CHECKBYTE 77 | * 78 | FDB $D9FF ;Fixme was: $FFFF 79 | * 80 | * INITIAL ROM OK, RAM OK 81 | * 82 | RORAOK JSR NEWTST 83 | LDB #$7A ;GREEN LETTERS 84 | JSR SETCOL ;SET COLOR 85 | LDU #VINITT ;"INITIAL TESTS INDICATE " 86 | LDX #$2870 ;SCREEN ADDRESS 87 | JSR VWTEXT ;WRITE TO SCREEN 88 | LDU #VUNIOK ;"UNIT OK " 89 | LDX #$4090 ;SCREEN ADDRESS 90 | JSR VWTEXT ;WRITE TO SCREEN 91 | LDB #$F ;FLASH ALL LEDS TWICE 92 | JSR FLASHL 93 | LDY #3000 ;3 SECOND DELAY 94 | JMP DELAY ;AND RTS BACK TO MAIN 95 | * 96 | * INTIIAL ROM OK, RAM BAD 97 | * 98 | ROOKRB JSR NEWTST 99 | LDB #$57 ;RED LETTERS 100 | JSR SETCOL ;SET COLORS 101 | LDU #VINITT ;"INITIAL TESTS INDICATE " 102 | LDX #$2870 ;SCREEN ADDRESS 103 | JSR VWTEXT ;WRITE TO SCREEN 104 | LDU #VRAMFL ;"RAM FAILURE " 105 | LDX #$3890 ;SCREEN ADDRESS 106 | JSR VWTEXT ;WRITE TO SCREEN 107 | BRA IDIS30 ;WAIT 30 SECONDS THEN RETURN 108 | * 109 | * INTITAL ROM BAD 110 | * 111 | ROMBAD JSR NEWTST 112 | LDB #$57 ;RED LETTERS 113 | JSR SETCOL ;SET COLORS 114 | LDU #VINITT ;"INITIAL TESTS INDICATE " 115 | LDX #$2860 ;SCREEN ADDRESS 116 | JSR VWTEXT ;WRITE TO SCREEN 117 | LDU #VROMFL ;"ROM FAILURE " 118 | LDX #$3880 ;SCREEN ADDRESS 119 | JSR VWTEXT ;WRITE TO SCREEN 120 | TFR DP,A ;CHECK IF RAM ALSO BAD 121 | CMPA #$9E 122 | BEQ IDIS30 123 | * 124 | * RAM BAD ALSO 125 | LDU #VRAMFL ;"RAM FAILURE " 126 | LDX #$38A0 ;SCREEN ADDRESS 127 | JSR VWTEXT ;WRITE TO SCREEN 128 | * 30 SECOND DELAY - CHECK ADVANCE SWITCH 129 | IDIS30 LDY #3000 ;30 SECOND DELAY 130 | IDIS31 JSR DELY10 ;DELAY 10 MILLISECONDS 131 | LDX #$CC00 ;READ COIN DOOR SWITCHES 132 | JSR INB0 133 | BITB #2 ;CHECK FOR ADVANCE 134 | BEQ IDIS32 ;NO ADVANCE?, CONTINUE 135 | LSRB ;CHECK AUTO/MANUAL SWITCH 136 | BCS IDIS33 ;AUTO?, BACK TO MAIN PROGRAM 137 | BRA CROM0 ;MANUAL?, JUMP TO DIAGNOSTICS 138 | IDIS32 LEAY -1,Y ;COUNT DOWN TIME 139 | BNE IDIS31 140 | IDIS33 RTS ;BACK TO MAIN PROGRAM 141 | * 142 | * POWER UP SUBROUTINE 143 | * 144 | PWRUP ANDCC #$EF ;REMOVE CONTINUOUS TEST IF GET BACK HERE 145 | LDX #CMOSCK ;GO READ CHECK BYTE 146 | JSR RCBV 147 | CMPB #$5A ;OK 148 | BNE PWRUP0 ;NO 149 | LDX #DIPFLG ;CHECK FOR SPECIAL FUNCTION 150 | JSR INB0 151 | ANDB #$F ;REMOVE GARBAGE 152 | BNE PWRUP4 ;YES?, WHICH FUNCTION? 153 | RTS ;NO?, DONE 154 | *SPECIAL FUNCTION 155 | PWRUP4 CLRB ;CLEAR SPECIAL FUNCTION FLAG 156 | JSR OUTB0 157 | LDX #DIPSW ;GET FUNCTION NUMBER 158 | JSR RCBV 159 | CLRA ;ZERO FUNCTION NUMBER 160 | LEAX -2,X 161 | JSR WCAV 162 | CMPB #$15 ;AUTO CYCLE? 163 | BNE PWRUP2 ;NO 164 | AUTOCY ANDCC #$7F ;CLEAR AUTO CYCLE FLAG 165 | BRA CROM0 ;GO DO ROM TEST 166 | PWRUP2 CMPB #$25 ;RESET HIGH SCORE TABLES? 167 | BNE PWRUP3 ;NO 168 | JMP RHSTD ;RESET THEM 169 | PWRUP3 CMPB #$35 ;CLEAR AUDITS? 170 | BNE PWRUP1 ;NO 171 | JMP CLRAUD ;CLEAR THEM 172 | PWRUP1 CMPB #$45 ;DEFAULT? 173 | BEQ PWRUP0 ;YES, DO IT 174 | RTS 175 | PWRUP0 LEAS 2,S ;REMOVE THIS CALL 176 | JSR CMINIT ;INIT CMOS 177 | JMP AUDITG ;GO TO AUDIT SECTION 178 | * 179 | * COMPREHENSIVE ROM TEST 180 | * 181 | CROM0 ORCC #$10 ;SET COMPREHENSIVE FLAG 182 | JSR NEWTST 183 | JSR ROM0V 184 | PSHS U ;SAVE A BIT 185 | LDU RMAPV ;GET IT INDIRECT 186 | LEAU 24,U ;GET TO THE END 187 | STU TEMP2D ;SAVE A BIT 188 | PULS U ;GET IT BACK 189 | CMPU TEMP2D ;DONE? 190 | BEQ CROM10 ;ROMS ALL OK 191 | * ROM FAILURE 192 | STU ROMPTR ;SAVE ROM TABLE POINTER 193 | LDB #8 ;LIGHT LED1 194 | JSR LEDS 195 | LDB #$57 ;RED LETTERS 196 | JSR SETCOL ;SET COLORS 197 | LDU #VROMFL ;"ROM FAILURE " 198 | LDX #$3860 ;SCREEN ADDRESS 199 | JSR VWTEXT ;WRITE TO SCREEN 200 | LDY #IROMFL ;GIVE INSTRUCTIONS 201 | JSR VOPERI 202 | LDD #$4266 ;SET CURSER 203 | STD CURSR2 204 | CROM1 LDX CURSR2 ;GET CURSER 205 | LEAX 10,X ;ADVANCE IT 206 | STX CURSR2 ;SAVE CURSER 207 | LDU #VWROM ;"ROM " 208 | JSR VWTEXT ;WRITE TO SCREEN 209 | LDU RMAPV ;GET INDIRECTLY 210 | STU TEMP2D ;SAVE # 211 | LDU ROMPTR ;RESTORE ROM POINTER 212 | LDD ROMPTR ;GET ROM TABLE POINTER 213 | SUBD TEMP2D ;DETERMINE WHICH ROM FAILED 214 | LSRB 215 | BCS CROM2 ;ERROR IN FIRST HALF 216 | LEAU 1,U ;FORGET ABOUT OTHER HALF 217 | CROM2 INCB 218 | STB TEMP1A ;SAVE ROM NUMBER 219 | JSR CONVTB ;CONVERT FROM HEX TO BCD 220 | LDX CURSER ;STEAL CURSER FROM TEXT 221 | JSR VWNUMB ;WRITE NUMBER TO SCREEN 222 | JSR WATCHD ;RESET WATCHDOG 223 | JSR ROM9V ;CONTINUE 224 | STU ROMPTR ;SAVE ROM POINTER 225 | LDU RMAPV ;GET IT 226 | LEAU 24,U ;INDIRECTLY 227 | CMPU ROMPTR ;DONE? 228 | BNE CROM1 ;ANOTHER FAILURE 229 | JSR ADVSW ;WAIT FOR ADVANCE SWITCH 230 | TST ASCNTR ;CHECK FOR AUTO UP 231 | BNE CRAM0 ;YES?, NEXT TEST 232 | LDB TEMP1A ;GET LAST BAD ROM NUMBER 233 | JSR LEDS ;DISPLAY ON LEDS 234 | LDY #IROMDO ;GIVE INSTRUCTIONS 235 | JSR VOPERI 236 | BRA CROM20 ;WAIT FOR ADVANCE THEN RAM TEST 237 | * ROMS OK 238 | CROM10 TFR CC,B ;CHECK AUTO CYCLE NOT FLAG <===========TEMPORORY 239 | TSTB 240 | BPL CRAM0A ;CLEAR?, NEXT TEST <=========== 241 | LDB #$7A ;GREEN LETTERS 242 | JSR SETCOL ;SET COLOR 243 | LDU #VALROM ;"ALL ROMS OK " 244 | LDX #$3880 245 | JSR VWTEXT ;WRITE TO SCREEN 246 | LDY #IROMDO ;GIVE INSTRUCTIONS 247 | JSR VOPERI 248 | LDB #8 ;FLASH LED 1 TWICE 249 | JSR FLASHL 250 | CROM20 JSR NEXTST 251 | * 252 | * COMPREHENSIVE RAM TEST 253 | * 254 | CRAM0 JSR NEWTST 255 | CLRB ;TURN OFF LEDS 256 | JSR LEDS 257 | JSR WHITE ;WHITE LETTERS 258 | LDU #VRAMTS ;"RAM TEST " 259 | LDX #$4080 260 | JSR VWTEXT ;WRITE TO SCREEN 261 | LDY #IRAMTS ;GIVE INSTRUCTIONS 262 | JSR VOPERI 263 | LDY #5000 ;DELAY 5 SECONDS 264 | JSR DELAY 265 | CRAM0A JSR DELY10 ;WAIT 10 MILLISECONDS 266 | TST ASCNTR ;CHECK FOR ADV W AUTO 267 | LBNE CMOS0 ;YES, NEXT TEST 268 | TST ASBUFF ;IS ADVANCE SWITCH DEFINATELY OPEN 269 | BNE CRAM0A ;NO, KEEP WAITING 270 | LDX #$C000 ;SET INTERESTING SCREEN COLORS 271 | LDB #$C0 272 | CRAM1 JSR OUTB0 273 | LDA #$B5 274 | MUL 275 | EXG A,B 276 | LEAX 1,X 277 | CMPX #$C010 278 | BNE CRAM1 279 | LDD #0 ;ZERO RANDOM SEED 280 | LDY #$000A ;INITIALIZE TEST COUNTER 281 | JMP RAM2V ;BEGIN TEST 282 | * RAM FAILURE 283 | CRAM10 TFR Y,D ;GET ERROR 284 | EORB ,-X 285 | EORA ,-X 286 | STD TEMP2C ;SAVE ERROR 287 | STX TEMP2D ;SAVE ADDRESS 288 | JSR ZEROCL ;ZERO COLORS 289 | JSR SCRCLV 290 | JSR INITDP ;RE-INITIALIZE DIRECT PAGE VARIABLES 291 | JSR WATCHD ;RESET WATCHDOG 292 | LDB #4 ;LIGHT LED 2 293 | JSR LEDS 294 | LDB #$57 ;COLOR LETTERS RED 295 | JSR SETCOL ;SET COLOR 296 | LDU #VRAMFL ;"RAM FAILURE " 297 | LDX #$3870 298 | JSR VWTEXT ;WRITE TO SCREEN 299 | LDY #IRAMFL ;GIVE INSTRUCTIONS 300 | JSR VOPERI 301 | LDD TEMP2C ;GET ERROR IN A 302 | TSTA 303 | BNE CRAM11 304 | TFR B,A 305 | CRAM11 CLRB ;FIND BIT NUMBER 306 | CRAM12 INCB 307 | LSRA 308 | BCC CRAM12 309 | STB TEMP1A ;SAVE BAD BIT NUMBER 310 | LDD TEMP2D ;GET BAD BLOCK NUMBER IN A 311 | CRAM13 SUBA #3 312 | BCC CRAM13 313 | ADDA #4 314 | STA TEMP1B ;SAVE BAD BLOCK NUMBER 315 | LDU #VWRAM ;"RAM " 316 | LDX #$4290 ;SCREEN ADDRESS 317 | JSR VWTEXT ;WRITE TO SCREEN 318 | LDB TEMP1B ;GET BAD BLOCK NUMBER 319 | ASLB ;SHIFT ONE NIBBLE LEFT 320 | ASLB 321 | ASLB 322 | ASLB 323 | ADDB TEMP1A ;ADD BAD BIT NUMBER 324 | CLRA 325 | LDX CURSER ;STEAL CURSER FROM TEXT 326 | JSR VWNUMB ;WRITE RAM NUMBER TO SCREEN 327 | JSR ADVSW ;WAIT FOR ADVANCE SWITCH 328 | TST ASCNTR ;CHECK AUTO/MANUAL SWITCH 329 | BNE CMOS0 ;AUTO, SKIP TO CMOS RAM TEST 330 | LDA TEMP1B ;GET BAD BLOCK NUMBER 331 | LDB #$10 ;DISPLAY BAD BLOCK ON LEDS 332 | CRAM14 LSRB 333 | DECA 334 | BNE CRAM14 335 | JSR LEDS 336 | JSR ADVSW ;WAIT FOR ADVANCE SWITCH 337 | TST ASCNTR ;CHECK AUTO/MANUAL SWITCH 338 | BNE CMOS0 ;AUTO, SKIP TO CMOS RAM TEST 339 | LDB TEMP1A ;GET BAD BIT NUMBER 340 | JSR LEDS ;DISPLAY ON LEDS 341 | LDY #IRAMDO ;GIVE INSTRUCTIONS 342 | JSR VOPERI 343 | BRA CRAM30 ;WAIT FOR ADVSW 344 | * RAM TEST ABORTED 345 | CRAM20 JSR ZEROCL ;ZERO COLORS 346 | JSR SCRCLV 347 | JSR INITDP ;RE-INTIIALIZE DIRECT PAGE VARIABLES 348 | JSR WATCHD ;RESET WATCHDOG 349 | CMPY #$000A ;TEST FOR EARLY ABORT 350 | BEQ CMOS0 ;ABORTED EARLY-NEXT TEST 351 | LDB #$7A ;GREEN LETTERS 352 | JSR SETCOL ;SET COLOR 353 | LDU #VNORAM ;"NO RAM ERRORS DETECTED " 354 | LDX #$2880 355 | JSR VWTEXT ;WRITE TO SCREEN 356 | LDY #IRAMDO ;GIVE INSTRUCTIONS 357 | JSR VOPERI 358 | LDB #4 ;FLASH LED 2 TWICE 359 | JSR FLASHL 360 | CRAM30 JSR NEXTST 361 | * 362 | * CMOS RAM TEST 363 | * 364 | CMOS0 JSR NEWTST 365 | TFR DP,A ;GET CONTENTS OF CMOS RAM INTO GOOD BLOCK 366 | CMPA #$A2 ;DOES GOOD BLOCK EXITS? 367 | BNE CMOS10 ;YES?, CONTINUE 368 | * NO GOOD BLOCKS 369 | LDB #2 ;LIGHT LED 3 370 | JSR LEDS 371 | LDB #$57 ;COLOR LETTERS RED 372 | JSR SETCOL ;SET COLOR 373 | LDU #VCMSAB ;"MULTIPLE RAM FAILURE, CMOS RAM CAN NOT BE TESTED" 374 | LDX #$2880 375 | JSR VWTEXT ;WRITE TO SCREEN 376 | LDY #ICMSDO ;GIVE INSTRUCTIONS 377 | JSR VOPERI 378 | JMP CMOS30 ;WAIT FOR SWITCH THEN COLOR RAM 379 | * 380 | CMOS10 ADDA #3 ;SAVE CMOS $300 ABOVE DIRECT PAGE 381 | CLRB 382 | STD TEMP2C ;SAVE ADDRESS 383 | LDU TEMP2C ;INTO U REGISTER 384 | LDX #CMOS ;CMOS STARTING ADDRESS 385 | CMOS11 JSR INB0 386 | STB ,U+ 387 | LEAX 1,X 388 | CMPX #CMOS+$100 389 | BNE CMOS11 390 | LDD #$10 ;INITIALIZE PATTERN COUNTER AND CLEAR A 391 | STB TEMP1A 392 | * TEST LOOP 393 | CLRA ;ZERO TEST COUNTER 394 | CMOS12 LDX #CMOS ;INITIALIZE CMOS POINTER 395 | LDB TEMP1A ;GET START OF PATTERN 396 | CMOS13 JSR OUTB0 397 | LEAX 1,X 398 | INCB 399 | CMPB TEMP1A ;CHECK IF DONE 400 | BNE CMOS13 401 | LDX #CMOS 402 | INCA 403 | CMOS14 JSR INB0 404 | STB TEMP1B 405 | LEAX 1,X 406 | JSR INB0 407 | SUBB TEMP1B 408 | DECB 409 | ANDB #$F ;MASK UPPER NIBBLE 410 | BNE CMOS15 ;ERROR? ABORT TEST(TEMP1A>0) 411 | INCA ;CHECK COUNTER 412 | BNE CMOS14 413 | JSR WATCHD ;RESET WATCHDOG 414 | TST ASCNTR ;CHECK FOR ADV. W AUTO 415 | BNE CMOS15 ;YES?, ABORT TEST 416 | DEC TEMP1A ;NEXT PATTERN 417 | BNE CMOS12 418 | * RECOVER CMOS 419 | CMOS15 LDU TEMP2C ;INTO U REGISTER 420 | LDX #CMOS ;CMOS STARTING ADDRESS 421 | CMOS16 LDB ,U+ ;TRANSFER DATA 422 | JSR OUTB0 423 | LEAX 1,X 424 | CMPX #CMOS+$100 ;AT END? 425 | BNE CMOS16 426 | TST ASCNTR ;CHECK IF OPERATOR ABORTED? 427 | BNE COLRAM ;NEXT TEST 428 | LDA TEMP1A ;CHECK IF TEST ABORTED? 429 | BEQ CMOS20 ;NO?, CMOS OK 430 | * CMOS RAM BAD 431 | LDB #2 ;LIGHT LED 3 432 | JSR LEDS 433 | LDB #$57 ;COLOR LETTERS RED 434 | JSR SETCOL ;SET COLOR 435 | JSR WATCHD ;GET THE DOGGY 436 | LDU #VCMSFL ;"CMOS RAM FAILURE " 437 | LDX #$3080 438 | JSR VWTEXT ;WRITE TO SCREEN 439 | JSR WATCHD ;GET THE DOGGY 440 | LDY #ICMSDO ;GIVE INSTRUCTIONS 441 | JSR VOPERI 442 | BRA CMOS30 ;WAIT FOR SWITCH THEN COLOR RAM TEST 443 | * CMOS RAM OK 444 | CMOS20 LDB #$7A ;GREEN LETTERS 445 | JSR SETCOL ;SET COLOR 446 | LDU #VCMSOK ;"CMOS RAM OK " 447 | LDX #$3880 448 | JSR VWTEXT ;WRITE TO SCREEN 449 | LDY #ICMSDO ;GIVE INSTRUCTIONS 450 | JSR VOPERI 451 | LDB #2 ;FLASH LED 3 TWICE 452 | JSR FLASHL 453 | CMOS30 JSR NEXTST 454 | * 455 | * COLOR RAM TEST 456 | * 457 | COLRAM JSR NEWTST 458 | LDB #1 ;LIGHT LED #4 459 | JSR LEDS 460 | JSR WHITE ;WHITE LETTERS 461 | LDU #VCOLTS ;"COLOR RAM TEST " 462 | LDX #$3880 463 | JSR VWTEXT ;WRITE TO SCREEN 464 | LDY #ICOLTS ;GIVE INSTRUCTIONS 465 | JSR VOPERI 466 | LDY #5000 ;DELAY 5 SECONDS 467 | JSR DELAY 468 | JSR RAMBAR ;DO COLOR RAM BARS!!! 469 | LDY #2000 ;DELAY 2 SECONDS EACH COLOR 470 | COLRM0 LDU #COLRMT ;GET START OF COLOR RAM TEST TABLE 471 | * COLOR LOOP 472 | COLRM1 LDB ,U+ 473 | LDX #$C000 ;SET ALL COLORS 474 | COLRM2 JSR OUTB0 475 | LEAX 1,X 476 | CMPX #$C010 477 | BNE COLRM2 478 | JSR DELAY ;WAIT TWO SECONDS 479 | CMPU #COLRMT+8 ;CHECK IF FINISHED 480 | BNE COLRM1 481 | TST ASCNTR 482 | BEQ COLRM0 483 | * 484 | * AUDIO TEST 485 | * 486 | SOUND0 JSR NEWTST 487 | CLRB ;TURN OFF LEDS 488 | STB TEMP2C ;INIT TOP HALF OF NUMBER!! 489 | STB TEMP2C+1 ;AND BOTTOM 490 | JSR LEDS 491 | JSR WHITE ;WHITE LETTERS 492 | LDU #VAUDTS ;"AUDIO TEST SOUND " 493 | LDX #$4078 494 | JSR VWTEXT ;WRITE TO SCREEN 495 | LDY #IAUDTS ;GIVE INSTRUCTIONS 496 | JSR VOPERI 497 | LDY #1 ;NO DELAY ON FIRST SOUND 498 | SOUND1 LDU #SKIPSN ;GET START OF SKIP SOUND TABLE 499 | CLRA ;INITIALIZE SOUND COUNTER 500 | SOUND2 LDX #$CC00 ;READ COIN DOOR SWITCHES 501 | JSR INB0 502 | BITB #1 ;CHECK AUTO/MANUAL BIT 503 | BNE SOUND3 ;AUTO?, BRANCH AHEAD 504 | BITB #2 ;CHECK FOR ADVANCE 505 | BNE SOUND6 ;YES, PLAY SOUND 506 | JSR DELY10 ;PAUSE 10 MILLISECONDS 507 | BRA SOUND2 ;KEEP WAITING 508 | SOUND3 JSR DELAY ;DELAY BETWEEN SOUND IN AUTO 509 | SOUND4 INCA ;ADVANCE SOUND NUMBER 510 | CMPA ,U ;SKIP THIS SOUND? 511 | BNE SOUND5 ;NO?, PLAY IT 512 | LEAU 1,U ;ADVANCE SKIP SOUND TABLE POINTER 513 | BRA SOUND4 ;TRY NEXT SOUND 514 | SOUND5 STA TEMP1A ;SAVE SOUND NUMBER 515 | EORA #$3F 516 | SOUND6 LDB #KILSND ;TURN OFF SOUND 517 | JSR PLAYB 518 | TST ASCNTR ;CHECK FOR ADVANCE WITH AUTO 519 | BNE SWITST ;NEXT TEST 520 | LDB TEMP1A ;GET NEW SOUND 521 | JSR PLAYB 522 | LDY #1000 ;NOW SET ONE SECOND DELAY 523 | LDD TEMP2C ;GET OLD SOUND BCD NUMBER 524 | LDX #$5A8C ;SCREEN POSITION 525 | JSR VENUMB ;ERASE OLD BCD NUMBER 526 | LDB TEMP1A ;GET SOUND NUMBER 527 | JSR CONVTB ;CONVERT FROM HEX TO BCD 528 | CLRA 529 | STD TEMP2C ;SAVE BCD NUMBER 530 | LDX #$5A8C ;SCREEN POSITION 531 | JSR VWNUMB ;WRITE NEW NUMBER 532 | LDA TEMP1A ;GET SOUND NUMBER 533 | CMPA #LSOUND ;CHECK FOR LAST SOUND 534 | BNE SOUND2 ;CONTINUE 535 | TFR CC,B ;CHECK AUTO CYCLE NOT FLAG <=============TEMPORARY 536 | TSTB 537 | LBPL MONTRT ;CLEAR?, BRANCH NEXT TEST <============= 538 | BRA SOUND1 ;REINITIALIZE 539 | * 540 | * SWITCH TEST 541 | * 542 | 543 | SWITST JSR NEWTST 544 | JSR WHITE ;WHITE LETTERS 545 | LDU #VSWTTS ;"SWITCH TEST " 546 | LDX #$3820 547 | JSR VWTEXT ;WRITE TO SCREEN 548 | LDY #ISWTTS ;GIVE INSTRUCTIONS 549 | JSR VOPERI 550 | TFR DP,A ;GET ADDRESS OF DISTBL 551 | LDB #($FF&DISTBL) ;Fixme: was #$FF!.DISTBL 552 | STD TEMP2C ;SAVE IT 553 | ADDB #38 ;INITIALIZE TABLE 554 | TFR D,X 555 | LDA #$FF ;MINUS BYTE INDICATES SPACE AVAILABLE 556 | SWIT1 STA ,-X 557 | CMPX TEMP2C 558 | BNE SWIT1 559 | CLR LSCC00 ;ZERO LAST PIA READS 560 | CLR LSCC04 561 | CLR LSCC06 562 | CLR LCC042 563 | CLR LCC062 564 | * TEST LOOP 565 | SWIT2 LDA #1 ;INTIALIZE CONTROL PANEL NUMBER 566 | STA TEMP1C 567 | LDX #$CC00 ;GET FIRST PIA ADDRESS 568 | LDU TEMP2C ;GET START OF LAST PIA READS 569 | LEAU LSCC00-DISTBL,U 570 | CLRA ;INITIALIZE SWITCH NUMBER COUNTER 571 | SWIT3 JSR INB0 572 | CMPX #$CC06 ;COCTAIL PIA? 573 | BNE SWIT3A ;NO?, SKIP MASK 574 | ANDB #$7F ;MASK COCTAIL BIT 575 | SWIT3A CMPA #$18 ;PLAYER 2 CONTROL PANEL 576 | BNE SWIT3B ;NO?, SKIP MASK 577 | ANDB #$CF ;MASK ONE AND TWO PLAYER STARTS 578 | SWIT3B STB TEMP1A ;SAVE DATA 579 | EORB ,U+ ;COMPARE WITH LAST PIA READS 580 | BNE SWIT5 ;CHANGED?, BRANCH TO SWITCH STATE CHANGE 581 | ADDA #8 ;ADVANCE SWITCH NUMBER COUNTER 8 SWITCHES 582 | SWIT4 LEAX 2,X ;ADVANCE PIA ADDRESS 583 | CMPX #$CC02 ;CHECK IF SOUND PIA 584 | BEQ SWIT4 ;YES?, SKIP IT 585 | CMPX #$CC08 ;CHECK IF LAST PIA 586 | BNE SWIT3 ;NO?, READ NEXT PIA 587 | CMPA #$28 ;DONE SCANNING CONTROL PANEL 2? 588 | BEQ SWIT4A ;YES?, QUIT SCANNING 589 | LEAX -2,X ;CHECK IF COCTAIL 590 | JSR INB0 591 | TSTB 592 | BPL SWIT4A ;NO?, QUIT SCANNING 593 | LDB #$34 ;ENABLE CONTROL PANEL 2 594 | LEAX 1,X 595 | JSR OUTB0 596 | LEAX -3,X ;SET TO PIA $CC04 597 | INC TEMP1C ;CONTROL PANEL NUMBER 2 598 | BRA SWIT3 ;SCAN CONTROL PANEL 2 599 | SWIT4A LDB #$3C ;ENABLE CONTROL PANEL 1 600 | LDX #$CC07 601 | JSR OUTB0 602 | JSR WATCHD ;RESET WATCHDOG 603 | TST ASCNTR ;CHECK FOR ADV W AUTO 604 | BEQ SWIT2 ;NO?, REPEAT TEST 605 | BRA MONTRT ;NEXT TEST 606 | * SWITCH STATE CHANGE 607 | SWIT5 STB TEMP1B ;SAVE CHANGE 608 | LDB #1 ;INITIALIZE BIT TEST POINTER 609 | SWIT6 BITB TEMP1B ;CHECK FOR CHANGED BIT 610 | BNE SWIT7 ;YES?, NEXT STEP 611 | INCA ;ADVANCE SWITCH NUMBER COUNTER 612 | ASLB ;MOVE BIT TEST POINTER 613 | BRA SWIT6 ;CONTINUE TEST 614 | SWIT7 LDX TEMP2C ;GET START OF SWITCH SCREEN TABLE 615 | BITB TEMP1A ;CHECK NEW STATE OF SWITCH 616 | BNE SWIT9 ;CLOSED?, BRANCH TO SWITCH CLOSED 617 | * SWITCH OPENED 618 | EORB ,-U ;CHANGE STATE ON LAST PIA READS 619 | STB ,U 620 | SWIT8 CMPA ,X+ ;FIND SWITCH ON SWITCH SCREEN TABLE 621 | BNE SWIT8 622 | COM ,-X ;KILL IT(MINUS) 623 | BSR SWIT11 ;GET SCREEN POSITION 624 | LDD #$3808 ;ERASE SWITCH MESSAGE 625 | JSR BLKCLV 626 | BRA SWIT4A ;NEXT SCAN 627 | * SWITCH CLOSED 628 | SWIT9 EORB ,-U ;CHANGE STATE OF LAST PIA READS 629 | STB ,U 630 | LDB #SWSND ;PLAY SOUND 631 | JSR PLAYB 632 | SWIT10 TST ,X+ ;FIND AVAILABLE SPOT ON SCREEN TABLE 633 | BPL SWIT10 634 | STA ,-X ;STORE SWITCH NUMBER AT SPOT 635 | PSHS A ;SAVE SWITCH NUMBER 636 | BSR SWIT11 ;GET SWITCH NAME AND SCREEN POSITION 637 | JSR VWTEXT ;WRITE SWITCH NAME TO SCREEN 638 | PULS A ;GET SWITCH NUMBER 639 | CMPA #$8 ;CHECK IF $CC00 PIA 640 | BLO SWIT4A ;SKIP PLAYER NUMBER, NEXT SCAN 641 | LSRA ;CHECK IF ONE OR TWO PLAYER START 642 | CMPA #$6 643 | BEQ SWIT4A ;SKIP PLAYER NUMBER, NEXT SCAN 644 | LDX #$CC06 ;CHECK IF COCTAIL 645 | JSR INB0 646 | TSTB 647 | BPL SWIT4A ;NO?, NEXT SCAN 648 | LDX CURSER ;STEAL CURSER FROM TEXT 649 | CLRA ;GET PANEL NUMBER 650 | LDB TEMP1C 651 | JSR VWNUMB ;WRITE TO SCREEN 652 | BRA SWIT4A ;NEXT SCAN 653 | * CHANGE SCREEN 654 | SWIT11 LDU #VSW0 ;GET FIRST SWITCH NAME VECTOR ADDRESS 655 | CMPA #24 ;CHECK IF ON CONTROL PANEL 2 656 | BLO SWT11A ;NO?, WRITE IT 657 | SUBA #16 ;SAME NAMES AS PANEL 1 SWITCHES 658 | SWT11A ASLA ;MULTIPLY SWITCH NUMBER BY 2 659 | LEAU A,U ;OFFSET ADDRESS TO CHANGED SWITCH NAME 660 | TFR X,D ;GET SCREEN TABLE POINTER 661 | SUBD TEMP2C ;GET DISTANCE FROM TOP 662 | LDA #$A ;MULTIPLY BY DISTANCE BETWEEN ENTRIES 663 | MUL 664 | ADDD #$3830 ;ADD POSITION ON SCREEN 665 | TFR D,X ;SET TEXT POSITION POINTER 666 | RTS 667 | * 668 | * MONITOR TEST PATTERNS 669 | * 670 | MONTRT JSR NEWTST 671 | JSR WHITE ;WHITE LETTERS 672 | LDU #VMONTS ;"MONITOR TEST PATTERNS " 673 | LDX #$2880 674 | JSR VWTEXT ;WRITE TO SCREEN 675 | LDY #IMONTS ;GIVE INSTRUCTIONS 676 | JSR VOPERI 677 | LDX #$CC00 ;COIN DOOR SWITCH PIA 678 | MONT0 LDU #PATTBL ;INITIALIZE PATTERN VECTOR POINTER 679 | MONT1 JSR INB0 680 | BITB #1 ;CHECK FOR MANUAL 681 | BEQ MONT2 ;YES?, WAIT FOR ADVANCE SWITCH, NEXT PATTERN 682 | LDY #5000 ;DELAY 5 SECONDS 683 | MONT4 JSR DELAY 684 | TST ASCNTR ;CHECK FOR ADV W AUTO 685 | LBNE AUDITG ;YES?, NEXT TEST 686 | JSR INB0 687 | BITB #1 ;CHECK FOR AUTO UP 688 | BNE MONT3 ;YES?, DISPLAY NEXT PATTERN 689 | MONT2 JSR ADVSW ;WAIT FOR ADVANCE SWITCH 690 | TST ASCNTR ;CHECK FOR ADV W AUTO 691 | LBNE AUDITG ;YES?, NEXT TEST 692 | MONT3 PSHS U,Y,X ;SAVE REGISTERS 693 | JSR [,U] ;DISPLAY PATTERN 694 | PULS X,Y,U ;RECOVER REGISTERS 695 | LEAU 2,U ;ADVANCE PATTERN VECTOR POINTER 696 | CMPU #PATTBL+10 ;CHECK FOR LAST PATTERN 697 | BNE MONT1 ;NO?, CONTINUE 698 | LDY #5000 ;LET THIS PATTERN LAST 5 SECS TOO 699 | JSR DELAY ;BEFORE MOVING ON 700 | TFR CC,B ;CHECK AUTO CYCLE NOT FLAG <=============TEMPORARY 701 | TSTB 702 | LBPL CROM0 ;CLEAR?, BRANCH NEXT TEST <============= 703 | BRA MONT0 ;RESTART 704 | * 705 | * DON HASSLER CROSSHATCH 706 | * 707 | * RAM0 = BLACK - 00 708 | * RAM1 = WHITE - FF 709 | * RAM2 = BLUE - C0 710 | * RAM3 = GREEN - 38 711 | * RAM4 = RED - 07 712 | * 713 | CROSS JSR WATCHD ;RESET DOGGY 714 | JSR SCRCLV ;CLEAR SCREEN 715 | JSR ZEROCL ;SET ALL TO BLACK 716 | LDX #$C001 ;SET COLOR 1 717 | LDB #$FF ;WHITE 718 | JSR OUTB0 ;DO IT 719 | LDX #$C002 ;SET COLOR 2 720 | LDB #$C0 ;BLUE 721 | JSR OUTB0 ;DO IT 722 | LDX #$C003 ;SET COLOR 3 723 | LDB #$38 ;GREEN 724 | JSR OUTB0 ;DO IT 725 | LDX #$C004 ;SET COLOR 4 726 | LDB #$07 ;RED 727 | JSR OUTB0 ;DO IT 728 | JSR WATCHD ;GET THE DOGGY 729 | LDY #WVERT ;MOVE WHITE VERTICALS 730 | LDD #$0101 731 | CROSS4 LDX 0,Y ;GET START PTR 732 | CROSS5 STD ,X++ ;MOVE IN WHITE 733 | CMPX 2,Y ;CK IF LINE DONE 734 | BNE CROSS5 ;NO, KEEP GOING 735 | LEAY 4,Y ;INCR Y BY 4 736 | CMPY #WVERTX ;CK IF ALL DONE 737 | BNE CROSS4 ;NO, DO NEXT LINE 738 | JSR WATCHD ;GET THE DOGGY 739 | LDA #$11 ;MOVE WHITE HORIZ 740 | LDY #WHORZ 741 | CROSS2 LDX 0,Y ;GET START PTR 742 | STX TMPAD 743 | CROSS3 STA 0,X ;MOVE IN WHITE 744 | INC TMPAD ;UPDATE PTR 745 | LDX TMPAD 746 | CMPX 2,Y ;CK IF DONE 747 | BNE CROSS3 ;NO, KEEP GOING 748 | LEAY 4,Y ;INCR Y BY 4 749 | CMPY #WHORZX ;CK IF ALL DONE 750 | BNE CROSS2 ;NO, DO NEXT LINE 751 | JSR WATCHD ;GET THE DOGGY 752 | LDY #HORIZ ;MOVE IN COLOR HORIZ. 753 | CROSS6 LDX 0,Y ;GET START PTR 754 | STX TMPAD 755 | LDA 4,Y ;GET COLOR 756 | CROSS7 STA 0,X ;MOVE IN COLOR 757 | INC TMPAD 758 | LDX TMPAD 759 | CMPX 2,Y ;CK IF LINE DONE 760 | BNE CROSS7 ;NO, KEEP GOING 761 | LEAY 5,Y ;INCR Y BY 5 762 | CMPY #HORIZX ;CK IF ALL DONE 763 | BNE CROSS6 ;NO, DO NEXT LINE 764 | JSR WATCHD ;GET THE DOGGY 765 | LDY #VERT ;MOVE IN COLOR VERTICAL 766 | CROSS8 LDX 0,Y ;GET START PTR 767 | LDA 4,Y ;GET COLOR 768 | CROSS9 STA ,X+ ;MOVE IN COLOR 769 | CMPX 2,Y ;CK IF LINE DONE 770 | BNE CROSS9 ;NO, KEEP GOING 771 | LEAY 5,Y ;INCR Y BY 5 772 | CMPY #VERTX ;CK IF ALL DONE 773 | BNE CROSS8 ;NO, DO NEXT LINE 774 | JSR WATCHD ;GET THE DOGGY 775 | LDA #$21 ;BLUE TOUCH UP 776 | STA $467E 777 | LDA #$20 778 | STA $967E 779 | LDX #$4E0A 780 | CROSSA LDA 0,X 781 | ANDA #$F0 782 | ORA #$02 783 | STA ,X+ 784 | CMPX #$4E6D 785 | BNE CROSSA 786 | LDX #$4E90 787 | CROSSB LDA 0,X 788 | ANDA #$F0 789 | ORA #$02 790 | STA ,X+ 791 | CMPX #$4EF3 792 | BNE CROSSB 793 | JSR WATCHD ;GET THE DOGGY 794 | LDX #$0E18 795 | STX TMPAD ;MOVE IN DOTS 796 | CROSSC LDX TMPAD 797 | LDA 0,X ;OR IN DOT 798 | ANDA #$F0 799 | ORA #$01 800 | STA 0,X ;STORE DOT 801 | LDB TMPAD+1 ;UPDATE VERTICAL PTR 802 | ADDB #$22 803 | BCS CROSSD 804 | STB TMPAD+1 805 | BRA CROSSC 806 | CROSSD LDB #$18 807 | STB TMPAD+1 ;RE-INIT VERT. PTR 808 | LDB TMPAD 809 | ADDB #$10 ;UPDATE HORIZ PTR 810 | STB TMPAD 811 | CMPB #$9E ;CK IF DONE 812 | BNE CROSSC ;NO, KEEP GOING 813 | JMP WATCHD ;GET DOGGY + RTS THERE 814 | * 815 | * CROSS HATCH DATA 816 | * 817 | WHORZ FDB $0707 818 | FDB $9707 819 | FDB $0729 820 | FDB $9729 821 | FDB $074B 822 | FDB $974B 823 | FDB $076D 824 | FDB $976D 825 | FDB $078F 826 | FDB $978F 827 | FDB $07B1 828 | FDB $97B1 829 | FDB $07D3 830 | FDB $97D3 831 | FDB $07F5 832 | FDB $97F5 833 | WHORZX EQU * 834 | WVERT FDB $0607 835 | FDB $06F5 836 | FDB $1607 837 | FDB $16F5 838 | FDB $2607 839 | FDB $26F5 840 | FDB $3607 841 | FDB $36F5 842 | FDB $4607 843 | FDB $46F5 844 | FDB $5607 845 | FDB $56F5 846 | FDB $6607 847 | FDB $66F5 848 | FDB $7607 849 | FDB $76F5 850 | FDB $8607 851 | FDB $86F5 852 | FDB $9607 853 | FDB $96F5 854 | WVERTX EQU * 855 | HORIZ FDB $4805 856 | FDB $5505 857 | FCB $44 858 | FDB $4806 859 | FDB $5506 860 | FCB $44 861 | FDB $4807 862 | FDB $5507 863 | FCB $00 864 | FDB $4808 865 | FDB $5508 866 | FCB $33 867 | FDB $4809 868 | FDB $5509 869 | FCB $33 870 | FDB $48F3 871 | FDB $55F3 872 | FCB $33 873 | FDB $48F4 874 | FDB $55F4 875 | FCB $33 876 | FDB $48F5 877 | FDB $55F5 878 | FCB $00 879 | FDB $48F6 880 | FDB $55F6 881 | FCB $44 882 | FDB $48F7 883 | FDB $55F7 884 | FCB $44 885 | FDB $077E 886 | FDB $467E 887 | FCB $22 888 | FDB $577E 889 | FDB $967E 890 | FCB $22 891 | HORIZX EQU * 892 | VERT FDB $056F 893 | FDB $058E 894 | FCB $04 895 | FDB $066F 896 | FDB $068E 897 | FCB $30 898 | FDB $966F 899 | FDB $968E 900 | FCB $00 901 | FDB $976F 902 | FDB $978E 903 | FCB $34 904 | VERTX EQU * 905 | * RED FIELD 906 | RFIELD JSR SCRCLV ;CLEAR SCREEN 907 | LDB #$5 ;COLOR RED 908 | RFIEL LDX #$C000 909 | BSR RFIEL1 ;INDIRECT 910 | LDX #$C00C ;HIDE WATCHDOG 911 | RFIEL1 JMP OUTB0 912 | * GREEN FIELD 913 | GFIELD LDB #$28 ;COLOR GREEN 914 | BRA RFIEL ;DO IN IT THE RED ROUTINE 915 | * BLUE FIELD 916 | BFIELD LDB #$80 ;COLOR BLUE 917 | BRA RFIEL ;DO IT IN THE RED PROGRAM 918 | * COLOR BAR 919 | COLBAR LDY #CBARCL ;SET COLORS 920 | JSR SCOLOR 921 | JMP COLORB ;DRAW COLOR BARS 922 | * 923 | * SET COLOR AT LETCOL TO "B" 924 | * 925 | WHITE LDB #$A5 ;WHITE LETTERS 926 | SETCOL LDX #LETCOL ;POINT TO IT 927 | JMP OUTB0 ;MAKE IT THAT COLOR 928 | PAGE 929 | --------------------------------------------------------------------------------