version 1.5, 2000/06/02 19:20:19
|
version 1.8, 2000/06/03 10:06:30
|
Line 20
|
Line 20
|
|
|
\ this disassembler is based on data from the R4400 manual |
\ this disassembler is based on data from the R4400 manual |
\ http://www.mips.com/Documentation/R4400_Uman_book_Ed2.pdf, in |
\ http://www.mips.com/Documentation/R4400_Uman_book_Ed2.pdf, in |
\ particular pages A3,A181,A182 (offset 468 pages in xpdf). |
\ particular pages A3, A181, A182 (p. 471, 649, 650 in xpdf). |
\ it is limited to the R3000 (MIPS-I) architecture, though. |
\ it is limited to the R3000 (MIPS-I) architecture, though. |
|
|
|
\ test this with |
|
\ gforth arch/mips/disasm.fs -e "here" arch/mips/testdisasm.fs -e "here over - disasm-dump bye" |sed 's/([^)]*) //'|diff -u - arch/mips/testasm.fs |
|
|
|
get-current |
|
vocabulary disassembler |
|
also disassembler definitions |
|
|
\ instruction fields |
\ instruction fields |
|
|
: disasm-op ( w -- u ) |
: disasm-op ( w -- u ) |
Line 55
|
Line 62
|
|
|
: disasm-relative ( addr n -- w ) |
: disasm-relative ( addr n -- w ) |
\ compute printable form of relative address n relative to addr |
\ compute printable form of relative address n relative to addr |
nip ( + ) ; |
2 lshift nip ( + ) ; |
|
|
\ decode tables |
\ decode tables |
|
|
Line 80 $40 disasm-table cp0-tab-entry \ COP
|
Line 87 $40 disasm-table cp0-tab-entry \ COP
|
|
|
\ disassembler central decode cascade |
\ disassembler central decode cascade |
|
|
|
dup set-current |
|
|
: disasm-inst ( addr w -- ) |
: disasm-inst ( addr w -- ) |
\G disassemble instruction w at addr (addr is used for computing |
\G disassemble instruction w at addr (addr is used for computing |
\G branch targets) |
\G branch targets) |
Line 91 $40 disasm-table cp0-tab-entry \ COP
|
Line 100 $40 disasm-table cp0-tab-entry \ COP
|
cr ." ( " i hex. ." ) " i i @ disasm-inst |
cr ." ( " i hex. ." ) " i i @ disasm-inst |
1 cells +loop ; |
1 cells +loop ; |
|
|
|
definitions |
|
|
: disasm-special ( addr w -- ) |
: disasm-special ( addr w -- ) |
\ disassemble inst with opcode special |
\ disassemble inst with opcode special |
dup disasm-funct funct-tab-entry @ execute ; |
dup disasm-funct funct-tab-entry @ execute ; |
Line 128 $40 disasm-table cp0-tab-entry \ COP
|
Line 139 $40 disasm-table cp0-tab-entry \ COP
|
|
|
: disasm-J-target ( addr w -- ) |
: disasm-J-target ( addr w -- ) |
\ print jump target |
\ print jump target |
$3ffffff and swap $fc000000 and or hex. ; |
2 lshift $0fffffff and swap $f0000000 and or hex. ; |
|
|
: disasm-I-rs,rt,imm ( addr w -- ) |
: disasm-I-rs,rt,imm ( addr w -- ) |
dup disasm-rs . |
dup disasm-rs . |
Line 266 does> ( addr w -- )
|
Line 277 does> ( addr w -- )
|
drop nip asm-copz-imm1 ; |
drop nip asm-copz-imm1 ; |
|
|
include ./insts.fs |
include ./insts.fs |
|
|
|
previous set-current |