From f2763b98fa53aa7dfa1f81c2f2dc8ea0848574d3 Mon Sep 17 00:00:00 2001 From: nickysn Date: Sat, 5 Oct 2013 22:16:33 +0000 Subject: [PATCH] + implemented absolute seg:ofs vars on i8086 git-svn-id: trunk@25666 - --- compiler/ncgld.pas | 10 ++++++++-- compiler/nmem.pas | 23 +++++++++++++++-------- compiler/pdecvar.pas | 24 +++++++++++++++++------- compiler/symsym.pas | 3 +++ 4 files changed, 43 insertions(+), 17 deletions(-) diff --git a/compiler/ncgld.pas b/compiler/ncgld.pas index dbae3a99d6..1ec811ce24 100644 --- a/compiler/ncgld.pas +++ b/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 : diff --git a/compiler/nmem.pas b/compiler/nmem.pas index 93e2030538..3b8b7b2eb3 100644 --- a/compiler/nmem.pas +++ b/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; diff --git a/compiler/pdecvar.pas b/compiler/pdecvar.pas index d471748827..7863a917cb 100644 --- a/compiler/pdecvar.pas +++ b/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 (tmpaddrint64(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 (tmpaddrint64(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 (tmpaddrint64(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 diff --git a/compiler/symsym.pas b/compiler/symsym.pas index 7c92f39762..e0d7b4aaf9 100644 --- a/compiler/symsym.pas +++ b/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);