Browse Source

+ implemented OP_ADD and OP_SUB in tcgmos6502.a_op_reg_reg_internal

Nikolay Nikolov 1 year ago
parent
commit
9768f204b7
2 changed files with 44 additions and 38 deletions
  1. 40 38
      compiler/mos6502/cgcpu.pas
  2. 4 0
      rtl/mos6502/set.inc

+ 40 - 38
compiler/mos6502/cgcpu.pas

@@ -729,44 +729,46 @@ unit cgcpu;
 
        begin
          case op of
-         //  OP_ADD:
-         //    begin
-         //      getcpuregister(list,NR_A);
-         //      a_load_reg_reg(list,OS_8,OS_8,dst,NR_A);
-         //      list.concat(taicpu.op_reg_reg(A_ADD,NR_A,src));
-         //      a_load_reg_reg(list,OS_8,OS_8,NR_A,dst);
-         //      if size in [OS_S16,OS_16,OS_S32,OS_32,OS_S64,OS_64] then
-         //        begin
-         //          for i:=2 to tcgsize2size[size] do
-         //            begin
-         //              NextSrcDst;
-         //              a_load_reg_reg(list,OS_8,OS_8,dst,NR_A);
-         //              list.concat(taicpu.op_reg_reg(A_ADC,NR_A,src));
-         //              a_load_reg_reg(list,OS_8,OS_8,NR_A,dst);
-         //            end;
-         //        end;
-         //      ungetcpuregister(list,NR_A);
-         //    end;
-         //
-         //  OP_SUB:
-         //    begin
-         //      getcpuregister(list,NR_A);
-         //      a_load_reg_reg(list,OS_8,OS_8,dst,NR_A);
-         //      list.concat(taicpu.op_reg_reg(A_SUB,NR_A,src));
-         //      a_load_reg_reg(list,OS_8,OS_8,NR_A,dst);
-         //      if size in [OS_S16,OS_16,OS_S32,OS_32,OS_S64,OS_64] then
-         //        begin
-         //          for i:=2 to tcgsize2size[size] do
-         //            begin
-         //              NextSrcDst;
-         //              a_load_reg_reg(list,OS_8,OS_8,dst,NR_A);
-         //              list.concat(taicpu.op_reg_reg(A_SBC,NR_A,src));
-         //              a_load_reg_reg(list,OS_8,OS_8,NR_A,dst);
-         //            end;
-         //        end;
-         //      ungetcpuregister(list,NR_A);
-         //    end;
-         //
+           OP_ADD:
+             begin
+               getcpuregister(list,NR_A);
+               a_load_reg_reg(list,OS_8,OS_8,dst,NR_A);
+               list.concat(taicpu.op_none(A_CLC));
+               list.concat(taicpu.op_reg(A_ADC,src));
+               a_load_reg_reg(list,OS_8,OS_8,NR_A,dst);
+               if size in [OS_S16,OS_16,OS_S32,OS_32,OS_S64,OS_64] then
+                 begin
+                   for i:=2 to tcgsize2size[size] do
+                     begin
+                       NextSrcDst;
+                       a_load_reg_reg(list,OS_8,OS_8,dst,NR_A);
+                       list.concat(taicpu.op_reg(A_ADC,src));
+                       a_load_reg_reg(list,OS_8,OS_8,NR_A,dst);
+                     end;
+                 end;
+               ungetcpuregister(list,NR_A);
+             end;
+
+           OP_SUB:
+             begin
+               getcpuregister(list,NR_A);
+               a_load_reg_reg(list,OS_8,OS_8,dst,NR_A);
+               list.concat(taicpu.op_none(A_SEC));
+               list.concat(taicpu.op_reg(A_SBC,src));
+               a_load_reg_reg(list,OS_8,OS_8,NR_A,dst);
+               if size in [OS_S16,OS_16,OS_S32,OS_32,OS_S64,OS_64] then
+                 begin
+                   for i:=2 to tcgsize2size[size] do
+                     begin
+                       NextSrcDst;
+                       a_load_reg_reg(list,OS_8,OS_8,dst,NR_A);
+                       list.concat(taicpu.op_reg(A_SBC,src));
+                       a_load_reg_reg(list,OS_8,OS_8,NR_A,dst);
+                     end;
+                 end;
+               ungetcpuregister(list,NR_A);
+             end;
+
          //  OP_NEG:
          //    begin
          //      getcpuregister(list,NR_A);

+ 4 - 0
rtl/mos6502/set.inc

@@ -27,4 +27,8 @@ begin
   globaldw := $12345678;
   globalqw := $123456789ABCDEF0;
   ga := gb + gc;
+  ga := gb - gc;
+  ga := gb and gc;
+  ga := gb or gc;
+  ga := gb xor gc;
 end;