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:
parent
96f762e2f0
commit
1d0b8abd13
27
makefile
27
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)
|
||||
|
||||
40
scp.c
40
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;
|
||||
}
|
||||
|
||||
52
sim_disk.c
52
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 */
|
||||
|
||||
|
||||
20
sim_sock.c
20
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;
|
||||
}
|
||||
|
||||
|
||||
48
sim_tmxr.c
48
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 <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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user