home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 19 / AACD19.BIN / AACD / Programming / YAEC / examples / ShowHunk.e < prev    next >
Encoding:
Text File  |  2001-02-23  |  25.1 KB  |  933 lines

  1.  
  2. -> slightly rewritten for YAEC1.4a.
  3. -> this program uses some ptr-math and YAEC1.4+ dont allow that by default.
  4. -> so all ptrs in math expressions had to be surronded by Any() to untype
  5. -> them. now some fun news :
  6. -> this program showed itself to be around eight (8) ! times faster then
  7. -> the ec3.3a compiled one. :) much because of the much faster
  8. -> stringformatting in YAEC.
  9. -> test was : showhunk c:IPrefs disasm > t:t (t in ram:)
  10.  
  11.  
  12. ENUM HUNK_UNIT=$3E7, HUNK_NAME, HUNK_CODE, HUNK_DATA, HUNK_BSS, HUNK_RELOC32,
  13.      HUNK_RELOC16, HUNK_RELOC8, HUNK_EXT, HUNK_SYMBOL, HUNK_DEBUG,
  14.      HUNK_END, HUNK_HEADER, HUNK_OVERLAY=$3F5, HUNK_BREAK, HUNK_DRELOC32,
  15.      HUNK_DRELOC16, HUNK_DRELOC8, HUNK_LIB, HUNK_INDEX, HUNK_RELOC32_S,
  16.      HUNK_REL_RELOC32
  17.  
  18. ENUM EXT_SYM=0, EXT_DEF, EXT_ABS, EXT_RES, EXT_NEWCOMMON, EXT_REF32=129,
  19.      EXT_COMMON, EXT_REF16, EXT_REF8, EXT_DREF32, EXT_DREF16, EXT_DREF8
  20.  
  21. ENUM ER_NONE,ER_FILE,ER_MEM,ER_USAGE,ER_HUNKID,ER_BREAK,ER_FILETYPE
  22.  
  23. RAISE ER_MEM IF FastNew()=NIL
  24.  
  25. DEF flen,o:PTR TO LONG,mem,handle=0,hunkid,noreloc=-1,hunknr=-1,f=-1
  26. DEF pc:PTR TO INT,hibyte,eleven2nine,eight,seven2six,five2three,two2zero,isize
  27. DEF tmp,fname[256]:STRING,disasm
  28.  
  29. PROC main()
  30.   DEF options:PTR TO LONG,rdargs
  31.  
  32.   options:=[0,0]
  33.   IF (rdargs:=ReadArgs('NAME/A,DISASM/S',options,NIL))
  34.     IF options[0] THEN StrCopy(fname,options[0])
  35.     disasm:=options[1]
  36.     FreeArgs(rdargs)
  37.   ELSE
  38.     error(ER_USAGE)
  39.   ENDIF
  40.  
  41.   PutStr('ShowHunk v2.0 Copyright (c) 1993 Jim Cooper\n')
  42.   PutStr(' Original ShowHunk v0.1 (c) 1992 $#%!\n\n')
  43.  
  44.   flen:=FileLength(fname)
  45.   handle:=Open(fname,OLDFILE)
  46.   IF (flen<1) OR (handle=NIL)
  47.     error(ER_FILE)
  48.   ELSE
  49.     mem:=FastNew(flen)
  50.     IF mem=NIL
  51.       error(ER_MEM)
  52.     ELSE
  53.       IF Read(handle,mem,flen)<>flen THEN error(ER_FILE) ELSE process()
  54.     ENDIF
  55.   ENDIF
  56.   error(ER_NONE)
  57. ENDPROC
  58.  
  59. PROC process()
  60.   DEF end,type
  61.  
  62.   o:=mem
  63.   end:=Any(o)+flen
  64.   IF (o[]<>HUNK_HEADER) AND (o[]<>HUNK_UNIT) AND (o[]<>HUNK_LIB) THEN error(ER_FILETYPE)
  65.   PrintF('Hunk layout of file \"\s\" (\d bytes)\n\n',fname,flen)
  66.   WHILE o<end
  67.     IF CtrlC() THEN error(ER_BREAK)
  68.     type:=Int(o)
  69.     hunkid:=Int(Any(o)+2)
  70.     o:=Any(o)+4
  71.     IF (hunkid<>HUNK_UNIT) AND (hunkid<>HUNK_HEADER) AND (hunkid<>HUNK_BREAK) AND (hunkid<>HUNK_LIB) AND (hunkid<>HUNK_INDEX)
  72.       IF f
  73.         PrintF('HUNK \d',hunknr)
  74.         hunknr++
  75.       ENDIF
  76.       f:=FALSE
  77.     ENDIF
  78.     IF type
  79.       IF type=$4000
  80.         PutStr('\t** hunk forced to CHIP-mem\n')
  81.       ELSE
  82.         PrintF('\t** type: \d\n',type)
  83.       ENDIF
  84.     ENDIF
  85.     SELECT hunkid
  86.       CASE HUNK_UNIT
  87.          PutStr('\thunk_unit: ')
  88.          name()
  89.       CASE HUNK_NAME
  90.          PutStr('\thunk_name: ')
  91.          name()
  92.       CASE HUNK_CODE
  93.         PutStr('\thunk_code')
  94.         IF disasm
  95.           PutStr('\n')
  96.           code()
  97.         ELSE
  98.           PrintF(': \d bytes\n', skip())
  99.         ENDIF
  100.       CASE HUNK_DATA
  101.               PrintF('\thunk_data: \d bytes\n',skip())
  102.       CASE HUNK_BSS
  103.                PrintF('\thunk_bss: \d bytes\n',Mul(o[]++,4))
  104.       CASE HUNK_RELOC32
  105.                 PutStr('\thunk_reloc32\n')
  106.             reloc(4)
  107.       CASE HUNK_RELOC16
  108.            PutStr('\thunk_reloc16\n')
  109.             reloc(4)
  110.       CASE HUNK_RELOC8
  111.             PutStr('\thunk_reloc8\n')
  112.              reloc(4)
  113.       CASE HUNK_EXT
  114.                PutStr('\thunk_ext\n')
  115.                 symbol()
  116.       CASE HUNK_SYMBOL
  117.             PutStr('\thunk_symbol\n')
  118.              symbol()
  119.       CASE HUNK_DEBUG
  120.              PrintF('\thunk_debug: \d bytes\n',skip())
  121.       CASE HUNK_END
  122.                f:=TRUE
  123.       CASE HUNK_HEADER
  124.             PutStr('\thunk_header\n')
  125.             head()
  126.       CASE HUNK_OVERLAY
  127.            PutStr('\thunk_overlay\n')
  128.             overlay()
  129.       CASE HUNK_BREAK
  130.              PutStr('\thunk_break\n')
  131.               hunknr:=1
  132.                f:=TRUE
  133.       CASE HUNK_DRELOC32
  134.           PutStr('\thunk_data-reloc32\n')
  135.            reloc(4)
  136.       CASE HUNK_DRELOC16
  137.           PutStr('\thunk_data-reloc16\n')
  138.            reloc(4)
  139.       CASE HUNK_DRELOC8
  140.            PutStr('\thunk_data-reloc8\n')
  141.             reloc(4)
  142.       CASE HUNK_LIB
  143.                PrintF('\tlibrary_hunk: \d bytes\n',Mul(o[]++,4))
  144.                 hunknr:=0
  145.       CASE HUNK_INDEX
  146.              PrintF('\tlibrary_index: \d bytes\n\n',skip())
  147.       CASE HUNK_RELOC32_S
  148.          PutStr('\thunk_reloc32_short\n')
  149.           reloc(2)
  150.       CASE HUNK_REL_RELOC32
  151.        PutStr('\thunk_relative_reloc32\n')
  152.         reloc(4)
  153.       DEFAULT
  154.         error(ER_HUNKID)
  155.     ENDSELECT
  156.   ENDWHILE
  157.   PutStr(IF noreloc THEN '\nPosition independant code!\n' ELSE '\n')
  158. ENDPROC
  159.  
  160. PROC overlay()
  161.   DEF m,ts
  162.   ts:=o[]++
  163.   PrintF('\t  tablesize = \d\n',ts)
  164.   m:=o[]-2 
  165.   o++
  166.   PrintF('\t  max. level overlay tree uses = \d\n',m)
  167.   o:=ts*4+Any(o)
  168.   hunknr:=1
  169.   f:=TRUE
  170. ENDPROC
  171.  
  172. PROC symbol()
  173.   DEF t,l,s,c,r
  174.   t:=Char(o)
  175.    l:=Int(Any(o)+2)
  176.     o:=Any(o)+4
  177.   WHILE l
  178.     IF CtrlC() THEN error(ER_BREAK)
  179.     IF t<EXT_NEWCOMMON                  /* sym def */
  180.       s:=o
  181.        o:=l*4+Any(o)
  182.         c:=o[]++
  183.          PutChar(Any(o)-4,0)
  184.       PrintF('\t  \s = $\h\n',s,c)
  185.     ELSEIF (t=EXT_COMMON) OR (t=EXT_NEWCOMMON)  ->/* common ref */
  186.       s:=o
  187.        o:=l*4+Any(o)
  188.         c:=o[]++
  189.          PutChar(Any(o)-4,0)
  190.           r:=o[]++
  191.       PrintF('\t  \s (\d ref\s) commonsize = \d\n',s,r,
  192.              IF r=1 THEN '' ELSE 's',c)
  193.       o:=r*4+Any(o)
  194.     ELSE                                /* sym ref */
  195.       s:=o
  196.        o:=l*4+Any(o)
  197.         r:=o[]++
  198.          PutChar(Any(o)-4,0)
  199.       PrintF('\t  \s (\d ref\s)\n',s,r,IF r=1 THEN '' ELSE 's')
  200.       o:=r*4+Any(o)
  201.     ENDIF
  202.     t:=Char(o)
  203.      l:=Int(Any(o)+2)
  204.       o:=Any(o)+4
  205.   ENDWHILE
  206. ENDPROC
  207.  
  208. PROC head()
  209.   DEF a,b
  210.   a:=0
  211.   b:=o[a]++
  212.   WHILE b
  213.     PrintF('\t  libname: \s\n',o)
  214.     a:=a+b
  215.     b:=o[a]++
  216.   ENDWHILE
  217.   b:=o[]++
  218.   hunknr:=o[]++
  219.   a:=o[]-hunknr+1 
  220.   o++
  221.   PrintF('\t  #of hunks: \d\n',a)
  222.   o:=a*4+Any(o)
  223. ENDPROC
  224.  
  225. PROC reloc(size)
  226.   DEF a
  227.   noreloc:=FALSE
  228.   a:=o[]++
  229.   WHILE a
  230.     IF CtrlC() THEN error(ER_BREAK)
  231.     PrintF('\t  \d reloc entr\s for hunk #\d\n',a,
  232.            IF a=1 THEN 'y' ELSE 'ies',o[]++)
  233.     o:=a*size+o
  234.     a:=o[]++
  235.   ENDWHILE
  236. ENDPROC
  237.  
  238. PROC name()
  239.   DEF a
  240.   a:=o[]++
  241.   PrintF('\s\n',o)
  242.   o:=a*4+o
  243. ENDPROC
  244.  
  245. PROC skip()
  246.   DEF a
  247.   a:=Mul(o[]++,4)
  248.   o:=Any(o)+a
  249. ENDPROC a
  250.  
  251. PROC error(nr)
  252.   IF handle THEN Close(handle)
  253.   PutStr('\n')
  254.   SELECT nr
  255.     CASE ER_FILE
  256.          PrintF('Could not read file \"\s\" !\n',fname)
  257.     CASE ER_MEM
  258.           PutStr('No memory for hunks!\n')
  259.     CASE ER_USAGE
  260.         PutStr('USAGE: ShowHunk <exe/objfile>\n')
  261.     CASE ER_HUNKID
  262.        PrintF('Illegal hunk id: $\h !\n',hunkid)
  263.     CASE ER_BREAK
  264.         PutStr('** BREAK: ShowHunk\n')
  265.     CASE ER_FILETYPE
  266.      PutStr('Not an executable or object file.\n')
  267.   ENDSELECT
  268.   ->CleanUp()
  269.   Raise(10)
  270. ENDPROC
  271.  
  272. PROC illegal()
  273.   PrintF('<illegal opcode: $\h>\n',pc[])
  274. ENDPROC
  275.  
  276. PROC opsize(bit)
  277.    DEF a
  278.    a :=  ListItem(["b","w","l","?"], bit)
  279. ENDPROC a
  280.  
  281. PROC bitsize(bit)
  282. ENDPROC IF bit THEN "l" ELSE "w"
  283.  
  284. PROC immed(val)
  285.   PrintF(IF val < 16 THEN '\d' ELSE '$\h',val)
  286. ENDPROC
  287.  
  288. PROC ccode(val,b)
  289.    DEF z
  290.    z := ListItem([IF b THEN 'ra' ELSE 't',
  291.   IF b THEN 'sr' ELSE 'f','hi','ls','cc','cs','ne','eq','vc',
  292.   'vs','pl','mi','ge','lt','gt','le','??'],val)
  293. ENDPROC z
  294.  
  295. PROC ea(mode,reg,sd)
  296.   IF mode < 5 THEN PrintF(ListItem(['d\d','a\d','(a\d)','(a\d)+','-(a\d)'],mode),reg)
  297.   SELECT mode
  298.     CASE 5;
  299.        PutStr('(')
  300.        immed(pc[1]++)
  301.        PrintF(',a\d)',reg)
  302.     CASE 6;
  303.       tmp:=pc[1]++
  304.       PutStr('(')
  305.       immed(tmp AND $f)
  306.       PrintF(',a\d,\s\d\s',
  307.          reg,
  308.          IF tmp AND $8000 THEN 'a' ELSE 'd',
  309.          (Shr(tmp,12) AND 7),
  310.          IF tmp AND $800 THEN '.L)' ELSE '.W)'
  311.          )
  312.     CASE 7;
  313.       SELECT reg
  314.         CASE 0;  PrintF('(\d).W',pc[1]++)
  315.         CASE 1;  immed(Long(Any(pc)+2)); pc:=Any(pc)+4      /* bug! was: immed(^pc++) */
  316.         CASE 2;
  317.           PutStr('(')
  318.           immed(pc[1]++)
  319.           PutStr(',PC)')
  320.         CASE 3;
  321.           tmp:=pc[1]++
  322.           PutStr('(')
  323.           immed(tmp AND $f)
  324.           PrintF(',PC,\c\d\s',IF tmp AND $8000 THEN "a" ELSE "d",
  325.                               Shr(tmp,12) AND 7,
  326.                               IF tmp AND $800 THEN '.L)' ELSE '.W)')
  327.         CASE 4;
  328.           IF sd
  329.             PutStr('#')
  330.             immed(IF isize=2 THEN pc[1] ELSE Long(Any(pc)+2))
  331.             pc:=Any(pc)+isize
  332.           ELSE
  333.             PutStr('SR')
  334.           ENDIF
  335.         DEFAULT;
  336.           PutStr('<unknown ea!>')
  337.       ENDSELECT
  338.   ENDSELECT
  339. ENDPROC
  340.  
  341. PROC movemregs(val,predec)
  342.   DEF index,first=1,regs:PTR TO LONG
  343.  
  344.   regs:=['d0','d1','d2','d3','d4','d5','d6','d7',
  345.          'a0','a1','a2','a3','a4','a5','a6','a7']
  346.  
  347.   IF predec
  348.     FOR index:=15 TO 0 STEP -1
  349.       IF val AND Shl(1,index)
  350.         IF first = 0 THEN PutStr('/')
  351.         PutStr(regs[15-index])
  352.         first:=0
  353.       ENDIF
  354.     ENDFOR
  355.   ELSE
  356.     FOR index:=0 TO 15 STEP 1
  357.       IF val AND Shl(1,index)
  358.         IF first = 0 THEN PutStr('/')
  359.         PutStr(regs[index])
  360.         first:=0
  361.       ENDIF
  362.     ENDFOR
  363.   ENDIF
  364. ENDPROC
  365.  
  366. PROC code0000()
  367.   DEF c,tmp2
  368.  
  369.   IF (eleven2nine = 7) OR (seven2six = 3)
  370.     IF (eleven2nine = 7) AND (eight = 0)
  371.       tmp:=pc[1]++
  372.       PrintF('moves.\c\t',opsize(seven2six))
  373.       IF Shr(tmp,11) AND 1
  374.         ea(five2three,two2zero,1)
  375.         PrintF(',\c\d\n',IF tmp AND $8000 THEN "a" ELSE "d",Shr(tmp,12) AND 7)
  376.       ELSE
  377.         PrintF('\c\d,',IF tmp AND $8000 THEN "a" ELSE "d",Shr(tmp,12) AND 7)
  378.         ea(five2three,two2zero,0)
  379.         PutStr('\n')
  380.       ENDIF
  381.     ELSEIF (eight = 0) AND (seven2six = 3)
  382.       tmp:=pc[1]++
  383.       IF (five2three = 7) AND (two2zero = 4)
  384.         tmp2:=pc[1]++
  385.         PrintF('cas2\td\d:d\d,d\d:d\d,\c\d:\c\d\n',
  386.                (tmp AND 7), (tmp2 AND 7),
  387.                (Shr(tmp,6) AND 7), (Shr(tmp2,6) AND 7),
  388.                IF tmp AND $8000 THEN "a" ELSE "d", (Shr(tmp,12) AND 7),
  389.                IF tmp2 AND $8000 THEN "a" ELSE "d", (Shr(tmp2,12) AND 7))
  390.       ELSE
  391.         PrintF('cas\td\d,d\d,',tmp AND 7, Shr(tmp,6) AND 7)
  392.         ea(five2three,two2zero,0)
  393.         PutStr('\n')
  394.       ENDIF
  395.     ELSE
  396.       illegal()
  397.     ENDIF
  398.   ELSE
  399.     IF five2three = 1
  400.       PrintF('movep.\c\t',bitsize(seven2six AND 1))
  401.       IF seven2six AND 2
  402.         PrintF('d\d,\d(a\d)\n',eleven2nine,pc[1]++,two2zero)
  403.       ELSE
  404.         PrintF('\d(a\d),d\d\n',pc[1]++,two2zero,eleven2nine)
  405.       ENDIF
  406.     ELSEIF (eight = 1) OR ((((eleven2nine AND 3) = 0) AND (eight = 0)))
  407.       PrintF(ListItem(['btst\t','bchg\t','bclr\t','bset\t'],seven2six))
  408.       IF eight = 1
  409.         PrintF('d\d,',eleven2nine)
  410.       ELSE
  411.         PrintF('#\d,',pc[1]++)
  412.       ENDIF
  413.       ea(five2three,two2zero,0)
  414.       PutStr('\n')
  415.     ELSE
  416.       IF seven2six = 3
  417.         tmp:=pc[1]++
  418.         PrintF('\s.\c\t',IF Shr(tmp,11) AND 1 THEN 'chk2' ELSE 'cmp2',opsize(eleven2nine))
  419.         ea(five2three,two2zero,1)
  420.         PrintF(',\c\d\n',IF tmp AND $8000 THEN "d" ELSE "a",Shr(tmp,12) AND 3)
  421.       ELSE
  422.         c:=ListItem(['ori.','andi.','subi.','addi.',0,'eori.','cmpi.',0],eleven2nine)
  423.         IF c THEN PutStr(c) ELSE illegal()
  424.         PrintF('\c\t#',opsize(seven2six))
  425.         immed(IF seven2six < 2 THEN pc[1]++ ELSE pc[]++)
  426.         PutStr(',')
  427.         ea(five2three,two2zero,0)
  428.         PutStr('\n')
  429.       ENDIF
  430.     ENDIF
  431.   ENDIF
  432. ENDPROC
  433.  
  434. PROC code0100()
  435.   DEF subfield,bitseven,bitsix,curcode
  436.  
  437.   bitseven:=Shr(seven2six,1)
  438.   bitsix:=seven2six AND 1
  439.  
  440.   IF pc[] = $4afa
  441.     PutStr('bgnd\n')
  442.   ELSE
  443.     IF eight = 1
  444.       IF bitsix = 1
  445.         PutStr('lea\t')
  446.         ea(five2three,two2zero,1)
  447.         PrintF(',a\d\n',eleven2nine)
  448.       ELSE
  449.         PutStr('chk\t')
  450.         ea(five2three,two2zero,0)
  451.         PrintF(',d\d\n',eleven2nine)
  452.       ENDIF
  453.     ELSE
  454.       subfield:=Shl(eleven2nine,1)+eight
  455.  
  456.       SELECT subfield
  457.         CASE 0;
  458.           IF seven2six = 3
  459.             PutStr('move.w\t')
  460.             ea(five2three,two2zero,1)
  461.             PutStr(',sr\n')
  462.           ELSE
  463.             PrintF('negx.\c\t',opsize(seven2six))
  464.             ea(five2three,two2zero,0)
  465.             PutStr('\n')
  466.           ENDIF
  467.         CASE 1;
  468.           IF seven2six = 3
  469.             PutStr('move.w\tccr,')
  470.             ea(five2three,two2zero,0)
  471.             PutStr('\n')
  472.           ELSE
  473.             illegal()
  474.           ENDIF
  475.         CASE 2;
  476.           PrintF('clr.\c\t',opsize(seven2six))
  477.           ea(five2three,two2zero,0)
  478.           PutStr('\n')
  479.         CASE 4;
  480.           IF seven2six = 3
  481.             PutStr('move.w\t')
  482.             ea(five2three,two2zero,1)
  483.             PutStr(',ccr\n')
  484.           ELSE
  485.             PrintF('neg.\c\t',opsize(seven2six))
  486.             ea(five2three,two2zero,0)
  487.             PutStr('\n')
  488.           ENDIF
  489.         CASE 6;
  490.           IF seven2six = 3
  491.             PutStr('move.w\tsr,')
  492.             ea(five2three,two2zero,0)
  493.             PutStr('\n')
  494.           ELSE
  495.             PrintF('not.\c\t',opsize(seven2six))
  496.             ea(five2three,two2zero,0)
  497.             PutStr('\n')
  498.           ENDIF
  499.         CASE 8;
  500.           IF seven2six = 0
  501.             IF five2three = 1
  502.               PrintF('link.l\ta\d,#-$\h\n',two2zero,0-1-pc[]++)
  503.             ELSE
  504.               PutStr('nbcd\t')
  505.               ea(five2three,two2zero,0)
  506.               PutStr('\n')
  507.             ENDIF
  508.           ELSEIF seven2six = 1
  509.             IF five2three = 0
  510.               PrintF('swap\td\d\n',two2zero)
  511.             ELSEIF five2three = 1
  512.               PrintF('bkpt\t#\d\n',two2zero)
  513.             ELSE
  514.               PutStr('pea\t')
  515.               ea(five2three,two2zero,0)
  516.               PutStr('\n')
  517.             ENDIF
  518.           ELSE
  519.             IF five2three = 0
  520.               IF (Shl(eight,2)+seven2six) = 7 THEN PrintF('extb.l\td\d\n',two2zero) ELSE PrintF('ext.\c\td\d\n',bitsize(bitsix),two2zero)
  521.             ELSE
  522.               PrintF('movem.\c\t',bitsize(bitsix))
  523.               movemregs(pc[1]++, IF five2three = 4 THEN 1 ELSE 0)
  524.               PutStr(',')
  525.               ea(five2three,two2zero,0)
  526.               PutStr('\n')
  527.             ENDIF
  528.           ENDIF
  529.         CASE 10;
  530.           IF pc[] = $4afc
  531.             PutStr('illegal\n')
  532.           ELSE
  533.             IF seven2six = 3
  534.               PutStr('tas\t')
  535.               ea(five2three,two2zero,0)
  536.               PutStr('\n')
  537.             ELSE
  538.               PrintF('tst.\c\t',opsize(seven2six))
  539.               ea(five2three,two2zero,0)
  540.               PutStr('\n')
  541.             ENDIF
  542.           ENDIF
  543.         CASE 12;
  544.           tmp:=pc[1]++
  545.  
  546.           IF (Shl(eight,2)+seven2six) < 2
  547.             IF seven2six = 1
  548.               PrintF('div\c',IF Shr(tmp,11) AND 1 THEN "s" ELSE "u")
  549.               IF ((Shr(tmp,10) AND 1) = 0) AND ((Shr(tmp,12) AND 7) <> (tmp AND 7))
  550.                 PutStr('l.l\t')
  551.                 ea(five2three,two2zero,1)
  552.                 PrintF(',d\d:d\d\n',Shr(tmp,12) AND 7,tmp AND 7)
  553.               ELSE
  554.                 PutStr('.l\t')
  555.                 ea(five2three,two2zero,1)
  556.                 PrintF(',d\d',Shr(tmp,12) AND 7)
  557.                 IF Shr(tmp,10) AND 1 THEN PrintF(':d\d',tmp AND 7)
  558.                 PutStr('\n')
  559.               ENDIF
  560.             ELSE
  561.               PrintF('mul\c.l\t',IF Shr(tmp,11) AND 1 THEN "s" ELSE "u")
  562.               ea(five2three,two2zero,1)
  563.               PrintF(',d\d',Shr(tmp,12) AND 7)
  564.               IF Shr(tmp,10) AND 1 THEN PrintF(':d\d',tmp AND 7)
  565.               PutStr('\n')
  566.             ENDIF
  567.           ELSE
  568.             PrintF('movem.\c\t',bitsize(bitsix))
  569.             ea(five2three,two2zero,0)
  570.             PutStr(',')
  571.             movemregs(tmp, IF five2three = 4 THEN 1 ELSE 0)
  572.             PutStr('\n')
  573.           ENDIF
  574.         CASE 14;
  575.           curcode:=pc[]
  576.  
  577.           SELECT curcode
  578.             CASE $4e70;
  579.               PutStr('reset\n')
  580.             CASE $4e71;
  581.               PutStr('nop\n')
  582.             CASE $4e72;
  583.               PutStr('stop\n')
  584.             CASE $4e73;
  585.               PutStr('rte\n')
  586.             CASE $4e74;
  587.               PrintF('rtd\t#\d\n', Shl(pc[1]<(32767+1),16) - pc[1]++)
  588.             CASE $4e75;
  589.               PutStr('rts\n')
  590.             CASE $4e76;
  591.               PutStr('trapv\n')
  592.             CASE $4e77;
  593.               PutStr('rtr\n')
  594.             DEFAULT;
  595.               IF bitseven = 1
  596.                 PutStr(IF bitsix = 1 THEN 'jmp\t' ELSE 'jsr\t')
  597.                 ea(five2three,two2zero,0)
  598.                 PutStr('\n')
  599.               ELSE
  600.                 IF bitsix = 1
  601.                   tmp:=Shr(five2three,1)
  602.  
  603.                   SELECT tmp
  604.                     CASE 0;
  605.                       PrintF('trap\t\d\n',(Shl((five2three AND 1),2)+two2zero))
  606.                     CASE 1;
  607.                       IF five2three AND 1
  608.                         PrintF('unlk\ta\d\n',two2zero)
  609.                       ELSE
  610.                         PrintF('link.w\ta\d,#-$\h\n',two2zero,65536-pc[1]); pc++
  611.  
  612.                       ENDIF
  613.                     CASE 2;
  614.                       PrintF(IF five2three AND 1 THEN 'move\tusp,a\d\n' ELSE 'move\ta\d,usp\n',two2zero)
  615.                     CASE 3;
  616.                       PrintF('rtm\t\c\d\n',IF five2three AND 1 THEN "a" ELSE "d",two2zero)
  617.                   ENDSELECT
  618.                 ELSE
  619.                   illegal()
  620.                 ENDIF
  621.               ENDIF
  622.           ENDSELECT
  623.         DEFAULT; illegal()
  624.       ENDSELECT
  625.     ENDIF
  626.   ENDIF
  627. ENDPROC
  628.  
  629. PROC code0101()
  630.   IF seven2six < 3
  631.     PutStr(IF eight = 1 THEN 'subq.' ELSE 'addq.')
  632.     PrintF('\c\t#\d,',opsize(seven2six),eleven2nine)
  633.     ea(five2three,two2zero,0)
  634.     PutStr('\n')
  635.   ELSE
  636.     IF five2three = 1
  637.       PrintF('db\s\td\d,L\z\h[8]\n',
  638.              ccode((Shl(eleven2nine,1)+eight),0),
  639.              two2zero,
  640.              Any(pc)-Any(o)-2-(Shl(pc[1]<(32767+1),16)-pc[1]))
  641.       pc++
  642.     ELSEIF five2three = 7
  643.       PrintF('trap\s',ccode(Shl(eleven2nine,1)+eight,0))
  644.       IF two2zero < 4
  645.         IF two2zero AND 1 THEN PrintF('.w\t#\d',pc[1]++) ELSE PrintF('.l\t#\d',pc[]++)
  646.       ENDIF
  647.       PutStr('\n')
  648.     ELSE
  649.       PrintF('s\s\t',ccode(Shl(eleven2nine,1)+eight,0))
  650.       ea(five2three,two2zero,0)
  651.       PutStr('\n')
  652.     ENDIF
  653.   ENDIF
  654. ENDPROC
  655.  
  656. PROC code0110()
  657.   DEF tmp2,ctl:PTR TO LONG
  658.  
  659.   IF (pc[] AND $fffe) = $4e7a
  660.     tmp:=pc[1]++
  661.     tmp2:= tmp AND $fff
  662.     IF tmp2 > 7
  663.       ctl:=ListItem(['usp','vbr','caar','msp','isp','mmusr','urp','srp'],tmp2 - $800)
  664.     ELSE
  665.       ctl:=ListItem(['sfc','dfc','cacr','tc','itt0','itt1','dtt0','dtt1'],tmp2)
  666.     ENDIF
  667.     IF ctl
  668.       PutStr('movec\t')
  669.       IF pc[-1] AND 1
  670.         PrintF('\s,\c\d\n',ctl,IF tmp AND $8000 THEN "a" ELSE "d",Shr(tmp,12) AND 7)
  671.       ELSE
  672.         PrintF('\c\d,\s\n',IF tmp AND $8000 THEN "a" ELSE "d",Shr(tmp,12) AND 7,ctl)
  673.       ENDIF
  674.     ELSE
  675.       illegal()
  676.     ENDIF
  677.   ELSE
  678.     PrintF('b\s',ccode((Shl(eleven2nine,1)+eight),1))
  679.     tmp:=Char(Any(pc)+1)
  680.     IF tmp = 0
  681.       PrintF('.w\tL\z\h[8]\n',Any(pc)-Any(o)-2-(Shl(pc[1]<(32767+1),16)-pc[1]))
  682.       pc++
  683.     ELSE
  684.       PrintF('.b\tL\z\h[8]\n',Any(pc)-Any(o)-2-(Shl(tmp<(127+1),8)-tmp))
  685.     ENDIF
  686.   ENDIF
  687. ENDPROC
  688.  
  689. PROC code1000()
  690.   IF Shr(pc[],4) AND (%11111 = %10100)   /* bug!: was  Shr(five2three,1) = 0 */
  691.     IF eight
  692.       IF seven2six
  693.         SELECT seven2six
  694.           CASE 1;  PutStr('pack\t')
  695.           CASE 2;  PutStr('unpk\t')
  696.           DEFAULT; illegal()
  697.         ENDSELECT
  698.         PrintF(IF five2three AND 1 THEN '-(a\d),-(a\d),#\d\n' ELSE 'd\d,d\d,#\d\n',two2zero,eleven2nine,pc[1]++)
  699.       ELSE
  700.         PrintF(IF five2three AND 1 THEN 'sbcd\t-(a\d),-(a\d)\n' ELSE 'sbcd\td\d,-d\d\n',two2zero,eleven2nine)
  701.       ENDIF
  702.     ELSE
  703.       illegal()
  704.     ENDIF
  705.   ELSE
  706.     IF seven2six = 3
  707.       PutStr(IF eight = 1 THEN 'divs\t' ELSE 'divu\t')
  708.       ea(five2three,two2zero,1)
  709.       PrintF(',d\d\n',eleven2nine)
  710.     ELSE
  711.       PrintF('or.\c\t',opsize(seven2six))
  712.       IF eight = 1
  713.         PrintF('d\d,',eleven2nine)
  714.         ea(five2three,two2zero,0)
  715.       ELSE
  716.         ea(five2three,two2zero,1)
  717.         PrintF(',d\d',eleven2nine)
  718.       ENDIF
  719.       PutStr('\n')
  720.     ENDIF
  721.   ENDIF
  722. ENDPROC
  723.  
  724. PROC code1001()
  725.   IF seven2six = 3
  726.     PrintF('suba.\c\t',bitsize(eight))
  727.     ea(five2three,two2zero,1)
  728.     PrintF(',a\d\n',eleven2nine)
  729.   ELSE
  730.     IF (Shr(five2three,1) = 0) AND (eight = 1)
  731.       PrintF('subx.\c\t',opsize(seven2six))
  732.       PrintF(IF five2three AND 1 THEN '-(a\d),-(a\d)\n' ELSE 'd\d,d\d\n',two2zero,eleven2nine)
  733.     ELSE
  734.       PrintF('sub.\c\t',opsize(seven2six))
  735.       IF eight = 1
  736.         PrintF('d\d,',eleven2nine)
  737.         ea(five2three,two2zero,0)
  738.         PutStr('\n')
  739.       ELSE
  740.         ea(five2three,two2zero,1)
  741.         PrintF(',d\d\n',eleven2nine)
  742.       ENDIF
  743.     ENDIF
  744.   ENDIF
  745. ENDPROC
  746.  
  747. PROC code1011()
  748.   IF seven2six = 3
  749.     PrintF('cmpa.\c\t',bitsize(eight))
  750.     ea(five2three,two2zero,1)
  751.     PrintF(',a\d\n',eleven2nine)
  752.   ELSE
  753.     IF five2three = 1
  754.       PrintF('cmpm.\c\t(a\d)+,(a\d)+\n',opsize(seven2six),two2zero,eleven2nine)
  755.     ELSE
  756.       IF eight = 1
  757.         PrintF('eor.\c\td\d,',opsize(seven2six),eleven2nine)
  758.         ea(five2three,two2zero,0)
  759.         PutStr('\n')
  760.       ELSE
  761.         PrintF('cmp.\c\t',opsize(seven2six))
  762.         ea(five2three,two2zero,1)
  763.         PrintF(',d\d\n',eleven2nine)
  764.       ENDIF
  765.     ENDIF
  766.   ENDIF
  767. ENDPROC
  768.  
  769. PROC code1100()
  770.   IF seven2six = 3
  771.     PutStr(IF eight = 1 THEN 'mulu.w\t' ELSE 'muls.w\t')
  772.     ea(five2three,two2zero,1)
  773.     PrintF(',d\d\n',eleven2nine)
  774.   ELSE
  775.     IF Shr(five2three,1) <> 0
  776.       PrintF('and.\c\t',opsize(seven2six))
  777.       IF eight = 1
  778.         PrintF('d\d,',eleven2nine)
  779.         ea(five2three,two2zero,0)
  780.         PutStr('\n')
  781.       ELSE
  782.         ea(five2three,two2zero,1)
  783.         PrintF(',d\d\n',eleven2nine)
  784.       ENDIF
  785.     ELSE
  786.       IF seven2six = 0
  787.         PrintF(IF five2three AND 1 THEN 'abcd\t-(a\d),-(a\d)\n' ELSE 'abcd\td\d,d\d\n',two2zero,eleven2nine)
  788.       ELSE
  789.         PutStr('exg\t')
  790.         tmp:=Shl(seven2six,3)+five2three
  791.         IF tmp = 8
  792.           PrintF('d\d,d\d\n',two2zero,eleven2nine)
  793.         ELSEIF tmp = 9
  794.           PrintF('a\d,a\d\n',two2zero,eleven2nine)
  795.         ELSEIF tmp = 17
  796.           PrintF('a\d,d\d\n',two2zero,eleven2nine)
  797.         ELSE
  798.           illegal()
  799.         ENDIF
  800.       ENDIF
  801.     ENDIF
  802.   ENDIF
  803. ENDPROC
  804.  
  805. PROC code1101()
  806.   IF seven2six = 3
  807.     PrintF('adda.\c\t',bitsize(eight))
  808.     ea(five2three,two2zero,1)
  809.     PrintF(',a\d\n',eleven2nine)
  810.   ELSE
  811.     IF (Shr(five2three,1) = 0) AND (eight = 1)
  812.       PrintF('addx.\c\t',opsize(seven2six))
  813.       PrintF(IF five2three AND 1 THEN '-(a\d),-(a\d)\n' ELSE 'd\d,d\d\n',two2zero,eleven2nine)
  814.     ELSE
  815.       PrintF('add.\c\t',opsize(seven2six))
  816.       IF eight = 1
  817.         PrintF('d\d,',eleven2nine)
  818.         ea(five2three,two2zero,0)
  819.         PutStr('\n')
  820.       ELSE
  821.         ea(five2three,two2zero,1)
  822.         PrintF(',d\d\n',eleven2nine)
  823.       ENDIF
  824.     ENDIF
  825.   ENDIF
  826. ENDPROC
  827.  
  828. PROC code1110()
  829.   DEF subfield,tmp2
  830.  
  831.   IF seven2six = 3
  832.     tmp:=pc[1]++
  833.     tmp2:=tmp AND 31
  834.     subfield:=Shl((eleven2nine AND 3),1)+eight
  835.     PutStr(ListItem(['bftst','bfextu','bfchg','bfexts','bfclr','bfffo','bfset','bfins'],subfield))
  836.     PutStr('\t')
  837.     IF subfield = 7 THEN PrintF('d\d,',Shr(tmp,12) AND 7)
  838.     ea(five2three,two2zero,0)
  839.     PrintF(IF Shr(tmp,11) AND 1 THEN '{d\d:' ELSE '{\d:',Shr(tmp,6) AND 31)
  840.     PrintF(IF Shr(tmp,5) AND 1 THEN 'd\d}' ELSE '\d}',IF tmp2 THEN tmp2 ELSE 32)
  841.  
  842.     IF (subfield < 7) AND (subfield AND 1) THEN PrintF(',d\d',Shr(tmp,12) AND 7)
  843.  
  844.     PutStr('\n')
  845.   ELSE
  846.     PrintF('\s\c',ListItem(['as','ls','rox','ro'],IF seven2six=3 THEN eleven2nine ELSE five2three AND 3),IF eight=1 THEN "l" ELSE "r")
  847.     IF seven2six = 3
  848.       PutStr('\t')
  849.       ea(five2three,two2zero,0)
  850.       PutStr('\n')
  851.     ELSE
  852.       PrintF(IF five2three AND 4 THEN '.\c\td\d,d\d\n' ELSE '\c\t#\d,d\d\n',opsize(seven2six),eleven2nine,two2zero)
  853.     ENDIF
  854.   ENDIF
  855. ENDPROC
  856.  
  857. PROC code()
  858.   DEF number
  859.  
  860.   isize:=2
  861.   number:=Shl(o[],2)+Any(o)+4
  862.   pc:=Any(o)+4
  863.  
  864.   PutStr('\n')
  865.  
  866.   WHILE (pc < number)
  867.     hibyte:=Shr(Char(pc),4)
  868.     eleven2nine:=Shr(Char(pc),1) AND 7
  869.     eight:=Char(pc) AND 1
  870.     seven2six:=Shr(Char(Any(pc)+1),6) AND 3
  871.     five2three:=Shr(Char(Any(pc)+1),3) AND 7
  872.     two2zero:=Char(Any(pc)+1) AND 7
  873.  
  874.     IF CtrlC() THEN error(ER_BREAK)             /* essential! */
  875.  
  876.     PrintF('L\z\h[8]:',Any(pc)-Any(o)-4)                  /* for offsets */
  877.  
  878.     PutStr('\t')
  879.  
  880.     IF (hibyte > 0) AND (hibyte < 4)
  881.       PutStr(IF (eight=0) AND (seven2six=1) THEN 'movea.' ELSE 'move.')
  882.       SELECT hibyte
  883.         CASE 1; PutStr('b')
  884.         CASE 2; PutStr('l'); isize:=4
  885.         CASE 3; PutStr('w')
  886.       ENDSELECT
  887.       PutStr('\t')
  888.       ea(five2three,two2zero,1)
  889.       PutStr(',')
  890.       ea(Shl(eight,2)+seven2six,eleven2nine,0)
  891.       PutStr('\n')
  892.       isize:=2
  893.     ELSE
  894.       SELECT hibyte
  895.         CASE 0;                 /* Bit Manipulation/MOVEP/immediate */
  896.           code0000()
  897.         CASE 4;                 /* Miscellaneous */
  898.           code0100()
  899.         CASE 5;                 /* ADDQ/SUBQ/Scc/DBcc/TRAPcc */
  900.           code0101()
  901.         CASE 6;                 /* Bcc/BSR/BRA/MOVEC */
  902.           code0110()
  903.         CASE 7;                 /* MOVEQ */
  904.           PutStr('moveq\t#')
  905.           immed(Char(Any(pc)+1))
  906.           PrintF(',d\d\n',eleven2nine)
  907.         CASE 8;                 /* OR/DIV/SBCD */
  908.           code1000()
  909.         CASE 9;                 /* SUB/SUBA/SUBX */
  910.           code1001()
  911.         CASE 10;                /* (unassigned, reserved) */
  912.           illegal()
  913.         CASE 11;                /* CMP/EOR */
  914.           code1011()
  915.         CASE 12;                /* AND/MUL/ABCD/EXG */
  916.           code1100()
  917.         CASE 13;                /* ADD/ADDX */
  918.           code1101()
  919.         CASE 14;                /* Shift/Rotate/Bit Field */
  920.           code1110()
  921.         CASE 15;                /* Coprocessor Interface */
  922.           illegal()
  923.       ENDSELECT
  924.     ENDIF
  925.     pc++
  926.   ENDWHILE
  927.  
  928.   PutStr('\n')
  929.  
  930.   o:=number
  931. ENDPROC
  932.  
  933.