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:
parent
d57e37a392
commit
06a63e5704
1 changed files with 22 additions and 11 deletions
|
@ -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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue