Advertisement
Leo40Bin

S2Cool Constants

May 25th, 2019
2,612
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  2. ; Equates section - Names for variables.
  3.  
  4. ; ---------------------------------------------------------------------------
  5. ; size variables - you'll get an informational error if you need to change these...
  6. ; they are all in units of bytes
  7. Size_of_DAC_samples =       $2F00
  8. Size_of_SEGA_sound =        $6174
  9. Size_of_Snd_driver_guess =  $1580 ; approximate post-compressed size of the Z80 sound driver
  10.  
  11. ; ---------------------------------------------------------------------------
  12. ; Object Status Table offsets (for everything between Object_RAM and Primary_Collision)
  13. ; ---------------------------------------------------------------------------
  14. ; universally followed object conventions:
  15. id =              0 ; object ID (if you change this, change insn1op and insn2op in s2.macrosetup.asm, if you still use them)
  16. render_flags =        1 ; bitfield ; bit 7 = onscreen flag, bit 0 = x mirror, bit 1 = y mirror, bit 2 = coordinate system, bit 6 = render subobjects
  17. art_tile =        2 ; and 3 ; start of sprite's art
  18. mappings =        4 ; and 5 and 6 and 7
  19. x_pos =           8 ; and 9 ... some objects use $A and $B as well when extra precision is required (see ObjectMove) ... for screen-space objects this is called x_pixel instead
  20. x_sub =          $A ; and $B
  21. y_pos =          $C ; and $D ... some objects use $E and $F as well when extra precision is required ... screen-space objects use y_pixel instead
  22. y_sub =          $E ; and $F
  23. priority =      $40 ; and $41
  24. width_pixels =      $19
  25. mapping_frame =     $1A
  26. ; ---------------------------------------------------------------------------
  27. ; conventions followed by most objects:
  28. x_vel =         $10 ; and $11 ; horizontal velocity
  29. y_vel =         $12 ; and $13 ; vertical velocity
  30. y_radius =      $16 ; collision height / 2
  31. x_radius =      $17 ; collision width / 2
  32. anim_frame =        $1B
  33. anim =          $1C
  34. next_anim =     $1D
  35. anim_frame_duration =   $1E
  36. status =        $22 ; note: exact meaning depends on the object... for sonic/tails: bit 0: leftfacing. bit 1: inair. bit 2: spinning. bit 3: onobject. bit 4: rolljumping. bit 5: pushing. bit 6: underwater.
  37. routine =       $24
  38. routine_secondary = $25
  39. angle =         $26 ; angle about the z axis (360 degrees = 256)
  40. ; ---------------------------------------------------------------------------
  41. ; conventions followed by many objects but NOT sonic/tails:
  42. collision_flags =   $20
  43. collision_property =    $21
  44. respawn_index =     $42 ; and $43
  45. subtype =       $28
  46. ; ---------------------------------------------------------------------------
  47. ; conventions specific to sonic/tails (Obj01, Obj02, and ObjDB):
  48. ; note: $1F, $20, and $21 are unused and available
  49. inertia =       $14 ; and $15 ; directionless representation of speed... not updated in the air
  50. flip_angle =        $27 ; angle about the x axis (360 degrees = 256) (twist/tumble)
  51. air_left =      $28
  52. flip_turned =       $29 ; 0 for normal, 1 to invert flipping (it's a 180 degree rotation about the axis of Sonic's spine, so he stays in the same position but looks turned around)
  53. obj_control =       $2A ; 0 for normal, 1 for hanging or for resting on a flipper, $81 for going through CNZ/OOZ/MTZ tubes or stopped in CNZ cages or stoppers or flying if Tails
  54. status_secondary =  $2B
  55. flips_remaining =   $2C ; number of flip revolutions remaining
  56. flip_speed =        $2D ; number of flip revolutions per frame / 256
  57. move_lock =     $2E ; and $2F ; horizontal control lock, counts down to 0
  58. invulnerable_time = $30 ; and $31 ; time remaining until you stop blinking
  59. invincibility_time =    $32 ; and $33 ; remaining
  60. speedshoes_time =   $34 ; and $35 ; remaining
  61. next_tilt =     $36 ; angle on ground in front of sprite
  62. tilt =          $37 ; angle on ground
  63. stick_to_convex =   $38 ; 0 for normal, 1 to make Sonic stick to convex surfaces like the rotating discs in Sonic 1 and 3 (unused in Sonic 2 but fully functional)
  64. spindash_flag =     $39 ; 0 for normal, 1 for charging a spindash or forced rolling
  65. pinball_mode =      spindash_flag
  66. spindash_counter =  $3A ; and $3B
  67. restart_countdown = spindash_counter; and 1+spindash_counter
  68. jumping =       $3C
  69. interact =      $3D ; RAM address of the last object Sonic stood on, minus $FFFFB000 and divided by $40
  70. top_solid_bit =   $3E ; the bit to check for top solidity (either $C or $E)
  71. lrb_solid_bit =     $3F ; the bit to check for left/right/bottom solidity (either $D or $F)
  72. ; ---------------------------------------------------------------------------
  73. ; conventions followed by several objects but NOT sonic/tails:
  74. y_pixel =       2+x_pos ; and 3+x_pos ; y coordinate for objects using screen-space coordinate system
  75. x_pixel =       x_pos ; and 1+x_pos ; x coordinate for objects using screen-space coordinate system
  76. parent =        $3E ; and $3F ; address of object that owns or spawned this one, if applicable
  77. ; TODO: $2C is often parent instead (see LoadChildObject); consider defining parent2 = $2C and changing some objoff_2Cs to that
  78. ; ---------------------------------------------------------------------------
  79. ; conventions followed by some/most bosses:
  80. boss_subtype        = $A
  81. boss_invulnerable_time  = $14
  82. boss_sine_count     = $1A   ;mapping_frame
  83. boss_routine        = $26   ;angle
  84. boss_defeated       = $2C
  85. boss_hitcount2      = $32
  86. boss_hurt_sonic     = $38   ; flag set by collision response routine when sonic has just been hurt (by boss?)
  87. ; ---------------------------------------------------------------------------
  88. ; when childsprites are activated (i.e. bit #6 of render_flags set)
  89. mainspr_mapframe    = $B
  90. mainspr_width       = $E
  91. mainspr_childsprites   = $F    ; amount of child sprites
  92. mainspr_height      = $14
  93. sub2_x_pos      = $10   ;x_vel
  94. sub2_y_pos      = $12   ;y_vel
  95. sub2_mapframe       = $15
  96. sub3_x_pos      = $16   ;y_radius
  97. sub3_y_pos      = $18   ;priority
  98. sub3_mapframe       = $1B   ;anim_frame
  99. sub4_x_pos      = $1C   ;anim
  100. sub4_y_pos      = $1E   ;anim_frame_duration
  101. sub4_mapframe       = $21   ;collision_property
  102. sub5_x_pos      = $22   ;status
  103. sub5_y_pos      = $24   ;routine
  104. sub5_mapframe       = $27
  105. sub6_x_pos      = $28   ;subtype
  106. sub6_y_pos      = $2A
  107. sub6_mapframe       = $2D
  108. sub7_x_pos      = $2E
  109. sub7_y_pos      = $30
  110. sub7_mapframe       = $33
  111. sub8_x_pos      = $34
  112. sub8_y_pos      = $36
  113. sub8_mapframe       = $39
  114. sub9_x_pos      = $3A
  115. sub9_y_pos      = $3C
  116. sub9_mapframe       = $3F
  117. next_subspr     = $6
  118. ; ---------------------------------------------------------------------------
  119. ; unknown or inconsistently used offsets that are not applicable to sonic/tails:
  120. ; (provided because rearrangement of the above values sometimes requires making space in here too)
  121. objoff_A =      2+x_pos ; note: x_pos can be 4 bytes, but sometimes the last 2 bytes of x_pos are used for other unrelated things
  122. objoff_B =      3+x_pos ; unused
  123. objoff_E =      2+y_pos ; unused
  124. objoff_F =      3+y_pos ; unused
  125. objoff_10 =     $10
  126. objoff_14 =     $14
  127. objoff_15 =     $15
  128. objoff_1F =     $1F
  129. objoff_27 =     $27
  130. objoff_28 =     $28 ; overlaps subtype, but a few objects use it for other things anyway
  131.  enum               objoff_29=$29,objoff_2A=$2A,objoff_2B=$2B,objoff_2C=$2C,objoff_2D=$2D,objoff_2E=$2E,objoff_2F=$2F
  132.  enum objoff_30=$30,objoff_31=$31,objoff_32=$32,objoff_33=$33,objoff_34=$34,objoff_35=$35,objoff_36=$36,objoff_37=$37
  133.  enum objoff_38=$38,objoff_39=$39,objoff_3A=$3A,objoff_3B=$3B,objoff_3C=$3C,objoff_3D=$3D,objoff_3E=$3E,objoff_3F=$3F
  134. ; ---------------------------------------------------------------------------
  135. ; Special Stage object properties:
  136. ss_dplc_timer = $23
  137. ss_x_pos = objoff_2A
  138. ss_x_sub = objoff_2C
  139. ss_y_pos = objoff_2E
  140. ss_y_sub = objoff_30
  141. ss_init_flip_timer = objoff_32
  142. ss_flip_timer = objoff_33
  143. ss_z_pos = objoff_34
  144. ss_hurt_timer = objoff_36
  145. ss_slide_timer = objoff_37
  146. ss_parent = objoff_38
  147. ss_rings_base = objoff_3C   ; word
  148. ss_rings_hundreds = objoff_3C
  149. ss_rings_tens = objoff_3D
  150. ss_rings_units = objoff_3E
  151. ss_last_angle_index = objoff_3F
  152. ; ---------------------------------------------------------------------------
  153. ; property of all objects:
  154. object_size =       $44 ; the size of an object
  155. next_object =       object_size
  156.  
  157. ; ---------------------------------------------------------------------------
  158. ; Bits 3-6 of an object's status after a SolidObject call is a
  159. ; bitfield with the following meaning:
  160. p1_standing_bit  = 3
  161. p2_standing_bit  = p1_standing_bit + 1
  162.  
  163. p1_standing      = 1<<p1_standing_bit
  164. p2_standing      = 1<<p2_standing_bit
  165.  
  166. pushing_bit_delta = 2
  167. p1_pushing_bit   = p1_standing_bit + pushing_bit_delta
  168. p2_pushing_bit   = p1_pushing_bit + 1
  169.  
  170. p1_pushing       = 1<<p1_pushing_bit
  171. p2_pushing       = 1<<p2_pushing_bit
  172.  
  173.  
  174. standing_mask    = p1_standing|p2_standing
  175. pushing_mask     = p1_pushing|p2_pushing
  176.  
  177. ; ---------------------------------------------------------------------------
  178. ; The high word of d6 after a SolidObject call is a bitfield
  179. ; with the following meaning:
  180. p1_touch_side_bit  = 0
  181. p2_touch_side_bit  = p1_touch_side_bit + 1
  182.  
  183. p1_touch_side      = 1<<p1_touch_side_bit
  184. p2_touch_side      = 1<<p2_touch_side_bit
  185.  
  186. touch_side_mask    = p1_touch_side|p2_touch_side
  187.  
  188. p1_touch_bottom_bit = p1_touch_side_bit + pushing_bit_delta
  189. p2_touch_bottom_bit = p1_touch_bottom_bit + 1
  190.  
  191. p1_touch_bottom    = 1<<p1_touch_bottom_bit
  192. p2_touch_bottom    = 1<<p2_touch_bottom_bit
  193.  
  194. touch_bottom_mask  = p1_touch_bottom|p2_touch_bottom
  195.  
  196. p1_touch_top_bit  = p1_touch_bottom_bit + pushing_bit_delta
  197. p2_touch_top_bit  = p1_touch_top_bit + 1
  198.  
  199. p1_touch_top      = 1<<p1_touch_top_bit
  200. p2_touch_top      = 1<<p2_touch_top_bit
  201.  
  202. touch_top_mask    = p1_touch_top|p2_touch_top
  203.  
  204. ; ---------------------------------------------------------------------------
  205. ; Controller Buttons
  206. ;
  207. ; Buttons bit numbers
  208. button_up:          EQU 0
  209. button_down:            EQU 1
  210. button_left:            EQU 2
  211. button_right:           EQU 3
  212. button_B:           EQU 4
  213. button_C:           EQU 5
  214. button_A:           EQU 6
  215. button_start:           EQU 7
  216. ; Buttons masks (1 << x == pow(2, x))
  217. button_up_mask:         EQU 1<<button_up    ; $01
  218. button_down_mask:       EQU 1<<button_down  ; $02
  219. button_left_mask:       EQU 1<<button_left  ; $04
  220. button_right_mask:      EQU 1<<button_right ; $08
  221. button_B_mask:          EQU 1<<button_B ; $10
  222. button_C_mask:          EQU 1<<button_C ; $20
  223. button_A_mask:          EQU 1<<button_A ; $40
  224. button_start_mask:      EQU 1<<button_start ; $80
  225.  
  226. ; ---------------------------------------------------------------------------
  227. ; Casino night bumpers
  228. bumper_id          = 0
  229. bumper_x           = 2
  230. bumper_y           = 4
  231. next_bumper        = 6
  232. prev_bumper_x      = bumper_x-next_bumper
  233.  
  234. ; ---------------------------------------------------------------------------
  235. ; status_secondary bitfield variables
  236. ;
  237. ; status_secondary variable bit numbers
  238. status_sec_hasShield:       EQU 0
  239. status_sec_isInvincible:    EQU 1
  240. status_sec_hasSpeedShoes:   EQU 2
  241. status_sec_isSliding:       EQU 7
  242. ; status_secondary variable masks (1 << x == pow(2, x))
  243. status_sec_hasShield_mask:  EQU 1<<status_sec_hasShield     ; $01
  244. status_sec_isInvincible_mask:   EQU 1<<status_sec_isInvincible  ; $02
  245. status_sec_hasSpeedShoes_mask:  EQU 1<<status_sec_hasSpeedShoes ; $04
  246. status_sec_isSliding_mask:  EQU 1<<status_sec_isSliding     ; $80
  247.  
  248. ; ---------------------------------------------------------------------------
  249. ; Constants that can be used instead of hard-coded IDs for various things.
  250. ; The "id" function allows to remove elements from an array/table without having
  251. ; to change the IDs everywhere in the code.
  252.  
  253. cur_zone_id := 0 ; the zone ID currently being declared
  254. cur_zone_str := "0" ; string representation of the above
  255.  
  256. ; macro to declare a zone ID
  257. ; this macro also declares constants of the form zone_id_X, where X is the ID of the zone in stock Sonic 2
  258. ; in order to allow level offset tables to be made dynamic
  259. zoneID macro zoneID,{INTLABEL}
  260. __LABEL__ = zoneID
  261. zone_id_{cur_zone_str} = zoneID
  262. cur_zone_id := cur_zone_id+1
  263. cur_zone_str := "\{cur_zone_id}"
  264.     endm
  265.  
  266. ; Zone IDs. These MUST be declared in the order in which their IDs are in stock Sonic 2, otherwise zone offset tables will screw up
  267. emerald_hill_zone zoneID    $00
  268. zone_1 zoneID           $01
  269. wood_zone zoneID        $02
  270. zone_3 zoneID           $03
  271. metropolis_zone zoneID      $04
  272. metropolis_zone_2 zoneID    $05
  273. wing_fortress_zone zoneID   $06
  274. hill_top_zone zoneID        $07
  275. hidden_palace_zone zoneID   $08
  276. zone_9 zoneID           $09
  277. oil_ocean_zone zoneID       $0A
  278. mystic_cave_zone zoneID     $0B
  279. casino_night_zone zoneID    $0C
  280. chemical_plant_zone zoneID  $0D
  281. death_egg_zone zoneID       $0E
  282. aquatic_ruin_zone zoneID    $0F
  283. sky_chase_zone zoneID       $10
  284.  
  285. ; NOTE: If you want to shift IDs around, set useFullWaterTables to 1 in the assembly options
  286.  
  287. ; set the number of zones
  288. no_of_zones = cur_zone_id
  289.  
  290. ; Zone and act IDs
  291. emerald_hill_zone_act_1 =   (emerald_hill_zone<<8)|$00
  292. emerald_hill_zone_act_2 =   (emerald_hill_zone<<8)|$01
  293. chemical_plant_zone_act_1 = (chemical_plant_zone<<8)|$00
  294. chemical_plant_zone_act_2 = (chemical_plant_zone<<8)|$01
  295. aquatic_ruin_zone_act_1 =   (aquatic_ruin_zone<<8)|$00
  296. aquatic_ruin_zone_act_2 =   (aquatic_ruin_zone<<8)|$01
  297. casino_night_zone_act_1 =   (casino_night_zone<<8)|$00
  298. casino_night_zone_act_2 =   (casino_night_zone<<8)|$01
  299. hill_top_zone_act_1 =       (hill_top_zone<<8)|$00
  300. hill_top_zone_act_2 =       (hill_top_zone<<8)|$01
  301. mystic_cave_zone_act_1 =    (mystic_cave_zone<<8)|$00
  302. mystic_cave_zone_act_2 =    (mystic_cave_zone<<8)|$01
  303. oil_ocean_zone_act_1 =      (oil_ocean_zone<<8)|$00
  304. oil_ocean_zone_act_2 =      (oil_ocean_zone<<8)|$01
  305. metropolis_zone_act_1 =     (metropolis_zone<<8)|$00
  306. metropolis_zone_act_2 =     (metropolis_zone<<8)|$01
  307. metropolis_zone_act_3 =     (metropolis_zone_2<<8)|$00
  308. sky_chase_zone_act_1 =      (sky_chase_zone<<8)|$00
  309. wing_fortress_zone_act_1 =  (wing_fortress_zone<<8)|$00
  310. death_egg_zone_act_1 =      (death_egg_zone<<8)|$00
  311. ; Prototype zone and act IDs
  312. wood_zone_act_1 =       (wood_zone<<8)|$00
  313. wood_zone_act_2 =       (wood_zone<<8)|$01
  314. hidden_palace_zone_act_1 =  (hidden_palace_zone<<8)|$00
  315. hidden_palace_zone_act_2 =  (hidden_palace_zone<<8)|$01
  316.  
  317. ; ---------------------------------------------------------------------------
  318. ; some variables and functions to help define those constants (redefined before a new set of IDs)
  319. offset :=   0       ; this is the start of the pointer table
  320. ptrsize :=  1       ; this is the size of a pointer (should be 1 if the ID is a multiple of the actual size)
  321. idstart :=  0       ; value to add to all IDs
  322.  
  323. ; function using these variables
  324. id function ptr,((ptr-offset)/ptrsize+idstart)
  325.  
  326. ; V-Int routines
  327. offset :=   Vint_SwitchTbl
  328. ptrsize :=  1
  329. idstart :=  0
  330.  
  331. VintID_Lag =        id(Vint_Lag_ptr) ; 0
  332. VintID_SEGA =       id(Vint_SEGA_ptr) ; 2
  333. VintID_Title =      id(Vint_Title_ptr) ; 4
  334. VintID_Unused6 =    id(Vint_Unused6_ptr) ; 6
  335. VintID_Level =      id(Vint_Level_ptr) ; 8
  336. VintID_S2SS =       id(Vint_S2SS_ptr) ; A
  337. VintID_TitleCard =  id(Vint_TitleCard_ptr) ; C
  338. VintID_UnusedE =    id(Vint_UnusedE_ptr) ; E
  339. VintID_Pause =      id(Vint_Pause_ptr) ; 10
  340. VintID_Fade =       id(Vint_Fade_ptr) ; 12
  341. VintID_PCM =        id(Vint_PCM_ptr) ; 14
  342. VintID_Menu =       id(Vint_Menu_ptr) ; 16
  343. VintID_Ending =     id(Vint_Ending_ptr) ; 18
  344. VintID_CtrlDMA =    id(Vint_CtrlDMA_ptr) ; 1A
  345.  
  346. ; Game modes
  347. offset :=   GameModesArray
  348. ptrsize :=  1
  349. idstart :=  0
  350.  
  351. GameModeID_SegaScreen =     id(GameMode_SegaScreen) ; 0
  352. GameModeID_TitleScreen =    id(GameMode_TitleScreen) ; 4
  353. GameModeID_Demo =       id(GameMode_Demo) ; 8
  354. GameModeID_Level =      id(GameMode_Level) ; C
  355. GameModeID_SpecialStage =   id(GameMode_SpecialStage) ; 10
  356. GameModeID_ContinueScreen = id(GameMode_ContinueScreen) ; 14
  357. GameModeID_2PResults =      id(GameMode_2PResults) ; 18
  358. GameModeID_2PLevelSelect =  id(GameMode_2PLevelSelect) ; 1C
  359. GameModeID_EndingSequence = id(GameMode_EndingSequence) ; 20
  360. GameModeID_OptionsMenu =    id(GameMode_OptionsMenu) ; 24
  361. GameModeID_LevelSelect =    id(GameMode_LevelSelect) ; 28
  362. GameModeFlag_TitleCard =    7 ; flag bit
  363. GameModeID_TitleCard =      1<<GameModeFlag_TitleCard ; flag mask
  364.  
  365. ; palette IDs
  366. offset :=   PalPointers
  367. ptrsize :=  8
  368. idstart :=  0
  369.  
  370. PalID_SEGA =    id(PalPtr_SEGA) ; 0
  371. PalID_Title =   id(PalPtr_Title) ; 1
  372. PalID_MenuB =   id(PalPtr_MenuB) ; 2
  373. PalID_BGND =    id(PalPtr_BGND) ; 3
  374. PalID_EHZ = id(PalPtr_EHZ) ; 4
  375. PalID_EHZ2 =    id(PalPtr_EHZ2) ; 5
  376. PalID_WZ =  id(PalPtr_WZ) ; 6
  377. PalID_EHZ3 =    id(PalPtr_EHZ3) ; 7
  378. PalID_MTZ = id(PalPtr_MTZ) ; 8
  379. PalID_MTZ2 =    id(PalPtr_MTZ2) ; 9
  380. PalID_WFZ = id(PalPtr_WFZ) ; A
  381. PalID_HTZ = id(PalPtr_HTZ) ; B
  382. PalID_HPZ = id(PalPtr_HPZ) ; C
  383. PalID_EHZ4 =    id(PalPtr_EHZ4) ; D
  384. PalID_OOZ = id(PalPtr_OOZ) ; E
  385. PalID_MCZ = id(PalPtr_MCZ) ; F
  386. PalID_CNZ = id(PalPtr_CNZ) ; 10
  387. PalID_CPZ = id(PalPtr_CPZ) ; 11
  388. PalID_DEZ = id(PalPtr_DEZ) ; 12
  389. PalID_ARZ = id(PalPtr_ARZ) ; 13
  390. PalID_SCZ = id(PalPtr_SCZ) ; 14
  391. PalID_HPZ_U =   id(PalPtr_HPZ_U) ; 15
  392. PalID_CPZ_U =   id(PalPtr_CPZ_U) ; 16
  393. PalID_ARZ_U =   id(PalPtr_ARZ_U) ; 17
  394. PalID_SS =  id(PalPtr_SS) ; 18
  395. PalID_MCZ_B =   id(PalPtr_MCZ_B) ; 19
  396. PalID_CNZ_B =   id(PalPtr_CNZ_B) ; 1A
  397. PalID_SS1 = id(PalPtr_SS1) ; 1B
  398. PalID_SS2 = id(PalPtr_SS2) ; 1C
  399. PalID_SS3 = id(PalPtr_SS3) ; 1D
  400. PalID_SS4 = id(PalPtr_SS4) ; 1E
  401. PalID_SS5 = id(PalPtr_SS5) ; 1F
  402. PalID_SS6 = id(PalPtr_SS6) ; 20
  403. PalID_SS7 = id(PalPtr_SS7) ; 21
  404. PalID_SS1_2p =  id(PalPtr_SS1_2p) ; 22
  405. PalID_SS2_2p =  id(PalPtr_SS2_2p) ; 23
  406. PalID_SS3_2p =  id(PalPtr_SS3_2p) ; 24
  407. PalID_OOZ_B =   id(PalPtr_OOZ_B) ; 25
  408. PalID_Menu =    id(PalPtr_Menu) ; 26
  409. PalID_Result =  id(PalPtr_Result) ; 27
  410. PalID_SonicTeam =   id(PalPtr_SonicTeam) ; 28
  411.  
  412. ; PLC IDs
  413. offset :=   ArtLoadCues
  414. ptrsize :=  2
  415. idstart :=  0
  416.  
  417. PLCID_Std1 =        id(PLCptr_Std1) ; 0
  418. PLCID_Std2 =        id(PLCptr_Std2) ; 1
  419. PLCID_StdWtr =      id(PLCptr_StdWtr) ; 2
  420. PLCID_GameOver =    id(PLCptr_GameOver) ; 3
  421. PLCID_Ehz1 =        id(PLCptr_Ehz1) ; 4
  422. PLCID_Ehz2 =        id(PLCptr_Ehz2) ; 5
  423. PLCID_Miles1up =    id(PLCptr_Miles1up) ; 6
  424. PLCID_MilesLife =   id(PLCptr_MilesLife) ; 7
  425. PLCID_Tails1up =    id(PLCptr_Tails1up) ; 8
  426. PLCID_TailsLife =   id(PLCptr_TailsLife) ; 9
  427. PLCID_Unused1 =     id(PLCptr_Unused1) ; A
  428. PLCID_Unused2 =     id(PLCptr_Unused2) ; B
  429. PLCID_Mtz1 =        id(PLCptr_Mtz1) ; C
  430. PLCID_Mtz2 =        id(PLCptr_Mtz2) ; D
  431. PLCID_Wfz1 =        id(PLCptr_Wfz1) ; 10
  432. PLCID_Wfz2 =        id(PLCptr_Wfz2) ; 11
  433. PLCID_Htz1 =        id(PLCptr_Htz1) ; 12
  434. PLCID_Htz2 =        id(PLCptr_Htz2) ; 13
  435. PLCID_Hpz1 =        id(PLCptr_Hpz1) ; 14
  436. PLCID_Hpz2 =        id(PLCptr_Hpz2) ; 15
  437. PLCID_Unused3 =     id(PLCptr_Unused3) ; 16
  438. PLCID_Unused4 =     id(PLCptr_Unused4) ; 17
  439. PLCID_Ooz1 =        id(PLCptr_Ooz1) ; 18
  440. PLCID_Ooz2 =        id(PLCptr_Ooz2) ; 19
  441. PLCID_Mcz1 =        id(PLCptr_Mcz1) ; 1A
  442. PLCID_Mcz2 =        id(PLCptr_Mcz2) ; 1B
  443. PLCID_Cnz1 =        id(PLCptr_Cnz1) ; 1C
  444. PLCID_Cnz2 =        id(PLCptr_Cnz2) ; 1D
  445. PLCID_Cpz1 =        id(PLCptr_Cpz1) ; 1E
  446. PLCID_Cpz2 =        id(PLCptr_Cpz2) ; 1F
  447. PLCID_Dez1 =        id(PLCptr_Dez1) ; 20
  448. PLCID_Dez2 =        id(PLCptr_Dez2) ; 21
  449. PLCID_Arz1 =        id(PLCptr_Arz1) ; 22
  450. PLCID_Arz2 =        id(PLCptr_Arz2) ; 23
  451. PLCID_Scz1 =        id(PLCptr_Scz1) ; 24
  452. PLCID_Scz2 =        id(PLCptr_Scz2) ; 25
  453. PLCID_Results =     id(PLCptr_Results) ; 26
  454. PLCID_Signpost =    id(PLCptr_Signpost) ; 27
  455. PLCID_CpzBoss =     id(PLCptr_CpzBoss) ; 28
  456. PLCID_EhzBoss =     id(PLCptr_EhzBoss) ; 29
  457. PLCID_HtzBoss =     id(PLCptr_HtzBoss) ; 2A
  458. PLCID_ArzBoss =     id(PLCptr_ArzBoss) ; 2B
  459. PLCID_MczBoss =     id(PLCptr_MczBoss) ; 2C
  460. PLCID_CnzBoss =     id(PLCptr_CnzBoss) ; 2D
  461. PLCID_MtzBoss =     id(PLCptr_MtzBoss) ; 2E
  462. PLCID_OozBoss =     id(PLCptr_OozBoss) ; 2F
  463. PLCID_FieryExplosion =  id(PLCptr_FieryExplosion) ; 30
  464. PLCID_DezBoss =     id(PLCptr_DezBoss) ; 31
  465. PLCID_EhzAnimals =  id(PLCptr_EhzAnimals) ; 32
  466. PLCID_MczAnimals =  id(PLCptr_MczAnimals) ; 33
  467. PLCID_HtzAnimals =  id(PLCptr_HtzAnimals) ; 34
  468. PLCID_MtzAnimals =  id(PLCptr_MtzAnimals) ; 34
  469. PLCID_WfzAnimals =  id(PLCptr_WfzAnimals) ; 34
  470. PLCID_DezAnimals =  id(PLCptr_DezAnimals) ; 35
  471. PLCID_HpzAnimals =  id(PLCptr_HpzAnimals) ; 36
  472. PLCID_OozAnimals =  id(PLCptr_OozAnimals) ; 37
  473. PLCID_SczAnimals =  id(PLCptr_SczAnimals) ; 38
  474. PLCID_CnzAnimals =  id(PLCptr_CnzAnimals) ; 39
  475. PLCID_CpzAnimals =  id(PLCptr_CpzAnimals) ; 3A
  476. PLCID_ArzAnimals =  id(PLCptr_ArzAnimals) ; 3B
  477. PLCID_SpecialStage =    id(PLCptr_SpecialStage) ; 3C
  478. PLCID_SpecStageBombs =  id(PLCptr_SpecStageBombs) ; 3D
  479. PLCID_WfzBoss =     id(PLCptr_WfzBoss) ; 3E
  480. PLCID_Tornado =     id(PLCptr_Tornado) ; 3F
  481. PLCID_Capsule =     id(PLCptr_Capsule) ; 40
  482. PLCID_Explosion =   id(PLCptr_Explosion) ; 41
  483. PLCID_ResultsTails =    id(PLCptr_ResultsTails) ; 42
  484.  
  485. ; Object IDs
  486. offset :=   Obj_Index
  487. ptrsize :=  4
  488. idstart :=  1
  489.  
  490. ObjID_Sonic =           id(ObjPtr_Sonic)        ; 01
  491. ObjID_Tails =           id(ObjPtr_Tails)        ; 02
  492. ObjID_PlaneSwitcher =       id(ObjPtr_PlaneSwitcher)    ; 03
  493. ObjID_WaterSurface =        id(ObjPtr_WaterSurface)     ; 04
  494. ObjID_TailsTails =      id(ObjPtr_TailsTails)       ; 05
  495. ObjID_Spiral =          id(ObjPtr_Spiral)       ; 06
  496. ObjID_Oil =         id(ObjPtr_Oil)          ; 07
  497. ObjID_SpindashDust =        id(ObjPtr_SpindashDust)     ; 08
  498. ObjID_Splash =          id(ObjPtr_Splash)       ; 08
  499. ObjID_SonicSS =         id(ObjPtr_SonicSS)      ; 09
  500. ObjID_SmallBubbles =        id(ObjPtr_SmallBubbles)     ; 0A
  501. ObjID_TippingFloor =        id(ObjPtr_TippingFloor)     ; 0B
  502. ObjID_Signpost =        id(ObjPtr_Signpost)     ; 0D
  503. ObjID_IntroStars =      id(ObjPtr_IntroStars)       ; 0E
  504. ObjID_TitleMenu =       id(ObjPtr_TitleMenu)        ; 0F
  505. ObjID_TailsSS =         id(ObjPtr_TailsSS)      ; 10
  506. ObjID_Bridge =          id(ObjPtr_Bridge)       ; 11
  507. ObjID_HPZEmerald =      id(ObjPtr_HPZEmerald)       ; 12
  508. ObjID_HPZWaterfall =        id(ObjPtr_HPZWaterfall)     ; 13
  509. ObjID_Seesaw =          id(ObjPtr_Seesaw)       ; 14
  510. ObjID_SwingingPlatform =    id(ObjPtr_SwingingPlatform) ; 15
  511. ObjID_HTZLift =         id(ObjPtr_HTZLift)      ; 16
  512. ObjID_ARZPlatform =     id(ObjPtr_ARZPlatform)      ; 18
  513. ObjID_EHZPlatform =     id(ObjPtr_EHZPlatform)      ; 18
  514. ObjID_CPZPlatform =     id(ObjPtr_CPZPlatform)      ; 19
  515. ObjID_OOZMovingPform =      id(ObjPtr_OOZMovingPform)   ; 19
  516. ObjID_WFZPlatform =     id(ObjPtr_WFZPlatform)      ; 19
  517. ObjID_HPZCollapsPform =     id(ObjPtr_HPZCollapsPform)  ; 1A
  518. ObjID_SpeedBooster =        id(ObjPtr_SpeedBooster)     ; 1B
  519. ObjID_Scenery =         id(ObjPtr_Scenery)      ; 1C
  520. ObjID_BridgeStake =     id(ObjPtr_BridgeStake)      ; 1C
  521. ObjID_FallingOil =      id(ObjPtr_FallingOil)       ; 1C
  522. ObjID_BlueBalls =       id(ObjPtr_BlueBalls)        ; 1D
  523. ObjID_CPZSpinTube =     id(ObjPtr_CPZSpinTube)      ; 1E
  524. ObjID_CollapsPform =        id(ObjPtr_CollapsPform)     ; 1F
  525. ObjID_LavaBubble =      id(ObjPtr_LavaBubble)       ; 20
  526. ObjID_HUD =         id(ObjPtr_HUD)          ; 21
  527. ObjID_ArrowShooter =        id(ObjPtr_ArrowShooter)     ; 22
  528. ObjID_FallingPillar =       id(ObjPtr_FallingPillar)    ; 23
  529. ObjID_ARZBubbles =      id(ObjPtr_ARZBubbles)       ; 24
  530. ObjID_Ring =            id(ObjPtr_Ring)         ; 25
  531. ObjID_Monitor =         id(ObjPtr_Monitor)      ; 26
  532. ObjID_Explosion =       id(ObjPtr_Explosion)        ; 27
  533. ObjID_Animal =          id(ObjPtr_Animal)       ; 28
  534. ObjID_Points =          id(ObjPtr_Points)       ; 29
  535. ObjID_Stomper =         id(ObjPtr_Stomper)      ; 2A
  536. ObjID_RisingPillar =        id(ObjPtr_RisingPillar)     ; 2B
  537. ObjID_LeavesGenerator =     id(ObjPtr_LeavesGenerator)  ; 2C
  538. ObjID_Barrier =         id(ObjPtr_Barrier)      ; 2D
  539. ObjID_MonitorContents =     id(ObjPtr_MonitorContents)  ; 2E
  540. ObjID_SmashableGround =     id(ObjPtr_SmashableGround)  ; 2F
  541. ObjID_RisingLava =      id(ObjPtr_RisingLava)       ; 30
  542. ObjID_LavaMarker =      id(ObjPtr_LavaMarker)       ; 31
  543. ObjID_BreakableBlock =      id(ObjPtr_BreakableBlock)   ; 32
  544. ObjID_BreakableRock =       id(ObjPtr_BreakableRock)    ; 32
  545. ObjID_OOZPoppingPform =     id(ObjPtr_OOZPoppingPform)  ; 33
  546. ObjID_TitleCard =       id(ObjPtr_TitleCard)        ; 34
  547. ObjID_InvStars =        id(ObjPtr_InvStars)     ; 35
  548. ObjID_Spikes =          id(ObjPtr_Spikes)       ; 36
  549. ObjID_LostRings =       id(ObjPtr_LostRings)        ; 37
  550. ObjID_Shield =          id(ObjPtr_Shield)       ; 38
  551. ObjID_GameOver =        id(ObjPtr_GameOver)     ; 39
  552. ObjID_TimeOver =        id(ObjPtr_TimeOver)     ; 39
  553. ObjID_Results =         id(ObjPtr_Results)      ; 3A
  554. ObjID_OOZLauncher =     id(ObjPtr_OOZLauncher)      ; 3D
  555. ObjID_EggPrison =       id(ObjPtr_EggPrison)        ; 3E
  556. ObjID_Fan =         id(ObjPtr_Fan)          ; 3F
  557. ObjID_Springboard =     id(ObjPtr_Springboard)      ; 40
  558. ObjID_Spring =          id(ObjPtr_Spring)       ; 41
  559. ObjID_SteamSpring =     id(ObjPtr_SteamSpring)      ; 42
  560. ObjID_SlidingSpike =        id(ObjPtr_SlidingSpike)     ; 43
  561. ObjID_RoundBumper =     id(ObjPtr_RoundBumper)      ; 44
  562. ObjID_OOZSpring =       id(ObjPtr_OOZSpring)        ; 45
  563. ObjID_OOZBall =         id(ObjPtr_OOZBall)      ; 46
  564. ObjID_Button =          id(ObjPtr_Button)       ; 47
  565. ObjID_LauncherBall =        id(ObjPtr_LauncherBall)     ; 48
  566. ObjID_EHZWaterfall =        id(ObjPtr_EHZWaterfall)     ; 49
  567. ObjID_Octus =           id(ObjPtr_Octus)        ; 4A
  568. ObjID_Buzzer =          id(ObjPtr_Buzzer)       ; 4B
  569. ObjID_Aquis =           id(ObjPtr_Aquis)        ; 50
  570. ObjID_CNZBoss =         id(ObjPtr_CNZBoss)      ; 51
  571. ObjID_HTZBoss =         id(ObjPtr_HTZBoss)      ; 52
  572. ObjID_MTZBossOrb =      id(ObjPtr_MTZBossOrb)       ; 53
  573. ObjID_MTZBoss =         id(ObjPtr_MTZBoss)      ; 54
  574. ObjID_OOZBoss =         id(ObjPtr_OOZBoss)      ; 55
  575. ObjID_EHZBoss =         id(ObjPtr_EHZBoss)      ; 56
  576. ObjID_MCZBoss =         id(ObjPtr_MCZBoss)      ; 57
  577. ObjID_BossExplosion =       id(ObjPtr_BossExplosion)    ; 58
  578. ObjID_SSEmerald =       id(ObjPtr_SSEmerald)        ; 59
  579. ObjID_SSMessage =       id(ObjPtr_SSMessage)        ; 5A
  580. ObjID_SSRingSpill =     id(ObjPtr_SSRingSpill)      ; 5B
  581. ObjID_Masher =          id(ObjPtr_Masher)       ; 5C
  582. ObjID_CPZBoss =         id(ObjPtr_CPZBoss)      ; 5D
  583. ObjID_SSHUD =           id(ObjPtr_SSHUD)        ; 5E
  584. ObjID_StartBanner =     id(ObjPtr_StartBanner)      ; 5F
  585. ObjID_EndingController =    id(ObjPtr_EndingController) ; 5F
  586. ObjID_SSRing =          id(ObjPtr_SSRing)       ; 60
  587. ObjID_SSBomb =          id(ObjPtr_SSBomb)       ; 61
  588. ObjID_SSShadow =        id(ObjPtr_SSShadow)     ; 63
  589. ObjID_MTZTwinStompers =     id(ObjPtr_MTZTwinStompers)  ; 64
  590. ObjID_MTZLongPlatform =     id(ObjPtr_MTZLongPlatform)  ; 65
  591. ObjID_MTZSpringWall =       id(ObjPtr_MTZSpringWall)    ; 66
  592. ObjID_MTZSpinTube =     id(ObjPtr_MTZSpinTube)      ; 67
  593. ObjID_SpikyBlock =      id(ObjPtr_SpikyBlock)       ; 68
  594. ObjID_Nut =         id(ObjPtr_Nut)          ; 69
  595. ObjID_MCZRotPforms =        id(ObjPtr_MCZRotPforms)     ; 6A
  596. ObjID_MTZMovingPforms =     id(ObjPtr_MTZMovingPforms)  ; 6A
  597. ObjID_MTZPlatform =     id(ObjPtr_MTZPlatform)      ; 6B
  598. ObjID_CPZSquarePform =      id(ObjPtr_CPZSquarePform)   ; 6B
  599. ObjID_Conveyor =        id(ObjPtr_Conveyor)     ; 6C
  600. ObjID_FloorSpike =      id(ObjPtr_FloorSpike)       ; 6D
  601. ObjID_LargeRotPform =       id(ObjPtr_LargeRotPform)    ; 6E
  602. ObjID_SSResults =       id(ObjPtr_SSResults)        ; 6F
  603. ObjID_Cog =         id(ObjPtr_Cog)          ; 70
  604. ObjID_MTZLavaBubble =       id(ObjPtr_MTZLavaBubble)    ; 71
  605. ObjID_HPZBridgeStake =      id(ObjPtr_HPZBridgeStake)   ; 71
  606. ObjID_PulsingOrb =      id(ObjPtr_PulsingOrb)       ; 71
  607. ObjID_CNZConveyorBelt =     id(ObjPtr_CNZConveyorBelt)  ; 72
  608. ObjID_RotatingRings =       id(ObjPtr_RotatingRings)    ; 73
  609. ObjID_InvisibleBlock =      id(ObjPtr_InvisibleBlock)   ; 74
  610. ObjID_MCZBrick =        id(ObjPtr_MCZBrick)     ; 75
  611. ObjID_SlidingSpikes =       id(ObjPtr_SlidingSpikes)    ; 76
  612. ObjID_MCZBridge =       id(ObjPtr_MCZBridge)        ; 77
  613. ObjID_CPZStaircase =        id(ObjPtr_CPZStaircase)     ; 78
  614. ObjID_Starpost =        id(ObjPtr_Starpost)     ; 79
  615. ObjID_SidewaysPform =       id(ObjPtr_SidewaysPform)    ; 7A
  616. ObjID_PipeExitSpring =      id(ObjPtr_PipeExitSpring)   ; 7B
  617. ObjID_CPZPylon =        id(ObjPtr_CPZPylon)     ; 7C
  618. ObjID_SuperSonicStars =     id(ObjPtr_SuperSonicStars)  ; 7E
  619. ObjID_VineSwitch =      id(ObjPtr_VineSwitch)       ; 7F
  620. ObjID_MovingVine =      id(ObjPtr_MovingVine)       ; 80
  621. ObjID_MCZDrawbridge =       id(ObjPtr_MCZDrawbridge)    ; 81
  622. ObjID_SwingingPform =       id(ObjPtr_SwingingPform)    ; 82
  623. ObjID_ARZRotPforms =        id(ObjPtr_ARZRotPforms)     ; 83
  624. ObjID_ForcedSpin =      id(ObjPtr_ForcedSpin)       ; 84
  625. ObjID_PinballMode =     id(ObjPtr_PinballMode)      ; 84
  626. ObjID_LauncherSpring =      id(ObjPtr_LauncherSpring)   ; 85
  627. ObjID_Flipper =         id(ObjPtr_Flipper)      ; 86
  628. ObjID_SSNumberOfRings =     id(ObjPtr_SSNumberOfRings)  ; 87
  629. ObjID_SSTailsTails =        id(ObjPtr_SSTailsTails)     ; 88
  630. ObjID_ARZBoss =         id(ObjPtr_ARZBoss)      ; 89
  631. ObjID_WFZPalSwitcher =      id(ObjPtr_WFZPalSwitcher)   ; 8B
  632. ObjID_Whisp =           id(ObjPtr_Whisp)        ; 8C
  633. ObjID_GrounderInWall =      id(ObjPtr_GrounderInWall)   ; 8D
  634. ObjID_GrounderInWall2 =     id(ObjPtr_GrounderInWall2)  ; 8E
  635. ObjID_GrounderWall =        id(ObjPtr_GrounderWall)     ; 8F
  636. ObjID_GrounderRocks =       id(ObjPtr_GrounderRocks)    ; 90
  637. ObjID_ChopChop =        id(ObjPtr_ChopChop)     ; 91
  638. ObjID_Spiker =          id(ObjPtr_Spiker)       ; 92
  639. ObjID_SpikerDrill =     id(ObjPtr_SpikerDrill)      ; 93
  640. ObjID_Rexon =           id(ObjPtr_Rexon)        ; 94
  641. ObjID_Sol =         id(ObjPtr_Sol)          ; 95
  642. ObjID_Rexon2 =          id(ObjPtr_Rexon2)       ; 96
  643. ObjID_RexonHead =       id(ObjPtr_RexonHead)        ; 97
  644. ObjID_Projectile =      id(ObjPtr_Projectile)       ; 98
  645. ObjID_Nebula =          id(ObjPtr_Nebula)       ; 99
  646. ObjID_Turtloid =        id(ObjPtr_Turtloid)     ; 9A
  647. ObjID_TurtloidRider =       id(ObjPtr_TurtloidRider)    ; 9B
  648. ObjID_BalkiryJet =      id(ObjPtr_BalkiryJet)       ; 9C
  649. ObjID_Coconuts =        id(ObjPtr_Coconuts)     ; 9D
  650. ObjID_Crawlton =        id(ObjPtr_Crawlton)     ; 9E
  651. ObjID_Shellcracker =        id(ObjPtr_Shellcracker)     ; 9F
  652. ObjID_ShellcrackerClaw =    id(ObjPtr_ShellcrackerClaw) ; A0
  653. ObjID_Slicer =          id(ObjPtr_Slicer)       ; A1
  654. ObjID_SlicerPincers =       id(ObjPtr_SlicerPincers)    ; A2
  655. ObjID_Flasher =         id(ObjPtr_Flasher)      ; A3
  656. ObjID_Asteron =         id(ObjPtr_Asteron)      ; A4
  657. ObjID_Spiny =           id(ObjPtr_Spiny)        ; A5
  658. ObjID_SpinyOnWall =     id(ObjPtr_SpinyOnWall)      ; A6
  659. ObjID_Grabber =         id(ObjPtr_Grabber)      ; A7
  660. ObjID_GrabberLegs =     id(ObjPtr_GrabberLegs)      ; A8
  661. ObjID_GrabberBox =      id(ObjPtr_GrabberBox)       ; A9
  662. ObjID_GrabberString =       id(ObjPtr_GrabberString)    ; AA
  663. ObjID_Balkiry =         id(ObjPtr_Balkiry)      ; AC
  664. ObjID_CluckerBase =     id(ObjPtr_CluckerBase)      ; AD
  665. ObjID_Clucker =         id(ObjPtr_Clucker)      ; AE
  666. ObjID_MechaSonic =      id(ObjPtr_MechaSonic)       ; AF
  667. ObjID_SonicOnSegaScr =  id(ObjPtr_SonicOnSegaScr)   ; B0
  668. ObjID_SegaHideTM =      id(ObjPtr_SegaHideTM)   ; B1
  669. ObjID_Tornado =         id(ObjPtr_Tornado)      ; B2
  670. ObjID_Cloud =           id(ObjPtr_Cloud)        ; B3
  671. ObjID_VPropeller =      id(ObjPtr_VPropeller)       ; B4
  672. ObjID_HPropeller =      id(ObjPtr_HPropeller)       ; B5
  673. ObjID_TiltingPlatform =     id(ObjPtr_TiltingPlatform)  ; B6
  674. ObjID_VerticalLaser =       id(ObjPtr_VerticalLaser)    ; B7
  675. ObjID_WallTurret =      id(ObjPtr_WallTurret)       ; B8
  676. ObjID_Laser =           id(ObjPtr_Laser)        ; B9
  677. ObjID_WFZWheel =        id(ObjPtr_WFZWheel)     ; BA
  678. ObjID_WFZShipFire =     id(ObjPtr_WFZShipFire)      ; BC
  679. ObjID_SmallMetalPform =     id(ObjPtr_SmallMetalPform)  ; BD
  680. ObjID_LateralCannon =       id(ObjPtr_LateralCannon)    ; BE
  681. ObjID_WFZStick =        id(ObjPtr_WFZStick)     ; BF
  682. ObjID_SpeedLauncher =       id(ObjPtr_SpeedLauncher)    ; C0
  683. ObjID_BreakablePlating =    id(ObjPtr_BreakablePlating) ; C1
  684. ObjID_Rivet =           id(ObjPtr_Rivet)        ; C2
  685. ObjID_TornadoSmoke =        id(ObjPtr_TornadoSmoke)     ; C3
  686. ObjID_TornadoSmoke2 =       id(ObjPtr_TornadoSmoke2)    ; C4
  687. ObjID_WFZBoss =         id(ObjPtr_WFZBoss)      ; C5
  688. ObjID_Eggman =          id(ObjPtr_Eggman)       ; C6
  689. ObjID_Eggrobo =         id(ObjPtr_Eggrobo)      ; C7
  690. ObjID_Crawl =           id(ObjPtr_Crawl)        ; C8
  691. ObjID_TtlScrPalChanger =    id(ObjPtr_TtlScrPalChanger) ; C9
  692. ObjID_CutScene =        id(ObjPtr_CutScene)     ; CA
  693. ObjID_EndingSeqClouds =     id(ObjPtr_EndingSeqClouds)  ; CB
  694. ObjID_EndingSeqTrigger =    id(ObjPtr_EndingSeqTrigger) ; CC
  695. ObjID_EndingSeqBird =       id(ObjPtr_EndingSeqBird)    ; CD
  696. ObjID_EndingSeqSonic =      id(ObjPtr_EndingSeqSonic)   ; CE
  697. ObjID_EndingSeqTails =      id(ObjPtr_EndingSeqTails)   ; CE
  698. ObjID_TornadoHelixes =      id(ObjPtr_TornadoHelixes)   ; CF
  699. ObjID_CNZRectBlocks =       id(ObjPtr_CNZRectBlocks)    ; D2
  700. ObjID_BombPrize =       id(ObjPtr_BombPrize)        ; D3
  701. ObjID_CNZBigBlock =     id(ObjPtr_CNZBigBlock)      ; D4
  702. ObjID_Elevator =        id(ObjPtr_Elevator)     ; D5
  703. ObjID_PointPokey =      id(ObjPtr_PointPokey)       ; D6
  704. ObjID_Bumper =          id(ObjPtr_Bumper)       ; D7
  705. ObjID_BonusBlock =      id(ObjPtr_BonusBlock)       ; D8
  706. ObjID_Grab =            id(ObjPtr_Grab)         ; D9
  707. ObjID_ContinueText =        id(ObjPtr_ContinueText)     ; DA
  708. ObjID_ContinueIcons =       id(ObjPtr_ContinueIcons)    ; DA
  709. ObjID_ContinueChars =       id(ObjPtr_ContinueChars)    ; DB
  710. ObjID_RingPrize =       id(ObjPtr_RingPrize)        ; DC
  711.  
  712. ; Music IDs
  713. offset :=   z80_MusicPointers
  714. ptrsize :=  2
  715. idstart :=  1
  716.  
  717. MusID__First = idstart
  718. MusID_2PResult =    id(MusPtr_2PResult) ; 01
  719. MusID_EHZ =     id(MusPtr_EHZ)      ; 02
  720. MusID_MCZ_2P =      id(MusPtr_MCZ_2P)   ; 03
  721. MusID_OOZ =     id(MusPtr_OOZ)      ; 04
  722. MusID_MTZ =     id(MusPtr_MTZ)      ; 05
  723. MusID_HTZ =     id(MusPtr_HTZ)      ; 06
  724. MusID_ARZ =     id(MusPtr_ARZ)      ; 07
  725. MusID_CNZ_2P =      id(MusPtr_CNZ_2P)   ; 08
  726. MusID_CNZ =     id(MusPtr_CNZ)      ; 09
  727. MusID_DEZ =     id(MusPtr_DEZ)      ; 0A
  728. MusID_MCZ =     id(MusPtr_MCZ)      ; 0B
  729. MusID_EHZ_2P =      id(MusPtr_EHZ_2P)   ; 0C
  730. MusID_SCZ =     id(MusPtr_SCZ)      ; 0D
  731. MusID_CPZ =     id(MusPtr_CPZ)      ; 0E
  732. MusID_WFZ =     id(MusPtr_WFZ)      ; 0F
  733. MusID_HPZ =     id(MusPtr_HPZ)      ; 10
  734. MusID_Options =     id(MusPtr_Options)  ; 11
  735. MusID_SpecStage =   id(MusPtr_SpecStage)    ; 12
  736. MusID_Boss =        id(MusPtr_Boss)     ; 13
  737. MusID_EndBoss =     id(MusPtr_EndBoss)  ; 14
  738. MusID_Ending =      id(MusPtr_Ending)   ; 15
  739. MusID_SuperSonic =  id(MusPtr_SuperSonic)   ; 16
  740. MusID_Invincible =  id(MusPtr_Invincible)   ; 17
  741. MusID_ExtraLife =   id(MusPtr_ExtraLife)    ; 18
  742. MusID_Title =       id(MusPtr_Title)    ; 19
  743. MusID_EndLevel =    id(MusPtr_EndLevel) ; 1A
  744. MusID_GameOver =    id(MusPtr_GameOver) ; 1B
  745. MusID_Continue =    id(MusPtr_Continue) ; 1C
  746. MusID_Emerald =     id(MusPtr_Emerald)  ; 1D
  747. MusID_Credits =     id(MusPtr_Credits)  ; 1E
  748. MusID_Countdown =   id(MusPtr_Countdown)    ; 1F
  749. MusID__End =        id(zMusIDPtr__End)  ; 20
  750.  
  751. ; Sound IDs
  752. offset :=   z80_SFXPointers
  753. ptrsize :=  2
  754. idstart :=  MusID__End
  755.  
  756. SndID__First = idstart
  757. SndID_Jump =        id(Sound_20_Ptr)   ; 20
  758. SndID_Checkpoint =  id(Sound_21_Ptr)   ; 21
  759. SndID_SpikeSwitch = id(Sound_22_Ptr)   ; 22
  760. SndID_Hurt =        id(Sound_23_Ptr)   ; 23
  761. SndID_Skidding =    id(Sound_24_Ptr)   ; 24
  762. SndID_BlockPush =   id(Sound_25_Ptr)   ; 25
  763. SndID_HurtBySpikes =    id(Sound_26_Ptr)   ; 26
  764. SndID_Sparkle =     id(Sound_27_Ptr)   ; 27
  765. SndID_Beep =        id(Sound_28_Ptr)   ; 28
  766. SndID_SSItem =      id(Sound_29_Ptr)   ; 29    ; Sonic 1 leftover
  767. SndID_Splash =      id(Sound_2A_Ptr)   ; 2A
  768. SndID_Swish =       id(Sound_2B_Ptr)   ; 2B
  769. SndID_BossHit =     id(Sound_2C_Ptr)   ; 2C
  770. SndID_InhalingBubble =  id(Sound_2D_Ptr)   ; 2D
  771. SndID_ArrowFiring = id(Sound_2E_Ptr)   ; 2E
  772. SndID_LavaBall =    id(Sound_2E_Ptr)   ; 2E
  773. SndID_Shield =      id(Sound_2F_Ptr)   ; 2F
  774. SndID_LaserBeam =   id(Sound_30_Ptr)   ; 30
  775. SndID_Electric =    id(Sound_31_Ptr)   ; 31    ; Sonic 1 leftover
  776. SndID_Drown =       id(Sound_32_Ptr)   ; 32
  777. SndID_FireBurn =    id(Sound_33_Ptr)   ; 33
  778. SndID_Bumper =      id(Sound_34_Ptr)   ; 34
  779. SndID_Ring =        id(Sound_35_Ptr)   ; 35
  780. SndID_RingRight =   id(Sound_35_Ptr)   ; 35
  781. SndID_SpikesMove =  id(Sound_36_Ptr)   ; 36
  782. SndID_Rumbling =    id(Sound_37_Ptr)   ; 37
  783. SndID_Smash =       id(Sound_39_Ptr)   ; 39
  784. SndID_SSGlass =     id(Sound_3A_Ptr)   ; 3A    ; Sonic 1 leftover
  785. SndID_DoorSlam =    id(Sound_3B_Ptr)   ; 3B
  786. SndID_SpindashRelease = id(Sound_3C_Ptr)   ; 3C
  787. SndID_Hammer =      id(Sound_3D_Ptr)   ; 3D
  788. SndID_Roll =        id(Sound_3E_Ptr)   ; 3E
  789. SndID_ContinueJingle =  id(Sound_3F_Ptr)   ; 3F
  790. SndID_CasinoBonus = id(Sound_40_Ptr)   ; 40
  791. SndID_Explosion =   id(Sound_41_Ptr)   ; 41
  792. SndID_WaterWarning =    id(Sound_42_Ptr)   ; 42
  793. SndID_EnterGiantRing =  id(Sound_43_Ptr)   ; 43    ; Sonic 1 leftover
  794. SndID_BossExplosion =   id(Sound_44_Ptr)   ; 44
  795. SndID_TallyEnd =    id(Sound_45_Ptr)   ; 45
  796. SndID_RingSpill =   id(Sound_46_Ptr)   ; 46
  797. SndID_ChainRise =   id(Sound_47_Ptr)   ; 47    ; Sonic 1 leftover
  798. SndID_Flamethrower =    id(Sound_48_Ptr)   ; 48
  799. SndID_Bonus =       id(Sound_49_Ptr)   ; 49    ; Sonic 1 leftover
  800. SndID_SpecStageEntry =  id(Sound_4A_Ptr)   ; 4A
  801. SndID_SlowSmash =   id(Sound_4B_Ptr)   ; 4B
  802. SndID_Spring =      id(Sound_4C_Ptr)   ; 4C
  803. SndID_Blip =        id(Sound_4D_Ptr)   ; 4D
  804. SndID_RingLeft =    id(Sound_4E_Ptr)   ; 4E
  805. SndID_Signpost =    id(Sound_4F_Ptr)   ; 4F
  806. SndID_CNZBossZap =  id(Sound_50_Ptr)   ; 50
  807. SndID_Signpost2P =  id(Sound_53_Ptr)   ; 53
  808. SndID_OOZLidPop =   id(Sound_54_Ptr)   ; 54
  809. SndID_SlidingSpike =    id(Sound_55_Ptr)   ; 55
  810. SndID_CNZElevator = id(Sound_56_Ptr)   ; 56
  811. SndID_PlatformKnock =   id(Sound_57_Ptr)   ; 57
  812. SndID_BonusBumper = id(Sound_58_Ptr)   ; 58
  813. SndID_LargeBumper = id(Sound_59_Ptr)   ; 59
  814. SndID_Gloop =       id(Sound_5A_Ptr)   ; 5A
  815. SndID_PreArrowFiring =  id(Sound_5B_Ptr)   ; 5B
  816. SndID_Fire =        id(Sound_5C_Ptr)   ; 5C
  817. SndID_ArrowStick =  id(Sound_5D_Ptr)   ; 5D
  818. SndID_Helicopter =  id(Sound_5E_Ptr)   ; 5E
  819. SndID_SuperTransform =  id(Sound_5F_Ptr)   ; 5F
  820. SndID_SpindashRev = id(Sound_60_Ptr)   ; 60
  821. SndID_Rumbling2 =   id(Sound_61_Ptr)   ; 61
  822. SndID_CNZLaunch =   id(Sound_62_Ptr)   ; 62
  823. SndID_Flipper =     id(Sound_63_Ptr)   ; 63
  824. SndID_HTZLiftClick =    id(Sound_64_Ptr)   ; 64
  825. SndID_Leaves =      id(Sound_65_Ptr)   ; 65
  826. SndID_MegaMackDrop =    id(Sound_66_Ptr)   ; 66
  827. SndID_DrawbridgeMove =  id(Sound_67_Ptr)   ; 67
  828. SndID_QuickDoorSlam =   id(Sound_68_Ptr)   ; 68
  829. SndID_DrawbridgeDown =  id(Sound_69_Ptr)   ; 69
  830. SndID_LaserBurst =  id(Sound_6A_Ptr)   ; 6A
  831. SndID_Scatter =     id(Sound_6B_Ptr)   ; 6B
  832. SndID_LaserFloor =  id(Sound_6B_Ptr)   ; 6B
  833. SndID_Teleport =    id(Sound_6C_Ptr)   ; 6C
  834. SndID_Error =       id(Sound_6D_Ptr)   ; 6D
  835. SndID_MechaSonicBuzz =  id(Sound_6E_Ptr)   ; 6E
  836. SndID_LargeLaser =  id(Sound_6F_Ptr)   ; 6F
  837. SndID_OilSlide =    id(Sound_70_Ptr)   ; 70
  838. SndID__End =        id(Sound_End_Ptr)   ; 71
  839.  
  840. ; Sound command IDs
  841. MusID_StopSFX =         FadeID__First+3         ; F8
  842. MusID_FadeOut =         FadeID__First           ; F9
  843. SndID_SegaSound =       SndID_Sega              ; FA
  844. MusID_SpeedUp =         8                       ; FB
  845. MusID_SlowDown =        0                       ; FC
  846. MusID_Stop =            $FE                     ; FD
  847. MusID_Pause =           1                       ; FE
  848. MusID_Unpause =         $80                     ; FF
  849.  
  850. ; 2P VS results screens
  851. ;offset := TwoPlayerResultsPointers
  852. ;ptrsize := 8
  853. ;idstart := 0
  854.  
  855. VsRSID_Act =    0
  856. VsRSID_Zone =   1
  857. VsRSID_Game =   2
  858. VsRSID_SS = 3
  859. VsRSID_SSZone = 4
  860.  
  861. ; Animation IDs
  862. offset :=   SonicAniData
  863. ptrsize :=  2
  864. idstart :=  0
  865.  
  866. AniIDSonAni_Walk            = id(SonAni_Walk_ptr)           ;  0 ;   0
  867. AniIDSonAni_Run             = id(SonAni_Run_ptr)            ;  1 ;   1
  868. AniIDSonAni_Roll            = id(SonAni_Roll_ptr)           ;  2 ;   2
  869. AniIDSonAni_Roll2           = id(SonAni_Roll2_ptr)          ;  3 ;   3
  870. AniIDSonAni_Push            = id(SonAni_Push_ptr)           ;  4 ;   4
  871. AniIDSonAni_Wait            = id(SonAni_Wait_ptr)           ;  5 ;   5
  872. AniIDSonAni_Balance         = id(SonAni_Balance_ptr)        ;  6 ;   6
  873. AniIDSonAni_LookUp          = id(SonAni_LookUp_ptr)         ;  7 ;   7
  874. AniIDSonAni_Duck            = id(SonAni_Duck_ptr)           ;  8 ;   8
  875. AniIDSonAni_Spindash        = id(SonAni_Spindash_ptr)       ;  9 ;   9
  876. AniIDSonAni_Blink           = id(SonAni_Blink_ptr)          ; 10 ;  $A
  877. AniIDSonAni_GetUp           = id(SonAni_GetUp_ptr)          ; 11 ;  $B
  878. AniIDSonAni_Balance2        = id(SonAni_Balance2_ptr)       ; 12 ;  $C
  879. AniIDSonAni_Stop            = id(SonAni_Stop_ptr)           ; 13 ;  $D
  880. AniIDSonAni_Float           = id(SonAni_Float_ptr)          ; 14 ;  $E
  881. AniIDSonAni_Float2          = id(SonAni_Float2_ptr)         ; 15 ;  $F
  882. AniIDSonAni_Spring          = id(SonAni_Spring_ptr)         ; 16 ; $10
  883. AniIDSonAni_Hang            = id(SonAni_Hang_ptr)           ; 17 ; $11
  884. AniIDSonAni_Dash2           = id(SonAni_Dash2_ptr)          ; 18 ; $12
  885. AniIDSonAni_Dash3           = id(SonAni_Dash3_ptr)          ; 19 ; $13
  886. AniIDSonAni_Hang2           = id(SonAni_Hang2_ptr)          ; 20 ; $14
  887. AniIDSonAni_Bubble          = id(SonAni_Bubble_ptr)         ; 21 ; $15
  888. AniIDSonAni_DeathBW         = id(SonAni_DeathBW_ptr)        ; 22 ; $16
  889. AniIDSonAni_Drown           = id(SonAni_Drown_ptr)          ; 23 ; $17
  890. AniIDSonAni_Death           = id(SonAni_Death_ptr)          ; 24 ; $18
  891. AniIDSonAni_Hurt            = id(SonAni_Hurt_ptr)           ; 25 ; $19
  892. AniIDSonAni_Hurt2           = id(SonAni_Hurt2_ptr)          ; 26 ; $1A
  893. AniIDSonAni_Slide           = id(SonAni_Slide_ptr)          ; 27 ; $1B
  894. AniIDSonAni_Blank           = id(SonAni_Blank_ptr)          ; 28 ; $1C
  895. AniIDSonAni_Balance3        = id(SonAni_Balance3_ptr)       ; 29 ; $1D
  896. AniIDSonAni_Balance4        = id(SonAni_Balance4_ptr)       ; 30 ; $1E
  897. AniIDSupSonAni_Transform    = id(SupSonAni_Transform_ptr)   ; 31 ; $1F
  898. AniIDSonAni_Lying           = id(SonAni_Lying_ptr)          ; 32 ; $20
  899. AniIDSonAni_LieDown         = id(SonAni_LieDown_ptr)        ; 33 ; $21
  900.  
  901.  
  902. offset :=   TailsAniData
  903. ptrsize :=  2
  904. idstart :=  0
  905.  
  906. AniIDTailsAni_Walk          = id(TailsAni_Walk_ptr)         ;  0 ;   0
  907. AniIDTailsAni_Run           = id(TailsAni_Run_ptr)          ;  1 ;   1
  908. AniIDTailsAni_Roll          = id(TailsAni_Roll_ptr)         ;  2 ;   2
  909. AniIDTailsAni_Roll2         = id(TailsAni_Roll2_ptr)        ;  3 ;   3
  910. AniIDTailsAni_Push          = id(TailsAni_Push_ptr)         ;  4 ;   4
  911. AniIDTailsAni_Wait          = id(TailsAni_Wait_ptr)         ;  5 ;   5
  912. AniIDTailsAni_Balance       = id(TailsAni_Balance_ptr)      ;  6 ;   6
  913. AniIDTailsAni_LookUp        = id(TailsAni_LookUp_ptr)       ;  7 ;   7
  914. AniIDTailsAni_Duck          = id(TailsAni_Duck_ptr)         ;  8 ;   8
  915. AniIDTailsAni_Spindash      = id(TailsAni_Spindash_ptr)     ;  9 ;   9
  916. AniIDTailsAni_Dummy1        = id(TailsAni_Dummy1_ptr)       ; 10 ;  $A
  917. AniIDTailsAni_Dummy2        = id(TailsAni_Dummy2_ptr)       ; 11 ;  $B
  918. AniIDTailsAni_Dummy3        = id(TailsAni_Dummy3_ptr)       ; 12 ;  $C
  919. AniIDTailsAni_Stop          = id(TailsAni_Stop_ptr)         ; 13 ;  $D
  920. AniIDTailsAni_Float         = id(TailsAni_Float_ptr)        ; 14 ;  $E
  921. AniIDTailsAni_Float2        = id(TailsAni_Float2_ptr)       ; 15 ;  $F
  922. AniIDTailsAni_Spring        = id(TailsAni_Spring_ptr)       ; 16 ; $10
  923. AniIDTailsAni_Hang          = id(TailsAni_Hang_ptr)         ; 17 ; $11
  924. AniIDTailsAni_Blink         = id(TailsAni_Blink_ptr)        ; 18 ; $12
  925. AniIDTailsAni_Blink2        = id(TailsAni_Blink2_ptr)       ; 19 ; $13
  926. AniIDTailsAni_Hang2         = id(TailsAni_Hang2_ptr)        ; 20 ; $14
  927. AniIDTailsAni_Bubble        = id(TailsAni_Bubble_ptr)       ; 21 ; $15
  928. AniIDTailsAni_DeathBW       = id(TailsAni_DeathBW_ptr)      ; 22 ; $16
  929. AniIDTailsAni_Drown         = id(TailsAni_Drown_ptr)        ; 23 ; $17
  930. AniIDTailsAni_Death         = id(TailsAni_Death_ptr)        ; 24 ; $18
  931. AniIDTailsAni_Hurt          = id(TailsAni_Hurt_ptr)         ; 25 ; $19
  932. AniIDTailsAni_Hurt2         = id(TailsAni_Hurt2_ptr)        ; 26 ; $1A
  933. AniIDTailsAni_Slide         = id(TailsAni_Slide_ptr)        ; 27 ; $1B
  934. AniIDTailsAni_Blank         = id(TailsAni_Blank_ptr)        ; 28 ; $1C
  935. AniIDTailsAni_Dummy4        = id(TailsAni_Dummy4_ptr)       ; 29 ; $1D
  936. AniIDTailsAni_Dummy5        = id(TailsAni_Dummy5_ptr)       ; 30 ; $1E
  937. AniIDTailsAni_HaulAss       = id(TailsAni_HaulAss_ptr)      ; 31 ; $1F
  938. AniIDTailsAni_Fly           = id(TailsAni_Fly_ptr)          ; 32 ; $20
  939.  
  940.  
  941. ; Other sizes
  942. palette_line_size = $10*2   ; 16 word entries
  943.  
  944. Max_Rings = 511 ; default. maximum number possible is 759
  945.     if Max_Rings > 759
  946.     fatal "Maximum number of rings possible is 759"
  947.     endif
  948.  
  949. Rings_Space = (Max_Rings+1)*2
  950.  
  951. ; ---------------------------------------------------------------------------
  952. ; I run the main 68k RAM addresses through this function
  953. ; to let them work in both 16-bit and 32-bit addressing modes.
  954. ramaddr function x,-(-x)&$FFFFFFFF
  955.  
  956. ; ---------------------------------------------------------------------------
  957. ; RAM variables - General
  958.     phase   ramaddr($FFFF0000)  ; Pretend we're in the RAM
  959. RAM_Start:
  960.  
  961. Chunk_Table:            ds.b    $8000   ; was "Metablock_Table"
  962. Chunk_Table_End:
  963.  
  964. Level_Layout:           ds.b    $1000
  965. Level_Layout_End:
  966.  
  967. Block_Table:            ds.w    $C00
  968. Block_Table_End:
  969.  
  970. TempArray_LayerDef:     ds.b    $200    ; used by some layer deformation routines
  971. Decomp_Buffer:          ds.b    $200
  972. Sprite_Table_Input:     ds.b    $400    ; in custom format before being converted and stored in Sprite_Table/Sprite_Table_2
  973. Sprite_Table_Input_End:
  974.  
  975. Object_RAM:         ; The various objects in the game are loaded in this area.
  976.                 ; Each game mode uses different objects, so some slots are reused.
  977.                 ; The section below declares labels for the objects used in main gameplay.
  978.                 ; Objects for other game modes are declared further down.
  979. Reserved_Object_RAM:
  980. MainCharacter:          ; first object (usually Sonic except in a Tails Alone game)
  981.                 ds.b    object_size
  982. Sidekick:           ; second object (Tails in a Sonic and Tails game)
  983.                 ds.b    object_size
  984. TitleCard:
  985. TitleCard_ZoneName:     ; level title card: zone name
  986. GameOver_GameText:      ; "GAME" from GAME OVER
  987. TimeOver_TimeText:      ; "TIME" from TIME OVER
  988.                 ds.b    object_size
  989. TitleCard_Zone:         ; level title card: "ZONE"
  990. GameOver_OverText:      ; "OVER" from GAME OVER
  991. TimeOver_OverText:      ; "OVER" from TIME OVER
  992.                 ds.b    object_size
  993. TitleCard_ActNumber:        ; level title card: act number
  994.                 ds.b    object_size
  995. TitleCard_Background:       ; level title card: background
  996.                 ds.b    object_size
  997. TitleCard_Bottom:       ; level title card: yellow part at the bottom
  998.                 ds.b    object_size
  999. TitleCard_Left:         ; level title card: red part on the left
  1000.                 ds.b    object_size
  1001.  
  1002.                 ; Reserved object RAM, free slots
  1003.                 ds.b    object_size
  1004.                 ds.b    object_size
  1005.                 ds.b    object_size
  1006.                 ds.b    object_size
  1007.                 ds.b    object_size
  1008.  
  1009. CPZPylon:           ; Pylon in the foreground in CPZ
  1010.                 ds.b    object_size
  1011. WaterSurface1:          ; First water surface
  1012. Oil:                ; Oil at the bottom of OOZ
  1013.                 ds.b    object_size
  1014. WaterSurface2:          ; Second water surface
  1015.                 ds.b    object_size
  1016. Reserved_Object_RAM_End:
  1017.  
  1018. Dynamic_Object_RAM:     ; Dynamic object RAM
  1019.                 ds.b    $28*object_size
  1020. Dynamic_Object_RAM_2P_End:  ; SingleObjLoad stops searching here in 2P mode
  1021.                 ds.b    $48*object_size
  1022. Dynamic_Object_RAM_End:
  1023.  
  1024. LevelOnly_Object_RAM:
  1025. Tails_Tails:            ; address of the Tail's Tails object
  1026.                 ds.b    object_size
  1027. SuperSonicStars:
  1028.                 ds.b    object_size
  1029. Sonic_BreathingBubbles:     ; Sonic's breathing bubbles
  1030.                 ds.b    object_size
  1031. Tails_BreathingBubbles:     ; Tails' breathing bubbles
  1032.                 ds.b    object_size
  1033. Sonic_Dust:         ; Sonic's spin dash dust
  1034.                 ds.b    object_size
  1035. Tails_Dust:         ; Tails' spin dash dust
  1036.                 ds.b    object_size
  1037. Sonic_Shield:
  1038.                 ds.b    object_size
  1039. Tails_Shield:
  1040.                 ds.b    object_size
  1041. Sonic_InvincibilityStars:
  1042.                 ds.b    object_size
  1043.                 ds.b    object_size
  1044.                 ds.b    object_size
  1045.                 ds.b    object_size
  1046. Tails_InvincibilityStars:
  1047.                 ds.b    object_size
  1048.                 ds.b    object_size
  1049.                 ds.b    object_size
  1050.                 ds.b    object_size
  1051. LevelOnly_Object_RAM_End:
  1052.  
  1053. Object_RAM_End:
  1054.  
  1055. Primary_Collision:      ds.b    $300
  1056. Secondary_Collision:        ds.b    $300
  1057. VDP_Command_Buffer:     ds.w    7*$12   ; stores 18 ($12) VDP commands to issue the next time ProcessDMAQueue is called
  1058. VDP_Command_Buffer_Slot:    ds.l    1   ; stores the address of the next open slot for a queued VDP command
  1059.  
  1060. Sprite_Table_2:         ds.b    $280    ; Sprite attribute table buffer for the bottom split screen in 2-player mode
  1061.                 ds.b    $80 ; unused, but SAT buffer can spill over into this area when there are too many sprites on-screen
  1062.  
  1063. Horiz_Scroll_Buf:       ds.b    $400
  1064. Horiz_Scroll_Buf_End:
  1065. Sonic_Stat_Record_Buf:      ds.b    $100
  1066. Sonic_Pos_Record_Buf:       ds.b    $100
  1067. Tails_Pos_Record_Buf:       ds.b    $100
  1068. CNZ_saucer_data:        ds.b    $40 ; the number of saucer bumpers in a group which have been destroyed. Used to decide when to give 500 points instead of 10
  1069. CNZ_saucer_data_End:
  1070.                 ds.b    $C0 ; $FFFFE740-$FFFFE7FF ; unused as far as I can tell
  1071. Ring_Positions:         ds.b    Rings_Space
  1072. Ring_Positions_End:
  1073. Ring_start_addr_ROM:        ds.l    1
  1074. Ring_end_addr_ROM:      ds.l    1
  1075. Ring_start_addr_ROM_P2:     ds.l    1
  1076. Ring_end_addr_ROM_P2:       ds.l    1
  1077.  
  1078. Tails_Tails_ptr:        ds.w    1   ; stores pointer to Tails' Tails object
  1079. Extended_Camera:        ds.w    1
  1080. Last_jump_press:        ds.b    1   ; copy of Ctrl_1_Press_Logical, written when Sonic jumps
  1081.  
  1082.                 ; padding to account for Ring_Positions' shifting side
  1083.                 ; if you add a new variable in this space,
  1084.                 ; append "-(varsize)" here
  1085.                 ; (-$10 is for the 4 longs before this padding)
  1086.                 ; (-$40 is for the extended object size)
  1087.                 ds.b    $600-$10-$40-2-2-1-Rings_Space
  1088.  
  1089. Camera_RAM:
  1090. Camera_X_pos:           ds.l    1
  1091. Camera_Y_pos:           ds.l    1
  1092. Camera_BG_X_pos:        ds.l    1   ; only used sometimes as the layer deformation makes it sort of redundant
  1093. Camera_BG_Y_pos:        ds.l    1
  1094. Camera_BG2_X_pos:       ds.l    1   ; used in CPZ
  1095. Camera_BG2_Y_pos:       ds.l    1   ; used in CPZ
  1096. Camera_BG3_X_pos:       ds.l    1   ; unused (only initialised at beginning of level)?
  1097. Camera_BG3_Y_pos:       ds.l    1   ; unused (only initialised at beginning of level)?
  1098. Camera_X_pos_P2:        ds.l    1
  1099. Camera_Y_pos_P2:        ds.l    1
  1100. Camera_BG_X_pos_P2:     ds.l    1   ; only used sometimes as the layer deformation makes it sort of redundant
  1101. Camera_BG_Y_pos_P2:     ds.l    1
  1102. Camera_BG2_X_pos_P2:    ds.w    1   ; unused (only initialised at beginning of level)?
  1103.                 ds.w    1   ; $FFFFEE32-$FFFFEE33 ; seems unused
  1104. Camera_BG2_Y_pos_P2:    ds.l    1
  1105. Camera_BG3_X_pos_P2:    ds.w    1   ; unused (only initialised at beginning of level)?
  1106.                 ds.w    1   ; $FFFFEE3A-$FFFFEE3B ; seems unused
  1107. Camera_BG3_Y_pos_P2:    ds.l    1
  1108. Horiz_block_crossed_flag:   ds.b    1   ; toggles between 0 and $10 when you cross a block boundary horizontally
  1109. Verti_block_crossed_flag:   ds.b    1   ; toggles between 0 and $10 when you cross a block boundary vertically
  1110. Horiz_block_crossed_flag_BG:    ds.b    1   ; toggles between 0 and $10 when background camera crosses a block boundary horizontally
  1111. Verti_block_crossed_flag_BG:    ds.b    1   ; toggles between 0 and $10 when background camera crosses a block boundary vertically
  1112. Horiz_block_crossed_flag_BG2:   ds.b    1   ; used in CPZ
  1113.                 ds.b    1   ; $FFFFEE45 ; seems unused
  1114. Horiz_block_crossed_flag_BG3:   ds.b    1
  1115.                 ds.b    1   ; $FFFFEE47 ; seems unused
  1116. Horiz_block_crossed_flag_P2:    ds.b    1   ; toggles between 0 and $10 when you cross a block boundary horizontally
  1117. Verti_block_crossed_flag_P2:    ds.b    1   ; toggles between 0 and $10 when you cross a block boundary vertically
  1118.                 ds.b    6   ; $FFFFEE4A-$FFFFEE4F ; seems unused
  1119. Scroll_flags:           ds.w    1   ; bitfield ; bit 0 = redraw top row, bit 1 = redraw bottom row, bit 2 = redraw left-most column, bit 3 = redraw right-most column
  1120. Scroll_flags_BG:        ds.w    1   ; bitfield ; bits 0-3 as above, bit 4 = redraw top row (except leftmost block), bit 5 = redraw bottom row (except leftmost block), bits 6-7 = as bits 0-1
  1121. Scroll_flags_BG2:       ds.w    1   ; bitfield ; essentially unused; bit 0 = redraw left-most column, bit 1 = redraw right-most column
  1122. Scroll_flags_BG3:       ds.w    1   ; bitfield ; for CPZ; bits 0-3 as Scroll_flags_BG but using Y-dependent BG camera; bits 4-5 = bits 2-3; bits 6-7 = bits 2-3
  1123. Scroll_flags_P2:        ds.w    1   ; bitfield ; bit 0 = redraw top row, bit 1 = redraw bottom row, bit 2 = redraw left-most column, bit 3 = redraw right-most column
  1124. Scroll_flags_BG_P2:     ds.w    1   ; bitfield ; bits 0-3 as above, bit 4 = redraw top row (except leftmost block), bit 5 = redraw bottom row (except leftmost block), bits 6-7 = as bits 0-1
  1125. Scroll_flags_BG2_P2:    ds.w    1   ; bitfield ; essentially unused; bit 0 = redraw left-most column, bit 1 = redraw right-most column
  1126. Scroll_flags_BG3_P2:    ds.w    1   ; bitfield ; for CPZ; bits 0-3 as Scroll_flags_BG but using Y-dependent BG camera; bits 4-5 = bits 2-3; bits 6-7 = bits 2-3
  1127. Camera_RAM_copy:        ds.l    2   ; copied over every V-int
  1128. Camera_BG_copy:         ds.l    2   ; copied over every V-int
  1129. Camera_BG2_copy:        ds.l    2   ; copied over every V-int
  1130. Camera_BG3_copy:        ds.l    2   ; copied over every V-int
  1131. Camera_P2_copy:         ds.l    8   ; copied over every V-int
  1132. Scroll_flags_copy:      ds.w    1   ; copied over every V-int
  1133. Scroll_flags_BG_copy:       ds.w    1   ; copied over every V-int
  1134. Scroll_flags_BG2_copy:      ds.w    1   ; copied over every V-int
  1135. Scroll_flags_BG3_copy:      ds.w    1   ; copied over every V-int
  1136. Scroll_flags_copy_P2:       ds.w    1   ; copied over every V-int
  1137. Scroll_flags_BG_copy_P2:    ds.w    1   ; copied over every V-int
  1138. Scroll_flags_BG2_copy_P2:   ds.w    1   ; copied over every V-int
  1139. Scroll_flags_BG3_copy_P2:   ds.w    1   ; copied over every V-int
  1140.  
  1141. Camera_X_pos_diff:      ds.w    1   ; (new X pos - old X pos) * 256
  1142. Camera_Y_pos_diff:      ds.w    1   ; (new Y pos - old Y pos) * 256
  1143. Camera_BG_X_pos_diff:   ds.w    1   ; Effective camera change used in WFZ ending and HTZ screen shake
  1144. Camera_BG_Y_pos_diff:   ds.w    1   ; Effective camera change used in WFZ ending and HTZ screen shake
  1145. Camera_X_pos_diff_P2:       ds.w    1   ; (new X pos - old X pos) * 256
  1146. Camera_Y_pos_diff_P2:       ds.w    1   ; (new Y pos - old Y pos) * 256
  1147. Screen_Shaking_Flag_HTZ:    ds.b    1   ; activates screen shaking code in HTZ's layer deformation routine
  1148. Screen_Shaking_Flag:        ds.b    1   ; activates screen shaking code (if existent) in layer deformation routine
  1149. Scroll_lock:            ds.b    1   ; set to 1 to stop all scrolling for P1
  1150. Scroll_lock_P2:         ds.b    1   ; set to 1 to stop all scrolling for P2
  1151. unk_EEC0:           ds.l    1   ; unused, except on write in LevelSizeLoad...
  1152. unk_EEC4:           ds.w    1   ; same as above. The write being a long also overwrites the address below
  1153. Camera_Max_Y_pos:       ds.w    1
  1154. Camera_Min_X_pos:       ds.w    1
  1155. Camera_Max_X_pos:       ds.w    1
  1156. Camera_Min_Y_pos:       ds.w    1
  1157. Camera_Max_Y_pos_now:       ds.w    1   ; was "Camera_max_scroll_spd"...
  1158. Horiz_scroll_delay_val:     ds.w    1   ; if its value is a, where a != 0, X scrolling will be based on the player's X position a-1 frames ago
  1159. Sonic_Pos_Record_Index:     ds.w    1   ; into Sonic_Pos_Record_Buf and Sonic_Stat_Record_Buf
  1160. Horiz_scroll_delay_val_P2:  ds.w    1
  1161. Tails_Pos_Record_Index:     ds.w    1   ; into Tails_Pos_Record_Buf
  1162. Camera_Y_pos_bias:      ds.w    1   ; added to y position for lookup/lookdown, $60 is center
  1163. Camera_Y_pos_bias_P2:       ds.w    1   ; for Tails
  1164. Deform_lock:            ds.b    1   ; set to 1 to stop all deformation
  1165.                 ds.b    1   ; $FFFFEEDD ; seems unused
  1166. Camera_Max_Y_Pos_Changing:  ds.b    1
  1167. Dynamic_Resize_Routine:     ds.b    1
  1168.                 ds.b    2   ; $FFFFEEE0-$FFFFEEE1
  1169. Camera_BG_X_offset:     ds.w    1   ; Used to control background scrolling in X in WFZ ending and HTZ screen shake
  1170. Camera_BG_Y_offset:     ds.w    1   ; Used to control background scrolling in Y in WFZ ending and HTZ screen shake
  1171. HTZ_Terrain_Delay:      ds.w    1   ; During HTZ screen shake, this is a delay between rising and sinking terrain during which there is no shaking
  1172. HTZ_Terrain_Direction:      ds.b    1   ; During HTZ screen shake, 0 if terrain/lava is rising, 1 if lowering
  1173.                 ds.b    3   ; $FFFFEEE9-$FFFFEEEB ; seems unused
  1174. Vscroll_Factor_P2_HInt: ds.l    1
  1175. Camera_X_pos_copy:      ds.l    1
  1176. Camera_Y_pos_copy:      ds.l    1
  1177. Tails_Min_X_pos:        ds.w    1
  1178. Tails_Max_X_pos:        ds.w    1
  1179. Tails_Min_Y_pos:        ds.w    1 ; seems not actually implemented (only written to)
  1180. Tails_Max_Y_pos:        ds.w    1
  1181. Camera_RAM_End:
  1182.  
  1183. Block_cache:            ds.b    $80
  1184. Ring_consumption_table:     ds.b    $80 ; contains RAM addresses of rings currently being consumed
  1185. Ring_consumption_table_End:
  1186.  
  1187. Underwater_target_palette:      ds.b palette_line_size  ; This is used by the screen-fading subroutines.
  1188. Underwater_target_palette_line2:    ds.b palette_line_size  ; While Underwater_palette contains the blacked-out palette caused by the fading,
  1189. Underwater_target_palette_line3:    ds.b palette_line_size  ; Underwater_target_palette will contain the palette the screen will ultimately fade in to.
  1190. Underwater_target_palette_line4:    ds.b palette_line_size
  1191.  
  1192. Underwater_palette:     ds.b palette_line_size  ; main palette for underwater parts of the screen
  1193. Underwater_palette_line2:   ds.b palette_line_size
  1194. Underwater_palette_line3:   ds.b palette_line_size
  1195. Underwater_palette_line4:   ds.b palette_line_size
  1196.  
  1197.                 ds.b    $500    ; $FFFFF100-$FFFFF5FF ; unused, leftover from the Sonic 1 sound driver (and used by it when you port it to Sonic 2)
  1198.  
  1199. Game_Mode:          ds.w    1   ; 1 byte ; see GameModesArray (master level trigger, Mstr_Lvl_Trigger)
  1200. Ctrl_1_Logical:                 ; 2 bytes
  1201. Ctrl_1_Held_Logical:        ds.b    1   ; 1 byte
  1202. Ctrl_1_Press_Logical:       ds.b    1   ; 1 byte
  1203. Ctrl_1:                     ; 2 bytes
  1204. Ctrl_1_Held:            ds.b    1   ; 1 byte ; (pressed and held were switched around before)
  1205. Ctrl_1_Press:           ds.b    1   ; 1 byte
  1206. Ctrl_2:                     ; 2 bytes
  1207. Ctrl_2_Held:            ds.b    1   ; 1 byte
  1208. Ctrl_2_Press:           ds.b    1   ; 1 byte
  1209.                 ds.b    4   ; $FFFFF608-$FFFFF60B ; seems unused
  1210. VDP_Reg1_val:           ds.w    1   ; normal value of VDP register #1 when display is disabled
  1211.                 ds.b    6   ; $FFFFF60E-$FFFFF613 ; seems unused
  1212. Demo_Time_left:         ds.w    1   ; 2 bytes
  1213.  
  1214. Vscroll_Factor:
  1215. Vscroll_Factor_FG:          ds.w    1
  1216. Vscroll_Factor_BG:          ds.w    1
  1217. unk_F61A:           ds.l    1   ; Only ever cleared, never used
  1218. Vscroll_Factor_P2:
  1219. Vscroll_Factor_P2_FG:       ds.w    1
  1220. Vscroll_Factor_P2_BG:       ds.w    1
  1221. Teleport_timer:         ds.b    1   ; timer for teleport effect
  1222. Teleport_flag:          ds.b    1   ; set when a teleport is in progress
  1223. Hint_counter_reserve:       ds.w    1   ; Must contain a VDP command word, preferably a write to register $0A. Executed every V-INT.
  1224. Palette_fade_range:             ; Range affected by the palette fading routines
  1225. Palette_fade_start:     ds.b    1   ; Offset from the start of the palette to tell what range of the palette will be affected in the palette fading routines
  1226. Palette_fade_length:        ds.b    1   ; Number of entries to change in the palette fading routines
  1227.  
  1228. MiscLevelVariables:
  1229. VIntSubE_RunCount:      ds.b    1
  1230.                 ds.b    1   ; $FFFFF629 ; seems unused
  1231. Vint_routine:           ds.b    1   ; was "Delay_Time" ; routine counter for V-int
  1232.                 ds.b    1   ; $FFFFF62B ; seems unused
  1233. Sprite_count:           ds.b    1   ; the number of sprites drawn in the current frame
  1234.                 ds.b    5   ; $FFFFF62D-$FFFFF631 ; seems unused
  1235. PalCycle_Frame:         ds.w    1   ; ColorID loaded in PalCycle
  1236. PalCycle_Timer:         ds.w    1   ; number of frames until next PalCycle call
  1237. RNG_seed:           ds.l    1   ; used for random number generation
  1238. Game_paused:            ds.w    1  
  1239.                 ds.b    4   ; $FFFFF63C-$FFFFF63F ; seems unused
  1240. DMA_data_thunk:         ds.w    1   ; Used as a RAM holder for the final DMA command word. Data will NOT be preserved across V-INTs, so consider this space reserved.
  1241.                 ds.w    1   ; $FFFFF642-$FFFFF643 ; seems unused
  1242. Hint_flag:          ds.w    1   ; unless this is 1, H-int won't run
  1243.  
  1244. Water_Level_1:          ds.w    1
  1245. Water_Level_2:          ds.w    1
  1246. Water_Level_3:          ds.w    1
  1247. Water_on:           ds.b    1   ; is set based on Water_flag
  1248. Water_routine:          ds.b    1
  1249. Water_fullscreen_flag:      ds.b    1   ; was "Water_move"
  1250. Do_Updates_in_H_int:    ds.b    1
  1251.  
  1252. PalCycle_Frame_CNZ:     ds.w    1
  1253. PalCycle_Frame2:        ds.w    1
  1254. PalCycle_Frame3:        ds.w    1
  1255. PalCycle_Frame2_CNZ:    ds.w    1
  1256.                 ds.b    4   ; $FFFFF658-$FFFFF65B ; seems unused
  1257. Palette_frame:          ds.w    1
  1258. Palette_timer:          ds.b    1   ; was "Palette_frame_count"
  1259. Super_Sonic_palette:        ds.b    1
  1260.  
  1261. DEZ_Eggman:                     ; Word
  1262. DEZ_Shake_Timer:                ; Word
  1263. WFZ_LevEvent_Subrout:           ; Word
  1264. SegaScr_PalDone_Flag:           ; Byte (cleared once as a word)
  1265. Credits_Trigger:        ds.b    1   ; cleared as a word a couple times
  1266. Ending_PalCycle_flag:   ds.b    1
  1267.  
  1268. SegaScr_VInt_Subrout:
  1269. Ending_VInt_Subrout:
  1270. WFZ_BG_Y_Speed:         ds.w    1
  1271.                 ds.w    1   ; $FFFFF664-$FFFFF665 ; seems unused
  1272. PalCycle_Timer2:        ds.w    1
  1273. PalCycle_Timer3:        ds.w    1
  1274.  
  1275. Ctrl_2_Logical:                 ; 2 bytes
  1276. Ctrl_2_Held_Logical:        ds.b    1   ; 1 byte
  1277. Ctrl_2_Press_Logical:       ds.b    1   ; 1 byte
  1278. Sonic_Look_delay_counter:   ds.w    1   ; 2 bytes
  1279. Tails_Look_delay_counter:   ds.w    1   ; 2 bytes
  1280. Super_Sonic_frame_count:    ds.w    1
  1281. Camera_ARZ_BG_X_pos:        ds.l    1
  1282.                 ds.b    $A  ; $FFFFF676-$FFFFF67F ; seems unused
  1283. MiscLevelVariables_End
  1284.  
  1285. Plc_Buffer:         ds.b    $60 ; Pattern load queue (each entry is 6 bytes)
  1286. Plc_Buffer_Only_End:
  1287.                 ; these seem to store nemesis decompression state so PLC processing can be spread out across frames
  1288. Plc_Buffer_Reg0:        ds.l    1  
  1289. Plc_Buffer_Reg4:        ds.l    1  
  1290. Plc_Buffer_Reg8:        ds.l    1  
  1291. Plc_Buffer_RegC:        ds.l    1  
  1292. Plc_Buffer_Reg10:       ds.l    1  
  1293. Plc_Buffer_Reg14:       ds.l    1  
  1294. Plc_Buffer_Reg18:       ds.w    1   ; amount of current entry remaining to decompress
  1295. Plc_Buffer_Reg1A:       ds.w    1  
  1296.                 ds.b    4   ; seems unused
  1297. Plc_Buffer_End:
  1298.  
  1299.  
  1300. Misc_Variables:
  1301.                 ds.w    1   ; unused
  1302.  
  1303. ; extra variables for the second player (CPU) in 1-player mode
  1304. Tails_control_counter:      ds.w    1   ; how long until the CPU takes control
  1305. Tails_respawn_counter:      ds.w    1
  1306.                 ds.w    1   ; unused
  1307. Tails_CPU_routine:      ds.w    1
  1308. Tails_CPU_target_x:     ds.w    1
  1309. Tails_CPU_target_y:     ds.w    1
  1310. Tails_interact_ID:      ds.b    1   ; object ID of last object stood on
  1311. Tails_CPU_jumping:      ds.b    1
  1312.  
  1313. Rings_manager_routine:      ds.b    1
  1314. Level_started_flag:     ds.b    1
  1315. Ring_start_addr_RAM:        ds.w    1
  1316. Ring_start_addr_RAM_P2:     ds.w    1
  1317.  
  1318.                 ds.w    2   ; unused
  1319.                
  1320. CNZ_Bumper_routine:     ds.b    1
  1321. CNZ_Bumper_UnkFlag:     ds.b    1   ; Set only, never used again
  1322. CNZ_Visible_bumpers_start:          ds.l    1
  1323. CNZ_Visible_bumpers_end:            ds.l    1
  1324. CNZ_Visible_bumpers_start_P2:           ds.l    1
  1325. CNZ_Visible_bumpers_end_P2:         ds.l    1
  1326.  
  1327. Screen_redraw_flag:         ds.b    1   ; if whole screen needs to redraw, such as when you destroy that piston before the boss in WFZ
  1328. CPZ_UnkScroll_Timer:    ds.b    1   ; Used only in unused CPZ scrolling function
  1329. WFZ_SCZ_Fire_Toggle:    ds.b    1
  1330.                 ds.b    1   ; $FFFFF72F ; seems unused
  1331. Water_flag:         ds.b    1   ; if the level has water or oil
  1332.                 ds.b    1   ; $FFFFF731 ; seems unused
  1333. Demo_button_index_2P:       ds.w    1   ; index into button press demo data, for player 2
  1334. Demo_press_counter_2P:      ds.w    1   ; frames remaining until next button press, for player 2
  1335. Tornado_Velocity_X:     ds.w    1   ; speed of tails' plane in scz ($FFFFF736)
  1336. Tornado_Velocity_Y:     ds.w    1
  1337. ScreenShift:            ds.b    1
  1338.                 ds.b    4   ; $FFFFF73B-$FFFFF73E
  1339. Boss_CollisionRoutine:      ds.b    1
  1340. Boss_AnimationArray:        ds.b    $10 ; up to $10 bytes; 2 bytes per entry
  1341. Ending_Routine:
  1342. Boss_X_pos:         ds.w    1
  1343.                 ds.w    1   ; Boss_MoveObject reads a long, but all other places in the game use only the high word
  1344. Boss_Y_pos:         ds.w    1
  1345.                 ds.w    1   ; same here
  1346. Boss_X_vel:         ds.w    1
  1347. Boss_Y_vel:         ds.w    1
  1348. Boss_Countdown:     ds.w    1
  1349.                 ds.w    1   ; $FFFFF75E-$FFFFF75F ; unused
  1350.  
  1351. Sonic_top_speed:        ds.w    1
  1352. Sonic_acceleration:     ds.w    1
  1353. Sonic_deceleration:     ds.w    1
  1354. Sonic_LastLoadedDPLC:       ds.b    1   ; mapping frame number when Sonic last had his tiles requested to be transferred from ROM to VRAM. can be set to a dummy value like -1 to force a refresh DMA. was: Sonic_mapping_frame
  1355.                 ds.b    1   ; $FFFFF767 ; seems unused
  1356. Primary_Angle:      ds.b    1
  1357.                 ds.b    1   ; $FFFFF769 ; seems unused
  1358. Secondary_Angle:    ds.b    1
  1359.                 ds.b    1   ; $FFFFF76B ; seems unused
  1360. Obj_placement_routine:      ds.b    1
  1361.                 ds.b    1   ; $FFFFF76D ; seems unused
  1362. Camera_X_pos_last:      ds.w    1   ; Camera_X_pos_coarse from the previous frame
  1363.  
  1364. Obj_load_addr_right:        ds.l    1   ; contains the address of the next object to load when moving right
  1365. Obj_load_addr_left:     ds.l    1   ; contains the address of the last object loaded when moving left
  1366. Obj_load_addr_2:        ds.l    1
  1367. Obj_load_addr_3:        ds.l    1
  1368. unk_F780:           ds.b    6   ; seems to be an array of horizontal chunk positions, used for object position range checks
  1369. unk_F786:           ds.b    3
  1370. unk_F789:           ds.b    3
  1371. Camera_X_pos_last_P2:       ds.w    1
  1372. Obj_respawn_index_P2:       ds.b    2   ; respawn table indices of the next objects when moving left or right for the second player
  1373.  
  1374. Demo_button_index:      ds.w    1   ; index into button press demo data, for player 1
  1375. Demo_press_counter:     ds.b    1   ; frames remaining until next button press, for player 1
  1376.                 ds.b    1   ; $FFFFF793 ; seems unused
  1377. PalChangeSpeed:         ds.w    1
  1378. Collision_addr:         ds.l    1
  1379.                 ds.b    $D  ; $FFFFF79A-$FFFFF7A6 ; seems unused
  1380. Boss_defeated_flag:     ds.b    1
  1381.                 ds.b    2   ; $FFFFF7A8-$FFFFF7A9 ; seems unused
  1382. Current_Boss_ID:        ds.b    1
  1383.                 ds.b    5   ; $FFFFF7AB-$FFFFF7AF ; seems unused
  1384. MTZ_Platform_Cog_X:         ds.w    1   ; X position of moving MTZ platform for cog animation.
  1385. MTZCylinder_Angle_Sonic:    ds.b    1
  1386. MTZCylinder_Angle_Tails:    ds.b    1
  1387.                 ds.b    $A  ; $FFFFF7B4-$FFFFF7BD ; seems unused
  1388. BigRingGraphics:    ds.w    1   ; S1 holdover
  1389.                 ds.b    7   ; $FFFFF7C0-$FFFFF7C6 ; seems unused
  1390. WindTunnel_flag:        ds.b    1
  1391.                 ds.b    1   ; $FFFFF7C8 ; seems unused
  1392. WindTunnel_holding_flag:            ds.b    1
  1393.                 ds.b    2   ; $FFFFF7CA-$FFFFF7CB ; seems unused
  1394. Control_Locked:         ds.b    1
  1395. SpecialStage_flag_2P:           ds.b    1
  1396.                 ds.b    1   ; $FFFFF7CE ; seems unused
  1397. Control_Locked_P2:      ds.b    1
  1398. Chain_Bonus_counter:        ds.w    1   ; counts up when you destroy things that give points, resets when you touch the ground
  1399. Bonus_Countdown_1:      ds.w    1   ; level results time bonus or special stage sonic ring bonus
  1400. Bonus_Countdown_2:      ds.w    1   ; level results ring bonus or special stage tails ring bonus
  1401. Update_Bonus_score:     ds.b    1
  1402.                 ds.b    3   ; $FFFFF7D7-$FFFFF7D9 ; seems unused
  1403. Camera_X_pos_coarse:        ds.w    1   ; (Camera_X_pos - 128) / 256
  1404. Camera_X_pos_coarse_P2:     ds.w    1
  1405. Tails_LastLoadedDPLC:       ds.b    1   ; mapping frame number when Tails last had his tiles requested to be transferred from ROM to VRAM. can be set to a dummy value like -1 to force a refresh DMA.
  1406. TailsTails_LastLoadedDPLC:  ds.b    1   ; mapping frame number when Tails' tails last had their tiles requested to be transferred from ROM to VRAM. can be set to a dummy value like -1 to force a refresh DMA.
  1407. ButtonVine_Trigger:     ds.b    $10 ; 16 bytes flag array, #subtype byte set when button/vine of respective subtype activated
  1408. Anim_Counters:          ds.b    $10 ; $FFFFF7F0-$FFFFF7FF
  1409. Misc_Variables_End:
  1410.  
  1411. Sprite_Table:           ds.b    $280    ; Sprite attribute table buffer
  1412. Sprite_Table_End:
  1413.                 ds.b    $80 ; unused, but SAT buffer can spill over into this area when there are too many sprites on-screen
  1414.  
  1415. Normal_palette:         ds.b    palette_line_size   ; main palette for non-underwater parts of the screen
  1416. Normal_palette_line2:       ds.b    palette_line_size
  1417. Normal_palette_line3:       ds.b    palette_line_size
  1418. Normal_palette_line4:       ds.b    palette_line_size
  1419. Normal_palette_End:
  1420.  
  1421. Target_palette:         ds.b    palette_line_size   ; This is used by the screen-fading subroutines.
  1422. Target_palette_line2:       ds.b    palette_line_size   ; While Normal_palette contains the blacked-out palette caused by the fading,
  1423. Target_palette_line3:       ds.b    palette_line_size   ; Target_palette will contain the palette the screen will ultimately fade in to.
  1424. Target_palette_line4:       ds.b    palette_line_size
  1425. Target_palette_End:
  1426.  
  1427. Object_Respawn_Table:
  1428. Obj_respawn_index:      ds.b    2       ; respawn table indices of the next objects when moving left or right for the first player
  1429. Obj_respawn_data:       ds.b    $100    ; Maximum possible number of respawn entries that S2 can handle; for stock S2, $80 is enough
  1430. Obj_respawn_data_End:
  1431.                 ds.b    $FE ; Stack; the first $7E bytes are cleared by ObjectsManager_Init, with possibly disastrous consequences. At least $A0 bytes are needed.
  1432. System_Stack:
  1433.  
  1434. SS_2p_Flag:             ds.w    1   ; $FFFFFE00-$FFFFFE01 ; seems unused
  1435. Level_Inactive_flag:        ds.w    1   ; (2 bytes)
  1436. Timer_frames:           ds.w    1   ; (2 bytes)
  1437. Debug_object:           ds.b    1
  1438.                 ds.b    1   ; $FFFFFE07 ; seems unused
  1439. Debug_placement_mode:       ds.b    1
  1440.                 ds.b    1   ; the whole word is tested, but the debug mode code uses only the low byte
  1441. Debug_Accel_Timer:  ds.b    1
  1442. Debug_Speed:        ds.b    1
  1443. Vint_runcount:          ds.l    1
  1444.  
  1445. Current_ZoneAndAct:             ; 2 bytes
  1446. Current_Zone:           ds.b    1   ; 1 byte
  1447. Current_Act:            ds.b    1   ; 1 byte
  1448. Life_count:         ds.b    1
  1449.                 ds.b    3   ; $FFFFFE13-$FFFFFE15 ; seems unused
  1450.  
  1451. Current_Special_StageAndAct:    ; 2 bytes
  1452. Current_Special_Stage:      ds.b    1
  1453. Current_Special_Act:        ds.b    1
  1454. Continue_count:         ds.b    1
  1455. Super_Sonic_flag:       ds.b    1
  1456. Time_Over_flag:         ds.b    1
  1457. Extra_life_flags:       ds.b    1
  1458.  
  1459. ; If set, the respective HUD element will be updated.
  1460. Update_HUD_lives:       ds.b    1
  1461. Update_HUD_rings:       ds.b    1
  1462. Update_HUD_timer:       ds.b    1
  1463. Update_HUD_score:       ds.b    1
  1464.  
  1465. Ring_count:         ds.w    1   ; 2 bytes
  1466. Timer:                      ; 4 bytes
  1467. Timer_minute_word:              ; 2 bytes
  1468.                 ds.b    1   ; filler
  1469. Timer_minute:           ds.b    1   ; 1 byte
  1470. Timer_second:           ds.b    1   ; 1 byte
  1471. Timer_centisecond:              ; inaccurate name (the seconds increase when this reaches 60)
  1472. Timer_frame:            ds.b    1   ; 1 byte
  1473.  
  1474. Score:              ds.l    1   ; 4 bytes
  1475.                 ds.b    6   ; $FFFFFE2A-$FFFFFE2F ; seems unused
  1476. Last_star_pole_hit:     ds.b    1   ; 1 byte -- max activated starpole ID in this act
  1477. Saved_Last_star_pole_hit:   ds.b    1
  1478. Saved_x_pos:            ds.w    1
  1479. Saved_y_pos:            ds.w    1
  1480. Saved_Ring_count:       ds.w    1
  1481. Saved_Timer:            ds.l    1
  1482. Saved_art_tile:         ds.w    1
  1483. Saved_Solid_bits:           ds.w    1
  1484. Saved_Camera_X_pos:     ds.w    1
  1485. Saved_Camera_Y_pos:     ds.w    1
  1486. Saved_Camera_BG_X_pos:      ds.w    1
  1487. Saved_Camera_BG_Y_pos:      ds.w    1
  1488. Saved_Camera_BG2_X_pos:     ds.w    1
  1489. Saved_Camera_BG2_Y_pos:     ds.w    1
  1490. Saved_Camera_BG3_X_pos:     ds.w    1
  1491. Saved_Camera_BG3_Y_pos:     ds.w    1
  1492. Saved_Water_Level:      ds.w    1
  1493. Saved_Water_routine:        ds.b    1
  1494. Saved_Water_move:       ds.b    1
  1495. Saved_Extra_life_flags:     ds.b    1
  1496. Saved_Extra_life_flags_2P:  ds.b    1   ; stored, but never restored
  1497. Saved_Camera_Max_Y_pos:     ds.w    1
  1498. Saved_Dynamic_Resize_Routine:   ds.b    1
  1499.  
  1500.                 ds.b    5   ; $FFFFFE59-$FFFFFE5D ; seems unused
  1501. Oscillating_Numbers:
  1502. Oscillation_Control:            ds.w    1
  1503. Oscillating_variables:
  1504. Oscillating_Data:               ds.w    $20
  1505. Oscillating_Numbers_End
  1506.  
  1507. Logspike_anim_counter:      ds.b    1
  1508. Logspike_anim_frame:        ds.b    1
  1509. Rings_anim_counter:     ds.b    1
  1510. Rings_anim_frame:       ds.b    1
  1511. Unknown_anim_counter:       ds.b    1   ; I think this was $FFFFFEC4 in the alpha
  1512. Unknown_anim_frame:     ds.b    1
  1513. Ring_spill_anim_counter:    ds.b    1   ; scattered rings
  1514. Ring_spill_anim_frame:      ds.b    1
  1515. Ring_spill_anim_accum:      ds.w    1
  1516.                 ds.b    6   ; $FFFFFEA9-$FFFFFEAF ; seems unused, but cleared once
  1517. Oscillating_variables_End
  1518.                 ds.b    $10 ; $FFFFFEB0-$FFFFFEBF ; seems unused
  1519.  
  1520. ; values for the second player (some of these only apply to 2-player games)
  1521. Tails_top_speed:        ds.w    1   ; Tails_max_vel
  1522. Tails_acceleration:     ds.w    1
  1523. Tails_deceleration:     ds.w    1
  1524. Life_count_2P:          ds.b    1
  1525. Extra_life_flags_2P:        ds.b    1
  1526. Update_HUD_lives_2P:        ds.b    1
  1527. Update_HUD_rings_2P:        ds.b    1
  1528. Update_HUD_timer_2P:        ds.b    1
  1529. Update_HUD_score_2P:        ds.b    1   ; mostly unused
  1530. Time_Over_flag_2P:      ds.b    1
  1531.                 ds.b    3   ; $FFFFFECD-$FFFFFECF ; seems unused
  1532. Ring_count_2P:          ds.w    1
  1533. Timer_2P:                   ; 4 bytes
  1534. Timer_minute_word_2P:               ; 2 bytes
  1535.                 ds.b    1   ; filler
  1536. Timer_minute_2P:        ds.b    1   ; 1 byte
  1537. Timer_second_2P:        ds.b    1   ; 1 byte
  1538. Timer_centisecond_2P:               ; inaccurate name (the seconds increase when this reaches 60)
  1539. Timer_frame_2P:         ds.b    1   ; 1 byte
  1540. Score_2P:           ds.l    1
  1541.                 ds.b    6   ; $FFFFFEDA-$FFFFFEDF ; seems unused
  1542. Last_star_pole_hit_2P:      ds.b    1
  1543. Saved_Last_star_pole_hit_2P:    ds.b    1
  1544. Saved_x_pos_2P:         ds.w    1
  1545. Saved_y_pos_2P:         ds.w    1
  1546. Saved_Ring_count_2P:        ds.w    1
  1547. Saved_Timer_2P:         ds.l    1
  1548. Saved_art_tile_2P:      ds.w    1
  1549. Saved_Solid_bits_2P:            ds.w    1
  1550. Rings_Collected:        ds.w    1   ; number of rings collected during an act in two player mode
  1551. Rings_Collected_2P:     ds.w    1
  1552. Monitors_Broken:        ds.w    1   ; number of monitors broken during an act in two player mode
  1553. Monitors_Broken_2P:     ds.w    1
  1554. Loser_Time_Left:                ; 2 bytes
  1555.                 ds.b    1   ; seconds
  1556.                 ds.b    1   ; frames
  1557.  
  1558.                 ds.b    $16 ; $FFFFFEFA-$FFFFFF0F ; seems unused
  1559. Results_Screen_2P:      ds.w    1   ; 0 = act, 1 = zone, 2 = game, 3 = SS, 4 = SS all
  1560.                 ds.b    $E  ; $FFFFFF12-$FFFFFF1F ; seems unused
  1561.  
  1562. Results_Data_2P:                ; $18 (24) bytes
  1563. EHZ_Results_2P:         ds.b    6   ; 6 bytes
  1564. MCZ_Results_2P:         ds.b    6   ; 6 bytes
  1565. CNZ_Results_2P:         ds.b    6   ; 6 bytes
  1566. SS_Results_2P:          ds.b    6   ; 6 bytes
  1567. Results_Data_2P_End:
  1568.  
  1569. SS_Total_Won:           ds.b    2   ; 2 bytes (player 1 then player 2)
  1570.                 ds.b    6   ; $FFFFFF3A-$FFFFFF3F ; seems unused
  1571. Perfect_rings_left:     ds.w    1
  1572. Perfect_rings_flag:         ds.w    1
  1573.                 ds.b    8   ; $FFFFFF44-$FFFFFF4B ; seems unused
  1574.  
  1575. CreditsScreenIndex:
  1576. SlotMachineInUse:           ds.w    1
  1577. SlotMachineVariables:   ; $12 values
  1578. SlotMachine_Routine:    ds.b    1
  1579. SlotMachine_Timer:      ds.b    1
  1580.                 ds.b    1   ; $FFFFFF50 ; seems unused except for 1 write
  1581. SlotMachine_Index:      ds.b    1
  1582. SlotMachine_Reward:     ds.w    1
  1583. SlotMachine_Slot1Pos:   ds.w    1
  1584. SlotMachine_Slot1Speed: ds.b    1
  1585. SlotMachine_Slot1Rout:  ds.b    1
  1586. SlotMachine_Slot2Pos:   ds.w    1
  1587. SlotMachine_Slot2Speed: ds.b    1
  1588. SlotMachine_Slot2Rout:  ds.b    1
  1589. SlotMachine_Slot3Pos:   ds.w    1
  1590. SlotMachine_Slot3Speed: ds.b    1
  1591. SlotMachine_Slot3Rout:  ds.b    1
  1592.  
  1593.                 ds.b    $10 ; $FFFFFF60-$FFFFFF6F ; seems unused
  1594.  
  1595. Player_mode:            ds.w    1   ; 0 = Sonic and Tails, 1 = Sonic, 2 = Tails
  1596. Player_option:          ds.w    1   ; 0 = Sonic and Tails, 1 = Sonic, 2 = Tails
  1597.  
  1598. Two_player_items:       ds.w    1
  1599.                 ds.b    $A  ; $FFFFFF76-$FFFFFF7F ; seems unused
  1600.  
  1601. LevSel_HoldTimer:       ds.w    1
  1602. Level_select_zone:      ds.w    1
  1603. Sound_test_sound:       ds.w    1
  1604. Title_screen_option:        ds.b    1
  1605.                 ds.b    1   ; $FFFFFF87 ; unused
  1606. Current_Zone_2P:        ds.b    1
  1607. Current_Act_2P:         ds.b    1
  1608. Two_player_mode_copy:       ds.w    1
  1609. Options_menu_box:       ds.b    1
  1610.                 ds.b    1   ; $FFFFFF8D ; unused
  1611. Total_Bonus_Countdown:      ds.w    1
  1612.                
  1613. Level_Music:            ds.w    1
  1614. Bonus_Countdown_3:      ds.w    1
  1615.                 ds.b    4   ; $FFFFFF94-$FFFFFF97 ; seems unused
  1616. Game_Over_2P:           ds.w    1
  1617.  
  1618.                 ds.b    6   ; $FFFFFF9A-$FFFFFF9F ; seems unused
  1619.  
  1620. SS2p_RingBuffer:        ds.w    6
  1621.                 ds.b    4   ; $FFFFFFAC-$FFFFFFAF ; seems unused
  1622. Got_Emerald:            ds.b    1
  1623. Emerald_count:          ds.b    1
  1624. Got_Emeralds_array:     ds.b    7   ; 7 bytes
  1625.                 ds.b    7   ; $FFFFFFB9-$FFFFFFBF ; filler
  1626. Next_Extra_life_score:      ds.l    1
  1627. Next_Extra_life_score_2P:   ds.l    1
  1628. Level_Has_Signpost:     ds.w    1   ; 1 = signpost, 0 = boss or nothing
  1629. Signpost_prev_frame:    ds.b    1
  1630.                 ds.b    1   ; $FFFFFFCB ; seems unused
  1631. Camera_Min_Y_pos_Debug_Copy:    ds.w    1
  1632. Camera_Max_Y_pos_Debug_Copy:    ds.w    1
  1633.  
  1634. Level_select_flag:      ds.b    1
  1635. Slow_motion_flag:       ds.b    1   ; This NEEDs to be after Level_select_flag because of the call to CheckCheats
  1636. Debug_options_flag:     ds.b    1   ; if set, allows you to enable debug mode and "night mode"
  1637. S1_hidden_credits_flag:     ds.b    1   ; Leftover from Sonic 1. This NEEDs to be after Debug_options_flag because of the call to CheckCheats
  1638. Correct_cheat_entries:      ds.w    1
  1639. Correct_cheat_entries_2:    ds.w    1   ; for 14 continues or 7 emeralds codes
  1640.  
  1641. Two_player_mode:        ds.w    1   ; flag (0 for main game)
  1642. unk_FFDA:           ds.w    1   ; Written to once at title screen, never read from
  1643. unk_FFDC:           ds.b    1   ; Written to near loc_175EA, never read from
  1644. unk_FFDD:           ds.b    1   ; Written to near loc_175EA, never read from
  1645. unk_FFDE:           ds.b    1   ; Written to near loc_175EA, never read from
  1646. unk_FFDF:           ds.b    1   ; Written to near loc_175EA, never read from
  1647.  
  1648. ; Values in these variables are passed to the sound driver during V-INT.
  1649. ; They use a playlist index, not a sound test index.
  1650. Music_to_play:          ds.b    1
  1651. SFX_to_play:            ds.b    1   ; normal
  1652. SFX_to_play_2:          ds.b    1   ; alternating stereo
  1653. unk_FFE3:           ds.b    1
  1654. Music_to_play_2:        ds.b    1   ; alternate (higher priority?) slot
  1655.                 ds.b    $B  ; $FFFFFFE5-$FFFFFFEF ; seems unused
  1656.  
  1657. Demo_mode_flag:         ds.w    1 ; 1 if a demo is playing (2 bytes)
  1658. Demo_number:            ds.w    1 ; which demo will play next (2 bytes)
  1659. Ending_demo_number:     ds.w    1 ; zone for the ending demos (2 bytes, unused)
  1660.                 ds.w    1
  1661. Graphics_Flags:         ds.w    1 ; misc. bitfield
  1662. Debug_mode_flag:        ds.w    1 ; (2 bytes)
  1663.                 ds.b    2 ; unused
  1664. SRAM_OK:            ds.b    1
  1665. Checksum_OK:            ds.b    1
  1666.  
  1667. RAM_End
  1668.  
  1669.     if * > 0    ; Don't declare more space than the RAM can contain!
  1670.     fatal "The RAM variable declarations are too large by $\{*} bytes."
  1671.     endif
  1672.  
  1673.  
  1674. ; RAM variables - SEGA screen
  1675.     phase   Object_RAM  ; Move back to the object RAM
  1676. SegaScr_Object_RAM:
  1677.                 ; Unused slot
  1678.                 ds.b    object_size
  1679. SegaScreenObject:       ; Sega screen
  1680.                 ds.b    object_size
  1681. SegaHideTM:             ; Object that hides TM symbol on JP region
  1682.                 ds.b    object_size
  1683.  
  1684.                 ds.b    ($80-3)*object_size
  1685. SegaScr_Object_RAM_End:
  1686.  
  1687.  
  1688. ; RAM variables - Title screen
  1689.     phase   Object_RAM  ; Move back to the object RAM
  1690. TtlScr_Object_RAM:
  1691.                 ; Unused slot
  1692.                 ds.b    object_size
  1693. IntroSonic:         ; stars on the title screen
  1694.                 ds.b    object_size
  1695. IntroTails:
  1696.                 ds.b    object_size
  1697. IntroLargeStar:
  1698. TitleScreenPaletteChanger:
  1699.                 ds.b    object_size
  1700. TitleScreenPaletteChanger3:
  1701.                 ds.b    object_size
  1702. IntroEmblemTop:
  1703.                 ds.b    object_size
  1704. IntroSmallStar1:
  1705.                 ds.b    object_size
  1706. IntroSonicHand:
  1707.                 ds.b    object_size
  1708. IntroTailsHand:
  1709.                 ds.b    object_size
  1710. TitleScreenPaletteChanger2:
  1711.                 ds.b    object_size
  1712.  
  1713.                 ds.b    6*object_size
  1714.  
  1715. TitleScreenMenu:
  1716.                 ds.b    object_size
  1717. IntroSmallStar2:
  1718.                 ds.b    object_size
  1719.  
  1720.                 ds.b    ($70-2)*object_size
  1721. TtlScr_Object_RAM_End:
  1722.  
  1723.  
  1724. ; RAM variables - Special stage
  1725.     phase   RAM_Start   ; Move back to start of RAM
  1726. SSRAM_ArtNem_SpecialSonicAndTails:
  1727.                 ds.b    $353*$20    ; $353 art blocks
  1728. SSRAM_MiscKoz_SpecialPerspective:
  1729.                 ds.b    $1AFC
  1730. SSRAM_MiscNem_SpecialLevelLayout:
  1731.                 ds.b    $180
  1732.                 ds.b    $9C ; padding
  1733. SSRAM_MiscKoz_SpecialObjectLocations:
  1734.                 ds.b    $1AE0
  1735.  
  1736.     phase   Sprite_Table_Input
  1737. SS_Sprite_Table_Input:      ds.b    $400    ; in custom format before being converted and stored in Sprite_Table
  1738. SS_Sprite_Table_Input_End:
  1739.  
  1740.     phase   Object_RAM  ; Move back to the object RAM
  1741. SS_Object_RAM:
  1742.                 ds.b    object_size
  1743.                 ds.b    object_size
  1744. SpecialStageHUD:        ; HUD in the special stage
  1745.                 ds.b    object_size
  1746. SpecialStageStartBanner:
  1747.                 ds.b    object_size
  1748. SpecialStageNumberOfRings:
  1749.                 ds.b    object_size
  1750. SpecialStageShadow_Sonic:
  1751.                 ds.b    object_size
  1752. SpecialStageShadow_Tails:
  1753.                 ds.b    object_size
  1754. SpecialStageTails_Tails:
  1755.                 ds.b    object_size
  1756. SS_Dynamic_Object_RAM:
  1757.                 ds.b    $18*object_size
  1758. SpecialStageResults:
  1759.                 ds.b    object_size
  1760.                 ds.b    $C*object_size
  1761. SpecialStageResults2:
  1762.                 ds.b    object_size
  1763.                 ds.b    $51*object_size
  1764. SS_Dynamic_Object_RAM_End:
  1765.                 ds.b    object_size
  1766. SS_Object_RAM_End:
  1767.  
  1768.                 ; The special stage mode also uses the rest of the RAM for
  1769.                 ; different purposes.
  1770. SS_Misc_Variables:
  1771. PNT_Buffer:         ds.b    $700
  1772. PNT_Buffer_End:
  1773. SS_Horiz_Scroll_Buf_2:      ds.b    $400
  1774.  
  1775. SSTrack_mappings_bitflags:              ds.l    1
  1776. SSTrack_mappings_uncompressed:          ds.l    1
  1777. SSTrack_anim:                           ds.b    1
  1778. SSTrack_last_anim_frame:                ds.b    1
  1779. SpecialStage_CurrentSegment:            ds.b    1
  1780. SSTrack_anim_frame:                     ds.b    1
  1781. SS_Alternate_PNT:                       ds.b    1
  1782. SSTrack_drawing_index:                  ds.b    1
  1783. SSTrack_Orientation:                    ds.b    1
  1784. SS_Alternate_HorizScroll_Buf:           ds.b    1
  1785. SSTrack_mapping_frame:                  ds.b    1
  1786. SS_Last_Alternate_HorizScroll_Buf:      ds.b    1
  1787. SS_New_Speed_Factor:                    ds.l    1
  1788. SS_Cur_Speed_Factor:                    ds.l    1
  1789.         ds.b    5
  1790. SSTrack_duration_timer:                 ds.b    1
  1791.         ds.b    1
  1792. SS_player_anim_frame_timer:             ds.b    1
  1793. SpecialStage_LastSegment:               ds.b    1
  1794. SpecialStage_Started:                   ds.b    1
  1795.         ds.b    4
  1796. SSTrack_last_mappings_copy:             ds.l    1
  1797. SSTrack_last_mappings:                  ds.l    1
  1798.         ds.b    4
  1799. SSTrack_LastVScroll:                    ds.w    1
  1800.         ds.b    3
  1801. SSTrack_last_mapping_frame:             ds.b    1
  1802. SSTrack_mappings_RLE:                   ds.l    1
  1803. SSDrawRegBuffer:                        ds.w    6
  1804. SSDrawRegBuffer_End
  1805.         ds.b    2
  1806. SpecialStage_LastSegment2:  ds.b    1
  1807. SS_unk_DB4D:    ds.b    1
  1808.         ds.b    $14
  1809. SS_Ctrl_Record_Buf:
  1810.                 ds.w    $F
  1811. SS_Last_Ctrl_Record:
  1812.                 ds.w    1
  1813. SS_Ctrl_Record_Buf_End
  1814. SS_CurrentPerspective:  ds.l    1
  1815. SS_Check_Rings_flag:        ds.b    1
  1816. SS_Pause_Only_flag:     ds.b    1
  1817. SS_CurrentLevelObjectLocations: ds.l    1
  1818. SS_Ring_Requirement:    ds.w    1
  1819. SS_CurrentLevelLayout:  ds.l    1
  1820.         ds.b    1
  1821. SS_2P_BCD_Score:    ds.b    1
  1822.         ds.b    1
  1823. SS_NoCheckpoint_flag:   ds.b    1
  1824.         ds.b    2
  1825. SS_Checkpoint_Rainbow_flag: ds.b    1
  1826. SS_Rainbow_palette: ds.b    1
  1827. SS_Perfect_rings_left:  ds.w    1
  1828.         ds.b    2
  1829. SS_Star_color_1:    ds.b    1
  1830. SS_Star_color_2:    ds.b    1
  1831. SS_NoCheckpointMsg_flag:    ds.b    1
  1832.         ds.b    1
  1833. SS_NoRingsTogoLifetime: ds.w    1
  1834. SS_RingsToGoBCD:        ds.w    1
  1835. SS_HideRingsToGo:   ds.b    1
  1836. SS_TriggerRingsToGo:    ds.b    1
  1837.             ds.b    $58 ; unused
  1838. SS_Misc_Variables_End:
  1839.  
  1840.     phase   ramaddr(Horiz_Scroll_Buf)   ; Still in SS RAM
  1841. SS_Horiz_Scroll_Buf_1:      ds.b    $400
  1842. SS_Horiz_Scroll_Buf_1_End:
  1843.  
  1844.     phase   ramaddr($FFFFF73E)  ; Still in SS RAM
  1845. SS_Offset_X:            ds.w    1
  1846. SS_Offset_Y:            ds.w    1
  1847. SS_Swap_Positions_Flag: ds.b    1
  1848.  
  1849.     phase   ramaddr(Sprite_Table)   ; Still in SS RAM
  1850. SS_Sprite_Table:            ds.b    $280    ; Sprite attribute table buffer
  1851. SS_Sprite_Table_End:
  1852.                 ds.b    $80 ; unused, but SAT buffer can spill over into this area when there are too many sprites on-screen
  1853.  
  1854.  
  1855. ; RAM variables - Continue screen
  1856.     phase   Object_RAM  ; Move back to the object RAM
  1857. ContScr_Object_RAM:
  1858.                 ds.b    object_size
  1859.                 ds.b    object_size
  1860. ContinueText:           ; "CONTINUE" on the Continue screen
  1861.                 ds.b    object_size
  1862. ContinueIcons:          ; The icons in the Continue screen
  1863.                 ds.b    $D*object_size
  1864.  
  1865.                 ; Free slots
  1866.                 ds.b    $70*object_size
  1867. ContScr_Object_RAM_End:
  1868.  
  1869.  
  1870. ; RAM variables - 2P VS results screen
  1871.     phase   Object_RAM  ; Move back to the object RAM
  1872. VSRslts_Object_RAM:
  1873. VSResults_HUD:          ; Blinking text at the bottom of the screen
  1874.                 ds.b    object_size
  1875.  
  1876.                 ; Free slots
  1877.                 ds.b    $7F*object_size
  1878. VSRslts_Object_RAM_End:
  1879.  
  1880.  
  1881. ; RAM variables - Menu screens
  1882.     phase   Object_RAM  ; Move back to the object RAM
  1883. Menus_Object_RAM:       ; No objects are loaded in the menu screens
  1884.                 ds.b    $80*object_size
  1885. Menus_Object_RAM_End:
  1886.  
  1887.  
  1888. ; RAM variables - Ending sequence
  1889.     phase   Object_RAM
  1890. EndSeq_Object_RAM:
  1891.                 ds.b    object_size
  1892.                 ds.b    object_size
  1893. Tails_Tails_Cutscene:       ; Tails' tails on the cut scene
  1894.                 ds.b    object_size
  1895. EndSeqPaletteChanger:
  1896.                 ds.b    object_size
  1897. CutScene:
  1898.                 ds.b    object_size
  1899.                 ds.b    ($80-5)*object_size
  1900. EndSeq_Object_RAM_End:
  1901.  
  1902.     dephase     ; Stop pretending
  1903.  
  1904.     !org    0   ; Reset the program counter
  1905.  
  1906.  
  1907. ; ---------------------------------------------------------------------------
  1908. ; VDP addressses
  1909. VDP_data_port =         $C00000 ; (8=r/w, 16=r/w)
  1910. VDP_control_port =      $C00004 ; (8=r/w, 16=r/w)
  1911. PSG_input =         $C00011
  1912.  
  1913. ; ---------------------------------------------------------------------------
  1914. ; Z80 addresses
  1915. Z80_RAM =           $A00000 ; start of Z80 RAM
  1916. Z80_RAM_End =           $A02000 ; end of non-reserved Z80 RAM
  1917. Z80_Bus_Request =       $A11100
  1918. Z80_Reset =         $A11200
  1919.  
  1920. Security_Addr =         $A14000
  1921.  
  1922. ; ---------------------------------------------------------------------------
  1923. ; I/O Area
  1924. HW_Version =                $A10001
  1925. HW_Port_1_Data =            $A10003
  1926. HW_Port_2_Data =            $A10005
  1927. HW_Expansion_Data =         $A10007
  1928. HW_Port_1_Control =         $A10009
  1929. HW_Port_2_Control =         $A1000B
  1930. HW_Expansion_Control =      $A1000D
  1931. HW_Port_1_TxData =          $A1000F
  1932. HW_Port_1_RxData =          $A10011
  1933. HW_Port_1_SCtrl =           $A10013
  1934. HW_Port_2_TxData =          $A10015
  1935. HW_Port_2_RxData =          $A10017
  1936. HW_Port_2_SCtrl =           $A10019
  1937. HW_Expansion_TxData =       $A1001B
  1938. HW_Expansion_RxData =       $A1001D
  1939. HW_Expansion_SCtrl =        $A1001F
  1940.  
  1941. ; ---------------------------------------------------------------------------
  1942. ; Art tile stuff
  1943. flip_x             =      (1<<11)
  1944. flip_y             =      (1<<12)
  1945. palette_bit_0      =      5
  1946. palette_bit_1      =      6
  1947. palette_line_0     =      (0<<13)
  1948. palette_line_1     =      (1<<13)
  1949. palette_line_2     =      (2<<13)
  1950. palette_line_3     =      (3<<13)
  1951. high_priority_bit  =      7
  1952. high_priority      =      (1<<15)
  1953. palette_mask       =      $6000
  1954. tile_mask          =      $07FF
  1955. nontile_mask       =      $F800
  1956. drawing_mask       =      $7FFF
  1957.  
  1958. ; ---------------------------------------------------------------------------
  1959. ; VRAM and tile art base addresses.
  1960. ; VRAM Reserved regions.
  1961. VRAM_Plane_A_Name_Table                 = $C000    ; Extends until $CFFF
  1962. VRAM_Plane_B_Name_Table                 = $E000    ; Extends until $EFFF
  1963. VRAM_Plane_A_Name_Table_2P              = $A000    ; Extends until $AFFF
  1964. VRAM_Plane_B_Name_Table_2P              = $8000    ; Extends until $8FFF
  1965. VRAM_Plane_Table_Size                   = $1000    ; 64 cells x 32 cells x 2 bytes per cell
  1966. VRAM_Sprite_Attribute_Table             = $F800    ; Extends until $FA7F
  1967. VRAM_Sprite_Attribute_Table_Size        = $0280    ; 640 bytes
  1968. VRAM_Horiz_Scroll_Table                 = $FC00    ; Extends until $FF7F
  1969. VRAM_Horiz_Scroll_Table_Size            = $0380    ; 224 lines * 2 bytes per entry * 2 PNTs
  1970.  
  1971. ; VRAM Reserved regions, Sega screen.
  1972. VRAM_SegaScr_Plane_A_Name_Table         = $C000    ; Extends until $DFFF
  1973. VRAM_SegaScr_Plane_B_Name_Table         = $A000    ; Extends until $BFFF
  1974. VRAM_SegaScr_Plane_Table_Size           = $2000    ; 128 cells x 32 cells x 2 bytes per cell
  1975.  
  1976. ; VRAM Reserved regions, Special Stage.
  1977. VRAM_SS_Plane_A_Name_Table1             = $C000    ; Extends until $DFFF
  1978. VRAM_SS_Plane_A_Name_Table2             = $8000    ; Extends until $9FFF
  1979. VRAM_SS_Plane_B_Name_Table              = $A000    ; Extends until $BFFF
  1980. VRAM_SS_Plane_Table_Size                = $2000    ; 128 cells x 32 cells x 2 bytes per cell
  1981. VRAM_SS_Sprite_Attribute_Table          = $F800    ; Extends until $FA7F
  1982. VRAM_SS_Sprite_Attribute_Table_Size     = $0280    ; 640 bytes
  1983. VRAM_SS_Horiz_Scroll_Table              = $FC00    ; Extends until $FF7F
  1984. VRAM_SS_Horiz_Scroll_Table_Size         = $0380    ; 224 lines * 2 bytes per entry * 2 PNTs
  1985.  
  1986. ; VRAM Reserved regions, Title screen.
  1987. VRAM_TtlScr_Plane_A_Name_Table          = $C000    ; Extends until $CFFF
  1988. VRAM_TtlScr_Plane_B_Name_Table          = $E000    ; Extends until $EFFF
  1989. VRAM_TtlScr_Plane_Table_Size            = $1000    ; 64 cells x 32 cells x 2 bytes per cell
  1990.  
  1991. ; VRAM Reserved regions, Ending sequence and credits.
  1992. VRAM_EndSeq_Plane_A_Name_Table          = $C000    ; Extends until $DFFF
  1993. VRAM_EndSeq_Plane_B_Name_Table1         = $E000    ; Extends until $EFFF (plane size is 64x32)
  1994. VRAM_EndSeq_Plane_B_Name_Table2         = $4000    ; Extends until $5FFF
  1995. VRAM_EndSeq_Plane_Table_Size            = $2000    ; 64 cells x 64 cells x 2 bytes per cell
  1996.  
  1997. ; VRAM Reserved regions, menu screen.
  1998. VRAM_Menu_Plane_A_Name_Table            = $C000    ; Extends until $CFFF
  1999. VRAM_Menu_Plane_B_Name_Table            = $E000    ; Extends until $EFFF
  2000. VRAM_Menu_Plane_Table_Size              = $1000    ; 64 cells x 32 cells x 2 bytes per cell
  2001.  
  2002. ; From here on, art tiles are used; VRAM address is art tile * $20.
  2003. ArtTile_VRAM_Start                   = $0000
  2004.  
  2005. ; Common to 1p and 2p menus.
  2006. ArtTile_ArtNem_FontStuff             = $0010
  2007.  
  2008. ; Sega screen
  2009. ArtTile_ArtNem_Sega_Logo             = $0001
  2010. ArtTile_ArtNem_Trails                = $0080
  2011. ArtTile_ArtUnc_Giant_Sonic           = $0088
  2012.  
  2013. ; Sonic Team screen
  2014. ArtTile_ArtNem_SonicTeam             = $0000
  2015.  
  2016. ; Title screen
  2017. ArtTile_ArtNem_Title                 = $0000
  2018. ArtTile_ArtNem_TitleSprites          = $0150
  2019. ArtTile_ArtNem_MenuJunk              = $03F2
  2020. ArtTile_ArtNem_Player1VS2            = $0402
  2021. ArtTile_ArtNem_CreditText            = $0500
  2022. ArtTile_ArtNem_FontStuff_TtlScr      = $0680
  2023.  
  2024. ; Credits screen
  2025. ArtTile_ArtNem_CreditText_CredScr    = $0001
  2026.  
  2027. ; Menu background.
  2028. ArtTile_ArtNem_MenuBox               = $0070
  2029.  
  2030. ; Level select icons.
  2031. ArtTile_ArtNem_LevelSelectPics       = $0090
  2032.  
  2033. ; 2p results screen.
  2034. ArtTile_ArtNem_1P2PWins              = $0070
  2035. ArtTile_ArtNem_SpecialPlayerVSPlayer = $03DF
  2036. ArtTile_ArtNem_2p_Signpost           = $05E8
  2037. ArtTile_TwoPlayerResults             = $0600
  2038.  
  2039. ; Special stage stuff.
  2040. ArtTile_ArtNem_SpecialEmerald        = $0174
  2041. ArtTile_ArtNem_SpecialMessages       = $01A2
  2042. ArtTile_ArtNem_SpecialHUD            = $01FA
  2043. ArtTile_ArtNem_SpecialFlatShadow     = $023C
  2044. ArtTile_ArtNem_SpecialDiagShadow     = $0262
  2045. ArtTile_ArtNem_SpecialSideShadow     = $029C
  2046. ArtTile_ArtNem_SpecialExplosion      = $02B5
  2047. ArtTile_ArtNem_SpecialSonic          = $02E5
  2048. ArtTile_ArtNem_SpecialTails          = $0300
  2049. ArtTile_ArtNem_SpecialTails_Tails    = $0316
  2050. ArtTile_ArtNem_SpecialRings          = $0322
  2051. ArtTile_ArtNem_SpecialStart          = $038A
  2052. ArtTile_ArtNem_SpecialBomb           = $038A
  2053. ArtTile_ArtNem_SpecialStageResults   = $0590
  2054. ArtTile_ArtNem_SpecialBack           = $0700
  2055. ArtTile_ArtNem_SpecialStars          = $077F
  2056. ArtTile_ArtNem_SpecialTailsText      = $07A4
  2057.  
  2058. ; Ending.
  2059. ArtTile_EndingCharacter              = $0019
  2060. ArtTile_ArtNem_EndingFinalTornado    = $0156
  2061. ArtTile_ArtNem_EndingPics            = $0328
  2062. ArtTile_ArtNem_EndingMiniTornado     = $0493
  2063.  
  2064. ; S1 Ending
  2065. ArtTile_ArtNem_S1EndFlicky           = $05A5
  2066. ArtTile_ArtNem_S1EndRabbit           = $0553
  2067. ArtTile_ArtNem_S1EndPenguin          = $0573
  2068. ArtTile_ArtNem_S1EndSeal             = $0585
  2069. ArtTile_ArtNem_S1EndPig              = $0593
  2070. ArtTile_ArtNem_S1EndChicken          = $0565
  2071. ArtTile_ArtNem_S1EndSquirrel         = $05B3
  2072.  
  2073. ; Continue screen.
  2074. ArtTile_ArtNem_ContinueTails         = $0500
  2075. ArtTile_ArtNem_ContinueText          = $0500
  2076. ArtTile_ArtNem_ContinueText_2        = ArtTile_ArtNem_ContinueText + $24
  2077. ArtTile_ArtNem_MiniContinue          = $0524
  2078. ArtTile_ContinueScreen_Additional    = $0590
  2079. ArtTile_ContinueCountdown            = $06FC
  2080.  
  2081. ; ---------------------------------------------------------------------------
  2082. ; Level art stuff.
  2083. ArtTile_ArtKos_LevelArt              = $0000
  2084. ArtTile_ArtKos_NumTiles_EHZ          = $0393
  2085. ArtTile_ArtKos_NumTiles_CPZ          = $0364
  2086. ArtTile_ArtKos_NumTiles_ARZ          = $03F6
  2087. ArtTile_ArtKos_NumTiles_CNZ          = $0331
  2088. ArtTile_ArtKos_NumTiles_HTZ_Main     = $01FC ; Until this tile, equal to EHZ tiles.
  2089. ArtTile_ArtKos_NumTiles_HTZ_Sup      = $0183 ; Overwrites several EHZ tiles.
  2090. ArtTile_ArtKos_NumTiles_HTZ          = ArtTile_ArtKos_NumTiles_HTZ_Main + ArtTile_ArtKos_NumTiles_HTZ_Sup - 1
  2091. ArtTile_ArtKos_NumTiles_MCZ          = $03A9
  2092. ArtTile_ArtKos_NumTiles_OOZ          = $02AA
  2093. ArtTile_ArtKos_NumTiles_MTZ          = $0319
  2094. ArtTile_ArtKos_NumTiles_SCZ          = $036E
  2095. ArtTile_ArtKos_NumTiles_WFZ_Main     = $0307 ; Until this tile, equal to SCZ tiles.
  2096. ArtTile_ArtKos_NumTiles_WFZ_Sup      = $0073 ; Overwrites several SCZ tiles.
  2097. ArtTile_ArtKos_NumTiles_WFZ          = ArtTile_ArtKos_NumTiles_WFZ_Main + ArtTile_ArtKos_NumTiles_WFZ_Sup - 1
  2098. ArtTile_ArtKos_NumTiles_DEZ          = $0326 ; Skips several CPZ tiles.
  2099.  
  2100. ; ---------------------------------------------------------------------------
  2101. ; Shared badniks and objects.
  2102.  
  2103. ; Objects that use the same art tiles on all levels in which
  2104. ; they are loaded, even if not all levels load them.
  2105. ArtTile_ArtNem_WaterSurface          = $0400
  2106. ArtTile_ArtNem_Button                = $0424
  2107. ArtTile_ArtNem_HorizSpike            = $042C
  2108. ArtTile_ArtNem_Spikes                = $0434
  2109. ArtTile_ArtNem_DignlSprng            = $043C
  2110. ArtTile_ArtNem_LeverSpring           = $0440
  2111. ArtTile_ArtNem_VrtclSprng            = $045C
  2112. ArtTile_ArtNem_HrzntlSprng           = $0470
  2113.  
  2114. ; EHZ, HTZ
  2115. ArtTile_ArtKos_Checkers              = ArtTile_ArtKos_LevelArt+$0158
  2116. ArtTile_ArtUnc_Flowers1              = $0394
  2117. ArtTile_ArtUnc_Flowers2              = $0396
  2118. ArtTile_ArtUnc_Flowers3              = $0398
  2119. ArtTile_ArtUnc_Flowers4              = $039A
  2120. ArtTile_ArtNem_Buzzer                = $03D2
  2121.  
  2122. ; WFZ, SCZ
  2123. ArtTile_ArtNem_WfzHrzntlPrpllr       = $03CD
  2124. ArtTile_ArtNem_Clouds                = $054F
  2125. ArtTile_ArtNem_WfzVrtclPrpllr        = $0561
  2126. ArtTile_ArtNem_Balkrie               = $0565
  2127.  
  2128. ; ---------------------------------------------------------------------------
  2129. ; Level-specific objects and badniks.
  2130.  
  2131. ; EHZ
  2132. ArtTile_ArtUnc_EHZPulseBall          = $039C
  2133. ArtTile_ArtNem_Waterfall             = $039E
  2134. ArtTile_ArtNem_EHZ_Bridge            = $03B6
  2135. ArtTile_ArtNem_Buzzer_Fireball       = $03BE   ; Actually unused
  2136. ArtTile_ArtNem_Coconuts              = $03EE
  2137. ArtTile_ArtNem_Masher                = $0414
  2138. ArtTile_ArtUnc_EHZMountains          = $0500
  2139.  
  2140. ; MTZ
  2141. ArtTile_ArtNem_Shellcracker          = $031C
  2142. ArtTile_ArtUnc_Lava                  = $0340
  2143. ArtTile_ArtUnc_MTZCylinder           = $034C
  2144. ArtTile_ArtUnc_MTZAnimBack_1         = $035C
  2145. ArtTile_ArtUnc_MTZAnimBack_2         = $0362
  2146. ArtTile_ArtNem_MtzSupernova          = $0368
  2147. ArtTile_ArtNem_MtzWheel              = $0378
  2148. ArtTile_ArtNem_MtzWheelIndent        = $03F0
  2149. ArtTile_ArtNem_LavaCup               = $03F9
  2150. ArtTile_ArtNem_BoltEnd_Rope          = $03FD
  2151. ArtTile_ArtNem_MtzSteam              = $0405
  2152. ArtTile_ArtNem_MtzSpikeBlock         = $0414
  2153. ArtTile_ArtNem_MtzSpike              = $041C
  2154. ArtTile_ArtNem_MtzMantis             = $043C
  2155. ArtTile_ArtNem_MtzAsstBlocks         = $0500
  2156. ArtTile_ArtNem_MtzLavaBubble         = $0536
  2157. ArtTile_ArtNem_MtzCog                = $055F
  2158. ArtTile_ArtNem_MtzSpinTubeFlash      = $056B
  2159.  
  2160. ; WFZ
  2161. ArtTile_ArtNem_WfzScratch            = $0379
  2162. ArtTile_ArtNem_WfzTiltPlatforms      = $0393
  2163. ArtTile_ArtNem_WfzVrtclLazer         = $039F
  2164. ArtTile_ArtNem_WfzWallTurret         = $03AB
  2165. ArtTile_ArtNem_WfzHrzntlLazer        = $03C3
  2166. ArtTile_ArtNem_WfzConveyorBeltWheel  = $03EA
  2167. ArtTile_ArtNem_WfzHook               = $03FA
  2168. ArtTile_ArtNem_WfzHook_Fudge         = ArtTile_ArtNem_WfzHook + 4 ; Bad mappings...
  2169. ArtTile_ArtNem_WfzBeltPlatform       = $040E
  2170. ArtTile_ArtNem_WfzGunPlatform        = $041A
  2171. ArtTile_ArtNem_WfzUnusedBadnik       = $0450
  2172. ArtTile_ArtNem_WfzLaunchCatapult     = $045C
  2173. ArtTile_ArtNem_WfzSwitch             = $0461
  2174. ArtTile_ArtNem_WfzThrust             = $0465
  2175. ArtTile_ArtNem_WfzFloatingPlatform   = $046D
  2176. ArtTile_ArtNem_BreakPanels           = $048C
  2177.  
  2178. ; SCZ
  2179. ArtTile_ArtNem_Turtloid              = $038A
  2180. ArtTile_ArtNem_Nebula                = $036E
  2181.  
  2182. ; HTZ
  2183. ArtTile_ArtNem_Rexon                 = $037E
  2184. ArtTile_ArtNem_HtzFireball1          = $039E
  2185. ArtTile_ArtNem_HtzRock               = $03B2
  2186. ArtTile_ArtNem_HtzSeeSaw             = $03C6
  2187. ArtTile_ArtNem_Sol                   = $03DE
  2188. ArtTile_ArtNem_HtzZipline            = $03E6
  2189. ArtTile_ArtNem_HtzFireball2          = $0416
  2190. ArtTile_ArtNem_HtzValveBarrier       = $0426
  2191. ArtTile_ArtUnc_HTZMountains          = $0500
  2192. ArtTile_ArtUnc_HTZClouds             = ArtTile_ArtUnc_HTZMountains + $18
  2193. ArtTile_ArtNem_Spiker                = $0520
  2194.  
  2195. ; OOZ
  2196. ArtTile_ArtUnc_OOZPulseBall          = $02B6
  2197. ArtTile_ArtUnc_OOZSquareBall1        = $02BA
  2198. ArtTile_ArtUnc_OOZSquareBall2        = $02BE
  2199. ArtTile_ArtUnc_Oil1                  = $02C2
  2200. ArtTile_ArtUnc_Oil2                  = $02D2
  2201. ArtTile_ArtNem_OOZBurn               = $02E2
  2202. ArtTile_ArtNem_OOZElevator           = $02F4
  2203. ArtTile_ArtNem_SpikyThing            = $030C
  2204. ArtTile_ArtNem_BurnerLid             = $032C
  2205. ArtTile_ArtNem_StripedBlocksVert     = $0332
  2206. ArtTile_ArtNem_Oilfall               = $0336
  2207. ArtTile_ArtNem_Oilfall2              = $0346
  2208. ArtTile_ArtNem_BallThing             = $0354
  2209. ArtTile_ArtNem_LaunchBall            = $0368
  2210. ArtTile_ArtNem_OOZPlatform           = $039D
  2211. ArtTile_ArtNem_PushSpring            = $03C5
  2212. ArtTile_ArtNem_OOZSwingPlat          = $03E3
  2213. ArtTile_ArtNem_StripedBlocksHoriz    = $03FF
  2214. ArtTile_ArtNem_OOZFanHoriz           = $0403
  2215. ArtTile_ArtNem_Aquis                 = $0500
  2216. ArtTile_ArtNem_Octus                 = $0538
  2217.  
  2218. ; MCZ
  2219. ArtTile_ArtNem_Flasher               = $03A8
  2220. ArtTile_ArtNem_Crawlton              = $03C0
  2221. ArtTile_ArtNem_Crate                 = $03D4
  2222. ArtTile_ArtNem_MCZCollapsePlat       = $03F4
  2223. ArtTile_ArtNem_VineSwitch            = $040E
  2224. ArtTile_ArtNem_VinePulley            = $041E
  2225. ArtTile_ArtNem_MCZGateLog            = $043C
  2226.  
  2227. ; CNZ
  2228. ArtTile_ArtNem_Crawl                 = $0340
  2229. ArtTile_ArtNem_BigMovingBlock        = $036C
  2230. ArtTile_ArtNem_CNZSnake              = $037C
  2231. ArtTile_ArtNem_CNZBonusSpike         = $0380
  2232. ArtTile_ArtNem_CNZElevator           = $0384
  2233. ArtTile_ArtNem_CNZCage               = $0388
  2234. ArtTile_ArtNem_CNZHexBumper          = $0394
  2235. ArtTile_ArtNem_CNZRoundBumper        = $039A
  2236. ArtTile_ArtNem_CNZFlipper            = $03B2
  2237. ArtTile_ArtNem_CNZMiniBumper         = $03E6
  2238. ArtTile_ArtNem_CNZDiagPlunger        = $0402
  2239. ArtTile_ArtNem_CNZVertPlunger        = $0422
  2240.  
  2241. ; Specific to 1p CNZ
  2242. ArtTile_ArtUnc_CNZFlipTiles_1        = $0330
  2243. ArtTile_ArtUnc_CNZFlipTiles_2        = $0540
  2244. ArtTile_ArtUnc_CNZSlotPics_1         = $0550
  2245. ArtTile_ArtUnc_CNZSlotPics_2         = $0560
  2246. ArtTile_ArtUnc_CNZSlotPics_3         = $0570
  2247.  
  2248. ; Specific to 2p CNZ
  2249. ArtTile_ArtUnc_CNZFlipTiles_1_2p     = $0330
  2250. ArtTile_ArtUnc_CNZFlipTiles_2_2p     = $0740
  2251. ArtTile_ArtUnc_CNZSlotPics_1_2p      = $0750
  2252. ArtTile_ArtUnc_CNZSlotPics_2_2p      = $0760
  2253. ArtTile_ArtUnc_CNZSlotPics_3_2p      = $0770
  2254.  
  2255. ; CPZ
  2256. ArtTile_ArtUnc_CPZAnimBack           = $0370
  2257. ArtTile_ArtNem_CPZMetalThings        = $0373
  2258. ArtTile_ArtNem_ConstructionStripes_2 = $0394
  2259. ArtTile_ArtNem_CPZBooster            = $039C
  2260. ArtTile_ArtNem_CPZElevator           = $03A0
  2261. ArtTile_ArtNem_CPZAnimatedBits       = $03B0
  2262. ArtTile_ArtNem_CPZTubeSpring         = $03E0
  2263. ArtTile_ArtNem_CPZStairBlock         = $0418
  2264. ArtTile_ArtNem_CPZMetalBlock         = $0430
  2265. ArtTile_ArtNem_CPZDroplet            = $043C
  2266. ArtTile_ArtNem_Grabber               = $0500
  2267. ArtTile_ArtNem_Spiny                 = $052D
  2268.  
  2269. ; DEZ
  2270. ArtTile_ArtUnc_DEZAnimBack           = $0326
  2271. ArtTile_ArtNem_ConstructionStripes_1 = $0328
  2272.  
  2273. ; ARZ
  2274. ArtTile_ArtNem_ARZBarrierThing       = $03F8
  2275. ArtTile_ArtNem_Leaves                = $0410
  2276. ArtTile_ArtNem_ArrowAndShooter       = $0417
  2277. ArtTile_ArtUnc_Waterfall3            = $0428
  2278. ArtTile_ArtUnc_Waterfall2            = $042C
  2279. ArtTile_ArtUnc_Waterfall1_1          = $0430
  2280. ArtTile_ArtNem_Whisp                 = $0500
  2281. ArtTile_ArtNem_Grounder              = $0509
  2282. ArtTile_ArtNem_ChopChop              = $053B
  2283. ArtTile_ArtUnc_Waterfall1_2          = $0557
  2284. ArtTile_ArtNem_BigBubbles            = $055B
  2285.  
  2286. ; ---------------------------------------------------------------------------
  2287. ; Bosses
  2288. ; Common tiles for some bosses (any for which no eggpod tiles are defined,
  2289. ; except for WFZ and DEZ bosses).
  2290. ArtTile_ArtNem_Eggpod_4              = $0500
  2291. ; Common tiles for all bosses.
  2292. ArtTile_ArtNem_FieryExplosion        = $0580
  2293.  
  2294. ; CPZ boss
  2295. ArtTile_ArtNem_EggpodJets_1          = $0418
  2296. ArtTile_ArtNem_Eggpod_3              = $0420
  2297. ArtTile_ArtNem_CPZBoss               = $0500
  2298. ArtTile_ArtNem_BossSmoke_1           = $0570
  2299.  
  2300. ; EHZ boss
  2301. ArtTile_ArtNem_Eggpod_1              = $03A0
  2302. ArtTile_ArtNem_EHZBoss               = $0400
  2303. ArtTile_ArtNem_EggChoppers           = $056C
  2304.  
  2305. ; HTZ boss
  2306. ArtTile_ArtNem_Eggpod_2              = $03C1
  2307. ArtTile_ArtNem_HTZBoss               = $0421
  2308. ArtTile_ArtNem_BossSmoke_2           = $05E4
  2309.  
  2310. ; ARZ boss
  2311. ArtTile_ArtNem_ARZBoss               = $03E0
  2312.  
  2313. ; MCZ boss
  2314. ArtTile_ArtNem_MCZBoss               = $03C0
  2315. ArtTile_ArtUnc_FallingRocks          = $0560
  2316.  
  2317. ; CNZ boss
  2318. ArtTile_ArtNem_CNZBoss               = $0407
  2319. ArtTile_ArtNem_CNZBoss_Fudge         = ArtTile_ArtNem_CNZBoss - $60 ; Badly reused mappings...
  2320.  
  2321. ; MTZ boss
  2322. ArtTile_ArtNem_MTZBoss               = $037C
  2323. ArtTile_ArtNem_EggpodJets_2          = $0560
  2324.  
  2325. ; OOZ boss
  2326. ArtTile_ArtNem_OOZBoss               = $038C
  2327.  
  2328. ; WFZ and DEZ
  2329. ArtTile_ArtNem_RobotnikUpper         = $0500
  2330. ArtTile_ArtNem_RobotnikRunning       = $0518
  2331. ArtTile_ArtNem_RobotnikLower         = $0564
  2332.  
  2333. ; WFZ boss
  2334. ArtTile_ArtNem_WFZBoss               = $0379
  2335.  
  2336. ; DEZ
  2337. ArtTile_ArtNem_DEZBoss               = $0330
  2338. ArtTile_ArtNem_DEZWindow             = $0378
  2339. ArtTile_ArtNem_SilverSonic           = $0380
  2340.  
  2341. ; ---------------------------------------------------------------------------
  2342. ; Universal locations.
  2343.  
  2344. ; Animals.
  2345. ArtTile_ArtNem_Animal_1              = $0580
  2346. ArtTile_ArtNem_Animal_2              = $0594
  2347.  
  2348. ; Game over.
  2349. ArtTile_ArtNem_Game_Over             = $04DE
  2350.  
  2351. ; Titlecard.
  2352. ArtTile_ArtNem_TitleCard             = $0580
  2353. ArtTile_LevelName                    = $05DE
  2354.  
  2355. ; End of level.
  2356. ArtTile_ArtNem_Signpost              = $0434
  2357. ArtTile_HUD_Bonus_Score              = $0520
  2358. ArtTile_ArtNem_Perfect               = $0540
  2359. ArtTile_ArtNem_ResultsText           = $05B0
  2360. ArtTile_ArtUnc_Signpost              = $05E8
  2361. ArtTile_ArtNem_MiniCharacter         = $05F4
  2362. ArtTile_ArtNem_Capsule               = $0680
  2363.  
  2364. ; Tornado.
  2365. ArtTile_ArtNem_Tornado               = $0500
  2366. ArtTile_ArtNem_TornadoThruster       = $0561
  2367.  
  2368. ; Some common objects; these are loaded on all aquatic levels.
  2369. ArtTile_ArtNem_Explosion             = $05A4
  2370. ArtTile_ArtNem_Bubbles               = $05E8
  2371. ArtTile_ArtNem_SuperSonic_stars      = $05F2
  2372.  
  2373. ; Universal (used on all standard levels).
  2374. ArtTile_ArtNem_Checkpoint            = $047C
  2375. ArtTile_ArtNem_TailsDust             = $048C
  2376. ArtTile_ArtNem_SonicDust             = $049C
  2377. ArtTile_ArtNem_Numbers               = $04AC
  2378. ArtTile_ArtNem_Shield                = $04BE
  2379. ArtTile_ArtNem_Invincible_stars      = $04DE
  2380. ArtTile_ArtNem_Powerups              = $0680
  2381. ArtTile_ArtNem_Ring                  = $06BC
  2382. ArtTile_ArtNem_HUD                   = ArtTile_ArtNem_Powerups + $4A
  2383. ArtTile_ArtUnc_Sonic                 = $0780
  2384. ArtTile_ArtUnc_Tails                 = $07A0
  2385. ArtTile_ArtUnc_Tails_Tails           = $07B0
  2386.  
  2387. ; ---------------------------------------------------------------------------
  2388. ; HUD. The HUD components are linked in a chain, and linked to
  2389. ; power-ups, because the mappings of monitors and lives counter(s)
  2390. ; depend on one another. If you want to alter these (for example,
  2391. ; because you need the VRAM for something else), you will probably
  2392. ; have to edit the mappings (or move the power-ups and HUD as a
  2393. ; single block unit).
  2394. ArtTile_HUD_Score_E                  = ArtTile_ArtNem_HUD + $18
  2395. ArtTile_HUD_Score                    = ArtTile_HUD_Score_E + 2
  2396. ArtTile_HUD_Rings                    = ArtTile_ArtNem_HUD + $30
  2397. ArtTile_HUD_Minutes                  = ArtTile_ArtNem_HUD + $28
  2398. ArtTile_HUD_Seconds                  = ArtTile_HUD_Minutes + 4
  2399. ArtTile_ArtUnc_2p_life_counter       = ArtTile_ArtNem_HUD + $2A
  2400. ArtTile_ArtUnc_2p_life_counter_lives = ArtTile_ArtUnc_2p_life_counter + 9
  2401. ArtTile_ArtNem_life_counter          = ArtTile_ArtNem_HUD + $10A
  2402. ArtTile_ArtNem_life_counter_lives    = ArtTile_ArtNem_life_counter + 9
  2403.  
  2404. ; ---------------------------------------------------------------------------
  2405. ; 2p-mode HUD.
  2406. ArtTile_Art_HUD_Text_2P              = ArtTile_ArtNem_HUD
  2407. ArtTile_Art_HUD_Numbers_2P           = ArtTile_HUD_Score_E
  2408.  
  2409. ; ---------------------------------------------------------------------------
  2410. ; Unused objects, objects with mappings never loaded, objects with
  2411. ; missing mappings and/or tiles, objects whose mappings and/or tiles
  2412. ; are never loaded.
  2413. ArtTile_ArtNem_MZ_Platform           = $02B8
  2414. ArtTile_ArtUnc_HPZPulseOrb_1         = $02E8
  2415. ArtTile_ArtUnc_HPZPulseOrb_2         = $02F0
  2416. ArtTile_ArtUnc_HPZPulseOrb_3         = $02F8
  2417. ArtTile_ArtNem_HPZ_Bridge            = $0300
  2418. ArtTile_ArtNem_HPZ_Waterfall         = $0315
  2419. ArtTile_ArtNem_HPZPlatform           = $034A
  2420. ArtTile_ArtNem_HPZOrb                = $035A
  2421. ArtTile_ArtNem_HPZ_Emerald           = $0392
  2422. ArtTile_ArtNem_GHZ_Spiked_Log        = $0398
  2423. ArtTile_ArtNem_Unknown               = $03FA
  2424. ArtTile_ArtNem_BigRing               = $0400
  2425. ArtTile_ArtNem_FloatPlatform         = $0418
  2426. ArtTile_ArtNem_BigRing_Flash         = $0462
  2427. ArtTile_ArtNem_EndPoints             = $04B6
  2428. ArtTile_ArtNem_BreakWall             = $0590
  2429. ArtTile_ArtNem_GHZ_Purple_Rock       = $06C0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement