Skip to content

Commit b353911

Browse files
committed
newemu: fd polling mechanism
1 parent fb08e74 commit b353911

File tree

8 files changed

+204
-1
lines changed

8 files changed

+204
-1
lines changed

newemu/Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ LIBS=-lpthread -lm -lSDL2
44
#CFLAGS=-g -O3 -mcpu=cortex-a53 -mtune=cortex-a53
55
CFLAGS=-g -Wall -Wno-parentheses
66

7-
pdp6: main.c panel6.c pdp6.c tty.c pt.c dis340.c dc.c ut.c ge.c audio.c common.c
7+
pdp6: main.c panel6.c pdp6.c netmem.c tty.c pt.c dis340.c dc.c ut.c ge.c audio.c common.c
88
cc $(CFLAGS) -o $@ $^ $(INC) $(LIBS)
99

1010
run: pdp6

newemu/common.c

+15
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,21 @@ hasinput(int fd)
4343
return select(fd+1, &fds, NULL, NULL, &timeout) > 0;
4444
}
4545

46+
int
47+
readn(int fd, void *data, int n)
48+
{
49+
int m;
50+
51+
while(n > 0) {
52+
m = read(fd, data, n);
53+
if(m <= 0)
54+
return -1;
55+
data += m;
56+
n -= m;
57+
}
58+
return 0;
59+
}
60+
4661
int
4762
dial(const char *host, int port)
4863
{

newemu/common.h

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ typedef int8_t i8;
1919

2020
void panic(const char *fmt, ...);
2121
int hasinput(int fd);
22+
int readn(int fd, void *data, int n);
2223
int dial(const char *host, int port);
2324
int serve1(int port);
2425
void nodelay(int fd);

newemu/dis340.c

+10
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,16 @@ handle_joy(PDP6 *pdp, IOdev *dev, int cmd)
613613
break;
614614
}
615615
}
616+
static void
617+
handle_ojoy(PDP6 *pdp, IOdev *dev, int cmd)
618+
{
619+
switch(cmd) {
620+
case IOB_DATAI:
621+
break;
622+
}
623+
}
616624
static IOdev joy_dev = { 0, 0420, nil, handle_joy, nil };
625+
static IOdev ojoy_dev = { 0, 0724, nil, handle_ojoy, nil };
617626

618627
Dis340*
619628
attach_dis(PDP6 *pdp)
@@ -624,6 +633,7 @@ attach_dis(PDP6 *pdp)
624633
installdev(pdp, &dis_dev);
625634

626635
installdev(pdp, &joy_dev);
636+
installdev(pdp, &ojoy_dev);
627637

628638
return &dis;
629639
}

newemu/main.c

+7
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ stopmusic();
201201
updatelights(pdp, panel);
202202

203203
cycle_io(pdp, 1);
204+
handlenetmem(pdp);
204205

205206
if(throttle) while(realtime < simtime) realtime = gettime();
206207
} else {
@@ -292,6 +293,12 @@ main(int argc, char *argv[])
292293
printf("can't open /tmp/tty\n");
293294
waitfd(&pdp->tty_fd);
294295

296+
// pdp->netmem_fd.fd = dial("maya", 10006);
297+
pdp->netmem_fd.fd = dial("maya", 20006);
298+
if(pdp->netmem_fd.fd >= 0)
299+
printf("netmem connected\n");
300+
waitfd(&pdp->netmem_fd);
301+
295302
emu(pdp, panel);
296303
return 0; // can't happen
297304
}

newemu/netmem.c

+159
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
#include "common.h"
2+
#include "pdp6.h"
3+
4+
#include <unistd.h>
5+
6+
extern Word memory[01000000];
7+
8+
static u8*
9+
putu16(u8 *p, u16 n)
10+
{
11+
*p++ = n>>8;
12+
*p++ = n;
13+
return p;
14+
}
15+
16+
static u8*
17+
getu16(u8 *p, u16 *wp)
18+
{
19+
u16 w;
20+
w = p[0];
21+
w <<= 8; w |= p[1];
22+
*wp = w;
23+
return p+2;
24+
}
25+
26+
static u8*
27+
putword(u8 *p, u64 w)
28+
{
29+
*p++ = w;
30+
*p++ = w>>8;
31+
*p++ = w>>16;
32+
*p++ = w>>24;
33+
*p++ = w>>32;
34+
return p;
35+
}
36+
37+
static u8*
38+
getword(u8 *p, u64 *wp)
39+
{
40+
u64 w;
41+
w = p[4];
42+
w <<= 8; w |= p[3];
43+
w <<= 8; w |= p[2];
44+
w <<= 8; w |= p[1];
45+
w <<= 8; w |= p[0];
46+
*wp = w & 0777777777777;
47+
return p+5;
48+
}
49+
50+
static u8*
51+
getaddr(u8 *p, u32 *wp)
52+
{
53+
u32 w;
54+
w = p[2];
55+
w <<= 8; w |= p[1];
56+
w <<= 8; w |= p[0];
57+
*wp = w & 0777777;
58+
return p+3;
59+
}
60+
61+
#define log(...)
62+
63+
void
64+
handlenetmem(PDP6 *pdp)
65+
{
66+
static u8 buf[6 + 512*5];
67+
u8 *p;
68+
u16 len, n;
69+
u32 a;
70+
u64 d;
71+
enum {
72+
WRRQ = 1,
73+
RDRQ,
74+
ACK,
75+
ERR,
76+
RDNRQ,
77+
WRNRQ,
78+
};
79+
80+
if(pdp->mem_busy || pdp->netmem_fd.fd < 0 || !pdp->netmem_fd.ready)
81+
return;
82+
83+
if(readn(pdp->netmem_fd.fd, buf, 2))
84+
return;
85+
getu16(buf, &len);
86+
if(len > sizeof(buf)) {
87+
printf("netmem botch, closing\n");
88+
closefd(&pdp->netmem_fd);
89+
return;
90+
}
91+
92+
memset(buf, 0, sizeof(buf));
93+
readn(pdp->netmem_fd.fd, buf, len);
94+
95+
p = getaddr(&buf[1], &a);
96+
97+
switch(buf[0]) {
98+
case WRRQ:
99+
p = getword(p, &d);
100+
memory[a] = d;
101+
log("write %06o %012llo\n", a, d);
102+
len = 1;
103+
p = putu16(buf, len);
104+
*p++ = ACK;
105+
write(pdp->netmem_fd.fd, buf, len+2);
106+
break;
107+
108+
case RDRQ:
109+
d = memory[a];
110+
log("read %06o %012llo\n", a, d);
111+
len = 6;
112+
p = putu16(buf, len);
113+
*p++ = ACK;
114+
p = putword(p, d);
115+
write(pdp->netmem_fd.fd, buf, len+2);
116+
break;
117+
118+
case RDNRQ:
119+
p = getu16(p, &n);
120+
assert(n <= 512);
121+
122+
log("read N %d %06o\n", n, a);
123+
len = 1 + n*5;
124+
p = putu16(buf, len);
125+
*p++ = ACK;
126+
while(n--) {
127+
d = memory[a];
128+
// log("read %06o %012llo\n", a, d);
129+
p = putword(p, d);
130+
a = (a+1) & 0777777;
131+
}
132+
133+
write(pdp->netmem_fd.fd, buf, len+2);
134+
break;
135+
136+
case WRNRQ:
137+
p = getu16(p, &n);
138+
assert(n <= 512);
139+
140+
log("write N %d %06o\n", n, a);
141+
while(n--) {
142+
p = getword(p, &d);
143+
memory[a] = d;
144+
// log("write %06o %012llo\n", a, d);
145+
a = (a+1) & 0777777;
146+
}
147+
148+
len = 1;
149+
p = putu16(buf, len);
150+
*p++ = ACK;
151+
write(pdp->netmem_fd.fd, buf, len+2);
152+
break;
153+
154+
default:
155+
printf("unknown msg %d\n", buf[0]);
156+
}
157+
158+
waitfd(&pdp->netmem_fd);
159+
}

newemu/pdp6.c

+7
Original file line numberDiff line numberDiff line change
@@ -405,13 +405,15 @@ trace("WR\t\t%06o %06o %d <- %012llo\n", MA, pdp->rla, pdp->key_rim_sbr, MB);
405405
void
406406
rdwrrq(PDP6 *pdp, int ret)
407407
{
408+
pdp->mem_busy = 1;
408409
rdrq(pdp, ret);
409410
}
410411

411412
void
412413
wrrs(PDP6 *pdp, int ret)
413414
{
414415
wrrq(pdp, ret);
416+
pdp->mem_busy = 0;
415417
}
416418

417419

@@ -429,6 +431,9 @@ initdevs(PDP6 *pdp)
429431
numdevs = 0;
430432
installdev(pdp, &cpa_dev);
431433
installdev(pdp, &pi_dev);
434+
435+
pdp->netmem_fd.fd = -1;
436+
pdp->netmem_fd.id = -1;
432437
}
433438

434439
void
@@ -463,6 +468,8 @@ pwrclr(PDP6 *pdp)
463468
pdp->run = 0;
464469
mr_start(pdp);
465470
mr_clr(pdp);
471+
472+
pdp->mem_busy = 0;
466473
}
467474

468475
void

newemu/pdp6.h

+4
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ struct PDP6
164164
bool ex_ill_op;
165165
Hword pr, rlr, rla;
166166

167+
bool mem_busy;
167168
bool mc_rq, mc_rd, mc_wr;
168169

169170
bool cpa_iot_user;
@@ -230,6 +231,8 @@ struct PDP6
230231
u64 tto_timer;
231232

232233

234+
FD netmem_fd;
235+
233236
bool dotrace;
234237
u64 clk_timer;
235238

@@ -246,6 +249,7 @@ void pwrclr(PDP6 *pdp);
246249
void kt0(PDP6 *pdp);
247250
void cycle(PDP6 *pdp);
248251
void clr_run(PDP6 *pdp);
252+
void handlenetmem(PDP6 *pdp);
249253

250254
extern u64 simtime;
251255
extern u64 realtime;

0 commit comments

Comments
 (0)