1
0
mirror of https://github.com/aap/pdp6.git synced 2026-01-11 23:53:31 +00:00

emu: moved common code to emu.c

This commit is contained in:
aap 2019-02-28 11:50:27 +01:00
parent 800614fcc5
commit eab4f5b891
7 changed files with 160 additions and 287 deletions

View File

@ -1,4 +1,4 @@
SRC=util.c cmd.c apr.c mem.c tty.c pt.c dc.c dt.c netmem.c ../tools/pdp6common.c
SRC=emu.c util.c cmd.c apr.c mem.c tty.c pt.c dc.c dt.c netmem.c ../tools/pdp6common.c
H=pdp6.h ../tools/pdp6common.h
# clang
#CFLAGS= -Wno-shift-op-parentheses -Wno-logical-op-parentheses \
@ -9,8 +9,8 @@ SDLFLAGS=`sdl-config --cflags` `pkg-config SDL_image --cflags`
LIBS=`sdl-config --libs` `pkg-config SDL_image --libs` -lpthread
pdp6: main.c $(SRC) $(H)
$(CC) -o $@ $(CFLAGS) $(SDLFLAGS) main.c $(SRC) $(LIBS)
pdp6: main_panel.c $(SRC) $(H)
$(CC) -o $@ $(CFLAGS) $(SDLFLAGS) main_panel.c $(SRC) $(LIBS)
pdp6_s: main_serial.c $(SRC) $(H)
$(CC) -o $@ $(CFLAGS) $(SDLFLAGS) main_serial.c $(SRC) $(LIBS)

View File

@ -756,7 +756,8 @@ defpulse(pi_reset)
apr->pio = 0; // 8-3
}
defpulse(ar_flag_clr)
static void
ar_flag_clr(Apr *apr)
{
apr->ar_ov_flag = 0; // 6-10
apr->ar_cry0_flag = 0; // 6-10
@ -766,7 +767,8 @@ defpulse(ar_flag_clr)
recalc_cpa_req(apr);
}
defpulse(ar_flag_set)
static void
ar_flag_set(Apr *apr)
{
// 6-10
if(apr->c.mb & F0) apr->ar_ov_flag = 1;
@ -781,7 +783,8 @@ defpulse(ar_flag_set)
recalc_cpa_req(apr);
}
defpulse(mp_clr)
static void
mp_clr(Apr *apr)
{
// 6-19
apr->chf1 = 0;
@ -815,7 +818,8 @@ defpulse(mp_clr)
apr->nrf3 = 0;
}
defpulse(ds_clr)
static void
ds_clr(Apr *apr)
{
// 6-25, 6-26
apr->dsf1 = 0;
@ -852,8 +856,8 @@ defpulse(mr_clr)
apr->a_long = 0; // ?? nowhere to be found
apr->ar_com_cont = 0; // 6-9
mp_clr_p(apr); // 6-21
ds_clr_p(apr); // 6-26
mp_clr(apr); // 6-21
ds_clr(apr); // 6-26
apr->iot_go = 0; // 8-1
apr->iot_init_setup = 0;
@ -892,7 +896,8 @@ defpulse(ex_clr)
apr->rlr = 0; // 7-5
}
defpulse(ex_set)
static void
ex_set(Apr *apr)
{
apr->pr = apr->iobus.c12>>28 & 0377; // 7-4
apr->rlr = apr->iobus.c12>>10 & 0377; // 7-5
@ -919,7 +924,7 @@ defpulse(mr_start)
apr->pi_ov = 0; // 8-4
set_pi_cyc(apr, 0); // 8-4
pulse(apr, &pi_reset, 0); // 8-4
ar_flag_clr_p(apr); // 6-10
ar_flag_clr(apr); // 6-10
pulse(apr, &ex_clr, 0);
apr->ex_user = 0; // 5-13
@ -998,7 +1003,7 @@ wake_cpa(void *dev)
if(IOB_DATAO_CLEAR)
ex_clr_p(apr);
if(IOB_DATAO_SET)
ex_set_p(apr);
ex_set(apr);
}
static void
@ -2712,7 +2717,7 @@ defpulse(et1)
if(apr->ir_jrst && apr->ir & H12)
apr->ex_mode_sync = 1; // 5-13
if(apr->ir_jrst && apr->ir & H11)
ar_flag_set_p(apr); // 6-10
ar_flag_set(apr); // 6-10
if(PI_RST)
pih0_fm_pi_ok1(apr); // 8-4
@ -2760,7 +2765,7 @@ defpulse(et0)
apr->ar_cry1 = 0; // 6-10
ar_cry(apr);
if(apr->ir_jrst && apr->ir & H11)
ar_flag_clr_p(apr); // 6-10
ar_flag_clr(apr); // 6-10
if(CH_INC_OP)
pulse(apr, &cht1, 0); // 6-19
if(CH_N_INC_OP)

View File

@ -1,6 +1,8 @@
#define USED(x) ((void)x)
#define SET(x) ((x)=0)
extern char *argv0;
#define ARGBEGIN for((void)(argv0||(argv0=*argv)),argv++,argc--;\
argv[0] && argv[0][0]=='-' && argv[0][1];\
argc--, argv++) {\

137
emu/emu.c Normal file
View File

@ -0,0 +1,137 @@
#include "pdp6.h"
char *argv0;
FILE *debugfp;
int dotrace;
void
trace(char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
if(dotrace){
fprintf(debugfp, " ");
vfprintf(debugfp, fmt, ap);
}
va_end(ap);
}
void
debug(char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(debugfp, fmt, ap);
va_end(ap);
}
void
err(char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
fprintf(stderr, "error: ");
vfprintf(stderr, fmt, ap);
fprintf(stderr, "\n");
va_end(ap);
exit(1);
}
Thread *threads;
void
addthread(Thread th)
{
Thread *p;
p = malloc(sizeof(Thread));
*p = th;
p->next = threads;
threads = p;
}
void*
simthread(void *p)
{
Thread *th;
printf("[simthread] start\n");
for(;;)
for(th = threads; th; th = th->next){
th->cnt++;
if(th->cnt == th->freq){
th->cnt = 0;
th->f(th->arg);
}
}
err("can't happen");
return nil;
}
Device *devlist;
void
adddevice(Device *dev)
{
dev->next = devlist;
devlist = dev;
};
Device*
getdevice(const char *name)
{
Device *dev;
for(dev = devlist; dev; dev = dev->next)
if(strcmp(dev->name, name) == 0)
return dev;
return nil;
}
void
showdevices(void)
{
Device *dev;
for(dev = devlist; dev; dev = dev->next)
printf("%s %s\n", dev->name, dev->type);
}
void
dofile(const char *path)
{
FILE *f;
if(f = fopen(path, "r"), f == nil){
printf("Couldn't open file %s\n", path);
return;
}
cli(f);
fclose(f);
}
void
quit(int code)
{
int i;
Device *dev;
Membus *mbus;
/* Detach all files */
for(dev = devlist; dev; dev = dev->next)
if(dev->detach)
dev->detach(dev);
/* Sync memory to disk */
for(dev = devlist; dev; dev = dev->next){
if(strcmp(dev->type, apr_ident) != 0)
continue;
mbus = &((Apr*)dev)->membus;
for(i = 0; i < 16; i++)
if(mbus->cmem[i] && mbus->cmem[i]->sync)
mbus->cmem[i]->sync(mbus->cmem[i]);
}
// putchar('\n');
printf("\nquitting\n");
exit(code);
}

View File

@ -36,45 +36,6 @@ struct Element
int active;
};
char *argv0;
FILE *debugfp;
int dotrace;
void
trace(char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
if(dotrace){
fprintf(debugfp, " ");
vfprintf(debugfp, fmt, ap);
}
va_end(ap);
}
void
debug(char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(debugfp, fmt, ap);
va_end(ap);
}
void
err(char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
fprintf(stderr, "error: ");
vfprintf(stderr, fmt, ap);
fprintf(stderr, "\n");
va_end(ap);
printf("ERRRRR\n");
exit(1);
}
u32
getms(void)
{
@ -547,104 +508,6 @@ findlayout(int *w, int *h)
*h = oppanel.pos.y + oppanel.surf->h;
}
Thread *threads;
void
addthread(Thread th)
{
Thread *p;
p = malloc(sizeof(Thread));
*p = th;
p->next = threads;
threads = p;
}
void*
simthread(void *p)
{
Thread *th;
printf("[simthread] start\n");
for(;;)
for(th = threads; th; th = th->next){
th->cnt++;
if(th->cnt == th->freq){
th->cnt = 0;
th->f(th->arg);
}
}
err("can't happen");
return nil;
}
Device *devlist;
void
adddevice(Device *dev)
{
dev->next = devlist;
devlist = dev;
};
Device*
getdevice(const char *name)
{
Device *dev;
for(dev = devlist; dev; dev = dev->next)
if(strcmp(dev->name, name) == 0)
return dev;
return nil;
}
void
showdevices(void)
{
Device *dev;
for(dev = devlist; dev; dev = dev->next)
printf("%s %s\n", dev->name, dev->type);
}
void
dofile(const char *path)
{
FILE *f;
if(f = fopen(path, "r"), f == nil){
printf("Couldn't open file %s\n", path);
return;
}
cli(f);
fclose(f);
}
void
quit(int code)
{
int i;
Device *dev;
Membus *mbus;
/* Detach all files */
for(dev = devlist; dev; dev = dev->next)
if(dev->detach)
dev->detach(dev);
/* Sync memory to disk */
for(dev = devlist; dev; dev = dev->next){
if(strcmp(dev->type, apr_ident) != 0)
continue;
mbus = &((Apr*)dev)->membus;
for(i = 0; i < 16; i++)
if(mbus->cmem[i] && mbus->cmem[i]->sync)
mbus->cmem[i]->sync(mbus->cmem[i]);
}
putchar('\n');
exit(code);
}
void
usage(void)
{

View File

@ -3,44 +3,6 @@
#include <pthread.h>
#include "args.h"
char *argv0;
FILE *debugfp;
int dotrace;
void
trace(char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
if(dotrace){
fprintf(debugfp, " ");
vfprintf(debugfp, fmt, ap);
}
va_end(ap);
}
void
debug(char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfprintf(debugfp, fmt, ap);
va_end(ap);
}
void
err(char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
fprintf(stderr, "error: ");
vfprintf(stderr, fmt, ap);
fprintf(stderr, "\n");
va_end(ap);
exit(1);
}
// TODO: get rid of this
void updatepanel(Apr *apr) {}
@ -161,104 +123,6 @@ talkserial(int fd, Apr *apr, Ptr *ptr)
}
}
Thread *threads;
void
addthread(Thread th)
{
Thread *p;
p = malloc(sizeof(Thread));
*p = th;
p->next = threads;
threads = p;
}
void*
simthread(void *p)
{
Thread *th;
printf("[simthread] start\n");
for(;;)
for(th = threads; th; th = th->next){
th->cnt++;
if(th->cnt == th->freq){
th->cnt = 0;
th->f(th->arg);
}
}
err("can't happen");
return nil;
}
Device *devlist;
void
adddevice(Device *dev)
{
dev->next = devlist;
devlist = dev;
};
Device*
getdevice(const char *name)
{
Device *dev;
for(dev = devlist; dev; dev = dev->next)
if(strcmp(dev->name, name) == 0)
return dev;
return nil;
}
void
showdevices(void)
{
Device *dev;
for(dev = devlist; dev; dev = dev->next)
printf("%s %s\n", dev->name, dev->type);
}
void
dofile(const char *path)
{
FILE *f;
if(f = fopen(path, "r"), f == nil){
printf("Couldn't open file %s\n", path);
return;
}
cli(f);
fclose(f);
}
void
quit(int code)
{
int i;
Device *dev;
Membus *mbus;
/* Detach all files */
for(dev = devlist; dev; dev = dev->next)
if(dev->detach)
dev->detach(dev);
/* Sync memory to disk */
for(dev = devlist; dev; dev = dev->next){
if(strcmp(dev->type, apr_ident) != 0)
continue;
mbus = &((Apr*)dev)->membus;
for(i = 0; i < 16; i++)
if(mbus->cmem[i] && mbus->cmem[i]->sync)
mbus->cmem[i]->sync(mbus->cmem[i]);
}
// putchar('\n');
printf("\nquitting\n");
exit(code);
}
void
usage(void)
{

View File

@ -35,6 +35,8 @@ int dial(const char *host, int port);
void quit(int code);
void cli(FILE *f);
void *cmdthread(void *);
void *simthread(void *p);
void dofile(const char *path);
enum {
MAXPULSE = 20