URL
https://opencores.org/ocsvn/ao68000/ao68000/trunk
Subversion Repositories ao68000
[/] [ao68000/] [trunk/] [doc/] [src/] [old_notes.txt] - Rev 15
Go to most recent revision | Compare with Previous | Blame | View Log
*******************************************************************************************************************************************NOTE: The information bellow is not current. It is here only for historical reasons.*******************************************************************************************************************************************if( ir[15:12] == 4'b0000 && ir[8] == 1'b0 && ir[11:9] != 3'b100 && ir[11:9] != 3'b110 &&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)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 operand2operation size:if( ir[7:6] == 2'b00 ) byteelse if( ir[7:6] == 2'b01 ) wordelse if( ir[7:6] == 2'b10 ) longload (ea) from ir[5:0] to operand1: data alterDn 000, (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,(xxx).W 111 000, (xxx).L 111 001perform ALU operation:if( ir[11:9] == 3'b000 ) ORelse if( ir[11:9] == 3'b001 ) ANDelse if( ir[11:9] == 3'b010 ) SUBelse if( ir[11:9] == 3'b011 ) ADDelse if( ir[11:9] == 3'b101 ) EORupdate CCR:ANDI,EORI,ORI: X not affected; C cleared; V cleared; Z set if zero else clear; N set if MSB set else clearedADDI,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 clearedsave result to (ea) from ir[5:0]update PCif( 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 operand2operation size:if( ir[7:6] == 2'b00 ) byteelse if( ir[7:6] == 2'b01 ) wordelse if( ir[7:6] == 2'b10 ) longmove SR to operand1perform ALU operation:if( ir[11:9] == 3'b000 ) ORelse if( ir[11:9] == 3'b001 ) ANDelse if( ir[11:9] == 3'b101 ) EORmove result to operand1save operand1 to CCR/SRupdate CCR:resultupdate PCif( ir[15:12] == 4'b0000 && ir[8] == 1'b0 && 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 ) byteelse if( ir[7:6] == 2'b01 ) wordelse if( ir[7:6] == 2'b10 ) longload (ea) from ir[5:0] to operand1: data alterDn 000, (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,(xxx).W 111 000, (xxx).L 111 001perform ALU operation:if( ir[11:9] == 3'b110 ) CMP=SUBupdate 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 clearedupdate PCif( ir[15:12] == 4'b0000 && ir[11:8] == 4'b1000 && ir[7:6] != 2'b00 )BCHG,BCLR,BSET immediate+++load ir1[7:0] to operand1[7:0]move operand1 to operand2load (ea) form ir[5:0] to operand1: data alterdata alter: Dn 000, (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,(xxx).W 111 000, (xxx).L 111 001operation size:if( ir[5:3] == 3'b000 ) longelse if( ir[5:3] != 3'b000 ) byteperform bit operation:test( <number> of Destination ) -> Z; test( <number> of Destination )[0][1] -> <bit number> of Destinationif( ir[7:6] == 2'b01 ) BCHGelse if( ir[7:6] == 2'b10 ) BCLRelse if( ir[7:6] == 2'b11 ) BSETupdate CCR: X,N,V,C not affected; Z set if bit tested is zero else clearedsave result to (ea) form ir[5:0]update PCif( ir[15:12] == 4'b0000 && ir[11:8] == 4'b1000 && ir[7:6] == 2'b00 )BTST immediate+++load ir1[7:0] to operand1[7:0]move operand1 to operand2load (ea) form ir[5:0] to operand1: data addressdata 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 011operation size:if( ir[5:3] == 3'b000 ) longelse if( ir[5:3] != 3'b000 ) byteperform bit operation:test( <number> of Destination ) -> Zif( ir[7:6] == 2'b00 ) BTSTupdate CCR: X,N,V,C not affected; Z set if bit tested is zero else clearedupdate PCif( ir[15:12] == 4'b0000 && ir[8] == 1'b1 && ir[5:3] != 3'b001 && ir[8:6] != 3'b100 )BCHG,BCLR,BSET register+++load (ea) from ir[11:9] to operand1[7:0]: Dnmove operand1 to operand2load (ea) form ir[5:0] to operand1: data alterdata alter: Dn 000, (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,(xxx).W 111 000, (xxx).L 111 001operation size:if( ir[5:3] == 3'b000 ) longelse if( ir[5:3] != 3'b000 ) byteperform bit operation:test( <number> of Destination ) -> Z; test( <number> of Destination )[0][1] -> <bit number> of Destinationif( ir[7:6] == 2'b01 ) BCHGelse if( ir[7:6] == 2'b10 ) BCLRelse if( ir[7:6] == 2'b11 ) BSETupdate CCR: X,N,V,C not affected; Z set if bit tested is zero else clearedsave result to (ea) form ir[5:0]update PCif( ir[15:12] == 4'b0000 && ir[8] == 1'b1 && ir[5:3] != 3'b001 && ir[8:6] == 3'b100 )BTST register+++load (ea) from ir[11:9] to operand1[7:0]: Dnmove operand1 to operand2load (ea) form ir[5:0] to operand1: data addressdata 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 011operation size:if( ir[5:3] == 3'b000 ) longelse if( ir[5:3] != 3'b000 ) byteperform bit operation:test( <number> of Destination ) -> Zif( ir[7:6] == 2'b00 ) BTSTupdate CCR: X,N,V,C not affected; Z set if bit tested is zero else clearedupdate PCif( ir[15:12] == 4'b0000 && ir[8] == 1'b1 && ir[5:3] == 3'b001 && ( ir[7:6] == 2'b00 || ir[7:6] == 2'b01 ) )MOVEP memory to register+++operation size:if( ir[7:6] == 2'b00 ) wordif( ir[7:6] == 2'b01 ) longload ea from ir[2:0] to address register: (d16, An)doload from (address) to operand1 register, longmove two alternate bytes to result registerincrement ea by 4repeat for longsave result to (ea) from ir[11:9]: Dn, word ( ir[7:6] == 2'b00 ), long ( ir[7:6] == 2'b01 )update CCR: no changeupdate PCif( ir[15:12] == 4'b0000 && ir[8] == 1'b1 && ir[5:3] == 3'b001 && ( ir[7:6] == 2'b10 || ir[7:6] == 2'b11 ) )MOVEP register to memory+++operation size:if( ir[7:6] == 2'b10 ) wordif( ir[7:6] == 2'b11 ) longload (ea) from ir[11:9] to operand1: Dn, longload ea from ir[2:0] to address register: (d16, An)domove two alternate bytes to result registersave result register to (addreess), long, only selected bytesincrement ea by 4repeat for longupdate CCR: no changeupdate PCif( ir[15:14] == 2'b00 && ir[13:12] != 2'b00 && ir[8:6] != 3'b001)MOVE+++size of operation: ir[13:12]: 01,11,10 byte,word,longload (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 011copy operand1 to result registersave 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 clearedupdate PCif( ir[15:14] == 2'b00 && (ir[13:12] == 2'b11 || ir[13:12] == 2'b10) && ir[8:6] == 3'b001)MOVEA+++size of operation: ir[13:12]: 11,10 word,longload (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 011copy operand1 to result registersave result to (ea) from ir[11:6]: AnCC: not affectedupdate PCif( ir[15:12] == 4'b1100 && (ir[8:4] == 5'b10100 || 5'b11000) )EXG+++load (ea) from ir[5:0] to operand1: Dn, Anperform ALU operation: move operand1 to result registerload (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 registersave result to (ea) from ir[5:0]: Dn, AnCC: not affectedupdate PCif( ir[15:12] == 4'b1011 && (ir[8:6] == 3'b100 || 3'b101 || 3'b110) && ir[5:3] == 3'b001 )CMPM+++load (ea) from ir[2:0] to operand1: postincrement (An)+move operand1 to operand2load (ea) from ir[11:9] to operand1: postincrement (An)+ALU operation size:if( ir[7:6] == 2'b00 ) byteelse if( ir[7:6] == 2'b01 ) wordelse if( ir[7:6] == 2'b10 ) longperform ALU operation: CMPM == SUBCC: 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 clearedAx dest, Ay source: postincrement: +(An)update PCif( ir[15:12] == 4'b1011 && (ir[8:6] == 3'b100 || 3'b101 || 3'b110) && ir[5:3] != 3'b001 )EOR+++load (ea) from ir[11:9] to operand1: Dnmove operand1 to operand2load (ea) from ir[5:0] to operand1: data alterdata 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 ) byteelse if( ir[7:6] == 2'b01 ) wordelse if( ir[7:6] == 2'b10 ) longperform ALU operation: EORCC: X not affected; C cleared; V cleared; Z set if zero else clear; N set if MSB set else clearedsave result to (ea) from ir[5:0]: data alterdata 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 PCif( (ir[15:12] == 4'b1101 || 4'b1001 || 4'b1100 || 4'b1000) &&(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: Dnmove operand1 to operand2load (ea) indexed by ir[5:0] to operand1: memory altermemory alter: (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,(xxx).W 111 000, (xxx).L 111 001ALU operation size:if( ir[7:6] == 2'b00 ) byteelse if( ir[7:6] == 2'b01 ) wordelse if( ir[7:6] == 2'b10 ) longperform ALU operation:if( ir[15:12] == 4'b1101 ) ADDelse if( ir[15:12] == 4'b1001 ) SUBelse if( ir[15:12] == 4'b1100 ) ANDelse if( ir[15:12] == 4'b1000 ) ORif( 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 clearedelse if( AND,OR )CC: X not affected; C cleared; V cleared; Z set if zero else clear; N set if MSB set else clearedsave result to (ea) from ir[5:0]: memory altermemory alter: (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,(xxx).W 111 000, (xxx).L 111 001update PCif( (ir[15:12] == 4'b1101 || 4'b1001 || 4'b1100 || 4'b1000) && (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 modesall 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 011move operand1 to operand2load (ea) from ir[11:9] to operand1: DnALU operation size:if( ir[7:6] == 2'b00 ) byteelse if( ir[7:6] == 2'b01 ) wordelse if( ir[7:6] == 2'b10 ) longperform ALU operation:if( ir[15:12] == 4'b1101 ) ADDelse if( ir[15:12] == 4'b1001 ) SUBelse if( ir[15:12] == 4'b1100 ) ANDelse if( ir[15:12] == 4'b1000 ) ORif( 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 clearedelse if( AND,OR )CC: X not affected; C cleared; V cleared; Z set if zero else clear; N set if MSB set else clearedsave result to (ea) from ir[11:9]: Dnupdate PCif( (ir[15:12] == 4'b1011) && (ir[8:6] == 3'b000 || 3'b001 || 3'b010) )CMP+++load (ea) from ir[5:0] to operand1: all modesall 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 011move operand1 to operand2load (ea) from ir[11:9] to operand1: DnALU operation size:if( ir[7:6] == 2'b00 ) byteelse if( ir[7:6] == 2'b01 ) wordelse if( ir[7:6] == 2'b10 ) longperform ALU operation:if( ir[15:12] == 4'b1011 ) CMP=SUBCC: 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 clearedupdate PCif( (ir[15:12] == 4'b1100 || 4'b1000) && ir[7:6] == 2'b11 )MULS,MULU,DIVS,DIVU+++load (ea) from ir[5:0] to operand1: datadata: 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 011move operand1 to operand2load (ea) from ir[11:9] to operand1: Dnperform ALU operation:if( ir[15:12] == 4'b1100 && ir[8] == 1'b0 ) MULUelse if( ir[15:12] == 4'b1100 && ir[8] == 1'b1 ) MULSelse if( ir[15:12] == 4'b1000 && ir[8] == 1'b0 ) DIVUelse if( ir[15:12] == 4'b1000 && ir[8] == 1'b1 ) DIVSif( MULU/MULS )CC: X not affected; C cleared; V cleared; Z set if zero else cleared; N set if negative else clearedelse 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]: Dnupdate PCif( (ir[15:12] == 4'b1101 || 4'b1001) && (ir[8:6] == 3'b011 || 3'b111) )ADDA,SUBA+++load (ea) from ir[5:0] to operand1: all modesall 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 011move operand1 to operand2load (ea) from ir[11:9] to operand1: AnALU operation size, source is sign-extended:if( ir[8] == 1'b0 ) wordelse if( ir[8] == 1'b1 ) longperform ALU operation:if( ir[14:12] == 3'b101 ) ADDelse if( ir[14:12] == 3'b001 ) SUBCC: not affectedsave result sign-extended to (ea) from ir[11:9]: Anupdate PCif( (ir[15:12] == 4'b1011) && (ir[8:6] == 3'b011 || 3'b111) )CMPA+++load (ea) from ir[5:0] to operand1: all modesall 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 011move operand1 to operand2load (ea) from ir[11:9] to operand1: AnALU operation size, source is sign-extended:if( ir[8] == 1'b0 ) wordelse if( ir[8] == 1'b1 ) longperform ALU operation:if( ir[14:12] == 3'b011 ) CMP==SUBCC: 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 clearedupdate PCif( ((ir[15:12] == 4'b1100 || 4'b1000) && ir[8:4] == 5'b10000) || ((if[15:12] == 4'b1101 || 4'b1001) && (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 operand2load (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 ) byteelse if( ir[7:6] == 2'b01 ) wordelse if( ir[7:6] == 2'b10 ) longperform ALU operation:if( ir[14:12] == 3'b100 ) ABCDelse if( ir[14:12] == 3'b000 ) SBCDelse if( ir[14:12] == 3'b101 ) ADDXelse if( ir[14:12] == 3'b001 ) SUBXif( 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 undefinedelseCC: 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 clearedsave result to (ea) from ir[11:9]: Dn (ir[3] == 1'b0), -(An) (ir[3] == 1'b1)update PCif( ir[15:12] == 4'b1110 && ir[7:6] == 2'b11 && ir[11] == 1'b0 )ASL,LSL,ROL,ROXL,ASR,LSR,ROR,ROXR all memory+++load (ea) from ir[5:0] to operand1: memory altermemory alter: (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,(xxx).W 111 000, (xxx).L 111 001load 1'b1 to operand2ALU operation size: wordALU shift/rotate direction:if( ir[8] == 1'b0 ) rightelse if( ir[8] == 1'b1 ) leftperform ALU operation:if( ir[10:9] == 2'b00 ) ASL/ASRelse if( ir[10:9] == 2'b01 ) LSL,LSRelse if( ir[10:9] == 2'b11 ) ROL,RORelse if( ir[10:9] == 2'b10 ) ROXL,ROXRCC: 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 altermemory alter: (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,(xxx).W 111 000, (xxx).L 111 001update PCif( ir[15:12] == 4'b1110 && (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: Dnmove operand1 to operand2load (ea) from ir[2:0] to operand1: Dnif( ir[5] == 1'b0 )if( ir[11:9] == 3'b000 ) load 4'b1000 to operand2else load ir[11:9] to operand2else if( ir[5] == 1'b1 )perform operand2 modulo 64ALU operation size:if( ir[7:6] == 2'b00 ) byteelse if( ir[7:6] == 2'b01 ) wordelse if( ir[7:6] == 2'b10 ) longALU shift/rotate direction:if( ir[8] == 1'b0 ) rightelse if( ir[8] == 1'b1 ) leftperform ALU operation:if( ir[4:3] == 2'b00 ) ASL/ASRelse if( ir[4:3] == 2'b01 ) LSL,LSRelse if( ir[4:3] == 2'b11 ) ROL,RORelse if( ir[4:3] == 2'b10 ) ROXL,ROXRCC: 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]: Dnupdate PCif( ir[15:12] == 4'b0111 && ir[8] == 1'b0 )MOVEQ+++load ir[7:0] sign-extended to result registerCC: X not affected; C cleared; V cleared; Z set if zero else cleared; N set if negative else clearedsave result to (ea) from ir[11:9]: Dnupdate PCif( ir[15:12] == 4'b0110 && ir[11:8] == 4'b0001 )BSR+++CC: not affectedSP -= 4move PC to operand1move operand1 to resultsave result to (ea): (SP)if( ir[7:0] == 8'b0 )add to PC: ir1[15:0]elseadd to PC: ir[7:0]returnif( ir[15:12] == 4'b0110 && ir[11:8] != 4'b0001 )Bcc,BRA+++condition: high(!C & !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 & V | !N & !V) 1100, less than(N & !V | !N & V) 1101,greater than(N & V & !Z | !N & !V & !Z) 1110, less or equal(Z | N & !V | !N & V) 1111CC: not affectedif( contidtion on ir[11:8] true )if( ir[7:0] == 8'b0 )add to PC: ir1[15:0]elseadd to PC: ir[7:0]returnupdate PCif( ir[15:12] == 4'b0101 && ir[7:6] == 2'b11 && ir[5:3] != 2'b001 )Scc+++condition: true(1) 0000, false(0) 0001, high(!C & !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 & V | !N & !V) 1100, less than(N & !V | !N & V),greater than(N & V & !Z | !N & !V & !Z), less or equal(Z | N & !V | !N & V) 1111if( contidtion on ir[11:8] false )load 8'b00000000 to resultelseload 8'b11111111 to resultoperation size: bytesave 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 affectedupdate PCif( ir[15:12] == 4'b0101 && ir[7:6] == 2'b11 && ir[5:3] == 2'b001 )DBcc+++condition: true(1) 0000, false(0) 0001, high(!C & !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 & V | !N & !V) 1100, less than(N & !V | !N & V),greater than(N & V & !Z | !N & !V & !Z), less or equal(Z | N & !V | !N & V) 1111CC: not affectedif( condition on ir[11:8] false )load (ea) from ir[2:0] to operand1: Dnload 1'b1 to operand2ALU operation size: wordperform ALU operation: SUBsave result to (ea) from ir[2:0]: Dnif( result != -1 )add to PC: ir1[15:0]returnupdate PCif( ir[15:12] == 4'b0101 && ir[7:6] != 2'b11 && ir[5:3] != 3'b001 )ADDQ,SUBQ not An+++if( ir[11:9] == 3'b000 )load 4'b1000 to operand2elseload ir[11:9] to operand2load (ea) from by ir[5:0] to operand1: data alterdata 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 ) longelse if( ir[7:6] == 2'b01 ) wordelse if( ir[7:6] == 2'b00 ) byteperform ALU operation:if( ir[8] == 1'b0 ) ADDQelse if( ir[8] == 1'b1 ) SUBQCC: 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 clearedsave result to (ea) from ir[5:0]update PCif( ir[15:12] == 4'b0101 && ir[7:6] != 2'b11 && ir[5:3] == 3'b001)ADDQ,SUBQ An+++if( ir[11:9] == 3'b000 )load 4'b1000 to operand2elseload ir[11:9] to operand2load (ea) from by ir[2:0] to operand1: AnALU operation size: longperform ALU operation:if( ir[8] == 1'b0 ) ADDelse if( ir[8] == 1'b1 ) SUBCC: not affectedsave result to (ea) from ir[2:0]: Anupdate PCif( ir[15:0] == 16'b0100 1110 0111 0001 )NOP+++CC: not affectedupdate PCif( ir[15:0] == 16'b0100 1110 0111 0000 )RESET+++hold REST output for 124 clock cyclesCC: not affectedupdate PCif( ir[15:0] == 16'b0100 1110 0111 0010 )STOP+++copy ir1[15:0] to SRResume when trace, interrupt or rest.if( ir[15:5] == 12'b0100 1110 0100 )TRAP+++TRAP with vector indexed by ir[3:0]CC: not affectedif( ir[15:0] == 16'b0100 1110 0111 0110 )TRAPV+++if( V ) TRAPCC: not affectedupdate PCif( 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 SRelse if(ir[2] == 1'b1) move operand1 to CCRSP += 2load (ea) to operand1: (SP)move operand1 to resultmove result to PCSP += 4if( ir[15:0] == 16'b0100 1110 0111 0101 )RTS+++load (ea) to operand1: (SP)move operand1 to resultmove result to PCSP += 4if( ir[15:6] == 10'b0100 1110 11 )JMP+++load (ea) from ir[5:0] to operand1: controlcontrol: (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 011perform ALU operation: move operand1 to resultcopy result register to PCCC: not affectedif( ir[15:6] == 10'b0100 1110 10 )JSR+++SP -= 4move PC to operand1move operand1 to resultsave result to (ea): (SP)load (ea) from ir[5:0] to operand1: controlcontrol: (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 011perform ALU operation: move operand1 to resultcopy result register to PCCC: not affectedif( ir[15:3] == 13'b0100 1110 0101 0 )LINK+++SP -= 4load (ea) from ir[2:0] to operand1: Anperform ALU operation: move operand1 to resultsave result to (ea): (SP)load (ea) to operand1: SPmove operand1 to resultsave result to (ea) from ir[2:0]: Anadd to SP: ir1[15:0]CC: not affectedupdate PCif( ir[15:3] == 13'b0100 1110 0101 1 )ULNK+++load (ea) from ir[2:0] to operand1: Anperform ALU operation: move operand1 to resultsave result to (ea): SPload ea to operand1: (SP)move operand1 to resultsave result to (ea) from ir[2:0]: AnSP += 4CC: not affectedupdate PCif( ir[15:8] == 8'b0100 1010 && ir[7:6] != 2'b11 )TST+++ea operation size:if( ir[7:6] == 2'b00 ) byteelse if( ir[7:6] == 2'b01 ) wordelse if( ir[7:6] == 2'b10 ) longload (ea) from ir[5:0] to operand1: data alterdata 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 CCCC: X not affected; C cleared; V cleared; Z set if zero else cleared; N set if MSB bit set else clearedupdate PCif( ir[15:6] == 10'b0100 1010 11 && ir[5:0] != 6'b111000 )TAS+++ea operation size: byteenable READ-MODIFY-WRITE bus cycleload (ea) from ir[5:0] to operand1: data alterdata 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 registerCC: X not affected; C cleared; V cleared; Z set if zero else cleared; N set if MSB bit set else clearedsave result to (ea) from ir[5:0]: data alterdisable READ-MODIFY-WRITE bus cycleupdate PCif( ir[15:12] == 4'b0100 && ir[8:6] == 3'b110 )CHK+++load (ea) from ir[5:0] to operand1: datadata: 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 011move operand1 to operand2load (ea) from ir[11:9] to operand1: DnALU operation size: wordperform ALU CHK operation: operand1 < 0 or operand1 - operand2 > 0CC: X not affected; N set if operand1 < 0; cleared if operand1 - operand2 > 0 else undefined; C,V,Z udefinedif( ALU check ) trap CHKupdate PCif( ir[15:12] == 4'b0100 && ir[8:6] == 3'b111 )LEA+++load ea from ir[5:0] to address register: controlcontrol: (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 011move address register to operand1perform ALU operation: move operand1 to result registersave result to (ea) from ir[11:9]: AnCC: not affectedupdate PCif( ir[15:6] == 10'b0100 1000 01 && ir[5:3] != 3'b000 )PEA+++load ea from ir[5:0] to address register: controlcontrol: (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 011SP -= 4move address register to operand1move operand1 to resultsave result to (ea): (SP)CC: not affectedupdate PCif( ir[15:6] == 10'b0100 0100 11 || ir[15:6] == 10'b0100 0110 11 )MOVE TO CCR, MOVE TO SR+++ea operation size: wordload (ea) from ir[5:0] to operand1: datadata: 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 011if( ir[11:8] == 4'b0110 /MOVE TO SR/ )copy word form operand1 register to SRelsecopy lower byte form operand1 register to CCRupdate PCif( ir[15:6] == 10'b0100 0000 11 )MOVE FROM SR+++copy SR register to result registerea operation size: wordsave result to (ea) from ir[5:0]: data alterdata 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 affectedupdate PCif( ir[15:3] == 12'b0100 1110 0110 0 )MOVE USP to USP+++load (ea) from ir[2:0] to operand1: Anperform ALU operation: move operand1 to resultmove result to USPCC: not affectedupdate PCif( ir[15:3] == 13'b0100 1110 0110 1 )MOVE USP to An+++move USP to operand1perform ALU operation: move operand1 to resultsave result to (ea) from ir[2:0]: AnCC: not affectedupdate PCif( ir[15:12] == 4'b0100 && ( (ir[11:8] == 4'b0000 && ir[7:6] != 2'b11) || (ir[11:8] == 4'b0010) || (ir[11:8] == 4'b0100 && ir[7:6] != 2'b11) ||(ir[11:8] == 4'b0110 && ir[7:6] != 2'b11) || (ir[11:6] == 6'b1000 00) ) )+++NEGX,CLR,NEG,NOT,NBCDload (ea) from ir[5:0] to operand1: data alterdata alter: Dn 000, (An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,(xxx).W 111 000, (xxx).L 111 001ALU operation size:NEGX: ir[7:6]: 00,01,10 byte,word,longCLR: ir[7:6]: 00,01,10 byte,word,longNEG: ir[7:6]: 00,01,10 byte,word,longNOT: ir[7:6]: 00,01,10 byte,word,longNBCD: ir[7:6]: 00 byteperform ALU operation:NEGX: ir[11:8] == 4'b0000CLR: ir[11:8] == 4'b0010NEG: ir[11:8] == 4'b0100NOT: ir[11:8] == 4'b0110NBCD: ir[11:6] == 6'b1000 00CC: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 clearCLR: X not affected; C cleared; V cleared; Z set; N clearedNEG: X=C clear if zero else set; V set if overflow else clear; Z set if zero else clear; N set if negative else clearNOT: X not affected; C cleared; V cleared; Z set if zero else cleared; N set if negative else clearedNBCD: X=C set if decimal borrow else cleared; Z cleared if nonzero else unchanged; N,V undefinedsave result to (ea) from ir[5:0]: data alterupdate PCif( ir[15:12] == 4'b0100 && (ir[11:3] == 9'b1000 01 000 || (ir[11:7] == 5'b1000 1 && ir[5:3] == 3'b000) )SWAP,EXT+++load (ea) from ir[5:0] to operand1: DnALU operation size: wordSWAP: ir[7:6]: 01 longEXT: ir[7:6]: 10,11 byte to word, word to longperform ALU operation:SWAP: ir[11:6] == 6'b1000 01EXT: ir[11:7] == 5'b1000 1CC:SWAP: X not affected; C cleared; V cleared; Z set if 32 bits are zero else cleared; N set if result MSB set else clearedEXT: X not affected; C cleared; V cleared; Z set if zero else cleared; N set if negative else clearedsave result to (ea) from ir[5:0]: Dnupdate PCif( ir[15:7] == 9'b0100 1100 1 && ir[5:3] != 3'b000 )MOVEM memory to register+++operation size:if( ir[6] == 1'b0 ) wordelse if ir[6] == 1'b1 ) longload 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 011register selection order: D0,D1,...D7,A0,A1,...,A7doif( ir1[0] == 1'b1 )read from (ea) to operand1perform ALU operation: move operand1 with sign-extension to resultsave result to selected registerupdate address registershift ir1loop 16 timesif( ir[5:3] == 3'b011 ) save address register back to An indexed by ir[2:0]CC: not affectedupdate PCif( ir[15:7] == 9'b0100 1000 1 && ir[5:3] == 3'b100 )MOVEM register to memory, predecrement+++operation size:if( ir[6] == 1'b0 ) wordelse if ir[6] == 1'b1 ) longload 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,....D0doif( ir1[0] == 1'b1 )save selected register to operand1perform ALU operation: move operand1 to resultsave result to (ea)update address registershift ir1loop 16 timesif( ir[5:3] == 3'b100 ) save address register back to An indexed by ir[2:0]CC: not affectedupdate PCif( ir[15:7] == 9'b0100 1000 1 && ir[5:3] != 3'b000 && ir[5:3] != 3b100 )MOVEM register to memory, control+++operation size:if( ir[6] == 1'b0 ) wordelse if ir[6] == 1'b1 ) longload 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,...,A7doif( ir1[0] == 1'b1 )save selected register to operand1perform ALU operation: move operand1 to resultsave result to (ea)update address registershift ir1loop 16 timesCC: not affectedupdate PC*//*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>microinstructionsMOVE_ea_reg_TO_An_addressMOVE_ea_reg_TO_Dn_addressMOVE_ir1_brief_ext_TO_An_Dn_addresses // ir_validMOVE_An_output_TO_addressMOVE_Dn_output_TO_OP1MOVE_An_output_TO_OP1MOVE_zeros_TO_indexMOVE_ir1_brief_ext_TO_index // ir_validMOVE_ir1_byte_TO_offset // ir_validMOVE_ir1_word_TO_offset // ir_validMOVE_base_index_offset_TO_addressMOVE_ir1_absolute_word_TO_address // ir_validMOVE_ir1_ir2_absolute_long_TO_address // ir_validMOVE_pc_index_offset_TO_addressMOVE_trap_TO_addressMOVE_result_TO_An_inputMOVE_result_TO_Dn_input(size=)MOVE_address_TO_An_inputMOVE_result_TO_dataMOVE_OP1_TO_OP2MOVE_OP2_TO_OP1MOVE_ADDR_TO_OP1MOVE_data_TO_OP1MOVE_immediate_TO_OP1(size=)MOVE_result_TO_OP1MOVE_moveq_TO_OP1MOVE_PC_NEXT_TO_OP1MOVE_zeros_TO_OP1MOVE_ones_TO_OP1MOVE_SR_TO_OP1MOVE_USP_TO_OP1MOVE_ir_TO_OP1MOVE_address_bus_info_TO_OP2MOVE_1_TO_OP2MOVE_offset_TO_OP2MOVE_count_TO_OP2MOVE_addq_subq_TO_OP2MOVE_result_TO_PCMOVE_result_TO_USPMOVE_zeros_TO_movem_mod_regMOVE_001111_TO_movem_mod_regMOVE_OP1_TO_movem_regMOVE_zeros_TO_movem_loopMOVE_prefetch_ir_TO_irMOVE_interrupt_mask_TO_srMOVE_1_0_supervisor_trace_TO_srMOVE_reset_mask_TO_srMOVE_prefetch_ir_TO_PCMOVE_prefetch_ir_TO_SSPMOVE_illegal_instr_TO_TRAPMOVE_divide_by_zero_TO_TRAPMOVE_chk_TO_TRAPMOVE_trapv_TO_TRAPMOVE_priv_viol_TO_TRAPMOVE_trap_TO_TRAPMOVE_decoder_trap_TO_TRAPMOVE_trace_TO_TRAPMOVE_interrupt_trap_TO_TRAPMOVE_0_TO_stop_flagMOVE_1_TO_stop_flagMOVE_sr15_TO_trace_flagMOVE_0_TO_group_0_flagMOVE_1_TO_group_0_flagMOVE_0_TO_read_modify_write_flagMOVE_1_TO_read_modify_write_flagMOVE_0_TO_instruction_flagMOVE_1_TO_instruction_flagMOVE_1_TO_blocked_flagMOVE_0_TO_read_flagMOVE_1_To_read_flagMOVE_0_TO_write_flagMOVE_1_TO_write_flagMOVE_0_TO_interrupt_flagMOVE_1_TO_interrupt_flagMOVE_1_TO_reset_flagMOVE_0_TO_reset_flagINCR_ADDR_BY_SIZE(size=)DECR_ADDR_BY_SIZE(size=)DECR_OP2_BY_1CALL procedureRETURNINCR_movem_loop_BY_1INCR_movem_mod_reg_BY_1DECR_movem_mod_reg_BY_1JMP: local label, trap, instr_fin, instr_fin_pc_loaded,SHIFT_RIGHT_movem_regINCR_PC_BY_2INCR_PC_BY_4INCR_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_blockedWAIT_prefetch_ir_validsubprocedures:ea(size=, reg=, mod=, type=, select=)LOAD_EA: to address registerPERFORM_EA_READ: to operand1PERFORM_EA_WRITE: from resultSAVE_EA>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE.ALL: allDn 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 011TYPE.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 011TYPE.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 011TYPE.DATAALTER: data alterDn 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, AnDn 000, An 001TYPE.MEMORYALTER: memory alter(An) 010, (An)+ 011, -(An) 100, (d16, An) 101, (d8, An, Xn) 110,(xxx).W 111 000, (xxx).L 111 001TYPE.DATA: dataDn 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
Go to most recent revision | Compare with Previous | Blame | View Log
