+ 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 case tabsolutevarsym(symtableentry).abstyp of
toaddr : toaddr :
begin 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 if tabsolutevarsym(symtableentry).absseg then
location.reference.segment:=NR_FS; location.reference.segment:=NR_FS;
{$endif i386} {$endif}
location.reference.offset:=aint(tabsolutevarsym(symtableentry).addroffset); location.reference.offset:=aint(tabsolutevarsym(symtableentry).addroffset);
end; end;
toasm : toasm :

View File

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

View File

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

View File

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