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

emu: fixed a couple of things; currently littered a bit with debug printfs

This commit is contained in:
aap 2019-03-14 00:16:10 +01:00
parent 21018f6056
commit 9d6dffe6a0
8 changed files with 11969 additions and 3719 deletions

View File

@ -3,8 +3,8 @@ H=pdp6.h ../tools/pdp6common.h threading.h
# clang
#CFLAGS= -Wno-shift-op-parentheses -Wno-logical-op-parentheses \
# -Wno-bitwise-op-parentheses
#CFLAGS= -O3 -Wall -Wno-parentheses -fno-diagnostics-show-caret
CFLAGS= -g -Wall -Wno-parentheses -fno-diagnostics-show-caret
CFLAGS= -O3 -Wall -Wno-parentheses -fno-diagnostics-show-caret
#CFLAGS= -g -Wall -Wno-parentheses -fno-diagnostics-show-caret
SDLFLAGS=`sdl2-config --cflags` `pkg-config SDL2_image --cflags`
LIBS=`sdl2-config --libs` `pkg-config SDL2_image --libs` -lpthread

View File

@ -3453,12 +3453,13 @@ aprcycle(void *p)
int foo;
if(channbrecv(apr->clkchan, &foo) == 1){
// printf("tick\n");
/* This isn't correct but how else can you single step? */
if(apr->run){
apr->cpa_clock_flag = 1;
recalc_cpa_req(apr);
}
}
if(channbrecv(apr->rptchan, &foo) == 1){
// printf("rpt\n");
if(KEY_MANUAL)
pulse(apr, &kt0a, 1);
}

100
emu/dt.c
View File

@ -50,6 +50,41 @@ dxmove(Dx555 *dx)
}
}
word
dxex(Device *dev, const char *reg)
{
Dx555 *dx;
dx = (Dx555*)dev;
if(strcmp(reg, "pos") == 0)
return dx->cur - dx->start;
else if(strcmp(reg, "size") == 0)
return dx->size;
return ~0;
}
int
dxdep(Device *dev, const char *reg, word data)
{
Dx555 *dx;
dx = (Dx555*)dev;
if(strcmp(reg, "pos") == 0){
if(data == 0) dx->cur = dx->start;
else if(data == 1) dx->cur = dx->end;
}else return 1;
return 0;
}
static void
resetdx(Dx555 *dx)
{
dx->size = DTSIZE;
dx->cur = dx->start;
dx->end = dx->start + dx->size;
memset(dx->start, 0, dx->size);
}
static void
dxunmount(Device *dev)
{
@ -63,7 +98,8 @@ dxunmount(Device *dev)
write(dx->fd, dx->start, dx->size);
close(dx->fd);
dx->fd = -1;
memset(dx->start, 0, dx->size);
resetdx(dx);
}
static void
@ -73,13 +109,18 @@ dxmount(Device *dev, const char *path)
dx = (Dx555*)dev;
dxunmount(dev);
memset(dx->start, 0, dx->size);
// TODO: resize
dx->fd = open(path, O_RDWR | O_CREAT, 0666);
if(dx->fd < 0)
fprintf(stderr, "couldn't open file %s\n", path);
else
read(dx->fd, dx->start, DTSIZE);
else{
/* Resize buffer to fit file */
dx->size = read(dx->fd, dx->start, dx->size);
/* Use full buffer if file isn't a valid tape */
if(dx->size < 6)
dx->size = DTSIZE;
dx->cur = dx->start;
dx->end = dx->start + dx->size;
}
}
/* Connect a transport to a control */
@ -95,7 +136,7 @@ static Device dxproto = {
nil, nil, "",
dxmount, dxunmount,
nil,
nil, nil
dxex, dxdep
};
Device*
@ -110,11 +151,8 @@ makedx(int argc, char *argv[])
dx->dev.type = dx_ident;
dx->fd = -1;
dx->size = DTSIZE;
dx->start = malloc(dx->size);
dx->cur = dx->start;
dx->end = dx->start + dx->size;
memset(dx->start, 0, dx->size);
dx->start = malloc(DTSIZE);
resetdx(dx);
return &dx->dev;
}
@ -263,6 +301,7 @@ recalc_dt_req(Dt551 *dt)
dt->time_flag && dt->time_enable ||
dt->ut_info_error ||
dt->ut_illegal_op)
printf("DT PI %o\n", dt->ut_pia),
req = dt->ut_pia;
else
req = 0;
@ -287,6 +326,19 @@ setstat(Dt551 *dt, int state)
dt->rw_state = state;
}
static void
dtsetgo(Dt551 *dt, int go)
{
printf("setting GO %d %d\n", dt->ut_go, go);
if(dt->ut_go != go){
if(go)
printf("DECtape started\n\n\n");
else
printf("DECtape stopped\n\n\n");
}
dt->ut_go = go;
}
static void
dt_tp0(Dt551 *dt)
{
@ -349,7 +401,7 @@ dt_tp2(Dt551 *dt)
prev = *dt;
if(END_ZONE){
dt->ut_go = 0;
dtsetgo(dt, 0);
dt->ut_tape_end_flag = 1;
/* TODO: is this right? */
setstat(dt, RW_NULL);
@ -540,8 +592,8 @@ debug("ILL op %d %d %d\n", nunits, dt->ut_btm_switch, UT_WRTM);
dt->ut_illegal_op = 1;
}
if(!UTE_UNIT_OK){
dt->ut_go = 0; // 3-3
return;
dtsetgo(dt, 0); // 3-3
goto ret;
}
if(UT_WRTM) // 3-14
@ -551,15 +603,15 @@ debug("ILL op %d %d %d\n", nunits, dt->ut_btm_switch, UT_WRTM);
}else
/* Don't move during delay.
* TODO: is this right? */
return;
goto ret;
}
// TODO: maybe do something else here?
if(dt->seldx == nil)
return;
goto ret;
if(!dt->ut_go)
return;
goto ret;
// sense; start writing
dt_tp0(dt);
@ -588,6 +640,9 @@ dtbuf |= dt->sense & 07;
debug(" %012lo %02o %d.%02o\n", dtbuf, dt->rwb, dt->uteck, dt->utek);
dxmove(dt->seldx);
ret:
recalc_dt_req(dt);
}
static void
@ -607,7 +662,7 @@ wake_dt(void *dev)
dt->ut_fcn = 0;
dt->ut_time = 0;
dt->ut_wren = 0;
dt->ut_go = 0;
dtsetgo(dt, 0);
dt->ut_rev = 0;
dt->ut_tape_end_flag = 0;
dt->ut_tape_end_enable = 0;
@ -678,7 +733,7 @@ dbg("UTC CONO CLEAR\n");
dt->ut_time = bus->c12>>9 & 03;
dt->time_enable = bus->c12>>11 & 1;
dt->ut_rev = bus->c12>>12 & 1;
dt->ut_go = bus->c12>>13 & 1;
dtsetgo(dt, bus->c12>>13 & 1);
dt->ut_jb_done_enable = bus->c12>>14 & 1;
dt->ut_tape_end_enable = bus->c12>>15 & 1;
dt->ut_units_select = bus->c12>>16 & 1;
@ -762,6 +817,11 @@ dtex(Device *dev, const char *reg)
dt = (Dt551*)dev;
if(strcmp(reg, "btm_wr") == 0) return dt->ut_btm_switch;
else if(strcmp(reg, "go") == 0) return dt->ut_go;
else if(dt->seldx && strcmp(reg, "pos") == 0)
return dt->seldx->cur - dt->seldx->start;
else if(dt->seldx && strcmp(reg, "size") == 0)
return dt->seldx->size;
return ~0;
}
@ -799,6 +859,8 @@ makedt(int argc, char *argv[])
// should have 30000 cycles per second, so one every 33μs
// APR at 1 has an approximate cycle time of 200-300ns
t = (Task){ nil, dtcycle, dt, 150, 0 };
// ...so slow though
// t = (Task){ nil, dtcycle, dt, 80, 0 };
addtask(t);
return &dt->dev;

View File

@ -5,19 +5,21 @@ mkdev ptr ptr760
mkdev ptp ptp761
mkdev dc dc136
mkdev dt0 dt551
mkdev dx0 dx555
mkdev dx1 dx555
mkdev dx2 dx555
mkdev fmem fmem162 0
mkdev mem0 moby
mkdev mem0 moby mem_0
#mkdev cmem0 cmem161C mem_0
#mkdev cmem1 cmem161C mem_1
#mkdev cmem2 cmem161C mem_2
#mkdev cmem3 cmem161C mem_3
#mkdev netmem netmem its.pdp10.se 10006
#mkdev netmem netmem localhost 10006
#mkdev netmem netmem maya.papnet.eu 10006
mkdev netmem netmem maya.papnet.eu 10006
connectdev dc dt0
connectdev dt0 dx0 1
connectdev dt0 dx1 1
connectdev dt0 dx2 2
connectio tty apr
connectio ptr apr
connectio ptp apr
@ -30,14 +32,14 @@ connectmem mem0 0 apr 0
#connectmem cmem2 0 apr 2
#connectmem cmem3 0 apr 3
##mount tty /tmp/6tty
##mount ptr ../code/test.rim
mount tty /tmp/6tty
#mount ptr ../code/ptp.out
#mount ptr ../code/sysgen.rim
#mount ptr ../lars_sysgen/sysgen.pt
##mount ptp ../code/ptp.out
#mount dx0 ../test/out.dt6
#mount dx0 ../test/test.dt6
##mount dx0 ../test/foo.dtr
#mount ptp ../code/ptp.out
#mount dx1 ../test/out.dt6
#mount dx1 ../test/test.dt6
mount dx1 ../system.dtr
mount dx2 ../test/foo.dtr
#load -b ../maint/pdp6.part1

View File

@ -47,8 +47,8 @@ struct Element
typedef struct SwDigit SwDigit;
struct SwDigit
{
Element *lp; // lamp
Element *sw; // switch
Element *sw; // these 3 switch
Element *first; // the first one
SwDigit *prev;
SwDigit *next;
};
@ -571,19 +571,33 @@ setdigit(int n)
setcurdigit(curdigit->next);
}
static void
setdigitfromlamp(void)
{
curdigit->sw[0].state = curdigit->lp[0].state;
curdigit->sw[1].state = curdigit->lp[1].state;
curdigit->sw[2].state = curdigit->lp[2].state;
setcurdigit(curdigit->next);
}
/* This is in some ways horrible, but oh well */
static void
keydown(SDL_Keysym keysym)
{
int i;
static Element *dsrc, *asrc, **srcp;
static int dlen, alen, *lenp;
word mask, s, d;
int ctrl, len;
const u8 *keystate;
if(dsrc == nil){
dsrc = mi_l;
dlen = 36;
}
if(asrc == nil){
asrc = ma_l;
alen = 18;
}
if(srcp == nil){
srcp = &dsrc;
lenp = &dlen;
}
keystate = SDL_GetKeyboardState(nil);
ctrl = keystate[SDL_SCANCODE_CAPSLOCK] ||
keystate[SDL_SCANCODE_LCTRL] || keystate[SDL_SCANCODE_RCTRL];
switch(keysym.scancode){
case SDL_SCANCODE_0: setdigit(0); break;
@ -594,19 +608,78 @@ keydown(SDL_Keysym keysym)
case SDL_SCANCODE_5: setdigit(5); break;
case SDL_SCANCODE_6: setdigit(6); break;
case SDL_SCANCODE_7: setdigit(7); break;
case SDL_SCANCODE_A: setcurdigit(addr_digits); break;
case SDL_SCANCODE_D: setcurdigit(data_digits); break;
case SDL_SCANCODE_LEFT: setcurdigit(curdigit->prev); break;
case SDL_SCANCODE_RIGHT: setcurdigit(curdigit->next); break;
/* Set destination switches */
case SDL_SCANCODE_A:
setcurdigit(addr_digits);
srcp = &asrc;
lenp = &alen;
break;
case SDL_SCANCODE_S:
setcurdigit(data_digits);
srcp = &dsrc;
lenp = &dlen;
break;
/* Set source lights */
case SDL_SCANCODE_M:
*srcp = ma_l;
*lenp = 18;
break;
case SDL_SCANCODE_P:
*srcp = pc_l;
*lenp = 18;
break;
case SDL_SCANCODE_I:
*srcp = ir_l;
*lenp = 18;
break;
case SDL_SCANCODE_D:
*srcp = mi_l;
*lenp = 36;
break;
/* Set MA from IR AC */
case SDL_SCANCODE_R:
d = getelements(ir_l, 18);
d = d>>5 & 017;
setelements(d, ma_sw, 18);
break;
/* Set MA from IR index */
case SDL_SCANCODE_X:
d = getelements(ir_l, 18);
d &= 017;
setelements(d, ma_sw, 18);
break;
/* Clear */
case SDL_SCANCODE_C:
/* clear */
for(i = 0; i < 12; i++)
setdigit(0);
break;
case SDL_SCANCODE_J:
mask = LT;
goto load;
case SDL_SCANCODE_K:
mask = FW;
goto load;
case SDL_SCANCODE_L:
/* load */
for(i = 0; i < 12; i++)
setdigitfromlamp();
mask = RT;
goto load;
load:
if(curdigit->first == data_sw)
len = 36;
else
len = 18;
d = getelements(curdigit->first, len);
s = getelements(*srcp, *lenp);
if(ctrl) s = (s&RT)<<18 | (s&LT)>>18;
d = s&mask | d&~mask;
setelements(d, curdigit->first, len);
break;
default: break;
}
@ -797,13 +870,13 @@ threadmain(int argc, char *argv[])
SDL_SetWindowSize(window, w, h);
for(i = 0; i < 12; i++){
data_digits[i].lp = &mi_l[i*3];
data_digits[i].first = data_sw;
data_digits[i].sw = &data_sw[i*3];
data_digits[i].prev = &data_digits[(i+11) % 12];
data_digits[i].next = &data_digits[(i+1) % 12];
}
for(i = 0; i < 6; i++){
addr_digits[i].lp = &ma_l[i*3];
addr_digits[i].first = ma_sw;
addr_digits[i].sw = &ma_sw[i*3];
addr_digits[i].prev = &addr_digits[(i+5) % 6];
addr_digits[i].next = &addr_digits[(i+1) % 6];

15435
emu/mem_0

File diff suppressed because it is too large Load Diff

View File

@ -53,6 +53,7 @@ ptrcycle(void *p)
ptr = p;
if(!ptr->busy || !ptr->motor_on)
return;
printf("cyling\n");
// PTR CLR
ptr->sr = 0;
@ -73,6 +74,7 @@ next:
ptr->ptr |= c & 0300;
}
if(!ptr->b || ptr->sr & 040){
printf("read %012lo\n", ptr->ptr);
ptr->busy = 0;
ptr->flag = 1;
}else
@ -144,6 +146,7 @@ wake_ptr(void *dev)
if(bus->devcode == PTR){
if(IOB_STATUS){
printf("PTR STATUS\n");
if(ptr->motor_on) bus->c12 |= F27;
if(ptr->b) bus->c12 |= F30;
if(ptr->busy) bus->c12 |= F31;
@ -151,6 +154,7 @@ wake_ptr(void *dev)
bus->c12 |= ptr->pia & 7;
}
if(IOB_DATAI){
printf("PTR DATAI\n");
bus->c12 |= ptr->ptr;
ptr->flag = 0;
// actually when DATAI is negated again
@ -163,6 +167,9 @@ wake_ptr(void *dev)
ptr->b = 0;
}
if(IOB_CONO_SET){
printf("PTR CONO %012lo\n", bus->c12);
/* TODO: schematics don't have this, but code uses it */
if(bus->c12 & F27) ptr_setmotor(ptr, 1);
if(bus->c12 & F30) ptr->b = 1;
if(bus->c12 & F31) ptr->busy = 1;
if(bus->c12 & F32) ptr->flag = 1;

View File

@ -20,6 +20,8 @@ hasinput(int fd)
fd_set fds;
struct timeval timeout;
if(fd < 0) return 0;
timeout.tv_sec = 0;
timeout.tv_usec = 0;
FD_ZERO(&fds);