static inline void setCheck(size32_t size, void * _ptr) { byte * ptr = static_cast<byte *>(_ptr); size32_t capacity = RoxieRowCapacity(ptr); memset(ptr+size, 0, capacity - size - extraSize); unsigned short * check = reinterpret_cast<unsigned short *>(ptr + capacity - extraSize); *check = chksum16(ptr, capacity-extraSize); }
static inline void setCheck(size32_t size, void * _ptr) { byte * ptr = static_cast<byte *>(_ptr); memsize_t capacity = RoxieRowCapacity(ptr); if (capacity < size + extraSize) throw MakeStringException(0, "Data was written past the end of the row - allocated %d, written %d", (size32_t)(capacity - extraSize), size); memset(ptr+size, 0, capacity - size - extraSize); unsigned short * check = reinterpret_cast<unsigned short *>(ptr + capacity - extraSize); *check = chksum16(ptr, capacity-extraSize); }
static inline bool isValid(const void * _ptr) { if (RoxieRowHasDestructor(_ptr)) { const byte * ptr = static_cast<const byte *>(_ptr); memsize_t capacity = RoxieRowCapacity(ptr); const unsigned short * check = reinterpret_cast<const unsigned short *>(ptr + capacity - extraSize); return chksum16(ptr, capacity-extraSize) == *check; } return true; }
/* write data to sector */ static imgtoolerr_t vzdos_write_sector_data(imgtool_image *img, int track, int sector, UINT8 *data) { int ret, data_start; UINT8 buffer[DATA_SIZE + 4]; /* data + checksum */ ret = vzdos_get_data_start(img, track, sector, &data_start); 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)); 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; return IMGTOOLERR_SUCCESS; }
/* return the actual data of a sector */ static imgtoolerr_t vzdos_read_sector_data(imgtool_image *img, int track, int sector, UINT8 *data) { int ret, data_start; UINT8 buffer[DATA_SIZE + 4]; /* data + checksum */ ret = vzdos_get_data_start(img, track, sector, &data_start); if (ret) return (imgtoolerr_t)ret; ret = floppy_read_sector(imgtool_floppy(img), 0, track, sector_order[sector], data_start, &buffer, sizeof(buffer)); if (ret) return (imgtoolerr_t)ret; /* verify sector checksums */ if (pick_integer_le(buffer, DATA_SIZE + 2, 2) != chksum16(buffer, DATA_SIZE + 2)) return IMGTOOLERR_CORRUPTFILE; memcpy(data, &buffer, DATA_SIZE + 2); return IMGTOOLERR_SUCCESS; }