home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / beav1402.zip / wangpc.c < prev    next >
Text File  |  1993-04-16  |  3KB  |  153 lines

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