Logo Search packages:      
Sourcecode: beav version File versions  Download package

wangpc.c

#include "def.h"
#if MSDOS
#include "dos.h"

typedef struct SCREENINFO
{
    unsigned char state;
    unsigned char scanoff;
    unsigned short bufseg;
    unsigned char colors;
    unsigned char row;
    unsigned char col;
    unsigned char attr;
    unsigned char auxmod;
    unsigned char auxmod2;
} SCREENINFO;

typedef struct SYSCONFIG
{
    unsigned short version;
    unsigned short memsize;
    unsigned short reserved[2];
    unsigned short screen_count;
    unsigned short screens[4];
} SYSCONFIG;

#define SENDCHAR 6
#define SENDLINE 0x0d
#define BIOS 0x88
#define GETSYSCON 1

bool wang_pc = FALSE;
bool ibm_pc = FALSE;
bool mem_map = FALSE;

void
is_wang ()
{
    union REGS inregs, outregs;
    struct SREGS segregs;
    unsigned char *memptr;
    unsigned char c;
    int i;
    static char wang_id[] =
    {
      "WANG"};
    static char ret_str[6];
    char *chr_ptr;

    chr_ptr = ret_str;
    /* test for Wang PC */
    memptr = (unsigned char *) 0xFC003FC2L;
    wang_pc = TRUE;
    for (i = 0; (i < 4 && wang_pc); i++)
    {
      if (*memptr != wang_id[i])
          wang_pc = FALSE;
      memptr++;
    }

    if (wang_pc)
    {
      mem_map = TRUE;
      ret_str[0] = 0xFF;      /* set to known value */
      mem_map = TRUE;
      inregs.h.al = 0x02;
      inregs.h.ah = 0x44;
      inregs.x.bx = 0;
      inregs.x.cx = 1;
      inregs.x.dx = FP_OFF (chr_ptr);
      segregs.ds = FP_SEG (chr_ptr);

      int86x (0x21, &inregs, &outregs, &segregs);
      if (ret_str[0] == 0x11)
      {
          ibm_pc = TRUE;
          return;
      }
      ibm_pc = FALSE;
      return;
    }

    /* Must be an IBM or clone */
    memptr = (unsigned char *) 0xF000FFFEL;
    c = *memptr;
    switch (c)
    {
    case 0xFC:                /* IBM AT or clone */
    case 0xFD:                /* IBM PC Jr */
    case 0xFE:                /* IBM XT or clone */
    case 0xFF:                /* IBM PC or clone */
      mem_map = TRUE;
      ibm_pc = TRUE;
      return;
    }
}

int
getsysconfig (outregs, segregs)
    union REGS *outregs;
    struct SREGS *segregs;
{
    union REGS inregs;

    inregs.h.al = GETSYSCON;

    int86x (BIOS, &inregs, outregs, segregs);
}

char
getscreenstate ()
{
    struct SREGS segregs;
    union REGS outregs;

    struct SYSCONFIG *config;
    struct SCREENINFO *screeninfo;
    unsigned short *shortptr;
    unsigned int screen_count;

    getsysconfig (&outregs, &segregs);

    /* set pointer to force register info into a long pointer. */
    shortptr = (unsigned short *) &config;

    /* Offset is first, it comes back in BX */
    *shortptr = (unsigned short) outregs.x.bx;
    shortptr++;

    /* segment is in ES */
    *shortptr = (unsigned short) segregs.es;

    /* Now, the config pointer should be set to the config table. */
    /*  printf("Version = %04x \n",config->version);
  printf("Memsize = %04x \n",config->memsize);
  printf("Screens = %04x \n",config->screen_count);
  */
    screen_count = config->screen_count;
    while (screen_count)
    {
      shortptr = (unsigned short *) &screeninfo;
      *shortptr = (unsigned short) config->screens[screen_count - 1];
      shortptr++;
      *shortptr = (unsigned short) segregs.es;
      if (screeninfo->state & 0x80)
          break;
      screen_count--;
    }
    return (screeninfo->state);
}

#endif

Generated by  Doxygen 1.6.0   Back to index