diff options
Diffstat (limited to 'src/tools/imgtool/modules/vzdos.cpp')
-rw-r--r-- | src/tools/imgtool/modules/vzdos.cpp | 65 |
1 files changed, 30 insertions, 35 deletions
diff --git a/src/tools/imgtool/modules/vzdos.cpp b/src/tools/imgtool/modules/vzdos.cpp index 4ccbc801253..0005c0973cf 100644 --- a/src/tools/imgtool/modules/vzdos.cpp +++ b/src/tools/imgtool/modules/vzdos.cpp @@ -8,15 +8,22 @@ ****************************************************************************/ -#include <cstdio> -#include <cstring> -#include <cstdlib> -#include <cmath> #include "imgtool.h" -#include "formats/imageutl.h" -#include "formats/vt_dsk.h" +#include "filter.h" #include "iflopimg.h" +#include "formats/vt_dsk_legacy.h" + +#include "corestr.h" +#include "hashing.h" +#include "multibyte.h" +#include "opresolv.h" + +#include <cmath> +#include <cstdio> +#include <cstdlib> +#include <cstring> + /* sector format @@ -88,18 +95,6 @@ static int vzdos_get_fname_len(const char *fname) return len; } -/* calculate checksum-16 of buffer */ -static uint16_t chksum16(uint8_t *buffer, int len) -{ - int i; - uint16_t sum = 0; - - for (i = 0; i < len; i++) - sum += buffer[i]; - - return sum; -} - /* returns the offset where the actual sector data starts */ static imgtoolerr_t vzdos_get_data_start(imgtool::image &img, int track, int sector, int *start) { @@ -135,7 +130,7 @@ static imgtoolerr_t vzdos_read_sector_data(imgtool::image &img, int track, int s if (ret) return (imgtoolerr_t)ret; /* verify sector checksums */ - if (pick_integer_le(buffer, DATA_SIZE + 2, 2) != chksum16(buffer, DATA_SIZE + 2)) + if (get_u16le(&buffer[DATA_SIZE + 2]) != util::sum16_creator::simple(buffer, DATA_SIZE + 2)) return IMGTOOLERR_CORRUPTFILE; memcpy(data, &buffer, DATA_SIZE + 2); @@ -153,7 +148,7 @@ static imgtoolerr_t vzdos_write_sector_data(imgtool::image &img, int track, int if (ret) return (imgtoolerr_t)ret; memcpy(buffer, data, DATA_SIZE + 2); - place_integer_le(buffer, DATA_SIZE + 2, 2, chksum16(data, DATA_SIZE + 2)); + put_u16le(&buffer[DATA_SIZE + 2], util::sum16_creator::simple(data, DATA_SIZE + 2)); ret = floppy_write_sector(imgtool_floppy(img), 0, track, sector_order[sector], data_start, buffer, sizeof(buffer), 0); /* TODO: pass ddam argument from imgtool */ if (ret) return (imgtoolerr_t)ret; @@ -183,10 +178,10 @@ static imgtoolerr_t vzdos_get_dirent(imgtool::image &img, int index, vzdos_diren entry = ((index % 8) * sizeof(vzdos_dirent)); memcpy(ent, &buffer[entry], 10); - ent->start_track = pick_integer_le(&buffer[entry], 10, 1); - ent->start_sector = pick_integer_le(&buffer[entry], 11, 1); - ent->start_address = pick_integer_le(&buffer[entry], 12, 2); - ent->end_address = pick_integer_le(&buffer[entry], 14, 2); + ent->start_track = buffer[entry + 10]; + ent->start_sector = buffer[entry + 11]; + ent->start_address = get_u16le(&buffer[entry + 12]); + ent->end_address = get_u16le(&buffer[entry + 14]); if (ent->ftype == 0x00) return IMGTOOLERR_FILENOTFOUND; @@ -214,10 +209,10 @@ static imgtoolerr_t vzdos_set_dirent(imgtool::image &img, int index, vzdos_diren entry = ((index % 8) * sizeof(vzdos_dirent)); memcpy(&buffer[entry], &ent, 10); - place_integer_le(buffer, entry + 10, 1, ent.start_track); - place_integer_le(buffer, entry + 11, 1, ent.start_sector); - place_integer_le(buffer, entry + 12, 2, ent.start_address); - place_integer_le(buffer, entry + 14, 2, ent.end_address); + buffer[entry + 10] = ent.start_track; + buffer[entry + 11] = ent.start_sector; + put_u16le(&buffer[entry + 12], ent.start_address); + put_u16le(&buffer[entry + 14], ent.end_address); /* save new sector */ ret = vzdos_write_sector_data(img, 0, (int) index / 8, buffer); @@ -508,12 +503,12 @@ static imgtoolerr_t vzdos_diskimage_readfile(imgtool::partition &partition, cons if (ret) return ret; /* detect sectors pointing to themselfs */ - if ((track == (int)pick_integer_le(buffer, DATA_SIZE, 1)) && (sector == (int)pick_integer_le(buffer, DATA_SIZE + 1, 1))) + if ((track == (int)buffer[DATA_SIZE]) && (sector == (int)buffer[DATA_SIZE + 1])) return IMGTOOLERR_CORRUPTIMAGE; /* load next track and sector values */ - track = pick_integer_le(buffer, DATA_SIZE, 1); - sector = pick_integer_le(buffer, DATA_SIZE + 1, 1); + track = buffer[DATA_SIZE]; + sector = buffer[DATA_SIZE + 1]; /* track 0 is invalid */ if ((track == 0) && (filesize > DATA_SIZE)) @@ -589,8 +584,8 @@ static imgtoolerr_t vzdos_diskimage_deletefile(imgtool::partition &partition, co if (ret) return ret; /* load next track and sector values */ - next_track = pick_integer_le(buffer, DATA_SIZE, 1); - next_sector = pick_integer_le(buffer, DATA_SIZE + 1, 1); + next_track = buffer[DATA_SIZE]; + next_sector = buffer[DATA_SIZE + 1]; /* overwrite sector with default values */ ret = vzdos_clear_sector(img, track, sector); @@ -848,7 +843,7 @@ static imgtoolerr_t vzsnapshot_readfile(imgtool::partition &partition, const cha memset(header + 4, 0x00, 17); memcpy(header + 4, entry.fname, vzdos_get_fname_len(entry.fname) + 1); - place_integer_le(header, 22, 2, entry.start_address); + put_u16le(&header[22], entry.start_address); /* write header to file */ destf.write(header, sizeof(header)); @@ -873,7 +868,7 @@ static imgtoolerr_t vzsnapshot_writefile(imgtool::partition &partition, const ch /* prepare directory entry */ entry.ftype = header[21] == 0xF1 ? 'B' : 'T'; entry.delimitor = ':'; - entry.start_address = pick_integer_le(header, 22, 2); + entry.start_address = get_u16le(&header[22]); /* filename from header or directly? */ fnameopt = opts->lookup_int('F'); |