hw.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. LOG_ERROR(HW_Memory, "unknown Read%lu @ 0x%08X", sizeof(var) * 8, addr);
  34. }
  35. }
  36. template <typename T>
  37. inline void Write(u32 addr, const T data) {
  38. switch (addr & 0xFFFFF000) {
  39. case VADDR_GPU:
  40. case VADDR_GPU + 0x1000:
  41. case VADDR_GPU + 0x2000:
  42. case VADDR_GPU + 0x3000:
  43. case VADDR_GPU + 0x4000:
  44. case VADDR_GPU + 0x5000:
  45. case VADDR_GPU + 0x6000:
  46. case VADDR_GPU + 0x7000:
  47. case VADDR_GPU + 0x8000:
  48. case VADDR_GPU + 0x9000:
  49. case VADDR_GPU + 0xA000:
  50. case VADDR_GPU + 0xB000:
  51. case VADDR_GPU + 0xC000:
  52. case VADDR_GPU + 0xD000:
  53. case VADDR_GPU + 0xE000:
  54. case VADDR_GPU + 0xF000:
  55. break;
  56. case VADDR_LCD:
  57. LCD::Write(addr, data);
  58. break;
  59. default:
  60. LOG_ERROR(HW_Memory, "unknown Write%lu 0x%08X @ 0x%08X", sizeof(data) * 8, (u32)data, addr);
  61. }
  62. }
  63. // Explicitly instantiate template functions because we aren't defining this in the header:
  64. template void Read<u64>(u64& var, const u32 addr);
  65. template void Read<u32>(u32& var, const u32 addr);
  66. template void Read<u16>(u16& var, const u32 addr);
  67. template void Read<u8>(u8& var, const u32 addr);
  68. template void Write<u64>(u32 addr, const u64 data);
  69. template void Write<u32>(u32 addr, const u32 data);
  70. template void Write<u16>(u32 addr, const u16 data);
  71. template void Write<u8>(u32 addr, const u8 data);
  72. /// Update hardware
  73. void Update() {}
  74. /// Initialize hardware
  75. void Init() {
  76. LCD::Init();
  77. LOG_DEBUG(HW, "initialized OK");
  78. }
  79. /// Shutdown hardware
  80. void Shutdown() {
  81. LCD::Shutdown();
  82. LOG_DEBUG(HW, "shutdown OK");
  83. }
  84. } // namespace HW