Hello there, Mike...
I finally got a chance to do a good read of your code. I haven't worked in BASIC for a long time, so I had to do some thinking and remembering while reading...
We've taken a slightly different approach, in that we were able to condense the case structure a bit by doing some bit manipulation. We read in the upper two bits (7 & 6) and interpret their pattern, either 00, 01, 10 or 11. Based on that, we can branch to 4 different routines. Of course if you do the binary math, you can see that:
00 = Instructions 00h -> 3Fh
01 = Instructions 40h -> 7Fh
10 = Instructions 80h -> BFh
11 = Instructions C0h -> FFh
Now the "01" instructions are easy. You have to trap for 76h, which is HLT, otherwise all of the instructions in this range are moves. Read bits 2, 1 & 0 to determine the source and read bits 5, 4 & 3 to determine the destination. There is a table in the 8080 reference book that tells you which bit patterns represent which registers.
The "10" instructions are almost as easy. These are the Math and Logic instructions ADD, ADC, SUB, SBB, ANA, XRA, ORA & CMP. In this range, bits 2, 1 & 0 are still the source (remember, the Accumulator is always the destination) but bits 5, 4 & 3 represent the type of operation. I don't think it's detailed in the Intel book, so:
ADD = 000
ADC = 001
SUB = 010
SBB = 011
ANA = 100
XRA = 101
ORA = 110
CMP = 111
I THINK I'M RECALLING THE ORDER OF THESE FUNCTIONS CORRECTLY, BUT CONSULT DOCUMENTATION (OR AT LEAST WAIT UNTIL I CAN GET HOME AND VERIFY IT) BEFORE COMMITTING THIS TO STONE.
Now, the "00" and "11" functions are more difficult to parse out.
The "00" instructions do have (to a degree) the destination bits encoded just like the "01" instructions. You have to keep straight, however, which operations work on one byte (ex., DCR) and which operations work on two bytes (ex., DCX). This can be determined (to a degree) by reading bits 2, 1 & 0.
The "11" instructions have some similar encoding. For example, all RST instructions have the same bit pattern in 2, 1 & 0, and the restart vector number (0 - 7) is encoded in bits 5, 4 & 3. This range of instructions is fairly complicated as well and I think we ended up using a case construct for simplicity sake.
If you want, I can elaborate more on the "00" and "11" range patterns, but I'll have get my notes in front of me.
Best of luck on your project!