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:
parent
800614fcc5
commit
eab4f5b891
@ -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)
|
||||
|
||||
|
||||
27
emu/apr.c
27
emu/apr.c
@ -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)
|
||||
|
||||
@ -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
137
emu/emu.c
Normal 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);
|
||||
}
|
||||
@ -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)
|
||||
{
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user