    /**************************************************************************
     *									  *
     *		 Copyright (C) 1995, Silicon Graphics, Inc.		  *
     *									  *
     *  These coded instructions, statements, and computer programs  contain  *
     *  unpublished  proprietary  information of Silicon Graphics, Inc., and  *
     *  are protected by Federal copyright law.  They  may  not be disclosed  *
     *  to  third  parties  or copied or duplicated in any form, in whole or  *
     *  in part, without the prior written consent of Silicon Graphics, Inc.  *
     *									  *
     **************************************************************************/

    /**************************************************************************
     *
     *  $Revision: 1.15 $
     *  $Date: 1998/03/31 07:58:57 $
     *  $Source: /hosts/gate3/exdisk2/cvs/N64OS/Master/cvsmdev2/PR/include/ucode.h,v $
     *
     **************************************************************************/

    #ifndef _UCODE_H_
    #define	_UCODE_H_

    #ifdef _LANGUAGE_C_PLUS_PLUS
    extern "C" {
    #endif

    #include <PR/ultratypes.h>

    #if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)

    /**************************************************************************
     *
     * Macro definitions
     *
     */

    /*
     * This is the recommended size of the SP DRAM stack area, used
     * by the graphics ucode. This stack is used primarily for the
     * matrix stack, so it needs to be AT LEAST (10 * 64bytes) in size.
     */
    #define	SP_DRAM_STACK_SIZE8	(1024)
    #define	SP_DRAM_STACK_SIZE64	(SP_DRAM_STACK_SIZE8 >> 3)

    /*
     * This is the size of the IMEM, which is also the size of the
     * graphics microcode. (other ucode might be less)
     * This value is used in apps to tell the OS how much ucode to
     * load.
     */
    #define SP_UCODE_SIZE           4096

    /*
     * This is 1/2 the size of DMEM, which is the maximum amount of
     * initialized DMEM data any of the ucode tasks need to start up.
     * This value is dependent on all of the task ucodes, and is therefore
     * fixed per release.
     */
    #define SP_UCODE_DATA_SIZE      2048

    /**************************************************************************
     *
     * Extern variables
     *
     */

    /*
     * Symbols generated by "rsp2elf", included by "makerom" that indicate
     * the location and size of the SP microcode objects. The ucode objects
     * are loaded as part of the codesegment (arbitrary, could do other
     * ways)
     *
     */

    /* standard boot ucode: */
    extern long long int	rspbootTextStart[], rspbootTextEnd[];

    /* standard 3D ucode: */
    extern long long int	gspFast3DTextStart[], gspFast3DTextEnd[];
    extern long long int	gspFast3DDataStart[], gspFast3DDataEnd[];

    /* 3D ucode with output to DRAM: */
    extern long long int	gspFast3D_dramTextStart[], gspFast3D_dramTextEnd[];
    extern long long int	gspFast3D_dramDataStart[], gspFast3D_dramDataEnd[];

    /* 3D ucode with output through DRAM FIFO to RDP: */
    extern long long int	gspFast3D_fifoTextStart[], gspFast3D_fifoTextEnd[];
    extern long long int	gspFast3D_fifoDataStart[], gspFast3D_fifoDataEnd[];

    /* 3D ucode without nearclip: */
    extern long long int	gspF3DNoNTextStart[], gspF3DNoNTextEnd[];
    extern long long int	gspF3DNoNDataStart[], gspF3DNoNDataEnd[];

    /* 3D ucode without nearclip with output to DRAM: */
    extern long long int	gspF3DNoN_dramTextStart[];
    extern long long int	gspF3DNoN_dramTextEnd[];
    extern long long int	gspF3DNoN_dramDataStart[];
    extern long long int	gspF3DNoN_dramDataEnd[];

    /* 3D ucode without nearclip with output through DRAM FIFO to RDP: */
    extern long long int	gspF3DNoN_fifoTextStart[];
    extern long long int	gspF3DNoN_fifoTextEnd[];
    extern long long int	gspF3DNoN_fifoDataStart[];
    extern long long int	gspF3DNoN_fifoDataEnd[];

    /* 3D line ucode: */
    extern long long int	gspLine3DTextStart[], gspLine3DTextEnd[];
    extern long long int	gspLine3DDataStart[], gspLine3DDataEnd[];

    /* 3D line ucode with output to DRAM: */
    extern long long int	gspLine3D_dramTextStart[], gspLine3D_dramTextEnd[];
    extern long long int	gspLine3D_dramDataStart[], gspLine3D_dramDataEnd[];

    /* 3D line ucode with output through DRAM FIFO to RDP: */
    extern long long int	gspLine3D_fifoTextStart[], gspLine3D_fifoTextEnd[];
    extern long long int	gspLine3D_fifoDataStart[], gspLine3D_fifoDataEnd[];

    /* 2D sprite ucode: */
    extern long long int	gspSprite2DTextStart[], gspSprite2DTextEnd[];
    extern long long int	gspSprite2DDataStart[], gspSprite2DDataEnd[];

    /* 2D sprite ucode with output to DRAM: */
    extern long long int	gspSprite2D_dramTextStart[], gspSprite2D_dramTextEnd[];
    extern long long int	gspSprite2D_dramDataStart[], gspSprite2D_dramDataEnd[];

    /* 2D sprite ucode with output through DRAM FIFO to RDP: */
    extern long long int	gspSprite2D_fifoTextStart[], gspSprite2D_fifoTextEnd[];
    extern long long int	gspSprite2D_fifoDataStart[], gspSprite2D_fifoDataEnd[];

    /* basic audio ucode: */
    extern long long int 	aspMainTextStart[], aspMainTextEnd[];
    extern long long int 	aspMainDataStart[], aspMainDataEnd[];

    /*========== F3DEX/F3DLX/F3DLP/L3DEX ==========*/
    /* FIFO version only */
    extern long long int  gspF3DEX_fifoTextStart[],     gspF3DEX_fifoTextEnd[];
    extern long long int  gspF3DEX_fifoDataStart[],     gspF3DEX_fifoDataEnd[];
    extern long long int  gspF3DEX_NoN_fifoTextStart[], gspF3DEX_NoN_fifoTextEnd[];
    extern long long int  gspF3DEX_NoN_fifoDataStart[], gspF3DEX_NoN_fifoDataEnd[];

    extern long long int  gspF3DLX_fifoTextStart[],     gspF3DLX_fifoTextEnd[];
    extern long long int  gspF3DLX_fifoDataStart[],     gspF3DLX_fifoDataEnd[];
    extern long long int  gspF3DLX_NoN_fifoTextStart[], gspF3DLX_NoN_fifoTextEnd[];
    extern long long int  gspF3DLX_NoN_fifoDataStart[], gspF3DLX_NoN_fifoDataEnd[];
    extern long long int  gspF3DLX_Rej_fifoTextStart[], gspF3DLX_Rej_fifoTextEnd[];
    extern long long int  gspF3DLX_Rej_fifoDataStart[], gspF3DLX_Rej_fifoDataEnd[];

    extern long long int  gspF3DLP_Rej_fifoTextStart[], gspF3DLP_Rej_fifoTextEnd[];
    extern long long int  gspF3DLP_Rej_fifoDataStart[], gspF3DLP_Rej_fifoDataEnd[];
    extern long long int  gspL3DEX_fifoTextStart[],     gspL3DEX_fifoTextEnd[];
    extern long long int  gspL3DEX_fifoDataStart[],     gspL3DEX_fifoDataEnd[];

    /*========== F3DEX2/F3DLX2/F3DLP2/L3DEX2 ==========*/
    /* FIFO version */
    extern long long int gspF3DEX2_fifoTextStart[],    gspF3DEX2_fifoTextEnd[];
    extern long long int gspF3DEX2_fifoDataStart[],    gspF3DEX2_fifoDataEnd[];
    extern long long int gspF3DEX2_NoN_fifoTextStart[],gspF3DEX2_NoN_fifoTextEnd[];
    extern long long int gspF3DEX2_NoN_fifoDataStart[],gspF3DEX2_NoN_fifoDataEnd[];
    extern long long int gspF3DEX2_Rej_fifoTextStart[],gspF3DEX2_Rej_fifoTextEnd[];
    extern long long int gspF3DEX2_Rej_fifoDataStart[],gspF3DEX2_Rej_fifoDataEnd[];
    extern long long int gspF3DLX2_Rej_fifoTextStart[],gspF3DLX2_Rej_fifoTextEnd[];
    extern long long int gspF3DLX2_Rej_fifoDataStart[],gspF3DLX2_Rej_fifoDataEnd[];
    extern long long int gspL3DEX2_fifoTextStart[],    gspL3DEX2_fifoTextEnd[];
    extern long long int gspL3DEX2_fifoDataStart[],    gspL3DEX2_fifoDataEnd[];

    /* XBUS version */
    extern long long int gspF3DEX2_xbusTextStart[],    gspF3DEX2_xbusTextEnd[];
    extern long long int gspF3DEX2_xbusDataStart[],    gspF3DEX2_xbusDataEnd[];
    extern long long int gspF3DEX2_NoN_xbusTextStart[],gspF3DEX2_NoN_xbusTextEnd[];
    extern long long int gspF3DEX2_NoN_xbusDataStart[],gspF3DEX2_NoN_xbusDataEnd[];
    extern long long int gspF3DEX2_Rej_xbusTextStart[],gspF3DEX2_Rej_xbusTextEnd[];
    extern long long int gspF3DEX2_Rej_xbusDataStart[],gspF3DEX2_Rej_xbusDataEnd[];
    extern long long int gspF3DLX2_Rej_xbusTextStart[],gspF3DLX2_Rej_xbusTextEnd[];
    extern long long int gspF3DLX2_Rej_xbusDataStart[],gspF3DLX2_Rej_xbusDataEnd[];
    extern long long int gspL3DEX2_xbusTextStart[],    gspL3DEX2_xbusTextEnd[];
    extern long long int gspL3DEX2_xbusDataStart[],    gspL3DEX2_xbusDataEnd[];

    /**************************************************************************
     *
     * Function prototypes
     *
     */

    #endif /* _LANGUAGE_C */

    #ifdef _LANGUAGE_C_PLUS_PLUS
    }
    #endif

    #endif /* !_UCODE_H */