Lcd_osd.~c
上传用户:xmyjxjd
上传日期:2013-05-04
资源大小:1517k
文件大小:106k
开发平台:

C/C++

  1. #define __OSD__
  2. #include "reg52.h" 
  3. #include "HeaderMAIN_DEF.H"
  4. #include "HeaderCONFIG.H"
  5. #include "HeaderACCESS.H"
  6. #include "HeaderLCD_FUNC.H"
  7. #include "HeaderLCD_AUTO.H"
  8. #include "HeaderLCD_MSG.H"
  9. #include "HeaderLCD_MAIN.H"
  10. #include "HeaderLCD_OSD.H"
  11. #include "HeaderFONT.H"
  12. #include "HeaderOSD.H"
  13. #include "HeaderSRC_CTRL.H"
  14. #include "HeaderOSD_TREE.H"
  15. #if (TV_CHIP != TV_NONE)
  16. #include "TUNER.H"
  17. #endif
  18. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  19. // OSD Process Dispatch Table
  20. // In this code, when input source is not VGA, AUTO CONFIG page will not be shown.
  21. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  22. unsigned char GetNextPageIdx(unsigned char ucPageCurr)
  23. {
  24.     switch (stGUD1.INPUT_SOURCE & 0x07)
  25.     {
  26.     case SOURCE_VGA :
  27.         return (6 <= ucPageCurr) ? 1 : ucPageCurr + 1;
  28.     case SOURCE_DVI :
  29.         return (6 <= ucPageCurr) ? 1 : ucPageCurr + 1;
  30.     case SOURCE_AV  :
  31.         return (5 <= ucPageCurr) ? 1 : ucPageCurr + 1;
  32.     case SOURCE_SV  :
  33.         return (5 <= ucPageCurr) ? 1 : ucPageCurr + 1;
  34.     case SOURCE_YUV :
  35.         return (5 <= ucPageCurr) ? 1 : ucPageCurr + 1;
  36.     default :
  37.         return 1;
  38.     }
  39.     
  40. }
  41. unsigned char GetPrevPageIdx(unsigned char ucPageCurr)
  42. {
  43.    switch (stGUD1.INPUT_SOURCE & 0x07)
  44.     {
  45.     case SOURCE_VGA :
  46.         return (1 >= ucPageCurr) ? 6 : ucPageCurr - 1;
  47.     case SOURCE_DVI :
  48.         return (1 >= ucPageCurr) ? 6 : ucPageCurr - 1;
  49.     case SOURCE_AV  :
  50.         return (1 >= ucPageCurr) ? 5 : ucPageCurr - 1;
  51.     case SOURCE_SV  :
  52.         return (1 >= ucPageCurr) ? 5 : ucPageCurr - 1;
  53.     case SOURCE_YUV :
  54.         return (1 >= ucPageCurr) ? 5 : ucPageCurr - 1;
  55.     default :
  56.         return 1;
  57.     }
  58. }
  59. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  60. // OSD Process Public Function
  61. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  62. //  OSD Window : Control OSD Windows
  63. //  win_no     : bit 2 ~ 0   Window Number 0 ~ 7
  64. //  row_start  : bit 10 ~ 0  Window Row Start Address
  65. //  row_end    : bit 10 ~ 0  Window Row End Address
  66. //  col_start  : bit 10 ~ 0  Window Column Start Address
  67. //  col_end    : bit 10 ~ 0  Window Column End Address
  68. //  width      : bit 2 ~ 0   shadow/border width or 3D button thickness in pixel unit 1~8 pixel
  69. //  height     : bit 2 ~ 0   shadow/border height in line unit , it must the same with width for 3D button thickness
  70. //  color      : bit 3 ~ 0   window color index in 16-color LUT
  71. //  color_sb   : bit 7 ~ 4   shadow color or left-top/bottom border color for 3D window
  72. //             : bit 3 ~ 0   border color or right-bottom/top border color
  73. //  gradient   : bit 7       R Gradient Polarity 0 : Decrease  1 : Increase
  74. //             : bit 6       G Gradient Polarity 0 : Decrease  1 : Increase
  75. //             : bit 5       B Gradient Polarity 0 : Decrease  1 : Increase
  76. //             : bit 4 ~ 3   Gradient level      00~11 : 1 step ~ 4 setp per level
  77. //             : bit 2       Enable Red Color Gradient
  78. //             : bit 1       Enable Green Color Gradient
  79. //             : bit 0       Enable Blue Color Gradient
  80. //  gra_level  : bit 2~0     111 ~ 001 : 7 level ~ 1 level per gradient, 000 : 8 level per gradient
  81. //  attr       : bit 6       1 - Enable Gradient function      0 - Disable Gradient function
  82. //             : bit 5       1 - Vertical Gradient             0 - Horizontal Gradient
  83. //             : bit 4       1 - Enable Shadow/Border/3D button   0 - Disable
  84. //             : bit 3 ~ 1   000 : Shadow Type 1
  85. //                           001 : Shadow Type 2
  86. //                           010 : Shadow Type 3
  87. //                           011 : Shadow Type 4
  88. //                           100 : 3D Button Type 1
  89. //                           101 : 3D Button Type 2
  90. //                           110 : Reserved
  91. //                           111 : Border
  92. //             : bit 0       1 - Enable Window            0 - Disable Window
  93. void OSD_Window(unsigned char win_no, unsigned int row_start, unsigned int row_end, unsigned int col_start, unsigned int col_end,
  94. unsigned char width, unsigned char height, unsigned char color, unsigned char color_sb, unsigned char gradient,
  95. unsigned char gray_level,unsigned char attr)
  96. {
  97. if(win_no > 7)  
  98. return;
  99. Data[0]     = 5;
  100. Data[1]     = Y_INC;
  101. Data[2]     = OSD_ADDR_MSB_90;
  102. Data[3]     = 0xc1;
  103. Data[4]     = (win_no << 2);
  104. Data[5]     = 0;
  105. RTDWrite(Data);
  106. Data[0]     = 6;
  107. Data[1]     = N_INC;
  108. Data[2]     = OSD_DATA_92;
  109. Data[3]     = ((width & 0x07) << 3) | (height & 0x07);
  110. Data[4]     = color_sb;
  111. Data[5]     = gradient;
  112. Data[6]     = 0;
  113. RTDWrite(Data);
  114. Data[0]     = 5;
  115. Data[1]     = Y_INC;
  116. Data[2]     = OSD_ADDR_MSB_90;
  117. Data[3]     = 0xe1;
  118. Data[4]     = (win_no << 2) + 1;
  119. Data[5]     = 0;
  120. RTDWrite(Data);
  121. Data[0]     = 9;
  122. Data[1]     = N_INC;
  123. Data[2]     = OSD_DATA_92;
  124. Data[3]     = (unsigned char)((unsigned int)(row_start & 0x003f) << 2);
  125. Data[4]     = (unsigned char)((unsigned int)(col_start & 0x0007) << 5) | 
  126.       (unsigned char)((unsigned int)(row_start & 0x07c0) >> 6);
  127. Data[5]     = (unsigned char)((unsigned int)(col_start & 0x07f8) >> 3);
  128. Data[6]     = (unsigned char)((unsigned int)(row_end & 0x003f) << 2);
  129. Data[7]    = (unsigned char)((unsigned int)(col_end & 0x0007) << 5) | 
  130.   (unsigned char)((unsigned int)(row_end & 0x07c0) >> 6);
  131. Data[8]    = (unsigned char)((unsigned int)(col_end & 0x07f8) >> 3);
  132. Data[9]     = 0;
  133. RTDWrite(Data);
  134. Delay_Xms(25);
  135. /*
  136. do
  137. {
  138. RTDRead(0x94, 0x01, Y_INC);
  139. }
  140. while( ((Data[0] >> 5) & 0x01) );
  141. */
  142. Data[0]     = 5;
  143. Data[1]     = Y_INC;
  144. Data[2]     = OSD_ADDR_MSB_90;
  145. Data[3]     = 0xc1;
  146. Data[4]     = (win_no << 2) + 3;
  147. Data[5]     = 0;
  148. RTDWrite(Data);
  149. Data[0]     = 6;
  150. Data[1]     = N_INC;
  151. Data[2]     = OSD_DATA_92;
  152. Data[3]    = 0x00;
  153. Data[4]    = (unsigned char)((gray_level & 0x07) << 4) |( color & 0x0f);
  154. Data[5]    = attr;
  155. Data[6]    = 0;
  156. RTDWrite(Data);
  157. }
  158. void Get_OSD_Margin(void)
  159. {
  160. unsigned char ucH_Min, ucH_Max, ucV_Max;
  161. #if (DISP_ALIGN)
  162. RTDRead(DH_ACT_STA_27, 0x02, Y_INC);
  163. Data[2] = Data[1] & 0x07;
  164. Data[3] = Data[0];
  165. ucH_Min = (((unsigned int *)Data)[1] / 4) + 1;
  166. ucH_Max = OSD_HMAX;
  167. #else
  168. RTDRead(DH_ACT_END_29, 0x02, Y_INC);
  169. Data[2] = Data[1] & 0x07;
  170. Data[3] = Data[0];
  171. //ucH_Max = ((((unsigned int *)Data)[1] - 312 - 8 - 16) / 4) + 1;
  172. ucH_Max = ((((unsigned int *)Data)[1] - 512) / 4) + 1; 
  173. ucH_Min = OSD_HMIN;
  174. #endif
  175. RTDRead(DV_ACT_END_34, 0x02, Y_INC);
  176. Data[2] = Data[1] & 0x07;
  177. Data[3] = Data[0];
  178. ucV_Max = (((unsigned int *)Data)[1] - DV_ACT_STA_POS - 250 - 14) / 4;
  179. Data[0] = ucH_Min;
  180. Data[1] = ucH_Max;
  181. Data[2] = OSD_VMIN;
  182. Data[3] = ucV_Max;
  183. }
  184. // OSD_Position : Restore OSD position according to global settings
  185. // para : OSD font parameter
  186. // OSD_GLOBAL_BLINK    : 0x10
  187. // OSD_DISP_ZONE_LEFT  : 0x04
  188. // OSD_DISP_ZONE_RIGHT : 0x08
  189. // OSD_ROTATE          : 0x02
  190. // OSD_ENABLE          : 0x01
  191. void OSD_Position(unsigned char para)
  192. {
  193. Get_OSD_Margin();
  194. if (Data[0] > stGUD1.OSD_POSH || Data[1] < stGUD1.OSD_POSH ||
  195. Data[2] > stGUD1.OSD_POSV || Data[3] < stGUD1.OSD_POSV)
  196. {
  197. stGUD1.OSD_POSV = OSD_VMID;
  198. stGUD1.OSD_POSH = OSD_HMID;
  199. Save_GUD1();
  200. }
  201. Wait_For_Event(EVENT_DEN_STOP);
  202. Data[0]     = 5;
  203. Data[1]     = Y_INC;
  204. Data[2]     = OSD_ADDR_MSB_90;
  205. Data[3]     = 0xc0;
  206. Data[4]     = 0x00;
  207. Data[5]     = 6;
  208. Data[6]     = N_INC;
  209. Data[7]     = OSD_DATA_92;
  210. Data[8]     = stGUD1.OSD_POSV >> 1;
  211. Data[9]     = (unsigned char)(stGUD1.OSD_POSH >> 2);
  212. Data[10]    = ((unsigned char)(stGUD1.OSD_POSH & 0x0003) << 6) | ((stGUD1.OSD_POSV & 0x01) << 5) | para;
  213. //+ (unsigned char)(OSD_Enable[10] & 0x1e) + osd_en;
  214. Data[11]    = 0;
  215. RTDWrite(Data);
  216. }
  217. void OSD_Line(unsigned char row, unsigned char col, unsigned char length,
  218.               unsigned char value, unsigned char indicate)
  219. {
  220. unsigned int idata usStart_Addr;
  221. unsigned char idata ucTemp;
  222. usStart_Addr = FONT_SELECT_ADDRESS;
  223. //The address of the first character Cn1 in Row n = FONT_SELECT_ADDRESS + Row0_length + Row1_length +...+Row(n-1)_length
  224. for(ucTemp = 1; ucTemp < row+1; ucTemp ++)
  225. usStart_Addr += Row_Info[0][ucTemp];
  226. Data[0] = 5;
  227. Data[1] = Y_INC;
  228. Data[2] = OSD_ADDR_MSB_90;
  229. if( (col+1) > Row_Info[0][row + 1]) // if column_start > row_length, then return
  230. return;
  231. else if((col + 1 + length) > Row_Info[0][row + 1]) // if column_start + length > row_length, then re-calculate the length
  232. length = Row_Info[0][row + 1] - col;
  233.     
  234. // indicate : 0, 1, 2, 3 set byte 0, 1, 2 and all byte
  235. Data[3] = (unsigned char)( ((usStart_Addr + col)  & 0x0fff) >> 8 ) | (((indicate << 2) + 1) << 4);
  236. Data[4] = (unsigned char)((usStart_Addr + col) & 0x00ff);
  237. Data[5] = 0;  
  238. RTDWrite(Data);
  239. Data[0]     = (indicate == 3) ? length * 3 + 3 : length + 3;
  240. Data[1]     = BURST; 
  241. Data[2]     = OSD_DATA_92;
  242. Data[3]     = value;
  243. Data[4]     = 0;
  244. RTDWrite(Data);
  245. }     
  246. void OSD_Slider(unsigned char row, unsigned char col, unsigned char length, unsigned char value, unsigned char range,
  247.                 unsigned char color, unsigned char color_slider)
  248. {
  249. unsigned int idata usStart_Addr;
  250. unsigned char idata ucTemp;
  251. unsigned int bound;
  252. usStart_Addr = FONT_SELECT_ADDRESS;
  253. for(ucTemp = 1; ucTemp < row+1; ucTemp ++)
  254. usStart_Addr += Row_Info[0][ucTemp];
  255. length = length -5;
  256. bound   = ((length-2)*6 + 2*3) * value;
  257. // Set color
  258. Data[0] = 6;
  259. Data[1] = Y_INC;
  260. Data[2] = OSD_ADDR_MSB_90;
  261. Data[3] = (unsigned char)((((usStart_Addr + col) >>8 ) & 0x0f ) | 0x90);
  262. Data[4] = (unsigned char)( (usStart_Addr + col) & 0x00ff);
  263. Data[5] = (color << 4) & 0xf0;
  264. Data[6] = 0;
  265. RTDWrite(Data);
  266. Data[0] = 5;
  267. Data[1] = N_INC;
  268. Data[2] = OSD_DATA_92;
  269. Data[3] = (color << 4) & 0xf0;
  270. Data[4] = (color << 4) & 0xf0;
  271. Data[5] = 0;
  272. RTDWrite(Data);
  273. OSD_Line(row,col+5,12,((color_slider<<4) & 0xf0),2);
  274. Data[0] = 6;
  275. Data[1] = Y_INC;
  276. Data[2] = OSD_ADDR_MSB_90;
  277. Data[6] = 0;
  278.   for (row = 0; row < length; row++)
  279.      {
  280. Data[3] = (unsigned char)((((usStart_Addr + col + row + 5) >> 8 ) & 0x0f ) | 0x50);
  281.      Data[4] = (unsigned char)( (usStart_Addr + col + row + 5) & 0x00ff);
  282. if( row == 0 || row == (length-1) )
  283. {
  284. if( bound )
  285. {
  286. if( bound >= (range*3) )
  287. {
  288. Data[5] = (row==0) ? 0x13 : 0x1e;
  289. bound = bound - range*3;
  290. }
  291. else
  292. {
  293.         color   = (bound << 4) / (range*3);
  294. bound = 0;
  295. if (4 > color)
  296. Data[5] = (row==0) ? 0x10 : 0x1b;
  297. else if (8 > color)
  298. Data[5] = (row==0) ? 0x11 : 0x1c;
  299. else if (12 > color)
  300. Data[5] = (row==0) ? 0x12 : 0x1d;
  301. else
  302. Data[5] = (row==0) ? 0x13 : 0x1e;
  303. }
  304. }
  305. else
  306. {
  307. Data[5] = (row==0) ? 0x10 : 0x1b;
  308. }
  309. }
  310. else
  311. {
  312. if( bound )
  313. {
  314. if( bound >= (range*6) )
  315. {
  316. Data[5] = 0x1a;
  317. bound = bound - range*6;
  318. }
  319. else
  320. {
  321. color   = (bound << 4) / (range*6);
  322. bound = 0;
  323. if (1 > color)
  324. Data[5] = 0x14;
  325. else if (4 > color)
  326. Data[5] = 0x15;
  327. else if (6 > color)
  328. Data[5] = 0x16;
  329. else if (9 > color)
  330. Data[5] = 0x17;
  331. else if (11 > color)
  332. Data[5] = 0x18;
  333. else if (14 > color)
  334. Data[5] = 0x19;
  335. else
  336. Data[5] = 0x1a;
  337. }
  338. }
  339. else
  340. {
  341. Data[5] = 0x14;
  342. }
  343. }
  344. RTDWrite(Data);
  345. }
  346. range = value / 10;
  347. row = value - (range * 10); // x1
  348. color = range / 10; // x100
  349. range = range - (color * 10); // x10
  350. row = row + 0x01;
  351. range = (range || color) ? range + 0x01 : 0x00;
  352. color = color ? color + 0x01 : 0x00;
  353. Data[0] = 5;
  354. Data[1] = Y_INC;
  355. Data[2] = OSD_ADDR_MSB_90;
  356. Data[3] = (unsigned char)((((usStart_Addr + col) >>8 ) & 0x0f ) | 0x50);
  357. Data[4] = (unsigned char)( (usStart_Addr + col ) & 0x00ff);
  358. Data[5] = 0;
  359. RTDWrite(Data);
  360. Data[0] = 6;
  361. Data[1] = N_INC;
  362. Data[2] = OSD_DATA_92;
  363. Data[3] = color; // Number x100
  364. Data[4] = range; // Number x10
  365. Data[5] = row; // Number x1
  366. Data[6] = 0;
  367. RTDWrite(Data);
  368. }
  369. void Init_Page(unsigned char index)
  370. {
  371. index = index;
  372. OSD_Position(OSD_ENABLE);
  373. OSD_Clear(5, 11, 15, 1); //Need to be modified case by case.
  374. if( ucOSD_Page_Index == 1)
  375. RTDOSDW(OSD_Window_Setting);
  376. }
  377. void Show_Osd_Page(unsigned char Page_Num,unsigned char* Page_Attr,unsigned char OSD_Table_Num)
  378. {
  379. Init_Page(Page_Num);
  380. RTDOSDW(Page_All_Atb);
  381. RTDOSDW(OSD_PAGE_All_TABLE[0][stGUD1.FUNCTION & 0x07]);
  382. RTDOSDW(Page_Attr);
  383. RTDOSDW(OSD_PAGE_TABLE[OSD_Table_Num][stGUD1.FUNCTION & 0x07]);
  384. Show_Mode();
  385. }
  386. void OSD_Clear(unsigned char row_start, unsigned char height, unsigned char col_start, unsigned char width)
  387. {
  388. width = width;
  389. if (height)
  390. {
  391. do
  392. {
  393. OSD_Line(row_start, col_start, Row_Info[0][row_start+1], 0x00, 3);
  394. //OSD_Line(row_start, col_start, width, 0x00, 3);
  395. row_start++;
  396. }
  397. while (--height);
  398. }
  399. }
  400. void Bright_Contrast_Adjust(unsigned char* variable,unsigned char Key)
  401. {
  402. if (NOTIFY_RIGHT_KEY == Key)
  403. {
  404. if (100 <= *variable)
  405. return;
  406.  
  407. if (KEY_TURBO_ENABLE > ucKey_Issued)
  408. *variable   = 100 > *variable ? *variable + 1 : 100;
  409. else
  410. *variable   = 99 > *variable ? *variable + 2 : 100;
  411. }
  412. else
  413. {
  414. if (0 == *variable)
  415. return;
  416. if (KEY_TURBO_ENABLE > ucKey_Issued)
  417. *variable   = 0 < *variable ? *variable - 1 : 0;
  418. else
  419. *variable   = 1 < *variable ? *variable - 2 : 0;
  420. }
  421. }
  422. void Osd_Change_Item(unsigned char Pess_Key,unsigned char Item_Num)
  423. {
  424. if (ucOSD_Item_Index0)
  425. {
  426. // Select and highlight the next/previous item
  427. //OSD_Window( 6, 150, 282, (54 + (ucOSD_Item_Index0-1)*(29+4)), (84 + (ucOSD_Item_Index0-1)*(29+4))
  428. // , 0, 0, 14, 251, 0, 1, 0);
  429. if (NOTIFY_RIGHT_KEY == Pess_Key)
  430. ucOSD_Item_Index0   = (Item_Num == ucOSD_Item_Index0) ? 1 : (ucOSD_Item_Index0 + 1);
  431. else
  432. ucOSD_Item_Index0   = (1 == ucOSD_Item_Index0) ? Item_Num : (ucOSD_Item_Index0 - 1);
  433. // Move window 6
  434. OSD_Window( 6, 150, 282, (54 + (ucOSD_Item_Index0-1)*(29+4)), (84 + (ucOSD_Item_Index0-1)*(29+4))
  435. , 1, 1, 14, 251, 0, 1, 25);
  436. }
  437. else
  438. {
  439. // Change to next/previous main page
  440. //OSD_Window( 5, 150, 282, (54 + (ucOSD_Page_Index-1)*(29+4)), (84 + (ucOSD_Page_Index-1)*(29+4))
  441. // , 0, 0, 14, 251, 0, 1, 0);
  442. if (NOTIFY_RIGHT_KEY == Pess_Key)
  443. ucOSD_Page_Index    = GetNextPageIdx(ucOSD_Page_Index);
  444. else
  445. ucOSD_Page_Index    = GetPrevPageIdx(ucOSD_Page_Index);
  446. }
  447. void Show_Mode(void)
  448. {
  449. unsigned int idata usStart_Addr;
  450. unsigned char idata ucTemp;
  451. OSD_Line(3, 12, 15, 0, 1);                       // Attribute
  452. usStart_Addr = FONT_SELECT_ADDRESS;
  453. //The address of the first character Cn1 in Row n = FONT_SELECT_ADDRESS + Row0_length + Row1_length +...+Row(n-1)_length
  454. for(ucTemp = 1; ucTemp < 3+1; ucTemp ++)
  455. usStart_Addr += Row_Info[0][ucTemp];
  456. Data[0] = 5;
  457. Data[1] = Y_INC;
  458. Data[2] = OSD_ADDR_MSB_90;
  459. Data[3] = (unsigned char)( (((usStart_Addr + 12)  & 0x0fff) >> 8 ) | 0x50);
  460. Data[4] = (unsigned char)( (usStart_Addr + 12) & 0x00ff);
  461. Data[5] = 0;
  462. RTDWrite(Data);
  463. switch (ucMode_Curr)
  464. {   
  465. /*
  466. case MODE_NOSIGNAL:     // NO SIGNAL
  467. OSD_Line(11, 2, 24, CHINESE_T <= (stGUD1.FUNCTION & 0x07) ? 0x80 | COLOR_BLUE : COLOR_BLUE, 0);
  468. if ((SOURCE_VGA == (stGUD1.INPUT_SOURCE & 0x07)) && (VGA_ONLINE != bVGA_CONNECT))
  469. RTDOSDW(OSD_REMK_TABLE[0][stGUD1.FUNCTION & 0x07]);
  470. else
  471. RTDOSDW(OSD_REMK_TABLE[1][stGUD1.FUNCTION & 0x07]);
  472. break;
  473. case MODE_UNDEFINED0:
  474. case MODE_UNDEFINED1:
  475. case MODE_NOSUPPORT:
  476. OSD_Line(11, 2, 24, CHINESE_T <= (stGUD1.FUNCTION & 0x07) ? 0x80 | COLOR_BLUE : COLOR_BLUE, 0);
  477. RTDOSDW(OSD_REMK_TABLE[2][stGUD1.FUNCTION & 0x07]);
  478. break;
  479. case MODE_VIDEO60HZ:    // NTSC 60HZ
  480. OSD_Line(11, 2, 24, COLOR_BLUE, 0);     // Set characters to blue
  481. RTDCodeW(Remark_Mode);
  482. switch(ucAV_Mode)
  483. {
  484. case 0x01:  RTDCodeW(Remark_V60_0); break;
  485. case 0x11:  RTDCodeW(Remark_V60_1); break;
  486. case 0x21:  RTDCodeW(Remark_V60_2); break;
  487. case 0x31:  RTDCodeW(Remark_V60_3); break;
  488. case 0x41:  RTDCodeW(Remark_V60_4); break;
  489. case 0x03:  RTDCodeW(Remark_V60_5); break;
  490. }
  491. break;
  492. case MODE_VIDEO50HZ:    // PAL 50HZ
  493. OSD_Line(11, 2, 24, COLOR_BLUE, 0);     // Set characters to blue
  494. RTDCodeW(Remark_Mode);
  495. switch(ucAV_Mode)
  496. {   
  497. case 0x02:  RTDCodeW(Remark_V50_0); break;
  498. case 0x12:  RTDCodeW(Remark_V50_1); break;
  499. case 0x22:  RTDCodeW(Remark_V50_2); break;
  500. case 0x32:  RTDCodeW(Remark_V50_3); break;
  501. case 0x03:  RTDCodeW(Remark_V50_5); break;
  502. }
  503. break;
  504. case MODE_YUV60HZ:
  505. case MODE_YUV50HZ:
  506. break;
  507. */
  508. default :
  509. //OSD_Line(11, 2, 24, COLOR_BLUE, 0);     // Set characters to blue
  510. {
  511. unsigned int    usHwid;
  512. unsigned char   ucTemp;
  513. usHwid  = usIPH_ACT_WID;
  514. if (SOURCE_VGA == (stGUD1.INPUT_SOURCE & 0x07))
  515. {
  516. if (MODE_1600x1200x60HZ == ucMode_Curr)
  517. {
  518. usHwid  = 1600;
  519. }
  520. else 
  521. {
  522. if (MODE_1600x1200x60HZ > ucMode_Curr)
  523. {
  524. if (MODE_1280x0960x60HZ <= ucMode_Curr)
  525. usHwid  = 1280;
  526. else if (MODE_1152x0864x75HZ <= ucMode_Curr)
  527. usHwid  = 1152;
  528. }
  529. else
  530. {
  531. if (MODE_USER1600x1200 == ucMode_Curr)
  532. usHwid  = 1600;
  533. else if (MODE_USER1280x960 <= ucMode_Curr)
  534. usHwid  = 1280;
  535. else if (MODE_USER1152x864 <= ucMode_Curr)
  536. usHwid  = 1152;
  537. }
  538. }
  539. }
  540. //RTDCodeW(Remark_Mode);
  541. Data[0] = 12;
  542. Data[1] = N_INC;
  543. Data[2] = OSD_DATA_92;
  544. ucTemp  = usHwid / 100;
  545. if (10 <= ucTemp)
  546. {
  547. Data[3] = _1_;
  548. Data[4] = ucTemp - 10 + _0_;
  549. }
  550. else
  551. {
  552. Data[3] = 0;
  553. Data[4] = ucTemp + _0_;
  554. }
  555. ucTemp  = usHwid - ((unsigned int)100 * ucTemp);
  556.         
  557. Data[5] = ucTemp / 10;
  558. Data[6] = ucTemp - (10 * Data[5]) + _0_;
  559. Data[5] = Data[5] + _0_;
  560. Data[7] = 0x0e;
  561. ucTemp      = usIPV_ACT_LEN / 100;
  562. Data[12]    = usIPV_ACT_LEN - ((unsigned int)100 * ucTemp);
  563. if (10 <= ucTemp)
  564. {
  565. Data[0]     = 13;
  566. Data[8]     = _1_;
  567. Data[9]     = ucTemp - 10 + _0_;
  568. Data[10]    = Data[12] / 10;
  569. Data[11]    = Data[12] - (10 * Data[10]) + _0_;
  570. Data[10]    = Data[10] + _0_;
  571. Data[12]    = 0x00;
  572. Data[13]    = 0;
  573. }
  574. else
  575. {
  576. Data[8]     = ucTemp + _0_;
  577. Data[9]     = Data[12] / 10;
  578. Data[10]    = Data[12] - (10 * Data[9]) + _0_;
  579. Data[9]     = Data[9] + _0_;
  580. Data[11]    = 0x00;
  581. Data[12]    = 0;
  582. }
  583. Data[12]    = 0;
  584. RTDWrite(Data);
  585. // Show Refresh Rate
  586. //RTDCodeW(Remark_Rate);
  587. Data[0] = 7;
  588. Data[1] = N_INC;
  589. Data[2] = OSD_DATA_92;
  590. Data[3] = ucRefresh / 10;
  591. Data[4] = ucRefresh - (Data[3] * 10) + _0_;
  592. Data[3] = Data[3] + _0_;
  593. Data[5] = 0x27;
  594. Data[6] = 0x59;
  595. Data[7] = 0;
  596. RTDWrite(Data);
  597. if (10 <= ucTemp)
  598. OSD_Line( 3, 21, 1, 0x8c, 0);
  599. else
  600. OSD_Line( 3, 20, 1, 0x8c, 0);
  601. }
  602. break;
  603. }
  604. }   
  605. void Page0_Left_Right_Key(unsigned char Key)
  606. {
  607. if(NOTIFY_RIGHT_KEY == Key)
  608. {
  609. if (SOURCE_VGA == (stGUD1.INPUT_SOURCE & 0x07) && MODE_NOSIGNAL != ucMode_Curr && MODE_NOSUPPORT != ucMode_Curr)
  610. {
  611. if (MODE_0640x0350x70HZ <= ucMode_Curr && MODE_0720x0400x70HZ >= ucMode_Curr)
  612. {
  613. stMUD.CLOCK = 128;
  614. Set_H_Position();
  615. Set_Clock();
  616. Save_MUD(ucMode_Curr);
  617. if (ERROR_INPUT == Auto_Phase())
  618. ucMode_Curr = MODE_OSDFORCE;
  619. if (ERROR_INPUT == Auto_Position())     ucMode_Curr = MODE_OSDFORCE;
  620. }
  621. else
  622. {
  623. if (ERROR_INPUT == Auto_Config())   ucMode_Curr = MODE_OSDFORCE;
  624. //if (ERROR_INPUT == Auto_Phase())   ucMode_Curr = MODE_OSDFORCE;
  625. }
  626. }
  627. }
  628. }
  629. void Page0_Enter_Key(void)
  630. {
  631. // Change to OSD Main Page 1 and Main Program will show it
  632. ucOSD_Page_Index    = 1;
  633. ucOSD_Item_Index0   = 0;
  634. ucOSD_Item_Index1   = 0;
  635. ucOSD_Item_Index2   = 0;
  636. }
  637. void Page0_LR_Key(void)
  638. {
  639. // Go to Hidden Function Page
  640. if (SOURCE_VGA == (stGUD1.INPUT_SOURCE & 0x07))
  641. {
  642. ucOSD_Page_Index    = 8;
  643. ucOSD_Item_Index0   = 1;
  644. ucOSD_Item_Index1   = 0;
  645. ucOSD_Item_Index2   = 0;
  646. }
  647. }
  648. void Page1_Enter_Key(void)
  649. {
  650. if (0 == ucOSD_Item_Index0)
  651. {
  652. if (MODE_NOSIGNAL != ucMode_Curr && MODE_NOSUPPORT != ucMode_Curr)
  653. {
  654. // Select and highlight the first item
  655. ucOSD_Item_Index0   = PAGE1_ITEM_CONTRAST;
  656. ucOSD_Item_Index1   = 0;
  657. //Enable window 6 and draw it
  658. OSD_Window( 6, 150, 282, 54, 84, 1, 1, 14, 251, 0, 1, 25);
  659. }
  660. }
  661. else
  662. {
  663. if (ucOSD_Item_Index1)
  664. {
  665. // Leave the item and reset text color
  666. switch (ucOSD_Item_Index0)
  667. {
  668. case PAGE1_ITEM_CONTRAST :
  669. // Redraw slider and make the number become black.
  670. OSD_Slider(5, 31, 17, stGUD0.CONTRAST, 100, 4, 14);
  671. break;
  672. case PAGE1_ITEM_BRIGHT :
  673. // Redraw slider and make the number become black.
  674. OSD_Slider(7, 31, 17, stGUD0.BRIGHT, 100, 4, 14);
  675. break;
  676. case PAGE1_ITEM_COLORTEMP :
  677. //Set words color to black
  678. OSD_Line( 11, 36 + (ucOSD_Item_Index1-1)*(4+1), 4, 0x40, 2);
  679. break;
  680. case PAGE1_ITEM_GAMMA :
  681. //Set words color to black
  682. OSD_Line( 9, 36 + (ucOSD_Item_Index1-1)*(2+1), 1, 0x40, 2);
  683. break;
  684. }
  685. ucOSD_Item_Index1   = 0;
  686. }
  687. else
  688. {
  689. if (PAGE1_ITEM_EXIT == ucOSD_Item_Index0)
  690. {
  691. // Disable highlight window 6
  692. OSD_Window( 6, 150, 282, (54 + (ucOSD_Item_Index0-1)*(29+4)), (84 + (ucOSD_Item_Index0-1)*(29+4))
  693. , 0, 0, 14, 251, 0, 1, 0);
  694. // De-select the page item and disable the hightlight window
  695. ucOSD_Item_Index0   = 0;
  696. ucOSD_Item_Index1   = 0;
  697. }
  698. else if (MODE_NOSIGNAL != ucMode_Curr && MODE_NOSUPPORT != ucMode_Curr)
  699. {
  700. switch (ucOSD_Item_Index0)
  701. {
  702. case PAGE1_ITEM_CONTRAST :
  703. ucOSD_Item_Index1   = 1;
  704. // Redraw slider and make the number become Red.
  705. OSD_Slider(5, 31, 17, stGUD0.CONTRAST, 100, 2, 14);
  706. break;
  707. case PAGE1_ITEM_BRIGHT :
  708. ucOSD_Item_Index1   = 1;
  709. // Redraw slider and make the number become Red.
  710. OSD_Slider(7, 31, 17, stGUD0.BRIGHT, 100, 2, 14);
  711. break;
  712. case PAGE1_ITEM_COLORTEMP :
  713. ucOSD_Item_Index1 = ((stGUD1.INPUT_SOURCE & 0x18) >> 3) + 1;
  714. //Here we can only change the color in Byte 2 for necessary words
  715. OSD_Line( 11, 36 + (ucOSD_Item_Index1-1)*(4+1), 4, 0x20, 2);
  716. break;
  717. case PAGE1_ITEM_GAMMA :
  718. ucOSD_Item_Index1   = ((stGUD1.FUNCTION >> 5) & 0x03) + 1;
  719. //Here we can only change the color in Byte 2 for necessary words
  720. OSD_Line( 9, 36 + (ucOSD_Item_Index1-1)*(2+1), 1, 0x20, 2);
  721. break;
  722. case PAGE1_ITEM_RGBADJ :
  723. OSD_Window( 6, 150, 282, (54 + (ucOSD_Item_Index0-1)*(29+4)), (84 + (ucOSD_Item_Index0-1)*(29+4))
  724. , 0, 0, 14, 251, 0, 1, 0);
  725. ucOSD_Item_Index1   = PAGE1B_ITEM_RED;
  726. ucOSD_Item_Index2   = 0;
  727. OSD_Proc_B(NOTIFY_SHOW);       // Show the sub-page
  728. break;
  729. }
  730. }
  731. }
  732. }
  733. }
  734. void Page1_Left_Right_Key(unsigned char Key)
  735. {
  736. if (ucOSD_Item_Index1)
  737. {
  738. switch (ucOSD_Item_Index0)
  739. {
  740. case PAGE1_ITEM_CONTRAST :
  741. Bright_Contrast_Adjust(&stGUD0.CONTRAST,Key);
  742. OSD_Slider(5, 31, 17, stGUD0.CONTRAST, 100, 2, 14);
  743. #if(ANALOG_CONTRAST)
  744. if((stGUD1.INPUT_SOURCE & 0x07) == SOURCE_VGA)
  745. SetADC_Gain();
  746. else
  747. Set_Bright_Contrast();
  748. #else
  749. Set_Bright_Contrast();
  750. #endif
  751. Save_GUD0();
  752. break;
  753. case PAGE1_ITEM_BRIGHT :
  754. Bright_Contrast_Adjust(&stGUD0.BRIGHT,Key);
  755. OSD_Slider(7, 31, 17, stGUD0.BRIGHT, 100, 2, 14);
  756. Set_Bright_Contrast();
  757. Save_GUD0();
  758. break;
  759. case PAGE1_ITEM_COLORTEMP:
  760. if(NOTIFY_RIGHT_KEY == Key)
  761. ucOSD_Item_Index1 = (ucOSD_Item_Index1 == 4) ? 4 : ucOSD_Item_Index1 + 1;
  762. else
  763. ucOSD_Item_Index1 = (ucOSD_Item_Index1 == 1) ? 1 : ucOSD_Item_Index1 - 1;
  764. stGUD1.INPUT_SOURCE = (stGUD1.INPUT_SOURCE & 0xe7 ) | ((ucOSD_Item_Index1 - 1) << 3);
  765. //Here we can only change the color in Byte 2 for necessary words
  766. OSD_Line( 11, 36, 20, 0x40, 2); //Set color to black
  767. OSD_Line( 11, 36 + (ucOSD_Item_Index1-1)*(4+1), 4, 0x20, 2);
  768. Set_Bright_Contrast();
  769. Save_GUD1();
  770. break;
  771. case PAGE1_ITEM_GAMMA :
  772. if (NOTIFY_RIGHT_KEY == Key)
  773. {
  774. if (4 <= ucOSD_Item_Index1)
  775. break;
  776. ucOSD_Item_Index1   = ucOSD_Item_Index1 + 1;
  777. }
  778. else
  779. {
  780. if (1 >= ucOSD_Item_Index1)
  781. break;
  782. ucOSD_Item_Index1   = ucOSD_Item_Index1 - 1;
  783. }
  784. stGUD1.FUNCTION = (stGUD1.FUNCTION & 0x9f) | ((ucOSD_Item_Index1 - 1) << 5);
  785. //Here we can only change the color in Byte 2 for necessary words
  786. OSD_Line( 9, 36, 14, 0x40, 2); //Set color to black
  787. OSD_Line( 9, 36 + (ucOSD_Item_Index1-1)*(2+1), 1, 0x20, 2);
  788. Set_Gamma();
  789. Save_GUD1();
  790. break;
  791.             
  792. }
  793. }
  794. else
  795. {
  796. Osd_Change_Item(Key,PAGE1_ITEM_NUM);
  797. }
  798. }
  799. void Page1_Show(void)
  800. {
  801. Show_Osd_Page(0,Page1_Atb,0);
  802. //Set Window 5 to select "Colour"
  803. OSD_Window( 5, 10, 136, 54, 84, 1, 1, 14, 251, 0, 1, 25);
  804. if (MODE_NOSIGNAL == ucMode_Curr || MODE_NOSUPPORT == ucMode_Curr)
  805. {
  806. ucOSD_Item_Index0   = 0;
  807. ucOSD_Item_Index1   = 0;
  808. }
  809. OSD_Slider(5, 31, 17, stGUD0.CONTRAST, 100, 4, 14);
  810. OSD_Slider(7, 31, 17, stGUD0.BRIGHT, 100, 4, 14);
  811. switch (ucOSD_Item_Index0)
  812. {
  813. case PAGE1_ITEM_CONTRAST :
  814. break;
  815. case PAGE1_ITEM_BRIGHT :
  816. break;
  817. case PAGE1_ITEM_GAMMA :
  818. break;
  819. case PAGE1_ITEM_RGBADJ :
  820. OSD_Window( 6, 150, 282, (54 + (ucOSD_Item_Index0-1)*(29+4)), (84 + (ucOSD_Item_Index0-1)*(29+4))
  821. , 1, 1, 14, 251, 0, 1, 25);
  822. break;
  823. }
  824. }
  825. void Page1B_Enter_Key(void)
  826. {
  827. ucOSD_Page_Index = 7;
  828. if (PAGE1B_ITEM_EXIT == ucOSD_Item_Index1)
  829. {
  830. // De-select the page item and disable the hightlight window
  831. OSD_Window( 6, 150, 282, (54 + (ucOSD_Item_Index0-1)*(29+4)), (84 + (ucOSD_Item_Index0-1)*(29+4))
  832. , 0, 0, 14, 251, 0, 1, 0);
  833. ucOSD_Item_Index1   = 0;
  834. ucOSD_Item_Index2   = 0;
  835. }
  836. else
  837. {
  838. if (ucOSD_Item_Index2)
  839. {
  840. ucOSD_Item_Index2   = 0; // Leave the item
  841. switch (ucOSD_Item_Index1)
  842. {
  843. case PAGE1B_ITEM_RED :
  844. OSD_Slider(5, 31, 17, stGUD0.RTD_R_CONTRAST, 100, 4, 2);
  845. break;
  846. case PAGE1B_ITEM_GREEN :
  847. OSD_Slider(7, 31, 17, stGUD0.RTD_G_CONTRAST, 100, 4, 12);
  848. break;
  849. case PAGE1B_ITEM_BLUE :
  850. OSD_Slider(9, 31, 17, stGUD0.RTD_B_CONTRAST, 100, 4, 3);
  851. break;
  852. }
  853. }
  854. else if (MODE_NOSIGNAL != ucMode_Curr && MODE_NOSUPPORT != ucMode_Curr)
  855. {
  856. ucOSD_Item_Index2   = 1; // Enter the item
  857. //Draw the selected slider
  858. switch (ucOSD_Item_Index1)
  859. {
  860. case PAGE1B_ITEM_RED :
  861. OSD_Slider(5, 31, 17, stGUD0.RTD_R_CONTRAST, 100, 2, 2);
  862. break;
  863. case PAGE1B_ITEM_GREEN :
  864. OSD_Slider(7, 31, 17, stGUD0.RTD_G_CONTRAST, 100, 12, 12);
  865. break;
  866. case PAGE1B_ITEM_BLUE :
  867. OSD_Slider(9, 31, 17, stGUD0.RTD_B_CONTRAST, 100, 3, 3);
  868. break;
  869. }
  870. }
  871. }
  872. ucOSD_Page_Index = 1;
  873. }
  874. void Page1B_Left_Right_Key(unsigned char Key)
  875. {
  876. ucOSD_Page_Index = 7;
  877. if (ucOSD_Item_Index2)
  878. {
  879. switch (ucOSD_Item_Index1)
  880. {
  881. case PAGE1B_ITEM_RED :
  882. Bright_Contrast_Adjust(&stGUD0.RTD_R_CONTRAST,Key);
  883. OSD_Slider(5, 31, 17, stGUD0.RTD_R_CONTRAST, 100, 2, 2);
  884. break;
  885. case PAGE1B_ITEM_GREEN :
  886. Bright_Contrast_Adjust(&stGUD0.RTD_G_CONTRAST,Key);
  887. OSD_Slider(7, 31, 17, stGUD0.RTD_G_CONTRAST, 100, 12, 12);
  888. break;
  889. case PAGE1B_ITEM_BLUE :
  890. Bright_Contrast_Adjust(&stGUD0.RTD_B_CONTRAST,Key);
  891. OSD_Slider(9, 31, 17, stGUD0.RTD_B_CONTRAST, 100, 3, 3);
  892. break;
  893. }
  894. Set_Bright_Contrast();
  895. Save_GUD0();
  896. }
  897. else
  898. {
  899. // Select and highlight the next/previous item
  900. if (NOTIFY_RIGHT_KEY == Key)
  901. ucOSD_Item_Index1   = (PAGE1B_ITEM_NUM == ucOSD_Item_Index1) ? 1 : (ucOSD_Item_Index1 + 1);
  902. else
  903. ucOSD_Item_Index1   = (1 == ucOSD_Item_Index1) ? PAGE1B_ITEM_NUM : (ucOSD_Item_Index1 - 1);
  904.             
  905. OSD_Window( 6, 150, 282, (54 + (ucOSD_Item_Index1-1)*(29+4)), (84 + (ucOSD_Item_Index1-1)*(29+4))
  906. , 1, 1, 14, 251, 0, 1, 25);
  907. }
  908. ucOSD_Page_Index = 1;
  909. }
  910. void Page1B_Show(void)
  911. {
  912. Show_Osd_Page(0,Page7_Atb,6);
  913. // Set window 6 to Highlight the select item
  914. OSD_Window( 6, 150, 282, 54, 84, 1, 1, 14, 251, 0, 1, 25);
  915. if (MODE_NOSIGNAL == ucMode_Curr || MODE_NOSUPPORT == ucMode_Curr)      
  916. ucOSD_Item_Index2   = 0;
  917. if (0 == ucOSD_Item_Index2)
  918. {
  919. ucOSD_Page_Index = 7;
  920. OSD_Slider(5, 31, 17, stGUD0.RTD_R_CONTRAST, 100, 4, 2);
  921. OSD_Slider(7, 31, 17, stGUD0.RTD_G_CONTRAST, 100, 4, 12);
  922. OSD_Slider(9, 31, 17, stGUD0.RTD_B_CONTRAST, 100, 4, 3);
  923. ucOSD_Page_Index = 1;
  924. }
  925. else
  926. {
  927. //Set the active slider (Red, Greed, Blue)
  928. /*
  929. OSD_Slider(11, 2, 20,
  930. (PAGE1B_ITEM_RED == ucOSD_Item_Index1) ? stGUD0.RTD_R_CONTRAST 
  931. : (PAGE1B_ITEM_GREEN == ucOSD_Item_Index1) ? stGUD0.RTD_G_CONTRAST
  932. : stGUD0.RTD_B_CONTRAST, 100, 0x61);
  933. */
  934. }
  935. }
  936. void Page2_Enter_Key()
  937. {
  938. if (0 == ucOSD_Item_Index0)
  939. {
  940. if (MODE_NOSIGNAL != ucMode_Curr && MODE_NOSUPPORT != ucMode_Curr)
  941. {
  942. // Select and highlight the first item
  943. ucOSD_Item_Index0   = PAGE2_ITEM_POSH;
  944. ucOSD_Item_Index1   = 0;
  945. //Enable Window 6 and Draw it
  946. OSD_Window( 6, 150, 282, 54, 84, 1, 1, 14, 251, 0, 1, 25);
  947. }
  948. }
  949. else
  950. {
  951. if (ucOSD_Item_Index1)
  952. {
  953. switch (ucOSD_Item_Index0)
  954. {
  955. case PAGE2_ITEM_POSH :
  956. OSD_Slider(5, 31, 17, ucH_Max_Margin - stMUD.H_POSITION, ucH_Max_Margin - ucH_Min_Margin, 4, 14);
  957. break;
  958. case PAGE2_ITEM_POSV :
  959. OSD_Slider(7, 31, 17, (unsigned int)(stMUD.V_POSITION - ucV_Min_Margin) * 50 / (128 - ucV_Min_Margin), 100, 4, 14);
  960. break;
  961. case PAGE2_ITEM_PHASE :
  962. #if(MORE_PHASE)
  963. OSD_Slider(9, 31, 17, stMUD.PHASE, 127, 4, 14);
  964. #else
  965. OSD_Slider(9, 31, 17, (stMUD.PHASE & 0x7c) >> 2, 31, 4, 14);
  966. #endif
  967. break;
  968. case PAGE2_ITEM_CLOCK :
  969. #if(ALIGN_LEFT == CLOCK_ALIGN)
  970.                     OSD_Slider(11, 31, 17, stMUD.CLOCK - 78, 100, 4, 14);
  971. #else
  972. OSD_Slider(11, 31, 17, stMUD.CLOCK - 28, 200, 4, 14);
  973. #endif
  974. break;
  975. case PAGE2_ITEM_SHARP :
  976. OSD_Line( 13, 36 + (ucOSD_Item_Index1-1)*(2+1), 1, 0x40, 2);
  977. break;
  978. }
  979. ucOSD_Item_Index1   = 0;    // Leave the item
  980. }
  981. else
  982. {
  983. if (PAGE2_ITEM_EXIT == ucOSD_Item_Index0)
  984. {
  985. // Disable Window 6 and Draw it
  986. OSD_Window( 6, 150, 282, (54 + (ucOSD_Item_Index0-1)*(29+4)), (84 + (ucOSD_Item_Index0-1)*(29+4))
  987. , 0, 0, 14, 251, 0, 1, 0);
  988. // De-select the page item and disable the hightlight window
  989. ucOSD_Item_Index0   = 0;
  990. ucOSD_Item_Index1   = 0;
  991. }
  992. else if (MODE_NOSIGNAL != ucMode_Curr && MODE_NOSUPPORT != ucMode_Curr)
  993. {
  994. if (SOURCE_VGA == (stGUD1.INPUT_SOURCE & 0x07) || PAGE2_ITEM_SHARP == ucOSD_Item_Index0)
  995. {
  996. switch (ucOSD_Item_Index0)
  997. {
  998. case PAGE2_ITEM_POSH :
  999. ucOSD_Item_Index1   = 1;    // Enter the item
  1000. OSD_Slider(5, 31, 17, ucH_Max_Margin - stMUD.H_POSITION, ucH_Max_Margin - ucH_Min_Margin, 2, 14);
  1001. break;
  1002. case PAGE2_ITEM_POSV :
  1003. ucOSD_Item_Index1   = 1;    // Enter the item
  1004. OSD_Slider(7, 31, 17, (unsigned int)(stMUD.V_POSITION - ucV_Min_Margin) * 50 / (128 - ucV_Min_Margin), 100, 2, 14);
  1005. break;
  1006. case PAGE2_ITEM_PHASE :
  1007. ucOSD_Item_Index1   = 1;    // Enter the item
  1008. #if(MORE_PHASE)
  1009. OSD_Slider(9, 31, 17, stMUD.PHASE, 127, 2, 14);
  1010. #else
  1011. OSD_Slider(9, 31, 17, (stMUD.PHASE & 0x7c) >> 2, 31, 2, 14);
  1012. #endif
  1013. break;
  1014. case PAGE2_ITEM_CLOCK :
  1015. ucOSD_Item_Index1   = 1;    // Enter the item
  1016. #if(ALIGN_LEFT == CLOCK_ALIGN)
  1017.                             OSD_Slider(11, 31, 17, stMUD.CLOCK - 78, 100, 2, 14);
  1018. #else
  1019. OSD_Slider(11, 31, 17, stMUD.CLOCK - 28, 200, 2, 14);
  1020. #endif
  1021. break;
  1022. case PAGE2_ITEM_SHARP :
  1023. ucOSD_Item_Index1   = stGUD1.FILTER + 1;
  1024. OSD_Line( 13, 36 + (ucOSD_Item_Index1-1)*(2+1), 1, 0x20, 2);
  1025. break;
  1026. }
  1027. }
  1028. }
  1029. }
  1030. }
  1031. }
  1032. void Page2_Left_Right_Key(unsigned char Key)
  1033. {
  1034. if (ucOSD_Item_Index1)
  1035. {
  1036. switch (ucOSD_Item_Index0)
  1037. {
  1038. case PAGE2_ITEM_POSH :
  1039. if (NOTIFY_RIGHT_KEY == Key)
  1040. {
  1041. if (ucH_Min_Margin >= stMUD.H_POSITION)
  1042. break;
  1043. if (KEY_TURBO_ENABLE > ucKey_Issued)
  1044. stMUD.H_POSITION    = stMUD.H_POSITION > ucH_Min_Margin ? stMUD.H_POSITION - 1 : ucH_Min_Margin;
  1045. else
  1046. stMUD.H_POSITION    = stMUD.H_POSITION > (ucH_Min_Margin + 2) ? stMUD.H_POSITION - 3 : ucH_Min_Margin;
  1047. }
  1048. else
  1049. {
  1050. if (ucH_Max_Margin <= stMUD.H_POSITION)
  1051. break;
  1052. if (KEY_TURBO_ENABLE > ucKey_Issued)
  1053. stMUD.H_POSITION    = stMUD.H_POSITION < ucH_Max_Margin ? stMUD.H_POSITION + 1 : ucH_Max_Margin;
  1054. else
  1055. stMUD.H_POSITION    = stMUD.H_POSITION < (ucH_Max_Margin - 2) ? stMUD.H_POSITION + 3 : ucH_Max_Margin;
  1056. }
  1057. OSD_Slider(5, 31, 17, ucH_Max_Margin - stMUD.H_POSITION, ucH_Max_Margin - ucH_Min_Margin, 2, 14);
  1058. Set_H_Position();
  1059. Set_Phase(stMUD.PHASE);
  1060. Save_MUD(ucMode_Curr);
  1061. break;
  1062. case PAGE2_ITEM_POSV :
  1063. if (NOTIFY_RIGHT_KEY == Key)
  1064. {
  1065. if ((unsigned int)256 - ucV_Min_Margin <= stMUD.V_POSITION)
  1066. break;
  1067. stMUD.V_POSITION    += 1;
  1068. }
  1069. else
  1070. {
  1071. if (ucV_Min_Margin >= stMUD.V_POSITION)
  1072. break;
  1073. stMUD.V_POSITION    -= 1;
  1074. }
  1075. OSD_Slider(7, 31, 17, (unsigned int)(stMUD.V_POSITION - ucV_Min_Margin) * 50 / (128 - ucV_Min_Margin), 100, 2, 14);
  1076. Set_V_Position();
  1077. Save_MUD(ucMode_Curr);
  1078. break;
  1079. case PAGE2_ITEM_PHASE :
  1080. #if(MORE_PHASE)
  1081. if (NOTIFY_RIGHT_KEY == Key)
  1082. {
  1083. if (0x7f <= stMUD.PHASE)
  1084. break;
  1085. stMUD.PHASE += 1;
  1086. }
  1087. else
  1088. {
  1089. if (0x00 == stMUD.PHASE)
  1090. break;
  1091. stMUD.PHASE -= 1;
  1092. }
  1093. OSD_Slider(9, 31, 17, stMUD.PHASE, 127, 2, 14);
  1094. #else
  1095. stMUD.PHASE     &= 0x7c;
  1096. if (NOTIFY_RIGHT_KEY == Key)
  1097. {
  1098. if (0x7c <= stMUD.PHASE)
  1099. break;
  1100. stMUD.PHASE += 4;
  1101. }
  1102. else
  1103. {
  1104. if (0x00 == stMUD.PHASE)
  1105. break;
  1106. stMUD.PHASE -= 4;
  1107. }
  1108. OSD_Slider(9, 31, 17, (stMUD.PHASE & 0x7c) >> 2, 31, 2, 14);
  1109. #endif
  1110. Set_Phase(stMUD.PHASE);
  1111. Save_MUD(ucMode_Curr);
  1112. break;
  1113. case PAGE2_ITEM_CLOCK :
  1114. #if(ALIGN_LEFT == CLOCK_ALIGN)
  1115. if (NOTIFY_RIGHT_KEY == Key)
  1116. {
  1117. if (178 <= stMUD.CLOCK)
  1118. break;
  1119. if (KEY_TURBO_ENABLE > ucKey_Issued)
  1120. stMUD.CLOCK = (177 >= stMUD.CLOCK) ? stMUD.CLOCK + 1 : 178;
  1121. else
  1122. stMUD.CLOCK = (176 >= stMUD.CLOCK) ? stMUD.CLOCK + 2 : 178;
  1123.                     
  1124. Set_Clock();
  1125. Set_H_Position();
  1126. }
  1127. else
  1128. {
  1129. if (78 >= stMUD.CLOCK)
  1130. break;
  1131. if (KEY_TURBO_ENABLE > ucKey_Issued)
  1132. stMUD.CLOCK = (79 <= stMUD.CLOCK) ? stMUD.CLOCK - 1 : 78;
  1133. else
  1134. stMUD.CLOCK = (80 <= stMUD.CLOCK) ? stMUD.CLOCK - 2 : 78;
  1135. Set_H_Position();
  1136. Set_Clock();
  1137. }
  1138. OSD_Slider(11, 31, 17, stMUD.CLOCK - 78, 100, 2, 14);
  1139. #else
  1140. if (NOTIFY_RIGHT_KEY == Key)
  1141. {
  1142. if (228 <= stMUD.CLOCK)
  1143. break;
  1144. if (KEY_TURBO_ENABLE > ucKey_Issued)
  1145. stMUD.CLOCK = (227 >= stMUD.CLOCK) ? stMUD.CLOCK + 1 : 228;
  1146. else
  1147. stMUD.CLOCK = (226 >= stMUD.CLOCK) ? stMUD.CLOCK + 2 : 228;
  1148.                     
  1149. Set_Clock();
  1150. Set_H_Position();
  1151. }
  1152. else
  1153. {
  1154. if (28 >= stMUD.CLOCK)
  1155. break;
  1156. if (KEY_TURBO_ENABLE > ucKey_Issued)
  1157. stMUD.CLOCK = (29 <= stMUD.CLOCK) ? stMUD.CLOCK - 1 : 28;
  1158. else
  1159. stMUD.CLOCK = (30 <= stMUD.CLOCK) ? stMUD.CLOCK - 2 : 28;
  1160. Set_H_Position();
  1161. Set_Clock();
  1162. }
  1163. OSD_Slider(11, 31, 17, stMUD.CLOCK - 28, 200, 2, 14);
  1164. #endif
  1165. Save_MUD(ucMode_Curr);
  1166. break;
  1167. case PAGE2_ITEM_SHARP :
  1168. if (NOTIFY_RIGHT_KEY == Key)
  1169. {
  1170. if (5 <= ucOSD_Item_Index1)
  1171. break;
  1172. ucOSD_Item_Index1   = ucOSD_Item_Index1 + 1;
  1173. }
  1174. else
  1175. {
  1176. if (1 >= ucOSD_Item_Index1)
  1177. break;
  1178. ucOSD_Item_Index1   = ucOSD_Item_Index1 - 1;
  1179. }
  1180. OSD_Line( 13, 36, 14, 0x40, 2); //Set color to black
  1181. OSD_Line( 13, 36 + (ucOSD_Item_Index1-1)*(2+1), 1, 0x20, 2);
  1182. stGUD1.FILTER    = ucOSD_Item_Index1 - 1;
  1183. Sharpness();
  1184.                 
  1185. if((usIPH_ACT_WID == 1280) && (DISP_SIZE == DISP_1280x1024) && (stGUD1.FILTER == 0x02))
  1186. RTDSetBit(SCALE_CTRL_15, 0xff, 0x01);   // Turn on H scale-up
  1187. else if((usIPH_ACT_WID == 1280) && (DISP_SIZE == DISP_1280x1024) && (stGUD1.FILTER != 0x02))
  1188. RTDSetBit(SCALE_CTRL_15, 0xfe, 0x00);   // Turn off H scale-up
  1189.                  Save_GUD1();
  1190. break;
  1191. }
  1192. }
  1193. else
  1194. {
  1195. Osd_Change_Item(Key,PAGE2_ITEM_NUM);
  1196. }
  1197. }
  1198. void Page2_Show()
  1199. {
  1200. Show_Osd_Page(1,Page2_Atb,1);
  1201. //Set Window 5 to select "Picture"
  1202. OSD_Window( 5, 10, 136, 87, 117, 1, 1, 14, 251, 0, 1, 25);
  1203. if (MODE_NOSIGNAL == ucMode_Curr || MODE_NOSUPPORT == ucMode_Curr)
  1204. {
  1205. ucOSD_Item_Index0   = 0;
  1206. ucOSD_Item_Index1   = 0;
  1207. }
  1208. if (SOURCE_VGA != (stGUD1.INPUT_SOURCE & 0x07) && PAGE2_ITEM_SHARP != ucOSD_Item_Index0)
  1209. {
  1210. ucOSD_Item_Index1   = 0;
  1211. }
  1212. if (0 == ucOSD_Item_Index1)
  1213. {
  1214. OSD_Slider(5, 31, 17, ucH_Max_Margin - stMUD.H_POSITION, ucH_Max_Margin - ucH_Min_Margin, 4, 14);
  1215. OSD_Slider(7, 31, 17, (unsigned int)(stMUD.V_POSITION - ucV_Min_Margin) * 50 / (128 - ucV_Min_Margin), 100, 4, 14);
  1216. #if(MORE_PHASE)
  1217. OSD_Slider(9, 31, 17, stMUD.PHASE, 127, 4, 14);
  1218. #else
  1219. OSD_Slider(9, 31, 17, (stMUD.PHASE & 0x7c) >> 2, 31, 4, 14);
  1220. #endif
  1221. #if(ALIGN_LEFT == CLOCK_ALIGN)
  1222.         OSD_Slider(11, 31, 17, stMUD.CLOCK - 78, 100, 4, 14);
  1223. #else
  1224. OSD_Slider(11, 31, 17, stMUD.CLOCK - 28, 200, 4, 14);
  1225. #endif
  1226. }
  1227. else
  1228. {
  1229. switch (ucOSD_Item_Index0)
  1230. {
  1231. case PAGE2_ITEM_POSH :
  1232. break;
  1233. case PAGE2_ITEM_POSV :
  1234. break;
  1235. case PAGE2_ITEM_PHASE :
  1236. break;
  1237. case PAGE2_ITEM_CLOCK :
  1238. break;
  1239. case PAGE2_ITEM_SHARP :
  1240. break;
  1241. }
  1242. }
  1243. }
  1244. bit Page3_Enter_Key(void)
  1245. {
  1246. if (0 == ucOSD_Item_Index0)
  1247. {
  1248. if ((MODE_NOSIGNAL != ucMode_Curr) && (MODE_NOSUPPORT != ucMode_Curr) && (SOURCE_VGA == (stGUD1.INPUT_SOURCE & 0x07)))
  1249. {
  1250. // Select and highlight the first item
  1251. ucOSD_Item_Index0   = PAGE3_ITEM_AUTOCFG;
  1252. ucOSD_Item_Index1   = 0;
  1253. OSD_Window( 6, 150, 282, 54, 84, 1, 1, 14, 251, 0, 1, 25);
  1254. }
  1255. }
  1256. else
  1257. {
  1258. if (PAGE3_ITEM_EXIT == ucOSD_Item_Index0)
  1259. {
  1260. // Disable highlight window
  1261. OSD_Window( 6, 150, 282, (54 + (ucOSD_Item_Index0-1)*(29+4)), (84 + (ucOSD_Item_Index0-1)*(29+4))
  1262. , 0, 0, 14, 251, 0, 1, 0);
  1263. // De-select the page item and disable the hightlight window
  1264. ucOSD_Item_Index0   = 0;
  1265. ucOSD_Item_Index1   = 0;
  1266. }
  1267. else if (ucOSD_Item_Index1)
  1268. {
  1269. if (1 == ucOSD_Item_Index1)
  1270. {
  1271. switch (ucOSD_Item_Index0)
  1272. {
  1273. case PAGE3_ITEM_AUTOCFG :
  1274. if (MODE_0640x0350x70HZ <= ucMode_Curr && MODE_0720x0400x70HZ >= ucMode_Curr)
  1275. {
  1276. unsigned char ucResult;
  1277. stMUD.CLOCK = 128;
  1278. Set_H_Position();
  1279. Set_Clock();
  1280. Save_MUD(ucMode_Curr);
  1281. ucResult    = Auto_Phase();
  1282. if (ERROR_SUCCEED == ucResult)
  1283. {
  1284. ucResult    = Auto_Position();
  1285. }
  1286. if (ERROR_INPUT == ucResult)
  1287. {
  1288. ucMode_Curr = MODE_OSDFORCE;
  1289. return 0;
  1290. }
  1291. }
  1292. else
  1293. {
  1294. if (ERROR_INPUT == Auto_Config())
  1295.                             {
  1296. ucMode_Curr = MODE_OSDFORCE;
  1297. return 0;
  1298. }
  1299. }
  1300. OSD_Line( 5, 36 + (ucOSD_Item_Index1-1)*(6+1), 4, 0x40, 2);
  1301. break;
  1302. case PAGE3_ITEM_AUTOBAL :
  1303. if (ERROR_INPUT == Auto_Balance())
  1304. {
  1305. ucMode_Curr = MODE_OSDFORCE;
  1306. return 0;
  1307. }
  1308. OSD_Line( 7, 36 + (ucOSD_Item_Index1-1)*(6+1), 4, 0x40, 2);
  1309. break;
  1310. }
  1311. }
  1312. switch (ucOSD_Item_Index0)
  1313. {
  1314. case PAGE3_ITEM_AUTOCFG :
  1315. OSD_Line( 5, 36, 14, 0x40, 2); //Set color to black
  1316. break;
  1317. case PAGE3_ITEM_AUTOBAL :
  1318. OSD_Line( 7, 36, 14, 0x40, 2); //Set color to black
  1319. break;
  1320. }
  1321. ucOSD_Item_Index1   = 0;    // Leave the item
  1322. //Show_Mode();
  1323. }
  1324. else
  1325. {
  1326. if (MODE_NOSIGNAL == ucMode_Curr || MODE_NOSUPPORT == ucMode_Curr)  
  1327. return 1;//break;
  1328. ucOSD_Item_Index1   = 2;    // Enter the item, default NO
  1329. switch (ucOSD_Item_Index0)
  1330. {
  1331. case PAGE3_ITEM_AUTOCFG :
  1332. OSD_Line( 5, 36 + (ucOSD_Item_Index1-1)*(6+1), 4, 0x20, 2);
  1333. break;
  1334. case PAGE3_ITEM_AUTOBAL :
  1335. OSD_Line( 7, 36 + (ucOSD_Item_Index1-1)*(6+1), 4, 0x20, 2);
  1336. break;
  1337. }
  1338. }
  1339. }
  1340. }
  1341. void Page3_Left_Right_Key(unsigned char Key)
  1342. {
  1343. if (ucOSD_Item_Index1)
  1344. {
  1345. ucOSD_Item_Index1   = (NOTIFY_LEFT_KEY == Key) ? 1 : 2;
  1346. switch (ucOSD_Item_Index0)
  1347. {
  1348. case PAGE3_ITEM_AUTOCFG :
  1349. OSD_Line( 5, 36, 14, 0x40, 2); //Set color to black
  1350. OSD_Line( 5, 36 + (ucOSD_Item_Index1-1)*(6+1), 4, 0x20, 2);
  1351. break;
  1352. case PAGE3_ITEM_AUTOBAL :
  1353. OSD_Line( 7, 36, 14, 0x40, 2); //Set color to black
  1354. OSD_Line( 7, 36 + (ucOSD_Item_Index1-1)*(6+1), 4, 0x20, 2);
  1355. break;
  1356. }
  1357. }
  1358. else
  1359. {
  1360. Osd_Change_Item(Key,PAGE3_ITEM_NUM);
  1361. }
  1362. }
  1363. void Page3_Show(void)
  1364. {
  1365. Show_Osd_Page(2,Page3_Atb,2);
  1366. //Set Window 5 to select "Functuin"
  1367. OSD_Window( 5, 10, 136, 120, 150, 1, 1, 14, 251, 0, 1, 25);
  1368. if (MODE_NOSIGNAL == ucMode_Curr || MODE_NOSUPPORT == ucMode_Curr)
  1369. {
  1370. ucOSD_Item_Index0   = 0;
  1371. ucOSD_Item_Index1   = 0;
  1372. }
  1373. }
  1374. void Page4_Enter_Key(void)
  1375. {
  1376. if (0 == ucOSD_Item_Index0)
  1377. {
  1378. // Select and highlight the first item
  1379. ucOSD_Item_Index0   = PAGE4_ITEM_LANGUAGE;
  1380. ucOSD_Item_Index1   = 0;
  1381. OSD_Window( 6, 150, 282, 54, 84, 1, 1, 14, 251, 0, 1, 25);
  1382. }
  1383. else
  1384. {
  1385. switch (ucOSD_Item_Index0)
  1386. {
  1387. case PAGE4_ITEM_LANGUAGE :
  1388. ucOSD_Item_Index1 = (stGUD1.FUNCTION & 0x07) + 1;
  1389. OSD_Proc_B(NOTIFY_SHOW); // Show the sub-page
  1390. break;
  1391. case PAGE4_ITEM_OSDH :
  1392. if (ucOSD_Item_Index1)
  1393. {
  1394. ucOSD_Item_Index1 = 0; // Leave the item
  1395. Get_OSD_Margin();
  1396. OSD_Slider(7, 31, 17, stGUD1.OSD_POSH - Data[0], Data[1] - Data[0], 4, 14);
  1397. }
  1398. else
  1399. {
  1400. ucOSD_Item_Index1 = 1;    // Enter the item, show slider
  1401. Get_OSD_Margin();
  1402. OSD_Slider(7, 31, 17, stGUD1.OSD_POSH - Data[0], Data[1] - Data[0], 2, 14);
  1403. }
  1404. break;
  1405. case PAGE4_ITEM_OSDV :
  1406. if (ucOSD_Item_Index1)
  1407. {
  1408. ucOSD_Item_Index1   = 0;    // Leave the item
  1409. Get_OSD_Margin();
  1410. OSD_Slider(9, 31, 17, stGUD1.OSD_POSV - Data[2], Data[3] - Data[2], 4, 14);
  1411. }
  1412. else
  1413. {
  1414. ucOSD_Item_Index1   = 1;    // Enter the item, slider
  1415. Get_OSD_Margin();
  1416. OSD_Slider(9, 31, 17, stGUD1.OSD_POSV - Data[2], Data[3] - Data[2], 2, 14);
  1417. }
  1418. break;
  1419. case PAGE4_ITEM_TIMEOUT :
  1420. if(ucOSD_Item_Index2)
  1421. {
  1422. ucOSD_Item_Index2   = 0;
  1423. ucOSD_Item_Index1   = 0;    // Leave the item
  1424. //Redraw the ON/OFF words
  1425. OSD_Line( 11, 31, 3, 0x40, 2);
  1426. OSD_Line( 11, 31, 3, 0x00, 1);
  1427. OSD_Line( 11, 36, 12, 0x8a, 0);
  1428. OSD_Line( 11, 36, 12, 0x00, 1);
  1429. switch( stGUD1.FUNCTION & 0x07 )
  1430. {
  1431. case 5:
  1432. OSD_Line( 11, 37, 1, 0x8c, 0);
  1433. OSD_Line( 11, 37, 1, 0xb3, 1);
  1434. OSD_Line( 11, 43, 1, 0x8c, 0);
  1435. OSD_Line( 11, 43, 1, 0xc9, 1);
  1436. break;
  1437. case 6:
  1438. OSD_Line( 11, 37, 1, 0x8c, 0);
  1439. OSD_Line( 11, 37, 1, 0xdb, 1);
  1440. OSD_Line( 11, 43, 1, 0x8c, 0);
  1441. OSD_Line( 11, 43, 1, 0xe5, 1);
  1442. break;
  1443. case 7:
  1444. OSD_Line( 11, 37, 1, 0x8c, 0);
  1445. OSD_Line( 11, 37, 1, 0x9b, 1);
  1446. OSD_Line( 11, 43, 1, 0x8c, 0);
  1447. OSD_Line( 11, 43, 1, 0x9c, 1);
  1448. break;
  1449. default:
  1450. OSD_Line( 11, 37, 1, 0x2e, 1);
  1451. OSD_Line( 11, 38, 1, 0x2d, 1);
  1452. OSD_Line( 11, 43, 1, 0x2e, 1);
  1453. OSD_Line( 11, 44, 2, 0x25, 1);
  1454. break;
  1455. }
  1456. OSD_Line( 11, 36, 12, 0x40, 2);
  1457. OSD_Line( 11, 35, 1, 0x00, 1);
  1458. OSD_Line( 11, 48, 1, 0x00, 1);
  1459. OSD_Window( 6, 150, 282, (54 + (ucOSD_Item_Index0-1)*(29+4)), (84 + (ucOSD_Item_Index0-1)*(29+4))
  1460. , 1, 1, 14, 251, 0, 1, 25);
  1461. }
  1462. else if (ucOSD_Item_Index1)
  1463. {
  1464. if(ucOSD_Item_Index1 == 2)
  1465. {
  1466. OSD_Line( 11, 36 + (ucOSD_Item_Index1-1)*(6+1), 3, 0x40, 2);
  1467. ucOSD_Item_Index1 = 0;
  1468. }
  1469. else
  1470. {
  1471. ucOSD_Item_Index2    = 1;
  1472. if(stGUD1.OSD_TIMEOUT < 5)
  1473. {
  1474. stGUD1.OSD_TIMEOUT = 20; //reset to 20 seconds
  1475. usOSD_Timer         = 1020; //20*51     
  1476. Save_GUD1();
  1477. }
  1478.                         
  1479. OSD_Line( 11, 36, 12, 0xe0, 2);
  1480. OSD_Line( 11, 36, 12, 0x8c, 0);
  1481. OSD_Line( 11, 35, 1, 0x40, 2);
  1482. OSD_Line( 11, 35, 1, 0x0d, 1);
  1483. OSD_Line( 11, 48, 1, 0x40, 2);
  1484. OSD_Line( 11, 48, 1, 0x0c, 1);
  1485. OSD_Slider(11, 31, 17, stGUD1.OSD_TIMEOUT, 60, 2, 14);
  1486. }
  1487. }
  1488. else
  1489. {
  1490. ucOSD_Item_Index1   = stGUD1.OSD_TIMEOUT ? 1 : 2;
  1491. OSD_Line( 11, 36 + (ucOSD_Item_Index1-1)*(6+1), 3, 0x20, 2);
  1492. }
  1493. break;
  1494. case PAGE4_ITEM_TRANSLU :
  1495. if (ucOSD_Item_Index1)
  1496. {
  1497. ucOSD_Item_Index1   = 0;    // Leave the item
  1498. OSD_Slider(13, 31, 17, (stGUD1.INPUT_SOURCE & 0xe0) >> 5, 7, 4, 14);
  1499. }
  1500. else
  1501. {
  1502. ucOSD_Item_Index1   = 1;
  1503. OSD_Slider(13, 31, 17, (stGUD1.INPUT_SOURCE & 0xe0) >> 5, 7, 2, 14);
  1504. }
  1505. break;
  1506. case PAGE4_ITEM_EXIT :
  1507. // Disable highlight window 6
  1508. OSD_Window( 6, 150, 282, (54 + (ucOSD_Item_Index0-1)*(29+4)), (84 + (ucOSD_Item_Index0-1)*(29+4))
  1509. , 0, 0, 14, 251, 0, 1, 0);
  1510. // De-select the page item and disable the hightlight window
  1511. ucOSD_Item_Index0   = 0;
  1512. ucOSD_Item_Index1   = 0;
  1513. break;
  1514. }
  1515. }
  1516. }
  1517. void Page4_Left_Right_Key(unsigned char Key)
  1518. {
  1519. if (ucOSD_Item_Index1)
  1520. {
  1521. switch (ucOSD_Item_Index0)
  1522. {
  1523. case PAGE4_ITEM_OSDH :
  1524. Get_OSD_Margin();
  1525. if (NOTIFY_RIGHT_KEY == Key)
  1526. {
  1527. if (Data[1] <= stGUD1.OSD_POSH)
  1528. break;
  1529. if (KEY_TURBO_ENABLE > ucKey_Issued)
  1530. stGUD1.OSD_POSH   = Data[1] > stGUD1.OSD_POSH ? stGUD1.OSD_POSH + 1 : Data[1];
  1531. else
  1532. stGUD1.OSD_POSH   = (Data[1] - 1) > stGUD1.OSD_POSH ? stGUD1.OSD_POSH + 2 : Data[1];
  1533. }
  1534. else
  1535. {
  1536. if (Data[0] >= stGUD1.OSD_POSH)
  1537. break;
  1538. if (KEY_TURBO_ENABLE > ucKey_Issued)
  1539. stGUD1.OSD_POSH   = Data[0] < stGUD1.OSD_POSH ? stGUD1.OSD_POSH - 1 : Data[0];
  1540. else
  1541. stGUD1.OSD_POSH   = (Data[0] + 1) < stGUD1.OSD_POSH ? stGUD1.OSD_POSH - 2 : Data[0];
  1542. }
  1543. OSD_Slider(7, 31, 17, stGUD1.OSD_POSH - Data[0], Data[1] - Data[0], 2, 14);
  1544. OSD_Position(OSD_ENABLE);
  1545. Save_GUD1();
  1546. break;
  1547. case PAGE4_ITEM_OSDV :
  1548. Get_OSD_Margin();
  1549. if (NOTIFY_RIGHT_KEY == Key)
  1550. {
  1551. if (Data[3] <= stGUD1.OSD_POSV)
  1552. break;
  1553. if (KEY_TURBO_ENABLE > ucKey_Issued)
  1554. stGUD1.OSD_POSV   = Data[3] > stGUD1.OSD_POSV ? stGUD1.OSD_POSV + 1 : Data[3];
  1555. else
  1556. stGUD1.OSD_POSV   = (Data[3] - 1) > stGUD1.OSD_POSV ? stGUD1.OSD_POSV + 2 : Data[3];
  1557. }
  1558. else
  1559. {
  1560. if (Data[2] >= stGUD1.OSD_POSV)
  1561. break;
  1562. if (KEY_TURBO_ENABLE > ucKey_Issued)
  1563. stGUD1.OSD_POSV   = Data[2] < stGUD1.OSD_POSV ? stGUD1.OSD_POSV - 1 : Data[2];
  1564. else
  1565. stGUD1.OSD_POSV   = (Data[2] + 1) < stGUD1.OSD_POSV ? stGUD1.OSD_POSV - 2 : Data[2];
  1566. }
  1567. OSD_Slider(9, 31, 17, stGUD1.OSD_POSV - Data[2], Data[3] - Data[2], 2, 14);
  1568. OSD_Position(OSD_ENABLE);
  1569. Save_GUD1();
  1570. break;
  1571. case PAGE4_ITEM_TIMEOUT :
  1572. if (NOTIFY_RIGHT_KEY == Key)
  1573. {
  1574. if(ucOSD_Item_Index2)
  1575. {
  1576. stGUD1.OSD_TIMEOUT = (stGUD1.OSD_TIMEOUT == 60) ? 60 : stGUD1.OSD_TIMEOUT + 1;
  1577. OSD_Slider(11, 31, 17, stGUD1.OSD_TIMEOUT, 60, 2, 14);
  1578. }
  1579. else if(ucOSD_Item_Index1)
  1580. {
  1581. //if (2 == ucOSD_Item_Index1)     break;
  1582. ucOSD_Item_Index1  = 2;
  1583. stGUD1.OSD_TIMEOUT  = 0;
  1584. OSD_Line( 11, 36, 14, 0x40, 2);
  1585. OSD_Line( 11, 36 + (ucOSD_Item_Index1-1)*(6+1), 3, 0x20, 2);
  1586. }
  1587. }
  1588. else
  1589. {
  1590. if(ucOSD_Item_Index2)
  1591. {
  1592. stGUD1.OSD_TIMEOUT = (stGUD1.OSD_TIMEOUT == 5) ? 5 : stGUD1.OSD_TIMEOUT - 1;
  1593. OSD_Slider(11, 31, 17, stGUD1.OSD_TIMEOUT, 60, 2, 14);
  1594. }
  1595. else if(ucOSD_Item_Index1)
  1596. {
  1597. //if (1 == ucOSD_Item_Index1)     break;
  1598. ucOSD_Item_Index1   = 1;
  1599. OSD_Line( 11, 36, 14, 0x40, 2);
  1600. OSD_Line( 11, 36 + (ucOSD_Item_Index1-1)*(6+1), 3, 0x20, 2);
  1601. }
  1602. }
  1603. usOSD_Timer         = (unsigned int)stGUD1.OSD_TIMEOUT * 51;     // 20 sec
  1604. //stGUD1.OSD_TIMEOUT  = (1 == ucOSD_Item_Index1) ? 2 : 0;
  1605. Save_GUD1();
  1606. break;
  1607. case PAGE4_ITEM_TRANSLU :
  1608. Data[0] = (stGUD1.INPUT_SOURCE & 0xe0) >> 5;
  1609. if(NOTIFY_RIGHT_KEY  == Key)
  1610. {
  1611. if(ucOSD_Item_Index1)
  1612. {
  1613. Data[0] = (Data[0] == 0x07) ? 0x07 : Data[0] + 1;
  1614. stGUD1.INPUT_SOURCE = stGUD1.INPUT_SOURCE & 0x1f | (Data[0] << 5);
  1615. }
  1616. }
  1617. else
  1618. {
  1619. if(ucOSD_Item_Index1)
  1620. {
  1621. Data[0] = (Data[0] == 0x00) ? 0x00 : Data[0] - 1;
  1622. stGUD1.INPUT_SOURCE = stGUD1.INPUT_SOURCE & 0x1f | (Data[0] << 5);
  1623. }
  1624. }
  1625. RTDSetBit(OVL_CTRL_6D, 0xc7, Data[0] << 3);
  1626. OSD_Slider(13, 31, 17, Data[0] , 7, 2, 14);
  1627. Save_GUD1();
  1628. break;
  1629. }
  1630. }
  1631. else
  1632. {
  1633. Osd_Change_Item(Key,PAGE4_ITEM_NUM);
  1634. }
  1635. }
  1636. void Page4_Show(void)
  1637. {
  1638. Show_Osd_Page(3,Page4_Atb,3);
  1639. //Set Window 5 to select "OSD Menu"
  1640. OSD_Window( 5, 10, 136, 153, 183, 1, 1, 14, 251, 0, 1, 25);
  1641. if (0 == ucOSD_Item_Index1)
  1642. {
  1643. Get_OSD_Margin();
  1644. OSD_Slider(7, 31, 17, stGUD1.OSD_POSH - Data[0], Data[1] - Data[0], 4, 14);
  1645. Get_OSD_Margin();
  1646. OSD_Slider(9, 31, 17, stGUD1.OSD_POSV - Data[2], Data[3] - Data[2], 4, 14);
  1647. OSD_Slider(13, 31, 17, (stGUD1.INPUT_SOURCE & 0xe0) >> 5, 7, 4, 14);
  1648. if( ucOSD_Item_Index0 == PAGE4_ITEM_LANGUAGE)
  1649. OSD_Window( 6, 150, 282, 54, 84, 1, 1, 14, 251, 0, 1, 25);
  1650. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x01);
  1651. }
  1652. else
  1653. {
  1654. switch (ucOSD_Item_Index0)
  1655. {
  1656. case PAGE4_ITEM_OSDH :
  1657. //Get_OSD_Margin();
  1658. //OSD_Slider(11, 2, 17, stGUD1.OSD_POSH - Data[0], Data[1] - Data[0], 0x02);
  1659. break;
  1660. case PAGE4_ITEM_OSDV :
  1661. //Get_OSD_Margin();
  1662. //OSD_Slider(11, 2, 17, stGUD1.OSD_POSV - Data[2], Data[3] - Data[2], 0x02);
  1663. break;
  1664. case PAGE4_ITEM_TIMEOUT :
  1665. //ucOSD_Item_Index1   = stGUD1.OSD_TIMEOUT ? 1 : 2;
  1666. //OSD_Line( 10, 15 + (ucOSD_Item_Index1-1)*(4+1), 4, 0x00, 2);
  1667. break;
  1668. case PAGE4_ITEM_TRANSLU :
  1669. //ucOSD_Item_Index1   = (stGUD1.INPUT_SOURCE & 0x80) ? 1 : 2;     // 1-On, 2-Off
  1670. //OSD_Line( 10, 15 + (ucOSD_Item_Index1-1)*(4+1), 4, 0x00, 2);
  1671. break;
  1672. }
  1673. }
  1674. }
  1675. void Page4B_Enter_Key(void)
  1676. {
  1677. if ((stGUD1.FUNCTION & 0x07) != (ucOSD_Item_Index1 - 1))
  1678. {
  1679. stGUD1.FUNCTION = (stGUD1.FUNCTION & 0xf8) | ((ucOSD_Item_Index1 - 1) & 0x07);
  1680. Save_GUD1();
  1681. switch (stGUD1.FUNCTION & 0x07)
  1682. {
  1683. case CHINESE_T :
  1684. case CHINESE_S :
  1685. //RTDCodeW(OSD_Reset);
  1686. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x00);
  1687. Load_VLC_Font(Font_East_C, 0x5a9, 0x45);
  1688. Page4_Show();
  1689. //RTDSetBit(OVL_CTRL_6D, 0xfe, 0x01);
  1690. //RTDCodeW(OSD_Enable);
  1691. break;
  1692. case JAPANESS :
  1693. //RTDCodeW(OSD_Reset);
  1694. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x00);
  1695. Load_VLC_Font(Font_East_J, 0x573, 0x4B);
  1696. Page4_Show();
  1697. //RTDSetBit(OVL_CTRL_6D, 0xfe, 0x01);
  1698. //RTDCodeW(OSD_Enable);
  1699. break;
  1700. default :
  1701. break;
  1702. }
  1703. }
  1704. ucOSD_Item_Index1   = 0;    // Quit Sub-Page
  1705. }
  1706. void Page4B_Left_Right_Key(unsigned char Key)
  1707. {
  1708. // Select and highlight the next/previous item
  1709. OSD_Window( 6, 150 + ((ucOSD_Item_Index1-1)/4)*170, 282 + ((ucOSD_Item_Index1-1)/4)*170, 
  1710. 54 + ((ucOSD_Item_Index1-1)%4)*33, 84 + ((ucOSD_Item_Index1-1)%4)*33, 0, 0, 14, 251, 0, 1, 0);
  1711. if (NOTIFY_RIGHT_KEY == Key)
  1712. ucOSD_Item_Index1   = (PAGE4B_ITEM_NUM == ucOSD_Item_Index1) ? 1 : (ucOSD_Item_Index1 + 1);
  1713. else
  1714. ucOSD_Item_Index1   = (1 == ucOSD_Item_Index1) ? PAGE4B_ITEM_NUM : (ucOSD_Item_Index1 - 1);
  1715. OSD_Window( 6, 150 + ((ucOSD_Item_Index1-1)/4)*170, 282 + ((ucOSD_Item_Index1-1)/4)*170, 
  1716. 54 + ((ucOSD_Item_Index1-1)%4)*33, 84 + ((ucOSD_Item_Index1-1)%4)*33, 1, 1, 14, 251, 0, 1, 25);
  1717. }
  1718. void Page4B_Show(void)
  1719. {
  1720. Show_Osd_Page(3,Page8_Atb,7);
  1721. RTDOSDW(Page8_Content);
  1722. // Set Window 6
  1723. OSD_Window( 6, 150 + ((ucOSD_Item_Index1-1)/4)*170, 282 + ((ucOSD_Item_Index1-1)/4)*170, 
  1724. 54 + ((ucOSD_Item_Index1-1)%4)*33, 84 + ((ucOSD_Item_Index1-1)%4)*33, 1, 1, 14, 251, 0, 1, 25);
  1725. }
  1726. void Page5_Enter_Key(void)
  1727. {
  1728. if (0 == ucOSD_Item_Index0)
  1729. {
  1730. // Select and highlight the first item
  1731. ucOSD_Item_Index0   = PAGE5_ITEM_SOURCE;
  1732. ucOSD_Item_Index1   = 0;
  1733. OSD_Window( 6, 150, 282, 54, 84, 1, 1, 14, 251, 0, 1, 0);
  1734. OSD_Window( 6, 150, 282, 54, 84, 1, 1, 14, 251, 0, 1, 25);
  1735. }
  1736. else
  1737. {
  1738. switch (ucOSD_Item_Index0)
  1739. {
  1740. case PAGE5_ITEM_SOURCE :
  1741. Data[0]             = stGUD1.INPUT_SOURCE & 0x07;
  1742. ucOSD_Item_Index1   = (SOURCE_DVI == Data[0])   ? PAGE5B_ITEM_DVI 
  1743. : (SOURCE_AV == Data[0])    ? PAGE5B_ITEM_CVBS 
  1744. : (SOURCE_SV == Data[0])    ? PAGE5B_ITEM_SV 
  1745. : (SOURCE_YUV == Data[0])   ? PAGE5B_ITEM_YUV 
  1746. : (SOURCE_TV == Data[0])    ? PAGE5B_ITEM_TV : PAGE5B_ITEM_DSUB;
  1747. OSD_Proc_B(NOTIFY_SHOW);   // Show the sub-page
  1748. break;
  1749. case PAGE5_ITEM_OPTION :
  1750. if (ucOSD_Item_Index1)
  1751. {
  1752. OSD_Line( 7, 36 + (ucOSD_Item_Index1-1)*(7+1), 7, 0x40, 2);
  1753. ucOSD_Item_Index1   = (1 == ucOSD_Item_Index1) ? 0x00 : 0x80;
  1754. stGUD1.INPUT_SOURCE = (stGUD1.INPUT_SOURCE & 0x7f) | ucOSD_Item_Index1;
  1755. ucOSD_Item_Index1   = 0;
  1756. Save_GUD1();
  1757. if (SOURCE_VGA == (stGUD1.INPUT_SOURCE & 0x07) && 400 == usIPV_ACT_LEN &&
  1758. MODE_0640x0400x56HZ != ucMode_Curr && MODE_USER720x400 != ucMode_Curr)
  1759. {
  1760. if (stGUD1.INPUT_SOURCE & 0x80)
  1761. {
  1762. if (720 == usIPH_ACT_WID)
  1763. ucMode_Curr = MODE_OSDFORCE;    // Force to VGA search mode again
  1764. }
  1765. else
  1766. {
  1767. if (640 == usIPH_ACT_WID)
  1768. ucMode_Curr = MODE_OSDFORCE;    // Force to VGA search mode again
  1769. }
  1770. }
  1771. }
  1772. else
  1773. {
  1774. ucOSD_Item_Index1   = (stGUD1.FUNCTION & 0x10) ? 2 : 1;     // 1-720, 2-640//(stGUD1.INPUT_SOURCE & 0x80) ? 2 : 1;     // 1-720, 2-640
  1775. OSD_Line( 7, 36 + (ucOSD_Item_Index1-1)*(7+1), 7, 0x20, 2);
  1776. }
  1777. break;
  1778. case PAGE5_ITEM_RECALL :
  1779. if (ucOSD_Item_Index1)
  1780. {
  1781. if (1 == ucOSD_Item_Index1)
  1782. {
  1783.                          {
  1784. unsigned char   ucTemp1, ucTemp2;
  1785. // Save the global settings we don't want to reset
  1786. ucTemp1 = stGUD1.FUNCTION & 0x07;       // Language select
  1787. ucTemp2 = stGUD1.INPUT_SOURCE & 0x07;   // Source select
  1788. if (JAPANESS < ucTemp1)
  1789. ucTemp1 = ENGLISH;
  1790. // Reset OSD time-out timer
  1791. usOSD_Timer = (unsigned int)2 << 9;     // 20 sec
  1792. // Reset global settings to default
  1793. Init_GUD();
  1794. // Reset OSD time-out timer
  1795. usOSD_Timer = (unsigned int)stGUD1.OSD_TIMEOUT << 9;
  1796. // Restore the global settings we don't want to reset
  1797. stGUD1.FUNCTION     = (stGUD1.FUNCTION & 0xf8) | ucTemp1;
  1798. stGUD1.INPUT_SOURCE = (stGUD1.INPUT_SOURCE & 0xf8) | ucTemp2;
  1799. Save_GUD1();
  1800. // Reset brightness and contrast to default
  1801. Set_Bright_Contrast();
  1802. #if (AUDIO_TYPE != AUDIO_NONE)
  1803. SetVolume();
  1804. #endif
  1805. // Reset OSD position
  1806. OSD_Position(OSD_ENABLE);
  1807. }
  1808. // Reset all mode settings to default
  1809. Init_MUD();
  1810. // Read default settings for current mode
  1811. Load_MUD(ucMode_Curr);
  1812. // Leave current mode and search mode again
  1813. ucMode_Curr = MODE_OSDFORCE;
  1814. }
  1815. OSD_Line( 9, 36 + (ucOSD_Item_Index1-1)*(6+1), 4, 0x40, 2);
  1816. ucOSD_Item_Index1   = 0;    // Leave the item
  1817. }
  1818. else
  1819. {
  1820. ucOSD_Item_Index1   = 2;    // Enter the item, Default NO
  1821. OSD_Line( 9, 36 + (ucOSD_Item_Index1-1)*(6+1), 4, 0x20, 2);
  1822. }
  1823. break;
  1824. case PAGE5_ITEM_VOLUME :
  1825. if (ucOSD_Item_Index1)
  1826. {
  1827. ucOSD_Item_Index1   = 0;    // Leave the item
  1828. OSD_Slider(11, 31, 17, 0x1f - stGUD3.VOLUME, 0x1f, 4, 14);
  1829. }
  1830. else
  1831. {
  1832. ucOSD_Item_Index1   = 1;    // Enter the item, show slider
  1833. stGUD3.VOLUME   &= 0x1f;
  1834. OSD_Slider(11, 31, 17, 0x1f - stGUD3.VOLUME, 0x1f, 2, 14);
  1835. }
  1836. break;
  1837. case PAGE5_ITEM_EXIT :
  1838. // Disable highlight window
  1839. OSD_Window( 6, 150, 282, (54 + (ucOSD_Item_Index0-1)*(29+4)), (84 + (ucOSD_Item_Index0-1)*(29+4))
  1840. , 0, 0, 14, 251, 0, 1, 0);
  1841. // De-select the page item and disable the hightlight window
  1842. ucOSD_Item_Index0   = 0;
  1843. ucOSD_Item_Index1   = 0;
  1844. break;
  1845. }
  1846. }
  1847. }
  1848. void Page5_Left_Right_Key(unsigned char Key)
  1849. {
  1850. if (ucOSD_Item_Index1)
  1851. {
  1852. switch (ucOSD_Item_Index0)
  1853. {
  1854. case PAGE5_ITEM_OPTION :
  1855. ucOSD_Item_Index1   = (NOTIFY_LEFT_KEY == Key) ? 2 : 1;      // 1-720, 2-640
  1856. OSD_Line( 7, 36 , 16, 0x40, 2);
  1857. OSD_Line( 7, 36 + (ucOSD_Item_Index1-1)*(7+1), 7, 0x20, 2);
  1858. //RTDOSDW((1 == ucOSD_Item_Index1) ? OSD_MODE_V720 : OSD_MODE_V640);
  1859. break;
  1860. case PAGE5_ITEM_RECALL :
  1861. ucOSD_Item_Index1   = (NOTIFY_LEFT_KEY == Key) ? 1 : 2;
  1862. OSD_Line( 9, 36 , 14, 0x40, 2);
  1863. OSD_Line( 9, 36 + (ucOSD_Item_Index1-1)*(6+1), 4, 0x20, 2);
  1864. //RTDOSDW(OSD_YESNO_TABLE[ucOSD_Item_Index1 - 1][stGUD1.FUNCTION & 0x07]);
  1865. break;
  1866. case PAGE5_ITEM_VOLUME :
  1867. if (NOTIFY_RIGHT_KEY == Key)
  1868. {
  1869. if (0x00 == stGUD3.VOLUME)
  1870. break;
  1871. stGUD3.VOLUME   = stGUD3.VOLUME - 1;
  1872. }
  1873. else
  1874. {
  1875. if (0x1f <= stGUD3.VOLUME)
  1876. break;
  1877. stGUD3.VOLUME   = stGUD3.VOLUME + 1;
  1878. }
  1879. OSD_Slider(11, 31, 17, 0x1f - stGUD3.VOLUME, 0x1f, 2, 14);
  1880. SetVolume();
  1881. Save_GUD3();
  1882. break;
  1883. default :
  1884. break;
  1885. }
  1886. }
  1887. else
  1888. {
  1889. Osd_Change_Item(Key,PAGE5_ITEM_NUM);
  1890. }
  1891. }
  1892. void Page5_Show(void)
  1893. {
  1894. Show_Osd_Page(4,Page5_Atb,4);
  1895. //Set Window 5 to select "Misc."
  1896. OSD_Window( 5, 10, 136, 186, 216, 1, 1, 14, 251, 0, 1, 25);
  1897. if (0 == ucOSD_Item_Index1)
  1898. {
  1899. Show_Mode();                // No Slider on Page
  1900. if( ucOSD_Item_Index0 == PAGE5_ITEM_SOURCE)
  1901. OSD_Window( 6, 150, 282, 54, 84, 1, 1, 14, 251, 0, 1, 25);
  1902. }
  1903. else
  1904. {
  1905. switch (ucOSD_Item_Index0)
  1906. {
  1907. case PAGE5_ITEM_OPTION :
  1908. //OSD_Line( 10, 15 + (ucOSD_Item_Index1-1)*(4+1), 4, 0x00, 2);
  1909. //RTDOSDW((1 == ucOSD_Item_Index1) ? OSD_MODE_V720 : OSD_MODE_V640);
  1910. break;
  1911. case PAGE5_ITEM_RECALL :
  1912. //OSD_Line( 10, 15 + (ucOSD_Item_Index1-1)*(4+1), 4, 0x00, 2);
  1913. //RTDOSDW(OSD_YESNO_TABLE[ucOSD_Item_Index1 - 1][stGUD1.FUNCTION & 0x07]);
  1914. break;
  1915. case PAGE5_ITEM_VOLUME :
  1916. //stGUD3.VOLUME   &= 0x1f;
  1917. //OSD_Slider(11, 2, 20, 0x1f - stGUD3.VOLUME, 0x1f, 0x61);
  1918. break;
  1919. default :
  1920. break;
  1921. }
  1922. }
  1923. }
  1924. void Page5B_Enter_Key()
  1925. {
  1926. Data[0] = (PAGE5B_ITEM_DVI == ucOSD_Item_Index1) ?  SOURCE_DVI 
  1927. : (PAGE5B_ITEM_CVBS == ucOSD_Item_Index1) ? SOURCE_AV
  1928. : (PAGE5B_ITEM_SV == ucOSD_Item_Index1) ?   SOURCE_SV 
  1929. : (PAGE5B_ITEM_YUV == ucOSD_Item_Index1) ?  SOURCE_YUV 
  1930. : (PAGE5B_ITEM_TV == ucOSD_Item_Index1) ?   SOURCE_TV : SOURCE_VGA;
  1931. if(Data[0] != ucInputSrc)
  1932. {
  1933. Change_Source(Data[0]);
  1934. ucOSD_Page_Index = 0;
  1935. }
  1936. else
  1937. {
  1938. ucOSD_Item_Index1 = 0;            // Quit Sub-Page
  1939. }
  1940. }
  1941. void Page5B_Left_Right_Key(unsigned char Key)
  1942. {
  1943. // Select and highlight the next/previous item
  1944. OSD_Window( 6, 150 + ((ucOSD_Item_Index1-1)/4)*170, 282 + ((ucOSD_Item_Index1-1)/4)*170, 
  1945. 54 + ((ucOSD_Item_Index1-1)%4)*33, 84 + ((ucOSD_Item_Index1-1)%4)*33, 0, 0, 14, 251, 0, 1, 0);
  1946. if (NOTIFY_RIGHT_KEY == Key)
  1947. ucOSD_Item_Index1   = (PAGE5B_ITEM_NUM == ucOSD_Item_Index1) ? 1 : (ucOSD_Item_Index1 + 1);
  1948. else
  1949. ucOSD_Item_Index1   = (1 == ucOSD_Item_Index1) ? PAGE5B_ITEM_NUM : (ucOSD_Item_Index1 - 1);
  1950. OSD_Window( 6, 150 + ((ucOSD_Item_Index1-1)/4)*170, 282 + ((ucOSD_Item_Index1-1)/4)*170, 
  1951. 54 + ((ucOSD_Item_Index1-1)%4)*33, 84 + ((ucOSD_Item_Index1-1)%4)*33, 1, 1, 14, 251, 0, 1, 25);
  1952. }
  1953. void Page5B_Show()
  1954. {
  1955. Show_Osd_Page(4,Page9_Atb,8);
  1956. RTDOSDW(Page9_Content);
  1957. Show_Mode();
  1958. OSD_Window( 6, 150 + ((ucOSD_Item_Index1-1)/4)*170, 282 + ((ucOSD_Item_Index1-1)/4)*170, 
  1959. 54 + ((ucOSD_Item_Index1-1)%4)*33, 84 + ((ucOSD_Item_Index1-1)%4)*33, 1, 1, 14, 251, 0, 1, 25);
  1960. // Highlight the select item
  1961. // Set Window 6
  1962. //OSD_Window( 6, 152, 282, 56, 86, 2, 2, 14, 251, 0, 1, 25);
  1963. // Don't call Show_Mode() here. Because it may use font in another page
  1964. }
  1965. void Page6_Left_Right_Key(unsigned char Key)
  1966. {
  1967. if(Key == NOTIFY_RIGHT_KEY)
  1968. ucOSD_Page_Index    = GetNextPageIdx(ucOSD_Page_Index);
  1969. else
  1970. ucOSD_Page_Index    = GetPrevPageIdx(ucOSD_Page_Index);
  1971. }
  1972. void Page6_Show(void)
  1973. {
  1974. //Init_Page(5);
  1975. //RTDOSDW(OSD_PAGE_TABLE[5][stGUD1.FUNCTION & 0x07]);
  1976. Show_Osd_Page(5,Page6_Atb,5);
  1977. //Set Window 5 to select "Exit"
  1978. OSD_Window( 5, 10, 136, 219, 249, 1, 1, 14, 251, 0, 1, 25);
  1979. Show_Mode();
  1980. }
  1981. void PageADC_Left_Right_Key(unsigned char Key)
  1982. {
  1983. if (ucOSD_Item_Index1)
  1984. {
  1985. switch (ucOSD_Item_Index0)
  1986. {
  1987. case PAGEH_ITEM_REDGAIN :
  1988. if (NOTIFY_RIGHT_KEY == Key)
  1989. {
  1990. if (0xff == stGUD2.AD_R_GAIN)
  1991. return;
  1992. stGUD2.AD_R_GAIN    += 1;
  1993. }
  1994. else
  1995. {
  1996. if (0x00 == stGUD2.AD_R_GAIN)
  1997. return;
  1998. stGUD2.AD_R_GAIN    -= 1;
  1999. }
  2000. OSD_Slider(5, 36, 17, stGUD2.AD_R_GAIN, 0xff, 2, 14);
  2001. SetADC_Gain();
  2002. break;
  2003. case PAGEH_ITEM_GREENGAIN :
  2004. if (NOTIFY_RIGHT_KEY == Key)
  2005. {
  2006. if (0xff == stGUD2.AD_G_GAIN)
  2007. return;
  2008. stGUD2.AD_G_GAIN    += 1;
  2009. }
  2010. else
  2011. {
  2012. if (0x00 == stGUD2.AD_G_GAIN)
  2013. return;
  2014. stGUD2.AD_G_GAIN    -= 1;
  2015. }
  2016. OSD_Slider(7, 36, 17, stGUD2.AD_R_GAIN, 0xff, 2, 14);
  2017. SetADC_Gain();
  2018. break;
  2019. case PAGEH_ITEM_BLUEGAIN :
  2020. if (NOTIFY_RIGHT_KEY == Key)
  2021. {
  2022. if (0xff == stGUD2.AD_B_GAIN)
  2023. return;
  2024. stGUD2.AD_B_GAIN    += 1;
  2025. }
  2026. else
  2027. {
  2028. if (0x00 == stGUD2.AD_B_GAIN)
  2029. return;
  2030. stGUD2.AD_B_GAIN    -= 1;
  2031. }
  2032. OSD_Slider(9, 36, 17, stGUD2.AD_R_GAIN, 0xff, 2, 14);
  2033. SetADC_Gain();
  2034. break;
  2035. case PAGEH_ITEM_REDOFFSET :
  2036. if (NOTIFY_RIGHT_KEY == Key)
  2037. {
  2038. if (0xff == stGUD2.AD_R_OFFSET)
  2039. return;
  2040. stGUD2.AD_R_OFFSET  += 1;
  2041. }
  2042. else
  2043. {
  2044. if (0x00 == stGUD2.AD_R_OFFSET)
  2045. return;
  2046. stGUD2.AD_R_OFFSET  -= 1;
  2047. }
  2048. OSD_Slider(11, 36, 17, stGUD2.AD_R_GAIN, 0xff, 2, 14);
  2049. SetADC_Offset();
  2050. break;
  2051. case PAGEH_ITEM_GREENOFFSET :
  2052. if (NOTIFY_RIGHT_KEY == Key)
  2053. {
  2054. if (0xff == stGUD2.AD_G_OFFSET)
  2055. return;
  2056. stGUD2.AD_G_OFFSET  += 1;
  2057. }
  2058. else
  2059. {
  2060. if (0x00 == stGUD2.AD_G_OFFSET)
  2061. return;
  2062. stGUD2.AD_G_OFFSET  -= 1;
  2063. }
  2064. OSD_Slider(13, 36, 17, stGUD2.AD_R_GAIN, 0xff, 2, 14);
  2065. SetADC_Offset();
  2066. break;
  2067. case PAGEH_ITEM_BLUEOFFSET :
  2068. if (NOTIFY_RIGHT_KEY == Key)
  2069. {
  2070. if (0xff == stGUD2.AD_B_OFFSET)
  2071. return;
  2072. stGUD2.AD_B_OFFSET  += 1;
  2073. }
  2074. else
  2075. {
  2076. if (0x00 == stGUD2.AD_B_OFFSET)
  2077. return;
  2078. stGUD2.AD_B_OFFSET  -= 1;
  2079. }
  2080. OSD_Slider(15, 36, 17, stGUD2.AD_B_OFFSET, 0xff, 2, 14);
  2081. SetADC_Offset();
  2082. break;
  2083. }
  2084. Save_GUD2();
  2085. }
  2086. else
  2087. {
  2088. if (ucOSD_Item_Index0)
  2089. {
  2090. // Select and highlight the next/previous item
  2091. if (NOTIFY_RIGHT_KEY == Key)
  2092. ucOSD_Item_Index0   = (PAGEH_ITEM_NUM == ucOSD_Item_Index0) ? 1 : (ucOSD_Item_Index0 + 1);
  2093. else
  2094. ucOSD_Item_Index0   = (1 == ucOSD_Item_Index0) ? PAGEH_ITEM_NUM : (ucOSD_Item_Index0 - 1);
  2095. OSD_Window( 6, 0, 476, 0, 252, 4, 4, 0, 1, 231, 1, 113);
  2096. }
  2097. }
  2098. }
  2099. void PageADC_Enter_Key(void)
  2100. {
  2101. if (0 == ucOSD_Item_Index0)
  2102. {
  2103. // Select and highlight the first item
  2104. ucOSD_Item_Index0   = PAGEH_ITEM_REDGAIN;
  2105. ucOSD_Item_Index1   = 0;
  2106. OSD_Window( 6, 152, 282, 56, 86, 2, 2, 14, 251, 0, 1, 25);
  2107. }
  2108. else
  2109. {
  2110. if (PAGEH_ITEM_EXIT == ucOSD_Item_Index0)
  2111. {                
  2112. ucOSD_Page_Index    = 0;        // Close OSD
  2113. }
  2114. else
  2115. {
  2116. if (ucOSD_Item_Index1)
  2117. {
  2118. ucOSD_Item_Index1   = 0;    // Leave the item, Show Mode
  2119. RTDOSDW(OSD_Version);
  2120. }
  2121. else
  2122. {
  2123. ucOSD_Item_Index1   = 1;    // Enter the item, Show slider
  2124. switch (ucOSD_Item_Index0)
  2125. {
  2126. case PAGEH_ITEM_REDGAIN :
  2127. OSD_Slider(5, 36, 17, stGUD2.AD_B_OFFSET, 0xff, 2, 14);
  2128. break;
  2129. case PAGEH_ITEM_GREENGAIN :
  2130. OSD_Slider(7, 36, 17, stGUD2.AD_B_OFFSET, 0xff, 2, 14);
  2131. break;
  2132. case PAGEH_ITEM_BLUEGAIN :
  2133. OSD_Slider(9, 36, 17, stGUD2.AD_B_OFFSET, 0xff, 2, 14);
  2134. break;
  2135. case PAGEH_ITEM_REDOFFSET :
  2136. OSD_Slider(11, 36, 17, stGUD2.AD_B_OFFSET, 0xff, 2, 14);
  2137. break;
  2138. case PAGEH_ITEM_GREENOFFSET :
  2139. OSD_Slider(13, 36, 17, stGUD2.AD_B_OFFSET, 0xff, 2, 14);
  2140. break;
  2141. case PAGEH_ITEM_BLUEOFFSET :
  2142. OSD_Slider(15, 36, 17, stGUD2.AD_B_OFFSET, 0xff, 2, 14);
  2143. break;
  2144. }
  2145. }
  2146. }
  2147. }
  2148. }
  2149. void PageADC_Show(void)
  2150. {
  2151. Init_Page(0);
  2152. RTDOSDW(PageADC_Atb);
  2153. RTDOSDW(PageADC_ENG);
  2154. // Highlight the select item
  2155. //OSD_Window( 5, 0, 476, 0, 252, 4, 4, 0, 1, 231, 1, 113); //Set Window 5
  2156. if (0 == ucOSD_Item_Index1)
  2157. {
  2158. RTDOSDW(OSD_Version);
  2159. }
  2160. else
  2161. {
  2162. switch (ucOSD_Item_Index0)
  2163. {
  2164. case PAGEH_ITEM_REDGAIN :
  2165. OSD_Slider(5, 36, 17, stGUD2.AD_B_OFFSET, 0xff, 4, 14);
  2166. break;
  2167. case PAGEH_ITEM_GREENGAIN :
  2168. OSD_Slider(7, 36, 17, stGUD2.AD_B_OFFSET, 0xff, 4, 14);
  2169. break;
  2170. case PAGEH_ITEM_BLUEGAIN :
  2171. OSD_Slider(9, 36, 17, stGUD2.AD_B_OFFSET, 0xff, 4, 14);
  2172. break;
  2173. case PAGEH_ITEM_REDOFFSET :
  2174. OSD_Slider(11, 36, 17, stGUD2.AD_B_OFFSET, 0xff, 4, 14);
  2175. break;
  2176. case PAGEH_ITEM_GREENOFFSET :
  2177. OSD_Slider(13, 36, 17, stGUD2.AD_B_OFFSET, 0xff, 4, 14);
  2178. break;
  2179. case PAGEH_ITEM_BLUEOFFSET :
  2180. OSD_Slider(15, 36, 17, stGUD2.AD_B_OFFSET, 0xff, 4, 14);
  2181. break;
  2182. }
  2183. }
  2184. }
  2185. unsigned char Page1_Goto_Subpage(unsigned char Key)
  2186. {
  2187. if (PAGE1_ITEM_RGBADJ == ucOSD_Item_Index0 && ucOSD_Item_Index1)
  2188. {
  2189. if (MODE_NOSIGNAL == ucMode_Curr || MODE_NOSUPPORT == ucMode_Curr)
  2190. {
  2191. ucOSD_Item_Index1   = 0;
  2192. ucOSD_Item_Index2   = 0;
  2193. }
  2194. else
  2195. {
  2196. // When RGB adjust sub-page is open, just re-direct the message to the sub-page process
  2197. OSD_Proc_B(Key);
  2198. }
  2199. if (ucOSD_Item_Index1)  
  2200. return  0; // RGB adjust sub-Page still in work
  2201. ucOSD_Item_Index2   = 0;
  2202. //Key  = NOTIFY_SHOW;  // Redraw itself when returned from sub-page
  2203. return 1;
  2204. }
  2205. return 2;
  2206. }
  2207. unsigned char Page4_Goto_Subpage(unsigned char Key)
  2208. {
  2209. if (PAGE4_ITEM_LANGUAGE == ucOSD_Item_Index0 && 0 != ucOSD_Item_Index1)
  2210. {
  2211. if (NOTIFY_SHOW != Key)
  2212. {
  2213. // When language setting sub-page is open, just re-direct the message to the sub-page process
  2214. OSD_Proc_B(Key);
  2215. if (ucOSD_Item_Index1)  
  2216. return 0;     // Language Setting Sub-Page still in work
  2217. //action  = NOTIFY_SHOW;              // Redraw itself when returned from sub-page
  2218. return 1;
  2219. }
  2220. else
  2221. {
  2222. // Quit language sub-page if signal changed.
  2223. ucOSD_Item_Index1   = 0;
  2224. }
  2225. }
  2226. return 2;
  2227. }
  2228. unsigned char Page5_Goto_Subpage(unsigned char Key)
  2229. {
  2230. if (PAGE5_ITEM_SOURCE == ucOSD_Item_Index0 && 0 != ucOSD_Item_Index1)
  2231. {
  2232. if (NOTIFY_SHOW != Key)
  2233. {
  2234. // When source select sub-page is open, just re-direct the message to the sub-page process
  2235. OSD_Proc_B(Key);
  2236. if (ucOSD_Item_Index1)  return 0;     // Source select sub-Page still in work
  2237. //action  = NOTIFY_SHOW;              // Redraw itself when returned from sub-page
  2238. return 1;
  2239. }
  2240. else
  2241. {
  2242. // Quit source select sub-page if signal changed.
  2243. ucOSD_Item_Index1   = 0;
  2244. }
  2245. }
  2246. return 2;
  2247. }
  2248. #if(VIDEO_CHIP != VDC_NONE)
  2249. void PageVDC_Enter_Key(void)
  2250. {
  2251.            if (0 == ucOSD_Item_Index0)
  2252.         {
  2253.             // Select and highlight the first item
  2254.             ucOSD_Item_Index0   = PAGEV_ITEM_CONTRAST;
  2255.             ucOSD_Item_Index1   = 0;
  2256.             //OSD_Window(1, (2 + ucOSD_Item_Index0), (2 + ucOSD_Item_Index0), 7, 23, 7, COLOR_CYAN);
  2257.             OSD_Window( 5, 10, 136, 54, 84, 1, 1, 14, 251, 0, 1, 25);
  2258.         }
  2259.         else
  2260.         {
  2261.             if (PAGEV_ITEM_EXIT == ucOSD_Item_Index0)
  2262.             {                
  2263.                 ucOSD_Page_Index    = 0;        // Close OSD
  2264.             }
  2265.             else
  2266.             {
  2267.                 if (ucOSD_Item_Index1)
  2268.                 {
  2269.                     ucOSD_Item_Index1   = 0;    // Leave the item, Show Mode
  2270.                     
  2271.                     RTDOSDW(OSD_Version);
  2272.                 }
  2273.                 else    // if (MODE_NOSIGNAL != ucMode_Curr && MODE_NOSUPPORT != ucMode_Curr)
  2274.                 {
  2275.                     ucOSD_Item_Index1   = 1;    // Enter the item, Show slider
  2276.                     switch (ucOSD_Item_Index0)
  2277.                     {
  2278.                     case PAGEV_ITEM_CONTRAST :
  2279.                         //OSD_Slider(11, 2, 20, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VCONTRAST, 0xff, 0x61);
  2280.                         OSD_Slider(11, 36, 17, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VCONTRAST, 0xff, 2, 14);
  2281.                         break;
  2282.                     case PAGEV_ITEM_BRIGHT :
  2283.                         //OSD_Slider(11, 2, 20, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VBRIGHT, 0xff, 0x61);
  2284.                         OSD_Slider(11, 36, 17, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VBRIGHT, 0xff, 2, 14);
  2285.                         break;
  2286.                     case PAGEV_ITEM_HUE :
  2287.                         //OSD_Slider(11, 2, 20, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VHUE, 0xff, 0x61);
  2288.                         OSD_Slider(11, 36, 17, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VHUE, 0xff, 2, 14);
  2289.                         break;
  2290.                     case PAGEV_ITEM_SATURATION :
  2291.                         //OSD_Slider(11, 2, 20, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VSATURATION, 0xff, 0x61);
  2292.                         OSD_Slider(11, 36, 17, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VSATURATION, 0xff, 2, 14);
  2293.                         break;
  2294.                     }
  2295.                 }
  2296.             }
  2297.         }
  2298. }
  2299. void PageVDC_Left_Right_Key(unsigned char Key)
  2300. {
  2301.    if (ucOSD_Item_Index1)
  2302.         {
  2303.             switch (ucOSD_Item_Index0)
  2304.             {            
  2305.             case PAGEV_ITEM_CONTRAST :
  2306.                 if (NOTIFY_RIGHT_KEY == Key)
  2307.                 {
  2308.                     if (0xff == ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VCONTRAST)   return;
  2309.                     ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VCONTRAST    += 1;
  2310.                 }
  2311.                 else
  2312.                 {
  2313.                     if (0x00 == ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VCONTRAST)   return;
  2314.                     ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VCONTRAST    -= 1;
  2315.                 }
  2316.                 //OSD_Slider(11, 2, 20, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VCONTRAST, 0xff, 0x61);
  2317.                 OSD_Slider(11, 36, 17, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VCONTRAST, 0xff, 2, 14);
  2318.                 break;
  2319.             case PAGEV_ITEM_BRIGHT :
  2320.                 if (NOTIFY_RIGHT_KEY == Key)
  2321.                 {
  2322.                     if (0xff == ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VBRIGHT)     return;
  2323.                     ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VBRIGHT  += 1;
  2324.                 }
  2325.                 else
  2326.                 {
  2327.                     if (0x00 == ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VBRIGHT)     return;
  2328.                     ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VBRIGHT  -= 1;
  2329.                 }
  2330.                 //OSD_Slider(11, 2, 20, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VBRIGHT, 0xff, 0x61);
  2331.                 OSD_Slider(11, 36, 17, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VBRIGHT, 0xff, 2, 14);
  2332.                 break;
  2333.             case PAGEV_ITEM_HUE :
  2334.                 if (NOTIFY_RIGHT_KEY == Key)
  2335.                 {
  2336.                     if (0xff == ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VHUE)        return;
  2337.                     ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VHUE += 1;
  2338.                 }
  2339.                 else
  2340.                 {
  2341.                     if (0x00 == ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VHUE)        return;
  2342.                     ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VHUE -= 1;
  2343.                 }
  2344.                 //OSD_Slider(11, 2, 20, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VHUE, 0xff, 0x61);
  2345.                 OSD_Slider(11, 36, 17, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VHUE, 0xff, 2, 14);
  2346.                 break;
  2347.             case PAGEV_ITEM_SATURATION :
  2348.                 if (NOTIFY_RIGHT_KEY == Key)
  2349.                 {
  2350.                     if (0xff == ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VSATURATION)     return;
  2351.                     ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VSATURATION  += 1;
  2352.                 }
  2353.                 else
  2354.                 {
  2355.                     if (0x00 == ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VSATURATION)     return;
  2356.                     ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VSATURATION  -= 1;
  2357.                 }
  2358.                 //OSD_Slider(11, 2, 20, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VSATURATION, 0xff, 0x61);
  2359.                 OSD_Slider(11, 36, 17, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VSATURATION, 0xff, 2, 14);
  2360.                 break;
  2361.             }
  2362.             SetVDC_Color();
  2363.             Save_MUD(ucMode_Curr);
  2364.         }
  2365.         else
  2366.         {
  2367.             if (ucOSD_Item_Index0)
  2368.             {
  2369.                 // Select and highlight the next/previous item
  2370.                 if (NOTIFY_RIGHT_KEY == Key)
  2371.                     ucOSD_Item_Index0   = (PAGEV_ITEM_NUM == ucOSD_Item_Index0) ? 1 : (ucOSD_Item_Index0 + 1);
  2372.                 else
  2373.                     ucOSD_Item_Index0   = (1 == ucOSD_Item_Index0) ? PAGEV_ITEM_NUM : (ucOSD_Item_Index0 - 1);
  2374.                 //OSD_Window(1, (2 + ucOSD_Item_Index0), (2 + ucOSD_Item_Index0), 7, 23, 7, COLOR_CYAN);
  2375.                   Osd_Change_Item(Key,PAGEV_ITEM_NUM);
  2376.             }
  2377.         }
  2378. }
  2379. void PageVDC_Show(void)
  2380. {
  2381.           Init_Page(0);
  2382.         RTDOSDW(PageVDC_Atb);
  2383.         RTDOSDW(PageVDC_ENG);
  2384.         // Highlight the select item
  2385.         //OSD_Window(1, (2 + ucOSD_Item_Index0), (2 + ucOSD_Item_Index0), 7, 23, (ucOSD_Item_Index0 ? 7 : 3), COLOR_CYAN);
  2386.         OSD_Window( 5, 10, 136, 54, 84, 1, 1, 14, 251, 0, 1, 25);
  2387.         if (0 == ucOSD_Item_Index1)
  2388.         {
  2389.             RTDOSDW(OSD_Version);
  2390.         }
  2391.         else
  2392.         {
  2393.             switch (ucOSD_Item_Index0)
  2394.             {
  2395.             case PAGEV_ITEM_CONTRAST :
  2396.                 //OSD_Slider(11, 2, 20, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VCONTRAST, 0xff, 0x61);
  2397.                 OSD_Slider(11, 36, 17, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VCONTRAST, 0xff, 2, 14);
  2398.                 break;
  2399.             case PAGEV_ITEM_BRIGHT :
  2400.                 //OSD_Slider(11, 2, 20, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VBRIGHT, 0xff, 0x61);
  2401.                 OSD_Slider(11, 36, 17, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VBRIGHT, 0xff, 2, 14);
  2402.                 break;
  2403.             case PAGEV_ITEM_HUE :
  2404.                 //OSD_Slider(11, 2, 20, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VHUE, 0xff, 0x61);
  2405.                 OSD_Slider(11, 36, 17, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VHUE, 0xff, 2, 14);
  2406.                 break;
  2407.             case PAGEV_ITEM_SATURATION :
  2408.                 //OSD_Slider(11, 2, 20, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VSATURATION, 0xff, 0x61);
  2409.                 OSD_Slider(11, 36, 17, ((LP_VIDEO_MODE_USER_DATA)&stMUD)->VSATURATION, 0xff, 2, 14);
  2410.                 break;
  2411.             }
  2412.         }
  2413. }
  2414. #endif
  2415. unsigned char Sub_Page_Process(unsigned char Key)
  2416. {
  2417. unsigned char ucTemp = 2;
  2418. switch(ucOSD_Page_Index)
  2419. {
  2420. case 1:
  2421. ucTemp = Page1_Goto_Subpage(Key); 
  2422. break;
  2423. case 4:
  2424. ucTemp = Page4_Goto_Subpage(Key);
  2425. break;
  2426. case 5:
  2427. ucTemp = Page5_Goto_Subpage(Key);
  2428. break;
  2429. default:
  2430. break;
  2431. }
  2432. return ucTemp;
  2433. }
  2434. void Enter_Key_Process(void)
  2435. {
  2436. switch(ucOSD_Page_Index)
  2437. {
  2438. case 0:
  2439. Page0_Enter_Key();
  2440. break;
  2441. case 1:
  2442. Page1_Enter_Key();
  2443. break;
  2444. case 2:
  2445. Page2_Enter_Key();
  2446. break;
  2447. case 3:
  2448. if(Page3_Enter_Key())  
  2449. break;
  2450. else
  2451. return;
  2452. break;
  2453. case 4:
  2454. Page4_Enter_Key();
  2455. break;
  2456. case 5:
  2457. Page5_Enter_Key();
  2458. break;
  2459. case 6:
  2460. // Just set ucOSD_Page_Index to 0 and wait for main program to clear screen
  2461. ucOSD_Page_Index    = 0;
  2462. break;
  2463. case 8:
  2464. if((stGUD1.INPUT_SOURCE & 0x07) == SOURCE_VGA)
  2465. PageADC_Enter_Key();
  2466. #if(VIDEO_CHIP != VDC_NONE)
  2467. else
  2468. PageVDC_Enter_Key();
  2469. #endif
  2470. break;
  2471. }
  2472. }
  2473. void Enter_Key_B_Process(void)
  2474. {
  2475. switch(ucOSD_Page_Index)
  2476. {
  2477. case 1:
  2478. Page1B_Enter_Key();
  2479. break;
  2480. case 4:
  2481. Page4B_Enter_Key();
  2482. break;
  2483. case 5:    
  2484. Page5B_Enter_Key();
  2485. break;
  2486. }
  2487. }
  2488. void Left_Right_Key_Process(unsigned char Key)
  2489. {
  2490. switch(ucOSD_Page_Index)
  2491. {
  2492. case 0:
  2493. Page0_Left_Right_Key(Key);
  2494. break;
  2495. case 1:        
  2496. Page1_Left_Right_Key(Key);
  2497. break;
  2498. case 2:        
  2499. Page2_Left_Right_Key(Key);
  2500. break;
  2501. case 3:        
  2502. Page3_Left_Right_Key(Key);
  2503. break;
  2504. case 4:        
  2505. Page4_Left_Right_Key(Key);
  2506. break;
  2507. case 5:        
  2508. Page5_Left_Right_Key(Key);
  2509. break;
  2510. case 6:        
  2511. Page6_Left_Right_Key(Key);
  2512. break;
  2513. case 8:
  2514. if((stGUD1.INPUT_SOURCE & 0x07) == SOURCE_VGA)
  2515. PageADC_Left_Right_Key(Key);
  2516. #if(VIDEO_CHIP != VDC_NONE)
  2517. else
  2518. PageVDC_Left_Right_Key(Key);
  2519. #endif
  2520. break;
  2521. }
  2522. }
  2523. void Left_Right_Key_B_Process(unsigned char Key)
  2524. {
  2525. switch(ucOSD_Page_Index)
  2526. {
  2527. case 1:      
  2528. Page1B_Left_Right_Key(Key);
  2529. break;
  2530. case 4:      
  2531. Page4B_Left_Right_Key(Key);
  2532. break;
  2533. case 5:      
  2534. Page5B_Left_Right_Key(Key);
  2535. break;
  2536. }
  2537. }
  2538. void Show_Process(void)
  2539. {
  2540. switch(ucOSD_Page_Index)
  2541. {
  2542. case 1:      
  2543. Page1_Show();
  2544. break;
  2545. case 2:      
  2546. Page2_Show();
  2547. break;
  2548. case 3:      
  2549. Page3_Show();
  2550. break;
  2551. case 4:      
  2552. Page4_Show();
  2553. break;
  2554. case 5:      
  2555. Page5_Show();
  2556. break;
  2557. case 6:      
  2558. Page6_Show();
  2559. break;
  2560. case 8:
  2561. if((stGUD1.INPUT_SOURCE & 0x07) == SOURCE_VGA)
  2562. PageADC_Show();
  2563. #if(VIDEO_CHIP != VDC_NONE)
  2564. else
  2565. PageVDC_Show();
  2566. #endif
  2567. break;
  2568. }
  2569. }
  2570. void Show_B_Process(void)
  2571. {
  2572. switch(ucOSD_Page_Index)
  2573. {
  2574. case 1:
  2575. Page1B_Show();
  2576. break;
  2577. case 4:     
  2578. Page4B_Show();
  2579. break;
  2580. case 5:     
  2581. Page5B_Show();
  2582. break;
  2583. }
  2584. }
  2585. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2586. // OSD Process Routine
  2587. //////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2588. // In all OSD main page process, you CANNOT call other main page process directly.
  2589. // You CAN only change ucOSD_Page_Index to indicate other main page.
  2590. // Main program will detect the change of ucOSD_Page_Index and send NOTIFY_SHOW to the new page.
  2591. // The only constraint is YOU CANNOT change ucOSD_Page_Index when receive NOTIFY_SHOW.
  2592. // p.s. You can call sub-page process directly.
  2593. // OSD_Proc0 handles messages when there is no OSD window on screen (ucOSD_Page_Index = 0)
  2594. void OSD_Proc(unsigned char action)
  2595. {
  2596. #if (TV_CHIP != TV_NONE)
  2597.        if(ucOSD_Page_Index == 0)
  2598.    {
  2599.   //if (SOURCE_TV == (stGUD1.INPUT_SOURCE & 0x07) && OSD_Proc[1][stGUD1.INPUT_SOURCE & 0x07])
  2600.   if (SOURCE_TV == (stGUD1.INPUT_SOURCE & 0x07))
  2601.   {
  2602.   // Change to OSD Main Page 1 and Main Program will show it
  2603.   ucOSD_Page_Index    = 1;
  2604.   ucOSD_Item_Index0   = 0;
  2605.   ucOSD_Item_Index1   = 0;
  2606.   ucOSD_Item_Index2   = 0;
  2607.   return;
  2608.   }
  2609.   }
  2610. #endif
  2611. Data[0] = Sub_Page_Process(action);
  2612. if(Data[0] == 1)
  2613. action = NOTIFY_SHOW; // Redraw itself when returned from sub-page
  2614. else if(Data[0] == 0)
  2615. return; // Source select sub-Page still in work
  2616.        
  2617. switch(action)
  2618. {
  2619. case NOTIFY_ENTER_KEY:
  2620. Enter_Key_Process();
  2621. break;
  2622. case NOTIFY_RIGHT_KEY:
  2623. case NOTIFY_LEFT_KEY:
  2624. Left_Right_Key_Process(action);
  2625. break;
  2626. case NOTIFY_SHOW:
  2627. Show_Process();
  2628. break;
  2629. case NOTIFY_LR_KEY:
  2630. if(ucOSD_Page_Index == 0)
  2631. Page0_LR_Key();
  2632. break;
  2633. default:
  2634. break;
  2635. }
  2636. }
  2637. void OSD_Proc_B(unsigned char action)
  2638. {
  2639. switch(action)
  2640. {
  2641. case NOTIFY_ENTER_KEY:
  2642. Enter_Key_B_Process();
  2643. break;
  2644. case NOTIFY_RIGHT_KEY:
  2645. case NOTIFY_LEFT_KEY:
  2646. Left_Right_Key_B_Process(action);
  2647. break;
  2648. case NOTIFY_SHOW:
  2649. Show_B_Process();
  2650. break;
  2651. default:
  2652. break;
  2653. }
  2654. }
  2655. #if (TV_NONE != TV_CHIP)
  2656. void TV_AutoScan(void)
  2657. {
  2658.     unsigned char   ucTemp0, ucTemp1, ucTemp2;
  2659.     RTDCodeW(OSD_Reset); 
  2660.     RTDCodeW(FreeV);                        // FreeRun V registers & Background & disable
  2661.     RTDSetBit(VGIP_CTRL_04, 0xfe, 0x00);    // Input Run Disable
  2662.     RTDSetBit(VDIS_SIGINV_21, 0x0f, 0x10| DISP_EO_SWAP | DISP_RB_SWAP | DISP_ML_SWAP);
  2663.     I2CWrite(AV_DETECT);
  2664.     I2CWrite(TV_SOURCE_SEL);
  2665.     I2CWrite(TV_SCAN_GAIN);
  2666.     RTDCodeW(OSD_Enable);
  2667.     ucTemp0 = 0;
  2668.     ucTemp1 = 0;
  2669.     ucTemp2 = stGUD3.CURR_CHANNEL;
  2670.     stGUD3.CURR_CHANNEL = 1;
  2671.     while (1)
  2672.     {
  2673.         Set_TV_Channel();
  2674.         Show_TV_Info(stGUD3.CURR_CHANNEL, 2);
  2675.         if (0 == (ucTemp0 & 0x07))
  2676.         {
  2677.             I2CRead(ADDR_EROM1, 0xd0 + (ucTemp0 >> 3), 0x01);
  2678.             ucTemp1 = Data[0];
  2679.         }
  2680.         
  2681.         Data[1] = 12;
  2682.         do
  2683.         {
  2684.             Delay_Xms(50);
  2685.             I2CRead(ADDR_VIDEO, 0x1f, 0x01);
  2686.             if (Data[0] & 0x40)     break;
  2687.         }
  2688.         while (--Data[1]);
  2689.         
  2690.         if (Data[1])
  2691.         {
  2692.             ucTemp1 &= 0xff - (1 << (7 - (ucTemp0 & 0x07)));
  2693.         }
  2694.         else
  2695.         {
  2696.             ucTemp1 |= 1 << (7 - (ucTemp0 & 0x07));
  2697.         }      
  2698.         
  2699.         Data[0] = 4;
  2700.         Data[1] = ADDR_EROM1;
  2701.         Data[2] = 0xd0 + (ucTemp0 >> 3);
  2702.         Data[3] = ucTemp1;
  2703.         I2CWrite(Data);
  2704.         if (stGUD3.TV_SETTING & 0x01)
  2705.         {
  2706.             if (MAX_CATV_NUM == stGUD3.CURR_CHANNEL)    break;
  2707.         }
  2708.         else
  2709.         {
  2710.             if (MAX_AIR_NUM == stGUD3.CURR_CHANNEL)     break;
  2711.         }
  2712.         stGUD3.CURR_CHANNEL += 1;
  2713.         ucTemp0             += 1;
  2714.     }        
  2715.     stGUD3.CURR_CHANNEL = ucTemp2;
  2716.     Set_TV_Channel();
  2717.     Show_TV_Info(stGUD3.CURR_CHANNEL, 2);
  2718.     Delay_Xms(SET_2404_DELAY);
  2719. }
  2720. void Show_TV_Info(unsigned channel, unsigned char option)
  2721. {
  2722.     RTDSetBit(OVL_CTRL_6D, 0xfd, 0x00);     // Set the OSD become two times of original width (dual pixel)
  2723.     if (2 < option)     option  = 2;
  2724.     RTDOSDW(OSD_CHANNEL);
  2725.     Show_TV_Number(channel, 1, 5 - option, option);
  2726.     if (stGUD3.TV_SETTING & 0x02)
  2727.     {
  2728.         RTDOSDW(OSD_MUTE);
  2729.     }
  2730.     else
  2731.     {
  2732.         RTDOSDW((stGUD3.TV_SETTING & 0x04) ? OSD_SAP : OSD_STEREO);
  2733.     }
  2734. }
  2735. void Show_TV_Number(unsigned char num, unsigned char row, unsigned char col, unsigned char option)
  2736. {
  2737.     RTDSetBit(OVL_CTRL_6D, 0xfd, 0x00);     // Set the OSD become two times of original width (dual pixel)
  2738.     Data[0]     = 5;
  2739.     Data[1]     = Y_INC;
  2740.     Data[2]     = OSD_ROW_90;
  2741.     Data[3]     = 0x80 | row;
  2742.     Data[4]     = col;
  2743.     Data[6]     = N_INC;
  2744.     Data[7]     = OSD_DATA_92;
  2745.     if (1 < option)
  2746.     {
  2747.         Data[5]     = 6;
  2748.         Data[11]    = 0;
  2749.         Data[8]     = num / 100;
  2750.         num         = num - (Data[8] * 100);
  2751.         Data[9]     = num / 10;
  2752.         Data[10]    = num - (Data[9] * 10) + _0_;        
  2753.         Data[8]     = Data[8] + _0_;
  2754.         Data[9]     = Data[9] + _0_;
  2755.     }
  2756.     else if (1 == option)
  2757.     {
  2758.         Data[5]     = 5;
  2759.         Data[10]    = 0;
  2760.         Data[8]     = num / 10;
  2761.         Data[9]     = num - (Data[8] * 10) + _0_;
  2762.         Data[8]     = Data[8] + _0_;
  2763.     }
  2764.     else
  2765.     {
  2766.         Data[5]     = 4;
  2767.         Data[9]     = 0;
  2768.         Data[8]     = num + _0_;
  2769.     }
  2770.     RTDWrite(Data);
  2771. }
  2772. void OSD_TV_Proc(unsigned char action)
  2773. {
  2774.     switch (ucOSD_Item_Index0)
  2775.     {
  2776.     case 1 :
  2777.         // ucOSD_Item_Index0 will be 1 when we are in TV control menu
  2778.         OSD_TV_Menu(action);
  2779.         if (ucOSD_Item_Index0)  return;
  2780.         ucOSD_Item_Index1   = 0;
  2781.         ucOSD_Item_Index2   = 0;
  2782.         if (NOTIFY_ENTER_KEY == action || NOTIFY_IR_MENU == action || NOTIFY_NONE == action)    action  = NOTIFY_SHOW;
  2783.         OSD_Clear(0, 15, 0, 30);
  2784.         Show_TV_Info(stGUD3.CURR_CHANNEL, 2);
  2785.         break;
  2786.     case 2 :
  2787.         // ucOSD_Item_Index0 will be 2 when volume level is shown on screen.
  2788.         if (ucOSD_Item_Index2)      ucOSD_Item_Index2   -= 1;
  2789.         if (0 == ucOSD_Item_Index2 || (NOTIFY_NONE != action && NOTIFY_IR_VOLINC != action && NOTIFY_IR_VOLDEC != action))
  2790.         {
  2791.             ucOSD_Item_Index0   = 0;
  2792.             ucOSD_Item_Index1   = 0;
  2793.             ucOSD_Item_Index2   = 0;
  2794.             OSD_Clear(0, 15, 0, 30);
  2795.             Show_TV_Info(stGUD3.CURR_CHANNEL, 2);
  2796.         }
  2797.         break;
  2798.     case 3 :
  2799.         // ucOSD_Item_Index0 will be 3 when channel number is not shown on screen.
  2800.         ucOSD_Item_Index1   = 0;
  2801.         ucOSD_Item_Index2   = 0;
  2802.         break;
  2803.     default :
  2804.         // ucOSD_Item_Index0 is 0xff~0xfd and ucOSD_Item_Index1 is non-zero when user inputs channel number.
  2805.         // We will issue NOTIFY_IR_ENTER automatically to end input when channel no. is identified or key is timeout.
  2806.         // We will abort if any other key is pressed.
  2807.         if (0xfd < ucOSD_Item_Index0)
  2808.         {
  2809.             if (0 == ucOSD_Item_Index2)
  2810.                 ucOSD_Item_Index0   = 0xfd;
  2811.             else
  2812.                 ucOSD_Item_Index2   = ucOSD_Item_Index2 - 1;
  2813.             if (NOTIFY_NONE != action && NOTIFY_SHOW != action && 
  2814.                 NOTIFY_IR_ENTER != action && (NOTIFY_IR_NUM0 > action || NOTIFY_IR_NUM9 < action))
  2815.             {
  2816.                 ucOSD_Item_Index0   = 0;
  2817.                 ucOSD_Item_Index1   = 0;
  2818.                 ucOSD_Item_Index2   = 0;
  2819.                 Show_TV_Info(stGUD3.CURR_CHANNEL, 2);
  2820.             }
  2821.         }
  2822.         if (0xfd == ucOSD_Item_Index0)
  2823.         {
  2824.             ucOSD_Item_Index2   = 0;
  2825.             action              = NOTIFY_IR_ENTER;
  2826.         }
  2827.         break;
  2828.     }
  2829.     switch (action)
  2830.     {
  2831.     case NOTIFY_SHOW :
  2832.         OSD_Clear(0, 15, 0, 30);
  2833.         if (0xfd > ucOSD_Item_Index0)
  2834.         {
  2835.             if (3 != ucOSD_Item_Index0)
  2836.             {
  2837.                 ucOSD_Item_Index0   = 0;
  2838.                 ucOSD_Item_Index1   = 0;
  2839.                 ucOSD_Item_Index2   = 0;
  2840.                 Show_TV_Info(stGUD3.CURR_CHANNEL, 2);
  2841.             }
  2842.         }
  2843.         else
  2844.         {
  2845.             Show_TV_Info(ucOSD_Item_Index1, 0xff - ucOSD_Item_Index0);
  2846.         }
  2847.         break;
  2848.     case NOTIFY_ENTER_KEY :
  2849.     case NOTIFY_IR_MENU :
  2850.         ucOSD_Item_Index0   = 1;
  2851.         ucOSD_Item_Index1   = 1;
  2852.         ucOSD_Item_Index2   = 0;
  2853.         OSD_TV_Menu(NOTIFY_SHOW);
  2854.         break;
  2855.     case NOTIFY_RIGHT_KEY :
  2856.     case NOTIFY_IR_CHINC :
  2857.         // Increase the channel
  2858.         Next_Channel();
  2859.         Save_GUD3();
  2860.         Show_TV_Info(stGUD3.CURR_CHANNEL, 2);
  2861.         ucOSD_Item_Index0   = 0;
  2862.         ucOSD_Item_Index1   = 0;
  2863.         ucOSD_Item_Index2   = 0;
  2864.         break;
  2865.     case NOTIFY_LEFT_KEY :
  2866.     case NOTIFY_IR_CHDEC :
  2867.         // Decrease the channel
  2868.         Prev_Channel();
  2869.         Save_GUD3();
  2870.         Show_TV_Info(stGUD3.CURR_CHANNEL, 2);
  2871.         ucOSD_Item_Index0   = 0;
  2872.         ucOSD_Item_Index1   = 0;
  2873.         ucOSD_Item_Index2   = 0;
  2874.         break;
  2875.     case NOTIFY_IR_JUMP :
  2876.         Data[0]             = stGUD3.CURR_CHANNEL;
  2877.         stGUD3.CURR_CHANNEL = stGUD3.PREV_CHANNEL;
  2878.         stGUD3.PREV_CHANNEL = Data[0];
  2879.         Set_TV_Channel();
  2880.         Save_GUD3();
  2881.         Show_TV_Info(stGUD3.CURR_CHANNEL, 2);
  2882.         ucOSD_Item_Index0   = 0;
  2883.         ucOSD_Item_Index1   = 0;
  2884.         ucOSD_Item_Index2   = 0;
  2885.         break;
  2886.     case NOTIFY_IR_VOLINC :
  2887.     case NOTIFY_IR_VOLDEC :
  2888.         // Disable mute when changing volume
  2889.         stGUD3.TV_SETTING   = stGUD3.TV_SETTING & 0xfd;
  2890.         if (NOTIFY_IR_VOLINC == action)
  2891.             stGUD3.VOLUME   = 31 > stGUD3.VOLUME ? stGUD3.VOLUME + 1 : 31;
  2892.         else
  2893.             stGUD3.VOLUME   = 0 < stGUD3.VOLUME ? stGUD3.VOLUME - 1 : 0;
  2894.         SetVolume();
  2895.         Save_GUD3();
  2896.         RTDOSDW(OSD_VOLUME);
  2897.         Show_TV_Number(stGUD3.VOLUME, 2, 4, 1);
  2898.         ucOSD_Item_Index0   = 2;
  2899.         ucOSD_Item_Index1   = 0;
  2900.         ucOSD_Item_Index2   = 50;   // For time-out counter
  2901.         break;
  2902.     case NOTIFY_IR_MUTE :
  2903.         stGUD3.TV_SETTING   = stGUD3.TV_SETTING ^ 0x02;
  2904.         SetVolume();
  2905.         Save_GUD3();
  2906.         Show_TV_Info(stGUD3.CURR_CHANNEL, 2);
  2907.         ucOSD_Item_Index0   = 0;
  2908.         ucOSD_Item_Index1   = 0;
  2909.         ucOSD_Item_Index2   = 0;
  2910.         break;
  2911.     case NOTIFY_IR_ENTER :
  2912.         if (ucOSD_Item_Index1)
  2913.         {
  2914.             ucOSD_Item_Index0   = 0;
  2915.             if (stGUD3.TV_SETTING & 0x01)
  2916.             {
  2917.                 if (MAX_CATV_NUM >= ucOSD_Item_Index1)
  2918.                 {
  2919.                     stGUD3.PREV_CHANNEL = stGUD3.CURR_CHANNEL;
  2920.                     stGUD3.CURR_CHANNEL = ucOSD_Item_Index1;
  2921.                     ucOSD_Item_Index0   = 1;    // Valid channel
  2922.                 }
  2923.             }
  2924.             else
  2925.             {
  2926.                 if (MAX_AIR_NUM >= ucOSD_Item_Index1)
  2927.                 {
  2928.                     stGUD3.PREV_CHANNEL = stGUD3.CURR_CHANNEL;
  2929.                     stGUD3.CURR_CHANNEL = ucOSD_Item_Index1;
  2930.                     ucOSD_Item_Index0   = 1;    // Valid channel
  2931.                 }
  2932.             }
  2933.             if (ucOSD_Item_Index0)
  2934.             {
  2935.                 Set_TV_Channel();
  2936.                 if (stGUD3.PREV_CHANNEL != stGUD3.CURR_CHANNEL)
  2937.                 {
  2938.                     // Disable mute when changing channel
  2939.                     stGUD3.TV_SETTING   = stGUD3.TV_SETTING & 0xfd;
  2940.                     SetVolume();
  2941.                 }
  2942.                 Save_GUD3();
  2943.             }
  2944.         }
  2945.         ucOSD_Item_Index0   = 0;
  2946.         ucOSD_Item_Index1   = 0;
  2947.         ucOSD_Item_Index2   = 0;
  2948.         Show_TV_Info(stGUD3.CURR_CHANNEL, 2);
  2949.         break;
  2950.     case NOTIFY_IR_DISP :
  2951.         ucOSD_Item_Index1   = 0;
  2952.         ucOSD_Item_Index2   = 0;
  2953.         OSD_Clear(0, 15, 0, 30);
  2954.         if (ucOSD_Item_Index0)
  2955.         {
  2956.             ucOSD_Item_Index0   = 0;
  2957.             Show_TV_Info(stGUD3.CURR_CHANNEL, 2);
  2958.         }
  2959.         else
  2960.         {
  2961.             ucOSD_Item_Index0   = 3;
  2962.         }
  2963.         break;
  2964.     default :
  2965.         // We handle IR messages
  2966.         if (NOTIFY_IR_NUM0 <= action && NOTIFY_IR_NUM9 >= action)
  2967.         {
  2968.             if (0xfd > ucOSD_Item_Index0)
  2969.             {
  2970.                 ucOSD_Item_Index0   = 0xff;
  2971.                 ucOSD_Item_Index1   = action - NOTIFY_IR_NUM0;
  2972.             }
  2973.             else
  2974.             {
  2975.                 ucOSD_Item_Index0   = ucOSD_Item_Index0 - 1;
  2976.                 ucOSD_Item_Index1   = (ucOSD_Item_Index1 * 10) + (action - NOTIFY_IR_NUM0);
  2977.             }
  2978.             ucOSD_Item_Index2   = 80;   // For time-out counter
  2979.             if (6 < ucOSD_Item_Index1)
  2980.             {
  2981. #if (TV_SYSTEM == TV_NTSC)
  2982.                 if (0 == (stGUD3.TV_SETTING & 0x01) || 12 < ucOSD_Item_Index1)
  2983. #endif
  2984.                 {
  2985.                     ucOSD_Item_Index0   = 0xfd;
  2986.                 }
  2987.             }
  2988.             Show_TV_Info(ucOSD_Item_Index1, 0xff - ucOSD_Item_Index0);
  2989.         }
  2990.         break;
  2991.     }
  2992. }
  2993. void Highlight_Item(unsigned char index1, unsigned char index2)
  2994. {
  2995.     switch (index1)
  2996.     {
  2997.     case PAGE_TV_ITEM_SYSTEM :
  2998.         if (index2)
  2999.             OSD_Window(1, 0, 0, 0x13, 0x18, 7, COLOR_CYAN);
  3000.         else
  3001.             OSD_Window(1, 0, 0, 0x0a, 0x0e, 7, COLOR_CYAN);
  3002.         break;
  3003.     case PAGE_TV_ITEM_CONTRAST :
  3004.         OSD_Window(1, 2, 2, 0x0a, 0x0e, 7, COLOR_CYAN);
  3005.         break;
  3006.     case PAGE_TV_ITEM_BRIGHT :
  3007.         OSD_Window(1, 4, 4, 0x0a, 0x0e, 7, COLOR_CYAN);
  3008.         break;
  3009.     case PAGE_TV_ITEM_SOUND :
  3010.         if (index2)
  3011.             OSD_Window(1, 6, 6, 0x13, 0x17, 7, COLOR_CYAN);
  3012.         else
  3013.             OSD_Window(1, 6, 6, 0x0a, 0x11, 7, COLOR_CYAN);
  3014.         break;
  3015.     case PAGE_TV_ITEM_CHANNEL :
  3016.         OSD_Window(1, 8, 8, 0x0a, 0x0e, 7, COLOR_CYAN);
  3017.         break;
  3018.     case PAGE_TV_ITEM_VOLUME :
  3019.         OSD_Window(1, 10, 10, 0x0a, 0x0d, 7, COLOR_CYAN);
  3020.         break;
  3021.     case PAGE_TV_ITEM_AUTOSCAN :
  3022.         if (index2)
  3023.             OSD_Window(1, 12, 12, 0x13, 0x17, 7, COLOR_CYAN);
  3024.         else
  3025.             OSD_Window(1, 12, 12, 0x0a, 0x0d, 7, COLOR_CYAN);
  3026.         break;
  3027.     case PAGE_TV_ITEM_EXIT :
  3028.         OSD_Window(1, 14, 14, 0x00, 0x03, 7, COLOR_CYAN);
  3029.         break;
  3030.     }        
  3031. }
  3032. void OSD_TV_Menu(unsigned char action)
  3033. {
  3034.     switch (action)
  3035.     {
  3036.     case NOTIFY_ENTER_KEY :
  3037.         switch (ucOSD_Item_Index1)
  3038.         {
  3039.         case PAGE_TV_ITEM_SYSTEM :
  3040.             ucOSD_Item_Index1   = PAGE_TV_ITEM_CONTRAST;
  3041.             break;
  3042.         case PAGE_TV_ITEM_CONTRAST :
  3043.             ucOSD_Item_Index1   = PAGE_TV_ITEM_BRIGHT;
  3044.             break;
  3045.         case PAGE_TV_ITEM_BRIGHT :
  3046.             ucOSD_Item_Index1   = PAGE_TV_ITEM_SOUND;
  3047.             ucOSD_Item_Index2   = (stGUD3.TV_SETTING & 0x04) ? 1 : 0;
  3048.             break;
  3049.         case PAGE_TV_ITEM_SOUND :
  3050.             ucOSD_Item_Index1   = PAGE_TV_ITEM_CHANNEL;
  3051.             break;
  3052.         case PAGE_TV_ITEM_CHANNEL :
  3053.             ucOSD_Item_Index1   = PAGE_TV_ITEM_VOLUME;  
  3054.             break;
  3055.         case PAGE_TV_ITEM_VOLUME :
  3056.             ucOSD_Item_Index1   = PAGE_TV_ITEM_AUTOSCAN;
  3057.             ucOSD_Item_Index2   = 0;
  3058.             break;
  3059.         case PAGE_TV_ITEM_AUTOSCAN :
  3060.             if (ucOSD_Item_Index2)
  3061.             {
  3062.                 TV_AutoScan();
  3063.                 
  3064.                 ucMode_Curr = MODE_OSDFORCE;
  3065.                 return;                 // Return, not break
  3066.             }
  3067.             else
  3068.             {
  3069.                 ucOSD_Item_Index1   = PAGE_TV_ITEM_EXIT;
  3070.             }
  3071.             break;
  3072.         case PAGE_TV_ITEM_EXIT:
  3073.             ucOSD_Item_Index0   = 0;
  3074.             ucOSD_Item_Index1   = 0;
  3075.             ucOSD_Item_Index2   = 0;
  3076.             RTDCodeW(OSD_Reset);
  3077.             RTDCodeW(OSD_Enable);
  3078.             return;                     // Return, not break
  3079.         }
  3080.         // Hightlight next item if not returned
  3081.         Highlight_Item(ucOSD_Item_Index1, ucOSD_Item_Index2);
  3082.         break;
  3083.     case NOTIFY_RIGHT_KEY :     // Right-key to Increase; Left-key to Decrease
  3084.     case NOTIFY_LEFT_KEY :
  3085.         switch (ucOSD_Item_Index1)
  3086.         {
  3087.         case PAGE_TV_ITEM_SYSTEM :
  3088.             ucOSD_Item_Index2   = ucOSD_Item_Index2 ? 0 : 1;
  3089.             stGUD3.TV_SETTING   = ucOSD_Item_Index2 ? (stGUD3.TV_SETTING | 0x01) : (stGUD3.TV_SETTING & 0xfe);
  3090.             Set_TV_Channel();
  3091.             Save_GUD3();
  3092.             break;
  3093.         case PAGE_TV_ITEM_CONTRAST :
  3094.             if (NOTIFY_RIGHT_KEY == action)
  3095.             {
  3096.                 if (KEY_TURBO_ENABLE > ucKey_Issued)
  3097.                     stGUD0.CONTRAST   = 100 > stGUD0.CONTRAST ? stGUD0.CONTRAST + 1 : 100;
  3098.                 else
  3099.                     stGUD0.CONTRAST   = 99 > stGUD0.CONTRAST ? stGUD0.CONTRAST + 2 : 100;
  3100.             }
  3101.             else
  3102.             {
  3103.                 if (KEY_TURBO_ENABLE > ucKey_Issued)
  3104.                     stGUD0.CONTRAST   = 0 < stGUD0.CONTRAST ? stGUD0.CONTRAST - 1 : 0;
  3105.                 else
  3106.                     stGUD0.CONTRAST   = 1 < stGUD0.CONTRAST ? stGUD0.CONTRAST - 2 : 0;
  3107.             }
  3108.             Show_TV_Number(stGUD0.CONTRAST, 0x02, 0x0b, 0x02);
  3109.             Set_Bright_Contrast();
  3110.             Save_GUD0();
  3111.             break;
  3112.         case PAGE_TV_ITEM_BRIGHT :
  3113.             if (NOTIFY_RIGHT_KEY == action)
  3114.             {
  3115.                 if (KEY_TURBO_ENABLE > ucKey_Issued)
  3116.                     stGUD0.BRIGHT   = 100 > stGUD0.BRIGHT ? stGUD0.BRIGHT + 1 : 100;
  3117.                 else
  3118.                     stGUD0.BRIGHT   = 99 > stGUD0.BRIGHT ? stGUD0.BRIGHT + 2 : 100;
  3119.             }
  3120.             else
  3121.             {
  3122.                 if (KEY_TURBO_ENABLE > ucKey_Issued)
  3123.                     stGUD0.BRIGHT   = 0 < stGUD0.BRIGHT ? stGUD0.BRIGHT - 1 : 0;
  3124.                 else
  3125.                     stGUD0.BRIGHT   = 1 < stGUD0.BRIGHT ? stGUD0.BRIGHT - 2 : 0;
  3126.             }
  3127.             Show_TV_Number(stGUD0.BRIGHT, 0x04, 0x0b, 0x02);
  3128.             Set_Bright_Contrast();
  3129.             Save_GUD0();
  3130.             break;
  3131.         case PAGE_TV_ITEM_SOUND :
  3132.             ucOSD_Item_Index2   = ucOSD_Item_Index2 ? 0 : 1;
  3133.             stGUD3.TV_SETTING   = ucOSD_Item_Index2 ? (stGUD3.TV_SETTING | 0x04) : (stGUD3.TV_SETTING & 0xfb);
  3134.             // Disable mute when changing TV sound mode
  3135.             stGUD3.TV_SETTING   = stGUD3.TV_SETTING & 0xfd;
  3136.             SetVolume();
  3137.             Save_GUD3();
  3138.             break;
  3139.         case PAGE_TV_ITEM_CHANNEL :
  3140.             if (NOTIFY_RIGHT_KEY == action)
  3141.                 Next_Channel();
  3142.             else
  3143.                 Prev_Channel();
  3144.             Show_TV_Number(stGUD3.CURR_CHANNEL, 0x08, 0x0b, 0x02);
  3145.             Save_GUD3();
  3146.             break;
  3147.         case PAGE_TV_ITEM_VOLUME :
  3148.             if (NOTIFY_RIGHT_KEY == action)
  3149.                 stGUD3.VOLUME   = (31 == stGUD3.VOLUME) ? 31 : stGUD3.VOLUME + 1;
  3150.             else
  3151.                 stGUD3.VOLUME   = (0 == stGUD3.VOLUME) ? 0 : stGUD3.VOLUME - 1;
  3152.             Show_TV_Number(stGUD3.VOLUME, 0x0a, 0x0b, 0x01);
  3153.             SetVolume();
  3154.             Save_GUD3();
  3155.             break;
  3156.         case PAGE_TV_ITEM_AUTOSCAN :
  3157.             ucOSD_Item_Index2   = ucOSD_Item_Index2 ? 0 : 1;
  3158.             break;
  3159.         } 
  3160.         Highlight_Item(ucOSD_Item_Index1, ucOSD_Item_Index2);
  3161.         break;
  3162.     case NOTIFY_SHOW :
  3163.         OSD_Clear(0, 15, 0, 30);
  3164.         RTDSetBit(OVL_CTRL_6D, 0xfd, 0x00);     // Set the OSD become two times of original width (dual pixel)
  3165.         RTDOSDW(OSD_PageTV);    
  3166.         
  3167.         switch (ucOSD_Item_Index1)
  3168.         {
  3169.         case PAGE_TV_ITEM_SYSTEM :
  3170.             ucOSD_Item_Index2   = (stGUD3.TV_SETTING & 0x01) ? 1 : 0;
  3171.             break;
  3172.         case PAGE_TV_ITEM_SOUND :
  3173.             ucOSD_Item_Index2   = (stGUD3.TV_SETTING & 0x04) ? 1 : 0;
  3174.             break;
  3175.         }        
  3176.         Highlight_Item(ucOSD_Item_Index1, ucOSD_Item_Index2);
  3177.         Show_TV_Number(stGUD0.CONTRAST, 0x02, 0x0b, 0x02);
  3178.         Show_TV_Number(stGUD0.BRIGHT, 0x04, 0x0b, 0x02);
  3179.         Show_TV_Number(stGUD3.CURR_CHANNEL, 0x08, 0x0b, 0x02);
  3180.         Show_TV_Number(stGUD3.VOLUME, 0x0a, 0x0b, 0x01);
  3181.         break;
  3182.     default :
  3183.         // We don't handle other messages
  3184.         if (NOTIFY_NONE != action || (0 == usOSD_Timer && 0 != stGUD1.OSD_TIMEOUT))
  3185.         {
  3186.             ucOSD_Item_Index0   = 0;
  3187.             ucOSD_Item_Index1   = 0;
  3188.             ucOSD_Item_Index2   = 0;
  3189.             RTDCodeW(OSD_Reset);
  3190.             RTDCodeW(OSD_Enable);
  3191.         }
  3192.         break;
  3193.     }
  3194. }
  3195. #endif
  3196. void OSD_Opening(void)
  3197. {
  3198. int idata num;
  3199. //OSD_Position(OSD_ENABLE);
  3200. OSD_Window( 7, 0 , 488, 0, 264,
  3201.  0, 0, 14, 251, 0, 1, 1);
  3202. Delay_Xms(128);
  3203. RTDCodeW(OSD_Enable);
  3204. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x01);
  3205. for(num = 0;num < 112; num+=6)
  3206. {
  3207. OSD_Window( 7, 0 + num*2, 488 - num*2 , 0 + num, 264 - num,
  3208.  0, 0, 14, 251, 0, 1, 1);
  3209. }
  3210. OSD_Window( 7, 0 + num*2, 488 - num*2 , 0 + num, 264 - num,
  3211.  0, 0, 14, 251, 0, 1, 0);
  3212. /*
  3213. #if (1)
  3214.     RTDCodeW(OSD_Enable);
  3215. #else
  3216.     // For OSD animetion
  3217.     RTDCodeW(Palette_Open);
  3218.     RTDCodeW(Palette_1);
  3219.     RTDCodeW(OSD_Enable);
  3220.     
  3221.     Delay_Xms(16);
  3222.     Wait_For_Event(EVENT_DEN_STOP);     // Wait for Frame End                                    
  3223.     RTDCodeW(Palette_2);
  3224.     Delay_Xms(16);
  3225.     Wait_For_Event(EVENT_DEN_STOP);     // Wait for Frame End
  3226.     RTDCodeW(Palette_3);
  3227.     
  3228.     Delay_Xms(28);
  3229.     Wait_For_Event(EVENT_DEN_STOP);     // Wait for Frame End
  3230.     RTDCodeW(Palette_4);
  3231.     
  3232.     Delay_Xms(28);
  3233.     Wait_For_Event(EVENT_DEN_STOP);     // Wait for Frame End
  3234.     RTDCodeW(Palette_5);
  3235.     Delay_Xms(28);
  3236.     Wait_For_Event(EVENT_DEN_STOP);     // Wait for Frame End
  3237.     RTDCodeW(Palette_6);
  3238.     Delay_Xms(28);
  3239.     Wait_For_Event(EVENT_DEN_STOP);     // Wait for Frame End
  3240.     RTDCodeW(Palette_7);
  3241.     RTDCodeW(Palette_Close);
  3242. #endif
  3243. */
  3244. }
  3245. void OSD_Ending(void)
  3246. {
  3247. int idata num;
  3248. for(num = 112;num > 0; num-=6)
  3249. {
  3250. OSD_Window( 7, 0 + num*2, 488 - num*2 , 0 + num, 264 - num,
  3251.  0, 0, 14, 251, 0, 1, 1);
  3252. }
  3253. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x00);     
  3254. RTDCodeW(OSD_Reset);            // Clear OSD
  3255. //Delay_Xms(128);
  3256. OSD_Window( 7, 0 + num*2, 488 - num*2 , 0 + num, 264 - num,
  3257.  0, 0, 14, 251, 0, 1, 0);
  3258. #if (0)
  3259.     // For OSD animetion
  3260.     unsigned char ucTemp;
  3261.     // First, clear debug information drawn by OSD_Show_Check()
  3262.     OSD_Line(13, 2, 24, 0x00, 0);
  3263.     OSD_Line(13, 2, 24, 0x00, 1);
  3264.     // Close unused window
  3265.     OSD_Window(0, 0, 0, 0, 0, 0, 0);
  3266.     OSD_Window(1, 0, 0, 0, 0, 0, 0);
  3267.     OSD_Window(2, 0, 0, 0, 0, 0, 0);
  3268.     OSD_Line(11, 2, 24, 0x00, 0);
  3269.     OSD_Line(11, 2, 24, 0x00, 1);
  3270.     for (ucTemp = 0; ucTemp < 5; ucTemp ++)
  3271.     {
  3272.         OSD_Line(ucTemp, 2, 24, 0x00, 0);          // Attribute
  3273.         OSD_Line(ucTemp, 2, 24, 0x00, 1);          // Display
  3274.         OSD_Line(10 - ucTemp, 2, 24, 0x00, 0);     // Attribute
  3275.         OSD_Line(10 - ucTemp, 2, 24, 0x00, 1);     // Display
  3276.         OSD_Window(3, ucTemp + 1, 9 - ucTemp, 2, 25,
  3277.             OSD_WINDOW_ENABLE | OSD_WINDOW_SHADOWING, COLOR_CYAN);  // Main OSD window
  3278.         Wait_For_Event(EVENT_DEN_STOP);     // Wait for Frame End
  3279.     }
  3280.     OSD_Line(5, 2, 24, 0x00, 0);    // Attribute
  3281.     OSD_Line(5, 2, 24, 0x00, 1);    // Display
  3282.     for (ucTemp = 0; ucTemp < 12; ucTemp += 2)
  3283.     {
  3284.         OSD_Window(3, 5, 5, ucTemp + 3, 23 - ucTemp,
  3285.             OSD_WINDOW_ENABLE | OSD_WINDOW_SHADOWING, COLOR_CYAN);
  3286.         Wait_For_Event(EVENT_DEN_STOP);     // Wait for Frame End
  3287.     }
  3288. #endif
  3289. }
  3290. //Not modified yet
  3291. void Show_Note(void)
  3292. {
  3293. RTDSetByte(HOSTCTRL_02, 0x40);  // Wake RTD up
  3294. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x00);
  3295. //RTDCodeW(OSD_Reset);
  3296. OSD_Position(OSD_ENABLE);
  3297. // When input format changed, OSD will be cleared by Detect_VGA_Mode() and Detect_AV_Mode()
  3298. switch (stGUD1.INPUT_SOURCE & 0x07)
  3299. {
  3300. case SOURCE_VGA:
  3301. #if (VIDEO_CHIP != VDC_NONE || TMDS_ENABLE)
  3302. RTDOSDW(OSD_RGB);  // OSD RGB note
  3303. #endif
  3304. break;
  3305. case SOURCE_DVI:
  3306. RTDOSDW(OSD_DVI);  // OSD DVI note
  3307. break;
  3308. case SOURCE_AV:
  3309. RTDOSDW(OSD_AV);   // OSD AV note
  3310. break;
  3311. case SOURCE_SV:
  3312. RTDOSDW(OSD_SV);   // OSD S-Video note
  3313. break;
  3314. case SOURCE_YUV:
  3315. RTDOSDW(OSD_YUV);  // OSD YUV note
  3316. break;
  3317. case SOURCE_TV:
  3318. RTDOSDW(OSD_TV);
  3319. break;
  3320. }
  3321. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x01);
  3322. //RTDCodeW(OSD_Enable);
  3323. }
  3324. //Not modified yet
  3325. void Show_Hint(void)
  3326. {
  3327. if (MODE_NOSIGNAL == ucMode_Curr)
  3328. {
  3329. RTDSetByte(HOSTCTRL_02, 0x40);  // Wake RTD up
  3330. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x00);
  3331. //RTDCodeW(OSD_Reset);
  3332. #if(MCU_TYPE == MCU_WINBOND)
  3333. if ((SOURCE_VGA == (stGUD1.INPUT_SOURCE & 0x07)) && (VGA_ONLINE != bVGA_CONNECT))
  3334. #else
  3335. if ((SOURCE_VGA == (stGUD1.INPUT_SOURCE & 0x07)) && (VGA_ONLINE != MCU_ReadVgaConnect()))
  3336. #endif
  3337. {
  3338. RTDOSDW(OSD_HINT_TABLE[0][stGUD1.FUNCTION & 0x07]);
  3339. }
  3340. else
  3341. {
  3342. RTDOSDW(OSD_HINT_TABLE[1][stGUD1.FUNCTION & 0x07]);
  3343. }
  3344. //RTDCodeW(OSD_Enable);
  3345. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x01);
  3346. }
  3347. else if ((MODE_NOSUPPORT == ucMode_Curr) || bOverSpec)
  3348. {
  3349. RTDSetByte(HOSTCTRL_02, 0x40);  // Wake RTD up
  3350. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x00);
  3351. //RTDCodeW(OSD_Reset);
  3352. RTDOSDW(OSD_HINT_TABLE[2][stGUD1.FUNCTION & 0x07]);
  3353. //RTDCodeW(OSD_Enable);
  3354. RTDSetBit(OVL_CTRL_6D, 0xfe, 0x01);
  3355. }
  3356. }
  3357. #if (SHOW_CHECK)
  3358. void OSD_Show_Check(void)
  3359. {
  3360. OSD_Line(17, 2, 38, 0, 1);                       // Attribute
  3361. //OSD_Show_Num(0x02, ucOSD_Page_Index);                       // Status
  3362. //OSD_Show_Num(0x02, ucDebug_Value0);                       // Status
  3363. OSD_Show_Num(0x02, ucV_Max_Margin);                       // Status
  3364. //OSD_Show_Num(0x05, ucDebug_Value1);                    // ucMode_Curr
  3365. OSD_Show_Num(0x05, stMUD.V_POSITION);                    // ucMode_Curr
  3366. //OSD_Show_Num(0x08, ucDebug_Value2);
  3367.     OSD_Show_Num(0x08, ucMode_Curr);
  3368. RTDRead(LAST_LINE_H_2C, 1, N_INC);                  // Last Line Length
  3369. Data[15]    = Data[0] & 0xf8;
  3370. OSD_Show_Num(0x0b, Data[15] >> 6);
  3371. RTDRead(LAST_LINE_L_26, 1, N_INC);
  3372. OSD_Show_Num(0x0d, (Data[15] << 2) | (Data[0] >> 3));
  3373. #if (RTDDEBUG)
  3374. OSD_Show_Num(0x10, (unsigned char)(usPE_Sum >> 8));
  3375. OSD_Show_Num(0x12, (unsigned char)usPE_Sum);
  3376. OSD_Show_Num(0x17, (unsigned char)ucPE_Level);
  3377. #else
  3378. OSD_Show_Num(0x10, (unsigned char)(usHsync >> 8));  // usHsync
  3379. OSD_Show_Num(0x12, (unsigned char)usHsync);
  3380. OSD_Show_Num(0x15, (unsigned char)(usVsync >> 8));  // usVsync
  3381. OSD_Show_Num(0x17, (unsigned char)usVsync);   
  3382. #endif
  3383. }
  3384. void OSD_Show_Num(unsigned char column, unsigned char no)
  3385. {
  3386. unsigned int idata usStart_Addr;
  3387. unsigned char idata ucTemp;
  3388. usStart_Addr = FONT_SELECT_ADDRESS;
  3389. //The address of the first character Cn1 in Row n = FONT_SELECT_ADDRESS + Row0_length + Row1_length +...+Row(n-1)_length
  3390. for(ucTemp = 1; ucTemp < 17+1; ucTemp ++)
  3391. usStart_Addr += Row_Info[ucOSD_Page_Index-1][ucTemp];
  3392. Data[0]     = 5;
  3393. Data[1]     = Y_INC;
  3394. Data[2]     = OSD_ROW_90;
  3395. Data[3] = (unsigned char)( (((usStart_Addr + column)  & 0x0fff) >> 8 ) | 0x50);
  3396. Data[4] = (unsigned char)( (usStart_Addr + column) & 0x00ff);
  3397. Data[5]     = 0;                 
  3398. RTDWrite(Data);
  3399. column  = no / 16;              // Bit 7~4
  3400. no      = no - (column * 16);   // Bit 3~0
  3401. column  = (9 < column) ? (column + (0x20 - 10)) : (column + _0_);
  3402. no      = (9 < no) ? (no + (0x20 - 10)) : (no + _0_);
  3403.     
  3404. Data[0] = 5;
  3405. Data[1] = N_INC;
  3406. Data[2] = OSD_DATA_92;
  3407. Data[3] = column;
  3408. Data[4] = no;
  3409. Data[5] = 0;
  3410. RTDWrite(Data);
  3411. }
  3412. #endif