1
0
mirror of https://github.com/aap/pdp6.git synced 2026-01-22 18:50:49 +00:00
aap.pdp6/emu/test_dc.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;
}