FreeCalypso > hg > fc-sim-tools
annotate simtool/readef.c @ 41:5ee00413b8af
serial: beginning of fcsim-serial-be
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Sat, 20 Mar 2021 20:53:51 +0000 | 
| parents | ddd767f6e15b | 
| children | 49b7e02787c1 | 
| rev | line source | 
|---|---|
| 10 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 1 /* | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 2 * This module implements the readef command for dumping the complete | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 3 * content of SIM files. | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 4 */ | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 5 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 6 #include <sys/types.h> | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 7 #include <ctype.h> | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 8 #include <stdio.h> | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 9 #include <stdlib.h> | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 10 #include "simresp.h" | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 11 #include "curfile.h" | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 12 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 13 static void | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 14 hexdump_with_offset(outf, extoff) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 15 FILE *outf; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 16 unsigned extoff; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 17 { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 18 unsigned off, cc, n, c; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 19 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 20 for (off = 0; off < sim_resp_data_len; off += cc) { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 21 fprintf(outf, "%04X:", extoff + off); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 22 cc = 16; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 23 if (sim_resp_data_len - off < cc) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 24 cc = sim_resp_data_len - off; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 25 for (n = 0; n < 16; n++) { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 26 if (n == 0 || n == 8) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 27 putc(' ', outf); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 28 putc(' ', outf); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 29 if (n < cc) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 30 fprintf(outf, "%02X", sim_resp_data[off + n]); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 31 else { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 32 putc(' ', outf); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 33 putc(' ', outf); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 34 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 35 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 36 putc(' ', outf); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 37 putc(' ', outf); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 38 for (n = 0; n < cc; n++) { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 39 c = sim_resp_data[off + n]; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 40 if (c < 0x20 || c > 0x7E) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 41 c = '.'; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 42 putc(c, outf); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 43 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 44 putc('\n', outf); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 45 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 46 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 47 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 48 static | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 49 readef_transparent(outf) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 50 FILE *outf; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 51 { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 52 unsigned off, cc; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 53 int rc; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 54 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 55 for (off = 0; off < curfile_total_size; off += cc) { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 56 cc = curfile_total_size - off; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 57 if (cc > 256) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 58 cc = 256; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 59 rc = readbin_op(off, cc); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 60 if (rc < 0) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 61 return(rc); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 62 hexdump_with_offset(outf, off); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 63 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 64 return(0); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 65 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 66 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 67 static | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 68 readef_records(outf) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 69 FILE *outf; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 70 { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 71 unsigned recno; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 72 int rc; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 73 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 74 for (recno = 1; recno <= curfile_record_count; recno++) { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 75 fprintf(outf, "Record #%u:\n", recno); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 76 rc = readrec_op(recno, 0x04, curfile_record_len); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 77 if (rc < 0) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 78 return(rc); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 79 display_sim_resp_in_hex(outf); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 80 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 81 return(0); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 82 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 83 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 84 cmd_readef(argc, argv, outf) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 85 char **argv; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 86 FILE *outf; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 87 { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 88 int file_id, rc; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 89 unsigned readlen; | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 90 | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 91 if (isxdigit(argv[1][0]) && isxdigit(argv[1][1]) && | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 92 isxdigit(argv[1][2]) && isxdigit(argv[1][3]) && !argv[1][4]) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 93 file_id = strtoul(argv[1], 0, 16); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 94 else | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 95 file_id = find_symbolic_file_name(argv[1]); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 96 if (file_id < 0) { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 97 fprintf(stderr, | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 98 "error: file ID argument is not a hex value or a recognized symbolic name\n"); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 99 return(-1); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 100 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 101 rc = select_op(file_id); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 102 if (rc < 0) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 103 return(rc); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 104 rc = parse_ef_select_response(); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 105 if (rc < 0) | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 106 return(rc); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 107 show_access_conditions(outf, "UPDATE", sim_resp_data[8] & 0xF); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 108 show_access_conditions(outf, "READ & SEEK", sim_resp_data[8] >> 4); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 109 show_access_conditions(outf, "INCREASE", sim_resp_data[9] >> 4); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 110 show_access_conditions(outf, "INVALIDATE", sim_resp_data[10] & 0xF); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 111 show_access_conditions(outf, "REHABILITATE", sim_resp_data[10] >> 4); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 112 fprintf(outf, "File status: %02X\n", sim_resp_data[11]); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 113 switch (curfile_structure) { | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 114 case 0x00: | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 115 fprintf(outf, "Transparent EF of %u byte(s)\n", | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 116 curfile_total_size); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 117 return readef_transparent(outf); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 118 case 0x01: | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 119 fprintf(outf, "%u records of %u bytes (linear fixed)\n", | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 120 curfile_record_count, curfile_record_len); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 121 return readef_records(outf); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 122 case 0x03: | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 123 fprintf(outf, "%u records of %u bytes (cyclic)\n", | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 124 curfile_record_count, curfile_record_len); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 125 return readef_records(outf); | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 126 } | 
| 
ddd767f6e15b
fc-simtool ported over
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 127 } | 
