-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBopotron.asm
552 lines (552 loc) · 16.7 KB
/
Bopotron.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
0100 ;
0110 ; **************************
0120 ; * BOPOTRON *
0130 ; * by Kyle S. Peacock *
0140 ; * ANALOG COMPUTING *
0150 ; **************************
0160 ;
0170 ; *******************
0180 ; * ZERO PAGE USAGE *
0190 ; *******************
0200 ;
0210 PLADR = $CB ;ADDR PLR AREA
0220 PMSTR = $CD ;ADDR PLR DATA
0230 SCREEN = $CF ;ADDR OF SCREEN
0240 ;
0250 ; ***************************
0260 ; * HARD/SOFTWARE REGISTERS *
0270 ; ***************************
0280 ;
0290 POKMSK = $10 ;BREAK DISABLE
0300 SAVMSC = $58 ;SCREEN ADDR.
0310 STICK = $0278 ;JOYSTICK PORT
0320 COLOR3 = $02C7 ;COLOR REG. #3
0330 HPOSP0 = $D000 ;HOR. POS. PLRs
0340 TRIG0 = $D010 ;JOYSTICK BUTTON
0350 RANDOM = $D20A ;RANDOM NO.
0360 IRQEN = $D20E ;BREAK DISABLE
0370 CHBASE = $D409 ;CHAR SET ADDR
0380 WSYNC = $D40A ;WAIT FOR SYNC.
0390 SETVBV = $E45C ;SET VBLANK
0400 XITVBV = $E462 ;END OF VBLANK
0410 ;
0420 ; ****************
0430 ; * MEMORY USAGE *
0440 ; ****************
0450 ;
0460 *= $0601
0470 ACTIVATE *= *+1 ;VBLANK ACTIVE
0480 STARTPT *= *+1 ;PLR Y START
0490 ENDPT *= *+1 ;PLR Y END
0500 DATAPT *= *+1 ;DATA POINTER
0510 XPOS *= *+4 ;PLRs X-COORDS.
0520 YPOS *= *+4 ;PLRs Y-COORDS.
0530 STATUS *= *+4 ;PLRs DEATH FLAG
0540 PNTR *= *+2 ;DATA POINTERS.
0550 XSPEED *= *+2 ;PLATFORM SPEED
0560 DELTAX *= *+2 ;PLAT. X-DELTA
0570 DELTAY *= *+2 ;PLAT. Y-DELTA
0580 SPEEDS *= *+10 ;PLAT. SPEED
0590 XSTART *= *+10 ;PLAT. X-START
0600 YSTART *= *+10 ;PLAT. Y-START
0610 XEND *= *+10 ;PLAT. X-END
0620 YEND *= *+10 ;PLAT. Y-END
0630 CHAR *= *+2 ;STANDING ON #.
0640 MOVETIME *= *+1 ;MOVEMENT TIMER
0650 TASKERS *= *+1 ;# OF PLATFORMS
0660 XHOLD *= *+1 ;X-REG. HOLD
0670 YHOLD *= *+1 ;Y-REG. HOLD
0680 SLIP *= *+1 ;ON PLAT. FLAG
0690 FALLCOUNT *= *+2 ;HOW FAR TO FALL...
0700 ;
0710 ; ******************************
0720 ; * VERTICAL BLANK INITIALIZER *
0730 ; ******************************
0740 ;
0750 CLD ;CHILL DECIMAL.
0760 LDA POKMSK ;DISABLE BREAK
0770 AND #$7F ;KEY. THE BREAK
0780 STA POKMSK ;KEY NO LONGER
0790 STA IRQEN ;WORKS. (SO?!?)
0800 PLA ;# OF VARIABLES
0810 PLA ;VBLANK HI/BYTE
0820 STA XHOLD ;HOLD ON TO IT.
0830 PLA ;VBLANK LO/BYTE
0840 STA YHOLD ;HOLD ON TO IT.
0850 PLA ;PLAYERS HI/BYTE
0860 STA PLADR+1 ;STORE IT.
0870 PLA ;PLAYERS LO/BYTE
0880 STA PLADR ;STORE IT.
0890 PLA ;PLAYER STRING
0900 STA PMSTR+1 ;HI/BYTE.
0910 PLA ;PLAYER STRING
0920 STA PMSTR ;LO/BYTE.
0930 LDA #$01 ;STOP OLD VBLANK
0940 STA ACTIVATE
0950 LDA PLADR+1 ;HOLD ON TO ADDR
0960 PHA ;OF PM AREA.
0970 LDX #$03 ;LOAD X-REG.
0980 LDY #$00 ;LOAD Y-REG.
0990 TYA ;LOAD A-REG.
1000 CLEAR
1010 STA (PLADR),Y ;CLEAR PMs
1020 INY ;MOVE TO NEXT.
1030 BNE CLEAR ;ALL DONE?
1040 INC PLADR+1 ;MOVE TO NEXT.
1050 DEX ;ALL DONE?
1060 BPL CLEAR ;NO. GO BACK!
1070 LDX #$09 ;SET X FOR CLEAR
1080 CLEAR2
1090 STA SPEEDS,X ;CLEAR OLD
1100 CPX #$04 ;MOTION TIMERS
1110 BCS CLEAR3 ;& STATUS. PRE-
1120 STA STATUS,X ;PARE FOR NEW
1130 CLEAR3
1140 DEX ;DATA CONTROL
1150 BPL CLEAR2 ;INFORMATION.
1160 STA FALLCOUNT
1170 STA PNTR
1180 STA XSPEED+0 ;STOP PREVIOUS
1190 STA XSPEED+1 ;PLATFORMS.
1200 STX TASKERS ;SOUND OFFICIAL?
1210 LDA #$05 ;I DIDN'T THINK
1220 STA PNTR+1 ;SO!!!!!!!!
1230 PLA ;YES. RESTORE
1240 STA PLADR+1 ;PM AREA.
1250 LDX XHOLD ;VBLANK HI/BYTE
1260 LDY YHOLD ;VBLANK LO/BYTE
1270 LDA #$07 ;DEF. VBLANK.
1280 JMP SETVBV ;SET IT UP/BOOGIE...
1290 ;
1300 ; **************************
1310 ; * DISPLAY LIST INTERRUPT *
1320 ; **************************
1330 ;
1340 *= $2000
1350 PHA ;SAVE ACC.
1360 LDA $0600 ;CHR. HI/BYTE.
1370 STA WSYNC ;WAIT A WHILE.
1380 STA CHBASE ;SAVE CHR. SET.
1390 PLA ;RESTORE ACC.
1400 RTI ;BOOGIE...
1410 ;
1420 ; ***********************
1430 ; * PLAYER DRAW ROUTINE *
1440 ; ***********************
1450 ;
1460 CLD ;CHILL DECIMAL.
1470 INC COLOR3 ;CHANGE COLOR.
1480 LDA ACTIVATE ;VBLANK ACTIVE?
1490 BEQ FUNCTION ;YES! BRANCH!
1500 JMP XITVBV ;NO. LATER.
1510 FUNCTION
1520 LDA PLADR ;PLR ADDR. LO.
1530 PHA ;SAVE IT.
1540 LDA PLADR+1 ;PLR ADDR. HI.
1550 PHA ;SAVE IT.
1560 LDY #$00 ;BLANK Y REG.
1570 LDX #$00 ;BLANK X REG.
1580 DRAW5
1590 LDA XPOS,X ;PLR X-POS.
1600 STA HPOSP0,X ;STORE IT.
1610 LDA YPOS,X ;PLR Y-POS.
1620 STA STARTPT ;SAVE IT.
1630 CLC ;GET PLAYER
1640 ADC (PMSTR),Y ;LENGTH. ADD
1650 STA ENDPT ;AND STORE IT.
1660 INY ;MOVE TO 1st
1670 STY DATAPT ;DATA BYTE.
1680 CPX #$00 ;PLAYER #0?
1690 BEQ PASS0 ;YES. BRANCH.
1700 LDA PLADR ;INCREMENT
1710 CLC ;PLAYER ADDR.
1720 ADC #128 ;FOR DRAWING
1730 STA PLADR ;NEXT PLAYER.
1740 LDA PLADR+1 ;ADJUST FOR
1750 ADC #$00 ;256 BYTE PAGE
1760 STA PLADR+1 ;WRAP-AROUND.
1770 PASS0
1780 LDA STARTPT ;STARTING PT.
1790 SEC ;SUBTRACT 10
1800 SBC #10 ;BYTES.
1810 TAY ;MOVE TO Y-REG.
1820 LDA #$00 ;CLEAR ACC.
1830 INSERT1
1840 STA (PLADR),Y
1850 INY ;CLEAR OUT
1860 CPY STARTPT ;TOP & BOTTOM
1870 BCC INSERT1 ;OF PLATFORM
1880 LDA ENDPT ;GET ENDPOINT
1890 CLC ;AND ADD 10
1900 ADC #10 ;DECIMAL.
1910 TAY ;MOVE TO Y-REG.
1920 LDA #$00 ;CLEAR ACC.
1930 INSERT2
1940 STA (PLADR),Y ;STORE BLANK
1950 DEY ;MOVE TO NEXT.
1960 CPY ENDPT ;AT END?
1970 BCS INSERT2 ;NO. BLANK MORE.
1980 PASS1
1990 LDY STATUS,X ;GET STATUS.
2000 BPL PASS2 ;IF >=0, BRANCH.
2010 LDY PNTR-2,X ;GET POINTER.
2020 LDA YPOS,X ;GET Y-COORD.
2030 SEC ;SUBTRACT START-
2040 SBC YSTART,Y ;ING POINT.
2050 CMP #$0B ;IS IT < 12?
2060 BCC PASS2 ;YES. BRANCH.
2070 CMP #245 ;IS IT >= 245?
2080 BCS PASS2 ;YES. BRANCH.
2090 LDA #$00 ;NO. CLEAR ACC.
2100 BEQ PASSX ;BRANCH.
2110 BACKUP
2120 BCC DRAW5 ;BRANCH POINT.
2130 PASS2
2140 LDY DATAPT ;GET POINTER.
2150 LDA (PMSTR),Y ;GET PLR DATA.
2160 PASSX
2170 LDY STARTPT ;GET START PT.
2180 STA (PLADR),Y ;PUT IT PLR AREA
2190 INC STARTPT ;INC. AREA PTR.
2200 INC DATAPT ;INC. DATA PTR.
2210 LDA STARTPT ;GET AREA PTR.
2220 CMP ENDPT ;AT END?
2230 BNE PASS1 ;NO. BRANCH.
2240 LDA STATUS,X ;GET STATUS.
2250 BPL OUT ;IF >=0 BRANCH.
2260 LDA #$00 ;CLEAR ACC.
2270 STA STATUS,X ;SAVE STATUS.
2280 CPX #$02 ;DRAWING BOPOTRON?
2290 BCC OUT ;YES. BRACH.
2300 LDY PNTR-2,X ;GET PNTR.
2310 LDA XSTART,Y ;GET X-START
2320 STA XPOS,X ;SAVE AS X-COORD
2330 LDA YSTART,Y ;GET YSTART
2340 STA YPOS,X ;SAVE AS Y-COORD
2350 LDA #15 ;PAUSE FOR A
2360 STA XSPEED-2,X ;WHILE.
2370 OUT
2380 LDY DATAPT ;RESTORE Y-REG.
2390 INX ;MOVE TO NEXT.
2400 CPX #$04 ;AT END?
2410 BCC BACKUP ;NO. BRANCH.
2420 PLA ;RESTORE OLD
2430 STA PLADR+1 ;PLAYER ADDR.
2440 PLA ;POINTERS.
2450 STA PLADR ;
2460 ;
2470 ; *************************
2480 ; * GIRDER TASKED PLAYERS *
2490 ; *************************
2500 ;
2510 LDX TASKERS ;# OF PLATFORMS.
2520 BMI FORWARD ;NONE. BRANCH.
2530 START
2540 DEC XSPEED,X ;TIME TO MOVE?
2550 BNE FORWARD ;NO BRANCH.
2560 LDA STATUS+2,X ;PLAT ALIVE?
2570 BEQ SELECT ;YES. BRANCH.
2580 LDA #$FF ;SET UP FOR NEW
2590 STA STATUS+2,X ;VECTOR.
2600 BMI FORWARD ;BRANCH.
2610 SELECT
2620 LDY PNTR,X ;GET PNTR.
2630 LDA SPEEDS,Y ;GET PLAT SPEED
2640 STA XSPEED,X ;SAVE IT.
2650 LDA XPOS+2,X ;IS PLATFORM AT
2660 CMP XEND,Y ;DESTINATION?
2670 BNE ADDUP ;NO. BRANCH.
2680 LDA YPOS+2,X ;NOW CHECK
2690 CMP YEND,Y ;Y-COORDS.
2700 BNE ADDUP ;NOT THERE. BRANCH.
2710 LDA #$01 ;CHANGE STATUS
2720 STA STATUS+2,X ;TO ONE.
2730 LDA #15 ;PAUSE FOR A
2740 STA XSPEED,X ;WHILE.
2750 BPL LOAD0 ;BRANCH.
2760 BMI LOAD0 ;BRANCH.
2770 BACKTRACK
2780 BPL START ;BRANCH POINT.
2790 FORWARD
2800 BEQ NEXT ;BRANCH POINT.
2810 BNE NEXT ;BRANCH POINT.
2820 LOAD0
2830 INC PNTR,X ;AT DESTINATION.
2840 LDA PNTR,X ;TIME TO GET
2850 CMP #$05 ;NEXT PREPROG-
2860 BNE LOAD1 ;RAMMED VECTOR.
2870 LDA #$00 ;BUT DON'T GET
2880 BEQ LOAD2 ;VECTOR IF IT
2890 LOAD1
2900 CMP #10 ;IS NOT VALID.
2910 BNE LOAD2 ;IF INVALID,
2920 LDA #$05 ;KEEP SEARCHING
2930 LOAD2
2940 STA PNTR,X ;FOR VALID
2950 TAY ;VECTOR.
2960 LDA SPEEDS,Y
2970 BEQ LOAD0
2980 BPL NEXT
2990 ADDUP
3000 LDA XPOS+2,X ;ADD PROPER
3010 CLC ;DELTA TO PLAT-
3020 ADC DELTAX,X ;FORM X-COORD.
3030 STA XPOS+2,X ;SAVE IT.
3040 LDA YPOS+2,X ;ADD PROPER
3050 CLC ;DELTA TO PLAT-
3060 ADC DELTAY,X ;FORM Y-COORD.
3070 STA YPOS+2,X ;SAVE IT.
3080 CPX SLIP ;BOPOTRON ON
3090 BNE NEXT ;THIS PLATFORM?
3100 LDA XPOS ;YES. ADD
3110 CLC ;X-DELTA TO BOP-
3120 ADC DELTAX,X ;OTRON X-COORD
3130 STA XPOS ;AND SAVE IT.
3140 STA XPOS+1
3150 LDA YPOS ;ADD Y-DELTA TO
3160 CLC ;BOPOTRON
3170 ADC DELTAY,X ;Y-COORD AND
3180 STA YPOS ;SAVE IT.
3190 STA YPOS+1
3200 NEXT
3210 DEX ;HANDLE NEXT
3220 BPL BACKTRACK ;PLATFORM.
3230 ;
3240 ; *************************
3250 ; * BOPOTRON ON PLATFORM? *
3260 ; *************************
3270 ;
3280 LDA #$FF ;CLEAR 'ON
3290 STA SLIP ;PLATFORM' FLAG.
3300 LDX TASKERS ;# OF PLATFORMS
3310 BMI DELTASDONE ;NONE. QUIT.
3320 SLIPTEST
3330 LDA XPOS ;SUBTRACT BOPO-
3340 SEC ;TRON X-COORD
3350 SBC XPOS+2,X ;FROM PLATFORM'S
3360 BPL NOABS ;IF >=0 BRANCH.
3370 EOR #$FF ;TAKE ABSOLUTE
3380 CLC ;VALUE.
3390 ADC #$01 ;
3400 NOABS
3410 CMP #$07 ;IS IT >=7?
3420 BCS SETDELTAS ;YES. BRANCH.
3430 LDA YPOS+2,X ;NO. SUBTRACT
3440 SEC ;BOPOTRON
3450 SBC YPOS ;Y-COORD.
3460 CMP #12 ;IS IT = 12?
3470 BNE DIETEST ;NO. BRANCH.
3480 STX SLIP ;SET FLAG.
3490 BNE SETDELTAS ;BRANCH.
3500 DIETEST
3510 BCS SETDELTAS ;IS IT < 12?
3520 LDA #$01 ;YES!!! BOPOTRON
3530 STA ACTIVATE ;DIES PAINFULLY
3540 SETDELTAS
3550 LDA #$00 ;CLEAR OUT OLD
3560 STA DELTAX,X ;DELTA VALUES.
3570 STA DELTAY,X ;
3580 LDY PNTR,X ;GET PNTR.
3590 LDA XPOS+2,X ;COMPARE DESTIN-
3600 CMP XEND,Y ;ATION TO ACTUAL
3610 BCC PLUS1X ;POSITION.
3620 BEQ NEWDELTA ;
3630 LDA #$FF ;DELTA IS -1.
3640 BMI SETDELTAX
3650 PLUS1X
3660 LDA #$01 ;DELTA IS +1
3670 SETDELTAX
3680 STA DELTAX,X ;SAVE X-DELTA.
3690 NEWDELTA
3700 LDA YPOS+2,X ;COMPARE DES-
3710 CMP YEND,Y ;TINATION TO
3720 BCC PLUS1Y ;ACTUAL POSITION
3730 BEQ DELTASDONE
3740 LDA #$FF ;DELTA IS -1
3750 BMI SETDELTAY
3760 PLUS1Y
3770 LDA #$01 ;DELTA IS +1
3780 SETDELTAY
3790 STA DELTAY,X ;SAVE Y-DELTA.
3800 DELTASDONE
3810 DEX ;CHECK NEXT
3820 BPL SLIPTEST ;PLATFORM.
3830 ;
3840 ; ***************************
3850 ; * CHARACTER TRACE ROUTINE *
3860 ; ***************************
3870 ;
3880 PASS3
3890 LDA SAVMSC ;GET 1st ADDR.
3900 STA SCREEN ;OF SCREEN
3910 LDA SAVMSC+1 ;MEMORY & SAVE
3920 STA SCREEN+1 ;IT.
3930 LDA YPOS ;BOPOTRON Y.
3940 SEC ;SUBTRACT SEX
3950 SBC #$06 ;DECIMAL.
3960 LSR A ;DIVIDE BY FOUR.
3970 LSR A
3980 TAX ;MOVE TO X-REG.
3990 PASS4
4000 BEQ PASS5 ;IF =0 BRANCH.
4010 LDA SCREEN ;GET SCREEN &
4020 CLC ;ADD ONE LINE.
4030 ADC #40 ;(40 BYTES)
4040 STA SCREEN ;SAVE IT.
4050 LDA SCREEN+1 ;CORRECT FOR
4060 ADC #$00 ;PAGE WRAP-
4070 STA SCREEN+1 ;AROUND.
4080 DEX ;AT BOPOTRON'S
4090 BPL PASS4 ;Y-COORD?
4100 PASS5
4110 LDA XPOS ;YES. GET
4120 SEC ;X-COORD & SUB-
4130 SBC #44 ;TRACT 44.
4140 LSR A ;DIVIDE BY
4150 LSR A ;FOUR.
4160 TAY ;MOVE TO Y-REG.
4170 LDA (SCREEN),Y ;CHARACTER #.
4180 LDX SLIP ;BOPOTRON ON
4190 BMI PASS6 ;PLATFORM?
4200 LDA #$01 ;YES! CHAR=1.
4210 PASS6
4220 STA CHAR+1 ;SAVE CHARACTER
4230 AND #$7F ;REMOVE msb
4240 STA CHAR ;& SAVE AGAIN.
4250 LDA YPOS ;IS BOPOTRON Y-
4260 CMP #27 ;COORD <27
4270 BCC PASS7 ;YES! BRANCH.
4280 LDA SCREEN ;CHECK SCREEN
4290 SEC ;POSITION 2
4300 SBC #80 ;LINES UP TO SEE
4310 STA SCREEN ;IF BOPOTRON IS
4320 LDA SCREEN+1 ;CRASHING HIS
4330 SBC #$00 ;DOME.
4340 STA SCREEN+1 ;(80 BYTES)
4350 LDA (SCREEN),Y ;CHARACTER #.
4360 CMP #$01 ;IS IT A GIRDER?
4370 BEQ ZAP ;YES BRANCH.
4380 CMP #$08 ;IS IT >=8?
4390 BCS ZAP ;YES BRANCH.
4400 PASS7
4410 ;
4420 ; ***************************
4430 ; * BOPOTRON MOTION ROUTINE *
4440 ; ***************************
4450 ;
4460 LDA CHAR ;GET CHARACTER #
4470 BEQ FALL ;IF = 0 BRANCH.
4480 DEC MOVETIME ;DEC TIMER.
4490 BMI MOTION ;IF <0 MOVE.
4500 JMP XITVBV ;ELSE, QUIT.
4510 MOTION
4520 PHA ;SAVE ACC.
4530 LDA #$01 ;RESET TIMER.
4540 LDX TRIG0 ;IS BUTTON HELD?
4550 BEQ RESET ;NO. BRANCH.
4560 ASL A ;YES. MOVE FAST.
4570 RESET
4580 STA MOVETIME ;SAVE TIMER.
4590 PLA ;RESTORE ACC.
4600 CMP #$02 ;IS CHARACTER <2
4610 BCC FALLTEST ;IF YES BRANCH.
4620 CMP #$08 ;IS CHARACTER <8
4630 BCC CHECK6 ;IF YES BRANCH.
4640 FALLTEST
4650 LDA SLIP ;ON PLATFORM?
4660 BPL CHECK8 ;IF YES BRANCH.
4670 LDA YPOS ;MODIFY BOPO-
4680 AND #$01 ;TRON'S Y-COORD
4690 BNE FALL ;SO HE'S ALWAYS
4700 LDA YPOS ;ON TOP OF A
4710 AND #$03 ;GIRDER.
4720 BNE CHECK8 ;
4730 FALL
4740 INC FALLCOUNT ;FALLING...
4750 LDA #$01 ;ADD ONE TO
4760 BNE ADDY ;Y-COORD.
4770 CHECK6
4780 LDA STICK ;GET JOYSTICK.
4790 CMP #13 ;PUSHED DOWN?
4800 BNE CHECK7 ;NO. BRANCH.
4810 LDA YPOS ;IS Y-COORD AT
4820 CMP #98 ;LOWER LIMIT?
4830 BNE FALL ;NO. BRANCH.
4840 BEQ CHECK8 ;YES. BRANCH.
4850 CHECK7
4860 CMP #14 ;PUSHED UP?
4870 BNE CHECK8 ;NO. BRANCH.
4880 LDA #$FF ;SET TO MOVE UP.
4890 ADDY
4900 CLC ;ADD MOVEMENT
4910 ADC YPOS ;DELTA TO BOP-
4920 STA YPOS ;OTRON'S Y-COORD
4930 STA YPOS+1 ;AND SAVE IT.
4940 CHECK8
4950 LDA CHAR ;GET CHARACTER #
4960 BEQ ALLDONE ;IF =0 QUIT.
4970 LDA FALLCOUNT ;IS FALLCOUNT
4980 CMP FALLCOUNT+1 ;OVER LIMIT?
4990 BCC CHECK9 ;NO. BRANCH.
5000 ZAP
5010 LDA #$01 ;STOP VBLANK &
5020 STA ACTIVATE ;INFORM BASIC.
5030 CHECK9
5040 LDA #$00 ;NOT FALLING.
5050 STA FALLCOUNT ;HALT COUNT.
5060 LDA STICK ;GET STICK.
5070 CMP #$07 ;MOVED RIGHT?
5080 BNE CHECK10 ;NO. BRANCH.
5090 LDA XPOS ;CHECK FOR END
5100 CMP #198 ;OF SCREEN OR
5110 BCS ALLDONE ;OBSTRUCTIONS.
5120 LDA CHAR ;IF ANY, DO NOT
5130 CMP #$08 ;ALLOW BOPOTRON
5140 BEQ ALLDONE ;TO MOVE RIGHT.
5150 CMP #12 ;
5160 BEQ ALLDONE ;
5170 LDA #$01 ;O.K. TO MOVE
5180 BNE ADDX ;RIGHT. BRANCH.
5190 CHECK10
5200 CMP #11 ;PUSHED LEFT?
5210 BNE ALLDONE ;NO BRANCH.
5220 LDA XPOS ;CHECK TO SEE IF
5230 CMP #47 ;BOPOTRON IS AT
5240 BCC ALLDONE ;SCREEN END OR
5250 LDA CHAR ;OBSTRUCTED. IF
5260 CMP #$09 ;SO DO NOT ALLOW
5270 BEQ ALLDONE ;MOVEMENT TO THE
5280 CMP #13 ;LEFT.
5290 BEQ ALLDONE ;
5300 LDA #$FF ;O.K. TO MOVE LEFT.
5310 ADDX
5320 CLC ;ADD RIGHT OR
5330 ADC XPOS ;LEFT DELTA TO
5340 STA XPOS ;BOPOTRON'S X-
5350 STA XPOS+1 ;COORD & SAVE.
5360 ALLDONE
5370 JMP XITVBV ;LATE HOME BOY...
5380 ;
5390 ; *****************************
5400 ; * REDEFINED CHARACTER CHART *
5410 ; *****************************
5420 ;
5430 ; CHAR # TYPE
5440 ;
5450 ; 0 BLANK SPACE
5460 ; ! 1 GIRDER
5470 ; " 2 GIRDER & LADDER (left)
5480 ; # 3 GIRDER & LADDER (middle)
5490 ; $ 4 GIRDER & LADDER (right)
5500 ; % 5 LADDER (left)
5510 ; & 6 LADDER (middle)
5520 ; ' 7 LADDER (right)
5530 ; ( 8 BATTERY (bottom left)
5540 ; ) 9 BATTERY (bottom right)
5550 ; * 10 BATTERY (top left)
5560 ; + 11 BATTERY (top right)
5570 ; , 12 POWER UNIT (bottom left)
5580 ; - 13 POWER UNIT (bottom right)
5590 ; . 14 POWER UNIT (top left)
5600 ; / 15 POWER UNIT (top right)
5610 ; 0 16 EXIT GIRDER