Esempio n. 1
0
static int iec_read_sequential(vdrive_t *vdrive, BYTE *data,
                               unsigned int secondary)
{
    bufferinfo_t *p = &(vdrive->buffers[secondary]);
    int status;
    unsigned int track, sector;

    if (p->readmode != CBMDOS_FAM_READ) {
        *data = 0xc7;
        return SERIAL_ERROR;
    }

    *data = p->buffer[p->bufptr];
    if (p->length != 0) {
        if (p->bufptr == p->length) {
            p->bufptr = 0xff;
        } 
    }
    p->bufptr = (p->bufptr + 1) & 0xff;
    if (p->bufptr) {
        return SERIAL_OK;
    }
    if (p->length) {
        p->readmode = CBMDOS_FAM_EOF;
        return SERIAL_EOF;
    }

    switch (p->mode) {
    case BUFFER_SEQUENTIAL:

        track = (unsigned int)p->buffer[0];
        sector = (unsigned int)p->buffer[1];

        status = disk_image_read_sector(vdrive->image, p->buffer,
                                                track, sector);
        p->length = p->buffer[0] ? 0 : p->buffer[1];
        vdrive_set_last_read(track, sector, p->buffer);

        if (status == 0) {
            p->bufptr = 2;
        } else {
            p->readmode = CBMDOS_FAM_EOF;
        }
        break;
    case BUFFER_DIRECTORY_READ:
        p->length = vdrive_dir_next_directory(vdrive, p);
        p->bufptr = 0;
        break;
    }
    return SERIAL_OK;
}
Esempio n. 2
0
static int iec_open_read_sequential(vdrive_t *vdrive, unsigned int secondary, unsigned int track, unsigned int sector)
{
    int status;
    bufferinfo_t *p = &(vdrive->buffers[secondary]);

    vdrive_alloc_buffer(p, BUFFER_SEQUENTIAL);
    p->bufptr = 2;

    status = vdrive_read_sector(vdrive, p->buffer, track, sector);
    p->length = p->buffer[0] ? 0 : p->buffer[1];

    vdrive_set_last_read(track, sector, p->buffer);

    if (status != 0) {
        vdrive_iec_close(vdrive, secondary);
        return SERIAL_ERROR;
    }
    return SERIAL_OK;
}