Add interrupts enabled flag to spec, add interrupt return actions to spec
Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
17
vm.md
17
vm.md
@@ -43,6 +43,7 @@ CPU flags are addressed by bit index, going from right to left.
|
|||||||
|
|
||||||
* `00` - Halt flag
|
* `00` - Halt flag
|
||||||
* `01` - Compare flag
|
* `01` - Compare flag
|
||||||
|
* `02` - Enable interrupts
|
||||||
|
|
||||||
### Flag ideas
|
### Flag ideas
|
||||||
|
|
||||||
@@ -269,6 +270,10 @@ instruction, supplying the index of the interrupt to invoke. Hardware interrupts
|
|||||||
directly by a hardware event, e.g. a keypress. Hardware and software interrupts are treated equally
|
directly by a hardware event, e.g. a keypress. Hardware and software interrupts are treated equally
|
||||||
in the CPU, and as such, they are all maskable.
|
in the CPU, and as such, they are all maskable.
|
||||||
|
|
||||||
|
An interrupt may be masked in two ways: either through its entry in the IVT, or through the "enable
|
||||||
|
interrupts" CPU flag. If the "enabled" bit in the IVT is not set, that interrupt will not be handled
|
||||||
|
when it is invoked. If the "enable interrupts" CPU flag is not set, *no* interrupts will be handled.
|
||||||
|
|
||||||
## Interrupt vector table
|
## Interrupt vector table
|
||||||
|
|
||||||
Interrupts are defined by the IVT register. The address stored in the IVT register must be a
|
Interrupts are defined by the IVT register. The address stored in the IVT register must be a
|
||||||
@@ -305,7 +310,17 @@ Before an interrupt handler is called, these actions occur:
|
|||||||
* Push the R0 register
|
* Push the R0 register
|
||||||
* Push the R1 register
|
* Push the R1 register
|
||||||
|
|
||||||
Interrupt handlers must be exited using the `iret` instruction.
|
Interrupt handlers must be exited using the `iret` instruction. When an interrupt call is exited,
|
||||||
|
the above actions occur in reverse:
|
||||||
|
|
||||||
|
* Update the stack pointer to the current frame pointer + 48
|
||||||
|
* Pop the old R1 value
|
||||||
|
* Pop the old R0 value
|
||||||
|
* Pop the old STATUS value
|
||||||
|
* Pop the old FLAGS value
|
||||||
|
* Pop the IP of the next instruction
|
||||||
|
* Pop the old stack frame
|
||||||
|
* Restore the last 6 values in an undefined order
|
||||||
|
|
||||||
## Exceptions
|
## Exceptions
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user