Mercurial > repos > blastem
changeset 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 |
files | menu.c |
diffstat | 1 files changed, 29 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/menu.c Sun Nov 08 15:51:57 2015 -0800 +++ b/menu.c Sun Nov 08 15:58:36 2015 -0800 @@ -28,6 +28,29 @@ return strcasecmp(((dir_entry *)a)->name, ((dir_entry *)b)->name); } +void copy_string_from_guest(m68k_context *m68k, uint32_t guest_addr, char *buf, size_t maxchars) +{ + char *cur; + char *src = NULL; + for (cur = buf; cur < buf+maxchars; cur+=2, guest_addr+=2, src+=2) + { + if (!src || !(guest_addr & 0xFFFF)) { + //we may have walked off the end of a memory block, get a fresh native pointer + src = get_native_pointer(guest_addr, (void **)m68k->mem_pointers, &m68k->options->gen); + if (!src) { + break; + } + } + *cur = src[1]; + cur[1] = *src; + if (!*src || !src[1]) { + break; + } + } + //make sure we terminate the string even if we did not hit a null terminator in the source + buf[maxchars-1] = 0; +} + void * menu_write_w(uint32_t address, void * context, uint16_t value) { m68k_context *m68k = context; @@ -94,23 +117,7 @@ } case 1: { char buf[4096]; - char *cur; - char * dest = NULL; - for (cur = buf; cur < buf+sizeof(buf); cur+=2, dst+=2, dest+=2) - { - if (!dest || !(dst & 0xFFFF)) { - //we may have walked off the end of a memory block, get a fresh native pointer - dest = get_native_pointer(dst, (void **)m68k->mem_pointers, &m68k->options->gen); - if (!dest) { - break; - } - } - *cur = dest[1]; - cur[1] = *dest; - if (!*dest || !dest[1]) { - break; - } - } + copy_string_from_guest(m68k, dst, buf, sizeof(buf)); if (!strcmp(buf, "..")) { size_t len = strlen(menu->curpath); while (len > 1) { @@ -127,9 +134,13 @@ } break; } - case 2: + case 2: { + char buf[4096]; + copy_string_from_guest(m68k, dst, buf, sizeof(buf)); m68k->should_return = 1; + fprintf(stderr, "MENU: Selected ROM %s\n", buf); break; + } default: fprintf(stderr, "WARNING: write to undefined menu port %X\n", address); }