Which compiler are you using? Something like the XC16 will handle both families simply by setting the appropriate device in the MPLABx IDE (assuming that you have a correctly structured dsPIC33F program that references the <xc.h> include).
One of the biggest differences will be the set of peripherals that are available in each family and are used in your program. It may also be the case that some of the SFR names and bit field names that perform the same function will be different.
The configuration bits will probably be different and will need to be reviewed to find the dsPIC30 name for the dsPIC33 setting.
You could try compiling for the dsPIC30F device and see what errors are thrown up that wil help narrow down the areas of difference.
I must admit that your question does sound a bit like the "XY Problem" (https://xyproblem.info/) in that you think porting code is the solution to your real underlying problem. Typically applications that exist for embedded devices are designed to utilise the features and capabilities of the specific devices they run on. Things like CPU speed, RAM and ROM memory footprints, execution speed and available peripheral devices play a big part in device selection and code development.
Susan