// File: JayWalker512[P]JayParser/VM.cpp
// Function: VM::parseCodeSection()
void VM::parseCodeSection()
{	
	jumpToSection(CODESEC);
	
	// Parse
	while (!m_program->eof()) {
		readNextInstruction();
		
		switch (m_instruction)
		{
			case NOP:
				break;
			case DSP:
				execDSP();
				break;
			case MOV:
				execMOV();
				break;
			case SET:
				execSET();
				break;
			case JMP:
				execJMP();
				break;
			case JMF:
				execJMF();
				break;
			case JMPMK:
				execJMF();
				break;
			case RSTLG:
				execRSTLG();
				break;		
			case ADD:
				execADD();
				break;
			case SUB:
				execSUB();
				break;
			case MUL:
				execMUL();
				break;
			case DIV:
				execDIV();
				break;
			case DEC:
				execDEC();
				break;
			case INC:
				execINC();
				break;
			case NEG:
				execNEG();
				break;
			case EQQ:
				execEQQ();
				break;
			case NEQ:
				execNEQ();
				break;
			case AND:
				execAND();
				break;
			case ORR:
				execORR();
				break;
			case NOT:
				execNOT();
				break;
			default:
				m_log->add(new Error(FATAL + PARSERR + 1, "Unknown instruction."));
		}
						   
		if (m_log->getErrorCount())
			return;
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rdi
movq %rdi, -0x48(%rbp)
movl $0xccffccff, %esi       # imm = 0xCCFFCCFF
callq 0x4720
movq -0x48(%rbp), %rax
movq 0x40040(%rax), %rdi
movq (%rdi), %rax
addq -0x18(%rax), %rdi
callq 0x22b0
xorb $-0x1, %al
testb $0x1, %al
jne 0x4340
jmp 0x455e
movq -0x48(%rbp), %rdi
callq 0x45b0
movq -0x48(%rbp), %rax
movl 0x40028(%rax), %eax
movq %rax, -0x50(%rbp)
subq $0x29, %rax
ja 0x4481
movq -0x50(%rbp), %rax
leaq 0xd44(%rip), %rcx       # 0x50b0
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4b50
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4b80
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4bb0
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4880
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4bd0
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4bd0
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4c10
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4c30
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4c60
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4c90
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4cc0
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4cf0
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4d10
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4d30
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4d60
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4da0
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4de0
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4e30
jmp 0x44fe
movq -0x48(%rbp), %rdi
callq 0x4e80
jmp 0x44fe
movq -0x48(%rbp), %rax
movq 0x40048(%rax), %rax
movq %rax, -0x68(%rbp)
movl $0x28, %edi
callq 0x2150
movq %rax, -0x60(%rbp)
movb $0x1, -0x3d(%rbp)
leaq -0x29(%rbp), %rdi
movq %rdi, -0x58(%rbp)
callq 0x2280
movq -0x58(%rbp), %rdx
leaq 0xcd4(%rip), %rsi       # 0x518e
leaq -0x28(%rbp), %rdi
callq 0x2820
jmp 0x44c5
movq -0x60(%rbp), %rdi
movl $0x80ffee01, %esi       # imm = 0x80FFEE01
leaq -0x28(%rbp), %rdx
callq 0x28d0
jmp 0x44d9
movq -0x60(%rbp), %rsi
movq -0x68(%rbp), %rdi
movb $0x0, -0x3d(%rbp)
callq 0x27f0
jmp 0x44ec
leaq -0x28(%rbp), %rdi
callq 0x20c0
leaq -0x29(%rbp), %rdi
callq 0x2190
movq -0x48(%rbp), %rax
movq 0x40048(%rax), %rdi
callq 0x4ad0
cmpl $0x0, %eax
je 0x4559
jmp 0x455e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
jmp 0x4538
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x38(%rbp)
movl %eax, -0x3c(%rbp)
leaq -0x28(%rbp), %rdi
callq 0x20c0
leaq -0x29(%rbp), %rdi
callq 0x2190
testb $0x1, -0x3d(%rbp)
jne 0x4549
jmp 0x4557
movq -0x60(%rbp), %rdi
movl $0x28, %esi
callq 0x2160
jmp 0x4564
jmp 0x431e
addq $0x70, %rsp
popq %rbp
retq
movq -0x38(%rbp), %rdi
callq 0x2270
nopl (%rax)