Browse Source

* convert zero page registers to addresses in the sdas6500 assembler writer

Nikolay Nikolov 1 year ago
parent
commit
3737f98894
2 changed files with 34 additions and 1 deletions
  1. 4 1
      compiler/mos6502/agsdas6500.pas
  2. 30 0
      compiler/mos6502/cpubase.pas

+ 4 - 1
compiler/mos6502/agsdas6500.pas

@@ -379,7 +379,10 @@ unit agsdas6500;
       begin
       begin
         case o.typ of
         case o.typ of
           top_reg :
           top_reg :
-            writer.AsmWrite(std_regname(o.reg));
+            if is_6502_zero_page_register(o.reg) then
+              writer.AsmWrite('*'+tostr(get_6502_zero_page_register_address(o.reg)))
+            else
+              writer.AsmWrite(std_regname(o.reg));
           top_const :
           top_const :
             begin
             begin
               writer.AsmWrite('#'+tostr(longint(o.val)));
               writer.AsmWrite('#'+tostr(longint(o.val)));

+ 30 - 0
compiler/mos6502/cpubase.pas

@@ -282,6 +282,8 @@ unit cpubase;
     function std_regname(r:Tregister):string;
     function std_regname(r:Tregister):string;
     function is_6502_general_purpose_register(r:TRegister):boolean;
     function is_6502_general_purpose_register(r:TRegister):boolean;
     function is_6502_index_register(r:TRegister):boolean;
     function is_6502_index_register(r:TRegister):boolean;
+    function is_6502_zero_page_register(r:TRegister):boolean;
+    function get_6502_zero_page_register_address(r:TRegister): Byte;
     function is_regpair(r:Tregister):boolean;
     function is_regpair(r:Tregister):boolean;
     procedure split_regpair(regpair:Tregister;out reglo,reghi:Tregister);
     procedure split_regpair(regpair:Tregister;out reglo,reghi:Tregister);
     { Checks if sreg is a subset of reg (e.g. NR_H is a subset of NR_HL }
     { Checks if sreg is a subset of reg (e.g. NR_H is a subset of NR_HL }
@@ -408,6 +410,34 @@ unit cpubase;
       end;
       end;
 
 
 
 
+    function is_6502_zero_page_register(r:TRegister):boolean;
+      begin
+        result:=(getregtype(r)=R_INTREGISTER) and
+          (((getsupreg(r)>=RS_RZB0) and (getsupreg(r)<=RS_RZB255)) or
+           ((getsupreg(r)>=RS_RZW0) and (getsupreg(r)<=RS_RZW254)));
+      end;
+
+
+    function get_6502_zero_page_register_address(r:TRegister): Byte;
+      var
+        supreg: TSuperRegister;
+      begin
+        if getregtype(r)<>R_INTREGISTER then
+          internalerror(2024050401);
+        supreg:=getsupreg(r);
+        if (supreg>=RS_RZB0) and (supreg<=RS_RZB255) then
+          result:=supreg-RS_RZB0
+        else if (supreg>=RS_RZW0) and (supreg<=RS_RZW254) then
+          begin
+            result:=supreg-RS_RZW0;
+            if getsubreg(r)=R_SUBH then
+              Inc(result);
+          end
+        else
+          internalerror(2024050402);
+      end;
+
+
     function is_regpair(r: Tregister): boolean;
     function is_regpair(r: Tregister): boolean;
       begin
       begin
         internalerror(2024040601);
         internalerror(2024040601);