Update: The problem is not overscan. If I reduce the overscan I can shrink the visual image to a smaller area of the screen but the missing edges are not recovered.
I tested the ROM on an emulator on my Mac and the full screen image is fine, so it is not the ROM at fault.
I think there is a mismatch between the number of pixels the emulator wants to push to the screen and the screen resolution, but trying countless different screen reses does seem to fix the issue. I’d be grateful for any help. Thanks!