STDMETHODIMP CDisk::alform(IGeometry *g, long track, short filler) { HRESULT hr; DSK_GEOMETRY geom; g_to_dg(g, &geom); hr = MapError(dsk_alform(m_driver, &geom, track, (unsigned char)filler)); dg_to_g(&geom, g); return hr; }
dsk_err_t p3fs_mkfs(PLUS3FS *pfs, const char *name, const char *type, const char *compression, unsigned char *boot_spec, int timestamped) { dsk_err_t err; dsk_ltrack_t track; int heads, dirent; char msg[50]; PLUS3FS fs; if (pfs == NULL) { return DSK_ERR_BADPTR; } fs = malloc(sizeof(PLUS3FS_IMPL)); *pfs = fs; memset(fs, 0, sizeof(*fs)); heads = (boot_spec[1] & 3) ? 2 : 1; /* Work out how big the buffers for the boot sector and directory * need to be. Start by getting the drive geometry straight. */ err = dg_pcwgeom(&fs->geom, boot_spec); if (err) return err; /* Now the CP/M filesystem parameters */ fs->blocksize = 128 << (boot_spec[6]); /* Block size */ fs->offset = boot_spec[5]; /* Reserved tracks */ fs->maxtrack = heads * boot_spec[2]; fs->dirblocks = boot_spec[7]; fs->nextblock = fs->dirblocks; /* First free block */ fs->maxdir = (fs->dirblocks * fs->blocksize) / 32; /* Max block number is number of usable sectors divided by * sectors per block */ fs->maxblock = ((fs->maxtrack - fs->offset) * fs->geom.dg_sectors) / (fs->blocksize / fs->geom.dg_secsize); --fs->maxblock; if (fs->maxblock < 256) fs->exm = (fs->blocksize / 1024) - 1; else fs->exm = (fs->blocksize / 2048) - 1; /* Allocate the buffers */ fs->bootsec = malloc(fs->geom.dg_secsize + 32 * fs->maxdir); if (!fs->bootsec) return DSK_ERR_NOMEM; fs->cpmdir = fs->bootsec + fs->geom.dg_secsize; memset(fs->cpmdir, 0xE5, 32 * fs->maxdir); fs->timestamped = timestamped; if (timestamped) { for (dirent = 3; dirent < fs->maxdir; dirent += 4) { memset(fs->cpmdir + 32 * dirent, 0, 32); fs->cpmdir[32 * dirent] = 0x21; } } memset(fs->bootsec, 0xe5, fs->geom.dg_secsize); memcpy(fs->bootsec, boot_spec, 10); /* Create a new DSK file */ err = dsk_creat(&fs->drive, name, type, compression); if (err) return err; /* Format all its tracks */ for (track = 0; track < fs->maxtrack; track++) { sprintf(msg, "Formatting track %d/%d", track, fs->maxtrack); dsk_report(msg); if (!err) err = dsk_alform(fs->drive, &fs->geom, track, 0xe5); } dsk_report("Writing boot sector"); if (!err) err = dsk_lwrite(fs->drive, &fs->geom, fs->bootsec, 0); dsk_report_end(); return err; }