scpu.cpp 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include <../base.hpp>
  2. #define SCPU_CPP
  3. #include <nall/priorityqueue.hpp>
  4. priority_queue<unsigned> event(512, bind(&sCPU::queue_event, &cpu));
  5. #include "core/core.cpp"
  6. #include "dma/dma.cpp"
  7. #include "memory/memory.cpp"
  8. #include "mmio/mmio.cpp"
  9. #include "timing/timing.cpp"
  10. void sCPU::power() {
  11. CPU::power();
  12. regs.a = regs.x = regs.y = 0x0000;
  13. regs.s = 0x01ff;
  14. mmio_power();
  15. dma_power();
  16. timing_power();
  17. reset();
  18. }
  19. void sCPU::triggerIRQ() {
  20. status.irq_pending = true;
  21. }
  22. void sCPU::reset() {
  23. CPU::reset();
  24. regs.pc.d = 0x000000;
  25. regs.pc.l = bus.read(0xfffc);
  26. regs.pc.h = bus.read(0xfffd);
  27. //note: some registers are not fully reset by SNES
  28. regs.x.h = 0x00;
  29. regs.y.h = 0x00;
  30. regs.s.h = 0x01;
  31. regs.d = 0x0000;
  32. regs.db = 0x00;
  33. regs.p = 0x34;
  34. regs.e = 1;
  35. regs.mdr = 0x00;
  36. status.wai_lock = false;
  37. status.interrupt_pending = false;
  38. status.interrupt_vector = 0xfffc; //reset vector address
  39. mmio_reset();
  40. dma_reset();
  41. timing_reset();
  42. apu_port[0] = 0x00;
  43. apu_port[1] = 0x00;
  44. apu_port[2] = 0x00;
  45. apu_port[3] = 0x00;
  46. }
  47. sCPU::sCPU() {
  48. }
  49. sCPU::~sCPU() {
  50. }