From 01ea38a6278122491b9a0805f8ec5a6003434e29 Mon Sep 17 00:00:00 2001 From: pierre Date: Wed, 11 May 2016 14:29:11 +0000 Subject: [PATCH] Implement basic SysOSAlloc using MSDOS Interrrupt 0x21, AH=0x48 function git-svn-id: trunk@33676 - --- rtl/msdos/sysheap.inc | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/rtl/msdos/sysheap.inc b/rtl/msdos/sysheap.inc index a8e786e353..9ed6b7992e 100644 --- a/rtl/msdos/sysheap.inc +++ b/rtl/msdos/sysheap.inc @@ -21,8 +21,41 @@ *****************************************************************************} function SysOSAlloc (size: ptruint): pointer; +var + regs : Registers; + nb_para : longint; begin +{$ifdef DEBUG_TINY_HEAP} + writeln('SysOSAlloc called size=',size); +{$endif} +{$if defined(FPC_X86_DATA_FAR) or defined(FPC_X86_DATA_HUGE)} + regs.ax:=$4800; + nb_para:=size div 16; + if nb_para > $ffff then + result:=nil + else + begin + regs.bx:=nb_para; + msdos(regs); + if (regs.Flags and fCarry) <> 0 then + begin +{$ifdef DEBUG_TINY_HEAP} + writeln('SysOSAlloc failed, err = ',regs.AX); +{$endif} + GetInOutRes(regs.AX); Result := nil; + end + else + begin + result:=ptr(regs.ax,0); +{$ifdef DEBUG_TINY_HEAP} + writeln('SysOSAlloc returned= $',hexstr(seg(result),4),':$',hexstr(ofs(result),4)); +{$endif} + end; + end; +{$else not DATA_FAR} + Result := nil; +{$endif not DATA_FAR} end; procedure SysOSFree(p: pointer; size: ptruint);