B5500: Fixed bug with Alpha mode reads
If the record ended as a multiple of 8 characters, an extra gm would be addded and an extra word written.
This commit is contained in:
parent
03445f5f94
commit
44f523a036
1 changed files with 3 additions and 23 deletions
|
@ -296,29 +296,7 @@ chan_set_end(int chan) {
|
||||||
else
|
else
|
||||||
D[chan] |= ((t_uint64)(CC[chan] & 07)) << DEV_WC_V;
|
D[chan] |= ((t_uint64)(CC[chan] & 07)) << DEV_WC_V;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Flush last buffer if short write */
|
|
||||||
if ((D[chan] & DEV_IORD) && CC[chan] != 0) {
|
|
||||||
uint16 addr = (uint16)(D[chan] & CORE);
|
|
||||||
|
|
||||||
if ((D[chan] & (DEV_BIN|DEV_WCFLG)) == 0) {
|
|
||||||
/* Insert group mark */
|
|
||||||
if (D[chan] & DEV_BACK) {
|
|
||||||
W[chan] |= (t_uint64)037LL << ((CC[chan]) * 6);
|
|
||||||
CC[chan]++;
|
|
||||||
} else {
|
|
||||||
while(CC[chan] != 8) {
|
|
||||||
W[chan] |= 037LL << ((7 - CC[chan]) * 6);
|
|
||||||
CC[chan]++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
M[addr] = W[chan];
|
|
||||||
sim_debug(DEBUG_DATA, &chan_dev, "write(%d, %05o, %016llo)f\n",
|
|
||||||
chan, addr, W[chan]);
|
|
||||||
(void)chan_advance(chan);
|
|
||||||
}
|
|
||||||
M[014+chan] = D[chan];
|
M[014+chan] = D[chan];
|
||||||
if (loading == 0)
|
if (loading == 0)
|
||||||
IAR |= IRQ_5 << chan;
|
IAR |= IRQ_5 << chan;
|
||||||
|
@ -550,6 +528,7 @@ int chan_write_char(int chan, uint8 *ch, int flags) {
|
||||||
|
|
||||||
if (chan_advance(chan))
|
if (chan_advance(chan))
|
||||||
return 1;
|
return 1;
|
||||||
|
W[chan] = 0;
|
||||||
}
|
}
|
||||||
if (flags) {
|
if (flags) {
|
||||||
if ((D[chan] & (DEV_BIN|DEV_WCFLG)) == 0) {
|
if ((D[chan] & (DEV_BIN|DEV_WCFLG)) == 0) {
|
||||||
|
@ -573,9 +552,10 @@ int chan_write_char(int chan, uint8 *ch, int flags) {
|
||||||
uint16 addr = (uint16)(D[chan] & CORE);
|
uint16 addr = (uint16)(D[chan] & CORE);
|
||||||
|
|
||||||
M[addr] = W[chan];
|
M[addr] = W[chan];
|
||||||
sim_debug(DEBUG_DATA, &chan_dev, "write(%d, %05o, %016llo)\n",
|
sim_debug(DEBUG_DATA, &chan_dev, "writef(%d, %05o, %016llo)\n",
|
||||||
chan, addr, W[chan]);
|
chan, addr, W[chan]);
|
||||||
(void)chan_advance(chan);
|
(void)chan_advance(chan);
|
||||||
|
W[chan] = 0;
|
||||||
}
|
}
|
||||||
status[chan] |= EOR;
|
status[chan] |= EOR;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Add table
Reference in a new issue