From 0119e7afb36d5e9aee7f9dbc9a8d94a76a954ae0 Mon Sep 17 00:00:00 2001 From: nickysn Date: Thu, 14 Dec 2017 17:36:15 +0000 Subject: [PATCH] * changed the codepointer type in the i8086 small and compact memory models from nearpointer to nearcspointer git-svn-id: trunk@37730 - --- compiler/i8086/n8086mem.pas | 18 ------------------ compiler/nmem.pas | 10 ++++++++-- compiler/psystem.pas | 4 +++- rtl/i8086/i8086.inc | 30 ++++++++++++++++++++++++++++++ rtl/inc/systemh.inc | 12 +++++++++++- rtl/msdos/classes.pp | 4 ++-- 6 files changed, 54 insertions(+), 24 deletions(-) diff --git a/compiler/i8086/n8086mem.pas b/compiler/i8086/n8086mem.pas index 15a59a0310..61bbe1166c 100644 --- a/compiler/i8086/n8086mem.pas +++ b/compiler/i8086/n8086mem.pas @@ -35,7 +35,6 @@ interface ti8086addrnode = class(ti86addrnode) protected procedure set_absvarsym_resultdef; override; - function typecheck_non_proc(realsource: tnode; out res: tnode): boolean; override; procedure pass_generate_code;override; public get_offset_only: boolean; @@ -78,23 +77,6 @@ implementation end; - function ti8086addrnode.typecheck_non_proc(realsource: tnode; out res: tnode): boolean; - begin - res:=nil; - if (realsource.nodetype=loadn) and - (tloadnode(realsource).symtableentry.typ=labelsym) then - begin - if current_settings.x86memorymodel in x86_far_code_models then - resultdef:=voidfarpointertype - else - resultdef:=voidnearpointertype; - result:=true - end - else - result:=inherited; - end; - - procedure ti8086addrnode.pass_generate_code; begin if get_offset_only then diff --git a/compiler/nmem.pas b/compiler/nmem.pas index 83efde58b0..9fb5180384 100644 --- a/compiler/nmem.pas +++ b/compiler/nmem.pas @@ -638,8 +638,14 @@ implementation result:=false; res:=nil; if (realsource.nodetype=loadn) and - (tloadnode(realsource).symtableentry.typ=absolutevarsym) and - (tabsolutevarsym(tloadnode(realsource).symtableentry).abstyp=toaddr) then + (tloadnode(realsource).symtableentry.typ=labelsym) then + begin + resultdef:=voidcodepointertype; + result:=true; + end + else if (realsource.nodetype=loadn) and + (tloadnode(realsource).symtableentry.typ=absolutevarsym) and + (tabsolutevarsym(tloadnode(realsource).symtableentry).abstyp=toaddr) then begin offset:=tabsolutevarsym(tloadnode(realsource).symtableentry).addroffset; hp:=left; diff --git a/compiler/psystem.pas b/compiler/psystem.pas index ae9b239b7a..4efe323ce1 100644 --- a/compiler/psystem.pas +++ b/compiler/psystem.pas @@ -166,8 +166,10 @@ implementation {$ifdef i8086} if current_settings.x86memorymodel in x86_far_code_models then voidcodepointertype:=voidfarpointertype + else if current_settings.x86memorymodel=mm_tiny then + voidcodepointertype:=voidnearpointertype else - voidcodepointertype:=voidnearpointertype; + voidcodepointertype:=voidnearcspointertype; voidstackpointertype:=voidnearsspointertype; {$else i8086} voidcodepointertype:=voidpointertype; diff --git a/rtl/i8086/i8086.inc b/rtl/i8086/i8086.inc index 6361dd4689..c080e4ead9 100644 --- a/rtl/i8086/i8086.inc +++ b/rtl/i8086/i8086.inc @@ -1045,6 +1045,36 @@ begin HexStr:=HexStr(Word(Val),4); end; +function HexStr(Val: NearCsPointer): ShortString; +begin + HexStr:='CS:'+HexStr(Word(Val),4); +end; + +function HexStr(Val: NearDsPointer): ShortString; +begin + HexStr:='DS:'+HexStr(Word(Val),4); +end; + +function HexStr(Val: NearEsPointer): ShortString; +begin + HexStr:='ES:'+HexStr(Word(Val),4); +end; + +function HexStr(Val: NearSsPointer): ShortString; +begin + HexStr:='SS:'+HexStr(Word(Val),4); +end; + +function HexStr(Val: NearFsPointer): ShortString; +begin + HexStr:='FS:'+HexStr(Word(Val),4); +end; + +function HexStr(Val: NearGsPointer): ShortString; +begin + HexStr:='GS:'+HexStr(Word(Val),4); +end; + function HexStr(Val: FarPointer): ShortString; type TFarPointerRec = record diff --git a/rtl/inc/systemh.inc b/rtl/inc/systemh.inc index 9e35ce865f..b8533491f8 100644 --- a/rtl/inc/systemh.inc +++ b/rtl/inc/systemh.inc @@ -406,10 +406,14 @@ Type CodePointer = FarPointer; CodePtrInt = Longint; CodePtrUInt = DWord; - {$elseif defined(FPC_X86_CODE_NEAR)} + {$elseif defined(FPC_MM_TINY)} CodePointer = NearPointer; CodePtrInt = Integer; CodePtrUInt = Word; + {$elseif defined(FPC_X86_CODE_NEAR)} + CodePointer = NearCsPointer; + CodePtrInt = Integer; + CodePtrUInt = Word; {$else} CodePointer = Pointer; CodePtrInt = PtrInt; @@ -1195,6 +1199,12 @@ Function OctStr(Val:qword;cnt:byte):shortstring; Function binStr(Val:qword;cnt:byte):shortstring; {$ifdef CPUI8086} Function hexStr(Val:NearPointer):shortstring; +function hexStr(Val:NearCsPointer):shortstring; +function hexStr(Val:NearDsPointer):shortstring; +function hexStr(Val:NearEsPointer):shortstring; +function hexStr(Val:NearSsPointer):shortstring; +function hexStr(Val:NearFsPointer):shortstring; +function hexStr(Val:NearGsPointer):shortstring; Function hexStr(Val:FarPointer):shortstring; Function hexStr(Val:HugePointer):shortstring;{$ifdef SYSTEMINLINE}inline;{$endif} {$else CPUI8086} diff --git a/rtl/msdos/classes.pp b/rtl/msdos/classes.pp index 95fb6253c4..3377e14996 100644 --- a/rtl/msdos/classes.pp +++ b/rtl/msdos/classes.pp @@ -18,9 +18,9 @@ { determine the type of the resource/form file } {$define Win16Res} -{$if defined(FPC_MM_TINY) or defined(FPC_MM_SMALL) or defined(FPC_MM_LARGE) or defined(FPC_MM_HUGE)} +{$if defined(FPC_MM_TINY) or defined(FPC_MM_LARGE) or defined(FPC_MM_HUGE)} { CodePointer = Pointer; nothing to define } -{$elseif defined(FPC_MM_MEDIUM) or defined(FPC_MM_COMPACT)} +{$elseif defined(FPC_MM_SMALL) or defined(FPC_MM_MEDIUM) or defined(FPC_MM_COMPACT)} {$define FPC_CODEPOINTER_DIFFERENT_THAN_POINTER} {$else} {$fatal Unknown i8086 memory model.}