OBJECT lablist pos/lab:LONG, next:PTR TO lablist, prev:PTR TO lablist SET F_FPU, F_Vect, F_OEA PROC ReAss(o,pos,src:PTR TO LONG,len,offset) DEFUL inst DEFL opcode,extop,d,a,b,c,si,ui,tmp:W,flags=0 DEF oe:PTR TO CHAR,rc:PTR TO CHAR,sg:PTR TO CHAR DEF str[64]:STRING DEF labellist=NIL:PTR TO lablist, ll:PTR TO lablist, label:PTR TO lablist,lab=0, min=$7fffffff,done // find labels pos:=0 WHILE pos>26 si:=tmp:=inst SELECT opcode CASE 16,18 IF (label:=AllocPooled(pool,SIZEOF_lablist))=NIL THEN RETURN SELECT opcode CASE 16 label.pos:=pos+si&~%11 CASE 18 label.pos:=pos+inst&~%11&$00ffffff ENDSELECT label.lab:=lab++ IF label.pos>26 extop:=inst&$7ff d:=inst>>21&$1f a:=inst>>16&$1f b:=inst>>11&$1f c:=inst>>6&$1f si:=tmp:=inst ui:=inst&$ffff SELECT opcode CASE 03; StringF(str,'twi\t\d,r\d,\d',d,a,si) CASE 04 rc:=%10000000000 small:=extop&$3f IF small>=32&&small<=47 THEN extop&=$3f flags|=F_Vect SELECT extop CASE (0000); StringF(str,'vaddubm\tv\d,v\d,v\d',d,a,b) CASE (0002); StringF(str,'vmaxub\tv\d,v\d,v\d',d,a,b) CASE (0004); StringF(str,'vrlb\tv\d,v\d,v\d',d,a,b) CASE (0006); StringF(str,'vcmpequb\tv\d,v\d,v\d',d,a,b) CASE (0006|rc); StringF(str,'vcmpequb.\tv\d,v\d,v\d',d,a,b) CASE (0008); StringF(str,'vmuloub\tv\d,v\d,\d',d,a,b) CASE (0010); StringF(str,'vaddfp\tv\d,v\d,v\d',d,a,b) CASE (0012); StringF(str,'vmrghb\tv\d,v\d,v\d',d,a,b) CASE (0014); StringF(str,'vpkuhum\tv\d,v\d,v\d',d,a,b) CASE (0032); StringF(str,'vmhaddshs\tv\d,v\d,v\d,v\d',d,a,b,c) CASE (0033); StringF(str,'vmhraddshs\tv\d,v\d,v\d,v\d',d,a,b,c) CASE (0034); StringF(str,'vmladduhm\tv\d,v\d,v\d,v\d',d,a,b,c) CASE (0036); StringF(str,'vmsumubm\tv\d,v\d,v\d,v\d',d,a,b,c) CASE (0037); StringF(str,'vmsummbm\tv\d,v\d,v\d,v\d',d,a,b,c) CASE (0038); StringF(str,'vmsumuhm\tv\d,v\d,v\d,v\d',d,a,b,c) CASE (0039); StringF(str,'vmsumuhs\tv\d,v\d,v\d,v\d',d,a,b,c) CASE (0040); StringF(str,'vmsumshm\tv\d,v\d,v\d,v\d',d,a,b,c) CASE (0041); StringF(str,'vmsumshs\tv\d,v\d,v\d,v\d',d,a,b,c) CASE (0042); StringF(str,'vsel\tv\d,v\d,v\d,v\d',d,a,b,c) CASE (0043); StringF(str,'vper\tv\d,v\d,v\d,v\d',d,a,b,c) CASE (0044); StringF(str,'vsldoi\tv\d,v\d,v\d,v\d',d,a,b,c&$f) CASE (0046); StringF(str,'vmaddfp\tv\d,v\d,v\d,v\d',d,a,c,b) CASE (0047); StringF(str,'vnmsubfp\tv\d,v\d,v\d,v\d',d,a,c,b) CASE (0064); StringF(str,'vadduhm\tv\d,v\d,v\d',d,a,b) CASE (0066); StringF(str,'vmaxuh\tv\d,v\d,v\d',d,a,b) CASE (0068); StringF(str,'vrlh\tv\d,v\d,v\d',d,a,b) CASE (0070); StringF(str,'vcmpequh\tv\d,v\d,v\d',d,a,b) CASE (0070|rc); StringF(str,'vcmpequh.\tv\d,v\d,v\d',d,a,b) CASE (0072); StringF(str,'vmulouh\tv\d,v\d,\d',d,a,b) CASE (0074); StringF(str,'vsubfp\tv\d,v\d,v\d',d,a,b) CASE (0076); StringF(str,'vmrghh\tv\d,v\d,v\d',d,a,b) CASE (0078); StringF(str,'vpkuwum\tv\d,v\d,v\d',d,a,b) CASE (0128); StringF(str,'vadduwm\tv\d,v\d,v\d',d,a,b) CASE (0130); StringF(str,'vmaxuw\tv\d,v\d,v\d',d,a,b) CASE (0132); StringF(str,'vrlw\tv\d,v\d,v\d',d,a,b) CASE (0134); StringF(str,'vcmpequw\tv\d,v\d,v\d',d,a,b) CASE (0134|rc); StringF(str,'vcmpequw.\tv\d,v\d,v\d',d,a,b) CASE (0140); StringF(str,'vmrghw\tv\d,v\d,v\d',d,a,b) CASE (0142); StringF(str,'vpkuhus\tv\d,v\d,v\d',d,a,b) CASE (0198); StringF(str,'vcmpeqfp\tv\d,v\d,v\d',d,a,b) CASE (0198|rc); StringF(str,'vcmpeqfp.\tv\d,v\d,v\d',d,a,b) CASE (0206); StringF(str,'vpkuwus\tv\d,v\d,v\d',d,a,b) CASE (0258); StringF(str,'vmaxsb\tv\d,v\d,v\d',d,a,b) CASE (0260); StringF(str,'vslb\tv\d,v\d,v\d',d,a,b) CASE (0264); StringF(str,'vmulosb\tv\d,v\d,\d',d,a,b) CASE (0266); StringF(str,'vrefp\tv\d,v\d',d,b) CASE (0268); StringF(str,'vmrglb\tv\d,v\d,v\d',d,a,b) CASE (0270); StringF(str,'vpkshus\tv\d,v\d,v\d',d,a,b) CASE (0322); StringF(str,'vmaxsh\tv\d,v\d,v\d',d,a,b) CASE (0324); StringF(str,'vslh\tv\d,v\d,v\d',d,a,b) CASE (0328); StringF(str,'vmulosh\tv\d,v\d,\d',d,a,b) CASE (0330); StringF(str,'vrsqrtefp\tv\d,v\d',d,b) CASE (0332); StringF(str,'vmrglh\tv\d,v\d,v\d',d,a,b) CASE (0334); StringF(str,'vpkswus\tv\d,v\d,v\d',d,a,b) CASE (0384); StringF(str,'vaddcuw\tv\d,v\d,v\d',d,a,b) CASE (0386); StringF(str,'vmaxsw\tv\d,v\d,v\d',d,a,b) CASE (0388); StringF(str,'vslw\tv\d,v\d,v\d',d,a,b) CASE (0394); StringF(str,'vexptefp\tv\d,v\d',d,b) CASE (0396); StringF(str,'vmrglw\tv\d,v\d,v\d',d,a,b) CASE (0398); StringF(str,'vpkshss\tv\d,v\d,v\d',d,a,b) CASE (0452); StringF(str,'vsl\tv\d,v\d,v\d',d,a,b) CASE (0454); StringF(str,'vcmpgefp\tv\d,v\d,v\d',d,a,b) CASE (0454|rc); StringF(str,'vcmpgefp.\tv\d,v\d,v\d',d,a,b) CASE (0458); StringF(str,'vlogefp\tv\d,v\d',d,b) CASE (0462); StringF(str,'vpkswss\tv\d,v\d,v\d',d,a,b) CASE (0512); StringF(str,'vaddubs\tv\d,v\d,v\d',d,a,b) CASE (0514); StringF(str,'vminub\tv\d,v\d,v\d',d,a,b) CASE (0516); StringF(str,'vsrb\tv\d,v\d,v\d',d,a,b) CASE (0518); StringF(str,'vcmpgtub\tv\d,v\d,v\d',d,a,b) CASE (0518|rc); StringF(str,'vcmpgtub.\tv\d,v\d,v\d',d,a,b) CASE (0520); StringF(str,'vmuleub\tv\d,v\d,\d',d,a,b) CASE (0522); StringF(str,'vrfin\tv\d,v\d',d,b) CASE (0524); StringF(str,'vspltb\tv\d,v\d,\d',d,b,a) CASE (0526); StringF(str,'vupkhsb\tv\d,v\d',d,b) CASE (0576); StringF(str,'vadduhs\tv\d,v\d,v\d',d,a,b) CASE (0578); StringF(str,'vminuh\tv\d,v\d,v\d',d,a,b) CASE (0580); StringF(str,'vsrh\tv\d,v\d,v\d',d,a,b) CASE (0582); StringF(str,'vcmpgtuh\tv\d,v\d,v\d',d,a,b) CASE (0582|rc); StringF(str,'vcmpgtuh.\tv\d,v\d,v\d',d,a,b) CASE (0584); StringF(str,'vmuleuh\tv\d,v\d,\d',d,a,b) CASE (0586); StringF(str,'vrfiz\tv\d,v\d',d,b) CASE (0588); StringF(str,'vsplth\tv\d,v\d,\d',d,b,a) CASE (0590); StringF(str,'vupkhsh\tv\d,v\d',d,b) CASE (0640); StringF(str,'vadduws\tv\d,v\d,v\d',d,a,b) CASE (0642); StringF(str,'vminuw\tv\d,v\d,v\d',d,a,b) CASE (0644); StringF(str,'vsrw\tv\d,v\d,v\d',d,a,b) CASE (0646); StringF(str,'vcmpgtuw\tv\d,v\d,v\d',d,a,b) CASE (0646|rc); StringF(str,'vcmpgtuw.\tv\d,v\d,v\d',d,a,b) CASE (0650); StringF(str,'vrfip\tv\d,v\d',d,b) CASE (0652); StringF(str,'vspltw\tv\d,v\d,\d',d,b,a) CASE (0654); StringF(str,'vupklsb\tv\d,v\d',d,b) CASE (0708); StringF(str,'vsr\tv\d,v\d,v\d',d,a,b) CASE (0710); StringF(str,'vcmpgtfp\tv\d,v\d,v\d',d,a,b) CASE (0710|rc); StringF(str,'vcmpgtfp.\tv\d,v\d,v\d',d,a,b) CASE (0714); StringF(str,'vrfim\tv\d,v\d',d,b) CASE (0718); StringF(str,'vupklsh\tv\d,v\d',d,b) CASE (0768); StringF(str,'vaddsbs\tv\d,v\d,v\d',d,a,b) CASE (0770); StringF(str,'vminsb\tv\d,v\d,v\d',d,a,b) CASE (0772); StringF(str,'vsrab\tv\d,v\d,v\d',d,a,b) CASE (0774); StringF(str,'vcmpgtsb\tv\d,v\d,v\d',d,a,b) CASE (0774|rc); StringF(str,'vcmpgtsb.\tv\d,v\d,v\d',d,a,b) CASE (0776); StringF(str,'vmulesb\tv\d,v\d,\d',d,a,b) CASE (0778); StringF(str,'vcfux\tv\d,v\d,\d',d,b,a) CASE (0780); StringF(str,'vspltisb\tv\d,\d',d,a) CASE (0782); StringF(str,'vpkpx\tv\d,v\d,v\d',d,a,b) CASE (0832); StringF(str,'vaddshs\tv\d,v\d,v\d',d,a,b) CASE (0834); StringF(str,'vminsh\tv\d,v\d,v\d',d,a,b) CASE (0836); StringF(str,'vsrah\tv\d,v\d,v\d',d,a,b) CASE (0838); StringF(str,'vcmpgtsh\tv\d,v\d,v\d',d,a,b) CASE (0838|rc); StringF(str,'vcmpgtsh.\tv\d,v\d,v\d',d,a,b) CASE (0840); StringF(str,'vmulesh\tv\d,v\d,\d',d,a,b) CASE (0842); StringF(str,'vcfsx\tv\d,v\d,\d',d,b,a) CASE (0844); StringF(str,'vspltish\tv\d,\d',d,a) CASE (0846); StringF(str,'vupkhpx\tv\d,v\d',d,b) CASE (0896); StringF(str,'vaddsws\tv\d,v\d,v\d',d,a,b) CASE (0898); StringF(str,'vminsw\tv\d,v\d,v\d',d,a,b) CASE (0099); StringF(str,'vsraw\tv\d,v\d,v\d',d,a,b) CASE (0902); StringF(str,'vcmpgtsw\tv\d,v\d,v\d',d,a,b) CASE (0902|rc); StringF(str,'vcmpgtsw.\tv\d,v\d,v\d',d,a,b) CASE (0906); StringF(str,'vctuxs\tv\d,v\d,\d',d,b,a) CASE (0908); StringF(str,'vspltisw\tv\d,\d',d,a) CASE (0966); StringF(str,'vcmpbfp\tv\d,v\d,v\d',d,a,b) CASE (0966|rc); StringF(str,'vcmpbfp.\tv\d,v\d,v\d',d,a,b) CASE (0970); StringF(str,'vctsxs\tv\d,v\d,\d',d,b,a) CASE (0974); StringF(str,'vupklpx\tv\d,v\d',d,b) CASE (1024); StringF(str,'vsububm\tv\d,v\d,v\d',d,a,b) CASE (1026); StringF(str,'vavgub\tv\d,v\d,v\d',d,a,b) CASE (1028); StringF(str,'vand\tv\d,v\d,v\d',d,a,b) CASE (1034); StringF(str,'vmaxfp\tv\d,v\d,v\d',d,a,b) CASE (1036); StringF(str,'vslo\tv\d,v\d,v\d',d,a,b) CASE (1088); StringF(str,'vsubuhm\tv\d,v\d,v\d',d,a,b) CASE (1090); StringF(str,'vavguh\tv\d,v\d,v\d',d,a,b) CASE (1092); StringF(str,'vandc\tv\d,v\d,v\d',d,a,b) CASE (1098); StringF(str,'vminfp\tv\d,v\d,v\d',d,a,b) CASE (1100); StringF(str,'vsro\tv\d,v\d,v\d',d,a,b) CASE (1152); StringF(str,'vsubuwm\tv\d,v\d,v\d',d,a,b) CASE (1154); StringF(str,'vavguw\tv\d,v\d,v\d',d,a,b) CASE (1156); StringF(str,'vor\tv\d,v\d,v\d',d,a,b) CASE (1220); StringF(str,'vxor\tv\d,v\d,v\d',d,a,b) CASE (1282); StringF(str,'vavgsb\tv\d,v\d,v\d',d,a,b) CASE (1284); StringF(str,'vnor\tv\d,v\d,v\d',d,a,b) CASE (1346); StringF(str,'vavgsh\tv\d,v\d,v\d',d,a,b) CASE (1408); StringF(str,'vsubcuw\tv\d,v\d,v\d',d,a,b) CASE (1410); StringF(str,'vavgsw\tv\d,v\d,v\d',d,a,b) CASE (1536); StringF(str,'vsububs\tv\d,v\d,v\d',d,a,b) CASE (1540); StringF(str,'mfvscr\tv\d',d) CASE (1544); StringF(str,'vsum4ubs\tv\d,v\d,v\d',d,a,b) CASE (1600); StringF(str,'vsubuhs\tv\d,v\d,v\d',d,a,b) CASE (1604); StringF(str,'mtvscr\tv\d',b) CASE (1608); StringF(str,'vsum4shs\tv\d,v\d,v\d',d,a,b) CASE (1664); StringF(str,'vsubuws\tv\d,v\d,v\d',d,a,b) CASE (1672); StringF(str,'vsum2sws\tv\d,v\d,v\d',d,a,b) CASE (1792); StringF(str,'vsubshs\tv\d,v\d,v\d',d,a,b) CASE (1800); StringF(str,'vsum4sbs\tv\d,v\d,v\d',d,a,b) CASE (1920); StringF(str,'vsubsws\tv\d,v\d,v\d',d,a,b) CASE (1928); StringF(str,'vsumsws\tv\d,v\d,v\d',d,a,b) DEFAULT; StringF(str,'.ulong\t$\z\h[8]',inst) ENDSELECT CASE 07; StringF(str,'mulli\tr\d,r\d,\d',d,a,si) CASE 08; StringF(str,'subfic\tr\d,r\d,\d',d,a,si) CASE 10; StringF(str,'cmpli\tcr\d,r\d,$\h',d>>2,d&1,a,ui) CASE 11; StringF(str,'cmpi\tcr\d,r\d,\d',d>>2,d&1,a,si) CASE 12; StringF(str,'addic\tr\d,r\d,\d',d,a,si) CASE 13; StringF(str,'addic.\tr\d,r\d,\d',d,a,si) CASE 14 IF a=0 StringF(str,'li\tr\d,\d',d,si) ELSE StringF(str,'addi\tr\d,r\d,\d',d,a,si) ENDIF CASE 15 IF a=0 StringF(str,'lis\tr\d,\d',d,si) ELSE StringF(str,'addis\tr\d,r\d,\d',d,a,si) ENDIF CASE 16 IF d=12 AND a=0; StringF(str,'blt\s\s\tl\d',IF si&%01 THEN 'l' ELSE NIL,IF si&%10 THEN 'a' ELSE NIL,lab); lab++ ELSEIF d=4 AND a=1; StringF(str,'ble\s\s\tl\d',IF si&%01 THEN 'l' ELSE NIL,IF si&%10 THEN 'a' ELSE NIL,lab); lab++ ELSEIF d=12 AND a=2; StringF(str,'beq\s\s\tl\d',IF si&%01 THEN 'l' ELSE NIL,IF si&%10 THEN 'a' ELSE NIL,lab); lab++ ELSEIF d=4 AND a=0; StringF(str,'bge\s\s\tl\d',IF si&%01 THEN 'l' ELSE NIL,IF si&%10 THEN 'a' ELSE NIL,lab); lab++ ELSEIF d=12 AND a=1; StringF(str,'bgt\s\s\tl\d',IF si&%01 THEN 'l' ELSE NIL,IF si&%10 THEN 'a' ELSE NIL,lab); lab++ ELSEIF d=4 AND a=2; StringF(str,'bne\s\s\tl\d',IF si&%01 THEN 'l' ELSE NIL,IF si&%10 THEN 'a' ELSE NIL,lab); lab++ ELSEIF d=12 AND a=3; StringF(str,'bso\s\s\tl\d',IF si&%01 THEN 'l' ELSE NIL,IF si&%10 THEN 'a' ELSE NIL,lab); lab++ ELSEIF d=4 AND a=3; StringF(str,'bns\s\s\tl\d',IF si&%01 THEN 'l' ELSE NIL,IF si&%10 THEN 'a' ELSE NIL,lab); lab++ ELSE; StringF(str,'bc\s\s\t\d,\d,l\d',IF si&%01 THEN 'l' ELSE NIL,IF si&%10 THEN 'a' ELSE NIL,d,a,lab); lab++ CASE 17 extop&=%01111111110 SELECT extop CASE (1<<1); StringF(str,'sc',NIL) DEFAULT; StringF(str,'.ulong\t$\z\h[8]',inst) ENDSELECT CASE 18; StringF(str,'b\s\s\tl\d',IF si&%01 THEN 'l' ELSE NIL,IF si&%10 THEN 'a' ELSE NIL,lab); lab++ CASE 19 extop&=%11111111110 SELECT extop CASE (0000<<1); StringF(str,'mcrf\tcr\d,cr\d',d>>2,a>>2) CASE (0016<<1); IF d=20 AND a=0; StringF(str,'blr\s',IF inst&1 THEN 'l' ELSE NIL) ELSE StringF(str,'bclr\s\t\d,\d',IF inst&1 THEN 'l' ELSE NIL,d,a) CASE (0033<<1); StringF(str,IF a=b THEN 'crnot\tcrb\d,crb\d' ELSE 'crnor\tcrb\d,crb\d,crb\d',d,a,b) CASE (0050<<1); StringF(str,'rfi',NIL) CASE (0129<<1); StringF(str,'crandc\tcrb\d,crb\d,crb\d',d,a,b) CASE (0150<<1); StringF(str,'isync',NIL) CASE (0193<<1); StringF(str,IF d=a=b THEN 'crclr\tcrb\d' ELSE 'crxor\tcrb\d,crb\d,crb\d',d,a,b) CASE (0225<<1); StringF(str,'crnand\tcrb\d,crb\d,crb\d',d,a,b) CASE (0257<<1); StringF(str,'crand\tcrb\d,crb\d,crb\d',d,a,b) CASE (0289<<1); StringF(str,IF d=a=b THEN 'crset\tcrb\d' ELSE 'creqv\tcrb\d,crb\d,crb\d',d,a,b) CASE (0417<<1); StringF(str,'crorc\tcrb\d,crb\d,crb\d',d,a,b) CASE (0449<<1); StringF(str,IF a=b THEN 'crmove\tcrb\d,crb\d' ELSE 'cror\tcrb\d,crb\d,crb\d',d,a,b) CASE (0528<<1); IF d=20 AND a=0; StringF(str,'bctr\s',IF inst&1 THEN 'l' ELSE NIL) ELSE StringF(str,'bcctr\s\t\d,\d',IF inst&1 THEN 'l' ELSE NIL,d,a) DEFAULT; StringF(str,'.ulong\t$\z\h[8]',inst) ENDSELECT CASE 20; StringF(str,'rlwimi\s\tr\d,r\d,\d,\d,\d',rc,a,d,b,c,extop>>1&$1f) CASE 21; StringF(str,'rlwinm\s\tr\d,r\d,\d,\d,\d',rc,a,d,b,c,extop>>1&$1f) CASE 23; StringF(str,'rlwnm\s\tr\d,r\d,r\d,\d,\d',rc,a,d,b,c,extop>>1&$1f) CASE 24; StringF(str,'ori\tr\d,r\d,$\h',a,d,ui) CASE 25; StringF(str,'oris\tr\d,r\d,$\h',a,d,ui) CASE 26; StringF(str,'xori\tr\d,r\d,$\h',a,d,ui) CASE 27; StringF(str,'xoris\tr\d,r\d,$\h',a,d,ui) CASE 28; StringF(str,'andi.\tr\d,r\d,$\h',a,d,ui) CASE 29; StringF(str,'andis.\tr\d,r\d,$\h',a,d,ui) CASE 31 oe:=IF inst&%10000000000 THEN 'o' ELSE NIL rc:=IF inst&%00000000001 THEN '.' ELSE NIL extop&=%01111111110 SELECT extop CASE (0000<<1); StringF(str,'cmp\tcr\d,\d,r\d,r\d',d>>2,d&1,a,b) CASE (0004<<1); StringF(str,'tw\t\d,r\d,r\d',d,a,b) CASE (0006<<1); StringF(str,'lvsl\tv\d,r\d,r\d',d,a,b); flags|=F_Vect CASE (0007<<1); StringF(str,'lvebx\tv\d,r\d,r\d',d,a,b); flags|=F_Vect CASE (0008<<1); StringF(str,'subfc\s\s\tr\d,r\d,r\d',oe,rc,d,a,b) CASE (0010<<1); StringF(str,'addc\s\s\tr\d,r\d,r\d',oe,rc,d,a,b) CASE (0011<<1); StringF(str,'mulhwu\s\tr\d,r\d,r\d',rc,d,a,b) CASE (0019<<1); StringF(str,'mfcr\tr\d',d) CASE (0020<<1); StringF(str,'lwarx\tr\d,r\d,r\d',d,a,b) CASE (0023<<1); StringF(str,'lwzx\tr\d,r\d,r\d',d,a,b) CASE (0024<<1); StringF(str,'slw\s\tr\d,r\d,r\d',rc,a,d,b) CASE (0026<<1); StringF(str,'cntlzw\s\tr\d,r\d',rc,a,d) CASE (0028<<1); StringF(str,'and\s\tr\d,r\d,r\d',rc,a,d,b) CASE (0030<<1); StringF(str,'andc\s\tr\d,r\d,r\d',rc,a,d,b) CASE (0032<<1); StringF(str,'cmpl\tcr\d,\d,r\d,r\d',d>>2,d&1,a,b) CASE (0038<<1); StringF(str,'lvsr\tv\d,r\d,r\d',d,a,b); flags|=F_Vect CASE (0039<<1); StringF(str,'lvehx\tv\d,r\d,r\d',d,a,b); flags|=F_Vect CASE (0040<<1); StringF(str,'subf\s\s\tr\d,r\d,r\d',oe,rc,d,a,b) CASE (0054<<1); StringF(str,'dcbst\tr\d,r\d',a,b) CASE (0055<<1); StringF(str,'lwzux\tr\d,r\d,r\d',d,a,b) CASE (0071<<1); StringF(str,'lvewx\tv\d,r\d,r\d',d,a,b); flags|=F_Vect CASE (0075<<1); StringF(str,'mulhw\s\tr\d,r\d,r\d',rc,d,a,b) CASE (0083<<1); StringF(str,'mfmsr\tr\d',d) CASE (0086<<1); StringF(str,'dcbf\tr\d,r\d',a,b) CASE (0087<<1); StringF(str,'lbzx\tr\d,r\d,r\d',d,a,b) CASE (0103<<1); StringF(str,'lvx\tv\d,r\d,r\d',d,a,b); flags|=F_Vect CASE (0104<<1); StringF(str,'neg\s\s\tr\d,r\d,r\d',oe,rc,d,a) CASE (0119<<1); StringF(str,'lbzux\tr\d,r\d,r\d',d,a,b) CASE (0124<<1); StringF(str,IF d=b THEN 'not\s\tr\d,r\d' ELSE 'nor\s\tr\d,r\d,r\d',rc,a,d,b) CASE (0135<<1); StringF(str,'stvebx\tv\d,r\d,r\d',d,a,b); flags|=F_Vect CASE (0136<<1); StringF(str,'subfe\s\s\tr\d,r\d,r\d',oe,rc,d,a,b) CASE (0138<<1); StringF(str,'adde\s\s\tr\d,r\d,r\d',oe,rc,d,a,b) CASE (0144<<1); IF (a<<4|b>>1)=$ff THEN StringF(str,'mtcr\tr\d',d) ELSE StringF(str,'mtcrf\t\d,r\d',a<<4|b>>1,d) CASE (0146<<1); StringF(str,'mtmsr\tr\d',d) CASE (0150<<1); StringF(str,'stwcx.\tr\d,r\d,r\d',d,a,b) CASE (0151<<1); StringF(str,'stwx\tr\d,r\d,r\d',d,a,b) CASE (0167<<1); StringF(str,'stvehx\tv\d,r\d,r\d',d,a,b); flags|=F_Vect CASE (0183<<1); StringF(str,'stwux\tr\d,r\d,r\d',d,a,b) CASE (0199<<1); StringF(str,'stvewx\tv\d,r\d,r\d',d,a,b); flags|=F_Vect CASE (0200<<1); StringF(str,'subfze\s\s\tr\d,r\d',oe,rc,d,a) CASE (0202<<1); StringF(str,'addze\s\s\tr\d,r\d',oe,rc,d,a) CASE (0210<<1); StringF(str,'mtsr\t\d,r\d',a,d) CASE (0215<<1); StringF(str,'stbx\tr\d,r\d,r\d',d,a,b) CASE (0231<<1); StringF(str,'stvx\tv\d,r\d,r\d',d,a,b); flags|=F_Vect CASE (0232<<1); StringF(str,'subfme\s\s\tr\d,r\d',oe,rc,d,a) CASE (0234<<1); StringF(str,'addme\s\s\tr\d,r\d',oe,rc,d,a) CASE (0235<<1); StringF(str,'mullw\s\s\tr\d,r\d,r\d',oe,rc,d,a,b) CASE (0242<<1); StringF(str,'mtsrin\tr\d,r\d',d,b) CASE (0246<<1); StringF(str,'dcbtst\tr\d,r\d',a,b) CASE (0247<<1); StringF(str,'stbux\tr\d,r\d,r\d',d,a,b) CASE (0266<<1); StringF(str,'add\s\s\tr\d,r\d,r\d',oe,rc,d,a,b) CASE (0278<<1); StringF(str,'dcbt\tr\d,r\d',a,b) CASE (0279<<1); StringF(str,'lhzx\tr\d,r\d,r\d',d,a,b) CASE (0284<<1); StringF(str,'eqv\s\tr\d,r\d,r\d',rc,a,d,b) CASE (0306<<1); StringF(str,'tlbie\tr\d',b) CASE (0310<<1); StringF(str,'eciwx\tr\d,r\d,r\d',d,a,b) CASE (0311<<1); StringF(str,'lhzux\tr\d,r\d,r\d',d,a,b) CASE (0316<<1); StringF(str,'xor\s\tr\d,r\d,r\d',rc,a,d,b) CASE (0339<<1) SELECT b<<5|a CASE 1; StringF(str,'mfxer\tr\d',d) CASE 8; StringF(str,'mflr\tr\d',d) CASE 9; StringF(str,'mfctr\tr\d',d) CASE 18; StringF(str,'mfdsisr\tr\d',d) CASE 19; StringF(str,'mfdar\tr\d',d) CASE 22; StringF(str,'mfdec\tr\d',d) CASE 25; StringF(str,'mfsdr1\tr\d',d) CASE 26; StringF(str,'mfsrr0\tr\d',d) CASE 27; StringF(str,'mfsrr1\tr\d',d) CASE 256;StringF(str,'mfspr\tr\d,VRSAVE',d) CASE 272 TO 279; StringF(str,'mfprg\tr\d,\d',d,b<<5|a-272) CASE 280;StringF(str,'mfasr\tr\d',d) CASE 282;StringF(str,'mfear\tr\d',d) CASE 287;StringF(str,'mfspr\tr\d,PVR',d) CASE 528;StringF(str,'mfspr\tr\d,IBAT0U',d) CASE 529;StringF(str,'mfspr\tr\d,IBAT0L',d) CASE 530;StringF(str,'mfspr\tr\d,IBAT1U',d) CASE 531;StringF(str,'mfspr\tr\d,IBAT1L',d) CASE 532;StringF(str,'mfspr\tr\d,IBAT2U',d) CASE 533;StringF(str,'mfspr\tr\d,IBAT2L',d) CASE 534;StringF(str,'mfspr\tr\d,IBAT3U',d) CASE 535;StringF(str,'mfspr\tr\d,IBAT3L',d) CASE 536;StringF(str,'mfspr\tr\d,DBAT0U',d) CASE 537;StringF(str,'mfspr\tr\d,DBAT0L',d) CASE 538;StringF(str,'mfspr\tr\d,DBAT1U',d) CASE 539;StringF(str,'mfspr\tr\d,DBAT1L',d) CASE 540;StringF(str,'mfspr\tr\d,DBAT2U',d) CASE 541;StringF(str,'mfspr\tr\d,DBAT2L',d) CASE 542;StringF(str,'mfspr\tr\d,DBAT3U',d) CASE 543;StringF(str,'mfspr\tr\d,DBAT3L',d) CASE 560;StringF(str,'mfspr\tr\d,IBAT4U',d) CASE 561;StringF(str,'mfspr\tr\d,IBAT4L',d) CASE 562;StringF(str,'mfspr\tr\d,IBAT5U',d) CASE 563;StringF(str,'mfspr\tr\d,IBAT5L',d) CASE 564;StringF(str,'mfspr\tr\d,IBAT6U',d) CASE 565;StringF(str,'mfspr\tr\d,IBAT6L',d) CASE 566;StringF(str,'mfspr\tr\d,IBAT7U',d) CASE 567;StringF(str,'mfspr\tr\d,IBAT7L',d) CASE 568;StringF(str,'mfspr\tr\d,DBAT4U',d) CASE 569;StringF(str,'mfspr\tr\d,DBAT4L',d) CASE 570;StringF(str,'mfspr\tr\d,DBAT5U',d) CASE 571;StringF(str,'mfspr\tr\d,DBAT5L',d) CASE 572;StringF(str,'mfspr\tr\d,DBAT6U',d) CASE 573;StringF(str,'mfspr\tr\d,DBAT6L',d) CASE 574;StringF(str,'mfspr\tr\d,DBAT7U',d) CASE 575;StringF(str,'mfspr\tr\d,DBAT7L',d) CASE 928;StringF(str,'mfspr\tr\d,UMMCR2',d) CASE 929;StringF(str,'mfspr\tr\d,UPMC5',d) CASE 930;StringF(str,'mfspr\tr\d,UPMC6',d) CASE 936;StringF(str,'mfspr\tr\d,UMMCR0',d) CASE 937;StringF(str,'mfspr\tr\d,UPMC1',d) CASE 938;StringF(str,'mfspr\tr\d,UPMC2',d) CASE 939;StringF(str,'mfspr\tr\d,USIAR',d) CASE 940;StringF(str,'mfspr\tr\d,UMMCR1',d) CASE 941;StringF(str,'mfspr\tr\d,UPMC3',d) CASE 942;StringF(str,'mfspr\tr\d,UPMC4',d) CASE 951;StringF(str,'mfspr\tr\d,BAMR',d) CASE 1008;StringF(str,'mfspr\tr\d,HID0',d) CASE 1009;StringF(str,'mfspr\tr\d,HID1',d) CASE 1010;StringF(str,'mfspr\tr\d,IABR',d) CASE 1013;StringF(str,'mfspr\tr\d,DABR',d) CASE 268;StringF(str,'mftbl\tr\d',d) CASE 269;StringF(str,'mftbu\tr\d',d) DEFAULT; StringF(str,'mfspr\tr\d,\d',d,b<<5|a) ENDSELECT CASE (0342<<1); StringF(str,'dst\s\tr\d,r\d,\d',IF (d&$10)=$10 THEN 't' ELSE NIL,a,b,d&%11); flags|=F_Vect CASE (0343<<1); StringF(str,'lhax\tr\d,r\d,r\d',d,a,b) CASE (0359<<1); StringF(str,'lvxl\tv\d,r\d,r\d',d,a,b); flags|=F_Vect CASE (0370<<1); StringF(str,'tlbia',NIL) CASE (0371<<1); StringF(str,'mftb\tr\d,\d',d,a<<5|b) CASE (0374<<1); StringF(str,'dstst\s\tr\d,r\d,\d',IF (d&$10)=$10 THEN 't' ELSE NIL,a,b,d&%11); flags|=F_Vect CASE (0375<<1); StringF(str,'lhaux\tr\d,r\d,r\d',d,a,b) CASE (0407<<1); StringF(str,'sthx\tr\d,r\d,r\d',d,a,b) CASE (0412<<1); StringF(str,'orc\s\tr\d,r\d,r\d',rc,a,d,b) CASE (0438<<1); StringF(str,'ecowx\tr\d,r\d,r\d',d,a,b) CASE (0439<<1); StringF(str,'sthux\tr\d,r\d,r\d',d,a,b) CASE (0444<<1); IF d=a=b=0 THEN StringF(str,'nop') IF d=a=b THEN StringF(str,'tstw\tr\d',d) ELSE StringF(str,IF d=b THEN 'mr\s\tr\d,r\d' ELSE 'or\s\tr\d,r\d,r\d',rc,a,d,b) CASE (0459<<1); StringF(str,'divwu\s\s\tr\d,r\d,r\d',oe,rc,d,a,b) CASE (0467<<1) SELECT b<<5|a CASE 1; StringF(str,'mtxer\tr\d',d) CASE 8; StringF(str,'mtlr\tr\d',d) CASE 9; StringF(str,'mtctr\tr\d',d) CASE 18; StringF(str,'mtdsisr\tr\d',d) CASE 19; StringF(str,'mtdar\tr\d',d) CASE 22; StringF(str,'mtdec\tr\d',d) CASE 25; StringF(str,'mtsdr1\tr\d',d) CASE 26; StringF(str,'mtsrr0\tr\d',d) CASE 27; StringF(str,'mtsrr1\tr\d',d) CASE 256;StringF(str,'mtspr\tr\d,VRSAVE',d) CASE 272 TO 279; StringF(str,'mtprg\tr\d,\d',d,b<<5|a-272) CASE 280;StringF(str,'mtasr\tr\d',d) CASE 282;StringF(str,'mtear\tr\d',d) CASE 287;StringF(str,'mtspr\tr\d,PVR',d) CASE 528;StringF(str,'mtspr\tr\d,IBAT0U',d) CASE 529;StringF(str,'mtspr\tr\d,IBAT0L',d) CASE 530;StringF(str,'mtspr\tr\d,IBAT1U',d) CASE 531;StringF(str,'mtspr\tr\d,IBAT1L',d) CASE 532;StringF(str,'mtspr\tr\d,IBAT2U',d) CASE 533;StringF(str,'mtspr\tr\d,IBAT2L',d) CASE 534;StringF(str,'mtspr\tr\d,IBAT3U',d) CASE 535;StringF(str,'mtspr\tr\d,IBAT3L',d) CASE 536;StringF(str,'mtspr\tr\d,DBAT0U',d) CASE 537;StringF(str,'mtspr\tr\d,DBAT0L',d) CASE 538;StringF(str,'mtspr\tr\d,DBAT1U',d) CASE 539;StringF(str,'mtspr\tr\d,DBAT1L',d) CASE 540;StringF(str,'mtspr\tr\d,DBAT2U',d) CASE 541;StringF(str,'mtspr\tr\d,DBAT2L',d) CASE 542;StringF(str,'mtspr\tr\d,DBAT3U',d) CASE 543;StringF(str,'mtspr\tr\d,DBAT3L',d) CASE 560;StringF(str,'mtspr\tr\d,IBAT4U',d) CASE 561;StringF(str,'mtspr\tr\d,IBAT4L',d) CASE 562;StringF(str,'mtspr\tr\d,IBAT5U',d) CASE 563;StringF(str,'mtspr\tr\d,IBAT5L',d) CASE 564;StringF(str,'mtspr\tr\d,IBAT6U',d) CASE 565;StringF(str,'mtspr\tr\d,IBAT6L',d) CASE 566;StringF(str,'mtspr\tr\d,IBAT7U',d) CASE 567;StringF(str,'mtspr\tr\d,IBAT7L',d) CASE 568;StringF(str,'mtspr\tr\d,DBAT4U',d) CASE 569;StringF(str,'mtspr\tr\d,DBAT4L',d) CASE 570;StringF(str,'mtspr\tr\d,DBAT5U',d) CASE 571;StringF(str,'mtspr\tr\d,DBAT5L',d) CASE 572;StringF(str,'mtspr\tr\d,DBAT6U',d) CASE 573;StringF(str,'mtspr\tr\d,DBAT6L',d) CASE 574;StringF(str,'mtspr\tr\d,DBAT7U',d) CASE 575;StringF(str,'mtspr\tr\d,DBAT7L',d) CASE 928;StringF(str,'mtspr\tr\d,UMMCR2',d) CASE 929;StringF(str,'mtspr\tr\d,UPMC5',d) CASE 930;StringF(str,'mtspr\tr\d,UPMC6',d) CASE 936;StringF(str,'mtspr\tr\d,UMMCR0',d) CASE 937;StringF(str,'mtspr\tr\d,UPMC1',d) CASE 938;StringF(str,'mtspr\tr\d,UPMC2',d) CASE 939;StringF(str,'mtspr\tr\d,USIAR',d) CASE 940;StringF(str,'mtspr\tr\d,UMMCR1',d) CASE 941;StringF(str,'mtspr\tr\d,UPMC3',d) CASE 942;StringF(str,'mtspr\tr\d,UPMC4',d) CASE 951;StringF(str,'mtspr\tr\d,BAMR',d) CASE 1008;StringF(str,'mtspr\tr\d,HID0',d) CASE 1009;StringF(str,'mtspr\tr\d,HID1',d) CASE 1010;StringF(str,'mtspr\tr\d,IABR',d) CASE 1013;StringF(str,'mtspr\tr\d,DABR',d) CASE 284;StringF(str,'mttbl\tr\d',d) CASE 285;StringF(str,'mttbu\tr\d',d) DEFAULT; StringF(str,'mtspr\t\d,r\d',b<<5|a,d) ENDSELECT CASE (0470<<1); StringF(str,'dcbi\tr\d,r\d',a,b) CASE (0476<<1); StringF(str,'nand\s\tr\d,r\d,r\d',rc,a,d,b) CASE (0487<<1); StringF(str,'stvxl\tv\d,r\d,r\d',d,a,b); flags|=F_Vect CASE (0491<<1); StringF(str,'divw\s\s\tr\d,r\d,r\d',oe,rc,d,a,b) CASE (0512<<1); StringF(str,'mcrxr\tcr\d',d>>2) CASE (0533<<1); StringF(str,'lswx\tr\d,r\d,r\d',d,a,b) CASE (0534<<1); StringF(str,'lwbrx\tr\d,r\d,r\d',d,a,b) CASE (0535<<1); StringF(str,'lfsx\tf\d,r\d,r\d',d,a,b) CASE (0536<<1); StringF(str,'srw\s\tr\d,r\d,r\d',rc,a,d,b) CASE (0566<<1); StringF(str,'tlbsync',NIL) CASE (0567<<1); StringF(str,'lfsux\tf\d,r\d,r\d',d,a,b) CASE (0595<<1); StringF(str,'mfsr\tr\d,\d',d,a) CASE (0597<<1); StringF(str,'lswi\tr\d,r\d,\d',d,a,b) CASE (0598<<1); StringF(str,'sync',NIL) CASE (0599<<1); StringF(str,'lfdx\tf\d,r\d,r\d',d,a,b) CASE (0631<<1); StringF(str,'lfdux\tf\d,r\d,r\d',d,a,b) CASE (0659<<1); StringF(str,'mfsrin\tr\d,r\d',d,b) CASE (0661<<1); StringF(str,'stswx\tr\d,r\d,r\d',d,a,b) CASE (0662<<1); StringF(str,'stwbrx\tr\d,r\d,r\d',d,a,b) CASE (0663<<1); StringF(str,'stfsx\tf\d,r\d,r\d',d,a,b) CASE (0695<<1); StringF(str,'stfsux\tf\d,r\d,r\d',d,a,b) CASE (0725<<1); StringF(str,'stswi\tr\d,r\d,\d',d,a,b) CASE (0727<<1); StringF(str,'stfdx\tf\d,r\d,r\d',d,a,b) CASE (0758<<1); StringF(str,'dcba\tr\d,r\d',a,b) CASE (0759<<1); StringF(str,'stfdux\tf\d,r\d,r\d',d,a,b) CASE (0790<<1); StringF(str,'lhbrx\tr\d,r\d,r\d',d,a,b) CASE (0792<<1); StringF(str,'sraw\s\tr\d,r\d,r\d',rc,a,d,b) CASE (0822<<1); StringF(str,'dss\s\t\d',IF (d&$10)=$10 THEN 'all' ELSE NIL,d&%11); flags|=F_Vect CASE (0824<<1); StringF(str,'srawi\s\tr\d,r\d,\d',rc,a,d,b) CASE (0854<<1); StringF(str,'eieio',NIL) CASE (0918<<1); StringF(str,'sthbrx\tr\d,r\d,r\d',d,a,b) CASE (0922<<1); StringF(str,'extsh\s\tr\d,r\d',rc,a,d) CASE (0954<<1); StringF(str,'extsb\s\tr\d,r\d',rc,a,d) CASE (0982<<1); StringF(str,'icbi\tr\d,r\d',a,b) CASE (0983<<1); StringF(str,'stfiwx\tf\d,r\d,r\d',d,a,b) CASE (1014<<1); StringF(str,'dcbz\tr\d,r\d',a,b) DEFAULT; StringF(str,'.ulong\t$\z\h[8]',inst) ENDSELECT CASE 32; StringF(str,'lwz\tr\d,\d(r\d)',d,si,a) CASE 33; StringF(str,'lwzu\tr\d,\d(r\d)',d,si,a) CASE 34; StringF(str,'lbz\tr\d,\d(r\d)',d,si,a) CASE 35; StringF(str,'lbzu\tr\d,\d(r\d)',d,si,a) CASE 36; StringF(str,'stw\tr\d,\d(r\d)',d,si,a) CASE 37; StringF(str,'stwu\tr\d,\d(r\d)',d,si,a) CASE 38; StringF(str,'stb\tr\d,\d(r\d)',d,si,a) CASE 39; StringF(str,'stbu\tr\d,\d(r\d)',d,si,a) CASE 40; StringF(str,'lhz\tr\d,\d(r\d)',d,si,a) CASE 41; StringF(str,'lhzu\tr\d,\d(r\d)',d,si,a) CASE 42; StringF(str,'lha\tr\d,\d(r\d)',d,si,a) CASE 43; StringF(str,'lhau\tr\d,\d(r\d)',d,si,a) CASE 44; StringF(str,'sth\tr\d,\d(r\d)',d,si,a) CASE 45; StringF(str,'sthu\tr\d,\d(r\d)',d,si,a) CASE 46; StringF(str,'lmw\tr\d,\d(r\d)',d,si,a) CASE 47; StringF(str,'stmw\tr\d,\d(r\d)',d,si,a) CASE 48; StringF(str,'lfs\tf\d,\d(r\d)',d,si,a) CASE 49; StringF(str,'lfsu\tf\d,\d(r\d)',d,si,a) CASE 50; StringF(str,'lfd\tf\d,\d(r\d)',d,si,a) CASE 51; StringF(str,'lfdu\tf\d,\d(r\d)',d,si,a) CASE 52; StringF(str,'stfs\tf\d,\d(r\d)',d,si,a) CASE 53; StringF(str,'stfsu\tf\d,\d(r\d)',d,si,a) CASE 54; StringF(str,'stfd\tf\d,\d(r\d)',d,si,a) CASE 55; StringF(str,'stfdu\tf\d,\d(r\d)',d,si,a) CASE 63,59 DEF small rc:=IF inst&%00000000001 THEN '.' ELSE NIL sg:=IF opcode=59 THEN 's' ELSE NIL extop&=%01111111110 small:=extop&$3e IF small=29<<1||small=28<<1||small=25<<1||small=23<<1||small=22<<1 THEN extop&=$3e SELECT extop CASE (0000<<1); StringF(str,'fcmpu\tcr\d,f\d,f\d',d>>2,a,b) CASE (0012<<1); StringF(str,'frsp\s\tf\d,f\d',rc,d,b) CASE (0014<<1); StringF(str,'fctiw\s\tf\d,f\d',rc,d,b) CASE (0015<<1); StringF(str,'fctiwz\s\tf\d,f\d',rc,d,b) CASE (0018<<1); StringF(str,'fdiv\s\s\tf\d,f\d,f\d',sg,rc,d,a,b) CASE (0020<<1); StringF(str,'fsub\s\s\tf\d,f\d,f\d',sg,rc,d,a,b) CASE (0021<<1); StringF(str,'fadd\s\s\tf\d,f\d,f\d',sg,rc,d,a,b) CASE (0022<<1); StringF(str,'fsqrt\s\s\tf\d,f\d',sg,rc,d,b) CASE (0023<<1); StringF(str,'fsel\s\tf\d,f\d,f\d,f\d',rc,d,a,c,b) CASE (0024<<1); StringF(str,'fres\s\tf\d,f\d',rc,d,b) CASE (0025<<1); StringF(str,'fmul\s\s\tf\d,f\d,f\d',sg,rc,d,a,c) CASE (0026<<1); StringF(str,'frsqrte\s\tf\d,f\d',rc,d,b) CASE (0028<<1); StringF(str,'fmsub\s\s\tf\d,f\d,f\d,f\d',sg,rc,d,a,c,b) CASE (0029<<1); StringF(str,'fmadd\s\s\tf\d,f\d,f\d,f\d',sg,rc,d,a,c,b) CASE (0030<<1); StringF(str,'fnmsub\s\s\tf\d,f\d,f\d,f\d',sg,rc,d,a,c,b) CASE (0031<<1); StringF(str,'fnmadd\s\s\tf\d,f\d,f\d,f\d',sg,rc,d,a,c,b) CASE (0032<<1); StringF(str,'fcmpo\tcr\d,f\d,f\d',d>>2,a,b) CASE (0038<<1); StringF(str,'mtfsb1\s\tcrb\d',rc,d) CASE (0040<<1); StringF(str,'fneg\s\tf\d,f\d',rc,d,b) CASE (0064<<1); StringF(str,'mcrfs\tcr\d,cr\d',d>>2,a>>2) CASE (0070<<1); StringF(str,'mtfsb0\s\tcrb\d',rc,d) CASE (0072<<1); StringF(str,'fmr\s\tf\d,f\d',rc,d,b) CASE (0134<<1); StringF(str,'mtfsfi\s\tcr\d,\d',rc,d>>2,b>1) CASE (0136<<1); StringF(str,'fnabs\s\tf\d,f\d',rc,d,b) CASE (0264<<1); StringF(str,'fabs\s\tf\d,f\d',rc,d,b) CASE (0583<<1); StringF(str,'mffs\s\tf\d',rc,d) CASE (0711<<1); StringF(str,'mtfsf\s\tf\d',rc,d<<4|a>>1,b) DEFAULT; StringF(str,'.ulong\t$\z\h[8]',inst) ENDSELECT DEFAULT; StringF(str,'.ulong\t$\z\h[8]',inst) ENDSELECT // PrintF('$\h[4]\t\s\n',pos,str) WHILE pos=labellist.pos IF labellist THEN VFPrintF(o,'l\d:\n',[labellist.lab]) labellist:=.next IF CtrlC() THEN RETURN ENDWHILE IF istext(inst>>24)&&istext(inst>>16&$ff)&&istext(inst>>8&$ff)&&istext(inst&$ff) IF globalflags&GF_Offsets VFPrintF(o,'$\z\h[8]\t\s\t\t''\s''\n',[pos+offset,str,[inst,0]]) ELSE VFPrintF(o,'\t\s\t\t''\s''\n',[str,[inst,0]]) ENDIF ELSE IF globalflags&GF_Offsets VFPrintF(o,'$\z\h[8]\t\s\t\t$\z\h[8]\n',[pos+offset,str,inst]) ELSE VFPrintF(o,'\t\s\t\t$\z\h[8]\n',[str,inst]) ENDIF ENDIF // PrintF('$\h[4]\t\s\n',pos,str) // PrintF('\d\n',pos) pos+=4 // PrintF('\d\n',pos) EXITIF CtrlC() DO PrintF('broken in writing pass on position \d of \d.\n',pos,len) ENDWHILE ENDPROC PROC istext(char)(L) IF char>=" " && char<=127 THEN RETURN TRUE ENDPROC FALSE PROC ReData(o,pos,src:PTR TO CHAR,len,offset) DEF in=FALSE,new_line=TRUE,on_line=0 WHILE pos127 FPrintF(o,'\s\d',IF on_line=0 THEN '' ELSE ',',src[pos]) on_line+=4 ELSE FPrintF(o,'\s"\c',IF on_line=0 THEN '' ELSE ',',src[pos]) on_line+=3 in:=TRUE ENDIF ELSE IF src[pos]=0 OR src[pos]=10 OR src[pos]=13 FPrintF(o,'",\d\n',src[pos]) new_line:=TRUE in:=FALSE ELSEIF src[pos]<" " OR src[pos]>127 FPrintF(o,'",\d',src[pos]) on_line+=4 in:=FALSE ELSE FPrintF(o,'\c',src[pos]) on_line+=1 ENDIF ENDIF IF on_line>32 IF in=TRUE THEN FPrintF(o,'"\n') ELSE FPrintF(o,'\n') in:=FALSE new_line:=TRUE ENDIF pos++ ENDWHILE ENDPROC MODULE 'exec/memory' ENUM SOURCE,DEST,OFFSETS,INSTCODE DEF globalflags=0 SET GF_Offsets, GF_InstCode PROC main() DEF ra,args=[0,0,0,0]:LONG,f,m:PTR TO CHAR,l,elf:PTR TO elf,n,shdr:PTR TO elf32_shdr,str_tab=NIL IF ra:=ReadArgs('SOURCE/A,DEST/A,OFFSETS/S,INSTCODE/S',args,NIL) IF args[OFFSETS] THEN globalflags|=GF_Offsets IF args[INSTCODE] THEN globalflags|=GF_InstCode IF (l:=FileLength(args[SOURCE]))>0 IF m:=AllocVec(l+16,MEMF_PUBLIC|MEMF_CLEAR) IF f:=Open(args[SOURCE],OLDFILE) Read(f,m,l) Close(f) PrintF('Source length: \d bytes\n',l) IF f:=Open(args[DEST],NEWFILE) IF pool:=CreatePool(MEMF_CLEAR|MEMF_PUBLIC,16384,2048) IF elf:=ScanELF(f,m,l) FOR n:=0 TO elf.phnum-1 ScanPHDR(f,elf+elf.phoff+elf.phentsize*n,elf) ENDFOR FOR n:=0 TO elf.shnum-1 shdr:=elf+elf.shoff+elf.shentsize*n IF shdr.type=SHT_STRTAB THEN IFN str_tab THEN str_tab:=shdr ENDFOR FOR n:=0 TO elf.shnum-1 ScanSHDR(f,elf+elf.shoff+elf.shentsize*n,elf,str_tab) ENDFOR ENDIF // ReAss(f,0,m,l) DeletePool(pool) ENDIF Close(f) ENDIF ELSE PrintFault(IOErr(),'ppcdis') FreeVec(m) ENDIF ELSE PrintFault(IOErr(),'ppcdis') FreeArgs(ra) ELSE PrintFault(IOErr(),'ppcdis') ENDPROC OBJECT elf ident[16]:CHAR, type:W, machine:W, version:L, entry:UL, phoff:UL, shoff:UL, flags:UL, ehsize:W, phentsize:W, phnum:W, shentsize:W, shnum:W, shstrndx:W ENUM ET_NONE, ET_REL, ET_EXEC, ET_DYN, ET_CORE, ET_LOPROC=$ff00, ET_HIPROC=$ffff ENUM EM_NONE, EM_M32, EM_SPARC, EM_386, EM_68K, EM_88K, EM_860, EM_MIPS, EM_MIPS_RS4_BE, EM_POWERPC=20 ENUM EI_MAG0, EI_MAG1, EI_MAG2, EI_MAG3, EI_CLASS, EI_DATA, EI_VERSION, EI_PAD, EI_NIDENT=16 ENUM ELFCLASSNONE, ELFCLASS32, ELFCLASS64 ENUM ELFDATANONE, ELFDATA2LSB, ELFDATA2MSB PROC ScanELF(f,elf:PTR TO elf,length)(PTR TO elf) DEF str[32]:CHAR IF elf.ident[EI_MAG0]<>$7f OR elf.ident[EI_MAG1]<>"E" OR elf.ident[EI_MAG2]<>"L" OR elf.ident[EI_MAG3]<>"F" THEN PrintF('no ELF file\n') VFPrintF(f,'elf header description:\n',NIL) SELECT elf.ident[EI_CLASS] CASE ELFCLASS32 VFPrintF(f,' class: 32 bit\n',NIL) CASE ELFCLASS64 VFPrintF(f,' class: 64 bit\n',NIL) ENDSELECT SELECT elf.ident[EI_DATA] CASE ELFDATA2LSB VFPrintF(f,' data: little endian\n',NIL) CASE ELFDATA2MSB VFPrintF(f,' data: big endian\n',NIL) ENDSELECT SELECT elf.type CASE ET_EXEC VFPrintF(f,' type: executable file\n') CASE ET_DYN VFPrintF(f,' type: shared object file\n') CASE ET_REL VFPrintF(f,' type: relocatable file\n') ENDSELECT VFPrintF(f,' version: \d\n',[elf.version]) SELECT elf.machine CASE EM_NONE StrCopy(str,'no machine') CASE EM_M32 StrCopy(str,'AT&T WE 32100') CASE EM_SPARC StrCopy(str,'SPARC') CASE EM_386 StrCopy(str,'Inter Architecture') CASE EM_68K StrCopy(str,'Motorola 68000') CASE EM_88K StrCopy(str,'Motorola 88000') CASE EM_860 StrCopy(str,'Intel 80860') CASE EM_MIPS StrCopy(str,'MIPS RS3000 Big-Endian') CASE EM_MIPS_RS4_BE StrCopy(str,'MIPS RS4000 Big-Endian') CASE EM_POWERPC StrCopy(str,'PowerPC') DEFAULT StrCopy(str,'unknown') ENDSELECT VFPrintF(f,' cpu: \s [\d]\n',[str,elf.machine]) VFPrintF(f,' entry address: $\h\n',[elf.entry]) VFPrintF(f,' program header offset: $\h\n',[elf.phoff]) VFPrintF(f,' section header offset: $\h\n',[elf.shoff]) VFPrintF(f,' flags: $\z\h[8]\n',[elf.flags]) VFPrintF(f,' elf header size: \d [$\h] bytes\n',[elf.ehsize,elf.ehsize]) VFPrintF(f,'program header entry size and count: \d,\d\n',[elf.phentsize,elf.phnum]) VFPrintF(f,'section header entry size and count: \d,\d\n',[elf.shentsize,elf.shnum]) VFPrintF(f,' string: \d\n',[elf.shstrndx]) VFPrintF(f,'\n',NIL) ENDPROC elf OBJECT elf32_shdr name:UL, type:UL, flags:UL, addr:PTR, off:UL, size:UL, link:UL, info:UL, addralign:UL, entsize:UL ENUM SHT_NULL, SHT_PROGBITS, SHT_SYMTAB, SHT_STRTAB, SHT_RELA, SHT_HASH, SHT_DYNAMIC, SHT_NOTE, SHT_NOBITS, SHT_REL, SHT_SHLIB, SHT_DYNSYM, SHT_LOPROC=$70000000, SHT_HIPROC=$7fffffff, SHT_LOUSER=$80000000, SHT_HIUSER=$ffffffff SET SHF_WRITE, SHF_ALLOC, SHF_EXECINSTR CONST SHF_MASKPROC=$f0000000 CONST SHN_UNDEF=0, SHN_LORESERVE=$ff00, SHN_LOPROC=$ff00, SHN_HIPROC=$ff1f, SHN_ABS=$fff1, SHN_COMMON=$fff2, SHN_HIRESERVE=$ffff PROC ScanSHDR(f,shdr:PTR TO elf32_shdr,elf:PTR TO elf,str_tab=NIL)(PTR TO elf32_shdr) DEF str[64]:CHAR VFPrintF(f,'section header: \s [\d]\n',[GetStrTableString(str_tab,elf,shdr.name),shdr.name]) SELECT shdr.type CASE SHT_NULL StrCopy(str,'NULL') CASE SHT_PROGBITS StrCopy(str,'defined by program') CASE SHT_SYMTAB StrCopy(str,'symbol table') CASE SHT_STRTAB StrCopy(str,'string table') CASE SHT_RELA StrCopy(str,'relocation entries with explicit addends') CASE SHT_HASH StrCopy(str,'symbol hash talbe') CASE SHT_DYNAMIC StrCopy(str,'dynamic linking') CASE SHT_NOTE StrCopy(str,'information') CASE SHT_NOBITS StrCopy(str,'NOBITS') CASE SHT_REL StrCopy(str,'relocation entries') CASE SHT_SHLIB StrCopy(str,'SHLIB') CASE SHT_DYNSYM StrCopy(str,'dynamic symbol table') CASE SHT_LOPROC TO SHT_HIPROC StrCopy(str,'processor specific') CASE SHT_LOUSER TO SHT_HIUSER StrCopy(str,'application program') DEFAULT StrCopy(str,'unknown') ENDSELECT VFPrintF(f,' type: \s [$\h]\n',[str,shdr.type]) StrCopy(str,'') IF shdr.flags&SHF_WRITE THEN StrAdd(str,'WRITE,') IF shdr.flags&SHF_ALLOC THEN StrAdd(str,'ALLOC,') IF shdr.flags&SHF_EXECINSTR THEN StrAdd(str,'EXECINSTR,') IF shdr.flags&SHF_MASKPROC THEN StrAdd(str,'(processor semantic),') IF shdr.flags<>0 AND StrLen(str)<>0 str[StrLen(str)-1]:="\0" ENDIF VFPrintF(f,' flags: \s [$\h]\n',[str,shdr.flags]) VFPrintF(f,' addr: $\h\n',[shdr.addr]) IF shdr.type<>SHT_NOBITS VFPrintF(f,' offset: $\h\n',[shdr.off]) VFPrintF(f,' size: \d bytes\n',[shdr.size]) ENDIF VFPrintF(f,'section link: $\h\n',[shdr.link]) VFPrintF(f,'section info: $\h\n',[shdr.info]) SELECT shdr.addralign CASE 0,1 StrCopy(str,'no') CASE 2 StrCopy(str,'half word') CASE 4 StrCopy(str,'word') CASE 8 StrCopy(str,'double word') CASE 16 StrCopy(str,'quad word') DEFAULT StringF(str,'\d bytes') ENDSELECT VFPrintF(f,' align: \s alignment\n',[str,shdr.addralign]) VFPrintF(f,' entsize: \d bytes\n',[shdr.entsize]) VFPrintF(f,'\n',NIL) DEF n,s:PTR TO CHAR SELECT shdr.type CASE SHT_STRTAB VFPrintF(f,'section contents:\n',NIL) n:=0 WHILE n=str_tab.size THEN RETURN 'out of string table' str:=elf+str_tab.off str+=id ENDPROC str OBJECT elf32_phdr type:UL, off:UL, vaddr:PTR, paddr:PTR, filesz:UL, memsz:UL, flags:UL, align:UL ENUM PT_NULL, PT_LOAD, PT_DYNAMIC, PT_INTERP, PT_NOTE, PT_SHLIB, PT_PHDR, PT_LOPROC=$70000000, PT_HIPROC=$7fffffff PROC ScanPHDR(f,phdr:PTR TO elf32_phdr,elf:PTR TO elf) DEF str[64]:CHAR VFPrintF(f,'program header:\n',NIL) SELECT phdr.type CASE PT_NULL StrCopy(str,'NULL') CASE PT_LOAD StrCopy(str,'loadable segment') CASE PT_DYNAMIC StrCopy(str,'dynamic linking information') CASE PT_INTERP StrCopy(str,'interpretter') CASE PT_NOTE StrCopy(str,'information') CASE PT_SHLIB StrCopy(str,'unspecified semantics') CASE PT_PHDR StrCopy(str,'program header') CASE PT_LOPROC TO PT_HIPROC StrCopy(str,'processor specific') DEFAULT StrCopy(str,'unknown') ENDSELECT VFPrintF(f,' type: \s [\d]\n',[str,phdr.type]) VFPrintF(f,'offset: $\h\n',[phdr.off]) VFPrintF(f,' vaddr: $\h\n',[phdr.vaddr]) VFPrintF(f,' paddr: $\h\n',[phdr.paddr]) VFPrintF(f,'filesz: \d\n',[phdr.filesz]) VFPrintF(f,' memsz: \d\n',[phdr.memsz]) VFPrintF(f,' flags: $\h\n',[phdr.flags]) SELECT phdr.align CASE 0,1 StrCopy(str,'no') CASE 2 StrCopy(str,'half word') CASE 4 StrCopy(str,'word') CASE 8 StrCopy(str,'double word') CASE 16 StrCopy(str,'quad word') DEFAULT StringF(str,'\d bytes',phdr.align) ENDSELECT VFPrintF(f,' align: \s alignment\n',[str]) VFPrintF(f,'\n',NIL) ENDPROC DEF pool