├── 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 |
--------------------------------------------------------------------------------