mirror of
https://github.com/aap/pdp6.git
synced 2026-01-22 18:50:49 +00:00
235 lines
4.0 KiB
C
235 lines
4.0 KiB
C
#include "pdp6.h"
|
|
|
|
Dc136 *dc;
|
|
IOBus iobus;
|
|
IOBus *bus = &iobus;
|
|
int pireq;
|
|
|
|
void
|
|
setreq(IOBus *bus, int dev, u8 pia)
|
|
{
|
|
pireq = pia;
|
|
}
|
|
|
|
void
|
|
wakedev(IOBus *bus, int d)
|
|
{
|
|
Busdev *dev;
|
|
bus->devcode = d;
|
|
dev = &bus->dev[d];
|
|
if(dev->wake)
|
|
dev->wake(dev->dev);
|
|
}
|
|
|
|
void
|
|
bus_reset(IOBus *bus)
|
|
{
|
|
int d;
|
|
bus->c34 |= IOBUS_IOB_RESET;
|
|
for(d = 0; d < 128; d++)
|
|
wakedev(bus, d);
|
|
bus->c34 &= ~IOBUS_IOB_RESET;
|
|
}
|
|
|
|
void
|
|
cono(IOBus *bus, int d, hword w)
|
|
{
|
|
bus->c34 |= IOBUS_CONO_CLEAR;
|
|
wakedev(bus, d);
|
|
bus->c34 &= ~IOBUS_CONO_CLEAR;
|
|
|
|
bus->c34 |= IOBUS_CONO_SET;
|
|
bus->c12 = w;
|
|
wakedev(bus, d);
|
|
bus->c34 &= ~IOBUS_CONO_SET;
|
|
bus->c12 = 0;
|
|
}
|
|
|
|
void
|
|
datao(IOBus *bus, int d, word w)
|
|
{
|
|
bus->c34 |= IOBUS_DATAO_CLEAR;
|
|
wakedev(bus, d);
|
|
bus->c34 &= ~IOBUS_DATAO_CLEAR;
|
|
|
|
bus->c34 |= IOBUS_DATAO_SET;
|
|
bus->c12 = w;
|
|
wakedev(bus, d);
|
|
bus->c34 &= ~IOBUS_DATAO_SET;
|
|
bus->c12 = 0;
|
|
}
|
|
|
|
word
|
|
coni(IOBus *bus, int d)
|
|
{
|
|
word w;
|
|
bus->c34 |= IOBUS_IOB_STATUS;
|
|
wakedev(bus, d);
|
|
bus->c34 &= ~IOBUS_IOB_STATUS;
|
|
w = bus->c12;
|
|
bus->c12 = 0;
|
|
return w;
|
|
}
|
|
|
|
word
|
|
datai(IOBus *bus, int d)
|
|
{
|
|
word w;
|
|
bus->c34 |= IOBUS_IOB_DATAI;
|
|
wakedev(bus, d);
|
|
bus->c34 &= ~IOBUS_IOB_DATAI;
|
|
w = bus->c12;
|
|
bus->c12 = 0;
|
|
return w;
|
|
}
|
|
|
|
void
|
|
printdc(Dc136 *dc)
|
|
{
|
|
printf("DB/%012lo DA/%012lo CCT/%o SCT/%o CHMOD/%o\n",
|
|
dc->db, dc->da, dc->cct, dc->sct, dc->ch_mode);
|
|
printf(" CLBD/%o DBDAMOVE/%o DARQ/%o DBRQ/%o INOUT/%o DEV/%o PIA/%o\n",
|
|
dc->data_clbd, dc->dbda_move, dc->da_rq, dc->db_rq,
|
|
dc->inout, dc->device, dc->pia);
|
|
}
|
|
|
|
enum {
|
|
CLBD = 010000,
|
|
|
|
DBDAMOVE = 04000,
|
|
DARQ = 02000,
|
|
DBRQ = 01000,
|
|
|
|
IN = 0000,
|
|
OUT = 0400,
|
|
|
|
CHMOD_6 = 0000,
|
|
CHMOD_36 = 0100,
|
|
CHMOD_12 = 0200,
|
|
CHMOD_18 = 0300,
|
|
|
|
DEV1 = 010,
|
|
DEV2 = 020,
|
|
DEV3 = 030,
|
|
DEV4 = 040,
|
|
DEV5 = 050,
|
|
DEV6 = 060,
|
|
};
|
|
|
|
/*
|
|
* output:
|
|
* DARQ: DA empty, need new data
|
|
* DBRQ: DB empty, need new data
|
|
* DBDA MOVE: DB waiting to send data to DA
|
|
* input:
|
|
* DARQ: DA full, need to empty
|
|
* DBRQ: DB full, need to empty
|
|
* DBDA MOVE: DB waiting to get data from DA
|
|
*/
|
|
|
|
int
|
|
main()
|
|
{
|
|
dc = (Dc136*)makedc(0, nil);
|
|
dc->dev.ioconnect((Device*)dc, bus);
|
|
|
|
bus_reset(bus);
|
|
assert(coni(bus, DC) == 0);
|
|
|
|
// output test
|
|
cono(bus, DC, DARQ|DBRQ|OUT|CHMOD_6|DEV1|7); // 3417
|
|
assert(pireq == 7);
|
|
printdc(dc);
|
|
datao(bus, DC, 0123456000001);
|
|
assert(pireq == 7);
|
|
printdc(dc);
|
|
datao(bus, DC, 0123456000002);
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
assert(dctk(dc, 1, 0) == 012);
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
assert(dctk(dc, 1, 0) == 034);
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
assert(dctk(dc, 1, 0) == 056);
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
assert(dctk(dc, 1, 0) == 000);
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
assert(dctk(dc, 1, 0) == 000);
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
assert(dctk(dc, 1, 0) == 001);
|
|
assert(pireq == 7);
|
|
printdc(dc);
|
|
|
|
printf("\n\n");
|
|
|
|
cono(bus, DC, DARQ|DBRQ|OUT|CHMOD_12|DEV5|7); // 3657
|
|
assert(pireq == 7);
|
|
printdc(dc);
|
|
datao(bus, DC, 0123456112233);
|
|
assert(pireq == 7);
|
|
printdc(dc);
|
|
datao(bus, DC, 0123456445566);
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
assert((dctk(dc, 5, 0)&0777700000000) == 0123400000000);
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
assert((dctk(dc, 5, 0)&0777700000000) == 0561100000000);
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
assert((dctk(dc, 5, 0)&0777700000000) == 0223300000000);
|
|
assert(pireq == 7);
|
|
printdc(dc);
|
|
|
|
printf("\n\n");
|
|
|
|
// input test
|
|
cono(bus, DC, DBDAMOVE|IN|CHMOD_6|DEV1|7); // 4017
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
dcgv(dc, 1, 012, 0);
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
dcgv(dc, 1, 034, 0);
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
dcgv(dc, 1, 056, 0);
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
dcgv(dc, 1, 011, 0);
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
dcgv(dc, 1, 022, 0);
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
dcgv(dc, 1, 033, 0);
|
|
assert(pireq == 7);
|
|
printdc(dc);
|
|
assert(datai(bus, DC) == 0123456112233);
|
|
printdc(dc);
|
|
|
|
|
|
printf("\n\n");
|
|
|
|
|
|
cono(bus, DC, DBDAMOVE|IN|CHMOD_12|DEV5|7); // 4017
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
dcgv(dc, 5, 01234, 0);
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
dcgv(dc, 5, 05611, 0);
|
|
assert(pireq == 0);
|
|
printdc(dc);
|
|
dcgv(dc, 5, 02233, 0);
|
|
assert(pireq == 7);
|
|
printdc(dc);
|
|
|
|
return 0;
|
|
}
|