Mercurial > repos > blastem
diff menu.c @ 957:1618d3676a35
Save state menu WIP
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 15 Apr 2016 23:57:50 -0700 |
parents | cbc5b39e5518 |
children | 83532f944e3b |
line wrap: on
line diff
--- a/menu.c Fri Apr 15 20:39:26 2016 -0700 +++ b/menu.c Fri Apr 15 23:57:50 2016 -0700 @@ -52,6 +52,25 @@ buf[maxchars-1] = 0; } +void copy_to_guest(m68k_context *m68k, uint32_t guest_addr, char *src, size_t tocopy) +{ + char *dst = NULL; + for (char *cur = src; cur < src+tocopy; cur+=2, guest_addr+=2, dst+=2) + { + if (!dst || !(guest_addr & 0xFFFF)) { + //we may have walked off the end of a memory block, get a fresh native pointer + dst = get_native_pointer(guest_addr, (void **)m68k->mem_pointers, &m68k->options->gen); + if (!dst) { + break; + } + } + src[1] = *cur; + *src = cur[1]; + } +} + +#define SAVE_INFO_BUFFER_SIZE (11*40) + #ifdef __ANDROID__ #include <SDL.h> #include <jni.h> @@ -190,6 +209,7 @@ gen->next_rom = alloc_concat_m(3, pieces); m68k->should_return = 1; break; + } case 3: { switch (dst) { @@ -204,6 +224,55 @@ break; } + case 4: { + char *buffer = malloc(SAVE_INFO_BUFFER_SIZE); + char *cur = buffer; + if (gen->next_context && gen->next_context->save_dir) { + char *end = buffer + SAVE_INFO_BUFFER_SIZE; + char slotfile[] = "slot_0.gst"; + char const * parts[3] = {gen->next_context->save_dir, "/", slotfile}; + struct tm ltime; + char *fname; + time_t modtime; + for (int i = 0; i < 10 && cur < end; i++) + { + slotfile[5] = i + '0'; + fname = alloc_concat_m(3, parts); + modtime = get_modification_time(fname); + free(fname); + if (modtime) { + cur += snprintf(cur, end-cur, "Slot %d - ", i); + cur += strftime(cur, end-cur, "%c", localtime_r(&modtime, <ime)); + + } else { + cur += snprintf(cur, end-cur, "Slot %d - EMPTY", i); + } + //advance past the null terminator for this entry + cur++; + } + if (cur < end) { + parts[2] = "quicksave.gst"; + fname = alloc_concat_m(3, parts); + modtime = get_modification_time(fname); + free(fname); + if (modtime) { + cur += strftime(cur, end-cur, "Quick - %c", localtime_r(&modtime, <ime)); + } else if ((end-cur) > strlen("Quick - EMPTY")){ + cur += strlen(strcpy(cur, "Quick - EMPTY")); + } + //advance past the null terminator for this entry + cur++; + if (cur < end) { + //terminate the list + *cur = 0; + } + } + } else { + *(cur++) = 0; + *(cur++) = 0; + } + copy_to_guest(m68k, dst, buffer, cur-buffer); + break; } default: fprintf(stderr, "WARNING: write to undefined menu port %X\n", address);