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

📄 scr_bios.c

📁 神龙卡开发原代码
💻 C
字号:
/* * Copyright (c) 1999, 2000 Greg Haerr <greg@censoft.com> * * EGA/VGA 16 color 4 planes Screen Driver, direct hardware or bios * 	If HWINIT 1 is #defined, the file vgainit.c is * 	used to provide non-bios direct hw initialization of the VGA * 	chipset.  Otherwise, this driver uses int10 bios to  * 	set/reset graphics/text modes. * * 	If ROMFONT is #defined, the file romfont.c is used to * 	draw all fonts, afte the bios is called to * 	get the address of the ROM character font which * 	is used for the character bitmaps.  Otherwise, the * 	file genfont.c is used to draw linked in fonts, without * 	consulting the bios. * * 	All other access to the hardware is controlled through this driver. * * 	Blitting enabled with #define HAVEBLIT in vgaplan4.h * * 	This driver links with one of two other files, vgaplan4.c, * 	the portable VGA 4 planes 16 color driver, or asmplan4.s, which * 	is 8086 assembly language for speed.  This file itself * 	doesn't know about any planar or packed arrangement, relying soley * 	on the following external routines for all graphics drawing: * 		ega_init, ega_drawpixel, ega_readpixel, * 		ega_drawhorzline, ega_drawvertline * * 	All text/font drawing code is based on the above routines and * 	the included entry points for getting the ROM bitmap data. * * 	If the environment variable EGAMODE is set, the driver implements *	the EGA 640x350 (mode 10h) resolution, otherwise 640x480 (mode 12h) *	graphics mode is set. * *	The environment variable CHARHEIGHT if set will set the assumed rom *	font character height, which defaults to 14. * */#if _MINIX#include <fcntl.h>#include <unistd.h>#include <string.h>#include <ibm/int86.h>#include <sys/ioctl.h>#define HWINIT		0	/* =1 for non-bios direct hardware init*/#define ROMFONT		0	/* =0 no bios rom fonts available*/#else#ifdef __rtems__#define HWINIT		1	/* =1 for non-bios direct hardware init*/#define ROMFONT		0	/* =0 no bios rom fonts available*/#else#define HWINIT		0	/* =1 for non-bios direct hardware init*/#define ROMFONT		1	/* =1 uses PC rom fonts */#endif#endif#if ELKS#include <linuxmt/ntty.h>#endif#include <stdio.h>#include <stdlib.h>#include "device.h"#include "vgaplan4.h"#if ROMFONT#include "romfont.h"#else#include "genfont.h"#endif#include "genmem.h"#include "fb.h"/* VGA driver entry points*/static PSD  VGA_open(PSD psd);static void VGA_close(PSD psd);#if _MINIXstatic void VGA_getscreeninfo(PSD psd,PMWSCREENINFO psi);#elsestatic void VGA_getscreeninfo(PSD psd,PMWSCREENINFO psi);;#endifstatic void VGA_setpalette(PSD psd,int first,int count,MWPALENTRY *pal);static MWBOOL VGA_mapmemgc(PSD mempsd,MWCOORD w,MWCOORD h,int planes,int bpp,		int linelen,int size,void *addr);static void NULL_blit(PSD dstpsd, MWCOORD dstx, MWCOORD dsty, MWCOORD w,		MWCOORD h, PSD srcpsd, MWCOORD srcx, MWCOORD srcy, long op) {}static PSD  NULL_allocatememgc(PSD psd) { return NULL; }static MWBOOL NULL_mapmemgc(PSD mempsd,MWCOORD w,MWCOORD h,int planes,int bpp,			int linelen,int size,void *addr) { return 0; }static void NULL_freememgc(PSD mempsd) {}SCREENDEVICE	scrdev = {	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL,	VGA_open,	VGA_close,	VGA_getscreeninfo,	VGA_setpalette,	ega_drawpixel,	ega_readpixel,	ega_drawhorzline,	ega_drawvertline,	gen_fillrect,#if ROMFONT	pcrom_fonts,#else	gen_fonts,#endif#if HAVEBLIT	ega_blit,		/* Blit*/#else	NULL_blit,		/* Blit*/#endif	NULL,			/* PreSelect*/	NULL,			/* DrawArea*/	NULL,			/* SetIOPermissions*/	gen_allocatememgc,	VGA_mapmemgc,	gen_freememgc};/* operating mode*/static MWBOOL VGAMODE = TRUE;	/* ega or vga screen rows*//* int10 functions*/#define FNGR640x480	0x0012	/* function for graphics mode 640x480x16*/#define FNGR640x350	0x0010	/* function for graphics mode 640x350x16*/#define FNTEXT		0x0003	/* function for 80x25 text mode*/#if _MINIXFARADDR int10(int mode, int z){int fd;struct mio_int86 mint86;   fd = open("/dev/mem", O_RDONLY);   memset(&mint86, 0, sizeof(mint86));   ioctl(fd, MIOCINT86, &mint86);   mint86.reg86.b.intno = 0x10;   mint86.reg86.b.al = mode & 0xFF;   ioctl(fd, MIOCINT86, &mint86);   close(fd);}#endifstatic PSDVGA_open(PSD psd){#if _MINIXint s;struct mio_ldt86 mldt86;struct segdesc_s {              /* segment descriptor for protected mode */	u16_t limit_low;	u16_t base_low;	u8_t base_middle;	u8_t access;                  /* |P|DL|1|X|E|R|A| */	u8_t granularity;             /* |G|X|0|A|LIMT| */	u8_t base_high;} *dp;int fd;unsigned long vidmem = 0xA0000;	fd = open("/dev/mem", O_RDONLY);	dp = (struct segdesc_s *) mldt86.entry;	mldt86.idx = 1;	s = ioctl(fd, MIOCGLDT86, &mldt86);	dp->limit_low    = 0xFFFF;	dp->base_low     = (vidmem >>  0) & 0xFFFF;	dp->base_middle  = (vidmem >> 16) & 0xFF;	dp->base_high    = (vidmem >> 24) & 0xFF;	dp->granularity |= 0x80;	mldt86.idx = 2;	s = ioctl(fd, MIOCSLDT86, &mldt86);	close(fd);#endif	/* setup operating mode from environment variable*/	if(getenv("EGAMODE"))		VGAMODE = FALSE;	else VGAMODE = TRUE;#if ELKS	/* disallow console switching while in graphics mode*/	if(ioctl(0, DCGET_GRAPH) != 0)		return NULL;#endif#if HWINIT	/* enter graphics mode*/	ega_hwinit();#else	/* init bios graphics mode*/	int10(VGAMODE? FNGR640x480: FNGR640x350, 0);#endif	/* init driver variables depending on ega/vga mode*/	psd->xres = psd->xvirtres = 640;	psd->yres = psd->yvirtres = VGAMODE? 480: 350;	psd->planes = 4;	psd->bpp = 4;	psd->ncolors = 16;	psd->pixtype = MWPF_PALETTE;#if HAVEBLIT	psd->flags = PSF_SCREEN | PSF_HAVEBLIT;#else	psd->flags = PSF_SCREEN;#endif	/* init planes driver (sets psd->addr and psd->linelen)*/	ega_init(psd);#if ROMFONT	/* init pc rom font routines*/	pcrom_init(psd);#endif#if 0	ROM_CHAR_HEIGHT = VGAMODE? 16: 14;#endif	/* FIXME: add palette code*/	return psd;}static voidVGA_close(PSD psd){#if ELKS	/* allow console switching again*/	ioctl(0, DCREL_GRAPH);#endif#if HWINIT	ega_hwterm();#else	/* init bios 80x25 text mode*/	int10(FNTEXT, 0);#endif}static voidVGA_getscreeninfo(PSD psd,PMWSCREENINFO psi){	psi->rows = psd->yvirtres;	psi->cols = psd->xvirtres;	psi->planes = psd->planes;	psi->bpp = psd->bpp;	psi->ncolors = psd->ncolors;	psi->pixtype = psd->pixtype;	psi->fonts = NUMBER_FONTS;	if(VGAMODE) {		/* VGA 640x480*/		psi->xdpcm = 27;	/* assumes screen width of 24 cm*/		psi->ydpcm = 27;	/* assumes screen height of 18 cm*/	} else {		/* EGA 640x350*/		psi->xdpcm = 27;	/* assumes screen width of 24 cm*/		psi->ydpcm = 19;	/* assumes screen height of 18 cm*/	}#if ETA4000	/* SVGA 800x600*/	psi->xdpcm = 33;		/* assumes screen width of 24 cm*/	psi->ydpcm = 33;		/* assumes screen height of 18 cm*/#endif}static voidVGA_setpalette(PSD psd,int first,int count,MWPALENTRY *pal){	/* not yet implemented, std 16 color palette assumed*/}#if HAVEBLIT/* initialize memory device with passed parms, and select suitable fb driver*/static MWBOOLVGA_mapmemgc(PSD mempsd,MWCOORD w,MWCOORD h,int planes,int bpp,int linelen,	int size,void *addr){	extern SUBDRIVER memplan4;	/* initialize mem screen driver*/	initmemgc(mempsd, w, h, planes, bpp, linelen, size, addr);	/* set and initialize subdriver into mem screen driver*/	if (!set_subdriver(mempsd, &memplan4, TRUE))		return 0;	return 1;}#endif

⌨️ 快捷键说明

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