Arlet 65C02 WIP: Implement TSB/TXB

Change-Id: I3a452d03a4f8872f3b0232e174ec9dbcb5ec4f0f
This commit is contained in:
David Banks
2016-08-01 12:00:29 +01:00
parent c5f486730e
commit 05e5f633f7

View File

@@ -55,6 +55,7 @@ reg D = 0; // decimal flag
reg V = 0; // overflow flag
reg N = 0; // negative flag
wire AZ; // ALU Zero flag
reg AZ2; // ALU Second Zero flag, set using TSB/TRB semantics
wire AV; // ALU overflow flag
wire AN; // ALU negative flag
wire HC; // ALU half carry
@@ -136,6 +137,8 @@ reg adj_bcd; // results should be BCD adjusted
* get loaded at the DECODE state, and used later
*/
reg store_zero; // doing STZ instruction
reg trb_ins; // doing TRB instruction
reg txb_ins; // doing TSB/TRB instruction
reg bit_ins; // doing BIT instruction
reg bit_ins_nv; // doing BIT instruction that will update the n and v flags (i.e. not BIT imm)
reg plp; // doing PLP instruction
@@ -683,7 +686,6 @@ always @*
RTI1,
RTI2,
INDX1,
READ,
REG,
JSR0,
JSR1,
@@ -696,6 +698,8 @@ always @*
PULL0,
RTS0: BI = 8'h00;
READ: BI = txb_ins ? (trb_ins ? ~regfile : regfile) : 8'h00;
BRA0: BI = PCL;
DECODE,
@@ -761,13 +765,19 @@ always @(posedge clk )
end
end
/*
* Special Z flag got TRB/TSB
*/
always @(posedge clk)
AZ2 <= ~|(AI & regfile);
/*
* Update Z, N flags when writing A, X, Y, Memory, or when doing compare
*/
always @(posedge clk)
if( state == WRITE )
Z <= AZ;
if( state == WRITE)
Z <= txb_ins ? AZ2 : AZ;
else if( state == RTI2 )
Z <= DIMUX[1];
else if( state == DECODE ) begin
@@ -778,7 +788,7 @@ always @(posedge clk)
end
always @(posedge clk)
if( state == WRITE )
if( state == WRITE && ~txb_ins)
N <= AN;
else if( state == RTI2 )
N <= DIMUX[7];
@@ -876,10 +886,12 @@ always @(posedge clk or posedge reset)
else if( RDY ) case( state )
DECODE :
casex ( IR )
// TODO Review for simplifications as in verilog the first matching case has priority
8'b0000_0000: state <= BRK0;
8'b0010_0000: state <= JSR0;
8'b0010_1100: state <= ABS0; // BIT abs
8'b1001_1100: state <= ABS0; // STZ abs
8'b000x_1100: state <= ABS0; // TSB/TRB
8'b0100_0000: state <= RTI0; //
8'b0100_1100: state <= JMP0;
8'b0110_0000: state <= RTS0;
@@ -893,6 +905,7 @@ always @(posedge clk or posedge reset)
8'b1xxx_1000: state <= REG; // DEY, TYA, ...
8'bxxx0_0001: state <= INDX0;
8'bxxx1_0010: state <= IND0; // (ZP) odd 2 column
8'b000x_0100: state <= ZP0; // TSB/TRB
8'bxxx0_01xx: state <= ZP0;
8'bxxx0_1001: state <= FETCH; // IMM
8'bxxx0_1101: state <= ABS0; // even D column
@@ -1089,6 +1102,7 @@ always @(posedge clk )
if( state == DECODE && RDY )
casex( IR )
8'b0xxx_x110, // ASL, ROL, LSR, ROR
8'b000x_x100, // TSB/TRB
8'b11xx_x110: // DEC/INC
write_back <= 1;
@@ -1180,6 +1194,12 @@ always @(posedge clk )
always @(posedge clk )
if( state == DECODE && RDY )
casex( IR )
8'b0000_x100: // TSB
op <= OP_OR;
8'b0001_x100: // TRB
op <= OP_AND;
8'b00xx_x110, // ROL, ASL
8'b00x0_1010: // ROL, ASL
op <= OP_ROL;
@@ -1223,6 +1243,24 @@ always @(posedge clk )
{bit_ins, bit_ins_nv} <= 2'b00;
endcase
always @(posedge clk )
if( state == DECODE && RDY )
casex( IR )
8'b000x_x100: // TRB/TSB
txb_ins <= 1;
default: txb_ins <= 0;
endcase
always @(posedge clk )
if( state == DECODE && RDY )
casex( IR )
8'b0001_x100: // TRB
trb_ins <= 1;
default: trb_ins <= 0;
endcase
always @(posedge clk )
if( state == DECODE && RDY )
casex( IR )