How do I point to the frame buffer?
Paul S. R. Chisholm
psc at lznv.ATT.COM
Fri Jul 8 12:16:45 AEST 1988
< "Would you buy a used operating system from these guys?" >
In article <1584 at dataio.Data-IO.COM>, bright at Data-IO.COM (Walter Bright) writes:
> In article <1391 at lznv.ATT.COM> psc at lznv.ATT.COM (Paul S. R. Chisholm) writes:
> >The frame buffer starts at B800:0000, which would be 0xB8000 if the
> >8088 had a linear address space. It doesn't. The right way to do this
> >in MS or Turbo C or Zortech C is
> > #include <dos.h>
> > far char * const Screen = MK_FP( 0xB800, 0 );
> >(The "const" is optional; it tells the compiler that Screen is a
> >constant, and that no one should be allowed to muck with it.)
> Replace "const" with "volatile". All hardware device locations (except
> ROM ones) should be "volatile", since they can be modified by an interrupt
> routine (like a TSR). One example is the ^C that appears on the screen
> when you type a control C.
I don't think that any compiler would generate different code with the
"volatile" keyword, but that's not a bad idea.
> Also, you've declared a <const pointer to><far char>. Try instead:
> volatile unsigned short far *Screen = ...
> which is <far pointer to><volatile unsigned short>. The unsigned short
> instead of char is because the display memory is actually organized as
> words instead of bytes. The high byte is the attribute, the low byte
> the character.
Using an short pointer is a good idea; even on an 8/16 bit 8088, it's
faster to move one word once than one byte twice.
But I *meant* to have a constant pointer! I didn't want anyone mucking
around with Screen.
volatile unsigned short far * const Screen;
> Note also that "const" and "volatile" are left-associative. "far" and
> "near" are right-associative. Confusing? You bet!
"TYPE const * foo" means that *foo (the thing foo points to) is constant.
"TYPE * const foo" means that foo (the pointer itself) is constant.
Do we have you all sufficiently confused now? Good, try this trivia
question (answer after the .sig and ^L): When might you use this?
volatile TYPE const * const foo;
-Paul S. R. Chisholm, {ihnp4,cbosgd,allegra,rutgers}!mtune!lznv!psc
AT&T Mail !psrchisholm, Internet psc at lznv.att.com
I'm not speaking for my employer, I'm just speaking my mind.
volatile time_t const far * const Timer = TIMER_ADDR;
Our code isn't allowed to change either Timer or the data it points to;
but the data there may change all by itself. A real time clock!
More information about the Comp.lang.c
mailing list