From a15858315abea39beabf94ab8c8f045dc96e0d75 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 1 Mar 2014 17:15:10 -0800 Subject: [PATCH] PDP11, PDP10, AltairZ80: Fixed cases where assert() macro is called with an expression which has side effects and therefore wouldn't get executed if compiled with NDEBUG defined. --- AltairZ80/altairz80_dsk.c | 2 +- AltairZ80/altairz80_hdsk.c | 2 +- PDP11/pdp11_dmc.c | 40 ++++++++++++++++++------------------- PDP11/pdp11_kmc.c | 22 ++++++++++---------- doc/simh_faq.doc | Bin 100352 -> 100864 bytes sim_defs.h | 6 ++++++ 6 files changed, 39 insertions(+), 33 deletions(-) diff --git a/AltairZ80/altairz80_dsk.c b/AltairZ80/altairz80_dsk.c index 74a4dfe4..1dcd3358 100644 --- a/AltairZ80/altairz80_dsk.c +++ b/AltairZ80/altairz80_dsk.c @@ -306,7 +306,7 @@ static t_stat dsk_reset(DEVICE *dptr) { } void install_ALTAIRbootROM(void) { - assert(install_bootrom(bootrom_dsk, BOOTROM_SIZE_DSK, ALTAIR_ROM_LOW, TRUE) == SCPE_OK); + ASSURE(install_bootrom(bootrom_dsk, BOOTROM_SIZE_DSK, ALTAIR_ROM_LOW, TRUE) == SCPE_OK); } /* The boot routine modifies the boot ROM in such a way that subsequently diff --git a/AltairZ80/altairz80_hdsk.c b/AltairZ80/altairz80_hdsk.c index a8c87df1..e779752f 100644 --- a/AltairZ80/altairz80_hdsk.c +++ b/AltairZ80/altairz80_hdsk.c @@ -609,7 +609,7 @@ static t_stat hdsk_boot(int32 unitno, DEVICE *dptr) { } install_ALTAIRbootROM(); /* install modified ROM */ } - assert(install_bootrom(bootrom_hdsk, BOOTROM_SIZE_HDSK, HDSK_BOOT_ADDRESS, FALSE) == SCPE_OK); + ASSURE(install_bootrom(bootrom_hdsk, BOOTROM_SIZE_HDSK, HDSK_BOOT_ADDRESS, FALSE) == SCPE_OK); *((int32 *) sim_PC -> loc) = HDSK_BOOT_ADDRESS; return SCPE_OK; } diff --git a/PDP11/pdp11_dmc.c b/PDP11/pdp11_dmc.c index 84589222..4ded456d 100644 --- a/PDP11/pdp11_dmc.c +++ b/PDP11/pdp11_dmc.c @@ -2374,10 +2374,10 @@ buffer->actual_bytes_transferred = buffer->count; controller->buffers_transmitted_to_net++; if (buffer->type == TransmitData) { buffer->actual_bytes_transferred = buffer->count - (DDCMP_HEADER_SIZE + DDCMP_CRC_SIZE); - assert (insqueue (&buffer->hdr, controller->ack_wait_queue->hdr.prev)); + ASSURE (insqueue (&buffer->hdr, controller->ack_wait_queue->hdr.prev)); } else { - assert (insqueue (&buffer->hdr, &controller->free_queue->hdr)); + ASSURE (insqueue (&buffer->hdr, &controller->free_queue->hdr)); } controller->link.xmt_buffer = NULL; } @@ -2589,7 +2589,7 @@ if (buffer) { buffer->type = type; buffer->address = address; buffer->count = count; - assert (insqueue (&buffer->hdr, q->hdr.prev)); /* Insert at tail */ + ASSURE (insqueue (&buffer->hdr, q->hdr.prev)); /* Insert at tail */ sim_debug(DBG_INF, q->controller->device, "%s%d: Queued %s buffer address=0x%08x count=%d\n", q->controller->device->name, q->controller->index, q->name, address, count); } else { @@ -2680,7 +2680,7 @@ if ((dmc_is_rdyo_set(controller)) || return; sim_debug(DBG_INF, controller->device, "%s%d: Output transfer completed\n", controller->device->name, controller->index); buffer = (BUFFER *)remqueue (controller->completion_queue->hdr.next); -assert (insqueue (&buffer->hdr, controller->free_queue->hdr.prev)); +ASSURE (insqueue (&buffer->hdr, controller->free_queue->hdr.prev)); controller->transmit_buffer_output_transfers_completed++; controller->transfer_state = Idle; dmc_process_command(controller); // check for any other transfers @@ -2891,7 +2891,7 @@ controller->link.nak_reason = 0; while (controller->ack_wait_queue->count) { buffer = (BUFFER *)remqueue (controller->ack_wait_queue->hdr.prev); memset (buffer->transfer_buffer, 0, DDCMP_HEADER_SIZE); - assert (insqueue (&buffer->hdr, &controller->xmt_queue->hdr)); + ASSURE (insqueue (&buffer->hdr, &controller->xmt_queue->hdr)); } /* Also make sure that the transmit queue has no control packets in it and that any non transmit buffer(s) have zeroed headers so they will @@ -2902,7 +2902,7 @@ while (controller->xmt_queue->count - data_packets) { BUFFER *buffer_next = (BUFFER *)buffer->hdr.next; buffer = (BUFFER *)remqueue (&buffer->hdr); - assert (insqueue (&buffer->hdr, &controller->free_queue->hdr)); + ASSURE (insqueue (&buffer->hdr, &controller->free_queue->hdr)); buffer = buffer_next; continue; } @@ -2918,7 +2918,7 @@ BUFFER *buffer = dmc_buffer_allocate(controller); buffer->transfer_buffer = (uint8 *)malloc (DDCMP_HEADER_SIZE); buffer->count = DDCMP_HEADER_SIZE; ddcmp_build_start_packet (buffer->transfer_buffer); -assert (insqueue (&buffer->hdr, &controller->xmt_queue->hdr)); +ASSURE (insqueue (&buffer->hdr, &controller->xmt_queue->hdr)); dmc_ddcmp_start_transmitter (controller); } void ddcmp_SendStack (CTLR *controller) @@ -2928,7 +2928,7 @@ BUFFER *buffer = dmc_buffer_allocate(controller); buffer->transfer_buffer = (uint8 *)malloc (DDCMP_HEADER_SIZE); buffer->count = DDCMP_HEADER_SIZE; ddcmp_build_start_ack_packet (buffer->transfer_buffer); -assert (insqueue (&buffer->hdr, &controller->xmt_queue->hdr)); +ASSURE (insqueue (&buffer->hdr, &controller->xmt_queue->hdr)); dmc_ddcmp_start_transmitter (controller); } void ddcmp_SendAck (CTLR *controller) @@ -2938,7 +2938,7 @@ BUFFER *buffer = dmc_buffer_allocate(controller); buffer->transfer_buffer = (uint8 *)malloc (DDCMP_HEADER_SIZE); buffer->count = DDCMP_HEADER_SIZE; ddcmp_build_ack_packet (buffer->transfer_buffer, controller->link.R, DDCMP_FLAG_SELECT); -assert (insqueue (&buffer->hdr, &controller->xmt_queue->hdr)); +ASSURE (insqueue (&buffer->hdr, &controller->xmt_queue->hdr)); dmc_ddcmp_start_transmitter (controller); } void ddcmp_SendNak (CTLR *controller) @@ -2948,7 +2948,7 @@ BUFFER *buffer = dmc_buffer_allocate(controller); buffer->transfer_buffer = (uint8 *)malloc (DDCMP_HEADER_SIZE); buffer->count = DDCMP_HEADER_SIZE; ddcmp_build_nak_packet (buffer->transfer_buffer, controller->link.nak_reason, controller->link.R, DDCMP_FLAG_SELECT); -assert (insqueue (&buffer->hdr, &controller->xmt_queue->hdr)); +ASSURE (insqueue (&buffer->hdr, &controller->xmt_queue->hdr)); dmc_ddcmp_start_transmitter (controller); } void ddcmp_SendRep (CTLR *controller) @@ -2958,7 +2958,7 @@ BUFFER *buffer = dmc_buffer_allocate(controller); buffer->transfer_buffer = (uint8 *)malloc (DDCMP_HEADER_SIZE); buffer->count = DDCMP_HEADER_SIZE; ddcmp_build_rep_packet (buffer->transfer_buffer, controller->link.N, DDCMP_FLAG_SELECT); -assert (insqueue (&buffer->hdr, &controller->xmt_queue->hdr)); +ASSURE (insqueue (&buffer->hdr, &controller->xmt_queue->hdr)); dmc_ddcmp_start_transmitter (controller); } void ddcmp_SetSACK (CTLR *controller) @@ -3020,7 +3020,7 @@ while (ddcmp_compare (controller->link.rcv_pkt[DDCMP_NUM_OFFSET], GE, R, control buffer->count = DDCMP_HEADER_SIZE; ddcmp_build_nak_packet (buffer->transfer_buffer, 2, R, DDCMP_FLAG_SELECT); R = R + 1; - assert (insqueue (&buffer->hdr, qh)); + ASSURE (insqueue (&buffer->hdr, qh)); qh = &buffer->hdr; } dmc_ddcmp_start_transmitter (controller); @@ -3055,7 +3055,7 @@ if (!buffer) { buffer->actual_bytes_transferred = controller->link.rcv_pkt_size - (DDCMP_HEADER_SIZE + DDCMP_CRC_SIZE); Map_WriteB(buffer->address, buffer->actual_bytes_transferred, controller->link.rcv_pkt + DDCMP_HEADER_SIZE); -assert (insqueue (&buffer->hdr, controller->completion_queue->hdr.prev)); /* Insert at tail */ +ASSURE (insqueue (&buffer->hdr, controller->completion_queue->hdr.prev)); /* Insert at tail */ ddcmp_IncrementR (controller); ddcmp_SetSACK (controller); } @@ -3069,7 +3069,7 @@ while (buffer != NULL) { ddcmp_compare (buffer->transfer_buffer[DDCMP_NUM_OFFSET], GT, controller->link.rcv_pkt[DDCMP_RESP_OFFSET], controller)) break; buffer = (BUFFER *)remqueue (&buffer->hdr); - assert (insqueue (&buffer->hdr, controller->completion_queue->hdr.prev)); /* Insert at tail */ + ASSURE (insqueue (&buffer->hdr, controller->completion_queue->hdr.prev)); /* Insert at tail */ buffer = dmc_buffer_queue_head(controller->ack_wait_queue); } } @@ -3086,7 +3086,7 @@ for (i=0; i < controller->ack_wait_queue->count; ++i) { } ddcmp_build_data_packet (buffer->transfer_buffer, buffer->count - (DDCMP_HEADER_SIZE + DDCMP_CRC_SIZE), DDCMP_FLAG_SELECT|DDCMP_FLAG_QSYNC, controller->link.T, controller->link.R); buffer = (BUFFER *)remqueue (&buffer->hdr); - assert (insqueue (&buffer->hdr, controller->xmt_queue->hdr.prev)); /* Insert at tail */ + ASSURE (insqueue (&buffer->hdr, controller->xmt_queue->hdr.prev)); /* Insert at tail */ break; } } @@ -3684,25 +3684,25 @@ if (!(dptr->flags & DEV_DIS)) { on the free queue */ while (controller->ack_wait_queue->count) { buffer = (BUFFER *)remqueue (controller->ack_wait_queue->hdr.next); - assert (insqueue (&buffer->hdr, controller->free_queue->hdr.prev)); + ASSURE (insqueue (&buffer->hdr, controller->free_queue->hdr.prev)); } while (controller->completion_queue->count) { buffer = (BUFFER *)remqueue (controller->completion_queue->hdr.next); - assert (insqueue (&buffer->hdr, controller->free_queue->hdr.prev)); + ASSURE (insqueue (&buffer->hdr, controller->free_queue->hdr.prev)); } while (controller->rcv_queue->count) { buffer = (BUFFER *)remqueue (controller->rcv_queue->hdr.next); - assert (insqueue (&buffer->hdr, controller->free_queue->hdr.prev)); + ASSURE (insqueue (&buffer->hdr, controller->free_queue->hdr.prev)); } while (controller->xmt_queue->count) { buffer = (BUFFER *)remqueue (controller->xmt_queue->hdr.next); - assert (insqueue (&buffer->hdr, controller->free_queue->hdr.prev)); + ASSURE (insqueue (&buffer->hdr, controller->free_queue->hdr.prev)); } for (j = 0; j < controller->free_queue->size; j++) { buffer = (BUFFER *)remqueue (controller->free_queue->hdr.next); free (buffer->transfer_buffer); buffer->transfer_buffer = NULL; - assert (insqueue (&buffer->hdr, controller->free_queue->hdr.prev)); + ASSURE (insqueue (&buffer->hdr, controller->free_queue->hdr.prev)); } dmc_buffer_queue_init_all(controller); dmc_clrinint(controller); diff --git a/PDP11/pdp11_kmc.c b/PDP11/pdp11_kmc.c index f16279cd..04c17fb9 100644 --- a/PDP11/pdp11_kmc.c +++ b/PDP11/pdp11_kmc.c @@ -1353,7 +1353,7 @@ static t_stat kmc_rxService (UNIT *rxup) { break; } d->rx.bda = bdl->ba; - assert (insqueue (&bdl->hdr, d->bdqh.prev, &d->bdavail, DIM(d->bdq))); + ASSURE (insqueue (&bdl->hdr, d->bdqh.prev, &d->bdavail, DIM(d->bdq))); sim_debug (DF_BUF, &kmc_dev, "KMC%u line %u: receiving bdl=%06o\n", k, rxup->unit_line, d->rx.bda); @@ -1424,9 +1424,9 @@ static t_stat kmc_rxService (UNIT *rxup) { } if (d->ctrlFlags & SEL6_CI_ENASS) { /* Note that spec requires first bd >= 6 if SS match enabled */ if (!(d->rxmsg[5] == (d->ctrlFlags & SEL6_CI_SADDR))) { /* Also include SELECT? */ - assert ((bdl = (BDL *)remqueue(d->bdqh.prev, &d->bdavail)) != NULL); + ASSURE ((bdl = (BDL *)remqueue(d->bdqh.prev, &d->bdavail)) != NULL); assert (bdl->ba == d->rx.bda); - assert (insqueue (&bdl->hdr, &d->rxqh, &d->rxavail, MAXQUEUE)); + ASSURE (insqueue (&bdl->hdr, &d->rxqh, &d->rxavail, MAXQUEUE)); d->rxstate = RXIDLE; break; } @@ -1946,7 +1946,7 @@ void kmc_rxBufferIn(dupstate *d, int32 ba, uint16 sel6v) { d->rxstate = RXIDLE; sim_cancel (rxup); while ((qe = (BDL *)remqueue (d->rxqh.next, &d->rxavail)) != NULL) { - assert (insqueue (&qe->hdr, d->bdqh.prev, &d->bdavail, DIM(d->bdq))); + ASSURE (insqueue (&qe->hdr, d->bdqh.prev, &d->bdavail, DIM(d->bdq))); } if (!(sel6v & SEL6_BI_ENABLE)) { kmc_ctrlOut (k, SEL6_CO_KDONE, SEL2_IOT, d->line, bda); @@ -1962,7 +1962,7 @@ void kmc_rxBufferIn(dupstate *d, int32 ba, uint16 sel6v) { return; } qe->ba = ba; - assert (insqueue (&qe->hdr, d->rxqh.prev, &d->rxavail, MAXQUEUE)); + ASSURE (insqueue (&qe->hdr, d->rxqh.prev, &d->rxavail, MAXQUEUE)); if (sel6v & SEL6_BI_KILL) { /* KILL & Replace - ENABLE is set too */ kmc_ctrlOut (k, SEL6_CO_KDONE, SEL2_IOT, d->line, bda); @@ -2051,7 +2051,7 @@ void kmc_txBufferIn(dupstate *d, int32 ba, uint16 sel6v) { * not handed to the DUP can be stopped here. */ while ((qe = (BDL *)remqueue (d->txqh.next, &d->txavail)) != NULL) { - assert (insqueue (&qe->hdr, d->bdqh.prev, &d->bdavail, DIM(d->bdq))); + ASSURE (insqueue (&qe->hdr, d->bdqh.prev, &d->bdavail, DIM(d->bdq))); } if (d->txstate < TXACT) { /* DUP is idle */ sim_cancel (&tx_units[d->line][k]); /* Stop tx bdl walker */ @@ -2078,7 +2078,7 @@ void kmc_txBufferIn(dupstate *d, int32 ba, uint16 sel6v) { return; } qe->ba = ba; - assert (insqueue (&qe->hdr, d->txqh.prev, &d->txavail, MAXQUEUE)); + ASSURE (insqueue (&qe->hdr, d->txqh.prev, &d->txavail, MAXQUEUE)); if (d->txstate == TXIDLE) { UNIT *txup = &tx_units[d->line][k]; if (!sim_is_active (txup)) { @@ -2149,7 +2149,7 @@ static t_bool kmc_txNewBdl(dupstate *d) { return FALSE; } d->tx.bda = qe->ba; - assert (insqueue (&qe->hdr, d->bdqh.prev, &d->bdavail, DIM(d->bdq))); + ASSURE (insqueue (&qe->hdr, d->bdqh.prev, &d->bdavail, DIM(d->bdq))); d->tx.first = TRUE; d->tx.bd[1] = 0; @@ -2243,7 +2243,7 @@ static void kmc_processCompletions (int32 k) { return; } - assert (insqueue (&qe->hdr, freecqHead.prev, &freecqCount, CQUEUE_MAX)); + ASSURE (insqueue (&qe->hdr, freecqHead.prev, &freecqCount, CQUEUE_MAX)); sel2 = qe->bsel2; sel4 = qe->bsel4; sel6 = qe->bsel6; @@ -2297,7 +2297,7 @@ static void kmc_ctrlOut (int32 k, uint8 code, uint16 rx, uint8 line, uint32 bda) qe->bsel2 = ((line << SEL2_V_LINE) & SEL2_LINE) | rx | CMD_CTRLOUT; qe->bsel4 = bda & 0177777; qe->bsel6 = ((bda >> (16-SEL6_V_CO_XAD)) & SEL6_CO_XAD) | code; - assert (insqueue (&qe->hdr, cqueueHead.prev, &cqueueCount, CQUEUE_MAX)); + ASSURE (insqueue (&qe->hdr, cqueueHead.prev, &cqueueCount, CQUEUE_MAX)); kmc_processCompletions(k); return; } @@ -2377,7 +2377,7 @@ static t_bool kmc_bufferAddressOut (int32 k, uint16 flags, uint16 rx, uint8 line qe->bsel2 = ((line << SEL2_V_LINE) & SEL2_LINE) | rx | CMD_BUFFOUT; qe->bsel4 = bda & 0177777; qe->bsel6 = ((bda >> (16-SEL6_V_CO_XAD)) & SEL6_CO_XAD) | flags; - assert (insqueue (&qe->hdr, cqueueHead.prev, &cqueueCount, CQUEUE_MAX)); + ASSURE (insqueue (&qe->hdr, cqueueHead.prev, &cqueueCount, CQUEUE_MAX)); kmc_processCompletions(k); return TRUE; diff --git a/doc/simh_faq.doc b/doc/simh_faq.doc index db9bd47f899bcec517e96e3e1606805a8654e199..28a60d9b0eee37200369f1909c68d026a2efa887 100644 GIT binary patch delta 9588 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