1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-03-27 10:20:52 +00:00

KA10: Support for new interface to sim_card.

This commit is contained in:
Richard Cornwell
2018-04-21 15:08:11 -04:00
parent 652159689d
commit 430ce51342
2 changed files with 33 additions and 14 deletions

View File

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

View File

@@ -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)
{