Category : C Source Code
Archive   : TOOLS153.ZIP
Filename : TCT_INIT.C

 
Output of file : TCT_INIT.C contained in archive : TOOLS153.ZIP
/****************************************************************/
/* */
/* Filename: TCT_INIT.C */
/* */
/* Author: Mike McCabe */
/* */
/* Release Date: October 14, 1988 */
/* */
/* Current Version: 1.0 */
/* */
/* Project Name: TC-Tools Library */
/* */
/* Compatibility: Turbo C 1.5 and 2.0 */
/* IBM-PC/PS2 Video Subsystem */
/* */
/* Copyright: (C)opyright 1988 by Mike McCabe */
/* All Rights Reserved */
/* */
/* Subroutines Called: int86x */
/* peekb */
/* peek */
/* printf */
/* exit */
/* detectgraph */
/* registerfarbgidriver */
/* initgraph */
/* getaspectratio */
/* closegraph */
/* */
/* Globals Used: See Code */
/* */
/****************************************************************/
/* */
/* Description: */
/* */
/* This routine will initialize the TC-Tools system. */
/* It will determine PC-type, Graphics Driver Card Type */
/* and screen limits. */
/* */
/* Calling Parameters: */
/* */
/* void tct_init(); */
/* */
/****************************************************************/
/* */
/* Revision History: */
/* */
/* Version Date Description */
/* ------- -------- ----------- */
/* 1.0 11/14/88 Original Release */
/* */
/****************************************************************/

/* Declare needed .h files */
#include
#include
#include
#include "tctools.h"

/* Declare Global Variables */
double AspectRatio; /* Graphics Screen Aspect Ratio */
int Graph_driver; /* Graphics Driver code */
int Graph_mode; /* Graphics Mode Code */
int Graph_error; /* Graphics Error Code */

WINDOWPTR Last_window; /* Pointer to last window on list */
int Zoom_window = 1; /* Zoom Window Flag */
int Zoom_delay = 0; /* Zoom Delay Value - Tics */
DIRTYPE Shadow_window; /* Shadow Window Flag */
int Shadow_attr = 0; /* Shadow Screen Attribute */
SHADES Shadow_type = BLANKSHD; /* Shadow Style Value */

int Page_zero_seg; /* Text Page 0 Segment */
int Cur_page_seg; /* Current Text Page Segment */
int Cardwait; /* Card Wait Flag */
int Systemid; /* PC Model Identification */
int Submodelid; /* Sub Model Identification */
int Cur_text_page; /* Current Text Page */
int Max_text_h; /* Number of Columns on Screen */
int Max_text_v; /* Number of Rows on Screen */
int Max_graph_h; /* Number of Graphic Columns */
int Max_graph_v; /* Number of Graphic Rows */
int Max_text_page; /* Maximum Text Page Number */
int Max_graph_page; /* Maximum Graph Page Number */
int Write_update = 1; /* Write Update Cursor Flag */
int Keypad = 0; /* Keypad Flag */
struct menuline *ml; /* Pointer to Menu Line Structure */
struct menuline *mlnext; /* Pointer for Linked List Search */
struct menuline *mlprev; /* Pointer for Linked List Search */
struct titleline *tl; /* Pointer to Title Line Struct */


void tct_init()
{
union REGS regs; /* Declare Registers two ways */
struct SREGS segregs;
int es; /* variable to hold es reg */
int j; /* common variable */
int mode; /* mode from dos */
int xasp; /* x - aspect */
int yasp; /* y - aspect */

/* Save the current value in Extra Segment Reg */
es = _ES;

/* Put Extra Segment Reg into segregs for int86x call */
segregs.es = _ES;

/* Put Data Segment Reg into segregs for int86x call */
segregs.ds = _DS;

/* Setup for PC Type Function Interrupt */
regs.h.ah = 0xC0;

/* Go get PC-Type Information */
int86x(0x15, ®s, ®s, &segregs);

/* If carry flag is set then */
if ( regs.x.cflag ) {

/* Get System ID from memory instead */
Systemid = peekb(0xF000,0xFFFE);

/* And submodel is unavailable */
Submodelid = 0;

/* else */
} else {

/* System ID is at address pointed to by [bx+2] */
Systemid = peek(segregs.es,regs.x.bx+2);

/* Submodel = high byte of System ID */
Submodelid = (Systemid & 0xFF00) >> 8;

/* Mask off Submodel */
Systemid = Systemid & 0x00FF;

/* end if */
};

/* Restore Extra Segment Reg before all else */
_ES = es;

/* Subtract known PC's from System ID for Enum Variable */
Systemid = Systemid - 0xF9;

/* If Unknown PC then */
if ( Systemid < 0 ) {

/* alarm operator */
printf("Unknown PC Model\n");

/* exit */
exit(1);

/* end if */
};

/* get current video mode from low memory */
mode = peekb(0x0000,0x0449);

/* if mode shows monochrome then */
if ( mode == 7 ) {

/* set text page zero segment to start of Hercules Ram */
Page_zero_seg = 0xB000;

/* set current page segment to text page zero segment */
Cur_page_seg = Page_zero_seg;

/* else */
} else {

/* all other cards are at 0xB800 */
Page_zero_seg = 0xB800;

/* set current page segment to text page zero segment */
Cur_page_seg = Page_zero_seg;

/* end if */
};

/* call BGI to detect card and get current graphics mode */
detectgraph(&Graph_driver, &Graph_mode);

/* if monitor card is unknown to BGI then */
if ( Graph_driver < 0 ) {

/* alarm fact to screen */
printf("No Monitor Card or Unknown Monitor Card Found\n");

/* exit */
exit(1);

/* end if */
};

/* if monitor card is a CGA and system is not a PC-JR then */
if ( Graph_driver == CGA && Systemid != IBMPCJR ) {

/* Set for Card waiting */
Cardwait = 1;

/* else */
} else {

/* Reset Card wait flag */
Cardwait = 0;

/* end if */
};

/* switch : mode */
switch ( mode ) {
case 0:
case 1:
Max_text_h = 40;
Max_text_v = 25;
break;
case 2:
case 3:
case 7:
Max_text_h = 80;
Max_text_v = 25;
break;
default:
printf("Unknown Text Mode Active\n");
exit(1);
break;
};

switch ( Graph_driver ) {
case CGA:
registerfarbgidriver(CGA_driver_far);
if ( mode == 0 || mode == 1 ) {
Max_text_page = 7;
} else {
Max_text_page = 3;
};
Max_graph_page = 1;
switch ( Graph_mode ) {
case CGAC0:
case CGAC1:
case CGAC2:
case CGAC3:
Max_graph_h = 320;
Max_graph_v = 200;
break;
case CGAHI:
Max_graph_h = 640;
Max_graph_v = 200;
break;
default:
printf("Unknown CGA Mode\n");
exit(1);
break;
};
break;
case MCGA:
registerfarbgidriver(CGA_driver_far);
Max_text_page = 1;
Max_graph_page = 1;
switch ( Graph_mode ) {
case MCGAC0:
case MCGAC1:
case MCGAC2:
case MCGAC3:
Max_graph_h = 320;
Max_graph_v = 200;
break;
case MCGAMED:
Max_graph_h = 640;
Max_graph_v = 200;
break;
case MCGAHI:
Max_graph_h = 640;
Max_graph_v = 480;
default:
printf("Unknown MCGA Mode\n");
exit(1);
break;
};
break;
case EGA:
case EGA64:
case EGAMONO:
registerfarbgidriver(EGAVGA_driver_far);
Max_graph_page = 1;
if ( Graph_driver == EGA ) {
if ( Graph_mode == EGALO ) {
Max_graph_page = 4;
} else {
Max_graph_page = 2;
};
};
es = _ES;
segregs.es = _ES;
segregs.ds = _DS;
regs.h.ah = 0x12;
regs.h.bl = 0x10;
int86x(0x10, ®s, ®s, &segregs);
if ( regs.h.bl == 0x10 ) {
printf("No EGA Found via Interrupt\n");
exit(1);
} else {
if ( regs.h.bl != 0 ) {
Max_text_page = 7;
} else {
if ( mode == 0 || mode == 1 ) {
Max_text_page = 7;
} else {
Max_text_page = 3;
};
};
};
_ES = es;
switch ( Graph_mode ) {
case EGALO:
Max_graph_h = 640;
Max_graph_v = 200;
break;
case EGAHI:
Max_graph_h = 640;
Max_graph_v = 350;
break;
default:
printf("Unknown EGA Mode\n");
exit(1);
break;
};
break;
case IBM8514:
registerfarbgidriver(IBM8514_driver_far);
Max_graph_page = 1;
Max_text_page = 1;
switch ( Graph_mode ) {
case IBM8514LO:
Max_graph_h = 640;
Max_graph_v = 480;
break;
case IBM8514HI:
Max_graph_h = 1024;
Max_graph_v = 768;
break;
default:
printf("Unknown IBM8514 Mode\n");
exit(1);
break;
};
break;
case HERCMONO:
registerfarbgidriver(Herc_driver_far);
Max_graph_page = 2;
Max_text_page = 1;
Max_graph_h = 720;
Max_graph_v = 348;
break;
case ATT400:
registerfarbgidriver(ATT_driver_far);
Max_graph_page = 1;
Max_text_page = 1;
switch ( Graph_mode ) {
case ATT400C0:
case ATT400C1:
case ATT400C2:
case ATT400C3:
Max_graph_h = 320;
Max_graph_v = 200;
break;
case ATT400MED:
Max_graph_h = 640;
Max_graph_v = 200;
break;
case ATT400HI:
Max_graph_h = 640;
Max_graph_v = 400;
break;
default:
printf("Unknown ATT400 Mode\n");
exit(1);
break;
};
break;
case VGA:
registerfarbgidriver(EGAVGA_driver_far);
if ( Graph_mode == VGAHI ) {
Max_graph_page = 1;
} else {
Max_graph_page = 2;
};
es = _ES;
segregs.es = _ES;
segregs.ds = _DS;
regs.h.ah = 0x12;
regs.h.al = 0x00;
regs.h.bl = 0x34;
int86x(0x10, ®s, ®s, &segregs);
_ES = es;
Max_text_page = 7;
switch ( Graph_mode ) {
case VGALO:
Max_graph_h = 640;
Max_graph_v = 200;
break;
case VGAMED:
Max_graph_h = 640;
Max_graph_v = 350;
break;
case VGAHI:
Max_graph_h = 640;
Max_graph_v = 480;
break;
default:
printf("Unknown VGA Mode\n");
exit(1);
break;
};
break;
case PC3270:
registerfarbgidriver(PC3270_driver_far);
Max_graph_page = 1;
Max_text_page = 1;
Max_graph_h = 720;
Max_graph_v = 350;
break;
default:
printf("Unknown Driver Found\n");
exit(1);
break;
};
initgraph(&Graph_driver,&Graph_mode,NULL);
getaspectratio(&xasp,&yasp);
AspectRatio = (double) xasp / (double) yasp;
closegraph();
return;
};

  3 Responses to “Category : C Source Code
Archive   : TOOLS153.ZIP
Filename : TCT_INIT.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/