TIP: Click on subject to list as thread! ANSI
echo: os2prog
to: Kevin Ring
from: Peter Fitzsimmons
date: 1995-12-17 17:02:40
subject: Non-PM Graphics

KR> Is it possible to create a non-PM 32 bit OS/2 native 
 KR> program that uses graphics modes (such as mode 13h)?

Yes.  Here is a mode 13 (320x200x8bit) sample.

 #define INCL_NOPMAPI
 #define INCL_VIO
 #define INCL_DOS
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 //icc /G4 /Q /Smes /W3 /Kb+ /O /Oi20 /Gs /Gm circ_fs.c


 #define SIZEX 320
 #define SIZEY 200

 #define ORIGINX (SIZEX/2)
 #define ORIGINY (SIZEY/2)


 #define squared(n)  ((n) * (n))
 #define point(x, y)  pchScreen[ (unsigned) ((y) * SIZEX + x)]


 // circle with origin (h,k) and radius r:  r^2 = (x-h)^2 + (y-k)^2

 void circles(UCHAR far *pchScreen)      // NOTE16
 {
     int x, y, r;

     for(x=0; x=0; i--){     // rotate old values
         pal[(i+1) * 3 + 0] = pal[i*3 + 0];
         pal[(i+1) * 3 + 1] = pal[i*3 + 1];
         pal[(i+1) * 3 + 2] = pal[i*3 + 2];
     }
     pal[0] = r;     // add new value
     pal[1] = g;
     pal[2] = b;

     switch(ch){
         case 0: b = newcolor(&bdir, b, &ch); break;
         case 2: g = newcolor(&gdir, g, &ch); break;
         case 1: r = newcolor(&rdir, r, &ch); break;
     }

     rc = VioSetState(&vcr, 0);
     if(rc){
         printf( "SYS%04u: Error setting palette registers.\n", rc);
         exit(1);
     }
 }



 static void setmode(void)
 {
     VIOMODEINFO vi;
     USHORT rc;

     vi.cb = sizeof(vi);
     VioGetMode(&vi, 0);
     vi.fbType = 3;
     vi.color  = 8;
     vi.col    = 40;
     vi.row    = 25;
     vi.hres   = SIZEX;
     vi.vres   = SIZEY;
     if( 0 != (rc = VioSetMode(&vi, 0))){
         printf("SYS%04u: Could not set video mode to 320x200x256", rc);
         exit(1);
     }
 }


 void thread2(void far *arg)                             // NOTE16
 {
     unsigned i=0;
     DosSetPrty(PRTYS_PROCESS, PRTYC_IDLETIME, 1, 0);        // NOTE16
     for(;;){
         rotate(0);
         if(!(i++ % 2))   // sleep every other loop
             DosSleep(1);
     }
 }


 int main(void)
 {
     VIOPHYSBUF viopb;
     PCH    pchScreen;
     ULONG    ul16;
     USHORT fStatus;

     srand(time(NULL) % 0x8000);
     setmode();
     viopb.pBuf = (PBYTE) 0xA0000L;
     viopb.cb = 64000L;
     VioScrLock(LOCKIO_WAIT, (PBYTE) &fStatus, 0);
     VioGetPhysBuf(&viopb, 0);
 #if 0
     pchScreen = MAKEP(viopb.asel[0], 0);
 #else
     // need to do this in two steps to work around Watcom v10 bug:
     ul16 = viopb.asel[0] << 16;
     pchScreen = (char * _Seg16)ul16;      // compiler will thunk 16:16 to 0:32
 #endif
     _fmemset(pchScreen, 0, (size_t)viopb.cb);
     circles(pchScreen);
     VioScrUnLock(0);
     rotate(1);
     DosSleep(100L);     // pause for effect
     _beginthread(thread2, NULL, 0x4000, NULL);
     getch();
     return 0;
 }

--- Maximus/2 3.00
* Origin: Sol 3 * Toronto * V.32 * (905)858-8488 (1:259/414)
SEEN-BY: 270/101 620/243 711/401 409 410 413 430 808 809 934 955 712/407 515
SEEN-BY: 712/517 628 713/888 800/1 7877/2809
@PATH: 259/414 400 99 250/99 3615/50 396/1 270/101 712/515 711/808 809 934

SOURCE: echomail via fidonet.ozzmosis.com

Email questions or comments to sysop@ipingthereforeiam.com
All parts of this website painstakingly hand-crafted in the U.S.A.!
IPTIA BBS/MUD/Terminal/Game Server List, © 2025 IPTIA Consulting™.