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:
parent
21018f6056
commit
9d6dffe6a0
@ -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
|
||||
|
||||
@ -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
100
emu/dt.c
@ -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;
|
||||
|
||||
24
emu/init.ini
24
emu/init.ini
@ -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
|
||||
|
||||
|
||||
111
emu/main_panel.c
111
emu/main_panel.c
@ -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<)>>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];
|
||||
|
||||
7
emu/pt.c
7
emu/pt.c
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user