1: \ disasm.fs disassembler file (for MIPS R3000)
2: \
3: \ Copyright (C) 1995-97 Martin Anton Ertl, Christian Pirker
4: \
5: \ This file is part of RAFTS.
6: \
7: \ RAFTS is free software; you can redistribute it and/or
8: \ modify it under the terms of the GNU General Public License
9: \ as published by the Free Software Foundation; either version 2
10: \ of the License, or (at your option) any later version.
11: \
12: \ This program is distributed in the hope that it will be useful,
13: \ but WITHOUT ANY WARRANTY; without even the implied warranty of
14: \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: \ GNU General Public License for more details.
16: \
17: \ You should have received a copy of the GNU General Public License
18: \ along with this program; if not, write to the Free Software
19: \ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20:
21: : disasm-illegal ( addr w -- )
22: \ disassemble illegal instruction w at addr
23: hex. ." , ( illegal inst ) " drop ;
24:
25: : init-disasm-table ( n -- )
26: \ initialize table with n entries with disasm-illegal
27: 0 ?do
28: ['] disasm-illegal ,
29: loop ;
30:
31: create opc-table $40 init-disasm-table \ top-level decode table
32: create funct-table $40 init-disasm-table \ special function table
33: create regimm-table $20 init-disasm-table \ regim instructions rt field
34: create copz-rs-table $20 init-disasm-table \ COPz instructions rs field
35: create copz-rt-table $20 init-disasm-table \ COPz instructions rt field
36: create cp0-table $40 init-disasm-table \ COP0 function table
37:
38: \ fields
39:
40: : disasm-op ( w -- u )
41: 26 rshift ;
42:
43: : disasm-rs ( w -- u )
44: 21 rshift $1F and ;
45:
46: : disasm-rt ( w -- u )
47: 16 rshift $1f and ;
48:
49: : disasm-rd ( w -- u )
50: 11 rshift $1f and ;
51:
52: : disasm-shamt ( w -- u )
53: \ shift amount field
54: 6 rshift $1f and ;
55:
56: : disasm-funct ( w -- u )
57: $3f and ;
58:
59: : disasm-copz ( w -- u )
60: disasm-op 3 and ;
61:
62: : disasm-imm ( w -- n )
63: $ffff and dup 15 rshift negate 15 lshift or ;
64:
65: : disasm-relative ( addr n -- w )
66: \ compute printable form of relative address n relative to addr
67: nip ( + ) ;
68:
69: \ disassembler central decode cascade
70:
71: : disasm-inst ( addr w -- )
72: \G disassemble instruction w at addr (addr is used for computing
73: \G branch targets)
74: dup disasm-op cells opc-table + @ execute ;
75:
76: : disasm-dump ( addr u -- ) \ gforth
77: \G disassemble u aus starting at addr
78: bounds u+do
79: cr ." ( " i hex. ." ) " i i @ disasm-inst
80: 1 cells +loop ;
81:
82: : disasm-special ( addr w -- )
83: \ disassemble inst with opcode special
84: dup disasm-funct cells funct-table + @ execute ;
85: ' disasm-special 0 cells opc-table + !
86:
87: : disasm-regimm ( addr w -- )
88: \ disassemble regimm inst
89: dup disasm-rt cells regimm-table + @ execute ;
90: ' disasm-regimm 1 cells opc-table + !
91:
92: : disasm-copz-rs ( addr w -- )
93: \ disassemble inst with opcode COPz
94: dup disasm-rs cells copz-rs-table + @ execute ;
95: ' disasm-copz-rs $10 cells opc-table + !
96: ' disasm-copz-rs $11 cells opc-table + !
97: ' disasm-copz-rs $12 cells opc-table + !
98:
99: : disasm-copz-rt ( addr w -- )
100: \ disassemble inst with opcode COPz, rs=BC
101: dup disasm-rt cells copz-rt-table + @ execute ;
102: ' disasm-copz-rt $08 cells copz-rs-table + !
103:
104: : disasm-cp0 ( addr w -- )
105: \ disassemble inst with opcode COPz, rs=CO
106: dup disasm-funct cells cp0-table + @ execute ;
107: ' disasm-cp0 $10 cells copz-rs-table + !
108:
109: \ disassemble various formats
110:
111: : asm-op ( -- ) ;
112:
113: : disasm-J-target ( addr w -- )
114: \ print jump target
115: $3ffffff and swap $fc000000 and or hex. ;
116:
117: : asm-J-target ( u "inst" -- ; compiled code: addr w -- )
118: \ disassemble jump inst with opcode u
119: :noname POSTPONE disasm-J-target
120: name POSTPONE sliteral POSTPONE type POSTPONE ;
121: swap cells opc-table + ! ;
122:
123: : disasm-I-rs,rt,imm ( addr w -- )
124: dup disasm-rs .
125: dup disasm-rt .
126: disasm-imm disasm-relative . ;
127:
128: : asm-I-rs,rt,imm ( u "name" -- ; compiled code: addr w -- )
129: :noname POSTPONE disasm-I-rs,rt,imm
130: name POSTPONE sliteral POSTPONE type POSTPONE ;
131: swap cells opc-table + ! ;
132:
133: : asm-rt ( -- ) ;
134:
135: : disasm-I-rs,imm ( addr w -- )
136: \ !! does not check for correctly set rt ( should be 0 )
137: dup disasm-rs .
138: disasm-imm disasm-relative . ;
139:
140: : asm-I-rs,imm ( u1 u2 "name" -- ; compiled code: addr w -- )
141: :noname POSTPONE disasm-I-rs,imm
142: name POSTPONE sliteral POSTPONE type POSTPONE ;
143: swap cells opc-table + ! ;
144:
145: : disasm-rt,rs,imm ( addr w -- )
146: dup disasm-rt .
147: dup disasm-rs .
148: disasm-imm .
149: drop ;
150:
151: : asm-I-rt,rs,imm ( u "name" -- ; compiled code: addr w -- )
152: :noname POSTPONE disasm-rt,rs,imm
153: name POSTPONE sliteral POSTPONE type POSTPONE ;
154: swap cells opc-table + ! ;
155:
156: : disasm-rt,imm ( addr w -- )
157: dup disasm-rt .
158: disasm-imm .
159: drop ;
160:
161: : asm-I-rt,imm ( u "name" -- ; compiled code: addr w -- )
162: :noname POSTPONE disasm-rt,imm
163: name POSTPONE sliteral POSTPONE type POSTPONE ;
164: swap cells opc-table + ! ;
165:
166: : disasm-rt,imm,rs ( addr w -- )
167: dup disasm-rt .
168: dup disasm-imm .
169: dup disasm-rs .
170: 2drop ;
171:
172: : asm-I-rt,offset,rs ( u "name" -- ; compiled code: addr w -- )
173: :noname POSTPONE disasm-rt,imm,rs
174: name POSTPONE sliteral POSTPONE type POSTPONE ;
175: swap cells opc-table + ! ;
176:
177: : disasm-rd,rt,sa ( addr w -- )
178: dup disasm-rd .
179: dup disasm-rt .
180: dup disasm-shamt .
181: 2drop ;
182:
183: : asm-special-rd,rt,sa ( u "name" -- ; compiled code: addr w -- )
184: :noname POSTPONE disasm-rd,rt,sa
185: name POSTPONE sliteral POSTPONE type POSTPONE ;
186: swap cells funct-table + ! ;
187:
188: : disasm-rd,rt,rs ( addr w -- )
189: dup disasm-rd .
190: dup disasm-rt .
191: dup disasm-rs .
192: 2drop ;
193:
194: : asm-special-rd,rt,rs ( u "name" -- ; compiled code: addr w -- )
195: :noname POSTPONE disasm-rd,rt,rs
196: name POSTPONE sliteral POSTPONE type POSTPONE ;
197: swap cells funct-table + ! ;
198:
199: : disasm-rs. ( addr w -- )
200: dup disasm-rs .
201: 2drop ;
202:
203: : asm-special-rs ( u "name" -- ; compiled code: addr w -- )
204: :noname POSTPONE disasm-rs.
205: name POSTPONE sliteral POSTPONE type POSTPONE ;
206: swap cells funct-table + ! ;
207:
208: : disasm-rd,rs ( addr w -- )
209: dup disasm-rd .
210: dup disasm-rs .
211: 2drop ;
212:
213: : asm-special-rd,rs ( u "name" -- ; compiled code: addr w -- )
214: :noname POSTPONE disasm-rd,rs
215: name POSTPONE sliteral POSTPONE type POSTPONE ;
216: swap cells funct-table + ! ;
217:
218: : asm-special-nothing ( u "name" -- ; compiled code: addr w -- )
219: :noname POSTPONE 2drop
220: name POSTPONE sliteral POSTPONE type POSTPONE ;
221: swap cells funct-table + ! ;
222:
223: : disasm-rd. ( addr w -- )
224: dup disasm-rd .
225: 2drop ;
226:
227: : asm-special-rd ( u "name" -- ; compiled code: addr w -- )
228: :noname POSTPONE disasm-rd.
229: name POSTPONE sliteral POSTPONE type POSTPONE ;
230: swap cells funct-table + ! ;
231:
232: : disasm-rs,rt ( addr w -- )
233: dup disasm-rs .
234: dup disasm-rt .
235: 2drop ;
236:
237: : asm-special-rs,rt ( u "name" -- ; compiled code: addr w -- )
238: :noname POSTPONE disasm-rs,rt
239: name POSTPONE sliteral POSTPONE type POSTPONE ;
240: swap cells funct-table + ! ;
241:
242: : disasm-rd,rs,rt ( addr w -- )
243: dup disasm-rd .
244: dup disasm-rs .
245: dup disasm-rt .
246: 2drop ;
247:
248: : asm-special-rd,rs,rt ( u "name" -- ; compiled code: addr w -- )
249: :noname POSTPONE disasm-rd,rs,rt
250: name POSTPONE sliteral POSTPONE type POSTPONE ;
251: swap cells funct-table + ! ;
252:
253: : asm-regimm-rs,imm ( u "name" -- )
254: :noname POSTPONE disasm-I-rs,imm
255: name POSTPONE sliteral POSTPONE type POSTPONE ;
256: swap cells regimm-table + ! ;
257:
258: : asm-copz-rt,offset,rs ( u "name" -- )
259: \ ignore these insts, we disassemble using asm-I-rt,offset,rs
260: drop name 2drop ;
261:
262: : asm-copz0 ( u "name" -- )
263: :noname POSTPONE 2drop
264: name POSTPONE sliteral POSTPONE type POSTPONE ;
265: swap cells cp0-table + ! ;
266:
267: $00 constant asm-copz-MF
268: $02 constant asm-copz-CF
269: $04 constant asm-copz-MT
270: $06 constant asm-copz-CT
271: $08 constant asm-copz-BC
272: $10 constant asm-copz-C0
273:
274: $00 constant asm-copz-BCF
275: $01 constant asm-copz-BCT
276:
277: : asm-rs ( -- ) ;
278:
279: : disasm-rt,rd,z ( addr w -- )
280: dup disasm-rt .
281: dup disasm-rd .
282: dup disasm-copz .
283: 2drop ;
284:
285: : asm-copz-rt,rd ( u1 u2 "name" -- )
286: drop :noname POSTPONE disasm-rt,rd,z
287: name POSTPONE sliteral POSTPONE type POSTPONE ;
288: swap cells copz-rs-table + ! ;
289:
290: : disasm-I-imm ( addr w -- )
291: disasm-imm disasm-relative . ;
292:
293: : asm-copz-imm ( u1 u2 u3 "name" -- )
294: drop nip :noname POSTPONE disasm-I-imm
295: name POSTPONE sliteral POSTPONE type POSTPONE ;
296: swap cells copz-rt-table + ! ;
297:
298: include ./insts.fs
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>