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

Subversion Repositories hd63701

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /hd63701
    from Rev 1 to Rev 2
    Reverse comparison

Rev 1 → Rev 2

/trunk/HD63701.v
0,0 → 1,239
/******************************************************
HD63701V0(Mode6) Compatible Processor Core
Written by Tsuyoshi HASEGAWA 2013-14
*******************************************************/
module HD63701V0_M6
(
input CLKx2, // XTAL/EXTAL (200K~2.0MHz)
 
input RST, // RES
input NMI, // NMI
input IRQ, // IRQ1
 
output RW, // CS2
output [15:0] AD, // AS ? {PO4,PO3}
output [7:0] DO, // ~AS ? {PO3}
input [7:0] DI, // {PI3}
 
input [7:0] PI1, // Port1 IN
output [7:0] PO1, // OUT
 
input [4:0] PI2, // Port2 IN
output [4:0] PO2, // OUT
 
// for DEBUG
output [6:0] phase
);
 
// Built-In Instruction ROM
wire en_birom = (AD[15:12]==4'b1111); // $F000-$FFFF
wire [7:0] biromd;
MCU_BIROM irom( CLKx2, AD[11:0], biromd );
 
 
// Built-In WorkRAM
wire en_biram;
wire [7:0] biramd;
HD63701_BIRAM biram( CLKx2, AD, RW, DO, en_biram, biramd );
 
 
// Built-In I/O Ports
wire en_biio;
wire [7:0] biiod;
HD63701_IOPort iopt( RST, CLKx2, AD, RW, DO, en_biio, biiod, PI1, PI2, PO1, PO2 );
 
 
// Built-In Timer
wire irq2;
wire [3:0] irq2v;
wire en_bitim;
wire [7:0] bitimd;
HD63701_Timer timer( RST, CLKx2, AD, RW, DO, irq2, irq2v, en_bitim, bitimd );
 
 
// Built-In Devices Data Selector
wire [7:0] biddi;
HD63701_BIDSEL bidsel
(
biddi,
en_birom, biromd,
en_biram, biramd,
en_biio , biiod,
en_bitim, bitimd,
DI
);
 
// Processor Core
HD63701_Core core
(
.CLKx2(CLKx2),.RST(RST),
.NMI(NMI),.IRQ(IRQ),.IRQ2(irq2),.IRQ2V(irq2v),
.RW(RW),.AD(AD),.DO(DO),.DI(biddi),
.PH(phase[5:0])
);
assign phase[6] = irq2;
 
endmodule
 
 
module HD63701_BIDSEL
(
output [7:0] o,
 
input e0, input [7:0] d0,
input e1, input [7:0] d1,
input e2, input [7:0] d2,
input e3, input [7:0] d3,
 
input [7:0] dx
);
 
assign o = e0 ? d0 :
e1 ? d1 :
e2 ? d2 :
e3 ? d3 :
dx;
 
endmodule
 
 
module HD63701_BIRAM
(
input mcu_clx2,
input [15:0] mcu_ad,
input mcu_wr,
input [7:0] mcu_do,
output en_biram,
output reg [7:0] biramd
);
 
assign en_biram = (mcu_ad[15: 7]==9'b000000001); // $0080-$00FF
wire [6:0] biad = mcu_ad[6:0];
 
reg [7:0] bimem[0:127];
always @( posedge mcu_clx2 ) begin
if (en_biram & mcu_wr) bimem[biad] <= mcu_do;
else biramd <= bimem[biad];
end
 
endmodule
 
 
module HD63701_IOPort
(
input mcu_rst,
input mcu_clx2,
input [15:0] mcu_ad,
input mcu_wr,
input [7:0] mcu_do,
 
output en_io,
output [7:0] iod,
input [7:0] PI1,
input [3:0] PI2,
 
output reg [7:0] PO1,
output reg [3:0] PO2
);
 
always @( posedge mcu_clx2 or posedge mcu_rst ) begin
if (mcu_rst) begin
PO1 <= 8'hFF;
PO2 <= 4'hF;
end
else begin
if (mcu_wr) begin
if (mcu_ad==16'h2) PO1 <= mcu_do;
if (mcu_ad==16'h3) PO2 <= mcu_do[3:0];
end
end
end
 
assign en_io = (mcu_ad==16'h2)|(mcu_ad==16'h3);
assign iod = (mcu_ad==16'h2) ? PI1 : {4'hF,PI2};
 
endmodule
 
 
module HD63701_Timer
(
input mcu_rst,
input mcu_clx2,
input [15:0] mcu_ad,
input mcu_wr,
input [7:0] mcu_do,
 
output mcu_irq2,
output [3:0] mcu_irq2v,
 
output en_timer,
output [7:0] timerd
);
 
reg oci, oce;
reg [15:0] ocr, icr;
reg [16:0] frc;
reg [7:0] frt;
reg [7:0] rmc, rg5;
 
always @( posedge mcu_clx2 or posedge mcu_rst ) begin
if (mcu_rst) begin
oce <= 0;
ocr <= 16'hFFFF;
icr <= 16'hFFFF;
frc <= 0;
frt <= 0;
rmc <= 8'h40;
rg5 <= 0;
end
else begin
frc <= frc+1;
if (mcu_wr) begin
case (mcu_ad)
16'h05: rg5 <= mcu_do;
16'h08: oce <= mcu_do[3];
16'h09: frt <= mcu_do;
16'h0A: frc <= {frt,mcu_do,1'h0};
16'h0B: ocr[15:8] <= mcu_do;
16'h0C: ocr[ 7:0] <= mcu_do;
16'h0D: icr[15:8] <= mcu_do;
16'h0E: icr[ 7:0] <= mcu_do;
16'h14: rmc <= {mcu_do[7:6],6'h0};
default:;
endcase
end
end
end
 
always @( negedge mcu_clx2 or posedge mcu_rst ) begin
if (mcu_rst) begin
oci <= 0;
end
else begin
case (mcu_ad)
16'h0B: oci <= 0;
16'h0C: oci <= 0;
default: if (frc[16:1]==ocr) oci <= 1'b1;
endcase
end
end
 
assign mcu_irq2 = oci & oce;
assign mcu_irq2v = 4'h4;
 
assign en_timer = (mcu_ad==16'h05)|((mcu_ad>=16'h8)&(mcu_ad<=16'hE))|(mcu_ad==16'h14);
 
assign timerd = (mcu_ad==16'h05) ? rg5 :
(mcu_ad==16'h08) ? {1'b0,oci,2'b10,oce,3'b000}:
(mcu_ad==16'h09) ? frc[16:9] :
(mcu_ad==16'h0A) ? frc[ 8:1] :
(mcu_ad==16'h0B) ? ocr[15:8] :
(mcu_ad==16'h0C) ? ocr[ 7:0] :
(mcu_ad==16'h0D) ? icr[15:8] :
(mcu_ad==16'h0E) ? icr[ 7:0] :
(mcu_ad==16'h14) ? rmc :
8'h0;
 
endmodule
 
trunk/HD63701.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: trunk/HD63701_ALU.v =================================================================== --- trunk/HD63701_ALU.v (nonexistent) +++ trunk/HD63701_ALU.v (revision 2) @@ -0,0 +1,73 @@ +/*************************************************************************** + This file is part of "HD63701V0 Compatible Processor Core". +****************************************************************************/ +`timescale 1ps / 1ps +`include "HD63701_defs.i" + +module HD63701_ALU +( + input [4:0] op, + input [7:0] cf, + input bw, + + input [15:0] R0, + input [15:0] R1, + input C, + + output [15:0] RR, + output [5:0] RC +); + +wire [16:0] r = + (op==`mcTST) ? (R0): + (op==`mcLDR) ? (R0): + (op==`mcLDN) ? (R0): + (op==`mcPSH) ? (R0): + (op==`mcPUL) ? (R0): + (op==`mcINT) ? (R0): + (op==`mcDAA) ? (R0): // todo: DAA + (op==`mcINC) ? (R0+16'h1): + (op==`mcADD) ? (R0+R1): + (op==`mcADC) ? (R0+R1+C): + (op==`mcDEC) ? (R0-16'h1): + (op==`mcSUB) ? (R0-R1): + (op==`mcSBC) ? (R0-R1-C): + (op==`mcMUL) ? (R0*R1): + (op==`mcNEG) ? ((~R0)+16'h1): + (op==`mcNOT) ? (~R0): + (op==`mcAND) ? (R0&R1): + (op==`mcLOR) ? (R0|R1): + (op==`mcEOR) ? (R0^R1): + (op==`mcASL) ? {R0[15:0],1'b0}: + (op==`mcASR) ? (bw ? {R0[15],R0[15:1]}:{R0[7],R0[7:1]}): + (op==`mcLSR) ? {1'b0,R0[15:1]}: + (op==`mcROL) ? {R0[15:0],C}: + (op==`mcROR) ? (bw ? {C,R0[15:1]} : {C,R0[7:1]}): + (op==`mcCCB) ? {10'h3,(R0[5:0]&cf[5:0])}: + (op==`mcSCB) ? {10'h3,(R0[5:0]|cf[5:0])}: + (16'h0); + +assign RR = r[15:0]; + +wire chCarryL = (op==`mcASL)|(op==`mcROL)| + (op==`mcADD)|(op==`mcADC)| + (op==`mcSUB)|(op==`mcSBC)| + (op==`mcMUL); + +wire chCarryR = (op==`mcASR)|(op==`mcLSR)|(op==`mcROR); + +assign fC = (op==`mcNOT) ? 1'b1 : + chCarryL ? ( bw ? r[16] : r[8] ) : + chCarryR ? R0[0] : + C ; + +assign fZ = bw ?(RR[15:0]==0) : (RR[7:0]==0); +assign fN = bw ? RR[15] : RR[7]; + +assign fV = (op==`mcLDR) ? 1'b0 : (bw ?(R0[15]^R1[15]^RR[15]^RR[14]) : (R0[7]^R1[7]^RR[7]^RR[6])); +assign fH = (op==`mcLDR) ? 1'b0 : R0[4]^R1[4]^RR[4]; + +assign RC = {fH,1'b0,fN,fZ,fV,fC}; + +endmodule +
trunk/HD63701_ALU.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: trunk/HD63701_EXEC.v =================================================================== --- trunk/HD63701_EXEC.v (nonexistent) +++ trunk/HD63701_EXEC.v (revision 2) @@ -0,0 +1,255 @@ +/*************************************************************************** + This file is part of "HD63701V0 Compatible Processor Core". +****************************************************************************/ +`timescale 1ps / 1ps +`include "HD63701_defs.i" + +module HD63701_EXEC +( + input CLK, + input RST, + + input [7:0] DI, + + output [15:0] AD, + output reg RW, + output reg [7:0] DO, + + input `mcwidth mcode, + output reg [7:0] vect, + output inte, + input fncu, + + output [15:0] REG_D, + output [15:0] REG_X, + output [15:0] REG_S, + output [5:0] REG_C +); + +// MicroCode Format +wire mcpi = mcode[0]; +wire [2:0] mcam = mcode[3:1]; +wire [2:0] mcph = mcode[6:4]; +wire [3:0] mcr2 = mcode[10:7]; +wire [3:0] mcr1 = mcode[14:11]; +wire [3:0] mcr0 = mcode[18:15]; +wire [4:0] mcop = mcode[23:19]; + +wire mcnw = (mcop==`mcCCB)|(mcop==`mcSCB)|(mcop==`mcAPC)| + (mcop==`mcLDV)|(mcop==`mcINT); + +wire [7:0] mccf = {mcr0,mcr1}; // case of mcCCB & mcSCB & mcAPC +wire [7:0] mcva = {mcr0,mcr1}; // case of mcLDV & mcINT + + +// Registers +reg [15:0] rT, rE, rD, rX, rS, rSp, rP; +reg [5:0] rC; + +`define rA rD[15:8] +`define rB rD[7:0] +`define rU rT[15:8] +`define rV rT[7:0] + + +// ALU +wire IsCCR = (mcop==`mcCCB)|(mcop==`mcSCB); +wire IsCChit = (({(rC[1]^rC[3]),rC} & mccf[6:0]) == 7'h0) ^ mccf[7]; + +wire [15:0] R0, R1, RR; +wire [5:0] CC; + +HD63701_DSEL13 sR0( + .o(R0), + .f0((mcr0 == `mcrC)|IsCCR),.d0({10'b00000000_11,rC}), + .f1(mcr0 == `mcrA), .d1({8'h0,`rA}), + .f2(mcr0 == `mcrB), .d2({8'h0,`rB}), + .f3(mcr0 == `mcrD), .d3(rD), + .f4(mcr0 == `mcrX), .d4(rX), + .f5(mcr0 == `mcrS), .d5(rS), + .f6(mcr0 == `mcrP), .d6(rP), + .f7(mcr0 == `mcrU), .d7({8'h0,`rU}), + .f8(mcr0 == `mcrV), .d8({8'h0,`rV}), + .f9(mcr0 == `mcrN), .d9({DI,8'h0}), + .fA(mcr0 == `mcrM), .dA({8'h0,DI}), + .fB(mcr0 == `mcrT), .dB(rT), + .fC(mcr0 == `mcrE), .dC(rE) +); + +HD63701_DSEL13 sR1( + .o(R1), + .f0((mcr1 == `mcrC)|IsCCR),.d0({10'b00000000_11,rC}), + .f1(mcr1 == `mcrA), .d1({8'h0,`rA}), + .f2(mcr1 == `mcrB), .d2({8'h0,`rB}), + .f3(mcr1 == `mcrD), .d3(rD), + .f4(mcr1 == `mcrX), .d4(rX), + .f5(mcr1 == `mcrS), .d5(rS), + .f6(mcr1 == `mcrP), .d6(rP), + .f7(mcr1 == `mcrU), .d7({8'h0,`rU}), + .f8(mcr1 == `mcrV), .d8({8'h0,`rV}), + .f9(mcr1 == `mcrN), .d9({DI,8'h0}), + .fA(mcr1 == `mcrM), .dA({8'h0,DI}), + .fB(mcr1 == `mcrT), .dB(rT), + .fC(mcr1 == `mcrE), .dC(rE) +); + +HD63701_ALU ALU( + .op(mcop),.cf(mccf),.bw((mcr2==`mcrn) ? mcr0[2] : mcr2[2]), + .R0(R0),.R1(R1),.C(rC[0]), + .RR(RR),.RC(CC) +); + + +// Bus Control +HD63701_DSEL8 sAB( + .o(AD), + .f0(mcam==`amPC), .d0(rP), + .f1(mcam==`amP1), .d1(rP+16'h1), + .f2(mcam==`amSP), .d2(rS), + .f3(mcam==`amS1), .d3(rS+16'h1), + .f4(mcam==`amX0), .d4(rX), + .f5(mcam==`amXT), .d5(rX+rT), + .f6(mcam==`amE0), .d6(rE), + .f7(mcam==`amE1), .d7(rE+16'h1) +); + + +// Update Registers +reg [4:0] pmcop; +always @( posedge CLK ) begin + if (pmcop==`mcPSH) rS <= rSp-16'h1; + else if (pmcop==`mcPUL) rS <= rSp+16'h1; + else rS <= rSp; +end + +wire noCCop = (mcop!=`mcLDV)&(mcop!=`mcLDN)&(mcop!=`mcPSH)&(mcop!=`mcPUL)&(mcop!=`mcAPC)&(mcop!=`mcTST)&(~fncu); +wire noCCrg = (mcr2!=`mcrC )&(mcr2!=`mcrS )&(mcr2!=`mcrP )&(mcr0!=`mcrC ); + +always @( negedge CLK or posedge RST ) begin + if (RST) begin + pmcop <= 0; + vect <= 0; + rT <= 0; + rE <= 0; + rP <= 0; + rC <= 6'b010000; + DO <= 0; + end + else begin + if ((mcr2!=`mcrP)&(mcpi==`pcI)) rP <= rP+16'h1; + if (noCCrg & noCCop) rC <= {CC[5],rC[4],CC[3:0]}; + if (mcr2!=`mcrS) rSp <= rS; + case (mcop) + `mcXTD: begin rT <= rX; rX <= rD; end + `mcAPC: if (IsCChit) rP <= rP+{{8{rT[7]}},rT[7:0]}; + `mcINT: vect <= mcva; + `mcLDV: rE <= {8'hFF,mcva}; + `mcTST: rC <= {rC[5:3],CC[2],rC[1:0]}; + default: case (mcr2) + `mcrA: `rA <= RR[7:0]; + `mcrB: `rB <= RR[7:0]; + `mcrC: rC <= RR[5:0]; + `mcrD: rD <= RR; + `mcrX: rX <= RR; + `mcrS: rSp <= RR; + `mcrP: rP <= RR; + `mcrU: `rU <= RR[7:0]; + `mcrV: `rV <= RR[7:0]; + `mcrT: rT <= RR; + `mcrE: rE <= RR; + default:; + endcase + endcase + DO <= mcnw ? 8'h0 : + (mcr2==`mcrN) ? RR[15:8] : + (mcr2==`mcrM) ? RR[ 7:0] : + 8'h0; + + pmcop <= mcop; + end +end + +wire RWRES = CLK; +always @( negedge CLK or posedge RWRES ) begin + if (RWRES) RW <= 0; + else begin + RW <= ((mcr2==`mcrN)|(mcr2==`mcrM)) & (~mcnw); + end +end + +assign inte = ~rC[4]; + + +assign REG_D = rD; +assign REG_X = rX; +assign REG_S = rS; +assign REG_C = rC; + +endmodule + + +module HD63701_DSEL13 +( + output [15:0] o, + + input f0, input [15:0] d0, + input f1, input [15:0] d1, + input f2, input [15:0] d2, + input f3, input [15:0] d3, + input f4, input [15:0] d4, + input f5, input [15:0] d5, + input f6, input [15:0] d6, + input f7, input [15:0] d7, + input f8, input [15:0] d8, + input f9, input [15:0] d9, + input fA, input [15:0] dA, + input fB, input [15:0] dB, + input fC, input [15:0] dC +); + +assign o = + f0 ? d0 : + f1 ? d1 : + f2 ? d2 : + f3 ? d3 : + f4 ? d4 : + f5 ? d5 : + f6 ? d6 : + f7 ? d7 : + f8 ? d8 : + f9 ? d9 : + fA ? dA : + fB ? dB : + fC ? dC : + 16'h0 ; + +endmodule + + +module HD63701_DSEL8 +( + output [15:0] o, + + input f0, input [15:0] d0, + input f1, input [15:0] d1, + input f2, input [15:0] d2, + input f3, input [15:0] d3, + input f4, input [15:0] d4, + input f5, input [15:0] d5, + input f6, input [15:0] d6, + input f7, input [15:0] d7 +); + +assign o = + f0 ? d0 : + f1 ? d1 : + f2 ? d2 : + f3 ? d3 : + f4 ? d4 : + f5 ? d5 : + f6 ? d6 : + f7 ? d7 : + 16'h0 ; + +endmodule +
trunk/HD63701_EXEC.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: trunk/HD63701_defs.i =================================================================== --- trunk/HD63701_defs.i (nonexistent) +++ trunk/HD63701_defs.i (revision 2) @@ -0,0 +1,155 @@ +/*************************************************************************** + This file is part of "HD63701V0 Compatible Processor Core". + ( DON'T ADD TO PROJECT, Because this file is include file. ) +****************************************************************************/ +`define vaRST 8'hFE // RESET Vector $FFFE +`define vaTRP 8'hEE // TRAP Vector $FFEE +`define vaNMI 8'hFC // NMI Vector $FFFC (NMI signal) +`define vaSWI 8'hFA // SWI Vector $FFFA (Software Interrupt) +`define vaIRQ 8'hF8 // IRQ Vector $FFF8 (IRQ signal) +`define vaICF 8'hF6 // ICF Vector $FFF6 (Timer Input Capture) +`define vaOCF 8'hF4 // OCF Vector $FFF4 (Timer Output Compare) +`define vaTOF 8'hF2 // TOF Vector $FFF2 (Timer OverFlow) +`define vaSCI 8'hF0 // SCI Vector $FFF0 (Serial) +`define vaWAI 8'h00 // WAI Vector (Special) + + +`define phRST 0 +//------------------ +`define phVECT 1 +`define phVEC1 2 +`define phVEC2 3 +//------------------ +`define phEXEC 16 +`define phEXEC1 17 +`define phEXEC2 18 +`define phEXEC3 19 +`define phEXEC4 20 +`define phEXEC5 21 +`define phEXEC6 22 +`define phEXEC7 23 +`define phEXEC8 24 +`define phEXEC9 25 +//------------------ +`define phINTR 32 +`define phINTR1 33 +`define phINTR2 34 +`define phINTR3 35 +`define phINTR4 36 +`define phINTR5 37 +`define phINTR6 38 +`define phINTR7 39 +`define phINTR8 40 +`define phINTR9 41 +//------------------ +`define phSLEP 62 +`define phHALT 63 + + +`define mcNOP `mcLDN +`define mcLDN 5'd0 +`define mcINC 5'd1 +`define mcADD 5'd2 +`define mcADC 5'd3 +`define mcDEC 5'd4 +`define mcSUB 5'd5 +`define mcSBC 5'd6 +`define mcMUL 5'd7 +`define mcNEG 5'd8 +`define mcNOT 5'd9 +`define mcAND 5'd10 +`define mcLOR 5'd11 +`define mcEOR 5'd12 +`define mcASL 5'd13 +`define mcASR 5'd14 +`define mcLSR 5'd15 +`define mcROL 5'd16 +`define mcROR 5'd17 +`define mcCCB 5'd18 +`define mcSCB 5'd19 +`define mcLDR 5'd20 +`define mcTST 5'd21 +//--------------------- +`define mcINT 5'd25 +`define mcPSH 5'd26 +`define mcPUL 5'd27 +`define mcXTD 5'd28 +`define mcDAA 5'd29 +`define mcAPC 5'd30 +`define mcLDV 5'd31 + + + // [2] : 0=byte,1=word +`define mcrn 4'd0 // none +`define mcrA 4'd1 +`define mcrB 4'd2 +`define mcrC 4'd3 + +`define mcrD 4'd4 // {A,B} +`define mcrX 4'd5 +`define mcrS 4'd6 +`define mcrP 4'd7 + +`define mcrU 4'd8 +`define mcrV 4'd9 +`define mcrN 4'd10 // x.H <-> (rE) +`define mcrM 4'd11 // x.L <-> (rE) + +`define mcrT 4'd12 // {U,V} Temporary +`define mcrE 4'd13 // Effective Address +`define mcrI 4'd14 // Immidiate +//--------------------- + + +`define mcpK 3'd0 // Keep +`define mcpN 3'd1 // Next +`define mcp0 3'd2 // To Stage0 +`define mcpI 3'd3 // To Interrupt +`define mcpV 3'd4 // To Vector +//------------------------------------------ +`define mcpH 3'd6 // To HALT +`define mcpS 3'd7 // To SLEEP + + +`define amPC 3'd0 +`define amP1 3'd1 +`define amSP 3'd2 +`define amS1 3'd3 +`define amX0 3'd4 +`define amXT 3'd5 +`define amE0 3'd6 +`define amE1 3'd7 + + +`define pcN 1'b0 // PC=PC +`define pcI 1'b1 // PC=PC+1 + + +// +- N^V +// | +`define bfRA 8'b00000000 +`define bfRN 8'b10000000 +`define bfHI 8'b00000101 +`define bfLS 8'b10000101 +`define bfCC 8'b00000001 +`define bfCS 8'b10000001 +`define bfNE 8'b00000100 +`define bfEQ 8'b10000100 +`define bfVC 8'b00000010 +`define bfVS 8'b10000010 +`define bfPL 8'b00001000 +`define bfMI 8'b10001000 +`define bfGE 8'b01000000 +`define bfLT 8'b11000000 +`define bfGT 8'b01000100 +`define bfLE 8'b11000100 + +`define bfC 8'b00000001 +`define bfV 8'b00000010 +`define bfZ 8'b00000100 +`define bfN 8'b00001000 +`define bfI 8'b00010000 +`define bfH 8'b00100000 + + +`define mcwidth [23:0]
trunk/HD63701_defs.i Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: trunk/HD63701_CORE.v =================================================================== --- trunk/HD63701_CORE.v (nonexistent) +++ trunk/HD63701_CORE.v (revision 2) @@ -0,0 +1,54 @@ +/*************************************************************************** + This file is part of "HD63701V0 Compatible Processor Core". +****************************************************************************/ +`timescale 1ps / 1ps +`include "HD63701_defs.i" + +module HD63701_Core +( + input CLKx2, + + input RST, + input NMI, + input IRQ, + input IRQ2, + input [3:0] IRQ2V, + + output RW, + output [15:0] AD, + output [7:0] DO, + input [7:0] DI, + + // for DEBUG + output CLKo, + output [5:0] PH, + output `mcwidth MC, + output [15:0] REG_D, + output [15:0] REG_X, + output [15:0] REG_S, + output [5:0] REG_C +); + +reg CLK = 0; +always @( negedge CLKx2 ) CLK <= ~CLK; +assign CLKo = CLK; + +wire `mcwidth mcode; +wire [7:0] vect; +wire inte, fncu; + +assign MC = mcode; + +HD63701_SEQ SEQ(.CLK(CLK),.RST(RST), + .NMI(NMI),.IRQ(IRQ),.IRQ2(IRQ2),.IRQ2V(IRQ2V), + .DI(DI), + .mcout(mcode),.vect(vect),.inte(inte),.fncu(fncu), + .PH(PH) ); + +HD63701_EXEC EXEC(.CLK(CLK),.RST(RST),.DI(DI),.AD(AD),.RW(RW),.DO(DO), + .mcode(mcode),.vect(vect),.inte(inte),.fncu(fncu), + .REG_D(REG_D),.REG_X(REG_X),.REG_S(REG_S),.REG_C(REG_C) ); + +endmodule + +
trunk/HD63701_CORE.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: trunk/HD63701_SEQ.v =================================================================== --- trunk/HD63701_SEQ.v (nonexistent) +++ trunk/HD63701_SEQ.v (revision 2) @@ -0,0 +1,167 @@ +/*************************************************************************** + This file is part of "HD63701V0 Compatible Processor Core". +****************************************************************************/ +`timescale 1ps / 1ps + +`include "HD63701_defs.i" + +module HD63701_SEQ +( + input CLK, + input RST, + + input NMI, + input IRQ, + + input IRQ2, + input [3:0] IRQ2V, + + input [7:0] DI, + + output `mcwidth mcout, + input [7:0] vect, + input inte, + output fncu, + + output [5:0] PH +); + +`define MC_SEI {`mcSCB, `bfI ,`mcrC,`mcpN,`amPC,`pcN} +`define MC_YLD {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpK,`amPC,`pcN} + +reg [7:0] opcode; +reg `mcwidth mcode; +reg mcside; + + +reg pNMI, pIRQ, pIR2; + +reg [2:0] fINT; +wire bIRQ = fINT[1] & inte; +wire bIRQ2 = fINT[0] & inte; + +wire bINT = fINT[2]|bIRQ|bIRQ2; +wire [7:0] vINT = fINT[2] ? `vaNMI : + bIRQ ? `vaIRQ : + bIRQ2 ? {4'hF,IRQ2V} : + 0; + +function [2:0] INTUpd; +input [2:0] n; + case(n) + 3'b000: INTUpd = 3'b000; + 3'b001: INTUpd = 3'b000; + 3'b010: INTUpd = 3'b000; + 3'b011: INTUpd = 3'b001; + 3'b100: INTUpd = 3'b000; + 3'b101: INTUpd = 3'b001; + 3'b110: INTUpd = 3'b010; + 3'b111: INTUpd = 3'b011; + endcase +endfunction + + +reg [5:0] PHASE; +always @( posedge CLK or posedge RST ) begin + if (RST) begin + fINT <= 0; + pIRQ <= 0; + pNMI <= 0; + pIR2 <= 0; + + opcode <= 0; + mcode <= 0; + mcside <= 0; + end + else begin + + // Capture Interrupt signal edge + if ((pNMI^NMI)&NMI) fINT[2] <= 1'b1; pNMI <= NMI; + if ((pIRQ^IRQ)&IRQ) fINT[1] <= 1'b1; pIRQ <= IRQ; + if ((pIR2^IRQ2)&IRQ2) fINT[0] <= 1'b1; pIR2 <= IRQ2; + + + case (PHASE) + + // Reset + `phRST : mcside <= 1; + + // Load Vector + `phVECT: mcside <= 1; + + // Execute + `phEXEC: begin + opcode <= DI; + if ( bINT & (opcode[7:1]!=7'b0000111) ) begin + mcside <= 0; + mcode <= {`mcINT,vINT,`mcrn,`mcpI,`amPC,`pcN}; + fINT <= INTUpd(fINT); + end + else mcside <= 1; + end + + // Interrupt (TRAP/IRQ/NMI/SWI/WAI) + `phINTR: mcside <= 1; + `phINTR8: begin + mcside <= 0; + if (vect==`vaWAI) begin + if (bINT) begin + mcode <= `MC_SEI; + opcode <= vINT; + fINT <= INTUpd(fINT); + end + else mcode <= `MC_YLD; + end + else begin + opcode <= vect; + mcode <= `MC_SEI; + end + end + `phINTR9: mcode <= {`mcLDV, opcode,`mcrn,`mcpV,`amE0,`pcN}; //(Load Vector) + + // Sleep + `phSLEP: begin + mcside <= 0; + if (bINT) begin + mcode <= {`mcINT,vINT,`mcrn,`mcpI,`amPC,`pcN}; + fINT <= INTUpd(fINT); + end + else mcode <= `MC_YLD; + end + + // HALT (Bug in MicroCode) + `phHALT: $stop; + + default:; + endcase + end +end + +// Update Phase +wire [2:0] mcph = mcout[6:4]; +always @( negedge CLK or posedge RST ) begin + if (RST) PHASE <= 0; + else begin + case (mcph) + `mcpN: PHASE <= PHASE+6'h1; + `mcp0: PHASE <=`phEXEC; + `mcpI: PHASE <=`phINTR; + `mcpV: PHASE <=`phVECT; + `mcpH: PHASE <=`phHALT; + `mcpS: PHASE <=`phSLEP; + default: PHASE <= PHASE; + endcase + end +end +assign PH = PHASE; + +// Output MicroCode +wire `mcwidth mcoder; +HD63701_MCROM mcr( CLK, PHASE, (PHASE==`phEXEC) ? DI : opcode, mcoder ); +assign mcout = mcside ? mcoder : mcode; + +assign fncu = ( opcode[7:4]==4'h2)| + ((opcode[7:4]==4'h3)&(opcode[3:0]!=4'hD)); + +endmodule +
trunk/HD63701_SEQ.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: trunk/HD63701_MCODE.i =================================================================== --- trunk/HD63701_MCODE.i (nonexistent) +++ trunk/HD63701_MCODE.i (revision 2) @@ -0,0 +1,971 @@ +/*************************************************************************** + This file is part of "HD63701V0 Compatible Processor Core". + ( DON'T ADD TO PROJECT, Because this file is include file. ) +****************************************************************************/ +`define MC_TRAP {`mcINT, `vaTRP ,`mcrn,`mcpI,`amPC,`pcI} +`define MC_HALT {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpH,`amPC,`pcN} + +`define MC_NEXTI {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN} +`define MC_NEXTP {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI} + +`define MC_LDBRO {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amPC,`pcI} // Bxx NN +`define MC_LDIXO {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amPC,`pcI} // ($NN+X) +`define MC_LDIXM {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcN} // ($nn+X) => rE + +`define MC_LDEXH {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amPC,`pcI} // ($NNnn) +`define MC_LDEXL {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amPC,`pcI} // ($nnNN) +`define MC_LDEXM {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amE0,`pcN} // ($nnnn) => rT + +function `mcwidth MCODE_S0; +input [7:0] opc; +begin + case (opc) +//----------------------------------------------------------------------------------------- + 8'h01: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpK,`amPC,`pcI}; // NOP + 8'h04: MCODE_S0 = {`mcLSR,`mcrD,`mcrn,`mcrD,`mcpK,`amPC,`pcI}; // LSRD + 8'h05: MCODE_S0 = {`mcASL,`mcrD,`mcrn,`mcrD,`mcpK,`amPC,`pcI}; // ASLD + 8'h06: MCODE_S0 = {`mcLDN,`mcrA,`mcrn,`mcrC,`mcpK,`amPC,`pcI}; // TAP + 8'h07: MCODE_S0 = {`mcLDN,`mcrC,`mcrn,`mcrA,`mcpK,`amPC,`pcI}; // TPA + 8'h08: MCODE_S0 = {`mcINC,`mcrX,`mcrn,`mcrX,`mcpK,`amPC,`pcI}; // INX + 8'h09: MCODE_S0 = {`mcDEC,`mcrX,`mcrn,`mcrX,`mcpK,`amPC,`pcI}; // DEX + 8'h0A: MCODE_S0 = {`mcCCB, ~`bfV ,`mcrC,`mcpK,`amPC,`pcI}; // CLV + 8'h0B: MCODE_S0 = {`mcSCB, `bfV ,`mcrC,`mcpK,`amPC,`pcI}; // SEV + 8'h0C: MCODE_S0 = {`mcCCB, ~`bfC ,`mcrC,`mcpK,`amPC,`pcI}; // CLC + 8'h0D: MCODE_S0 = {`mcSCB, `bfC ,`mcrC,`mcpK,`amPC,`pcI}; // SEC + 8'h0E: MCODE_S0 = {`mcCCB, ~`bfI ,`mcrC,`mcpK,`amPC,`pcI}; // CLI + 8'h0F: MCODE_S0 = {`mcSCB, `bfI ,`mcrC,`mcpK,`amPC,`pcI}; // SEI +//----------------------------------------------------------------------------------------- + 8'h10: MCODE_S0 = {`mcSUB,`mcrA,`mcrB,`mcrA,`mcpK,`amPC,`pcI}; // SBA + 8'h11: MCODE_S0 = {`mcSUB,`mcrA,`mcrB,`mcrn,`mcpK,`amPC,`pcI}; // CBA + 8'h12: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amS1,`pcI}; // (undoc1) + 8'h13: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amS1,`pcI}; // (undoc2) + 8'h16: MCODE_S0 = {`mcLDR,`mcrA,`mcrn,`mcrB,`mcpK,`amPC,`pcI}; // TAB + 8'h17: MCODE_S0 = {`mcLDR,`mcrB,`mcrn,`mcrA,`mcpK,`amPC,`pcI}; // TBA + 8'h18: MCODE_S0 = {`mcXTD,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // XGDX + 8'h19: MCODE_S0 = {`mcDAA,`mcrA,`mcrn,`mcrA,`mcp0,`amPC,`pcI}; // DAA + 8'h1A: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpS,`amPC,`pcI}; // SLP + 8'h1B: MCODE_S0 = {`mcADD,`mcrA,`mcrB,`mcrA,`mcpK,`amPC,`pcI}; // ABA + 8'h1F: MCODE_S0 = `MC_HALT; // (DBGHLT) +//----------------------------------------------------------------------------------------- + 8'h20: MCODE_S0 = `MC_NEXTP; // BRA + 8'h21: MCODE_S0 = `MC_NEXTP; // BRN + 8'h22: MCODE_S0 = `MC_NEXTP; // BHI + 8'h23: MCODE_S0 = `MC_NEXTP; // BLS + 8'h24: MCODE_S0 = `MC_NEXTP; // BCC + 8'h25: MCODE_S0 = `MC_NEXTP; // BCS + 8'h26: MCODE_S0 = `MC_NEXTP; // BNE + 8'h27: MCODE_S0 = `MC_NEXTP; // BEQ + 8'h28: MCODE_S0 = `MC_NEXTP; // BVC + 8'h29: MCODE_S0 = `MC_NEXTP; // BVS + 8'h2A: MCODE_S0 = `MC_NEXTP; // BPL + 8'h2B: MCODE_S0 = `MC_NEXTP; // BMI + 8'h2C: MCODE_S0 = `MC_NEXTP; // BGE + 8'h2D: MCODE_S0 = `MC_NEXTP; // BLT + 8'h2E: MCODE_S0 = `MC_NEXTP; // BGT + 8'h2F: MCODE_S0 = `MC_NEXTP; // BLE +//----------------------------------------------------------------------------------------- + 8'h30: MCODE_S0 = {`mcINC,`mcrS,`mcrn,`mcrX,`mcpK,`amPC,`pcI}; // TSX + 8'h31: MCODE_S0 = {`mcINC,`mcrS,`mcrn,`mcrS,`mcpK,`amPC,`pcI}; // INS + 8'h32: MCODE_S0 = {`mcPUL,`mcrM,`mcrn,`mcrA,`mcpN,`amS1,`pcI}; // PULA + 8'h33: MCODE_S0 = {`mcPUL,`mcrM,`mcrn,`mcrB,`mcpN,`amS1,`pcI}; // PULB + 8'h34: MCODE_S0 = {`mcDEC,`mcrS,`mcrn,`mcrS,`mcpK,`amPC,`pcI}; // DES + 8'h35: MCODE_S0 = {`mcDEC,`mcrX,`mcrn,`mcrS,`mcpK,`amPC,`pcI}; // TXS + 8'h36: MCODE_S0 = {`mcPSH,`mcrA,`mcrn,`mcrM,`mcpN,`amSP,`pcI}; // PSHA + 8'h37: MCODE_S0 = {`mcPSH,`mcrB,`mcrn,`mcrM,`mcpN,`amSP,`pcI}; // PSHB + 8'h38: MCODE_S0 = {`mcINC,`mcrS,`mcrn,`mcrS,`mcpN,`amPC,`pcI}; // PULX + 8'h39: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // RTS + 8'h3A: MCODE_S0 = {`mcADD,`mcrX,`mcrB,`mcrX,`mcpK,`amPC,`pcI}; // ABX + 8'h3B: MCODE_S0 = {`mcPUL,`mcrM,`mcrn,`mcrT,`mcpN,`amS1,`pcN}; // RTI + 8'h3C: MCODE_S0 = {`mcDEC,`mcrS,`mcrn,`mcrS,`mcpN,`amPC,`pcI}; // PSHX + 8'h3D: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // MUL + 8'h3E: MCODE_S0 = {`mcINT, `vaWAI ,`mcrn,`mcpI,`amPC,`pcI}; // WAI + 8'h3F: MCODE_S0 = {`mcINT, `vaSWI ,`mcrn,`mcpI,`amPC,`pcI}; // SWI +//----------------------------------------------------------------------------------------- + 8'h40: MCODE_S0 = {`mcNEG,`mcrA,`mcrn,`mcrA,`mcpK,`amPC,`pcI}; // NEGA + 8'h43: MCODE_S0 = {`mcNOT,`mcrA,`mcrn,`mcrA,`mcpK,`amPC,`pcI}; // COMA + 8'h44: MCODE_S0 = {`mcLSR,`mcrA,`mcrn,`mcrA,`mcpK,`amPC,`pcI}; // LSRA + 8'h46: MCODE_S0 = {`mcROR,`mcrA,`mcrn,`mcrA,`mcpK,`amPC,`pcI}; // RORA + 8'h47: MCODE_S0 = {`mcASR,`mcrA,`mcrn,`mcrA,`mcpK,`amPC,`pcI}; // ASRA + 8'h48: MCODE_S0 = {`mcASL,`mcrA,`mcrn,`mcrA,`mcpK,`amPC,`pcI}; // ASLA + 8'h49: MCODE_S0 = {`mcROL,`mcrA,`mcrn,`mcrA,`mcpK,`amPC,`pcI}; // ROLA + 8'h4A: MCODE_S0 = {`mcDEC,`mcrA,`mcrn,`mcrA,`mcpK,`amPC,`pcI}; // DECA + 8'h4C: MCODE_S0 = {`mcINC,`mcrA,`mcrn,`mcrA,`mcpK,`amPC,`pcI}; // INCA + 8'h4D: MCODE_S0 = {`mcTST,`mcrA,`mcrn,`mcrn,`mcpK,`amPC,`pcI}; // TSTA + 8'h4F: MCODE_S0 = {`mcLDR,`mcrn,`mcrn,`mcrA,`mcpK,`amPC,`pcI}; // CLRA +//----------------------------------------------------------------------------------------- + 8'h50: MCODE_S0 = {`mcNEG,`mcrB,`mcrn,`mcrB,`mcpK,`amPC,`pcI}; // NEGB + 8'h53: MCODE_S0 = {`mcNOT,`mcrB,`mcrn,`mcrB,`mcpK,`amPC,`pcI}; // COMB + 8'h54: MCODE_S0 = {`mcLSR,`mcrB,`mcrn,`mcrB,`mcpK,`amPC,`pcI}; // LSRB + 8'h56: MCODE_S0 = {`mcROR,`mcrB,`mcrn,`mcrB,`mcpK,`amPC,`pcI}; // RORB + 8'h57: MCODE_S0 = {`mcASR,`mcrB,`mcrn,`mcrB,`mcpK,`amPC,`pcI}; // ASRB + 8'h58: MCODE_S0 = {`mcASL,`mcrB,`mcrn,`mcrB,`mcpK,`amPC,`pcI}; // ASLB + 8'h59: MCODE_S0 = {`mcROL,`mcrB,`mcrn,`mcrB,`mcpK,`amPC,`pcI}; // ROLB + 8'h5A: MCODE_S0 = {`mcDEC,`mcrB,`mcrn,`mcrB,`mcpK,`amPC,`pcI}; // DECB + 8'h5C: MCODE_S0 = {`mcINC,`mcrB,`mcrn,`mcrB,`mcpK,`amPC,`pcI}; // INCB + 8'h5D: MCODE_S0 = {`mcTST,`mcrB,`mcrn,`mcrn,`mcpK,`amPC,`pcI}; // TSTB + 8'h5F: MCODE_S0 = {`mcLDR,`mcrn,`mcrn,`mcrB,`mcpK,`amPC,`pcI}; // CLRB +//----------------------------------------------------------------------------------------- + 8'h60: MCODE_S0 = `MC_NEXTP; // NEG($nn+X) + 8'h61: MCODE_S0 = `MC_NEXTP; // AIM#,($nn+X) + 8'h62: MCODE_S0 = `MC_NEXTP; // OIM#,($nn+X) + 8'h63: MCODE_S0 = `MC_NEXTP; // COM($nn+X) + 8'h64: MCODE_S0 = `MC_NEXTP; // LSR($nn+X) + 8'h65: MCODE_S0 = `MC_NEXTP; // EIM#,($nn+X) + 8'h66: MCODE_S0 = `MC_NEXTP; // ROR($nn+X) + 8'h67: MCODE_S0 = `MC_NEXTP; // ASR($nn+X) + 8'h68: MCODE_S0 = `MC_NEXTP; // ASL($nn+X) + 8'h69: MCODE_S0 = `MC_NEXTP; // ROL($nn+X) + 8'h6A: MCODE_S0 = `MC_NEXTP; // DEC($nn+X) + 8'h6B: MCODE_S0 = `MC_NEXTP; // TIM#,($nn+X) + 8'h6C: MCODE_S0 = `MC_NEXTP; // INC($nn+X) + 8'h6D: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // TST($nn+X) + 8'h6E: MCODE_S0 = `MC_NEXTP; // JMP.$nn+X + 8'h6F: MCODE_S0 = `MC_NEXTP; // CLR($nn+X) +//----------------------------------------------------------------------------------------- + 8'h70: MCODE_S0 = `MC_NEXTP; // NEG($nnnn) + 8'h71: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // AIM#,($nn) + 8'h72: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // OIM#,($nn) + 8'h73: MCODE_S0 = `MC_NEXTP; // COM($nnnn) + 8'h74: MCODE_S0 = `MC_NEXTP; // LSR($nnnn) + 8'h75: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // EIM#,($nnnn) + 8'h76: MCODE_S0 = `MC_NEXTP; // ROR($nnnn) + 8'h77: MCODE_S0 = `MC_NEXTP; // ASR($nnnn) + 8'h78: MCODE_S0 = `MC_NEXTP; // ASL($nnnn) + 8'h79: MCODE_S0 = `MC_NEXTP; // ROL($nnnn) + 8'h7A: MCODE_S0 = `MC_NEXTP; // DEC($nnnn) + 8'h7B: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // TIM#,($nn) + 8'h7C: MCODE_S0 = `MC_NEXTP; // INC($nnnn) + 8'h7D: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // TST($nnnn) + 8'h7E: MCODE_S0 = `MC_NEXTP; // JMP.$nnnn + 8'h7F: MCODE_S0 = `MC_NEXTP; // CLR($nnnn) +//----------------------------------------------------------------------------------------- + 8'h80: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // SUBA# + 8'h81: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // CMPA# + 8'h82: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // SBCA# + 8'h83: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrU,`mcpN,`amP1,`pcI}; // SUBD# + 8'h84: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // ANDA# + 8'h85: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // BITA# + 8'h86: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // LDA# + 8'h88: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // EORA# + 8'h89: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // ADCA# + 8'h8A: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // ORA# + 8'h8B: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // ADDA# + 8'h8C: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrU,`mcpN,`amP1,`pcI}; // CMPX# + 8'h8D: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // BSR + 8'h8E: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrU,`mcpN,`amP1,`pcI}; // LDS# +//----------------------------------------------------------------------------------------- + 8'h90: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // SUBA($nn) + 8'h91: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // CMPA($nn) + 8'h92: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // SBCA($nn) + 8'h93: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // SUBD($nn) + 8'h94: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ANDA($nn) + 8'h95: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // BITA($nn) + 8'h96: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // LDA($nn) + 8'h97: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // STA($nn) + 8'h98: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // EORA($nn) + 8'h99: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ADCA($nn) + 8'h9A: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ORA($nn) + 8'h9B: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ADDA($nn) + 8'h9C: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // CMPX($nn) + 8'h9D: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // JSR($nn) + 8'h9E: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // LDS($nn) + 8'h9F: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // STS($nn) +//----------------------------------------------------------------------------------------- + 8'hA0: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // SUBA($nn+X) + 8'hA1: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // CMPA($nn+X) + 8'hA2: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // SBCA($nn+X) + 8'hA3: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // SUBD($nn+X) + 8'hA4: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // ANDA($nn+X) + 8'hA5: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // BITA($nn+X) + 8'hA6: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // LDA($nn+X) + 8'hA7: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // STA($nn+X) + 8'hA8: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // EORA($nn+X) + 8'hA9: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // ADCA($nn+X) + 8'hAA: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // ORA($nn+X) + 8'hAB: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // ADDA($nn+X) + 8'hAC: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // CMPX($nn+X) + 8'hAD: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // JSR.$nn+X + 8'hAE: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // LDS($nn+X) + 8'hAF: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // STS($nn+X) +//----------------------------------------------------------------------------------------- + 8'hB0: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // SUBA($nnnn) + 8'hB1: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // CMPA($nnnn) + 8'hB2: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // SBCA($nnnn) + 8'hB3: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // SUBD($nnnn) + 8'hB4: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ANDA($nnnn) + 8'hB5: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // BITA($nnnn) + 8'hB6: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // LDA($nnnn) + 8'hB7: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // STA($nnnn) + 8'hB8: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // EORA($nnnn) + 8'hB9: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ADCA($nnnn) + 8'hBA: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ORA($nnnn) + 8'hBB: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ADDA($nnnn) + 8'hBC: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // CMPX($nnnn) + 8'hBD: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // JSR.$nnnn + 8'hBE: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // LDS($nnnn) + 8'hBF: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // STS($nnnn) +//----------------------------------------------------------------------------------------- + 8'hC0: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // SUBB# + 8'hC1: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // CMPB# + 8'hC2: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // SBCB# + 8'hC3: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrU,`mcpN,`amP1,`pcI}; // ADDD# + 8'hC4: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // ANDB# + 8'hC5: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // BITB# + 8'hC6: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // LDB# + 8'hC8: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // EORB# + 8'hC9: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // ADCB# + 8'hCA: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // ORB# + 8'hCB: MCODE_S0 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // ADDB# + 8'hCC: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrU,`mcpN,`amP1,`pcI}; // LDD# + 8'hCE: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrU,`mcpN,`amP1,`pcI}; // LDX# +//----------------------------------------------------------------------------------------- + 8'hD0: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // SUBB($nn) + 8'hD1: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // CMPB($nn) + 8'hD2: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // SBCB($nn) + 8'hD3: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ADDD($nn) + 8'hD4: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ANDB($nn) + 8'hD5: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // BITB($nn) + 8'hD6: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // LDB($nn) + 8'hD7: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // STB($nn) + 8'hD8: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // EORB($nn) + 8'hD9: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ADCB($nn) + 8'hDA: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ORB($nn) + 8'hDB: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ADDB($nn) + 8'hDC: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // LDD($nn) + 8'hDD: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // STD($nn) + 8'hDE: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // LDX($nn) + 8'hDF: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // STX($nn) +//----------------------------------------------------------------------------------------- + 8'hE0: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // SUBB($nn+X) + 8'hE1: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // CMPB($nn+X) + 8'hE2: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // SBCB($nn+X) + 8'hE3: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // ADDD($nn+X) + 8'hE4: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // ANDB($nn+X) + 8'hE5: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // BITB($nn+X) + 8'hE6: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // LDB($nn+X) + 8'hE7: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // STB($nn+X) + 8'hE8: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // EORB($nn+X) + 8'hE9: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // ADCB($nn+X) + 8'hEA: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // ORB($nn+X) + 8'hEB: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // ADDB($nn+X) + 8'hEC: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // LDD($nn+X) + 8'hED: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // STD($nn+X) + 8'hEE: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // LDX($nn+X) + 8'hEF: MCODE_S0 = {`mcLDN,`mcrM,`mcrn,`mcrT,`mcpN,`amP1,`pcI}; // STX($nn+X) +//----------------------------------------------------------------------------------------- + 8'hF0: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // SUBB($nnnn) + 8'hF1: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // CMPB($nnnn) + 8'hF2: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // SBCB($nnnn) + 8'hF3: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ADDD($nnnn) + 8'hF4: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ANDB($nnnn) + 8'hF5: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // BITB($nnnn) + 8'hF6: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // LDB($nnnn) + 8'hF7: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // STB($nnnn) + 8'hF8: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // EORB($nnnn) + 8'hF9: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ADCB($nnnn) + 8'hFA: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ORB($nnnn) + 8'hFB: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // ADDB($nnnn) + 8'hFC: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // LDD($nnnn) + 8'hFD: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // STD($nnnn) + 8'hFE: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // LDX($nnnn) + 8'hFF: MCODE_S0 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // STX($nnnn) +//----------------------------------------------------------------------------------------- + default: MCODE_S0 = `MC_TRAP; + endcase +end +endfunction + + +function `mcwidth MCODE_S1; +input [7:0] opc; +begin + case (opc) +//----------------------------------------------------------------------------------------- + 8'h12: MCODE_S1 = {`mcADD,`mcrX,`mcrT,`mcrX,`mcp0,`amPC,`pcN}; // (undoc1) + 8'h13: MCODE_S1 = {`mcADD,`mcrX,`mcrT,`mcrX,`mcp0,`amPC,`pcN}; // (undoc2) + 8'h18: MCODE_S1 = {`mcLDN,`mcrT,`mcrn,`mcrD,`mcp0,`amPC,`pcN}; // XGDX +//----------------------------------------------------------------------------------------- + 8'h20: MCODE_S1 = `MC_LDBRO; // BRA + 8'h21: MCODE_S1 = `MC_LDBRO; // BRN + 8'h22: MCODE_S1 = `MC_LDBRO; // BHI + 8'h23: MCODE_S1 = `MC_LDBRO; // BLS + 8'h24: MCODE_S1 = `MC_LDBRO; // BCC + 8'h25: MCODE_S1 = `MC_LDBRO; // BCS + 8'h26: MCODE_S1 = `MC_LDBRO; // BNE + 8'h27: MCODE_S1 = `MC_LDBRO; // BEQ + 8'h28: MCODE_S1 = `MC_LDBRO; // BVC + 8'h29: MCODE_S1 = `MC_LDBRO; // BVS + 8'h2A: MCODE_S1 = `MC_LDBRO; // BPL + 8'h2B: MCODE_S1 = `MC_LDBRO; // BMI + 8'h2C: MCODE_S1 = `MC_LDBRO; // BGE + 8'h2D: MCODE_S1 = `MC_LDBRO; // BLT + 8'h2E: MCODE_S1 = `MC_LDBRO; // BGT + 8'h2F: MCODE_S1 = `MC_LDBRO; // BLE +//----------------------------------------------------------------------------------------- + 8'h32: MCODE_S1 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // PULA + 8'h33: MCODE_S1 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // PULB + 8'h36: MCODE_S1 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // PSHA + 8'h37: MCODE_S1 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // PSHB + 8'h38: MCODE_S1 = {`mcLDN,`mcrN,`mcrn,`mcrX,`mcpN,`amSP,`pcN}; // PULX + 8'h39: MCODE_S1 = {`mcINC,`mcrS,`mcrn,`mcrS,`mcpN,`amPC,`pcN}; // RTS + 8'h3B: MCODE_S1 = {`mcPUL,`mcrM,`mcrn,`mcrB,`mcpN,`amS1,`pcN}; // RTI + 8'h3C: MCODE_S1 = {`mcLDN,`mcrX,`mcrn,`mcrM,`mcpN,`amS1,`pcN}; // PSHX + 8'h3D: MCODE_S1 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // MUL +//----------------------------------------------------------------------------------------- + 8'h60: MCODE_S1 = `MC_LDIXO; // NEG($nn+X) + 8'h61: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amPC,`pcI}; // AIM#,($nn+X) + 8'h62: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amPC,`pcI}; // OIM#,($nn+X) + 8'h63: MCODE_S1 = `MC_LDIXO; // COM($nn+X) + 8'h64: MCODE_S1 = `MC_LDIXO; // LSR($nn+X) + 8'h65: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amPC,`pcI}; // EIM#,($nn+X) + 8'h66: MCODE_S1 = `MC_LDIXO; // ROR($nn+X) + 8'h67: MCODE_S1 = `MC_LDIXO; // ASR($nn+X) + 8'h68: MCODE_S1 = `MC_LDIXO; // ASL($nn+X) + 8'h69: MCODE_S1 = `MC_LDIXO; // ROL($nn+X) + 8'h6A: MCODE_S1 = `MC_LDIXO; // DEC($nn+X) + 8'h6B: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amPC,`pcI}; // TIM#,($nn+X) + 8'h6C: MCODE_S1 = `MC_LDIXO; // INC($nn+X) + 8'h6D: MCODE_S1 = {`mcTST,`mcrM,`mcrn,`mcrn,`mcpN,`amXT,`pcI}; // TST($nn+X) + 8'h6E: MCODE_S1 = `MC_LDIXO; // JMP.$nn+X + 8'h6F: MCODE_S1 = `MC_LDIXO; // CLR($nn+X) +//----------------------------------------------------------------------------------------- + 8'h70: MCODE_S1 = `MC_LDEXH; // NEG($nnnn) + 8'h71: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // AIM#,($nn) + 8'h72: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // OIM#,($nn) + 8'h73: MCODE_S1 = `MC_LDEXH; // COM($nnnn) + 8'h74: MCODE_S1 = `MC_LDEXH; // LSR($nnnn) + 8'h75: MCODE_S1 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // EIM#,($nnnn) + 8'h76: MCODE_S1 = `MC_LDEXH; // ROR($nnnn) + 8'h77: MCODE_S1 = `MC_LDEXH; // ASR($nnnn) + 8'h78: MCODE_S1 = `MC_LDEXH; // ASL($nnnn) + 8'h79: MCODE_S1 = `MC_LDEXH; // ROL($nnnn) + 8'h7A: MCODE_S1 = `MC_LDEXH; // DEC($nnnn) + 8'h7B: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amP1,`pcI}; // TIM#,($nn) + 8'h7C: MCODE_S1 = `MC_LDEXH; // INC($nnnn) + 8'h7D: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // TST($nnnn) + 8'h7E: MCODE_S1 = `MC_LDEXH; // JMP.$nnnn + 8'h7F: MCODE_S1 = `MC_LDEXH; // CLR($nnnn) +//----------------------------------------------------------------------------------------- + 8'h80: MCODE_S1 = {`mcSUB,`mcrA,`mcrM,`mcrA,`mcp0,`amPC,`pcI}; // SUBA# + 8'h81: MCODE_S1 = {`mcSUB,`mcrA,`mcrM,`mcrn,`mcp0,`amPC,`pcI}; // CMPA# + 8'h82: MCODE_S1 = {`mcSBC,`mcrA,`mcrM,`mcrA,`mcp0,`amPC,`pcI}; // SBCA# + 8'h83: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrV,`mcpN,`amP1,`pcI}; // SUBD# + 8'h84: MCODE_S1 = {`mcAND,`mcrA,`mcrM,`mcrA,`mcp0,`amPC,`pcI}; // ANDA# + 8'h85: MCODE_S1 = {`mcAND,`mcrA,`mcrM,`mcrn,`mcp0,`amPC,`pcI}; // BITA# + 8'h86: MCODE_S1 = {`mcLDR,`mcrM,`mcrn,`mcrA,`mcp0,`amPC,`pcI}; // LDA# + 8'h88: MCODE_S1 = {`mcEOR,`mcrA,`mcrM,`mcrA,`mcp0,`amPC,`pcI}; // EORA# + 8'h89: MCODE_S1 = {`mcADC,`mcrA,`mcrM,`mcrA,`mcp0,`amPC,`pcI}; // ADCA# + 8'h8A: MCODE_S1 = {`mcLOR,`mcrA,`mcrM,`mcrA,`mcp0,`amPC,`pcI}; // ORA# + 8'h8B: MCODE_S1 = {`mcADD,`mcrA,`mcrM,`mcrA,`mcp0,`amPC,`pcI}; // ADDA# + 8'h8C: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrV,`mcpN,`amP1,`pcI}; // CMPX# + 8'h8D: MCODE_S1 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // BSR + 8'h8E: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrV,`mcpN,`amP1,`pcI}; // LDS# +//----------------------------------------------------------------------------------------- + 8'h90: MCODE_S1 = {`mcSUB,`mcrA,`mcrM,`mcrA,`mcpN,`amE0,`pcI}; // SUBA($nn) + 8'h91: MCODE_S1 = {`mcSUB,`mcrA,`mcrM,`mcrn,`mcpN,`amE0,`pcI}; // CMPA($nn) + 8'h92: MCODE_S1 = {`mcSBC,`mcrA,`mcrM,`mcrA,`mcpN,`amE0,`pcI}; // SBCA($nn) + 8'h93: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrU,`mcpN,`amE0,`pcI}; // SUBD($nn) + 8'h94: MCODE_S1 = {`mcAND,`mcrA,`mcrM,`mcrA,`mcpN,`amE0,`pcI}; // ANDA($nn) + 8'h95: MCODE_S1 = {`mcAND,`mcrA,`mcrM,`mcrn,`mcpN,`amE0,`pcI}; // BITA($nn) + 8'h96: MCODE_S1 = {`mcLDR,`mcrM,`mcrn,`mcrA,`mcpN,`amE0,`pcI}; // LDA($nn) + 8'h97: MCODE_S1 = {`mcLDR,`mcrA,`mcrn,`mcrM,`mcpN,`amE0,`pcI}; // STA($nn) + 8'h98: MCODE_S1 = {`mcEOR,`mcrA,`mcrM,`mcrA,`mcpN,`amE0,`pcI}; // EORA($nn) + 8'h99: MCODE_S1 = {`mcADC,`mcrA,`mcrM,`mcrA,`mcpN,`amE0,`pcI}; // ADCA($nn) + 8'h9A: MCODE_S1 = {`mcLOR,`mcrA,`mcrM,`mcrA,`mcpN,`amE0,`pcI}; // ORA($nn) + 8'h9B: MCODE_S1 = {`mcADD,`mcrA,`mcrM,`mcrA,`mcpN,`amE0,`pcI}; // ADDA($nn) + 8'h9C: MCODE_S1 = {`mcLDN,`mcrN,`mcrn,`mcrT,`mcpN,`amE0,`pcI}; // CMPX($nn) + 8'h9D: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amPC,`pcI}; // JSR($nn) + 8'h9E: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrU,`mcpN,`amE0,`pcI}; // LDS($nn) + 8'h9F: MCODE_S1 = {`mcLDN,`mcrS,`mcrn,`mcrN,`mcpN,`amE0,`pcI}; // STS($nn) +//----------------------------------------------------------------------------------------- + 8'hA0: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // SUBA($nn+X) + 8'hA1: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // CMPA($nn+X) + 8'hA2: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // SBCA($nn+X) + 8'hA3: MCODE_S1 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // SUBD($nn+X) + 8'hA4: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // ANDA($nn+X) + 8'hA5: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // BITA($nn+X) + 8'hA6: MCODE_S1 = {`mcLDR,`mcrM,`mcrn,`mcrA,`mcpN,`amXT,`pcI}; // LDA($nn+X) + 8'hA7: MCODE_S1 = {`mcLDR,`mcrA,`mcrn,`mcrM,`mcpN,`amXT,`pcI}; // STA($nn+X) + 8'hA8: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // EORA($nn+X) + 8'hA9: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // ADCA($nn+X) + 8'hAA: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // ORA($nn+X) + 8'hAB: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // ADDA($nn+X) + 8'hAC: MCODE_S1 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // CMPX($nn+X) + 8'hAD: MCODE_S1 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcI}; // JSR.$nn+X + 8'hAE: MCODE_S1 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // LDS($nn+X) + 8'hAF: MCODE_S1 = {`mcLDN,`mcrS,`mcrn,`mcrN,`mcpN,`amXT,`pcI}; // STS($nn+X) +//----------------------------------------------------------------------------------------- + 8'hB0: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // SUBA($nnnn) + 8'hB1: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // CMPA($nnnn) + 8'hB2: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // SBCA($nnnn) + 8'hB3: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // SUBD($nnnn) + 8'hB4: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // ANDA($nnnn) + 8'hB5: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // BITA($nnnn) + 8'hB6: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // LDA($nnnn) + 8'hB7: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // STA($nnnn) + 8'hB8: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // EORA($nnnn) + 8'hB9: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // ADCA($nnnn) + 8'hBA: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // ORA($nnnn) + 8'hBB: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // ADDA($nnnn) + 8'hBC: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // CMPX($nnnn) + 8'hBD: MCODE_S1 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amPC,`pcI}; // JSR.$nnnn + 8'hBE: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // LDS($nnnn) + 8'hBF: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // STS($nnnn) +//----------------------------------------------------------------------------------------- + 8'hC0: MCODE_S1 = {`mcSUB,`mcrB,`mcrM,`mcrB,`mcp0,`amPC,`pcI}; // SUBB# + 8'hC1: MCODE_S1 = {`mcSUB,`mcrB,`mcrM,`mcrn,`mcp0,`amPC,`pcI}; // CMPB# + 8'hC2: MCODE_S1 = {`mcSBC,`mcrB,`mcrM,`mcrB,`mcp0,`amPC,`pcI}; // SBCB# + 8'hC3: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrV,`mcpN,`amP1,`pcI}; // ADDD# + 8'hC4: MCODE_S1 = {`mcAND,`mcrB,`mcrM,`mcrB,`mcp0,`amPC,`pcI}; // ANDB# + 8'hC5: MCODE_S1 = {`mcAND,`mcrB,`mcrM,`mcrn,`mcp0,`amPC,`pcI}; // BITB# + 8'hC6: MCODE_S1 = {`mcLDR,`mcrM,`mcrn,`mcrB,`mcp0,`amPC,`pcI}; // LDB# + 8'hC8: MCODE_S1 = {`mcEOR,`mcrB,`mcrM,`mcrB,`mcp0,`amPC,`pcI}; // EORB# + 8'hC9: MCODE_S1 = {`mcADC,`mcrB,`mcrM,`mcrB,`mcp0,`amPC,`pcI}; // ADCB# + 8'hCA: MCODE_S1 = {`mcLOR,`mcrB,`mcrM,`mcrB,`mcp0,`amPC,`pcI}; // ORB# + 8'hCB: MCODE_S1 = {`mcADD,`mcrB,`mcrM,`mcrB,`mcp0,`amPC,`pcI}; // ADDB# + 8'hCC: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrV,`mcpN,`amP1,`pcI}; // LDD# + 8'hCE: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrV,`mcpN,`amP1,`pcI}; // LDX# +//----------------------------------------------------------------------------------------- + 8'hD0: MCODE_S1 = {`mcSUB,`mcrB,`mcrM,`mcrB,`mcpN,`amE0,`pcI}; // SUBB($nn) + 8'hD1: MCODE_S1 = {`mcSUB,`mcrB,`mcrM,`mcrn,`mcpN,`amE0,`pcI}; // CMPB($nn) + 8'hD2: MCODE_S1 = {`mcSBC,`mcrB,`mcrM,`mcrB,`mcpN,`amE0,`pcI}; // SBCB($nn) + 8'hD3: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrU,`mcpN,`amE0,`pcI}; // ADDD($nn) + 8'hD4: MCODE_S1 = {`mcAND,`mcrB,`mcrM,`mcrB,`mcpN,`amE0,`pcI}; // ANDB($nn) + 8'hD5: MCODE_S1 = {`mcAND,`mcrB,`mcrM,`mcrn,`mcpN,`amE0,`pcI}; // BITB($nn) + 8'hD6: MCODE_S1 = {`mcLDR,`mcrM,`mcrn,`mcrB,`mcpN,`amE0,`pcI}; // LDB($nn) + 8'hD7: MCODE_S1 = {`mcLDR,`mcrB,`mcrn,`mcrM,`mcpN,`amE0,`pcI}; // STB($nn) + 8'hD8: MCODE_S1 = {`mcEOR,`mcrB,`mcrM,`mcrB,`mcpN,`amE0,`pcI}; // EORB($nn) + 8'hD9: MCODE_S1 = {`mcADC,`mcrB,`mcrM,`mcrB,`mcpN,`amE0,`pcI}; // ADCB($nn) + 8'hDA: MCODE_S1 = {`mcLOR,`mcrB,`mcrM,`mcrB,`mcpN,`amE0,`pcI}; // ORB($nn) + 8'hDB: MCODE_S1 = {`mcADD,`mcrB,`mcrM,`mcrB,`mcpN,`amE0,`pcI}; // ADDB($nn) + 8'hDC: MCODE_S1 = {`mcLDN,`mcrN,`mcrn,`mcrD,`mcpN,`amE0,`pcI}; // LDD($nn) + 8'hDD: MCODE_S1 = {`mcLDN,`mcrD,`mcrn,`mcrN,`mcpN,`amE0,`pcI}; // STD($nn) + 8'hDE: MCODE_S1 = {`mcLDN,`mcrN,`mcrn,`mcrX,`mcpN,`amE0,`pcI}; // LDX($nn) + 8'hDF: MCODE_S1 = {`mcLDN,`mcrX,`mcrn,`mcrN,`mcpN,`amE0,`pcI}; // STX($nn) +//----------------------------------------------------------------------------------------- + 8'hE0: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // SUBB($nn+X) + 8'hE1: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // CMPB($nn+X) + 8'hE2: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // SBCB($nn+X) + 8'hE3: MCODE_S1 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // ADDD($nn+X) + 8'hE4: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // ANDB($nn+X) + 8'hE5: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // BITB($nn+X) + 8'hE6: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // LDB($nn+X) + 8'hE7: MCODE_S1 = {`mcLDN,`mcrB,`mcrn,`mcrM,`mcpN,`amXT,`pcI}; // STB($nn+X) + 8'hE8: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // EORB($nn+X) + 8'hE9: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // ADCB($nn+X) + 8'hEA: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // ORB($nn+X) + 8'hEB: MCODE_S1 = {`mcLDN,`mcrM,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // ADDB($nn+X) + 8'hEC: MCODE_S1 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // LDD($nn+X) + 8'hED: MCODE_S1 = {`mcLDN,`mcrD,`mcrn,`mcrN,`mcpN,`amXT,`pcI}; // STD($nn+X) + 8'hEE: MCODE_S1 = {`mcLDN,`mcrN,`mcrn,`mcrE,`mcpN,`amXT,`pcI}; // LDX($nn+X) + 8'hEF: MCODE_S1 = {`mcLDN,`mcrX,`mcrn,`mcrN,`mcpN,`amXT,`pcI}; // STX($nn+X) +//----------------------------------------------------------------------------------------- + 8'hF0: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // SUBB($nnnn) + 8'hF1: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // CMPB($nnnn) + 8'hF2: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // SBCB($nnnn) + 8'hF3: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // ADDD($nnnn) + 8'hF4: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // ANDB($nnnn) + 8'hF5: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // BITB($nnnn) + 8'hF6: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // LDB($nnnn) + 8'hF7: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // STB($nnnn) + 8'hF8: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // EORB($nnnn) + 8'hF9: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // ADCB($nnnn) + 8'hFA: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // ORB($nnnn) + 8'hFB: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // ADDB($nnnn) + 8'hFC: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // LDD($nnnn) + 8'hFD: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // STD($nnnn) + 8'hFE: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // LDX($nnnn) + 8'hFF: MCODE_S1 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // STX($nnnn) +//----------------------------------------------------------------------------------------- + default: MCODE_S1 = `MC_HALT; + endcase +end +endfunction + + +function `mcwidth MCODE_S2; +input [7:0] opc; +begin + case (opc) +//----------------------------------------------------------------------------------------- + 8'h20: MCODE_S2 = {`mcAPC, `bfRA ,`mcrn,`mcp0,`amPC,`pcN}; // BRA + 8'h21: MCODE_S2 = {`mcAPC, `bfRN ,`mcrn,`mcp0,`amPC,`pcN}; // BRN + 8'h22: MCODE_S2 = {`mcAPC, `bfHI ,`mcrn,`mcp0,`amPC,`pcN}; // BHI + 8'h23: MCODE_S2 = {`mcAPC, `bfLS ,`mcrn,`mcp0,`amPC,`pcN}; // BLS + 8'h24: MCODE_S2 = {`mcAPC, `bfCC ,`mcrn,`mcp0,`amPC,`pcN}; // BCC + 8'h25: MCODE_S2 = {`mcAPC, `bfCS ,`mcrn,`mcp0,`amPC,`pcN}; // BCS + 8'h26: MCODE_S2 = {`mcAPC, `bfNE ,`mcrn,`mcp0,`amPC,`pcN}; // BNE + 8'h27: MCODE_S2 = {`mcAPC, `bfEQ ,`mcrn,`mcp0,`amPC,`pcN}; // BEQ + 8'h28: MCODE_S2 = {`mcAPC, `bfVC ,`mcrn,`mcp0,`amPC,`pcN}; // BVC + 8'h29: MCODE_S2 = {`mcAPC, `bfVS ,`mcrn,`mcp0,`amPC,`pcN}; // BVS + 8'h2A: MCODE_S2 = {`mcAPC, `bfPL ,`mcrn,`mcp0,`amPC,`pcN}; // BPL + 8'h2B: MCODE_S2 = {`mcAPC, `bfMI ,`mcrn,`mcp0,`amPC,`pcN}; // BMI + 8'h2C: MCODE_S2 = {`mcAPC, `bfGE ,`mcrn,`mcp0,`amPC,`pcN}; // BGE + 8'h2D: MCODE_S2 = {`mcAPC, `bfLT ,`mcrn,`mcp0,`amPC,`pcN}; // BLT + 8'h2E: MCODE_S2 = {`mcAPC, `bfGT ,`mcrn,`mcp0,`amPC,`pcN}; // BGT + 8'h2F: MCODE_S2 = {`mcAPC, `bfLE ,`mcrn,`mcp0,`amPC,`pcN}; // BLE +//----------------------------------------------------------------------------------------- + 8'h32: MCODE_S2 = `MC_NEXTI; // PULA + 8'h33: MCODE_S2 = `MC_NEXTI; // PULB + 8'h36: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // PSHA + 8'h37: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // PSHB + 8'h38: MCODE_S2 = {`mcLOR,`mcrX,`mcrM,`mcrX,`mcpN,`amS1,`pcN}; // PULX + 8'h39: MCODE_S2 = {`mcLDN,`mcrN,`mcrn,`mcrP,`mcpN,`amSP,`pcN}; // RTS + 8'h3B: MCODE_S2 = {`mcPUL,`mcrM,`mcrn,`mcrA,`mcpN,`amS1,`pcN}; // RTI + 8'h3C: MCODE_S2 = {`mcLDN,`mcrX,`mcrn,`mcrN,`mcpN,`amSP,`pcN}; // PSHX + 8'h3D: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // MUL +//----------------------------------------------------------------------------------------- + 8'h60: MCODE_S2 = `MC_LDIXM; // NEG($nn+X) + 8'h61: MCODE_S2 = `MC_LDIXO; // AIM#,($nn+X) + 8'h62: MCODE_S2 = `MC_LDIXO; // OIM#,($nn+X) + 8'h63: MCODE_S2 = `MC_LDIXM; // COM($nn+X) + 8'h64: MCODE_S2 = `MC_LDIXM; // LSR($nn+X) + 8'h65: MCODE_S2 = `MC_LDIXO; // EIM#,($nn+X) + 8'h66: MCODE_S2 = `MC_LDIXM; // ROR($nn+X) + 8'h67: MCODE_S2 = `MC_LDIXM; // ASR($nn+X) + 8'h68: MCODE_S2 = `MC_LDIXM; // ASL($nn+X) + 8'h69: MCODE_S2 = `MC_LDIXM; // ROL($nn+X) + 8'h6A: MCODE_S2 = `MC_LDIXM; // DEC($nn+X) + 8'h6B: MCODE_S2 = `MC_LDIXO; // TIM#,($nn+X) + 8'h6C: MCODE_S2 = `MC_LDIXM; // INC($nn+X) + 8'h6D: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // TST($nn+X) + 8'h6E: MCODE_S2 = {`mcADD,`mcrX,`mcrT,`mcrP,`mcp0,`amPC,`pcN}; // JMP.$nn+X + 8'h6F: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amXT,`pcN}; // CLR($nn+X) +//----------------------------------------------------------------------------------------- + 8'h70: MCODE_S2 = `MC_LDEXL; // NEG($nnnn) + 8'h71: MCODE_S2 = {`mcAND,`mcrT,`mcrM,`mcrT,`mcpN,`amE0,`pcI}; // AIM#,($nn) + 8'h72: MCODE_S2 = {`mcLOR,`mcrT,`mcrM,`mcrT,`mcpN,`amE0,`pcI}; // OIM#,($nn) + 8'h73: MCODE_S2 = `MC_LDEXL; // COM($nnnn) + 8'h74: MCODE_S2 = `MC_LDEXL; // LSR($nnnn) + 8'h75: MCODE_S2 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amP1,`pcI}; // EIM#,($nnnn) + 8'h76: MCODE_S2 = `MC_LDEXL; // ROR($nnnn) + 8'h77: MCODE_S2 = `MC_LDEXL; // ASR($nnnn) + 8'h78: MCODE_S2 = `MC_LDEXL; // ASL($nnnn) + 8'h79: MCODE_S2 = `MC_LDEXL; // ROL($nnnn) + 8'h7A: MCODE_S2 = `MC_LDEXL; // DEC($nnnn) + 8'h7B: MCODE_S2 = {`mcAND,`mcrT,`mcrM,`mcrn,`mcpN,`amE0,`pcI}; // TIM#,($nn) + 8'h7C: MCODE_S2 = `MC_LDEXL; // INC($nnnn) + 8'h7D: MCODE_S2 = {`mcTST,`mcrM,`mcrn,`mcrn,`mcpN,`amE0,`pcI}; // TST($nnnn) + 8'h7E: MCODE_S2 = {`mcLOR,`mcrM,`mcrE,`mcrP,`mcp0,`amPC,`pcN}; // JMP.$nnnn + 8'h7F: MCODE_S2 = `MC_LDEXL; // CLR($nnnn) +//----------------------------------------------------------------------------------------- + 8'h83: MCODE_S2 = {`mcSUB,`mcrD,`mcrT,`mcrD,`mcp0,`amPC,`pcI}; // SUBD# + 8'h8C: MCODE_S2 = {`mcSUB,`mcrX,`mcrT,`mcrn,`mcp0,`amPC,`pcI}; // CMPX# + 8'h8D: MCODE_S2 = {`mcPSH,`mcrP,`mcrn,`mcrM,`mcpN,`amSP,`pcN}; // BSR + 8'h8E: MCODE_S2 = {`mcLDR,`mcrT,`mcrn,`mcrS,`mcp0,`amPC,`pcI}; // LDS# +//----------------------------------------------------------------------------------------- + 8'h90: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // SUBA($nn) + 8'h91: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // CMPA($nn) + 8'h92: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // SBCA($nn) + 8'h93: MCODE_S2 = {`mcLDN,`mcrM,`mcrn,`mcrV,`mcpN,`amE1,`pcN}; // SUBD($nn) + 8'h94: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // ANDA($nn) + 8'h95: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // BITA($nn) + 8'h96: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // LDA($nn) + 8'h97: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // STA($nn) + 8'h98: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // EORA($nn) + 8'h99: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // ADCA($nn) + 8'h9A: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // ORA($nn) + 8'h9B: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // ADDA($nn) + 8'h9C: MCODE_S2 = {`mcLOR,`mcrM,`mcrT,`mcrT,`mcpN,`amE1,`pcN}; // CMPX($nn) + 8'h9D: MCODE_S2 = {`mcPSH,`mcrP,`mcrn,`mcrM,`mcpN,`amSP,`pcN}; // JSR($nn) + 8'h9E: MCODE_S2 = {`mcLDN,`mcrM,`mcrn,`mcrV,`mcpN,`amE1,`pcN}; // LDS($nn) + 8'h9F: MCODE_S2 = {`mcLDN,`mcrS,`mcrn,`mcrM,`mcpN,`amE1,`pcN}; // STS($nn) +//----------------------------------------------------------------------------------------- + 8'hA0: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // SUBA($nn+X) + 8'hA1: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // CMPA($nn+X) + 8'hA2: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // SBCA($nn+X) + 8'hA3: MCODE_S2 = {`mcINC,`mcrT,`mcrn,`mcrT,`mcpN,`amXT,`pcN}; // SUBD($nn+X) + 8'hA4: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // ANDA($nn+X) + 8'hA5: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // BITA($nn+X) + 8'hA6: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // LDA($nn+X) + 8'hA7: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // STA($nn+X) + 8'hA8: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // EORA($nn+X) + 8'hA9: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // ADCA($nn+X) + 8'hAA: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // ORA($nn+X) + 8'hAB: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // ADDA($nn+X) + 8'hAC: MCODE_S2 = {`mcINC,`mcrT,`mcrn,`mcrT,`mcpN,`amXT,`pcN}; // CMPX($nn+X) + 8'hAD: MCODE_S2 = {`mcPSH,`mcrP,`mcrn,`mcrM,`mcpN,`amSP,`pcN}; // JSR.$nn+X + 8'hAE: MCODE_S2 = {`mcINC,`mcrT,`mcrn,`mcrT,`mcpN,`amXT,`pcN}; // LDS($nn+X) + 8'hAF: MCODE_S2 = {`mcINC,`mcrT,`mcrn,`mcrT,`mcpN,`amXT,`pcN}; // STS($nn+X) +//----------------------------------------------------------------------------------------- + 8'hB0: MCODE_S2 = {`mcSUB,`mcrA,`mcrM,`mcrA,`mcpN,`amE0,`pcI}; // SUBA($nnnn) + 8'hB1: MCODE_S2 = {`mcSUB,`mcrA,`mcrM,`mcrn,`mcpN,`amE0,`pcI}; // CMPA($nnnn) + 8'hB2: MCODE_S2 = {`mcSBC,`mcrA,`mcrM,`mcrn,`mcpN,`amE0,`pcI}; // SBCA($nnnn) + 8'hB3: MCODE_S2 = {`mcLDN,`mcrN,`mcrn,`mcrT,`mcpN,`amE0,`pcI}; // SUBD($nnnn) + 8'hB4: MCODE_S2 = {`mcAND,`mcrA,`mcrM,`mcrA,`mcpN,`amE0,`pcI}; // ANDA($nnnn) + 8'hB5: MCODE_S2 = {`mcAND,`mcrA,`mcrM,`mcrn,`mcpN,`amE0,`pcI}; // BITA($nnnn) + 8'hB6: MCODE_S2 = {`mcLDR,`mcrM,`mcrn,`mcrA,`mcpN,`amE0,`pcI}; // LDA($nnnn) + 8'hB7: MCODE_S2 = {`mcLDR,`mcrA,`mcrn,`mcrM,`mcpN,`amE0,`pcI}; // STA($nnnn) + 8'hB8: MCODE_S2 = {`mcEOR,`mcrA,`mcrM,`mcrA,`mcpN,`amE0,`pcI}; // EORA($nnnn) + 8'hB9: MCODE_S2 = {`mcADC,`mcrA,`mcrM,`mcrA,`mcpN,`amE0,`pcI}; // ADCA($nnnn) + 8'hBA: MCODE_S2 = {`mcLOR,`mcrA,`mcrM,`mcrA,`mcpN,`amE0,`pcI}; // ORA($nnnn) + 8'hBB: MCODE_S2 = {`mcADD,`mcrA,`mcrM,`mcrA,`mcpN,`amE0,`pcI}; // ADDA($nnnn) + 8'hBC: MCODE_S2 = {`mcLDN,`mcrN,`mcrn,`mcrT,`mcpN,`amE0,`pcI}; // CMPX($nnnn) + 8'hBD: MCODE_S2 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amPC,`pcI}; // JSR.$nnnn + 8'hBE: MCODE_S2 = {`mcLDN,`mcrM,`mcrn,`mcrU,`mcpN,`amE0,`pcI}; // LDS($nnnn) + 8'hBF: MCODE_S2 = {`mcLDN,`mcrS,`mcrn,`mcrN,`mcpN,`amE0,`pcI}; // STS($nnnn) +//----------------------------------------------------------------------------------------- + 8'hC3: MCODE_S2 = {`mcADD,`mcrD,`mcrT,`mcrD,`mcp0,`amPC,`pcI}; // ADDD# + 8'hCC: MCODE_S2 = {`mcLDR,`mcrT,`mcrn,`mcrD,`mcp0,`amPC,`pcI}; // LDD# + 8'hCE: MCODE_S2 = {`mcLDR,`mcrT,`mcrn,`mcrX,`mcp0,`amPC,`pcI}; // LDX# +//----------------------------------------------------------------------------------------- + 8'hD0: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // SUBB($nn) + 8'hD1: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // CMPB($nn) + 8'hD2: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // SBCB($nn) + 8'hD3: MCODE_S2 = {`mcLDN,`mcrM,`mcrn,`mcrV,`mcpN,`amE1,`pcN}; // ADDD($nn) + 8'hD4: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // ANDB($nn) + 8'hD5: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // BITB($nn) + 8'hD6: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // LDB($nn) + 8'hD7: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // STB($nn) + 8'hD8: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // EORB($nn) + 8'hD9: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // ADCB($nn) + 8'hDA: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // ORB($nn) + 8'hDB: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // ADDB($nn) + 8'hDC: MCODE_S2 = {`mcLOR,`mcrM,`mcrD,`mcrD,`mcpN,`amE1,`pcN}; // LDD($nn) + 8'hDD: MCODE_S2 = {`mcLDN,`mcrD,`mcrn,`mcrM,`mcpN,`amE1,`pcN}; // STD($nn) + 8'hDE: MCODE_S2 = {`mcLOR,`mcrM,`mcrX,`mcrX,`mcpN,`amE1,`pcN}; // LDX($nn) + 8'hDF: MCODE_S2 = {`mcLDN,`mcrX,`mcrn,`mcrM,`mcpN,`amE1,`pcN}; // STX($nn) +//----------------------------------------------------------------------------------------- + 8'hE0: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // SUBB($nn+X) + 8'hE1: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // CMPB($nn+X) + 8'hE2: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // SBCB($nn+X) + 8'hE3: MCODE_S2 = {`mcINC,`mcrT,`mcrn,`mcrT,`mcpN,`amXT,`pcN}; // ADDD($nn+X) + 8'hE4: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // ANDB($nn+X) + 8'hE5: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // BITB($nn+X) + 8'hE6: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // LDB($nn+X) + 8'hE7: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // STB($nn+X) + 8'hE8: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // EORB($nn+X) + 8'hE9: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // ADCB($nn+X) + 8'hEA: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // ORB($nn+X) + 8'hEB: MCODE_S2 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // ADDB($nn+X) + 8'hEC: MCODE_S2 = {`mcINC,`mcrT,`mcrn,`mcrT,`mcpN,`amXT,`pcN}; // LDD($nn+X) + 8'hED: MCODE_S2 = {`mcINC,`mcrT,`mcrn,`mcrT,`mcpN,`amXT,`pcN}; // STD($nn+X) + 8'hEE: MCODE_S2 = {`mcINC,`mcrT,`mcrn,`mcrT,`mcpN,`amXT,`pcN}; // LDX($nn+X) + 8'hEF: MCODE_S2 = {`mcINC,`mcrT,`mcrn,`mcrT,`mcpN,`amXT,`pcN}; // STX($nn+X) +//----------------------------------------------------------------------------------------- + 8'hF0: MCODE_S2 = {`mcSUB,`mcrB,`mcrM,`mcrB,`mcpN,`amE0,`pcI}; // SUBB($nnnn) + 8'hF1: MCODE_S2 = {`mcSUB,`mcrB,`mcrM,`mcrn,`mcpN,`amE0,`pcI}; // CMPB($nnnn) + 8'hF2: MCODE_S2 = {`mcSBC,`mcrB,`mcrM,`mcrn,`mcpN,`amE0,`pcI}; // SBCB($nnnn) + 8'hF3: MCODE_S2 = {`mcLDN,`mcrN,`mcrn,`mcrT,`mcpN,`amE0,`pcI}; // ADDD($nnnn) + 8'hF4: MCODE_S2 = {`mcAND,`mcrB,`mcrM,`mcrB,`mcpN,`amE0,`pcI}; // ANDB($nnnn) + 8'hF5: MCODE_S2 = {`mcAND,`mcrB,`mcrM,`mcrn,`mcpN,`amE0,`pcI}; // BITB($nnnn) + 8'hF6: MCODE_S2 = {`mcLDR,`mcrM,`mcrn,`mcrB,`mcpN,`amE0,`pcI}; // LDB($nnnn) + 8'hF7: MCODE_S2 = {`mcLDR,`mcrB,`mcrn,`mcrM,`mcpN,`amE0,`pcI}; // STB($nnnn) + 8'hF8: MCODE_S2 = {`mcEOR,`mcrB,`mcrM,`mcrB,`mcpN,`amE0,`pcI}; // EORB($nnnn) + 8'hF9: MCODE_S2 = {`mcADC,`mcrB,`mcrM,`mcrB,`mcpN,`amE0,`pcI}; // ADCB($nnnn) + 8'hFA: MCODE_S2 = {`mcLOR,`mcrB,`mcrM,`mcrB,`mcpN,`amE0,`pcI}; // ORB($nnnn) + 8'hFB: MCODE_S2 = {`mcADD,`mcrB,`mcrM,`mcrB,`mcpN,`amE0,`pcI}; // ADDB($nnnn) + 8'hFC: MCODE_S2 = {`mcLDN,`mcrM,`mcrn,`mcrU,`mcpN,`amE0,`pcI}; // LDD($nnnn) + 8'hFD: MCODE_S2 = {`mcLDN,`mcrD,`mcrn,`mcrN,`mcpN,`amE0,`pcI}; // STD($nnnn) + 8'hFE: MCODE_S2 = {`mcLDN,`mcrM,`mcrn,`mcrU,`mcpN,`amE0,`pcI}; // LDX($nnnn) + 8'hFF: MCODE_S2 = {`mcLDN,`mcrX,`mcrn,`mcrN,`mcpN,`amE0,`pcI}; // STX($nnnn) +//----------------------------------------------------------------------------------------- + default: MCODE_S2 = `MC_HALT; + endcase +end +endfunction + + +function `mcwidth MCODE_S3; +input [7:0] opc; +begin + case (opc) +//----------------------------------------------------------------------------------------- + 8'h36: MCODE_S3 = `MC_NEXTI; // PSHA + 8'h37: MCODE_S3 = `MC_NEXTI; // PSHB + 8'h38: MCODE_S3 = {`mcINC,`mcrS,`mcrn,`mcrS,`mcp0,`amPC,`pcN}; // PULX + 8'h39: MCODE_S3 = {`mcLOR,`mcrP,`mcrM,`mcrP,`mcpN,`amS1,`pcN}; // RTS + 8'h3B: MCODE_S3 = {`mcPUL,`mcrN,`mcrn,`mcrX,`mcpN,`amS1,`pcN}; // RTI + 8'h3C: MCODE_S3 = {`mcDEC,`mcrS,`mcrn,`mcrS,`mcpN,`amPC,`pcN}; // PSHX + 8'h3D: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // MUL +//----------------------------------------------------------------------------------------- + 8'h60: MCODE_S3 = {`mcNEG,`mcrE,`mcrn,`mcrM,`mcpN,`amXT,`pcN}; // NEG($nn+X) + 8'h61: MCODE_S3 = {`mcAND,`mcrM,`mcrE,`mcrE,`mcpN,`amXT,`pcN}; // AIM#,($nn+X) + 8'h62: MCODE_S3 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amXT,`pcN}; // OIM#,($nn+X) + 8'h63: MCODE_S3 = {`mcNOT,`mcrE,`mcrn,`mcrM,`mcpN,`amXT,`pcN}; // COM($nn+X) + 8'h64: MCODE_S3 = {`mcLSR,`mcrE,`mcrn,`mcrM,`mcpN,`amXT,`pcN}; // LSR($nn+X) + 8'h65: MCODE_S3 = {`mcEOR,`mcrM,`mcrE,`mcrE,`mcpN,`amXT,`pcN}; // EIM#,($nn+X) + 8'h66: MCODE_S3 = {`mcROR,`mcrE,`mcrn,`mcrM,`mcpN,`amXT,`pcN}; // ROR($nn+X) + 8'h67: MCODE_S3 = {`mcASR,`mcrE,`mcrn,`mcrM,`mcpN,`amXT,`pcN}; // ASR($nn+X) + 8'h68: MCODE_S3 = {`mcASL,`mcrE,`mcrn,`mcrM,`mcpN,`amXT,`pcN}; // ASL($nn+X) + 8'h69: MCODE_S3 = {`mcROL,`mcrE,`mcrn,`mcrM,`mcpN,`amXT,`pcN}; // ROL($nn+X) + 8'h6A: MCODE_S3 = {`mcDEC,`mcrE,`mcrn,`mcrM,`mcpN,`amXT,`pcN}; // DEC($nn+X) + 8'h6B: MCODE_S3 = {`mcAND,`mcrM,`mcrE,`mcrn,`mcpN,`amXT,`pcN}; // TIM#,($nn+X) + 8'h6C: MCODE_S3 = {`mcINC,`mcrE,`mcrn,`mcrM,`mcpN,`amXT,`pcN}; // INC($nn+X) + 8'h6D: MCODE_S3 = `MC_NEXTI; // TST($nn+X) + 8'h6F: MCODE_S3 = {`mcLDN,`mcrn,`mcrn,`mcrM,`mcpN,`amXT,`pcN}; // CLR($nn+X) +//----------------------------------------------------------------------------------------- + 8'h70: MCODE_S3 = `MC_LDEXM; // NEG($nnnn) + 8'h71: MCODE_S3 = {`mcLDN,`mcrT,`mcrn,`mcrM,`mcpN,`amE0,`pcN}; // AIM#,($nn) + 8'h72: MCODE_S3 = {`mcLDN,`mcrT,`mcrn,`mcrM,`mcpN,`amE0,`pcN}; // OIM#,($nn) + 8'h73: MCODE_S3 = `MC_LDEXM; // COM($nnnn) + 8'h74: MCODE_S3 = `MC_LDEXM; // LSR($nnnn) + 8'h75: MCODE_S3 = {`mcEOR,`mcrT,`mcrM,`mcrT,`mcpN,`amE0,`pcI}; // EIM#,($nnnn) + 8'h76: MCODE_S3 = `MC_LDEXM; // ROR($nnnn) + 8'h77: MCODE_S3 = `MC_LDEXM; // ASR($nnnn) + 8'h78: MCODE_S3 = `MC_LDEXM; // ASL($nnnn) + 8'h79: MCODE_S3 = `MC_LDEXM; // ROL($nnnn) + 8'h7A: MCODE_S3 = `MC_LDEXM; // DEC($nnnn) + 8'h7B: MCODE_S3 = `MC_NEXTI; // TIM#,($nn) + 8'h7C: MCODE_S3 = `MC_LDEXM; // INC($nnnn) + 8'h7D: MCODE_S3 = `MC_NEXTI; // TST($nnnn) + 8'h7F: MCODE_S3 = {`mcLDR,`mcrn,`mcrn,`mcrM,`mcpN,`amE0,`pcN}; // CLR($nnnn) +//----------------------------------------------------------------------------------------- + 8'h8D: MCODE_S3 = {`mcPSH,`mcrP,`mcrn,`mcrN,`mcpN,`amSP,`pcN}; // BSR +//----------------------------------------------------------------------------------------- + 8'h93: MCODE_S3 = {`mcSUB,`mcrD,`mcrT,`mcrD,`mcp0,`amPC,`pcN}; // SUBD($nn) + 8'h9C: MCODE_S3 = {`mcSUB,`mcrX,`mcrT,`mcrn,`mcp0,`amPC,`pcN}; // CMPX($nn) + 8'h9D: MCODE_S3 = {`mcPSH,`mcrP,`mcrn,`mcrN,`mcpN,`amSP,`pcN}; // JSR($nn) + 8'h9E: MCODE_S3 = {`mcLDR,`mcrT,`mcrn,`mcrS,`mcp0,`amPC,`pcN}; // LDS($nn) + 8'h9F: MCODE_S3 = {`mcLDR,`mcrS,`mcrn,`mcrS,`mcp0,`amPC,`pcN}; // STS($nn) +//----------------------------------------------------------------------------------------- + 8'hA0: MCODE_S3 = {`mcSUB,`mcrA,`mcrE,`mcrA,`mcp0,`amPC,`pcN}; // SUBA($nn+X) + 8'hA1: MCODE_S3 = {`mcSUB,`mcrA,`mcrE,`mcrn,`mcp0,`amPC,`pcN}; // CMPA($nn+X) + 8'hA2: MCODE_S3 = {`mcSBC,`mcrA,`mcrE,`mcrn,`mcp0,`amPC,`pcN}; // SBCA($nn+X) + 8'hA3: MCODE_S3 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amXT,`pcN}; // SUBD($nn+X) + 8'hA4: MCODE_S3 = {`mcAND,`mcrA,`mcrE,`mcrA,`mcp0,`amPC,`pcN}; // ANDA($nn+X) + 8'hA5: MCODE_S3 = {`mcAND,`mcrA,`mcrE,`mcrn,`mcp0,`amPC,`pcN}; // BITA($nn+X) + 8'hA6: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // LDA($nn+X) + 8'hA7: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // STA($nn+X) + 8'hA8: MCODE_S3 = {`mcEOR,`mcrA,`mcrE,`mcrA,`mcp0,`amPC,`pcN}; // EORA($nn+X) + 8'hA9: MCODE_S3 = {`mcADC,`mcrA,`mcrE,`mcrA,`mcp0,`amPC,`pcN}; // ADCA($nn+X) + 8'hAA: MCODE_S3 = {`mcLOR,`mcrA,`mcrE,`mcrA,`mcp0,`amPC,`pcN}; // ORA($nn+X) + 8'hAB: MCODE_S3 = {`mcADD,`mcrA,`mcrE,`mcrA,`mcp0,`amPC,`pcN}; // ADDA($nn+X) + 8'hAC: MCODE_S3 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amXT,`pcN}; // CMPX($nn+X) + 8'hAD: MCODE_S3 = {`mcPSH,`mcrP,`mcrn,`mcrN,`mcpN,`amSP,`pcN}; // JSR.$nn+X + 8'hAE: MCODE_S3 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amXT,`pcN}; // LDS($nn+X) + 8'hAF: MCODE_S3 = {`mcLDN,`mcrS,`mcrn,`mcrM,`mcpN,`amXT,`pcN}; // STS($nn+X) +//----------------------------------------------------------------------------------------- + 8'hB0: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // SUBA($nnnn) + 8'hB1: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // CMPA($nnnn) + 8'hB2: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // SBCA($nnnn) + 8'hB3: MCODE_S3 = {`mcLOR,`mcrM,`mcrT,`mcrT,`mcpN,`amE1,`pcN}; // SUBD($nnnn) + 8'hB4: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // ANDA($nnnn) + 8'hB5: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // BITA($nnnn) + 8'hB6: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // LDA($nnnn) + 8'hB7: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // STA($nnnn) + 8'hB8: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // EORA($nnnn) + 8'hB9: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // ADCA($nnnn) + 8'hBA: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // ORA($nnnn) + 8'hBB: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // ADDA($nnnn) + 8'hBC: MCODE_S3 = {`mcLOR,`mcrM,`mcrT,`mcrT,`mcpN,`amE1,`pcN}; // CMPX($nnnn) + 8'hBD: MCODE_S3 = {`mcPSH,`mcrP,`mcrn,`mcrM,`mcpN,`amSP,`pcN}; // JSR.$nnnn + 8'hBE: MCODE_S3 = {`mcLDN,`mcrM,`mcrn,`mcrV,`mcpN,`amE1,`pcN}; // LDS($nnnn) + 8'hBF: MCODE_S3 = {`mcLDN,`mcrS,`mcrn,`mcrM,`mcpN,`amE1,`pcN}; // STS($nnnn) +//----------------------------------------------------------------------------------------- + 8'hD3: MCODE_S3 = {`mcADD,`mcrD,`mcrT,`mcrD,`mcp0,`amPC,`pcN}; // ADDD($nn) + 8'hDC: MCODE_S3 = {`mcLDR,`mcrD,`mcrn,`mcrD,`mcp0,`amPC,`pcN}; // LDD($nn) + 8'hDD: MCODE_S3 = {`mcLDR,`mcrD,`mcrn,`mcrD,`mcp0,`amPC,`pcN}; // STD($nn) + 8'hDE: MCODE_S3 = {`mcLDR,`mcrX,`mcrn,`mcrX,`mcp0,`amPC,`pcN}; // LDX($nn) + 8'hDF: MCODE_S3 = {`mcLDR,`mcrX,`mcrn,`mcrX,`mcp0,`amPC,`pcN}; // STX($nn) +//----------------------------------------------------------------------------------------- + 8'hE0: MCODE_S3 = {`mcSUB,`mcrB,`mcrE,`mcrB,`mcp0,`amPC,`pcN}; // SUBB($nn+X) + 8'hE1: MCODE_S3 = {`mcSUB,`mcrB,`mcrE,`mcrn,`mcp0,`amPC,`pcN}; // CMPB($nn+X) + 8'hE2: MCODE_S3 = {`mcSBC,`mcrB,`mcrE,`mcrB,`mcp0,`amPC,`pcN}; // SBCB($nn+X) + 8'hE3: MCODE_S3 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amXT,`pcN}; // ADDD($nn+X) + 8'hE4: MCODE_S3 = {`mcAND,`mcrB,`mcrE,`mcrB,`mcp0,`amPC,`pcN}; // ANDB($nn+X) + 8'hE5: MCODE_S3 = {`mcAND,`mcrB,`mcrE,`mcrn,`mcp0,`amPC,`pcN}; // BITB($nn+X) + 8'hE6: MCODE_S3 = {`mcLDR,`mcrE,`mcrn,`mcrB,`mcp0,`amPC,`pcN}; // LDB($nn+X) + 8'hE7: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // STB($nn+X) + 8'hE8: MCODE_S3 = {`mcEOR,`mcrB,`mcrE,`mcrB,`mcp0,`amPC,`pcN}; // EORB($nn+X) + 8'hE9: MCODE_S3 = {`mcADC,`mcrB,`mcrE,`mcrB,`mcp0,`amPC,`pcN}; // ADCB($nn+X) + 8'hEA: MCODE_S3 = {`mcLOR,`mcrB,`mcrE,`mcrB,`mcp0,`amPC,`pcN}; // ORB($nn+X) + 8'hEB: MCODE_S3 = {`mcADD,`mcrB,`mcrE,`mcrB,`mcp0,`amPC,`pcN}; // ADDB($nn+X) + 8'hEC: MCODE_S3 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amXT,`pcN}; // LDD($nn+X) + 8'hED: MCODE_S3 = {`mcLDN,`mcrD,`mcrn,`mcrM,`mcpN,`amXT,`pcN}; // STD($nn+X) + 8'hEE: MCODE_S3 = {`mcLOR,`mcrM,`mcrE,`mcrE,`mcpN,`amXT,`pcN}; // LDX($nn+X) + 8'hEF: MCODE_S3 = {`mcLDN,`mcrX,`mcrn,`mcrM,`mcpN,`amXT,`pcN}; // STX($nn+X) +//----------------------------------------------------------------------------------------- + 8'hF0: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // SUBB($nnnn) + 8'hF1: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // CMPB($nnnn) + 8'hF2: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // SBCB($nnnn) + 8'hF3: MCODE_S3 = {`mcLOR,`mcrM,`mcrT,`mcrT,`mcpN,`amE1,`pcN}; // ADDD($nnnn) + 8'hF4: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // ANDB($nnnn) + 8'hF5: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // BITB($nnnn) + 8'hF6: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // LDB($nnnn) + 8'hF7: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // STB($nnnn) + 8'hF8: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // EORB($nnnn) + 8'hF9: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // ADCB($nnnn) + 8'hFA: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // ORB($nnnn) + 8'hFB: MCODE_S3 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // ADDB($nnnn) + 8'hFC: MCODE_S3 = {`mcLDN,`mcrM,`mcrn,`mcrV,`mcpN,`amE1,`pcN}; // LDD($nnnn) + 8'hFD: MCODE_S3 = {`mcLDN,`mcrD,`mcrn,`mcrM,`mcpN,`amE1,`pcN}; // STD($nnnn) + 8'hFE: MCODE_S3 = {`mcLDN,`mcrM,`mcrn,`mcrV,`mcpN,`amE1,`pcN}; // LDX($nnnn) + 8'hFF: MCODE_S3 = {`mcLDN,`mcrX,`mcrn,`mcrM,`mcpN,`amE1,`pcN}; // STX($nnnn) +//----------------------------------------------------------------------------------------- + default: MCODE_S3 = `MC_HALT; + endcase +end +endfunction + + +function `mcwidth MCODE_S4; +input [7:0] opc; +begin + case (opc) +//----------------------------------------------------------------------------------------- + 8'h39: MCODE_S4 = {`mcINC,`mcrS,`mcrn,`mcrS,`mcp0,`amPC,`pcN}; // RTS + 8'h3B: MCODE_S4 = {`mcLOR,`mcrM,`mcrX,`mcrX,`mcpN,`amS1,`pcN}; // RTI + 8'h3C: MCODE_S4 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcp0,`amPC,`pcN}; // PSHX + 8'h3D: MCODE_S4 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // MUL +//----------------------------------------------------------------------------------------- + 8'h60: MCODE_S4 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // NEG($nn+X) + 8'h61: MCODE_S4 = {`mcLDN,`mcrE,`mcrn,`mcrM,`mcpN,`amXT,`pcN}; // AIM#,($nn+X) + 8'h62: MCODE_S4 = {`mcLDN,`mcrE,`mcrn,`mcrM,`mcpN,`amXT,`pcN}; // OIM#,($nn+X) + 8'h63: MCODE_S4 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // COM($nn+X) + 8'h64: MCODE_S4 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // LSR($nn+X) + 8'h65: MCODE_S4 = {`mcLDN,`mcrE,`mcrn,`mcrM,`mcpN,`amXT,`pcN}; // EIM#,($nn+X) + 8'h66: MCODE_S4 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // ROR($nn+X) + 8'h67: MCODE_S4 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // ASR($nn+X) + 8'h68: MCODE_S4 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // ASL($nn+X) + 8'h69: MCODE_S4 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // ROL($nn+X) + 8'h6A: MCODE_S4 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // DEC($nn+X) + 8'h6B: MCODE_S4 = `MC_NEXTI; // TIM#,($nn+X) + 8'h6C: MCODE_S4 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // INC($nn+X) + 8'h6F: MCODE_S4 = `MC_NEXTI; // CLR($nn+X) +//----------------------------------------------------------------------------------------- + 8'h70: MCODE_S4 = {`mcNEG,`mcrT,`mcrn,`mcrM,`mcpN,`amE0,`pcN}; // NEG($nnnn) + 8'h71: MCODE_S4 = `MC_NEXTI; // AIM#,($nn) + 8'h72: MCODE_S4 = `MC_NEXTI; // OIM#,($nn) + 8'h73: MCODE_S4 = {`mcNOT,`mcrT,`mcrn,`mcrM,`mcpN,`amE0,`pcN}; // COM($nnnn) + 8'h74: MCODE_S4 = {`mcLSR,`mcrT,`mcrn,`mcrM,`mcpN,`amE0,`pcN}; // LSR($nnnn) + 8'h75: MCODE_S4 = {`mcLDN,`mcrT,`mcrn,`mcrM,`mcpN,`amE0,`pcN}; // EIM#,($nnnn) + 8'h76: MCODE_S4 = {`mcROR,`mcrT,`mcrn,`mcrM,`mcpN,`amE0,`pcN}; // ROR($nnnn) + 8'h77: MCODE_S4 = {`mcASR,`mcrT,`mcrn,`mcrM,`mcpN,`amE0,`pcN}; // ASR($nnnn) + 8'h78: MCODE_S4 = {`mcASL,`mcrT,`mcrn,`mcrM,`mcpN,`amE0,`pcN}; // ASL($nnnn) + 8'h79: MCODE_S4 = {`mcROL,`mcrT,`mcrn,`mcrM,`mcpN,`amE0,`pcN}; // ROL($nnnn) + 8'h7A: MCODE_S4 = {`mcDEC,`mcrT,`mcrn,`mcrM,`mcpN,`amE0,`pcN}; // DEC($nnnn) + 8'h7C: MCODE_S4 = {`mcINC,`mcrT,`mcrn,`mcrM,`mcpN,`amE0,`pcN}; // INC($nnnn) + 8'h7F: MCODE_S4 = `MC_NEXTI; // CLR($nnnn) +//----------------------------------------------------------------------------------------- + 8'h8D: MCODE_S4 = {`mcAPC, `bfRA ,`mcrn,`mcp0,`amPC,`pcN}; // BSR +//----------------------------------------------------------------------------------------- + 8'h9D: MCODE_S4 = {`mcLDN,`mcrE,`mcrn,`mcrP,`mcp0,`amPC,`pcN}; // JSR($nn) +//----------------------------------------------------------------------------------------- + 8'hA3: MCODE_S4 = {`mcSUB,`mcrD,`mcrE,`mcrD,`mcp0,`amPC,`pcN}; // SUBD($nn+X) + 8'hAC: MCODE_S4 = {`mcSUB,`mcrX,`mcrE,`mcrn,`mcp0,`amPC,`pcN}; // CMPX($nn+X) + 8'hAD: MCODE_S4 = {`mcADD,`mcrX,`mcrT,`mcrP,`mcp0,`amPC,`pcN}; // JSR.$nn+X + 8'hAE: MCODE_S4 = {`mcLDR,`mcrE,`mcrn,`mcrS,`mcp0,`amPC,`pcN}; // LDS($nn+X) + 8'hAF: MCODE_S4 = {`mcLDR,`mcrS,`mcrn,`mcrS,`mcp0,`amPC,`pcN}; // STS($nn+X) +//----------------------------------------------------------------------------------------- + 8'hB3: MCODE_S4 = {`mcSUB,`mcrD,`mcrT,`mcrD,`mcp0,`amPC,`pcN}; // SUBD($nnnn) + 8'hBC: MCODE_S4 = {`mcSUB,`mcrX,`mcrT,`mcrn,`mcp0,`amPC,`pcN}; // CMPX($nnnn) + 8'hBD: MCODE_S4 = {`mcPSH,`mcrP,`mcrn,`mcrN,`mcpN,`amSP,`pcN}; // JSR.$nnnn + 8'hBE: MCODE_S4 = {`mcLDR,`mcrT,`mcrn,`mcrS,`mcp0,`amPC,`pcN}; // LDS($nnnn) + 8'hBF: MCODE_S4 = {`mcLDR,`mcrS,`mcrn,`mcrS,`mcp0,`amPC,`pcN}; // STS($nnnn) +//----------------------------------------------------------------------------------------- + 8'hE3: MCODE_S4 = {`mcADD,`mcrD,`mcrE,`mcrD,`mcp0,`amPC,`pcN}; // ADDD($nn+X) + 8'hEC: MCODE_S4 = {`mcLDR,`mcrE,`mcrn,`mcrD,`mcp0,`amPC,`pcN}; // LDD($nn+X) + 8'hED: MCODE_S4 = {`mcLDR,`mcrD,`mcrn,`mcrD,`mcp0,`amPC,`pcN}; // STD($nn+X) + 8'hEE: MCODE_S4 = {`mcLDN,`mcrE,`mcrn,`mcrX,`mcp0,`amPC,`pcN}; // LDX($nn+X) + 8'hEF: MCODE_S4 = {`mcLDR,`mcrX,`mcrn,`mcrX,`mcp0,`amPC,`pcN}; // STX($nn+X) +//----------------------------------------------------------------------------------------- + 8'hF3: MCODE_S4 = {`mcADD,`mcrD,`mcrT,`mcrD,`mcp0,`amPC,`pcN}; // ADDD($nnnn) + 8'hFC: MCODE_S4 = {`mcLDR,`mcrT,`mcrn,`mcrD,`mcp0,`amPC,`pcN}; // LDD($nnnn) + 8'hFD: MCODE_S4 = {`mcLDR,`mcrD,`mcrn,`mcrD,`mcp0,`amPC,`pcN}; // STD($nnnn) + 8'hFE: MCODE_S4 = {`mcLDR,`mcrT,`mcrn,`mcrX,`mcp0,`amPC,`pcN}; // LDX($nnnn) + 8'hFF: MCODE_S4 = {`mcLDR,`mcrX,`mcrn,`mcrX,`mcp0,`amPC,`pcN}; // STX($nnnn) +//----------------------------------------------------------------------------------------- + default: MCODE_S4 = `MC_HALT; + endcase +end +endfunction + + +function `mcwidth MCODE_S5; +input [7:0] opc; +begin + case (opc) +//----------------------------------------------------------------------------------------- + 8'h3B: MCODE_S5 = {`mcINC,`mcrS,`mcrn,`mcrS,`mcpN,`amS1,`pcN}; // RTI + 8'h3D: MCODE_S5 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // MUL +//----------------------------------------------------------------------------------------- + 8'h60: MCODE_S5 = `MC_NEXTI; // NEG($nn+X) + 8'h61: MCODE_S5 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // AIM#,($nn+X) + 8'h62: MCODE_S5 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // OIM#,($nn+X) + 8'h63: MCODE_S5 = `MC_NEXTI; // COM($nn+X) + 8'h64: MCODE_S5 = `MC_NEXTI; // LSR($nn+X) + 8'h65: MCODE_S5 = {`mcNOP,`mcrn,`mcrn,`mcrn,`mcpN,`amPC,`pcN}; // EIM#,($nn+X) + 8'h66: MCODE_S5 = `MC_NEXTI; // ROR($nn+X) + 8'h67: MCODE_S5 = `MC_NEXTI; // ASR($nn+X) + 8'h68: MCODE_S5 = `MC_NEXTI; // ASL($nn+X) + 8'h69: MCODE_S5 = `MC_NEXTI; // ROL($nn+X) + 8'h6A: MCODE_S5 = `MC_NEXTI; // DEC($nn+X) + 8'h6C: MCODE_S5 = `MC_NEXTI; // INC($nn+X) +//----------------------------------------------------------------------------------------- + 8'h70: MCODE_S5 = `MC_NEXTI; // NEG($nnnn) + 8'h73: MCODE_S5 = `MC_NEXTI; // COM($nnnn) + 8'h74: MCODE_S5 = `MC_NEXTI; // LSR($nnnn) + 8'h75: MCODE_S5 = `MC_NEXTI; // EIM#,($nnnn) + 8'h76: MCODE_S5 = `MC_NEXTI; // ROR($nnnn) + 8'h77: MCODE_S5 = `MC_NEXTI; // ASR($nnnn) + 8'h78: MCODE_S5 = `MC_NEXTI; // ASL($nnnn) + 8'h79: MCODE_S5 = `MC_NEXTI; // ROL($nnnn) + 8'h7A: MCODE_S5 = `MC_NEXTI; // DEC($nnnn) + 8'h7C: MCODE_S5 = `MC_NEXTI; // INC($nnnn) +//----------------------------------------------------------------------------------------- + 8'hBD: MCODE_S5 = {`mcLDN,`mcrE,`mcrn,`mcrP,`mcp0,`amPC,`pcN}; // JSR.$nnnn +//----------------------------------------------------------------------------------------- + default: MCODE_S5 = `MC_HALT; + endcase +end +endfunction + + +function `mcwidth MCODE_S6; +input [7:0] opc; +begin + case (opc) +//----------------------------------------------------------------------------------------- + 8'h3B: MCODE_S6 = {`mcPUL,`mcrN,`mcrn,`mcrP,`mcpN,`amS1,`pcN}; // RTI + 8'h3D: MCODE_S6 = {`mcMUL,`mcrA,`mcrB,`mcrD,`mcp0,`amPC,`pcI}; // MUL +//----------------------------------------------------------------------------------------- + 8'h61: MCODE_S6 = `MC_NEXTI; // AIM#,($nn+X) + 8'h62: MCODE_S6 = `MC_NEXTI; // OIM#,($nn+X) + 8'h65: MCODE_S6 = `MC_NEXTI; // EIM#,($nn+X) +//----------------------------------------------------------------------------------------- + default: MCODE_S6 = `MC_HALT; + endcase +end +endfunction + + +function `mcwidth MCODE_S7; +input [7:0] opc; +begin + case (opc) +//----------------------------------------------------------------------------------------- + 8'h3B: MCODE_S7 = {`mcLOR,`mcrM,`mcrP,`mcrP,`mcpN,`amS1,`pcN}; // RTI +//----------------------------------------------------------------------------------------- + default: MCODE_S7 = `MC_HALT; + endcase +end +endfunction + + +function `mcwidth MCODE_S8; +input [7:0] opc; +begin + case (opc) +//----------------------------------------------------------------------------------------- + 8'h3B: MCODE_S8 = {`mcINC,`mcrS,`mcrn,`mcrS,`mcpN,`amPC,`pcN}; // RTI +//----------------------------------------------------------------------------------------- + default: MCODE_S8 = `MC_HALT; + endcase +end +endfunction + + +function `mcwidth MCODE_S9; +input [7:0] opc; +begin + case (opc) +//----------------------------------------------------------------------------------------- + 8'h3B: MCODE_S9 = {`mcLDN,`mcrT,`mcrn,`mcrC,`mcp0,`amPC,`pcN}; // RTI +//----------------------------------------------------------------------------------------- + default: MCODE_S9 = `MC_HALT; + endcase +end +endfunction + +
trunk/HD63701_MCODE.i Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: trunk/HD63701_MCROM.v =================================================================== --- trunk/HD63701_MCROM.v (nonexistent) +++ trunk/HD63701_MCROM.v (revision 2) @@ -0,0 +1,113 @@ +/*************************************************************************** + This file is part of "HD63701V0 Compatible Processor Core". +****************************************************************************/ +`include "HD63701_defs.i" + +module HD63701_MCROM +( + input CLK, + input [5:0] PHASE, + input [7:0] OPCODE, + + output `mcwidth mcode +); + +`include "HD63701_MCODE.i" + +reg [5:0] p; +always @( posedge CLK ) p <= PHASE; + +wire `mcwidth mc0,mc1,mc2,mc3,mc4,mc5,mc6,mc7,mc8,mc9; +HD63701_MCROM_S0 r0(CLK,OPCODE,mc0); +HD63701_MCROM_S1 r1(CLK,OPCODE,mc1); +HD63701_MCROM_S2 r2(CLK,OPCODE,mc2); +HD63701_MCROM_S3 r3(CLK,OPCODE,mc3); +HD63701_MCROM_S4 r4(CLK,OPCODE,mc4); +HD63701_MCROM_S5 r5(CLK,OPCODE,mc5); +HD63701_MCROM_S6 r6(CLK,OPCODE,mc6); +HD63701_MCROM_S7 r7(CLK,OPCODE,mc7); +HD63701_MCROM_S8 r8(CLK,OPCODE,mc8); +HD63701_MCROM_S9 r9(CLK,OPCODE,mc9); + +assign mcode = + (p==`phRST ) ? {`mcLDV, `vaRST, `mcrn,`mcpN,`amE0,`pcN}: //(Load Reset Vector) + + (p==`phVECT ) ? {`mcLDN,`mcrM,`mcrn,`mcrU,`mcpN,`amE0,`pcN}: //(Load VectorH) + (p==`phVEC1 ) ? {`mcLDN,`mcrM,`mcrn,`mcrV,`mcpN,`amE1,`pcN}: //(Load VectorL) + (p==`phVEC2 ) ? {`mcLDN,`mcrT,`mcrn,`mcrP,`mcp0,`amPC,`pcN}: //(Load to PC) + + (p==`phEXEC ) ? mc0 : + (p==`phEXEC1) ? mc1 : + (p==`phEXEC2) ? mc2 : + (p==`phEXEC3) ? mc3 : + (p==`phEXEC4) ? mc4 : + (p==`phEXEC5) ? mc5 : + (p==`phEXEC6) ? mc6 : + (p==`phEXEC7) ? mc7 : + (p==`phEXEC8) ? mc8 : + (p==`phEXEC9) ? mc9 : + + (p==`phINTR ) ? {`mcLDN,`mcrC,`mcrn,`mcrT,`mcpN,`amPC,`pcN}: //(T=C) + (p==`phINTR1) ? {`mcPSH,`mcrP,`mcrn,`mcrM,`mcpN,`amSP,`pcN}: //[PUSH PL] + (p==`phINTR2) ? {`mcPSH,`mcrP,`mcrn,`mcrN,`mcpN,`amSP,`pcN}: //[PUSH PH] + (p==`phINTR3) ? {`mcPSH,`mcrX,`mcrn,`mcrM,`mcpN,`amSP,`pcN}: //[PUSH XL] + (p==`phINTR4) ? {`mcPSH,`mcrX,`mcrn,`mcrN,`mcpN,`amSP,`pcN}: //[PUSH XH] + (p==`phINTR5) ? {`mcPSH,`mcrA,`mcrn,`mcrM,`mcpN,`amSP,`pcN}: //[PUSH A] + (p==`phINTR6) ? {`mcPSH,`mcrB,`mcrn,`mcrM,`mcpN,`amSP,`pcN}: //[PUSH B] + (p==`phINTR7) ? {`mcPSH,`mcrT,`mcrn,`mcrM,`mcpN,`amSP,`pcN}: //[PUSH T] + (p==`phINTR8) ? 0: + (p==`phINTR9) ? 0: + `MC_HALT; + +endmodule + +module HD63701_MCROM_S0( input CLK, input [7:0] OPCODE, output reg `mcwidth mcode ); +`include "HD63701_MCODE.i" +always @( posedge CLK ) mcode <= MCODE_S0(OPCODE); +endmodule + +module HD63701_MCROM_S1( input CLK, input [7:0] OPCODE, output reg `mcwidth mcode ); +`include "HD63701_MCODE.i" +always @( posedge CLK ) mcode <= MCODE_S1(OPCODE); +endmodule + +module HD63701_MCROM_S2( input CLK, input [7:0] OPCODE, output reg `mcwidth mcode ); +`include "HD63701_MCODE.i" +always @( posedge CLK ) mcode <= MCODE_S2(OPCODE); +endmodule + +module HD63701_MCROM_S3( input CLK, input [7:0] OPCODE, output reg `mcwidth mcode ); +`include "HD63701_MCODE.i" +always @( posedge CLK ) mcode <= MCODE_S3(OPCODE); +endmodule + +module HD63701_MCROM_S4( input CLK, input [7:0] OPCODE, output reg `mcwidth mcode ); +`include "HD63701_MCODE.i" +always @( posedge CLK ) mcode <= MCODE_S4(OPCODE); +endmodule + +module HD63701_MCROM_S5( input CLK, input [7:0] OPCODE, output reg `mcwidth mcode ); +`include "HD63701_MCODE.i" +always @( posedge CLK ) mcode <= MCODE_S5(OPCODE); +endmodule + +module HD63701_MCROM_S6( input CLK, input [7:0] OPCODE, output reg `mcwidth mcode ); +`include "HD63701_MCODE.i" +always @( posedge CLK ) mcode <= MCODE_S6(OPCODE); +endmodule + +module HD63701_MCROM_S7( input CLK, input [7:0] OPCODE, output reg `mcwidth mcode ); +`include "HD63701_MCODE.i" +always @( posedge CLK ) mcode <= MCODE_S7(OPCODE); +endmodule + +module HD63701_MCROM_S8( input CLK, input [7:0] OPCODE, output reg `mcwidth mcode ); +`include "HD63701_MCODE.i" +always @( posedge CLK ) mcode <= MCODE_S8(OPCODE); +endmodule + +module HD63701_MCROM_S9( input CLK, input [7:0] OPCODE, output reg `mcwidth mcode ); +`include "HD63701_MCODE.i" +always @( posedge CLK ) mcode <= MCODE_S9(OPCODE); +endmodule +
trunk/HD63701_MCROM.v Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property

powered by: WebSVN 2.1.0

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