What is the difference here between "Instructions" and "OP Codes"?
Instruction: A directive for a certain action, like ADD, SUB or MOV as a whole.
OP-Code: The Encoding of an instruction as seen by the CPU.
For example, the Z80 has 1 ADD instruction and 20 ADD op-codes.
In my experience, the two terms are either used interchangeably to refer to a particular machine language command understood by a processor
Not really. An instruction refers to a Assembler mnemonic, which again may have several opcodes. Op-code in contrast always and only refers to the first byte/word (usually) in object code. Then again, when looking at code, instruction also may describe the whole works.
Everything else is lazy usage.
or else "instruction" is used to mean a particular instance of an opcode along with its operands.
It's the other way around. Well, at least with CPUs like a most old 8 bit are, where the op-code inherently encoded what operands are used and how they are encoded.
As usual there are three variations between instruction and opcode possible, depending on the instruction structure:
- The op-code (word) defines a certain operation, its workings, components and encoding. 6502 or Z80 opcodes are a good example.
- The op-code defines operation, workings, and component range, but used components are encoded in separate elements (bytes/words). Example IBM/370
- The op-code defines operation and workings, components and encoding is told in a follow up. x86 works much that way
And as usual, in real life these definitions can get mixed up - like with the 8086 having the operand size encoded within the op-code, but the operants used and their encoding denoted in a following (ModRM) byte.
Or to make it even more confusing, on the assembler side the 6502 has different mnemonics depending on the registers involved, but not for the addressing. So where a Z80 alike assembler line would be
MOV A,X, thus making the $8A opcode part of the encodings of the MOVe instruction, a 6502 assembler assigns
TXA (*1) as an instruction of it's own.
But obviously whoever prepared the table for this ad is making a different distinction between the two terms.
It simply shows that there are a certain number of things the CPU can do with an even higher degree of variation. After all, advertisement with numbers is nothing but a pissing contest.
Maybe they meant something different back then?
Nope. Meaning did never change, just today, with less direct contact with the lower levels, people tend to use these terms in a less accurate, lazy way.
*1 - Before you ask, the reason was (as with the 6800) to simplify the assembler as much as possible. With register named in the mnemonic then only one operand was left (if at all) and that was always a memory operand.