1
0
mirror of https://github.com/rcornwell/sims.git synced 2026-01-13 15:27:04 +00:00

SCP: Updated to current.

This commit is contained in:
Richard Cornwell 2020-03-31 21:43:22 -04:00
parent 96f762e2f0
commit 1d0b8abd13
6 changed files with 129 additions and 59 deletions

View File

@ -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)

40
scp.c
View File

@ -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;
}

View File

@ -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, &sectors, 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, &sectors, sects * PDP10_SECTORS);
if (sectswritten)
*sectswritten = sectors / PDP10_SECTORS;
return r;
}
/* OS Specific RAW Disk I/O support */

View File

@ -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;
}

View File

@ -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 <setjmp.h>
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;
}

View File

@ -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);