comparison menu.c @ 873:91bf4d905eba

Retrieve ROM filename from menu port write
author Michael Pavone <pavone@retrodev.com>
date Sun, 08 Nov 2015 15:58:36 -0800
parents 7022ba865cfd
children b6842dfb8edf
comparison
equal deleted inserted replaced
872:7022ba865cfd 873:91bf4d905eba
24 db = b; 24 db = b;
25 if (da->is_dir != db->is_dir) { 25 if (da->is_dir != db->is_dir) {
26 return db->is_dir - da->is_dir; 26 return db->is_dir - da->is_dir;
27 } 27 }
28 return strcasecmp(((dir_entry *)a)->name, ((dir_entry *)b)->name); 28 return strcasecmp(((dir_entry *)a)->name, ((dir_entry *)b)->name);
29 }
30
31 void copy_string_from_guest(m68k_context *m68k, uint32_t guest_addr, char *buf, size_t maxchars)
32 {
33 char *cur;
34 char *src = NULL;
35 for (cur = buf; cur < buf+maxchars; cur+=2, guest_addr+=2, src+=2)
36 {
37 if (!src || !(guest_addr & 0xFFFF)) {
38 //we may have walked off the end of a memory block, get a fresh native pointer
39 src = get_native_pointer(guest_addr, (void **)m68k->mem_pointers, &m68k->options->gen);
40 if (!src) {
41 break;
42 }
43 }
44 *cur = src[1];
45 cur[1] = *src;
46 if (!*src || !src[1]) {
47 break;
48 }
49 }
50 //make sure we terminate the string even if we did not hit a null terminator in the source
51 buf[maxchars-1] = 0;
29 } 52 }
30 53
31 void * menu_write_w(uint32_t address, void * context, uint16_t value) 54 void * menu_write_w(uint32_t address, void * context, uint16_t value)
32 { 55 {
33 m68k_context *m68k = context; 56 m68k_context *m68k = context;
92 } 115 }
93 break; 116 break;
94 } 117 }
95 case 1: { 118 case 1: {
96 char buf[4096]; 119 char buf[4096];
97 char *cur; 120 copy_string_from_guest(m68k, dst, buf, sizeof(buf));
98 char * dest = NULL;
99 for (cur = buf; cur < buf+sizeof(buf); cur+=2, dst+=2, dest+=2)
100 {
101 if (!dest || !(dst & 0xFFFF)) {
102 //we may have walked off the end of a memory block, get a fresh native pointer
103 dest = get_native_pointer(dst, (void **)m68k->mem_pointers, &m68k->options->gen);
104 if (!dest) {
105 break;
106 }
107 }
108 *cur = dest[1];
109 cur[1] = *dest;
110 if (!*dest || !dest[1]) {
111 break;
112 }
113 }
114 if (!strcmp(buf, "..")) { 121 if (!strcmp(buf, "..")) {
115 size_t len = strlen(menu->curpath); 122 size_t len = strlen(menu->curpath);
116 while (len > 1) { 123 while (len > 1) {
117 --len; 124 --len;
118 if (menu->curpath[len] == '/') { 125 if (menu->curpath[len] == '/') {
125 menu->curpath = alloc_concat_m(3, pieces); 132 menu->curpath = alloc_concat_m(3, pieces);
126 free(pieces[0]); 133 free(pieces[0]);
127 } 134 }
128 break; 135 break;
129 } 136 }
130 case 2: 137 case 2: {
138 char buf[4096];
139 copy_string_from_guest(m68k, dst, buf, sizeof(buf));
131 m68k->should_return = 1; 140 m68k->should_return = 1;
141 fprintf(stderr, "MENU: Selected ROM %s\n", buf);
132 break; 142 break;
143 }
133 default: 144 default:
134 fprintf(stderr, "WARNING: write to undefined menu port %X\n", address); 145 fprintf(stderr, "WARNING: write to undefined menu port %X\n", address);
135 } 146 }
136 menu->state = 0; 147 menu->state = 0;
137 } else { 148 } else {