📄 sony_servo.lst
字号:
286 extern void SERVO_delay_n_ms(int n_ms);
287 extern void SERVO_short_delay(int delay);
288 extern volatile int ms_timer; /* 100 ms timer */
289 extern void SERVO_start_timer(int ms_delay);
C51 COMPILER V6.12 SONY_SERVO 02/22/2002 15:21:29 PAGE 6
290 extern int SERVO_check_timer(void);
291 extern int SERVO_Check_SCOR(void);
292 extern void FIX_KYstdby();
293 void (*servo_task)();
294
295 #ifdef ENABLE_MP3
extern void Mp3_DoMute();
extern void Mp3_UnMute();
#endif
299
300 void null_func()
301 {
302 }
303
304
305 /************************************************************************
306 * INTERNAL FUNCTIONS *
307 ************************************************************************/
308 void SERVO_emrchk(void);
309 void SERVO_emr_10(void);
310 void SERVO_emr_20(void);
311 void SERVO_emcsbq(void);
312 void SERVO_trackjump_1(int);
313 void SERVO_trackjump_3(int);
314 void SERVO_trackjump_10(int);
315 void SERVO_M_trackmove(int qdirection, int track_diff);
316 void SERVO_avrg_ctl(void);
317 void SERVO_filter_setting(void);
318 void SERVO_EF_balance(void);
319 void SERVO_fb_dtr(void);
320 void SERVO_agc(void);
321 void SERVO_ag_trk(void);
322 void SERVO_fbias(void);
323 void SERVO_rfjsmp(void);
324 void SERVO_efv_10(void);
325 void SERVO_fbias_10(void);
326 void SERVO_fbias_20(void);
327 void SERVO_fbc(void);
328 void SERVO_agc_10(void);
329 void SERVO_agc_20(void);
330 void SERVO_fcson(void);
331 void SERVO_fcstry(void);
332 void SERVO_fcserr(void);
333 void SERVO_focsok(void);
334 void SERVO_emrchk(void);
335 int check_focus_ok(void);
336 unsigned int udiv(unsigned int, unsigned int);
337 void SERVO_processQcode(void);
338 void SERVO_send_command_no_latch(int, unsigned int);
339 void SERVO_send_one_command(unsigned char);
340 void SERVO_focus_10(void);
341 void SERVO_focus_20(void);
342 void SERVO_focus_30(void);
343 void SERVO_focus_40(void);
344 void SERVO_focus_50(void);
345 void SERVO_focus_60(void);
346 void SERVO_fcsext(void);
347 void SERVO_fcsdwn(void);
348 int SERVO_match(void);
349 void SERVO_trackjump_1(int);
350 void trackjump_monitor(int);
351 void long_trackjump_monitor(void);
C51 COMPILER V6.12 SONY_SERVO 02/22/2002 15:21:29 PAGE 7
352 void clear_emergency_flag(void);
353 unsigned int adjCDtime(unsigned int time, unsigned int amount,
354 unsigned int direction);
355 void SERVO_schedule(void);
356 void Do_mute(void);
357 void Undo_mute(void);
358 int SERVO_search(void);
359 int SERVO_stop(void);
360 void SERVO_send_command(int num, unsigned int data);
361 void SERVO_2N_trackjump(int qdirection, int track_diff);
362 void SERVO_all_servo_off(void);
363 void reset_emergency_flag(void);
364 void SERVO_ReadQCode(void);
365
366 /* make sure this is at least 750 ns, but not much more */
367 /* 1 clock = 15ns@66mhz or 20ns@50Mhz */
368 /* each pass of loop = at least 4 clocks, but leave a bit extra */
369 void SERVO_Wait750()
370 {
371 volatile unsigned int i;
372
373 // for (i=0; i<(750/60); i++);
374 for (i=0; i<3; i++);
375 // for (i=0; i<20; i++);
376
377 }
378
379
380
381 /************************************************************************
382 * Q CODES
383 ************************************************************************/
384
385 extern unsigned char jump_flag;
386
387 void SERVO_processQcode()
388 {
389 int num;
390
391 SERVO_ReadQCode();
392
393 if ((SERVO_Qarray[0]&0x0f)!=0x01)
394 return;
395 if (!SERVO_Qarray[SERVO_QZERO]) {
396
397 for (num = 0; num < SUBQ_LEN; num++)
398 {
399 SERVO_Qarray_new[num] = SERVO_Qarray[num];
400 #ifdef SLAVE_MODE ///Adam add for slave mode..
Slv_SendSubCodeQ(num,SERVO_Qarray_new[num]);
#endif
403
404 }
405
406 if (SUBQ_READY==1)
407 SERVO_new_Qcode = 0;
408 else
409 SERVO_new_Qcode = 1;
410
411 /* SERVO_new_Qcode = 1; */
412 /* Get absolute CD time */
413 SERVO_cdtime = (SERVO_Qarray[SERVO_QPMIN] << 16) |
C51 COMPILER V6.12 SONY_SERVO 02/22/2002 15:21:29 PAGE 8
414 (SERVO_Qarray[SERVO_QPSEC] << 8) |
415 SERVO_Qarray[SERVO_QPFRAME];
416 }
417 }
418
419 #ifdef ENABLE_MP3
extern void mp3_servo_emrchk( void );
void mp3_servo_service()
{
if (mutecmd == 1)
Do_mute();
else if (mutecmd == 2)
Undo_mute();
mutecmd = 0;
if (servo_focus_drop || servo_gfs_drop)
mp3_servo_emrchk();
SERVO_schedule();
}
#endif // ENABLE_MP3
436
437 /*
438 * Get subQ code and check emergency situations
439 */
440 void SERVO_service()
441 {
442 /* first check edge detector on SCOR */
443 if(SUBQ_READY){
444 RESET_SUBQ;
445 /*YES, now check for CRC*/
446 if(SERVO_SQSO_HIGH){
447 /*YES, get subq data*/
448 SERVO_processQcode();
449 /*reset subQ emergency variables*/
450 servo_subq_timer=SUBQ_TIMEOUT;
451 servo_subq_drop=0;
452 servo_sbqemr=0;
453 }
454 /* else //hide by ding */
455 /* zputs("NO CRC\n"); */
456 }
457 #if 1
458 /* mutecmd maybe set in timer interrupt */
459 if (mutecmd == 1)
460 Do_mute();
461 else if (mutecmd == 2)
462 Undo_mute();
463 mutecmd = 0;
464
465
466 /* Emergency checking */
467 if (/*(CDinfo.type != CD_NODISC) &&*/
468 (servo_focus_drop || servo_gfs_drop || servo_subq_drop))
469 SERVO_emrchk();
470
471 SERVO_schedule();
472 #endif
473 }
474
475
C51 COMPILER V6.12 SONY_SERVO 02/22/2002 15:21:29 PAGE 9
476 void SERVO_service1()
477 {
478 if (SUBQ_READY) {
479 /* first check edge detector on SCOR */
480 RESET_SUBQ;
481 if(SERVO_SQSO_HIGH){
482 /*YES, get subq data*/
483 SERVO_processQcode();
484 /*reset subQ emergency variables*/
485 servo_subq_timer=SUBQ_TIMEOUT;
486 servo_subq_drop=0;
487 servo_sbqemr=0;
488 }
489 /* else //hide by ding */
490 /* zputs("NO CRC1\n"); */
491 }
492 }
493 extern unsigned char fg_mode;
494 extern TMSF cdm;
495 extern bit cd_pause, ls_pause;
496 extern unsigned char VCD_ver;
497 extern void CDU_CDactTit();
498 extern void CDU_CDabsMin();
499 extern void CDU_CDabsSec();
500 extern void CDU_CDfound();
501 #ifdef USE_OSD_FUNC //chu
extern char slow_state;
#endif
504 extern void FIX_KYopcl(); //chu
505 extern int SERVO_open();
506 #ifdef ENABLE_ESP
extern void esp_track_change();
#endif
509
510 void SERVO_mode_handle()
511 {
512 int num;
513 int flag;
514 unsigned int r_tmp;
515
516 disable_reset_timer();
517
518 switch (SERVO_mode) {
519 case SERVO_IDLE:
520 break;
521 case SERVO_STOP:
522 SERVO_stop();
523 SERVO_mode=SERVO_IDLE;
524 break;
525 case SERVO_OPEN:
526 SERVO_open();
527 break;
528 case SERVO_CLOSE:
529 SERVO_close();
530 SERVO_mode = SERVO_IDLE;
531 break;
532 case SERVO_PLAY:
533 if (search_flag) {
534 int found;
535 search_flag = 0;
536 /* Go back to previous position after emergency handling */
537 // pcm_mute();
C51 COMPILER V6.12 SONY_SERVO 02/22/2002 15:21:29 PAGE 10
538 #ifdef NEW_DSP
regs16->Game_TLB_23=0x15;
#else
541 pcm_mute();
542 #endif
543
544 found = SERVO_search();
545 if (!found && !servo_focus_on) {
546 SERVO_stop();
547 break;
548 }
549
550 #ifdef NEW_DSP
regs16->Game_TLB_23=0x0;
#else
553 pcm_restore();
554 #endif
555
556 // pcm_restore();
557 }
558 /* Update VFD display for any new information during playing. */
559 /* Update the Q-sub data to SERVO_Qarray_current from */
560 /* SERVO_Qarray_new, for the RECOVER use if any lost of the track */
561 if (SERVO_new_Qcode && kickfg) {
562 dsa_recv.word=DSR_FOUND; ///kzy add 5/23
563 SERVO_new_Qcode = 0;
564 if ((SERVO_Qarray_new[SERVO_QCTRADD] & 0xf) == 0x01) {
565 int prev_time;
566 /* Keep out of lead out area */
567 if (SERVO_Qarray_new[SERVO_QTRACK] == 0xaa) {
568 dsa_recv.byte[DSA_PAR] = 0xaa;
569 CDU_CDactTit();
570 break;
571 }
572 /* abnormal Q_time */
573 prev_time = (SERVO_Qarray_current[SERVO_QPMIN] << 16) |
574 (SERVO_Qarray_current[SERVO_QPSEC] << 8) |
575 SERVO_Qarray_current[SERVO_QPFRAME];
576 if ((SERVO_cdtime < prev_time) ||
577 (SERVO_cdtime > adjCDtime(prev_time, 0x50, 1)))
578 {
579 int tmp,found;
580
581 tmp = adjCDtime(prev_time, 0x30, 1);
582 target_min = (tmp>>16) & 0xff;
583 target_sec = (tmp >>8) & 0xff;
584 target_frame = tmp & 0xff;
585
586 #ifdef NEW_DSP
regs16->Game_TLB_23=0x15;
#else
589 pcm_mute();
590 #endif
591
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -