-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbantyair.asm
716 lines (617 loc) · 11.5 KB
/
bantyair.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
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
;opoznieniePocisku equ 12 ;po strzale opoznienie nastepnego strzalu minimalne
opoznieniePocisku dta b(0)
pociskiOra dta b(%01000000,%01010000,%00010000,%00010100,%00000100,%00000101,%00000101,%00000001)
bit1 equ 4
tabcan3cor_ad dta b(0,9,18,27)
tabcan3corB dta b(%00110001,%00000001,%00100000,0-28+16,-18-32+17,-17-28+16,7-32+17,-17-28+16,-5-32+17)
dta b(%00000111,%00000001,%00000100,0-28+16,-18-32+17,16-28+16,-5-32+17,16-28+16,7-32+17)
dta b(%00111000,%00001000,%00100000,0-28+16,19-32+17,-17-28+16,7-32+17,-17-28+16,-5-32+17)
dta b(%00001110,%00001000,%00000100,0-28+16,19-32+17,16-28+16,-5-32+17,16-28+16,7-32+17)
tabcan3cor dta b(%00100011,%00100000,%00000010,-18-32+17,0-28+16,-5-32+17,-17-28+16,8-32+17,-17-28+16)
dta b(%00000111,%00000100,%00000010,19-32+17,0-28+16,-5-32+17,-17-28+16,8-32+17,-17-28+16)
dta b(%00111000,%00100000,%00010000,-18-32+17,0-28+16,8-32+17,16-28+16,-5-32+17,16-28+16)
dta b(%00011100,%00000100,%00010000,19-32+17,0-28+16,8-32+17,16-28+16,-5-32+17,16-28+16)
tabcankier dta b($aa,$7d,$5e,$4e,$3f,$2f,$2f,$2f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,0)
dta b($d6,$aa,$8c,$6d,$6e,$5e,$4e,$3e,$3e,$3e,$2e,$2e,$2f,$2f,$2f,0)
dta b($e4,$c8,$aa,$9c,$7c,$6d,$6d,$5e,$4e,$4e,$4e,$3e,$3e,$3e,$3e,0)
dta b($e3,$d6,$c9,$aa,$9b,$8c,$7d,$6d,$6d,$5e,$5e,$4e,$4e,$4e,$4e,0)
dta b($e3,$d5,$c7,$b9,$aa,$9b,$8c,$8c,$7d,$6d,$6d,$5d,$5e,$5e,$4e,0)
dta b($e2,$e4,$d6,$c8,$b9,$aa,$9b,$9c,$8c,$7c,$7d,$6d,$6d,$6d,$5e,0)
dta b($e2,$e4,$d6,$d7,$c8,$b9,$aa,$9b,$9b,$8c,$8c,$7d,$7d,$6d,$6d,0)
dta b($e2,$e3,$e5,$d6,$c8,$c9,$b9,$aa,$ab,$9b,$8c,$8c,$7c,$7d,$7d,0)
dta b($e1,$e3,$e4,$d6,$d7,$c8,$b9,$b9,$aa,$ab,$9b,$9c,$8c,$8c,$7c,0)
dta b($e1,$e3,$e4,$e5,$d6,$c7,$c8,$b9,$ba,$aa,$ab,$9b,$9b,$8c,$8c,0)
dta b($f1,$e2,$e4,$e5,$d6,$d7,$c8,$c8,$b9,$ba,$aa,$ab,$9b,$9b,$8c,0)
dta b($f1,$e2,$e3,$e4,$d5,$d6,$d7,$c8,$c9,$b9,$ba,$aa,$ab,$9b,$9b,0)
dta b($f1,$f2,$e3,$e4,$e5,$d6,$d7,$c7,$c8,$b9,$b9,$ba,$aa,$ab,$9b,0)
dta b($f1,$f2,$e3,$e4,$e5,$d6,$d6,$d7,$c8,$c8,$b9,$b9,$ba,$aa,$ab,0)
antyair1 equ *
lda startMapy
beq *+3
rts
dec antyairOpoznienie
beq *+3
rts
mva #1 antyairOpoznienie
lda liczbaPociskow
maxPociskow1 equ *+1
cmp #$ff
bcc *+3
rts
ldx licznikBazyEkran
bne *+3
rts
jsr wylosujbaze
ldy bazyEkran,x
dey
lda bazyRodzaj,y
beq @+ ;baza typu A
jmp antB1
@ equ * ;Baza typu A
ldx #0 ;nr cwiartki
clc
lda bazyY0,y
adc #7
:2 asl
sta pom0d
sec
sbc movy0
sec
sbc #67
bpl @+
ldx #2
eor #255
@ cmp #68 ;czy spelnia zakres
bcc @+
rts
@ sta pom0f
clc
lda bazyX0,y
adc #8
:2 asl
sta pom0c
sec
sbc movx0
sec
sbc #79
bpl @+
inx
eor #255
@ cmp #78 ;czy spełnia zakres
bcc @+
rts
@ sta pom0e
lda tabcan3cor_ad,x ;pobieramy adres tablicy z korekcjami 3 działek dla danej cwiartki
tax
lda bazyStan,y
and tabcan3cor,x ;porownaj z maską tych działek, sprawdzamy czy nie są wszystkie zestrzelone
bne @+
rts ;brak tych działek
@ cmp tabcan3cor+1,x
beq _bokA
and tabcan3cor+1,x ;czy jest pion i poziom?
beq _goradolA
lda pom0f
cmp #17
bcc _bokA
lda pom0e
cmp #19
bcc _goradolA
lda random ;są oba losujemy które mogą strzelac
and #bit1
beq _goradolA
_bokA equ * ;strzela boczne dzialko
lda pom0e
cmp #19
bcs @+
rts
@ clc
lda pom0c
adc tabcan3cor+3,x
sta pom0a ;pozycja X pocisku
clc
lda pom0d
adc tabcan3cor+4,x
sta pom0b ;pozycja Y pocisku
mva #$ff pom
mva kat2 pom1
jmp dodajPocisk
_goradolA equ * ;strzelaja dzialka gorne lub dolne zaleznie od polozenia
lda pom0f
cmp #17
bcs @+
rts
@ lda tabcan3cor,x
eor tabcan3cor+1,x
and bazyStan,y
cmp tabcan3cor+2,x
bcc _pierwszeA
beq _drugieA
;są oba
@ lda liczbaPociskow
cmp maxPociskow
bcs @+ ;za malo dostepnych pociskow , strzela tylko 1 dzialko
lda pom0e
cmp #17
bcs @+ ;jeśli statek jest daleko to strzela tylko 1 dzialko
lda random ;czy maja strzelic oba naraz?
and #bit1
beq @+
stx pom0
jsr _pierwszeA ;strzelają oba
ldx pom0
jmp _drugieA
@ lda random
and #bit1
beq _drugieA
_pierwszeA equ * ;strzela pierwsze
clc
lda pom0c
adc tabcan3cor+5,x
sta pom0a
clc
lda pom0d
adc tabcan3cor+6,x
sta pom0b
mva kat1 pom ;typ działka
mva #$ff pom1
jmp dodajPocisk
_drugieA equ * ;strzela drugie
clc
lda pom0c
adc tabcan3cor+7,x
sta pom0a
clc
lda pom0d
adc tabcan3cor+8,x
sta pom0b
mva kat1 pom
mva #$ff pom1
jmp dodajPocisk
antB1 equ *
ldx #0 ;nr cwiartki
clc
lda bazyY0,y
adc #8
:2 asl
sta pom0d
sec
sbc movy0
sec
sbc #70
bpl @+
ldx #2
eor #255
@ cmp #68 ;czy spelnia zakres
bcc @+
rts
@ sta pom0f
clc
lda bazyX0,y
adc #7
:2 asl
sta pom0c
sec
sbc movx0
sec
sbc #76
bpl @+
inx
eor #255
@ cmp #78 ;czy spełnia zakres
bcc @+
rts
@ sta pom0e
lda tabcan3cor_ad,x ;pobieramy adres tablicy z korekcjami 3 działek dla danej cwiartki
tax
lda bazyStan,y
and tabcan3corB,x ;porownaj z maską tych działek, sprawdzamy czy nie są wszystkie zestrzelone
bne @+
rts ;brak tych działek
@ cmp tabcan3corB+1,x
beq _bokB
and tabcan3corB+1,x ;czy jest pion i poziom?
beq _goradolB
lda pom0e
cmp #17
bcc _bokB
lda pom0f
cmp #19
bcc _goradolB
lda random ;są oba losujemy które mogą strzelac
and #bit1
bne _goradolB
_bokB equ * ;strzela pojedyncze dzialko
lda pom0f
cmp #19
bcs @+
rts
@ clc
lda pom0c
adc tabcan3corB+3,x
sta pom0a ;pozycja X pocisku
clc
lda pom0d
adc tabcan3corB+4,x
sta pom0b ;pozycja Y pocisku
mva kat1 pom
mva #$ff pom1
jmp dodajPocisk
_goradolB equ * ;strzelaja dzialka podwojne
lda pom0e
cmp #17
bcs @+
rts
@ lda tabcan3corB,x
eor tabcan3corB+1,x
and bazyStan,y
cmp tabcan3corB+2,x
bcc _pierwszeB
beq _drugieB
;są oba
@ lda liczbaPociskow
cmp maxPociskow
bcs @+ ;za malo dostepnych pociskow , strzela tylko 1 dzialko
lda pom0f
cmp #19
bcs @+ ;jeśli statek jest daleko to strzela tylko 1 dzialko
lda random ;czy maja strzelic oba naraz?
and #bit1
beq @+
stx pom0
jsr _pierwszeB ;strzelają oba
ldx pom0
jmp _drugieB
@ lda random
and #bit1
beq _drugieB
_pierwszeB equ * ;strzela pierwsze
clc
lda pom0c
adc tabcan3corB+5,x
sta pom0a
clc
lda pom0d
adc tabcan3corB+6,x
sta pom0b
mva #$ff pom ;typ działka
mva kat2 pom1
jmp dodajPocisk
_drugieB equ * ;strzela drugie
clc
lda pom0c
adc tabcan3corB+7,x
sta pom0a
clc
lda pom0d
adc tabcan3corB+8,x
sta pom0b
mva #$ff pom
mva kat2 pom1
jmp dodajPocisk
dodajPocisk equ *
ldy maxPociskow ;wybierz wolny pocisk
@ lda pociski,y
bmi @+
dey
bpl @-
@ lda pom0a
clc
sbc movx0
sec
sbc #63
sta pociskiZnakX,y ;kierunek ruchu, <0 prawo, >0 lewo
clc
bpl @+
eor #255
sec ;przy zmianie znaku +1
@ adc #1 ;zaokrąglenie
cmp #64
bcc @+
rts
@ :2 lsr
and #%1111
sta pom0g
lda pom0b
sec
sbc movy0
sec
sbc #55
sta pociskiZnakY,y
clc
bpl @+
eor #255
sec
@ adc #1
and #%00111100
cmp #13*4
bcc @+
rts ;za daleko
@ :2 asl
ora pom0g
tax ;odczyt prędkości poruszanie się pocisku w osi X i Y
lda tabcankier,x
bne @+ ;jeśli zero to obiekt poza zasięgiem
rts
@ and #%1111
cmp pom
bcc @+
rts ;za duzy kat
@ :2 asl ;dodajemy 2 zera na koncu
sta pociskiPlusX,y
lda tabcankier,x
and #%11110000
cmp pom1
bcc @+
rts
@ :2 lsr ;2 bity dx/dy, 4 bity po przecinku, 2 puste bity
sta pociskiPlusY,y
lda pom0a ;ustalenie pozycji startowej pocisku
.if .def UC
alr #%11
.else
and #%11
lsr ;2 najmlodsze bity ustawiamy jako 2 najstasze
.endif
:2 ror
sta pociskidx,y
lda pom0a
lsr
.if .def UC
alr #$fe
.else
lsr
clc
.endif
adc posX
and #127
sta pociskiX,y
lda pom0b
.if .def UC
alr #%11
.else
and #%11
lsr
.endif
:2 ror
sta pociskidy,y
lda pom0b
lsr
.if .def UC
alr #$fe
.else
lsr
clc
.endif
adc posY
sta pociskiY,y
mva #0 pociski,y ;zajęcie pocisku
inc liczbaPociskow
mva opoznieniePocisku antyairOpoznienie
;mva #12*2 sfx_antyair
ldy #fx_antyair
lda #0
jmp sfx.add_fx
;rts
wylosujBaze equ *
cpx #1
bne @+
dex
rts ;dla 1=0
@ cpx #2
bne @+
lda random
.if .def UC
alr #4
.else
and #4
lsr
.endif
lsr
tax
rts
@ cpx #4
bne @+
lda random
.if .def UC
alr #%110
.else
and #%110
lsr
.endif
tax
rts
@ cpx #8
bne @+
lda random
.if .def UC
alr #%1110
.else
and #%1110
lsr
.endif
tax
rts
@ lda tabwyl1-3,x
sta pom0
ldx #255
lda random
sec
@ inx
sbc pom0
bcs @-
rts
tabwyl1 dta b(85,0,51,42,36)
movePociski1 equ *
ldx maxPociskow
@ lda pociski,x
bpl @+
movepnext1 equ *
dex
bpl @-
rts
@ lda pociskiZnakX,x
bpl @+
clc
lda pociskiDX,x
adc pociskiPlusX,x
sta pociskiDX,x
lda pociskiX,x
adc #0
and #127
sta pociskiX,x
jmp @+1
@ sec
lda pociskiDX,x
sbc pociskiPlusX,x
sta pociskiDX,x
lda pociskiX,x
sbc #0
and #127
sta pociskiX,x
@ lda pociskiZnakY,x
bpl @+1
clc
lda pociskiDY,x
adc pociskiPlusY,x
sta pociskiDY,x
bcc movepnext1
inc pociskiY,x
@ jmp movepnext1
@ sec
lda pociskiDY,x
sbc pociskiPlusY,x
sta pociskiDY,x
bcs movepnext1
dec pociskiY,x
@ jmp movepnext1
pociskiCharTab :5 dta b(firstPociskChar+#)
pociskiAdTab :5 dta b(<(znaki1+(firstPociskChar+#)*8))
:5 dta b(>(znaki1+(firstPociskChar+#)*8))
;rysuj pociski
printPociski equ *
ldx maxPociskow
proc_next1 equ *
lda pociski,x
bpl @+
poc_next equ *
dex
bpl proc_next1
rts
@ sec
lda pociskiY,x
sbc posY
cmp #29
bcc @+
dec pociski,x ;0-1 = 255
dec liczbaPociskow
dex
bpl proc_next1
rts
@ sta pociskiY0,x
tay
:2 asl
sta pom0c
lda (screenL),y
sta pom1
lda (screenH),y
sta pom1+1
lda pociskiX,x
sec
sbc posX
tay
lda tabX,y
cmp #33
bcc @+
dec pociski,x
dec liczbaPociskow
dex
bpl proc_next1
rts
@ sta pociskiX0,x
tay
:2 asl
sta pom0b
lda (pom1),y
sta pom0
and #128
ora pociskiCharTab,x
sta (pom1),y
lda pociskiAdTab,x ;adres znaku pocisku
sta pom
lda pociskiAdTab+5,x
ora ramka4
sta pom+1
lda pom0
and #127
sta pociskiTlo,x
@ tay
lda adresZnakL,y ;adres znaku pod pociskiem,tlo
sta pom1
lda adresZnakH,y
ora ramka4
sta pom1+1
lda pociskiDY,x
and #%11000000
asl
:2 rol
tay
ora pom0c
sta pociskiDY0,x
lda pociskiSkokL,y ;skok do procedury rysowania
sta _pociskiJump+1
lda pociskiSkokH,y
sta _pociskiJump+2
@ lda pociskiDX,x
:5 lsr
tay
lsr
ora pom0b
sta pociskiDX0,x
lda pociskiOra,y
sta pom0a ;ora dla ksztaltu pocisku
ldy #7
_pociskiJump equ *
jmp $ffff ;w procedurach rysowania należy wpisać-> jmp poc_next, wtedy tutaj moze byc jmp zamiast jsr (+6cykli)
pociskiSkokL dta b(<pociskiDY00),b(<pociskiDY2),b(<pociskiDY4),b(<pociskiDY6)
pociskiSkokH dta b(>pociskiDY00),b(>pociskiDY2),b(>pociskiDY4),b(>pociskiDY6)
pociskiDY00 equ *
@ lda (pom1),y
cpy #3
bcs *+4
eor pom0a
sta (pom),y
dey
bpl @-
jmp poc_next
pociskiDY2 equ *
@ lda (pom1),y
cpy #4
bcs *+8
cpy #2
bcc *+4
eor pom0a
sta (pom),y
dey
bpl @-
jmp poc_next
pociskiDY4 equ *
@ lda (pom1),y
cpy #6
bcs *+8
cpy #3
bcc *+4
eor pom0a
sta (pom),y
dey
bpl @-
jmp poc_next
pociskiDY6 equ *
@ lda (pom1),y
cpy #6
bcc *+4
eor pom0a
sta (pom),y
dey
bpl @-
jmp poc_next