Multithread debugger and emulator with message queues
diff --git a/main.c b/main.c
index 3b1da46..779096c 100644
--- a/main.c
+++ b/main.c
@@ -6,23 +6,26 @@
 
 #include <bits/getopt_core.h>
 #include <ctype.h>
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
-
-extern sdl_screen_t *g_scr;
-
-#ifndef NO_PTHREAD
 #include <pthread.h>
+#include <mqueue.h>
+#include <sys/stat.h>
 
 
 void cleanup_screen_thread(pthread_t thread)
 {
-	g_screen_thread_halt = true;
 	puts("Cleaning up screen...");
-	pthread_join(thread, NULL);
+	pthread_cancel(thread);
 }
-#endif
+
+void cleanup_debug_prompt_thread(pthread_t thread)
+{
+	puts("Cleaning up debug prompt...");
+	pthread_cancel(thread);
+}
 
 int main(int argc, char **argv)
 {
@@ -97,11 +100,28 @@
 	}
 
 	cpu_t cpu;
+	mqd_t mq_to_cpu;
+
+	struct mq_attr attrs;
+	attrs.mq_maxmsg = 10;
+	attrs.mq_msgsize = MQ_BUF_LEN;
 
 	if (should_read)
 	{
 		cpu = new_cpu();
 		fread(cpu.mem + 0x600, 0xFFFF - 0x600, 1, input);
+		
+		int unlink = mq_unlink(MQ_NAME);
+		if (unlink < 0 && errno != ENOENT)
+		{
+			printf("Warning: mq_unlink() error: %d %s\n", errno, strerror(errno));
+		}
+		
+		mq_to_cpu = mq_open(MQ_NAME, O_RDWR | O_CREAT | O_NONBLOCK, S_IWUSR|S_IRUSR, &attrs);
+		printf("error after mq_open (%ld) = %d %s\n", attrs.mq_msgsize, errno, strerror(errno));
+		ASSERT("Open message queue for emulator", mq_to_cpu > 0)
+
+		mq_send(mq_to_cpu, "init", 5, 2);
 	}
 	else
 	{
@@ -111,12 +131,7 @@
 
 	if (scrflag)
 	{
-#ifndef NO_PTHREAD
 		CATCH(&cleanup_screen_thread, start_screen_thread(cpu.mem + CPU_FB_ADDR));
-#else
-		sdl_screen_t scr = new_sdl_screen(8);
-		g_scr = &scr;
-#endif
 	}
 
 	if (guiflag && scrflag)
@@ -126,11 +141,12 @@
 
 	if (guiflag)
 	{
-		gui(&cpu);
+		start_gui(mq_to_cpu, &cpu);
+		run_mq(&cpu, mq_to_cpu);
 	}
 	else if (disflag)
 	{
-		disas_num(&cpu, 12);
+		disas_num(&cpu, 64);
 	}
 	else if (runflag)
 	{
@@ -143,14 +159,13 @@
 	}
 	else if (debugflag)
 	{
-		debug(&cpu);
+		CATCH(&cleanup_debug_prompt_thread, start_debug_prompt(mq_to_cpu, &cpu));
+		run_mq(&cpu, mq_to_cpu);
 	}
-	
-#ifdef NO_PTHREAD
-	if (scrflag)
-		free_sdl_screen(g_scr);
-#endif
 
 	if (should_read)
+	{
 		free_cpu(&cpu);
+		mq_close(mq_to_cpu);
+	}
 }