int32 rp64 (int32 dev, int32 pulse, int32 dat) { int32 u, f, c, sb; UNIT *uptr; sb = pulse & 060; if (pulse & 01) { if (sb == 020) /* DPSN */ dat = IOT_SKP | dat; } if (pulse & 02) { if (sb == 000) { /* DPOU */ u = GET_UNIT (rp_sta); uptr = rp_dev.units + u; /* select unit */ dat = dat | uptr->CYL | ((uptr->flags & UNIT_RP03)? CCYL_RP03: 0); } else if (sb == 020) /* DPOA */ dat = dat | rp_da; else if (sb == 040) /* DPOC */ dat = dat | rp_ma; else if (sb == 060) /* DPOW */ dat = dat | rp_wc; } if (pulse & 04) { if (sb == 000) { /* DPCF */ rp_reset (&rp_dev); /* reset dev */ return dat; } if (rp_busy != 0) { /* others: busy? */ rp_updsta (0, STB_PGE); /* prog error */ return dat; } if (sb == 020) /* DPLZ */ rp_sta = rp_sta & (dat | ~STA_RW); else if (sb == 040) /* DPLO */ rp_sta = rp_sta | (dat & STA_RW); else if (sb == 060) /* DPLF */ rp_sta = (rp_sta & ~STA_RW) | (dat & STA_RW); u = GET_UNIT (rp_sta); /* get unit num */ uptr = rp_dev.units + u; /* select unit */ if ((rp_sta & STA_GO) && !sim_is_active (uptr)) { f = uptr->FUNC = GET_FUNC (rp_sta); /* get function */ rp_busy = 1; /* set ctrl busy */ rp_sta = rp_sta & ~STA_HNF; /* clear flag */ rp_stb = rp_stb & ~(STB_FME | STB_WPE | STB_LON | STB_WCE | STB_TME | STB_PGE | STB_EOP | (1 << (STB_V_ATT0 - u))); if (((uptr->flags & UNIT_ATT) == 0) || (f == FN_IDLE) || (f == FN_SEEK) || (f == FN_RECAL)) sim_activate (uptr, RP_MIN); /* short delay */ else { c = GET_CYL (rp_da, uptr->flags); c = abs (c - uptr->CYL) * rp_swait; /* seek time */ sim_activate (uptr, MAX (RP_MIN, c + rp_rwait)); rp_sta = rp_sta & ~STA_DON; /* clear done */ } } } rp_updsta (0, 0); return dat; }
int32 rp_abort (void) { return rp_reset (&rp_dev); }
FILE *fdopen(int fd, const char *mode) { FILE *stream; int status; if (fd < 0) { return NULL; } // check mode if (mode[0] != 'a' && mode[0] != 'w' && mode[0] != 'r') { errno = EINVAL; return NULL; } // check if the object is not a file if (!rp_type(fd_rp(fd), "file")) { errno = EISDIR; return NULL; } status = 0; // check read permissions if (mode[0] == 'r' || mode[1] == '+') { status |= STAT_READER; } // check write permissions if (mode[0] == 'w' || mode[0] == 'a' || mode[1] == '+') { status |= STAT_WRITER; } // open file for real fd = ropen(fd, fd_rp(fd), status); if (fd < 0) { return NULL; } // reset (erase) the file contents if (mode[0] == 'w') { rp_reset(fd_rp(fd)); } stream = calloc(sizeof(FILE), 1); if (!stream) { errno = ENOMEM; return NULL; } stream->fd = fd; stream->mutex = false; stream->position = 0; stream->size = rp_size(fd_rp(fd)); stream->buffer = NULL; stream->buffsize = 0; stream->buffpos = 0; stream->revbuf = EOF; stream->flags = FILE_NBF | FILE_READ; if (mode[0] == 'w' || mode[0] == 'a' || mode[1] == '+') { stream->flags |= FILE_WRITE; } // position the stream properly if (mode[0] == 'a' && mode[1] != '+') { fseek(stream, 0, SEEK_END); } else { fseek(stream, 0, SEEK_SET); } return stream; }