FreeCalypso > hg > fc-sim-sniff
comparison sw/sniff-dec/command.c @ 45:b0524d1dc6ef
simtrace3-sniff-dec: implement command decoding
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 31 Aug 2023 09:32:48 +0000 |
parents | 118a12e9483b |
children | 5268246520de |
comparison
equal
deleted
inserted
replaced
44:74330513121e | 45:b0524d1dc6ef |
---|---|
12 extern char linebuf[]; | 12 extern char linebuf[]; |
13 extern int lineno; | 13 extern int lineno; |
14 extern unsigned rx_byte; | 14 extern unsigned rx_byte; |
15 extern int state; | 15 extern int state; |
16 | 16 |
17 static char cmd_start_timestamp[18]; | |
18 static int cmd_start_line; | |
19 static char data_start_timestamp[18]; | |
20 static int data_start_line; | |
21 static char sw1_timestamp[18]; | |
22 static int sw1_line; | |
23 | |
24 static u_char cmd_hdr[5]; | |
25 static unsigned hdr_byte_count; | |
26 static unsigned data_total, data_sofar, data_thistime; | |
27 static u_char data_buf[256], sw1; | |
28 | |
17 void | 29 void |
18 start_cmd_header() | 30 start_cmd_header() |
19 { | 31 { |
20 printf("input line %d: command header, end of implementation so far\n", | 32 strcpy(cmd_start_timestamp, linebuf); |
21 lineno); | 33 cmd_start_line = lineno; |
22 exit(0); | 34 cmd_hdr[0] = rx_byte; |
35 hdr_byte_count = 1; | |
36 state = STATE_CMD_HDR; | |
23 } | 37 } |
38 | |
39 static void | |
40 print_cmd_hdr() | |
41 { | |
42 unsigned n; | |
43 | |
44 printf("%s line %d: CMD", cmd_start_timestamp, cmd_start_line); | |
45 for (n = 0; n < 5; n++) | |
46 printf(" %02X", cmd_hdr[n]); | |
47 putchar('\n'); | |
48 } | |
49 | |
50 void | |
51 cmd_hdr_byte_in() | |
52 { | |
53 cmd_hdr[hdr_byte_count++] = rx_byte; | |
54 if (hdr_byte_count < 5) | |
55 return; | |
56 print_cmd_hdr(); | |
57 if ((cmd_hdr[1] & 0xF0) == 0x60 || (cmd_hdr[1] & 0xF0) == 0x90) { | |
58 printf(" ERROR: INS byte is invalid!\n"); | |
59 state = STATE_ERROR; | |
60 return; | |
61 } | |
62 if (cmd_hdr[4]) | |
63 data_total = cmd_hdr[4]; | |
64 else | |
65 data_total = 256; | |
66 data_sofar = 0; | |
67 state = STATE_CMD_PROC; | |
68 } | |
69 | |
70 static void | |
71 print_data() | |
72 { | |
73 unsigned n; | |
74 | |
75 printf("%s line %d: DATA\n", data_start_timestamp, data_start_line); | |
76 for (n = 0; n < data_sofar; n++) { | |
77 printf(" %02X", data_buf[n]); | |
78 if ((n & 15) == 15 || n == data_sofar - 1) | |
79 putchar('\n'); | |
80 } | |
81 } | |
82 | |
83 static void | |
84 handle_sw1() | |
85 { | |
86 strcpy(sw1_timestamp, linebuf); | |
87 sw1_line = lineno; | |
88 sw1 = rx_byte; | |
89 if (data_sofar) | |
90 print_data(); | |
91 state = STATE_CMD_SW; | |
92 } | |
93 | |
94 void | |
95 handle_ack(single) | |
96 { | |
97 if (data_sofar >= data_total) { | |
98 printf("%s line %d: ERROR: ACK for more data than possible\n", | |
99 linebuf, lineno); | |
100 state = STATE_ERROR; | |
101 return; | |
102 } | |
103 if (!data_sofar) { | |
104 strcpy(data_start_timestamp, linebuf); | |
105 data_start_line = lineno; | |
106 } | |
107 if (single) | |
108 data_thistime = 1; | |
109 else | |
110 data_thistime = data_total - data_sofar; | |
111 state = STATE_CMD_DATA; | |
112 } | |
113 | |
114 void | |
115 cmd_proc_byte_in() | |
116 { | |
117 if (rx_byte == 0x60) | |
118 return; | |
119 if ((rx_byte & 0xF0) == 0x60 || (rx_byte & 0xF0) == 0x90) { | |
120 handle_sw1(); | |
121 return; | |
122 } | |
123 if (rx_byte == cmd_hdr[1]) { | |
124 handle_ack(0); | |
125 return; | |
126 } | |
127 if (rx_byte == (cmd_hdr[1] ^ 0xFF)) { | |
128 handle_ack(1); | |
129 return; | |
130 } | |
131 printf("%s line %d: ERROR: invalid procedure byte\n", linebuf, lineno); | |
132 state = STATE_ERROR; | |
133 } | |
134 | |
135 void | |
136 cmd_data_byte_in() | |
137 { | |
138 data_buf[data_sofar++] = rx_byte; | |
139 data_thistime--; | |
140 if (data_thistime) | |
141 return; | |
142 state = STATE_CMD_PROC; | |
143 } | |
144 | |
145 void | |
146 cmd_sw2_byte_in() | |
147 { | |
148 printf("%s line %d: SW %02X %02X\n", sw1_timestamp, sw1_line, sw1, | |
149 rx_byte); | |
150 state = STATE_READY_FOR_CMD; | |
151 } |