NESe (pronounced "Nessie") is a NES emulator based on the e6502 emulator, also written in C with a focus on speed and portability for use on embedded platforms, especially ARM.
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
3.3KB

  1. #ifndef NES_MAPPER_H_
  2. #define NES_MAPPER_H_
  3. #include <stdint.h>
  4. #ifdef DEBUG_MAPPER
  5. #define MAP_LOG(fmt, ...) printf("MAP: " fmt "\n" __VA_OPT__(,) __VA_ARGS__)
  6. #else
  7. #define MAP_LOG(...) do {} while (0)
  8. #endif
  9. struct nes_cart_t;
  10. typedef struct nes_mapper_t {
  11. const char* name;
  12. void* (*init)(struct nes_mapper_t*, struct nes_cart_t* cart);
  13. void (*reset)(void*);
  14. void (*done)(void*);
  15. uint8_t (*read)(void*, uint16_t addr);
  16. void (*write)(void*, uint16_t addr, uint8_t val);
  17. uint8_t* (*chr_addr)(void*, uint16_t addr);
  18. uint8_t* (*vram_addr)(void*, uint16_t addr);
  19. void (*chr_write)(void*, uint16_t addr, uint8_t val);
  20. void (*scanline)(void*);
  21. void (*irq_callback)(void* irq_arg, int);
  22. void* irq_arg;
  23. void* (*sram)(void*);
  24. int (*sram_size)(void*);
  25. int (*state_size)(const void* map);
  26. int (*state_read)(void* map, const void* data, int len);
  27. int (*state_write)(const void* map, void* data, int len);
  28. } nes_mapper;
  29. static inline void* nes_map_init(nes_mapper* map,
  30. struct nes_cart_t* cart) {
  31. return map->init(map, cart);
  32. }
  33. static inline void nes_map_reset(nes_mapper* map, void* data) {
  34. map->reset(data);
  35. }
  36. static inline void nes_map_done(nes_mapper* map, void* data) {
  37. map->done(data);
  38. }
  39. static inline void nes_map_set_irq(nes_mapper* map,
  40. void(*callback)(void*, int),
  41. void* arg) {
  42. map->irq_callback = callback;
  43. map->irq_arg = arg;
  44. }
  45. static inline void nes_map_trigger_irq(nes_mapper* map,
  46. int active) {
  47. map->irq_callback(map->irq_arg, active);
  48. }
  49. static inline uint8_t nes_map_read(nes_mapper* map,
  50. void* data,
  51. uint16_t addr) {
  52. return map->read(data, addr);
  53. }
  54. static inline void nes_map_write(nes_mapper* map,
  55. void* data,
  56. uint16_t addr,
  57. uint8_t val) {
  58. map->write(data, addr, val);
  59. }
  60. static inline uint8_t* nes_map_chr_addr(nes_mapper* map,
  61. void* data,
  62. uint16_t addr) {
  63. return map->chr_addr(data, addr);
  64. }
  65. static inline uint8_t nes_chr_read(nes_mapper* map,
  66. void* data,
  67. uint16_t addr) {
  68. return *(nes_map_chr_addr(map, data, addr));
  69. }
  70. static inline void nes_chr_write(nes_mapper* map, void* data,
  71. uint16_t addr, uint8_t val) {
  72. return map->chr_write(data, addr, val);
  73. }
  74. static inline uint8_t* nes_map_vram_addr(nes_mapper* map,
  75. void* data,
  76. uint16_t addr) {
  77. return map->vram_addr(data, addr & 0x1FFFU);
  78. }
  79. static inline uint8_t nes_vram_read(nes_mapper* map,
  80. void* data,
  81. uint16_t addr) {
  82. return *(nes_map_vram_addr(map, data, addr));
  83. }
  84. static inline void nes_vram_write(nes_mapper* map,
  85. void* data,
  86. uint16_t addr, uint8_t val) {
  87. *(nes_map_vram_addr(map, data, addr)) = val;
  88. }
  89. extern nes_mapper* nes_mappers[];
  90. #endif