home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 2 / 2872 / wangpc.c < prev    next >
C/C++ Source or Header  |  1991-02-27  |  4KB  |  149 lines

  1. #define LINT_ARGS   1           /* enable lint type checking */
  2. #include "def.h"
  3. #include    "lintfunc.dec"
  4. #if MSDOS
  5. #include "dos.h"
  6.  
  7. typedef struct SCREENINFO
  8. {
  9.     unsigned char   state;
  10.     unsigned char   scanoff;
  11.     unsigned short  bufseg;
  12.     unsigned char   colors;
  13.     unsigned char   row;
  14.     unsigned char   col;
  15.     unsigned char   attr;
  16.     unsigned char   auxmod;
  17.     unsigned char   auxmod2;
  18. } SCREENINFO;
  19.  
  20. typedef struct SYSCONFIG
  21. {
  22.     unsigned short  version;
  23.     unsigned short  memsize;
  24.     unsigned short  reserved[2];
  25.     unsigned short  screen_count;
  26.     unsigned short  screens[4];
  27. } SYSCONFIG;
  28.  
  29. #define SENDCHAR 6
  30. #define SENDLINE 0x0d
  31. #define BIOS 0x88
  32. #define GETSYSCON 1
  33.  
  34. bool    wang_pc = FALSE;
  35. bool    ibm_pc = FALSE;
  36. bool    mem_map = FALSE;
  37.  
  38. void    is_wang ()
  39.     {
  40.     union REGS inregs, outregs;
  41.     struct SREGS    segregs;
  42.     unsigned char far *memptr;
  43.     unsigned char    c;
  44.     int     i;
  45.     static  char wang_id[] = {"WANG"};
  46.     static  char ret_str[6];
  47.     char    *chr_ptr;
  48.  
  49.     chr_ptr = ret_str;
  50.     /* test for Wang PC */
  51.     memptr = (unsigned char far *)0xFC003FC2L;
  52.     wang_pc = TRUE;
  53.     for (i=0;(i<4 && wang_pc);i++)
  54.         {
  55.         if(*memptr != wang_id[i])
  56.             wang_pc = FALSE;
  57.         memptr++;
  58.         }
  59.  
  60.     if (wang_pc)
  61.         {
  62.         mem_map = TRUE;
  63.         ret_str[0] = 0xFF;      /* set to known value */
  64.         mem_map = TRUE;
  65.         inregs.h.al = 0x02;
  66.         inregs.h.ah = 0x44;
  67.         inregs.x.bx = 0;
  68.         inregs.x.cx = 1;
  69.         inregs.x.dx = FP_OFF (chr_ptr);
  70.         segregs.ds = FP_SEG (chr_ptr);
  71.     
  72.         int86x (0x21, &inregs, &outregs, &segregs);
  73.         if (ret_str[0] == 0x11)
  74.             {
  75.             ibm_pc = TRUE;
  76.             return;
  77.             }
  78.         ibm_pc = FALSE;
  79.         return;
  80.         }
  81.  
  82.     /* Must be an IBM or clone */
  83.     memptr = (unsigned char far *)0xF000FFFEL;
  84.     c = *memptr;
  85.     switch(c)
  86.         {
  87.         case 0xFC:  /* IBM AT or clone */
  88.         case 0xFD:  /* IBM PC Jr */
  89.         case 0xFE:  /* IBM XT or clone */
  90.         case 0xFF:  /* IBM PC or clone */
  91.             mem_map = TRUE;
  92.             ibm_pc = TRUE;
  93.             return;
  94.         }
  95.     }
  96.  
  97. int     getsysconfig (outregs, segregs)
  98.         union REGS * outregs;
  99. struct SREGS   *segregs;
  100. {
  101.     union REGS inregs;
  102.  
  103.     inregs.h.al = GETSYSCON;
  104.  
  105.     int86x (BIOS, &inregs, outregs, segregs);
  106. }
  107.  
  108. char    getscreenstate ()
  109. {
  110.     struct SREGS    segregs;
  111.     union REGS outregs;
  112.  
  113.     struct SYSCONFIG   *config;
  114.     struct SCREENINFO  *screeninfo;
  115.     unsigned short *shortptr;
  116.     unsigned int    screen_count;
  117.  
  118.     getsysconfig (&outregs, &segregs);
  119.  
  120.  /* set pointer to force register info into a long pointer. */
  121.     shortptr = (unsigned short *) & config;
  122.  
  123.  /* Offset is first, it comes back in BX */
  124.     *shortptr = (unsigned short) outregs.x.bx;
  125.     shortptr++;
  126.  
  127.  /* segment is in ES */
  128.     *shortptr = (unsigned short) segregs.es;
  129.  
  130.  /* Now, the config pointer should be set to the config table. */
  131. /*  printf("Version = %04x \n",config->version);
  132.     printf("Memsize = %04x \n",config->memsize);
  133.     printf("Screens = %04x \n",config->screen_count);
  134. */
  135.     screen_count = config -> screen_count;
  136.     while (screen_count)
  137.         {
  138.         shortptr = (unsigned short *) & screeninfo;
  139.         *shortptr = (unsigned short) config -> screens[screen_count - 1];
  140.         shortptr++;
  141.         *shortptr = (unsigned short) segregs.es;
  142.         if (screeninfo -> state & 0x80)
  143.             break;
  144.         screen_count--;
  145.         }
  146.     return (screeninfo -> state);
  147. }
  148. #endif
  149.