--- gforth/arch/mips/disasm.fs 2000/06/02 12:47:36 1.4 +++ gforth/arch/mips/disasm.fs 2000/06/03 09:59:08 1.7 @@ -20,9 +20,12 @@ \ this disassembler is based on data from the R4400 manual \ 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. +\ 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 + \ instruction fields : disasm-op ( w -- u ) @@ -47,12 +50,15 @@ : disasm-copz ( w -- u ) disasm-op 3 and ; +: disasm-uimm ( w -- u ) + $ffff and ; + : disasm-imm ( w -- n ) - $ffff and dup 15 rshift negate 15 lshift or ; + disasm-uimm dup 15 rshift negate 15 lshift or ; : disasm-relative ( addr n -- w ) \ compute printable form of relative address n relative to addr - nip ( + ) ; + 2 lshift nip ( + ) ; \ decode tables @@ -125,7 +131,7 @@ $40 disasm-table cp0-tab-entry \ COP : disasm-J-target ( addr w -- ) \ 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 -- ) dup disasm-rs . @@ -142,9 +148,15 @@ $40 disasm-table cp0-tab-entry \ COP disasm-imm . drop ; -: disasm-rt,imm ( addr w -- ) +: disasm-rt,rs,uimm ( addr w -- ) dup disasm-rt . - disasm-imm . + dup disasm-rs . + disasm-uimm hex. + drop ; + +: disasm-rt,uimm ( addr w -- ) + dup disasm-rt . + disasm-uimm hex. drop ; : disasm-rt,imm,rs ( addr w -- ) @@ -195,8 +207,9 @@ $40 disasm-table cp0-tab-entry \ COP dup disasm-copz . 2drop ; -: disasm-I-imm ( addr w -- ) - disasm-imm disasm-relative . ; +: disasm-I-imm,z ( addr w -- ) + tuck disasm-imm disasm-relative . + disasm-copz . ; \ meta-defining word for instruction format disassembling definitions @@ -226,7 +239,8 @@ does> ( addr w -- ) ' disasm-I-rs,rt,imm ' opc-tab-entry define-format asm-I-rs,rt,imm ' disasm-I-rs,imm ' opc-tab-entry define-format asm-I-rs,imm1 ' disasm-rt,rs,imm ' opc-tab-entry define-format asm-I-rt,rs,imm -' disasm-rt,imm ' opc-tab-entry define-format asm-I-rt,imm +' disasm-rt,rs,uimm ' opc-tab-entry define-format asm-I-rt,rs,uimm +' disasm-rt,uimm ' opc-tab-entry define-format asm-I-rt,uimm ' disasm-rt,imm,rs ' opc-tab-entry define-format asm-I-rt,offset,rs ' disasm-rd,rt,sa ' funct-tab-entry define-format asm-special-rd,rt,sa ' disasm-rd,rt,rs ' funct-tab-entry define-format asm-special-rd,rt,rs @@ -239,7 +253,7 @@ does> ( addr w -- ) ' disasm-I-rs,imm ' regimm-tab-entry define-format asm-regimm-rs,imm ' 2drop ' cp0-tab-entry define-format asm-copz0 ' disasm-rt,rd,z ' copz-rs-tab-entry define-format asm-copz-rt,rd1 -' disasm-I-imm ' copz-rt-tab-entry define-format asm-copz-imm1 +' disasm-I-imm,z ' copz-rt-tab-entry define-format asm-copz-imm1 : asm-I-rs,imm ( u1 u2 "name" -- ; compiled code: addr w -- ) nip asm-I-rs,imm1 ;