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.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
1.7KB

  1. #ifndef NES_H_
  2. #define NES_H_
  3. #include "apu.h"
  4. #include "ppu.h"
  5. #include "input.h"
  6. #include "e6502/e6502.h"
  7. #define nes_clock_master_num (945U * 1000U * 1000U)
  8. #define nes_clock_master_den (44U)
  9. #define nes_clock_cpu_div (12U)
  10. #define nes_clock_ppu_div (4U)
  11. #define nes_mem_ram_start (0x0000U)
  12. #define nes_mem_ram_size (0x0800U)
  13. #define nes_mem_ppu_start (0x2000U)
  14. #define nes_mem_ppu_size (0x2000U)
  15. #define nes_mem_apu_start (0x4000U)
  16. #define nes_mem_apu_size (0x0020U)
  17. #define nes_mem_exp_start (0x4020U)
  18. #define nes_mem_exp_size (0x1FE0U)
  19. #define nes_mem_wram_start (0x6000U)
  20. #define nes_mem_wram_size (0x2000U)
  21. #define nes_mem_rom_start (0x8000U)
  22. #define nes_mem_rom_size (0x8000U)
  23. #define nes_ppu_mem_size (0x4000U)
  24. #define nes_ppu_map_size (0x8U)
  25. #define nes_ppu_dma_reg (0x4014U)
  26. #define nes_input_1_reg (0x4016U)
  27. #define nes_input_2_reg (0x4017U)
  28. #define nes_input_set_reg (0x4016U)
  29. #define nes_apu_map_size (0x20U)
  30. typedef struct {
  31. // TODO: Dynamic size support
  32. uint8_t prg[nes_mem_rom_size];
  33. uint8_t chr[nes_ppu_mem_size];
  34. } nes_cart_rom;
  35. typedef enum {
  36. Cart_Flag_Vertical = 0b0,
  37. Cart_Flag_Horizontal = 0b1,
  38. } nes_Cart_Flags;
  39. typedef struct {
  40. nes_cart_rom rom;
  41. uint8_t wram[nes_mem_wram_size];
  42. nes_Cart_Flags flags;
  43. int mapper;
  44. } nes_cart;
  45. typedef struct {
  46. e6502_Core cpu;
  47. nes_ppu ppu;
  48. nes_apu apu;
  49. nes_input input;
  50. uint8_t ram[nes_mem_ram_size];
  51. nes_cart cart;
  52. } nes;
  53. uint8_t nes_mem_read(nes*, uint16_t addr);
  54. void nes_mem_write(nes*, uint16_t addr, uint8_t);
  55. int nes_init(nes*);
  56. void nes_reset(nes*);
  57. nes_ppu_Result nes_run(nes*, int cycles, int* run);
  58. #endif // NES_H_