#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
