I'll try to look into this today. It's also possible that camera speed is capped in simple enough way that the ROM can be easily modified to remove the cap, but let's find out.
EDIT: That version of VBA seems old so I am testing with BizHawk. So far I found that camera position is at 590X in IWRAM (2 Bytes per value.) So for example freezing bytes 5900-1 successfully freezes the camera at it's current X-posiiton.
Apparently sonic can still move on the stage as collision detection is tied to Sonic's position not the camera's, so next I need Sonic's RAM values to see if I can make a cheat or lua or something to tie them together.
Here's a LUA script in BizHawk that does roughly what you want, so it is at least possible to do . This produces a bit of camera shaking, but it should always force the camera to be on Sonic.
while (true) do
cam_x=memory.read_u16_le(0x5900)
sonic_x_low=memory.read_u16_le(0x59E8)
sonic_x_high=memory.read_u16_le(0x59EA)
sonic_x=sonic_x_high*65536+sonic_x_low
gui.text(50,20,string.format('%d',sonic_x))
gui.text(90,50,string.format('%d',cam_x))
gui.text(90,50,string.format('%d',cam_x))
memory.write_u16_le(0x5900,math.floor((sonic_x-30000)/256))
emu.frameadvance();
end
This one works in BizHawk, so you might want to test it out there in level 1. The 30000 there is just an offest from the starting post. It might be different in every level.
At any rate this should at least get you going in the right direction.