osdtest.c

来自「GM5621原代码」· C语言 代码 · 共 1,110 行 · 第 1/3 页

C
1,110
字号
    0x00, 0x00,
	0x11, 0x11, 
    0x22, 0x22, 
    0x33, 0x33, 
    0x44, 0x44, 
    0x55, 0x55, 
    0x66, 0x66, 
    0x77, 0x77, 
    0x88, 0x88,
	0x99, 0x99, 
    0xaa, 0xaa, 
    0xbb, 0xbb, 
    0xcc, 0xcc, 
    0xdd, 0xdd, 
    0xee, 0xee, 
    0xff, 0xff, 
    0x00, 0x00,
	0x11, 0x11, 
    0x22, 0x22, 
    0x33, 0x33,
    0x44, 0x44, 
    0x55, 0x55, 
    0x66, 0x66, 
    0x77, 0x77, 
    0x88, 0x88,
	0x99, 0x99, 
    0xaa, 0xaa, 
    0xbb, 0xbb, 
    0xcc, 0xcc, 
    0xdd, 0xdd, 
    0xee, 0xee, 
    0xff, 0xff, 

	0x11, 0x11, 
    0x11, 0x11, 
    0x11, 0x11, 
    0x11, 0x11, 
    0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
	0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
	0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
	0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
	0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
	0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
	0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
	0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
	0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
	0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
	0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44,
	0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
	0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
	0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11
};


typedef struct OsdRegsStruct
{
    WORD OSD_HSTART;
    WORD OSD_VSTART;
    WORD OSD_WIDTH;
    WORD OSD_HEIGHT;
    WORD OSD_YSTRIDE;
    WORD OSD_FONT_SIZE;
    WORD OSD_CHARMAP_CTRL;
    WORD OSD_WIN_EN;
    WORD OSD_WIN_INDEX;
    struct
    {
        WORD OSD_W_HSTART;
        WORD OSD_W_VSTART;
        WORD OSD_W_HEND;
        WORD OSD_W_VEND;
    } OSD_WIN_COORD[4];
    WORD OSD_1BIT_FONT_BA;
    WORD OSD_1BITX_FONT_BA;
    WORD OSD_2BIT_FONT_BA;
    WORD OSD_4BIT_FONT_BA;
    WORD OSD_ATTR_BA;
    WORD OSD_CCF_BA;
} SOsdRegs;

// Registers specific to osd rectangle
SOsdRegs ROM OsdRegs[2] =
{
    {
    OSD_R1_HSTART_0,
    OSD_R1_VSTART_0,
    OSD_R1_WIDTH_0,
    OSD_R1_HEIGHT_0,
    OSD_R1_YSTRIDE,
    OSD_R1_FONT_SIZE,
    OSD_R1_CHARMAP_CTRL,
    OSD_R1_WIN_EN,
    OSD_R1_WIN_INDEX0,
    {
    {OSD_R1_W1_HSTART_0, OSD_R1_W1_VSTART_0, OSD_R1_W1_HEND_0, OSD_R1_W1_VEND_0},
    {OSD_R1_W2_HSTART_0, OSD_R1_W2_VSTART_0, OSD_R1_W2_HEND_0, OSD_R1_W2_VEND_0},
    {OSD_R1_W3_HSTART_0, OSD_R1_W3_VSTART_0, OSD_R1_W3_HEND_0, OSD_R1_W3_VEND_0},
    {OSD_R1_W4_HSTART_0, OSD_R1_W4_VSTART_0, OSD_R1_W4_HEND_0, OSD_R1_W4_VEND_0},
    },
    OSD_R1_1BIT_FONT_BA_0,
    OSD_R1_X1BIT_FONT_BA_0,
    OSD_R1_2BIT_FONT_BA_0,
    OSD_R1_4BIT_FONT_BA_0,
    OSD_R1_ATTR_BA_0,
    OSD_R1_CCF_BA_0
    },

    {
    OSD_R2_HSTART_0,
    OSD_R2_VSTART_0,
    OSD_R2_WIDTH_0,
    OSD_R2_HEIGHT_0,
    OSD_R2_YSTRIDE,
    OSD_R2_FONT_SIZE,
    OSD_R2_CHARMAP_CTRL,
    OSD_R2_WIN_EN,
    OSD_R2_WIN_INDEX0,
    {
    {OSD_R2_W1_HSTART_0, OSD_R2_W1_VSTART_0, OSD_R2_W1_HEND_0, OSD_R2_W1_VEND_0},
    {OSD_R2_W2_HSTART_0, OSD_R2_W2_VSTART_0, OSD_R2_W2_HEND_0, OSD_R2_W2_VEND_0},
    {OSD_R2_W3_HSTART_0, OSD_R2_W3_VSTART_0, OSD_R2_W3_HEND_0, OSD_R2_W3_VEND_0},
    {OSD_R2_W4_HSTART_0, OSD_R2_W4_VSTART_0, OSD_R2_W4_HEND_0, OSD_R2_W4_VEND_0},
    },
    OSD_R2_1BIT_FONT_BA_0,
    OSD_R2_X1BIT_FONT_BA_0,
    OSD_R2_2BIT_FONT_BA_0,
    OSD_R2_4BIT_FONT_BA_0,
    OSD_R2_ATTR_BA_0,
    OSD_R2_CCF_BA_0
    }
};

BYTE OSD_SIZE_X;
BYTE OSD_SIZE_Y;
BYTE FONT_X;
BYTE FONT_Y;
WORD AddrCCF;
WORD AddrFont1BPP;
WORD AddrFontX1BPP;
WORD AddrFont2BPP;
WORD AddrFont4BPP;
WORD AddrAttr;

BYTE RectangleID;

#define RegMaskOr(reg, mask, val)  gm_WriteRegByte(reg, (gm_ReadRegByte(reg) & ~mask)|val)
#define RegOr(reg, val)            gm_WriteRegByte(reg, gm_ReadRegByte(reg)|val)
#define RegMask(reg, mask)         gm_WriteRegByte(reg, gm_ReadRegByte(reg)&mask)
#define updateHost()               gm_WriteRegByte(HOST_CONTROL, BIT2 /*0x18*/)
#define OSDREG(reg)                OsdRegs[RectangleID].reg

static void RectSetup (void)
{
//    BYTE B_i; // index
//    WORD *Wp_addr;


    // set font size
    gm_WriteRegByte( OSDREG(OSD_FONT_SIZE), ((FONT_X-6)>>1) | ((FONT_Y-8)<<4) );

    // set ccf begin address
    gm_WriteRegWord( OSDREG(OSD_CCF_BA), AddrCCF );

    // set attribute table begin address
    gm_WriteRegWord( OSDREG(OSD_ATTR_BA), AddrAttr );

    // set 1bpp font table begin address
    gm_WriteRegWord( OSDREG(OSD_1BIT_FONT_BA), AddrFont1BPP );

    // set extended 1bpp font table begin address
    gm_WriteRegWord( OSDREG(OSD_1BITX_FONT_BA), AddrFontX1BPP );

    // set 2bpp font table begin address
    gm_WriteRegWord( OSDREG(OSD_2BIT_FONT_BA), AddrFont2BPP );

    // set 4bpp font table begin address
    gm_WriteRegWord( OSDREG(OSD_4BIT_FONT_BA), AddrFont4BPP );

    // disable hardware windows
    gm_WriteRegByte( OSDREG(OSD_WIN_EN), 0 );

    // set rectangle width
    gm_WriteRegByte( OSDREG(OSD_YSTRIDE), OSD_SIZE_X - 1 );

    updateHost();
}

// ZOOM: 0 - No zoom, 1 - 2x H, 2 - 2X V, 3 - 2X H&V
static void PositionOsd (WORD left, WORD top, BYTE Stretch)
{
    //#define PanelWidth 1024
    //#define PanelHeight 728
    WORD W_osdWidth, W_osdHeight;
    WORD W_hStart, W_vStart;
    WORD W_temp;

    RegMaskOr(OSDREG(OSD_CHARMAP_CTRL), 0xC0, (Stretch << 6) );

    W_osdWidth = (WORD)OSD_SIZE_X * FONT_X ;
    W_osdHeight = (WORD)OSD_SIZE_Y * FONT_Y;

	 W_temp = PanelWidth - W_osdWidth;
	 if (left < W_temp)
		  W_hStart = left;
    else
        W_hStart = W_temp;

    W_temp = (PanelHeight - W_osdHeight);
    if (top < W_temp)
        W_vStart = top;
    else
        W_vStart = W_temp;
    
    // set osd position
    gm_WriteRegWord(OSDREG(OSD_HSTART), W_hStart);
    gm_WriteRegWord(OSDREG(OSD_VSTART), W_vStart);
    gm_WriteRegWord(OSDREG(OSD_WIDTH), W_osdWidth);
    gm_WriteRegWord(OSDREG(OSD_HEIGHT), W_osdHeight);

    updateHost();
}

static void ShowOsd(void)
{
    if ( 0 == RectangleID )
        RegOr(OSD_ENABLES, OSD_REC1_EN);
    else
        RegOr(OSD_ENABLES, OSD_REC2_EN);
    updateHost();
}

static void HideOsd(void)
{
    if ( 0 == RectangleID )
        RegMask(OSD_ENABLES, ~OSD_REC1_EN);
    else
        RegMask(OSD_ENABLES, ~OSD_REC2_EN);

    updateHost();
}

//static void LoadCCF ( WORD addr/*byte addr*/, BYTE ROM *dat, WORD size/*bytes*/ )
//{
//    BYTE *ccfAddr = (BYTE*)addr;
//    while (size--) { *ccfAddr = *dat; ccfAddr++; dat++; }
//}


static void FillCCF (WORD ccfAddr /*byte addr*/, WORD dat, WORD size /*words*/)
{
    WORD *addr = (WORD*)ccfAddr;
    while ( size-- ) *addr++ = dat;
}

static void PutChar (BYTE x, BYTE y, WORD charidx, WORD attrib, WORD bpp )
{
    WORD *ccfAddr;
    ccfAddr = (WORD*)AddrCCF + (y * OSD_SIZE_X + x);
    *ccfAddr = (bpp<<14)|(attrib<<8)|charidx;
}


static void LoadColor(BYTE index_Table, BYTE size, BYTE ROM* pntTbl)
{
    #define CLUT_ADDRESS 0x8400
    WORD W_buflen;
    BYTE *Bp_addr;

    Bp_addr = (BYTE*)(CLUT_ADDRESS + index_Table * 4); // CLUT address

    RegMaskOr(OCM_BUS_CONTROL_0, OCM_RAM_CTRL, 0x08 );

    for(W_buflen = size; W_buflen != 0; W_buflen--)
    {
        Bp_addr[0] = pntTbl[0];
        while ( (gm_ReadRegByte(OCM_WBUF_STATUS) & 0x02) != 0 ) { continue; }// wait for OSD CLUT write operation
        Bp_addr[1] = pntTbl[1];
        while ( (gm_ReadRegByte(OCM_WBUF_STATUS) & 0x02) != 0 ) { continue; }// wait for OSD CLUT write operation
        Bp_addr[2] = pntTbl[2];
        while ( (gm_ReadRegByte(OCM_WBUF_STATUS) & 0x02) != 0 ) { continue; }// wait for OSD CLUT write operation

        pntTbl += 3;
        Bp_addr += 4;
    }

  	RegMaskOr(OCM_BUS_CONTROL_0, OCM_RAM_CTRL, 0x00 );
}

static void LoadAttribs(BYTE index, BYTE nentry, BYTE ROM* pntTbl)
{
    WORD *Wp_attr;
    // param rect needs to be removed
//    Wp_attr = (BYTE *)AddrAttr;
    Wp_attr = (WORD *)AddrAttr;
    Wp_attr += index;

    while(nentry--)
    {
        *Wp_attr++ = *pntTbl++;
    }
}

#if 0
static void SetColorWin(BYTE idWindow, BYTE color, WORD xPixel, WORD yPixel, WORD width, WORD height)
{
    BYTE shift = (idWindow << 2);

    // set color window's start-col, end-col
    if ( width ) width--;
    width += xPixel;
    gm_WriteRegWord( OSDREG(OSD_WIN_COORD)[idWindow].OSD_W_HSTART, xPixel );
    gm_WriteRegWord( OSDREG(OSD_WIN_COORD)[idWindow].OSD_W_HEND, width );

    // set color window's start-row, end-row
    if ( height ) height--;
    height += yPixel;
    gm_WriteRegWord( OSDREG(OSD_WIN_COORD)[idWindow].OSD_W_VSTART, yPixel );
    gm_WriteRegWord( OSDREG(OSD_WIN_COORD)[idWindow].OSD_W_VEND, height );

    // update color index
    gm_WriteRegWord ( OSDREG(OSD_WIN_INDEX),
        (gm_ReadRegWord(OSDREG(OSD_WIN_INDEX)) & ~((WORD)0x000f << shift)) | ((WORD)color << shift));

    // enable color window
    RegOr( OSDREG(OSD_WIN_EN), (1<<idWindow) );

    updateHost();
}

static void DelColorWIn(BYTE idWindow)
{
    // disable color window
    RegMask( OSDREG(OSD_WIN_EN), ~(1<<idWindow) );
    updateHost();
}
#endif

////////////////////////////////////////////////////////////////////////////////


static WORD BYTES_PER_FONT( BYTE bpp )
{
    WORD num;
    if ((1 == bpp)) // 1bpp or x1bpp
    {
        num = ((FONT_X < 9)? (FONT_Y+1)/2 : (FONT_X < 17)? FONT_Y     : 2 * FONT_Y);
    }
    else if (2 == bpp) // 2bpp

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?