⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 osdtest.c

📁 GM5621原代码
💻 C
📖 第 1 页 / 共 3 页
字号:
    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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -