X-Git-Url: http://git.joshuawise.com/fpgaboy.git/blobdiff_plain/25f4912ce5d2a6c70a9f604502303a17359b19ec..99b9687942367fd256a797bcd1f67fec07f92a37:/core/insn_alu_a.v?ds=sidebyside diff --git a/core/insn_alu_a.v b/core/insn_alu_a.v index a5e1c1c..36bac34 100644 --- a/core/insn_alu_a.v +++ b/core/insn_alu_a.v @@ -9,6 +9,18 @@ `define INSN_ALU_A 9'b000xxx111 +`ifdef LOCALWIRES + /* Y U Q */ + /* Derived from MESS opc_main.h */ + wire [8:0] daa_tmp_n0_h = ((`_F & `FLAG_H) || (`_A[3:0] > 9)) ? {1'b0,`_A} + 9'h06 : {1'b0,`_A}; + wire [8:0] daa_tmp_n0 = ((`_F & `FLAG_C) || (daa_tmp_n0_h[8:4] > 9)) ? daa_tmp_n0_h + 9'h60 : daa_tmp_n0_h; + + wire [8:0] daa_tmp_n_h1 = (`_F & `FLAG_H) ? ({1'b0,`_A} - 9'h06) : {1'b0,`_A}; + wire [8:0] daa_tmp_n_h2 = ((`_F & `FLAG_H) && !(`_F & `FLAG_C)) ? {1'b0,daa_tmp_n_h1[7:0]} : daa_tmp_n_h1; + wire [8:0] daa_tmp_n = (`_F & `FLAG_C) ? (daa_tmp_n_h2 - 9'h60) : daa_tmp_n_h2; + wire [8:0] daa_tmp = (`_F & `FLAG_N) ? daa_tmp_n : daa_tmp_n0; +`endif + `ifdef EXECUTE `INSN_ALU_A: begin `EXEC_NEWCYCLE @@ -21,29 +33,38 @@ case(opcode[5:3]) `INSN_alu_RLCA: begin `_A <= {`_A[6:0],`_A[7]}; - `_F <= {`_F[7:5],`_A[7],`_F[3:0]}; + `_F <= {3'b0,`_A[7],`_F[3:0]}; end `INSN_alu_RRCA: begin `_A <= {`_A[0],`_A[7:1]}; - `_F <= {`_F[7:5],`_A[0],`_F[3:0]}; + `_F <= {3'b0,`_A[0],`_F[3:0]}; end `INSN_alu_RLA: begin `_A <= {`_A[6:0],`_F[4]}; - `_F <= {`_F[7:5],`_A[7],`_F[3:0]}; + `_F <= {3'b0,`_A[7],`_F[3:0]}; end `INSN_alu_RRA: begin `_A <= {`_F[4],`_A[7:1]}; - `_F <= {`_F[7:5],`_A[0],`_F[3:0]}; + `_F <= {3'b0,`_A[0],`_F[3:0]}; + end + `INSN_alu_DAA: begin + `_A <= daa_tmp[7:0]; + `_F <= { + (daa_tmp[7:0] == 0) ? 1'b1 : 8'b0, /* Z */ + 2'b00, /* NH */ + daa_tmp[8], /* C */ + `_F[3:0] + }; end `INSN_alu_CPL: begin `_A <= ~`_A; `_F <= {`_F[7],1'b1,1'b1,`_F[4:0]}; end `INSN_alu_SCF: begin - `_F <= {`_F[7:5],1'b1,`_F[3:0]}; + `_F <= {`_F[7],3'b001,`_F[3:0]}; end `INSN_alu_CCF: begin - `_F <= {`_F[7:5],~`_F[4],`_F[3:0]}; + `_F <= {`_F[7],2'b00,~`_F[4],`_F[3:0]}; end endcase end