-
Notifications
You must be signed in to change notification settings - Fork 0
/
ChaseHQ.ctl
12515 lines (12515 loc) · 410 KB
/
ChaseHQ.ctl
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
> $4000 ; ChaseHQ.skool
> $4000 ;
> $4000 ; This is a SkoolKit control file that disassembles the ZX Spectrum version
> $4000 ; of Chase H.Q. by Ocean Software. A home computer version of the arcade game
> $4000 ; by Taito Corporation.
> $4000 ;
> $4000 ; This documents the 48K version of game when it is in a "pristine" as-loaded
> $4000 ; state. It also covers a lot of the 128K code too, but doesn't yet describe any
> $4000 ; of the extra memory banks.
> $4000 ;
> $4000 ; Reverse engineering by David Thomas, 2023-2024.
> $4000 ;
> $4000 ;
> $4000 ; AUTHORS
> $4000 ; -------
> $4000 ; Code by John O'Brien aka JOBBEEE
> $4000 ; <https://www.mobygames.com/person/28679/john-obrien/>
> $4000 ;
> $4000 ; Graphics by Bill Harbison aka BILL aka Harbonaut
> $4000 ; <https://www.mobygames.com/person/31804/bill-harbison/>
> $4000 ;
> $4000 ; Music by Jonathan Dunn aka JON DUNN
> $4000 ; <https://www.mobygames.com/person/31702/jonathan-dunn/>
> $4000 ;
> $4000 ;
> $4000 ; ALTERNATIVE VERSIONS
> $4000 ; --------------------
> $4000 ; There's a demo version of Chase H.Q. on Sinclair User issue 94: Megatape 23.
> $4000 ; https://worldofspectrum.org/archive/software/cover-tapes-and-electronic-magazines/sinclair-user-issue-94-megatape-23-sinclair-user.
> $4000 ; It features a single stage, with the graphics from stage 1 of the real game
> $4000 ; and what seems to be a custom map. There's no retry on fail and it's a tough
> $4000 ; level.
> $4000 ;
> $4000 ;
> $4000 ; RELATED PORTS
> $4000 ; -------------
> $4000 ; The Amstrad CPC version is by the same authors and was produced after this
> $4000 ; Spectrum version.
> $4000 ;
> $4000 ;
> $4000 ; RELATED GAMES
> $4000 ; -------------
> $4000 ; "WEC Le Mans" (Imagine, 1989)
> $4000 ; [Lamb/Mullins/Dunn/Harbison/Morrall]
> $4000 ; - Shares a composer and an artist with ZX Chase HQ.
> $4000 ; <https://www.mobygames.com/game/15167/wec-le-mans-24/>
> $4000 ;
> $4000 ; "Batman: The Movie" (Ocean Software, 1989)
> $4000 ; [Lamb/O'Brien/Shortt/Drake/Harbison/Palmer/Hemphill/Dunn/Cannon]
> $4000 ; - ZX Chase HQ's authors worked on the driving sequences for the Atari ST and
> $4000 ; Amiga versions of this game.
> $4000 ; <https://www.mobygames.com/game/3848/batman/>
> $4000 ;
> $4000 ; "Burnin' Rubber" (Ocean Software, 1990)
> $4000 ; [O'Brien/Hemphill/Dunn]
> $4000 ; - A later Amstrad game by John O'Brien very much like WEC Le Mans.
> $4000 ; <https://www.mobygames.com/game/70894/burnin-rubber/>
> $4000 ;
> $4000 ;
> $4000 ; RESEARCH
> $4000 ; --------
> $4000 ; https://en.wikipedia.org/wiki/Chase_H.Q.
> $4000 ; https://spectrumcomputing.co.uk/entry/903/ZX-Spectrum/Chase_HQ
> $4000 ; https://www.mobygames.com/game/9832/chase-hq/
> $4000 ; http://reassembler.blogspot.com/2012/06/interview-with-spectrum-legend-bill.html
> $4000 ; https://news.ycombinator.com/item?id=8850193 (discussion about the game loader)
> $4000 ; http://www.extentofthejam.com/pseudo/ (Lou's Pseudo 3D page)
> $4000 ;
> $4000 ;
> $4000 ; BUGS
> $4000 ; ----
> $4000 ; Bugfix provided by Russell Marks:
> $4000 ; "When you finish a stage, a hidden bonus is sometimes given randomly. At
> $4000 ; address $8b3d, instructions EX AF,AF' and LD B,A are in the wrong order.
> $4000 ; Therefore calculation of time bonus is using random value from A' instead of
> $4000 ; low digit from remaining time. Fixed with POKE 35645,71: POKE 35646,8."
> $4000 ;
> $4000 ;
> $4000 ; SECRETS
> $4000 ; -------
> $4000 ; Redefine keys to "SHOCKED<ENTER>" to activate test/cheat mode.
> $4000 ;
> $4000 ;
> $4000 ; 48K/128K VERSION DIFFERENCES
> $4000 ; ----------------------------
> $4000 ; - 48K version is a multiloader
> $4000 ; - 128K version has AY music with sampled speech and effects
> $4000 ; - 128K has logo animation > music plays > attract mode (48K version only has attract mode)
> $4000 ; - 128K has a Best Officers (high score) on attract screen and a high score entry screen
> $4000 ; - 128K retains the input device/define keys code (48K has to overwrite it for space reasons)
> $4000 ;
> $4000 ;
> $4000 ; MEMORY MAP
> $4000 ; ----------
> $4000 ; The memory map changes once the game's been shifted into its regular
> $4000 ; running state:
> $4000 ;
> $4000 ; $5B00..$5BFF is a pre-shifted version of the backdrop
> $4000 ; $5C00..$76EF is the per-stage data:
> $4000 ; - $5C00..$5CFF is the regular version of the backdrop
> $4000 ; $8DBB (word) is the address of the current transition animation
> $4000 ; $E300..$E316 is a height table (22 bytes long)
> $4000 ; $E336.. is TBD
> $4000 ; $E410..$E4CF is a road edge/markings table
> $4000 ; $E4D0..$E4FF is road lane markings
> $4000 ; $E500 is road bending tables
> $4000 ; $E600..$E80F is road drawing scaling tables (3x8 groups of 22 bytes)
> $4000 ; $E830..$E8FF is 104 words for road drawing (left)
> $4000 ; $E900 is a table
> $4000 ; $E930..$E9FF is 104 words for road drawing (centre left)
> $4000 ; $EA00..$EA2F is the diamond zoom-in mask
> $4000 ; $EA30..$EAFF is 104 words for road drawing (centre)
> $4000 ; $EB00..$EB27 is the square zoom-in mask
> $4000 ; $EB30..$EBFF is 104 words for road drawing (centre right)
> $4000 ; $EC00..$EC2F is TBD (transition uses this)
> $4000 ; $EC30..$ECFF is 104 words for road drawing (right)
> $4000 ; $ED28 is the stack (growing downwards)
> $4000 ; $ED30..? is (possibly another 104 word road drawing buffer)
> $4000 ; $EE00..$EEFF is the road buffer. holds data unpacked from maps. it's cyclic. 32 byte fixed sections for each datum (curvature, height, lanes, right side objects, left side objects, hazards). cleared by $87DD.
> $4000 ; $EF00..$EFFF is a table of flipped bytes
> $4000 ; $F000..$FFFF is a 4KB back buffer
> $4000 ;
> $4000 ; A back buffer address of 0b1111BAAACCCXXXXX means:
> $4000 ; - X = X position byte (0..31)
> $4000 ; - A = Y position row bits 0..2
> $4000 ; - B = Y position row bit 3
> $4000 ; - C = Y position row bits 4..6
> $4000 ;
> $4000 ; There's a column spare at either side of the back buffer (same as the main
> $4000 ; screen). This seems to be to avoid full clipping.
> $4000 ;
> $4000 ;
> $4000 ; 128K MEMORY MAP
> $4000 ; ---------------
> $4000 ; The per-stage data has a worst-case size of $1AF0 bytes.
> $4000 ;
> $4000 ; Bank 1 @ $C000..$DAEF is stage 1's data
> $4000 ; Bank 1 @ $E000..$FAEF is stage 2's data
> $4000 ; Bank 3 @ $C000..$FFFF? is the animated title screen
> $4000 ; Bank 4 @ $C000..$FF66 is sampled speech
> $4000 ; Bank 6 @ $C000..$DAEF is stage 3's data
> $4000 ; Bank 6 @ $E000..$FAEF is stage 4's data
> $4000 ; Bank 7 @ $C000..$DAEF is stage 5's data
> $4000 ; Bank 7 @ $E000..$FAEF is the end screen
> $4000 ;
> $4000 ;
> $4000 ; 128K SOUND
> $4000 ; ----------
> $4000 ; The engine drone is played on Channel C.
> $4000 ;
> $4000 ;
> $4000 ; NOTES
> $4000 ; -----
> $4000 ; Strings are top bit set terminated ASCII.
> $4000 ;
> $4000 ;
> $4000 ; TODO
> $4000 ; ----
> $4000 ; - Decode all stages' level data.
> $4000 ; - Disassemble the Chase HQ demo version.
> $4000 ; - $8008 area used at all?
> $4000 ; - Stretchy streetlamps etc. encoding
> $4000 ; - $E34B block is what?
> $4000 ; - Stripy tunnel fills.
> $4000 ;
> $4000
@ $4000 org
@ $4000 set-warnings=1
@ $4000 start
@ $4000 writer=:ChaseHQ.ChaseHQAsmWriter
b $4000 Screen memory
D $4000 #UDGTABLE { #SCR(loading) | This is the loading screen. } TABLE#
B $4000,6144,8 Screen bitmap
B $5800,768,8 Screen attributes
c $5B00 The game has loaded
D $5B00 This is entered when the game is first loaded. It disables interrupts, moves memory into the right position, detects 128K machines and then runs the secondary loader to load the first stage (48K) or all stages (128K) as required.
N $5B00 The game starts here.
@ $5B00 label=start
C $5B00,1 Disable interrupts
C $5B01,3 Set stack pointer
N $5B04 Copy $4910 bytes from $5C00+ to $76F0+ (copying backwards to avoid overlap).
C $5B04,3 Final source byte
C $5B07,3 Final destination byte
C $5B0A,3 Count
C $5B0D,2 Copy
N $5B0F Detect 128K machines.
N $5B0F Assuming bank 0 is mapped in to start with, we copy a byte from bank 0.
@ $5B0F label=detect_128k
C $5B0F,4 Read the byte at $FFF0 into #REGe
N $5B13 Now we modify it, then store it back after attempting to page in bank 1.
C $5B13,7 Attempt to map RAM bank 1 to $C000
C $5B1A,2 Increment the read byte by $FD (a convenient non-zero value)
C $5B1C,1 Store it
N $5B1D If the modified byte remains present after restoring bank 0 then it's a 48K machine.
C $5B1D,3 Attempt to map RAM bank 0 to $C000
C $5B20,1 Load potentially changed byte
C $5B21,1 Restore original byte
C $5B22,3 Point #REGhl at loader_commands_48K
N $5B25 If byte was modified no paging took place, so this is a 48K machine.
C $5B25,3 If modified, jump to loader with loader_commands_48K setup
@ $5B28 label=mode_is_128k
C $5B28,3 Otherwise point #REGhl at loader_commands_128K
N $5B2B The loader accepts a command list and uses it to load the game into memory. The 48K command list at #R$5B7D loads stage 1, then starts the game. The 128K command list at #R$5B87 loads all stages while paging in the appropriate banks, then starts the game.
@ $5B2B label=loader
C $5B2B,4 Load a handler address from #REGhl
C $5B2F,2 Call the handler
N $5B31 Loader handler that loads a stage.
@ $5B31 label=loader_load
C $5B31,1 Preserve command list address
C $5B32,4 Address of loader_scratch
C $5B36,3 Length of loader_scratch
C $5B39,3 Call loader_load_chunk
C $5B3C,1 Restore command list address
@ $5B3D label=loader_load_headerless
C $5B3D,7 Load address from command list into #REGix
C $5B44,4 Load length from command list into #REGde
C $5B48,1 Preserve command list address
C $5B49,3 Call loader_load_chunk
N $5B4C The following instruction is the point at which this disassembly was captured.
C $5B4C,1 Restore command list address
C $5B4D,2 Process next entry
N $5B4F Subroutine that loads #REGde bytes to address #REGix.
@ $5B4F label=loader_load_chunk
C $5B4F,3 Call tape_load_at_ix
C $5B52,1 Return if no errors
N $5B53 Infinitely cycle through border colours if a tape loading error occurred.
@ $5B53 label=loader_load_failed
N $5B58 Loader handler that pages in the specified RAM bank.
@ $5B58 label=loader_set_bank
C $5B58,2 Page in RAM where interrupt vector lives
C $5B5A,2 Set Interrupt Control Vector Register
C $5B5C,1 Load 128K paging flags byte
C $5B5D,2 Second byte is unused
C $5B5F,5 128K: Set paging register
C $5B64,2 Process next entry
N $5B66 Loader handler that copies data around.
@ $5B66 label=loader_copy
C $5B66,1 Preserve command list address
C $5B67,11 Move $5C00..$76EF to $C000 onwards
C $5B72,1 Restore command list address
C $5B73,2 Process next entry
N $5B75 Loader handler that starts the game.
@ $5B75 label=loader_start_game
C $5B75,4 Load entrypoint address from #REGhl
C $5B79,3 Set border to black
C $5B7C,1 Exit via entrypoint just read
N $5B7D Loader commands for 48K mode.
@ $5B7D label=loader_commands_48K
W $5B7D,6,2,4 Load stage 1 at $5C00 ($1AF0 bytes)
W $5B83,4,2 Start game at entrypt_48k
N $5B87 Loader commands for 128K mode.
@ $5B87 label=loader_commands_128K
W $5B87,6,2,4 Load stage 1 at $5C00 ($1AF0 bytes)
M $5B8D,4 Set bank 1 (second byte is unused in Set Bank commands)
W $5B8D,2,2
B $5B8F,2,2
W $5B91,2,2 Copy $5C00..$76EF to $C000
W $5B93,6,2,4 Load stage 2 at $E000 ($1AF0 bytes)
M $5B99,4 Set bank 6
W $5B99,2,2
B $5B9B,2,2
W $5B9D,6,2,4 Load stage 3 at $C000 ($1AF0 bytes)
W $5BA3,6,2,4 Load stage 4 at $E000 ($1AF0 bytes)
M $5BA9,4 Set bank 7
W $5BA9,2,2
B $5BAB,2,2
W $5BAD,6,2,4 Load stage 5 at $C000 ($1AF0 bytes)
W $5BB3,6,2,4 Load end screen at $E000 ($1AF0 bytes)
M $5BB9,4 Set bank 3
W $5BB9,2,2
B $5BBB,2,2
W $5BBD,6,2,4 (Headerless) Load animated title screen at $C000 ($4000 bytes)
M $5BC3,4 Set bank 4
W $5BC3,2,2
B $5BC5,2,2
W $5BC7,6,2,4 (Headerless) Load sampled speech at $C000 ($4000 bytes)
M $5BCD,4 Set bank 0
W $5BCD,2,2
B $5BCF,2,2
W $5BD1,4,2 Start game at entrypt_128k
@ $5BD5 label=loader_scratch
B $5BD5,2,2 #R$5B31 loads two bytes to here. -- unsure what uses them
u $5BD7 Padding bytes
D $5BD7 Bytes to pad this section out to $5C00. These bytes do get touched by e.g. #R$C861.
S $5BD7,31,$1F
B $5BF6,10,10
b $5C00 [Stage 1] Horizon graphic
D $5C00 #HTML[#CALL:graphic($5C00,80,24,0,1)]
@ $5C00 label=bitmap_horizon
B $5C00,240,8 Horizon backdrop (80x24). Non-masked, inverted, bitmap data. Varies per stage.
b $5CF0 [Stage 1] Per-stage data
@ $5CF0 label=addrof_perp_mugshot_attributes
W $5CF0,2,2 Address of Ralph's mugshot attributes
@ $5CF2 label=addrof_perp_mugshot_bitmap
W $5CF2,2,2 Address of Ralph's mugshot bitmap
@ $5CF4 label=ground_colour
W $5CF4,2,2 Screen attributes used for the ground colour (a pair of matching bytes)
@ $5CF6 label=addrof_hittable_objects
W $5CF6,2,2 Loaded by #R$AC1F. Address of table of LODs for tumbleweeds, barriers.
@ $5CF8 label=addrof_right_hand_handlers
@ $5CF8 ssub=DEFW right_hand_handlers - 7
W $5CF8,2,2 Loaded by #R$900F. Address of an array of 7 byte entries. Points 7 bytes earlier to permit 1-indexing.
@ $5CFA label=addrof_right_hand_objects
@ $5CFA ssub=DEFW right_hand_graphics_defs - 7
W $5CFA,2,2 Loaded by #R$A465. Address of graphics entry 1. Points 7 bytes earlier to permit 1-indexing.
@ $5CFC label=addrof_right_hand_short_pole_object
W $5CFC,2,2 Loaded by #R$A53F. Address of graphics entry 3.
@ $5CFE label=addrof_turn_sign_handlers
W $5CFE,2,2 Address of turn sign arg and handler address.
@ $5D00 label=addrof_left_hand_objects
@ $5D00 ssub=DEFW left_hand_graphics_defs - 7
W $5D00,2,2 Loaded by #R$A490. Address of graphics entry 10. Points 7 bytes earlier to permit 1-indexing.
@ $5D02 label=addrof_left_hand_short_pole_object
W $5D02,2,2 Loaded by #R$A55C. Address of graphics entry 12.
@ $5D04 label=addrof_perp_description
W $5D04,2,2 Address of Nancy's perp description.
@ $5D06 label=addrof_arrest_messages
W $5D06,2,2 Address of arrest messages.
@ $5D08 label=addrof_helicopter_stuff_1
W $5D08,2,2 Loaded by #R$AA69. Helicopter related.
@ $5D0A label=addrof_helicopter_stuff_2
W $5D0A,2,2 Loaded by #R$AA6E. Helicopter related.
w $5D0C [Stage 1] Table of addresses of LODs
D $5D0C LODs = Level Of Detail - a set of sprites of various sizes representing the same object.
@ $5D0C label=lods_stones
W $5D0C,2,2 Address of LODs for stones.
@ $5D0E label=lods_dust
W $5D0E,2,2 Address of LODs for dust.
@ $5D10 label=lods_perp_car
W $5D10,2,2 Address of LODs for car (perp's car).
@ $5D12 label=lods_vehicles
W $5D12,2,2 Address of LODs for lambo.
W $5D14,2,2 Address of LODs for truck.
W $5D16,2,2 Address of LODs for lambo (again).
W $5D18,2,2 Address of LODs for car (generic car).
b $5D1A [Stage 1] Per-stage difficulty settings
@ $5D1A label=car_spawn_rate
B $5D1A,1,1 How often cars spawn. Lower values spawn cars more often.
@ $5D1B label=smash_5d1b
B $5D1B,1,1 Loaded by #R$A6A7. Used by smash_handler.
@ $5D1C label=smash_5d1c
B $5D1C,1,1 Loaded by #R$A759.
w $5D1D [Stage 1] Per-stage setup data
@ $5D1D label=stage_set_up_data
W $5D1D,2,2 road_pos
N $5D1F The following all point a byte earlier than the real data's start.
@ $5D1F ssub=DEFW map_start_curvature - 1
W $5D1F,2,2 -> Start stretch, curvature
@ $5D21 ssub=DEFW map_start_height - 1
W $5D21,2,2 -> Start stretch, height
@ $5D23 ssub=DEFW map_start_lanes - 1
W $5D23,2,2 -> Start stretch, lanes
@ $5D25 ssub=DEFW map_start_rightobjs - 1
W $5D25,2,2 -> Start stretch, right-side objects
@ $5D27 ssub=DEFW map_start_leftobjs - 1
W $5D27,2,2 -> Start stretch, left-side objects
@ $5D29 ssub=DEFW map_start_hazards - 1
W $5D29,2,2 -> Start stretch, hazards
w $5D2B [Stage 1] Per-stage attract mode data
@ $5D2B label=attract_data
W $5D2B,2,2 road_pos
N $5D2D These all point a byte earlier than the real data start point.
@ $5D2D ssub=DEFW map_loop_curvature - 1
W $5D2D,2,2 -> Loop section, curvature @ #R$61D4
@ $5D2F ssub=DEFW map_loop_height - 1
W $5D2F,2,2 -> Loop section, height @ #R$6209
@ $5D31 ssub=DEFW map_loop_lanes - 1
W $5D31,2,2 -> Loop section, lanes @ #R$625D
@ $5D33 ssub=DEFW map_loop_rightobjs - 1
W $5D33,2,2 -> Loop section, right-side objects @ #R$6314
@ $5D35 ssub=DEFW map_loop_leftobjs - 1
W $5D35,2,2 -> Loop section, left-side objects @ #R$6294
@ $5D37 ssub=DEFW map_loop_hazards - 1
W $5D37,2,2 -> Loop section, hazards @ #R$6277
b $5D39 [Stage 1] Nancy's perp description
@ $5D39 label=perp_description
B $5D39,1,1 Nancy ($01)
W $5D3A,2,2 Points at "THIS IS NANCY..."
W $5D3C,2,2 Points at "EMERGENCY HERE..."
W $5D3E,2,2 Points at "IS FLEEING ..."
W $5D40,2,2 Points at "VEHICLE IS..."
B $5D42,1,1 (pause?)
W $5D43,2,2 -> Random choice of ("WE READ..." / "ROGER!" / "GOTCHA...")
@ $5D45 label=perp_description_1
T $5D45,40,39:n1 "THIS IS NANCY AT CHASE H.Q. WE'VE GOT AN"
@ $5D6D label=perp_description_2
T $5D6D,40,39:n1 "EMERGENCY HERE. RALPH THE IDAHO SLASHER,"
@ $5D95 label=perp_description_3
T $5D95,42,41:n1 "IS FLEEING TOWARDS THE SUBURBS. THE TARGET"
@ $5DBF label=perp_description_4
T $5DBF,46,45:n1 "VEHICLE IS A WHITE BRITISH SPORTS CAR... OVER."
b $5DED [Stage 1] Arrest messages
@ $5DED label=arrest_messages
B $5DED,1,1 Frame delay until first message?
B $5DEE,1,1 Frame delay until next message?
B $5DEF,1,1 Flags (?)
B $5DF0,1,1 Attribute (black)
W $5DF1,2,2 Back buffer address
W $5DF3,2,2 Attribute address
T $5DF5,27,26:n1 "OK! YOU ARE UNDER ARREST ON"
B $5E10,1,1 Frame delay until next message?
B $5E11,1,1 Flags (?)
B $5E12,1,1 Attribute (black)
W $5E13,2,2 Back buffer address
W $5E15,2,2 Attribute address
T $5E17,26,25:n1 "SUSPICION OF FIRST DEGREE "
B $5E31,1,1 Frame delay until next message?
B $5E32,1,1 Flags (?)
B $5E33,1,1 Attribute (black)
W $5E34,2,2 Back buffer address
W $5E36,2,2 Attribute address
T $5E38,6,5:n1 "MURDER"
B $5E3E,1,1 Frame delay until next message?
b $5E3F [Stage 1] Graphics definitions
D $5E3F All are stored inverted except where noted.
@ $5E3F label=graphics_defs
B $5E3F,1,1 Pointed to by #R$5CFA
N $5E40 Hittable hazards: tumbleweed and barrier.
@ $5E40 label=hittable_objects_defs
B $5E40,1,1 Pointed to by #R$5CF6
W $5E41,2,2 Address of tumbleweed_lods table
B $5E43,1,1 ?
W $5E44,2,2 Address of barrier_lods table
N $5E46 Right hand side objects.
N $5E46 Entry 1 (tunnel light)
@ $5E46 label=right_hand_graphics_defs
B $5E46,3,3 (hit coord max, hit coord min, ?)
@ $5E49 label=right_hand_handlers
W $5E49,2,2 Arg for routine passed in DE
W $5E4B,2,2 -> Routine at #R$9252
N $5E4D Entry 2 (empty)
B $5E4D,3,3
W $5E50,4,2
N $5E54 Entry 3 (short pole)
@ $5E54 label=right_hand_short_pole_object
B $5E54,3,3
W $5E57,2,2 Arg for routine passed in DE
W $5E59,2,2 -> Routine at #R$9171
N $5E5B Entry 4 (tree, right hand side)
B $5E5B,3,3
W $5E5E,2,2 Arg for routine passed in DE
W $5E60,2,2 -> Routine at #R$9171.
N $5E62 Entry 5 (bush)
B $5E62,3,3
W $5E65,2,2 Arg for routine passed in DE
W $5E67,2,2 -> Routine at #R$9171
N $5E69 Entry 6 (street lamp)
B $5E69,3,3
W $5E6C,2,2 Arg for routine passed in DE
W $5E6E,2,2 -> Routine at #R$9171
N $5E70 Entry 7 (telegraph pole)
B $5E70,3,3
W $5E73,2,2 Arg for routine passed in DE
W $5E75,2,2 -> Routine at #R$9171
N $5E77 Entry 8 (turn sign, pointing left)
B $5E77,3,3
W $5E7A,2,2 Arg for routine passed in DE
W $5E7C,2,2 -> Routine at #R$92E1
N $5E7E Entry 9 (turn sign, pointing right)
B $5E7E,3,3
@ $5E81 label=right_hand_turn_sign_handlers
W $5E81,2,2 -> -> turn_sign_lods
W $5E83,2,2 -> Routine at #R$92E1
N $5E85 Left hand side objects.
N $5E85 Entry 10 (tunnel light)
@ $5E85 label=left_hand_graphics_defs
B $5E85,3,3
W $5E88,2,2 Arg for routine passed in DE
W $5E8A,2,2 -> Routine at #R$924D
N $5E8C Entry 11 (empty)
B $5E8C,3,3
W $5E8F,4,2
N $5E93 Entry 12 (short pole)
@ $5E93 label=left_hand_short_pole_object
B $5E93,3,3
W $5E96,2,2 Arg for routine passed in DE
W $5E98,2,2 -> Routine at #R$916C
N $5E9A Entry 13 (tree, left hand side)
B $5E9A,3,3
W $5E9D,2,2 Arg for routine passed in DE
W $5E9F,2,2 -> Routine at #R$916C
N $5EA1 Entry 14 (bush)
B $5EA1,3,3
W $5EA4,2,2 Arg for routine passed in DE
W $5EA6,2,2 -> Routine at #R$916C
N $5EA8 Entry 15 (street lamp)
B $5EA8,3,3
W $5EAB,2,2 Arg for routine passed in DE
W $5EAD,2,2 -> Routine at #R$916C
N $5EAF Entry 16 (telegraph pole)
B $5EAF,3,3
W $5EB2,2,2 Arg for routine passed in DE
W $5EB4,2,2 -> Routine at #R$916C
N $5EB6 Entry 17 (turn sign, pointing left)
B $5EB6,3,3
W $5EB9,2,2 Arg for routine passed in DE
W $5EBB,2,2 -> Routine at #R$9278
N $5EBD Entry 18 (turn sign, pointing right)
B $5EBD,3,3
W $5EC0,2,2 Arg for routine passed in DE
W $5EC2,2,2 -> Routine at #R$9278
b $5EC4 [Stage 1] Map: Start stretch
N $5EC4 Start stretch
N $5EC4 Start stretch, curvature
@ $5EC4 label=map_start_curvature
B $5EC4,32,8
N $5EE4 Start stretch, height
@ $5EE4 label=map_start_height
B $5EE4,43,8*5,3
N $5F0F Start stretch, lanes
@ $5F0F label=map_start_lanes
B $5F0F,14,8,6
N $5F1D Start stretch, hazards
@ $5F1D label=map_start_hazards
B $5F1D,13,8,5
N $5F2A Start stretch, left-side objects
@ $5F2A label=map_start_leftobjs
B $5F2A,78,8*9,6
N $5F78 Start stretch, right-side objects
@ $5F78 label=map_start_rightobjs
B $5F78,90,8*11,2
b $5FD2 [Stage 1] Map: Left fork
N $5FD2 Left fork
N $5FD2 Left fork, curvature
@ $5FD2 label=map_left_curvature
B $5FD2,20,8*2,4
N $5FE6 Left fork, height
@ $5FE6 label=map_left_height
B $5FE6,29,8*3,5
N $6003 Left fork, lanes
@ $6003 label=map_left_lanes
B $6003,6,6
N $6009 Left fork, hazards
@ $6009 label=map_left_hazards
B $6009,8,8
N $6011 Left fork, left-side objects
@ $6011 label=map_left_leftobjs
B $6011,65,8*8,1
N $6052 Left fork, right-side objects
@ $6052 label=map_left_rightobjs
B $6052,54,8*6,6
b $6088 [Stage 1] Map: Right fork (dirt track)
N $6088 Right fork (dirt track), curvature
@ $6088 label=map_right_curvature
B $6088,27,8*3,3
N $60A3 Right fork (dirt track), height
@ $60A3 label=map_right_height
B $60A3,66,8*8,2
N $60E5 Right fork (dirt track), lanes
@ $60E5 label=map_right_lanes
B $60E5,10,8,2
N $60EF Right fork (dirt track), hazards
@ $60EF label=map_right_hazards
B $60EF,26,8*3,2
N $6109 Right fork (dirt track), left-side objects
@ $6109 label=map_right_leftobjs
B $6109,58,8*7,2
N $6143 Right fork (dirt track), right-side objects
@ $6143 label=map_right_rightobjs
B $6143,48,8
b $6173 [Stage 1] Map: Tunnel section
N $6173 Tunnel section, curvature
@ $6173 label=map_tunnel_curvature
B $6173,22,8*2,6
N $6189 Tunnel section, height
@ $6189 label=map_tunnel_height
B $6189,28,8*3,4
N $61A5 Tunnel section, lanes
@ $61A5 label=map_tunnel_lanes
B $61A5,20,8*2,4
N $61B9 Tunnel section, hazards
@ $61B9 label=map_tunnel_hazards
B $61B9,5,5
N $61BE Tunnel section, left-side objects
@ $61BE label=map_tunnel_leftobjs
B $61BE,11,8,3
N $61C9 Tunnel section, right-side objects
@ $61C9 label=map_tunnel_rightobjs
B $61C9,11,8,3
b $61D4 [Stage 1] Map: Loop section
N $61D4 Loop section, curvature
@ $61D4 label=map_loop_curvature
B $61D4,53,8*6,5
N $6209 Loop section, height
@ $6209 label=map_loop_height
B $6209,84,8*10,4
N $625D Loop section, lanes
@ $625D label=map_loop_lanes
B $625D,26,8*3,2
N $6277 Loop section, hazards
@ $6277 label=map_loop_hazards
B $6277,29,8*3,5
N $6294 Loop section, left-side objects
@ $6294 label=map_loop_leftobjs
B $6294,128,8
N $6314 Loop section, right-side objects
@ $6314 label=map_loop_rightobjs
B $6314,118,8*14,6
b $638A [Stage 1] Ralph the Idaho Slasher's mugshot
N $638A Bitmap data for Ralph the Idaho Slasher's mugshot (32x40). Stored top-down.
N $638A #HTML[#CALL:face($638A)]
@ $638A label=bitmap_ralph
B $638A,160,4
N $642A Attribute data for Ralph the Idaho Slasher's mugshot (4x5). Stored top-down.
@ $642A label=attrs_ralph
B $642A,20,4
b $643E [Stage 1] LODs
D $643E LOD = Level of Detail. These structures collect together the variously sized versions of the same game object.
N $643E Lamborghini LOD 1
@ $643E label=lambo_lods
B $643E,1,1 Width (bytes)
B $643F,1,1 Flags
B $6440,1,1 Height (pixels)
W $6441,2,2 Bitmap
W $6443,2,2 Pre-shifted bitmap
N $6445 Lamborghini LOD 2
B $6445,1,1 Width (bytes)
B $6446,1,1 Flags
B $6447,1,1 Height (pixels)
W $6448,2,2 Bitmap
W $644A,2,2 Pre-shifted bitmap
N $644C Lamborghini LOD 3
B $644C,1,1 Width (bytes)
B $644D,1,1 Flags
B $644E,1,1 Height (pixels)
W $644F,2,2 Bitmap
W $6451,2,2 Pre-shifted bitmap
N $6453 Lamborghini LOD 4
B $6453,1,1 Width (bytes)
B $6454,1,1 Flags
B $6455,1,1 Height (pixels)
W $6456,2,2 Bitmap
W $6458,2,2 Pre-shifted bitmap
N $645A Lamborghini LOD 5
B $645A,1,1 Width (bytes)
B $645B,1,1 Flags
B $645C,1,1 Height (pixels)
W $645D,2,2 Bitmap
W $645F,2,2 Pre-shifted bitmap
N $6461 Lamborghini LOD 6
B $6461,1,1 Width (bytes)
B $6462,1,1 Flags
B $6463,1,1 Height (pixels)
W $6464,2,2 Bitmap
W $6466,2,2 Pre-shifted bitmap
N $6468 Truck LOD 1
@ $6468 label=truck_lods
B $6468,1,1 Width (bytes)
B $6469,1,1 Flags
B $646A,1,1 Height (pixels)
W $646B,2,2 Bitmap
W $646D,2,2 Pre-shifted bitmap
N $646F Truck LOD 2
B $646F,1,1 Width (bytes)
B $6470,1,1 Flags
B $6471,1,1 Height (pixels)
W $6472,2,2 Bitmap
W $6474,2,2 Pre-shifted bitmap
N $6476 Truck LOD 3
B $6476,1,1 Width (bytes)
B $6477,1,1 Flags
B $6478,1,1 Height (pixels)
W $6479,2,2 Bitmap
W $647B,2,2 Pre-shifted bitmap
N $647D Truck LOD 4
B $647D,1,1 Width (bytes)
B $647E,1,1 Flags
B $647F,1,1 Height (pixels)
W $6480,2,2 Bitmap
W $6482,2,2 Pre-shifted bitmap
N $6484 Truck LOD 5
B $6484,1,1 Width (bytes)
B $6485,1,1 Flags
B $6486,1,1 Height (pixels)
W $6487,2,2 Bitmap
W $6489,2,2 Pre-shifted bitmap
N $648B Truck LOD 6
B $648B,1,1 Width (bytes)
B $648C,1,1 Flags
B $648D,1,1 Height (pixels)
W $648E,2,2 Bitmap
W $6490,2,2 Pre-shifted bitmap
N $6492 Car LOD 1
@ $6492 label=car_lods
B $6492,1,1 Width (bytes)
B $6493,1,1 Flags
B $6494,1,1 Height (pixels)
W $6495,2,2 Bitmap
W $6497,2,2 Pre-shifted bitmap
N $6499 Car LOD 2
B $6499,1,1 Width (bytes)
B $649A,1,1 Flags
B $649B,1,1 Height (pixels)
W $649C,2,2 Bitmap
W $649E,2,2 Pre-shifted bitmap
N $64A0 Car LOD 3
B $64A0,1,1 Width (bytes)
B $64A1,1,1 Flags
B $64A2,1,1 Height (pixels)
W $64A3,2,2 Bitmap
W $64A5,2,2 Pre-shifted bitmap
N $64A7 Car LOD 4
B $64A7,1,1 Width (bytes)
B $64A8,1,1 Flags
B $64A9,1,1 Height (pixels)
W $64AA,2,2 Bitmap
W $64AC,2,2 Pre-shifted bitmap
N $64AE Car LOD 5
B $64AE,1,1 Width (bytes)
B $64AF,1,1 Flags
B $64B0,1,1 Height (pixels)
W $64B1,2,2 Bitmap
W $64B3,2,2 Pre-shifted bitmap
N $64B5 Car LOD 6
B $64B5,1,1 Width (bytes)
B $64B6,1,1 Flags
B $64B7,1,1 Height (pixels)
W $64B8,2,2 Bitmap
W $64BA,2,2 Pre-shifted bitmap
N $64BC Bitmap: Lamborghini_1 (48x30)
N $64BC #HTML[#CALL:graphic($64BC,48,30,0,1)]
@ $64BC label=bitmap_lamborghini_1
B $64BC,180,6 Bitmap data
N $6570 Bitmap: Lamborghini_2 (40x22)
N $6570 #HTML[#CALL:graphic($6570,40,22,0,1)]
@ $6570 label=bitmap_lamborghini_2
B $6570,110,5 Bitmap data
N $65DE Bitmap: Lamborghini_3 (24x15)
N $65DE #HTML[#CALL:graphic($65DE,24,15,0,1)]
@ $65DE label=bitmap_lamborghini_3
B $65DE,45,3 Bitmap data
N $660B Bitmap: Truck_1 (48x39)
N $660B #HTML[#CALL:graphic($660B,48,39,0,1)]
@ $660B label=bitmap_truck_1
B $660B,234,6 Bitmap data
N $66F5 Bitmap: Truck_2 (40x29)
N $66F5 #HTML[#CALL:graphic($66F5,40,29,0,1)]
@ $66F5 label=bitmap_truck_2
B $66F5,145,5 Bitmap data
N $6786 Bitmap: Truck_3 (24x20)
N $6786 #HTML[#CALL:graphic($6786,24,20,0,1)]
@ $6786 label=bitmap_truck_3
B $6786,60,3 Bitmap data
N $67C2 Bitmap: Car_1 (48x31)
N $67C2 #HTML[#CALL:graphic($67C2,48,31,0,1)]
@ $67C2 label=bitmap_car_1
B $67C2,186,6 Bitmap data
N $687C Bitmap: Car_2 (40x22)
N $687C #HTML[#CALL:graphic($687C,40,22,0,1)]
@ $687C label=bitmap_car_2
B $687C,110,5 Bitmap data
N $68EA Bitmap: Car_3 (24x16)
N $68EA #HTML[#CALL:graphic($68EA,24,16,0,1)]
@ $68EA label=bitmap_car_3
B $68EA,48,3 Bitmap data
N $691A Bitmap: Lamborghini_4 (24x8)
N $691A #HTML[#CALL:graphic($691A,24,8,1,1)]
@ $691A label=bitmap_lamborghini_4
B $691A,48,6 Masked bitmap data
N $694A Bitmap: Lamborghini_4 (24x8) pre-shifted
N $694A #HTML[#CALL:graphic($694A,24,8,1,1)]
@ $694A label=bitmap_lamborghini_4s
B $694A,48,6 Masked bitmap data
N $697A Bitmap: Truck_4 (16x12)
N $697A #HTML[#CALL:graphic($697A,16,12,1,1)]
@ $697A label=bitmap_truck_4
B $697A,48,4 Masked bitmap data
N $69AA Bitmap: Truck_4 (16x12) pre-shifted
N $69AA #HTML[#CALL:graphic($69AA,16,12,1,1)]
@ $69AA label=bitmap_truck_4s
B $69AA,48,4 Masked bitmap data
N $69DA Bitmap: Car_4 (24x9)
N $69DA #HTML[#CALL:graphic($69DA,24,9,1,1)]
@ $69DA label=bitmap_car_4
B $69DA,54,6 Masked bitmap data
N $6A10 Bitmap: Car_4 (24x9) pre-shifted
N $6A10 #HTML[#CALL:graphic($6A10,24,9,1,1)]
@ $6A10 label=bitmap_car_4s
B $6A10,54,6 Masked bitmap data
N $6A46 Stones LOD 1
@ $6A46 label=stones_lods
B $6A46,1,1 Width (bytes)
B $6A47,1,1 Flags
B $6A48,1,1 Height (pixels)
W $6A49,2,2 Bitmap
W $6A4B,2,2 Pre-shifted bitmap
N $6A4D Stones LOD 2
B $6A4D,1,1 Width (bytes)
B $6A4E,1,1 Flags
B $6A4F,1,1 Height (pixels)
W $6A50,2,2 Bitmap
W $6A52,2,2 Pre-shifted bitmap
N $6A54 Stones LOD 3
B $6A54,1,1 Width (bytes)
B $6A55,1,1 Flags
B $6A56,1,1 Height (pixels)
W $6A57,2,2 Bitmap
W $6A59,2,2 Pre-shifted bitmap
N $6A5B Stones LOD 4
B $6A5B,1,1 Width (bytes)
B $6A5C,1,1 Flags
B $6A5D,1,1 Height (pixels)
W $6A5E,2,2 Bitmap
W $6A60,2,2 Pre-shifted bitmap
N $6A62 Stones LOD 5
B $6A62,1,1 Width (bytes)
B $6A63,1,1 Flags
B $6A64,1,1 Height (pixels)
W $6A65,2,2 Bitmap
W $6A67,2,2 Pre-shifted bitmap
N $6A69 Stones LOD 6
B $6A69,1,1 Width (bytes)
B $6A6A,1,1 Flags
B $6A6B,1,1 Height (pixels)
W $6A6C,2,2 Bitmap
W $6A6E,2,2 Pre-shifted bitmap
N $6A70 Dust LOD 1
@ $6A70 label=dust_lods
B $6A70,1,1 Width (bytes)
B $6A71,1,1 Flags
B $6A72,1,1 Height (pixels)
W $6A73,2,2 Bitmap
W $6A75,2,2 Pre-shifted bitmap
N $6A77 Dust LOD 2
B $6A77,1,1 Width (bytes)
B $6A78,1,1 Flags
B $6A79,1,1 Height (pixels)
W $6A7A,2,2 Bitmap
W $6A7C,2,2 Pre-shifted bitmap
N $6A7E Dust LOD 3
B $6A7E,1,1 Width (bytes)
B $6A7F,1,1 Flags
B $6A80,1,1 Height (pixels)
W $6A81,2,2 Bitmap
W $6A83,2,2 Pre-shifted bitmap
N $6A85 Dust LOD 4
B $6A85,1,1 Width (bytes)
B $6A86,1,1 Flags
B $6A87,1,1 Height (pixels)
W $6A88,2,2 Bitmap
W $6A8A,2,2 Pre-shifted bitmap
N $6A8C Dust LOD 5
B $6A8C,1,1 Width (bytes)
B $6A8D,1,1 Flags
B $6A8E,1,1 Height (pixels)
W $6A8F,2,2 Bitmap
W $6A91,2,2 Pre-shifted bitmap
N $6A93 Dust LOD 6
B $6A93,1,1 Width (bytes)
B $6A94,1,1 Flags
B $6A95,1,1 Height (pixels)
W $6A96,2,2 Bitmap
W $6A98,2,2 Pre-shifted bitmap
N $6A9A Bitmap: Stones (16x5)
N $6A9A #HTML[#CALL:graphic($6A9A,16,5,1,1)]
@ $6A9A label=bitmap_stones_1
B $6A9A,20,4 Masked bitmap data
N $6AAE Bitmap: Stones (16x4)
N $6AAE #HTML[#CALL:graphic($6AAE,16,4,1,1)]
@ $6AAE label=bitmap_stones_2
B $6AAE,16,4 Masked bitmap data
N $6ABE Bitmap: Stones (16x4) pre-shifted
N $6ABE #HTML[#CALL:graphic($6ABE,16,4,1,1)]
@ $6ABE label=bitmap_stones_2s
B $6ABE,16,4 Masked bitmap data
N $6ACE Bitmap: Stones (16x3)
N $6ACE #HTML[#CALL:graphic($6ACE,16,3,1,1)]
@ $6ACE label=bitmap_stones_3
B $6ACE,12,4 Masked bitmap data
N $6ADA Bitmap: Stones (16x3) pre-shifted
N $6ADA #HTML[#CALL:graphic($6ADA,16,3,1,1)]
@ $6ADA label=bitmap_stones_3s
B $6ADA,12,4 Masked bitmap data
N $6AE6 Bitmap: Stones (8x2)
N $6AE6 #HTML[#CALL:graphic($6AE6,8,2,1,1)]
@ $6AE6 label=bitmap_stones_4
B $6AE6,4,2 Masked bitmap data
N $6AEA Bitmap: Stones (8x2) pre-shifted
N $6AEA #HTML[#CALL:graphic($6AEA,8,2,1,1)]
@ $6AEA label=bitmap_stones_4s
B $6AEA,4,2 Masked bitmap data
N $6AEE Bitmap: Stones (8x1)
N $6AEE #HTML[#CALL:graphic($6AEE,8,1,1,1)]
@ $6AEE label=bitmap_stones_5
B $6AEE,2,2 Masked bitmap data
N $6AF0 Bitmap: Stones (8x1) pre-shifted
N $6AF0 #HTML[#CALL:graphic($6AF0,8,1,1,1)]
@ $6AF0 label=bitmap_stones_5s
B $6AF0,2,2 Masked bitmap data
N $6AF2 Bitmap: Dust (8x1)
N $6AF2 #HTML[#CALL:graphic($6AF2,8,1,1,1)]
@ $6AF2 label=bitmap_dust_1
B $6AF2,2,2 Masked bitmap data
N $6AF4 Bitmap: Dust (8x1) pre-shifted
N $6AF4 #HTML[#CALL:graphic($6AF4,8,1,1,1)]
@ $6AF4 label=bitmap_dust_1s
B $6AF4,2,2 Masked bitmap data
@ $6AF6 label=turn_sign_right
W $6AF6,2,2 -> turn_sign_lods
B $6AF8,20,2 Read by #R$928D and #R$92F6
N $6B0C Referenced by graphic entry 8 and 17
@ $6B0C label=turn_sign_left
W $6B0C,2,2 -> turn_sign_lods
B $6B0E,20,2
N $6B22 Turn sign LOD 1
@ $6B22 label=turn_sign_lods
B $6B22,1,1 Width (bytes)
B $6B23,1,1 Flags
B $6B24,1,1 Height (pixels)
W $6B25,2,2 Bitmap
W $6B27,2,2 Pre-shifted bitmap
N $6B29 Turn sign LOD 2
B $6B29,1,1 Width (bytes)
B $6B2A,1,1 Flags
B $6B2B,1,1 Height (pixels)
W $6B2C,2,2 Bitmap
W $6B2E,2,2 Pre-shifted bitmap
N $6B30 Turn sign LOD 3
B $6B30,1,1 Width (bytes)
B $6B31,1,1 Flags
B $6B32,1,1 Height (pixels)
W $6B33,2,2 Bitmap
W $6B35,2,2 Pre-shifted bitmap
N $6B37 Turn sign LOD 4
B $6B37,1,1 Width (bytes)
B $6B38,1,1 Flags
B $6B39,1,1 Height (pixels)
W $6B3A,2,2 Bitmap
W $6B3C,2,2 Pre-shifted bitmap
N $6B3E Turn sign LOD 5
B $6B3E,1,1 Width (bytes)
B $6B3F,1,1 Flags
B $6B40,1,1 Height (pixels)
W $6B41,2,2 Bitmap
W $6B43,2,2 Pre-shifted bitmap
N $6B45 Turn sign LOD 1 (flipped)
B $6B45,1,1 Width (bytes)
B $6B46,1,1 Flags
B $6B47,1,1 Height (pixels)
W $6B48,2,2 Bitmap
W $6B4A,2,2 Pre-shifted bitmap
N $6B4C Turn sign LOD 2 (flipped)
B $6B4C,1,1 Width (bytes)
B $6B4D,1,1 Flags
B $6B4E,1,1 Height (pixels)
W $6B4F,2,2 Bitmap
W $6B51,2,2 Pre-shifted bitmap
N $6B53 Turn sign LOD 3 (flipped)
B $6B53,1,1 Width (bytes)
B $6B54,1,1 Flags
B $6B55,1,1 Height (pixels)
W $6B56,2,2 Bitmap
W $6B58,2,2 Pre-shifted bitmap
N $6B5A Turn sign LOD 4 (flipped)
B $6B5A,1,1 Width (bytes)
B $6B5B,1,1 Flags
B $6B5C,1,1 Height (pixels)
W $6B5D,2,2 Bitmap
W $6B5F,2,2 Pre-shifted bitmap
N $6B61 Turn sign LOD 5 (flipped)
B $6B61,1,1 Width (bytes)
B $6B62,1,1 Flags
B $6B63,1,1 Height (pixels)
W $6B64,2,2 Bitmap
W $6B66,2,2 Pre-shifted bitmap
N $6B68 Turn right sign (32x40)
N $6B68 #HTML[#CALL:graphic($6B68,32,40,0,1)]
@ $6B68 label=bitmap_turnsign_1
B $6B68,160,4 Bitmap data
N $6C08 Turn right sign (24x30)
N $6C08 #HTML[#CALL:graphic($6C08,24,30,0,1)]
@ $6C08 label=bitmap_turnsign_2
B $6C08,90,3 Bitmap data
N $6C62 Turn right sign (16x20)
N $6C62 #HTML[#CALL:graphic($6C62,16,20,0,1)]
@ $6C62 label=bitmap_turnsign_3
B $6C62,40,2 Bitmap data
N $6C8A Turn right sign (16x16)
N $6C8A #HTML[#CALL:graphic($6C8A,16,16,1,1)]
@ $6C8A label=bitmap_turnsign_4
B $6C8A,64,4 Masked bitmap data
N $6CCA Turn right sign (16x13)
N $6CCA #HTML[#CALL:graphic($6CCA,16,13,1,1)]
@ $6CCA label=bitmap_turnsign_5
B $6CCA,52,2 Masked bitmap data
N $6CFE Turn right sign (16x13) pre-shifted
N $6CFE #HTML[#CALL:graphic($6CFE,16,13,1,1)]
@ $6CFE label=bitmap_turnsign_5s
B $6CFE,52,2 Masked bitmap data
N $6D32 Turn right sign (16x10)
N $6D32 #HTML[#CALL:graphic($6D32,16,10,1,1)]
@ $6D32 label=bitmap_turnsign_6
B $6D32,40,4 Masked bitmap data
N $6D5A Turn right sign (16x10) pre-shifted
N $6D5A #HTML[#CALL:graphic($6D5A,16,10,1,1)]
@ $6D5A label=bitmap_turnsign_6s
B $6D5A,40,4 Masked bitmap data
N $6D82 Tumbleweed LOD 1
@ $6D82 label=tumbleweed_lods
B $6D82,1,1 Width (bytes)