mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-06 11:58:26 +02:00
+ implemented absolute seg:ofs vars on i8086
git-svn-id: trunk@25666 -
This commit is contained in:
parent
32a18199c5
commit
f2763b98fa
@ -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 :
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user