[GeckoConverter] handle C0/E0 properly
This commit is contained in:
parent
8cd885a0d1
commit
76657315b3
1 changed files with 14 additions and 4 deletions
|
@ -115,8 +115,8 @@
|
||||||
"# utility functions\n",
|
"# utility functions\n",
|
||||||
"searchSymbol = lambda addr, lang: bsearch(symLsts[lang], addr, lambda sym: sym.addr)[1]\n",
|
"searchSymbol = lambda addr, lang: bsearch(symLsts[lang], addr, lambda sym: sym.addr)[1]\n",
|
||||||
"def convertAddr(addr, src, dst, verbose=False):\n",
|
"def convertAddr(addr, src, dst, verbose=False):\n",
|
||||||
" sym0 = searchSymbol(addr, dst)\n",
|
" sym0 = searchSymbol(addr, src)\n",
|
||||||
" sym = symMaps[src][sym0.name]\n",
|
" sym = symMaps[dst][sym0.name]\n",
|
||||||
" addrN = addr-sym0.addr+sym.addr\n",
|
" addrN = addr-sym0.addr+sym.addr\n",
|
||||||
" if verbose:\n",
|
" if verbose:\n",
|
||||||
" print('%08x: %d + %s'%(addrN, addr-sym0.addr, sym))\n",
|
" print('%08x: %d + %s'%(addrN, addr-sym0.addr, sym))\n",
|
||||||
|
@ -163,7 +163,7 @@
|
||||||
"name": "stdout",
|
"name": "stdout",
|
||||||
"output_type": "stream",
|
"output_type": "stream",
|
||||||
"text": [
|
"text": [
|
||||||
"8040a2a8: 0 + [8040a2a8] gpMarDirector (4)\n"
|
"804158dc: 0 + [804158dc] @2861 (6)\n"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -227,6 +227,7 @@
|
||||||
" @returns: converted code with type `(int, int)[]`\n",
|
" @returns: converted code with type `(int, int)[]`\n",
|
||||||
" '''\n",
|
" '''\n",
|
||||||
" insts = [x for p in code for x in p]\n",
|
" insts = [x for p in code for x in p]\n",
|
||||||
|
" # lis + lwz/lhz/lbz/ori\n",
|
||||||
" for i in range(1, len(insts)):\n",
|
" for i in range(1, len(insts)):\n",
|
||||||
" if insts[i-1]>>16 &0xfc1f == 15<<10:\n",
|
" if insts[i-1]>>16 &0xfc1f == 15<<10:\n",
|
||||||
" '''\n",
|
" '''\n",
|
||||||
|
@ -260,6 +261,9 @@
|
||||||
" insts[i-1] = insts[i-1]&0xffff0000 | haN\n",
|
" insts[i-1] = insts[i-1]&0xffff0000 | haN\n",
|
||||||
" insts[i] = insts[i]&0xffff0000 | loN\n",
|
" insts[i] = insts[i]&0xffff0000 | loN\n",
|
||||||
" logger.info('%08x -> %08x %s'%(addr, addrN, s))\n",
|
" logger.info('%08x -> %08x %s'%(addr, addrN, s))\n",
|
||||||
|
" # lwz/lhz/lbz r13/r2\n",
|
||||||
|
" # TODO\n",
|
||||||
|
" # DONE\n",
|
||||||
" return tuple(\n",
|
" return tuple(\n",
|
||||||
" tuple(insts[i:i+2])\n",
|
" tuple(insts[i:i+2])\n",
|
||||||
" for i in range(0, len(insts), 2)\n",
|
" for i in range(0, len(insts), 2)\n",
|
||||||
|
@ -277,6 +281,12 @@
|
||||||
" ans = []\n",
|
" ans = []\n",
|
||||||
" for code in gecko:\n",
|
" for code in gecko:\n",
|
||||||
" inst = code[0][0]\n",
|
" inst = code[0][0]\n",
|
||||||
|
" # handle instruction that do not involves RAM\n",
|
||||||
|
" ctype = inst>>24\n",
|
||||||
|
" if ctype in [0xC0, 0xE0]: # TODO\n",
|
||||||
|
" ans.append(code)\n",
|
||||||
|
" continue\n",
|
||||||
|
" # handle instruction that involves RAM\n",
|
||||||
" addr = 0x80000000|inst&0x1ffffff\n",
|
" addr = 0x80000000|inst&0x1ffffff\n",
|
||||||
" sym0 = bsearch(srcSymLst, addr, lambda sym: sym.addr)[1]\n",
|
" sym0 = bsearch(srcSymLst, addr, lambda sym: sym.addr)[1]\n",
|
||||||
" instN = inst\n",
|
" instN = inst\n",
|
||||||
|
@ -291,7 +301,7 @@
|
||||||
" sym = dstSymMap[sym0.name]\n",
|
" sym = dstSymMap[sym0.name]\n",
|
||||||
" if sym.size != sym0.size:\n",
|
" if sym.size != sym0.size:\n",
|
||||||
" logger.error(\n",
|
" logger.error(\n",
|
||||||
" '%08X: function size different! (%d -> %d) %s',\n",
|
" '%08X: different function size! (%d -> %d) %s',\n",
|
||||||
" inst, sym0.size, sym.size, sym.name,\n",
|
" inst, sym0.size, sym.size, sym.name,\n",
|
||||||
" )\n",
|
" )\n",
|
||||||
" continue\n",
|
" continue\n",
|
||||||
|
|
Reference in a new issue