diff --git a/panel/Makefile b/panel/Makefile new file mode 100644 index 0000000..e79c5ae --- /dev/null +++ b/panel/Makefile @@ -0,0 +1,13 @@ +SRC=panel6.c +# clang +#CFLAGS= -Wno-shift-op-parentheses -Wno-logical-op-parentheses \ +# -Wno-bitwise-op-parentheses +CFLAGS= -g -fno-diagnostics-show-caret \ + `sdl-config --cflags` `pkg-config SDL_image --cflags` + +LIBS= `sdl-config --libs` `pkg-config SDL_image --libs` -lpthread + + +panel6: $(SRC) + $(CC) $(CFLAGS) $(SRC) $(LIBS) -o panel6 + diff --git a/panel/coreread.c b/panel/coreread.c new file mode 100644 index 0000000..3709e5c --- /dev/null +++ b/panel/coreread.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include +#include +#include +#include + +typedef uint64_t word; +typedef unsigned char uchar; + +void +err(char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "error: "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); + exit(1); +} + +uchar* +puthalfword(uchar *p, word w) +{ + p[2] = w & 077; + p[1] = (w >> 6) & 077; + p[0] = (w >> 12) & 077; + return p+3; +} + +int +main() +{ + int i; + uchar msg[3+8*6], *p; + int fd; + if(fd = open("/dev/i2c-1", O_RDWR), fd < 0) + err("couldn't open file"); + if(ioctl(fd, I2C_SLAVE, 0x21) < 0) + err("couldn't select device"); + + puthalfword(msg, 0000000); + write(fd, msg, 3); + + read(fd, msg, 48+2); + + for(i = 0; i < 48; i++) + printf("%03o ", msg[i+2]); + printf("\n"); + + close(fd); + + return 0; +} diff --git a/panel/corewrite.c b/panel/corewrite.c new file mode 100644 index 0000000..51665ba --- /dev/null +++ b/panel/corewrite.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include +#include +#include + +typedef uint64_t word; +typedef unsigned char uchar; + +void +err(char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "error: "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); + exit(1); +} + +uchar* +puthalfword(uchar *p, word w) +{ + p[2] = w & 077; + p[1] = (w >> 6) & 077; + p[0] = (w >> 12) & 077; + return p+3; +} + +uchar* +putword(uchar *p, word w) +{ + p[5] = w & 077; + p[4] = (w >> 6) & 077; + p[3] = (w >> 12) & 077; + p[2] = (w >> 18) & 077; + p[1] = (w >> 24) & 077; + p[0] = (w >> 30) & 077; + return p+6; +} + +int +main() +{ + int i; + uchar msg[3+8*6], *p; + int fd; + if(fd = open("/dev/i2c-1", O_RDWR), fd < 0) + err("couldn't open file"); + if(ioctl(fd, I2C_SLAVE, 0x21) < 0) + err("couldn't select device"); + + p = msg; + p = puthalfword(p, 0000000); + p = putword(p, 0111222333444); + p = putword(p, 0111111111111); + p = putword(p, 0222222222222); + p = putword(p, 0333333333333); + p = putword(p, 0444444444444); + p = putword(p, 0555555555555); + p = putword(p, 0666666666666); + p = putword(p, 0777777777777); +printf("%d\n", p-msg); + write(fd, msg, p-msg); + + for(i = 0; i < p-msg; i++) + printf("%03o ", msg[i]); + printf("\n"); + + close(fd); + + return 0; +} diff --git a/panel/elements.inc b/panel/elements.inc new file mode 100644 index 0000000..62b3f76 --- /dev/null +++ b/panel/elements.inc @@ -0,0 +1,667 @@ +Element keys[] = { + /* keys */ + { keysurf, &opgrid2, { 0, 2 }, 0, 0 }, + { keysurf, &opgrid2, { 2.75, 2 }, 0, 0 }, + { keysurf, &opgrid2, { 5.5, 2 }, 0, 0 }, + { keysurf, &opgrid2, { 8.25, 2 }, 0, 0 }, + { keysurf, &opgrid2, { 11, 2 }, 0, 0 }, + { keysurf, &opgrid2, { 13.75, 2 }, 0, 0 }, + { keysurf, &opgrid2, { 16.5, 2 }, 0, 0 }, + { keysurf, &opgrid2, { 19.25, 2 }, 0, 0 }, +}; + +Element switches[] = { + /* data switches */ + { switchsurf, &opgrid1, { 5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 6, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 7, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 8, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 9, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 10, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 11, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 12, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 13, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 14, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 15, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 16, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 17, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 18, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 19, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 20, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 21, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 22, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 23, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 24, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 25, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 26, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 27, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 28, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 29, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 30, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 31, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 32, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 33, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 34, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 35, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 36, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 37, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 38, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 39, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 40, 5 }, 0, 0 }, + + /* address switches */ + { switchsurf, &opgrid1, { 44.5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 45.5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 46.5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 47.5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 48.5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 49.5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 50.5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 51.5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 52.5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 53.5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 54.5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 55.5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 56.5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 57.5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 58.5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 59.5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 60.5, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 61.5, 5 }, 0, 0 }, + + /* repeat, addr stop, power, disable mem */ + { switchsurf, &opgrid1, { 78, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 78, 7 }, 0, 0 }, + { switchsurf, &opgrid1, { 83, 5 }, 0, 0 }, + { switchsurf, &opgrid1, { 83, 7 }, 0, 0 }, + + /* maint. switches */ + { switchsurf, &extragrid, { 2, 10 }, 0, 0 }, + { switchsurf, &extragrid, { 2, 9 }, 0, 0 }, + { switchsurf, &extragrid, { 2, 8 }, 0, 0 }, + { switchsurf, &extragrid, { 2, 7 }, 0, 0 }, + { switchsurf, &extragrid, { 2, 6 }, 0, 0 }, +}; + +Element lamps[] = { + /* memory indicator */ + { lampsurf, &opgrid1, { 5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 6, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 7, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 8, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 9, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 10, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 11, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 12, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 13, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 14, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 15, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 16, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 17, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 18, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 19, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 20, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 21, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 22, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 23, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 24, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 25, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 26, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 27, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 28, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 29, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 30, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 31, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 32, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 33, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 34, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 35, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 36, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 37, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 38, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 39, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 40, 7 }, 0, 0 }, + + /* IR */ + { lampsurf, &opgrid1, { 5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 6, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 7, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 8, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 9, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 10, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 11, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 12, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 13, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 14, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 15, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 16, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 17, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 18, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 19, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 20, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 21, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 22, 9 }, 0, 0 }, + + /* address indicator */ + { lampsurf, &opgrid1, { 44.5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 45.5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 46.5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 47.5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 48.5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 49.5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 50.5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 51.5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 52.5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 53.5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 54.5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 55.5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 56.5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 57.5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 58.5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 59.5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 60.5, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 61.5, 7 }, 0, 0 }, + + /* PC */ + { lampsurf, &opgrid1, { 44.5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 45.5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 46.5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 47.5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 48.5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 49.5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 50.5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 51.5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 52.5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 53.5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 54.5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 55.5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 56.5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 57.5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 58.5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 59.5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 60.5, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 61.5, 9 }, 0, 0 }, + + /* pi active */ + { lampsurf, &opgrid1, { 68, 5 }, 0, 0 }, + { lampsurf, &opgrid1, { 69, 5 }, 0, 0 }, + { lampsurf, &opgrid1, { 70, 5 }, 0, 0 }, + { lampsurf, &opgrid1, { 71, 5 }, 0, 0 }, + { lampsurf, &opgrid1, { 72, 5 }, 0, 0 }, + { lampsurf, &opgrid1, { 73, 5 }, 0, 0 }, + { lampsurf, &opgrid1, { 74, 5 }, 0, 0 }, + + /* pi request */ + { lampsurf, &opgrid1, { 68, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 69, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 70, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 71, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 72, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 73, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 74, 7 }, 0, 0 }, + + /* pi in progress */ + { lampsurf, &opgrid1, { 68, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 69, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 70, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 71, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 72, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 73, 9 }, 0, 0 }, + { lampsurf, &opgrid1, { 74, 9 }, 0, 0 }, + + /* run, mem stop, pi on */ + { lampsurf, &opgrid1, { 66, 5 }, 0, 0 }, + { lampsurf, &opgrid1, { 66, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 66, 9 }, 0, 0 }, + + /* repeat, addr stop, power, disable mem */ + { lampsurf, &opgrid1, { 79, 5 }, 0, 0 }, + { lampsurf, &opgrid1, { 79, 7 }, 0, 0 }, + { lampsurf, &opgrid1, { 84, 5 }, 0, 0 }, + { lampsurf, &opgrid1, { 84, 7 }, 0, 0 }, + + /* Flip flops */ + + /* MB */ + { lampsurf, &indgrid2, { 4, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 5, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 6, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 7, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 8, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 9, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 10, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 11, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 12, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 13, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 14, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 15, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 16, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 17, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 18, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 19, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 20, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 21, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 22, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 23, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 24, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 25, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 26, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 27, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 28, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 29, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 30, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 31, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 32, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 33, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 34, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 35, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 36, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 37, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 38, 8 }, 0, 0 }, + { lampsurf, &indgrid2, { 39, 8 }, 0, 0 }, + + /* AR */ + { lampsurf, &indgrid2, { 4, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 5, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 6, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 7, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 8, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 9, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 10, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 11, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 12, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 13, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 14, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 15, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 16, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 17, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 18, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 19, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 20, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 21, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 22, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 23, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 24, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 25, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 26, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 27, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 28, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 29, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 30, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 31, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 32, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 33, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 34, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 35, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 36, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 37, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 38, 6 }, 0, 0 }, + { lampsurf, &indgrid2, { 39, 6 }, 0, 0 }, + + /* MQ */ + { lampsurf, &indgrid2, { 4, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 5, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 6, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 7, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 8, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 9, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 10, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 11, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 12, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 13, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 14, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 15, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 16, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 17, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 18, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 19, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 20, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 21, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 22, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 23, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 24, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 25, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 26, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 27, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 28, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 29, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 30, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 31, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 32, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 33, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 34, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 35, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 36, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 37, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 38, 4 }, 0, 0 }, + { lampsurf, &indgrid2, { 39, 4 }, 0, 0 }, + + /* Flip flops */ + /* column 1 */ + { lampsurf, &indgrid1, { 1, 10 }, 0, 0 }, + { lampsurf, &indgrid1, { 1, 9 }, 0, 0 }, + { lampsurf, &indgrid1, { 1, 8 }, 0, 0 }, + { lampsurf, &indgrid1, { 1, 7 }, 0, 0 }, + { lampsurf, &indgrid1, { 1, 6 }, 0, 0 }, + { lampsurf, &indgrid1, { 1, 5 }, 0, 0 }, + { lampsurf, &indgrid1, { 1, 4 }, 0, 0 }, + { lampsurf, &indgrid1, { 1, 3 }, 0, 0 }, + /* column 2 */ + { lampsurf, &indgrid1, { 2, 10 }, 0, 0 }, + { lampsurf, &indgrid1, { 2, 9 }, 0, 0 }, + { lampsurf, &indgrid1, { 2, 8 }, 0, 0 }, + { lampsurf, &indgrid1, { 2, 7 }, 0, 0 }, + { lampsurf, &indgrid1, { 2, 6 }, 0, 0 }, + { lampsurf, &indgrid1, { 2, 5 }, 0, 0 }, + { lampsurf, &indgrid1, { 2, 4 }, 0, 0 }, + { lampsurf, &indgrid1, { 2, 3 }, 0, 0 }, + /* column 3 */ + { lampsurf, &indgrid1, { 3, 10 }, 0, 0 }, + { lampsurf, &indgrid1, { 3, 9 }, 0, 0 }, + { lampsurf, &indgrid1, { 3, 8 }, 0, 0 }, + { lampsurf, &indgrid1, { 3, 7 }, 0, 0 }, + { lampsurf, &indgrid1, { 3, 6 }, 0, 0 }, + { lampsurf, &indgrid1, { 3, 5 }, 0, 0 }, + { lampsurf, &indgrid1, { 3, 4 }, 0, 0 }, + { lampsurf, &indgrid1, { 3, 3 }, 0, 0 }, + /* column 4 */ + { lampsurf, &indgrid1, { 4, 10 }, 0, 0 }, + { lampsurf, &indgrid1, { 4, 9 }, 0, 0 }, + { lampsurf, &indgrid1, { 4, 8 }, 0, 0 }, + { lampsurf, &indgrid1, { 4, 7 }, 0, 0 }, + { lampsurf, &indgrid1, { 4, 6 }, 0, 0 }, + { lampsurf, &indgrid1, { 4, 5 }, 0, 0 }, + { lampsurf, &indgrid1, { 4, 4 }, 0, 0 }, + { lampsurf, &indgrid1, { 4, 3 }, 0, 0 }, + /* column 5 */ + { lampsurf, &indgrid1, { 5, 10 }, 0, 0 }, + { lampsurf, &indgrid1, { 5, 9 }, 0, 0 }, + { lampsurf, &indgrid1, { 5, 8 }, 0, 0 }, + { lampsurf, &indgrid1, { 5, 7 }, 0, 0 }, + { lampsurf, &indgrid1, { 5, 6 }, 0, 0 }, + { lampsurf, &indgrid1, { 5, 5 }, 0, 0 }, + { lampsurf, &indgrid1, { 5, 4 }, 0, 0 }, + { lampsurf, &indgrid1, { 5, 3 }, 0, 0 }, + /* column 6 */ + { lampsurf, &indgrid1, { 6, 10 }, 0, 0 }, + { lampsurf, &indgrid1, { 6, 9 }, 0, 0 }, + { lampsurf, &indgrid1, { 6, 8 }, 0, 0 }, + { lampsurf, &indgrid1, { 6, 7 }, 0, 0 }, + { lampsurf, &indgrid1, { 6, 6 }, 0, 0 }, + { lampsurf, &indgrid1, { 6, 5 }, 0, 0 }, + { lampsurf, &indgrid1, { 6, 4 }, 0, 0 }, + { lampsurf, &indgrid1, { 6, 3 }, 0, 0 }, + /* column 7 */ + { lampsurf, &indgrid1, { 7, 10 }, 0, 0 }, + { lampsurf, &indgrid1, { 7, 9 }, 0, 0 }, + { lampsurf, &indgrid1, { 7, 8 }, 0, 0 }, + { lampsurf, &indgrid1, { 7, 7 }, 0, 0 }, + { lampsurf, &indgrid1, { 7, 6 }, 0, 0 }, + { lampsurf, &indgrid1, { 7, 5 }, 0, 0 }, + { lampsurf, &indgrid1, { 7, 4 }, 0, 0 }, + { lampsurf, &indgrid1, { 7, 3 }, 0, 0 }, + /* column 8 */ + { lampsurf, &indgrid1, { 8, 10 }, 0, 0 }, + { lampsurf, &indgrid1, { 8, 9 }, 0, 0 }, + { lampsurf, &indgrid1, { 8, 8 }, 0, 0 }, + { lampsurf, &indgrid1, { 8, 7 }, 0, 0 }, + { lampsurf, &indgrid1, { 8, 6 }, 0, 0 }, + { lampsurf, &indgrid1, { 8, 5 }, 0, 0 }, + { lampsurf, &indgrid1, { 8, 4 }, 0, 0 }, + { lampsurf, &indgrid1, { 8, 3 }, 0, 0 }, + /* column 9 */ + { lampsurf, &indgrid1, { 9, 10 }, 0, 0 }, + { lampsurf, &indgrid1, { 9, 9 }, 0, 0 }, + { lampsurf, &indgrid1, { 9, 8 }, 0, 0 }, + { lampsurf, &indgrid1, { 9, 7 }, 0, 0 }, + { lampsurf, &indgrid1, { 9, 6 }, 0, 0 }, + { lampsurf, &indgrid1, { 9, 5 }, 0, 0 }, + { lampsurf, &indgrid1, { 9, 4 }, 0, 0 }, + { lampsurf, &indgrid1, { 9, 3 }, 0, 0 }, + /* column 10 */ + { lampsurf, &indgrid1, { 10, 10 }, 0, 0 }, + { lampsurf, &indgrid1, { 10, 9 }, 0, 0 }, + { lampsurf, &indgrid1, { 10, 8 }, 0, 0 }, + { lampsurf, &indgrid1, { 10, 7 }, 0, 0 }, + { lampsurf, &indgrid1, { 10, 6 }, 0, 0 }, + { lampsurf, &indgrid1, { 10, 5 }, 0, 0 }, + { lampsurf, &indgrid1, { 10, 4 }, 0, 0 }, + { lampsurf, &indgrid1, { 10, 3 }, 0, 0 }, + /* column 11 */ + { lampsurf, &indgrid1, { 11, 10 }, 0, 0 }, + { lampsurf, &indgrid1, { 11, 9 }, 0, 0 }, + { lampsurf, &indgrid1, { 11, 8 }, 0, 0 }, + { lampsurf, &indgrid1, { 11, 7 }, 0, 0 }, + { lampsurf, &indgrid1, { 11, 6 }, 0, 0 }, + { lampsurf, &indgrid1, { 11, 5 }, 0, 0 }, + { lampsurf, &indgrid1, { 11, 4 }, 0, 0 }, + { lampsurf, &indgrid1, { 11, 3 }, 0, 0 }, + /* column 12 */ + { lampsurf, &indgrid1, { 12, 10 }, 0, 0 }, + { lampsurf, &indgrid1, { 12, 9 }, 0, 0 }, + { lampsurf, &indgrid1, { 12, 8 }, 0, 0 }, + { lampsurf, &indgrid1, { 12, 7 }, 0, 0 }, + { lampsurf, &indgrid1, { 12, 6 }, 0, 0 }, + { lampsurf, &indgrid1, { 12, 5 }, 0, 0 }, + { lampsurf, &indgrid1, { 12, 4 }, 0, 0 }, + { lampsurf, &indgrid1, { 12, 3 }, 0, 0 }, + /* column 13 */ + { lampsurf, &indgrid1, { 13, 10 }, 0, 0 }, + { lampsurf, &indgrid1, { 13, 9 }, 0, 0 }, + { lampsurf, &indgrid1, { 13, 8 }, 0, 0 }, + { lampsurf, &indgrid1, { 13, 7 }, 0, 0 }, + { lampsurf, &indgrid1, { 13, 6 }, 0, 0 }, + { lampsurf, &indgrid1, { 13, 5 }, 0, 0 }, + { lampsurf, &indgrid1, { 13, 4 }, 0, 0 }, + { lampsurf, &indgrid1, { 13, 3 }, 0, 0 }, + /* column 14 */ + { lampsurf, &indgrid1, { 14, 10 }, 0, 0 }, + { lampsurf, &indgrid1, { 14, 9 }, 0, 0 }, + { lampsurf, &indgrid1, { 14, 8 }, 0, 0 }, + { lampsurf, &indgrid1, { 14, 7 }, 0, 0 }, + { lampsurf, &indgrid1, { 14, 6 }, 0, 0 }, + { lampsurf, &indgrid1, { 14, 5 }, 0, 0 }, + { lampsurf, &indgrid1, { 14, 4 }, 0, 0 }, + { lampsurf, &indgrid1, { 14, 3 }, 0, 0 }, + + /* IO bus */ + { lampsurf, &iogrid, { 4, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 5, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 6, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 7, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 8, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 9, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 10, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 11, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 12, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 13, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 14, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 15, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 16, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 17, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 18, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 19, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 20, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 21, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 22, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 23, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 24, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 25, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 26, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 27, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 28, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 29, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 30, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 31, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 32, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 33, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 34, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 35, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 36, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 37, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 38, 13 }, 0, 0 }, + { lampsurf, &iogrid, { 39, 13 }, 0, 0 }, + + /* card reader */ + { lampsurf, &iogrid, { 4, 15 }, 0, 0 }, + { lampsurf, &iogrid, { 5, 15 }, 0, 0 }, + { lampsurf, &iogrid, { 6, 15 }, 0, 0 }, + { lampsurf, &iogrid, { 7, 15 }, 0, 0 }, + { lampsurf, &iogrid, { 8, 15 }, 0, 0 }, + { lampsurf, &iogrid, { 9, 15 }, 0, 0 }, + { lampsurf, &iogrid, { 10, 15 }, 0, 0 }, + { lampsurf, &iogrid, { 11, 15 }, 0, 0 }, + { lampsurf, &iogrid, { 12, 15 }, 0, 0 }, + + /* card reader buffer */ + { lampsurf, &iogrid, { 4, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 5, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 6, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 7, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 8, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 9, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 10, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 11, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 12, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 13, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 14, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 15, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 16, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 17, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 18, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 19, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 20, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 21, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 22, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 23, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 24, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 25, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 26, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 27, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 28, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 29, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 30, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 31, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 32, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 33, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 34, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 35, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 36, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 37, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 38, 17 }, 0, 0 }, + { lampsurf, &iogrid, { 39, 17 }, 0, 0 }, + + /* paper tape reader */ + { lampsurf, &iogrid, { 4, 19 }, 0, 0 }, + { lampsurf, &iogrid, { 5, 19 }, 0, 0 }, + { lampsurf, &iogrid, { 6, 19 }, 0, 0 }, + { lampsurf, &iogrid, { 7, 19 }, 0, 0 }, + { lampsurf, &iogrid, { 8, 19 }, 0, 0 }, + { lampsurf, &iogrid, { 9, 19 }, 0, 0 }, + + /* paper tape reader buffer */ + { lampsurf, &iogrid, { 4, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 5, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 6, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 7, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 8, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 9, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 10, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 11, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 12, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 13, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 14, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 15, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 16, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 17, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 18, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 19, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 20, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 21, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 22, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 23, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 24, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 25, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 26, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 27, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 28, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 29, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 30, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 31, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 32, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 33, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 34, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 35, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 36, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 37, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 38, 21 }, 0, 0 }, + { lampsurf, &iogrid, { 39, 21 }, 0, 0 }, + + /* paper tape punch */ + { lampsurf, &iogrid, { 4, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 5, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 6, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 7, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 8, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 9, 23 }, 0, 0 }, + /* data */ + { lampsurf, &iogrid, { 12, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 13, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 14, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 15, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 16, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 17, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 18, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 19, 23 }, 0, 0 }, + + /* teleprinter */ + { lampsurf, &iogrid, { 24, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 25, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 26, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 27, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 28, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 29, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 30, 23 }, 0, 0 }, + /* tti data */ + { lampsurf, &iogrid, { 32, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 33, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 34, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 35, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 36, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 37, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 38, 23 }, 0, 0 }, + { lampsurf, &iogrid, { 39, 23 }, 0, 0 }, + + /* memory protection */ + { lampsurf, &iogrid, { 4, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 5, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 6, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 7, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 8, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 9, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 10, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 11, 25 }, 0, 0 }, + + /* memory relocation */ + { lampsurf, &iogrid, { 18, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 19, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 20, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 21, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 22, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 23, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 24, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 25, 25 }, 0, 0 }, + + /* relocated address */ + { lampsurf, &iogrid, { 32, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 33, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 34, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 35, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 36, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 37, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 38, 25 }, 0, 0 }, + { lampsurf, &iogrid, { 39, 25 }, 0, 0 }, + + /* extra lights */ + { lampsurf, &extragrid, { 4, 10 }, 0, 0 }, +}; diff --git a/panel/panel6.c b/panel/panel6.c new file mode 100644 index 0000000..d36777b --- /dev/null +++ b/panel/panel6.c @@ -0,0 +1,545 @@ +#include +#include +#include +#include +#include +#include +#include + +#define nelem(a) (sizeof(a)/sizeof(a[0])) +#define nil NULL + +typedef uint64_t word; +typedef uint32_t hword; +typedef uint32_t u32; +typedef uint16_t u16; +typedef int8_t i8; +typedef uint8_t u8; +typedef unsigned char uchar; +typedef uchar bool; + +typedef struct Point Point; +struct Point +{ + float x, y; +}; + +typedef struct Panel Panel; +struct Panel +{ + SDL_Surface *surf; + SDL_Rect pos; +}; + +typedef struct Grid Grid; +struct Grid +{ + float xoff, yoff; + float xscl, yscl; + Panel *panel; +}; + +typedef struct Element Element; +struct Element +{ + SDL_Surface **surf; + Grid *grid; + Point pos; + int state; + int active; +}; + +void +err(char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "error: "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); + exit(1); +} + +SDL_Surface* +mustloadimg(const char *path) +{ + SDL_Surface *s; + s = IMG_Load(path); + if(s == nil) + err("Couldn't load %s", path); + return s; +} + +SDL_Surface *lampsurf[2]; +SDL_Surface *switchsurf[2]; +SDL_Surface *keysurf[3]; + +Panel oppanel; +Grid opgrid1; /* the smaller base grid */ +Grid opgrid2; /* the key grid */ + +Panel iopanel; +Grid iogrid; + +Panel indpanel1, indpanel2; +Grid indgrid1; +Grid indgrid2; + +Panel extrapanel; +Grid extragrid; + +/* operator panel */ +Element *data_sw, *ma_sw, *misc_sw; +Element *ir_l, *mi_l, *pc_l, *ma_l, + *pih_l, *pir_l, *pio_l, *misc_l; + +/* bay indicator panel */ +Element *mb_l, *ar_l, *mq_l; +Element *ff_l; /* flip flops */ + +/* io panel */ +Element *iobus_l, *cr_l, *crbuf_l, *ptr_l, *ptrbuf_l, + *ptp_l, *ptpbuf_l, *tty_l, *ttibuf_l, + *pr_l, *rlr_l, *rla_l; + +/* extra panel */ +Element *extra_sw; +Element *extra_l; + +#include "elements.inc" + +void +setlights(uchar b, Element *l, int n) +{ + int i; + for(i = 0; i < n; i++) + l[i].state = !!(b & 1 << 7-i); +} + +void +set18lights(uchar *b, Element *l) +{ + setlights(b[0], l, 8); + setlights(b[1], l+8, 8); + setlights(b[2], l+16, 2); +} + +void +set36lights(uchar *b, Element *l) +{ + setlights(b[0], l, 8); + setlights(b[1], l+8, 8); + setlights(b[2], l+16, 8); + setlights(b[3], l+24, 8); + setlights(b[4], l+32, 4); +} + +uchar +getswitches(Element *sw, int n, int state) +{ + uchar b; + int i; + b = 0; + for(i = 0; i < n; i++) + b |= (uchar)(sw[i].state == state) << 7-i; + return b; +} + +uchar +get18switches(uchar *b, Element *sw) +{ + b[0] = getswitches(sw, 8, 1); + b[1] = getswitches(sw+8, 8, 1); + b[2] = getswitches(sw+16, 2, 1); +} + +uchar +get36switches(uchar *b, Element *sw) +{ + b[0] = getswitches(sw, 8, 1); + b[1] = getswitches(sw+8, 8, 1); + b[2] = getswitches(sw+16, 8, 1); + b[3] = getswitches(sw+24, 8, 1); + b[4] = getswitches(sw+32, 4, 1); +} + +void +putpixel(SDL_Surface *screen, int x, int y, Uint32 col) +{ + Uint32 *p = (Uint32*)screen->pixels; + if(x < 0 || x >= screen->w || + y < 0 || y >= screen->h) + return; + p += y*screen->w+x; + *p = SDL_MapRGBA(screen->format, + col&0xFF, (col>>8)&0xFF, (col>>16)&0xFF, (col>>24)&0xFF); +} + +void +drawhline(SDL_Surface *screen, int y, int x1, int x2, Uint32 col) +{ + for(; x1 < x2; x1++) + putpixel(screen, x1, y, col); +} + +void +drawvline(SDL_Surface *screen, int x, int y1, int y2, Uint32 col) +{ + for(; y1 < y2; y1++) + putpixel(screen, x, y1, col); +} + +Point +xform(Grid *g, Point p) +{ + p.x = g->panel->pos.x + g->xoff + p.x*g->xscl; + p.y = g->panel->pos.y + (g->panel->surf->h - (g->yoff + p.y*g->yscl)); + return p; +} + +int +ismouseover(Element *e, int x, int y) +{ + Point p; + + p = xform(e->grid, e->pos); + return x >= p.x && x <= p.x + e->surf[e->state]->w && + y >= p.y && y <= p.y + e->surf[e->state]->h; +} + +void +drawgrid(Grid *g, SDL_Surface *s, Uint32 col) +{ + SDL_Surface *ps; + int x, y; + int xmax, ymax; + Point p; + + ps = g->panel->surf; + xmax = ps->w/g->xscl; + ymax = ps->h/g->yscl; + for(x = 0; x < xmax; x++){ + p = xform(g, (Point){ x, 0 }); + drawvline(s, p.x, + p.y - ps->h, p.y, col); + } + for(y = 0; y < ymax; y++){ + p = xform(g, (Point){ 0, y }); + drawhline(s, p.y, + p.x, p.x + ps->w, col); + } +} + +void +drawelement(SDL_Surface *screen, Element *elt, int power) +{ + SDL_Rect r; + Point p; + int s; + + p = xform(elt->grid, elt->pos); + r.x = p.x+0.5; + r.y = p.y+0.5; + if(elt->surf == lampsurf) + s = elt->state && power; + else + s = elt->state; + SDL_BlitSurface(elt->surf[s], nil, screen, &r); +} + +void +mouse(int button, int state, int x, int y) +{ + static int buttonstate; + Element *e; + int i; + + if(button){ + if(state == 1) + buttonstate |= 1 << button-1; + else + buttonstate &= ~(1 << button-1); + } + + /* keys */ + for(i = 0; i < nelem(keys); i++){ + e = &keys[i]; + /* e->active means latched on/off for keys */ + if(buttonstate == 0 || !ismouseover(e, x, y)){ + if(!e->active) + e->state = 0; + continue; + } + if((buttonstate & 5) == 5) /* left and right -> latched on/off */ + e->active = !e->active; + else if(buttonstate & 1) /* left button -> down */ + e->state = 1; + else if(buttonstate & 4) /* right button -> up */ + e->state = 2; + } + + /* switches */ + for(i = 0; i < nelem(switches); i++){ + e = &switches[i]; + if(buttonstate == 0 || !ismouseover(e, x, y)){ + e->active = 0; + continue; + } + if(!e->active){ + e->active = 1; + if(buttonstate & 1) /* left button, toggle */ + e->state = !e->state; + else if(buttonstate & 2) /* middle button, on */ + e->state = 1; + else if(buttonstate & 4) /* right button, off */ + e->state = 0; + } + } +} + +void +findlayout(int *w, int *h) +{ + float gap; + + gap = (oppanel.surf->w - indpanel1.surf->w - indpanel2.surf->w)/4.0f; + + indpanel1.pos = (SDL_Rect){ 0, 0, 0, 0 }; + indpanel1.pos.x += gap; + + indpanel2.pos = indpanel1.pos; + indpanel2.pos.x += indpanel1.surf->w + 2*gap; + + iopanel.pos = indpanel2.pos; + iopanel.pos.y += indpanel2.surf->h; + + oppanel.pos = (SDL_Rect){ 0, 0, 0, 0 }; + oppanel.pos.y += indpanel1.surf->h*2.7; + + extrapanel.pos = indpanel1.pos; + extrapanel.pos.y = oppanel.pos.y - extrapanel.surf->h; + + *w = oppanel.surf->w; + *h = oppanel.pos.y + oppanel.surf->h; +} + +void* +talki2c(void *x) +{ + int fd; + int i; + int n; + uchar msg[128], *p; + + fd = open("/dev/i2c-1", O_RDWR); + if(fd < 0) + err("Couldn't open I2C connection"); + if(ioctl(fd, I2C_SLAVE, 0x26) < 0) + err("Couldn't select device"); + + while(1){ + n = 0; + msg[n++] = 0; // address + get18switches(&msg[n], ma_sw); n += 3; + get36switches(&msg[n], data_sw); n += 5; + msg[n++] = getswitches(misc_sw, 4, 1); + msg[n++] = getswitches(extra_sw, 6, 1); + msg[n++] = getswitches(keys, 8, 1); + msg[n++] = getswitches(keys, 8, 2); + write(fd, msg, n); + + p = msg; + *p++ = 0; + write(fd, msg, 1); + p = msg; + read(fd, p, 0x12); + p += 0x12; + + read(fd, p, 0xF); + p += 0xF; + + read(fd, p, 0xE); + p += 0xE; + + n = 0; + set18lights(&msg[n], ir_l); n += 3; + set18lights(&msg[n], pc_l); n += 3; + set36lights(&msg[n], mi_l); n += 5; + set18lights(&msg[n], ma_l); n += 3; + setlights(msg[n+0]<<1, pih_l, 7); + setlights(msg[n+1]<<1, pir_l, 7); + setlights(msg[n+2]<<1, pio_l, 7); + misc_l[0].state = !!(msg[n+2] & 0x80); + misc_l[1].state = !!(msg[n+1] & 0x80); + misc_l[2].state = !!(msg[n+0] & 0x80); + misc_l[3].state = !!(msg[n+3] & 0x80); + misc_l[4].state = !!(msg[n+3] & 0x40); + misc_l[5].state = !!(msg[n+3] & 0x20); + misc_l[6].state = !!(msg[n+3] & 0x10); + n += 4; + set36lights(&msg[n], mb_l); n += 5; + set36lights(&msg[n], ar_l); n += 5; + set36lights(&msg[n], mq_l); n += 5; + + setlights(msg[n++], &ff_l[0], 8); + setlights(msg[n++], &ff_l[8], 8); + setlights(msg[n++], &ff_l[16], 8); + setlights(msg[n++], &ff_l[24], 8); + setlights(msg[n++], &ff_l[32], 8); + setlights(msg[n++], &ff_l[40], 8); + setlights(msg[n++], &ff_l[48], 8); + setlights(msg[n++], &ff_l[56], 8); + setlights(msg[n++], &ff_l[64], 8); + setlights(msg[n++], &ff_l[72], 8); + setlights(msg[n++], &ff_l[80], 8); + setlights(msg[n++], &ff_l[88], 8); + setlights(msg[n++], &ff_l[96], 8); + setlights(msg[n++], &ff_l[104], 8); + + for(i = 0; i < n; i++) + printf("%02X ", msg[i]); + printf("\n"); + } + + close(fd); +} + +int +main(int argc, char *argv[]) +{ + SDL_Surface *screen; + SDL_Event ev; + SDL_MouseButtonEvent *mbev; + SDL_MouseMotionEvent *mmev; + Element *e; + int i; + int w, h; + pthread_t comthread; + + if(SDL_Init(SDL_INIT_VIDEO) < 0) + err("%s", SDL_GetError()); + + lampsurf[0] = mustloadimg("../art/lamp_off.png"); + lampsurf[1] = mustloadimg("../art/lamp_on.png"); + + switchsurf[0] = mustloadimg("../art/switch_d.png"); + switchsurf[1] = mustloadimg("../art/switch_u.png"); + + keysurf[0] = mustloadimg("../art/key_n.png"); + keysurf[1] = mustloadimg("../art/key_d.png"); + keysurf[2] = mustloadimg("../art/key_u.png"); + + oppanel.surf = mustloadimg("../art/op_panel.png"); + + opgrid1.panel = &oppanel; + opgrid1.xscl = opgrid1.panel->surf->w/90.0f; + opgrid1.yscl = opgrid1.panel->surf->h/11.0f; + opgrid1.yoff = opgrid1.yscl/2.0f; + + opgrid2.panel = &oppanel; + opgrid2.xscl = opgrid1.xscl*1.76f; + opgrid2.yscl = opgrid2.xscl; + opgrid2.xoff = opgrid1.xscl*44.5f; + opgrid2.yoff = opgrid1.panel->surf->h*2.4f/143.0f; + + iopanel.surf = mustloadimg("../art/io_panel.png"); + iogrid.panel = &iopanel; + iogrid.xscl = iogrid.panel->surf->w/44.0f; + iogrid.yscl = iogrid.panel->surf->h/28.0f; + + indpanel1.surf = mustloadimg("../art/ind_panel1.png"); + indgrid1.panel = &indpanel1; + indgrid1.xscl = indgrid1.panel->surf->w*5.0f/77.0f; + indgrid1.yscl = indgrid1.panel->surf->h/12.0f; + + indpanel2.surf = mustloadimg("../art/ind_panel2.png"); + indgrid2.panel = &indpanel2; + indgrid2.xscl = indgrid2.panel->surf->w/44.0f; + indgrid2.yscl = indgrid2.panel->surf->h/11.0f; + + extrapanel.surf = mustloadimg("../art/extra_panel.png"); + extragrid = indgrid1; + extragrid.panel = &extrapanel; + + findlayout(&w, &h); + + screen = SDL_SetVideoMode(w, h, 32, SDL_DOUBLEBUF); + if(screen == nil) + err("%s", SDL_GetError()); + + e = switches; + data_sw = e; e += 36; + ma_sw = e; e += 18; + misc_sw = e; e += 4; + + extra_sw = e; e += 5; + + e = lamps; + mi_l = e; e += 36; + ir_l = e; e += 18; + ma_l = e; e += 18; + pc_l = e; e += 18; + pio_l = e; e += 7; + pir_l = e; e += 7; + pih_l = e; e += 7; + misc_l = e; e += 7; + + mb_l = e; e += 36; + ar_l = e; e += 36; + mq_l = e; e += 36; + ff_l = e; e += 14*8; + + iobus_l = e; e += 36; + cr_l = e; e += 9; + crbuf_l = e; e += 36; + ptr_l = e; e += 6; + ptrbuf_l = e; e += 36; + ptp_l = e; e += 6; + ptpbuf_l = e; e += 8; + tty_l = e; e += 7; + ttibuf_l = e; e += 8; + pr_l = e; e += 8; + rlr_l = e; e += 8; + rla_l = e; e += 8; + + extra_l = e; e += 1; + + pthread_create(&comthread, nil, talki2c, nil); + + for(;;){ + while(SDL_PollEvent(&ev)) + switch(ev.type){ + case SDL_MOUSEMOTION: + mmev = (SDL_MouseMotionEvent*)&ev; + mouse(0, mmev->state, mmev->x, mmev->y); + break; + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + mbev = (SDL_MouseButtonEvent*)&ev; + mouse(mbev->button, mbev->state, mbev->x, mbev->y); + break; + case SDL_QUIT: + SDL_Quit(); + return 0; + } + + SDL_FillRect(screen, nil, SDL_MapRGBA(screen->format, 0xe6, 0xe6, 0xe6, 0xff)); + SDL_BlitSurface(indpanel1.surf, nil, screen, &indpanel1.pos); + SDL_BlitSurface(indpanel2.surf, nil, screen, &indpanel2.pos); + SDL_BlitSurface(extrapanel.surf, nil, screen, &extrapanel.pos); + SDL_BlitSurface(iopanel.surf, nil, screen, &iopanel.pos); + SDL_BlitSurface(oppanel.surf, nil, screen, &oppanel.pos); + + for(i = 0, e = lamps; i < nelem(lamps); i++, e++) + drawelement(screen, e, 1); + for(i = 0, e = keys; i < nelem(keys); i++, e++) + drawelement(screen, e, 1); + for(i = 0, e = switches; i < nelem(switches); i++, e++) + drawelement(screen, e, 1); + + + SDL_Flip(screen); + } + return 0; +}