Browse Source

POSIX mode now sets the stack register

Jeremiah Orians 3 years ago
parent
commit
41b5a0939d
3 changed files with 48 additions and 6 deletions
  1. 11 0
      User_Interface.py
  2. 32 1
      vm.c
  3. 5 5
      wrapper.c

+ 11 - 0
User_Interface.py

@@ -58,6 +58,8 @@ def Reset_lilith():
 	print ("Size of loaded ROM image: " + str(size) + " bytes\n")
 
 	if(POSIX_MODE):
+		global Stack_Size
+		Set_Register(12, size + Stack_Size)
 		Set_Register(15, size)
 
 def Step_lilith():
@@ -247,6 +249,14 @@ def main(argv):
 				Memory_Size = (int(arg[:-1]) * 1024 * 1024)
 			elif arg.endswith('G'):
 				Memory_Size = (int(arg[:-1]) * 1024 * 1024 * 1024)
+		elif opt in ("-S", "--STACK"):
+			global Stack_Size
+			if arg.endswith('K'):
+				Stack_Size = (int(arg[:-1]) * 1024)
+			elif arg.endswith('M'):
+				Stack_Size = (int(arg[:-1]) * 1024 * 1024)
+			elif arg.endswith('G'):
+				Stack_Size = (int(arg[:-1]) * 1024 * 1024 * 1024)
 		elif opt in ("-P", "--POSIX-MODE"):
 			global POSIX_MODE
 			POSIX_MODE = True
@@ -256,6 +266,7 @@ def main(argv):
 
 Current_IP = 0
 Memory_Size = 16 * 1024
+Stack_Size = 64 * 1024
 Current_Page = 0
 Watchpoints = {0}
 Count=0

+ 32 - 1
vm.c

@@ -70,6 +70,7 @@ int main(int argc, char **argv)
 	char* c;
 	int length;
 	int Memory_Size = (16 * 1024);
+	int Stack_Size = (64 * 1024);
 
 	tape_01_name = "tape_01";
 	tape_02_name = "tape_02";
@@ -124,6 +125,27 @@ int main(int argc, char **argv)
 			}
 			i = i + 2;
 		}
+		else if(match(argv[i], "-s") || match(argv[i], "--stack"))
+		{
+			length = strlen(argv[i + 1]) - 1;
+			c = argv[i+1];
+			class = c[length];
+			c[length] = 0;
+			Stack_Size = atoi(c);
+			if('K' == class)
+			{
+				Stack_Size = Stack_Size * 1024;
+			}
+			else if('M' == class)
+			{
+				Stack_Size = Stack_Size * 1024 * 1024;
+			}
+			else if('G' == class)
+			{
+				Stack_Size = Stack_Size * 1024 * 1024 * 1024;
+			}
+			i = i + 2;
+		}
 		else if(match(argv[i], "-P") || match(argv[i], "--POSIX-MODE"))
 		{
 				POSIX_MODE = true;
@@ -152,7 +174,16 @@ int main(int argc, char **argv)
 	size_t image;
 	vm = create_vm(Memory_Size);
 	image = load_program(vm, rom_name);
-	if(POSIX_MODE) vm->reg[15] = image;
+	if(POSIX_MODE)
+	{
+		/* Set HEAP pointer */
+		vm->reg[12] = image + Stack_Size;
+		/* HEAP starts right after stack ends */
+
+		/* Set STACK pointer */
+		vm->reg[15] = image;
+		/* STACK starts right after core image ends */
+	}
 	execute_vm(vm);
 	destroy_vm(vm);
 

+ 5 - 5
wrapper.c

@@ -160,24 +160,24 @@ void insert_address(char* p, uint32_t value)
 void process_Memory_Row(char* p, uint32_t addr)
 {
 	char* segment = p;
-	strncpy(segment, "<tr>\n<td>", 9);
+	strncpy(segment, "<tr>\n<td>", 10);
 	segment = segment + 9;
 	insert_address(segment, addr);
 	segment = segment + 8;
-	strncpy(segment, "</td>", 5);
+	strncpy(segment, "</td>", 6);
 	segment = segment + 5;
 	int i;
 	for(i = 0; i < 16; i = i + 1)
 	{
-		strncpy(segment, "<td>", 4);
+		strncpy(segment, "<td>", 5);
 		segment = segment + 4;
 		unpack_byte(Globalvm->memory[i + addr], segment);
 		segment = segment + 2;
-		strncpy(segment, "</td>", 5);
+		strncpy(segment, "</td>", 6);
 		segment = segment + 5;
 	}
 
-	strncpy(segment, "\n</tr>\n", 7);
+	strncpy(segment, "\n</tr>\n", 8);
 }
 
 char* get_memory(unsigned int start)