oops

i forgot some ul: it is 0xfffful
 

NancyEtRoland a écrit :

me i would have writen those function like this:

(!! not tested, but it should be ok !!)

inline unsigned long dosptrtolinaddr(void far* dosptr) {
//convert 16 bit far pointer to linear addresse
    return ((((unsigned long) dosptr) & ~0xffff)>>12) + (((unsigned long) dosptr) & 0xfffful )
}

inline void far* linaddrtodosptr(unsigned long linaddr) {
//convert linear addresse to 16 bit far pointer
   return void far* ((linaddr<<12) & ~0xffff)    +  (linaddr & 0xful);
}

inline void FAR *addptr (char FAR *p, unsigned long num) {
    return linaddrtodosptr(dosptrtolinaddr(p)+num);
}

for me its ok:

void FAR *farnormal(void FAR *ptr)
{
      unsigned long base, para;

      base = ((unsigned long)(ptr) & 0xffff000fL);
      para = ((unsigned long)(ptr) & 0x0000fff0L);
      para <<= 12;
      return (void FAR *)(base + para);
}

roland

Mark Evans a écrit :

> Jan,
>
> Walter Bright actually has some contributions in the snippets.org library.  I'm not using those particular ones (yet) but the source code for the pointer arithmetic is so short, maybe you could
> look at it.  I have no reason to doubt its accuracy.  I would suppose that any flaw in its execution could be chalked up to the compiler.
>
> Mark
>
> /* +++Date last modified: 05-Jul-1997 */
>
> /*
> **  FPTR_ADD.C
> **
> **  Add any add any value to a far pointer and returns the result as a
> **  normalized far pointer.
> **
> **  Public Domain by Soleil Lapierre
> */
>
> #include "snpdosys.h"
> #include "mk_fp.h"
>
> void FAR *addptr (char FAR *p, unsigned long num)
> {
>       unsigned seg,off;
>
>       seg = FP_SEG(p); off = FP_OFF(p);
>       seg += off>>4;   off &= 0x000F;
>
>       off += (unsigned)(num&0x0000000fL);
>
>       seg += off>>4;   off &= 0x000F;
>       seg += (unsigned)num>>4;
>
>       return(MK_FP(seg,off));
> }
>
> /*
> **  Normalize a far pointer
> */
>
> void FAR *farnormal(void FAR *ptr)
> {
>       unsigned long base, para;
>
>       base = ((unsigned long)(ptr) & 0xffff000fL);
>       para = ((unsigned long)(ptr) & 0x0000fff0L);
>       para <<= 12;
>       return (void FAR *)(base + para);
> }