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

emu: some work on PTR; other smaller changes

This commit is contained in:
aap 2019-03-16 09:36:09 +01:00
parent 9d6dffe6a0
commit 907f93d038
6 changed files with 135 additions and 12755 deletions

View File

@ -6,6 +6,8 @@
// Schematics have a bug in the divide subroutine
#define FIX_DS
int loginst;
enum Opcode {
FSC = 0132,
IBP = 0133,
@ -217,6 +219,7 @@ EXDEPREGS
#define X(name) if(strcmp(#name, reg) == 0) { apr->n.name = data; return 0; }
EXDEPSREGS
#undef X
if(strcmp("log", reg) == 0) { loginst = data; return 0; }
return 1;
}
@ -2811,11 +2814,13 @@ defpulse(et0)
defpulse(et0a)
{
if(loginst){
debug("%06o: ", apr->inst_ma);
if((apr->inst & 0700) != 0700)
debug("%s\n", mnemonics[apr->inst]);
else
debug("%s\n", iomnemonics[apr->io_inst>>5 & 7]);
}
if(PI_HOLD)
pih_fm_pi_ch_rq(apr); // 8-3, 8-4
@ -3459,6 +3464,13 @@ if(apr->run){
recalc_cpa_req(apr);
}
}
/*
if(!apr->run){
apr->cpa_clock_flag = 0;
recalc_cpa_req(apr);
}
*/
if(channbrecv(apr->rptchan, &foo) == 1){
if(KEY_MANUAL)
pulse(apr, &kt0a, 1);

View File

@ -818,10 +818,6 @@ 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;
}
@ -859,8 +855,6 @@ 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

@ -15,7 +15,7 @@ mkdev mem0 moby mem_0
#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 dx1 1
@ -33,13 +33,14 @@ connectmem mem0 0 apr 0
#connectmem cmem3 0 apr 3
mount tty /tmp/6tty
#mount ptr ../code/ptp.out
mount ptr ../code/ptp.out
#mount ptr ../code/sysgen.rim
#mount ptr ../test/test.pt
#mount ptr ../lars_sysgen/sysgen.pt
#mount ptp ../code/ptp.out
#mount dx1 ../test/out.dt6
#mount dx1 ../test/test.dt6
mount dx1 ../system.dtr
mount dx1 ../files/sys6.dtr
mount dx2 ../test/foo.dtr
#load -b ../maint/pdp6.part1

12666
emu/mem_0

File diff suppressed because it is too large Load Diff

192
emu/pt.c
View File

@ -3,7 +3,10 @@
#include <fcntl.h>
#include <unistd.h>
/* TODO? implement motor delays */
/* TODO:
* implement motor delays
* get rid of waitdatao and use a delay
*/
char *ptr_ident = PTR_IDENT;
char *ptp_ident = PTP_IDENT;
@ -44,43 +47,6 @@ ptpcycle(void *p)
}
}
static void
ptrcycle(void *p)
{
Ptr *ptr;
uchar c;
ptr = p;
if(!ptr->busy || !ptr->motor_on)
return;
printf("cyling\n");
// PTR CLR
ptr->sr = 0;
ptr->ptr = 0;
next:
if(ptr->fd >= 0 && hasinput(ptr->fd)){
if(read(ptr->fd, &c, 1) != 1)
c = 0;
}else
c = 0;
if(!ptr->b || c & 0200){
// PTR STROBE
ptr->sr <<= 1;
ptr->ptr <<= 6;
ptr->sr |= 1;
ptr->ptr |= c & 077;
if(!ptr->b)
ptr->ptr |= c & 0300;
}
if(!ptr->b || ptr->sr & 040){
printf("read %012lo\n", ptr->ptr);
ptr->busy = 0;
ptr->flag = 1;
}else
goto next;
recalc_ptr_req(ptr);
}
static void
wake_ptp(void *dev)
@ -130,53 +96,25 @@ wake_ptp(void *dev)
}
static void
wake_ptr(void *dev)
ptr_setbusy(Ptr *ptr, int busy)
{
Ptr *ptr;
IOBus *bus;
ptr = dev;
bus = ptr->bus;
if(IOB_RESET){
ptr->pia = 0;
ptr->busy = 0;
ptr->flag = 0;
ptr->b = 0;
if(ptr->busy == busy)
return;
ptr->busy = busy;
if(ptr->busy){
// PTR CLR
ptr->ptr = 0;
ptr->sr = 0;
}
}
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;
if(ptr->flag) bus->c12 |= F32;
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
ptr->busy = 1;
}
if(IOB_CONO_CLEAR){
ptr->pia = 0;
ptr->busy = 0;
ptr->flag = 0;
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;
ptr->pia |= bus->c12 & 7;
}
}
recalc_ptr_req(ptr);
static void
ptr_ic_clr(Ptr *ptr)
{
ptr->pia = 0;
ptr_setbusy(ptr, 0);
ptr->flag = 0;
ptr->b = 0;
}
void
@ -186,11 +124,97 @@ ptr_setmotor(Ptr *ptr, int m)
return;
ptr->motor_on = m;
if(ptr->motor_on)
ptr->busy = 0;
ptr_setbusy(ptr, 0);
ptr->flag = 1;
recalc_ptr_req(ptr);
}
static void
ptrcycle(void *p)
{
Ptr *ptr;
uchar c;
ptr = p;
// TODO: reader feed key
if(!(ptr->motor_on && ptr->busy))
return;
/* PTR LEAD */
if(!hasinput(ptr->fd))
return; /* no feed so no pulses */
read(ptr->fd, &c, 1);
if(!ptr->busy)
return;
/* skip invalid chars */
if(ptr->b && (c & 0200) == 0)
return;
/* PTR STROBE */
ptr->sr <<= 1;
ptr->ptr <<= 6;
ptr->sr |= 1;
if(ptr->b)
ptr->ptr |= c & 077;
else
ptr->ptr |= c;
/* TRAIL */
assert(ptr->busy);
if(!ptr->b || ptr->sr & 040){
ptr->flag = 1;
ptr_setbusy(ptr, 0);
}
recalc_ptr_req(ptr);
}
static void
wake_ptr(void *dev)
{
Ptr *ptr;
IOBus *bus;
ptr = dev;
bus = ptr->bus;
if(IOB_RESET)
ptr_ic_clr(ptr);
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;
if(ptr->flag) bus->c12 |= F32;
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
ptr_setbusy(ptr, 1);
}
if(IOB_CONO_CLEAR)
ptr_ic_clr(ptr);
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_setbusy(ptr, 1);
if(bus->c12 & F32) ptr->flag = 1;
ptr->pia |= bus->c12 & 7;
}
}
recalc_ptr_req(ptr);
}
static void
ptpunmount(Device *dev)
{
@ -285,6 +309,7 @@ makeptp(int argc, char *argv[])
ptp->dev.type = ptp_ident;
ptp->fd = -1;
// 63.3 chars per second, value around 60000?
t = (Task){ nil, ptpcycle, ptp, 1000, 0 };
addtask(t);
return &ptp->dev;
@ -303,6 +328,7 @@ makeptr(int argc, char *argv[])
ptr->dev.type = ptr_ident;
ptr->fd = -1;
// 400 chars per second, value around 10000?
t = (Task){ nil, ptrcycle, ptr, 1000, 0 };
addtask(t);
return &ptr->dev;

View File

@ -17,7 +17,7 @@ ttycycle(void *p)
{
Tty *tty;
int n;
char c;
uchar c;
tty = p;
if(tty->fd >= 0 && hasinput(tty->fd)){
@ -146,7 +146,10 @@ maketty(int argc, char *argv[])
tty->fd = -1;
t = (Task){ nil, ttycycle, tty, 1, 0 };
// 110 baud originally (10 chars per second)
t = (Task){ nil, ttycycle, tty, 300000, 0 };
// but maybe we don't want to be that accurate
// t = (Task){ nil, ttycycle, tty, 100, 0 };
addtask(t);
return &tty->dev;