Are you sure you’ve changed the destination device in the project from the 18F to the 16F part?
The only reason I can think of to blame software being written to the device for the device not programming, is writing invalid data to the device.
16F devices have a 14 bit instruction set, and 18F have 16 bit instruction set. That’s not a hard rule, but generally true.
Given that it’s chopping one of the upper two bits off, that’s suspicious.
The first example you gave looks like a specific subtract instruction op code that is not supported with 16F.
They both have subtract instructions, but the 16F can’t subtract from RAM, and load the destination in a single instruction.
I’m a little baffled though because I wouldn’t expect an 18F hex file to be able to load in the programmer software when a 16F part is selected or detected.
Just in case, why not read the program hex from he 18F part and try to load that straight to the 16F part to check the result?
Bookmarks