141 lines
4.9 KiB
Text
141 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.
|