mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
575 lines
16 KiB
575 lines
16 KiB
#include "insignia.h"
|
|
#include "host_def.h"
|
|
/* INSIGNIA (SUB)MODULE SPECIFICATION
|
|
-----------------------------
|
|
|
|
|
|
THIS PROGRAM SOURCE FILE IS SUPPLIED IN CONFIDENCE TO THE
|
|
CUSTOMER, THE CONTENTS OR DETAILS OF ITS OPERATION MUST
|
|
NOT BE DISCLOSED TO ANY OTHER PARTIES WITHOUT THE EXPRESS
|
|
AUTHORISATION FROM THE DIRECTORS OF INSIGNIA SOLUTIONS LTD.
|
|
|
|
DESIGNER : S.Frost
|
|
|
|
REVISION HISTORY :
|
|
First version : Feb/Mar 1990. Simon Frost
|
|
|
|
SOURCE FILE NAME : vga_mode.c
|
|
|
|
PURPOSE : To decide which mode the VGA is in according to
|
|
variables set via vga_ports.c and to choose the
|
|
appropriate update and paint routines accordingly.
|
|
Borrows heavily from ega_mode.c...
|
|
|
|
static char SccsID[]="@(#)vga_mode.c 1.35 06/01/95 Copyright Insignia Solutions Ltd.";
|
|
|
|
|
|
|
|
|
|
[1.INTERMODULE INTERFACE SPECIFICATION]
|
|
|
|
[1.0 INCLUDE FILE NEEDED TO ACCESS THIS INTERFACE FROM OTHER SUBMODULES]
|
|
|
|
INCLUDE FILE : ega_mode.gi
|
|
|
|
[1.1 INTERMODULE EXPORTS]
|
|
|
|
PROCEDURES() : choose_vga_display_mode
|
|
|
|
DATA : uses EGA_GRAPH.display_state which is set via vga_ports.c, to
|
|
determine what memory organisation the display side is in, and
|
|
hence what sort of update and paint routines to use.
|
|
|
|
-------------------------------------------------------------------------
|
|
[1.2 DATATYPES FOR [1.1] (if not basic C types)]
|
|
|
|
STRUCTURES/TYPEDEFS/ENUMS:
|
|
|
|
uses enum DISPLAY_STATE which is declared in ega_graph.pi.
|
|
|
|
uses EGA_GRAPH structure for global variables set by the ports and
|
|
used by the display.
|
|
|
|
-------------------------------------------------------------------------
|
|
[1.3 INTERMODULE IMPORTS]
|
|
(not o/s objects or standard libs)
|
|
|
|
PROCEDURES() : vote_vga_mode()
|
|
host_set_paint_routine(DISPLAY_MODE)
|
|
|
|
DATA : EGA_GRAPH struct.
|
|
|
|
-------------------------------------------------------------------------
|
|
|
|
[1.4 DESCRIPTION OF INTERMODULE INTERFACE]
|
|
|
|
[1.4.1 IMPORTED OBJECTS]
|
|
|
|
[1.4.2 EXPORTED OBJECTS]
|
|
|
|
=========================================================================
|
|
PROCEDURE : choose_vga_display_mode
|
|
|
|
PURPOSE : To decide which memory organisation is being used by
|
|
the vga, and to pick the best update and paint routines
|
|
accordingly. The paint routines are host specific,
|
|
and so the memory organisation is indicated by an enum
|
|
(called DISPLAY_MODE), describing each sort of memory
|
|
organisation.
|
|
|
|
PARAMETERS : none
|
|
|
|
GLOBALS : uses EGA_GRAPH struct, specially display_state to
|
|
decide which mode is being used.
|
|
|
|
=========================================================================
|
|
|
|
|
|
/*=======================================================================
|
|
[3.INTERMODULE INTERFACE DECLARATIONS]
|
|
=========================================================================
|
|
|
|
[3.1 INTERMODULE IMPORTS] */
|
|
|
|
|
|
#ifndef REAL_VGA
|
|
#ifdef VGG
|
|
|
|
/* [3.1.1 #INCLUDES] */
|
|
|
|
#include "xt.h"
|
|
#include "error.h"
|
|
#include "config.h"
|
|
#include "gvi.h"
|
|
#include "gmi.h"
|
|
#include "gfx_upd.h"
|
|
#include "egagraph.h"
|
|
#include "vgaports.h"
|
|
#include "egacpu.h"
|
|
#include "egaports.h"
|
|
#include "debug.h"
|
|
#include "host_gfx.h"
|
|
|
|
#ifdef GORE
|
|
#include "gore.h"
|
|
#endif /* GORE */
|
|
|
|
/* [3.1.2 DECLARATIONS] */
|
|
|
|
/* [3.2 INTERMODULE EXPORTS] */
|
|
|
|
#include "egamode.h"
|
|
|
|
#ifdef GISP_SVGA
|
|
#include HostHwVgaH
|
|
#include "hwvga.h"
|
|
#endif /* GISP_SVGA */
|
|
|
|
/*
|
|
5.MODULE INTERNALS : (not visible externally, global internally)]
|
|
|
|
[5.1 LOCAL DECLARATIONS] */
|
|
|
|
/* [5.1.1 #DEFINES] */
|
|
#ifdef SEGMENTATION
|
|
/*
|
|
* The following #define specifies the code segment into which this
|
|
* module will by placed by the MPW C compiler on the Mac II running
|
|
* MultiFinder.
|
|
*/
|
|
#include "SOFTPC_VGA.seg"
|
|
#endif
|
|
|
|
/* [5.1.2 TYPEDEF, STRUCTURE, ENUM DECLARATIONS] */
|
|
|
|
/* [5.1.3 PROCEDURE() DECLARATIONS] */
|
|
|
|
/*
|
|
=========================================================================
|
|
PROCEDURE : set_up_screen_ptr()
|
|
|
|
PURPOSE : Decide which plane the information must come from for displaying
|
|
|
|
PARAMETERS : none
|
|
|
|
GLOBALS : uses EGA_GRAPH struct, plane_mask to decide which planes are enabled
|
|
|
|
=========================================================================
|
|
*/
|
|
|
|
LOCAL VOID
|
|
set_up_screen_ptr()
|
|
{
|
|
if( get_chain4_mode() )
|
|
{
|
|
if (all_planes_enabled())
|
|
set_screen_ptr(EGA_plane0123);
|
|
else
|
|
assert0(NO,"No planes enabled for chain-4 mode\n");
|
|
}
|
|
else
|
|
if( get_memory_chained() )
|
|
{
|
|
if( plane01_enabled() )
|
|
set_screen_ptr(EGA_plane01);
|
|
else
|
|
if( plane23_enabled() )
|
|
set_screen_ptr(EGA_plane23);
|
|
else
|
|
assert0(NO,"No planes enabled for chain mode");
|
|
}
|
|
else
|
|
set_screen_ptr(EGA_planes);
|
|
}
|
|
|
|
/* -----------------------------------------------------------------------
|
|
[5.2 LOCAL DEFINITIONS]
|
|
|
|
[5.2.1 INTERNAL DATA DEFINITIONS */
|
|
|
|
IMPORT DISPLAY_MODE choose_mode[];
|
|
|
|
/* [5.2.2 INTERNAL PROCEDURE DEFINITIONS] */
|
|
|
|
#ifdef GISP_SVGA
|
|
extern void mon_text_update();
|
|
#endif /* GISP_SVGA */
|
|
|
|
static void set_update_routine(mode)
|
|
DISPLAY_MODE mode;
|
|
{
|
|
static int last_height = 200;
|
|
|
|
if (last_height != get_screen_height()) {
|
|
last_height = get_screen_height();
|
|
}
|
|
note_display_state1("VGA set_update_routine(%s)", get_mode_string(mode) );
|
|
|
|
#if defined(NTVDM) && defined(MONITOR)
|
|
{
|
|
extern void mon_text_update(void);
|
|
|
|
switch (mode)
|
|
{
|
|
case EGA_TEXT_40_SP_WR:
|
|
case EGA_TEXT_80_SP_WR:
|
|
case CGA_TEXT_40_SP_WR:
|
|
case CGA_TEXT_80_SP_WR:
|
|
case EGA_TEXT_40_SP:
|
|
case EGA_TEXT_80_SP:
|
|
case CGA_TEXT_40_SP:
|
|
case CGA_TEXT_80_SP:
|
|
case EGA_TEXT_40_WR:
|
|
case EGA_TEXT_80_WR:
|
|
case EGA_TEXT_40:
|
|
case EGA_TEXT_80:
|
|
case CGA_TEXT_40_WR:
|
|
case CGA_TEXT_80_WR:
|
|
case CGA_TEXT_40:
|
|
case CGA_TEXT_80:
|
|
case TEXT_40_FUN:
|
|
case TEXT_80_FUN:
|
|
set_gfx_update_routines(mon_text_update, SIMPLE_MARKING,
|
|
TEXT_SCROLL);
|
|
return;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
#endif /* MONITOR */
|
|
/* NTVDM monitor: All text monitor cases dealt with. For frozen graphics */
|
|
/* now fall through to do decode to correct paint routines per mode */
|
|
|
|
switch (mode) {
|
|
case EGA_TEXT_40_SP_WR:
|
|
case EGA_TEXT_80_SP_WR:
|
|
case CGA_TEXT_40_SP_WR:
|
|
case CGA_TEXT_80_SP_WR:
|
|
assert0( is_it_text(), "In text memory mode, but not in alpha mode !!" );
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = TEXT;
|
|
set_gfx_update_routines( mon_text_update, SIMPLE_MARKING, NO_SCROLL );
|
|
#else /* GISP_SVGA */
|
|
set_gfx_update_routines( ega_wrap_split_text_update, SIMPLE_MARKING, NO_SCROLL );
|
|
#endif /* GISP_SVGA */
|
|
host_update_fonts();
|
|
break;
|
|
case EGA_TEXT_40_SP:
|
|
case EGA_TEXT_80_SP:
|
|
case CGA_TEXT_40_SP:
|
|
case CGA_TEXT_80_SP:
|
|
assert0( is_it_text(), "In text memory mode, but not in alpha mode !!" );
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = TEXT;
|
|
set_gfx_update_routines( mon_text_update, SIMPLE_MARKING, NO_SCROLL );
|
|
#else /* GISP_SVGA */
|
|
set_gfx_update_routines( ega_split_text_update, SIMPLE_MARKING, NO_SCROLL );
|
|
#endif /* GISP_SVGA */
|
|
host_update_fonts();
|
|
break;
|
|
case EGA_TEXT_40_WR:
|
|
case EGA_TEXT_80_WR:
|
|
assert0( is_it_text(), "In text memory mode, but not in alpha mode !!" );
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = TEXT;
|
|
set_gfx_update_routines( mon_text_update, SIMPLE_MARKING, NO_SCROLL );
|
|
#else /* GISP_SVGA */
|
|
set_gfx_update_routines( ega_wrap_text_update, SIMPLE_MARKING, NO_SCROLL );
|
|
#endif /* GISP_SVGA */
|
|
host_update_fonts();
|
|
break;
|
|
case EGA_TEXT_40:
|
|
case EGA_TEXT_80:
|
|
assert0( is_it_text(), "In text memory mode, but not in alpha mode !!" );
|
|
#if defined(NTVDM) && !defined(MONITOR) /* Only get here for NTVDM Riscs */
|
|
{
|
|
extern void jazz_text_update();
|
|
set_gfx_update_routines( jazz_text_update, SIMPLE_MARKING, TEXT_SCROLL );
|
|
}
|
|
#else
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = TEXT;
|
|
set_gfx_update_routines( mon_text_update, SIMPLE_MARKING, TEXT_SCROLL );
|
|
#else /* GISP_SVGA */
|
|
set_gfx_update_routines( ega_text_update, SIMPLE_MARKING, TEXT_SCROLL );
|
|
#endif /* GISP_SVGA */
|
|
host_update_fonts();
|
|
#endif /* NTVDM */
|
|
break;
|
|
case CGA_TEXT_40_WR:
|
|
case CGA_TEXT_80_WR:
|
|
assert0( is_it_text(), "In text memory mode, but not in alpha mode !!" );
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = TEXT;
|
|
#endif /* GISP_SVGA */
|
|
set_gfx_update_routines( ega_wrap_text_update, SIMPLE_MARKING, NO_SCROLL );
|
|
host_update_fonts();
|
|
break;
|
|
case CGA_TEXT_40:
|
|
case CGA_TEXT_80:
|
|
assert0( is_it_text(), "In text memory mode, but not in alpha mode !!" );
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = TEXT;
|
|
#endif /* GISP_SVGA */
|
|
assert1( get_screen_height() == 200, "screen height %d for text mode", get_screen_height() );
|
|
set_gfx_update_routines( text_update, SIMPLE_MARKING, TEXT_SCROLL );
|
|
host_update_fonts();
|
|
break;
|
|
case CGA_MED:
|
|
assert0( !is_it_text(), "In graphics memory mode, but not in graphics mode !!" );
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = GRAPH;
|
|
videoInfo.numPlanes = 2;
|
|
#endif /* GISP_SVGA */
|
|
set_gfx_update_routines( cga_med_graph_update, CGA_GRAPHICS_MARKING, CGA_GRAPH_SCROLL );
|
|
break;
|
|
case CGA_HI:
|
|
assert0( !is_it_text(), "In graphics memory mode, but not in graphics mode !!" );
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = GRAPH;
|
|
videoInfo.numPlanes = 4;
|
|
#endif /* GISP_SVGA */
|
|
set_gfx_update_routines( cga_hi_graph_update, CGA_GRAPHICS_MARKING, CGA_GRAPH_SCROLL );
|
|
break;
|
|
case EGA_HI_WR:
|
|
case EGA_MED_WR:
|
|
case EGA_LO_WR:
|
|
assert0( !is_it_text(), "In graphics memory mode, but not in graphics mode !!" );
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = GRAPH;
|
|
videoInfo.numPlanes = 4;
|
|
#endif /* GISP_SVGA */
|
|
set_gfx_update_routines( ega_wrap_graph_update, EGA_GRAPHICS_MARKING, NO_SCROLL );
|
|
break;
|
|
case EGA_HI:
|
|
case EGA_MED:
|
|
case EGA_LO:
|
|
assert0( !is_it_text(), "In graphics memory mode, but not in graphics mode !!" );
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = GRAPH;
|
|
videoInfo.numPlanes = 4;
|
|
#endif /* GISP_SVGA */
|
|
#ifdef GORE
|
|
if (get_256_colour_mode())
|
|
set_gfx_update_routines( process_object_list, EGA_GRAPHICS_MARKING, VGA_GRAPH_SCROLL );
|
|
else
|
|
set_gfx_update_routines( process_object_list, EGA_GRAPHICS_MARKING, EGA_GRAPH_SCROLL );
|
|
#else
|
|
if (get_256_colour_mode())
|
|
set_gfx_update_routines( vga_graph_update, EGA_GRAPHICS_MARKING, VGA_GRAPH_SCROLL );
|
|
else
|
|
set_gfx_update_routines( ega_graph_update, EGA_GRAPHICS_MARKING, EGA_GRAPH_SCROLL );
|
|
#endif /* GORE */
|
|
break;
|
|
case EGA_HI_SP_WR:
|
|
case EGA_MED_SP_WR:
|
|
case EGA_LO_SP_WR:
|
|
assert0( !is_it_text(), "In graphics memory mode, but not in graphics mode !!" );
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = GRAPH;
|
|
videoInfo.numPlanes = 4;
|
|
#endif /* GISP_SVGA */
|
|
set_gfx_update_routines( ega_wrap_split_graph_update, EGA_GRAPHICS_MARKING, NO_SCROLL );
|
|
break;
|
|
|
|
case EGA_HI_SP:
|
|
case EGA_MED_SP:
|
|
case EGA_LO_SP:
|
|
assert0( !is_it_text(), "In graphics memory mode, but not in graphics mode !!" );
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = GRAPH;
|
|
#endif /* GISP_SVGA */
|
|
if (get_256_colour_mode())
|
|
set_gfx_update_routines(vga_split_graph_update,
|
|
EGA_GRAPHICS_MARKING, NO_SCROLL);
|
|
else
|
|
set_gfx_update_routines(ega_split_graph_update,
|
|
EGA_GRAPHICS_MARKING, NO_SCROLL);
|
|
break;
|
|
|
|
case TEXT_40_FUN:
|
|
case TEXT_80_FUN:
|
|
assert1(NO,"Funny memory organisation selected %s", get_mode_string(mode) );
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = TEXT;
|
|
#endif /* GISP_SVGA */
|
|
do_display_trace("dumping EGA_GRAPH struct ...", dump_EGA_GRAPH());
|
|
set_gfx_update_routines( text_update, SIMPLE_MARKING, NO_SCROLL );
|
|
host_update_fonts();
|
|
break;
|
|
case CGA_HI_FUN:
|
|
assert1(NO,"Funny memory organisation selected %s", get_mode_string(mode) );
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = GRAPH;
|
|
#endif /* GISP_SVGA */
|
|
do_display_trace("dumping EGA_GRAPH struct ...", dump_EGA_GRAPH());
|
|
set_gfx_update_routines( cga_hi_graph_update, CGA_GRAPHICS_MARKING, NO_SCROLL );
|
|
break;
|
|
case CGA_MED_FUN:
|
|
assert1(NO,"Funny memory organisation selected %s", get_mode_string(mode) );
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = GRAPH;
|
|
videoInfo.numPlanes = 4;
|
|
#endif /* GISP_SVGA */
|
|
do_display_trace("dumping EGA_GRAPH struct ...", dump_EGA_GRAPH());
|
|
set_gfx_update_routines( cga_med_graph_update, CGA_GRAPHICS_MARKING, NO_SCROLL );
|
|
break;
|
|
case EGA_HI_FUN:
|
|
case EGA_MED_FUN:
|
|
case EGA_LO_FUN:
|
|
assert1(NO,"Funny memory organisation selected %s", get_mode_string(mode) );
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = GRAPH;
|
|
videoInfo.numPlanes = 4;
|
|
#endif /* GISP_SVGA */
|
|
do_display_trace("dumping EGA_GRAPH struct ...", dump_EGA_GRAPH());
|
|
#ifdef GORE
|
|
set_gfx_update_routines( process_object_list, EGA_GRAPHICS_MARKING, NO_SCROLL );
|
|
#else
|
|
set_gfx_update_routines( ega_graph_update, EGA_GRAPHICS_MARKING, NO_SCROLL );
|
|
#endif /* GORE */
|
|
break;
|
|
case DUMMY_FUN:
|
|
assert0(NO,"Using the dummy mode!!");
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = UNIMP;
|
|
#endif /* GISP_SVGA */
|
|
set_gfx_update_routines( dummy_calc, SIMPLE_MARKING, NO_SCROLL );
|
|
break;
|
|
default:
|
|
assert1(NO,"Bad display mode %d", (int) mode );
|
|
#ifdef GISP_SVGA
|
|
videoInfo.modeType = UNIMP;
|
|
#endif /* GISP_SVGA */
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
7.INTERMODULE INTERFACE IMPLEMENTATION :
|
|
|
|
[7.1 INTERMODULE DATA DEFINITIONS] */
|
|
|
|
/*
|
|
[7.2 INTERMODULE PROCEDURE DEFINITIONS] */
|
|
|
|
|
|
|
|
boolean choose_vga_display_mode()
|
|
{
|
|
DISPLAY_MODE mode;
|
|
|
|
note_entrance0("choose vga display mode");
|
|
|
|
/*
|
|
* offset_per_line depends upon whether chained addressing is being
|
|
* used. This is because we interleave the planes, rather than
|
|
* anything the EGA does.
|
|
*/
|
|
|
|
if( get_chain4_mode() )
|
|
{
|
|
set_offset_per_line_recal(get_actual_offset_per_line() << 2);
|
|
}
|
|
else
|
|
if( get_memory_chained() )
|
|
{
|
|
set_offset_per_line_recal(get_actual_offset_per_line() << 1);
|
|
}
|
|
else
|
|
{
|
|
set_offset_per_line_recal(get_actual_offset_per_line());
|
|
}
|
|
|
|
/*
|
|
* It is possible that the display hardware will wrap the plane addressing. This occurs
|
|
* when the screen_start plus the screen_length are longer than the plane length.
|
|
* When in chained mode there is two planes length before wrapping occurs.
|
|
* When in chain 4 mode there is 4 planes length before wrapping occurs.
|
|
*
|
|
* V7VGA: No wrapping can occur with either of the sequential chain variants.
|
|
*/
|
|
|
|
#ifdef V7VGA
|
|
if( !( get_seq_chain4_mode() || get_seq_chain_mode() ))
|
|
#endif /* V7VGA */
|
|
if (get_chain4_mode() )
|
|
{
|
|
set_screen_can_wrap( (get_screen_start()<<2)
|
|
+ get_screen_length() > 4*EGA_PLANE_DISP_SIZE );
|
|
}
|
|
else
|
|
if ( get_memory_chained() )
|
|
{
|
|
set_screen_can_wrap( (get_screen_start()<<1)
|
|
+ get_screen_length() > 2*EGA_PLANE_DISP_SIZE );
|
|
}
|
|
else
|
|
{
|
|
set_screen_can_wrap( get_screen_start()
|
|
+ get_screen_length() > EGA_PLANE_DISP_SIZE );
|
|
}
|
|
|
|
/*
|
|
* split screen comes into operation when screen_split is less than screen height
|
|
* split screen used is used as part of munge_index.
|
|
*/
|
|
|
|
set_split_screen_used( get_screen_split() < get_screen_height() );
|
|
|
|
/*
|
|
* For the purposes of choosing a mode set up boolean values for chars per line (to help
|
|
* select the correct text mode), and screen height (to select EGA resolution).
|
|
*/
|
|
|
|
set_200_scan_lines( (get_screen_height()/get_pc_pix_height()) == 200 );
|
|
|
|
/*
|
|
* Set up the appropriate update routine according to the memory organisation selected
|
|
* and return an indication of whether more than 1 plane can be used by the display.
|
|
*
|
|
* Note that in chained mode plane01 is considered to be one plane. Similarly for plane23
|
|
*
|
|
* We have to be careful that a nasty program, such as EGA-PICS, hasn't set up a ridiculously big
|
|
* screen size for the CGA modes (presumably caused by us being unlucky when the timer tick goes off).
|
|
*/
|
|
if(is_it_cga() && get_screen_length() > 0x4000)
|
|
#ifdef V7VGA
|
|
/* For the 2 & 4 colour modes 63h & 64h */
|
|
mode = EGA_HI;
|
|
#else
|
|
mode = DUMMY_FUN;
|
|
#endif /* V7VGA */
|
|
else
|
|
mode = choose_mode[get_munged_index()];
|
|
|
|
/*
|
|
* Now set up screen pointers appropriately.
|
|
*/
|
|
|
|
set_up_screen_ptr();
|
|
|
|
set_update_routine(mode);
|
|
|
|
/*
|
|
* set up the paint routine to correspond with the memory organisation and the update routine
|
|
* (this bit is host specific)
|
|
*/
|
|
|
|
host_set_paint_routine(mode,get_screen_height());
|
|
|
|
/*
|
|
* The screen needs refreshing, because the update and paint routines have changed.
|
|
* Indicate to the update routines that the next time they are called, they must update
|
|
* the whole screen
|
|
*/
|
|
|
|
screen_refresh_required();
|
|
return TRUE;
|
|
}
|
|
|
|
#endif /* EGG */
|
|
#endif /* REAL_VGA */
|