Patching svgalib

Contents

0. Introduction
1. Indenting
2. Structure of the chipset drivers

0. Introduction

	Here is some info on writing patches and/or adding support for
	further chipsets. The info on the chipset drivers is outdated, but
	better than nothing and get you started. 

	As a side note, other than a.out, ELF does not allow to have some
	symbols global to svgalib which are not accessible to user
	programs.

	Because of that, if possible all the symbols and functions in your
	program should be static. Those which can not be static should
	have a name like: "__svgalib_*" to mark them as internals s.t.
	people using them get what they deserve. Please do only add a new
	function to the user interface if it is really unavoidable. Better
	add some new parameters to an existing function. 

	Adding a new function would definitly result in loosing a.out
	compatibility thus removing the chance to use new cards and such
	with old a.out binaries where the source is not available (doom
	comes to mind). 

	A new function should be really important to outweigh this draw
	back. 

1. Indenting

	Due to some request (and I heard it b4) all the sources were now
	automatically indentified. 

	There were some requests for indent -gnu but it looks painful. I
	opted for -kr (there were requests for it as well) as it is not
	only nicer but also what is done in the linux-kernel and this is
	certainly a program only usable for linux. 

	I dunno if emacs is confused by -kr, but to be honest this is a
	big all-in-one egg-giving-wool-milk-sow (as we say in german), and
	you won't tell me that this several megs beast is unable to edit
	this and I can't use -kr due to some restrictions of emacs. That
	would be really ridiculous. If it is the case just make emacs
	better. 

	The OneModeEntry macro is eaten by indent (I would say it is an
	indent bug, I might send a bug report to them), please ensure (if
	at all possible) that your code can be passed through indent (use
	the INDENT-OFF comments as shown in some sources for
	OneModeEntry). 

	You can use `make indent-gnu' (if you have a recent enough (I use
	1.9.1) indent) to switch to your favorite style. But please ensure
	your patches fit into this now declared as "official style"
	sources. (Use `make indent' to reformat). 

	Do not use it too often though as most indent's tend to add empty
	lines at certain places in the source. 

2. Structure of the chipset drivers

	The chipset specific registers saving function (saveregs) is only
	used directly to save the textmode registers at initialization. 

	The chipset specific registers restoring function (setregs) is only
	used directly to return to textmode, and when setting a VGA mode
	after an SVGA mode.

	The registers for each mode are stored like the ET4000 modes in
	VGAlib 1.2, i.e. the extended registers at the end. The following
	functions must be provided in a driver:

	saveregs( unsigned char regs[] )
		Saves the chipset-specific registers in regs, starting at
		array index EXT (after the VGA registers).

	setregs( unsigned char regs[] )
		Sets the chipset-specific registers stored in regs from
		index EXT.

	modeavailable( int mode )
		Returns nonzero if mode is available (should check video
		memory).

	getmodeinfo( vga_modeinfo *modeinfo )
		Fills in chipset specific field of mode information
		structure: maxlogicalwidth, startaddressrange (mask of
		significant bits), and maxpixels (video memory divided by
		the number of bytes per pixel). haveblit indicates whether
		bitblt functions are available.
		Note: providing extended info and an aperture with size
		>= memory and setting bits 4 and 6 in flags will
		automatically enable linear addressing support. 
		

	setmode( int mode, int previous_mode )
		Sets all registers for a mode; returns nonzero if mode not
		available. __vga_setregs can be called to set the VGA
		registers.

	unlock()
		Unlocks chipset-specific registers.

	lock()
		Lock (protect) chipset-specific registers. Currently not
		called.

	test()
		Identify chipset; initialize (check memory and type) and
		return nonzero if detected.

	setpage( int page )
		Set 64K page number to be mapped at 0xa0000.

	init( int force, int par1, ... )
		Initialize memory and type; called by test. If force is 1,
		the chiptype or the amount of memory can be forced (this
		is pretty useless).

	The following functions provide for things like page flipping
	and hardware scrolling virtual desktops.

	setdisplaystart( int address )
		Sets the display start address in video memory in pixels.

	setlogicalwidth( int width )
		Sets the logical scanline length in bytes. Usually a
		multiple of 8.

	The function getchipset() in vga.c must call the test routine for
	the chipset. The chipsetfunctionslist must be have a pointer
	to the chipsetfunctions table for the chipset (which is the only
	global symbol in a chipset driver). Also, vga.h contains a magic
	number for each chipset. Also driver_names[] in vga.c has to
	contain a name for each driver at the correct position.
