Add disassembler window
diff --git a/cpu.c b/cpu.c
index cd2b253..40fb567 100644
--- a/cpu.c
+++ b/cpu.c
@@ -528,55 +528,59 @@
 	}
 }
 
-void dump_inst(cpu_t *cpu, const char *mn, uint16_t addr, uint8_t am)
+int dump_inst(cpu_t *cpu, char *buf, const char *mn, uint16_t addr, uint8_t am)
 {
-	printf("\t%s\t", mn);
+	char *end = buf;
+	end += sprintf(end, "%s ", mn);
 
 	switch (am)
 	{
 		case AM_IMM:
-			printf("#");
+			end += sprintf(end, "#");
 		case AM_REL:
 		case AM_ABS:
 		case AM_ZP:
-			printf("$%x", addr);
+			end += sprintf(end, "$%x", addr);
 			break;
 
 		case AM_IND:
-			printf("($%x)", addr);
+			end += sprintf(end, "($%x)", addr);
 			break;
 
 		case AM_AX:
 		case AM_ZPX:
-			printf("$%x, X", addr);
+			end += sprintf(end, "$%x, X", addr);
 			break;
 
 		case AM_AY:
 		case AM_ZPY:
-			printf("$%x, Y", addr);
+			end += sprintf(end, "$%x, Y", addr);
 			break;
 
 		case AM_ZIX:
-			printf("($%x, X)", addr);
+			end += sprintf(end, "($%x, X)", addr);
 			break;
 
 		case AM_ZIY:
-			printf("($%x), Y", addr);
+			end += sprintf(end, "($%x), Y", addr);
 			break;
 	}
 
-	printf("\n");
+	return end - buf;
 }
 
-void disas_step(cpu_t *cpu)
+char *disas_step(cpu_t *cpu)
 {
-	printf("$%x", cpu->pc);
+	char *buffer = malloc(80);
+	char *end = buffer;
+
+	// end += sprintf(buffer, "$%x", cpu->pc);
 	uint8_t op = cpu->mem[cpu->pc++];
 	switch (op)
 	{
 #define INST(mn, am, op) \
 		case op: \
-			dump_inst(cpu, #mn, \
+			end += dump_inst(cpu, end, #mn, \
 				fetch_addr(cpu, am, FETCH_NO_INDIRECTION).ptr, am); \
 			break;
 
@@ -585,26 +589,41 @@
 #undef INST
 
 		default:
-			warn("\tUndefined opcode %x", op);
+			end += sprintf(end, "Undefined opcode %x", op);
 	}
+
+	*end = 0;
+
+	return buffer;
 }
 
 void disas_num(cpu_t *cpu, uint16_t num)
 {
+	uint16_t pc = cpu->pc;
 	for (int i = 0; i < num; i++)
 	{
-		disas_step(cpu);
+		uint16_t last_pc = cpu->pc;
+		char *line = disas_step(cpu);
+		printf("$%x\t%s\n", last_pc, line);
+		free(line);
 	}
+	cpu->pc = pc;
 }
 
 void disas(cpu_t *cpu)
 {
+	uint16_t pc = cpu->pc;
 	// Raw binary, no way to know what's code what isn't
 	while (cpu->pc < 0xFFFF)
 	{
-		disas_step(cpu);
+		uint16_t last_pc = cpu->pc;
+		char *line = disas_step(cpu);
+		printf("$%x\t%s\n", last_pc, line);
+		free(line);
 	}
+	cpu->pc = pc;
 }
+
 void run(cpu_t *cpu)
 {
 	while (cpu->running)