// File: Lupo-CalPoly[P]cpe315-thumbsim/parse.cpp
// Function: parseMem(std::basic_ifstream<char, std::char_traits<char>>&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>)
void parseMem(ifstream & in, string type) {
  string s;
  unsigned int data, addr;
  in >> s;
  transform(s.begin(), s.end(), s.begin(), (int(*)(int))tolower);
  transform(type.begin(), type.end(), type.begin(), 
            (int(*)(int))std::tolower);
  if (s == "ta") {
    s = "data";                 // hack
  }
  if (s != type) {
    cerr << "Bad type in parseMem: " << s << endl;
    exit(1);
  }
  if (type == "instruction") {
    addr = imem.getBase();
  } else if (type == "data") {
    addr = dmem.getBase();
  }
  in >> s;
  transform(s.begin(), s.end(), s.begin(), (int(*)(int))tolower);
  if (s != "memory") {
    cerr << "Bad type (memory) in parseMem: " << s << endl;
    exit(1);
  }
  while (in >> addr >> data) {
    //cout << "Addr: " << hex << addr << " Data: " << data << endl;
    // data is in native format
    if (type == "instruction") {
      imem.write(addr, data);
      addr += 2;
    } else if (type == "data") {
      dmem.write(addr, data);
      addr += 4;
    } else {
      cerr << "Bad type in while loop in parseMem: " << s << endl;
      exit(1);
    }
  }
  in.clear();
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x160, %rsp            # imm = 0x160
movq %rsi, -0xc0(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
leaq -0x30(%rbp), %rdi
movq %rdi, -0xb8(%rbp)
callq 0x22d0
movq -0xb8(%rbp), %rsi
movq -0x8(%rbp), %rdi
callq 0x2290
jmp 0xb1ec
leaq -0x30(%rbp), %rdi
movq %rdi, -0xd0(%rbp)
callq 0x21a0
movq -0xd0(%rbp), %rdi
movq %rax, -0x50(%rbp)
callq 0x2100
movq -0xd0(%rbp), %rdi
movq %rax, -0x58(%rbp)
callq 0x21a0
movq %rax, -0x60(%rbp)
movq -0x50(%rbp), %rdi
movq -0x58(%rbp), %rsi
movq -0x60(%rbp), %rdx
movq 0x9d9d(%rip), %rcx      # 0x14fd0
callq 0xb910
movq %rax, -0xc8(%rbp)
jmp 0xb241
movq -0xc0(%rbp), %rdi
movq -0xc8(%rbp), %rax
movq %rax, -0x68(%rbp)
callq 0x21a0
movq -0xc0(%rbp), %rdi
movq %rax, -0x70(%rbp)
callq 0x2100
movq -0xc0(%rbp), %rdi
movq %rax, -0x78(%rbp)
callq 0x21a0
movq %rax, -0x80(%rbp)
movq -0x70(%rbp), %rdi
movq -0x78(%rbp), %rsi
movq -0x80(%rbp), %rdx
movq 0x9d41(%rip), %rcx      # 0x14fd0
callq 0xb910
movq %rax, -0xd8(%rbp)
jmp 0xb29d
movq -0xd8(%rbp), %rax
movq %rax, -0x88(%rbp)
leaq 0x3106(%rip), %rsi      # 0xe3b8
leaq -0x30(%rbp), %rdi
callq 0x2ed0
movb %al, -0xd9(%rbp)
jmp 0xb2c3
movb -0xd9(%rbp), %al
testb $0x1, %al
jne 0xb2cf
jmp 0xb2fd
leaq 0x30e0(%rip), %rsi      # 0xe3b6
leaq -0x30(%rbp), %rdi
callq 0x22c0
jmp 0xb2e1
jmp 0xb2fd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0x30(%rbp), %rdi
callq 0x2110
jmp 0xb6b1
movq -0xc0(%rbp), %rsi
leaq -0x30(%rbp), %rdi
callq 0xb990
testb $0x1, %al
jne 0xb313
jmp 0xb367
movq 0x9cd6(%rip), %rdi      # 0x14ff0
leaq 0x309a(%rip), %rsi      # 0xe3bb
callq 0x21d0
movq %rax, -0xe8(%rbp)
jmp 0xb32f
movq -0xe8(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x21c0
movq %rax, -0xf0(%rbp)
jmp 0xb348
movq -0xf0(%rbp), %rdi
movq 0x9c5a(%rip), %rsi      # 0x14fb0
callq 0x2200
jmp 0xb35d
movl $0x1, %edi
callq 0x2260
movq -0xc0(%rbp), %rdi
leaq 0x305d(%rip), %rsi      # 0xe3d2
callq 0x2ed0
movb %al, -0xf1(%rbp)
jmp 0xb382
movb -0xf1(%rbp), %al
testb $0x1, %al
jne 0xb38e
jmp 0xb3ad
leaq 0x9e73(%rip), %rdi      # 0x15208
callq 0xb9c0
movl %eax, -0xf8(%rbp)
jmp 0xb3a2
movl -0xf8(%rbp), %eax
movl %eax, -0x38(%rbp)
jmp 0xb3f3
movq -0xc0(%rbp), %rdi
leaq 0x2ffb(%rip), %rsi      # 0xe3b6
callq 0x2ed0
movb %al, -0xf9(%rbp)
jmp 0xb3c8
movb -0xf9(%rbp), %al
testb $0x1, %al
jne 0xb3d4
jmp 0xb3f1
leaq 0x9e55(%rip), %rdi      # 0x15230
callq 0x8cd0
movl %eax, -0x100(%rbp)
jmp 0xb3e8
movl -0x100(%rbp), %eax
movl %eax, -0x38(%rbp)
jmp 0xb3f3
movq -0x8(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x2290
jmp 0xb402
leaq -0x30(%rbp), %rdi
movq %rdi, -0x110(%rbp)
callq 0x21a0
movq -0x110(%rbp), %rdi
movq %rax, -0x90(%rbp)
callq 0x2100
movq -0x110(%rbp), %rdi
movq %rax, -0x98(%rbp)
callq 0x21a0
movq %rax, -0xa0(%rbp)
movq -0x90(%rbp), %rdi
movq -0x98(%rbp), %rsi
movq -0xa0(%rbp), %rdx
movq 0x9b75(%rip), %rcx      # 0x14fd0
callq 0xb910
movq %rax, -0x108(%rbp)
jmp 0xb469
movq -0x108(%rbp), %rax
movq %rax, -0xa8(%rbp)
leaq 0x2f60(%rip), %rsi      # 0xe3de
leaq -0x30(%rbp), %rdi
callq 0xb9e0
movb %al, -0x111(%rbp)
jmp 0xb48f
movb -0x111(%rbp), %al
testb $0x1, %al
jne 0xb49b
jmp 0xb4ef
movq 0x9b4e(%rip), %rdi      # 0x14ff0
leaq 0x2f3c(%rip), %rsi      # 0xe3e5
callq 0x21d0
movq %rax, -0x120(%rbp)
jmp 0xb4b7
movq -0x120(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x21c0
movq %rax, -0x128(%rbp)
jmp 0xb4d0
movq -0x128(%rbp), %rdi
movq 0x9ad2(%rip), %rsi      # 0x14fb0
callq 0x2200
jmp 0xb4e5
movl $0x1, %edi
callq 0x2260
jmp 0xb4f1
movq -0x8(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x2030
movq %rax, -0x130(%rbp)
jmp 0xb507
movq -0x130(%rbp), %rdi
leaq -0x34(%rbp), %rsi
callq 0x2030
movq %rax, -0x138(%rbp)
jmp 0xb520
movq -0x138(%rbp), %rdi
movq (%rdi), %rax
movq -0x18(%rax), %rax
addq %rax, %rdi
callq 0x2280
movb %al, -0x139(%rbp)
jmp 0xb53e
movb -0x139(%rbp), %al
testb $0x1, %al
jne 0xb54d
jmp 0xb688
movq -0xc0(%rbp), %rdi
leaq 0x2e77(%rip), %rsi      # 0xe3d2
callq 0x2ed0
movb %al, -0x13a(%rbp)
jmp 0xb568
movb -0x13a(%rbp), %al
testb $0x1, %al
jne 0xb574
jmp 0xb5c6
movl -0x38(%rbp), %eax
movl %eax, -0x140(%rbp)
movw -0x34(%rbp), %ax
movw %ax, -0xac(%rbp)
leaq -0xaa(%rbp), %rdi
leaq -0xac(%rbp), %rsi
callq 0x8b00
jmp 0xb59d
movl -0x140(%rbp), %esi
movzwl -0xaa(%rbp), %edx
leaq 0x9c57(%rip), %rdi      # 0x15208
callq 0x8170
jmp 0xb5b8
movl -0x38(%rbp), %eax
addl $0x2, %eax
movl %eax, -0x38(%rbp)
jmp 0xb683
movq -0xc0(%rbp), %rdi
leaq 0x2de2(%rip), %rsi      # 0xe3b6
callq 0x2ed0
movb %al, -0x141(%rbp)
jmp 0xb5e1
movb -0x141(%rbp), %al
testb $0x1, %al
jne 0xb5ed
jmp 0xb62d
movl -0x38(%rbp), %eax
movl %eax, -0x148(%rbp)
leaq -0xb0(%rbp), %rdi
leaq -0x34(%rbp), %rsi
callq 0x2c80
jmp 0xb608
movl -0x148(%rbp), %esi
movl -0xb0(%rbp), %edx
leaq 0x9c15(%rip), %rdi      # 0x15230
callq 0x7fd0
jmp 0xb622
movl -0x38(%rbp), %eax
addl $0x4, %eax
movl %eax, -0x38(%rbp)
jmp 0xb681
movq 0x99bc(%rip), %rdi      # 0x14ff0
leaq 0x2dca(%rip), %rsi      # 0xe405
callq 0x21d0
movq %rax, -0x150(%rbp)
jmp 0xb649
movq -0x150(%rbp), %rdi
leaq -0x30(%rbp), %rsi
callq 0x21c0
movq %rax, -0x158(%rbp)
jmp 0xb662
movq -0x158(%rbp), %rdi
movq 0x9940(%rip), %rsi      # 0x14fb0
callq 0x2200
jmp 0xb677
movl $0x1, %edi
callq 0x2260
jmp 0xb683
jmp 0xb4f1
movq -0x8(%rbp), %rdi
movq (%rdi), %rax
movq -0x18(%rax), %rax
addq %rax, %rdi
xorl %esi, %esi
callq 0x2350
jmp 0xb69f
leaq -0x30(%rbp), %rdi
callq 0x2110
addq $0x160, %rsp            # imm = 0x160
popq %rbp
retq
movq -0x40(%rbp), %rdi
callq 0x2370
nopw (%rax,%rax)