Hacky and quick way:
In it's simplest form, you could probably have an entire map for your underworld. Make your "cave" level the entire size of your map. Any entrances down into the underworld would be in the same corresponding position of your overland map. You wouldn't have to change your mapxoff, mapyoff, x, y, width, or height variables. You'd only have to load "cave.fmp" instead.
I'd only do this as a way of exploring what all needs to become more sophisticated. Some things that may or may not need some more smarts: Monsters, NPC's, and Chest's spring to mind. If you haven't specified which "map" they are a part of, everything that spawns on map screen (3, 14) of the overland would also spawn on 3, 14 of the underworld.
Side note: This is a prime example of how global variables can come back to bite you.
More sophisticated way:
You'll need a way to keep up with some map data and which map the player is on. Since I don't use Mappy, some of this may be done for you already, but I'll assume not. I'd make a MapData class and store all the core data of the map there. The filename, what types and number of enemies that spawn on what screen, which music to play, and lists of any kind of special tiles like entrances, burnable bushes, explodable rocks, raft launching spots, etc.
For now I'll concentrate on the "entrance" of the overland map to a cave map. The entrance on the overland will need to know specifically where it is on the overland map (screen and tile coordinate), which mapData the entrance takes the player to (cave1), and where specifically it starts you at on the destination map (mapxoff, mapyoff, x, y).
In order to leave the cave, I would create an "entrance" in the cave1 MapData that leads back to a specific point on the overland MapData.
Create a variable for currentMapData and wire up your game logic to use the data we specified (such as enemy spawning, or the map's music).
In your game logic, you can check for the player entering this special "entrance" tile. When they do, you'll want to load up the destinationMap, set the mapxoff, mapyoff, x, y, and set currentMapData to your cave1 mapData.
Now when your game loop loads a screen, it should be spawning the enemies specific to cave1's data.
I hope this helps,