File:  [RetroPC.NET] / xmil / fdd / fdd_2d.c
Revision 1.6: download - view: text, annotated - select for diffs
Tue Aug 10 17:28:48 2004 JST (21 years, 2 months ago) by yui
Branches: MAIN
CVS tags: HEAD
fix...

#include	"compiler.h"
#include	"dosio.h"
#include	"pccore.h"
#include	"iocore.h"
#include	"fddfile.h"
#include	"fdd_2d.h"
#include	"fdd_mtr.h"


static REG8 fdd2d_seek(FDDFILE fdd, REG8 media, UINT track) {

	if ((media != 0) || (track >= 80)) {
		return(FDDSTAT_SEEKERR);
	}
	(void)fdd;
	return(0x00);
}

static REG8 fdd2d_read(FDDFILE fdd, REG8 media, UINT track, REG8 sc,
												UINT8 *ptr, UINT *size) {

	UINT	secsize;
	FILEH	fh;
	long	pos;
	BRESULT	b;

	if ((media != 0) || (track >= 80) || (sc == 0) || (sc > 16)) {
		goto fd2r_err;
	}
	secsize = min(*size, 256);
	if (ptr) {
		fh = file_open_rb(fdd->fname);
		if (fh == FILEH_INVALID) {
			goto fd2r_err;
		}
		pos = ((track * 16) + (sc - 1)) * 256;
		b = (file_seek(fh, pos, FSEEK_SET) != pos) ||
			(file_read(fh, ptr, secsize) != secsize);
		file_close(fh);
		if (b) {
			goto fd2r_err;
		}
	}
	*size = secsize;
	return(0x00);

fd2r_err:
	return(FDDSTAT_RECNFND);
}

static REG8 fdd2d_write(FDDFILE fdd, REG8 media, UINT track, REG8 sc,
												const UINT8 *ptr, UINT size) {

	FILEH	fh;
	long	pos;
	BRESULT	b;

	if ((media != 0) || (track >= 80) || (sc == 0) || (sc > 16)) {
		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);
	b = (file_seek(fh, pos, FSEEK_SET) != pos) ||
		(file_write(fh, ptr, size) != size);
	file_close(fh);
	if (b) {
		goto fd2w_err;
	}
	return(0x00);

fd2w_err:
	return(FDDSTAT_WRITEFAULT);
}

static REG8 fdd2d_crc(FDDFILE fdd, REG8 media, UINT track, UINT num,
												UINT8 *ptr) {

	if ((media != 0) || (track >= 80) || (num >= 16)) {
		return(FDDSTAT_RECNFND);
	}
	ptr[0] = (UINT8)(track >> 1);
	ptr[1] = (UINT8)(track & 1);
	ptr[2] = (UINT8)(num + 1);
	ptr[3] = 1;
	ptr[4] = 0;										// CRC(Lo)
	ptr[5] = 0;										// CRC(Hi)
//	fdc.s.rreg = fdc.s.c;							// メルヘンヴェール
	(void)fdd;
	return(0x00);
}


// ----

BRESULT fdd2d_set(FDDFILE fdd, const OEMCHAR *fname) {

	short	attr;

	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;
	return(SUCCESS);
}

void fdd2d_eject(FDDFILE fdd) {

	(void)fdd;
}


RetroPC.NET-CVS <cvs@retropc.net>