From 1d0b8abd1395bfad6bd56cccc6b965e1a0f0d541 Mon Sep 17 00:00:00 2001 From: Richard Cornwell Date: Tue, 31 Mar 2020 21:43:22 -0400 Subject: [PATCH] SCP: Updated to current. --- makefile | 27 --------------------------- scp.c | 40 +++++++++++++++++++++++++--------------- sim_disk.c | 52 +++++++++++++++++++++++++++++++++++++++++++++------- sim_sock.c | 20 +++++++++++--------- sim_tmxr.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++- sim_tmxr.h | 1 + 6 files changed, 129 insertions(+), 59 deletions(-) diff --git a/makefile b/makefile index f43b8be..a9380ae 100644 --- a/makefile +++ b/makefile @@ -595,33 +595,6 @@ ifeq (${WIN32},) #*nix Environments (&& cygwin) endif endif endif - else - ifneq (,$(call find_include,SDL/SDL)) - ifneq (,$(call find_lib,SDL)) - ifneq (,$(findstring Haiku,$(OSTYPE))) - ifneq (,$(shell which sdl-config)) - SDLX_CONFIG = sdl-config - endif - else - SDLX_CONFIG = $(realpath $(dir $(call find_include,SDL/SDL))../../bin/sdl-config) - endif - ifneq (,$(SDLX_CONFIG)) - VIDEO_CCDEFS += -DHAVE_LIBSDL -DUSE_SIM_VIDEO `$(SDLX_CONFIG) --cflags` - VIDEO_LDFLAGS += `$(SDLX_CONFIG) --libs` - VIDEO_FEATURES = - video capabilities provided by libSDL (Simple Directmedia Layer) - DISPLAYL = ${DISPLAYD}/display.c $(DISPLAYD)/sim_ws.c - DISPLAYVT = ${DISPLAYD}/vt11.c - DISPLAY340 = ${DISPLAYD}/type340.c - DISPLAYNG = ${DISPLAYD}/ng.c - DISPLAYIII = ${DISPLAYD}/iii.c - DISPLAY_OPT += -DUSE_DISPLAY $(VIDEO_CCDEFS) $(VIDEO_LDFLAGS) - $(info using libSDL: $(call find_include,SDL/SDL)) - ifeq (Darwin,$(OSTYPE)) - VIDEO_CCDEFS += -DSDL_MAIN_AVAILABLE - endif - endif - endif - endif endif ifeq (cygwin,$(OSTYPE)) LIBEXT = $(LIBEXTSAVE) diff --git a/scp.c b/scp.c index 00398c8..6ed24ab 100644 --- a/scp.c +++ b/scp.c @@ -15378,26 +15378,36 @@ if (sim_switches & SWMASK ('D')) { } for (i = 0; (dptr = sim_devices[i]) != NULL; i++) { t_stat tstat = SCPE_OK; + t_bool was_disabled = ((dptr->flags & DEV_DIS) != 0); sim_switches = saved_switches; - switch (DEV_TYPE(dptr)) { + if (was_disabled) + tstat = set_dev_enbdis (dptr, NULL, 1, NULL); + if (tstat == SCPE_OK) { + switch (DEV_TYPE(dptr)) { #if defined(USE_SIM_CARD) - case DEV_CARD: - tstat = sim_card_test (dptr); - break; + case DEV_CARD: + tstat = sim_card_test (dptr); + break; #endif - case DEV_DISK: - tstat = sim_disk_test (dptr); - break; - case DEV_ETHER: - tstat = sim_ether_test (dptr); - break; - case DEV_TAPE: - tstat = sim_tape_test (dptr); - break; - default: - break; + case DEV_DISK: + tstat = sim_disk_test (dptr); + break; + case DEV_ETHER: + tstat = sim_ether_test (dptr); + break; + case DEV_TAPE: + tstat = sim_tape_test (dptr); + break; + case DEV_MUX: + tstat = tmxr_sock_test (dptr); + break; + default: + break; + } } + if (was_disabled) + set_dev_enbdis (dptr, NULL, 0, NULL); if (tstat != SCPE_OK) stat = tstat; } diff --git a/sim_disk.c b/sim_disk.c index f8672c5..99a4c56 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -53,6 +53,14 @@ Public routines: sim_disk_data_trace debug support sim_disk_test unit test routine + Guest-specific routines for PDP-10 which uses 1024 byte sectors and + requires mapping functions to allow access to the underlying 512 byte + sectors provided by the sim_disk routines + + sim_disk_pdp10_attach attach disk unit + sim_disk_pdp10_rdsect read PDP-10 disk sectors + sim_disk_pdp10_wrsect write PDP-10 disk sectors + Internal routines: sim_os_disk_open_raw platform specific open raw device @@ -89,7 +97,7 @@ struct disk_context { DEVICE *dptr; /* Device for unit (access to debug flags) */ uint32 dbit; /* debugging bit */ uint32 sector_size; /* Disk Sector Size (of the pseudo disk) */ - uint32 capac_factor; /* Units of Capacity (2 = word, 1 = byte) */ + uint32 capac_factor; /* Units of Capacity (8 = quadword, 2 = word, 1 = byte) */ uint32 xfer_element_size; /* Disk Bus Transfer size (1 - byte, 2 - word, 4 - longword) */ uint32 storage_sector_size;/* Sector size of the containing storage */ uint32 removable; /* Removable device flag */ @@ -692,7 +700,7 @@ sim_debug_unit (ctx->dbit, uptr, "sim_disk_wrsect(unit=%d, lba=0x%X, sects=%d)\n if (uptr->dynflags & UNIT_DISK_CHK) { DEVICE *dptr = find_dev_from_unit (uptr); - uint32 capac_factor = ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* capacity units (word: 2, byte: 1) */ + uint32 capac_factor = ((dptr->dwidth / dptr->aincr) >= 32) ? 8 : ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* capacity units (quadword: 8, word: 2, byte: 1) */ t_lba total_sectors = (t_lba)((uptr->capac*capac_factor)/(ctx->sector_size/((dptr->flags & DEV_SECTORS) ? 512 : 1))); t_lba sect; @@ -2012,7 +2020,7 @@ static FILESYSTEM_CHECK checks[] = { filesystem */ NULL }; -t_offset ret_val; +t_offset ret_val = (t_offset)-1; int i; for (i = 0; checks[i] != NULL; i++) { @@ -2097,7 +2105,7 @@ if (sim_switches & SWMASK ('C')) { /* create vhd disk & cop return sim_messagef (r, "Can't open source VHD: %s\n", cptr); } sim_messagef (SCPE_OK, "%s%d: creating new virtual disk '%s'\n", sim_dname (dptr), (int)(uptr-dptr->units), gbuf); - capac_factor = ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* capacity units (word: 2, byte: 1) */ + capac_factor = ((dptr->dwidth / dptr->aincr) >= 32) ? 8 : ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* capacity units (quadword: 8, word: 2, byte: 1) */ vhd = sim_vhd_disk_create (gbuf, ((t_offset)uptr->capac)*capac_factor*((dptr->flags & DEV_SECTORS) ? 512 : 1)); if (!vhd) { return sim_messagef (r, "%s%d: can't create virtual disk '%s'\n", sim_dname (dptr), (int)(uptr-dptr->units), gbuf); @@ -2274,7 +2282,7 @@ if ((uptr->filename == NULL) || (uptr->disk_ctx == NULL)) return _err_return (uptr, SCPE_MEM); strlcpy (uptr->filename, cptr, CBUFSIZE); /* save name */ ctx->sector_size = (uint32)sector_size; /* save sector_size */ -ctx->capac_factor = ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* save capacity units (word: 2, byte: 1) */ +ctx->capac_factor = ((dptr->dwidth / dptr->aincr) >= 32) ? 8 : ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* save capacity units (quadword: 8, word: 2, byte: 1) */ ctx->xfer_element_size = (uint32)xfer_element_size; /* save xfer_element_size */ ctx->dptr = dptr; /* save DEVICE pointer */ ctx->dbit = dbit; /* save debug bit */ @@ -2372,7 +2380,7 @@ if ((created) && (!copied)) { if (sim_switches & SWMASK ('I')) { /* Initialize To Sector Address */ uint8 *init_buf = (uint8*) malloc (1024*1024); t_lba lba, sect; - uint32 capac_factor = ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* capacity units (word: 2, byte: 1) */ + uint32 capac_factor = ((dptr->dwidth / dptr->aincr) >= 32) ? 8 : ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* capacity units (quadword: 8, word: 2, byte: 1) */ t_seccnt sectors_per_buffer = (t_seccnt)((1024*1024)/sector_size); t_lba total_sectors = (t_lba)((uptr->capac*capac_factor)/(sector_size/((dptr->flags & DEV_SECTORS) ? 512 : 1))); t_seccnt sects = sectors_per_buffer; @@ -2410,7 +2418,7 @@ if ((created) && (!copied)) { if (sim_switches & SWMASK ('K')) { t_stat r = SCPE_OK; t_lba lba, sect; - uint32 capac_factor = ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* capacity units (word: 2, byte: 1) */ + uint32 capac_factor = ((dptr->dwidth / dptr->aincr) >= 32) ? 8 : ((dptr->dwidth / dptr->aincr) == 16) ? 2 : 1; /* capacity units (word: 2, byte: 1) */ t_seccnt sectors_per_buffer = (t_seccnt)((1024*1024)/sector_size); t_lba total_sectors = (t_lba)((uptr->capac*capac_factor)/(sector_size/((dptr->flags & DEV_SECTORS) ? 512 : 1))); t_seccnt sects = sectors_per_buffer; @@ -2869,6 +2877,36 @@ if (sim_deb && (dptr->dctrl & reason)) { } } +/* Guest specific Disk I/O support */ +#define PDP10_SECTORS 2 /* PDP-10 sectors are 1024 bytes */ + +t_stat sim_disk_pdp10_attach (UNIT *uptr, const char *cptr, size_t sector_size, size_t xfer_element_size, t_bool dontautosize, + uint32 dbit, const char *dtype, int completion_delay, const char **drivetypes) +{ +return sim_disk_attach_ex (uptr, cptr, sector_size / PDP10_SECTORS, xfer_element_size, dontautosize, dbit, dtype, 0, completion_delay, drivetypes); +} + +t_stat sim_disk_pdp10_rdsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectsread, t_seccnt sects) +{ +t_seccnt sectors; +t_stat r = sim_disk_rdsect (uptr, lba * PDP10_SECTORS, buf, §ors, sects * PDP10_SECTORS); + +if (sectsread) + *sectsread = sectors / PDP10_SECTORS; + +return r; +} + +t_stat sim_disk_pdp10_wrsect (UNIT *uptr, t_lba lba, uint8 *buf, t_seccnt *sectswritten, t_seccnt sects) +{ +t_seccnt sectors; +t_stat r = sim_disk_wrsect (uptr, lba * PDP10_SECTORS, buf, §ors, sects * PDP10_SECTORS); + +if (sectswritten) + *sectswritten = sectors / PDP10_SECTORS; + +return r; +} /* OS Specific RAW Disk I/O support */ diff --git a/sim_sock.c b/sim_sock.c index 428a19a..7038306 100644 --- a/sim_sock.c +++ b/sim_sock.c @@ -262,6 +262,7 @@ if (service) { char *c; port = strtoul(service, &c, 10); + port = htons((unsigned short)port); if ((port == 0) || (*c != '\0')) { switch (hints->ai_socktype) { @@ -431,6 +432,10 @@ return 0; #if !defined(IPV6_V6ONLY) /* Older XP environments may not define IPV6_V6ONLY */ #define IPV6_V6ONLY 27 /* Treat wildcard bind as AF_INET6-only. */ #endif +#if defined(TEST_INFO_STUBS) +#undef IPV6_V6ONLY +#undef AF_INET6 +#endif /* Dynamic DLL load variables */ #ifdef _WIN32 static HINSTANCE hLib = 0; /* handle to DLL */ @@ -738,6 +743,12 @@ load_ws2 (); #if defined (SIGPIPE) signal (SIGPIPE, SIG_IGN); /* no pipe signals */ #endif +#if defined(TEST_INFO_STUBS) +/* force use of stubs */ +p_getaddrinfo = (getaddrinfo_func)s_getaddrinfo; +p_getnameinfo = (getnameinfo_func)s_getnameinfo; +p_freeaddrinfo = (freeaddrinfo_func)s_freeaddrinfo; +#endif } void sim_cleanup_sock (void) @@ -1068,14 +1079,10 @@ if (newsock == INVALID_SOCKET) { /* error? */ } if (connectaddr != NULL) { *connectaddr = (char *)calloc(1, NI_MAXHOST+1); -#ifdef AF_INET6 p_getnameinfo((struct sockaddr *)&clientname, size, *connectaddr, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (0 == memcmp("::ffff:", *connectaddr, 7)) /* is this a IPv4-mapped IPv6 address? */ memmove(*connectaddr, 7+*connectaddr, /* prefer bare IPv4 address */ strlen(*connectaddr) - 7 + 1); /* length to include terminating \0 */ -#else - strcpy(*connectaddr, inet_ntoa(((struct sockaddr_in *)&connectaddr)->s_addr)); -#endif } if (!(opt_flags & SIM_SOCK_OPT_BLOCKING)) { @@ -1156,7 +1163,6 @@ size_t size = addrsize; #endif int ret = 0; -#ifdef AF_INET6 *hostnamebuf = '\0'; *portnamebuf = '\0'; ret = p_getnameinfo(addr, size, hostnamebuf, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); @@ -1165,10 +1171,6 @@ if (0 == memcmp("::ffff:", hostnamebuf, 7)) /* is this a IPv4-mapped IPv6 strlen(hostnamebuf) + 7 - 1); /* length to include terminating \0 */ if (!ret) ret = p_getnameinfo(addr, size, NULL, 0, portnamebuf, NI_MAXSERV, NI_NUMERICSERV); -#else -strcpy(hostnamebuf, inet_ntoa(((struct sockaddr_in *)addr)->s_addr)); -sprintf(portnamebuf, "%d", (int)ntohs(((struct sockaddr_in *)addr)->s_port))); -#endif return ret; } diff --git a/sim_tmxr.c b/sim_tmxr.c index 2c3796b..767cab9 100644 --- a/sim_tmxr.c +++ b/sim_tmxr.c @@ -1038,7 +1038,8 @@ if (mp->last_poll_time == 0) { /* first poll initializa } } -if ((poll_time - mp->last_poll_time) < mp->poll_interval*1000) +if (sim_is_running && + ((poll_time - mp->last_poll_time) < mp->poll_interval*1000)) return -1; /* too soon to try */ srand((unsigned int)poll_time); @@ -5447,3 +5448,48 @@ if ((dptr) && (dbits & dptr->dctrl)) { } } } + +/* Testing of sim_sock and tmxr */ + +#include + +t_stat tmxr_sock_test (DEVICE *dptr) +{ +char cmd[CBUFSIZE]; +int line; +TMXR *tmxr; +TMLN *ln; +t_stat stat = SCPE_OK; +SOCKET sock_mux = INVALID_SOCKET; +SOCKET sock_line = INVALID_SOCKET; +SIM_TEST_INIT; + +sim_printf ("Testing %s:\n", dptr->name); +dptr->dctrl = 0xFFFFFFFF; +dptr->dctrl &= ~TMXR_DBG_TRC; +sprintf (cmd, "%s -u localhost:65500", dptr->name); +SIM_TEST(attach_cmd (0, cmd)); +tmxr = (TMXR *)dptr->units->tmxr; +ln = &tmxr->ldsc[tmxr->lines - 1]; +SIM_TEST(detach_cmd (0, dptr->name)); +if (tmxr->lines > 1) { + tmxr->modem_control = FALSE; + for (line=0; line < tmxr->lines; line++) + tmxr->ldsc[line].modem_control = FALSE; + snprintf (cmd + strlen (cmd), sizeof (cmd) - strlen (cmd), ",Line=%d,localhost:65501", tmxr->lines - 1); + SIM_TEST(attach_cmd (0, cmd)); + sock_line = sim_connect_sock_ex (NULL, "localhost:65501", NULL, NULL, 0); + sim_os_ms_sleep (100); + SIM_TEST((tmxr_poll_conn (tmxr) == tmxr->lines - 1) ? SCPE_OK : SCPE_IERR); + sock_mux = sim_connect_sock ("", "localhost", "65500"); + sim_os_ms_sleep (100); + SIM_TEST((tmxr_poll_conn (tmxr) == 0) ? SCPE_OK : SCPE_IERR); + show_cmd (0, "MUX"); + sim_close_sock (sock_mux); + sock_mux = INVALID_SOCKET; + sim_close_sock (sock_line); + sock_line = INVALID_SOCKET; + SIM_TEST(detach_cmd (0, dptr->name)); + } +return stat; +} diff --git a/sim_tmxr.h b/sim_tmxr.h index 967fed1..9cc820a 100644 --- a/sim_tmxr.h +++ b/sim_tmxr.h @@ -307,6 +307,7 @@ const char *tmxr_send_line_name (const SEND *snd); const char *tmxr_expect_line_name (const EXPECT *exp); t_stat tmxr_startup (void); t_stat tmxr_shutdown (void); +t_stat tmxr_sock_test (DEVICE *dptr); t_stat tmxr_start_poll (void); t_stat tmxr_stop_poll (void); void _tmxr_debug (uint32 dbits, TMLN *lp, const char *msg, char *buf, int bufsize);