From 7534d729630e517f006ed7955913fb1c230527cb Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 30 Jul 2025 14:57:56 +0200 Subject: [PATCH] pushing old changes. newemu: use 510 display delay to stay compatible with new escape cmd --- fe6/Makefile | 7 ++-- fe6/fe.c | 6 +++- fe6/util.c | 86 ++++++++++++++++++++++++++++++------------------- fe6/util.h | 4 ++- newemu/common.c | 2 +- newemu/dis340.c | 13 +++++--- panel/panel6.c | 15 ++++++--- 7 files changed, 84 insertions(+), 49 deletions(-) diff --git a/fe6/Makefile b/fe6/Makefile index a1dd284..c87ebcf 100644 --- a/fe6/Makefile +++ b/fe6/Makefile @@ -4,9 +4,9 @@ LDFLAGS=-lpthread SRC=fe.c cmd.c util.c netmem.c pdp6common.c threading.c -all: fe6_emu fe6_fake fe6 feka +all: fe6_panel fe6_emu fe6_fake fe6 feka clean: - rm fe6_emu fe6_fake fe6 + rm fe6_panel fe6_emu fe6_fake fe6 fe6: $(SRC) 6/real6.c $(XX)gcc -I6 $(CFLAGS) $(LDFLAGS) -o $@ $^ @@ -14,6 +14,9 @@ fe6: $(SRC) 6/real6.c fe6_fake: $(SRC) fake.c $(CC) -I6 $(CFLAGS) $(LDFLAGS) -o $@ $^ +fe6_panel: $(SRC) panel.c + $(CC) -I6 $(CFLAGS) $(LDFLAGS) -o $@ $^ + fe6_emu: $(SRC) 6/emu6.c $(CC) -I6 $(CFLAGS) $(LDFLAGS) -o $@ $^ diff --git a/fe6/fe.c b/fe6/fe.c index e7c8f4f..71d3f28 100644 --- a/fe6/fe.c +++ b/fe6/fe.c @@ -539,6 +539,8 @@ runline(void) } } +void zerocore(void); +/* void zerocore(void) { @@ -547,6 +549,7 @@ zerocore(void) deposit(a, 0); typestr("\r\n"); } +*/ void quit(void) @@ -567,7 +570,7 @@ threadmain(int argc, char *argv[]) word t; init6(); - initcrt("soma"); +// initcrt("soma"); // initnetmem("10.0.0.222", 10006); raw(0); @@ -585,6 +588,7 @@ threadmain(int argc, char *argv[]) hasnum = 0; linemode = 0; + started = isrunning(); for(;;){ if(hasinput(0)){ ch = tyi(); diff --git a/fe6/util.c b/fe6/util.c index dc78b36..54fc2a4 100644 --- a/fe6/util.c +++ b/fe6/util.c @@ -2,6 +2,10 @@ #include #include +#include +#include +#include +#include #include #include #include @@ -129,43 +133,57 @@ serve(int port, void (*handlecon)(int, void*), void *arg) return; } -int -serve1(int port) -{ - int sockfd, confd; - socklen_t len; - struct sockaddr_in server, client; - int x; - - sockfd = socket(AF_INET, SOCK_STREAM, 0); - if(sockfd < 0){ - perror("error: socket"); - return -1; - } - - x = 1; - setsockopt (sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)&x, sizeof x); - - memset(&server, 0, sizeof(server)); - server.sin_family = AF_INET; - server.sin_addr.s_addr = INADDR_ANY; - server.sin_port = htons(port); - if(bind(sockfd, (struct sockaddr*)&server, sizeof(server)) < 0){ - perror("error: bind"); - return -1; - } - listen(sockfd, 5); - len = sizeof(client); - while(confd = accept(sockfd, (struct sockaddr*)&client, &len), - confd >= 0) - return confd; - perror("error: accept"); - return -1; -} - void nodelay(int fd) { int flag = 1; setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag)); } + + +void* +createseg(const char *name, size_t sz) +{ + int fd; + void *p; + + mode_t mask = umask(0); + fd = open(name, O_RDWR|O_CREAT, 0666); + umask(mask); + // if we try to open a /tmp file owned by another user + // with O_CREAT, the above will fail (even for root). + // so try again without O_CREAT + if(fd == -1) + fd = open(name, O_RDWR); + if(fd == -1) { + fprintf(stderr, "couldn't open file %s\n", name); + return NULL; + } + ftruncate(fd, sz); + p = mmap(NULL, sz, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + if(p == MAP_FAILED) { + fprintf(stderr, "couldn't mmap file\n"); + return NULL; + } + + return p; +} +void* +attachseg(const char *name, size_t sz) +{ + int fd; + void *p; + + fd = open(name, O_RDWR); + if(fd == -1) { + fprintf(stderr, "couldn't open file %s\n", name); + return NULL; + } + p = mmap(NULL, sz, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + if(p == MAP_FAILED) { + fprintf(stderr, "couldn't mmap file\n"); + return NULL; + } + + return p; +} diff --git a/fe6/util.h b/fe6/util.h index 34c617d..d191f16 100644 --- a/fe6/util.h +++ b/fe6/util.h @@ -4,5 +4,7 @@ int writen(int fd, void *data, int n); int readn(int fd, void *data, int n); int dial(const char *host, int port); void serve(int port, void (*handlecon)(int, void*), void *arg); -int serve1(int port); void nodelay(int fd); + +void *createseg(const char *name, size_t sz); +void *attachseg(const char *name, size_t sz); diff --git a/newemu/common.c b/newemu/common.c index 1389b64..d3dea97 100644 --- a/newemu/common.c +++ b/newemu/common.c @@ -119,7 +119,7 @@ serve1(int port) } listen(sockfd, 5); len = sizeof(client); - confd = accept(sockfd, (struct sockaddr*)&client, &len), + confd = accept(sockfd, (struct sockaddr*)&client, &len); close(sockfd); if(confd >= 0) return confd; diff --git a/newemu/dis340.c b/newemu/dis340.c index b03c162..6739adf 100644 --- a/newemu/dis340.c +++ b/newemu/dis340.c @@ -75,9 +75,12 @@ addcmd(Dis340 *dis, u32 cmd) { dis->cmdbuf[dis->ncmds++] = cmd; if(dis->ncmds == nelem(dis->cmdbuf)) { - if(write(dis->fd.fd, dis->cmdbuf, sizeof(dis->cmdbuf)) < sizeof(dis->cmdbuf)) - dis->fd.fd = -1; + int n = write(dis->fd.fd, dis->cmdbuf, sizeof(dis->cmdbuf)); dis->ncmds = 0; + if(n < (int)sizeof(dis->cmdbuf)) { +// TODO: close fd + dis->fd.fd = -1; + } } } @@ -86,11 +89,11 @@ agedisplay(Dis340 *dis) { if(dis->fd.fd < 0) return; - u32 cmd = 511<<23; + u32 cmd = 510<<23; assert(dis->lasttime <= dis->simtime); u64 dt = (dis->simtime - dis->lasttime)/1000; - while(dt >= 511) { - dis->lasttime += 511*1000; + while(dt >= 510) { + dis->lasttime += 510*1000; addcmd(dis, cmd); dt = (dis->simtime - dis->lasttime)/1000; } diff --git a/panel/panel6.c b/panel/panel6.c index 0d857be..3c17cc9 100644 --- a/panel/panel6.c +++ b/panel/panel6.c @@ -515,10 +515,15 @@ shmthread(void *x) misc_sw[2].state = !!(p->sw3 & SW_POWER); misc_sw[3].state = !!(p->sw3 & SW_MEM_DISABLE); +#define X if(1) +#define Y X ; else for(;;) { - p->sw0 = getnswitches(data_sw+18, 0400000, 18, 1); - p->sw1 = getnswitches(data_sw, 0400000, 18, 1); - p->sw2 = getnswitches(ma_sw, 0400000, 18, 1); +X p->sw0 = getnswitches(data_sw+18, 0400000, 18, 1); +X p->sw1 = getnswitches(data_sw, 0400000, 18, 1); +X p->sw2 = getnswitches(ma_sw, 0400000, 18, 1); +Y setnlights(p->sw0, data_sw+18, 18, 0400000); +Y setnlights(p->sw1, data_sw, 18, 0400000); +Y setnlights(p->sw2, ma_sw, 18, 0400000); sw = 0; if(keys[0].state == 1) sw |= KEY_START; if(keys[0].state == 2) sw |= KEY_READIN; @@ -536,14 +541,14 @@ shmthread(void *x) if(misc_sw[1].state == 1) sw |= SW_ADDR_STOP; if(misc_sw[2].state == 1) sw |= SW_POWER; if(misc_sw[3].state == 1) sw |= SW_MEM_DISABLE; - p->sw3 = sw; +X p->sw3 = sw; sw = 0; if(keys[6].state == 1) sw |= KEY_MOTOR_OFF; if(keys[6].state == 2) sw |= KEY_MOTOR_ON; if(keys[7].state == 1) sw |= KEY_PTP_FEED; if(keys[7].state == 2) sw |= KEY_PTR_FEED; - p->sw4 = sw; +X p->sw4 = sw; setnlights(p->lights0, mi_l+18, 18, 0400000); setnlights(p->lights1, mi_l, 18, 0400000);