STDMETHODIMP CGeometry::ps2ls(long cyl, short head, short sector, long *lsect) { dsk_lsect_t ls; HRESULT hr = MapError(dg_ps2ls(&m_g, cyl, head, sector, &ls)); *lsect = ls; return hr; }
dsk_err_t logical_write(DSK_DRIVER *self, const DSK_GEOMETRY *geom, const void *buf, dsk_pcyl_t cylinder, dsk_phead_t head, dsk_psect_t sector) { LOGICAL_DSK_DRIVER *lpxself; dsk_lsect_t offset; dsk_err_t err; if (!buf || !self || !geom || self->dr_class != &dc_logical) return DSK_ERR_BADPTR; lpxself = (LOGICAL_DSK_DRIVER *)self; if (!lpxself->lpx_fp) return DSK_ERR_NOTRDY; if (lpxself->lpx_readonly) return DSK_ERR_RDONLY; err = dg_ps2ls(geom, cylinder, head, sector, &offset); if (err) return err; offset *= geom->dg_secsize; err = seekto(lpxself, offset); if (err) return err; if (fwrite(buf, 1, geom->dg_secsize, lpxself->lpx_fp) < geom->dg_secsize) { return DSK_ERR_NOADDR; } if (lpxself->lpx_filesize < offset + geom->dg_secsize) lpxself->lpx_filesize = offset + geom->dg_secsize; return DSK_ERR_OK; }
dsk_err_t logical_read(DSK_DRIVER *self, const DSK_GEOMETRY *geom, void *buf, dsk_pcyl_t cylinder, dsk_phead_t head, dsk_psect_t sector) { LOGICAL_DSK_DRIVER *lpxself; dsk_lsect_t offset; dsk_err_t err; if (!buf || !self || !geom || self->dr_class != &dc_logical) return DSK_ERR_BADPTR; lpxself = (LOGICAL_DSK_DRIVER *)self; if (!lpxself->lpx_fp) return DSK_ERR_NOTRDY; err = dg_ps2ls(geom, cylinder, head, sector, &offset); if (err) return err; offset *= geom->dg_secsize; if (fseek(lpxself->lpx_fp, offset, SEEK_SET)) return DSK_ERR_SYSERR; if (fread(buf, 1, geom->dg_secsize, lpxself->lpx_fp) < geom->dg_secsize) { return DSK_ERR_NOADDR; } return DSK_ERR_OK; }
dsk_err_t logical_xseek(DSK_DRIVER *self, const DSK_GEOMETRY *geom, dsk_pcyl_t cylinder, dsk_phead_t head) { LOGICAL_DSK_DRIVER *lpxself; dsk_err_t err; dsk_lsect_t offset; if (!self || !geom || self->dr_class != &dc_logical) return DSK_ERR_BADPTR; lpxself = (LOGICAL_DSK_DRIVER *)self; if (!lpxself->lpx_fp) return DSK_ERR_NOTRDY; if (cylinder >= geom->dg_cylinders || head >= geom->dg_heads) return DSK_ERR_SEEKFAIL; err = dg_ps2ls(geom, cylinder, head, geom->dg_secbase, &offset); if (err) return err; offset *= geom->dg_secsize; if (fseek(lpxself->lpx_fp, offset, SEEK_SET)) return DSK_ERR_SEEKFAIL; return DSK_ERR_OK; }
dsk_err_t logical_format(DSK_DRIVER *self, DSK_GEOMETRY *geom, dsk_pcyl_t cylinder, dsk_phead_t head, const DSK_FORMAT *format, unsigned char filler) { /* * Note that we completely ignore the "format" parameter, since raw LOGICAL * images don't hold track headers. */ LOGICAL_DSK_DRIVER *lpxself; dsk_lsect_t offset; unsigned long trklen; dsk_err_t err; (void)format; if (!self || !geom || self->dr_class != &dc_logical) return DSK_ERR_BADPTR; lpxself = (LOGICAL_DSK_DRIVER *)self; if (!lpxself->lpx_fp) return DSK_ERR_NOTRDY; if (lpxself->lpx_readonly) return DSK_ERR_RDONLY; trklen = geom->dg_sectors * geom->dg_secsize; err = dg_ps2ls(geom, cylinder, head, geom->dg_secbase, &offset); if (err) return err; offset *= geom->dg_secsize; err = seekto(lpxself, offset); if (err) return err; if (lpxself->lpx_filesize < offset + trklen) lpxself->lpx_filesize = offset + trklen; while (trklen--) if (fputc(filler, lpxself->lpx_fp) == EOF) return DSK_ERR_SYSERR; return DSK_ERR_OK; }