Sfoglia il codice sorgente

+ implemented absolute seg:ofs vars on i8086

git-svn-id: trunk@25666 -
nickysn 11 anni fa
parent
commit
f2763b98fa
4 ha cambiato i file con 43 aggiunte e 17 eliminazioni
  1. 8 2
      compiler/ncgld.pas
  2. 15 8
      compiler/nmem.pas
  3. 17 7
      compiler/pdecvar.pas
  4. 3 0
      compiler/symsym.pas

+ 8 - 2
compiler/ncgld.pas

@@ -269,10 +269,16 @@ implementation
                  case tabsolutevarsym(symtableentry).abstyp of
                    toaddr :
                      begin
-{$ifdef i386}
+{$if defined(i8086)}
+                       if tabsolutevarsym(symtableentry).absseg then
+                         begin
+                           location.reference.segment:=cg.getintregister(current_asmdata.CurrAsmList,OS_16);
+                           cg.a_load_const_reg(current_asmdata.CurrAsmList,OS_16,aint(tabsolutevarsym(symtableentry).addrsegment),location.reference.segment);
+                         end;
+{$elseif defined(i386)}
                        if tabsolutevarsym(symtableentry).absseg then
                          location.reference.segment:=NR_FS;
-{$endif i386}
+{$endif}
                        location.reference.offset:=aint(tabsolutevarsym(symtableentry).addroffset);
                      end;
                    toasm :

+ 15 - 8
compiler/nmem.pas

@@ -576,23 +576,30 @@ implementation
               hp:=tunarynode(hp).left;
             if not assigned(hp) then
               internalerror(200412042);
-{$ifdef i386}
+{$if defined(i386) or defined(i8086)}
             if (hp.nodetype=loadn) and
                ((tloadnode(hp).symtableentry.typ=absolutevarsym) and
                tabsolutevarsym(tloadnode(hp).symtableentry).absseg) then
               begin
-                if not(nf_typedaddr in flags) then
-                  resultdef:=voidnearfspointertype
-                else
-                  resultdef:=tpointerdef.createx86(left.resultdef,x86pt_near_fs);
+                {$if defined(i8086)}
+                  if not(nf_typedaddr in flags) then
+                    resultdef:=voidfarpointertype
+                  else
+                    resultdef:=tpointerdef.createx86(left.resultdef,x86pt_far);
+                {$elseif defined(i386)}
+                  if not(nf_typedaddr in flags) then
+                    resultdef:=voidnearfspointertype
+                  else
+                    resultdef:=tpointerdef.createx86(left.resultdef,x86pt_near_fs);
+                {$endif}
               end
             else
-{$endif i386}
+{$endif i386 or i8086}
             if (hp.nodetype=loadn) and
                (tloadnode(hp).symtableentry.typ=absolutevarsym) and
-{$ifdef i386}
+{$if defined(i386) or defined(i8086)}
                not(tabsolutevarsym(tloadnode(hp).symtableentry).absseg) and
-{$endif i386}
+{$endif i386 or i8086}
                (tabsolutevarsym(tloadnode(hp).symtableentry).abstyp=toaddr) then
                begin
                  offset:=tabsolutevarsym(tloadnode(hp).symtableentry).addroffset;

+ 17 - 7
compiler/pdecvar.pas

@@ -1265,18 +1265,28 @@ implementation
                   pt:=expr(true);
                   if is_constintnode(pt) then
                     begin
-                      tmpaddr:=abssym.addroffset shl 4+tordconstnode(pt).value.svalue;
-                      if (tmpaddr<int64(low(abssym.addroffset))) or
-                         (tmpaddr>int64(high(abssym.addroffset))) then
-                        message3(type_e_range_check_error_bounds,tostr(Tordconstnode(pt).value),tostr(low(abssym.addroffset)),tostr(high(abssym.addroffset)))
-                      else
-                        abssym.addroffset:=tmpaddr;
+                      {$if defined(i8086)}
+                        abssym.addrsegment:=abssym.addroffset;
+                        tmpaddr:=tordconstnode(pt).value.svalue;
+                        if (tmpaddr<int64(low(abssym.addroffset))) or
+                           (tmpaddr>int64(high(abssym.addroffset))) then
+                          message3(type_e_range_check_error_bounds,tostr(Tordconstnode(pt).value),tostr(low(abssym.addroffset)),tostr(high(abssym.addroffset)))
+                        else
+                          abssym.addroffset:=tmpaddr;
+                      {$elseif defined(i386)}
+                        tmpaddr:=abssym.addroffset shl 4+tordconstnode(pt).value.svalue;
+                        if (tmpaddr<int64(low(abssym.addroffset))) or
+                           (tmpaddr>int64(high(abssym.addroffset))) then
+                          message3(type_e_range_check_error_bounds,tostr(Tordconstnode(pt).value),tostr(low(abssym.addroffset)),tostr(high(abssym.addroffset)))
+                        else
+                          abssym.addroffset:=tmpaddr;
+                      {$endif}
                       abssym.absseg:=true;
                     end
                   else
                     Message(type_e_ordinal_expr_expected);
                 end;
-{$endif i386}
+{$endif i386 or i8086}
             end
           { variable }
           else

+ 3 - 0
compiler/symsym.pas

@@ -256,6 +256,9 @@ interface
 {$endif defined(i386) or defined(i8086)}
          asmname : pshortstring;
          addroffset : aword;
+{$if defined(i8086)}
+         addrsegment : aword;
+{$endif defined(i8086)}
          ref     : tpropaccesslist;
          constructor create(const n : string;def:tdef);
          constructor create_ref(const n : string;def:tdef;_ref:tpropaccesslist);