FreeCalypso > hg > fc-pcsc-tools
annotate simtool/writecmd.c @ 212:43b57865fdb5
fc-simtool spn command: fix ancient bug
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 07 Mar 2021 06:46:21 +0000 |
parents | f1cf569dbba3 |
children |
rev | line source |
---|---|
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 #include <sys/types.h> |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 #include <stdio.h> |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 #include <stdlib.h> |
202
3f6f50103dd3
fc-simtool: update-rec-prev separate command eliminated,
Mychaela Falconia <falcon@freecalypso.org>
parents:
141
diff
changeset
|
4 #include <string.h> |
3f6f50103dd3
fc-simtool: update-rec-prev separate command eliminated,
Mychaela Falconia <falcon@freecalypso.org>
parents:
141
diff
changeset
|
5 #include <strings.h> |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 #include "curfile.h" |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 cmd_update_bin(argc, argv) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 char **argv; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 { |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 unsigned offset, len; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 u_char data[255]; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 int rc; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 offset = strtoul(argv[1], 0, 0); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 if (offset > 0xFFFF) { |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 fprintf(stderr, "error: offset argument is out of range\n"); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 return(-1); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 } |
141
a1aa8ee2da85
read_hex_data_file(): add maxlen argument
Mychaela Falconia <falcon@freecalypso.org>
parents:
78
diff
changeset
|
20 rc = read_hex_data_file(argv[2], data, 255); |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 if (rc < 0) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 return(rc); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 len = rc; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 return update_bin_op(offset, data, len); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 } |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 cmd_update_bin_imm(argc, argv) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 char **argv; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 { |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 unsigned offset, len; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 u_char data[255]; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 int rc; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 offset = strtoul(argv[1], 0, 0); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 if (offset > 0xFFFF) { |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 fprintf(stderr, "error: offset argument is out of range\n"); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 return(-1); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 } |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 rc = decode_hex_data_from_string(argv[2], data, 1, 255); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 if (rc < 0) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 return(rc); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 len = rc; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 return update_bin_op(offset, data, len); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 } |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 cmd_update_rec(argc, argv) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 char **argv; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 { |
202
3f6f50103dd3
fc-simtool: update-rec-prev separate command eliminated,
Mychaela Falconia <falcon@freecalypso.org>
parents:
141
diff
changeset
|
49 unsigned recno, mode; |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 u_char data[255]; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 int rc; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 |
202
3f6f50103dd3
fc-simtool: update-rec-prev separate command eliminated,
Mychaela Falconia <falcon@freecalypso.org>
parents:
141
diff
changeset
|
53 if (!strcmp(argv[1], "prev")) { |
3f6f50103dd3
fc-simtool: update-rec-prev separate command eliminated,
Mychaela Falconia <falcon@freecalypso.org>
parents:
141
diff
changeset
|
54 recno = 0; |
3f6f50103dd3
fc-simtool: update-rec-prev separate command eliminated,
Mychaela Falconia <falcon@freecalypso.org>
parents:
141
diff
changeset
|
55 mode = 0x03; |
3f6f50103dd3
fc-simtool: update-rec-prev separate command eliminated,
Mychaela Falconia <falcon@freecalypso.org>
parents:
141
diff
changeset
|
56 } else { |
3f6f50103dd3
fc-simtool: update-rec-prev separate command eliminated,
Mychaela Falconia <falcon@freecalypso.org>
parents:
141
diff
changeset
|
57 recno = strtoul(argv[1], 0, 0); |
3f6f50103dd3
fc-simtool: update-rec-prev separate command eliminated,
Mychaela Falconia <falcon@freecalypso.org>
parents:
141
diff
changeset
|
58 if (recno < 1 || recno > 255) { |
3f6f50103dd3
fc-simtool: update-rec-prev separate command eliminated,
Mychaela Falconia <falcon@freecalypso.org>
parents:
141
diff
changeset
|
59 fprintf(stderr, |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 "error: record number argument is out of range\n"); |
202
3f6f50103dd3
fc-simtool: update-rec-prev separate command eliminated,
Mychaela Falconia <falcon@freecalypso.org>
parents:
141
diff
changeset
|
61 return(-1); |
3f6f50103dd3
fc-simtool: update-rec-prev separate command eliminated,
Mychaela Falconia <falcon@freecalypso.org>
parents:
141
diff
changeset
|
62 } |
3f6f50103dd3
fc-simtool: update-rec-prev separate command eliminated,
Mychaela Falconia <falcon@freecalypso.org>
parents:
141
diff
changeset
|
63 mode = 0x04; |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 } |
141
a1aa8ee2da85
read_hex_data_file(): add maxlen argument
Mychaela Falconia <falcon@freecalypso.org>
parents:
78
diff
changeset
|
65 rc = read_hex_data_file(argv[2], data, 255); |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 if (rc < 0) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 return(rc); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 if (rc != curfile_record_len) { |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 fprintf(stderr, "error: hex data length != EF record length\n"); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 return(-1); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 } |
202
3f6f50103dd3
fc-simtool: update-rec-prev separate command eliminated,
Mychaela Falconia <falcon@freecalypso.org>
parents:
141
diff
changeset
|
72 return update_rec_op(recno, mode, data, curfile_record_len); |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 } |
203
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
74 |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
75 cmd_update_rec_imm(argc, argv) |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
76 char **argv; |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
77 { |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
78 unsigned recno, mode; |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
79 u_char data[255]; |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
80 int rc; |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
81 |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
82 if (!strcmp(argv[1], "prev")) { |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
83 recno = 0; |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
84 mode = 0x03; |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
85 } else { |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
86 recno = strtoul(argv[1], 0, 0); |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
87 if (recno < 1 || recno > 255) { |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
88 fprintf(stderr, |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
89 "error: record number argument is out of range\n"); |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
90 return(-1); |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
91 } |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
92 mode = 0x04; |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
93 } |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
94 rc = decode_hex_data_from_string(argv[2], data, 1, 255); |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
95 if (rc < 0) |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
96 return(rc); |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
97 if (rc != curfile_record_len) { |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
98 fprintf(stderr, "error: hex data length != EF record length\n"); |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
99 return(-1); |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
100 } |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
101 return update_rec_op(recno, mode, data, curfile_record_len); |
647267e39c21
fc-simtool update-rec-imm command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
202
diff
changeset
|
102 } |
204
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
103 |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
104 cmd_update_rec_fill(argc, argv) |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
105 char **argv; |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
106 { |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
107 unsigned recno, mode, fill_byte; |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
108 u_char data[255]; |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
109 |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
110 if (!strcmp(argv[1], "prev")) { |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
111 recno = 0; |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
112 mode = 0x03; |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
113 } else { |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
114 recno = strtoul(argv[1], 0, 0); |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
115 if (recno < 1 || recno > 255) { |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
116 fprintf(stderr, |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
117 "error: record number argument is out of range\n"); |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
118 return(-1); |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
119 } |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
120 mode = 0x04; |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
121 } |
206
f1cf569dbba3
fc-simtool erase-file & update-rec-fill: make fill byte always hex
Mychaela Falconia <falcon@freecalypso.org>
parents:
204
diff
changeset
|
122 fill_byte = strtoul(argv[2], 0, 16); |
204
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
123 if (fill_byte > 0xFF) { |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
124 fprintf(stderr, "error: invalid fill byte argument\n"); |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
125 return(-1); |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
126 } |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
127 memset(data, fill_byte, curfile_record_len); |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
128 return update_rec_op(recno, mode, data, curfile_record_len); |
a462012c9e67
fc-simtool: update-rec-fill command implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
203
diff
changeset
|
129 } |