PDP10, PDP11, VAX780, VAX750, VAX730: Fix DMC/DMR simulation to generate NAK messages with the correct reason for CRC errors.

This commit is contained in:
Mark Pizzolato 2014-05-29 09:43:17 -07:00
parent d57e37a392
commit 06a63e5704

View file

@ -1,7 +1,7 @@
/* pdp11_dmc.c: DMC11/DMR11/DMP11/DMV11 Emulation /* pdp11_dmc.c: DMC11/DMR11/DMP11/DMV11 Emulation
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
Copyright (c) 2011, Robert M. A. Jarratt Copyright (c) 2011, Robert M. A. Jarratt, Mark Pizzolato
Permission is hereby granted, free of charge, to any person obtaining a Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"), copy of this software and associated documentation files (the "Software"),
@ -26,6 +26,8 @@
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
Written by Mark Pizzolato based on an original version by Robert Jarratt
Modification history: Modification history:
25-Jan-13 RJ Error checking for already attached in dmc_settype() fixed. 25-Jan-13 RJ Error checking for already attached in dmc_settype() fixed.
@ -469,6 +471,7 @@ typedef struct {
BUFFER *xmt_buffer; /* Current Transmit Buffer */ BUFFER *xmt_buffer; /* Current Transmit Buffer */
BUFFER *xmt_done_buffer;/* Just Completed Transmit Buffer */ BUFFER *xmt_done_buffer;/* Just Completed Transmit Buffer */
uint8 nak_reason; /* */ uint8 nak_reason; /* */
uint8 nak_crc_reason; /* CRC status for current received packet */
DDCMP_LinkState state; /* Current State */ DDCMP_LinkState state; /* Current State */
t_bool TimerRunning; /* Timer Running Flag */ t_bool TimerRunning; /* Timer Running Flag */
t_bool TimeRemaining; /* Seconds remaining before timeout (when timer running) */ t_bool TimeRemaining; /* Seconds remaining before timeout (when timer running) */
@ -600,7 +603,7 @@ void ddcmp_SetAeqRESP (CTLR *controller);
void ddcmp_SetTequalAplus1 (CTLR *controller); void ddcmp_SetTequalAplus1 (CTLR *controller);
void ddcmp_IncrementT (CTLR *controller); void ddcmp_IncrementT (CTLR *controller);
void ddcmp_SetNAKreason3 (CTLR *controller); void ddcmp_SetNAKreason3 (CTLR *controller);
void ddcmp_SetNAKreason2 (CTLR *controller); void ddcmp_SetNAKReasonCRCError (CTLR *controller);
void ddcmp_NAKMissingPackets (CTLR *controller); void ddcmp_NAKMissingPackets (CTLR *controller);
void ddcmp_IfTleAthenSetTeqAplus1 (CTLR *controller); void ddcmp_IfTleAthenSetTeqAplus1 (CTLR *controller);
void ddcmp_IfAltXthenStartTimer (CTLR *controller); void ddcmp_IfAltXthenStartTimer (CTLR *controller);
@ -668,7 +671,8 @@ DDCMP_STATETABLE DDCMP_TABLE[] = {
ddcmp_NUMGtRplus1}, Run, {ddcmp_NAKMissingPackets}}, ddcmp_NUMGtRplus1}, Run, {ddcmp_NAKMissingPackets}},
{24, Run, {ddcmp_ReceiveDataMsg, {24, Run, {ddcmp_ReceiveDataMsg,
ddcmp_NUMEqRplus1}, Run, {ddcmp_GiveBufferToUser}}, ddcmp_NUMEqRplus1}, Run, {ddcmp_GiveBufferToUser}},
{25, Run, {ddcmp_ReceiveMessageError}, Run, {ddcmp_SetSNAK}}, {25, Run, {ddcmp_ReceiveMessageError}, Run, {ddcmp_SetSNAK,
ddcmp_SetNAKReasonCRCError}},
{26, Run, {ddcmp_ReceiveRep, {26, Run, {ddcmp_ReceiveRep,
ddcmp_NumEqR}, Run, {ddcmp_SetSACK}}, ddcmp_NumEqR}, Run, {ddcmp_SetSACK}},
{27, Run, {ddcmp_ReceiveRep, {27, Run, {ddcmp_ReceiveRep,
@ -822,7 +826,7 @@ DDCMP_ACTION_NAME ddcmp_Actions[] = {
NAME(SetTequalAplus1), NAME(SetTequalAplus1),
NAME(IncrementT), NAME(IncrementT),
NAME(SetNAKreason3), NAME(SetNAKreason3),
NAME(SetNAKreason2), NAME(SetNAKReasonCRCError),
NAME(NAKMissingPackets), NAME(NAKMissingPackets),
NAME(IfTleAthenSetTeqAplus1), NAME(IfTleAthenSetTeqAplus1),
NAME(IfAltXthenStartTimer), NAME(IfAltXthenStartTimer),
@ -3015,9 +3019,9 @@ void ddcmp_SetNAKreason3 (CTLR *controller)
{ {
controller->link.nak_reason = 3; controller->link.nak_reason = 3;
} }
void ddcmp_SetNAKreason2 (CTLR *controller) void ddcmp_SetNAKReasonCRCError (CTLR *controller)
{ {
controller->link.nak_reason = 2; controller->link.nak_reason = controller->link.nak_crc_reason;
} }
void ddcmp_NAKMissingPackets (CTLR *controller) void ddcmp_NAKMissingPackets (CTLR *controller)
{ {
@ -3259,11 +3263,18 @@ return (ddcmp_compare (controller->link.T, EQ, controller->link.N + 1, controlle
} }
t_bool ddcmp_ReceiveMessageError (CTLR *controller) t_bool ddcmp_ReceiveMessageError (CTLR *controller)
{ {
if (controller->link.rcv_pkt && if (controller->link.rcv_pkt) {
((0 != ddcmp_crc16 (0, controller->link.rcv_pkt, 8)) || if (0 != ddcmp_crc16 (0, controller->link.rcv_pkt, 8)) {
((controller->link.rcv_pkt[0] != DDCMP_ENQ) && controller->link.nak_crc_reason = 1; /* Header CRC Error */
(0 != ddcmp_crc16 (0, controller->link.rcv_pkt+8, controller->link.rcv_pkt_size-8)))))
return TRUE; return TRUE;
}
if ((controller->link.rcv_pkt[0] != DDCMP_ENQ) &&
(0 != ddcmp_crc16 (0, controller->link.rcv_pkt+8, controller->link.rcv_pkt_size-8))) {
controller->link.nak_crc_reason = 2; /* Data CRC Error */
return TRUE;
}
controller->link.nak_crc_reason = 0; /* No CRC Error */
}
return FALSE; return FALSE;
} }
t_bool ddcmp_NumEqR (CTLR *controller) t_bool ddcmp_NumEqR (CTLR *controller)