-
Notifications
You must be signed in to change notification settings - Fork 0
/
ppc_disasm.h
143 lines (118 loc) · 4.39 KB
/
ppc_disasm.h
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/* $VER: ppc_disasm.h V1.4 (29.08.2001)
*
* Disassembler module for the PowerPC microprocessor family
* Copyright (c) 1998-2001 Frank Wille
*
* ppc_disasm.c is freeware and may be freely redistributed as long as
* no modifications are made and nothing is charged for it.
* Non-commercial usage is allowed without any restrictions.
* EVERY PRODUCT OR PROGRAM DERIVED DIRECTLY FROM MY SOURCE MAY NOT BE
* SOLD COMMERCIALLY WITHOUT PERMISSION FROM THE AUTHOR.
*
*
* v1.4 (29.08.2001) phx
* AltiVec support.
* v0.1 (23.05.1998) phx
* First version, which implements all PowerPC instructions.
* v0.0 (09.05.1998) phx
* File created.
*/
#ifndef PPC_DISASM_H
#define PPC_DISASM_H
#define PPC_GEKKO
/* version/revision */
#define PPCDISASM_VER 1
#define PPCDISASM_REV 4
/* typedefs */
typedef unsigned int ppc_word;
#ifndef NULL
#define NULL (0L)
#endif
/* endianess */
#define LITTLEENDIAN
#endif
#if !defined(BIGENDIAN) && !defined(LITTLEENDIAN)
#error Define either BIGENDIAN or LITTLEENDIAN!
#define LITTLEENDIAN
#endif
/* general defines */
#define PPCIDXMASK 0xfc000000
#define PPCIDX2MASK 0x000007fe
#define PPCDMASK 0x03e00000
#define PPCAMASK 0x001f0000
#define PPCBMASK 0x0000f800
#define PPCCMASK 0x000007c0
#define PPCMMASK 0x0000003e
#define PPCCRDMASK 0x03800000
#define PPCCRAMASK 0x001c0000
#define PPCLMASK 0x00600000
#define PPCOE 0x00000400
#define PPCVRC 0x00000400
#define PPCDST 0x02000000
#define PPCSTRM 0x00600000
#define PPCIDXSH 26
#define PPCDSH 21
#define PPCASH 16
#define PPCBSH 11
#define PPCCSH 6
#define PPCMSH 1
#define PPCCRDSH 23
#define PPCCRASH 18
#define PPCLSH 21
#define PPCIDX2SH 1
#define PPCGETIDX(x) (((x)&PPCIDXMASK)>>PPCIDXSH)
#define PPCGETD(x) (((x)&PPCDMASK)>>PPCDSH)
#define PPCGETA(x) (((x)&PPCAMASK)>>PPCASH)
#define PPCGETB(x) (((x)&PPCBMASK)>>PPCBSH)
#define PPCGETC(x) (((x)&PPCCMASK)>>PPCCSH)
#define PPCGETM(x) (((x)&PPCMMASK)>>PPCMSH)
#define PPCGETCRD(x) (((x)&PPCCRDMASK)>>PPCCRDSH)
#define PPCGETCRA(x) (((x)&PPCCRAMASK)>>PPCCRASH)
#define PPCGETL(x) (((x)&PPCLMASK)>>PPCLSH)
#define PPCGETIDX2(x) (((x)&PPCIDX2MASK)>>PPCIDX2SH)
#define PPCGETSTRM(x) (((x)&PPCSTRM)>>PPCDSH)
#ifdef PPC_GEKKO
#define GEKKOLASMASK 0x0000007e
#define GEKKOWMASK 0x00000400
#define GEKKOIMASK 0x00000380
#define GEKKOW2MASK 0x00008000
#define GEKKOI2MASK 0x00007000
#define GEKKOVMASK 0x00000FFF
#define GEKKOLASSH 1
#define GEKKOWSH 10
#define GEKKOISH 7
#define GEKKOW2SH 15
#define GEKKOI2SH 12
#define GEKKOVSH 0
#define GEKKOGETLASID(x) (((x)&GEKKOLASMASK)>>GEKKOLASSH)
#define GEKKOGETW(x) (((x)&GEKKOWMASK)>>GEKKOWSH)
#define GEKKOGETI(x) (((x)&GEKKOIMASK)>>GEKKOISH)
#define GEKKOGETW2(x) (((x)&GEKKOW2MASK)>>GEKKOW2SH)
#define GEKKOGETI2(x) (((x)&GEKKOI2MASK)>>GEKKOI2SH)
#define GEKKOGETV(x) (((x)&GEKKOVMASK)>>GEKKOVSH)
#endif
/* Disassembler structure, the interface to the application */
struct DisasmPara_PPC {
ppc_word *instr; /* pointer to instruction to disassemble */
ppc_word *iaddr; /* instr.addr., usually the same as instr */
char *opcode; /* buffer for opcode, min. 10 chars. */
char *operands; /* operand buffer, min. 24 chars. */
/* changed by disassembler: */
unsigned char type; /* type of instruction, see below */
unsigned char flags; /* additional flags */
unsigned short sreg; /* register in load/store instructions */
ppc_word displacement; /* branch- or load/store displacement */
};
#define PPCINSTR_OTHER 0 /* no additional info for other instr. */
#define PPCINSTR_BRANCH 1 /* branch dest. = PC+displacement */
#define PPCINSTR_LDST 2 /* load/store instruction: displ(sreg) */
#define PPCINSTR_IMM 3 /* 16-bit immediate val. in displacement */
#define PPCF_ILLEGAL (1<<0) /* illegal PowerPC instruction */
#define PPCF_UNSIGNED (1<<1) /* unsigned immediate instruction */
#define PPCF_SUPER (1<<2) /* supervisor level instruction */
#define PPCF_64 (1<<3) /* 64-bit only instruction */
#define PPCF_ALTIVEC (1<<4) /* AltiVec instruction */
/* ppc_disasm.o prototypes */
#ifndef PPC_DISASM_C
extern ppc_word *PPC_Disassemble(struct DisasmPara_PPC *);
#endif