What is a good design for expanding opcodes?
It looks like this is simply the problem of mapping a set of possible values (i.e., possible instructions) to some bit encoding.

You haven't specified whether all instruction encodings need to have the same length.


If they can have different lengths, usually you'll want them to form a prefix-free encoding (no encoded value is a prefix of any other).
If all instruction encodings must have the same length,any mapping that gives different instructions different encodings is acceptable.


Your solution doesn't look OK to me.  00 00 yy zz is a prefix of 00 xx yy zz if xx, yy, and zz are the addresses 00000000.

Editorial comment: the exercise is a bit boring and trivial, and doesn't involve much in the way of deep concepts.  It's just a matter of "bit-packing".