First commit
[asteroids.git] / A35131.1C
1         .SBTTL VECUT-VECTOR GENERATION UTILITY \r
2         .RADIX 16\r
3 \r
4 ;ZERO PAGE GLOBALS\r
5 \r
6         .GLOBL VGSIZE,XCOMP,TEMP1,VGLIST,VGBRIT\r
7 \r
8 ;EXTERNAL ENTRY POINTS\r
9 \r
10         .GLOBL  VGMSGA\r
11 \r
12 ;ENTRY POINTS\r
13 \r
14         .GLOBL VGADD,VGHALT,VGHEX,VGHEXZ,VGSABS,VGDOT\r
15         .GLOBL VGJMPL,VGJSRL,VGLABS\r
16         .GLOBL VGRTSL,VGVCTR,VGWAIT\r
17 \r
18 \r
19         .SBTTL*********************************************\r
20         .SBTTL*\r
21         .SBTTL*PROGRAMMER:  LOGG\r
22         .SBTTL*\r
23         .SBTTL*CHECKER:\r
24         .SBTTL*\r
25         .SBTTL*********************************************\r
26         .SBTTL VECUT - VECTOR GENERATOR UTILITY SUBROUTINES\r
27 ;\r
28 ;DATE INITIATED: 6-MARCH-78\r
29 ;\r
30 ;PROJECT CHARGE #: 6W000\r
31 ;\r
32 ;DISK #:         96\r
33 ;\r
34 ;HARWARE REQUIREMENTS:  LYLE RAIN'S VECTOR GENERATOR\r
35 ;\r
36 ;MEMORY REQUIREMENTS:   \r
37 ;       NOT APPLICABLE - SUBROUTINE\r
38 ;\r
39 ;INTERRUPT REQUIREMENTS:\r
40 ;       NOT APPLICABLE - SUBROUTINE\r
41 ;\r
42 ;ASSEMBLY COMMAND STRING:\r
43 ;       R MAC65\r
44 ;       DX1:VECUT,DK1:VECUT=DX1:VECUT/C\r
45 ;\r
46 ;LINK COMMAND STRING:\r
47 ;       NOT APPLICABLE - SUBROUTINE\r
48 ;\r
49 ;PROGRAM DESCRIPTION:\r
50 ;       A SET OF UTILITY ROUTINES FOR GENERATING\r
51 ;       VECTORS USING LYLE'S VECTOR GENERATOR\r
52 \f;ZERO PAGE GLOBALS REQUIRED:\r
53 ;\r
54 ;       VGSIZE: THIS VARIABLE IS USED BY VGSABS AND VGLABS \r
55 ;               TO CONTROL THE SCALING SIZE OF VECTORS DRAW\r
56 ;               FOLLOWING THIS VECTOR INSTRUCTION. ITS VALUES RANGE\r
57 ;               FROM 0 TO F0 IN INCRMENTS OF 10. THIS\r
58 ;               VALUE WILL BE ADDED TO THE TIMER VALUE\r
59 ;               OF ALL FOLLOWING VECTORS.\r
60 ;\r
61 ;       VGLIST: THIS 2 BYTE VARIABLE CONTAINS THE CURRENT VECTOR GENERATOR RAM\r
62 ;               ADDRESS USED TO BUILD INSTRUCTIONS FOR THE VECTOR GENERATOR.\r
63 ;               IT SHOULD BE INITIALIZED BEFORE CALLING ANY OF THESE ROUTINES.\r
64 ;\r
65 ;       XCOMP:  THIS 4 BYTE VARIABLE IS USED TO CONTAIN THE X (LSB,MSB) COMPONENT\r
66 ;               AND Y (LSB,MSB) COMPONENT USED IN SEVERAL OF THE VECTOR INSTRUC-\r
67 ;               TIONS.  FOR THE VGVCTR ROUTINE THESE FIELDS ARE SIGNED 2'S\r
68 ;               COMPLEMENT NUMBERS.  SOME ROUTINES USE THIS AREA AS SCRATCH\r
69 ;               SPACE TO GENERATE X AND Y COMPONENTS (SEE VGSABS).\r
70 ;\r
71 ;       TEMP1:  THIS 2 BYTE VARIABLE IS USED AS SCRATCH SPACE.\r
72 ;\r
73 ;       VGBRIT: THIS VARIABLE IS USED BY VGVCTR TO GENERATE VECTORS\r
74 ;               WITH THE GIVEN BRIGHTNESS. IT'S VALUES ARE 0,10,\r
75 ;               20,...F0 WHERE 0 IS OFF AND F0 IS MAX BRIGHTNESS.\r
76 ;               A VALUE OF 70 IS USED FOR THE ALPHANUMERIC CHARACTERS.\r
77 ;\r
78 ;\r
79 ;EXTERNAL ENTRY POINTS REQUIRED:\r
80 ;\r
81 ;       VGMSGA: THIS ENTRY POINT PROVIDES JSRL INSTRUCTIONS TO THE CHAR.X\r
82 ;               ROUTINES.  THIS ENTRY POINT IS PROVIDED BY VECAN.MAC.\r
83 ;\r
84 ;THESE ROUTINES WERE WRITTEN TO PROVIDE PROGRAMMERS USING LYLE RAIN'S VECTOR\r
85 ;GENERATOR A MEANS OF:\r
86 ;       1)      DYNAMICALLY GENERATING VECTORS JUST AS VECMAC ALLOWS STATIC\r
87 ;               GENERATION OF VECTORS.\r
88 ;       2)      DISPLAY NUMBERS WITH OR WITHOUT ZERO SUPPRESSION.\r
89 ;\r
90 ;EXAMPLE 1:\r
91 ;\r
92 ;       LDA I,VECRAM&0FF                ;INITIALIZE VECTOR RAM POINTER\r
93 ;       STA VGLIST\r
94 ;       LDA I,VECRAM/100\r
95 ;       STA VGLIST+1\r
96 ;       LDA I,256./4            ;POSITION BEAM AT (256,256)\r
97 ;       LDX I,256./4            ;AND SET SCALE SIZE FOR NEXT VECTORS\r
98 ;       JSR VGSABS\r
99 ;       LDA I,40                ;WAIT FOR BEAM TO SETTLE\r
100 ;       JSR VGWAIT\r
101 ;       ETC....\r
102 ;\r
103 ;\r
104 ;NOTE:  If VGVCTR is not needed, it can be eliminated by defining the\r
105 ;       symbol VGVCTR before .INCLUDE VECUT.  The same can be done for\r
106 ;       the routine VGHEX(VGHEXZ).  The zero page locations TEMP1 and\r
107 ;       VGBRIT are not needed if VGVCTR is not part of VECUT.\r
108 ;\r
109 ;\r
110 ;EXAMPLE 3:\r
111 ;\r
112 ;       LDA PLAYER              ;DISPLAY PLAYER NUMBER\r
113 ;       JSR VGHEX\r
114 ;       LDA SCORE1              ;MSB OF SCORE\r
115 ;       LSR\r
116 ;       LSR\r
117 ;       LSR\r
118 ;       LSR\r
119 ;       SEC\r
120 ;       JSR VGHEXZ              ;DISPLAY UPPER DIGIT WITH ZERO SUPPRESSION\r
121 ;       LDA SCORE1\r
122 ;       JSR VGHEXZ              ;DISPLAY SECOND DIGIT WITH ZERO SUPPRESSION\r
123 ;       LDA SCORE0              ;LSB OF SCORE\r
124 ;       PHP\r
125 ;       LSR\r
126 ;       LSR\r
127 ;       LSR\r
128 ;       LSR\r
129 ;       PLP\r
130 ;       JSR VGHEXZ              ;DISPLAY THIRD DIGIT WITH ZERO SUPPRESSION\r
131 ;       LDA SCORE0\r
132 ;       JSR VGHEX               ;DISPLAY LAST DIGIT\r
133 ;       ETC....\r
134 \f       .SBTTL VGHALT - ADD HALT TO VECTOR LIST\r
135 ;VGHALT - ADD HALT TO VECTOR LIST\r
136 ;\r
137 ;ENTRY  (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
138 ;EXIT   (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
139 ;USES   A,X,Y(VGLIST,VGLIST+1)\r
140 \r
141 VGHALT: LDA I,0B0               ;BXXX IS HALT\r
142 VGHAL1: LDY I,0\r
143         STA NY,VGLIST\r
144         INY\r
145         STA NY,VGLIST\r
146         BNE VGADD               ;UPDATE VECTOR LIST\r
147 \r
148 \r
149         .IIF NDF,VGHEXZ,VGHEXZ=.\r
150         .IF EQ,VGHEXZ-.\r
151         .SBTTL VGHEXZ - DISPLAY DIGIT WITH ZERO SUPPRESSION\r
152 ;VGHEXZ - DISPLAY DIGIT WITH ZERO SUPPRESSION\r
153 ;\r
154 ;THIS ROUTINE WILL DISPLAY A DIGIT USING THE DEFAULT CHARACTER SIZE.\r
155 ;NO ATTEMPT IS MADE TO USE THE VARIABLE VGSIZE.\r
156 ;\r
157 ;ENTRY  (A) = LOWER 4 BITS TO BE DISPLAYED\r
158 ;       (C) = CLEAR IF NO ZERO SUPPRESSION\r
159 ;EXIT   (C) = CLEARED IF NON-ZERO DIGIT DISPLAYED\r
160 ;USES   A,X,Y,(VGLIST,VGLIST+1)\r
161 \r
162         BCC VGHEX               ;IF NO ZERO SUPPRESSION\r
163         AND I,0F\r
164         BEQ VGHEX1              ;LEAVE C SET\r
165 \r
166 \r
167         .SBTTL VGHEX - DISPLAY DIGIT\r
168 ;VGHEX - DISPLAY DIGIT\r
169 ;\r
170 ;THIS ROUTINE WILL DISPLAY A DIGIT USING THE DEFAULT CHARACTER SIZE.\r
171 ;NO ATTEMPT IS MADE TO USE THE VARIABLE VGSIZE.\r
172 ;\r
173 ;ENTRY  (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
174 ;       (A) = LOWER 4 BITS TO BE DISPLAYED\r
175 ;EXIT   (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
176 ;       (C) = 0\r
177 ;USES   A,X,Y,(VGLIST,VGLIST+1)\r
178 \r
179 VGHEX:  AND I,0F\r
180         CLC\r
181         ADC I,01                ;CLEARS C BIT\r
182 VGHEX1: PHP                     ;SAVE C FLAG\r
183         ASL\r
184         LDY I,0\r
185         TAX\r
186         LDA AX,VGMSGA\r
187         STA NY,VGLIST\r
188         LDA AX,VGMSGA+1         ;COPY JSRL TO CHARACTER ROUTINE\r
189         INY\r
190         STA NY,VGLIST\r
191         JSR VGADD               ;UPDATE VECTOR LIST POINTER\r
192         PLP                     ;RESTORE C FLAG\r
193         RTS\r
194         .ENDC\r
195 \r
196 \r
197         .SBTTL VGJMPL - ADD JMPL TO VECTOR LIST\r
198 ;VGJMPL - ADD JMPL TO VECTOR LIST\r
199 ;\r
200 ;ENTRY  (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
201 ;       (A) = MSB OF ADDRESS\r
202 ;       (X) = LSB OF ADDRESS\r
203 ;EXIT   (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
204 ;USES   A,Y,(VGLIST,VGLIST+1)\r
205 \r
206 VGJMPL: LSR\r
207         AND I,0F                ;BASE ADDRESS IS RELATIVE TO ZERO\r
208         ORA I,0E0\r
209 VGJMP1: LDY I,01\r
210         STA NY,VGLIST\r
211         DEY\r
212         TXA\r
213         ROR\r
214         STA NY,VGLIST           ;SAVE MSB + OPCODE\r
215         INY\r
216         BNE VGADD               ;UPDATE VECTOR POINTER\r
217 \r
218 \r
219         .SBTTL VGJSRL - ADD JSRL TO VECTOR LIST\r
220 ;VGJSRL - ADD JSRL TO VECTOR LIST\r
221 ;\r
222 ;ENTRY  (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
223 ;       (A) = MSB OF ADDRESS\r
224 ;       (X) = LSB OF ADDRESS\r
225 ;EXIT   (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
226 ;USES   A,Y,(VGLIST,VGLIST+1)\r
227 \r
228 VGJSRL: LSR\r
229         AND I,0F                ;BASE ADDRESS IS RELATIVE\r
230         ORA I,0C0\r
231         BNE VGJMP1              ;MOVE INTO VECTOR LIST\r
232 \r
233 \r
234         .SBTTL VGSABS - SHORT FORM VGLABS CALL\r
235 ;VGSABS - SHORT FORM VGLABS CALL\r
236 ;\r
237 ;ENTRY  (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
238 ;       (A) = X POSITION/4\r
239 ;       (X) = Y POSITION/4\r
240 ;       (VGSIZE)=SCALE FACTOR (0,10,20,...F0)\r
241 ;EXIT   (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
242 ;USES   A,X,Y,(VGLIST,VGLIST+1),(XCOMP,XCOMP+3)\r
243 \r
244 VGSABS: LDY I,0\r
245         STY XCOMP+1\r
246         STY XCOMP+3\r
247         ASL\r
248         ROL XCOMP+1\r
249         ASL\r
250         ROL XCOMP+1\r
251         STA XCOMP\r
252         TXA                     ;Y COMPONENT/4\r
253         ASL\r
254         ROL XCOMP+3\r
255         ASL\r
256         ROL XCOMP+3\r
257         STA XCOMP+2\r
258         LDX I,XCOMP\r
259 ;       JMP VGLABS              ;LABS OF STARTING POSITION\r
260 \r
261 \r
262         .SBTTL VGLABS - ADD LABS INTO VECTOR LIST\r
263 ;VGLABS - ADD LABS INTO VECTOR LIST\r
264 ;\r
265 ;ENTRY  (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
266 ;       (X) = ZERO PAGE ADDRESS OF (X LSB, X MSB, Y LSB, Y MSB)\r
267 ;       (VGSIZE)=SCALE FACTOR (0,10,20,...F0)\r
268 ;EXIT   (VGLIST,VGLIST+1) = NEW VECTOR ADDRESS LIST\r
269 ;USES   A,Y,(VGLIST,VGLIST+1)\r
270 \r
271 VGLABS: LDA ZX,2\r
272         LDY I,0\r
273         STA NY,VGLIST           ;Y LSB\r
274         LDA ZX,3\r
275         AND I,0F\r
276         ORA I,0A0\r
277         INY\r
278         STA NY,VGLIST           ;Y MSB+OPCODE\r
279         LDA ZX,0\r
280         INY\r
281         STA NY,VGLIST           ;X LSB\r
282         LDA ZX,1\r
283         AND I,0F\r
284         ORA VGSIZE              ;ADD SCALE TO DETERMIN SIZE\r
285         INY\r
286         STA NY,VGLIST           ;X MSB\r
287 ;       JMP VGADD\r
288 \r
289 \r
290         .SBTTL VGADD - ADD Y+1 TO VECTOR ADDRESS\r
291 ;VGADD - ADD Y+1 TO VECTOR LIST ADDRESS\r
292 ;\r
293 ;ENTRY  (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
294 ;       (Y) = VALUE+1 TO BE ADDED TO VECTOR LIST\r
295 ;EXIT   (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
296 ;USES   A,(VGLIST,VGLIST+1)\r
297 \r
298 VGADD:  TYA                     ;ADD 1+(Y) TO VGLIST\r
299         SEC\r
300         ADC VGLIST\r
301         STA VGLIST\r
302         BCC 10$\r
303         INC VGLIST+1\r
304 10$:    RTS\r
305         \r
306 \r
307         .SBTTL VGRTSL - ADD RTSL TO VECTOR LIST\r
308 ;VGRTSL - ADD RTSL TO VECTOR LIST\r
309 ;\r
310 ;ENTRY  (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
311 ;EXIT   (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
312 ;USES   A,Y,(VGLIST,VGLIST+1)\r
313 \r
314 VGRTSL: LDA I,0D0               ;DXXX IS RTSL\r
315         JMP VGHAL1\r
316 \r
317 \r
318         .IIF NDF,VGVCTR,VGVCTR=.\r
319         .IF EQ,VGVCTR-.\r
320         .SBTTL VGVCTR - ADD VCTR TO VECTOR LIST\r
321 ;VGVCTR - CONVERT TO SIGN MAGNITUDE\r
322 ;\r
323 ;DESCRIPTION:\r
324 ;       1) CONVERT 16 BIT 2'S COMPLEMENT #'S\r
325 ;          TO 11 BIT SIGN-MAGNITUDE\r
326 ;       2) NORMALIZE LARGER #\r
327 ;       3) ALIGN SMALLER # WITH LARGER\r
328 ;       4) PACK WITH EXPONENT (OP-CODE) AND BRIGHTNESS\r
329 ;       5) WRITE THIS TO VECTOR LIST\r
330 ;\r
331 ;NOTE:  IF THE NUMBERS GIVEN ARE MORE THAN\r
332 ;       10 BITS IN SIGNIFICANE THEN AN\r
333 ;       INCORRECT VECTOR WILL BE GENERATED.\r
334 ;\r
335 ;ENTRY  (XCOMP-XCOMP+3) = ZERO PAGE LOCN.  CONTAINING (X LSB,X MSB,Y MSB,Y LSB)\r
336 ;       (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
337 ;EXIT   (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
338 ;USES   A,X,Y,(XCOMP-XCOMP+3),TEMP1\r
339 \r
340         LDA XCOMP+1             ;GET HIGH BYTE OF X\r
341         CMP I,80                ;SET CARRY PER SIGN\r
342         BCC 2$                  ;BPL\r
343         EOR I,0FF\r
344         STA XCOMP+1\r
345         LDA XCOMP\r
346         EOR I,0FF\r
347         ADC I,0                 ;ADDS ONE (CARRY SET)\r
348         STA XCOMP\r
349         BCC 1$\r
350         INC XCOMP+1\r
351 1$:     SEC\r
352 2$:     ROL TEMP1               ;SAVE SIGN OF X\r
353         LDA XCOMP+3             ;REPEAT ABOVE FOR Y\r
354         CMP I,80\r
355         BCC 4$\r
356         EOR I,0FF\r
357         STA XCOMP+3\r
358         LDA XCOMP+2\r
359         EOR I,0FF\r
360         ADC I,0\r
361         STA XCOMP+2\r
362         BCC 3$\r
363         INC XCOMP+3\r
364 3$:     SEC\r
365 4$:     ROL TEMP1               ;SAVE SIGN OF Y\r
366         LDA XCOMP+1\r
367         ORA XCOMP+3\r
368         BEQ 5$                  ;IF LESS THAN 256 IN LENGTH\r
369         LDX I,0\r
370         CMP I,02\r
371         BCS 20$                 ;NO NORMALIZE NEEDED\r
372         LDY I,01                ;ONE SHIFT NEEDED\r
373         BNE 8$                  ;ALWAYS\r
374         \r
375 5$:     LDY I,02\r
376         LDX I,9.\r
377         LDA XCOMP\r
378         ORA XCOMP+2\r
379         BEQ 20$                 ;ZERO LENGTH VECTOR\r
380 6$:     BMI 8$                  ;COUNT IS RIGHT\r
381 7$:     INY                     ;GET NORMALIZE COUNT\r
382         ASL\r
383         BPL 7$\r
384 8$:     TYA\r
385         TAX                     ;SAVE SHIFT COUNT FOR TIMER\r
386         LDA XCOMP+1\r
387 10$:    ASL XCOMP\r
388         ROL\r
389         ASL XCOMP+2\r
390         ROL XCOMP+3\r
391         DEY\r
392         BNE 10$                 ;NORMALIZE NUMBERS\r
393         STA XCOMP+1\r
394 20$:    TXA\r
395         SEC\r
396         SBC I,10.\r
397         EOR I,0FF               ;9-COUNT=TIMER (TTTT)\r
398         ASL\r
399         ROR TEMP1               ;SIGN OF Y (S)\r
400         ROL\r
401         ROR TEMP1               ;SIGN OF X (S)\r
402         ROL\r
403         ASL\r
404         STA TEMP1               ;TTTTXSSX\r
405         LDY I,0\r
406         LDA XCOMP+2\r
407         STA NY,VGLIST\r
408         LDA TEMP1\r
409         AND I,0F4               ;SIGN+EXPONENT\r
410         ORA XCOMP+3\r
411         INY\r
412         STA NY,VGLIST\r
413         LDA XCOMP\r
414         INY\r
415         STA NY,VGLIST\r
416         LDA TEMP1\r
417         AND I,02\r
418         ASL                     ;SIGN\r
419         ORA VGBRIT              ;BRIGHTNESS\r
420         ORA XCOMP+1\r
421         INY\r
422         STA NY,VGLIST           ;STORE LAST BYTE OF VCTR\r
423         JMP VGADD               ;UPDATE VECTOR ADDRESS POINTER\r
424         .ENDC\r
425 \r
426 \r
427         .SBTTL VGWAIT - ADD WAIT TO VECTOR LIST\r
428 ;VGWAIT - ADD WAIT TO VECTOR LIST\r
429 ;\r
430 ;ENTRY  (VGLIST,VGLIST+1) = VECTOR ADDRESS LIST\r
431 ;       (A) = TIMER (0=NO DELAY, 90=MAX DELAY, INCREMENTS OF 10)\r
432 ;EXIT   (VGLIST,VGLIST+1) = NEW VECTOR ADDRESS LIST\r
433 ;USES   A,X,Y,(VGLIST,VGLIST+1)\r
434 \r
435 VGWAIT: LDX I,0                 ;NO INTENSITY\r
436 ;       JMP VGDOT\r
437 \r
438 \r
439 \r
440         .SBTTL VGDOT - DRAW A DOT AT THE CURRENT POSITION\r
441 ;VGDOT - DRAW A DOT AT CURRENT POSITION\r
442 ;\r
443 ;ENTRY  (VGLIST,VGLIST+1) = VECTOR LIST ADDRESS\r
444 ;       (A) = TIMER (0 = NO DELYA, 90 = MAX DELAY, 10 = INCREMENT)\r
445 ;       (X) = INTENSITY (0 = OFF, F0 = MAX, 10 = INCREMENT)\r
446 ;EXIT   (VGLIST,VGLIST+1) = NEW VECTOR LIST ADDRESS\r
447 ;USES   A,Y, (VGLIST,VGLIST+1)\r
448 \r
449 VGDOT:  LDY I,1\r
450         STA NY,VGLIST           ;SAVE TIMER VALUE\r
451         DEY\r
452         TYA                     ;(A):=(Y):=0\r
453         STA NY,VGLIST           ;0, TIMER, 0, 0=WAIT\r
454         INY\r
455         INY\r
456         STA NY,VGLIST\r
457         INY\r
458         TXA                     ;INSERT INTENSITY\r
459         STA NY,VGLIST\r
460         JMP VGADD\r
461 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0