Пример #1
0
static int devfd_transfer(bool is_read, uint8_t is_raw)
{
    int ct = 0;
    int tries;
    int blocks = udata.u_nblock;
    uint16_t lba = udata.u_block;

    // kprintf("[%s %d @ %x : %d:%x]\n", is_read ? "read" : "write",
    //     blocks, lba, is_raw, udata.u_dptr);
    // if (!is_read)
    //     return blocks << BLKSHIFT;

    if (is_raw && d_blkoff(BLKSHIFT))
        return -1;

    fd_select(0);
    fd765_is_user = is_raw;
    fd765_buffer = udata.u_dptr;

    while (blocks != 0)
    {
        for (tries = 0; tries < 3; tries ++)
        {
            nudge_timer();
            if (tries != 0)
                fd_recalibrate();
            fd_seek(lba);

            fd765_sectors = 10 - fd765_sector;
            if (fd765_sectors > blocks)
                fd765_sectors = blocks;

            if (is_read)
                fd765_do_read();
            else
                fd765_do_write();

            /* Did it work ? */
            if ((fd765_status[0] & 0xc0) == 0)
                break;
        }
        if (tries == 3)
        {
            kprintf("fd%d: I/O error %d:%d\n", is_read, lba);
            udata.u_error = EIO;
            break;
        }
        lba += fd765_sectors;
        blocks -= fd765_sectors;
        ct += fd765_sectors;
    }

    return ct << BLKSHIFT;
}
Пример #2
0
static void fd_calibrate_done(int status)
{
	DPRINT(("fd_calibrate_done()\n"));
	STOP_TIMEOUT();

	/* set the correct speed now */
	if (status & FDC1772STAT_RECNF) {
		printk("fd%d: restore failed\n", SelectedDrive);
		fd_error();
	} else {
		unit[SelectedDrive].track = 0;
		fd_seek();
	}
}
Пример #3
0
uint klseek(FILE file, uint offset, uint direction){
	struct stat status;
	uint err = fd_stat(file, &status);

	if(err != 0)
		return (uint) -1;

	switch(direction){
		case SEEK_SET:
			fd_seek(file, offset);
			break;
		case SEEK_CUR:
			fd_seek(file, fd_offset(file) + offset);
			break;
		case SEEK_END:
			fd_seek(file, status.st_size + offset);
			break;

		default:
			return (uint) -1;
	}

	return 0;
}
Пример #4
0
static void do_fd_action(int drive)
{
	struct request *req;
	DPRINT(("do_fd_action unit[drive].track=%d\n", unit[drive].track));

#ifdef TRACKBUFFER
repeat:

	if (IS_BUFFERED( drive, ReqSide, ReqTrack )) {
		req = CURRENT;
		if (ReqCmd == READ) {
			copy_buffer( SECTOR_BUFFER(ReqSector), ReqData );
			if (++ReqCnt < req->current_nr_sectors) {
				/* read next sector */
				setup_req_params( drive );
				goto repeat;
			} else {
				/* all sectors finished */
				req->nr_sectors -= req->current_nr_sectors;
				req->sector += req->current_nr_sectors;
				end_request(req, 1);
				redo_fd_request();
				return;
			}
		} else {
			/* cmd == WRITE, pay attention to track buffer
			 * consistency! */
			copy_buffer( ReqData, SECTOR_BUFFER(ReqSector) );
		}
	}
#endif

	if (SelectedDrive != drive) {
		/*unit[drive].track = -1; DAG */
		fd_select_drive(drive);
	};


	if (unit[drive].track == -1)
		fd_calibrate();
	else if (unit[drive].track != ReqTrack << unit[drive].disktype->stretch)
		fd_seek();
	else
		fd_rwsec();
}
Пример #5
0
static void describe_monster_desc(const monster_race *r_ptr)
{
	char buf[2048];

	char *s, *t;

	int match = (r_ptr->flags1 & (RF1_FEMALE)) ? 2 : 1;

	int state = 0;

#ifdef DELAY_LOAD_R_TEXT

	int fd;

	/* Build the filename */
	path_build(buf, 1024, ANGBAND_DIR_DATA, "monster.raw");

	/* Open the "raw" file */
	fd = fd_open(buf, O_RDONLY);

	/* Use file */
	if (fd >= 0)
	{
		long pos;

		/* Starting position */
		pos = r_ptr->text;

		/* Additional offsets */
		pos += r_head->head_size;
		pos += r_head->info_size;
		pos += r_head->name_size;

#if 0

		/* Maximal length */
		len = r_head->text_size - r_ptr->text;

		/* Actual length */
		for (i = r_idx+1; i < z_info->r_max; i++)
		{
			/* Actual length */
			if (r_info[i].text > r_ptr->text)
			{
				/* Extract length */
				len = r_info[i].text - r_ptr->text;

				/* Done */
				break;
			}
		}

		/* Maximal length */
		if (len > 2048) len = 2048;

#endif

		/* Seek */
		fd_seek(fd, pos);

		/* Read a chunk of data */
		fd_read(fd, buf, sizeof(buf));

		/* Close it */
		fd_close(fd);
	}

#else

	/* Simple method */
	my_strcpy(buf, r_text + r_ptr->text, sizeof(buf));

#endif

	/* Remove gender sensitivity */
	for (t = s = buf; *s; s++)
	{
		if (*s == '|')
		{
			state++;
			if (state == 3) state = 0;
		}
		else if (!state || (state == match))
		{
			*t++ = *s;
		}
	}

	/* Terminate buffer */
	*t = '\0';

	/* Dump it */
	text_out(buf);

	if (strlen(buf)) text_out("  ");
}
Пример #6
0
/*
 * Seek score 'i' in the highscore file
 */
static int highscore_seek(int i)
{
    /* Seek for the requested record */
    return (fd_seek(highscore_fd, (huge)(i) * sizeof(high_score)));
}
Пример #7
0
static void describe_monster_desc(int r_idx)
{
	const monster_race *r_ptr = &r_info[r_idx];
	char buf[2048];

#ifdef DELAY_LOAD_R_TEXT

	int fd;

	/* Build the filename */
	path_build(buf, 1024, ANGBAND_DIR_DATA, "monster.raw");

	/* Open the "raw" file */
	fd = fd_open(buf, O_RDONLY);

	/* Use file */
	if (fd >= 0)
	{
		long pos;

		/* Starting position */
		pos = r_ptr->text;

		/* Additional offsets */
		pos += r_head->head_size;
		pos += r_head->info_size;
		pos += r_head->name_size;

#if 0

		/* Maximal length */
		len = r_head->text_size - r_ptr->text;

		/* Actual length */
		for (i = r_idx+1; i < z_info->r_max; i++)
		{
			/* Actual length */
			if (r_info[i].text > r_ptr->text)
			{
				/* Extract length */
				len = r_info[i].text - r_ptr->text;

				/* Done */
				break;
			}
		}

		/* Maximal length */
		if (len > 2048) len = 2048;

#endif

		/* Seek */
		fd_seek(fd, pos);

		/* Read a chunk of data */
		fd_read(fd, buf, sizeof(buf));

		/* Close it */
		fd_close(fd);
	}

#else

	/* Simple method */
	strcpy(buf, r_text + r_ptr->text);

#endif

	/* Dump it */
	text_out(buf);

	if (strlen(buf)) text_out("  ");
}
Пример #8
0
static int fd_transfer(uint8_t minor, bool is_read, uint8_t rawflag)
{
    int8_t tries;
    uint8_t err = 0;
    uint8_t drive = minor & 3;
    uint8_t trackno, sector;
    uint8_t large = !(minor & 0x10);
    const uint8_t *skew = skewtab[large];		/* skew table */

    if(rawflag == 2)
        goto bad2;

    fd_map = rawflag;
    if (rawflag && d_blkoff(BLKSHIFT))
            return -1;


    /* Command to go to the controller after any seek is done */
    fd_cmd[0] = is_read ? FD_READ : FD_WRITE;
    /* Control byte: autowait, DD, motor, 5", drive bit */
    fd_cmd[1] = 0xE0 | selmap[drive];
    if (large)
        fd_cmd[1] = 0x10;	/* turn on 8" bit */
    /* Directon of xfer */
    fd_cmd[2] = is_read ? OPDIR_READ: OPDIR_WRITE;
    fd_cmd[5] = 0x10 | delay[drive];

    /*
     *	Restore the track register to match this drive
     */
    if (track[drive] != 0xFF)
        fd_track = track[drive];
    else
        fd_reset();

    /*
     *	Begin transfers
     */
    while (udata.u_done < udata.u_nblock) {
        /* Need to consider SS v DS here */
        if (large) {
            fd_aux = 0x4C | (udata.u_block & 16) ? 2 : 0;
            trackno = udata.u_block / 32;
            sector = udata.u_block % 16;
        } else {
            trackno = udata.u_block / 20;
            sector = udata.u_block % 20;
            if (sector > 9) {
                sector -= 10;
                fd_aux = 0x5E;	/* side 1 */
            } else
                fd_aux = 0x5C;
        }
        /* Buffer */
        fd_cmd[3] = ((uint16_t)udata.u_dptr) & 0xFF;
        fd_cmd[4] = ((uint16_t)udata.u_dptr) >> 8;

        for (tries = 0; tries < 4 ; tries++) {
            (void)fd_data;
            fd_sector = skew[sector];	/* Also makes 1 based */
            if (fd_track != trackno) {
                fd_data = trackno;
                if (fd_seek()) {
                    fd_reset();
                    continue;
                }
            }
            /* Do the read or write */
            err = fd_operation();
            if (err == 0)
                break;
            /* Try and recover */
            if (tries > 1)
                fd_reset();
        }
        if (tries == 4)
            goto bad;
        udata.u_block++;
        udata.u_done++;
    }
    /* Save the track */
    track[drive] = fd_track;
    return udata.u_done << 9;
bad:
    track[drive] = fd_track;
    kprintf("fd%d: error %x\n", minor, err);
bad2:
    udata.u_error = EIO;
    return -1;
}