浏览代码

+ implemented tcgz80.a_loadaddr_ref_reg for symbol references

git-svn-id: branches/z80@44682 -
nickysn 5 年之前
父节点
当前提交
4e5eb7fa4e
共有 3 个文件被更改,包括 50 次插入34 次删除
  1. 4 0
      compiler/cgbase.pas
  2. 19 1
      compiler/z80/agsdasz80.pas
  3. 27 33
      compiler/z80/cgcpu.pas

+ 4 - 0
compiler/cgbase.pas

@@ -107,6 +107,10 @@ interface
          ,addr_hi8
          ,addr_hi8_gs
          {$ENDIF}
+         {$IFDEF Z80}
+         ,addr_lo8
+         ,addr_hi8
+         {$ENDIF}
          {$IFDEF i8086}
          ,addr_dgroup      // the data segment group
          ,addr_fardataseg  // the far data segment of the current pascal module (unit or program)

+ 19 - 1
compiler/z80/agsdasz80.pas

@@ -330,7 +330,25 @@ unit agsdasz80;
             end;
           top_ref:
             begin
-              if not assigned(o.ref^.symbol) and
+              if assigned(o.ref^.symbol) and (o.ref^.refaddr in [addr_lo8,addr_hi8]) then
+                begin
+                  {if SmartAsm then
+                    AddSymbol(o.ref^.symbol.name,false);}
+                  if (o.ref^.base<>NR_NO) or (o.ref^.index<>NR_NO) then
+                    internalerror(2020041101);
+                  writer.AsmWrite('#');
+                  case o.ref^.refaddr of
+                    addr_lo8:
+                      writer.AsmWrite('<');
+                    addr_hi8:
+                      writer.AsmWrite('>');
+                  end;
+                  if o.ref^.offset<>0 then
+                    writer.AsmWrite('('+o.ref^.symbol.name+'+'+tostr(o.ref^.offset)+')')
+                  else
+                    writer.AsmWrite(o.ref^.symbol.name);
+                end
+              else if not assigned(o.ref^.symbol) and
                  ((o.ref^.base<>NR_NO) or (o.ref^.index<>NR_NO)) and
                  (o.ref^.offset<>0) then
                 begin

+ 27 - 33
compiler/z80/cgcpu.pas

@@ -1820,39 +1820,33 @@ unit cgcpu;
       var
         tmpref : treference;
       begin
-        list.Concat(tai_comment.Create(strpnew('WARNING! not implemented: a_loadaddr_ref_reg')));
-        // if ref.addressmode<>AM_UNCHANGED then
-        //   internalerror(2011021701);
-        //
-        //if assigned(ref.symbol) or (ref.offset<>0) then
-        //  begin
-        //    reference_reset(tmpref,0,[]);
-        //    tmpref.symbol:=ref.symbol;
-        //    tmpref.offset:=ref.offset;
-        //
-        //    if assigned(ref.symbol) and (ref.symbol.typ in [AT_FUNCTION,AT_LABEL]) then
-        //      tmpref.refaddr:=addr_lo8_gs
-        //    else
-        //      tmpref.refaddr:=addr_lo8;
-        //    list.concat(taicpu.op_reg_ref(A_LDI,r,tmpref));
-        //
-        //    if assigned(ref.symbol) and (ref.symbol.typ in [AT_FUNCTION,AT_LABEL]) then
-        //      tmpref.refaddr:=addr_hi8_gs
-        //    else
-        //      tmpref.refaddr:=addr_hi8;
-        //    list.concat(taicpu.op_reg_ref(A_LDI,GetNextReg(r),tmpref));
-        //
-        //    if (ref.base<>NR_NO) then
-        //      begin
-        //        list.concat(taicpu.op_reg_reg(A_ADD,r,ref.base));
-        //        list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(r),GetNextReg(ref.base)));
-        //      end;
-        //    if (ref.index<>NR_NO) then
-        //      begin
-        //        list.concat(taicpu.op_reg_reg(A_ADD,r,ref.index));
-        //        list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(r),GetNextReg(ref.index)));
-        //      end;
-        //  end
+        if assigned(ref.symbol) or (ref.offset<>0) 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
+              begin
+                list.Concat(tai_comment.Create(strpnew('WARNING! not implemented: a_loadaddr_ref_reg with symbol and ref.base')));
+                //list.concat(taicpu.op_reg_reg(A_ADD,r,ref.base));
+                //list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(r),GetNextReg(ref.base)));
+              end;
+            if (ref.index<>NR_NO) then
+              begin
+                list.Concat(tai_comment.Create(strpnew('WARNING! not implemented: a_loadaddr_ref_reg with symbol and ref.index')));
+                //list.concat(taicpu.op_reg_reg(A_ADD,r,ref.index));
+                //list.concat(taicpu.op_reg_reg(A_ADC,GetNextReg(r),GetNextReg(ref.index)));
+              end;
+          end
+        else
+          list.Concat(tai_comment.Create(strpnew('WARNING! not implemented: a_loadaddr_ref_reg')));
         //else if (ref.base<>NR_NO)then
         //  begin
         //    emit_mov(list,r,ref.base);