hw.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // Copyright 2014 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "common/common_types.h"
  5. #include "common/logging/log.h"
  6. #include "core/hw/hw.h"
  7. #include "core/hw/lcd.h"
  8. namespace HW {
  9. template <typename T>
  10. inline void Read(T& var, const u32 addr) {
  11. switch (addr & 0xFFFFF000) {
  12. case VADDR_GPU:
  13. case VADDR_GPU + 0x1000:
  14. case VADDR_GPU + 0x2000:
  15. case VADDR_GPU + 0x3000:
  16. case VADDR_GPU + 0x4000:
  17. case VADDR_GPU + 0x5000:
  18. case VADDR_GPU + 0x6000:
  19. case VADDR_GPU + 0x7000:
  20. case VADDR_GPU + 0x8000:
  21. case VADDR_GPU + 0x9000:
  22. case VADDR_GPU + 0xA000:
  23. case VADDR_GPU + 0xB000:
  24. case VADDR_GPU + 0xC000:
  25. case VADDR_GPU + 0xD000:
  26. case VADDR_GPU + 0xE000:
  27. case VADDR_GPU + 0xF000:
  28. break;
  29. case VADDR_LCD:
  30. LCD::Read(var, addr);
  31. break;
  32. default:
  33. NGLOG_ERROR(HW_Memory, "Unknown Read{} @ {:#010X}", sizeof(var) * 8, addr);
  34. break;
  35. }
  36. }
  37. template <typename T>
  38. inline void Write(u32 addr, const T data) {
  39. switch (addr & 0xFFFFF000) {
  40. case VADDR_GPU:
  41. case VADDR_GPU + 0x1000:
  42. case VADDR_GPU + 0x2000:
  43. case VADDR_GPU + 0x3000:
  44. case VADDR_GPU + 0x4000:
  45. case VADDR_GPU + 0x5000:
  46. case VADDR_GPU + 0x6000:
  47. case VADDR_GPU + 0x7000:
  48. case VADDR_GPU + 0x8000:
  49. case VADDR_GPU + 0x9000:
  50. case VADDR_GPU + 0xA000:
  51. case VADDR_GPU + 0xB000:
  52. case VADDR_GPU + 0xC000:
  53. case VADDR_GPU + 0xD000:
  54. case VADDR_GPU + 0xE000:
  55. case VADDR_GPU + 0xF000:
  56. break;
  57. case VADDR_LCD:
  58. LCD::Write(addr, data);
  59. break;
  60. default:
  61. NGLOG_ERROR(HW_Memory, "Unknown Write{} {:#010X} @ {:#010X}", sizeof(data) * 8, data, addr);
  62. break;
  63. }
  64. }
  65. // Explicitly instantiate template functions because we aren't defining this in the header:
  66. template void Read<u64>(u64& var, const u32 addr);
  67. template void Read<u32>(u32& var, const u32 addr);
  68. template void Read<u16>(u16& var, const u32 addr);
  69. template void Read<u8>(u8& var, const u32 addr);
  70. template void Write<u64>(u32 addr, const u64 data);
  71. template void Write<u32>(u32 addr, const u32 data);
  72. template void Write<u16>(u32 addr, const u16 data);
  73. template void Write<u8>(u32 addr, const u8 data);
  74. /// Update hardware
  75. void Update() {}
  76. /// Initialize hardware
  77. void Init() {
  78. LCD::Init();
  79. NGLOG_DEBUG(HW, "Initialized OK");
  80. }
  81. /// Shutdown hardware
  82. void Shutdown() {
  83. LCD::Shutdown();
  84. NGLOG_DEBUG(HW, "Shutdown OK");
  85. }
  86. } // namespace HW