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