⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdl_xbios.c

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
    SDL - Simple DirectMedia Layer
    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public
    License along with this library; if not, write to the Free
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

    Sam Lantinga
    slouken@libsdl.org
*/

#ifdef SAVE_RCSID
static char rcsid =
 "@(#) $Id: SDL_xbios.c,v 1.1 2002/04/22 21:38:06 wmay Exp $";
#endif

/*
 * Xbios SDL video driver
 * 
 * Patrice Mandin
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>

/* Mint includes */
#include <sys/cookie.h>
#include <mint/osbind.h>
#include <mint/falcon.h>

#include "SDL.h"
#include "SDL_error.h"
#include "SDL_video.h"
#include "SDL_mouse.h"
#include "SDL_sysvideo.h"
#include "SDL_pixels_c.h"
#include "SDL_events_c.h"

#include "SDL_ataric2p_s.h"
#include "SDL_ataric2p060_c.h"
#include "SDL_atarievents_c.h"
#include "SDL_atarimxalloc_c.h"
#include "SDL_xbios.h"

#define XBIOS_VID_DRIVER_NAME "xbios"

/* Initialization/Query functions */
static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat);
static SDL_Rect **XBIOS_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags);
static SDL_Surface *XBIOS_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
static int XBIOS_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);
static void XBIOS_VideoQuit(_THIS);

/* Hardware surface functions */
static int XBIOS_AllocHWSurface(_THIS, SDL_Surface *surface);
static int XBIOS_LockHWSurface(_THIS, SDL_Surface *surface);
static int XBIOS_FlipHWSurface(_THIS, SDL_Surface *surface);
static void XBIOS_UnlockHWSurface(_THIS, SDL_Surface *surface);
static void XBIOS_FreeHWSurface(_THIS, SDL_Surface *surface);
static void XBIOS_UpdateRects(_THIS, int numrects, SDL_Rect *rects);

/* List of video modes */

/* ST modes */
static int xbiosnummodes_st=1;
static xbiosmode_t xbiosmodelist_st[]={
	{ST_LOW>>8,320,200,4,SDL_FALSE}
};

/* TT modes */
static int xbiosnummodes_tt=2;
static xbiosmode_t xbiosmodelist_tt[]={
	{TT_LOW,320,480,8,SDL_FALSE},
	{TT_LOW,320,240,8,SDL_TRUE}	/* Software double-lined mode */
};

/* Falcon RVB modes */
static int xbiosnummodes_f30rvb=16;
static xbiosmode_t xbiosmodelist_f30rvb[]={
	{BPS16|COL80|OVERSCAN|VERTFLAG,768,480,16,SDL_FALSE},
	{BPS16|COL80|OVERSCAN,768,240,16,SDL_FALSE},
	{BPS16|COL80|VERTFLAG,640,400,16,SDL_FALSE},
	{BPS16|COL80,640,200,16,SDL_FALSE},
	{BPS16|OVERSCAN|VERTFLAG,384,480,16,SDL_FALSE},
	{BPS16|OVERSCAN,384,240,16,SDL_FALSE},
	{BPS16|VERTFLAG,320,400,16,SDL_FALSE},
	{BPS16,320,200,16,SDL_FALSE},

	{BPS8|COL80|OVERSCAN|VERTFLAG,768,480,8,SDL_FALSE},
	{BPS8|COL80|OVERSCAN,768,240,8,SDL_FALSE},
	{BPS8|COL80|VERTFLAG,640,400,8,SDL_FALSE},
	{BPS8|COL80,640,200,8,SDL_FALSE},
	{BPS8|OVERSCAN|VERTFLAG,384,480,8,SDL_FALSE},
	{BPS8|OVERSCAN,384,240,8,SDL_FALSE},
	{BPS8|VERTFLAG,320,400,8,SDL_FALSE},
	{BPS8,320,200,8,SDL_FALSE}
};

/* Falcon VGA modes */
static int xbiosnummodes_f30vga=6;
static xbiosmode_t xbiosmodelist_f30vga[]={
	{BPS16,320,480,16,SDL_FALSE},
	{BPS16|VERTFLAG,320,240,16,SDL_FALSE},

	{BPS8|COL80,640,480,8,SDL_FALSE},	
	{BPS8|COL80|VERTFLAG,640,240,8,SDL_FALSE},
	{BPS8,320,480,8,SDL_FALSE},
	{BPS8|VERTFLAG,320,240,8,SDL_FALSE}
};

/* To setup palette */

static unsigned short	TT_palette[256];
static unsigned long	F30_palette[256];

/* Xbios driver bootstrap functions */

static int XBIOS_Available(void)
{
	const char *envr = getenv("SDL_VIDEODRIVER");
	unsigned long cookie_vdo;

	/* Check if user asked a different video driver */
	if ((envr) && (strcmp(envr, XBIOS_VID_DRIVER_NAME)!=0)) {
		return 0;
	}

	/* Cookie _VDO present ? if not, assume ST machine */
	if (Getcookie(C__VDO, &cookie_vdo) != C_FOUND) {
		cookie_vdo = VDO_ST << 16;
	}

	/* Test if we have a monochrome monitor plugged in */
	switch( cookie_vdo >>16) {
		case VDO_ST:
		case VDO_STE:
			if ( Getrez() == (ST_HIGH>>8) )
				return 0;
			break;
		case VDO_TT:
			if ( (EgetShift() & ES_MODE) == TT_HIGH)
				return 0;
			break;
		case VDO_F30:
			if ( Montype() == MONITOR_MONO)
				return 0;
			break;
		default:
			return 0;
	}

	return 1;
}

static void XBIOS_DeleteDevice(SDL_VideoDevice *device)
{
	free(device->hidden);
	free(device);
}

static SDL_VideoDevice *XBIOS_CreateDevice(int devindex)
{
	SDL_VideoDevice *device;

	/* Initialize all variables that we clean on shutdown */
	device = (SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice));
	if ( device ) {
		memset(device, 0, (sizeof *device));
		device->hidden = (struct SDL_PrivateVideoData *)
				malloc((sizeof *device->hidden));
	}
	if ( (device == NULL) || (device->hidden == NULL) ) {
		SDL_OutOfMemory();
		if ( device ) {
			free(device);
		}
		return(0);
	}
	memset(device->hidden, 0, (sizeof *device->hidden));

	atari_test_cpu060_present();

	/* Video functions */
	device->VideoInit = XBIOS_VideoInit;
	device->ListModes = XBIOS_ListModes;
	device->SetVideoMode = XBIOS_SetVideoMode;
	device->SetColors = XBIOS_SetColors;
	device->UpdateRects = NULL;
	device->VideoQuit = XBIOS_VideoQuit;
	device->AllocHWSurface = XBIOS_AllocHWSurface;
	device->LockHWSurface = XBIOS_LockHWSurface;
	device->UnlockHWSurface = XBIOS_UnlockHWSurface;
	device->FlipHWSurface = XBIOS_FlipHWSurface;
	device->FreeHWSurface = XBIOS_FreeHWSurface;

	/* Events */
	device->InitOSKeymap = Atari_InitOSKeymap;
	device->PumpEvents = Atari_PumpEvents;

	device->free = XBIOS_DeleteDevice;

	return device;
}

VideoBootStrap XBIOS_bootstrap = {
	XBIOS_VID_DRIVER_NAME, "Atari Xbios driver",
	XBIOS_Available, XBIOS_CreateDevice
};

static int XBIOS_VideoInit(_THIS, SDL_PixelFormat *vformat)
{
	int i,j8,j16;
	xbiosmode_t *current_mode;

	/* Initialize all variables that we clean on shutdown */
	memset (SDL_modelist, 0, sizeof(SDL_modelist));

	/* Cookie _VDO present ? if not, assume ST machine */
	if (Getcookie(C__VDO, &XBIOS_cvdo) != C_FOUND) {
		XBIOS_cvdo = VDO_ST << 16;
	}

	/* Allocate memory for old palette */
	XBIOS_oldpalette = (void *)malloc(256*sizeof(long));
	if ( !XBIOS_oldpalette ) {
		SDL_SetError("Unable to allocate memory for old palette\n");
		return(-1);
	}

	/* Initialize video mode list */
	/* and save current screen status (palette, screen address, video mode) */

	switch (XBIOS_cvdo >>16) {
		case VDO_ST:
		case VDO_STE:
			{
				short *oldpalette;

				XBIOS_nummodes=xbiosnummodes_st;
				XBIOS_modelist=xbiosmodelist_st;
			
				XBIOS_oldvbase=Physbase();
				XBIOS_oldvmode=Getrez();
				switch(XBIOS_oldvmode << 8) {
					case ST_LOW:
						XBIOS_oldnumcol=16;
						break;
					case ST_MED:
						XBIOS_oldnumcol=4;
						break;
					case ST_HIGH:
						XBIOS_oldnumcol=2;
						break;
					default:
						XBIOS_oldnumcol=0;
						break;
				}

				oldpalette= (short *) XBIOS_oldpalette;
				for (i=0;i<XBIOS_oldnumcol;i++) {
					*oldpalette++=Setcolor(i,-1);
				}

				vformat->BitsPerPixel = 8;
			}
			break;
		case VDO_TT:
			XBIOS_nummodes=xbiosnummodes_tt;
			XBIOS_modelist=xbiosmodelist_tt;

			XBIOS_oldvbase=Logbase();
			XBIOS_oldvmode=EgetShift();

			switch(XBIOS_oldvmode & ES_MODE) {
				case TT_LOW:
					XBIOS_oldnumcol=256;
					break;
				case ST_LOW:
				case TT_MED:
					XBIOS_oldnumcol=16;
					break;
				case ST_MED:
					XBIOS_oldnumcol=4;
					break;
				case ST_HIGH:
				case TT_HIGH:
					XBIOS_oldnumcol=2;
					break;
				default:
					XBIOS_oldnumcol=0;
					break;
			}
			if (XBIOS_oldnumcol) {
				EgetPalette(0, XBIOS_oldnumcol, XBIOS_oldpalette);
			}

			vformat->BitsPerPixel = 8;
			break;
		case VDO_F30:
			switch (Montype())
			{
				case MONITOR_MONO:
					/* Not usable */
					break;
				case MONITOR_RGB:
				case MONITOR_TV:
					XBIOS_nummodes = xbiosnummodes_f30rvb;
					XBIOS_modelist = xbiosmodelist_f30rvb;
					break;
				case MONITOR_VGA:
					XBIOS_nummodes = xbiosnummodes_f30vga;
					XBIOS_modelist = xbiosmodelist_f30vga;
					break;
			}
			XBIOS_oldvbase=Logbase();
			XBIOS_oldvmode=Vsetmode(-1);

			XBIOS_oldnumcol= 1<< (1 << (XBIOS_oldvmode & NUMCOLS));
			if (XBIOS_oldnumcol > 256) {
				XBIOS_oldnumcol = 0;
			}
			if (XBIOS_oldnumcol) {
				VgetRGB(0, XBIOS_oldnumcol, XBIOS_oldpalette);
			}

			vformat->BitsPerPixel = 16;

			/* Keep vga/rvb, and pal/ntsc bits */
			current_mode = XBIOS_modelist;
			for (i=0;i<XBIOS_nummodes;i++) {
				Uint16 newvmode;			

				newvmode = current_mode->number;
				newvmode &= ~(VGA|PAL);
				newvmode |= XBIOS_oldvmode & (VGA|PAL);
				current_mode->number = newvmode;
				
				current_mode++;
			}

			break;
	}
	
	current_mode = XBIOS_modelist;
	j8 = j16 = 0;
	for (i=0;i<XBIOS_nummodes;i++) {
		switch (current_mode->depth) {
			case 4:
			case 8:
				SDL_modelist[0][j8] = malloc(sizeof(SDL_Rect));
				SDL_modelist[0][j8]->x = SDL_modelist[0][j8]->y = 0;
				SDL_modelist[0][j8]->w = current_mode->width;
				SDL_modelist[0][j8]->h = current_mode->height;
				XBIOS_videomodes[0][j8]=current_mode;
				current_mode++;
				j8++;
				break;
			case 16:
				SDL_modelist[1][j16] = malloc(sizeof(SDL_Rect));
				SDL_modelist[1][j16]->x = SDL_modelist[1][j16]->y = 0;
				SDL_modelist[1][j16]->w = current_mode->width;
				SDL_modelist[1][j16]->h = current_mode->height;
				XBIOS_videomodes[1][j16]=current_mode;
				current_mode++;
				j16++;
				break;
		}		
	}
	SDL_modelist[0][j8] = NULL;
	SDL_modelist[1][j16] = NULL;

	XBIOS_screens[0]=NULL;
	XBIOS_screens[1]=NULL;
	XBIOS_shadowscreen=NULL;

	/* Update hardware info */
	this->info.hw_available = 1;
	this->info.video_mem = (Uint32) Atari_SysMalloc(-1L, MX_STRAM);

	/* Init chunky to planar routine */
	Atari_C2pInit = Atari_C2pInit8;
	if (atari_cpu060_avail) {
		Atari_C2pConvert = Atari_C2pConvert8_060;
	} else {
		Atari_C2pConvert = Atari_C2pConvert8;
	}
	Atari_C2pInit();

	/* We're done! */
	return(0);
}

static SDL_Rect **XBIOS_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -