Ultima 4 graphics driver
========================

This text describes the public functions of ega.drv, the graphics driver
used by Ultima 4 for DOS.
It was written by Ryan Wiener (Aradindae Dragon), the programmer of the
Ultima 4 Upgrade, which can be found at:
http://www.moongates.com/u4/

---

Function info (by number)

00 - Active Character Box (In combat)
     Input: (row, col)
            - Row is the tile row on screen in the main window from 0 to 10
            - Col is the tile column on screen in the main window from 0 to 10
     Literally: Draws a white bounding box at tile identified by row and col
     Description: Draws the white box (2 pixel wide) around the active character
                  while in combat.
                  * Blinking effect caused by repetitively painting original
                  tile, then after a short delay, painting the bounding box.
01 - Tile Row Expansion (Dungeon)
     Input: (Tile, TRow, SRow, SCol, Exp)
            - Tile is the tile number, 0 to 255, with the row to be expanded
            - TRow is the row in the tile, 0 to 15, to be expanded
            - SRow is the screen row to expand to, 0 to 199
            - SCol is the screen column to expand to, 0 to 319
            - Exp is the expansion factor, 1 (false) or not 1 (true)
     Literally: Draws the specified row of the specified tile to the screen at
                coordinate (SRow, SCol).  If Exp is not 1 (true), then the row
                is expanded horizontally by a factor of 2 (each pixel drawn
                twice, side by side), otherwise, it is copied pixel for pixel.
     Description: Used to draw monsters/chests/orbs while in dungeons,
                  expanding as needed for close up views

02 - Field Painter (Dungeon)
     Input: (Height, Width, Tile, Row, Col)
            - Height is the height in tiles, 0 to 10, to copy over.
            - Width is the width in tiles, 0 to 10, to copy over.
            - Tile is the Tile to copy.
            - Row is the upper row in tiles, 0 to 10, to begin copying at.
            - Col is the left column in tiles, 0 to 10, to begin copying at
     Literally: Copies the specified Tile over the specified range, starting
                at (Row, Col) and going for Height rows down and Width columns
                down
     Description: Used to paint fields (Magic, Sleep, Poison) on the main view
                  while in dungeons.

03 - Tremor Shift Down
04 - Tremor Shift Up
     Input (Sound)
           - Sound is a flag for whether or not to play sound (based on program
             sound setting, don't remember the key, but there is a toggle key)
     Literally: Shifts entire main view down(up) half a tile (8 pixels).
                Makes rumble noise if sound != 0
     Description: Used specifically for the spell tremor, which calls these two
                  functions.

05 - Draw Tiles from list
     Input (Height, Width, Pointer)
           - Height is number of tile rows to draw (0 to 10)
           - Width is number of tile columns to draw (0 to 10)
           - Pointer is a near pointer to a list of tile numbers
     Literally: Draws the tiles in list pointed to by Pointer to the screen
                starting at the upper left tile and going until Height and
                Width tiles have been painted.  Paints across then down
     Description: used mainly to draw non-dungeon scenes, incl: Shrines, Combat,
                  Town/Castle/Village, Overland, and sleeping views.

06 - Set Pixel
     Input (Row, Col, Color)
           - Row is screen row (0-199) to set
           - Col is screen column (0-319) to set
           - Color is the color (originally 0-15, but my VGA version uses 0-255)
     Literally: Sets the pixel at (row, col) to Color
     Description: Used to draw the Ladders in dungeons (I think that is all, but
                  it may also be used in the "peer" screen after using a gem...)

07 - Scroll Text
     Input: none
     Literally: Shifts text box up 1 line (8 pixels), and clears the bottem line
                of text
     Description: Used whenever it needs to scroll the text up...

08 - Invert Main Window
     Input: none
     Literally: inverts the main window (where all the tiles are drawn) by
                XOR-ing each pixel by xFF (on the VGA version)
     Description: Used during spellcasting to negate the screen, and return it
                  to normal

09 - Clear Main Window
     Input: none
     Literally: clears the main window by setting each pixel to 0 (black)
     Description: Used various times, whenever the screen needs to change, also
                  used when your torch goes out...

10 - Invert Line (status box)
     Input: (row)
            - Row is the line in the status box to invert (0 to 7)
     Literally: inverts the specified line (8 pixels tall) in the status box
                in the same manner as function 08
     Description: Used during combat to highlight the name of the active
                  character.

11 - Invert Character (status box)
     Input: (Row, Column)
            - Row is line in the status box with the character (0 to 7)
            - Column is the character in the line to invert (0 to 15)
     Literally: Inverts the character in the status box specified by
                row and column in the same manner as function 8
     Description: Used to invert the Status character whenever
                  That character is wounded

12 - Clear Status Box
     Input: none
     Literally: clears the status box area by setting each pixel to 0
     Description: Used to clear the box when switching pages while viewing
                  (Z)stats

13 - OR Pixel Set
     Input (Row, Col, Color)
           - Row is screen row (0-199) to set
           - Col is screen column (0-319) to set
           - Color is the color (originally 0-15, but my VGA version uses 0-255)
     Literally: Bitwise OR the pixel at (row, col) with Color
     Description: I think that it is used in the "peer" screen after using a gem

14 - XOR Pixel Set
     Input (Row, Col, Color)
           - Row is screen row (0-199) to set
           - Col is screen column (0-319) to set
           - Color is the color (originally 0-15, but my VGA version uses 0-255)
     Literally: Bitwise XOR the pixel at (row, col) with Color
     Description: I think that it is used in the "peer" screen after using a gem
                  in order to get that flickering marker to indicate your
                  location

15 - Scene Draw
     Input (FileName, DestOff, DestSeg)
           - FileName is a near pointer to the filename (string) containing the
             picture to load
           - DestOff is the Offset in DestSeg to begin writing picture data
           - DestSeg is the Segment in memory to write picture data to.  If this
             Value = 0, then write directly to the screen, instead)
           * the format of the file is as follows:
             Do
               read byte from file
               if byte != 2, then
                 write byte to screen.
                 step to next pixel
               else
                 A = next byte
                 B = byte after that
                 write A copies of byte A to screen
                 advance to pixel after last one written
              end if
             While not done writing data
     Literally: decodes and writes data to screen.  By XOR-ing pixels with data.
                (EGA version uses OR instead)  This is capable of doing full screen
                displays, (in fact, that is how the border is drawn initially)
     Description: Used whenever a scene is drawn to the screen (Avatarhood shrine
                  visions, Initial Border, and Final Questions.)

16 - Show by opening (Final do-dah)
     Input (FileName)
           - FileName is a near pointer to the filename (string) containing the
             picture to load.  This is passed directly to Function 15
     Literally: Loads screen into memory (via function 15), then does the split
                open effect (scrolling away the two halves to reveal the scene
                beneath)
     Description: Used only at the end of the game, after you have answered every
                  Avatar question correctly, to show the final in game scene.

17 - Dungeon Draw (Trapazoids)
     Input (X1, X2, Y1A, Y1B, Y2A, Y2B, C1, C2)
           - X1 is left edge of trapazoid (0 to 319)
           - X2 is right edge of trapazoid (0 to 319)
           - Y1A is upper left boundry (0 to 199)
           - Y1B is lower left boundry (0 to 199)
           - Y2A is upper right boundry (0 to 199)
           - Y2B is lower right boundry (0 to 199)
           * left and right & Upper/lower don't matter much, as I sort them to
             make sense anyways
           - C1 is the the Color of the Trapazoid (0-3) they are then looked up
             on a color table in the driver (Black, Blue, Green, White)
           - C2 is unused (both in mine and in the EGA version)
     Literally: Draws the trapazoid matching the specified dimensions of the given
                Color.  As a side note, my version draws the dungeon as specified,
                as opposed to the EGA version, which does some cheap time saving
                tricks.  As a result, their lines are all at 45 and 90 degree angles,
                while mine match the specified coordinates, like the C64 version.
     Description: Used to draw the walls & doors & stuff in the dungeon.  Not much
                  more than a Trapazoid drawing function

18 - Ankh Set
     Input (List)
           - list is a near pointer to a list of near pointers to the avatarhood
             data
     Literally: Replaces/updates the Avatarhood character (different character from
                the ankh) with the data in the ankh.  Where each row of ankh data is
                copied only if Avatarhood has been achieved in the corresponding
                Virtue.  If Avatarhood has not been achieved in the virtue, zeroes
                out the specified row.
     Description: Used to keep the Avatar symbol (beneath the status box) up to date
                  with your current Avatarhood progress.

19 - Fire Flicker Effect
     Input: none
     Literally: Shifts the color of various pixels in the fire in order to achieve
                the flickering effect.  (but doesn't always change each pixel)
     Description: Used to animate the fire.

20 - Initialize
     Input (Tiles, CharSet, ErrFuncOff, ErrFuncSeg)
           - Tiles is a near pointer to the far pointer to the list of tiles
             (256 tiles, each 16 * 16 pixels, 1 byte per pixel in the VGA version)
           - CharSet is a near pointer to the far pointer to the list of characters
             (256 chars, each 8*8 pixels, 1 byte per pixel in the VGA version)
           - ErrFuncSeg:ErrFuncOff is a far pointer to an error handler, in case of
             failed initialization or failure elsewhere
     Literally: Initializes Graphics engine, VGA version inits following:
                - Palette: file of 256 R G B triplets
                - Saves far pointer to ErrorFunc in local mem
                - Loads shapes.vga (not needed by the EGA version...)
                - Loads charset.vga (not needed by the EGA version...)
                - Loads and inits the music engine... I had to do it somewhere...
     Description: Used right after you execute the file Avatar.exe (done either by
                  making a new game, or continuing from a saved game...)

21 - Clear Screen
     Input: none
     Literally: Clears entire screen by setting each pixel to 0
     Description: Used to clear the screen before loading up the rest of the game and
                  before going to the very end (last scene with grass and stuff)

22 - Water Scroll Effect
     Input (Tile)
           - Tile is the tile by number to effect (0 to 255)
     Literally: Rotates each line of the tile down 1 pixel.  New first row becomes old
                last row
     Description: Used to animate water (Shoals, Shallow, and Deep) and fields (Magic, 
                  Poison, and Sleep)

23 - Flag Wave Effect
     Input: none
     Literally: Swaps (at random for each tile) the flag rows on the tiles with flags
     Description: Used to animate the flags on the towns/castles/ships

24 - Character output
     Input (Row, Col, Char)
           - Row is the actual character row (1 row = 8 pixels) to display Char at
             (0 to 24)
           - Col is the actual character column (1 column = 8 pixels) to display Char
             at (0 to 39)
           - Char is the character (from char map) to display at (row, col)
     Literally: Displays character Char at (row, col)
                * (0,0) is the upper left corner of the screen (on the border)
     Description: Used for writing characters to the screen, incl: moon phases, wind,
                  Facing, Dungeon map (peer in gem), status box, ankh, and typing area
                  Also fixes borders when needed...
                  * this is the main area that I wrote my music detect/change code, so
                    the actual code in my driver is really nasty!!!
