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.
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

95 linhas
2.2KB

  1. #include <stddef.h>
  2. #include "state.h"
  3. #include "ini.h"
  4. // Running State
  5. // TODO
  6. // Persistent State
  7. void cart_info_done(cart_info* cart) {
  8. if (cart->file) fclose(cart->file);
  9. free(cart->filename);
  10. }
  11. void nese_state_done(nese_State* state) {
  12. cart_info_done(&state->cart);
  13. }
  14. static const ini_datum prefs_schema = {
  15. .type = ini_section,
  16. .name = "nese",
  17. .count = 2,
  18. .data = (ini_datum[]){
  19. {
  20. .type = ini_section,
  21. .name = ".cart",
  22. .offset = offsetof(nese_State, cart),
  23. .count = 1,
  24. .data = (ini_datum[]){
  25. {
  26. .type = ini_string,
  27. .name = "filename",
  28. .offset = offsetof(cart_info, filename),
  29. },
  30. }
  31. }, {
  32. .type = ini_section,
  33. .name = ".flags",
  34. .offset = offsetof(nese_State, flags),
  35. .count = 3,
  36. .data = (ini_datum[]){
  37. {
  38. .type = ini_flag,
  39. .name = "fullscreen",
  40. .shift = State_Bit_Fullscreen,
  41. }, {
  42. .type = ini_flag,
  43. .name = "integer_scale",
  44. .shift = State_Bit_Integer_Scale,
  45. }, {
  46. .type = ini_flag,
  47. .name = "crt_effect",
  48. .shift = State_Bit_CRT_Effect,
  49. },
  50. }
  51. },
  52. },
  53. };
  54. int save_prefs_file(const nese_State* state, FILE* file) {
  55. return write_ini_file(file, &prefs_schema, state);
  56. }
  57. int load_prefs_file(nese_State* state, FILE* file) {
  58. return read_ini_file(file, &prefs_schema, state);
  59. }
  60. int save_prefs_filename(const nese_State* state,
  61. const char* filename) {
  62. int status = -1;
  63. FILE* file = fopen(filename, "w");
  64. if (NULL != file) {
  65. status = write_ini_file(file, &prefs_schema, state);
  66. fclose(file);
  67. }
  68. return status;
  69. }
  70. int load_prefs_filename(nese_State* state,
  71. const char* filename) {
  72. int status = -1;
  73. FILE* file = fopen(filename, "r");
  74. if (NULL != file) {
  75. status = read_ini_file(file, &prefs_schema, state);
  76. fclose(file);
  77. }
  78. return status;
  79. }