diff menu.c @ 866:69a6ec208111

Menu ROM now pulls real file names from the OS rather than using a fake list
author Michael Pavone <pavone@retrodev.com>
date Fri, 06 Nov 2015 12:19:39 -0800
parents
children 1bab7e01ae98
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/menu.c	Fri Nov 06 12:19:39 2015 -0800
@@ -0,0 +1,85 @@
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "blastem.h"
+#include "menu.h"
+#include "backend.h"
+#include "util.h"
+
+
+uint16_t menu_read_w(uint32_t address, void * context)
+{
+	//This should return the status of the last request with 0
+	//meaning either the request is complete or no request is pending
+	//in the current implementation, the operations happen instantly
+	//in emulated time so we can always return 0
+	return 0;
+}
+
+void * menu_write_w(uint32_t address, void * context, uint16_t value)
+{
+	m68k_context *m68k = context;
+	genesis_context *gen = m68k->system;
+	menu_context *menu = gen->extra;
+	if (!menu) {
+		gen->extra = menu = calloc(1, sizeof(menu_context));
+		menu->curpath = strdup(get_home_dir());
+	}
+	if (menu->state) {
+		uint32_t dst = menu->latch << 16 | value;
+		switch (address >> 2)
+		{
+		case 0: {
+			size_t num_entries;
+			dir_entry *entries = get_dir_list(menu->curpath, &num_entries);
+			for (size_t i = 0; i < num_entries; i++)
+			{
+				uint8_t *dest = get_native_pointer(dst, (void **)m68k->mem_pointers, &m68k->options->gen);
+				if (!dest) {
+					break;
+				}
+				*(dest++) = entries[i].is_dir;
+				*(dest++) = 1;
+				dst += 2;
+				uint8_t term = 0;
+				for (char *cpos = entries[i].name; *cpos; cpos++)
+				{
+					dest[1] = *cpos;
+					dest[0] = cpos[1];
+					if (cpos[1]) {
+						cpos++;
+					} else {
+						term = 1;
+					}
+					dst += 2;
+					if (!(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;
+						}
+					} else {
+						dest += 2;
+					}
+				}
+				if (!term) {
+					*(dest++) = 0;
+					*dest = 0;
+					dst += 2;
+				}
+			}
+			free_dir_list(entries, num_entries);
+			break;
+		}
+		default:
+			fprintf(stderr, "WARNING: write to undefined menu port %X\n", address);
+		}
+		menu->state = 0;
+	} else {
+		menu->latch = value;
+		menu->state = 1;
+	}
+
+	return context;
+}