Uff... I finally figured out what was causing the problem in Sky Chaze Zone with Cheese; it can also happen in my hack with Tails flickies, but it is possible, in theory, to crash plain ordinary Sonic 2 as well -- but I haven't tried to do that.
The set of circumstances is fairly rare to occur: you need to: (1) defeat a Turtloid's rider before it fires; (2) after the explosion object has disappeared, you have to defeat another badnik; (3) the animal released by this badnik has to be loaded in the same object slot that the Turtloid rider from (1) was (this is hard to guarantee); (4) while this animal is still on-screen, you need to get the Turtloid from (1) to fire. This will cause the mapping frame of the animal to be set to 3, which is an invalid frame for animals; this will cause the mapping data from frame 1 to be read as an offset into mappings data; this offset is 1, which causes the BuildSprites to try to read a word from an odd address, causing an address error.
It is possible that this happens with more objects than just animals, but the fix I give below should work on them all.
To fix it is simple enough once you know what is going on: find this code:
; loc_37964:
Obj9A_Main:
moveq #0,d0
move.b routine_secondary(a0),d0
move.w off_3797A(pc,d0.w),d1
jsr off_3797A(pc,d1.w)
bsr.w loc_37982
bra.w Obj_DeleteBehindScreen
and change it to this:
; loc_37964:
Obj9A_Main:
movea.w objoff_2C(a0),a1
cmpi.b #ObjID_TurtloidRider,id(a1) ; ObjID_TurtloidRider = $9B
beq.s Obj9A_MainRout
clr.w objoff_2C(a0)
Obj9A_MainRout:
moveq #0,d0
move.b routine_secondary(a0),d0
move.w off_3797A(pc,d0.w),d1
jsr off_3797A(pc,d1.w)
bsr.w loc_37982
bra.w Obj_DeleteBehindScreen
then find this code:
loc_379CA:
subq.b #1,objoff_2A(a0)
bpl.w return_37A48
addq.b #2,routine_secondary(a0)
move.b #8,objoff_2A(a0)
movea.w objoff_2C(a0),a1 ; a1=object
move.b #3,mapping_frame(a1)
bra.w loc_37AF2
and change it to this:
loc_379CA:
subq.b #1,objoff_2A(a0)
bpl.w return_37A48
addq.b #2,routine_secondary(a0)
move.b #8,objoff_2A(a0)
movea.w objoff_2C(a0),d1
beq.w loc_37AF2
movea.w d1,a1 ; a1=object
move.b #3,mapping_frame(a1)
bra.w loc_37AF2
There, it will not happen again. This fix preserves the Turtloid behavior of being able to fire even after its rider has been defeated.