diff --git a/PDP10/ka10_cp.c b/PDP10/ka10_cp.c index 1af7b43..bdbc0a2 100644 --- a/PDP10/ka10_cp.c +++ b/PDP10/ka10_cp.c @@ -112,7 +112,7 @@ DEVICE cp_dev = { t_stat cp_devio(uint32 dev, uint64 *data) { UNIT *uptr = &cp_unit; - struct _card_data *dp; + uint16 *image = (uint16 *)(uptr->up7); switch(dev & 3) { case CONI: @@ -162,8 +162,7 @@ t_stat cp_devio(uint32 dev, uint64 *data) { *data = 0; break; case DATAO: - dp = (struct _card_data *)uptr->up7; - dp->image[uptr->u4++] = *data & 0xfff; + image[uptr->u4++] = *data & 0xfff; uptr->u3 &= ~DATA_REQ; clr_interrupt(dev); sim_debug(DEBUG_DATAIO, &cp_dev, "CP: DATAO %012llo %d\n", *data, @@ -179,6 +178,8 @@ t_stat cp_srv(UNIT *uptr) { if (uptr->u3 & PUNCH_ON) { + uint16 *image = (uint16 *)(uptr->up7); + uptr->u3 |= CARD_IN_PUNCH; if (uptr->u3 & DATA_REQ) { sim_activate(uptr, uptr->wait); @@ -195,7 +196,7 @@ cp_srv(UNIT *uptr) { uptr->u4 = 0; uptr->u3 &= ~(PUNCH_ON|CARD_IN_PUNCH); uptr->u3 |= END_CARD; - switch(sim_punch_card(uptr, NULL)) { + switch(sim_punch_card(uptr, NULL, image)) { case SCPE_EOF: case SCPE_UNATT: uptr->u3 |= PICK_FAIL|TROUBLE; @@ -224,16 +225,24 @@ cp_attach(UNIT * uptr, CONST char *file) if ((r = sim_card_attach(uptr, file)) != SCPE_OK) return r; - uptr->u3 = 0; - uptr->u4 = 0; + if (uptr->up7 == 0) { + uptr->up7 = calloc(80, sizeof(uint16)); + uptr->u3 = 0; + uptr->u4 = 0; + } return SCPE_OK; } t_stat cp_detach(UNIT * uptr) { + uint16 *image = (uint16 *)(uptr->up7); + if (uptr->u3 & CARD_IN_PUNCH) - sim_punch_card(uptr, NULL); + sim_punch_card(uptr, NULL, image); + if (uptr->up7 != 0) + free(uptr->up7); + uptr->up7 = 0; return sim_card_detach(uptr); } diff --git a/PDP10/ka10_cr.c b/PDP10/ka10_cr.c index 88789ec..1e57bb4 100644 --- a/PDP10/ka10_cr.c +++ b/PDP10/ka10_cr.c @@ -99,7 +99,7 @@ MTAB cr_mod[] = { DEVICE cr_dev = { "CR", &cr_unit, NULL, cr_mod, NUM_DEVS_CR, 8, 15, 1, 8, 8, - NULL, NULL, NULL, NULL, &cr_attach, &sim_card_detach, + NULL, NULL, NULL, NULL, &cr_attach, &cr_detach, &cr_dib, DEV_DISABLE | DEV_DEBUG, 0, crd_debug, NULL, NULL, &cr_help, NULL, NULL, &cr_description }; @@ -170,13 +170,11 @@ t_stat cr_devio(uint32 dev, uint64 *data) { /* Handle transfer of data for card reader */ t_stat cr_srv(UNIT *uptr) { - struct _card_data *data; - - data = (struct _card_data *)uptr->up7; + uint16 *image = (uint16 *)(uptr->up7); /* Check if new card requested. */ if ((uptr->u3 & (READING|CARD_IN_READ)) == READING) { - switch(sim_read_card(uptr)) { + switch(sim_read_card(uptr, image)) { case SCPE_EOF: uptr->u3 |= END_FILE; if (uptr->u3 & TROUBLE_EN) @@ -207,7 +205,7 @@ cr_srv(UNIT *uptr) { sim_activate(uptr, uptr->wait); return SCPE_OK; } - uptr->u5 = data->image[uptr->u4++]; + uptr->u5 = image[uptr->u4++]; if (uptr->u3 & DATA_RDY) { uptr->u3 |= DATA_MISS; } @@ -226,10 +224,22 @@ cr_attach(UNIT * uptr, CONST char *file) if ((r = sim_card_attach(uptr, file)) != SCPE_OK) return r; - uptr->u3 |= RDY_READ; + if (uptr->up7 == 0) { + uptr->up7 = malloc(sizeof(uint16)*80); + uptr->u3 |= RDY_READ; + } return SCPE_OK; } +t_stat +cr_detach(UNIT * uptr) +{ + if (uptr->up7 != 0) + free(uptr->up7); + uptr->up7 = 0; + return sim_card_detach(uptr); +} + t_stat cr_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) {