annotate vmcmd.c @ 6:5f319e02e333 src

Some cleaning up. changed exit(1) to assert(0) so they actually get seen by the user so that it helps developers more.
author jcdutton
date Sat, 06 Apr 2002 18:31:50 +0000
parents 3ddf0eaece51
children 6f0fb88d1463
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
1 /*
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
2 * Copyright (C) 2000, 2001 Martin Norbäck, Håkan Hjort
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
3 *
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
4 * This file is part of libdvdnav, a DVD navigation library. It is modified
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
5 * from a file originally part of the Ogle DVD player.
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
6 *
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
7 * libdvdnav is free software; you can redistribute it and/or modify
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
8 * it under the terms of the GNU General Public License as published by
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
10 * (at your option) any later version.
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
11 *
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
12 * libdvdnav is distributed in the hope that it will be useful,
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
15 * GNU General Public License for more details.
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
16 *
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
18 * along with this program; if not, write to the Free Software
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
20 *
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
21 * $Id$
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
22 *
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
23 */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
24
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
25 #ifdef HAVE_CONFIG_H
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
26 #include "config.h"
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
27 #endif
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
28
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
29 #include <stdio.h>
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
30 #include <ctype.h>
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
31 #include <inttypes.h>
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
32
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
33 #include "vmcmd.h"
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
34
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
35
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
36 /* freebsd compatibility */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
37 #ifndef PRIu8
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
38 #define PRIu8 "d"
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
39 #endif
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
40
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
41 /* freebsd compatibility */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
42 #ifndef PRIu16
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
43 #define PRIu16 "d"
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
44 #endif
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
45
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
46
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
47 typedef struct
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
48 {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
49 uint8_t bits[8];
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
50 uint8_t examined[8];
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
51 } cmd_t;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
52
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
53 /* Fix this.. pass as parameters instead. */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
54 static cmd_t cmd;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
55
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
56 static const char *cmp_op_table[] = {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
57 NULL, "&", "==", "!=", ">=", ">", "<=", "<"
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
58 };
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
59 static const char *set_op_table[] = {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
60 NULL, "=", "<->", "+=", "-=", "*=", "/=", "%=", "rnd", "&=", "|=", "^="
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
61 };
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
62
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
63 static const char *link_table[] = {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
64 "LinkNoLink", "LinkTopC", "LinkNextC", "LinkPrevC",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
65 NULL, "LinkTopPG", "LinkNextPG", "LinkPrevPG",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
66 NULL, "LinkTopPGC", "LinkNextPGC", "LinkPrevPGC",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
67 "LinkGoUpPGC", "LinkTailPGC", NULL, NULL,
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
68 "RSM"
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
69 };
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
70
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
71 static const char *system_reg_table[] = {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
72 "Menu Description Language Code",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
73 "Audio Stream Number",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
74 "Sub-picture Stream Number",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
75 "Angle Number",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
76 "Title Track Number",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
77 "VTS Title Track Number",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
78 "VTS PGC Number",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
79 "PTT Number for One_Sequential_PGC_Title",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
80 "Highlighted Button Number",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
81 "Navigation Timer",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
82 "Title PGC Number for Navigation Timer",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
83 "Audio Mixing Mode for Karaoke",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
84 "Country Code for Parental Management",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
85 "Parental Level",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
86 "Player Configurations for Video",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
87 "Player Configurations for Audio",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
88 "Initial Language Code for Audio",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
89 "Initial Language Code Extension for Audio",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
90 "Initial Language Code for Sub-picture",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
91 "Initial Language Code Extension for Sub-picture",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
92 "Player Regional Code",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
93 "Reserved 21",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
94 "Reserved 22",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
95 "Reserved 23"
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
96 };
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
97
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
98 static const char *system_reg_abbr_table[] = {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
99 NULL,
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
100 "ASTN",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
101 "SPSTN",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
102 "AGLN",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
103 "TTN",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
104 "VTS_TTN",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
105 "TT_PGCN",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
106 "PTTN",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
107 "HL_BTNN",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
108 "NVTMR",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
109 "NV_PGCN",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
110 NULL,
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
111 "CC_PLT",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
112 "PLT",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
113 NULL,
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
114 NULL,
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
115 NULL,
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
116 NULL,
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
117 NULL,
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
118 NULL,
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
119 NULL,
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
120 NULL,
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
121 NULL,
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
122 NULL,
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
123 };
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
124
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
125
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
126
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
127 static uint32_t bits(int byte, int bit, int count) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
128 uint32_t val = 0;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
129 int bit_mask;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
130
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
131 while(count--) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
132 if(bit > 7) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
133 bit = 0;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
134 byte++;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
135 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
136 bit_mask = 0x01 << (7-bit);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
137 val <<= 1;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
138 if((cmd.bits[byte]) & bit_mask)
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
139 val |= 1;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
140 cmd.examined[byte] |= bit_mask;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
141 bit++;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
142 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
143 return val;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
144 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
145
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
146
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
147 static void print_system_reg(uint16_t reg) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
148 if(reg < sizeof(system_reg_abbr_table) / sizeof(char *))
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
149 fprintf(stderr, system_reg_table[reg]);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
150 else
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
151 fprintf(stderr, " WARNING: Unknown system register ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
152 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
153
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
154 static void print_reg(uint8_t reg) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
155 if(reg & 0x80)
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
156 print_system_reg(reg & 0x7f);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
157 else
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
158 if(reg < 16)
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
159 fprintf(stderr, "g[%" PRIu8 "]", reg);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
160 else
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
161 fprintf(stderr, " WARNING: Unknown general register ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
162 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
163
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
164 static void print_cmp_op(uint8_t op) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
165 if(op < sizeof(cmp_op_table) / sizeof(char *) && cmp_op_table[op] != NULL)
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
166 fprintf(stderr, " %s ", cmp_op_table[op]);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
167 else
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
168 fprintf(stderr, " WARNING: Unknown compare op ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
169 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
170
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
171 static void print_set_op(uint8_t op) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
172 if(op < sizeof(set_op_table) / sizeof(char *) && set_op_table[op] != NULL)
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
173 fprintf(stderr, " %s ", set_op_table[op]);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
174 else
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
175 fprintf(stderr, " WARNING: Unknown set op ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
176 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
177
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
178 static void print_reg_or_data(int immediate, int byte) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
179 if(immediate) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
180 int i = bits(byte,0,16);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
181
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
182 fprintf(stderr, "0x%x", i);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
183 if(isprint(i & 0xff) && isprint((i>>8) & 0xff))
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
184 fprintf(stderr, " (\"%c%c\")", (char)((i>>8) & 0xff), (char)(i & 0xff));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
185 } else {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
186 print_reg(bits(byte + 1,0,8));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
187 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
188 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
189
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
190 static void print_reg_or_data_2(int immediate, int byte) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
191 if(immediate)
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
192 fprintf(stderr, "0x%x", bits(byte,1,7));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
193 else
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
194 fprintf(stderr, "g[%" PRIu8 "]", bits(byte,4,4));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
195 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
196
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
197 static void print_if_version_1(void) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
198 uint8_t op = bits(1,1,3);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
199
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
200 if(op) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
201 fprintf(stderr, "if (");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
202 print_reg(bits(3,0,8));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
203 print_cmp_op(op);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
204 print_reg_or_data(bits(1,0,1), 4);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
205 fprintf(stderr, ") ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
206 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
207 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
208
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
209 static void print_if_version_2(void) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
210 uint8_t op = bits(1,1,3);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
211
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
212 if(op) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
213 fprintf(stderr, "if (");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
214 print_reg(bits(6,0,8));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
215 print_cmp_op(op);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
216 print_reg(bits(7,0,8));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
217 fprintf(stderr, ") ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
218 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
219 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
220
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
221 static void print_if_version_3(void) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
222 uint8_t op = bits(1,1,3);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
223
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
224 if(op) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
225 fprintf(stderr, "if (");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
226 print_reg(bits(2,4,4));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
227 print_cmp_op(op);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
228 print_reg_or_data(bits(1,0,1), 6);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
229 fprintf(stderr, ") ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
230 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
231 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
232
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
233 static void print_if_version_4(void) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
234 uint8_t op = bits(1,1,3);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
235
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
236 if(op) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
237 fprintf(stderr, "if (");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
238 print_reg(bits(1,4,4));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
239 print_cmp_op(op);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
240 print_reg_or_data(bits(1,0,1), 4);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
241 fprintf(stderr, ") ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
242 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
243 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
244
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
245 static void print_special_instruction(void) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
246 uint8_t op = bits(1,4,4);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
247
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
248 switch(op) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
249 case 0: /* NOP */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
250 fprintf(stderr, "Nop");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
251 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
252 case 1: /* Goto line */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
253 fprintf(stderr, "Goto %" PRIu8, bits(7,0,8));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
254 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
255 case 2: /* Break */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
256 fprintf(stderr, "Break");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
257 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
258 case 3: /* Parental level */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
259 fprintf(stderr, "SetTmpPML %" PRIu8 ", Goto %" PRIu8,
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
260 bits(6,4,4), bits(7,0,8));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
261 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
262 default:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
263 fprintf(stderr, "WARNING: Unknown special instruction (%i)",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
264 bits(1,4,4));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
265 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
266 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
267
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
268 static void print_linksub_instruction(void) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
269 int linkop = bits(7,3,5);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
270 int button = bits(6,0,6);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
271
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
272 if(linkop < sizeof(link_table)/sizeof(char *) && link_table[linkop] != NULL)
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
273 fprintf(stderr, "%s (button %" PRIu8 ")", link_table[linkop], button);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
274 else
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
275 fprintf(stderr, "WARNING: Unknown linksub instruction (%i)", linkop);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
276 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
277
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
278 static void print_link_instruction(int optional) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
279 uint8_t op = bits(1,4,4);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
280
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
281 if(optional && op)
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
282 fprintf(stderr, ", ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
283
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
284 switch(op) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
285 case 0:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
286 if(!optional)
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
287 fprintf(stderr, "WARNING: NOP (link)!");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
288 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
289 case 1:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
290 print_linksub_instruction();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
291 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
292 case 4:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
293 fprintf(stderr, "LinkPGCN %" PRIu16, bits(6,1,15));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
294 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
295 case 5:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
296 fprintf(stderr, "LinkPTT %" PRIu16 " (button %" PRIu8 ")",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
297 bits(6,6,10), bits(6,0,6));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
298 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
299 case 6:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
300 fprintf(stderr, "LinkPGN %" PRIu8 " (button %" PRIu8 ")",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
301 bits(7,1,7), bits(6,0,6));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
302 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
303 case 7:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
304 fprintf(stderr, "LinkCN %" PRIu8 " (button %" PRIu8 ")",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
305 bits(7,0,8), bits(6,0,6));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
306 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
307 default:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
308 fprintf(stderr, "WARNING: Unknown link instruction");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
309 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
310 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
311
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
312 static void print_jump_instruction(void) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
313 switch(bits(1,4,4)) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
314 case 1:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
315 fprintf(stderr, "Exit");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
316 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
317 case 2:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
318 fprintf(stderr, "JumpTT %" PRIu8, bits(5,1,7));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
319 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
320 case 3:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
321 fprintf(stderr, "JumpVTS_TT %" PRIu8, bits(5,1,7));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
322 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
323 case 5:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
324 fprintf(stderr, "JumpVTS_PTT %" PRIu8 ":%" PRIu16,
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
325 bits(5,1,7), bits(2,6,10));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
326 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
327 case 6:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
328 switch(bits(5,0,2)) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
329 case 0:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
330 fprintf(stderr, "JumpSS FP");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
331 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
332 case 1:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
333 fprintf(stderr, "JumpSS VMGM (menu %" PRIu8 ")", bits(5,4,4));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
334 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
335 case 2:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
336 fprintf(stderr, "JumpSS VTSM (vts %" PRIu8 ", title %" PRIu8
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
337 ", menu %" PRIu8 ")", bits(4,0,8), bits(3,0,8), bits(5,4,4));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
338 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
339 case 3:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
340 fprintf(stderr, "JumpSS VMGM (pgc %" PRIu8 ")", bits(2,1,15));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
341 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
342 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
343 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
344 case 8:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
345 switch(bits(5,0,2)) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
346 case 0:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
347 fprintf(stderr, "CallSS FP (rsm_cell %" PRIu8 ")",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
348 bits(4,0,8));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
349 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
350 case 1:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
351 fprintf(stderr, "CallSS VMGM (menu %" PRIu8
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
352 ", rsm_cell %" PRIu8 ")", bits(5,4,4), bits(4,0,8));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
353 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
354 case 2:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
355 fprintf(stderr, "CallSS VTSM (menu %" PRIu8
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
356 ", rsm_cell %" PRIu8 ")", bits(5,4,4), bits(4,0,8));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
357 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
358 case 3:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
359 fprintf(stderr, "CallSS VMGM (pgc %" PRIu8 ", rsm_cell %" PRIu8 ")",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
360 bits(2,1,15), bits(4,0,8));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
361 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
362 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
363 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
364 default:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
365 fprintf(stderr, "WARNING: Unknown Jump/Call instruction");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
366 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
367 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
368
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
369 static void print_system_set(void) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
370 int i;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
371
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
372 switch(bits(0,4,4)) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
373 case 1: /* Set system reg 1 &| 2 &| 3 (Audio, Subp. Angle) */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
374 for(i = 1; i <= 3; i++) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
375 if(bits(2+i,0,1)) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
376 print_system_reg(i);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
377 fprintf(stderr, " = ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
378 print_reg_or_data_2(bits(0,3,1), 2 + i);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
379 fprintf(stderr, " ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
380 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
381 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
382 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
383 case 2: /* Set system reg 9 & 10 (Navigation timer, Title PGC number) */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
384 print_system_reg(9);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
385 fprintf(stderr, " = ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
386 print_reg_or_data(bits(0,3,1), 2);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
387 fprintf(stderr, " ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
388 print_system_reg(10);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
389 fprintf(stderr, " = %" PRIu8, bits(5,0,8)); /* ?? */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
390 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
391 case 3: /* Mode: Counter / Register + Set */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
392 fprintf(stderr, "SetMode ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
393 if(bits(5,0,1))
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
394 fprintf(stderr, "Counter ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
395 else
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
396 fprintf(stderr, "Register ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
397 print_reg(bits(5,4,4));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
398 print_set_op(0x1); /* '=' */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
399 print_reg_or_data(bits(0,3,1), 2);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
400 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
401 case 6: /* Set system reg 8 (Highlighted button) */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
402 print_system_reg(8);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
403 if(bits(0,3,1)) /* immediate */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
404 fprintf(stderr, " = 0x%x (button no %d)", bits(4,0,16), bits(4,0,6));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
405 else
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
406 fprintf(stderr, " = g[%" PRIu8 "]", bits(5,4,4));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
407 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
408 default:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
409 fprintf(stderr, "WARNING: Unknown system set instruction (%i)",
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
410 bits(0,4,4));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
411 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
412 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
413
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
414 static void print_set_version_1(void) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
415 uint8_t set_op = bits(0,4,4);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
416
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
417 if(set_op) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
418 print_reg(bits(3,0,8));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
419 print_set_op(set_op);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
420 print_reg_or_data(bits(0,3,1), 4);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
421 } else {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
422 fprintf(stderr, "NOP");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
423 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
424 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
425
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
426 static void print_set_version_2(void) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
427 uint8_t set_op = bits(0,4,4);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
428
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
429 if(set_op) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
430 print_reg(bits(1,4,4));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
431 print_set_op(set_op);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
432 print_reg_or_data(bits(0,3,1), 2);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
433 } else {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
434 fprintf(stderr, "NOP");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
435 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
436 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
437
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
438 void vmPrint_mnemonic(vm_cmd_t *command) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
439 int i, extra_bits;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
440
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
441 for(i = 0; i < 8; i++) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
442 cmd.bits[i] = command->bytes[i];
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
443 cmd.examined[i] = 0;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
444 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
445
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
446 switch(bits(0,0,3)) { /* three first bits */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
447 case 0: /* Special instructions */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
448 print_if_version_1();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
449 print_special_instruction();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
450 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
451 case 1: /* Jump/Call or Link instructions */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
452 if(bits(0,3,1)) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
453 print_if_version_2();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
454 print_jump_instruction();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
455 } else {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
456 print_if_version_1();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
457 print_link_instruction(0); /* must be pressent */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
458 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
459 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
460 case 2: /* Set System Parameters instructions */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
461 print_if_version_2();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
462 print_system_set();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
463 print_link_instruction(1); /* either 'if' or 'link' */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
464 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
465 case 3: /* Set General Parameters instructions */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
466 print_if_version_3();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
467 print_set_version_1();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
468 print_link_instruction(1); /* either 'if' or 'link' */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
469 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
470 case 4: /* Set, Compare -> LinkSub instructions */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
471 print_set_version_2();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
472 fprintf(stderr, ", ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
473 print_if_version_4();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
474 print_linksub_instruction();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
475 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
476 case 5: /* Compare -> (Set and LinkSub) instructions */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
477 print_if_version_4();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
478 fprintf(stderr, "{ ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
479 print_set_version_2();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
480 fprintf(stderr, ", ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
481 print_linksub_instruction();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
482 fprintf(stderr, " }");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
483 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
484 case 6: /* Compare -> Set, always LinkSub instructions */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
485 print_if_version_4();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
486 fprintf(stderr, "{ ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
487 print_set_version_2();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
488 fprintf(stderr, " } ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
489 print_linksub_instruction();
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
490 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
491 default:
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
492 fprintf(stderr, "WARNING: Unknown instruction type (%i)", bits(0,0,3));
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
493 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
494 /* Check if there still are bits set that were not examined */
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
495
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
496 extra_bits = 0;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
497 for(i = 0; i < 8; i++)
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
498 if(cmd.bits[i] & ~ cmd.examined[i]) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
499 extra_bits = 1;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
500 break;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
501 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
502 if(extra_bits) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
503 fprintf(stderr, " [WARNING, unknown bits:");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
504 for(i = 0; i < 8; i++)
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
505 fprintf(stderr, " %02x", cmd.bits[i] & ~ cmd.examined[i]);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
506 fprintf(stderr, "]");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
507 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
508 }
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
509
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
510 void vmPrint_CMD(int row, vm_cmd_t *command) {
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
511 int i;
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
512
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
513 fprintf(stderr, "(%03d) ", row + 1);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
514 for(i = 0; i < 8; i++)
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
515 fprintf(stderr, "%02x ", command->bytes[i]);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
516 fprintf(stderr, "| ");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
517
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
518 vmPrint_mnemonic(command);
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
519 fprintf(stderr, "\n");
3ddf0eaece51 Initial revision
richwareham
parents:
diff changeset
520 }