]> github.com/historicalsource and other repositories - asteroids-7800.git/blob - RASTA.S
Initial import.
[asteroids-7800.git] / RASTA.S
1 *         1900    200684\r
2 *\r
3 *\r
4 ** RASTLOAD.S *\r
5 ** ASTEROIDS FOR THE ATARI 3600. **\r
6 ** THIS FILE CONTAINS THE LOADER ASSUMING 16 HIGH ZONES. *\r
7 \r
8 ** TRASHES ALL REGISTERS, TEMPI+0,+1,+2,+3,+4 **\r
9 ** USES FREE THRU FREE+11 AS POINTERS TO NEXT FREE POSITION IN HEADER. **\r
10 \r
11 LOADER    LDA     #4                     ;SET POINTER PAST FIRST HEADER FOR\r
12           LDX     #11                    ; EACH DISPLAY LIST\r
13 ZAPFREE   STA     FREE,X\r
14           DEX\r
15           BPL     ZAPFREE\r
16 \r
17           LDX     #35\r
18 LOADLOOP  LDA     STATUS,X               ;CHECK STATUS OF EACH OBJECT\r
19           BEQ     NEXTLOAD               ;CHECK IF ZERO.\r
20           CMP     #$FF                   ;FORGET IF NULL, FF.\r
21           BEQ     NEXTLOAD               ;OTHERWISE, LOAD IT\r
22 \r
23           AND     #$0F                   ;CHECK LOW NYBBLE\r
24           CMP     #6                     ;IF = 6 THEN SHOT\r
25           BNE     LOADOBJ\r
26 \r
27 LOADSHOT  LDA     YPOSH,X                ;A <- Y POSITION OF OBJECT\r
28           EOR     #$FF                   ;NEGATE POSITION\r
29           AND     #$0F                   ;MOD 16 IS LINE IN ZONE\r
30           STA     TEMPI+4\r
31           LDA     YPOSH,X                ;A <- Y POSITION OF OBJECT\r
32           LSR     A                      ;DIV 16 IS WHICH ZONE\r
33           LSR     A\r
34           LSR     A\r
35           LSR     A\r
36           TAY                            ;Y <- WHICH ZONE\r
37           LDA     FREE,Y                 ;A <- FREE POINTER FOR THAT ZONE\r
38           CLC\r
39           ADC     LOWZONE,Y\r
40           STA     TEMPI                  ;TEMPI = LO ADDR FOR FIRST FREE POS\r
41           LDA     HIGHZONE,Y\r
42           STA     TEMPI+1                ;TEMPI+1 = HI ADDRESS\r
43           LDA     FREE,Y                 ;A <- FREE POINTER FOR THAT ZONE\r
44 ;         CLC                            ;OPTIONAL\r
45           ADC     #4                     ;INCREMENT FREE POINTER\r
46           STA     FREE,Y\r
47           LDY     #0\r
48           LDA     #L(SHOT1)\r
49           STA     (TEMPI),Y              ;STORE LOW ADDRESS IN HEADER - 1ST BYTE\r
50           INY\r
51           LDA     #$7F                   ;PALETTE 4, WIDTH 1\r
52           STA     (TEMPI),Y              ;STORE IN HEADER - 2ND BYTE\r
53           INY\r
54           LDA     TEMPI+4                ;GET LINE IN ZONE\r
55           ORA     #H(GRAPHICS)           ;ADD TO START OF GRAPHICS DATA\r
56           STA     (TEMPI),Y              ;STORE HIGH ADDR IN HEADER - 3RD BYTE\r
57           INY\r
58           LDA     XPOSH,X                ;GET HORIZONTAL POSITION\r
59           STA     (TEMPI),Y              ;STORE IN HEADER - 4TH BYTE\r
60 \r
61 NEXTLOAD  DEX                            ;DECREMENT INDEX\r
62           BPL     LOADLOOP               ;CONTINUE IF NOT FINISHED\r
63           JMP     LOADSCOR               ;LOAD SCORE AT END OF DL IF DONE\r
64 \r
65 * LOAD A STANDARD OBJECT INTO TWO ZONES\r
66 LOADOBJ   LDA     YPOSH,X                ;A <- Y POSITION OF OBJECT\r
67           EOR     #$FF                   ;NEGATE POSITION\r
68           AND     #$F                    ;MOD 16 IS LINE IN ZONE\r
69           STA     TEMPI+4\r
70           LDA     YPOSH,X                ;A <- Y POSITION OF OBJECT\r
71           LSR     A                      ;DIV 16 IS WHICH ZONE\r
72           LSR     A\r
73           LSR     A\r
74           LSR     A\r
75           TAY                            ;Y <- WHICH ZONE\r
76           LDA     FREE,Y                 ;A <- FREE POINTER FOR THAT ZONE\r
77           CLC\r
78           ADC     LOWZONE,Y\r
79           STA     TEMPI                  ;TEMPI = LO ADDR FOR FIRST FREE POS\r
80           LDA     HIGHZONE,Y\r
81           STA     TEMPI+1                ;TEMPI+1 = HI ADDRESS\r
82           LDA     FREE,Y                 ;A <- FREE POINTER FOR THAT ZONE\r
83 ;         CLC                            ;OPTIONAL\r
84           ADC     #4                     ;INCREMENT FREE POINTER\r
85           STA     FREE,Y\r
86           INY                            ;ALSO LOAD INTO HIGHER ZONE\r
87           CPY     #12\r
88           BCC     YOK                    ;NEW ZONE NUMBER OK?\r
89           LDY     #0                     ;NO, RESET TO LOWEST ZONE\r
90           CLC\r
91 YOK       LDA     FREE,Y                 ;A <- FREE POINTER FOR THAT ZONE\r
92           ADC     LOWZONE,Y\r
93           STA     TEMPI+2                ;TEMPI = LO ADDR FOR FIRST FREE POS\r
94           LDA     HIGHZONE,Y\r
95           STA     TEMPI+3                ;TEMPI+1 = HI ADDRESS\r
96           LDA     FREE,Y                 ;A <- FREE POINTER FOR THAT ZONE\r
97 ;         CLC                            ;OPTIONAL\r
98           ADC     #4                     ;INCREMENT FREE POINTER\r
99           STA     FREE,Y\r
100           LDY     #0\r
101           LDA     ACYC,X\r
102           STA     (TEMPI),Y              ;STORE LO ADDR IN HEADER - 1ST BYTE\r
103           STA     (TEMPI+2),Y\r
104           INY\r
105           LDA     PALS,X\r
106           STA     (TEMPI),Y              ;STORE PALETTE + WIDTH INFO - 2ND BYTE\r
107           STA     (TEMPI+2),Y\r
108           INY\r
109           LDA     STATUS,X               ;FOR STATUS = ICON USES CHARS AS BASE\r
110           CMP     #ICON\r
111           CLC\r
112           BNE     ZHADSTMP               ;OTHERWISE USE GRAPHICS AS BASE\r
113           LDA     TEMPI+4\r
114           ADC     #H(CHARS-$0F00)\r
115           BNE     ZSTHADDR               ;BNE = JMP HERE\r
116 ZHADSTMP  LDA     TEMPI+4\r
117           ADC     #H(GRAPHICS-$0F00)\r
118 ZSTHADDR  STA     (TEMPI),Y              ;STORE HI ADDR IN HEADER - 3RD BYTE\r
119 ;         CLC                            ;OPTIONAL\r
120           ADC     #$10\r
121           STA     (TEMPI+2),Y            ;STORE HI ADDR IN HEADER - 3RD BYTE\r
122           INY\r
123           LDA     XPOSH,X\r
124           STA     (TEMPI),Y              ;STORE HOR POS IN HEADER - 4TH BYTE\r
125           STA     (TEMPI+2),Y\r
126 \r
127 * THIS CODE CHECKS FOR HORIZONTAL WRAP AROUND, AND LOADS THE OBJECT AGAIN\r
128 * IF IT NEEDS TO, IN ORDER TO WRAP SMOOTHLY\r
129           CMP     #XPOSMAX-8             ;IS IT WITHIN A MARGIN OF THE EDGE?\r
130           BCC     NEXTLOAD               ;NO.  IT'S OK, GO ON TO NEXT OBJECT.\r
131           CPX     #25                    ;UFO IS CURRENTLY THE ONLY EXCEPTION\r
132           BEQ     STEPNEXT               ; TO X-WRAPPING.\r
133           CMP     #$F0                   ;HAS IT BEEN WRAPPED ALREADY?\r
134           BCS     UNWRAP                 ;YES.  UNWRAP IT\r
135           SBC     #XPOSMAX               ;WRAP IT: SUBTRACT OFF A SCREEN OFFSET\r
136           STA     XPOSH,X                ;WANTS.  WRAP IT.\r
137           JMP     LOADOBJ                ;LOAD IT AGAIN\r
138 UNWRAP    ADC     #XPOSMAX               ;UNWRAP IT: ADD BACK THE OFFSET\r
139           STA     XPOSH,X\r
140 STEPNEXT  JMP     NEXTLOAD\r
141 \r
142 \r
143 LOADSCOR\r
144 \r
145 **        HIGH SCORE\r
146           LDY     #0\r
147           LDA     FREE+11                ;GET POINTER FOR TOP ZONE\r
148           CLC\r
149           ADC     LOWZONE+11             ;GET LOW ADDR FOR DL\r
150           STA     TEMPI\r
151           LDA     HIGHZONE+11            ;GET HIGH ADDR FOR DL\r
152           STA     TEMPI+1\r
153           LDA     #L(SCORCMHS)             ;ADD TOP SCORE\r
154           STA     (TEMPI),Y              ;LOW ADDR\r
155           INY\r
156           LDA     #$60                   ;WRITE MODE 0, INDIRECT\r
157           STA     (TEMPI),Y\r
158           INY\r
159           LDA     #H(SCORCMHS)\r
160           STA     (TEMPI),Y              ;HIGH ADDR\r
161           INY\r
162           LDA     #$78                   ;PALETTE 4, WIDTH 8\r
163           STA     (TEMPI),Y\r
164           INY\r
165           LDA     #$39\r
166           STA     (TEMPI),Y              ;HOR POSITION 39 HEX\r
167 \r
168 **        COMBINED SCORE\r
169           LDA     MODE                   ;ONLY DO FOR MODE 1\r
170           CMP     #1\r
171           BNE     LOADP1S\r
172 \r
173           INY\r
174           LDA     #L(SCORECMC)\r
175           STA     (TEMPI),Y              ;STORE LOW ADDRESS OF CHARS.\r
176           INY\r
177           LDA     #$60                   ;WRITE MODE 0, INDIRECT\r
178           STA     (TEMPI),Y\r
179           INY\r
180           LDA     #H(SCORECMC)\r
181           STA     (TEMPI),Y              ;STORE HIGH ADDRESS OF CHARS.\r
182           INY\r
183           LDA     #$90                   ;PALETTE 4, WIDTH 16\r
184           STA     (TEMPI),Y\r
185           INY\r
186           LDA     #$39                   ;HOR POS 39 HEX\r
187           STA     (TEMPI),Y\r
188 \r
189 **        PLAYER 1 SCORE\r
190 LOADP1S   LDY     #0\r
191           LDA     FREE+10                ;GET POINTER FOR NEXT ZONE\r
192           CLC\r
193           ADC     LOWZONE+10             ;GET LOW ADDR FOR DL\r
194           STA     TEMPI\r
195           LDA     HIGHZONE+10            ;GET HIGH ADDR FOR DL\r
196           STA     TEMPI+1\r
197           LDA     #L(SCORMAP1)\r
198           STA     (TEMPI),Y              ;STORE LOW ADDRESS OF CHARS.\r
199           INY\r
200           LDA     #$60                   ;WRITE MODE 0, INDIRECT\r
201           STA     (TEMPI),Y\r
202           INY\r
203           LDA     #H(SCORMAP1)\r
204           STA     (TEMPI),Y              ;STORE HIGH ADDRESS OF CHARS.\r
205           INY\r
206           LDA     #$10                   ;PALETTE 0, WIDTH 16\r
207           STA     (TEMPI),Y\r
208           INY\r
209           LDA     #$7                    ;HOR POS 7\r
210           STA     (TEMPI),Y\r
211 \r
212 **        PLAYER 2 SCORE\r
213           INY\r
214           LDA     #L(SCORMAP2)\r
215           STA     (TEMPI),Y              ;STORE LOW ADDRESS OF CHARS.\r
216           INY\r
217           LDA     #$60                   ;WRITE MODE 0, INDIRECT\r
218           STA     (TEMPI),Y\r
219           INY\r
220           LDA     #H(SCORMAP2)\r
221           STA     (TEMPI),Y              ;STORE HIGH ADDRESS OF CHARS.\r
222           INY\r
223           LDA     #$30                   ;PALETTE 1, WIDTH 16\r
224           STA     (TEMPI),Y\r
225           INY\r
226           LDA     #$65                   ;HOR POS 65 HEX\r
227           STA     (TEMPI),Y\r
228 \r
229           LDA     FREE+11                ;INCREMENT POINTERS\r
230           CLC\r
231           ADC     #5\r
232           STA     FREE+11\r
233 \r
234           LDX     MODE\r
235           CPX     #1\r
236           BNE     ZADDZ10\r
237           CLC\r
238           ADC     #5\r
239           STA     FREE+11\r
240 \r
241 ZADDZ10   LDA     FREE+10\r
242           CLC\r
243           ADC     #10\r
244           STA     FREE+10\r
245 \r
246 LOADZERO  LDX     #11                    ;LOAD ZEROS AT END OF DISPLAY LIST, DL\r
247           LDY     #1\r
248 LOADZLP   LDA     FREE,X\r
249           CLC\r
250           ADC     LOWZONE,X\r
251           STA     TEMPI\r
252           LDA     HIGHZONE,X\r
253           STA     TEMPI+1\r
254           LDA     #0\r
255           STA     (TEMPI),Y\r
256           DEX\r
257           BPL     LOADZLP\r
258           STA     LOADFLAG               ;CLEAR FLAG SINCE DONE.\r
259           RTS\r
260 \r
261 LOADSTAR  LDX     #11\r
262 STARLOOP  LDA     LOWZONE,X              ;ESTABLISH LO ADDR\r
263           STA     TEMPI\r
264           LDA     HIGHZONE,X             ;ESTABLISH HI ADDR\r
265           STA     TEMPI+1\r
266 \r
267           JSR     NEWRAND                ;PICK A RANDOM STAR (0 TO 3)\r
268           AND     #$03\r
269           CLC\r
270           ADC     #L(STARS)              ;ADD IN BASE OF STARS\r
271 \r
272           LDY     #0\r
273           STA     (TEMPI),Y              ;STORE LO ADDR\r
274 \r
275           INY\r
276           LDA     STARPW,X\r
277           STA     (TEMPI),Y              ;STORE PALETTE & WIDTH INFO\r
278 \r
279           INY\r
280           LDA     #H(CHARS)\r
281           STA     (TEMPI),Y              ;STORE HI ADDR\r
282 \r
283           JSR     NEWRAND                ;GET A RANDOM HORIZONTAL POSITION\r
284 \r
285           LSR     A                      ;BANG INTO RANGE\r
286           ADC     #$10\r
287 \r
288           LDY     #3\r
289           STA     (TEMPI),Y              ;STORE HOR POS\r
290 \r
291           DEX\r
292           BPL     STARLOOP\r
293           RTS\r
294 \r
295 STARPW    DB      $7F,$9F,$7F,$7F,$BF,$7F,$DF,$7F,$7F,$FF,$9F,$DF\r
296           EJE\r