mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-03 11:19:02 +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
|
||||
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 :
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user