1 // PUSH (2)		Push Data Onto the Stack			8, 16, 32	1	Operand is the data being pushed on the stack
  2 #PUSH32
  3 	uint32_t a = VM_GET_UINT_32;
  4 	REGS.SP -= 4;
  5 	if (REGS.SP <= REGS.IP)
  6 	{
  7 		return VMERROR_STACKOVERFLOW;
  8 	}
  9 	put_uint32_in_char_array(MEM, REGS.SP, a); // because the heap is decreasing, it's written to the upper 4 bytes - 2216805945
 10 #test
 11 IR { A = 0 IP = 0 BP = 32 SP = 32 }
 12 IM { (32)0, 2216805945, 0, 0, 0, 0, 0, 0 }
 13 FR { A = 0 IP = 8 BP = 32 SP = 28 }
 14 FM { (32)0, 2216805945, 0, 0, 0, 0, 0, 2216805945 }
 15 #end
 16 
 17 
 18 
 19 BECOMES:
 20 
 21 
 22 
 23 .
 24 .
 25 .
 26 #define VMF_PUSH32 2
 27 .
 28 .
 29 .
 30 int vmf_PUSH32(vm* vm)
 31 {
 32 	int ip_cnt = 4;
 33 
 34 	uint32_t a = VM_GET_UINT_32;
 35 	// should this be BP or SP?.... damn it's been too long...
 36 	REGS.SP -= 4;
 37 	if (REGS.SP <= REGS.IP)
 38 	{
 39 	return VMERROR_STACKOVERFLOW;
 40 	}
 41 	put_uint32_in_char_array(MEM, REGS.SP, a); // because the heap is decreasing, it's written to the upper 4 bytes - 2216805945
 42 
 43 	if (vm_error > 0)
 44 	{
 45 		return vm_error;
 46 	}
 47 	vm->model.registers.IP += ip_cnt;
 48 	return 0;
 49 }
 50 .
 51 .
 52 .
 53 vm_functions[VMF_PUSH32] = vmf_PUSH32;
 54 .
 55 .
 56 .
 57 // vmf_PUSH32(0)
 58 	{
 59 	total++;
 60 	vm* i_vm = new vm();
 61 	vm* f_vm = new vm();
 62 	
 63 	i_vm->model.registers.A.ui32 = 0;
 64 	i_vm->model.registers.B.ui32 = 0;
 65 	i_vm->model.registers.C.ui32 = 0;
 66 	i_vm->model.registers.D.ui32 = 0;
 67 	i_vm->model.registers.E.ui32 = 0;
 68 	i_vm->model.registers.F.ui32 = 0;
 69 	i_vm->model.registers.R.ui32 = 0;
 70 	i_vm->model.registers.BP = 32;
 71 	i_vm->model.registers.SP = 32;
 72 	i_vm->model.registers.IP = 0;
 73 	f_vm->model.registers.A.ui32 = 0;
 74 	f_vm->model.registers.C.ui32 = 0;
 75 	f_vm->model.registers.D.ui32 = 0;
 76 	f_vm->model.registers.E.ui32 = 0;
 77 	f_vm->model.registers.B.ui32 = 0;
 78 	f_vm->model.registers.F.ui32 = 0;
 79 	f_vm->model.registers.R.ui32 = 0;
 80 	f_vm->model.registers.BP = 32;
 81 	f_vm->model.registers.SP = 28;
 82 	f_vm->model.registers.IP = 8;
 83 	i_vm->model.mem = new unsigned char[32] {0, 0, 0, 0, 132, 33, 198, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
 84 	f_vm->model.mem = new unsigned char[32] {0, 0, 0, 0, 132, 33, 198, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 33, 198, 57};
 85 	i_vm->model.mem_size = 32;
 86 	f_vm->model.mem_size = 32;
 87 	int ret = vmf_PUSH32(i_vm);
 88 	if (ret != 0)
 89 	{
 90 		cout << "TEST FAILED (execute): vmf_PUSH32(0) returned " << ret << endl;
 91 		failures++;
 92 	}
 93 	else
 94 	{
 95 		string output = "";
 96 		if (!compare_vms(i_vm, f_vm, output))
 97 		{
 98 			cout << "TEST FAILED (compare): vmf_PUSH32(0) - " << output.c_str() << endl;
 99 			failures++;
100 		}
101 	}
102 	delete i_vm;
103 	delete f_vm;
104 	}
105 .
106 .
107 .