annotate menu.c @ 1434:b9dbc823c014

Added a config file option for remembering the last path in the menu
author Michael Pavone <pavone@retrodev.com>
date Wed, 16 Aug 2017 20:45:51 -0700
parents c886c54d8cf1
children e2bd03ed3190
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
866
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #include <stdint.h>
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2 #include <stdlib.h>
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3 #include <string.h>
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 #include <stdio.h>
934
05b0a0d4fa40 Add strerror output to menu dir open failure message
Michael Pavone <pavone@retrodev.com>
parents: 933
diff changeset
5 #include <errno.h>
1103
22e87b739ad6 WIP split of ROM loading/argument parsing from Genesis emulation code. Compiles and doesn't crash, but nothing works. Still a few too many globals as well.
Michael Pavone <pavone@retrodev.com>
parents: 1059
diff changeset
6 #include "genesis.h"
866
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 #include "menu.h"
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8 #include "backend.h"
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
9 #include "util.h"
961
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
10 #include "gst.h"
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
11 #include "m68k_internal.h" //needed for get_native_address_trans, should be eliminated once handling of PC is cleaned up
866
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12
1434
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
13 static menu_context *persist_path_menu;
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
14 static void persist_path(void)
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
15 {
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
16 char const *parts[] = {get_userdata_dir(), PATH_SEP, "sticky_path"};
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
17 char *pathfname = alloc_concat_m(3, parts);
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
18 FILE *f = fopen(pathfname, "wb");
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
19 if (f) {
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
20 if (fwrite(persist_path_menu->curpath, 1, strlen(persist_path_menu->curpath), f) != strlen(persist_path_menu->curpath)) {
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
21 warning("Failed to save menu path");
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
22 }
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
23 fclose(f);
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
24 } else {
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
25 warning("Failed to save menu path: Could not open %s for writing\n", pathfname);
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
26
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
27 }
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
28 free(pathfname);
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
29 }
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
30
1423
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
31 static menu_context *get_menu(genesis_context *gen)
866
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 {
1423
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
33 menu_context *menu = gen->extra;
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
34 if (!menu) {
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
35 gen->extra = menu = calloc(1, sizeof(menu_context));
1434
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
36 menu->curpath = NULL;
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
37 char *remember_path = tern_find_path(config, "ui\0remember_path\0", TVAL_PTR).ptrval;
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
38 if (!remember_path || !strcmp("on", remember_path)) {
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
39 char const *parts[] = {get_userdata_dir(), PATH_SEP, "sticky_path"};
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
40 char *pathfname = alloc_concat_m(3, parts);
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
41 FILE *f = fopen(pathfname, "rb");
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
42 if (f) {
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
43 long pathsize = file_size(f);
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
44 if (pathsize > 0) {
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
45 menu->curpath = malloc(pathsize + 1);
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
46 if (fread(menu->curpath, 1, pathsize, f) != pathsize) {
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
47 warning("Error restoring saved menu path");
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
48 free(menu->curpath);
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
49 menu->curpath = NULL;
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
50 } else {
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
51 menu->curpath[pathsize] = 0;
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
52 }
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
53 }
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
54 fclose(f);
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
55 }
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
56 free(pathfname);
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
57 if (!persist_path_menu) {
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
58 atexit(persist_path);
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
59 }
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
60 persist_path_menu = menu;
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
61 }
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
62 if (!menu->curpath) {
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
63 menu->curpath = tern_find_path(config, "ui\0initial_path\0", TVAL_PTR).ptrval;
b9dbc823c014 Added a config file option for remembering the last path in the menu
Michael Pavone <pavone@retrodev.com>
parents: 1433
diff changeset
64 }
1423
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
65 if (!menu->curpath){
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
66 #ifdef __ANDROID__
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
67 menu->curpath = get_external_storage_path();
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
68 #else
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
69 menu->curpath = "$HOME";
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
70 #endif
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
71 }
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
72 tern_node *vars = tern_insert_ptr(NULL, "HOME", get_home_dir());
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
73 vars = tern_insert_ptr(vars, "EXEDIR", get_exe_dir());
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
74 menu->curpath = replace_vars(menu->curpath, vars, 1);
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
75 tern_free(vars);
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
76 }
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
77 return menu;
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
78 }
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
79
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
80 uint16_t menu_read_w(uint32_t address, void * vcontext)
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
81 {
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
82 if ((address >> 1) == 14) {
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
83 m68k_context *context = vcontext;
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
84 menu_context *menu = get_menu(context->system);
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
85 uint16_t value = menu->external_game_load;
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
86 if (value) {
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
87 printf("Read: %X\n", value);
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
88 }
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
89 menu->external_game_load = 0;
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
90 return value;
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
91 } else {
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
92 //This should return the status of the last request with 0
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
93 //meaning either the request is complete or no request is pending
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
94 //in the current implementation, the operations happen instantly
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
95 //in emulated time so we can always return 0
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
96 return 0;
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
97 }
866
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
98 }
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99
868
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
100 int menu_dir_sort(const void *a, const void *b)
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
101 {
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
102 const dir_entry *da, *db;
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
103 da = a;
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
104 db = b;
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
105 if (da->is_dir != db->is_dir) {
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
106 return db->is_dir - da->is_dir;
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
107 }
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
108 return strcasecmp(((dir_entry *)a)->name, ((dir_entry *)b)->name);
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
109 }
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
110
873
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
111 void copy_string_from_guest(m68k_context *m68k, uint32_t guest_addr, char *buf, size_t maxchars)
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
112 {
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
113 char *cur;
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
114 char *src = NULL;
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
115 for (cur = buf; cur < buf+maxchars; cur+=2, guest_addr+=2, src+=2)
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
116 {
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
117 if (!src || !(guest_addr & 0xFFFF)) {
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
118 //we may have walked off the end of a memory block, get a fresh native pointer
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
119 src = get_native_pointer(guest_addr, (void **)m68k->mem_pointers, &m68k->options->gen);
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
120 if (!src) {
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
121 break;
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
122 }
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
123 }
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
124 *cur = src[1];
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
125 cur[1] = *src;
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
126 if (!*src || !src[1]) {
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
127 break;
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
128 }
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
129 }
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
130 //make sure we terminate the string even if we did not hit a null terminator in the source
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
131 buf[maxchars-1] = 0;
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
132 }
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
133
957
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
134 void copy_to_guest(m68k_context *m68k, uint32_t guest_addr, char *src, size_t tocopy)
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
135 {
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
136 char *dst = NULL;
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
137 for (char *cur = src; cur < src+tocopy; cur+=2, guest_addr+=2, dst+=2)
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
138 {
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
139 if (!dst || !(guest_addr & 0xFFFF)) {
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
140 //we may have walked off the end of a memory block, get a fresh native pointer
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
141 dst = get_native_pointer(guest_addr, (void **)m68k->mem_pointers, &m68k->options->gen);
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
142 if (!dst) {
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
143 break;
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
144 }
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
145 }
958
83532f944e3b Get slot list displaying in "Save State" and "Load State" menu items
Michael Pavone <pavone@retrodev.com>
parents: 957
diff changeset
146 dst[1] = *cur;
83532f944e3b Get slot list displaying in "Save State" and "Load State" menu items
Michael Pavone <pavone@retrodev.com>
parents: 957
diff changeset
147 *dst = cur[1];
957
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
148 }
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
149 }
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
150
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
151 #define SAVE_INFO_BUFFER_SIZE (11*40)
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
152
882
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
153 #ifdef __ANDROID__
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
154 #include <SDL.h>
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
155 #include <jni.h>
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
156 char *get_external_storage_path()
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
157 {
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
158 static char *ret;
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
159 if (ret) {
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
160 return ret;
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
161 }
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
162 JNIEnv *env = SDL_AndroidGetJNIEnv();
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
163 if ((*env)->PushLocalFrame(env, 8) < 0) {
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
164 return NULL;
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
165 }
884
252dfd29831d Selecting a second game from the menu now works
Michael Pavone <pavone@retrodev.com>
parents: 882
diff changeset
166
882
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
167 jclass Environment = (*env)->FindClass(env, "android/os/Environment");
884
252dfd29831d Selecting a second game from the menu now works
Michael Pavone <pavone@retrodev.com>
parents: 882
diff changeset
168 jmethodID getExternalStorageDirectory =
882
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
169 (*env)->GetStaticMethodID(env, Environment, "getExternalStorageDirectory", "()Ljava/io/File;");
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
170 jobject file = (*env)->CallStaticObjectMethod(env, Environment, getExternalStorageDirectory);
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
171 if (!file) {
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
172 goto cleanup;
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
173 }
884
252dfd29831d Selecting a second game from the menu now works
Michael Pavone <pavone@retrodev.com>
parents: 882
diff changeset
174
882
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
175 jmethodID getAbsolutePath = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, file),
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
176 "getAbsolutePath", "()Ljava/lang/String;");
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
177 jstring path = (*env)->CallObjectMethod(env, file, getAbsolutePath);
884
252dfd29831d Selecting a second game from the menu now works
Michael Pavone <pavone@retrodev.com>
parents: 882
diff changeset
178
882
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
179 char const *tmp = (*env)->GetStringUTFChars(env, path, NULL);
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
180 ret = strdup(tmp);
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
181 (*env)->ReleaseStringUTFChars(env, path, tmp);
884
252dfd29831d Selecting a second game from the menu now works
Michael Pavone <pavone@retrodev.com>
parents: 882
diff changeset
182
882
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
183 cleanup:
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
184 (*env)->PopLocalFrame(env, NULL);
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
185 return ret;
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
186 }
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
187 #endif
75453bf2ffac SDL_AndroidGetExternalStoragePath did not do what I thought. Use JNI directly to call Environment.getExternalStorageDirectory
Michael Pavone <pavone@retrodev.com>
parents: 875
diff changeset
188
972
4899d3ae37b3 Implement Windows versions of recently added functions in util.c and get the Windows build working again
Michael Pavone <pavone@retrodev.com>
parents: 961
diff changeset
189 #ifdef _WIN32
4899d3ae37b3 Implement Windows versions of recently added functions in util.c and get the Windows build working again
Michael Pavone <pavone@retrodev.com>
parents: 961
diff changeset
190 #define localtime_r(a,b) localtime(a)
1244
0a34e31c4fd0 Update Windows build to use mingw-w64 cross compiler rather than Wine
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
191 //windows inclues seem not to like certain single letter defines from m68k_internal.h
0a34e31c4fd0 Update Windows build to use mingw-w64 cross compiler rather than Wine
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
192 //get rid of them here
0a34e31c4fd0 Update Windows build to use mingw-w64 cross compiler rather than Wine
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
193 #undef X
1059
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
194 #undef N
1244
0a34e31c4fd0 Update Windows build to use mingw-w64 cross compiler rather than Wine
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
195 #undef Z
0a34e31c4fd0 Update Windows build to use mingw-w64 cross compiler rather than Wine
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
196 #undef V
0a34e31c4fd0 Update Windows build to use mingw-w64 cross compiler rather than Wine
Michael Pavone <pavone@retrodev.com>
parents: 1111
diff changeset
197 #undef C
1059
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
198 #include <windows.h>
972
4899d3ae37b3 Implement Windows versions of recently added functions in util.c and get the Windows build working again
Michael Pavone <pavone@retrodev.com>
parents: 961
diff changeset
199 #endif
4899d3ae37b3 Implement Windows versions of recently added functions in util.c and get the Windows build working again
Michael Pavone <pavone@retrodev.com>
parents: 961
diff changeset
200
1059
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
201 uint32_t copy_dir_entry_to_guest(uint32_t dst, m68k_context *m68k, char *name, uint8_t is_dir)
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
202 {
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
203 uint8_t *dest = get_native_pointer(dst, (void **)m68k->mem_pointers, &m68k->options->gen);
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
204 if (!dest) {
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
205 return 0;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
206 }
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
207 *(dest++) = is_dir;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
208 *(dest++) = 1;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
209 dst += 2;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
210 uint8_t term = 0;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
211 for (char *cpos = name; *cpos; cpos++)
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
212 {
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
213 dest[1] = *cpos;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
214 dest[0] = cpos[1];
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
215 if (cpos[1]) {
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
216 cpos++;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
217 } else {
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
218 term = 1;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
219 }
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
220 dst += 2;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
221 if (!(dst & 0xFFFF)) {
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
222 //we may have walked off the end of a memory block, get a fresh native pointer
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
223 dest = get_native_pointer(dst, (void **)m68k->mem_pointers, &m68k->options->gen);
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
224 if (!dest) {
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
225 break;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
226 }
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
227 } else {
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
228 dest += 2;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
229 }
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
230 }
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
231 if (!term) {
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
232 *(dest++) = 0;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
233 *dest = 0;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
234 dst += 2;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
235 }
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
236 return dst;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
237 }
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
238
866
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
239 void * menu_write_w(uint32_t address, void * context, uint16_t value)
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
240 {
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
241 m68k_context *m68k = context;
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
242 genesis_context *gen = m68k->system;
1423
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
243 menu_context *menu = get_menu(gen);
866
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
244 if (menu->state) {
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
245 uint32_t dst = menu->latch << 16 | value;
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
246 switch (address >> 2)
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
247 {
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
248 case 0: {
1059
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
249 #ifdef _WIN32
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
250 //handle virtual "drives" directory
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
251 if (menu->curpath[0] == PATH_SEP[0]) {
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
252 char drivestrings[4096];
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
253 if (sizeof(drivestrings) >= GetLogicalDriveStrings(sizeof(drivestrings), drivestrings)) {
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
254 for (char *cur = drivestrings; *cur; cur += strlen(cur) + 1)
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
255 {
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
256 dst = copy_dir_entry_to_guest(dst, m68k, cur, 1);
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
257 }
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
258 }
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
259 //terminate list
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
260 uint8_t *dest = get_native_pointer(dst, (void **)m68k->mem_pointers, &m68k->options->gen);
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
261 if (dest) {
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
262 *dest = dest[1] = 0;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
263 }
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
264 break;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
265 }
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
266 #endif
866
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
267 size_t num_entries;
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
268 dir_entry *entries = get_dir_list(menu->curpath, &num_entries);
868
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
269 if (entries) {
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
270 qsort(entries, num_entries, sizeof(dir_entry), menu_dir_sort);
933
f7da9b4df0e7 Log errors opening directories in the menu code
Michael Pavone <pavone@retrodev.com>
parents: 884
diff changeset
271 } else {
934
05b0a0d4fa40 Add strerror output to menu dir open failure message
Michael Pavone <pavone@retrodev.com>
parents: 933
diff changeset
272 warning("Failed to open directory %s: %s\n", menu->curpath, strerror(errno));
1034
2c8d76280e43 Slightly better handling of directory read errors
Michael Pavone <pavone@retrodev.com>
parents: 1024
diff changeset
273 entries = malloc(sizeof(dir_entry));
2c8d76280e43 Slightly better handling of directory read errors
Michael Pavone <pavone@retrodev.com>
parents: 1024
diff changeset
274 entries->name = strdup("..");
2c8d76280e43 Slightly better handling of directory read errors
Michael Pavone <pavone@retrodev.com>
parents: 1024
diff changeset
275 entries->is_dir = 1;
2c8d76280e43 Slightly better handling of directory read errors
Michael Pavone <pavone@retrodev.com>
parents: 1024
diff changeset
276 num_entries = 1;
868
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
277 }
1059
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
278 #ifdef _WIN32
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
279 if (menu->curpath[1] == ':' && !menu->curpath[2]) {
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
280 //Add fake .. entry to allow navigation to virtual "drives" directory
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
281 dst = copy_dir_entry_to_guest(dst, m68k, "..", 1);
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
282 }
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
283 #endif
1418
62ec8be376be Add smd extension to default extension filter. Make file extension check case insensitive
Michael Pavone <pavone@retrodev.com>
parents: 1417
diff changeset
284 char *ext_filter = strdup(tern_find_path_default(config, "ui\0extensions\0", (tern_val){.ptrval = "bin gen md smd sms gg"}, TVAL_PTR).ptrval);
1417
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
285 uint32_t num_exts = 0, ext_storage = 5;
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
286 char **ext_list = malloc(sizeof(char *) * ext_storage);
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
287 char *cur_filter = ext_filter;
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
288 while (*cur_filter)
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
289 {
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
290 if (num_exts == ext_storage) {
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
291 ext_storage *= 2;
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
292 ext_list = realloc(ext_list, sizeof(char *) * ext_storage);
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
293 }
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
294 ext_list[num_exts++] = cur_filter;
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
295 cur_filter = split_keyval(cur_filter);
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
296 }
1059
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
297 for (size_t i = 0; dst && i < num_entries; i++)
866
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
298 {
1417
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
299 if (num_exts && !entries[i].is_dir) {
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
300 char *ext = path_extension(entries[i].name);
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
301 if (!ext) {
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
302 continue;
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
303 }
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
304 uint32_t extidx;
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
305 for (extidx = 0; extidx < num_exts; extidx++)
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
306 {
1418
62ec8be376be Add smd extension to default extension filter. Make file extension check case insensitive
Michael Pavone <pavone@retrodev.com>
parents: 1417
diff changeset
307 if (!strcasecmp(ext, ext_list[extidx])) {
1417
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
308 break;
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
309 }
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
310 }
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
311 if (extidx == num_exts) {
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
312 continue;
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
313 }
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
314 }
1059
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
315 dst = copy_dir_entry_to_guest(dst, m68k, entries[i].name, entries[i].is_dir);
866
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
316 }
1417
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
317 free(ext_filter);
e6efe6b2aee9 Add a file extension filter to the menu
Michael Pavone <pavone@retrodev.com>
parents: 1326
diff changeset
318 free(ext_list);
868
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
319 //terminate list
1059
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
320 uint8_t *dest = get_native_pointer(dst, (void **)m68k->mem_pointers, &m68k->options->gen);
868
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
321 if (dest) {
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
322 *dest = dest[1] = 0;
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
323 }
1034
2c8d76280e43 Slightly better handling of directory read errors
Michael Pavone <pavone@retrodev.com>
parents: 1024
diff changeset
324 free_dir_list(entries, num_entries);
868
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
325 break;
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
326 }
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
327 case 1: {
1bab7e01ae98 Allow directory navigation in menu. Sort directory entries
Michael Pavone <pavone@retrodev.com>
parents: 866
diff changeset
328 char buf[4096];
873
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
329 copy_string_from_guest(m68k, dst, buf, sizeof(buf));
870
f173317ecdb4 More efficient handling of going up one directory in menu
Michael Pavone <pavone@retrodev.com>
parents: 868
diff changeset
330 if (!strcmp(buf, "..")) {
1059
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
331 #ifdef _WIN32
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
332 if (menu->curpath[1] == ':' && !menu->curpath[2]) {
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
333 menu->curpath[0] = PATH_SEP[0];
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
334 menu->curpath[1] = 0;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
335 break;
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
336 }
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
337 #endif
870
f173317ecdb4 More efficient handling of going up one directory in menu
Michael Pavone <pavone@retrodev.com>
parents: 868
diff changeset
338 size_t len = strlen(menu->curpath);
1024
5ebf6ddd5a44 Allow navigating to the root directory on Unix-like systems
Michael Pavone <pavone@retrodev.com>
parents: 1015
diff changeset
339 while (len > 0) {
870
f173317ecdb4 More efficient handling of going up one directory in menu
Michael Pavone <pavone@retrodev.com>
parents: 868
diff changeset
340 --len;
1008
51885857c019 Removed assumptions that path separators are Unix style outside of Unix-only verions of functions
Michael Pavone <pavone@retrodev.com>
parents: 972
diff changeset
341 if (is_path_sep(menu->curpath[len])) {
1024
5ebf6ddd5a44 Allow navigating to the root directory on Unix-like systems
Michael Pavone <pavone@retrodev.com>
parents: 1015
diff changeset
342 if (!len) {
5ebf6ddd5a44 Allow navigating to the root directory on Unix-like systems
Michael Pavone <pavone@retrodev.com>
parents: 1015
diff changeset
343 //special handling for /
5ebf6ddd5a44 Allow navigating to the root directory on Unix-like systems
Michael Pavone <pavone@retrodev.com>
parents: 1015
diff changeset
344 menu->curpath[len+1] = 0;
5ebf6ddd5a44 Allow navigating to the root directory on Unix-like systems
Michael Pavone <pavone@retrodev.com>
parents: 1015
diff changeset
345 } else {
5ebf6ddd5a44 Allow navigating to the root directory on Unix-like systems
Michael Pavone <pavone@retrodev.com>
parents: 1015
diff changeset
346 menu->curpath[len] = 0;
5ebf6ddd5a44 Allow navigating to the root directory on Unix-like systems
Michael Pavone <pavone@retrodev.com>
parents: 1015
diff changeset
347 }
870
f173317ecdb4 More efficient handling of going up one directory in menu
Michael Pavone <pavone@retrodev.com>
parents: 868
diff changeset
348 break;
f173317ecdb4 More efficient handling of going up one directory in menu
Michael Pavone <pavone@retrodev.com>
parents: 868
diff changeset
349 }
f173317ecdb4 More efficient handling of going up one directory in menu
Michael Pavone <pavone@retrodev.com>
parents: 868
diff changeset
350 }
f173317ecdb4 More efficient handling of going up one directory in menu
Michael Pavone <pavone@retrodev.com>
parents: 868
diff changeset
351 } else {
884
252dfd29831d Selecting a second game from the menu now works
Michael Pavone <pavone@retrodev.com>
parents: 882
diff changeset
352 char *tmp = menu->curpath;
1059
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
353 #ifdef _WIN32
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
354 if (menu->curpath[0] == PATH_SEP[0] && !menu->curpath[1]) {
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
355 menu->curpath = strdup(buf);
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
356 } else
8da967779710 Added some hacky code to support a virtual root directory for selecting drives on Windows
Michael Pavone <pavone@retrodev.com>
parents: 1034
diff changeset
357 #endif
1024
5ebf6ddd5a44 Allow navigating to the root directory on Unix-like systems
Michael Pavone <pavone@retrodev.com>
parents: 1015
diff changeset
358 if (is_path_sep(menu->curpath[strlen(menu->curpath) - 1])) {
5ebf6ddd5a44 Allow navigating to the root directory on Unix-like systems
Michael Pavone <pavone@retrodev.com>
parents: 1015
diff changeset
359 menu->curpath = alloc_concat(menu->curpath, buf);
5ebf6ddd5a44 Allow navigating to the root directory on Unix-like systems
Michael Pavone <pavone@retrodev.com>
parents: 1015
diff changeset
360 } else {
5ebf6ddd5a44 Allow navigating to the root directory on Unix-like systems
Michael Pavone <pavone@retrodev.com>
parents: 1015
diff changeset
361 char const *pieces[] = {menu->curpath, PATH_SEP, buf};
5ebf6ddd5a44 Allow navigating to the root directory on Unix-like systems
Michael Pavone <pavone@retrodev.com>
parents: 1015
diff changeset
362 menu->curpath = alloc_concat_m(3, pieces);
5ebf6ddd5a44 Allow navigating to the root directory on Unix-like systems
Michael Pavone <pavone@retrodev.com>
parents: 1015
diff changeset
363 }
884
252dfd29831d Selecting a second game from the menu now works
Michael Pavone <pavone@retrodev.com>
parents: 882
diff changeset
364 free(tmp);
870
f173317ecdb4 More efficient handling of going up one directory in menu
Michael Pavone <pavone@retrodev.com>
parents: 868
diff changeset
365 }
866
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
366 break;
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
367 }
873
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
368 case 2: {
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
369 char buf[4096];
91bf4d905eba Retrieve ROM filename from menu port write
Michael Pavone <pavone@retrodev.com>
parents: 872
diff changeset
370 copy_string_from_guest(m68k, dst, buf, sizeof(buf));
1008
51885857c019 Removed assumptions that path separators are Unix style outside of Unix-only verions of functions
Michael Pavone <pavone@retrodev.com>
parents: 972
diff changeset
371 char const *pieces[] = {menu->curpath, PATH_SEP, buf};
1111
2eb54e24914e Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
372 gen->header.next_rom = alloc_concat_m(3, pieces);
872
7022ba865cfd Initial work for allowing loading a ROM from menu
Michael Pavone <pavone@retrodev.com>
parents: 870
diff changeset
373 m68k->should_return = 1;
7022ba865cfd Initial work for allowing loading a ROM from menu
Michael Pavone <pavone@retrodev.com>
parents: 870
diff changeset
374 break;
957
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
375 }
949
5e4fb650de58 Make Exit option in menu work
Michael Pavone <pavone@retrodev.com>
parents: 934
diff changeset
376 case 3: {
954
cbc5b39e5518 Implement "Resume" button in pause menu
Michael Pavone <pavone@retrodev.com>
parents: 949
diff changeset
377 switch (dst)
cbc5b39e5518 Implement "Resume" button in pause menu
Michael Pavone <pavone@retrodev.com>
parents: 949
diff changeset
378 {
cbc5b39e5518 Implement "Resume" button in pause menu
Michael Pavone <pavone@retrodev.com>
parents: 949
diff changeset
379 case 1:
cbc5b39e5518 Implement "Resume" button in pause menu
Michael Pavone <pavone@retrodev.com>
parents: 949
diff changeset
380 m68k->should_return = 1;
1111
2eb54e24914e Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
381 gen->header.should_exit = 1;
954
cbc5b39e5518 Implement "Resume" button in pause menu
Michael Pavone <pavone@retrodev.com>
parents: 949
diff changeset
382 break;
cbc5b39e5518 Implement "Resume" button in pause menu
Michael Pavone <pavone@retrodev.com>
parents: 949
diff changeset
383 case 2:
cbc5b39e5518 Implement "Resume" button in pause menu
Michael Pavone <pavone@retrodev.com>
parents: 949
diff changeset
384 m68k->should_return = 1;
cbc5b39e5518 Implement "Resume" button in pause menu
Michael Pavone <pavone@retrodev.com>
parents: 949
diff changeset
385 break;
cbc5b39e5518 Implement "Resume" button in pause menu
Michael Pavone <pavone@retrodev.com>
parents: 949
diff changeset
386 }
cbc5b39e5518 Implement "Resume" button in pause menu
Michael Pavone <pavone@retrodev.com>
parents: 949
diff changeset
387
949
5e4fb650de58 Make Exit option in menu work
Michael Pavone <pavone@retrodev.com>
parents: 934
diff changeset
388 break;
5e4fb650de58 Make Exit option in menu work
Michael Pavone <pavone@retrodev.com>
parents: 934
diff changeset
389 }
957
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
390 case 4: {
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
391 char *buffer = malloc(SAVE_INFO_BUFFER_SIZE);
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
392 char *cur = buffer;
1111
2eb54e24914e Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
393 if (gen->header.next_context && gen->header.next_context->save_dir) {
957
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
394 char *end = buffer + SAVE_INFO_BUFFER_SIZE;
1427
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
395 char slotfile[] = "slot_0.state";
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
396 char slotfilegst[] = "slot_0.gst";
1111
2eb54e24914e Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
397 char const * parts[3] = {gen->header.next_context->save_dir, PATH_SEP, slotfile};
1427
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
398 char const * partsgst[3] = {gen->header.next_context->save_dir, PATH_SEP, slotfilegst};
957
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
399 struct tm ltime;
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
400 char *fname;
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
401 time_t modtime;
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
402 for (int i = 0; i < 10 && cur < end; i++)
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
403 {
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
404 slotfile[5] = i + '0';
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
405 fname = alloc_concat_m(3, parts);
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
406 modtime = get_modification_time(fname);
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
407 free(fname);
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
408 if (modtime) {
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
409 cur += snprintf(cur, end-cur, "Slot %d - ", i);
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
410 cur += strftime(cur, end-cur, "%c", localtime_r(&modtime, &ltime));
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
411
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
412 } else {
1427
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
413 slotfilegst[5] = i + '0';
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
414 fname = alloc_concat_m(3, partsgst);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
415 modtime = get_modification_time(fname);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
416 free(fname);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
417 if (modtime) {
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
418 cur += snprintf(cur, end-cur, "Slot %d - ", i);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
419 cur += strftime(cur, end-cur, "%c", localtime_r(&modtime, &ltime));
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
420 } else {
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
421 cur += snprintf(cur, end-cur, "Slot %d - EMPTY", i);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
422 }
957
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
423 }
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
424 //advance past the null terminator for this entry
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
425 cur++;
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
426 }
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
427 if (cur < end) {
1427
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
428 parts[2] = "quicksave.state";
957
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
429 fname = alloc_concat_m(3, parts);
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
430 modtime = get_modification_time(fname);
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
431 free(fname);
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
432 if (modtime) {
958
83532f944e3b Get slot list displaying in "Save State" and "Load State" menu items
Michael Pavone <pavone@retrodev.com>
parents: 957
diff changeset
433 cur += strftime(cur, end-cur, "Quick - %c", localtime_r(&modtime, &ltime));
1427
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
434 } else {
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
435 parts[2] = "quicksave.gst";
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
436 fname = alloc_concat_m(3, parts);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
437 modtime = get_modification_time(fname);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
438 free(fname);
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
439 if (modtime) {
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
440 cur += strftime(cur, end-cur, "Quick - %c", localtime_r(&modtime, &ltime));
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
441 } else if ((end-cur) > strlen("Quick - EMPTY")){
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
442 cur += strlen(strcpy(cur, "Quick - EMPTY"));
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
443 }
957
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
444 }
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
445 //advance past the null terminator for this entry
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
446 cur++;
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
447 if (cur < end) {
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
448 //terminate the list
958
83532f944e3b Get slot list displaying in "Save State" and "Load State" menu items
Michael Pavone <pavone@retrodev.com>
parents: 957
diff changeset
449 *(cur++) = 0;
957
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
450 }
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
451 }
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
452 } else {
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
453 *(cur++) = 0;
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
454 *(cur++) = 0;
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
455 }
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
456 copy_to_guest(m68k, dst, buffer, cur-buffer);
1618d3676a35 Save state menu WIP
Michael Pavone <pavone@retrodev.com>
parents: 954
diff changeset
457 break;
1423
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
458 }
961
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
459 case 5:
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
460 //save state
1111
2eb54e24914e Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
461 if (gen->header.next_context) {
2eb54e24914e Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
462 gen->header.next_context->save_state = dst + 1;
961
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
463 }
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
464 m68k->should_return = 1;
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
465 break;
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
466 case 6:
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
467 //load state
1111
2eb54e24914e Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
468 if (gen->header.next_context && gen->header.next_context->save_dir) {
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1428
diff changeset
469 if (!gen->header.next_context->load_state(gen->header.next_context, dst)) {
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1428
diff changeset
470 break;
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1428
diff changeset
471 }/*
1427
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
472 char numslotname[] = "slot_0.state";
961
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
473 char *slotname;
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
474 if (dst == QUICK_SAVE_SLOT) {
1427
4e5797b3935a WIP - New savestate format
Michael Pavone <pavone@retrodev.com>
parents: 1423
diff changeset
475 slotname = "quicksave.state";
961
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
476 } else {
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
477 numslotname[5] = '0' + dst;
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
478 slotname = numslotname;
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
479 }
1111
2eb54e24914e Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
480 char const *parts[] = {gen->header.next_context->save_dir, PATH_SEP, slotname};
1428
2540c05520f2 New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents: 1427
diff changeset
481 char *statepath = alloc_concat_m(3, parts);
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1428
diff changeset
482 gen->header.next_context->load_state
1111
2eb54e24914e Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
483 genesis_context *next = (genesis_context *)gen->header.next_context;
1428
2540c05520f2 New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents: 1427
diff changeset
484 deserialize_buffer state;
2540c05520f2 New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents: 1427
diff changeset
485 uint32_t pc = 0;
2540c05520f2 New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents: 1427
diff changeset
486 if (load_from_file(&state, statepath)) {
2540c05520f2 New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents: 1427
diff changeset
487 genesis_deserialize(&state, next);
2540c05520f2 New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents: 1427
diff changeset
488 free(state.data);
2540c05520f2 New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents: 1427
diff changeset
489 //HACK
2540c05520f2 New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents: 1427
diff changeset
490 pc = next->m68k->last_prefetch_address;
2540c05520f2 New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents: 1427
diff changeset
491 } else {
2540c05520f2 New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents: 1427
diff changeset
492 strcpy(statepath + strlen(statepath)-strlen("state"), "gst");
2540c05520f2 New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents: 1427
diff changeset
493 pc = load_gst(next, statepath);
2540c05520f2 New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents: 1427
diff changeset
494 }
2540c05520f2 New savestates are working. New config file option for selecting format states will be saved in. Mostly complete, needs a little more work before release
Michael Pavone <pavone@retrodev.com>
parents: 1427
diff changeset
495 free(statepath);
1015
6c54d5a5c7c0 Handle failures to load save state from the menu more gracefully
Michael Pavone <pavone@retrodev.com>
parents: 1008
diff changeset
496 if (!pc) {
6c54d5a5c7c0 Handle failures to load save state from the menu more gracefully
Michael Pavone <pavone@retrodev.com>
parents: 1008
diff changeset
497 break;
6c54d5a5c7c0 Handle failures to load save state from the menu more gracefully
Michael Pavone <pavone@retrodev.com>
parents: 1008
diff changeset
498 }
1111
2eb54e24914e Mostly working changes to allow support for multiple emulated system types in main blastem program
Michael Pavone <pavone@retrodev.com>
parents: 1103
diff changeset
499 next->m68k->resume_pc = get_native_address_trans(next->m68k, pc);
1433
c886c54d8cf1 Added save states to SMS emulation
Michael Pavone <pavone@retrodev.com>
parents: 1428
diff changeset
500 */
961
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
501 }
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
502 m68k->should_return = 1;
750995b587a0 Save State menu option is now fully functional. Load state sort of works, but is mostly broken.
Michael Pavone <pavone@retrodev.com>
parents: 958
diff changeset
503 break;
1423
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
504 case 7:
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
505 //read only port
9a3e003bdcb3 Make drag and drop play nice with the menu
Michael Pavone <pavone@retrodev.com>
parents: 1418
diff changeset
506 break;
866
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
507 default:
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
508 fprintf(stderr, "WARNING: write to undefined menu port %X\n", address);
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
509 }
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
510 menu->state = 0;
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
511 } else {
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
512 menu->latch = value;
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
513 menu->state = 1;
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
514 }
954
cbc5b39e5518 Implement "Resume" button in pause menu
Michael Pavone <pavone@retrodev.com>
parents: 949
diff changeset
515 if (m68k->should_return) {
cbc5b39e5518 Implement "Resume" button in pause menu
Michael Pavone <pavone@retrodev.com>
parents: 949
diff changeset
516 m68k->target_cycle = m68k->current_cycle;
cbc5b39e5518 Implement "Resume" button in pause menu
Michael Pavone <pavone@retrodev.com>
parents: 949
diff changeset
517 }
866
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
518
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
519 return context;
69a6ec208111 Menu ROM now pulls real file names from the OS rather than using a fake list
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
520 }