I have done many migrations from DSM -> Cache in the past, so I can share some of the knowledge here.
Basically there are two phases involved in the process:
1. Migration the DB itself (.i.e globals). For this you can use utility called %DSMCVT which will read the globals from a DSM DB into a Cache/IRIS DB. Sometimes a 7/8bit -> unicode is also part of the process, so an appropriate code for that should be written.
2. Migration of code, that, as mentioned before is the complex part of the process, as you need to rewrite/modify parts of your code that handle with O/S specific issues:
a. File system - all devices code is different (i.e. open/use/close commands) when working with files/directories.
b. Calls to VMS special variables/functions, need to be converted to "standard" code.
c. Some systems rely on VMS "batch queues" for scheduling jobs or for printing reports. This should be addresses as well.
d. Some systems rely on VMS FTP functionality. In this case you need to write the same functionality it inside Cache/IRIS.
d. Using tools, like "screen generator" tools that uses some CHUI non-standard" ANSI codes for on screen attributes, might need to be "adopted" to standard ANSI codes.
As mentioned before, the time/effort for such a migration, highly depends on the native of your application, and the way it was designed. for example if you have 1 central function to print a report (lets say it is in a global), then you need to modify only this function to have all your reports working on the new system. This also applies to "central" functions for reading/writing files, dates calculations etc.