OpenCores
URL https://opencores.org/ocsvn/ao68000/ao68000/trunk

Subversion Repositories ao68000

[/] [ao68000/] [trunk/] [doc/] [doxygen/] [html/] [page_old_notes.html] - Rev 17

Compare with Previous | Blame | View Log

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>ao68000: Old ao68000 notes</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.2 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Design&#160;Unit&#160;List</span></a></li>
      <li><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div class="navpath">
    <ul>
      <li><a class="el" href="index.html">index</a>      </li>
    </ul>
  </div>
</div>
<div class="header">
  <div class="headertitle">
<h1>Old <a class="el" href="classao68000.html" title="ao68000 top level module.">ao68000</a> notes </h1>  </div>
</div>
<div class="contents">
<div class="fragment"><pre class="fragment">*******************************************************************************************************************************************
NOTE: The information bellow is not current. It is here only for historical reasons.
*******************************************************************************************************************************************
 
if( ir[15:12] == 4'b0000 &amp;&amp; ir[8] == 1'b0 &amp;&amp; ir[11:9] != 3'b100 &amp;&amp; ir[11:9] != 3'b110 &amp;&amp;
    ir[15:0] != 16'b0000_000_0_00_111100 &amp;&amp; ir[15:0] != 16'b0000_000_0_01_111100 &amp;&amp;
    ir[15:0] != 16'b0000_001_0_00_111100 &amp;&amp; ir[15:0] != 16'b0000_001_0_01_111100 &amp;&amp;
    ir[15:0] != 16'b0000_101_0_00_111100 &amp;&amp; ir[15:0] != 16'b0000_101_0_01_111100
)
    ANDI,EORI,ORI,ADDI,SUBI
+++
    if( ir[7:6] == 2'b00 ) load ir1[7:0] to operand1[7:0]
    else if( ir[7:6] == 2'b01 ) load ir1[15:0] to operand1[15:0]
    else if( ir[7:6] == 2'b10 ) load { ir1, ir2 } to operand1[31:0]
 
    move operand1 to operand2
 
    operation size:
    if( ir[7:6] == 2'b00 ) byte
    else if( ir[7:6] == 2'b01 ) word
    else if( ir[7:6] == 2'b10 ) long
 
    load (ea) from ir[5:0] to operand1: data alter
                                Dn 000,                 (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001
 
    perform ALU operation:
        if( ir[11:9] == 3'b000 ) OR
        else if( ir[11:9] == 3'b001 ) AND
        else if( ir[11:9] == 3'b010 ) SUB
        else if( ir[11:9] == 3'b011 ) ADD
        else if( ir[11:9] == 3'b101 ) EOR
 
    update CCR:
        ANDI,EORI,ORI:    X not affected; C cleared; V cleared; Z set if zero else clear; N set if MSB set else cleared
        ADDI,SUBI: same as ADD: X=C set if carry[borrow] generated else cleared; V set if overflow else cleared; Z set if result zero else cleared;
            N set if result negative else cleared
 
    save result to (ea) from ir[5:0]
 
    update PC
 
if( ir[15:0] == 16'b0000_000_0_00_111100 || ir[15:0] == 16'b0000_000_0_01_111100 ||
    ir[15:0] == 16'b0000_001_0_00_111100 || ir[15:0] == 16'b0000_001_0_01_111100 ||
    ir[15:0] == 16'b0000_101_0_00_111100 || ir[15:0] == 16'b0000_101_0_01_111100
)
    ORI to CCR,ORI to SR,ANDI to CCR,ANDI to SR,EORI to CCR,EORI to SR
+++
    if( ir[7:6] == 2'b00 ) load ir1[7:0] to operand1[7:0]
    else if( ir[7:6] == 2'b01 ) load ir1[15:0] to operand1[15:0]
    else if( ir[7:6] == 2'b10 ) load { ir1, ir2 } to operand1[31:0]
 
    move operand1 to operand2
 
    operation size:
    if( ir[7:6] == 2'b00 ) byte
    else if( ir[7:6] == 2'b01 ) word
    else if( ir[7:6] == 2'b10 ) long
 
    move SR to operand1
 
    perform ALU operation:
        if( ir[11:9] == 3'b000 ) OR
        else if( ir[11:9] == 3'b001 ) AND
        else if( ir[11:9] == 3'b101 ) EOR
 
    move result to operand1
 
    save operand1 to CCR/SR
 
    update CCR:
        result
 
    update PC
 
if( ir[15:12] == 4'b0000 &amp;&amp; ir[8] == 1'b0 &amp;&amp; ir[11:9] = 3'b110 )
    CMPI
+++
    if( ir[7:6] == 2'b00 ) load ir1[7:0] to operand2[7:0]
    else if( ir[7:6] == 2'b01 ) load ir1[15:0] to operand2[15:0]
    else if( ir[7:6] == 2'b10 ) load { ir1, ir2 } to operand2[31:0]
 
    operation size:
    if( ir[7:6] == 2'b00 ) byte
    else if( ir[7:6] == 2'b01 ) word
    else if( ir[7:6] == 2'b10 ) long
 
    load (ea) from ir[5:0] to operand1: data alter
                                Dn 000,                 (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001
 
    perform ALU operation:
        if( ir[11:9] == 3'b110 ) CMP=SUB
 
    update CCR:
        CMPI: same as CMP: X not affected; C set if borrow else cleared; V set if overflow else cleared; Z set if zero else cleared;
            N set if negative else cleared
 
    update PC
 
if( ir[15:12] == 4'b0000 &amp;&amp; ir[11:8] == 4'b1000 &amp;&amp; ir[7:6] != 2'b00 )
    BCHG,BCLR,BSET immediate
+++
    load ir1[7:0] to operand1[7:0]
 
    move operand1 to operand2
 
    load (ea) form ir[5:0] to operand1: data alter
        data alter:                Dn 000,                 (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001
 
    operation size:
    if( ir[5:3] == 3'b000 ) long
    else if( ir[5:3] != 3'b000 ) byte
 
    perform bit operation:
    test( &lt;number&gt; of Destination ) -&gt; Z; test( &lt;number&gt; of Destination )[0][1] -&gt; &lt;bit number&gt; of Destination
    if( ir[7:6] == 2'b01 ) BCHG
    else if( ir[7:6] == 2'b10 ) BCLR
    else if( ir[7:6] == 2'b11 ) BSET
 
    update CCR: X,N,V,C not affected; Z set if bit tested is zero else cleared
 
    save result to (ea) form ir[5:0]
 
    update PC
 
if( ir[15:12] == 4'b0000 &amp;&amp; ir[11:8] == 4'b1000 &amp;&amp; ir[7:6] == 2'b00 )
    BTST immediate
+++
    load ir1[7:0] to operand1[7:0]
 
    move operand1 to operand2
 
    load (ea) form ir[5:0] to operand1: data address
        data address:            Dn 000,                    (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,                (d16, PC) 111 010, (d8, PC, Xn) 111 011
 
    operation size:
    if( ir[5:3] == 3'b000 ) long
    else if( ir[5:3] != 3'b000 ) byte
 
    perform bit operation:
    test( &lt;number&gt; of Destination ) -&gt; Z
    if( ir[7:6] == 2'b00 ) BTST
 
    update CCR: X,N,V,C not affected; Z set if bit tested is zero else cleared
 
    update PC
 
if( ir[15:12] == 4'b0000 &amp;&amp; ir[8] == 1'b1 &amp;&amp; ir[5:3] != 3'b001 &amp;&amp; ir[8:6] != 3'b100 )
    BCHG,BCLR,BSET register
+++
    load (ea) from ir[11:9] to operand1[7:0]: Dn
 
    move operand1 to operand2
 
    load (ea) form ir[5:0] to operand1: data alter
        data alter:                Dn 000,                 (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001
 
    operation size:
    if( ir[5:3] == 3'b000 ) long
    else if( ir[5:3] != 3'b000 ) byte
 
    perform bit operation:
    test( &lt;number&gt; of Destination ) -&gt; Z; test( &lt;number&gt; of Destination )[0][1] -&gt; &lt;bit number&gt; of Destination
    if( ir[7:6] == 2'b01 ) BCHG
    else if( ir[7:6] == 2'b10 ) BCLR
    else if( ir[7:6] == 2'b11 ) BSET
 
    update CCR: X,N,V,C not affected; Z set if bit tested is zero else cleared
 
    save result to (ea) form ir[5:0]
 
    update PC
 
if( ir[15:12] == 4'b0000 &amp;&amp; ir[8] == 1'b1 &amp;&amp; ir[5:3] != 3'b001 &amp;&amp; ir[8:6] == 3'b100 )
    BTST register
+++
    load (ea) from ir[11:9] to operand1[7:0]: Dn
 
    move operand1 to operand2
 
    load (ea) form ir[5:0] to operand1: data address
        data address:            Dn 000,                    (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,                (d16, PC) 111 010, (d8, PC, Xn) 111 011
 
    operation size:
    if( ir[5:3] == 3'b000 ) long
    else if( ir[5:3] != 3'b000 ) byte
 
    perform bit operation:
    test( &lt;number&gt; of Destination ) -&gt; Z
    if( ir[7:6] == 2'b00 ) BTST
 
    update CCR: X,N,V,C not affected; Z set if bit tested is zero else cleared
 
    update PC
 
if( ir[15:12] == 4'b0000 &amp;&amp; ir[8] == 1'b1 &amp;&amp; ir[5:3] == 3'b001 &amp;&amp; ( ir[7:6] == 2'b00 || ir[7:6] == 2'b01 ) )
    MOVEP memory to register
+++    
    operation size:
    if( ir[7:6] == 2'b00 ) word
    if( ir[7:6] == 2'b01 ) long
 
    load ea from ir[2:0] to address register: (d16, An)
 
    do
        load from (address) to operand1 register, long
        move two alternate bytes to result register
        increment ea by 4
    repeat for long
 
    save result to (ea) from ir[11:9]: Dn, word ( ir[7:6] == 2'b00 ), long ( ir[7:6] == 2'b01 )
 
    update CCR: no change
    update PC
 
if( ir[15:12] == 4'b0000 &amp;&amp; ir[8] == 1'b1 &amp;&amp; ir[5:3] == 3'b001 &amp;&amp; ( ir[7:6] == 2'b10 || ir[7:6] == 2'b11 ) )
    MOVEP register to memory
+++    
    operation size:
    if( ir[7:6] == 2'b10 ) word
    if( ir[7:6] == 2'b11 ) long
 
    load (ea) from ir[11:9] to operand1: Dn, long
 
    load ea from ir[2:0] to address register: (d16, An)
 
    do
        move two alternate bytes to result register
        save result register to (addreess), long, only selected bytes
        increment ea by 4
    repeat for long
 
    update CCR: no change
    update PC
 
if( ir[15:14] == 2'b00 &amp;&amp; ir[13:12] != 2'b00 &amp;&amp; ir[8:6] != 3'b001)
    MOVE
+++    
    size of operation: ir[13:12]: 01,11,10 byte,word,long
 
    load (ea) from ir[5:0] to operand1: all modes.
        all modes:                Dn 000,    An (word, long) 001, (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001, #data 111 100, (d16, PC) 111 010, (d8, PC, Xn) 111 011
 
    copy operand1 to result register
 
    save result to (ea) from ir[11:6]: data alter.
        data alter:                Dn 000,                 (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,
 
    CC: X not affected; C cleared; V cleared; Z set if zero else cleared; N set if negative else cleared
 
    update PC
 
if( ir[15:14] == 2'b00 &amp;&amp; (ir[13:12] == 2'b11 || ir[13:12] == 2'b10) &amp;&amp; ir[8:6] == 3'b001)
    MOVEA
+++    
    size of operation: ir[13:12]: 11,10 word,long
 
    load (ea) from ir[5:0] to operand1: all modes.
        all modes:                Dn 000,    An (word, long) 001, (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001, #data 111 100, (d16, PC) 111 010, (d8, PC, Xn) 111 011
 
    copy operand1 to result register
 
    save result to (ea) from ir[11:6]: An
 
    CC: not affected
 
    update PC
 
if( ir[15:12] == 4'b1100 &amp;&amp; (ir[8:4] == 5'b10100 || 5'b11000) )
    EXG
+++
    load (ea) from ir[5:0] to operand1: Dn, An
 
    perform ALU operation: move operand1 to result register
 
    load (ea) from ir[11:9] with mode in ir[7:3] to operand1: Dn (5'b01000 or 5'b10001), An (5'b01001)
 
    save result to (ea) from ir[11:9] with mode in ir[7:3]: Dn (5'b01000 or 5'b10001), An (5'b01001), 
 
    perform ALU operation: move operand1 to result register
 
    save result to (ea) from ir[5:0]: Dn, An
 
    CC: not affected
 
    update PC
 
if( ir[15:12] == 4'b1011 &amp;&amp; (ir[8:6] == 3'b100 || 3'b101 || 3'b110) &amp;&amp; ir[5:3] == 3'b001 )
    CMPM
+++
    load (ea) from ir[2:0] to operand1: postincrement (An)+
 
    move operand1 to operand2
 
    load (ea) from ir[11:9] to operand1: postincrement (An)+
 
    ALU operation size:
    if( ir[7:6] == 2'b00 ) byte
    else if( ir[7:6] == 2'b01 ) word
    else if( ir[7:6] == 2'b10 ) long
 
    perform ALU operation: CMPM == SUB
 
    CC: X not affected; C set if borrow else cleared; V set if overflow else cleared; Z set if zero else cleared; N set if negative else cleared
    Ax dest, Ay source: postincrement: +(An)
 
    update PC
 
if( ir[15:12] == 4'b1011 &amp;&amp; (ir[8:6] == 3'b100 || 3'b101 || 3'b110) &amp;&amp; ir[5:3] != 3'b001 )
    EOR
+++
    load (ea) from ir[11:9] to operand1: Dn
 
    move operand1 to operand2
 
    load (ea) from ir[5:0] to operand1: data alter
        data alter:                Dn 000,                 (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,
 
    ALU operation size:
    if( ir[7:6] == 2'b00 ) byte
    else if( ir[7:6] == 2'b01 ) word
    else if( ir[7:6] == 2'b10 ) long
 
    perform ALU operation: EOR
 
    CC: X not affected; C cleared; V cleared; Z set if zero else clear; N set if MSB set else cleared
 
    save result to (ea) from ir[5:0]: data alter
        data alter:                Dn 000,                 (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,
    update PC
 
if( (ir[15:12] == 4'b1101 || 4'b1001 || 4'b1100 || 4'b1000) &amp;&amp;
    (ir[8:4] == 5'b10001 || 5'b10010 || 5'b10011 || 5'b10101 || 5'b10110 || 5'b10111 || 5'b11001 || 5'b11010 || 5'b11011) )
 
    ADD to mem,SUB to mem,AND to mem,OR to mem
+++
    load (ea) from ir[11:9] to operand1: Dn
 
    move operand1 to operand2
 
    load (ea) indexed by ir[5:0] to operand1: memory alter
        memory alter:                                         (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001
 
    ALU operation size:
    if( ir[7:6] == 2'b00 ) byte
    else if( ir[7:6] == 2'b01 ) word
    else if( ir[7:6] == 2'b10 ) long
 
    perform ALU operation:
    if( ir[15:12] == 4'b1101 ) ADD
    else if( ir[15:12] == 4'b1001 ) SUB
    else if( ir[15:12] == 4'b1100 ) AND
    else if( ir[15:12] == 4'b1000 ) OR
 
    if( ADD,SUB )
        CC: X=C set if carry[borrow] generated else cleared; V set if overflow else cleared; Z set if result zero else cleared;
            N set if result negative else cleared
    else if( AND,OR )
        CC: X not affected; C cleared; V cleared; Z set if zero else clear; N set if MSB set else cleared
 
    save result to (ea) from ir[5:0]: memory alter
        memory alter:                                         (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001
 
    update PC
 
if( (ir[15:12] == 4'b1101 || 4'b1001 || 4'b1100 || 4'b1000) &amp;&amp; (ir[8:6] == 3'b000 || 3'b001 || 3'b010) )
    ADD to Dn,SUB to Dn,AND to Dn,OR to Dn
+++
    load (ea) from ir[5:0] to operand1: all modes
        all modes:                 Dn 000,    An (word, long) 001, (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001, #data 111 100, (d16, PC) 111 010, (d8, PC, Xn) 111 011
 
    move operand1 to operand2
 
    load (ea) from ir[11:9] to operand1: Dn
 
    ALU operation size:
    if( ir[7:6] == 2'b00 ) byte
    else if( ir[7:6] == 2'b01 ) word
    else if( ir[7:6] == 2'b10 ) long
 
    perform ALU operation:
    if( ir[15:12] == 4'b1101 ) ADD
    else if( ir[15:12] == 4'b1001 ) SUB
    else if( ir[15:12] == 4'b1100 ) AND
    else if( ir[15:12] == 4'b1000 ) OR
 
    if( ADD,SUB )
        CC: X=C set if carry[borrow] generated else cleared; V set if overflow else cleared; Z set if result zero else cleared;
            N set if result negative else cleared
    else if( AND,OR )
        CC: X not affected; C cleared; V cleared; Z set if zero else clear; N set if MSB set else cleared
 
    save result to (ea) from ir[11:9]: Dn
 
    update PC
 
if( (ir[15:12] == 4'b1011) &amp;&amp; (ir[8:6] == 3'b000 || 3'b001 || 3'b010) )
    CMP
+++
    load (ea) from ir[5:0] to operand1: all modes
        all modes:                 Dn 000,    An (word, long) 001, (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001, #data 111 100, (d16, PC) 111 010, (d8, PC, Xn) 111 011
 
    move operand1 to operand2
 
    load (ea) from ir[11:9] to operand1: Dn
 
    ALU operation size:
    if( ir[7:6] == 2'b00 ) byte
    else if( ir[7:6] == 2'b01 ) word
    else if( ir[7:6] == 2'b10 ) long
 
    perform ALU operation:
    if( ir[15:12] == 4'b1011 ) CMP=SUB
 
    CC: X not affected; C set if borrow else cleared; V set if overflow else cleared; Z set if zero else cleared; N set if negative else cleared
 
    update PC
 
if( (ir[15:12] == 4'b1100 || 4'b1000) &amp;&amp; ir[7:6] == 2'b11 )
    MULS,MULU,DIVS,DIVU
+++
    load (ea) from ir[5:0] to operand1: data
            data:        Dn 000,                         (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                        (xxx).W 111 000, (xxx).L 111 001, #data 111 100, (d16, PC) 111 010, (d8, PC, Xn) 111 011
 
    move operand1 to operand2
 
    load (ea) from ir[11:9] to operand1: Dn
 
    perform ALU operation:
    if( ir[15:12] == 4'b1100 &amp;&amp; ir[8] == 1'b0 ) MULU
    else if( ir[15:12] == 4'b1100 &amp;&amp; ir[8] == 1'b1 ) MULS
    else if( ir[15:12] == 4'b1000 &amp;&amp; ir[8] == 1'b0 ) DIVU
    else if( ir[15:12] == 4'b1000 &amp;&amp; ir[8] == 1'b1 ) DIVS
 
    if( MULU/MULS )
        CC: X not affected; C cleared; V cleared; Z set if zero else cleared; N set if negative else cleared
    else if( DIVU/DIVS )
        CC: X not affected; C cleared; V set if overflow else if trap undefined else cleared;
            Z set if quotient zero else if trap or overflow undefined else cleared;
            N set if quotient negative else if trap or overflow undefined else cleared; 
 
    save result to (ea) from ir[11:9]: Dn
 
    update PC
 
if( (ir[15:12] == 4'b1101 || 4'b1001) &amp;&amp; (ir[8:6] == 3'b011 || 3'b111) )
    ADDA,SUBA
+++    
    load (ea) from ir[5:0] to operand1: all modes
        all modes:                Dn 000,    An (word, long) 001, (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001, #data 111 100, (d16, PC) 111 010, (d8, PC, Xn) 111 011
 
    move operand1 to operand2
 
    load (ea) from ir[11:9] to operand1: An
 
    ALU operation size, source is sign-extended:
    if( ir[8] == 1'b0 ) word
    else if( ir[8] == 1'b1 ) long
 
    perform ALU operation:
    if( ir[14:12] == 3'b101 ) ADD
    else if( ir[14:12] == 3'b001 ) SUB
 
    CC: not affected
 
    save result sign-extended to (ea) from ir[11:9]: An
 
    update PC 
 
if( (ir[15:12] == 4'b1011) &amp;&amp; (ir[8:6] == 3'b011 || 3'b111) )
    CMPA
+++
    load (ea) from ir[5:0] to operand1: all modes
        all modes:                Dn 000,    An (word, long) 001, (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001, #data 111 100, (d16, PC) 111 010, (d8, PC, Xn) 111 011
 
    move operand1 to operand2
 
    load (ea) from ir[11:9] to operand1: An
 
    ALU operation size, source is sign-extended:
    if( ir[8] == 1'b0 ) word
    else if( ir[8] == 1'b1 ) long
 
    perform ALU operation:
    if( ir[14:12] == 3'b011 ) CMP==SUB
 
    CC: X not affected; C set if borrow else cleared; V set if overflow else cleared; Z set if zero else cleared; N set if negative else cleared
 
    update PC 
 
if( ((ir[15:12] == 4'b1100 || 4'b1000) &amp;&amp; ir[8:4] == 5'b10000) || ((if[15:12] == 4'b1101 || 4'b1001) &amp;&amp; (ir[8:4] == 5'b10000 || 5'b10100 || 5'b11000) )
    ABCD,SBCD,ADDX,SUBX
+++    
    load (ea) from ir[2:0] to operand1: Dn (ir[3] == 1'b0), -(An) (ir[3] == 1'b1)
 
    move operand1 to operand2
 
    load (ea) from ir[11:9] to operand1: Dn (ir[3] == 1'b0), -(An) (ir[3] == 1'b1)
 
 
    ALU operation size:
    if( ir[7:6] == 2'b00 ) byte
    else if( ir[7:6] == 2'b01 ) word
    else if( ir[7:6] == 2'b10 ) long
 
    perform ALU operation:
    if( ir[14:12] == 3'b100 ) ABCD
    else if( ir[14:12] == 3'b000 ) SBCD
    else if( ir[14:12] == 3'b101 ) ADDX
    else if( ir[14:12] == 3'b001 ) SUBX
 
    if( ir[12] == 1'b0 /ABCD,SBCD/ )
        CC: X=C set if decimal carry [borrow] else cleared; Z cleared if result nonzero else unchanged; N,V undefined
    else
        CC: X=C set if carry[borrow] else cleared; V set if overflow else cleared; Z cleared if nonzero else unchanged; N set if negative else cleared
 
    save result to (ea) from ir[11:9]: Dn (ir[3] == 1'b0), -(An) (ir[3] == 1'b1)
 
    update PC
 
if( ir[15:12] == 4'b1110 &amp;&amp; ir[7:6] == 2'b11 &amp;&amp; ir[11] == 1'b0 ) 
    ASL,LSL,ROL,ROXL,ASR,LSR,ROR,ROXR all memory
+++    
    load (ea) from ir[5:0] to operand1: memory alter
        memory alter:                                         (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001
    load 1'b1 to operand2
 
    ALU operation size: word
 
    ALU shift/rotate direction:
    if( ir[8] == 1'b0 ) right
    else if( ir[8] == 1'b1 ) left
 
    perform ALU operation:
    if( ir[10:9] == 2'b00 ) ASL/ASR
    else if( ir[10:9] == 2'b01 ) LSL,LSR
    else if( ir[10:9] == 2'b11 ) ROL,ROR
    else if( ir[10:9] == 2'b10 ) ROXL,ROXR
 
    CC: X set to last bit, unchanged if zero shift[same][not affected][same set]; N set if MSB bit is set else cleared; Z set if zero else cleared;
        V set if MSB bit changed during shift else cleared[cleared][cleared][cleared]; C set to last bit, cleared if zero shift[same][same][set to X]
 
    save result to (ea) from ir[5:0]: memory alter
        memory alter:                                         (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001
    update PC
 
if( ir[15:12] == 4'b1110 &amp;&amp; (ir[7:6] == 2'b00 || 2'b01 || 2'b10) )
    ASL,LSL,ROL,ROXL,ASR,LSR,ROR,ROXR all immediate/register
+++
    load (ea) from ir[11:9] to operand1: Dn
 
    move operand1 to operand2
 
    load (ea) from ir[2:0] to operand1: Dn
 
    if( ir[5] == 1'b0 )
        if( ir[11:9] == 3'b000 ) load 4'b1000 to operand2
        else load ir[11:9] to operand2
    else if( ir[5] == 1'b1 )
        perform operand2 modulo 64
 
    ALU operation size:
    if( ir[7:6] == 2'b00 ) byte
    else if( ir[7:6] == 2'b01 ) word
    else if( ir[7:6] == 2'b10 ) long
 
    ALU shift/rotate direction:
    if( ir[8] == 1'b0 ) right
    else if( ir[8] == 1'b1 ) left
 
    perform ALU operation:
    if( ir[4:3] == 2'b00 ) ASL/ASR
    else if( ir[4:3] == 2'b01 ) LSL,LSR
    else if( ir[4:3] == 2'b11 ) ROL,ROR
    else if( ir[4:3] == 2'b10 ) ROXL,ROXR
 
    CC: X set to last bit, unchanged if zero shift[same][not affected][same set]; N set if MSB bit is set else cleared; Z set if zero else cleared;
        V set if MSB bit changed during shift else cleared[cleared][cleared][cleared]; C set to last bit, cleared if zero shift[same][same][set to X]
 
    save result to (ea) from ir[2:0]: Dn
 
    update PC
 
if( ir[15:12] == 4'b0111 &amp;&amp; ir[8] == 1'b0 )
    MOVEQ
+++
    load ir[7:0] sign-extended to result register
 
    CC: X not affected; C cleared; V cleared; Z set if zero else cleared; N set if negative else cleared
 
    save result to (ea) from ir[11:9]: Dn
 
    update PC
 
if( ir[15:12] == 4'b0110 &amp;&amp; ir[11:8] == 4'b0001 )
    BSR
+++
    CC: not affected
 
    SP -= 4
 
    move PC to operand1
    move operand1 to result
 
    save result to (ea): (SP)
 
    if( ir[7:0] == 8'b0 )
        add to PC: ir1[15:0]
    else
        add to PC: ir[7:0]
 
    return
 
if( ir[15:12] == 4'b0110 &amp;&amp; ir[11:8] != 4'b0001 )
    Bcc,BRA
+++
    condition:                               high(!C &amp; !Z) 0010, low or same(C | V) 0011,
                carry clear(!C) 0100, carry set(C) 0101, not equal(Z) 0110, equal(!Z) 0111,
                overflow clear(!V) 1000, overflow set(V) 1001, plus(!N) 1010, minus(N) 1011,
                greater or equal(N &amp; V | !N &amp; !V) 1100, less than(N &amp; !V | !N &amp; V) 1101,
                greater than(N &amp; V &amp; !Z | !N &amp; !V &amp; !Z) 1110, less or equal(Z | N &amp; !V | !N &amp; V) 1111
 
    CC: not affected
 
    if( contidtion on ir[11:8] true )
        if( ir[7:0] == 8'b0 )
            add to PC: ir1[15:0]
        else
            add to PC: ir[7:0]
 
        return
 
    update PC
 
if( ir[15:12] == 4'b0101 &amp;&amp; ir[7:6] == 2'b11 &amp;&amp; ir[5:3] != 2'b001 )
    Scc
+++
    condition:    true(1) 0000, false(0) 0001, high(!C &amp; !Z) 0010, low or same(C | V) 0011,
                carry clear(!C) 0100, carry set(C) 0101, not equal(Z) 0110, equal(!Z) 0111,
                overflow clear(!V) 1000, overflow set(V) 1001, plus(!N) 1010, minus(N) 1011,
                greater or equal(N &amp; V | !N &amp; !V) 1100, less than(N &amp; !V | !N &amp; V),
                greater than(N &amp; V &amp; !Z | !N &amp; !V &amp; !Z), less or equal(Z | N &amp; !V | !N &amp; V) 1111
 
    if( contidtion on ir[11:8] false )
        load 8'b00000000 to result
    else
        load 8'b11111111 to result
 
    operation size: byte    
 
    save result to (ea) from ir[5:0]: data alter.
        data alter:                Dn 000,                 (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,
    CC: not affected
 
    update PC
 
if( ir[15:12] == 4'b0101 &amp;&amp; ir[7:6] == 2'b11 &amp;&amp; ir[5:3] == 2'b001 )
    DBcc
+++
    condition:    true(1) 0000, false(0) 0001, high(!C &amp; !Z) 0010, low or same(C | V) 0011,
                carry clear(!C) 0100, carry set(C) 0101, not equal(Z) 0110, equal(!Z) 0111,
                overflow clear(!V) 1000, overflow set(V) 1001, plus(!N) 1010, minus(N) 1011,
                greater or equal(N &amp; V | !N &amp; !V) 1100, less than(N &amp; !V | !N &amp; V),
                greater than(N &amp; V &amp; !Z | !N &amp; !V &amp; !Z), less or equal(Z | N &amp; !V | !N &amp; V) 1111
 
    CC: not affected
 
    if( condition on ir[11:8] false )
        load (ea) from ir[2:0] to operand1: Dn
 
        load 1'b1 to operand2
 
        ALU operation size: word
 
        perform ALU operation: SUB
 
        save result to (ea) from ir[2:0]: Dn
 
        if( result != -1 )
            add to PC: ir1[15:0]
            return
 
    update PC
 
if( ir[15:12] == 4'b0101 &amp;&amp; ir[7:6] != 2'b11 &amp;&amp; ir[5:3] != 3'b001 )
    ADDQ,SUBQ not An
+++
    if( ir[11:9] == 3'b000 )
        load 4'b1000 to operand2
    else
        load ir[11:9] to operand2
 
    load (ea) from by ir[5:0] to operand1: data alter
        data alter:                Dn 000,         (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,
 
    ALU operation size:
    if( ir[7:6] == 2'b10 ) long
    else if( ir[7:6] == 2'b01 ) word
    else if( ir[7:6] == 2'b00 ) byte
 
    perform ALU operation:
    if( ir[8] == 1'b0 ) ADDQ
    else if( ir[8] == 1'b1 ) SUBQ
 
    CC: X=C set if carry[borrow] generated else cleared; V set if overflow else cleared; Z set if result zero else cleared;
        N set if result negative else cleared
 
    save result to (ea) from ir[5:0]
 
    update PC
 
if( ir[15:12] == 4'b0101 &amp;&amp; ir[7:6] != 2'b11 &amp;&amp; ir[5:3] == 3'b001)
    ADDQ,SUBQ An
+++
    if( ir[11:9] == 3'b000 )
        load 4'b1000 to operand2
    else
        load ir[11:9] to operand2
 
    load (ea) from by ir[2:0] to operand1: An
 
    ALU operation size: long
 
    perform ALU operation:
    if( ir[8] == 1'b0 ) ADD
    else if( ir[8] == 1'b1 ) SUB
 
    CC: not affected
 
    save result to (ea) from ir[2:0]: An
 
    update PC
 
if( ir[15:0] == 16'b0100 1110 0111 0001 )
    NOP
+++
    CC: not affected
 
    update PC
 
if( ir[15:0] == 16'b0100 1110 0111 0000 )
    RESET
+++
    hold REST output for 124 clock cycles
 
    CC: not affected
 
    update PC
 
if( ir[15:0] == 16'b0100 1110 0111 0010 )
    STOP
+++
    copy ir1[15:0] to SR
 
    Resume when trace, interrupt or rest.
 
if( ir[15:5] == 12'b0100 1110 0100 )
    TRAP
+++
    TRAP with vector indexed by ir[3:0]
 
    CC: not affected
 
if( ir[15:0] == 16'b0100 1110 0111 0110 )
    TRAPV
+++
    if( V ) TRAP
 
    CC: not affected
 
    update PC
 
if( ir[15:0] == 16'b0100 1110 0111 0011 || ir[15:0] == 16'b0100 1110 0111 0111 )
    RTE,RTR
+++
    load (ea) to operand1: (SP)
 
    perform ALU operation:
    if(ir[2] == 1'b0) move operand1 to SR
    else if(ir[2] == 1'b1) move operand1 to CCR
 
    SP += 2
 
    load (ea) to operand1: (SP)
    move operand1 to result
    move result to PC
 
    SP += 4
 
if( ir[15:0] == 16'b0100 1110 0111 0101 )
    RTS
+++
    load (ea) to operand1: (SP)
    move operand1 to result
    move result to PC
 
    SP += 4
 
if( ir[15:6] == 10'b0100 1110 11 )
    JMP
+++
    load (ea) from ir[5:0] to operand1: control
        control:                                         (An) 010,                       (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,         (d16, PC) 111 010, (d8, PC, Xn) 111 011
 
    perform ALU operation: move operand1 to result
 
    copy result register to PC
 
    CC: not affected
 
if( ir[15:6] == 10'b0100 1110 10 )
    JSR
+++
    SP -= 4
 
    move PC to operand1
    move operand1 to result
    save result to (ea): (SP)
 
    load (ea) from ir[5:0] to operand1: control
        control:                                         (An) 010,                       (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,         (d16, PC) 111 010, (d8, PC, Xn) 111 011
 
    perform ALU operation: move operand1 to result
 
    copy result register to PC
 
    CC: not affected
 
if( ir[15:3] == 13'b0100 1110 0101 0 )
    LINK
+++
    SP -= 4
 
    load (ea) from ir[2:0] to operand1: An
 
    perform ALU operation: move operand1 to result
 
    save result to (ea): (SP)
 
    load (ea) to operand1: SP
    move operand1 to result
 
    save result to (ea) from ir[2:0]: An
 
    add to SP: ir1[15:0]
 
    CC: not affected
 
    update PC
 
if( ir[15:3] == 13'b0100 1110 0101 1 )
    ULNK
+++
    load (ea) from ir[2:0] to operand1: An
 
    perform ALU operation: move operand1 to result
 
    save result to (ea): SP
 
    load ea to operand1: (SP)
    move operand1 to result
 
    save result to (ea) from ir[2:0]: An
 
    SP += 4
 
    CC: not affected
 
    update PC
 
if( ir[15:8] == 8'b0100 1010 &amp;&amp; ir[7:6] != 2'b11 )
    TST
+++
    ea operation size:
    if( ir[7:6] == 2'b00 ) byte
    else if( ir[7:6] == 2'b01 ) word
    else if( ir[7:6] == 2'b10 ) long
 
    load (ea) from ir[5:0] to operand1: data alter
        data alter:                Dn 000,                 (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,
 
    perform ALU TST operation: set CC
 
    CC: X not affected; C cleared; V cleared; Z set if zero else cleared; N set if MSB bit set else cleared
 
    update PC
 
if( ir[15:6] == 10'b0100 1010 11 &amp;&amp; ir[5:0] != 6'b111000 )
    TAS
+++    
    ea operation size: byte
 
    enable READ-MODIFY-WRITE bus cycle
 
    load (ea) from ir[5:0] to operand1: data alter
        data alter:                Dn 000,                 (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,
 
    perform ALU TAS operation: set bit 7 in result register
 
    CC: X not affected; C cleared; V cleared; Z set if zero else cleared; N set if MSB bit set else cleared
 
    save result to (ea) from ir[5:0]: data alter
 
    disable READ-MODIFY-WRITE bus cycle
 
    update PC    
 
if( ir[15:12] == 4'b0100 &amp;&amp; ir[8:6] == 3'b110 )
    CHK
+++
    load (ea) from ir[5:0] to operand1: data
        data:                     Dn 000,                         (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001, #data 111 100, (d16, PC) 111 010, (d8, PC, Xn) 111 011
 
    move operand1 to operand2
 
    load (ea) from ir[11:9] to operand1: Dn
 
 
    ALU operation size: word
 
    perform ALU CHK operation: operand1 &lt; 0 or operand1 - operand2 &gt; 0
 
    CC: X not affected; N set if operand1 &lt; 0; cleared if operand1 - operand2 &gt; 0 else undefined; C,V,Z udefined
 
    if( ALU check ) trap CHK
 
    update PC
 
if( ir[15:12] == 4'b0100 &amp;&amp; ir[8:6] == 3'b111 )
    LEA
+++    
    load ea from ir[5:0] to address register: control
        control:                                     (An) 010,                       (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,         (d16, PC) 111 010, (d8, PC, Xn) 111 011
 
    move address register to operand1
    perform ALU operation: move operand1 to result register
 
    save result to (ea) from ir[11:9]: An
 
    CC: not affected
 
    update PC
 
if( ir[15:6] == 10'b0100 1000 01 &amp;&amp; ir[5:3] != 3'b000 )
    PEA
+++    
    load ea from ir[5:0] to address register: control
        control:                                     (An) 010,                       (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,         (d16, PC) 111 010, (d8, PC, Xn) 111 011
 
    SP -= 4
 
    move address register to operand1
    move operand1 to result
 
    save result to (ea): (SP)
 
    CC: not affected
 
    update PC
 
if( ir[15:6] == 10'b0100 0100 11 || ir[15:6] == 10'b0100 0110 11 )
    MOVE TO CCR, MOVE TO SR
+++
    ea operation size: word
 
    load (ea) from ir[5:0] to operand1: data
        data:                    Dn 000,                         (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001, #data 111 100, (d16, PC) 111 010, (d8, PC, Xn) 111 011
 
    if( ir[11:8] == 4'b0110 /MOVE TO SR/ )
        copy word form operand1 register to SR
    else
        copy lower byte form operand1 register to CCR
 
    update PC
 
if( ir[15:6] == 10'b0100 0000 11 )
    MOVE FROM SR
+++
    copy SR register to result register
 
    ea operation size: word
 
    save result to (ea) from ir[5:0]: data alter
        data alter:            Dn 000,                 (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                            (xxx).W 111 000, (xxx).L 111 001,
 
    CC: not affected
 
    update PC
 
if( ir[15:3] == 12'b0100 1110 0110 0 )
    MOVE USP to USP
+++
    load (ea) from ir[2:0] to operand1: An
 
    perform ALU operation: move operand1 to result
 
    move result to USP
 
    CC: not affected
 
    update PC
 
if( ir[15:3] == 13'b0100 1110 0110 1 )
    MOVE USP to An
+++
    move USP to operand1
 
    perform ALU operation: move operand1 to result
 
    save result to (ea) from ir[2:0]: An
 
    CC: not affected
 
    update PC
 
if( ir[15:12] == 4'b0100 &amp;&amp; ( (ir[11:8] == 4'b0000 &amp;&amp; ir[7:6] != 2'b11) || (ir[11:8] == 4'b0010) || (ir[11:8] == 4'b0100 &amp;&amp; ir[7:6] != 2'b11) ||
    (ir[11:8] == 4'b0110 &amp;&amp; ir[7:6] != 2'b11) || (ir[11:6] == 6'b1000 00) ) )
+++
    NEGX,CLR,NEG,NOT,NBCD
 
    load (ea) from ir[5:0] to operand1: data alter
    data alter:                    Dn 000,                 (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001
 
    ALU operation size:
    NEGX:    ir[7:6]: 00,01,10 byte,word,long
    CLR:    ir[7:6]: 00,01,10 byte,word,long
    NEG:    ir[7:6]: 00,01,10 byte,word,long
    NOT:    ir[7:6]: 00,01,10 byte,word,long
    NBCD:    ir[7:6]: 00 byte
 
    perform ALU operation:
    NEGX:    ir[11:8] == 4'b0000
    CLR:    ir[11:8] == 4'b0010
    NEG:    ir[11:8] == 4'b0100
    NOT:    ir[11:8] == 4'b0110
    NBCD:    ir[11:6] == 6'b1000 00
 
    CC:
    NEGX:    X=C set if borrow else clear; V set if overflow else clear; Z cleared if nonzero else unchanged; N set if negative else clear
    CLR:    X not affected; C cleared; V cleared; Z set; N cleared
    NEG:    X=C clear if zero else set; V set if overflow else clear; Z set if zero else clear; N set if negative else clear
    NOT:    X not affected; C cleared; V cleared; Z set if zero else cleared; N set if negative else cleared
    NBCD:    X=C set if decimal borrow else cleared; Z cleared if nonzero else unchanged; N,V undefined
 
    save result to (ea) from ir[5:0]: data alter
 
    update PC
 
if( ir[15:12] == 4'b0100 &amp;&amp; (ir[11:3] == 9'b1000 01 000 || (ir[11:7] == 5'b1000 1 &amp;&amp; ir[5:3] == 3'b000) )
    SWAP,EXT
+++
    load (ea) from ir[5:0] to operand1: Dn
 
    ALU operation size: word
    SWAP:     ir[7:6]: 01 long
    EXT:    ir[7:6]: 10,11 byte to word, word to long
 
    perform ALU operation:
    SWAP:     ir[11:6] == 6'b1000 01
    EXT:    ir[11:7] == 5'b1000 1
 
    CC:
    SWAP:    X not affected; C cleared; V cleared; Z set if 32 bits are zero else cleared; N set if result MSB set else cleared
    EXT:    X not affected; C cleared; V cleared; Z set if zero else cleared; N set if negative else cleared
 
    save result to (ea) from ir[5:0]: Dn
 
    update PC
 
if( ir[15:7] == 9'b0100 1100 1 &amp;&amp; ir[5:3] != 3'b000 )
    MOVEM memory to register
+++
    operation size:
    if( ir[6] == 1'b0 ) word
    else if ir[6] == 1'b1 ) long
 
    load ea from ir[5:0] to address register: control or postincrement
                                                (An) 010, (An)+ 011,            (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,                (d16, PC) 111 010, (d8, PC, Xn) 111 011
 
    register selection order: D0,D1,...D7,A0,A1,...,A7
 
    do
        if( ir1[0] == 1'b1 ) 
            read from (ea) to operand1
 
            perform ALU operation: move operand1 with sign-extension to result
 
            save result to selected register
 
            update address register
 
        shift ir1
    loop 16 times
 
    if( ir[5:3] == 3'b011 ) save address register back to An indexed by ir[2:0]
 
    CC: not affected
 
    update PC
 
if( ir[15:7] == 9'b0100 1000 1 &amp;&amp; ir[5:3] == 3'b100 )
    MOVEM register to memory, predecrement
+++    
    operation size:
    if( ir[6] == 1'b0 ) word
    else if ir[6] == 1'b1 ) long
 
    load ea from ir[5:0] to address register: control alter or predecrement
                                        (An) 010,            -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,
 
    register selection order: A7,A6,..A0,D7,D6,....D0
 
    do
        if( ir1[0] == 1'b1 ) 
            save selected register to operand1
 
            perform ALU operation: move operand1 to result
 
            save result to (ea)
 
            update address register
 
        shift ir1
    loop 16 times
 
    if( ir[5:3] == 3'b100 ) save address register back to An indexed by ir[2:0]
 
    CC: not affected
 
    update PC
 
if( ir[15:7] == 9'b0100 1000 1 &amp;&amp; ir[5:3] != 3'b000 &amp;&amp; ir[5:3] != 3b100 )
    MOVEM register to memory, control
+++    
    operation size:
    if( ir[6] == 1'b0 ) word
    else if ir[6] == 1'b1 ) long
 
    load ea from ir[5:0] to address register: control alter or predecrement
                                        (An) 010,            -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,
 
    register selection order: D0,D1,...D7,A0,A1,...,A7
 
    do
        if( ir1[0] == 1'b1 ) 
            save selected register to operand1
 
            perform ALU operation: move operand1 to result
 
            save result to (ea)
 
            update address register
 
        shift ir1
    loop 16 times
 
    CC: not affected
 
    update PC
 
*/
 
/*
 
&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;
microinstructions
 
MOVE_ea_reg_TO_An_address
MOVE_ea_reg_TO_Dn_address
MOVE_ir1_brief_ext_TO_An_Dn_addresses        // ir_valid
MOVE_An_output_TO_address
MOVE_Dn_output_TO_OP1
MOVE_An_output_TO_OP1
MOVE_zeros_TO_index
MOVE_ir1_brief_ext_TO_index                    // ir_valid
MOVE_ir1_byte_TO_offset                        // ir_valid
MOVE_ir1_word_TO_offset                        // ir_valid
MOVE_base_index_offset_TO_address
MOVE_ir1_absolute_word_TO_address            // ir_valid
MOVE_ir1_ir2_absolute_long_TO_address        // ir_valid
MOVE_pc_index_offset_TO_address
MOVE_trap_TO_address
MOVE_result_TO_An_input
MOVE_result_TO_Dn_input(size=)
MOVE_address_TO_An_input
MOVE_result_TO_data
 
MOVE_OP1_TO_OP2
MOVE_OP2_TO_OP1
MOVE_ADDR_TO_OP1
MOVE_data_TO_OP1
MOVE_immediate_TO_OP1(size=)
MOVE_result_TO_OP1
MOVE_moveq_TO_OP1
MOVE_PC_NEXT_TO_OP1
MOVE_zeros_TO_OP1
MOVE_ones_TO_OP1
MOVE_SR_TO_OP1
MOVE_USP_TO_OP1
MOVE_ir_TO_OP1
MOVE_address_bus_info_TO_OP2
MOVE_1_TO_OP2
MOVE_offset_TO_OP2
MOVE_count_TO_OP2
MOVE_addq_subq_TO_OP2
MOVE_result_TO_PC
MOVE_result_TO_USP
MOVE_zeros_TO_movem_mod_reg
MOVE_001111_TO_movem_mod_reg
MOVE_OP1_TO_movem_reg
MOVE_zeros_TO_movem_loop
MOVE_prefetch_ir_TO_ir
MOVE_interrupt_mask_TO_sr
MOVE_1_0_supervisor_trace_TO_sr
MOVE_reset_mask_TO_sr
MOVE_prefetch_ir_TO_PC
MOVE_prefetch_ir_TO_SSP
 
MOVE_illegal_instr_TO_TRAP
MOVE_divide_by_zero_TO_TRAP
MOVE_chk_TO_TRAP
MOVE_trapv_TO_TRAP
MOVE_priv_viol_TO_TRAP
MOVE_trap_TO_TRAP
MOVE_decoder_trap_TO_TRAP
MOVE_trace_TO_TRAP
MOVE_interrupt_trap_TO_TRAP
 
MOVE_0_TO_stop_flag
MOVE_1_TO_stop_flag
MOVE_sr15_TO_trace_flag
MOVE_0_TO_group_0_flag
MOVE_1_TO_group_0_flag
MOVE_0_TO_read_modify_write_flag
MOVE_1_TO_read_modify_write_flag
MOVE_0_TO_instruction_flag
MOVE_1_TO_instruction_flag
MOVE_1_TO_blocked_flag
MOVE_0_TO_read_flag
MOVE_1_To_read_flag
MOVE_0_TO_write_flag
MOVE_1_TO_write_flag
MOVE_0_TO_interrupt_flag
MOVE_1_TO_interrupt_flag
MOVE_1_TO_reset_flag
MOVE_0_TO_reset_flag
 
INCR_ADDR_BY_SIZE(size=)
DECR_ADDR_BY_SIZE(size=)
DECR_OP2_BY_1
CALL procedure
RETURN
INCR_movem_loop_BY_1
INCR_movem_mod_reg_BY_1
DECR_movem_mod_reg_BY_1
JMP: local label, trap, instr_fin, instr_fin_pc_loaded,
SHIFT_RIGHT_movem_reg
INCR_PC_BY_2
INCR_PC_BY_4
INCR_PC_BY_size(size=)
 
BRANCH(movem_loop == 4'b1000)
BRANCH(movem_reg[0] == 0)
BRANCH(operand2[5:0] == 6'b0)
BRANCH(special == 2'b01)
BRANCH(special == 2'b10)
BRANCH(condition == 1'b0)
BRANCH(condition == 1'b1)
BRANCH(result[15:0] == 16'hFFFF)
BRANCH(V == 1'b0)
BRANCH(stop_flag == 1'b1)
BRANCH(ir[7:0] != 8'b0)
BRANCH(decoder_trap == 8'b0)
BRANCH(trace_flag == 1'b0)
BRANCH(group_0_flag == 0)
 
WAIT_RESET, WAIT_MEMORY_READ(size, address), WAIT_MEMORY_WRITE(size, address, select), WAIT_interrupt, WAIT_blocked
WAIT_prefetch_ir_valid
 
subprocedures:
ea(size=, reg=, mod=, type=, select=)
 
LOAD_EA:             to address register
PERFORM_EA_READ:     to operand1
PERFORM_EA_WRITE:     from result
SAVE_EA
 
&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;
 
TYPE.ALL: all
                                Dn 000,    An (word, long) 001, (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001, #data 111 100, (d16, PC) 111 010, (d8, PC, Xn) 111 011
TYPE.CONTROL_POSTINC: control or postincrement
                                                             (An) 010, (An)+ 011,            (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,                (d16, PC) 111 010, (d8, PC, Xn) 111 011
TYPE.CONTROLALTER_PREDEC: control alter or predecrement
                                                              (An) 010,            -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,
TYPE.CONTROL: control
                                                              (An) 010,                       (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,                  (d16, PC) 111 010, (d8, PC, Xn) 111 011
TYPE.DATAALTER: data alter
                                Dn 000,                      (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001,
TYPE.DN_AN: Dn, An
                                Dn 000, An 001
TYPE.MEMORYALTER: memory alter
                                                              (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001
TYPE.DATA: data
                                Dn 000,                         (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,
                                (xxx).W 111 000, (xxx).L 111 001, #data 111 100, (d16, PC) 111 010, (d8, PC, Xn) 111 011
 
 
</pre></div> </div>
<hr class="footer"/><address class="footer"><small>Generated on Sun Jan 16 2011 11:00:03 for ao68000 by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.2 </small></address>
</body>
</html>
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.