brender-v1.3.2/drivers/mcga/device.c
2022-05-03 13:10:51 -07:00

160 lines
4.5 KiB
C

/*
* Copyright (c) 1993-1995 Argonaut Technologies Limited. All rights reserved.
*
* $Id: device.c 1.1 1997/12/10 16:45:34 jon Exp $
* $Locker: $
*
* Device methods
*/
#include <stddef.h>
#include <string.h>
#include "drv.h"
#include "shortcut.h"
#include "brassert.h"
BR_RCS_ID("$Id: device.c 1.1 1997/12/10 16:45:34 jon Exp $");
#define DEVICE_VERSION BR_VERSION(1,0,0)
/*
* Default dispatch table for device (defined at end of file)
*/
static const struct br_device_dispatch deviceDispatch;
/*
* Device info. template
*/
static const char deviceTitle[] = "ATL MCGA v1.0";
static const char deviceCreator[] = "Argonaut Technologies Ltd.";
static const char deviceProduct[] = "VGA MCGA";
#define _F(f) offsetof(br_device, f)
#define _A(f) ((br_int_32)(f))
static const struct br_tv_template_entry deviceTemplateEntries[] = {
{BRT_IDENTIFIER_CSTR, 0, _F(identifier), BRTV_QUERY | BRTV_ALL, BRTV_CONV_COPY, },
{BRT_CLUT_O, 0, _F(clut), BRTV_QUERY | BRTV_ALL, BRTV_CONV_COPY, },
{BRT_VERSION_U32, 0, 0, BRTV_QUERY | BRTV_ALL, BRTV_CONV_DIRECT, DEVICE_VERSION},
{BRT_BRENDER_VERSION_U32, 0, 0, BRTV_QUERY | BRTV_ALL, BRTV_CONV_DIRECT, __BRENDER__},
{BRT_DDI_VERSION_U32, 0, 0, BRTV_QUERY | BRTV_ALL, BRTV_CONV_DIRECT, __BRENDER_DDI__},
{BRT_CREATOR_CSTR, 0, _A(deviceCreator), BRTV_QUERY | BRTV_ALL | BRTV_ABS, BRTV_CONV_COPY, },
{BRT_TITLE_CSTR, 0, _A(deviceTitle), BRTV_QUERY | BRTV_ALL | BRTV_ABS, BRTV_CONV_COPY, },
{BRT_PRODUCT_CSTR, 0, _A(deviceProduct), BRTV_QUERY | BRTV_ALL | BRTV_ABS, BRTV_CONV_COPY, },
};
#undef _A
#undef _F
/*
* Set up a static device object
*/
br_device * DeviceVGAAllocate(char *identifier)
{
br_device *self;
/*
* Set up device block and resource anchor
*/
self = BrResAllocate(NULL, sizeof(*self), BR_MEMORY_OBJECT_DATA);
self->res = BrResAllocate(self, 0, BR_MEMORY_DRIVER);
self->identifier = identifier;
self->dispatch = &deviceDispatch;
self->device = self;
/*
* _DEV_ Remember initial VGA mode
*/
self->original_mode = BIOSVideoGetMode();
self->current_mode = self->original_mode;
self->object_list = BrObjectListAllocate(self->res);
/*
* Build CLUT object
*/
self->clut = DeviceClutVGAAllocate(self, "Hardware-CLUT");
return self;
}
static void BR_CMETHOD_DECL(br_device_vga, free)(br_device *self)
{
/*
* Remove attached objects
*/
BrObjectContainerFree((br_object_container *)self, BR_NULL_TOKEN, NULL, NULL);
/*
* Throw away attached resources
*/
BrResFreeNoCallback(self);
}
static br_token BR_CMETHOD_DECL(br_device_vga, type)(br_device *self)
{
return BRT_DEVICE;
}
static br_boolean BR_CMETHOD_DECL(br_device_vga, isType)(br_device *self, br_token t)
{
return (t == BRT_DEVICE) || (t == BRT_OBJECT_CONTAINER) || (t == BRT_OBJECT);
}
static br_int_32 BR_CMETHOD_DECL(br_device_vga, space)(br_device *self)
{
return sizeof(br_device);
}
static struct br_tv_template * BR_CMETHOD_DECL(br_device_vga,templateQuery)
(br_device *self)
{
if(self->templates.deviceTemplate == NULL)
self->templates.deviceTemplate = BrTVTemplateAllocate(self,
deviceTemplateEntries,
BR_ASIZE(deviceTemplateEntries));
return self->templates.deviceTemplate;
}
static void * BR_CMETHOD_DECL(br_device_vga,listQuery)(br_device *self)
{
return self->object_list;
}
/*
* Default dispatch table for device
*/
static const struct br_device_dispatch deviceDispatch = {
NULL,
NULL,
NULL,
NULL,
BR_CMETHOD_REF(br_device_vga, free),
BR_CMETHOD_REF(br_object_vga, identifier),
BR_CMETHOD_REF(br_device_vga, type),
BR_CMETHOD_REF(br_device_vga, isType),
BR_CMETHOD_REF(br_object_vga, device),
BR_CMETHOD_REF(br_device_vga, space),
BR_CMETHOD_REF(br_device_vga, templateQuery),
BR_CMETHOD_REF(br_object, query),
BR_CMETHOD_REF(br_object, queryBuffer),
BR_CMETHOD_REF(br_object, queryMany),
BR_CMETHOD_REF(br_object, queryManySize),
BR_CMETHOD_REF(br_object, queryAll),
BR_CMETHOD_REF(br_object, queryAllSize),
BR_CMETHOD_REF(br_device_vga, listQuery),
BR_CMETHOD_REF(br_object_container, tokensMatchBegin),
BR_CMETHOD_REF(br_object_container, tokensMatch),
BR_CMETHOD_REF(br_object_container, tokensMatchEnd),
BR_CMETHOD_REF(br_object_container, addFront),
BR_CMETHOD_REF(br_object_container, removeFront),
BR_CMETHOD_REF(br_object_container, remove),
BR_CMETHOD_REF(br_object_container, find),
BR_CMETHOD_REF(br_object_container, findMany),
BR_CMETHOD_REF(br_object_container, count),
};