📄 vmcmd.c
字号:
}}static void print_linksub_instruction(command_t* command) { uint32_t linkop = vm_getbits(command, 7, 8); uint32_t button = vm_getbits(command, 15, 6); if(linkop < sizeof(link_table)/sizeof(char *) && link_table[linkop] != NULL) fprintf(MSG_OUT, "%s (button %" PRIu8 ")", link_table[linkop], button); else fprintf(MSG_OUT, "WARNING: Unknown linksub instruction (%i)", linkop);}static void print_link_instruction(command_t* command, int optional) { uint8_t op = vm_getbits(command, 51, 4); if(optional && op) fprintf(MSG_OUT, ", "); switch(op) { case 0: if(!optional) fprintf(MSG_OUT, "WARNING: NOP (link)!"); break; case 1: print_linksub_instruction(command); break; case 4: fprintf(MSG_OUT, "LinkPGCN %" PRIu16, vm_getbits(command, 14, 15)); break; case 5: fprintf(MSG_OUT, "LinkPTT %" PRIu16 " (button %" PRIu8 ")", vm_getbits(command, 9, 10), vm_getbits(command, 15, 6)); break; case 6: fprintf(MSG_OUT, "LinkPGN %" PRIu8 " (button %" PRIu8 ")", vm_getbits(command, 6, 7), vm_getbits(command, 15, 6)); break; case 7: fprintf(MSG_OUT, "LinkCN %" PRIu8 " (button %" PRIu8 ")", vm_getbits(command, 7, 8), vm_getbits(command, 15, 6)); break; default: fprintf(MSG_OUT, "WARNING: Unknown link instruction"); }}static void print_jump_instruction(command_t* command) { switch(vm_getbits(command, 51, 4)) { case 1: fprintf(MSG_OUT, "Exit"); break; case 2: fprintf(MSG_OUT, "JumpTT %" PRIu8, vm_getbits(command, 22, 7)); break; case 3: fprintf(MSG_OUT, "JumpVTS_TT %" PRIu8, vm_getbits(command, 22, 7)); break; case 5: fprintf(MSG_OUT, "JumpVTS_PTT %" PRIu8 ":%" PRIu16, vm_getbits(command, 22, 7), vm_getbits(command, 41, 10)); break; case 6: switch(vm_getbits(command, 23, 2)) { case 0: fprintf(MSG_OUT, "JumpSS FP"); break; case 1: fprintf(MSG_OUT, "JumpSS VMGM (menu %" PRIu8 ")", vm_getbits(command, 19, 4)); break; case 2: fprintf(MSG_OUT, "JumpSS VTSM (vts %" PRIu8 ", title %" PRIu8 ", menu %" PRIu8 ")", vm_getbits(command, 30, 7), vm_getbits(command, 38, 7), vm_getbits(command, 19, 4)); break; case 3: fprintf(MSG_OUT, "JumpSS VMGM (pgc %" PRIu8 ")", vm_getbits(command, 46, 15)); break; } break; case 8: switch(vm_getbits(command, 23, 2)) { case 0: fprintf(MSG_OUT, "CallSS FP (rsm_cell %" PRIu8 ")", vm_getbits(command, 31, 8)); break; case 1: fprintf(MSG_OUT, "CallSS VMGM (menu %" PRIu8 ", rsm_cell %" PRIu8 ")", vm_getbits(command, 19, 4), vm_getbits(command, 31, 8)); break; case 2: fprintf(MSG_OUT, "CallSS VTSM (menu %" PRIu8 ", rsm_cell %" PRIu8 ")", vm_getbits(command, 19, 4), vm_getbits(command, 31, 8)); break; case 3: fprintf(MSG_OUT, "CallSS VMGM (pgc %" PRIu8 ", rsm_cell %" PRIu8 ")", vm_getbits(command, 46, 15), vm_getbits(command, 31, 8)); break; } break; default: fprintf(MSG_OUT, "WARNING: Unknown Jump/Call instruction"); }}static void print_system_set(command_t* command) { int i;/* FIXME: What about SPRM11 ? Karaoke *//* Surely there must be some system set command for that ? */ switch(vm_getbits(command, 59, 4)) { case 1: /* Set system reg 1 &| 2 &| 3 (Audio, Subp. Angle) */ for(i = 1; i <= 3; i++) { if(vm_getbits(command, 47 - (i*8), 1)) { print_system_reg(i); fprintf(MSG_OUT, " = "); print_reg_or_data_2(command, vm_getbits(command, 60, 1), 47 - (i*8) ); fprintf(MSG_OUT, " "); } } break; case 2: /* Set system reg 9 & 10 (Navigation timer, Title PGC number) */ print_system_reg(9); fprintf(MSG_OUT, " = "); print_reg_or_data(command, vm_getbits(command, 60, 1), 47); fprintf(MSG_OUT, " "); print_system_reg(10); fprintf(MSG_OUT, " = %" PRIu16, vm_getbits(command, 30, 15)); /* ?? */ break; case 3: /* Mode: Counter / Register + Set */ fprintf(MSG_OUT, "SetMode "); if(vm_getbits(command, 23, 1)) fprintf(MSG_OUT, "Counter "); else fprintf(MSG_OUT, "Register "); print_g_reg(vm_getbits(command, 19, 4)); print_set_op(0x1); /* '=' */ print_reg_or_data(command, vm_getbits(command, 60, 1), 47); break; case 6: /* Set system reg 8 (Highlighted button) */ print_system_reg(8); if(vm_getbits(command, 60, 1)) /* immediate */ fprintf(MSG_OUT, " = 0x%x (button no %d)", vm_getbits(command, 31, 16), vm_getbits(command, 31, 6)); else fprintf(MSG_OUT, " = g[%" PRIu8 "]", vm_getbits(command, 19, 4)); break; default: fprintf(MSG_OUT, "WARNING: Unknown system set instruction (%i)", vm_getbits(command, 59, 4)); }}static void print_set_version_1(command_t* command) { uint8_t set_op = vm_getbits(command, 59, 4); if(set_op) { print_g_reg(vm_getbits(command, 35, 4)); print_set_op(set_op); print_reg_or_data(command, vm_getbits(command, 60, 1), 31); } else { fprintf(MSG_OUT, "NOP"); }}static void print_set_version_2(command_t* command) { uint8_t set_op = vm_getbits(command, 59, 4); if(set_op) { print_g_reg(vm_getbits(command, 51, 4)); print_set_op(set_op); print_reg_or_data(command, vm_getbits(command, 60, 1), 47); } else { fprintf(MSG_OUT, "NOP"); }}static void print_set_version_3(command_t* command) { uint8_t set_op = vm_getbits(command, 59, 4); if(set_op) { print_g_reg(vm_getbits(command, 51, 4)); print_set_op(set_op); print_reg_or_data_3(command, vm_getbits(command, 60, 1), 47); } else { fprintf(MSG_OUT, "NOP"); }}void vm_print_mnemonic(vm_cmd_t *vm_command) { command_t command; command.instruction =( (uint64_t) vm_command->bytes[0] << 56 ) | ( (uint64_t) vm_command->bytes[1] << 48 ) | ( (uint64_t) vm_command->bytes[2] << 40 ) | ( (uint64_t) vm_command->bytes[3] << 32 ) | ( (uint64_t) vm_command->bytes[4] << 24 ) | ( (uint64_t) vm_command->bytes[5] << 16 ) | ( (uint64_t) vm_command->bytes[6] << 8 ) | (uint64_t) vm_command->bytes[7] ; command.examined = 0; switch(vm_getbits(&command,63,3)) { /* three first bits */ case 0: /* Special instructions */ print_if_version_1(&command); print_special_instruction(&command); break; case 1: /* Jump/Call or Link instructions */ if(vm_getbits(&command,60,1)) { print_if_version_2(&command); print_jump_instruction(&command); } else { print_if_version_1(&command); print_link_instruction(&command, 0); /* must be pressent */ } break; case 2: /* Set System Parameters instructions */ print_if_version_2(&command); print_system_set(&command); print_link_instruction(&command, 1); /* either 'if' or 'link' */ break; case 3: /* Set General Parameters instructions */ print_if_version_3(&command); print_set_version_1(&command); print_link_instruction(&command, 1); /* either 'if' or 'link' */ break; case 4: /* Set, Compare -> LinkSub instructions */ print_set_version_2(&command); fprintf(MSG_OUT, ", "); print_if_version_4(&command); print_linksub_instruction(&command); break; case 5: /* Compare -> (Set and LinkSub) instructions */ print_if_version_5(&command); fprintf(MSG_OUT, "{ "); print_set_version_3(&command); fprintf(MSG_OUT, ", "); print_linksub_instruction(&command); fprintf(MSG_OUT, " }"); break; case 6: /* Compare -> Set, always LinkSub instructions */ print_if_version_5(&command); fprintf(MSG_OUT, "{ "); print_set_version_3(&command); fprintf(MSG_OUT, " } "); print_linksub_instruction(&command); break; default: fprintf(MSG_OUT, "WARNING: Unknown instruction type (%i)", vm_getbits(&command, 63, 3)); } /* Check if there still are bits set that were not examined */ if(command.instruction & ~ command.examined) { fprintf(MSG_OUT, " libdvdnav: vmcmd.c: [WARNING, unknown bits:"); fprintf(MSG_OUT, " %08llx", (command.instruction & ~ command.examined) ); fprintf(MSG_OUT, "]"); }}void vm_print_cmd(int row, vm_cmd_t *vm_command) { int i; fprintf(MSG_OUT, "(%03d) ", row + 1); for(i = 0; i < 8; i++) fprintf(MSG_OUT, "%02x ", vm_command->bytes[i]); fprintf(MSG_OUT, "| "); vm_print_mnemonic(vm_command); fprintf(MSG_OUT, "\n");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -