Beispiel #1
0
void put_mbyte(int32 addr, int32 val)
{
    /* if local EPROM handle it */
    if ((i8255_unit.u5 & 0x01) && (addr >= EPROM_unit.u3) && ((uint16)addr <= (EPROM_unit.u3 + EPROM_unit.capac))) {
        sim_printf("Write to R/O memory address %04X - ignored\n", addr);
        return;
    } /* if local RAM handle it */
    if ((i8255_unit.u5 & 0x02) && (addr >= RAM_unit.u3) && ((uint16)addr <= (RAM_unit.u3 + RAM_unit.capac))) {
        RAM_put_mbyte(addr, val);
        return;
    } /* otherwise, try the multibus */
    multibus_put_mbyte(addr, val);
}
Beispiel #2
0
void put_mbyte(uint16 addr, uint8 val)
{
    /* if local EPROM handle it */
    if ((ROM_DISABLE && (i8255_C[0] & 0x20)) || (ROM_DISABLE == 0)) { /* EPROM enabled */
        if ((addr >= EPROM_unit.u3) && ((uint16)addr <= (EPROM_unit.u3 + EPROM_unit.capac))) {
            sim_printf("Write to R/O memory address %04X from PC=%04X - ignored\n", addr, PCX);
        return;
        }
    } /* if local RAM handle it */
    if ((RAM_DISABLE && (i8255_C[0] & 0x10)) || (RAM_DISABLE == 0)) { /* RAM enabled */
        if ((addr >= RAM_unit.u3) && ((uint16)addr <= (RAM_unit.u3 + RAM_unit.capac))) {
            RAM_put_mbyte(addr, val);
        return;
        }
    } /* otherwise, try the multibus */
    multibus_put_mbyte(addr, val);
}
Beispiel #3
0
void isbc202_diskio(uint8 fdcnum)
{
    uint8 cw, di, nr, ta, sa, data, nrptr, c;
    uint16 ba;
    uint32 dskoff;
    uint8 fddnum, fmtb;
    uint32 i;
    UNIT *uptr;
    FILE *fp;
    //parse the IOPB
    cw = multibus_get_mbyte(fdc202[fdcnum].iopb);
    di = multibus_get_mbyte(fdc202[fdcnum].iopb + 1);
    nr = multibus_get_mbyte(fdc202[fdcnum].iopb + 2);
    ta = multibus_get_mbyte(fdc202[fdcnum].iopb + 3);
    sa = multibus_get_mbyte(fdc202[fdcnum].iopb + 4);
    ba = multibus_get_mword(fdc202[fdcnum].iopb + 5);
    fddnum = (di & 0x30) >> 4;
    uptr = isbc202_dev.units + fddnum;
    if (DEBUG) {
        sim_printf("\n   isbc202-%d: isbc202_diskio IOPB=%04X FDD=%02X STAT=%02X",
                   fdcnum, fdc202[fdcnum].iopb, fddnum, fdc202[fdcnum].stat);
        sim_printf("\n   isbc202-%d: cw=%02X di=%02X nr=%02X ta=%02X sa=%02X ba=%04X",
                   fdcnum, cw, di, nr, ta, sa, ba);
        sim_printf("\n   isbc202-%d: maxsec=%02X maxcyl=%02X",
                   fdcnum, fdc202[fdcnum].fdd[fddnum].maxsec, fdc202[fdcnum].fdd[fddnum].maxcyl);
    }
    //check for not ready
    switch(fddnum) {
    case 0:
        if ((fdc202[fdcnum].stat & RDY0) == 0) {
            fdc202[fdcnum].rtype = RERR;
            fdc202[fdcnum].rbyte0 = RB0NR;
            fdc202[fdcnum].intff = 1;  //set interrupt FF
            sim_printf("\n   isbc202-%d: Ready error on drive %d", fdcnum, fddnum);
            return;
        }
        break;
    case 1:
        if ((fdc202[fdcnum].stat & RDY1) == 0) {
            fdc202[fdcnum].rtype = RERR;
            fdc202[fdcnum].rbyte0 = RB0NR;
            fdc202[fdcnum].intff = 1;  //set interrupt FF
            sim_printf("\n   isbc202-%d: Ready error on drive %d", fdcnum, fddnum);
            return;
        }
        break;
    case 2:
        if ((fdc202[fdcnum].stat & RDY2) == 0) {
            fdc202[fdcnum].rtype = RERR;
            fdc202[fdcnum].rbyte0 = RB0NR;
            fdc202[fdcnum].intff = 1;  //set interrupt FF
            sim_printf("\n   isbc202-%d: Ready error on drive %d", fdcnum, fddnum);
            return;
        }
        break;
    case 3:
        if ((fdc202[fdcnum].stat & RDY3) == 0) {
            fdc202[fdcnum].rtype = RERR;
            fdc202[fdcnum].rbyte0 = RB0NR;
            fdc202[fdcnum].intff = 1;  //set interrupt FF
            sim_printf("\n   isbc202-%d: Ready error on drive %d", fdcnum, fddnum);
            return;
        }
        break;
    }
    //check for address error
    if (
        (sa > fdc202[fdcnum].fdd[fddnum].maxsec) ||
        ((sa + nr) > (fdc202[fdcnum].fdd[fddnum].maxsec + 1)) ||
        (sa == 0) ||
        (ta > fdc202[fdcnum].fdd[fddnum].maxcyl)
    ) {
        if (DEBUG)
            sim_printf("\n   isbc202-%d: maxsec=%02X maxcyl=%02X",
                       fdcnum, fdc202[fdcnum].fdd[fddnum].maxsec, fdc202[fdcnum].fdd[fddnum].maxcyl);
        fdc202[fdcnum].rtype = RERR;
        fdc202[fdcnum].rbyte0 = RB0ADR;
        fdc202[fdcnum].intff = 1;      //set interrupt FF
        sim_printf("\n   isbc202-%d: Address error on drive %d", fdcnum, fddnum);
        return;
    }
    switch (di & 0x07) {
    case DNOP:
    case DSEEK:
    case DHOME:
    case DVCRC:
        fdc202[fdcnum].rtype = ROK;
        fdc202[fdcnum].intff = 1;      //set interrupt FF
        break;
    case DFMT:
        //check for WP
        if(uptr->flags & UNIT_WPMODE) {
            fdc202[fdcnum].rtype = RERR;
            fdc202[fdcnum].rbyte0 = RB0WP;
            fdc202[fdcnum].intff = 1;  //set interrupt FF
            sim_printf("\n   isbc202-%d: Write protect error 1 on drive %d", fdcnum, fddnum);
            return;
        }
        fmtb = multibus_get_mbyte(ba); //get the format byte
        //calculate offset into disk image
        dskoff = ((ta * (uint32)(fdc202[fdcnum].fdd[fddnum].maxsec)) + (sa - 1)) * 128;
        for(i=0; i<=((uint32)(fdc202[fdcnum].fdd[fddnum].maxsec) * 128); i++) {
            *(fdc202[fdcnum].fdd[fddnum].buf + (dskoff + i)) = fmtb;
        }
        //*** quick fix. Needs more thought!
        fp = fopen(uptr->filename, "wb"); // write out modified image
        for (i=0; i<uptr->capac; i++) {
            c = *(fdc202[fdcnum].fdd[fddnum].buf + i);
            fputc(c, fp);
        }
        fclose(fp);
        fdc202[fdcnum].rtype = ROK;
        fdc202[fdcnum].intff = 1;      //set interrupt FF
        break;
    case DREAD:
        nrptr = 0;
        while(nrptr < nr) {
            //calculate offset into disk image
            dskoff = ((ta * fdc202[fdcnum].fdd[fddnum].maxsec) + (sa - 1)) * 128;
//                sim_printf("\n   isbc202-%d: cw=%02X di=%02X nr=%02X ta=%02X sa=%02X ba=%04X dskoff=%06X",
//                    fdcnum, cw, di, nr, ta, sa, ba, dskoff);
            for (i=0; i<128; i++) {     //copy sector from image to RAM
                data = *(fdc202[fdcnum].fdd[fddnum].buf + (dskoff + i));
                multibus_put_mbyte(ba + i, data);
            }
            sa++;
            ba+=0x80;
            nrptr++;
        }
        fdc202[fdcnum].rtype = ROK;
        fdc202[fdcnum].intff = 1;      //set interrupt FF
        break;
    case DWRITE:
        //check for WP
        if(uptr->flags & UNIT_WPMODE) {
            fdc202[fdcnum].rtype = RERR;
            fdc202[fdcnum].rbyte0 = RB0WP;
            fdc202[fdcnum].intff = 1;  //set interrupt FF
            sim_printf("\n   isbc202-%d: Write protect error 2 on drive %d", fdcnum, fddnum);
            return;
        }
        nrptr = 0;
        while(nrptr < nr) {
            //calculate offset into disk image
            dskoff = ((ta * fdc202[fdcnum].fdd[fddnum].maxsec) + (sa - 1)) * 128;
//               sim_printf("\n   isbc202-%d: cw=%02X di=%02X nr=%02X ta=%02X sa=%02X ba=%04X dskoff=%06X",
//                   fdcnum, cw, di, nr, ta, sa, ba, dskoff);
            for (i=0; i<128; i++) {     //copy sector from image to RAM
                data = multibus_get_mbyte(ba + i);
                *(fdc202[fdcnum].fdd[fddnum].buf + (dskoff + i)) = data;
            }
            sa++;
            ba+=0x80;
            nrptr++;
        }
        //*** quick fix. Needs more thought!
        fp = fopen(uptr->filename, "wb"); // write out modified image
        for (i=0; i<uptr->capac; i++) {
            c = *(fdc202[fdcnum].fdd[fddnum].buf + i);
            fputc(c, fp);
        }
        fclose(fp);
        fdc202[fdcnum].rtype = ROK;
        fdc202[fdcnum].intff = 1;      //set interrupt FF
        break;
    default:
        sim_printf("\n   isbc202-%d: isbc202_diskio bad di=%02X", fdcnum, di & 0x07);
        break;
    }
}