📄 msvd.lst
字号:
{
g_msVD_Patch004_StableCounter = 0;
}
}
#endif
1111
1112 #ifdef VD_PATCH_005
XDATA BYTE g_msVD_Patch005_VDAbnormalCounter;
void msVD_Patch_005( BYTE ucResetTime )
{
if( ucResetTime )
{
g_msVD_Patch005_VDAbnormalCounter = 0;
g_msVD_Patch005_Timer = ucResetTime;
}
else
{
BYTE ucScalerStatus;
if( g_msVD_Patch005_Timer )
return;
g_msVD_Patch005_Timer = 10;
ucScalerStatus = msVDCheckScalerStatus(0);
if( ucScalerStatus != 0 )
{
g_msVD_Patch005_VDAbnormalCounter ++;
if( g_msVD_Patch005_VDAbnormalCounter > 3 )
{
g_msVD_Patch005_VDAbnormalCounter = 0;
putstr("\r\n=====VD output abnormally=====");
// Reset VD
msVD_FSM_Reset();
}
}
else
C51 COMPILER V8.01 MSVD 11/28/2006 08:08:13 PAGE 20
{
g_msVD_Patch005_VDAbnormalCounter = 0;
}
}
}
#endif
1148
1149 void msVDCombLineBufferCtl( BYTE flag )
1150 {
1151 1 BYTE ucBank = msReadByte( BK0_00_REGBK);
1152 1
1153 1 msWriteByte( BK0_00_REGBK, REG_BANK3_COMB);
1154 1
1155 1 if( flag == MSVD_COMB_LINE_BUFFER_CTL_HW_AUTO )
1156 1 {
1157 2 msWriteByteMask(BK3_50, 0x07, 0x07); // Line buffer free run mode: Auto
1158 2 }
1159 1 else
1160 1 {
1161 2 bit bCurLineLockStatus = 0;
1162 2
1163 2 msWriteByte( BK0_00_REGBK, REG_BANK2_VD);
1164 2
1165 2 // Get line lock status
1166 2 if( msVDDSPReadByte( 0x21 )&_BIT7 )
1167 2 bCurLineLockStatus = 1;
1168 2
1169 2 msWriteByte(BK0_00_REGBK, REG_BANK3_COMB);
1170 2 if( bCurLineLockStatus ) // Current is line lock mode
1171 2 {
1172 3 if( (g_VdInfo.wVideoStatus&VD_FSC_TYPE) == VD_FSC_4XXX ) // PAL/NTSC443/SECAM
1173 3 msWriteByteMask(BK3_50, 0x05, 0x07); // Line buffer free run mode: Decided by register
1174 3 else // NTSC
1175 3 msWriteByteMask(BK3_50, 0x02, 0x07); // Line buffer free run mode: Decided by register
1176 3 }
1177 2 else // Current is not line lock mode
1178 2 {
1179 3 if( IsAVInUse()&&(g_VdInfo.ucVideoSystem == SIG_NTSC_443) )
1180 3 {
1181 4 msWriteByteMask(BK3_50, 0x06, 0x07); // Line buffer free run mode: Decided by register
1182 4 msWriteByte( BK3_52, 0x67 ); // H return position L
1183 4 msWriteByte( BK3_53, 0x04 ); // H return position H
1184 4 }
1185 3 else
1186 3 {
1187 4 WORD wHTotal;
1188 4
1189 4 msWriteByte(BK0_00_REGBK, REG_BANK2_VD);
1190 4 wHTotal = msVDDSPRead2Bytes( DSP_3C );
1191 4 //printf("\r\nAFEC:HTotal:%d", wHTotal);
1192 4
1193 4 msWriteByte(BK0_00_REGBK, REG_BANK3_COMB);
1194 4 if( wHTotal > 1151 )
1195 4 {
1196 5 // Force 1151 pixel
1197 5 msWriteByteMask(BK3_50, 0x06, 0x07); // Line buffer free run mode: Decided by register
1198 5 msWriteByte( BK3_52, 0x7F ); // H return position L
1199 5 msWriteByte( BK3_53, 0x04 ); // H return position H
1200 5 }
1201 4 else
1202 4 {
1203 5 msWriteByteMask(BK3_50, 0x07, 0x07); // Line buffer free run mode: Auto
C51 COMPILER V8.01 MSVD 11/28/2006 08:08:13 PAGE 21
1204 5 //msWriteByte( BK3_52, 0x8E ); // H return position L
1205 5 //msWriteByte( BK3_53, 0x03 ); // H return position H
1206 5 }
1207 4 }
1208 3 }
1209 2 }
1210 1
1211 1 msWriteByte( BK0_00_REGBK, ucBank );
1212 1 }
1213
1214 void msVDNoiseHandlerInit(void)
1215 {
1216 1 BYTE ucBank;
1217 1 WORD wTmp;
1218 1
1219 1 ucBank = msReadByte( BK0_00_REGBK );
1220 1 msWriteByte( BK0_00_REGBK, REG_BANK2_VD );
1221 1
1222 1 wTmp = msVDDSPRead2Bytes(DSP_10);
1223 1
1224 1 wTmp |= 0x0080;
1225 1 msVDDSPWriteByte(DSP_10, wTmp);
1226 1 msVDDSPWriteByte(DSP_10+1, wTmp>>8);
1227 1
1228 1 msVDNoiseHandlerReset();
1229 1
1230 1 msWriteByte( BK0_00_REGBK, ucBank );
1231 1 }
1232
1233 void msVDNoiseHandlerReset(void)
1234 {
1235 1 BYTE ucBank;
1236 1
1237 1 ucBank = msReadByte( BK0_00_REGBK);
1238 1 msWriteByte( BK0_00_REGBK, REG_BANK2_VD );
1239 1
1240 1 g_ucNoiseDebounce = 0;
1241 1 bNoisy_Det = 0;
1242 1 bLastNoisyStatus = bNoisy_Det;
1243 1
1244 1 msVDDSPWriteByte( DSP_84, msVDDSPReadByte(DSP_84)&(~_BIT1) ); // Clean mode
1245 1 msWriteByteMask( BK2_38_VSTROBE_LIMIT, 0x03, 0x07 );
1246 1 msWriteByteMask( BK2_97_EDGES_CLEAN_TH, 0x00, 0xC0 );
1247 1 msWriteByte( BK2_73_INI_CTRL2, 0x10 ); // V-Slice=2/8,H-Slice=4/8
1248 1 msWriteByte( BK2_79_656_HDES1, 0x17 );
1249 1 msWriteByte( BK2_7A, 0x20 );
1250 1
1251 1 msWriteByte( BK0_00_REGBK, REG_BANK3_COMB );
1252 1 if( g_VdInfo.ucVideoSystem != SIG_SECAM )
1253 1 {
1254 2 msWriteByteMask( BK3_6F_MAX_CRMA, 0x00, 0x03 ); // Cb/Cr low pass mode
1255 2 }
1256 1 g_ucMSVDNoiseHandlerTimer = 200;
1257 1
1258 1 msWriteByte( BK0_00_REGBK, ucBank );
1259 1 }
1260
1261 void msVDNoiseHandler(void)
1262 {
1263 1 BYTE ucBank;
1264 1 WORD wNoiseMag;
1265 1
C51 COMPILER V8.01 MSVD 11/28/2006 08:08:13 PAGE 22
1266 1 if( g_ucMSVDNoiseHandlerTimer )
1267 1 return;
1268 1
1269 1 g_ucMSVDNoiseHandlerTimer = 20;
1270 1
1271 1 ucBank = msReadByte( BK0_00_REGBK);
1272 1 msWriteByte(BK0_00_REGBK, REG_BANK2_VD);
1273 1
1274 1 // Noise detection ...
1275 1
1276 1 //wNoiseMag = msDSP_Std_GetNoiseMag();
1277 1 wNoiseMag = msVDDSPReadByte( DSP_2A );
1278 1 if( g_ucNoiseDebounce < 30 )
1279 1 {
1280 2 if( wNoiseMag > 0x40 )
1281 2 g_ucNoiseDebounce += 4;
1282 2 else if( wNoiseMag >= 0x30 )
1283 2 g_ucNoiseDebounce += 2;
1284 2 else if( wNoiseMag > 0x28 )
1285 2 g_ucNoiseDebounce ++;
1286 2 }
1287 1 if( g_ucNoiseDebounce != 0 )
1288 1 {
1289 2 if( wNoiseMag < 0x10 )
1290 2 {
1291 3 if( g_ucNoiseDebounce < 6 )
1292 3 g_ucNoiseDebounce = 0;
1293 3 else
1294 3 g_ucNoiseDebounce -= 6;
1295 3 }
1296 2 else if( wNoiseMag < 0x20 )
1297 2 g_ucNoiseDebounce --;
1298 2 }
1299 1
1300 1 if( g_ucNoiseDebounce >= 30 )
1301 1 {
1302 2 bNoisy_Det = 1;
1303 2 }
1304 1 else if( g_ucNoiseDebounce == 0 )
1305 1 {
1306 2 bNoisy_Det = 0;
1307 2 }
1308 1
1309 1 if( bLastNoisyStatus != bNoisy_Det )
1310 1 {
1311 2 if( bNoisy_Det ) // Noise mode
1312 2 {
1313 3 putstr("\r\nNoise mode");
1314 3 msVDDSPWriteByte( DSP_84, msVDDSPReadByte(DSP_84)|(_BIT1) ); // Noise mode
1315 3 msWriteByteMask( BK2_38_VSTROBE_LIMIT, 0x07, 0x07 );
1316 3 msWriteByteMask( BK2_97_EDGES_CLEAN_TH, 0x80, 0xC0 ); // [7:6]='10' (slice input IIR8)
1317 3 msWriteByte( BK2_73_INI_CTRL2, 0xF0 ); // V-Slice=6/8,H-Slice=6/8
1318 3 msWriteByte( BK2_79_656_HDES1, 0x16 );
1319 3 msWriteByte( BK2_7A, 0xA0 ); // HDES
1320 3
1321 3 if( g_VdInfo.ucVideoSystem != SIG_SECAM )
1322 3 {
1323 4 msWriteByte( BK0_00_REGBK, REG_BANK3_COMB );
1324 4 msWriteByteMask( BK3_6F_MAX_CRMA, 0x03, 0x03 ); // Cb/Cr low pass mode
1325 4 }
1326 3 }
1327 2 else // Clean mode
C51 COMPILER V8.01 MSVD 11/28/2006 08:08:13 PAGE 23
1328 2 {
1329 3 putstr("\r\nClean mode");
1330 3 msVDDSPWriteByte( DSP_84, msVDDSPReadByte(DSP_84)&(~_BIT1) ); // Clean mode
1331 3 msWriteByteMask( BK2_38_VSTROBE_LIMIT, 0x03, 0x07 );
1332 3 msWriteByteMask( BK2_97_EDGES_CLEAN_TH, 0x00, 0xC0 ); // [7:6] = '00' (slice input CCTRAP)
1333 3 msWriteByte( BK2_73_INI_CTRL2, 0x10 ); // V-Slice=2/8,H-Slice=4/8
1334 3 msWriteByte( BK2_79_656_HDES1, 0x18 );
1335 3 msWriteByte( BK2_7A, 0x20 ); // HDES
1336 3
1337 3 if( g_VdInfo.ucVideoSystem != SIG_SECAM )
1338 3 {
1339 4 msWriteByte( BK0_00_REGBK, REG_BANK3_COMB );
1340 4 msWriteByteMask( BK3_6F_MAX_CRMA, 0x00, 0x03 ); // Cb/Cr low pass mode
1341 4 }
1342 3 }
1343 2 bLastNoisyStatus = bNoisy_Det;
1344 2 }
1345 1
1346 1 msWriteByte( BK0_00_REGBK, ucBank );
1347 1 }
1348
1349 ///////////////////////////////////////////////////////////////////////////////////////////////////
1350 void msVDCombHandler(void)
1351 {
1352 1 BYTE ucBank;
1353 1 WORD wHTotalDiff;
1354 1
1355 1 // if( g_ucMsVDCombHandler_Timer )
1356 1 // return;
1357 1
1358 1 // g_ucMsVDCombHandler_Timer = 100;
1359 1
1360 1 ucBank = msReadByte( BK0_00_REGBK);
1361 1
1362 1 msWriteByte( BK0_00_REGBK, REG_BANK2_VD);
1363 1
1364 1 wHTotalDiff = abs( msVDDSPRead2Bytes( 0x3C ) - tVideoSystemStdHTotal[g_VdInfo.ucVideoSystem] );
1365 1
1366 1 msWriteByte( BK0_00_REGBK, REG_BANK3_COMB);
1367 1 if( (msReadByte( BK3_10_COMBCFGA)&3) == 2 ) // Current is 2D
1368 1 {
1369 2 if( wHTotalDiff >= 6 )
1370 2 msWriteByteMask(BK3_10_COMBCFGA, 0x01, 0x07); // Switch to 1D
1371 2 }
1372 1 else // Current is 1D
1373 1 {
1374 2 if( wHTotalDiff <= 4 )
1375 2 msWriteByteMask(BK3_10_COMBCFGA, 0x02, 0x07); // Switch to 2D
1376 2 }
1377 1
1378 1 if( g_ucmsVDCtl&MSVD_CTL_FLAG_COMB_LINE_BUF ) // For debug
1379 1 msVDCombLineBufferCtl( MSVD_COMB_LINE_BUFFER_CTL_SW );
1380 1
1381 1 msWriteByte( BK0_00_REGBK, ucBank );
1382 1 }
1383
1384
1385
1386 #if(ENABLE_VCR_HANDLER)
BYTE msVDGetVCRFoundCounter(void)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -