]> Joshua Wise's Git repositories - fpgaboy.git/blobdiff - core/insn_alu_a.v
Fix some flag bugs in INC and DEC
[fpgaboy.git] / core / insn_alu_a.v
index 80d317dc6b999216baa41d669296ce0b659c71e9..5fbadeef6ad0c1ae1904a51c6aae8e6799c49f1c 100644 (file)
@@ -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
                        `_F <= {`_F[7:5],`_A[0],`_F[3:0]};
                end
                `INSN_alu_DAA: begin
-                       if (`_F[6]) begin                               
-                               if (`_F[4]) begin
-                                       if(`_A[3:0] >= 4'h6 && `_A[7:4] >= 4'h6 && `F[5]) begin
-                                               `_A <= `_A + 8'h9A;
-                                               `_F <= {((`_A + 8'h9A) == 8'b0), `_F[6:0]};
-                                       end
-                                       else begin
-                                               `_A <= `_A + 8'hA0;
-                                               `_F <= {((`_A + 8'hA0) == 8'b0), `_F[6:0]};
-                                       end
-                               end
-                               else begin
-                                       if(`_A[3:0] <= 4'h9 && `_A[7:4] <= 4'h9 && !`_F[5]) begin
-                                               `_F <= {(`_A == 8'b0), `_F[6:0]};
-                                       end
-                                       else begin
-                                               `_A <= `_A + 8'hFA;
-                                               `_F <= {((`_A + 8'hFA) == 8'b0), `_F[6:0]};
-                                       end
-                               end
-                       end
-                       else begin
-                               if (`_F[4]) begin
-                                       if(`_F[5]) begin
-                                               `_A <= `_A + 8'h66;
-                                               `_F <= {((`_A + 8'h66) == 8'b0), `_F[6:0]};
-                                       end
-                                       else if (`_A[3:0] > 4'b9) begin
-                                               `_A <= `_A + 8'h66;
-                                               `_F <= {((`_A + 8'h66) == 8'b0), `_F[6:0]};
-                                       end
-                                       else begin
-                                               `_A <= `_A + 8'h60;
-                                               `_F <= {((`_A + 8'h60) == 8'b0), `_F[6:0]};
-                                       end
-                               end
-                               else begin
-                                       if(`_F[5]) begin
-                                               if(`_A[7:4] > 4'h9) begin
-                                                       `_A <= `_A + 8'h66;
-                                                       `_F <= {((`_A + 8'h66) == 8'b0), `_F[6:5], 1'b1, `_F[3:0]};
-                                               end
-                                               else begin
-                                                       `_A <= `_A + 8'h06;
-                                                       `_F <= {((`_A + 8'h06) == 8'b0), `_F[6:0]};
-                                               end
-                                       end
-                                       else begin
-                                               if(`_A[3:0] > 4'h9) begin
-                                                       if (`_A[7:4] > 4'h8) begin
-                                                               `_A <= `_A + 8'h66;
-                                                               `_F <= {((`_A + 8'h66) == 8'b0), `_F[6:5], 1'b1, `_F[3:0]};
-                                                       end
-                                                       else begin
-                                                               `_A <= `_A + 8'h06;
-                                                               `_F <= {((`_A + 8'h06) == 8'b0), `_F[6:0]};
-                                                       end
-                                               end
-                                               else begin
-                                                       if (`_A[7:4] > 4'h9) begin
-                                                               `_A <= `_A + 8'h66;
-                                                               `_F <= {((`_A + 8'h66) == 8'b0), `_F[6:5], 1'b1, `_F[3:0]};
-                                                       end
-                                                       else begin
-                                                               `_F <= {(`_A == 8'b0), `_F[6:0]};
-                                                       end
-                                               end
-                                       end
-                               end
-                       end
+                       `_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
This page took 0.030406 seconds and 4 git commands to generate.