int vdrive_dir_first_directory(vdrive_t *vdrive, const char *name, int length, int filetype, bufferinfo_t *p) { BYTE *l; if (length) { if (*name == '$') { ++name; --length; } if (*name == ':') { ++name; --length; } } if (!*name || length < 1) { name = "*\0"; length = 1; } filetype = vdrive_dir_filetype(name, length); vdrive_dir_find_first_slot(vdrive, name, length, filetype, &p->dir); /* * Start Address, Line Link and Line number 0 */ l = p->buffer; *l++ = 1; *l++ = 4; *l++ = 1; *l++ = 1; *l++ = 0; *l++ = 0; l[25] = 0; *l++ = (BYTE)0x12; /* Reverse on */ *l++ = '"'; memcpy(l, &p->dir.buffer[vdrive->bam_name], 16); vdrive_dir_no_a0_pads(l, 16); l += 16; *l++ = '"'; *l++ = ' '; memcpy(l, &p->dir.buffer[vdrive->bam_id], 5); vdrive_dir_no_a0_pads(l, 5); p->bufptr = 32; return vdrive_dir_next_directory(vdrive, p); }
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; }