summaryrefslogtreecommitdiffstatshomepage
path: root/src/tools/imgtool/modules/os9.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/imgtool/modules/os9.cpp')
-rw-r--r--src/tools/imgtool/modules/os9.cpp158
1 files changed, 75 insertions, 83 deletions
diff --git a/src/tools/imgtool/modules/os9.cpp b/src/tools/imgtool/modules/os9.cpp
index cc016250c31..97fdcb9e209 100644
--- a/src/tools/imgtool/modules/os9.cpp
+++ b/src/tools/imgtool/modules/os9.cpp
@@ -8,13 +8,16 @@
****************************************************************************/
-#include <time.h>
-
#include "imgtool.h"
-#include "formats/imageutl.h"
-#include "formats/coco_dsk.h"
#include "iflopimg.h"
+#include "formats/coco_dsk.h"
+#include "multibyte.h"
+#include "opresolv.h"
+
+#include <cstdio>
+#include <ctime>
+
enum creation_policy_t
{
CREATE_NONE,
@@ -44,7 +47,7 @@ struct os9_diskinfo
unsigned int octal_track_density : 1;
char name[33];
- uint8_t *allocation_bitmap;
+ uint8_t allocation_bitmap[65536];
};
@@ -96,20 +99,13 @@ static void pick_string(const void *ptr, size_t offset, size_t length, char *des
-static void place_string(void *ptr, size_t offset, size_t length, const char *s)
+static void place_string(uint8_t *bptr, size_t length, const char *s)
{
- size_t i;
- uint8_t b;
- uint8_t *bptr;
-
- bptr = (uint8_t *) ptr;
- bptr += offset;
-
bptr[0] = 0x80;
- for (i = 0; s[i] && (i < length); i++)
+ for (size_t i = 0; s[i] && (i < length); i++)
{
- b = ((uint8_t) s[i]) & 0x7F;
+ uint8_t b = ((uint8_t) s[i]) & 0x7F;
if (s[i+1] == '\0')
b |= 0x80;
bptr[i] = b;
@@ -228,7 +224,7 @@ static int os9_interpret_dirent(void *entry, char **filename, uint32_t *lsn, int
entry_b[i] &= 0x7F;
entry_b[i+1] = '\0';
- *lsn = pick_integer_be(entry, 29, 3);
+ *lsn = get_u24be((uint8_t *) &entry_b[29]);
if (strcmp(entry_b, ".") && strcmp(entry_b, ".."))
*filename = entry_b;
return *filename != NULL;
@@ -257,10 +253,10 @@ static imgtoolerr_t os9_decode_file_header(imgtool::image &image,
return err;
info->lsn = lsn;
- attributes = pick_integer_be(header, 0, 1);
- info->owner_id = pick_integer_be(header, 1, 2);
- info->link_count = pick_integer_be(header, 8, 1);
- info->file_size = pick_integer_be(header, 9, 4);
+ attributes = header[0];
+ info->owner_id = get_u16be(&header[1]);
+ info->link_count = header[8];
+ info->file_size = get_u32be(&header[9]);
info->directory = (attributes & 0x80) ? 1 : 0;
info->non_sharable = (attributes & 0x40) ? 1 : 0;
info->public_execute = (attributes & 0x20) ? 1 : 0;
@@ -275,11 +271,11 @@ static imgtoolerr_t os9_decode_file_header(imgtool::image &image,
/* read all sector map entries */
max_entries = (disk_info->sector_size - 16) / 5;
- max_entries = (std::min<std::size_t>)(max_entries, ARRAY_LENGTH(info->sector_map) - 1);
+ max_entries = (std::min<std::size_t>)(max_entries, std::size(info->sector_map) - 1);
for (i = 0; i < max_entries; i++)
{
- lsn = pick_integer_be(header, 16 + (i * 5) + 0, 3);
- count = pick_integer_be(header, 16 + (i * 5) + 3, 2);
+ lsn = get_u24be(&header[16 + (i * 5) + 0]);
+ count = get_u16be(&header[16 + (i * 5) + 3]);
if (count <= 0)
break;
@@ -393,7 +389,7 @@ static imgtoolerr_t os9_set_file_size(imgtool::image &image,
/* first find out the size of our sector map */
sector_map_length = 0;
lsn = 0;
- while((lsn < current_lsn_count) && (sector_map_length < ARRAY_LENGTH(file_info->sector_map)))
+ while((lsn < current_lsn_count) && (sector_map_length < std::size(file_info->sector_map)))
{
if (file_info->sector_map[sector_map_length].count == 0)
return os9_corrupt_file_error(file_info);
@@ -434,7 +430,7 @@ static imgtoolerr_t os9_set_file_size(imgtool::image &image,
{
file_info->sector_map[sector_map_length - 1].count++;
}
- else if (sector_map_length >= ARRAY_LENGTH(file_info->sector_map))
+ else if (sector_map_length >= std::size(file_info->sector_map))
{
return IMGTOOLERR_NOSPACE;
}
@@ -456,15 +452,15 @@ static imgtoolerr_t os9_set_file_size(imgtool::image &image,
return err;
file_info->file_size = new_size;
- place_integer_be(header, 9, 4, file_info->file_size);
+ put_u32be(&header[9], file_info->file_size);
/* do we have to write the sector map? */
if (sector_map_length >= 0)
{
- for (i = 0; i < (std::min<std::size_t>)(sector_map_length + 1, ARRAY_LENGTH(file_info->sector_map)); i++)
+ for (i = 0; i < (std::min<std::size_t>)(sector_map_length + 1, std::size(file_info->sector_map)); i++)
{
- place_integer_be(header, 16 + (i * 5) + 0, 3, file_info->sector_map[i].lsn);
- place_integer_be(header, 16 + (i * 5) + 3, 2, file_info->sector_map[i].count);
+ put_u24be(&header[16 + (i * 5) + 0], file_info->sector_map[i].lsn);
+ put_u16be(&header[16 + (i * 5) + 3], file_info->sector_map[i].count);
}
}
@@ -567,7 +563,7 @@ static imgtoolerr_t os9_lookup_path(imgtool::image &img, const char *path,
/* write the file */
memset(block, 0, sizeof(block));
- place_integer_be(block, 0, 1, 0x1B | ((create == CREATE_DIR) ? 0x80 : 0x00));
+ block[0] = 0x1B | ((create == CREATE_DIR) ? 0x80 : 0x00);
err = os9_write_lsn(img, allocated_lsn, 0, block, sizeof(block));
if (err)
goto done;
@@ -585,8 +581,8 @@ static imgtoolerr_t os9_lookup_path(imgtool::image &img, const char *path,
/* now prepare the directory entry */
memset(entry, 0, sizeof(entry));
- place_string(entry, 0, 28, path);
- place_integer_be(entry, 29, 3, allocated_lsn);
+ place_string(&entry[0], 28, path);
+ put_u24be(&entry[29], allocated_lsn);
/* now write the directory entry */
entry_index = dir_size;
@@ -638,20 +634,19 @@ static imgtoolerr_t os9_diskimage_open(imgtool::image &image, imgtool::stream::p
if (ferr)
return imgtool_floppy_error(ferr);
- info->total_sectors = pick_integer_be(header, 0, 3);
- track_size_in_sectors = pick_integer_be(header, 3, 1);
- info->allocation_bitmap_bytes = pick_integer_be(header, 4, 2);
- info->cluster_size = pick_integer_be(header, 6, 2);
- info->root_dir_lsn = pick_integer_be(header, 8, 3);
- info->owner_id = pick_integer_be(header, 11, 2);
-// attributes =
- pick_integer_be(header, 13, 1);
- info->disk_id = pick_integer_be(header, 14, 2);
- info->format_flags = pick_integer_be(header, 16, 1);
- info->sectors_per_track = pick_integer_be(header, 17, 2);
- info->bootstrap_lsn = pick_integer_be(header, 21, 3);
- info->bootstrap_size = pick_integer_be(header, 24, 2);
- info->sector_size = pick_integer_be(header, 104, 2);
+ info->total_sectors = get_u24be(&header[ 0]);
+ track_size_in_sectors = header[ 3];
+ info->allocation_bitmap_bytes = get_u16be(&header[ 4]);
+ info->cluster_size = get_u16be(&header[ 6]);
+ info->root_dir_lsn = get_u24be(&header[ 8]);
+ info->owner_id = get_u16be(&header[ 11]);
+// attributes = header[ 13];
+ info->disk_id = get_u16be(&header[ 14]);
+ info->format_flags = header[ 16];
+ info->sectors_per_track = get_u16be(&header[ 17]);
+ info->bootstrap_lsn = get_u24be(&header[ 21]);
+ info->bootstrap_size = get_u16be(&header[ 24]);
+ info->sector_size = get_u16be(&header[104]);
info->sides = (info->format_flags & 0x01) ? 2 : 1;
info->double_density = (info->format_flags & 0x02) ? 1 : 0;
@@ -670,10 +665,7 @@ static imgtoolerr_t os9_diskimage_open(imgtool::image &image, imgtool::stream::p
return IMGTOOLERR_CORRUPTIMAGE;
/* is the allocation bitmap too big? */
- info->allocation_bitmap = (uint8_t*)image.malloc(info->allocation_bitmap_bytes);
- if (!info->allocation_bitmap)
- return IMGTOOLERR_OUTOFMEMORY;
- memset(info->allocation_bitmap, 0, info->allocation_bitmap_bytes);
+ memset(&info->allocation_bitmap[0], 0, info->allocation_bitmap_bytes);
/* sectors per track and track size don't jive? */
if (info->sectors_per_track != track_size_in_sectors)
@@ -747,30 +739,30 @@ static imgtoolerr_t os9_diskimage_create(imgtool::image &img, imgtool::stream::p
format_flags = ((heads > 1) ? 0x01 : 0x00) | ((tracks > 40) ? 0x02 : 0x00);
memset(&header[0], 0, sector_bytes);
- place_integer_be(&header[0], 0, 3, heads * tracks * sectors);
- place_integer_be(&header[0], 3, 1, sectors);
- place_integer_be(&header[0], 4, 2, (allocation_bitmap_bits + 7) / 8);
- place_integer_be(&header[0], 6, 2, cluster_size);
- place_integer_be(&header[0], 8, 3, 1 + allocation_bitmap_lsns);
- place_integer_be(&header[0], 11, 2, owner_id);
- place_integer_be(&header[0], 13, 1, attributes);
- place_integer_be(&header[0], 14, 2, disk_id);
- place_integer_be(&header[0], 16, 1, format_flags);
- place_integer_be(&header[0], 17, 2, sectors);
- place_string(&header[0], 31, 32, title);
- place_integer_be(&header[0], 103, 2, sector_bytes / 256);
+ put_u24be(&header[ 0], heads * tracks * sectors);
+ header[ 3] = sectors;
+ put_u16be(&header[ 4], (allocation_bitmap_bits + 7) / 8);
+ put_u16be(&header[ 6], cluster_size);
+ put_u24be(&header[ 8], 1 + allocation_bitmap_lsns);
+ put_u16be(&header[ 11], owner_id);
+ header[ 13] = attributes;
+ put_u16be(&header[ 14], disk_id);
+ header[ 16] = format_flags;
+ put_u16be(&header[ 17], sectors);
+ place_string(&header[ 31], 32, title);
+ put_u16be(&header[103], sector_bytes / 256);
/* path descriptor options */
- place_integer_be(&header[0], 0x3f+0x00, 1, 1); /* device class */
- place_integer_be(&header[0], 0x3f+0x01, 1, 1); /* drive number */
- place_integer_be(&header[0], 0x3f+0x03, 1, 0x20); /* device type */
- place_integer_be(&header[0], 0x3f+0x04, 1, 1); /* density capability */
- place_integer_be(&header[0], 0x3f+0x05, 2, tracks); /* number of tracks */
- place_integer_be(&header[0], 0x3f+0x07, 1, heads); /* number of sides */
- place_integer_be(&header[0], 0x3f+0x09, 2, sectors); /* sectors per track */
- place_integer_be(&header[0], 0x3f+0x0b, 2, sectors); /* sectors on track zero */
- place_integer_be(&header[0], 0x3f+0x0d, 1, 3); /* sector interleave factor */
- place_integer_be(&header[0], 0x3f+0x0e, 1, 8); /* default sectors per allocation */
+ header[0x3f+0x00] = 1; /* device class */
+ header[0x3f+0x01] = 1; /* drive number */
+ header[0x3f+0x03] = 0x20; /* device type */
+ header[0x3f+0x04] = 1; /* density capability */
+ put_u16be(&header[0x3f+0x05], tracks); /* number of tracks */
+ header[0x3f+0x07] = heads; /* number of sides */
+ put_u16be(&header[0x3f+0x09], sectors); /* sectors per track */
+ put_u16be(&header[0x3f+0x0b], sectors); /* sectors on track zero */
+ header[0x3f+0x0d] = 3; /* sector interleave factor */
+ header[0x3f+0x0e] = 8; /* default sectors per allocation */
err = (imgtoolerr_t)floppy_write_sector(imgtool_floppy(img), 0, 0, first_sector_id, 0, &header[0], sector_bytes, 0); /* TODO: pass ddam argument from imgtool */
if (err)
@@ -824,8 +816,8 @@ static imgtoolerr_t os9_diskimage_create(imgtool::image &img, imgtool::stream::p
header[0x0D] = (uint8_t) (ltime->tm_year % 100);
header[0x0E] = (uint8_t) ltime->tm_mon;
header[0x0F] = (uint8_t) ltime->tm_mday;
- place_integer_be(&header[0], 0x10, 3, 1 + allocation_bitmap_lsns + 1);
- place_integer_be(&header[0], 0x13, 2, 8);
+ put_u24be(&header[0x10], 1 + allocation_bitmap_lsns + 1);
+ put_u16be(&header[0x13], 8);
err = (imgtoolerr_t)floppy_write_sector(imgtool_floppy(img), 0, 0, first_sector_id + 1 + allocation_bitmap_lsns, 0, &header[0], sector_bytes, 0); /* TODO: pass ddam argument from imgtool */
if (err)
@@ -929,7 +921,7 @@ static imgtoolerr_t os9_diskimage_nextenum(imgtool::directory &enumeration, imgt
}
/* if the filename is ".", the file should point to the current directory */
- if (!strcmp(filename, ".") && (pick_integer_be(dir_entry, 29, 3) != os9enum->dir_info.lsn))
+ if (!strcmp(filename, ".") && (get_u24be(&dir_entry[29]) != os9enum->dir_info.lsn))
{
imgtool_warn("Directory \".\" does not point back to same directory");
}
@@ -946,14 +938,14 @@ static imgtoolerr_t os9_diskimage_nextenum(imgtool::directory &enumeration, imgt
while(!filename[0] || !strcmp(filename, ".") || !strcmp(filename, ".."));
/* read file attributes */
- lsn = pick_integer_be(dir_entry, 29, 3);
+ lsn = get_u24be(&dir_entry[29]);
err = os9_decode_file_header(enumeration.image(), lsn, &file_info);
if (err)
return err;
/* fill out imgtool_dirent structure */
- snprintf(ent.filename, ARRAY_LENGTH(ent.filename), "%s", filename);
- snprintf(ent.attr, ARRAY_LENGTH(ent.attr), "%c%c%c%c%c%c%c%c",
+ snprintf(ent.filename, std::size(ent.filename), "%s", filename);
+ snprintf(ent.attr, std::size(ent.attr), "%c%c%c%c%c%c%c%c",
file_info.directory ? 'd' : '-',
file_info.non_sharable ? 's' : '-',
file_info.public_execute ? 'x' : '-',
@@ -1143,7 +1135,7 @@ static imgtoolerr_t os9_diskimage_delete(imgtool::partition &partition, const ch
if (err)
return err;
- for (i = 0; (i < ARRAY_LENGTH(file_info.sector_map)) && file_info.sector_map[i].count; i++)
+ for (i = 0; (i < std::size(file_info.sector_map)) && file_info.sector_map[i].count; i++)
{
lsn = file_info.sector_map[i].lsn;
for (j = 0; j < file_info.sector_map[i].count; j++)
@@ -1185,10 +1177,10 @@ static imgtoolerr_t os9_diskimage_createdir(imgtool::partition &partition, const
/* create intial directories */
memset(dir_data, 0, sizeof(dir_data));
- place_string(dir_data, 0, 32, "..");
- place_integer_be(dir_data, 29, 3, parent_lsn);
- place_string(dir_data, 32, 32, ".");
- place_integer_be(dir_data, 61, 3, file_info.lsn);
+ place_string(&dir_data[ 0], 32, "..");
+ put_u24be(&dir_data[29], parent_lsn);
+ place_string(&dir_data[32], 32, ".");
+ put_u24be(&dir_data[61], file_info.lsn);
err = os9_write_lsn(image, file_info.sector_map[0].lsn, 0, dir_data, sizeof(dir_data));
if (err)