www.digitalmars.com         C & C++   DMDScript  

c++ - __far Pointer

reply IR <IR_member pathlink.com> writes:
Hi all,

I was hoping someone could help me with a question.  I want to place data at a
specific location in memory.  I am writing this program with no run-time
support, so dynamic memory allocation is out of the question.  The location I
want to place data in is in a seperate segment, so I believe I will need to use
a far pointer.  I searched this site and found the __far pointer keyword.  I
figure I need to create a pointer using the __far keyword and place the address
in it following the instructions I found on this site.  I am going to need to do
this in both real mode and protected mode.  For example, say I am executing code
in real mode located in segment 0900h and I want to place data in segment 1200h
at offset 0000h.  How would I do this?  I know protected mode is different with
its global descriptor table but is this also possible in protected mode.  I
don't know if I explained this carefully enough, so tell me if I need to
clarify. 

Thanks!
Nov 06 2004
parent reply "Walter" <newshound digitalmars.com> writes:
"IR" <IR_member pathlink.com> wrote in message
news:cmj6r3$2fld$1 digitaldaemon.com...
 Hi all,

 I was hoping someone could help me with a question.  I want to place data
at a
 specific location in memory.  I am writing this program with no run-time
 support, so dynamic memory allocation is out of the question.  The
location I
 want to place data in is in a seperate segment, so I believe I will need
to use
 a far pointer.  I searched this site and found the __far pointer keyword.
I
 figure I need to create a pointer using the __far keyword and place the
address
 in it following the instructions I found on this site.  I am going to need
to do
 this in both real mode and protected mode.  For example, say I am
executing code
 in real mode located in segment 0900h and I want to place data in segment
1200h
 at offset 0000h.  How would I do this?  I know protected mode is different
with
 its global descriptor table but is this also possible in protected mode.
I
 don't know if I explained this carefully enough, so tell me if I need to
 clarify.
You'll need to use a locator to map the relocatable executable to a specific address. Also, use the 'L' memory model so each source file's code and data are placed in separate segments.
Nov 06 2004
parent reply IR <IR_member pathlink.com> writes:
Is there any way just to write data to a far segment using a far pointer?


In article <cmj7qc$2h2n$1 digitaldaemon.com>, Walter says...
"IR" <IR_member pathlink.com> wrote in message
news:cmj6r3$2fld$1 digitaldaemon.com...
 Hi all,

 I was hoping someone could help me with a question.  I want to place data
at a
 specific location in memory.  I am writing this program with no run-time
 support, so dynamic memory allocation is out of the question.  The
location I
 want to place data in is in a seperate segment, so I believe I will need
to use
 a far pointer.  I searched this site and found the __far pointer keyword.
I
 figure I need to create a pointer using the __far keyword and place the
address
 in it following the instructions I found on this site.  I am going to need
to do
 this in both real mode and protected mode.  For example, say I am
executing code
 in real mode located in segment 0900h and I want to place data in segment
1200h
 at offset 0000h.  How would I do this?  I know protected mode is different
with
 its global descriptor table but is this also possible in protected mode.
I
 don't know if I explained this carefully enough, so tell me if I need to
 clarify.
You'll need to use a locator to map the relocatable executable to a specific address. Also, use the 'L' memory model so each source file's code and data are placed in separate segments.
Nov 06 2004
parent reply "Walter" <newshound digitalmars.com> writes:
Using MK_FP(), you can create a far pointer to any memory location, then
read and write that location.

"IR" <IR_member pathlink.com> wrote in message
news:cmjcjc$2nnu$1 digitaldaemon.com...
 Is there any way just to write data to a far segment using a far pointer?
Nov 06 2004
parent reply IR <IR_member pathlink.com> writes:
Im sorry to keep bothering you but I am still new to this and am trying to
learn.  

I know how I would read data from that location but how would you write.  Thanks
again.




In article <cmjt3m$au8$1 digitaldaemon.com>, Walter says...
Using MK_FP(), you can create a far pointer to any memory location, then
read and write that location.

"IR" <IR_member pathlink.com> wrote in message
news:cmjcjc$2nnu$1 digitaldaemon.com...
 Is there any way just to write data to a far segment using a far pointer?
Nov 06 2004
parent reply "Walter" <newshound digitalmars.com> writes:
char __far *p = MK_FP(0x1200, 0x40);
*p = 6;    // writes 6 to 1200:0040


"IR" <IR_member pathlink.com> wrote in message
news:cmk0u6$fl9$1 digitaldaemon.com...
 Im sorry to keep bothering you but I am still new to this and am trying to
 learn.

 I know how I would read data from that location but how would you write.
Thanks
 again.




 In article <cmjt3m$au8$1 digitaldaemon.com>, Walter says...
Using MK_FP(), you can create a far pointer to any memory location, then
read and write that location.

"IR" <IR_member pathlink.com> wrote in message
news:cmjcjc$2nnu$1 digitaldaemon.com...
 Is there any way just to write data to a far segment using a far
pointer?

Nov 07 2004
parent reply IR <IR_member pathlink.com> writes:
The program has to include dos.h in order to use MK_FP().

Do you know if MK_FP() uses any DOS interrupts or any other DOS functions?

The reason I ask is because I'm writing a program with no underlying OS support.

If it does use some type of DOS support, can you tell me how to set the far
pointer without using MK_FP().

Thanks





In article <cmlsjq$56a$1 digitaldaemon.com>, Walter says...
char __far *p = MK_FP(0x1200, 0x40);
*p = 6;    // writes 6 to 1200:0040


"IR" <IR_member pathlink.com> wrote in message
news:cmk0u6$fl9$1 digitaldaemon.com...
 Im sorry to keep bothering you but I am still new to this and am trying to
 learn.

 I know how I would read data from that location but how would you write.
Thanks
 again.




 In article <cmjt3m$au8$1 digitaldaemon.com>, Walter says...
Using MK_FP(), you can create a far pointer to any memory location, then
read and write that location.

"IR" <IR_member pathlink.com> wrote in message
news:cmjcjc$2nnu$1 digitaldaemon.com...
 Is there any way just to write data to a far segment using a far
pointer?

Nov 08 2004
parent "Walter" <newshound digitalmars.com> writes:
From dos.h:

#define MK_FP(seg,offset) \
        ((void __far *)(((unsigned long)(seg)<<16) | (unsigned)(offset)))

So, no, it does not use DOS functions.


"IR" <IR_member pathlink.com> wrote in message
news:cmo00b$kjq$1 digitaldaemon.com...
 The program has to include dos.h in order to use MK_FP().

 Do you know if MK_FP() uses any DOS interrupts or any other DOS functions?

 The reason I ask is because I'm writing a program with no underlying OS
support.
 If it does use some type of DOS support, can you tell me how to set the
far
 pointer without using MK_FP().

 Thanks





 In article <cmlsjq$56a$1 digitaldaemon.com>, Walter says...
char __far *p = MK_FP(0x1200, 0x40);
*p = 6;    // writes 6 to 1200:0040


"IR" <IR_member pathlink.com> wrote in message
news:cmk0u6$fl9$1 digitaldaemon.com...
 Im sorry to keep bothering you but I am still new to this and am trying
to
 learn.

 I know how I would read data from that location but how would you
write.
Thanks
 again.




 In article <cmjt3m$au8$1 digitaldaemon.com>, Walter says...
Using MK_FP(), you can create a far pointer to any memory location,
then
read and write that location.

"IR" <IR_member pathlink.com> wrote in message
news:cmjcjc$2nnu$1 digitaldaemon.com...
 Is there any way just to write data to a far segment using a far
pointer?

Nov 08 2004