1
0
mirror of https://github.com/aap/pdp6.git synced 2026-02-27 01:10:14 +00:00

pushing old changes. newemu: use 510 display delay to stay compatible with new escape cmd

This commit is contained in:
aap
2025-07-30 14:57:56 +02:00
parent 5f4d51126e
commit 7534d72963
7 changed files with 84 additions and 49 deletions

View File

@@ -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 $@ $^

View File

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

View File

@@ -2,6 +2,10 @@
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
@@ -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;
}

View File

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

View File

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

View File

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

View File

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