📄 mode1
字号:
/************************************************
* *
* MODE.C: Mosaic Display Mode routine *
* *
************************************************/
#include <reg51.h>
#include <stddef.h>
#include "mosaic.h"
#include "osd.h"
//#include "mtv312.h"
#define SHCLK_DELAY 1 //SHCLK delay by 4 invertors(vs. 2)
#define PATCH_LEFTEDGE 0 //Turn on TDACLK to patch the left edge
//problem on 1024 70Hz/72Hz/75Hz
extern EepModeData idata eepModeData;
extern EepData idata eepData;
extern bit OSDEnabled;
extern bit PresetModeFlag;
extern bit NoInputFlag;
//extern bit MainOSDFlag;
extern bit OutWithBackground;
bit FindNonPresetModeFlag = 0;
extern unsigned char idata cursor;
extern unsigned char idata mainPos;
extern unsigned char idata subPos;
extern unsigned int idata ival, ival1;
extern unsigned int idata HsyncCnt, VsyncCnt;
unsigned char data CurrentMode = MODE_OVERFLOW; // current mode #
char data CurrentPolarity = -1; // current polarity
int data CurrentWidth = 0; // current screen width
int data CurrentHeight = 0; // current screen height
unsigned int idata DefaultHstart;
unsigned char idata DefaultVstart;
unsigned int idata DefaultPitch;
unsigned char idata DefaultPhase;
void powerSavingMode(void);
void modePatch(void);
void refreshOSD(void);
#if CHIMEI14_PATCH
bit modeAdjustHt(void);
#endif
//
// Display Mode tables
//
#include "sharptbl.h"
#include "sam17tbl.h"
#include "shp18tbl.h"
#include "sam15tbl.h" // default
#include "lg15tbl.h"
#include "lg150x2.h"
#include "lg151x4.h"
#include "cm14ntbl.h"
#include "cm14nc4.h"
#include "cm14mtbl.h"
#include "fuj15tbl.h"
#include "au15tbl.h"
#include "au15ez.h"
#include "ch15tbl.h"
//
// ADC/TDA tables
//
#ifndef TDATBL_DEFINED
#include "phltda.h"
#include "mrtadc.h"
#if CZ5N6
#include "cz5n6.h"
#else
#include "mrtv2.h"
#endif
#endif //TDATBL_DEFINED
//
// Display Mode Table
//
MODETBL code ModeTbl[] = {
{Mode0Tbl, Mode0Tda, 640, 350,2 +PRESETMODE}, //0: 31.5KHz/70Hz +/- 28MHz: 640x350
#if SRC_TV
{tvNTSCTbl,NULL, 640, 240,0+NOPOL}, //1: NTSC
#else
{NULL, NULL, 0, 0, 0 }, //1:
#endif
{Mode2Tbl, Mode2Tda, 720, 400,1+NOPOL+PRESETMODE}, //2: 31.5KHz/70Hz -/+ 25MHz: 720x400
#if SRC_TV //david
{tvPALTbl, NULL, 720, 286,0+NOPOL}, //3: PAL
#else
{NULL, NULL, 0, 0, 0 }, //3:
#endif
{Mode4Tbl, Mode4Tda, 640, 480,3+NOPOL+PRESETMODE}, //4: 31.5KHz/60Hz -/- 25MHz: 640x480
{Mode5Tbl, Mode5Tda, 640, 480,3+NOPOL+PRESETMODE}, //5: 37.9KHz/72Hz -/- 31.5MHz: 640x480
{Mode6Tbl, Mode6Tda, 640, 480,3+NOPOL+PRESETMODE}, //6: 37.5KHz/75Hz -/- 31.5MHz: 640x480
{Mode7Tbl, Mode7Tda, 640, 480,3+NOPOL}, //7: 43.3KHz/85Hz -/- 36MHz: 640x480
{Mode8Tbl, Mode8Tda, 800, 600,0+NOPOL+PRESETMODE}, //8: 35.1KHz/56Hz +/+ 36MHz: 800x600
{Mode9Tbl, Mode9Tda, 800, 600,0+NOPOL+PRESETMODE}, //9: 37.9KHz/60Hz +/+ 40MHz: 800x600
{Mode10Tbl,Mode10Tda,800, 600,0+NOPOL+PRESETMODE}, //10:47.2KHz/72Hz +/+ 50MHz: 800x600
{Mode11Tbl,Mode11Tda,800, 600,0+NOPOL+PRESETMODE}, //11:46.9KHz/75Hz +/+ 49.5MHz: 800x600
{Mode12Tbl,Mode12Tda,1024,768,3+NOPOL+PRESETMODE}, //12:48.4KHz/60Hz -/- 65MHz: 1024x768
{Mode13Tbl,Mode13Tda,1024,768,3+NOPOL+PRESETMODE}, //13:56.5KHz/70Hz -/- 75MHz: 1024x768
{Mode14Tbl,Mode14Tda,1024,768,3+NOPOL}, //14:58.2KHz/72Hz -/- 77MHz: 1024x768
{Mode15Tbl,Mode15Tda,1024,768,0+NOPOL+PRESETMODE}, //15:60.0KHz/75Hz +/+ 78.75MHz: 1024x768
{Mode16Tbl,Mode16Tda,1024,768,0+NOPOL}, //16:68.7KHz/85Hz +/+ 94.5MHz: 1024x768
{Mode17Tbl,Mode17Tda,800, 600,2+NOPOL}, //17:44.49KHz/70Hz +/- 44.85MHz: 800x600
{Mode18Tbl,Mode18Tda,800, 600,0+NOPOL}, //18:53.7KHz/85Hz +/+ 56.25MHz: 800x600
{Mode19Tbl,Mode19Tda,800, 600,0+NOPOL}, //19:56.6KHz/90Hz +/+ 56.6MHz: 800x600
{Mode20Tbl,Mode20Tda,800, 600,0+NOPOL}, //20:63.9KHz/100Hz +/+ 67.5MHz: 800x600
{Mode21Tbl,Mode21Tda,640, 480,3+NOPOL}, //21:48.0KHz/90Hz -/- 39.9MHz: 640x480
{Mode22Tbl,Mode22Tda,640, 480,3+NOPOL}, //22:52.9KHz/100Hz -/- 44.9MHz: 640x480
{Mode23Tbl,Mode23Tda,1024,768/2,0+NOPOL},//23:35.5KHz/87Hz(43i) +/+ 44.9MHz: 1024x768
{Mode24Tbl,Mode24Tda,1024,768,3+NOPOL}, //24:72.6KHz/90Hz +/+ 100MHz: 1024x768
{Mode25Tbl,Mode25Tda,640, 480,1+NOPOL}, //25:35.0KHz 66.7Hz +/-,640x480 66.7Hz MAC-II
{Mode26Tbl,Mode26Tda,640, 350,2 }, //26:37.861KHz 84.136Hz +/-, 640x350 84Hz
{Mode27Tbl,Mode27Tda,640, 400,1 }, //27:37.861KHz 84.136Hz -/+, 640x400 84Hz
{Mode28Tbl,Mode28Tda,640, 480,3+NOPOL}, //28:34.69KHz/70Hz -/- 25MHz: 640x480 70Hz
{Mode29Tbl,Mode29Tda,832, 624,3+NOPOL}, //29:49.725KHz/74.5Hz -/- 57.3MHz: 832x624
{Mode30Tbl,Mode30Tda,1024,768,3+NOPOL}, //30:60.15KHz/74.72Hz -/- 80 MHz: 1024x768
{Mode31Tbl,Mode31Tda,640, 400,3+NOPOL}, //31:24.827KHz 56.424Hz -/-, 640x400 56Hz PC9801
{Mode32Tbl,Mode32Tda,1024,768,3+NOPOL}, //32:KHz/100Hz +/+ MHz: 1024x768
{Mode33Tbl,Mode33Tda,640, 400,3 }, //33:31.5Hz 70Hz -/-, 640x400 70Hz
{Mode34Tbl,Mode34Tda,800, 600,3+NOPOL}, //34:48.83K/66.89Hz -/- 50 MHz: 800x600 66Hz (MAC)
{Mode35Tbl,Mode35Tda,640, 400,0+NOPOL}, //35:26.36KHz 59.9Hz +/+, 640x400 60Hz //DAVID
{Mode36Tbl,Mode36Tda,1024,768,0+NOPOL} //36:35.5KHz 43.4Hz +/+, 1024x768 43Hz //DAVID
,{Mode37Tbl,Mode37Tda,640, 377,0+NOPOL} //37:29.58kz 73.1Hz +/+, 640x377 73Hz //DAVID
,{Mode38Tbl,Mode38Tda,1280,1024,0+NOPOL} //38:63.981KHz 60.020Hz +/+, 1280x1024 60Hz
,{Mode39Tbl,Mode39Tda,1280,1024,0+NOPOL} //39:79.976KHz 75Hz +/+, 1280x1024 75Hz
,{Mode40Tbl,Mode40Tda,1280,1024,0+NOPOL} //40:91.146KHz 85Hz +/+, 1280x1024 85Hz
,{Mode41Tbl,Mode41Tda,1280,1024,0+NOPOL} //41:73KHz 70Hz +/+, 1280x1024 70Hz
,{Mode42Tbl,Mode42Tda,1280,1024,0+NOPOL} //42:76.8KHz 72Hz +/+, 1280x1024 72Hz
,{Mode43Tbl,Mode43Tda,1152,864, 0+NOPOL} //43:54.35KHz 60Hz +/+, 1152x864 60Hz
,{Mode44Tbl,Mode44Tda,1152,864, 0+NOPOL} //44:64KHz 70Hz +/+, 1152x864 70Hz
,{Mode45Tbl,Mode45Tda,1152,864, 0+NOPOL} //45:67.5KHz 75Hz +/+, 1152x864 75Hz
,{Mode46Tbl,Mode46Tda,1152,864, 0+NOPOL} //46:77.5KHz 85Hz +/+, 1152x864 85Hz
,{Mode47Tbl,Mode47Tda,1280,960, 0+NOPOL} //47:60KHz 60Hz +/+, 1280x960 60Hz
,{Mode48Tbl,Mode48Tda,1280,960, 0+NOPOL} //48:75KHz 75Hz +/+, 1280x960 75Hz
,{Mode49Tbl,Mode49Tda,1280,960, 0+NOPOL} //49:86KHz 85Hz +/+, 1280x960 85Hz
,{Mode50Tbl,Mode50Tda,1152,900, 0+NOPOL} //50:61.8KHz 66Hz +/+, 1152x900 66Hz //david
,{Mode51Tbl,Mode51Tda,1280,1024,0+NOPOL} //51:69.1KHz 65Hz +/+, 1280x1024 65Hz //david
,{Mode52Tbl,Mode52Tda,1280,1024,0+NOPOL} //52:70.7KHz 66Hz +/+, 1280x1024 66Hz //david
,{Mode53Tbl,Mode53Tda,1280,1024,0+NOPOL} //53:60.6KHz 57Hz +/+, 1280x1024 576z //david
,{Mode54Tbl,Mode54Tda,1280, 720,0+NOPOL} //54:45KHz 60Hz +/+, 1280x720 60Hz //david
,{Mode55Tbl,Mode55Tda,1120, 750,0+NOPOL} //55:50KHz 60Hz +/+, 1120x750 60Hz //david
,{Mode56Tbl,Mode56Tda,1920, 540,0+NOPOL} //56:33.7KHz 30x2Hz +/+,1920(640)x540 30x2Hz //david
,{Mode57Tbl,Mode57Tda, 640, 400,0+NOPOL} //57:25.8KHz 51.7Hz +/+,640x400 51.7Hz //david
};
#define MAXMODE (sizeof(ModeTbl)/sizeof(MODETBL))
char modeAdjust(void);
//
// Set Display Mode
// Return: current mode, -1 unknown mode
//
unsigned char modeSetMode(unsigned char mode, unsigned char sync_pol)
{
MODETBL *modetbl;
unsigned char pol, *regtbl;
char temp;
#if DEBUGMSG
printf("Mode: mode=%x sync=%x\n", (int)mode, (unsigned int)sync_pol);
#endif
if (mode >= MAXMODE) {
#if DEBUGMSG
printf(" mode overlimit %d\n", MAXMODE);
#endif
return MODE_OUTOFSYNC;
}
modetbl = &ModeTbl[mode];
// Mute screen
//miscTurnOffPanel(); // Turn off panel display
miscTurnOffBackLight();
RegBitOut(0x40, 0x20, 0x70);
// Program TDA registers
regtbl = modetbl->tdaptr;
if (!(MosaicFlag & FLAG_PORTB) && (regtbl!=NULL)) {
TDADataTableOut(regtbl);
#if MRT_VITESSE2
TDAByteOut(0x0B, *(regtbl+0x0B)); // double buffer issue
#endif
DefaultPitch = ((*(regtbl+TDA_DIVH_OFF)& 0x07)<<9) + (*(regtbl+TDA_DIVL_OFF)<<1) + ((*(regtbl+TDA_PHASE_OFF)&0X40)>>6);
DefaultPhase = *(regtbl+TDA_PHASE_OFF) & PHASEMASK;
#if MRT_ADCPLL
if (*(regtbl+TDA_OPHASE)) DefaultPhase |= PHASEORIG;
#endif
}
// Program Mosaic
RegByteOut(0x24, 0x00); // disable minify
RegByteOut(0x2F, 0x00); // disable test mode
#if MASCOTV_C
//RegByteOut(0x5F, 0x00);
#endif
regtbl = modetbl->modeptr;
if (regtbl == NULL) {
#if DEBUGMSG
printf(" modeptr==NULL\n");
#endif
return MODE_OUTOFSYNC;
}
RegDataTableOut(regtbl);
// screen mute
RegBitOut(0x40, 0x20, 0x70);
DefaultHstart = ((unsigned int)*(regtbl+MODEHSTART+1)<<8) + *(regtbl+MODEHSTART);
DefaultVstart = *(regtbl+MODEHSTART+2);
// Check polarity
pol = modetbl->pol;
if ( pol & NOPOL ) {
if ( (regtbl = modetbl->tdaptr) != NULL ) {
if (MosaicFlag & FLAG_PORTB) {
RegBitOut(0x33, sync_pol<<1, 0x06);
} else {
RegBitOut(0x32, sync_pol<<1, 0x06);
#if PHILIPS_TDA
pol = (*(regtbl+TDA_CTRL_OFF) & 0x3F) | (sync_pol<<6);
TDAByteOut(TDA_CTRL, pol);
#endif
#if MRT_VITESSE2
//0911
#if (VITESSE2_R2&&(!MASCOT_V))
pol = (*(regtbl+TDA_CTRL_OFF) & 0x3F) | (sync_pol<<6);
#else
pol = *(regtbl+TDA_CTRL_OFF) & 0x3F;
if (!(sync_pol&0x01)) pol |= 0x40; // Bug: Hsync active low
if (sync_pol&0x02) pol |= 0x80;
#endif
TDAByteOut(TDA_CTRL, pol);
#endif
#if MRT_ADCPLL
pol = (*(regtbl+TDA_CTRL_OFF) & ~0x01) | (sync_pol & 0x01);
//ZZZ TDAByteOut(TDA_CTRL, pol);
#endif
}
}
}
else if ( sync_pol != (pol&0x03)) {
#if DEBUGMSG
printf(" sync_pol mismatch %x\n", (unsigned int)pol);
#endif
return MODE_OUTOFSYNC; //??? mode error, create a new mode
}
#if (MRT_VITESSE2 && VITESSE2_R2) // Patch: VSync needs pull low
TDAByteOut(TDA_CTRL, TDAByteIn(TDA_CTRL)&0x7F);
#endif
#if AU150X2
if (mode == 12)
TDAByteOut(TDA_CTRL, 0x61);
if (mode == 13)
TDAByteOut(TDA_CTRL, 0x63);
if (mode == 15)
TDAByteOut(TDA_CTRL, 0x23);
#endif
#if MASCOT_V
if (mode != 23)
RegBitOut(0x32, 0x80, 0x80); // CKREFO
#endif
CurrentMode = mode;
if (!PresetModeFlag)
CurrentMode |= 0x80;
CurrentPolarity = sync_pol;
CurrentWidth = modetbl->width;
CurrentHeight = modetbl->height;
eepFindAutoModeEntry();
if ( eepFindModeEntry() ) {
adjVPos(0,HIDE);
adjHPos(0,HIDE);
adjPitch(0,HIDE);
adjPhase(0,HIDE);
#if DEBUGMSG
printf(" PRESET loaded\n");
#endif
}else if(!PresetModeFlag) {
FindNonPresetModeFlag = 1;
}
#if MASCOT_V // patch the issue of last 7 lines
ival = RegByteIn(0x3B);
ival = (ival<<8)+RegByteIn(0x3A)+4;
#if LG_151X4
ival += 8;
RegBitOut(0x24, 0x10, 0x30);
#elif LG_151
ival += 2;
RegBitOut(0x24, 0x20, 0x30);
#endif
RegByteOut(0x3A, ival);
RegByteOut(0x3B, ival>>8);
#endif
#if MASCOT_V
RegBitOut(0x40, 0x80, 0x80);
if (mode != 23) {
RegBitOut(0x32, 0x80, 0x80);
RegBitOut(0x18, 0x20, 0x20);
}
#endif
RegBitOut(0x40,0x00,0x40); //disable free run for modeadjust
if (eepData.MascotFlag & FLAG_FACTORY)
{
ResetEEPROM(RSTEEP+RSTAUTO+RSTUSER); //reset without color and mode
setEepData();
}
// setZoom(); // interpolcation setting
//modePatch(); // patch for special cases
#if (MASCOT_V && SRC_SI151)
if (MosaicFlag & FLAG_PORTB)
RegBitOut(0x33, 0x50, 0x50); // for MascotV debug board
#endif
// Start Capture
RegBitOut(0x30, 0x01, 0x01);
// screen mute
RegBitOut(0x40, 0x20, 0x70);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -