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:
parent
9d6dffe6a0
commit
907f93d038
12
emu/apr.c
12
emu/apr.c
@ -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);
|
||||
|
||||
6
emu/dt.c
6
emu/dt.c
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
192
emu/pt.c
192
emu/pt.c
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user