Mercurial > repos > blastem
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 { |