Browse Source

+ implemented tcgmos6502.a_loadaddr_ref_reg

Nikolay Nikolov 1 month ago
parent
commit
b724c8d06f
1 changed files with 35 additions and 57 deletions
  1. 35 57
      compiler/mos6502/cgcpu.pas

+ 35 - 57
compiler/mos6502/cgcpu.pas

@@ -2408,65 +2408,43 @@ unit cgcpu;
 
 
     procedure tcgmos6502.a_loadaddr_ref_reg(list : TAsmList;const ref : treference;r : tregister);
-      //var
-      //  tmpref : treference;
+      var
+        tmpref : treference;
       begin
         list.Concat(tai_comment.Create(strpnew('TODO: a_loadaddr_ref_reg '+' '+ref2string(ref)+' '+std_regname(r))));
-        //if assigned(ref.symbol) then
-        //  begin
-        //    reference_reset(tmpref,0,[]);
-        //    tmpref.symbol:=ref.symbol;
-        //    tmpref.offset:=ref.offset;
-        //
-        //    tmpref.refaddr:=addr_lo8;
-        //    list.concat(taicpu.op_reg_ref(A_LD,r,tmpref));
-        //
-        //    tmpref.refaddr:=addr_hi8;
-        //    list.concat(taicpu.op_reg_ref(A_LD,GetNextReg(r),tmpref));
-        //
-        //    if (ref.base<>NR_NO) then
-        //      a_op_reg_reg(list,OP_ADD,OS_16,ref.base,r);
-        //    if (ref.index<>NR_NO) then
-        //      a_op_reg_reg(list,OP_ADD,OS_16,ref.index,r);
-        //  end
-        //else if ref.base=NR_IX then
-        //  begin
-        //    list.concat(taicpu.op_reg(A_PUSH,NR_IX));
-        //    getcpuregister(list,NR_H);
-        //    getcpuregister(list,NR_L);
-        //    list.concat(taicpu.op_reg(A_POP,NR_HL));
-        //    emit_mov(list,r,NR_L);
-        //    ungetcpuregister(list,NR_L);
-        //    emit_mov(list,GetNextReg(r),NR_H);
-        //    ungetcpuregister(list,NR_H);
-        //    if (ref.index<>NR_NO) then
-        //      a_op_reg_reg(list,OP_ADD,OS_16,ref.index,r);
-        //    if ref.offset<>0 then
-        //      a_op_const_reg(list,OP_ADD,OS_16,ref.offset,r);
-        //  end
-        //else if (ref.base=NR_SP) or (ref.base=NR_BC) or (ref.base=NR_DE) then
-        //  begin
-        //    getcpuregister(list,NR_H);
-        //    getcpuregister(list,NR_L);
-        //    list.Concat(taicpu.op_reg_const(A_LD,NR_HL,ref.offset));
-        //    list.Concat(taicpu.op_reg_reg(A_ADD,NR_HL,ref.base));
-        //    emit_mov(list,r,NR_L);
-        //    ungetcpuregister(list,NR_L);
-        //    emit_mov(list,GetNextReg(r),NR_H);
-        //    ungetcpuregister(list,NR_H);
-        //    if (ref.index<>NR_NO) then
-        //      a_op_reg_reg(list,OP_ADD,OS_16,ref.index,r);
-        //  end
-        //else if ref.base<>NR_NO then
-        //  begin
-        //    a_op_const_reg_reg(list,OP_ADD,OS_16,ref.offset,ref.base,r);
-        //    if (ref.index<>NR_NO) then
-        //      a_op_reg_reg(list,OP_ADD,OS_16,ref.index,r);
-        //  end
-        //else if ref.index<>NR_NO then
-        //  a_op_const_reg_reg(list,OP_ADD,OS_16,ref.offset,ref.index,r)
-        //else
-        //  a_load_const_reg(list,OS_16,ref.offset,r);
+        if assigned(ref.symbol) then
+          begin
+            reference_reset(tmpref,0,[]);
+            tmpref.symbol:=ref.symbol;
+            tmpref.offset:=ref.offset;
+
+            tmpref.refaddr:=addr_lo8;
+            getcpuregister(list,NR_A);
+            list.concat(taicpu.op_ref(A_LDA,tmpref));
+            list.concat(taicpu.op_reg(A_STA,r));
+            ungetcpuregister(list,NR_A);
+
+            tmpref.refaddr:=addr_hi8;
+            getcpuregister(list,NR_A);
+            list.concat(taicpu.op_ref(A_LDA,tmpref));
+            list.concat(taicpu.op_reg(A_STA,GetNextReg(r)));
+            ungetcpuregister(list,NR_A);
+
+            if (ref.base<>NR_NO) then
+              a_op_reg_reg(list,OP_ADD,OS_16,ref.base,r);
+            if (ref.index<>NR_NO) then
+              a_op_reg_reg(list,OP_ADD,OS_16,ref.index,r);
+          end
+        else if ref.base<>NR_NO then
+          begin
+            a_op_const_reg_reg(list,OP_ADD,OS_16,ref.offset,ref.base,r);
+            if (ref.index<>NR_NO) then
+              a_op_reg_reg(list,OP_ADD,OS_16,ref.index,r);
+          end
+        else if ref.index<>NR_NO then
+          a_op_const_reg_reg(list,OP_ADD,OS_16,ref.offset,ref.index,r)
+        else
+          a_load_const_reg(list,OS_16,ref.offset,r);
       end;