annotate sw/sniff-dec/command.c @ 55:5268246520de

simsniff-dec: decode command opcodes
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 04 Oct 2023 00:20:05 +0000
parents b0524d1dc6ef
children 966a54303d68
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
41
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * Here we implement decoding of command APDU exchanges.
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 */
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 #include <sys/types.h>
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 #include <stdio.h>
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 #include <stdlib.h>
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include <string.h>
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include <strings.h>
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include "state.h"
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 extern char linebuf[];
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 extern int lineno;
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 extern unsigned rx_byte;
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 extern int state;
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16
45
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
17 static char cmd_start_timestamp[18];
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
18 static int cmd_start_line;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
19 static char data_start_timestamp[18];
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
20 static int data_start_line;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
21 static char sw1_timestamp[18];
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
22 static int sw1_line;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
23
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
24 static u_char cmd_hdr[5];
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
25 static unsigned hdr_byte_count;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
26 static unsigned data_total, data_sofar, data_thistime;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
27 static u_char data_buf[256], sw1;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
28
41
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 void
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 start_cmd_header()
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 {
45
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
32 strcpy(cmd_start_timestamp, linebuf);
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
33 cmd_start_line = lineno;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
34 cmd_hdr[0] = rx_byte;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
35 hdr_byte_count = 1;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
36 state = STATE_CMD_HDR;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
37 }
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
38
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
39 static void
55
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
40 decode_cmd_opcode()
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
41 {
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
42 char *cmdname;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
43
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
44 switch (cmd_hdr[1]) {
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
45 case 0xA4:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
46 cmdname = "SELECT";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
47 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
48 case 0xF2:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
49 cmdname = "STATUS";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
50 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
51 case 0xB0:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
52 cmdname = "READ BINARY";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
53 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
54 case 0xD6:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
55 cmdname = "UPDATE BINARY";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
56 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
57 case 0xB2:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
58 cmdname = "READ RECORD";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
59 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
60 case 0xDC:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
61 cmdname = "UPDATE RECORD";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
62 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
63 case 0xA2:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
64 cmdname = "SEEK";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
65 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
66 case 0x32:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
67 cmdname = "INCREASE";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
68 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
69 case 0x20:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
70 cmdname = "VERIFY PIN";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
71 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
72 case 0x24:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
73 cmdname = "CHANGE PIN";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
74 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
75 case 0x26:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
76 cmdname = "DISABLE PIN";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
77 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
78 case 0x28:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
79 cmdname = "ENABLE PIN";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
80 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
81 case 0x2C:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
82 cmdname = "UNBLOCK PIN";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
83 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
84 case 0x04:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
85 cmdname = "INVALIDATE";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
86 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
87 case 0x44:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
88 cmdname = "REHABILITATE";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
89 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
90 case 0x88:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
91 cmdname = "RUN GSM ALGO";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
92 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
93 case 0xFA:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
94 cmdname = "SLEEP";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
95 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
96 case 0xC0:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
97 cmdname = "GET RESPONSE";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
98 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
99 case 0x10:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
100 cmdname = "TERMINAL PROFILE";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
101 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
102 case 0xC2:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
103 cmdname = "ENVELOPE";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
104 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
105 case 0x12:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
106 cmdname = "FETCH";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
107 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
108 case 0x14:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
109 cmdname = "TERMINAL RESPONSE";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
110 break;
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
111 default:
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
112 cmdname = "Unknown!";
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
113 }
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
114 printf(" Command: %s\n", cmdname);
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
115 }
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
116
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
117 static void
45
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
118 print_cmd_hdr()
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
119 {
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
120 unsigned n;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
121
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
122 printf("%s line %d: CMD", cmd_start_timestamp, cmd_start_line);
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
123 for (n = 0; n < 5; n++)
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
124 printf(" %02X", cmd_hdr[n]);
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
125 putchar('\n');
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
126 }
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
127
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
128 void
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
129 cmd_hdr_byte_in()
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
130 {
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
131 cmd_hdr[hdr_byte_count++] = rx_byte;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
132 if (hdr_byte_count < 5)
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
133 return;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
134 print_cmd_hdr();
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
135 if ((cmd_hdr[1] & 0xF0) == 0x60 || (cmd_hdr[1] & 0xF0) == 0x90) {
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
136 printf(" ERROR: INS byte is invalid!\n");
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
137 state = STATE_ERROR;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
138 return;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
139 }
55
5268246520de simsniff-dec: decode command opcodes
Mychaela Falconia <falcon@freecalypso.org>
parents: 45
diff changeset
140 decode_cmd_opcode();
45
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
141 if (cmd_hdr[4])
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
142 data_total = cmd_hdr[4];
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
143 else
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
144 data_total = 256;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
145 data_sofar = 0;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
146 state = STATE_CMD_PROC;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
147 }
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
148
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
149 static void
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
150 print_data()
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
151 {
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
152 unsigned n;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
153
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
154 printf("%s line %d: DATA\n", data_start_timestamp, data_start_line);
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
155 for (n = 0; n < data_sofar; n++) {
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
156 printf(" %02X", data_buf[n]);
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
157 if ((n & 15) == 15 || n == data_sofar - 1)
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
158 putchar('\n');
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
159 }
41
118a12e9483b simtrace3-sniff-dec started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 }
45
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
161
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
162 static void
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
163 handle_sw1()
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
164 {
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
165 strcpy(sw1_timestamp, linebuf);
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
166 sw1_line = lineno;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
167 sw1 = rx_byte;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
168 if (data_sofar)
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
169 print_data();
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
170 state = STATE_CMD_SW;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
171 }
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
172
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
173 void
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
174 handle_ack(single)
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
175 {
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
176 if (data_sofar >= data_total) {
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
177 printf("%s line %d: ERROR: ACK for more data than possible\n",
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
178 linebuf, lineno);
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
179 state = STATE_ERROR;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
180 return;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
181 }
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
182 if (!data_sofar) {
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
183 strcpy(data_start_timestamp, linebuf);
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
184 data_start_line = lineno;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
185 }
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
186 if (single)
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
187 data_thistime = 1;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
188 else
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
189 data_thistime = data_total - data_sofar;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
190 state = STATE_CMD_DATA;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
191 }
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
192
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
193 void
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
194 cmd_proc_byte_in()
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
195 {
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
196 if (rx_byte == 0x60)
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
197 return;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
198 if ((rx_byte & 0xF0) == 0x60 || (rx_byte & 0xF0) == 0x90) {
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
199 handle_sw1();
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
200 return;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
201 }
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
202 if (rx_byte == cmd_hdr[1]) {
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
203 handle_ack(0);
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
204 return;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
205 }
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
206 if (rx_byte == (cmd_hdr[1] ^ 0xFF)) {
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
207 handle_ack(1);
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
208 return;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
209 }
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
210 printf("%s line %d: ERROR: invalid procedure byte\n", linebuf, lineno);
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
211 state = STATE_ERROR;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
212 }
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
213
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
214 void
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
215 cmd_data_byte_in()
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
216 {
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
217 data_buf[data_sofar++] = rx_byte;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
218 data_thistime--;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
219 if (data_thistime)
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
220 return;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
221 state = STATE_CMD_PROC;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
222 }
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
223
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
224 void
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
225 cmd_sw2_byte_in()
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
226 {
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
227 printf("%s line %d: SW %02X %02X\n", sw1_timestamp, sw1_line, sw1,
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
228 rx_byte);
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
229 state = STATE_READY_FOR_CMD;
b0524d1dc6ef simtrace3-sniff-dec: implement command decoding
Mychaela Falconia <falcon@freecalypso.org>
parents: 41
diff changeset
230 }