diff --git a/PDP11/pdp11_rq.c b/PDP11/pdp11_rq.c index c446cda3..7a7f4790 100644 --- a/PDP11/pdp11_rq.c +++ b/PDP11/pdp11_rq.c @@ -2158,9 +2158,8 @@ else { /* Bottom End (After I/O processing) */ if (err != 0) { /* error? */ if (rq_dte (cp, uptr, ST_DRV)) /* post err log */ rq_rw_end (cp, uptr, EF_LOG, ST_DRV); /* if ok, report err */ - perror ("RQ I/O error"); - if (!(uptr->flags & UNIT_RAW)) - clearerr (uptr->fileref); + sim_disk_perror (uptr, "RQ I/O error"); + sim_disk_clearerr (uptr); return SCPE_IOERR; } ba = ba + tbc; /* incr bus addr */ diff --git a/scp.c b/scp.c index 07529951..6ba4544b 100644 --- a/scp.c +++ b/scp.c @@ -3983,7 +3983,7 @@ for (i = 1; (dptr = sim_devices[i]) != NULL; i++) { /* flush attached files if (uptr->io_flush) /* unit specific flush routine */ uptr->io_flush (uptr); else - if (!(uptr->flags & UNIT_RAW) && /* not raw, */ + if (!(uptr->dynflags & UNIT_NO_FIO) && /* is FILE *, */ !(uptr->flags & UNIT_RO)) /* not read only? */ fflush (uptr->fileref); } @@ -4543,7 +4543,7 @@ for (i = 0, j = addr; i < sim_emax; i++, j = j + dptr->aincr) { else { if (!(uptr->flags & UNIT_ATT)) return SCPE_UNATT; - if (uptr->flags & UNIT_RAW) + if (uptr->dynflags & UNIT_NO_FIO) return SCPE_NOFNC; if ((uptr->flags & UNIT_FIX) && (j >= uptr->capac)) { reason = SCPE_NXM; @@ -4634,7 +4634,7 @@ for (i = 0, j = addr; i < count; i++, j = j + dptr->aincr) { else { if (!(uptr->flags & UNIT_ATT)) return SCPE_UNATT; - if (uptr->flags & UNIT_RAW) + if (uptr->dynflags & UNIT_NO_FIO) return SCPE_NOFNC; if ((uptr->flags & UNIT_FIX) && (j >= uptr->capac)) return SCPE_NXM; diff --git a/sim_defs.h b/sim_defs.h index dbf9275c..f31ec44b 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -424,10 +424,11 @@ struct sim_unit { #define UNIT_ROABLE 0001000 /* read only ok */ #define UNIT_DISABLE 0002000 /* disable-able */ #define UNIT_DIS 0004000 /* disabled */ -#define UNIT_RAW 0010000 /* raw mode */ -#define UNIT_TEXT 0020000 /* text mode */ #define UNIT_IDLE 0040000 /* idle eligible */ +/* Unused/meaningless flags */ +#define UNIT_TEXT 0000000 /* text mode - no effect */ + #define UNIT_UFMASK_31 (((1u << UNIT_V_RSV) - 1) & ~((1u << UNIT_V_UF_31) - 1)) #define UNIT_UFMASK (((1u << UNIT_V_RSV) - 1) & ~((1u << UNIT_V_UF) - 1)) #define UNIT_RFLAGS (UNIT_UFMASK|UNIT_DIS) /* restored flags */ @@ -438,6 +439,7 @@ struct sim_unit { #define UNIT_ATTMULT 0000001 /* Allow multiple attach commands */ #define UNIT_TM_POLL 0000002 /* TMXR Polling unit */ +#define UNIT_NO_FIO 0000004 /* fileref is NOT a FILE * */ /* Register data structure */ diff --git a/sim_disk.c b/sim_disk.c index 1a4fae97..cf576f77 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -273,6 +273,7 @@ static void sim_vhd_disk_flush (FILE *f); static t_addr sim_vhd_disk_size (FILE *f); static t_stat sim_vhd_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects); static t_stat sim_vhd_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects); +static t_stat sim_vhd_disk_clearerr (UNIT *uptr); static t_stat sim_vhd_disk_set_dtype (FILE *f, const char *dtype); static const char *sim_vhd_disk_get_dtype (FILE *f); static t_stat sim_os_disk_implemented_raw (void); @@ -1121,7 +1122,8 @@ sim_disk_clr_async (uptr); if (uptr->io_flush) uptr->io_flush (uptr); /* flush buffered data */ -uptr->flags = uptr->flags & ~(UNIT_ATT | UNIT_RO | UNIT_RAW); +uptr->flags &= ~(UNIT_ATT | UNIT_RO); +uptr->dynflags &= ~UNIT_NO_FIO; free (uptr->filename); uptr->filename = NULL; uptr->fileref = NULL; @@ -1206,6 +1208,39 @@ AIO_UPDATE_QUEUE; return SCPE_OK; } +t_stat sim_disk_perror (UNIT *uptr, const char *msg) +{ +if (!(uptr->flags & UNIT_ATTABLE)) /* not attachable? */ + return SCPE_NOATT; +switch (DK_GET_FMT (uptr)) { /* case on format */ + case DKUF_F_STD: /* SIMH format */ + case DKUF_F_VHD: /* VHD format */ + case DKUF_F_RAW: /* Raw Physical Disk Access */ + perror (msg); + default: + ; + } +return SCPE_OK; +} + +t_stat sim_disk_clearerr (UNIT *uptr) +{ +if (!(uptr->flags & UNIT_ATTABLE)) /* not attachable? */ + return SCPE_NOATT; +switch (DK_GET_FMT (uptr)) { /* case on format */ + case DKUF_F_STD: /* SIMH format */ + clearerr (uptr->fileref); + break; + case DKUF_F_VHD: /* VHD format */ + sim_vhd_disk_clearerr (uptr); + break; + default: + ; + } +return SCPE_OK; +} + + /* Factory bad block table creation routine This routine writes a DEC standard 044 compliant bad block table on the @@ -1974,6 +2009,11 @@ static t_stat sim_vhd_disk_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt * return SCPE_IOERR; } +static t_stat sim_vhd_disk_clearerr (UNIT *uptr) +{ +return SCPE_IOERR; +} + static t_stat sim_vhd_disk_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects) { return SCPE_IOERR; @@ -3488,6 +3528,14 @@ struct disk_context *ctx = (struct disk_context *)uptr->disk_ctx; return ReadVirtualDiskSectors(hVHD, buf, sects, sectsread, ctx->sector_size, lba); } +static t_stat sim_vhd_disk_clearerr (UNIT *uptr) +{ +VHDHANDLE hVHD = (VHDHANDLE)uptr->fileref; + +clearerr (hVHD->File); +return SCPE_OK; +} + static t_bool BufferIsZeros(void *Buffer, size_t BufferSize) { diff --git a/sim_disk.h b/sim_disk.h index b70a8e18..b9b850d6 100644 --- a/sim_disk.h +++ b/sim_disk.h @@ -80,6 +80,8 @@ t_stat sim_disk_show_capac (FILE *st, UNIT *uptr, int32 val, void *desc); t_stat sim_disk_set_asynch (UNIT *uptr, int latency); t_stat sim_disk_clr_asynch (UNIT *uptr); t_stat sim_disk_reset (UNIT *uptr); +t_stat sim_disk_perror (UNIT *uptr, const char *msg); +t_stat sim_disk_clearerr (UNIT *uptr); t_bool sim_disk_isavailable (UNIT *uptr); t_bool sim_disk_isavailable_a (UNIT *uptr, DISK_PCALLBACK callback); t_bool sim_disk_wrp (UNIT *uptr);