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'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

106 satır
2.7KB

  1. #include "cart.h"
  2. #include "filemap.h"
  3. #include "ines.h"
  4. #include "mapper.h"
  5. int nes_cart_init_mem(nes_cart* cart, void* mem, int len) {
  6. int status = 0;
  7. ines_Header *hdr = (ines_Header*)mem;
  8. void* ptr = &hdr[1];
  9. cart->ines_mem = mem;
  10. cart->ines_size = len;
  11. status = ines_check_mem(hdr);
  12. if (0 == status && (hdr->flags_6 & ines_Flag_Trainer)) {
  13. // Skip trainer
  14. ptr += ines_trainer_size;
  15. }
  16. if (0 == status) {
  17. int prg_size = nes_prg_rom_page_size * hdr->prg_size_lsb;
  18. if (prg_size <= 0) {
  19. INES_ERR("Bad program ROM size: %#x", prg_size);
  20. status = -1;
  21. } else {
  22. INES_INFO("%d KB PRG ROM", prg_size / 1024);
  23. cart->prg_rom = ptr;
  24. cart->prg_rom_banks = hdr->prg_size_lsb;
  25. }
  26. ptr += prg_size;
  27. }
  28. if (0 == status) {
  29. int chr_size = nes_chr_page_size * hdr->chr_size_lsb;
  30. INES_INFO("%d KB CHR ROM", chr_size / 1024);
  31. cart->chr_rom = ptr;
  32. cart->chr_rom_banks = hdr->chr_size_lsb * 2;
  33. ptr += chr_size;
  34. int index = (hdr->flags_6 & ines_Mapper_Nibble_Lo) >> 4 |
  35. (hdr->flags_7 & ines_Mapper_Nibble_Hi);
  36. cart->mapper = nes_mappers[index];
  37. if (NULL == cart->mapper) {
  38. INES_ERR("No mapper found for type %d", index);
  39. status = -1;
  40. } else if (NULL != cart->mapper->name) {
  41. INES_INFO("Mapper: %s", cart->mapper->name);
  42. }
  43. }
  44. if (0 == status) {
  45. if (hdr->flags_6 & ines_Flag_Horizontal) {
  46. cart->flags |= Cart_Flag_Horizontal;
  47. } else {
  48. cart->flags &= ~Cart_Flag_Horizontal;
  49. }
  50. // Don't initialize the mapper until all flags are set!
  51. status = nes_map_init(cart->mapper, cart);
  52. }
  53. return status;
  54. }
  55. void nes_cart_done(nes_cart* cart) {
  56. if (NULL != cart->ines_mem) {
  57. unmap_file(cart->ines_mem, cart->ines_size);
  58. cart->ines_mem = NULL;
  59. }
  60. }
  61. int nes_cart_init_file(nes_cart* cart, FILE* file) {
  62. int status = 0;
  63. int size = -1;
  64. void* mem = NULL;
  65. // Get file size
  66. status = fseek(file, 0, SEEK_END);
  67. if (0 != status) {
  68. INES_ERR("Failed to check file size");
  69. } else {
  70. size = ftell(file);
  71. }
  72. // Map file
  73. if (0 == status) {
  74. mem = map_file(file, size);
  75. if (NULL == mem) {
  76. INES_ERR("Failed to map file (%d bytes)", size);
  77. status = -1;
  78. }
  79. }
  80. // Check in memory; unmap on failure
  81. if (0 == status) {
  82. status = nes_cart_init_mem(cart, mem, size);
  83. if (0 != status) {
  84. unmap_file(file, size);
  85. }
  86. }
  87. return status;
  88. }