-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathcode.s
More file actions
7424 lines (6570 loc) · 362 KB
/
Copy pathcode.s
File metadata and controls
7424 lines (6570 loc) · 362 KB
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
; Load Address: $2ffc
; File Size: $9df
; File End: $cdf3
;
; Memory Map
;
; Content Start End Length
; ----------------------------------------------------------
; Loader $00000800
; Code $00002ffc $0000cd73 $00009df7
; Data $0001fffc $0002a41a $0000a41e
; Data2 (mobile) $0002a416 $00050043 $00025c2d
; Data4 (wing) $0002a416 $00056819 $0002c403
; Stack $0005c1f0 $00056819 (largest area of free mem - 59d7 bytes (22,999 decimal)
; Display $0005c200 $00068000 $0000be00
; Music $00068f7c $0007c60e $00013692
; Panel $0007c7fc $00080000 $00003804
;
; Notes:
; The memory map for these levels are packed full of data.
;
section code_iff,code_c
;--------------------- includes and constants ---------------------------
INCDIR "include"
INCLUDE "hw.i"
TEST_BUILD_LEVEL EQU 1
;TEST_BATMOBILE EQU 1 ; comment out to test Batwing
IFD TEST_BUILD_LEVEL
BATMOBILE_TIMERVALUE EQU $6000 ; 60 minutes on the timer for testing
BATWING_TIMERVALUE EQU $6000 ; 60 minutes on the timer for testing
ELSE
BATMOBILE_TIMERVALUE EQU $6000 ; Original minutes on the timer for testing
BATWING_TIMERVALUE EQU $6000 ; Original minutes on the timer for testing
ENDC
IFND TEST_BUILD_LEVEL
org $2ffc ; original load address
ENDC
; Loader Constants
LOADER_TITLE_SCREEN EQU $00000820 ; Load Title Screen
LOADER_LEVEL_1 EQU $00000824 ; Load Level 1
LOADER_LEVEL_2 EQU $00000828 ; Load Level 2
LOADER_LEVEL_3 EQU $0000082c ; Load Level 3
LOADER_LEVEL_4 EQU $00000830 ; Load Level 4
LOADER_LEVEL_5 EQU $00000834 ; Load Level 5
; test/release constants
DISPLAY_BUFFER_SIZE EQU $be00
DISPLAY_BUFFER_SIZE_W EQU DISPLAY_BUFFER_SIZE/2
DISPLAY_BUFFER_SIZE_L EQU DISPLAY_BUFFER_SIZE/4
DISPLAY_BITPLANE_SIZE EQU $000017c0 ; 6080 bytes (6080/40 = 152)
IFND TEST_BUILD_LEVEL
STACK_TOP EQU $0005c1f0
DISPLAY_BUFFER EQU $0005c200
DISPLAY_BUFFER_1 EQU DISPLAY_BUFFER
DISPLAY_BUFFER_2 EQU DISPLAY_BUFFER+(DISPLAY_BUFFER_SIZE/2)
ENDC
IFD TEST_BUILD_LEVEL
STACK_TOP EQU stack_address
DISPLAY_BUFFER EQU display_buffer
DISPLAY_BUFFER_1 EQU DISPLAY_BUFFER
DISPLAY_BUFFER_2 EQU DISPLAY_BUFFER+$5f00
ENDC
IFD TEST_BUILD_LEVEL
DATA_ADDRESS EQU L0001fffc
ELSE
DATA_ADDRESS EQU $0001fffc
ENDC
DATA_OFFSET_0 EQU DATA_ADDRESS+$4 ; $00020000 - $0001fffc = $4
DATA_OFFSET_1 EQU DATA_ADDRESS+$4b04 ; $00024b00 - $0001fffc = $4b04
DATA_OFFSET_2 EQU DATA_ADDRESS+$6bea ; $00026be6 - $0001fffc = $6bea
DATA_OFFSET_3 EQU DATA_ADDRESS+$8804 ; $00028800 - $0001fffc = $8804
DATA_OFFSET_4 EQU DATA_ADDRESS+$5504 ; $00025500 - $0001fffc = $5504
DATA_OFFSET_5 EQU DATA_ADDRESS+$6048 ; $00026044 - $0001fffc = $6048
DATA_OFFSET_6 EQU DATA_ADDRESS+$6538 ; $00026534 - $0001fffc = $6538
; DATA2.IFF/DATA4.IFF - Constants
IFND TEST_BUILD_LEVEL
DATA24_ADDRESS EQU $0002a416
ENDC
IFD TEST_BUILD_LEVEL
DATA24_ADDRESS EQU L0002a416
ENDC
; sorted by address location
DATA24_OFFSET_0 EQU DATA24_ADDRESS+$4 ; $0002a41a - $2a416 = ; start address
DATA24_OFFSET_7 EQU DATA24_ADDRESS+$b49a ; $000358b0 - $2a416 = $b49a
DATA24_OFFSET_6 EQU DATA24_ADDRESS+$b936 ; $00035d4c - $2a416 = $b936
DATA24_OFFSET_5 EQU DATA24_ADDRESS+$be18 ; $0003622e - $2a416 = $be18
DATA24_OFFSET_9 EQU DATA24_ADDRESS+$cbb2 ; $00036fc8 - $2a416 = $cbb2
DATA24_OFFSET_23 EQU DATA24_ADDRESS+$d8cc ; $00037ce2 - $2a416 = $d8cc
DATA24_OFFSET_24 EQU DATA24_ADDRESS+$d90c ; $00037d22 - $2a416 = $d90c
DATA24_OFFSET_25 EQU DATA24_ADDRESS+$d93c ; $00037d52 - $2a416 = $d93c
DATA24_OFFSET_26 EQU DATA24_ADDRESS+$d96c ; $00037d82 - $2a416 = $d96c
DATA24_OFFSET_27 EQU DATA24_ADDRESS+$d98c ; $00037da2 - $2a416 = $d98c
DATA24_OFFSET_28 EQU DATA24_ADDRESS+$d9ac ; $00037dc2 - $2a416 = $d9ac
DATA24_OFFSET_31 EQU DATA24_ADDRESS+$d9cc ; $00037de2 - $2a416 = $d9cc
DATA24_OFFSET_29 EQU DATA24_ADDRESS+$d9dc ; $00037df2 - $2a416 = $d9dc
DATA24_OFFSET_30 EQU DATA24_ADDRESS+$d9fc ; $00037e12 - $2a416 = $d9fc
DATA24_OFFSET_11 EQU DATA24_ADDRESS+$e34a ; $00038760 - $2a416 = $e34a
DATA24_OFFSET_12 EQU DATA24_ADDRESS+$ec7c ; $00039092 - $2a416 = $ec7c
DATA24_OFFSET_17 EQU DATA24_ADDRESS+$eccc ; $000390e2 - $2a416 = $eccc
DATA24_OFFSET_13 EQU DATA24_ADDRESS+$f810 ; $00039c26 - $2a416 = $f810
DATA24_OFFSET_18 EQU DATA24_ADDRESS+$fcac ; $0003a0c2 - $2a416 = $fcac
DATA24_OFFSET_14 EQU DATA24_ADDRESS+$100ca ; $0003a4e0 - $2a416 = $100ca
DATA24_OFFSET_15 EQU DATA24_ADDRESS+$10c4a ; $0003b060 - $2a416 = $10c4a
DATA24_OFFSET_19 EQU DATA24_ADDRESS+$1131c ; $0003b732 - $2a416 = $1131c
DATA24_OFFSET_16 EQU DATA24_ADDRESS+$117de ; $0003bbf4 - $2a416 = $117de
DATA24_OFFSET_20 EQU DATA24_ADDRESS+$12c8e ; $0003d0a4 - $2a416 = $12c8e
DATA24_OFFSET_8 EQU DATA24_ADDRESS+$12dfe ; $0003d214 - $2a416 = $12dfe
DATA24_OFFSET_1 EQU DATA24_ADDRESS+$13aaa ; $0003dec0 - $2a416 = $13aaa
DATA24_OFFSET_21 EQU DATA24_ADDRESS+$1404c ; $0003e462 - $2a416 = $1404c
DATA24_OFFSET_22 EQU DATA24_ADDRESS+$169ea ; $00040e00 - $2a416 = $169ea
DATA24_OFFSET_10 EQU DATA24_ADDRESS+$1817c ; $00042592 - $2a416 = $1817c
DATA24_OFFSET_2 EQU DATA24_ADDRESS+$1b812 ; $00045c28 - $2a416 = $1b812
DATA24_OFFSET_3 EQU DATA24_ADDRESS+$1a230 ; $00044646 - $2a416 = $1a230
DATA24_OFFSET_4 EQU DATA24_ADDRESS+$21fe8 ; $0004c3fe - $2a416 = $21fe8
IFD TEST_BUILD_LEVEL
stack_address
code_start
IFD TEST_BATMOBILE
jmp start_batmobile
ELSE
jmp start_batwing
ENDC
ENDC
L00002ffc dc.l $00002ffc
colourtest dc.w $0000
; -------------- start batmobile level ------------
start_batmobile ; original address $00003000
L00003000 bra.b L00003010
; --------------- start/set batwing level ---------------
start_batwing ; original address $00003002
L00003002 move.w #$0001,game_type ; L00008d1e ; batwing = 1
L0000300a jmp start_common ; L0000301e
; -------------- set batmobile level --------------
set_batmobile ; original address $00003010
L00003010 move.w #$0000,game_type ; L00008d1e ; batmobile = 0
L00003018 jmp start_common ; L0000301e
; -------------- common startup code --------------
start_common ; original address $0000301e
;jsr _DEBUG_COLOURS
L0000301e moveq #$00,d0
L00003020 move.w #$7fff,CUSTOM+INTENA ; $00dff09a
L00003028 move.w #$1fff,CUSTOM+DMACON ; $00dff096
L00003030 move.w #$0200,CUSTOM+BPLCON0 ; $00dff100
L00003038 move.l d0,CUSTOM+BPLCON1 ; $00dff102
L0000303e move.w #$4000,CUSTOM+DSKLEN ; $00dff024
L00003046 move.l d0,CUSTOM+BLTCON0 ; $00dff040
L0000304c move.w #$0041,CUSTOM+BLTSIZE ; $00dff058 *** WHY! ***
L00003054 move.w #$834f,CUSTOM+DMACON ; $00dff096 - ENABLE,BITPLANE,DMAEN,BLITTER,AUDIO
L0000305c move.w #$7fff,CUSTOM+ADKCON ; $00dff09e
; reset sprites
L00003064 moveq #$07,d7
L00003066 lea.l CUSTOM+SPR0POS,a0 ; $00dff140,a0
L0000306c_loop move.w d0,(a0)
L0000306e addq.w #$08,a0
L00003070 dbf.w d7,L0000306c_loop
; reset audio
L00003074 moveq #$03,d7
L00003076 lea.l CUSTOM+AUD0VOL,a0 ; $00dff0a8,a0
L0000307c_loop move.w d0,(a0)
L0000307e lea.l $0010(a0),a0
L00003082 dbf.w d7,L0000307c_loop
; reset colours
L00003086 lea.l CUSTOM+COLOR00,a0 ; $00dff180,a0
L0000308c moveq #$1f,d7
L0000308e_loop move.w d0,(a0)+
L00003090 dbf.w d7,L0000308e_loop
; init CIAA & CIAB
L00003094 move.b #$7f,$00bfed01
L0000309c move.b d0,$00bfee01
L000030a2 move.b d0,$00bfef01
L000030a8 move.b d0,$00bfe001
L000030ae move.b #$03,$00bfe201
L000030b6 move.b d0,$00bfe101
L000030bc move.b #$ff,$00bfe301
L000030c4 move.b #$7f,$00bfdd00
L000030cc move.b d0,$00bfde00
L000030d2 move.b d0,$00bfdf00
L000030d8 move.b #$c0,$00bfd000
L000030e0 move.b #$c0,$00bfd200
L000030e8 move.b #$ff,$00bfd100
L000030f0 move.b #$ff,$00bfd300
; init stack
L000030f8 lea.l STACK_TOP,a7 ; $0005c1f0,a7 ; stack
L000030fe jsr L0000310a
pea.l L0000310a
L00003104 jmp AUDIO_PLAYER_INIT ; $00068f80 ; music
; return here (pea.l L0000310a)
; init interrupt autovectors
L0000310a moveq #$02,d7 ; only level 1 - 3 handlers are initialised
L0000310c lea.l L000031ba,a0
L00003112 lea.l $00000064,a1 ; level 1 autovector
L00003118 move.l (a0)+,(a1)+
L0000311a dbf.w d7,L00003118
; more JOYDAT and CIA init
L0000311e move.w #$ff00,CUSTOM+POTGO ; $00dff034
L00003126 move.w d0,CUSTOM+JOYTEST ; $00dff036
L0000312c or.b #$ff,$00bfd100
L00003134 and.b #$87,$00bfd100
L0000313c and.b #$87,$00bfd100
L00003144 or.b #$ff,$00bfd100
L0000314c move.b #$f0,$00bfe601
L00003154 move.b #$37,$00bfeb01
L0000315c move.b #$11,$00bfef01
L00003164 move.b #$91,$00bfd600
L0000316c move.b d0,$00bfdb00
L00003172 move.b d0,$00bfdf00
L00003178 move.w #$7fff,CUSTOM+INTREQ ; $00dff09c
L00003180 tst.b $00bfed01
L00003186 move.b #$8a,$00bfed01
L0000318e tst.b $00bfdd00
L00003194 move.b #$93,$00bfdd00
L0000319c move.w #$e078,CUSTOM+INTENA ; $00dff09a - (PORTS 2, COPER,VERTB,BLIT 3)
L000031a4 bsr.w clear_display_memory ; L00003810
L000031a8 lea.l copper_list,a0 ; L000031d2,a0
L000031ae bsr.w initialise_display ; L00003758
L000031b2 bsr.w double_buffer_display ; L000037c8
L000031b6 bra.w initalise_game ; L00003822
; --------------- interrupt handler table -------------
interrupt_handler_table ; original address $000031ba
L000031ba dc.l level1_interrupt_handler ; L00003306 ; level 1 interrupt handler
dc.l level2_interrupt_handler ; L0000333e ; level 2 interrupt handler
dc.l level3_interrupt_handler ; L00003364 ; level 3 interrupt handler
dc.l level4_interrupt_handler ; L000033a0 ; level 4 interrupt handler - unused
L000031ca dc.l level5_interrupt_handler ; L000033b6 ; level 5 interrupt handler - unused
dc.l level6_interrupt_handler ; L000033dc ; level 6 interrupt handler - unused
even
; ----------------- copper list -----------------------
copper_list ; original address $000031d2
L000031d2 dc.w $400f,$fffe
dc.w $00e0
L000031d8 dc.w $0000
L000031da dc.w $00e2
L000031dc dc.w $0000
dc.w $00e4
L000031e0 dc.w $0000
dc.w $00e6
L000031e4 dc.w $0000
dc.w $00e8
L000031e8 dc.w $0000
L000031ea dc.w $00ea
L000031ec dc.w $0000
dc.w $00ec
L000031f0 dc.w $0000
dc.w $00ee
L000031f4 dc.w $0000
bgcolour dc.w $0180,$0000
L000031fa dc.w $0182,$0002
dc.w $0184,$0888
dc.w $0186,$0eee
dc.w $0188,$0060
L0000320a dc.w $018a,$0800
dc.w $018c,$0c00
dc.w $018e,$0ccc
dc.w $0190,$0aaa
L0000321a dc.w $0192,$0666
dc.w $0194,$0000
dc.w $0196,$0c60
dc.w $0198,$0ea2
L0000322a dc.w $019a,$0ee0
dc.w $019c,$0ee8
dc.w $019e,$0444
; city sky blue fade
dc.w $460f,$fffe
L0000323a dc.w $0182,$0003
dc.w $4b0f,$fffe
dc.w $0182,$0004
dc.w $500f,$fffe
L0000324a dc.w $0182,$0005
dc.w $550f,$fffe
dc.w $0182,$0006
dc.w $5a0f,$fffe
L0000325a dc.w $0182,$0007
dc.w $5f0f,$fffe
dc.w $0182,$0008
dc.w $640f,$fffe
L0000326a dc.w $0182,$0009
dc.w $690f,$fffe
dc.w $0182,$000a
; v-wait for horizon colour change?
copper_horizon_wait ; original address L00003276
L00003276 dc.w $600f,$fffe
L0000327a dc.w $0182,$0333
; Panel bitplane ptrs & colours
dc.w $d90f,$fffe
copper_panel_planes dc.w $00e0,$0007
dc.w $00e2,$c89a
L0000328a dc.w $00e4,$0007
dc.w $00e6,$d01a
dc.w $00e8,$0007
dc.w $00ea,$d79a
L0000329a dc.w $00ec,$0007
dc.w $00ee,$df1a
copper_panel_colours
dc.w $0180,$0000
dc.w $0182,$0000
dc.w $0184,$0000
dc.w $0186,$0000
dc.w $0188,$0000
dc.w $018a,$0000
dc.w $018c,$0000
dc.w $018e,$0000
dc.w $0190,$0000
dc.w $0192,$0000
dc.w $0194,$0000
dc.w $0196,$0000
dc.w $0198,$0000
dc.w $019a,$0000
dc.w $019c,$0000
dc.w $019e,$0000
; colours (panel fade in/out)
panel_colours ; original address $000032e6
L000032e6 dc.w $0000,$0060
L000032ea dc.w $0fff,$0008,$0a22,$0444,$0862,$0666,$0888,$0aaa
L000032fa dc.w $0a40,$0c60,$0e80,$0ea0,$0ec0,$0eee
; -------------------- level 1 interrupt handler --------------------
; installed as the level 1 autovector interrupt handler.
level1_interrupt_handler ; original address $00003306
L00003306 move.l d0,-(a7)
L00003308 move.w CUSTOM+INTREQR,d0 ; $00dff01e,d0
L0000330e btst.l #$0002,d0 ; SOFTINT
L00003312 bne.b softint_interrupt ; L00003332 ; clear SOFTINT and exit
L00003314 btst.l #$0001,d0 ; DSKBLK
L00003318 bne.b dskblk_interrupt ; L00003326 ; clear DSKBLK and exit
tbe_interrupt
L0000331a move.w #$0001,CUSTOM+INTREQ ; $00dff09c ; clear TBE and exit
L00003322 move.l (a7)+,d0
L00003324 rte
dskblk_interrupt
L00003326 move.w #$0002,CUSTOM+INTREQ ; $00dff09c ; clear DSKBLK and exit
L0000332e move.l (a7)+,d0
L00003330 rte
softint_interrupt
L00003332 move.w #$0004,CUSTOM+INTREQ ; $00dff09c ; clear SOFTINT and exit
L0000333a move.l (a7)+,d0
L0000333c rte
; -------------------- level 2 interrupt handler --------------------
; installed as the level 2 autovector interrupt handler.
level2_interrupt_handler ; original address $0000333e
L0000333e move.l d0,-(a7)
L00003340 move.b $00bfed01,d0
L00003346 bpl.b not_ciaa_interrupt ; L00003358 ; not CIAA interrupt (clear PORTS and exit)
L00003348 bsr.w handle_ciaa_interrupt ; L0000341a ; handle CIAA interrupt
L0000334c move.w #$0008,CUSTOM+INTREQ ; $00dff09c ; clear PORTS and exit
L00003354 move.l (a7)+,d0
L00003356 rte
not_ciaa_interrupt
L00003358 move.w #$0008,CUSTOM+INTREQ ; $00dff09c ; clear PORTS and exit
L00003360 move.l (a7)+,d0
L00003362 rte
; -------------------- level 3 interrupt handler --------------------
; installed as the level 3 autovector interrupt handler.
level3_interrupt_handler ; original address $00003364
L00003364 move.l d0,-(a7)
L00003366 move.w CUSTOM+INTREQR,d0 ; $00dff01e,d0 ; intreqr
L0000336c btst.l #$0004,d0 ; COPER
L00003370 bne.b coper_interrupt ; L00003394
L00003372 btst.l #$0005,d0 ; VERTB
L00003376 bne.b vertb_interrupt ; L00003384
blit_interrupt
L00003378 move.w #$0040,CUSTOM+INTREQ ; $00dff09c ; clear BLIT and exit
L00003380 move.l (a7)+,d0
L00003382 rte
vertb_interrupt
L00003384 bsr.w vertb_interrupt_handler ; L00003568 ; handle VERTB
L00003388 move.w #$0020,CUSTOM+INTREQ ; $00dff09c ; clear VERTB and exit
L00003390 move.l (a7)+,d0
L00003392 rte
coper_interrupt
L00003394 move.w #$0010,CUSTOM+INTREQ ; $00dff09c ; clear COPER and exit
L0000339c move.l (a7)+,d0
L0000339e rte
; -------------------- level 4 interrupt handler --------------------
; unused
level4_interrupt_handler ; original address L000033a0
jsr _DEBUG_ERROR ; if called will hold on a flashing screen
L000033a0 move.l d0,-(a7)
L000033a2 move.w CUSTOM+INTREQR,d0 ; $00dff01e,d0
L000033a8 and.w #$0780,d0 ; clear audio interrupts
L000033ac move.w d0,CUSTOM+INTENA ; $00dff09a - disable audio interrupts
L000033b2 move.l (a7)+,d0
L000033b4 rte
; -------------------- level 5 interrupt handler --------------------
; unused
level5_interrupt_handler ; original address $000033b6
jsr _DEBUG_ERROR ; if called will hold on a flashing screen
L000033b6 move.l d0,-(a7)
L000033b8 move.w CUSTOM+INTREQR,d0 ; $00dff01e,d0
L000033be btst.l #$000c,d0 ; DSKSYN
L000033c2 bne.b dsksyn_interrupt ; L000033d0
L000033c4 move.w #$0800,CUSTOM+INTREQ ; $00dff09c ; clear RBF (serial buffer interrupt)
L000033cc move.l (a7)+,d0
L000033ce rte
dsksyn_interrupt
L000033d0 move.w #$1000,CUSTOM+INTREQ ; $00dff09c ; Clear DISKSYN and exit
L000033d8 move.l (a7)+,d0
L000033da rte
; -------------------- level 6 interrupt handler --------------------
; unused
level6_interrupt_handler ; original address $000033dc
jsr _DEBUG_ERROR
L000033dc move.l d0,-(a7)
L000033de move.w CUSTOM+INTREQR,d0 ; $00dff01e,d0
L000033e4 btst.l #$000e,d0 ; INTEN (h/w ref says enable only - don't think this is ever set on read)
L000033e8 bne.b inten_interrupt ; L0000340e
L000033ea move.b $00bfdd00,d0
L000033f0 bpl.b not_ciab_interrupt ; L00003402
L000033f2 bsr.w ciab_interrupt_handler ; L0000355a
L000033f6 move.w #$2000,CUSTOM+INTREQ ; $00dff09c ; clear EXTER (CIAB & disk index flag)
L000033fe move.l (a7)+,d0
L00003400 rte
not_ciab_interrupt
L00003402 move.w #$2000,CUSTOM+INTREQ ; $00dff09c ; clear EXTER (CIAB & disk index flag)
L0000340a move.l (a7)+,d0
L0000340c rte
inten_interrupt
L0000340e move.w #$4000,CUSTOM+INTREQ ; $00dff09c ; clear INTEN (doesnt make sense)
L00003416 move.l (a7)+,d0
L00003418 rte
; ----------------- handle CIAA interrupt --------------
handle_ciaa_interrupt ; original address $0000341a
L0000341a lsr.b #$02,d0
L0000341c bcc.b L00003422
L0000341e bsr.w L0000361e
L00003422 lsr.b #$02,d0
L00003424 bcc.b L00003494
L00003426 movem.l d1-d2/a0,-(a7)
L0000342a move.b $00bfec01,d1
L00003430 not.b d1
L00003432 lsr.b #$01,d1
L00003434 bcc.b L0000344c
L00003436 lea.l L0000353a,a0
L0000343c ext.w d1
L0000343e move.b L00003496(pc,d1.w),d1
L00003442 move.w d1,d2
L00003444 lsr.w #$03,d2
L00003446 bclr.b d1,$00(a0,d2.w)
L0000344a bra.b L00003488
L0000344c lea.l L0000353a,a0
L00003452 ext.w d1
L00003454 move.b L00003496(pc,d1.w),d1
L00003458 move.w d1,d2
L0000345a lsr.w #$03,d2
L0000345c bset.b d1,$00(a0,d2.w)
L00003460 tst.b d1
L00003462 beq.b L00003488
L00003464 lea.l L00003516,a0
L0000346a move.w L00003536,d2
L00003470 move.b d1,$00(a0,d2.w)
L00003474 addq.w #$01,d2
L00003476 and.w #$001f,d2
L0000347a cmp.w L00003538,d2
L00003480 beq.b L00003488
L00003482 move.w d2,L00003536
L00003488 move.b #$40,$00bfee01
L00003490 movem.l (a7)+,d1-d2/a0
L00003494 rts
L00003496 dc.w $2731,$3233,$3435,$3637,$3839,$302d,$3d5c,$0030 ;'1234567890-=\.0
L000034a6 dc.w $5157,$4552,$5459,$5549,$4f50,$5b5d,$0031,$3233 ;qwertyuiop[].123
L000034b6 dc.w $4153,$4446,$4748,$4a4b,$4c3b,$2300,$0034,$3536 ;asdfghjkl;#..456
L000034c6 dc.w $005a,$5843,$5642,$4e4d,$2c2e,$2f00,$0037,$3839 ;.zxcvbnm,./..789
L000034d6 dc.w $2008,$090d,$0d1b,$7f00,$0000,$2d00,$8c8d,$8e8f ; .........-.....
L000034e6 dc.w $8182,$8384,$8586,$8788,$898a,$2829,$2f2a,$2b8b ;..........()/*+.
L000034f6 dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ;................
L00003506 dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ;................
L00003516 dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ;................
L00003526 dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ;................
L00003536 dc.w $0000
L00003538 dc.w $0000
L0000353a dc.w $0000,$0000,$0000,$0000,$0000,$0000 ;................
L00003546 dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000 ;................
L00003556 dc.w $0000,$0000
; ----------------- ciab interrupt handler -----------------
; $d0 - CIAB - ICR (interrupt control register)
ciab_interrupt_handler ; original address $0000355a
L0000355a lsr.b #$02,d0
L0000355c bcc.b L00003566
L0000355e move.b #$00,$00bfee01 ; is CIAB timer B - set CIAA - Control Register A (stop CIAA timer A)
L00003566 rts
; ----------------- vertb interrupt handler -----------------
; called from level 3 interrupt handler when VERTB interrupt
; is generated.
vertb_interrupt_handler ; original address L00003568
L00003568 movem.l d0-d7/a0-a6,-(a7)
; set copper display bitplanes
L0000356c move.l display_buffer1_ptr,d0 ; L000037c0,d0
L00003572 move.w d0,L000031dc
L00003578 swap.w d0
L0000357a move.w d0,L000031d8
L00003580 swap.w d0
L00003582 add.l #DISPLAY_BITPLANE_SIZE,d0 ; #$000017c0,d0
L00003588 move.w d0,L000031e4
L0000358e swap.w d0
L00003590 move.w d0,L000031e0
L00003596 swap.w d0
L00003598 add.l #DISPLAY_BITPLANE_SIZE,d0 ;$000017c0,d0
L0000359e move.w d0,L000031ec
L000035a4 swap.w d0
L000035a6 move.w d0,L000031e8
L000035ac swap.w d0
L000035ae add.l #DISPLAY_BITPLANE_SIZE,d0 ;$000017c0,d0
L000035b4 move.w d0,L000031f4
L000035ba swap.w d0
L000035bc move.w d0,L000031f0
L000035c2 addq.w #$01,frame_counter ; L000037bc
L000035c8 tst.w L00008d20
L000035ce bne.b L00003604 ; update music/sfx and exit
; update score panel
L000035d0 ;; pea.l L000035dc
L000035d6 jsr PANEL_UPDATE ; panel
; return to here (pea.l L000035dc)
L000035dc tst.w L00008d32
L000035e2 bne.b L00003604 ; update music/sfx and exit
L000035e4 move.w L00008f6e,d0
L000035ea neg.w d0
L000035ec move.w #$02ee,d1
L000035f0 tst.w game_type ; L00008d1e (batwing = 1, batmobile = 0)
L000035f6 beq.b L000035fc
L000035f8 move.w #$0384,d1
L000035fc add.w d1,d0
L000035fe ;move.w d0,AUDIO_OFFSET_L000690f0 ; $000690f0 ; music
L00003604
;;;pea.l L00003610
L0000360a ;jsr AUDIO_PLAYER_UPDATE ; $00068f98 ; music
L00003610 move.b #$00,$00bfee01 ; Clear CIAA control register A - stop CIAA timer A
L00003618 movem.l (a7)+,d0-d7/a0-a6
L0000361c rts
L0000361e movem.l d0-d7/a0-a6,-(a7)
L00003622 bsr.w L00003634
L00003626 addq.w #$01,L00003632
L0000362c movem.l (a7)+,d0-d7/a0-a6
L00003630 rts
L00003632 dc.w $0000
L00003634 dc.w $3039
L00003636 dc.w $00df
L00003638 dc.w $f00a
L0000363a move.w L000036fe,d1
L00003640 move.w d0,L000036fe
L00003646 bsr.w L000036c8
L0000364a move.b d0,L00003705
L00003650 add.w d1,L00003714
L00003656 add.w d2,L00003716
L0000365c btst.b #$0006,$00bfe001
L00003664 seq.b L00003704
L0000366a seq.b L00003712
L00003670 btst.b #$0002,$00dff016 ; POTGOR
L00003678 seq.b L00003713
L0000367e move.w CUSTOM+JOY1DAT,d0 ; $00dff00c,d0
L00003684 move.w L00003700,d1
L0000368a move.w d0,L00003700
L00003690 bsr.b L000036c8
L00003692 move.b d0,L00003709
L00003698 add.w d1,L0000371a
L0000369e add.w d2,L0000371c
L000036a4 btst.b #$0007,$00bfe001
L000036ac seq.b L00003708
L000036b2 seq.b L00003718
L000036b8 btst.b #$0006,$00dff016 ; POTGOR
L000036c0 seq.b L00003719
L000036c6 rts
L000036c8 move.w d0,d3
L000036ca move.w d1,d2
L000036cc sub.b d3,d1
L000036ce neg.b d1
L000036d0 ext.l d1
L000036d2 lsr.w #$08,d2
L000036d4 lsr.w #$08,d3
L000036d6 sub.b d3,d2
L000036d8 neg.b d2
L000036da ext.l d2
L000036dc moveq #$03,d3
L000036de and.w d0,d3
L000036e0 lsr.w #$06,d0
L000036e2 and.w #$000c,d0
L000036e6 or.w d3,d0
L000036e8 move.b L000036ee(pc,d0.w),d0
L000036ec rts
L000036ee dc.w $0002,$0a08
L000036f2 dc.w $0103
L000036f4 dc.w $0b09,$0507
L000036f8 dc.w $0f0d,$0406
L000036fc dc.w $0e0c
L000036fe dc.w $0000
L00003700 dc.w $0000
L00003702 dc.w $0000
L00003704 dc.b $00
L00003705 dc.b $00
L00003706 dc.w $0000
L00003708 dc.b $00
L00003709 dc.b $00
L0000370a dc.w $0000,$0000
L0000370e dc.w $0000,$0000
L00003712 dc.b $00
L00003713 dc.b $00
L00003714 dc.w $0000
L00003716 dc.w $0000
L00003718 dc.b $00
L00003719 dc.b $00
L0000371a dc.w $0000
L0000371c dc.w $0000
L0000371e move.l d0,-(a7)
L00003720 bsr.b L00003728
L00003722 bne.b L00003720
L00003724 move.l (a7)+,d0
L00003726 rts
L00003728 movem.l d1-d2/a0,-(a7)
L0000372c lea.l L00003516,a0
L00003732 moveq #$00,d0
L00003734 movem.w L00003536,d1-d2
L0000373c cmp.w d1,d2
L0000373e beq.b L00003750
L00003740 move.b $00(a0,d2.w),d0
L00003744 addq.w #$01,d2
L00003746 and.w #$001f,d2
L0000374a move.w d2,L00003538
L00003750 tst.b d0
L00003752 movem.l (a7)+,d1-d2/a0
L00003756 rts
;----------------- initialise display -------------------
; a0 = copper_list
;
initialise_display ; original address $00003758
L00003758 move.w #$0080,CUSTOM+DMACON ; $00dff096 - Disable COPPER
L00003760 move.l a0,CUSTOM+COP1LC ; $00dff080 ; copper list
L00003766 move.w a0,CUSTOM+COPJMP1 ; $00dff088 ; copper strobe
L0000376c move.w #$0038,CUSTOM+DDFSTRT ; $00dff092
L00003774 move.w #$00d0,CUSTOM+DDFSTOP ; $00dff094
L0000377c move.w #$4181,CUSTOM+DIWSTRT ; $00dff08e
L00003784 move.w #$09c1,CUSTOM+DIWSTOP ; $00dff090
L0000378c move.w #$0000,CUSTOM+BPL1MOD ; $00dff108
L00003794 move.w #$0000,CUSTOM+BPL2MOD ; $00dff10a
L0000379c move.w #$4200,CUSTOM+BPLCON0 ; $00dff100 - 4 bitplanes, Colour
; set bitplane ptrs if running a test build
IFD TEST_BUILD_LEVEL
move.l #DISPLAY_BUFFER_1,display_buffer1_ptr
move.l #DISPLAY_BUFFER_2,display_buffer2_ptr
lea copper_panel_planes,a0
move.l #PANEL_GFX,d0
move.w d0,6(a0)
swap.w d0
move.w d0,2(a0)
swap.w d0
add.l #PANEL_DISPLAY_BITPLANEBYTES,d0
move.w d0,$0e(a0)
swap.w d0
move.w d0,$0a(a0)
swap.w d0
add.l #PANEL_DISPLAY_BITPLANEBYTES,d0
move.w d0,$16(a0)
swap.w d0
move.w d0,$12(a0)
swap.w d0
add.l #PANEL_DISPLAY_BITPLANEBYTES,d0
move.w d0,$1e(a0)
swap.w d0
move.w d0,$1a(a0)
swap.w d0
ENDC
L000037a4 clr.w frame_counter ; L000037bc
L000037aa tst.w frame_counter ; L000037bc
L000037b0 beq.b L000037aa
L000037b2 move.w #$8180,CUSTOM+DMACON ; $00dff096 - Enable,Bitplane,Copper
L000037ba rts
; ----------- frame counter variables -----------
frame_and_target_counter ; original address $000037bc
frame_counter ; original address $000037bc
L000037bc dc.w $0000
target_frame_counter ; original address $000037be
L000037be dc.w $0002
;------------- display buffer ptrs -------------
display_buffer_ptrs ; original address $000037c0
display_buffer1_ptr ; original address $000037c0
L000037c0 dc.l DISPLAY_BUFFER_1 ; $0005c200 ; display buffer 1
display_buffer2_ptr ; original address $000037c4
L000037c4 dc.l DISPLAY_BUFFER_2 ; $00062100 ; display buffer 2
; ---------------- double buffer display ---------------
double_buffer_display ; original address $000037c8
L000037c8 move.w target_frame_counter,d0 ; L000037be,d0
L000037ce cmp.w frame_counter,d0 ; L000037bc,d0
L000037d4 bhi.b L000037ce
L000037d6 movem.l display_buffer_ptrs,d0-d1 ; L000037c0,d0-d1
L000037de exg.l d0,d1
L000037e0 movem.l d0-d1,display_buffer_ptrs ; L000037c0
L000037e8 move.w frame_counter,d0 ; L000037bc,d0
L000037ee cmp.w frame_counter,d0 ; L000037bc,d0
L000037f4 beq.b L000037ee
L000037f6 clr.w frame_counter ; L000037bc
L000037fc move.w L00008d3a,d0 ; horizon position?
L00003802 not.b d0
L00003804 add.b #$d9,d0 ; $d9 = 217 (-39)
L00003808 move.b d0,copper_horizon_wait ;L00003276 ; Copper Wait Instruction (vertical wait byte - does the horizon move up/down?)
L0000380e rts
; ----------------- clear display memory -----------------
clear_display_memory ; original address $00003810
L00003810 lea.l DISPLAY_BUFFER,a0 ; $0005c200,a0 ; external address
L00003816 move.w #DISPLAY_BUFFER_SIZE_L-1,d7 ; #$2f7f,d7
L0000381a clr.l (a0)+
L0000381c dbf.w d7,L0000381a
L00003820 rts
; -------------------- initialise game ---------------------
initalise_game ; original address $00003822
L00003822 pea.l L00003834
L00003828 pea.l PANEL_INIT_LIVES ; panel
L0000382e jmp PANEL_INIT_ENERGY ; panel
;return here (pea.l L00003834)
; test game type
L00003834 tst.w game_type ; L00008d1e (batwing = 1, batmobile = 0)
L0000383a bne.w batwing_start_level ; L000038ec
; ------------------- batmobile start level ------------------
batmobile_start_level ; original address L0000383e
L0000383e bsr.w panel_fade_in ; L00003de0
; draw intro text (back buffer)
L00003842 lea.l text_introduction,a0 ; L00003e74,a0
L00003848 bsr.w large_text_plotter ; L0000410a
; draw debug build text (back buffer)
lea.l text_test_build,a0
bsr.w small_text_plotter ; L0000410e
; Wipetext to display.
L0000384c bsr.w wipedisplay_backbuffer_to_front ; L00003d6c
L00003850 bsr.w initialise_batmobile_data ; L00008158
L00003854 bsr.w preshift_18_words ; L000074a4
L00003858 lea.l DATA24_OFFSET_1,a0 ; $0003dec0,a0 ; Data2/Data4 offset address $3dec0-$2a416=$13aaa
L0000385e lea.l DATA24_OFFSET_2,a1 ; $00045c28,a1 ; Data2/4 offset address $45c28-$2a416=$1b812
L00003864 bsr.w mirror_sprite_gfx ; L00007b20
L00003868 lea.l DATA_OFFSET_2,a0 ; $00026be6,a0 ; Data offset address $00026be6-$1fffc=$6bea
L0000386e lea.l DATA_OFFSET_3,a1 ; $00028800,a1 ; Data offset address $00028800=$1fffc=$8804
L00003874 bsr.w mirror_sprite_gfx ; L00007b20
L00003878 bsr.w panel_fade_in ; L00003de0
L0000387c move.w #$03e7,L00008d22 ; #$3e7 = 999 (Distance?)
L00003884 move.w #BATMOBILE_TIMERVALUE,d0
;move.w #$0500,d0 ; BCD Timer Start Value 05:00 minutes
L00003888 bsr.w clear_state_init_panel ; L00003986
; init unknown data values
L0000388c lea.l L00008d5c,a0
L00003892 move.w #$0091,$0010(a0)
L00003898 move.w #$00bc,$0030(a0)
L0000389e move.w #$0084,$002e(a0)
L000038a4 move.w #$0014,$002a(a0)
L000038aa move.w #$fffc,$002c(a0)
L000038b0 move.w #$0004,L00008d2c
L000038b8 move.w #$0008,L00008d2e
L000038c0 move.w #$0002,L00008d30
; Set (re)start distance to 999 or 500
L000038c8 move.w #$01f4,d0 ; #$1f4 = 500 (level mid-point distance)
L000038cc cmp.w L00008d22,d0
L000038d2 bcc.b L000038d8 ; if L00008d22 < 500 then
L000038d4 move.w #$03e7,d0 ; reset distance to 999
L000038d8 move.w d0,L00008d22
L000038de move.l #batmobile_section_list,road_section_list_ptr ;#L00008236,L0000907c ; set initial road data ptr
L000038e8 bra.w common_game_initialisation ; L000039aa
; --------------------- batwing start level --------------------------
batwing_start_level ; original address L000038ec
L000038ec bsr.w panel_fade_in ; L00003de0
L000038f0 lea.l text_gotham_carnival,a0 ; L00003ed0,a0
L000038f6 bsr.w large_text_plotter ; L0000410a
; draw debug build text (back buffer)
lea.l text_test_build,a0
bsr.w small_text_plotter
L000038fa bsr.w wipedisplay_backbuffer_to_front ; L00003d6c
L000038fe bsr.w preshift_18_words ; L000074a4
L00003902 lea.l DATA24_OFFSET_3,a0 ; $00044646,a0 ; Data2/4 offset $$00044646-$2a416=$1a230
L00003908 lea.l DATA24_OFFSET_4,a1 ; $0004c3fe,a1 ; Data2/4 offset $0004c3fe-$2a416=$21fe8
L0000390e bsr.w mirror_sprite_gfx ; L00007b20
L00003912 lea.l DATA_OFFSET_2,a0 ; $00026be6,a0 ; external address
L00003918 lea.l DATA_OFFSET_3,a1 ; $00028800,a1 ; external address
L0000391e bsr.w mirror_sprite_gfx ; L00007b20
L00003922 bsr.w initialise_batwing_data ; L000081ce
L00003926 move.w #$0064,L00008d24 ; Balloons to Pop? #$64 = 100
L0000392e move.w #BATWING_TIMERVALUE,d0
;move.w #$0300,d0 ; BCD Level Timer Value 03:00 minutes
L00003932 bsr.w clear_state_init_panel ; L00003986
; init unknown data values
L00003936 lea.l L00008d5c,a0
L0000393c move.w #$0064,$0010(a0)
L00003942 move.w #$0078,L00008f6e
L0000394a move.w #$00c6,$0030(a0)
L00003950 move.w #$0070,$002e(a0)
L00003956 move.w #$0001,$002a(a0)
L0000395c move.w #$ffec,$002c(a0)
; set (re)start balloon total (100 or 50)
L00003962 move.w #$0032,d0 ; d0 = #$32 = 50
L00003966 cmp.w L00008d24,d0
L0000396c bcc.b L00003972
L0000396e move.w #$0064,d0 ; reset balloons to 100
L00003972 move.w d0,L00008d24 ; set balloon total
L00003978 move.l #batwing_section_list,road_section_list_ptr ; #L00008266,L0000907c ; set initial road data ptr
L00003982 bra.w common_game_initialisation ; L000039aa
; ------------ clear level state and init the panel -------------
; This routine clears 888 bytes of state between $8d26 - $909e
; and initialises the panel timer with BCD value and player
; energy.
; IN:-
; d0.w = BCD Timer Value eg #$0300 = 03:00 minutes
;
clear_state_init_panel
L00003986 lea.l L00008d26,a0
L0000398c move.w #$01bb,d7 ; $1bb = (443 + 1 )* 2 = 888 bytes
L00003990_loop clr.w (a0)+
L00003992 dbf.w d7,L00003990_loop
L00003996 move.w #$0002,L00008d2a
L0000399e pea.l PANEL_INIT_ENERGY ; panel
L000039a4 jmp PANEL_INIT_TIMER ; panel
; init timer, init energy & return
; ------------------- common start level code ---------------
; common game initialisation code jumped to after
; batmobile or batwing specific initialisation.
;
common_game_initialisation
L000039aa bsr.w L00006a2c
L000039ae move.w #$0000,L00008d26
L000039b6 btst.b #PANEL_ST2_MUSIC_SFX,PANEL_STATUS_2 ;$0007c875 ; panel
L000039be bne.b L000039ce
L000039c0 moveq #$01,d0
L000039c2 pea.l L000039ce
L000039c8 jmp AUDIO_PLAYER_INIT_SONG ; $00068f90 ; music
; ------------------ game loop ---------------------
game_loop