SvgaLib/doc/README.patching

140 lines
4.9 KiB
Text

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.