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

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