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; }
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; }