interrupts.c 839 B

12345678910111213141516171819202122232425262728293031
  1. #include "interrupts.h"
  2. void service_interrupt(Emulator *emu, uint16_t cause) {
  3. Cpu *cpu = emu->cpu;
  4. if(!cpu->sr.GIE) return;
  5. if((cpu->interrupt == NULL_VECTOR) || (cause > cpu->interrupt)) {
  6. cpu->interrupt = cause;
  7. }
  8. return;
  9. }
  10. void handle_interrupts(Emulator *emu) {
  11. Cpu *cpu = emu->cpu;
  12. if(cpu->interrupt != NULL_VECTOR) {
  13. cpu->sp -= 2;
  14. uint16_t *stack_address = get_stack_ptr(emu);
  15. *stack_address = cpu->pc;
  16. cpu->sp -= 2;
  17. stack_address = get_stack_ptr(emu);
  18. *stack_address = sr_to_value(emu);
  19. // ISV memory space (0xFFE0) + cause
  20. cpu->pc = *get_addr_ptr(0xFFE0 + cpu->interrupt);
  21. cpu->sr.GIE = 0;
  22. cpu->sr.CPUOFF = 0;
  23. cpu->sr.OSCOFF = 0;
  24. cpu->sr.SCG1 = 0;
  25. cpu->interrupt = NULL_VECTOR;
  26. }
  27. }