mirror of
https://github.com/aap/pdp6.git
synced 2026-01-11 23:53:31 +00:00
82 lines
1.4 KiB
C
82 lines
1.4 KiB
C
#include "fe.h"
|
|
#include <unistd.h>
|
|
|
|
int netmemfd = -1;
|
|
|
|
enum
|
|
{
|
|
WRRQ = 1,
|
|
RDRQ = 2,
|
|
ACK = 3,
|
|
ERR = 4,
|
|
};
|
|
|
|
void*
|
|
netmemthread(void *arg)
|
|
{
|
|
u16 len;
|
|
word a, d;
|
|
u8 buf[9];
|
|
|
|
while(readn(netmemfd, buf, 2) == 0){
|
|
len = buf[0]<<8 | buf[1];
|
|
if(len > 9){
|
|
fprintf(stderr, "netmem botch(%d), closing\n", len);
|
|
close(netmemfd);
|
|
netmemfd = -1;
|
|
return nil;
|
|
}
|
|
memset(buf, 0, sizeof(buf));
|
|
readn(netmemfd, buf, len);
|
|
|
|
a = buf[1] | buf[2]<<8 | buf[3]<<16;
|
|
d = buf[4] | buf[5]<<8 | buf[6]<<16 |
|
|
(word)buf[7]<<24 | (word)buf[8]<<32;
|
|
a &= 0777777;
|
|
d &= 0777777777777;
|
|
|
|
switch(buf[0]){
|
|
case WRRQ:
|
|
deposit(a, d);
|
|
printf("write %06lo %012lo\r\n", a, d);
|
|
fflush(stdout);
|
|
buf[0] = 0;
|
|
buf[1] = 1;
|
|
buf[2] = ACK;
|
|
writen(netmemfd, buf, buf[1]+2);
|
|
break;
|
|
case RDRQ:
|
|
d = examine(a);
|
|
printf("read %06lo %012lo\r\n", a, d);
|
|
fflush(stdout);
|
|
buf[0] = 0;
|
|
buf[1] = 6;
|
|
buf[2] = ACK;
|
|
buf[3] = d;
|
|
buf[4] = d>>8;
|
|
buf[5] = d>>16;
|
|
buf[6] = d>>24;
|
|
buf[7] = d>>32;
|
|
writen(netmemfd, buf, buf[1]+2);
|
|
break;
|
|
default:
|
|
fprintf(stderr, "unknown netmem message %d\n", buf[0]);
|
|
break;
|
|
}
|
|
}
|
|
fprintf(stderr, "netmem fd closed\n");
|
|
netmemfd = -1;
|
|
return nil;
|
|
}
|
|
|
|
void
|
|
initnetmem(const char *host, int port)
|
|
{
|
|
netmemfd = dial(host, port);
|
|
if(netmemfd >= 0){
|
|
printf("netmem connected\n");
|
|
threadcreate(netmemthread, nil);
|
|
}
|
|
}
|
|
|