Exemplo n.º 1
0
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);
}
Exemplo n.º 2
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;
}