From 42b7bed6f550779facf28b03bc457973d7497e5d Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Mon, 3 Dec 2012 16:56:15 -0800 Subject: [PATCH] =?UTF-8?q?pdp11=5Fdmc.c=20-=20Removed=20DMP=20=E2=80=9Csu?= =?UTF-8?q?pport=E2=80=9D=20through=20conditional=20compilation,=20includi?= =?UTF-8?q?ng=20removal=20of=20SET=20TYPE=20command.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Removed SET POLL command. - Changed SET TRANSMIT command to SET PEER - Fixed problem with detached device causing socket errors --- PDP11/pdp11_dmc.c | 157 +++++++++++++------------------------------ VAX/vax780_syslist.c | 2 - VAX/vax_syslist.c | 2 - doc/vax780_doc.doc | Bin 129024 -> 129024 bytes doc/vax_doc.doc | Bin 135680 -> 135168 bytes 5 files changed, 47 insertions(+), 114 deletions(-) diff --git a/PDP11/pdp11_dmc.c b/PDP11/pdp11_dmc.c index 114a32dc..4b19760d 100644 --- a/PDP11/pdp11_dmc.c +++ b/PDP11/pdp11_dmc.c @@ -1,21 +1,8 @@ /* Bits still to deal with: -I noticed that if you attach dmc 1234 and then start the simulator. You then detach dmc, and change some dmc parameter and then merely continue (without reattaching DMC), you get a “Sockets: accept error” message displayed incessantly. Some state isn’t being recorded when the detach happens. - -I’d like to suggest that SET DMC TRANSMIT=ip:port might be more obvious if it was SET DMC PEER=ip:port. Your call. -What is the point of SET DMC SPEED? -You might want to either remove the SET DMC POLL= option or make it do something useful. Likewise cleaning up commented out code. - There is a line in vax780_defs.h which defines IOBA_DMC to (IOPAGEBASE + 0760060), Is this correct, or is it being masked by the autoconfigure fixups? -I was thinking that using this DMC11 could be simplified if there was no need for a SET DMC LINEMODE. Both sides could be listening and when not connected periodically attempt an outgoing connection to the peer. Why is LINEMODE required? - -This leads me to realize that I don’t think you can have your pdp11_dmc.c have a SET TYPE which would change a DMP device to a DMR/DMC device (DMC, DMR are register identical, right?) or change a DMR/DMC to a DMP. - -Since, I believe you had said that the DMP isn’t really implemented yet, for now, you should probably have some code which fails an attach to a DMP device and with some sort of unimplemented message, along with anything else you deem appropriate. You can #ifdef DMP_WORKING this fake ‘unimplemented’ code (for now) so you can work on the real implementation in the same source module which will be part of the distribution. Once you’ve got everything working the #ifdef stuff gets cut out and will build normally. - - */ @@ -86,8 +73,6 @@ You can add /PASS=n to the above commands to get the diagnostic to send and rece The other test was to configure DECnet on VMS 4.6 and do SET HOST. */ -// TODO: Copyright notices -// TODO: Compile on other platforms // TODO: Avoid need for manifests and newest runtime, compile with 2003 // TODO: Investigate line number and set parameters at the unit level (?) // TODO: Multipoint. In this case perhaps don't need transmit port, allow all lines to connect to port on control node. @@ -140,7 +125,7 @@ typedef struct int receive_readable; char *receive_port; int transmit_writeable; - char transmit_host[80]; + char transmit_host[CBUFSIZE]; int transmit_is_loopback; /* if true the transmit socket is the loopback to the receive */ int speed; /* bits per second in each direction, 0 for no limit */ int last_second; @@ -206,7 +191,6 @@ struct dmc_controller { BUFFER_QUEUE *receive_queue; BUFFER_QUEUE *transmit_queue; SOCKET master_socket; - int32 svc_poll_interval; int32 connect_poll_interval; DEVTYPE dev_type; uint32 rxi; @@ -226,19 +210,18 @@ t_stat dmc_wr(int32 data, int32 PA, int32 access); t_stat dmc_svc(UNIT * uptr); t_stat dmc_reset (DEVICE * dptr); t_stat dmc_attach (UNIT * uptr, char * cptr); +int dmc_isattached(CTLR *controller); t_stat dmc_detach (UNIT * uptr); int32 dmc_rxint (void); int32 dmc_txint (void); -t_stat dmc_settransmit (UNIT* uptr, int32 val, char* cptr, void* desc); -t_stat dmc_showtransmit (FILE* st, UNIT* uptr, int32 val, void* desc); +t_stat dmc_setpeer (UNIT* uptr, int32 val, char* cptr, void* desc); +t_stat dmc_showpeer (FILE* st, UNIT* uptr, int32 val, void* desc); t_stat dmc_setspeed (UNIT* uptr, int32 val, char* cptr, void* desc); t_stat dmc_showspeed (FILE* st, UNIT* uptr, int32 val, void* desc); t_stat dmc_settype (UNIT* uptr, int32 val, char* cptr, void* desc); t_stat dmc_showtype (FILE* st, UNIT* uptr, int32 val, void* desc); t_stat dmc_setstats (UNIT* uptr, int32 val, char* cptr, void* desc); t_stat dmc_showstats (FILE* st, UNIT* uptr, int32 val, void* desc); -t_stat dmc_setpoll (UNIT* uptr, int32 val, char* cptr, void* desc); -t_stat dmc_showpoll (FILE* st, UNIT* uptr, int32 val, void* desc); t_stat dmc_setconnectpoll (UNIT* uptr, int32 val, char* cptr, void* desc); t_stat dmc_showconnectpoll (FILE* st, UNIT* uptr, int32 val, void* desc); t_stat dmc_setlinemode (UNIT* uptr, int32 val, char* cptr, void* desc); @@ -370,12 +353,13 @@ REG dmp_reg[] = { { NULL } }; MTAB dmc_mod[] = { - { MTAB_XTD | MTAB_VDV, 0, "TRANSMIT", "TRANSMIT=address:port" ,&dmc_settransmit, &dmc_showtransmit, NULL }, + { MTAB_XTD | MTAB_VDV, 0, "PEER", "PEER=address:port" ,&dmc_setpeer, &dmc_showpeer, NULL }, { MTAB_XTD | MTAB_VDV, 0, "SPEED", "SPEED" ,&dmc_setspeed, &dmc_showspeed, NULL }, +#ifdef DMP { MTAB_XTD | MTAB_VDV, 0, "TYPE", "TYPE" ,&dmc_settype, &dmc_showtype, NULL }, +#endif { MTAB_XTD | MTAB_VDV, 0, "LINEMODE", "LINEMODE" ,&dmc_setlinemode, &dmc_showlinemode, NULL }, { MTAB_XTD | MTAB_VDV | MTAB_NMO, 0, "STATS", "STATS" ,&dmc_setstats, &dmc_showstats, NULL }, - { MTAB_XTD | MTAB_VDV, 0, "POLL", "POLL" ,&dmc_setpoll, &dmc_showpoll, NULL }, { MTAB_XTD | MTAB_VDV, 0, "CONNECTPOLL", "CONNECTPOLL" ,&dmc_setconnectpoll, &dmc_showconnectpoll, NULL }, { MTAB_XTD | MTAB_VDV, 006, "ADDRESS", "ADDRESS", &set_addr, &show_addr, NULL }, { MTAB_XTD |MTAB_VDV, 0, "VECTOR", "VECTOR", &set_vec, &show_vec, NULL }, @@ -411,12 +395,14 @@ DEVICE dmc_dev[] = &dmc_dib[3], DEV_FLTA | DEV_DISABLE | DEV_DIS | DEV_UBUS | DEV_NET | DEV_DEBUG, 0, dmc_debug } }; +#ifdef DMP DEVICE dmp_dev[] = { { "DMP", &dmp_unit[0], dmp_reg, dmc_mod, DMP_UNITSPERDEVICE, DMC_RDX, 8, 1, DMC_RDX, 8, NULL,NULL,&dmc_reset,NULL,&dmc_attach,&dmc_detach, &dmp_dib[0], DEV_FLTA | DEV_DISABLE | DEV_DIS | DEV_UBUS | DEV_NET | DEV_DEBUG, 0, dmc_debug } }; +#endif LINE dmc_line[DMC_NUMDEVICE] = { @@ -443,7 +429,9 @@ CTLR dmc_ctrls[] = { &dmc_csrs[1], &dmc_dev[1], Initialised, Idle, 0, 0, &dmc_line[1], &dmc_receive_queues[1], &dmc_transmit_queues[1], INVALID_SOCKET, -1, 30, DMC }, { &dmc_csrs[2], &dmc_dev[2], Initialised, Idle, 0, 0, &dmc_line[2], &dmc_receive_queues[2], &dmc_transmit_queues[2], INVALID_SOCKET, -1, 30, DMC }, { &dmc_csrs[3], &dmc_dev[3], Initialised, Idle, 0, 0, &dmc_line[3], &dmc_receive_queues[3], &dmc_transmit_queues[3], INVALID_SOCKET, -1, 30, DMC }, +#ifdef DMP { &dmp_csrs[0], &dmp_dev[0], Initialised, Idle, 0, 0, &dmp_line[0], &dmp_receive_queues[0], &dmp_transmit_queues[0], INVALID_SOCKET, -1, 30, DMP } +#endif }; extern int32 tmxr_poll; /* calibrated delay */ @@ -554,14 +542,17 @@ CTLR *dmc_get_controller_from_device(DEVICE *device) return ans; } -t_stat dmc_showtransmit (FILE* st, UNIT* uptr, int32 val, void* desc) +t_stat dmc_showpeer (FILE* st, UNIT* uptr, int32 val, void* desc) { CTLR *controller = dmc_get_controller_from_unit(uptr); - fprintf(st, "TRANSMIT=%s", controller->line->transmit_host); + if (controller->line->transmit_host[0]) + fprintf(st, "PEER=%s", controller->line->transmit_host); + else + fprintf(st, "PEER Unspecified"); return SCPE_OK; } -t_stat dmc_settransmit (UNIT* uptr, int32 val, char* cptr, void* desc) +t_stat dmc_setpeer (UNIT* uptr, int32 val, char* cptr, void* desc) { t_stat status = SCPE_OK; char host[CBUFSIZE], port[CBUFSIZE]; @@ -717,27 +708,6 @@ t_stat dmc_setstats (UNIT* uptr, int32 val, char* cptr, void* desc) return status; } -t_stat dmc_showpoll (FILE* st, UNIT* uptr, int32 val, void* desc) -{ - CTLR *controller = dmc_get_controller_from_unit(uptr); - fprintf(st, "POLL=%d", controller->svc_poll_interval); - return SCPE_OK; -} - -t_stat dmc_setpoll (UNIT* uptr, int32 val, char* cptr, void* desc) -{ - t_stat status = SCPE_OK; - CTLR *controller = dmc_get_controller_from_unit(uptr); - - if (!cptr) return SCPE_IERR; - if (sscanf(cptr, "%d", &controller->svc_poll_interval) != 1) - { - status = SCPE_ARG; - } - - return status; -} - t_stat dmc_showconnectpoll (FILE* st, UNIT* uptr, int32 val, void* desc) { CTLR *controller = dmc_get_controller_from_unit(uptr); @@ -1195,14 +1165,12 @@ void dmc_process_master_clear(CTLR *controller) } dmc_buffer_queue_init(controller, controller->receive_queue, "receive"); dmc_buffer_queue_init(controller, controller->transmit_queue, "transmit"); - //dmc_close_receive(controller, "master clear", NULL); - //dmc_close_transmit(controller, "master clear"); controller->transfer_state = Idle; dmc_set_run(controller); sim_cancel (controller->device->units); /* stop poll */ - sim_activate_abs(controller->device->units, clk_cosched (controller->svc_poll_interval)); + sim_activate_abs(controller->device->units, clk_cosched (tmxr_poll)); } void dmc_start_input_transfer(CTLR *controller) @@ -1286,22 +1254,19 @@ t_stat dmc_svc(UNIT* uptr) controller = dmc_get_controller_from_unit(uptr); - dmc_line_update_speed_stats(controller->line); - - if (dmc_buffer_fill_receive_buffers(controller)) + if (dmc_isattached(controller)) { -// poll = 200; /* if we received data then lets poll quicker as there seems to be some activity */ - } - if (controller->transfer_state == Idle) dmc_start_transfer_receive_buffer(controller); + dmc_line_update_speed_stats(controller->line); - if (dmc_buffer_send_transmit_buffers(controller)) - { -// poll = 200; /* if we transmitted data then lets poll quicker as there seems to be some activity */ + dmc_buffer_fill_receive_buffers(controller); + if (controller->transfer_state == Idle) dmc_start_transfer_receive_buffer(controller); + + dmc_buffer_send_transmit_buffers(controller); + if (controller->transfer_state == Idle) dmc_start_transfer_transmit_buffer(controller); } - if (controller->transfer_state == Idle) dmc_start_transfer_transmit_buffer(controller); /* resubmit service timer */ - sim_activate(controller->device->units, poll/*controller->svc_poll_interval*/); + sim_activate(controller->device->units, poll); dmc_timer_stop(poll_timer); if (dmc_timer_started(between_polls_timer)) @@ -1366,14 +1331,10 @@ void dmc_buffer_trace_line(int tracelevel, CTLR *controller, uint8 *buf, int len { char hex[TRACE_BYTES_PER_LINE*3+1]; char ascii[TRACE_BYTES_PER_LINE+1]; - //char ts[9]; - //time_t t; int i; hex[0] = 0; ascii[TRACE_BYTES_PER_LINE] = 0; - //t = time(NULL); - //strftime(ts, 9, "%H:%M:%S", localtime(&t)); for (i = 0; i=length) @@ -1598,7 +1559,6 @@ t_stat dmc_close_master_socket(CTLR *controller) // Gets the bidirectional socket and handles arbitration of determining which socket to use. int dmc_get_socket(CTLR *controller, int forRead) { -// static int lastans = 0; int ans = 0; if (controller->line->isPrimary) { @@ -1608,13 +1568,6 @@ int dmc_get_socket(CTLR *controller, int forRead) { ans = dmc_get_receive_socket(controller, forRead); // TODO: After change to single socket, loopback may not work. } - -// if (lastans != ans) -// { -//sim_debug(DBG_SOK, controller->device, "Get Socket forread=%d, changed to %d\n", forRead, ans); -// } -// lastans = ans; -// return ans; } @@ -1683,7 +1636,8 @@ int dmc_get_transmit_socket(CTLR *controller, int is_loopback, int forRead) if (controller->line->socket == INVALID_SOCKET && ((int32)(time(NULL) - controller->line->last_connect_attempt)) > controller->connect_poll_interval) { - char hostport[CBUFSIZE]; + char host_port_buf[CBUFSIZE]; + char *host_port = host_port_buf; controller->line->transmit_is_loopback = is_loopback; @@ -1691,18 +1645,25 @@ int dmc_get_transmit_socket(CTLR *controller, int is_loopback, int forRead) if (is_loopback) { if (strrchr(controller->line->receive_port, ':')) - sprintf(hostport, "%s", controller->line->receive_port); + { + host_port = controller->line->receive_port; + } else - sprintf(hostport, "localhost:%s", controller->line->receive_port); + { + sprintf(host_port_buf, "localhost:%s", controller->line->receive_port); + } } else - sprintf(hostport, "%s", controller->line->transmit_host); - sim_debug(DBG_SOK, controller->device, "Trying to open transmit socket to address:port %s\n", hostport); + { + host_port = controller->line->transmit_host; + } + + sim_debug(DBG_SOK, controller->device, "Trying to open transmit socket to address:port %s\n", host_port); controller->line->last_connect_attempt = time(NULL); - controller->line->socket = sim_connect_sock(hostport, NULL, NULL); + controller->line->socket = sim_connect_sock(host_port, NULL, NULL); if (controller->line->socket != INVALID_SOCKET) { - sim_debug(DBG_SOK, controller->device, "Opened transmit socket to port %s\n", hostport); + sim_debug(DBG_SOK, controller->device, "Opened transmit socket to port %s\n", host_port); controller->line->transmit_writeable = FALSE; } } @@ -1736,7 +1697,7 @@ int dmc_get_transmit_socket(CTLR *controller, int is_loopback, int forRead) void dmc_close_receive(CTLR *controller, char *reason, char *from) { -sim_debug(DBG_SOK, controller->device, "Closing receive socket on port %s, reason: %s%s%s\n", controller->line->receive_port, reason, from ? " from " : "", from ? from : ""); + sim_debug(DBG_SOK, controller->device, "Closing receive socket on port %s, reason: %s%s%s\n", controller->line->receive_port, reason, from ? " from " : "", from ? from : ""); sim_close_sock(controller->line->socket, FALSE); controller->line->socket = INVALID_SOCKET; @@ -1837,10 +1798,6 @@ int dmc_buffer_fill_receive_buffers(CTLR *controller) } } } - else - { -//printf("Socket error was when trying to read the header.\n"); - } } else { @@ -1888,10 +1845,6 @@ int dmc_buffer_fill_receive_buffers(CTLR *controller) ans = TRUE; } } - else - { -printf("Socket error was when trying to fill receive buffers when trying to read the body.\n"); - } } /* Only close the socket if there was an error or no more data */ @@ -2059,18 +2012,11 @@ void dmc_process_input_transfer_completion(CTLR *controller) uint16 sel4 = controller->csrs->sel4; uint16 sel6 = controller->csrs->sel6; dmc_clear_rdyi(controller); - //dmc_clrrxint(); if (controller->transfer_type == TYPE_BASEI) { - //int i; uint32 baseaddr = ((sel6 >> 14) << 16) | sel4; uint16 count = sel6 & 0x3FFF; sim_debug(DBG_INF, controller->device, "Completing Base In input transfer, base address=0x%08x count=%d\n", baseaddr, count); - //for (i = 0; i < count; i++) - //{ - // uint8 t = ((uint8)i + 1)*2; - // Map_WriteB(baseaddr + i, 1, &t); - //} } else if (controller->transfer_type == TYPE_BACCI) { @@ -2106,7 +2052,6 @@ void dmc_process_input_transfer_completion(CTLR *controller) { uint16 sel4 = controller->csrs->sel4; uint16 sel6 = controller->csrs->sel6; - //dmc_clrrxint(); if (controller->transfer_type == TYPE_DMP_MODE) { uint16 mode = sel6 & DMP_TYPE_INPUT_MASK; @@ -2258,22 +2203,11 @@ int32 dmc_txint (void) } return ans; - - //int32 ans = 0; /* no interrupt request active */ - //if (controller->txi != 0) - //{ - // DIB *dib = (DIB *)controller->device->ctxt; - // ans = dib->vec + 4; - // dmc_clrtxint(); - //} - - //return ans; } t_stat dmc_reset (DEVICE *dptr) { t_stat ans = SCPE_OK; - //int32 ndev; CTLR *controller = dmc_get_controller_from_device(dptr); sim_debug(DBG_TRC, dptr, "dmc_reset()\n"); @@ -2287,7 +2221,6 @@ t_stat dmc_reset (DEVICE *dptr) dmc_clrrxint(controller); dmc_clrtxint(controller); sim_cancel (controller->device->units); /* stop poll */ - if (controller->svc_poll_interval == -1) controller->svc_poll_interval = POLL; if (!(dptr->flags & DEV_DIS)) { @@ -2314,6 +2247,11 @@ t_stat dmc_attach (UNIT *uptr, char *cptr) return ans; } +int dmc_isattached(CTLR *controller) +{ + return controller->master_socket != INVALID_SOCKET; +} + t_stat dmc_detach (UNIT *uptr) { CTLR *controller = dmc_get_controller_from_unit(uptr); @@ -2324,4 +2262,3 @@ t_stat dmc_detach (UNIT *uptr) return SCPE_OK; } - diff --git a/VAX/vax780_syslist.c b/VAX/vax780_syslist.c index 8d179231..5f0aa965 100644 --- a/VAX/vax780_syslist.c +++ b/VAX/vax780_syslist.c @@ -55,7 +55,6 @@ extern DEVICE dz_dev; extern DEVICE vh_dev; extern DEVICE xu_dev, xub_dev; extern DEVICE dmc_dev[]; -extern DEVICE dmp_dev[]; extern int32 sim_switches; extern UNIT cpu_unit; @@ -97,7 +96,6 @@ DEVICE *sim_devices[] = { &dmc_dev[1], &dmc_dev[2], &dmc_dev[3], - &dmp_dev[0], NULL }; diff --git a/VAX/vax_syslist.c b/VAX/vax_syslist.c index 1e278ca6..6554aaf6 100644 --- a/VAX/vax_syslist.c +++ b/VAX/vax_syslist.c @@ -52,7 +52,6 @@ extern DEVICE csi_dev, cso_dev; extern DEVICE xq_dev, xqb_dev; extern DEVICE vh_dev; extern DEVICE dmc_dev[]; -extern DEVICE dmp_dev[]; extern int32 sim_switches; extern void WriteB (uint32 pa, int32 val); @@ -89,7 +88,6 @@ DEVICE *sim_devices[] = { &dmc_dev[1], &dmc_dev[2], &dmc_dev[3], - &dmp_dev[0], NULL }; diff --git a/doc/vax780_doc.doc b/doc/vax780_doc.doc index f9bcb3ead2cd55417d7566f2d3b3be02493970c0..3b262b9a6d21595ec6260055a1260f467588ac2d 100644 GIT binary patch delta 10727 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 C&{ui@ diff --git a/doc/vax_doc.doc b/doc/vax_doc.doc index 0a1ab6d2f5b8e920989564b9b3a6a3bd3ff416c9..c40ca983646fc5b2d1d1fa74df8353ce769f9b69 100644 GIT binary patch delta 16757 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