This repository was archived by the owner on Aug 18, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdisassembler.printer.html.js
More file actions
77 lines (76 loc) · 2.58 KB
/
disassembler.printer.html.js
File metadata and controls
77 lines (76 loc) · 2.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/* view-accessible function*/
function rebuild_arg($val,$_tr){
if($val.length){
var value=$val.val();
$val.parent().find('a').html(value);
}
var $tr=$_tr||$val.closest('tr');
var args=[];
$tr.find('.args a').each(function(a,b){
args.push($(b).html());
})
var $op=$tr.find('.op');
result=disasm.build_arg($op.val()||$op.html(),args);//TODO:find a better access
//update <a>
$tr.find('.instr').html(result.toString(16));
}
function generate_select($par){
if($par.find('select,input').length) return;//already generated
var value=/*parseInt*/($par.find('a').html());
var html="";
if($par.hasClass("type_reg")){
html+='<select onchange="rebuild_arg($(this))">';
for(var i=0;i<regName.length;i++)//TODO:print reg names
html+='<option value="'+i+'" '+(i==value?' selected="selected"':'')+'>'+regName[i]+'</option>';
html+="</select>";
}else if($par.hasClass("type_int")){//integer value
html+='<input type="text" value="'+value+'" onkeyup="rebuild_arg($(this))"/>';
}else if($par.hasClass("type_off")){//offset absolute
html+='<input type="text" value="'+value+'" onkeyup="rebuild_arg($(this))"/>';
}else if($par.hasClass("type_rel")){//offset relativ
html+='<input type="text" value="'+value+'" onkeyup="rebuild_arg($(this))"/>';
}
$par.append(html);
}
/* disassembler interface */
Disassembler.setPrinter('html',function(type){
var self=this.printer;//TODO: better idea ?
var arg=arguments;
switch(type){
case "disasm_start"://param
self.html="";
self.target=document.getElementById(arg[1].id);
break;
case "instr_start"://pc,instr
self.html+='<tr>'+
'<td class="pc">'+arg[1].toString(16)+'</td>'+
'<td class="instr"><span><a>'+arg[2].toString(16)+'</a></span></td>';
break;
case "instr"://opcode,args[]
self.html+='<td class="op">'+arg[1]+'</td>'+
'<td class="args">';
for(var i=0;i<arg[2].length;i++){
var val=arg[2][i];
self.html+='<span class="arg type_'+val[0]+'" onmouseover="generate_select($(this))"><a>';
switch(val[0]){
case "reg":self.html+=val[1];break;
case "int":self.html+= ''+val[1].toString(10);break;
case "off":self.html+='0x'+val[1].toString(16);break;
case "rel":self.html+='0x'+val[1].toString(16);break;
}
self.html+='</a></span>';
}
self.html+='</td>';
break;
case "instr_end":
self.html+='</tr>'
break;
case "disasm_end":
self.target.innerHTML=
'<thead><tr><td>PC</td><td>instr</td><td>op</td><td>args</td></tr></thead>'+
'<tbody>'+self.html+'</tbody>';//+
// '<tfoot><button onclick="">rebuild</button></tfoot>';
break;
default:console.log.apply(this,arg);break;
}
});