+ implemented absolute seg:ofs vars on i8086

git-svn-id: trunk@25666 -
This commit is contained in:
nickysn 2013-10-05 22:16:33 +00:00
parent 32a18199c5
commit f2763b98fa
4 changed files with 43 additions and 17 deletions

View File

@ -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 :

View File

@ -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;

View File

@ -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

View File

@ -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);