B5500: Added macros to detect buffer empty to remove compiler warnings.

b5500_mt.c: Changed checking of hwmark from -1 to 0xfffffff.
This commit is contained in:
Richard Cornwell 2016-02-08 17:08:06 -05:00
parent 02aa4539cd
commit c45878feb3

View file

@ -37,10 +37,10 @@
#include "b5500_defs.h" #include "b5500_defs.h"
#include "sim_tape.h" #include "sim_tape.h"
#if (NUM_DEVS_MT > 0) #if (NUM_DEVS_MT > 0)
#define BUFFSIZE 10240 #define BUFFSIZE 10240
#define UNIT_MT UNIT_ATTABLE | UNIT_DISABLE | UNIT_ROABLE #define UNIT_MT UNIT_ATTABLE | UNIT_DISABLE | UNIT_ROABLE
#define HT 500 /* Time per char high density */ #define HT 500 /* Time per char high density */
/* in u3 is device address */ /* in u3 is device address */
@ -76,6 +76,9 @@
#define MT_LOADED 0040000 /* Tape loaded, return ready */ #define MT_LOADED 0040000 /* Tape loaded, return ready */
#define BUF_EMPTY(u) (u->hwmark == 0xFFFFFFFF)
#define CLR_BUF(u) u->hwmark = 0xFFFFFFFF
t_stat mt_srv(UNIT *); t_stat mt_srv(UNIT *);
t_stat mt_attach(UNIT *, char *); t_stat mt_attach(UNIT *, char *);
t_stat mt_detach(UNIT *); t_stat mt_detach(UNIT *);
@ -128,7 +131,7 @@ MTAB mt_mod[] = {
&sim_tape_set_fmt, &sim_tape_show_fmt, NULL, &sim_tape_set_fmt, &sim_tape_show_fmt, NULL,
"Set/Display tape format (SIMH, E11, TPC, P7B)" }, "Set/Display tape format (SIMH, E11, TPC, P7B)" },
{MTAB_XTD | MTAB_VUN, 0, "LENGTH", "LENGTH", {MTAB_XTD | MTAB_VUN, 0, "LENGTH", "LENGTH",
&sim_tape_set_capac, &sim_tape_show_capac, NULL, &sim_tape_set_capac, &sim_tape_show_capac, NULL,
"Set unit n capacity to arg MB (0 = unlimited)" }, "Set unit n capacity to arg MB (0 = unlimited)" },
{MTAB_XTD | MTAB_VUN, 0, "DENSITY", "DENSITY", {MTAB_XTD | MTAB_VUN, 0, "DENSITY", "DENSITY",
NULL, &sim_tape_show_dens, NULL}, NULL, &sim_tape_show_dens, NULL},
@ -161,7 +164,7 @@ mt_cmd(uint16 cmd, uint16 dev, uint8 chan, uint16 *wc)
uptr = &mt_unit[unit]; uptr = &mt_unit[unit];
/* If unit disabled return error */ /* If unit disabled return error */
if (uptr->flags & UNIT_DIS) if (uptr->flags & UNIT_DIS)
return SCPE_NODEV; return SCPE_NODEV;
if ((uptr->flags & UNIT_ATT) == 0) if ((uptr->flags & UNIT_ATT) == 0)
@ -172,42 +175,42 @@ mt_cmd(uint16 cmd, uint16 dev, uint8 chan, uint16 *wc)
return SCPE_UNATT; return SCPE_UNATT;
/* Check if drive is ready to recieve a command */ /* Check if drive is ready to recieve a command */
if ((uptr->u5 & MT_BSY) != 0) if ((uptr->u5 & MT_BSY) != 0)
return SCPE_BUSY; return SCPE_BUSY;
/* Determine actual command */ /* Determine actual command */
uptr->u5 &= ~(MT_RDY|MT_CHAN|MT_CMD|MT_BIN); uptr->u5 &= ~(MT_RDY|MT_CHAN|MT_CMD|MT_BIN);
uptr->u5 |= chan; uptr->u5 |= chan;
if (cmd & URCSTA_BINARY) if (cmd & URCSTA_BINARY)
uptr->u5 |= MT_BIN; uptr->u5 |= MT_BIN;
if (cmd & URCSTA_READ) { if (cmd & URCSTA_READ) {
if ((cmd & URCSTA_WC) && *wc == 0) if ((cmd & URCSTA_WC) && *wc == 0)
uptr->u5 |= MT_FSR; uptr->u5 |= MT_FSR;
else else
uptr->u5 |= MT_RD; uptr->u5 |= MT_RD;
} else { } else {
/* Erase gap not supported on sim, treat as /* Erase gap not supported on sim, treat as
write of null record */ write of null record */
if ((cmd & URCSTA_WC) && *wc == 0) if ((cmd & URCSTA_WC) && *wc == 0)
uptr->u5 |= MT_INT; uptr->u5 |= MT_INT;
else else
uptr->u5 |= MT_WR; uptr->u5 |= MT_WR;
} }
*wc = 0; /* So no overide occurs */ *wc = 0; /* So no overide occurs */
/* Convert command to correct type */ /* Convert command to correct type */
if (cmd & URCSTA_DIRECT) if (cmd & URCSTA_DIRECT)
uptr->u5 |= MT_BACK; uptr->u5 |= MT_BACK;
uptr->u6 = 0; uptr->u6 = 0;
uptr->hwmark = -1; CLR_BUF(uptr);
sim_debug(DEBUG_CMD, &mt_dev, "Command %d %o %o\n\r", unit, uptr->u5, cmd); sim_debug(DEBUG_CMD, &mt_dev, "Command %d %o %o\n", unit, uptr->u5, cmd);
if ((uptr->u5 & MT_IDLE) == 0) { if ((uptr->u5 & MT_IDLE) == 0) {
sim_activate(uptr,50000); sim_activate(uptr,50000);
} }
return SCPE_OK; return SCPE_OK;
} }
/* Map simH errors into machine errors */ /* Map simH errors into machine errors */
@ -281,14 +284,14 @@ t_stat mt_srv(UNIT * uptr)
if (uptr->u5 & MT_LOADED) { if (uptr->u5 & MT_LOADED) {
uptr->u5 &= ~MT_LOADED; uptr->u5 &= ~MT_LOADED;
uptr->u5 |= MT_BSY|MT_RDY; uptr->u5 |= MT_BSY|MT_RDY;
sim_debug(DEBUG_DETAIL, dptr, "Unit=%d Loaded\n\r", unit); sim_debug(DEBUG_DETAIL, dptr, "Unit=%d Loaded\n", unit);
sim_activate(uptr, 50000); sim_activate(uptr, 50000);
return SCPE_OK; return SCPE_OK;
} }
if (uptr->u5 & MT_BSY) { if (uptr->u5 & MT_BSY) {
uptr->u5 &= ~MT_BSY; uptr->u5 &= ~MT_BSY;
sim_debug(DEBUG_DETAIL, dptr, "Unit=%d Online\n\r", unit); sim_debug(DEBUG_DETAIL, dptr, "Unit=%d Online\n", unit);
iostatus |= 1 << (uptr - mt_unit); iostatus |= 1 << (uptr - mt_unit);
if (uptr->u5 & MT_IDLE) if (uptr->u5 & MT_IDLE)
sim_activate(uptr, 50000); sim_activate(uptr, 50000);
@ -298,10 +301,10 @@ t_stat mt_srv(UNIT * uptr)
if (uptr->u5 & MT_IDLE) { if (uptr->u5 & MT_IDLE) {
uptr->u5 &= ~MT_IDLE; uptr->u5 &= ~MT_IDLE;
if (uptr->u5 & MT_RDY) { if (uptr->u5 & MT_RDY) {
sim_debug(DEBUG_DETAIL, dptr, "Unit=%d idling\n\r", unit); sim_debug(DEBUG_DETAIL, dptr, "Unit=%d idling\n", unit);
return SCPE_OK; return SCPE_OK;
} }
sim_debug(DEBUG_DETAIL, dptr, "Unit=%d start %02o\n\r", unit, cmd); sim_debug(DEBUG_DETAIL, dptr, "Unit=%d start %02o\n", unit, cmd);
} }
switch (cmd) { switch (cmd) {
@ -312,12 +315,12 @@ t_stat mt_srv(UNIT * uptr)
uptr->u5 &= ~(MT_CMD|MT_BIN); uptr->u5 &= ~(MT_CMD|MT_BIN);
uptr->u5 |= MT_RDY; uptr->u5 |= MT_RDY;
chan_set_end(chan); chan_set_end(chan);
sim_debug(DEBUG_DETAIL, dptr, "Status\n\r"); sim_debug(DEBUG_DETAIL, dptr, "Status\n");
return SCPE_OK; return SCPE_OK;
case MT_RD: /* Read */ case MT_RD: /* Read */
/* If at end of record, fill buffer */ /* If at end of record, fill buffer */
if (uptr->hwmark == -1) { if (BUF_EMPTY(uptr)) {
sim_debug(DEBUG_DETAIL, dptr, "Read unit=%d %s ", unit, sim_debug(DEBUG_DETAIL, dptr, "Read unit=%d %s ", unit,
(uptr->u5 & MT_BIN)? "bin": "bcd"); (uptr->u5 & MT_BIN)? "bin": "bcd");
if (sim_tape_eot(uptr)) { if (sim_tape_eot(uptr)) {
@ -327,12 +330,12 @@ t_stat mt_srv(UNIT * uptr)
r = sim_tape_rdrecf(uptr, &mt_buffer[chan][0], &reclen, BUFFSIZE); r = sim_tape_rdrecf(uptr, &mt_buffer[chan][0], &reclen, BUFFSIZE);
if (r != MTSE_OK) { if (r != MTSE_OK) {
if (r == MTSE_TMK) { if (r == MTSE_TMK) {
sim_debug(DEBUG_DETAIL, dptr, "TM\n\r"); sim_debug(DEBUG_DETAIL, dptr, "TM\n");
ch = 017; ch = 017;
(void)chan_write_char(chan, &ch, 1); (void)chan_write_char(chan, &ch, 1);
sim_activate(uptr, 4000); sim_activate(uptr, 4000);
} else { } else {
sim_debug(DEBUG_DETAIL, dptr, "r=%d\n\r", r); sim_debug(DEBUG_DETAIL, dptr, "r=%d\n", r);
sim_activate(uptr, 5000); sim_activate(uptr, 5000);
} }
return mt_error(uptr, chan, r, dptr); return mt_error(uptr, chan, r, dptr);
@ -340,7 +343,7 @@ t_stat mt_srv(UNIT * uptr)
uptr->u5 &= ~(MT_BOT|MT_EOT); uptr->u5 &= ~(MT_BOT|MT_EOT);
uptr->hwmark = reclen; uptr->hwmark = reclen;
} }
sim_debug(DEBUG_DETAIL, dptr, "%d chars\n\r", uptr->hwmark); sim_debug(DEBUG_DETAIL, dptr, "%d chars\n", uptr->hwmark);
uptr->u6 = 0; uptr->u6 = 0;
if ((uptr->u5 & MT_BIN) == 0) if ((uptr->u5 & MT_BIN) == 0)
mode = 0100; mode = 0100;
@ -368,12 +371,12 @@ t_stat mt_srv(UNIT * uptr)
if (chan_write_char(chan, &ch, if (chan_write_char(chan, &ch,
(((uint32)uptr->u6) >= uptr->hwmark) ? 1 : 0)) { (((uint32)uptr->u6) >= uptr->hwmark) ? 1 : 0)) {
sim_debug(DEBUG_DATA, dptr, "Read unit=%d %d EOR\n\r", unit, sim_debug(DEBUG_DATA, dptr, "Read unit=%d %d EOR\n", unit,
uptr->hwmark-uptr->u6); uptr->hwmark-uptr->u6);
sim_activate(uptr, 4000); sim_activate(uptr, 4000);
return mt_error(uptr, chan, MTSE_OK, dptr); return mt_error(uptr, chan, MTSE_OK, dptr);
} else { } else {
sim_debug(DEBUG_DATA, dptr, "Read data unit=%d %d %03o\n\r", sim_debug(DEBUG_DATA, dptr, "Read data unit=%d %d %03o\n",
unit, uptr->u6, ch); unit, uptr->u6, ch);
sim_activate(uptr, HT); sim_activate(uptr, HT);
} }
@ -381,7 +384,7 @@ t_stat mt_srv(UNIT * uptr)
case MT_RDBK: /* Read Backword */ case MT_RDBK: /* Read Backword */
/* If at end of record, fill buffer */ /* If at end of record, fill buffer */
if (uptr->hwmark == -1) { if (BUF_EMPTY(uptr)) {
sim_debug(DEBUG_DETAIL, dptr, "Read back unit=%d %s ", unit, sim_debug(DEBUG_DETAIL, dptr, "Read back unit=%d %s ", unit,
(uptr->u5 & MT_BIN)? "bin": "bcd"); (uptr->u5 & MT_BIN)? "bin": "bcd");
if (sim_tape_bot(uptr)) { if (sim_tape_bot(uptr)) {
@ -391,13 +394,13 @@ t_stat mt_srv(UNIT * uptr)
r = sim_tape_rdrecr(uptr, &mt_buffer[chan][0], &reclen, BUFFSIZE); r = sim_tape_rdrecr(uptr, &mt_buffer[chan][0], &reclen, BUFFSIZE);
if (r != MTSE_OK) { if (r != MTSE_OK) {
if (r == MTSE_TMK) { if (r == MTSE_TMK) {
sim_debug(DEBUG_DETAIL, dptr, "TM\n\r"); sim_debug(DEBUG_DETAIL, dptr, "TM\n");
ch = 017; ch = 017;
(void)chan_write_char(chan, &ch, 1); (void)chan_write_char(chan, &ch, 1);
sim_activate(uptr, 4000); sim_activate(uptr, 4000);
} else { } else {
uptr->u5 |= MT_BSY; uptr->u5 |= MT_BSY;
sim_debug(DEBUG_DETAIL, dptr, "r=%d\n\r", r); sim_debug(DEBUG_DETAIL, dptr, "r=%d\n", r);
sim_activate(uptr, 100); sim_activate(uptr, 100);
} }
return mt_error(uptr, chan, r, dptr); return mt_error(uptr, chan, r, dptr);
@ -405,7 +408,7 @@ t_stat mt_srv(UNIT * uptr)
uptr->u5 &= ~(MT_BOT|MT_EOT); uptr->u5 &= ~(MT_BOT|MT_EOT);
uptr->hwmark = reclen; uptr->hwmark = reclen;
} }
sim_debug(DEBUG_DETAIL, dptr, "%d chars\n\r", uptr->hwmark); sim_debug(DEBUG_DETAIL, dptr, "%d chars\n", uptr->hwmark);
uptr->u6 = uptr->hwmark; uptr->u6 = uptr->hwmark;
if ((uptr->u5 & MT_BIN) == 0) if ((uptr->u5 & MT_BIN) == 0)
mode = 0100; mode = 0100;
@ -432,12 +435,12 @@ t_stat mt_srv(UNIT * uptr)
} }
if (chan_write_char(chan, &ch, (uptr->u6 > 0) ? 0 : 1)) { if (chan_write_char(chan, &ch, (uptr->u6 > 0) ? 0 : 1)) {
sim_debug(DEBUG_DATA, dptr, "Read back unit=%d %d EOR\n\r", sim_debug(DEBUG_DATA, dptr, "Read back unit=%d %d EOR\n",
unit, uptr->hwmark-uptr->u6); unit, uptr->hwmark-uptr->u6);
sim_activate(uptr, 100); sim_activate(uptr, 100);
return mt_error(uptr, chan, MTSE_OK, dptr); return mt_error(uptr, chan, MTSE_OK, dptr);
} else { } else {
sim_debug(DEBUG_DATA, dptr, "Read back data unit=%d %d %03o\n\r", sim_debug(DEBUG_DATA, dptr, "Read back data unit=%d %d %03o\n",
unit, uptr->u6, ch); unit, uptr->u6, ch);
sim_activate(uptr, HT); sim_activate(uptr, HT);
} }
@ -454,16 +457,16 @@ t_stat mt_srv(UNIT * uptr)
reclen = uptr->u6; reclen = uptr->u6;
/* If no transfer, then either erase */ /* If no transfer, then either erase */
if (reclen == 0) { if (reclen == 0) {
sim_debug(DEBUG_DETAIL, dptr, "Erase\n\r"); sim_debug(DEBUG_DETAIL, dptr, "Erase\n");
r = MTSE_OK; r = MTSE_OK;
} else if ((reclen == 1) && (cmd & MT_BIN) == 0 && } else if ((reclen == 1) && (cmd & MT_BIN) == 0 &&
(mt_buffer[chan][0] == 017)) { (mt_buffer[chan][0] == 017)) {
/* Check if write rtape mark */ /* Check if write rtape mark */
sim_debug(DEBUG_DETAIL, dptr, "Write Mark unit=%d\n\r", unit); sim_debug(DEBUG_DETAIL, dptr, "Write Mark unit=%d\n", unit);
r = sim_tape_wrtmk(uptr); r = sim_tape_wrtmk(uptr);
} else { } else {
sim_debug(DEBUG_DETAIL, dptr, sim_debug(DEBUG_DETAIL, dptr,
"Write unit=%d Block %d %s chars\n\r", unit, reclen, "Write unit=%d Block %d %s chars\n", unit, reclen,
(uptr->u5 & MT_BIN)? "bin": "bcd"); (uptr->u5 & MT_BIN)? "bin": "bcd");
r = sim_tape_wrrecf(uptr, &mt_buffer[chan][0], reclen); r = sim_tape_wrrecf(uptr, &mt_buffer[chan][0], reclen);
} }
@ -479,7 +482,7 @@ t_stat mt_srv(UNIT * uptr)
/* Don't write out even parity zeros */ /* Don't write out even parity zeros */
if (ch != 0) if (ch != 0)
mt_buffer[chan][uptr->u6++] = ch; mt_buffer[chan][uptr->u6++] = ch;
sim_debug(DEBUG_DATA, dptr, "Write data unit=%d %d %03o\n\r", sim_debug(DEBUG_DATA, dptr, "Write data unit=%d %d %03o\n",
unit, uptr->u6, ch); unit, uptr->u6, ch);
uptr->hwmark = uptr->u6; uptr->hwmark = uptr->u6;
} }
@ -487,12 +490,12 @@ t_stat mt_srv(UNIT * uptr)
return SCPE_OK; return SCPE_OK;
case MT_FSR: /* Space forward one record */ case MT_FSR: /* Space forward one record */
if (uptr->hwmark == -1) { if (BUF_EMPTY(uptr)) {
/* If at end of record, fill buffer */ /* If at end of record, fill buffer */
sim_debug(DEBUG_DETAIL, dptr, "Space unit=%d ", unit); sim_debug(DEBUG_DETAIL, dptr, "Space unit=%d ", unit);
if (sim_tape_eot(uptr)) { if (sim_tape_eot(uptr)) {
uptr->u5 &= ~MT_BOT; uptr->u5 &= ~MT_BOT;
sim_debug(DEBUG_DETAIL, dptr, "EOT\r\n"); sim_debug(DEBUG_DETAIL, dptr, "EOT\n");
sim_activate(uptr, 4000); sim_activate(uptr, 4000);
return mt_error(uptr, chan, MTSE_EOM, dptr); return mt_error(uptr, chan, MTSE_EOM, dptr);
} }
@ -509,7 +512,7 @@ t_stat mt_srv(UNIT * uptr)
} }
uptr->u5 &= ~(MT_BOT|MT_EOT); uptr->u5 &= ~(MT_BOT|MT_EOT);
uptr->hwmark = reclen; uptr->hwmark = reclen;
sim_debug(DEBUG_DETAIL, dptr, "%d chars\n\r", uptr->hwmark); sim_debug(DEBUG_DETAIL, dptr, "%d chars\n", uptr->hwmark);
sim_activate(uptr, uptr->hwmark * HT); sim_activate(uptr, uptr->hwmark * HT);
return SCPE_OK; return SCPE_OK;
} }
@ -517,11 +520,11 @@ t_stat mt_srv(UNIT * uptr)
return mt_error(uptr, chan, MTSE_OK, dptr); return mt_error(uptr, chan, MTSE_OK, dptr);
case MT_BSR: /* Backspace record */ case MT_BSR: /* Backspace record */
if (uptr->hwmark == -1) { if (BUF_EMPTY(uptr)) {
/* If at end of record, fill buffer */ /* If at end of record, fill buffer */
sim_debug(DEBUG_DETAIL, dptr, "backspace unit=%d ", unit); sim_debug(DEBUG_DETAIL, dptr, "backspace unit=%d ", unit);
if (sim_tape_bot(uptr)) { if (sim_tape_bot(uptr)) {
sim_debug(DEBUG_DETAIL, dptr, "BOT\n\r"); sim_debug(DEBUG_DETAIL, dptr, "BOT\n");
sim_activate(uptr, 100); sim_activate(uptr, 100);
return mt_error(uptr, chan, MTSE_BOT, dptr); return mt_error(uptr, chan, MTSE_BOT, dptr);
} }
@ -538,7 +541,7 @@ t_stat mt_srv(UNIT * uptr)
} }
uptr->u5 &= ~(MT_BOT|MT_EOT); uptr->u5 &= ~(MT_BOT|MT_EOT);
uptr->hwmark = reclen; uptr->hwmark = reclen;
sim_debug(DEBUG_DETAIL, dptr, "%d chars\n\r", uptr->hwmark); sim_debug(DEBUG_DETAIL, dptr, "%d chars\n", uptr->hwmark);
sim_activate(uptr, uptr->hwmark * HT); sim_activate(uptr, uptr->hwmark * HT);
return SCPE_OK; return SCPE_OK;
} }
@ -546,7 +549,7 @@ t_stat mt_srv(UNIT * uptr)
return mt_error(uptr, chan, MTSE_OK, dptr); return mt_error(uptr, chan, MTSE_OK, dptr);
case MT_REW: /* Rewind */ case MT_REW: /* Rewind */
sim_debug(DEBUG_DETAIL, dptr, "Rewind unit=%d pos=%d\n\r", unit, sim_debug(DEBUG_DETAIL, dptr, "Rewind unit=%d pos=%d\n", unit,
uptr->pos); uptr->pos);
uptr->u5 &= ~(MT_CMD | MT_BIN | MT_IDLE | MT_RDY); uptr->u5 &= ~(MT_CMD | MT_BIN | MT_IDLE | MT_RDY);
uptr->u5 |= MT_BSY|MT_RDY; uptr->u5 |= MT_BSY|MT_RDY;