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:
@@ -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 $@ $^
|
||||
|
||||
|
||||
6
fe6/fe.c
6
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();
|
||||
|
||||
86
fe6/util.c
86
fe6/util.c
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user