Mercurial > libdvdnav.hg
comparison decoder.c @ 153:175d5fef21e4 src
Minor changes.
| author | jcdutton |
|---|---|
| date | Sat, 05 Apr 2003 13:11:13 +0000 |
| parents | 3a1659f4a6c3 |
| children | 3492d41dc247 |
comparison
equal
deleted
inserted
replaced
| 152:3a1659f4a6c3 | 153:175d5fef21e4 |
|---|---|
| 31 #include <inttypes.h> | 31 #include <inttypes.h> |
| 32 #include <string.h> /* For memset */ | 32 #include <string.h> /* For memset */ |
| 33 #include <dvdread/ifo_types.h> /* vm_cmd_t */ | 33 #include <dvdread/ifo_types.h> /* vm_cmd_t */ |
| 34 #include <assert.h> | 34 #include <assert.h> |
| 35 #include "dvdnav_internal.h" | 35 #include "dvdnav_internal.h" |
| 36 | |
| 37 uint32_t vm_getbits(command_t *command, int start, int count) { | |
| 38 uint64_t result = 0; | |
| 39 uint64_t bit_mask=0xffffffffffffffff; /* I could put -1 instead */ | |
| 40 uint64_t examining = 0; | |
| 41 int32_t bits; | |
| 42 | |
| 43 if (count == 0) return 0; | |
| 44 | |
| 45 if ( ((start - count) < -1) || | |
| 46 (count > 32) || | |
| 47 (start > 63) || | |
| 48 (count < 0) || | |
| 49 (start < 0) ) { | |
| 50 fprintf(MSG_OUT, "libdvdnav: Bad call to vm_getbits. Parameter out of range\n"); | |
| 51 assert(0); | |
| 52 } | |
| 53 bit_mask >>= 63 - start; | |
| 54 bits = start + 1 - count; | |
| 55 examining = ((bit_mask >> bits) << bits ); | |
| 56 command->examined |= examining; | |
| 57 result = (command->instruction & bit_mask) >> bits; | |
| 58 return (uint32_t) result; | |
| 59 } | |
| 60 | 36 |
| 61 static uint16_t get_GPRM(registers_t* registers, uint8_t reg) { | 37 static uint16_t get_GPRM(registers_t* registers, uint8_t reg) { |
| 62 if (registers->GPRM_mode[reg] & 0x01) { | 38 if (registers->GPRM_mode[reg] & 0x01) { |
| 63 struct timeval current_time, time_offset; | 39 struct timeval current_time, time_offset; |
| 64 uint16_t result; | 40 uint16_t result; |
| 578 int32_t total = 0; | 554 int32_t total = 0; |
| 579 | 555 |
| 580 #ifdef TRACE | 556 #ifdef TRACE |
| 581 /* DEBUG */ | 557 /* DEBUG */ |
| 582 fprintf(MSG_OUT, "libdvdnav: Registers before transaction\n"); | 558 fprintf(MSG_OUT, "libdvdnav: Registers before transaction\n"); |
| 583 vmPrint_registers( registers ); | 559 vm_print_registers( registers ); |
| 584 fprintf(MSG_OUT, "libdvdnav: Full list of commands to execute\n"); | 560 fprintf(MSG_OUT, "libdvdnav: Full list of commands to execute\n"); |
| 585 for(i = 0; i < num_commands; i++) | 561 for(i = 0; i < num_commands; i++) |
| 586 vmPrint_CMD(i, &commands[i]); | 562 vm_print_cmd(i, &commands[i]); |
| 587 fprintf(MSG_OUT, "libdvdnav: --------------------------------------------\n"); | 563 fprintf(MSG_OUT, "libdvdnav: --------------------------------------------\n"); |
| 588 fprintf(MSG_OUT, "libdvdnav: Single stepping commands\n"); | 564 fprintf(MSG_OUT, "libdvdnav: Single stepping commands\n"); |
| 589 #endif | 565 #endif |
| 590 | 566 |
| 591 i = 0; | 567 i = 0; |
| 592 while(i < num_commands && total < 100000) { | 568 while(i < num_commands && total < 100000) { |
| 593 int32_t line; | 569 int32_t line; |
| 594 | 570 |
| 595 #ifdef TRACE | 571 #ifdef TRACE |
| 596 vmPrint_CMD(i, &commands[i]); | 572 vm_print_cmd(i, &commands[i]); |
| 597 #endif | 573 #endif |
| 598 | 574 |
| 599 line = eval_command(&commands[i].bytes[0], registers, return_values); | 575 line = eval_command(&commands[i].bytes[0], registers, return_values); |
| 600 | 576 |
| 601 if (line < 0) { /* Link command */ | 577 if (line < 0) { /* Link command */ |
| 602 #ifdef TRACE | 578 #ifdef TRACE |
| 603 fprintf(MSG_OUT, "libdvdnav: Registers after transaction\n"); | 579 fprintf(MSG_OUT, "libdvdnav: Registers after transaction\n"); |
| 604 vmPrint_registers( registers ); | 580 vm_print_registers( registers ); |
| 605 fprintf(MSG_OUT, "libdvdnav: eval: Doing Link/Jump/Call\n"); | 581 fprintf(MSG_OUT, "libdvdnav: eval: Doing Link/Jump/Call\n"); |
| 606 #endif | 582 #endif |
| 607 return 1; | 583 return 1; |
| 608 } | 584 } |
| 609 | 585 |
| 616 } | 592 } |
| 617 | 593 |
| 618 memset(return_values, 0, sizeof(link_t)); | 594 memset(return_values, 0, sizeof(link_t)); |
| 619 #ifdef TRACE | 595 #ifdef TRACE |
| 620 fprintf(MSG_OUT, "libdvdnav: Registers after transaction\n"); | 596 fprintf(MSG_OUT, "libdvdnav: Registers after transaction\n"); |
| 621 vmPrint_registers( registers ); | 597 vm_print_registers( registers ); |
| 622 #endif | 598 #endif |
| 623 return 0; | 599 return 0; |
| 624 } | 600 } |
| 625 | 601 |
| 626 #ifdef TRACE | 602 #ifdef TRACE |
| 689 return "PlayThis"; | 665 return "PlayThis"; |
| 690 } | 666 } |
| 691 return "*** (bug)"; | 667 return "*** (bug)"; |
| 692 } | 668 } |
| 693 | 669 |
| 694 void vmPrint_LINK(link_t value) { | 670 void vm_print_link(link_t value) { |
| 695 char *cmd = linkcmd2str(value.command); | 671 char *cmd = linkcmd2str(value.command); |
| 696 | 672 |
| 697 switch(value.command) { | 673 switch(value.command) { |
| 698 case LinkNoLink: | 674 case LinkNoLink: |
| 699 case LinkTopC: | 675 case LinkTopC: |
| 745 fprintf(MSG_OUT, "libdvdnav: %s %d resume cell %d\n", cmd, value.data1, value.data2); | 721 fprintf(MSG_OUT, "libdvdnav: %s %d resume cell %d\n", cmd, value.data1, value.data2); |
| 746 break; | 722 break; |
| 747 } | 723 } |
| 748 } | 724 } |
| 749 | 725 |
| 750 void vmPrint_registers( registers_t *registers ) { | 726 void vm_print_registers( registers_t *registers ) { |
| 751 int32_t i; | 727 int32_t i; |
| 752 fprintf(MSG_OUT, "libdvdnav: # "); | 728 fprintf(MSG_OUT, "libdvdnav: # "); |
| 753 for(i = 0; i < 24; i++) | 729 for(i = 0; i < 24; i++) |
| 754 fprintf(MSG_OUT, " %2d |", i); | 730 fprintf(MSG_OUT, " %2d |", i); |
| 755 fprintf(MSG_OUT, "\nlibdvdnav: SRPMS: "); | 731 fprintf(MSG_OUT, "\nlibdvdnav: SRPMS: "); |
