mirror of
https://github.com/libretro/xmil-libretro.git
synced 2025-02-20 00:01:35 +00:00
fix...
This commit is contained in:
parent
c02c507271
commit
7767290b9b
80
fdd/fdd_2d.c
80
fdd/fdd_2d.c
@ -7,12 +7,16 @@
|
||||
#include "fdd_mtr.h"
|
||||
|
||||
|
||||
static const _XDFINFO supportxdf[] = {
|
||||
{0, 80, 16, 1, DISKTYPE_2D},
|
||||
{0, 154, 26, 1, DISKTYPE_2HD}};
|
||||
|
||||
|
||||
static REG8 fdd2d_seek(FDDFILE fdd, REG8 media, UINT track) {
|
||||
|
||||
if ((media != 0) || (track >= 80)) {
|
||||
if ((media != fdd->inf.xdf.media) || (track >= fdd->inf.xdf.tracks)) {
|
||||
return(FDDSTAT_SEEKERR);
|
||||
}
|
||||
(void)fdd;
|
||||
return(0x00);
|
||||
}
|
||||
|
||||
@ -20,28 +24,32 @@ static REG8 fdd2d_read(FDDFILE fdd, REG8 media, UINT track, REG8 sc,
|
||||
UINT8 *ptr, UINT *size) {
|
||||
|
||||
UINT secsize;
|
||||
UINT rsize;
|
||||
FILEH fh;
|
||||
long pos;
|
||||
BRESULT b;
|
||||
|
||||
if ((media != 0) || (track >= 80) || (sc == 0) || (sc > 16)) {
|
||||
if ((media != fdd->inf.xdf.media) || (track >= fdd->inf.xdf.tracks) ||
|
||||
(sc == 0) || (sc > fdd->inf.xdf.sectors)) {
|
||||
goto fd2r_err;
|
||||
}
|
||||
secsize = min(*size, 256);
|
||||
secsize = 1 << (7 + fdd->inf.xdf.n);
|
||||
rsize = min(secsize, *size);
|
||||
if (ptr) {
|
||||
fh = file_open_rb(fdd->fname);
|
||||
if (fh == FILEH_INVALID) {
|
||||
goto fd2r_err;
|
||||
}
|
||||
pos = ((track * 16) + (sc - 1)) * 256;
|
||||
pos = ((track * fdd->inf.xdf.sectors) + (sc - 1)) * secsize;
|
||||
pos += fdd->inf.xdf.headersize;
|
||||
b = (file_seek(fh, pos, FSEEK_SET) != pos) ||
|
||||
(file_read(fh, ptr, secsize) != secsize);
|
||||
(file_read(fh, ptr, rsize) != rsize);
|
||||
file_close(fh);
|
||||
if (b) {
|
||||
goto fd2r_err;
|
||||
}
|
||||
}
|
||||
*size = secsize;
|
||||
*size = rsize;
|
||||
return(0x00);
|
||||
|
||||
fd2r_err:
|
||||
@ -51,19 +59,22 @@ fd2r_err:
|
||||
static REG8 fdd2d_write(FDDFILE fdd, REG8 media, UINT track, REG8 sc,
|
||||
const UINT8 *ptr, UINT size) {
|
||||
|
||||
UINT secsize;
|
||||
FILEH fh;
|
||||
long pos;
|
||||
BRESULT b;
|
||||
|
||||
if ((media != 0) || (track >= 80) || (sc == 0) || (sc > 16)) {
|
||||
if ((media != fdd->inf.xdf.media) || (track >= fdd->inf.xdf.tracks) ||
|
||||
(sc == 0) || (sc > fdd->inf.xdf.sectors)) {
|
||||
return(FDDSTAT_RECNFND | FDDSTAT_WRITEFAULT);
|
||||
}
|
||||
fh = file_open(fdd->fname);
|
||||
if (fh == FILEH_INVALID) {
|
||||
goto fd2w_err;
|
||||
}
|
||||
pos = ((track * 16) + (sc - 1)) * 256;
|
||||
size = min(size, 256);
|
||||
secsize = 1 << (7 + fdd->inf.xdf.n);
|
||||
pos = ((track * fdd->inf.xdf.sectors) + (sc - 1)) * secsize;
|
||||
size = min(size, secsize);
|
||||
b = (file_seek(fh, pos, FSEEK_SET) != pos) ||
|
||||
(file_write(fh, ptr, size) != size);
|
||||
file_close(fh);
|
||||
@ -79,17 +90,17 @@ fd2w_err:
|
||||
static REG8 fdd2d_crc(FDDFILE fdd, REG8 media, UINT track, UINT num,
|
||||
UINT8 *ptr) {
|
||||
|
||||
if ((media != 0) || (track >= 80) || (num >= 16)) {
|
||||
if ((media != fdd->inf.xdf.media) || (track >= fdd->inf.xdf.tracks) ||
|
||||
(num >= fdd->inf.xdf.sectors)) {
|
||||
return(FDDSTAT_RECNFND);
|
||||
}
|
||||
ptr[0] = (UINT8)(track >> 1);
|
||||
ptr[1] = (UINT8)(track & 1);
|
||||
ptr[2] = (UINT8)(num + 1);
|
||||
ptr[3] = 1;
|
||||
ptr[3] = fdd->inf.xdf.n;
|
||||
ptr[4] = 0; // CRC(Lo)
|
||||
ptr[5] = 0; // CRC(Hi)
|
||||
// fdc.s.rreg = fdc.s.c; // ƒ<>ƒ‹ƒwƒ“ƒ”ƒF<C692>[ƒ‹
|
||||
(void)fdd;
|
||||
return(0x00);
|
||||
}
|
||||
|
||||
@ -117,22 +128,47 @@ static UINT32 fdd2d_sec(FDDFILE fdd, REG8 media, UINT track, REG8 sc) {
|
||||
|
||||
BRESULT fdd2d_set(FDDFILE fdd, const OEMCHAR *fname) {
|
||||
|
||||
short attr;
|
||||
short attr;
|
||||
FILEH fh;
|
||||
UINT fdsize;
|
||||
const _XDFINFO *xdf;
|
||||
const _XDFINFO *xdfterm;
|
||||
UINT size;
|
||||
|
||||
attr = file_attr(fname);
|
||||
if (attr & 0x18) {
|
||||
return(FAILURE);
|
||||
}
|
||||
fdd->type = DISKTYPE_BETA;
|
||||
fdd->protect = (UINT8)(attr & 1);
|
||||
fdd->seek = fdd2d_seek;
|
||||
fdd->read = fdd2d_read;
|
||||
fdd->write = fdd2d_write;
|
||||
fdd->crc = fdd2d_crc;
|
||||
fh = file_open(fname);
|
||||
if (fh == FILEH_INVALID) {
|
||||
return(FAILURE);
|
||||
}
|
||||
fdsize = file_getsize(fh);
|
||||
file_close(fh);
|
||||
|
||||
xdf = supportxdf;
|
||||
xdfterm = supportxdf + NELEMENTS(supportxdf);
|
||||
while(xdf < xdfterm) {
|
||||
size = xdf->tracks;
|
||||
size *= xdf->sectors;
|
||||
size <<= (7 + xdf->n);
|
||||
if (size == fdsize) {
|
||||
file_cpyname(fdd->fname, fname, sizeof(fdd->fname));
|
||||
fdd->type = DISKTYPE_BETA;
|
||||
fdd->protect = (UINT8)(attr & 1);
|
||||
fdd->seek = fdd2d_seek;
|
||||
fdd->read = fdd2d_read;
|
||||
fdd->write = fdd2d_write;
|
||||
fdd->crc = fdd2d_crc;
|
||||
#if defined(SUPPORT_DISKEXT)
|
||||
fdd->sec = fdd2d_sec;
|
||||
fdd->sec = fdd2d_sec;
|
||||
#endif
|
||||
return(SUCCESS);
|
||||
fdd->inf.xdf = *xdf;
|
||||
return(SUCCESS);
|
||||
}
|
||||
xdf++;
|
||||
}
|
||||
return(FAILURE);
|
||||
}
|
||||
|
||||
void fdd2d_eject(FDDFILE fdd) {
|
||||
|
@ -60,13 +60,10 @@ static UINT32 getfdtype(const OEMCHAR *fname) {
|
||||
const OEMCHAR *ext;
|
||||
|
||||
ext = file_getext(fname);
|
||||
if (!milstr_cmp(ext, str_e2d)) {
|
||||
return(FTYPE_BETA);
|
||||
}
|
||||
if ((!milstr_cmp(ext, str_d88)) || (!milstr_cmp(ext, str_88d))) {
|
||||
return(FTYPE_D88);
|
||||
}
|
||||
return(FTYPE_NONE);
|
||||
return(FTYPE_BETA);
|
||||
}
|
||||
|
||||
static void setempty(FDDFILE fdd) {
|
||||
|
@ -51,6 +51,13 @@ typedef REG8 (*FDDCRC)(FDDFILE fdd, REG8 media, UINT track, UINT num,
|
||||
typedef UINT32 (*FDDSEC)(FDDFILE fdd, REG8 media, UINT track, REG8 sc);
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
UINT32 headersize;
|
||||
UINT8 tracks;
|
||||
UINT8 sectors;
|
||||
UINT8 n;
|
||||
UINT8 media;
|
||||
} _XDFINFO, *XDFINFO;
|
||||
|
||||
typedef struct {
|
||||
UINT32 fd_size;
|
||||
@ -71,6 +78,7 @@ struct _fddfile {
|
||||
FDDSEC sec;
|
||||
#endif
|
||||
union {
|
||||
_XDFINFO xdf;
|
||||
_D88INFO d88;
|
||||
} inf;
|
||||
OEMCHAR fname[MAX_PATH];
|
||||
|
@ -98,3 +98,6 @@ void file_setseparator(char *path, int maxlen);
|
||||
}
|
||||
#endif
|
||||
|
||||
#define file_createex(p, t) file_create(p)
|
||||
#define file_createex_c(p, t) file_create_c(p)
|
||||
|
||||
|
@ -65,3 +65,6 @@ void __stdcall file_setseparator(OEMCHAR *path, int maxlen);
|
||||
}
|
||||
#endif
|
||||
|
||||
#define file_createex(p, t) file_create(p)
|
||||
#define file_createex_c(p, t) file_create_c(p)
|
||||
|
||||
|
@ -65,3 +65,6 @@ void __stdcall file_setseparator(OEMCHAR *path, int maxlen);
|
||||
}
|
||||
#endif
|
||||
|
||||
#define file_createex(p, t) file_create(p)
|
||||
#define file_createex_c(p, t) file_create_c(p)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user