/*FILE HEADER**************************************************************
 *
 *  File name		: $Id$
 *  RCS Revision Number	: $Revision: 1.1 $
 *  Last Modified	: $Date: 94/10/28 09:25:43 $
 *  CSCI name		: Real-Time Graphics System - Applications Interface
 *  Notes:
 *	This file contains the type definitions required for using
 *	the Real-Time Graphics System - Applications Interface.
 *  History		:
 *	1991 Nov 15	Jeff Sanderson
 *	    Release Rev A.
 *
 *END FILE HEADER*********************************************************/

/*-------------------------------------------------------------------------*/
/* Address conversion macros.                                              */
/*-------------------------------------------------------------------------*/

/* convert a GSP local address to its VME equivalent */

#define VME_ADDR(addr) (W_gcc_base_addr+((uint32)((addr)-0xC0000000)>>3))


/* convert a VME address to its GSP local equivalent */

#define GSP_ADDR(addr) ((((int)(addr) - W_gcc_base_addr) << 3) + 0xC0000000)


/*-------------------------------------------------------------------------*/
/* BI-mode location monitor.                                               */
/*-------------------------------------------------------------------------*/

#define BI_MODE		    *(( uint8 * )( W_gcc_base_addr + 0x06000003 ))


/*-------------------------------------------------------------------------*/
/* FIFO related macro's                                                    */
/*-------------------------------------------------------------------------*/

#define DEFAULT_FIFO        (( fifo_t * )( 0 ))
#define DEFAULT_FIFO_ADDR   (( fifo_t * )( VME_ADDR( 0xCC120000 )))

#define FIFO_HEAD_PTR	    *((uint32*)(&(W_fifo_base->head_pointer)))
#define FIFO_TAIL_PTR	    *((uint32*)(&(W_fifo_base->tail_pointer)))
#define CMD_LIST_PTR        *((uint32*)(&(W_fifo_base->command_list)))
#define FRAME_COUNT	    *((uint32*)(&(W_fifo_base->frame_count)))
#define FLIP_REGISTER       *((uint16*)(&(W_fifo_base->flip_reg)))
#define READY_FLIP_REG      *((uint16*)(&(W_fifo_base->ready_to_flip)))
#define MEM_ADDR_REG	    *((uint32*)(&(W_fifo_base->memory_address)))
#define ERROR_REG	    *((uint32*)(&(W_fifo_base->error)))
#define CURSOR_LOCATION_REG *((uint32*)(&(W_fifo_base->cursor_pos)))
#define FIFO_NEXT_REG       *((uint32*)(&(W_fifo_base->next)))

#define FIFO_BASE_ADDR 	    (( uint32 )GSP_ADDR((&(W_fifo_base->fifo[0]))))
#define FIFO_END_ADDR	    (( uint32 )GSP_ADDR((&(W_fifo_base->fifo[2047]))))
#define FIFO_SIZE	    ( 2048 * 32 )

#define VECTOR_REGISTER   *(( uint8 * )( W_gcc_base_addr + 0x04000003 ))
#define INT_LEVEL_REG     *(( uint8 * )( W_gcc_base_addr + 0x02000003 ))

/*-------------------------------------------------------------------------*/
/* Interrupt related macros                                                */
/*-------------------------------------------------------------------------*/

/* bit masks for set int mode */

#define CONDITION_ERROR			( 1 << 0x00 )
#define CONDITION_RAISE_INTERRUPT	( 1 << 0x01 )
#define CONDITION_BUFFER_FLIP		( 1 << 0x02 )
#define CONDITION_MALLOC		( 1 << 0x03 )
#define CONDITION_INQUIRE_TEXT_EXTENT	( 1 << 0x04 )
#define CONDITION_INQUIRE_PIXEL_SIZE	( 1 << 0x05 )
#define CONDITION_COMPARE_CURS_CLIPRECT	( 1 << 0x06 )
#define CONDITION_GET_PIXEL_ADDRESS	( 1 << 0x07 )
#define CONDITION_FRAME_TICK		( 1 << 0x08 )
#define CONDITION_CREATE_FIFO		( 1 << 0x09 )
#define CONDITION_GET_PIXEL		( 1 << 0x0A )


/* NOTE the following 2 values where arbitrarily set */
/* modify the values to suit the needs of your       */
/* chassis environment                               */

#define GCC_VECT			( uint32 )( 0x40 )
#define GCC_LEVEL                       ( uint32 )( 3 )

/* vector offsets for GCC interrupts */

#define VECT_ERROR			( uint32 )( GCC_VECT + 0x00 )
#define VECT_RAISE_INTERRUPT		( uint32 )( GCC_VECT + 0x01 )
#define VECT_BUFFER_FLIP		( uint32 )( GCC_VECT + 0x02 )
#define VECT_MALLOC			( uint32 )( GCC_VECT + 0x03 )
#define VECT_INQUIRE_TEXT_EXTENT	( uint32 )( GCC_VECT + 0x04 )
#define VECT_INQUIRE_PIXEL_SIZE		( uint32 )( GCC_VECT + 0x05 )
#define VECT_COMPARE_CURS_CLIPRECT	( uint32 )( GCC_VECT + 0x06 )
#define VECT_GET_PIXEL_ADDRESS		( uint32 )( GCC_VECT + 0x07 )
#define VECT_FRAME_TICK			( uint32 )( GCC_VECT + 0x08 )
#define VECT_CREATE_FIFO		( uint32 )( GCC_VECT + 0x09 )
#define VECT_GET_PIXEL			( uint32 )( GCC_VECT + 0x0A )

/*-------------------------------------------------------------------------*/
/* Some useful line style masks.                                           */
/*-------------------------------------------------------------------------*/

#define  LINE_STYLE_SOLID	0xFFFFFFFF
#define  LINE_STYLE_DASH	0x03FF03FF
#define  LINE_STYLE_DOT		0x03030303
#define  LINE_STYLE_DOT_DASH	0x0C3F0C3F

/*-------------------------------------------------------------------------*/
/* Marker types.                                                           */
/*-------------------------------------------------------------------------*/

#define  MARKER_TYPE_DOT	0
#define  MARKER_TYPE_PLUS	1
#define  MARKER_TYPE_ASTERISK	2
#define  MARKER_TYPE_CIRCLE	3
#define  MARKER_TYPE_CROSS	4

/*-------------------------------------------------------------------------*/
/* Contants for general modes.                                             */
/*-------------------------------------------------------------------------*/

#define  OFF			0
#define  ON			1
#define  MAX_VIDEO_BUFFERS      10
#define  NUM_GSP_REGS           15


/*-------------------------------------------------------------------------*/
/* The cursor types.                                                       */
/*-------------------------------------------------------------------------*/

#define  CURSOR_CROSSHAIR	0
#define  CURSOR_1_BIT		1
#define  CURSOR_2_BIT		2

/*-------------------------------------------------------------------------*/
/* The rubberband types.                                                   */
/*-------------------------------------------------------------------------*/

#define  RUBBER_LINE		0
#define  RUBBER_BOX		1

/*-------------------------------------------------------------------------*/
/* The transparency modes.                                                 */
/*-------------------------------------------------------------------------*/

#define  TRANSPARENT		0
#define  OPAQUE			1

/*-------------------------------------------------------------------------*/
/* The on-board fonts.                                                     */
/*-------------------------------------------------------------------------*/

#define CORPUS_CHRISTI_15	0
#define CORPUS_CHRISTI_16	1
#define CORPUS_CHRISTI_26	2
#define CORPUS_CHRISTI_29	3
#define CORPUS_CHRISTI_49	4
#define FARGO_22		5
#define FARGO_26		6
#define FARGO_38		7
#define LUCHENBACH_07		8
#define HELVETICA_11		9
#define HELVETICA_18		10
#define HELVETICA_22		11
#define HELVETICA_24		12
#define ROMAN_11		13
#define ROMAN_14		14
#define ROMAN_16		15
#define ROMAN_18		16
#define ROMAN_20		17
#define ROMAN_22		18
#define ROMAN_26		19
#define AUSTIN_11		20
#define AUSTIN_15		21
#define AUSTIN_20		22
#define AUSTIN_25		23
#define GALVESTON_12		24
#define GALVESTON_15		25
#define GALVESTON_21		26
#define GALVESTON_28		27
#define ARROWS_25		28
#define ARROWS_31		29
#define DEVONS_23		30
#define DEVONS_28		31
#define GALVES_22		32
#define HOUSTN_14		33
#define HOUSTN_17		34
#define HOUSTN_20		35
#define HOUSTN_26		36
#define MATH_16  		37
#define MATH_19  		38
#define MATH_24  		39
#define SANANT_22		40
#define SANANT_28		41
#define TAMPA_18 		42
#define TAMPA_22 		43
#define TI_ART_22		44
#define TI_ART_28		45
#define TI_BAU_11		46
#define TI_BAU_14		47
#define TI_BAU_17		48
#define TI_BAU_19		49
#define TI_BAU_22		50
#define TI_BAU_24		51
#define TI_BAU_28		52
#define TI_CLO_27		53
#define TI_DOM_23		54
#define TI_DOM_25		55
#define TI_HEL_15		56
#define TI_HEL_20		57
#define TI_HEL_28		58
#define TI_PRK_15		59
#define TI_PRK_18		60
#define TI_PRK_21		61
#define TI_PRK_23		62
#define TI_PRK_25		63
#define TI_PRK_28		64
#define TI_TYP_11		65
#define TI_TYP_14		66
#define TI_TYP_16		67
#define TI_TYP_18		68
#define TI_TYP_20		69
#define TI_TYP_22		70
#define TI_TYP_26		71

/*-------------------------------------------------------------------------*/
/* Fixed point real.                                                       */
/*-------------------------------------------------------------------------*/

typedef long    fixed; /* fixed pt format = 0x0000.0000                    */

/*-------------------------------------------------------------------------*/
/* XY coordinate structure.                                                */
/*-------------------------------------------------------------------------*/

typedef struct POINT_T
{
    int16	y;
    int16	x;
} point_t;

/*-------------------------------------------------------------------------*/
/* Custom video mode structure.                                            */
/*-------------------------------------------------------------------------*/

typedef struct VIDEO_PARAMS_T {
    uint32   screenwide;    /* width of display in pix                     */
    uint32   screenhigh;    /* height of display in pix                    */
    uint32   psize;         /* bits per pix                                */
    uint32   scrn_pitch;    /* width of screen buff in bits                */
    uint32   vesync;        /* GSP reg value                               */
    uint32   hesync;        /* GSP reg value                               */
    uint32   veblnk;        /* GSP reg value                               */
    uint32   heblnk;        /* GSP reg value                               */
    uint32   vsblnk;        /* GSP reg value                               */
    uint32   hsblnk;        /* GSP reg value                               */
    uint32   vtotal;        /* GSP reg value                               */
    uint32   htotal;        /* GSP reg value                               */
    uint32   dpyctl;        /* GSP reg value                               */
    uint32   dpyint;        /* GSP reg value                               */
    uint32   config;        /* GSP reg value                               */
    uint32   heserr;        /* GSP reg value                               */
    uint32   dpymsk;        /* GSP reg value                               */
    uint32   setvcount;     /* GSP reg value                               */
    uint32   sethcount;     /* GSP reg value                               */
    uint32   scrn_offset;   /* GSP reg value                               */
    uint32   ctrl_reg_a;    /* SVME-770 reg value                          */
    uint32   ctrl_reg_b;    /* SVME-770 reg value                          */
    uint32   ctrl_reg_c;    /* SVME-770 reg value                          */
    uint32   clock_sel_reg; /* SVME-770 reg value                          */
    uint32   pll_mult_reg;  /* SVME-770 reg value                          */
    uint32   pll_div_reg;   /* SVME-770 reg value                          */
    uint32   phase_adj_reg; /* SVME-770 reg value                          */
    uint32   pal_gen_ctrl_reg;       /* 3010 LUT reg value                 */   
    uint32   pal_output_clk_sel_reg; /* 3010 LUT reg value                 */
    uint32   pal_input_clk_sel_reg;  /* 3010 LUT reg value                 */
    uint32   pal_mux_ctrl_reg_1;     /* 3010 LUT reg value                 */
    uint32   pal_mux_ctrl_reg_2;     /* 3010 LUT reg value                 */
    uint32   max_buf_num;   /* number of screen buffers that fit in VRAM   */
    uint32   vram_buffers[MAX_VIDEO_BUFFERS]; /* addresses of buffers      */
} video_params_t;

/*-------------------------------------------------------------------------*/
/* Character definition structure.                                         */
/*-------------------------------------------------------------------------*/

typedef struct CHARDEF_T
{
    uint32     c;     /* ascii code for character                          */
    uint32     *bits; /* GSP address of character bitmap                   */
} chardef_t;

/*-------------------------------------------------------------------------*/
/* Font definition structure.                                              */
/*-------------------------------------------------------------------------*/

typedef struct FONT_T
{
    uint32     n;               /* max char index defined                  */
    uint16     size_y, size_x;  /* xy dimensions of character bitmap in pix*/
    chardef_t  *chardef;        /* ptr to array of chardefs                */
} font_t;

/*-------------------------------------------------------------------------*/
/* Cursor definition structure.                                            */
/*-------------------------------------------------------------------------*/

typedef union CURSOR_DEF_T {
    struct {
	uint16  colour;               /* colour of cursor                  */
	uint16  f;                    /* filler                            */
	uint16  size_x, size_y;       /* size in pix of cursor bitmap      */
	uint16  hotspot_x, hotspot_y; /* offset of bitmap relative to pos. */
	uint32  *bitmap;              /* address of cursor bitmap          */
    } bitmap1;
    struct
    {
	uint16  colour1, colour2;     /* background, fore ground colours   */
	uint16  size_x, size_y;       /* size of bitmaps                   */
	uint16  hotspot_x, hotspot_y; /* offset of bitmaps relative to pos.*/
	uint32  *bitmap1, *bitmap2;   /* addresses of cursor bitmaps       */
    } bitmap2;
} cursor_def_t;

/*-------------------------------------------------------------------------*/
/* parameter struct for the bitmap rotate command                          */
/*-------------------------------------------------------------------------*/

typedef struct {
    long output_address;  /* bit address of upper left corner              */
    long output_pitch;	  /* diff in bits between 2 vert adjacent pixels   */
    long output_width;	  /* width of dest in pixels                       */
    long output_height;	  /* height of dest in pixels                      */
    long input_address;	  /* bit address of upper left corner              */
    long input_pitch;	  /* diff in bits between 2 vert adjacent pixels   */
    long input_height;	  /* height of src in pixels                       */
    fixed sin_theta;	  /* signed 16-frac_bit fixed point ( 0xnnnn.nnnn )*/
    fixed cos_theta;	  /* signed 16-frac_bit fixed point ( 0xnnnn.nnnn )*/
} rotate_params;


/*-------------------------------------------------------------------------*/
/* fifo struct used by create_fifo                                         */
/*-------------------------------------------------------------------------*/

typedef struct fifo_t 
{
    uint32 head_pointer;   /* ptr to head of list in FIFO                  */
    uint32 tail_pointer;   /* ptr to tail of list in FIFO                  */
    uint32 command_list;   /* ptr to current cmd in cmd list               */
    uint32 frame_count;    /* counter, incr every 1/60th second            */
    uint16 ready_to_flip;  /* not used                                     */
    uint16 flip_reg;       /* cleared when buffer flipped                  */
    uint32 memory_address; /* return buff for malloc cmd                   */
    uint32 error;          /* error reporting register                     */
    uint32 cursor_pos;     /* cursor position register                     */
    struct fifo_t *next;   /* ptr to next fifo_t in list of FIFO's         */
    uint32 fifo[2048];     /* FIFO                                         */
} fifo_t;

/*-------------------------------------------------------------------------*/
/* environment struct used by Set/Get_environment                          */
/*-------------------------------------------------------------------------*/

typedef struct environment_t 
{
    point_t     clip_rect[2];      /* bounds of clipping rectangle         */
    uint32      clip_mode;         /* clipping ON/OFF                      */
    uint32      foreground_colour; /* current foreground colour            */
    uint32      background_colour; /* current background colour            */
    uint32      plane_mask;        /* plane mask reg value                 */
    uint32      transparency_mode; /* transp. OPPAQUE/TRANSPARENT          */
    uint32      ppop;              /* pixel processing operation           */
    uint32      line_style;        /* line style mask                      */
    uint32      line_width;        /* line width value                     */
    uint32      keying_mode;       /* keying ON/OFF                        */
    int32       text_font;         /* current text font index              */
    int32       text_spacing;      /* text inter character spacing         */
    uint32      marker_type;       /* polymarker type 0-4                  */
    uint32      marker_size;       /* polymarker size 0-1000               */
    uint32      cursor_mode;       /* cursor ON/OFF                        */
    uint32      cursor_type;       /* cursor type CROSSHAIR,1BIT,2BIT      */
    uint32      rubber_mode;       /* rubberbanding ON/OFF                 */
    uint32      rubber_type;       /* ruberband LINE/BOX                   */
    uint32      scale_x;           /* scale and offset variable            */
    uint32      scale_y;           /* scale and offset variable            */
    point_t     scale_point;       /* scale and offset variable            */
    point_t     offset;            /* scale and offset variable            */
    point_t     screen_offset;     /* xy offset of screen in buffer        */
} environment_t;

/*-------------------------------------------------------------------------*/
/* Externs of globals                                                      */
/*-------------------------------------------------------------------------*/

extern uint32                  W_gcc_base_addr;
extern fifo_t                  *W_fifo_base;

extern uint32                  W_psize;

extern int                     W_vector_mask;
extern uint32                  W_interrupt_flag;
extern uint32                  W_flip_flag;
extern uint32                  W_malloc_flag;
extern uint32                  W_inq_text_flag;
extern uint32                  W_inq_pixs_flag;
extern uint32                  W_inq_pt_flag;
extern uint32                  W_inq_addr_flag;
extern uint32                  W_tick_flag;
extern uint32                  W_new_fifo_flag;
extern uint32                  W_get_pixl_flag;

extern css_mark_struct         *Mark_stack;
extern css_mark_struct         buff_general;
extern css_mark_struct         buff_error;
extern css_mark_struct         buff_raise_int;
extern css_mark_struct         buff_buff_flip;
extern css_mark_struct         buff_malloc;
extern css_mark_struct         buff_inq_text;
extern css_mark_struct         buff_inq_pixs;
extern css_mark_struct         buff_inq_pt;
extern css_mark_struct         buff_inq_addr;
extern css_mark_struct         buff_tick;
extern css_mark_struct         buff_new_fifo;
extern css_mark_struct         buff_get_pixl;

extern int8           *gcc_command_strings[];
extern int8           *gcc_error_strings[];


/*-------------------------------------------------------------------------*/
/* Define function prototypes                                              */
/*-------------------------------------------------------------------------*/

extern void   Set_current_fifo( fifo_t *fifo );
extern void   Set_gcc_base_address( int addr );
extern void   Take_gcc_out_of_bi_mode( void );
extern uint32 Get_error_code( void );
extern void   Gcc_sync( void );
extern void   Copy_data_to_gcc( char *src, char *dst, int size );
extern void   Copy_string_to_gcc( char *src, char *dst, int size );
extern void   Copy_bitmap_to_gcc( char *src, char *dst, int size );
extern void   Move_cursor( int x, int y );
extern void   Initialize_graphics( void );
extern void   Initialize_video( int video_index );
extern void   Custom_initialize_video( video_params_t *video_params );
extern void   Run_diagnostics( void );
extern char   *Gcc_malloc( int size, int mem_addr );
extern void   Gcc_free( char *mem_addr );
extern void   Raise_interrupt( void );
extern void   Install_font( int font_index );
extern void   Load_text_font( int index, font_t *text_font );
extern void   Define_text_symbol( int index, char *str );
extern void   Clear_screen( int colour, int first_line, int last_line );
extern void   Set_clipping_mode( int mode );
extern void   Set_clip_rectangle( int x1, int y1, int x2, int y2 );
extern void   Set_plane_mask( int plane_mask );
extern void   Set_colour_representation( int lut, int colour_index, 
                                         int red, int green, int blue );
extern void   Set_scale_and_offset( fixed scale_x, fixed scale_y, 
                                    int pt_x, int pt_y, int t_x, int t_y );
extern void   Delay( int ticks );
extern void   Set_interrupt_mode( int vector, int level, int mask );
extern void   Create_fifo( fifo_t *fifo );
extern void   Release_fifo( void );
extern void   Set_phase_alignment( int offset );
extern void   Save_video_mode( void );
extern void   Get_video_mode( video_params_t *params );
extern void   Move_video_vertical( int increment );
extern void   Move_video_horizontal( int increment );
extern void   Set_screen_offset( int x, int y );
extern void   Move_screen( int *display_buf_start, int *draw_buf_start );
extern void   Reset_seeprom( void );
extern void   Draw_line( int x1, int y1, int x2, int y2 );
extern void   Draw_polyline( int n, point_t *pts);
extern void   Draw_ellipse( int x, int y, int r_x, int r_y );
extern void   Draw_elliptical_arc( int x, int y, int r_x, int r_y, 
                                   int theta_1, int theta_2 );
extern void   Draw_text( int x, int y, char *str );
extern void   Draw_text_symbol( int x, int y, int index );
extern void   Draw_polymarker( int n, point_t *pts );
extern void   Draw_filled_rectangle( int x1, int y1, int x2, int y2 );
extern void   Draw_filled_polygon( int n, point_t *pts );
extern void   Draw_filled_convex_polygon( int n, point_t *pts );
extern void   Draw_filled_ellipse( int x, int y, int r_x, int r_y );
extern void   Bitblt_bit_expand( int *bitmap, int x, int y, 
                                 int w, int h, int src_pitch);
extern void   Bitblt_linear_to_xy( int *pixmap, int x, int y, 
                                   int w, int h, int src_pitch);
extern void   Bitblt_xy_to_xy( int x1, int y1, int x2, int y2, 
                               int w, int h);
extern void   Bitblt_xy_to_linear( int x, int y, int *pixmap, 
                                   int w, int h, int dest_pitch );
extern void   Bitblt_linear_to_linear( int *src, int src_pitch,
                                       int *dst, int dst_pitch, 
                                       int w,    int h );
extern void   Get_pixel( int x, int y, int *pixel_value );
extern void   Put_pixel( int x, int y, int pixel_value );
extern void   Set_foreground_colour( int colour_index );
extern void   Set_background_colour( int colour_index );
extern void   Set_transparency_mode( int mode );
extern void   Set_pixel_processing_operation( int ppop );
extern void   Set_line_style( int line_style_mask );
extern void   Set_line_width( int width );
extern void   Set_keying_mode( int mode );
extern void   Set_text_font( int font_index );
extern void   Set_text_spacing( int spacing );
extern void   Set_marker_type( int marker_type );
extern void   Set_marker_size( int marker_size );
extern void   Set_environment( environment_t *env );
extern void   Get_environment( environment_t *env );
extern void   Define_cursor( int cursor_type, cursor_def_t *cursor_def );
extern void   Set_cursor_mode( int mode );
extern void   Set_rubberband_mode( int mode, int type );
extern void   Inquire_text_extent( char *string, point_t *size );
extern void   Inquire_pixel_size( int *pixel_size );
extern void   Compare_point_to_cliprect( int x, int y, int *outcodes );
extern void   Get_pixel_address( int x, int y, int *address );
extern void   Open_command_list( int list_number );
extern void   Close_command_list( void );
extern void   Run_command_list( int list_number );
extern void   Delete_command_list( int list_number );
extern void   Set_frame_buffering( int drawing_buffer, 
                                   int visible_buffer );
extern void   Flip_buffers( int clear_buffer_flag, int colour );
extern void   Define_new_function( int command_code, int entry_point,
			           int num_parameters );
extern void   Rotate( rotate_params *params );

extern void   Init( void );

/** END OF FILE **************************************************************/
