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