-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathc.asm
7598 lines (6821 loc) · 185 KB
/
c.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
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
//Commando konwersja z C64 na Atari+VBXE
icl 'atari.hea'
opt h-
mapa=$4000
NTSCGTIA equ $D014
org $70
zegar org *+1
fx_ptr org *+2
pom org *+2
pom1 org *+2
pom2 org *+2
pom0 org *+1
pom0a org *+1
zestaw_znakow org *+1
pot0s org *+1
pot0s1 org *+1
refr org *+1
vscrol1 org *+1
licznik_trig org *+1
trig0s org *+1
trig0s1 org *+1
level_m org *+1
level_s org *+1
mapa_ad org *+2
;
; **** CONSTANTS ****
;
TOTAL_MAX_SPRITES = 16
;
; **** ZP FIELDS ****
;
f4C = $4C
;
; **** ZP ABSOLUTE ADDRESSES ****
;
a01 = $01
a14 = $14
a41 = $41
aA5 = $A5
aAE = $AE
aD7 = $D7
aDA = $DA
;
; **** ZP POINTERS ****
;
p19 = $19 ;Stores current hero animation, but seems unused
p1A = $1A
p22 = $22 ;sprite to create: X lo
p23 = $23
p24 = $24 ;rows that trigger sprite type init
p25 = $25
p26 = $26 ;sprite to create: X hi
p27 = $27
p28 = $28 ;what sprite type to create at row
p29 = $29
p2A = $2A ;charset attributes: background priority, collision, etc.
p2B = $2B
p5D = $5D ;Used by music
p5E = $5E ;Used by music
p5F = $5F ;Used by music
p60 = $60 ;Used by music
pF7 = $F7
pF8 = $F8
pFB = $FB ;$FB/$FC: different meanings depending to the game state
pFC = $FC ; On Hiscore, it points to Screen RAM
; During the game, it points to the Actions table
pFD = $FD ;But $FC/$FD is also used during the game to point
; to the level data and is uses with $2A to determine
; the sprite-background priority/collision
pFE = $FE
;
; **** FIELDS ****
;
f0000 = $0000
fD040 = $D040
fDB48 = $DB48
fDB98 = $DB98
fE087 = $E087
fE348 = $E348
fE398 = $E398
fE3F8 = $E3F8
;
; **** ABSOLUTE ADDRESSES ****
;
a003D = $003D ;Tmp var used by SORT_SPRITES_BY_Y
a003F = $003F ;Tmp var used by SORT_SPRITES_BY_Y
SPRITE_IDX_TBL = $004B ;$4B-$5A sprite index, used in raster multiplexer
a00A7 = $00A7
VIC_SPRITE_IDX = $00A8 ;Index used for sprite pos (e.g: $D000,idx) in raster intr.
a00C9 = $00C9 ;Tmp var used by SORT_SPRITES_BY_Y
a0400 = $0400 ;Used by GET_RANDOM
a0401 = $0401 ;Used by GET_RANDOM
V_SCROLL_BIT_IDX = $0402 ;pixels scrolled vertically: 0-7
V_SCROLL_ROW_IDX = $0403 ;index to the row in the level: 0 means end of scroll (top of map)
V_SCROLL_DELTA = $0404 ;How many pixels needs to get scrolled. $0: no scroll needed, $ff: -1 one pixel
LVL_MAP_MSB = $0405 ;MSB address for the level map: lvl0=$60, lvl1=$80, lvl3=$a0
IRQ_ADDR_LO = $0406
IRQ_ADDR_HI = $0407
GAME_TICK = $040A ;Incremented from main loop
RASTER_TICK = $040B ;Incremented from raster routine
org $d800
SPRITES_X_HI00 org *+1
SPRITES_X_HI01 org *+3
SPRITES_X_HI04 org *+1
SPRITES_X_HI05 org *+(TOTAL_MAX_SPRITES-5)
SPRITES_X_LO00 org *+1
SPRITES_X_LO01 org *+3
SPRITES_X_LO04 org *+1
SPRITES_X_LO05 org *+(TOTAL_MAX_SPRITES-5)
SPRITES_Y00 org *+1
SPRITES_Y01 org *+3
SPRITES_Y04 org *+1
SPRITES_Y05 org *+(TOTAL_MAX_SPRITES-5)
SPRITES_BKG_PRI00 org *+1
SPRITES_BKG_PRI01 org *+3
SPRITES_BKG_PRI04 org *+1
SPRITES_BKG_PRI05 org *+(TOTAL_MAX_SPRITES-5)
SPRITES_COLOR00 org *+1
SPRITES_COLOR01 org *+3
SPRITES_COLOR04 org *+1
SPRITES_COLOR05 org *+(TOTAL_MAX_SPRITES-5)
SPRITES_PTR00 org *+1
SPRITES_PTR01 org *+3
SPRITES_PTR04 org *+1
SPRITES_PTR05 org *+(TOTAL_MAX_SPRITES-5)
SPRITES_DELTA_X00 org *+1
SPRITES_DELTA_X01 org *+3
SPRITES_DELTA_X04 org *+1
SPRITES_DELTA_X05 org *+(TOTAL_MAX_SPRITES-5)
SPRITES_DELTA_Y00 org *+1
SPRITES_DELTA_Y01 org *+3
SPRITES_DELTA_Y04 org *+1
SPRITES_DELTA_Y05 org *+(TOTAL_MAX_SPRITES-5)
SPRITES_TYPE00 org *+1
SPRITES_TYPE01 org *+3
SPRITES_TYPE04 org *+1
SPRITES_TYPE05 org *+(TOTAL_MAX_SPRITES-5)
SPRITES_TMP_A01 org *+3
SPRITES_TMP_A04 org *+1
SPRITES_TMP_A05 org *+(TOTAL_MAX_SPRITES-5)
SPRITES_TMP_B05 org *+(TOTAL_MAX_SPRITES-5) ;Used as index to delta_tbl and more. Only 11 slots (enemies only)
SPRITES_TMP_C05 org *+(TOTAL_MAX_SPRITES-5) ;Used for timer: Only 11 slots (enemies only)
SPRITES_PREV_Y00 org *+TOTAL_MAX_SPRITES
;SPRITES_X_HI00 = $040D ;MSB for X pos
;SPRITES_X_HI01 = $040E
;SPRITES_X_HI04 = $0411
;SPRITES_X_HI05 = $0412
;SPRITES_X_LO00 = $041D ;LSB for X pos
;SPRITES_X_LO01 = $041E
;SPRITES_X_LO04 = $0421
;SPRITES_X_LO05 = $0422
;SPRITES_Y00 = $042D
;SPRITES_Y01 = $042E
;SPRITES_Y04 = $0431
;SPRITES_Y05 = $0432
;SPRITES_BKG_PRI00 = $043D
;SPRITES_BKG_PRI01 = $043E
;SPRITES_BKG_PRI04 = $0441
;SPRITES_BKG_PRI05 = $0442
;SPRITES_COLOR00 = $044D ;primary color of sprite
;SPRITES_COLOR01 = $044E
;SPRITES_COLOR04 = $0451
;SPRITES_COLOR05 = $0452
;SPRITES_PTR00 = $045D ;frame to be used by sprite
;SPRITES_PTR01 = $045E
;SPRITES_PTR04 = $0461
;SPRITES_PTR05 = $0462
;SPRITES_DELTA_X00 = $046D ;pixels to move horizontally for hero (neg or pos)
;SPRITES_DELTA_X01 = $046E
;SPRITES_DELTA_X04 = $0471
;SPRITES_DELTA_X05 = $0472
;SPRITES_DELTA_Y00 = $047D ;pixels to move vertically for hero (neg or pos)
;SPRITES_DELTA_Y01 = $047E
;SPRITES_DELTA_Y04 = $0481
;SPRITES_DELTA_Y05 = $0482
;SPRITES_TYPE00 = $048D
;SPRITES_TYPE01 = $048E
;SPRITES_TYPE04 = $0491
;SPRITES_TYPE05 = $0492
;SPRITES_TMP_A01 = $049D ;Used by different thigns. Only 15 slots (all but 0)
;SPRITES_TMP_A04 = $04A0 ;referenced in throw grenade
;SPRITES_TMP_A05 = $04A1 ;Used to link sprites together (?)
;SPRITES_TMP_B05 = $04AC ;Used as index to delta_tbl and more. Only 11 slots (enemies only)
;SPRITES_TMP_C05 = $04B7 ;Used for timer: Only 11 slots (enemies only)
;SPRITES_PREV_Y00 = $04C2 ;Used by raster interrupt. Is the Y value before applying delta.
; Valid for all sprites expect for the Hero (SPRITE00)
FIRE_COOLDOWN = $04DF ;reset with $ff
HERO_ANIM_MOV_IDX = $04E0 ;Movement anim for hero: left,right,up,down,diagonally,etc.
; See: SOLDIER_ANIM_FRAMES
a04E1 = $04E1 ;Bullet speed idx (???)
BKG_COLOR0 = $04E2
BKG_COLOR1 = $04E3
BKG_COLOR2 = $04E4
COUNTER1 = $04E6
a04E7 = $04E7 ;unused
TRIGGER_ROW_IDX = $04E8 ;If equal to row index, create object
a04E9 = $04E9 ;unused
a04EA = $04EA ;Used in mortar guy animation
POW_GUARDS_KILLED = $04EC ;Number of POW guard killed. When == 2, "Free POW" anim is executed
POW_SPRITE_IDX = $04ED ;Holds the sprite idx used by POW sprite
a04EE = $04EE ;Hero is moving up (unused)
ENEMIES_IN_FORT = $04EF ;How many enemies are inside the fort/warehouse
TMP_SPRITE_X_LO = $04F0 ;Temp sprite-X LSB for current sprite
TMP_SPRITE_Y = $04F1 ;ditto for Y
TMP_SPRITE_X_HI = $04F2 ;ditto for X MSB
LEVEL_NR = $04F3
ANY_ENEMY_IN_MAP = $04F4 ;How many enemies are in the map. If 0, grenades are not thrown
IS_LEVEL_COMPLETE = $04F5 ;0: game in progress, 1:lvl complete. Exit animation finished (unused apparently)
IS_ANIM_EXIT_DOOR = $04F7 ;1: hero goes to exit door animation in progress
SCORE_LSB = $04F8
SCORE_MSB = $04F9
a04FD = $04FD ;unused
GRENADES = $04FF
LIVES = $0500
a0501 = $0501 ;unused
a0502 = $0502 ;unused
IS_HERO_DEAD = $0503 ;0: hero alive, 1:was shot, 2:fell down in trench
SHOOT_FREQ_MASK = $0504 ;How frequent soliders can shoot
HISCORE_IS_BULLET_ANIM = $0505 ;1: if the bullet in hiscore is being animated
HISCORE_NAME = $0506 ;8 chars reserved for the hiscore name ($0506-$050E)
HISCORE_NAME_IDX = $050F ;Index to the hiscore name
HISCORE_SELECTED_CHAR = $0510 ;Selected char in hiscore
HISCORE_IS_CHAR_ANIM = $0511 ;1: if the selected char in hiscore is being animated
HISCORE_ANIM_CHAR_COUNTER = $0512 ;Counter to the selected char animation in hiscore
;
; **** POINTERS ****
;
pD800 = $D800
pD829 = $D829
pD882 = $D882
pE000 = $E000
pE029 = $E029
pE082 = $E082
//stale
ekran=$e000
znaki=$8000
zestaw0=$6000
zestaw1=$6400
zestaw2=$6800
zestaw3=$6c00
zestaw4=$7000
opt h+
icl './load/logo.asm'
icl 'init_vbxe'
icl 'init_vbxe1'
org $2000
dlist .he 70,70,70
dta $42,a($fa00)
:23 .he 02
dta $41,a(dlist)
nmi bit nmist
bpl *+5
jmp (dliv)
jmp (vbiv)
vbi
pha
tya
pha
txa
pha
inc zegar
lsr muza1
bcc graj
mva muza0 muza1
jmp omin_muze
graj
jsr rmt_play
omin_muze
pla
tax
pla
tay
pla
rti
dli
irq rti
muza0 dta b(0)
muza1 dta b(0)
level_ad_tab
:8 dta a($4000+$500*#)
clear_screen_vbxe
ldy #$53 ; BLITTER_BUSY
@ lda (fx_ptr),y
bne @-
ldy #$50 ; BL_ADR0
mva #clear_vbxe&$ff (fx_ptr),y+ ; BL_ADR0 ;najmlodszy bajt adresu
mva #[clear_vbxe>>8]&$ff (fx_ptr),y+ ; BL_ADR1 ;nastepne bajty adresu
mva #clear_vbxe>>16 (fx_ptr),y+ ; BL_ADR2
mva #1 (fx_ptr),y ; BLITTER_START ;wykonaj
rts
copy_data
ldy #$5d
mva #$82+[dane_vbxe>>14] (fx_ptr),y
ldy #$5e
mva #$e8 (fx_ptr),y+
lda level_nr
lsr
ora #$80+$40 ;4 okno
sta (fx_ptr),y ;włącza okno w obszarze $e000
lda level_nr
asl
tax
lda level_ad_tab,x
sta pom
lda level_ad_tab+1,x
sta pom+1
mwa #dane_mapy _cd_dst+1
ldx #5
ldy #0
@ lda (pom),y
_cd_dst sta $ffff,y
dey
bne @-
inc pom+1
inc _cd_dst+2
dex
bne @-
ldy #$5d
mva #0 (fx_ptr),y ;zamknij okno
rts
copy_mapa
ldy #$5e
mva #$e8 (fx_ptr),y+
lda level_nr
asl
ora #$80+$50 ;$D0
sta (fx_ptr),y ;włącza okno w obszarze $e000
ora #1
sta pom0
mwa #mapa _cp_dst+1
ldx #16
jsr copy_pom
ldy #$5f
lda pom0
sta (fx_ptr),y
jsr copy_pom
ldy #$5e
lda #0
sta (fx_ptr),y+
sta (fx_ptr),y ;zamknij okno
rts
copy_pom
ldx #16
ldy #0
mva #$e0 _cp_src+2
@
_cp_src lda $ff00,y
_cp_dst sta mapa,y
dey
bne @-
inc _cp_src+2
inc _cp_dst+2
dex
bne @-
rts
text_press dta d'PRESS ANY KEY TO START'
run
lda 20
cmp 20
beq *-2
sei
mva #0 nmien
sta V_SCROLL_DELTA
sta audctl ;inicjalizacja dźwięku
mva #3 skctl
mva #$fe portb
mwa #vbi vbiv
mwa #dli dliv
mwa #nmi $fffa
mwa #irq $fffe
mwa #irq $fffc
mva #64+128 nmien
jsr clear_screen
jsr wait_vbl1
mwa #dlist dlptr
mva #0 colpf2
sta colbak
mva #$0a colpf1
mva #$22 dmactl
mva #>znaki chbase
sta potg0
@ lda vcount
bpl @-
@ lda vcount
beq @+
sta pom0
jmp @-
@ equ *
mva pot0 pot0s
sta pot0s1
mva #0 muza0
@ ldy pom0
cpy #$90
bcs @+
mva #32 muza0
@ equ *
sta muza1
ldx #21
@ lda text_press,x
bne *+4
lda #-$1a
clc
adc #$3a
sta $fd98+9,x
dex
bpl @-
@ lda skctl
and #4 ;dowolny klawisz
bne @-
//wlacz VBXE
jsr wait_vbl
jsr clear_screen_vbxe
ldy #$40 ; VIDEO_CONTROL
mva #1 (fx_ptr),y ; xdl_enabled
iny
mva #xdl_vbxe&$ff (fx_ptr),y ; XDL_ADR0 podaj adres 24bitowy
iny
mva #[xdl_vbxe>>8]&$ff (fx_ptr),y ; XDL_ADR1
iny
mva #xdl_vbxe>>16 (fx_ptr),y ; XDL_ADR2
/* mva #$f4 kol1+5 ;poprawki kolorów NTSC
lda #$c8
sta level_color_tab
sta level_color_tab+2
sta level_color_tab+3
lda #$84
sta level_color_tab+1 */
lda #0
tax
ldy #$b0 ;muzyka pod $b000
jsr rmt_init
jsr init_random
jsr init_sprites
START
jsr SCREEN_MAIN_TITLE
LDA #$00 ;#%00000000
STA SCORE_LSB ;wyzeruj punkty
STA SCORE_MSB
STA V_SCROLL_BIT_IDX ;przesuniecie ekranu?
sta vscrol1
sta sprites_size ;duszki normalnej wielkości
STA LEVEL_NR ;poziom startowy
LDA #$05 ;#%00000101
STA GRENADES ;5 granatów
STA LIVES ;5 żyć
START_LEVEL ;$08B8
LDA #$A5 ;#%10100101 ;pozycja poczatkowa na mapie
STA V_SCROLL_ROW_IDX
;LDA #$00 ;Song to play (main theme)
;JSR MUSIC_INIT
RESTART
JSR SETUP_LEVEL
JSR SETUP_SCREEN
;JSR SETUP_IRQ
jsr wait_vbl1
ldy #$40
mva #1+4 (fx_ptr),y
jsr LEVEL_DRAW_VIEWPORT
jmp game_loop1
; Main loop
GAME_LOOP ;$08CB
JSR WAIT_RASTER_AT_BOTTOM
;jsr wait_vbl1
mva pot0s pot0s1
mva pot0 pot0s
sta potg0
lda V_SCROLL_BIT_IDX
sta vscrol1
jsr LEVEL_DRAW_VIEWPORT
game_loop1
LDA V_SCROLL_DELTA
BEQ @+
CLC
ADC V_SCROLL_BIT_IDX
AND #$07 ;#%00000111
STA V_SCROLL_BIT_IDX
;sta vscrol
CMP #$07 ;#%00000111
BNE @+
DEC V_SCROLL_ROW_IDX
LDA #$00 ;#%00000000
STA a04E9
JSR APPLY_DELTA_MOV
INC a04E9
inc refr
//JSR LEVEL_DRAW_VIEWPORT
INC a04E9
JMP GAME_LOOP
@ INC GAME_TICK
JSR APPLY_DELTA_MOV
//JSR SORT_SPRITES_BY_Y
JSR TRY_THROW_GRENADE ;obsługa fire
JSR ANIM_ENEMIES
JSR RUN_ACTIONS
JSR ANIM_HERO
LDA IS_HERO_DEAD
BNE HERO_DIED
JSR HANDLE_JOY2
LDA IS_ANIM_EXIT_DOOR
BNE @+
JSR CHECK_COLLISION
@ LDA SPRITES_Y00
CMP #$5A
BNE GAME_LOOP
LDA #$14 ;Points won after beating lvl
JSR SCORE_ADD
LDA LEVEL_NR
AND #$03 ;#%00000011
CMP #$03 ;#%00000011
BNE @+
;Play animation at end of Level 3
LDA #$09 ;#%00001001
//JSR SFX_PLAY
JSR SET_FORT_ON_FIRE
@ LDA #$02 ;Song to play (Level complete)
//JSR MUSIC_INIT
JSR PRINT_LVL_COMPLETE
INC LEVEL_NR
; Since LVL2 was removed from the game, when LVL2 is reached,
; the level is changed to LVL3.
LDA LEVEL_NR
AND #$07 ;#%00000011
sta level_nr
;CMP #$02 ;#%00000010
;BNE @+
;INC LEVEL_NR
@ JMP START_LEVEL
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
; Animate hero "is dead"
HERO_DIED ;b0953
LDA IS_HERO_DEAD
CMP #$02 ;Died of fall in trench/water?
BNE @+1
; Hero fell down in trench
INC COUNTER1
LDA COUNTER1
CMP #$14 ;#%00010100
BCC @+
CMP #$50 ;#%01010000
BCS @+3
LDA #$CC ;Hero fall down in trench frame #1
STA SPRITES_PTR00
JMP GAME_LOOP
@ LDA #$CB ;Hero fall down in trench frame #0
STA SPRITES_PTR00
JMP GAME_LOOP
; Hero was shot
@ INC COUNTER1
LDA COUNTER1
CMP #$14 ;#%00010100
BCC @+
CMP #$50 ;#%01010000
BCS @+1
LDA #$B8 ;Hero was shot: frame #1
STA SPRITES_PTR00
JMP GAME_LOOP
@ LDA #$DD ;Hero was shot: frame #0
STA SPRITES_PTR00
JMP GAME_LOOP
; End of "died" animation. Decrease life.
@ ;DEC LIVES
sec
lda lives
sed
sbc #1
cld
sta lives
JSR SCREEN_REFRESH_LIVES
LDA LIVES
BEQ GAME_OVER
JMP RESTART
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
GAME_OVER
jsr wait_vbl
jsr clear_screen_vbxe
LDX #$06 ;#%00000110
@ TXA ;L00
ASL
TAY
LDA SCORE_MSB
CMP HISCORE_LSB00,Y
BCC @+3
BNE @+
LDA SCORE_LSB
CMP HISCORE_MSB00,Y
BCC @+3
@ TXA ;L01
ASL
TAY
LDA HISCORE_LSB00,Y
STA HISCORE_LSB01,Y
LDA HISCORE_MSB00,Y
STA HISCORE_MSB01,Y
TXA
ASL
ASL
ASL
TAY
@ LDA HISCORE_NAME00,Y ;L02
STA HISCORE_NAME01,Y
INY
TYA
AND #$07 ;#%00000111
BNE @-
DEX
BPL @-2
LDA SCORE_MSB
STA HISCORE_LSB00
LDA SCORE_LSB
STA HISCORE_MSB00
JSR SCREEN_ENTER_HI_SCORE
LDY #$00
@ LDA HISCORE_NAME,Y
STA HISCORE_NAME00,Y
INY
CPY #$08
BNE @-
JMP @+3 ;do L07
@ TXA ;L04
ASL
TAY
LDA SCORE_MSB
STA HISCORE_LSB01,Y
LDA SCORE_LSB
STA HISCORE_MSB01,Y
CPX #$06 ;#%00000110
BNE @+
JMP START
@ TXA ;L05
PHA
JSR SCREEN_ENTER_HI_SCORE
PLA
ASL
ASL
ASL
TAX
LDY #$00 ;#%00000000
@ LDA HISCORE_NAME,Y ;L06
STA HISCORE_NAME01,X
INX
INY
CPY #$08 ;#%00001000
BNE @- ;L06
@ JSR CLEANUP_SPRITES ;L07
JSR DISPLAY_HI_SCORES
LDY #$64 ;#%01100100
JSR DELAY
; Wait for 255 frames or joystick fire
LDA #$FF ;#%11111111
STA COUNTER1
@ ;LDA $DC00 ;CIA1: Data Port Register A (fire in Game Over scene) ;L08
;CMP #$6F ;#%01101111
lda trig0
BEQ @+
JSR WAIT_RASTER_AT_BOTTOM
DEC COUNTER1
BNE @-
@ JMP START ;L09
tab_y_m
:256 dta b(<[#*SCREEN_SZER])
tab_y_s
:256 dta b(>[#*SCREEN_SZER])
tab_y_s1
:256 dta b([#*SCREEN_SZER]>>16)
tab_shapes
:112 dta b(#*2)
set_color
ldy #$44
mva #$c0 (fx_ptr),y+ ; CSEL ,nr koloru
mva #1 (fx_ptr),y ; PSEL ,nr palety
lda tab_colbg,x
sta _r0+1
lda tab_colbg+1,x
sta _g0+1
lda tab_colbg+2,x
sta _b0+1
ldx #$40
@ ldy #$46
_r0 mva #0 (fx_ptr),y+ ;RED
_g0 mva #0 (fx_ptr),y+ ;GREEN
_b0 mva #0 (fx_ptr),y ;BLUE
dex
bne @-
rts
tab_colbg dta 41,141,60 ;green
dta 52,41,137 ;blue
init_sprites
ldx #TOTAL_MAX_SPRITES-1
@ lda #0
sta SPRITES_Y00,x
sta SPRITES_DELTA_Y00,x
sta SPRITES_X_LO00,x
sta SPRITES_Y00,x
sta SPRITES_DELTA_X00,x
sta sprites_TYPE00,x
lda #255
sta sprites_PTR00,x
dex
bpl @-
rts
print_sprites
mwa #$4000+[duszki_vbxe&$3fff] pom
ldy #$5d
mva #$80+[duszki_vbxe >> 14] (fx_ptr),y ;wlacz okno B
ldx #15
@ ldy SPRITES_PTR00,x
lda tab_shapes-$90,y
ldy #1
sta (pom),y ;ksztalt
ldy SPRITES_Y00,x
lda tab_y_s,y
sta pom0
lda tab_y_s1,y
sta pom0a
clc
lda tab_y_m,y
adc SPRITES_X_LO00,x
ldy #6
sta (pom),y
lda SPRITES_X_HI00,x
bpl *+4
lda #1
adc pom0
iny
sta (pom),y ;pozycja na ekranie
lda #1
adc pom0a
iny
sta (pom),y
lda SPRITES_COLOR00,x
:2 asl
ora #$03
and #$3f
ldy #15
sta (pom),y ;kolor
sprites_size equ *+1
lda #$00 ;zoom x i y
ldy #18
sta (pom),y
lda sprites_bkg_pri00,x
beq *+4
lda #2
sta pom0
ldy #20
lda (pom),y
and #8+1
ora pom0
sta (pom),y
clc
lda pom
adc #21 ;next bcb
sta pom
bcc *+4
inc pom+1
dex
bpl @-
rts
print_sprites1
ldy #$5d
mva #0 (fx_ptr),y
ldy #$53 ; BLITTER_BUSY
@ lda (fx_ptr),y
bne @-
ldy #$50 ; BL_ADR0
mva #duszki_vbxe&$ff (fx_ptr),y+ ; BL_ADR0 ;najmlodszy bajt adresu
mva #[duszki_vbxe>>8]&$ff (fx_ptr),y+ ; BL_ADR1 ;nastepne bajty adresu
mva #duszki_vbxe>>16 (fx_ptr),y+ ; BL_ADR2
mva #1 (fx_ptr),y ; BLITTER_START ;wykonaj
rts
tab_vscrol0
.rept 4,#*2520
dta a(adz0&$3fff+:1)
.endr
.rept 4,#*2520
dta a(adz4&$3fff+$4000+:1)
.endr
//rysuj pasek mapa=pom , x=nr paska
draw_ekran
@ lda vcount
cmp #41
;bne @-
ldy #$5d
mva #$80+[cp_znaki_vbxe >> 14] (fx_ptr),y
mwa mapa_ad $4000+[cp_znaki_vbxe& $3fff] ;adres linii mapy , skad bedzie pobierac znaki
lda vscrol1
asl
tax
lda tab_vscrol0,x
pha
sta $4000+[cp_znaki_vbxe& $3fff]+21
lda tab_vscrol0+1,x
tax
sta $4001+[cp_znaki_vbxe& $3fff]+21
pla
clc
adc #1
bcc *+4
inx
clc
sta $4000+[cp_znaki_vbxe& $3fff]+42
stx $4001+[cp_znaki_vbxe& $3fff]+42
clc
adc #1
bcc *+3
inx
sta $4000+[cp_znaki_vbxe& $3fff]+63
stx $4001+[cp_znaki_vbxe& $3fff]+63
mva level_m $4010+[cp_znaki_vbxe& $3fff]+84 ;która mapa 00=0,40=1,80=2,c0=3
mva level_s $4010+[cp_znaki_vbxe& $3fff]+105 ;ktora czworka map 6=0,1,2,3 7=4,5,6,7
mva #0 (fx_ptr),y
//wlacz blit'a
ldy #$50 ; BL_ADR0
mva #cp_znaki_vbxe&$ff (fx_ptr),y+ ; BL_ADR0 ;najmlodszy bajt adresu
mva #[cp_znaki_vbxe>>8]&$ff (fx_ptr),y+ ; BL_ADR1 ;nastepne bajty adresu
mva #cp_znaki_vbxe>>16 (fx_ptr),y+ ; BL_ADR2
mva #1 (fx_ptr),y ; BLITTER_START ;wykonaj
rts
SCREEN_MAIN_TITLE
jsr clear_screen
jsr wait_vbl1
ldy #$40
mva #1 (fx_ptr),y
jsr clear_screen_vbxe
jsr cleanup_sprites
//wyczysc duszki
;mva #0 colbak ;czarne tło
;sta colpf2
;mva #$08 colpf1
; HACK: Sets level number to LVL2 in order to use the charset from $D000 ?
lda #$02 ;#%00000010
sta LEVEL_NR
lda #$11
sta sprites_size
LDX #$00 ;#%00000000
@ LDA #$48 ;Sprite Y position
STA SPRITES_Y05,X ;pozycja Y dszków
LDA _MS_SPRITES_X_LO05,X ;pozycja X duszka mlodszy bajt
STA SPRITES_X_LO05,X
LDA _MS_SPRITES_PTR05,X
STA SPRITES_PTR05,X
LDA _MS_SPRITES_X_HI05,X
STA SPRITES_X_HI05,X
LDA #$00 ;#%00000000
STA SPRITES_DELTA_X05,X
STA SPRITES_DELTA_Y05,X
LDA #$10 ;anim_type_10: void
STA SPRITES_TYPE05,X
LDA #$08-1 ;orange
STA SPRITES_COLOR05,X
LDA #$00 ;#%00000000
STA SPRITES_BKG_PRI05,X