I propose that ucode takes on the job of running everything around the instructions, and exceptions.
The state machine has one state chain for each instruction being executed. A state chain is a sequence
of microcode instructions (uop) being executed one after the other. Each uop taking 2 8MHz cycles,
and being run on even 8MHz cycles.
EA is just one or more sections of such a chain, and so are exceptions.
All of this assumes the full prefetch with IRC/IR/IRD is in place.
So the main role for an instruction is to setup the chain based on the instruction opcode (steps below may be optional):
- Insert any
uop:s that's needed before any EA
- Append any EA chain that's relevant for reading
- The instructions actual operation (ADD, SUB, Shift, a.s.o.)
- Any EA chain for writing back to memory or such
- Parts for setting flags
- Remaining bits and prefetches before the instruction ends
The instruction is now only called to setup, after that, ucode takes over and steps through the chain.
If anything would happen that would change the normal execution, like for example a bus error occurs within
the EA steps, a bus error chain replaces the rest of the instruction chain, and ucode keeps on executing
just like before.
For TRAP this would essentially be the same thing, except the instruction would just insert the exception
chain for the TRAP exception into the chain straight away.
Other exceptions could be caught when ucode parses the end step, and if there is an exception/interrupt
pending, append the exception chain, and keep on running a bit longer.
Every uop is a callback into a function dealing with it. For steps 2 and 4 above, those are callbacks pretty
much the way they are in the EA code now. For 1, 3, 5 and 6, they would be provided by the instruction code.
I propose that
ucodetakes on the job of running everything around the instructions, and exceptions.The state machine has one state chain for each instruction being executed. A state chain is a sequence
of microcode instructions (
uop) being executed one after the other. Eachuoptaking 2 8MHz cycles,and being run on even 8MHz cycles.
EA is just one or more sections of such a chain, and so are exceptions.
All of this assumes the full prefetch with IRC/IR/IRD is in place.
So the main role for an instruction is to setup the chain based on the instruction opcode (steps below may be optional):
uop:s that's needed before any EAThe instruction is now only called to setup, after that,
ucodetakes over and steps through the chain.If anything would happen that would change the normal execution, like for example a bus error occurs within
the EA steps, a bus error chain replaces the rest of the instruction chain, and ucode keeps on executing
just like before.
For
TRAPthis would essentially be the same thing, except the instruction would just insert the exceptionchain for the
TRAPexception into the chain straight away.Other exceptions could be caught when
ucodeparses the end step, and if there is an exception/interruptpending, append the exception chain, and keep on running a bit longer.
Every
uopis a callback into a function dealing with it. For steps 2 and 4 above, those are callbacks prettymuch the way they are in the EA code now. For 1, 3, 5 and 6, they would be provided by the instruction code.