mirror of
https://github.com/aap/pdp6.git
synced 2026-01-29 05:11:50 +00:00
wrote new gui; implemented and fixed a bunch of stuff
This commit is contained in:
13
src/Makefile
Normal file
13
src/Makefile
Normal file
@@ -0,0 +1,13 @@
|
||||
SRC=main.c apr.c mem.c tty.c pt.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
|
||||
|
||||
|
||||
pdp6: $(SRC) pdp6.h
|
||||
$(CC) $(CFLAGS) $(SRC) $(LIBS) -o pdp6
|
||||
|
||||
24
src/args.h
Normal file
24
src/args.h
Normal file
@@ -0,0 +1,24 @@
|
||||
extern char *argv0;
|
||||
#define USED(x) ((void)x)
|
||||
#define SET(x) ((x)=0)
|
||||
|
||||
#define ARGBEGIN for((argv0||(argv0=*argv)),argv++,argc--;\
|
||||
argv[0] && argv[0][0]=='-' && argv[0][1];\
|
||||
argc--, argv++) {\
|
||||
char *_args, *_argt;\
|
||||
char _argc;\
|
||||
_args = &argv[0][1];\
|
||||
if(_args[0]=='-' && _args[1]==0){\
|
||||
argc--; argv++; break;\
|
||||
}\
|
||||
_argc = 0;\
|
||||
while(*_args && (_argc = *_args++))\
|
||||
switch(_argc)
|
||||
#define ARGEND SET(_argt);USED(_argt);USED(_argc);USED(_args);}USED(argv);USED(argc);
|
||||
#define ARGF() (_argt=_args, _args=(char*)"",\
|
||||
(*_argt? _argt: argv[1]? (argc--, *++argv): 0))
|
||||
#define EARGF(x) (_argt=_args, _args=(char*)"",\
|
||||
(*_argt? _argt: argv[1]? (argc--, *++argv): ((x), abort(), (char*)0)))
|
||||
|
||||
#define ARGC() _argc
|
||||
|
||||
667
src/elements.inc
Normal file
667
src/elements.inc
Normal file
@@ -0,0 +1,667 @@
|
||||
Element keys[] = {
|
||||
/* keys */
|
||||
{ keysurf, &opgrid2, { 0, 2 }, 1, 0 },
|
||||
{ keysurf, &opgrid2, { 2.75, 2 }, 1, 0 },
|
||||
{ keysurf, &opgrid2, { 5.5, 2 }, 1, 0 },
|
||||
{ keysurf, &opgrid2, { 8.25, 2 }, 1, 0 },
|
||||
{ keysurf, &opgrid2, { 11, 2 }, 1, 0 },
|
||||
{ keysurf, &opgrid2, { 13.75, 2 }, 1, 0 },
|
||||
{ keysurf, &opgrid2, { 16.5, 2 }, 1, 0 },
|
||||
{ keysurf, &opgrid2, { 19.25, 2 }, 1, 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 },
|
||||
};
|
||||
706
src/main.c
Normal file
706
src/main.c
Normal file
@@ -0,0 +1,706 @@
|
||||
#include "pdp6.h"
|
||||
#include <stdarg.h>
|
||||
#include <SDL.h>
|
||||
#include <SDL_image.h>
|
||||
#include <pthread.h>
|
||||
#include "args.h"
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
char *argv0;
|
||||
|
||||
FILE *debugfp;
|
||||
int dotrace;
|
||||
|
||||
void
|
||||
trace(char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
if(dotrace){
|
||||
fprintf(debugfp, " ");
|
||||
vfprintf(debugfp, fmt, ap);
|
||||
}
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
debug(char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
vfprintf(debugfp, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
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 == NULL)
|
||||
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(word w, Element *l, int n)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < n; i++)
|
||||
l[n-i-1].state = !!(w & 1L<<i);
|
||||
}
|
||||
|
||||
word
|
||||
getswitches(Element *sw, int n)
|
||||
{
|
||||
word w;
|
||||
int i;
|
||||
w = 0;
|
||||
for(i = 0; i < n; i++)
|
||||
w |= (word)sw[n-i-1].state << i;
|
||||
return w;
|
||||
}
|
||||
|
||||
void
|
||||
poweron(void)
|
||||
{
|
||||
pthread_t apr_thread;
|
||||
apr.sw_power = 1;
|
||||
pthread_create(&apr_thread, NULL, aprmain, &apr);
|
||||
}
|
||||
|
||||
#define KEYPULSE(k) (apr.k && !oldapr.k)
|
||||
|
||||
void
|
||||
update(void)
|
||||
{
|
||||
Apr oldapr;
|
||||
|
||||
oldapr = apr;
|
||||
setlights(apr.ir, ir_l, 18);
|
||||
setlights(apr.mi, mi_l, 36);
|
||||
setlights(apr.pc, pc_l, 18);
|
||||
setlights(apr.ma, ma_l, 18);
|
||||
setlights(apr.pih, pih_l, 7);
|
||||
setlights(apr.pir, pir_l, 7);
|
||||
setlights(apr.pio, pio_l, 7);
|
||||
misc_l[0].state = apr.pi_active;
|
||||
misc_l[1].state = apr.mc_stop;
|
||||
misc_l[2].state = apr.run;
|
||||
misc_l[3].state = apr.sw_repeat = misc_sw[0].state;
|
||||
misc_l[4].state = apr.sw_addr_stop = misc_sw[1].state;
|
||||
misc_l[5].state = apr.sw_power = misc_sw[2].state;
|
||||
if(apr.sw_power && !oldapr.sw_power)
|
||||
poweron();
|
||||
misc_l[6].state = apr.sw_mem_disable = misc_sw[3].state;
|
||||
apr.data = getswitches(data_sw, 36);
|
||||
apr.mas = getswitches(ma_sw, 18);
|
||||
|
||||
apr.sw_rim_maint = extra_sw[0].state;
|
||||
if(apr.sw_rim_maint)
|
||||
apr.key_rim_sbr = 1;
|
||||
apr.sw_rpt_bypass = extra_sw[1].state;
|
||||
apr.sw_art3_maint = extra_sw[2].state;
|
||||
apr.sw_sct_maint = extra_sw[3].state;
|
||||
apr.sw_spltcyc_override = extra_sw[4].state;
|
||||
|
||||
apr.key_start = keys[0].state == 1;
|
||||
apr.key_readin = keys[0].state == 2;
|
||||
apr.key_inst_cont = keys[1].state == 1;
|
||||
apr.key_mem_cont = keys[1].state == 2;
|
||||
apr.key_inst_stop = keys[2].state == 1;
|
||||
apr.key_mem_stop = keys[2].state == 2;
|
||||
apr.key_io_reset = keys[3].state == 1;
|
||||
apr.key_exec = keys[3].state == 2;
|
||||
apr.key_dep = keys[4].state == 1;
|
||||
apr.key_dep_nxt = keys[4].state == 2;
|
||||
apr.key_ex = keys[5].state == 1;
|
||||
apr.key_ex_nxt = keys[5].state == 2;
|
||||
apr.key_rd_off = keys[6].state == 1;
|
||||
apr.key_rd_on = keys[6].state == 2;
|
||||
apr.key_pt_rd = keys[7].state == 1;
|
||||
apr.key_pt_wr = keys[7].state == 2;
|
||||
if(apr.sw_power){
|
||||
if(KEYPULSE(key_start) || KEYPULSE(key_readin) ||
|
||||
KEYPULSE(key_inst_cont) || KEYPULSE(key_mem_cont) ||
|
||||
KEYPULSE(key_io_reset) || KEYPULSE(key_exec) ||
|
||||
KEYPULSE(key_dep) || KEYPULSE(key_dep_nxt) ||
|
||||
KEYPULSE(key_ex) || KEYPULSE(key_ex_nxt))
|
||||
apr.extpulse |= EXT_KEY_MANUAL;
|
||||
if(KEYPULSE(key_inst_stop))
|
||||
apr.extpulse |= EXT_KEY_INST_STOP;
|
||||
if(KEYPULSE(key_rd_on))
|
||||
ptr_setmotor(1);
|
||||
if(KEYPULSE(key_rd_off))
|
||||
ptr_setmotor(0);
|
||||
}
|
||||
|
||||
setlights(apr.mb, mb_l, 36);
|
||||
setlights(apr.ar, ar_l, 36);
|
||||
setlights(apr.mq, mq_l, 36);
|
||||
|
||||
ff_l[0].state = apr.key_ex_st;
|
||||
ff_l[1].state = apr.key_ex_sync;
|
||||
ff_l[2].state = apr.key_dep_st;
|
||||
ff_l[3].state = apr.key_dep_sync;
|
||||
ff_l[4].state = apr.key_rd_wr;
|
||||
ff_l[5].state = apr.mc_rd;
|
||||
ff_l[6].state = apr.mc_wr;
|
||||
ff_l[7].state = apr.mc_rq;
|
||||
|
||||
ff_l[8].state = apr.if1a;
|
||||
ff_l[9].state = apr.af0;
|
||||
ff_l[10].state = apr.af3;
|
||||
ff_l[11].state = apr.af3a;
|
||||
ff_l[12].state = apr.et4_ar_pse;
|
||||
ff_l[13].state = apr.f1a;
|
||||
ff_l[14].state = apr.f4a;
|
||||
ff_l[15].state = apr.f6a;
|
||||
|
||||
ff_l[16].state = apr.sf3;
|
||||
ff_l[17].state = apr.sf5a;
|
||||
ff_l[18].state = apr.sf7;
|
||||
ff_l[19].state = apr.ar_com_cont;
|
||||
ff_l[20].state = apr.blt_f0a;
|
||||
ff_l[21].state = apr.blt_f3a;
|
||||
ff_l[22].state = apr.blt_f5a;
|
||||
ff_l[23].state = apr.iot_f0a;
|
||||
|
||||
ff_l[24].state = apr.fpf1;
|
||||
ff_l[25].state = apr.fpf2;
|
||||
ff_l[26].state = apr.faf1;
|
||||
ff_l[27].state = apr.faf2;
|
||||
ff_l[28].state = apr.faf3;
|
||||
ff_l[29].state = apr.faf4;
|
||||
ff_l[30].state = apr.fmf1;
|
||||
ff_l[31].state = apr.fmf2;
|
||||
|
||||
ff_l[32].state = apr.fdf1;
|
||||
ff_l[33].state = apr.fdf2;
|
||||
ff_l[34].state = apr.ir & H6 && apr.mq & F1 && !apr.nrf3;
|
||||
ff_l[35].state = apr.nrf1;
|
||||
ff_l[36].state = apr.nrf2;
|
||||
ff_l[37].state = apr.nrf3;
|
||||
ff_l[38].state = apr.fsf1;
|
||||
ff_l[39].state = apr.chf7;
|
||||
|
||||
ff_l[40].state = apr.dsf1;
|
||||
ff_l[41].state = apr.dsf2;
|
||||
ff_l[42].state = apr.dsf3;
|
||||
ff_l[43].state = apr.dsf4;
|
||||
ff_l[44].state = apr.dsf5;
|
||||
ff_l[45].state = apr.dsf6;
|
||||
ff_l[46].state = apr.dsf7;
|
||||
ff_l[47].state = apr.dsf8;
|
||||
|
||||
ff_l[48].state = apr.dsf9;
|
||||
ff_l[49].state = apr.msf1;
|
||||
ff_l[50].state = apr.mpf1;
|
||||
ff_l[51].state = apr.mpf2;
|
||||
ff_l[52].state = apr.mc_split_cyc_sync;
|
||||
ff_l[53].state = apr.mc_stop_sync;
|
||||
ff_l[54].state = apr.shf1;
|
||||
ff_l[55].state = apr.sc == 0777;
|
||||
|
||||
ff_l[56].state = apr.chf1;
|
||||
ff_l[57].state = apr.chf2;
|
||||
ff_l[58].state = apr.chf3;
|
||||
ff_l[59].state = apr.chf4;
|
||||
ff_l[60].state = apr.chf5;
|
||||
ff_l[61].state = apr.chf6;
|
||||
ff_l[62].state = apr.lcf1;
|
||||
ff_l[63].state = apr.dcf1;
|
||||
|
||||
ff_l[64].state = apr.pi_ov;
|
||||
ff_l[65].state = apr.pi_cyc;
|
||||
ff_l[66].state = !!apr.pi_req;
|
||||
ff_l[67].state = apr.iot_go;
|
||||
ff_l[68].state = apr.a_long;
|
||||
ff_l[69].state = apr.ma == apr.mas;
|
||||
ff_l[70].state = apr.uuo_f1;
|
||||
ff_l[71].state = apr.cpa_pdl_ov;
|
||||
|
||||
setlights(apr.fe, &ff_l[72], 8);
|
||||
|
||||
setlights(apr.sc, &ff_l[80], 8);
|
||||
|
||||
ff_l[88].state = !apr.ex_user;
|
||||
ff_l[89].state = apr.cpa_illeg_op;
|
||||
ff_l[90].state = apr.ex_ill_op;
|
||||
ff_l[91].state = apr.ex_uuo_sync;
|
||||
ff_l[92].state = apr.ex_pi_sync;
|
||||
ff_l[93].state = apr.mq36;
|
||||
ff_l[94].state = !!(apr.sc & 0400);
|
||||
ff_l[95].state = !!(apr.fe & 0400);
|
||||
|
||||
ff_l[96].state = apr.key_rim_sbr;
|
||||
ff_l[97].state = apr.ar_cry0_xor_cry1;
|
||||
ff_l[98].state = apr.ar_cry0;
|
||||
ff_l[99].state = apr.ar_cry1;
|
||||
ff_l[100].state = apr.ar_ov_flag;
|
||||
ff_l[101].state = apr.ar_cry0_flag;
|
||||
ff_l[102].state = apr.ar_cry1_flag;
|
||||
ff_l[103].state = apr.ar_pc_chg_flag;
|
||||
|
||||
ff_l[104].state = apr.cpa_non_exist_mem;
|
||||
ff_l[105].state = apr.cpa_clock_enable;
|
||||
ff_l[106].state = apr.cpa_clock_flag;
|
||||
ff_l[107].state = apr.cpa_pc_chg_enable;
|
||||
ff_l[108].state = apr.cpa_arov_enable;
|
||||
ff_l[109].state = !!(apr.cpa_pia&4);
|
||||
ff_l[110].state = !!(apr.cpa_pia&2);
|
||||
ff_l[111].state = !!(apr.cpa_pia&1);
|
||||
|
||||
setlights(apr.pr, pr_l, 8);
|
||||
setlights(apr.rlr, rlr_l, 8);
|
||||
setlights(apr.rla, rla_l, 8);
|
||||
setlights(iobus0, iobus_l, 36);
|
||||
|
||||
ptp_l[0].state = ptp.b;
|
||||
ptp_l[1].state = ptp.busy;
|
||||
ptp_l[2].state = ptp.flag;
|
||||
setlights(ptp.pia, &ptp_l[3], 3);
|
||||
setlights(ptp.ptp, ptpbuf_l, 8);
|
||||
|
||||
ptr_l[0].state = ptr.b;
|
||||
ptr_l[1].state = ptr.busy;
|
||||
ptr_l[2].state = ptr.flag;
|
||||
setlights(ptr.pia, &ptr_l[3], 3);
|
||||
setlights(ptr.ptr, ptrbuf_l, 36);
|
||||
|
||||
tty_l[0].state = tty.tti_busy;
|
||||
tty_l[1].state = tty.tti_flag;
|
||||
tty_l[2].state = tty.tto_busy;
|
||||
tty_l[3].state = tty.tto_flag;
|
||||
setlights(tty.pia, &tty_l[4], 3);
|
||||
setlights(tty.tti, ttibuf_l, 8);
|
||||
|
||||
setlights(iobus0, iobus_l, 36);
|
||||
|
||||
extra_l[0].state = ptr.motor_on;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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 && apr.sw_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
|
||||
usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage: %s [-td]\n", argv0);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
SDL_Surface *screen;
|
||||
SDL_Event ev;
|
||||
SDL_MouseButtonEvent *mbev;
|
||||
SDL_MouseMotionEvent *mmev;
|
||||
Element *e;
|
||||
Uint32 start, end;
|
||||
int delay;
|
||||
int i;
|
||||
int w, h;
|
||||
const char *outfile;
|
||||
|
||||
outfile = "/dev/null";
|
||||
ARGBEGIN{
|
||||
case 't':
|
||||
dotrace = 1;
|
||||
break;
|
||||
case 'd':
|
||||
outfile = EARGF(usage());
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
}ARGEND;
|
||||
if(debugfp = fopen(outfile, "w"), debugfp == nil){
|
||||
fprintf(stderr, "Can't open %s\n", outfile);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
|
||||
initapr();
|
||||
initmem();
|
||||
inittty();
|
||||
initpt();
|
||||
// memset(&apr, 0, sizeof apr);
|
||||
// apr.extpulse = 0;
|
||||
|
||||
for(;;){
|
||||
start = SDL_GetTicks();
|
||||
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;
|
||||
}
|
||||
|
||||
update();
|
||||
|
||||
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);
|
||||
for(i = 0, e = keys; i < nelem(keys); i++, e++)
|
||||
drawelement(screen, e);
|
||||
for(i = 0, e = switches; i < nelem(switches); i++, e++)
|
||||
drawelement(screen, e);
|
||||
|
||||
// SDL_LockSurface(screen);
|
||||
// drawgrid(&opgrid1, screen, 0xFFFFFF00);
|
||||
// drawgrid(&opgrid2, screen, 0xFF0000FF);
|
||||
// drawgrid(&iogrid, screen, 0xFFFFFF00);
|
||||
// drawgrid(&indgrid1, screen, 0xFFFFFF00);
|
||||
// drawgrid(&indgrid2, screen, 0xFFFFFF00);
|
||||
// drawgrid(&extragrid, screen, 0xFFFFFF00);
|
||||
// SDL_UnlockSurface(screen);
|
||||
|
||||
SDL_Flip(screen);
|
||||
end = SDL_GetTicks();
|
||||
delay = (1000 / 30) - (end-start);
|
||||
// if(delay > 0)
|
||||
// SDL_Delay(delay);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
98
src/mem.c
Normal file
98
src/mem.c
Normal file
@@ -0,0 +1,98 @@
|
||||
#include "pdp6.h"
|
||||
#include <ctype.h>
|
||||
|
||||
word memory[256*1024];
|
||||
//hword maxmem = 256*1024;
|
||||
hword maxmem = 64*1024;
|
||||
word fmem[16];
|
||||
word membus0, membus1;
|
||||
word *hold;
|
||||
|
||||
void
|
||||
readmem(char *file, word *mem, word size)
|
||||
{
|
||||
FILE *f;
|
||||
char buf[100], *s;
|
||||
hword a;
|
||||
word w;
|
||||
if(f = fopen(file, "r"), f == nil)
|
||||
return;
|
||||
a = 0;
|
||||
while(s = fgets(buf, 100, f)){
|
||||
while(*s){
|
||||
if(*s == ';')
|
||||
break;
|
||||
else if('0' <= *s && *s <= '7'){
|
||||
w = strtol(s, &s, 8);
|
||||
if(*s == ':'){
|
||||
a = w;
|
||||
s++;
|
||||
}else
|
||||
mem[a++] = w;
|
||||
}else
|
||||
s++;
|
||||
}
|
||||
}
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
void
|
||||
initmem(void)
|
||||
{
|
||||
readmem("../mem", memory, maxmem);
|
||||
readmem("../fmem", fmem, 16);
|
||||
}
|
||||
|
||||
void
|
||||
dumpmem(void)
|
||||
{
|
||||
hword a;
|
||||
FILE *f;
|
||||
|
||||
if(f = fopen("memdump", "w"), f == nil)
|
||||
return;
|
||||
for(a = 0; a < 16; a++)
|
||||
fprint(f, "%02o: %012llo\n", a, fmem[a]);
|
||||
for(a = 0; a < maxmem; a++){
|
||||
if(memory[a]){
|
||||
fprint(f, "%06o: ", a);
|
||||
fprint(f, "%012llo\n", memory[a]);
|
||||
}
|
||||
}
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
/* When a cycle is requested we acknowledge the address
|
||||
* by pulsing the processor through the bus.
|
||||
* A read is completed immediately and signalled by a second pulse.
|
||||
* A write is completed on a second call. */
|
||||
// TODO: implement this properly... according to the manual
|
||||
void
|
||||
wakemem(void)
|
||||
{
|
||||
hword a;
|
||||
if(membus0 & MEMBUS_RQ_CYC){
|
||||
a = membus0>>4 & 037777;
|
||||
if(membus0 & MEMBUS_MA21_1) a |= 0040000;
|
||||
if(membus0 & MEMBUS_MA20_1) a |= 0100000;
|
||||
if(membus0 & MEMBUS_MA19_1) a |= 0200000;
|
||||
if(membus0 & MEMBUS_MA18_1) a |= 0400000;
|
||||
if(a >= maxmem ||
|
||||
membus0 & MEMBUS_MA_FMC_SEL1 && a >= 16)
|
||||
return;
|
||||
|
||||
membus0 |= MEMBUS_MAI_ADDR_ACK;
|
||||
hold = membus0 & MEMBUS_MA_FMC_SEL1 ? &fmem[a] : &memory[a];
|
||||
if(membus0 & MEMBUS_RD_RQ){
|
||||
membus1 = *hold & FW;
|
||||
membus0 |= MEMBUS_MAI_RD_RS;
|
||||
if(!(membus0 & MEMBUS_WR_RQ))
|
||||
hold = NULL;
|
||||
}
|
||||
}
|
||||
if(membus0 & MEMBUS_WR_RS && hold){
|
||||
*hold = membus1 & FW;
|
||||
membus0 &= ~MEMBUS_WR_RS;
|
||||
hold = NULL;
|
||||
}
|
||||
}
|
||||
360
src/pdp6.h
Normal file
360
src/pdp6.h
Normal file
@@ -0,0 +1,360 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#define nelem(a) (sizeof(a)/sizeof(a[0]))
|
||||
#define nil NULL
|
||||
#define print printf
|
||||
#define fprint fprintf
|
||||
|
||||
typedef uint64_t word;
|
||||
typedef uint32_t hword;
|
||||
typedef uint32_t u32;
|
||||
typedef uint16_t u16;
|
||||
typedef uint8_t u8;
|
||||
typedef unsigned char uchar;
|
||||
typedef uchar bool;
|
||||
|
||||
extern FILE *debugfp;
|
||||
extern int dotrace;
|
||||
void trace(char *fmt, ...);
|
||||
void debug(char *fmt, ...);
|
||||
|
||||
enum Mask {
|
||||
FW = 0777777777777,
|
||||
RT = 0000000777777,
|
||||
LT = 0777777000000,
|
||||
SGN = 0400000000000,
|
||||
RSGN = 0000000400000,
|
||||
};
|
||||
|
||||
enum HalfwordBits {
|
||||
H0 = 0400000, H1 = 0200000, H2 = 0100000,
|
||||
H3 = 0040000, H4 = 0020000, H5 = 0010000,
|
||||
H6 = 0004000, H7 = 0002000, H8 = 0001000,
|
||||
H9 = 0000400, H10 = 0000200, H11 = 0000100,
|
||||
H12 = 0000040, H13 = 0000020, H14 = 0000010,
|
||||
H15 = 0000004, H16 = 0000002, H17 = 0000001
|
||||
};
|
||||
|
||||
enum FullwordBits {
|
||||
FCRY = 01000000000000,
|
||||
F0 = 0400000000000, F1 = 0200000000000, F2 = 0100000000000,
|
||||
F3 = 0040000000000, F4 = 0020000000000, F5 = 0010000000000,
|
||||
F6 = 0004000000000, F7 = 0002000000000, F8 = 0001000000000,
|
||||
F9 = 0000400000000, F10 = 0000200000000, F11 = 0000100000000,
|
||||
F12 = 0000040000000, F13 = 0000020000000, F14 = 0000010000000,
|
||||
F15 = 0000004000000, F16 = 0000002000000, F17 = 0000001000000,
|
||||
F18 = 0000000400000, F19 = 0000000200000, F20 = 0000000100000,
|
||||
F21 = 0000000040000, F22 = 0000000020000, F23 = 0000000010000,
|
||||
F24 = 0000000004000, F25 = 0000000002000, F26 = 0000000001000,
|
||||
F27 = 0000000000400, F28 = 0000000000200, F29 = 0000000000100,
|
||||
F30 = 0000000000040, F31 = 0000000000020, F32 = 0000000000010,
|
||||
F33 = 0000000000004, F34 = 0000000000002, F35 = 0000000000001
|
||||
};
|
||||
|
||||
/* external pulses, bits of Apr.extpulse */
|
||||
enum Extpulse {
|
||||
EXT_KEY_MANUAL = 1,
|
||||
EXT_KEY_INST_STOP = 2,
|
||||
EXT_NONEXIT_MEM = 4
|
||||
};
|
||||
|
||||
enum Opcode {
|
||||
FSC = 0132,
|
||||
IBP = 0133,
|
||||
CAO = 0133,
|
||||
LDCI = 0134,
|
||||
LDC = 0135,
|
||||
DPCI = 0136,
|
||||
DPC = 0137,
|
||||
ASH = 0240,
|
||||
ROT = 0241,
|
||||
LSH = 0242,
|
||||
ASHC = 0244,
|
||||
ROTC = 0245,
|
||||
LSHC = 0246,
|
||||
EXCH = 0250,
|
||||
BLT = 0251,
|
||||
AOBJP = 0252,
|
||||
AOBJN = 0253,
|
||||
JRST = 0254,
|
||||
JFCL = 0255,
|
||||
XCT = 0256,
|
||||
PUSHJ = 0260,
|
||||
PUSH = 0261,
|
||||
POP = 0262,
|
||||
POPJ = 0263,
|
||||
JSR = 0264,
|
||||
JSP = 0265,
|
||||
JSA = 0266,
|
||||
JRA = 0267,
|
||||
|
||||
BLKI = 0700000,
|
||||
DATAI = 0700040,
|
||||
BLKO = 0700100,
|
||||
DATAO = 0700140,
|
||||
CONO = 0700200,
|
||||
CONI = 0700240,
|
||||
CONSZ = 0700300,
|
||||
CONSO = 0700340
|
||||
|
||||
};
|
||||
|
||||
enum {
|
||||
MAXPULSE = 5
|
||||
};
|
||||
|
||||
typedef struct Apr Apr;
|
||||
|
||||
typedef void Pulse(Apr *apr);
|
||||
#define pulse(p) static void p(Apr *apr)
|
||||
|
||||
struct Apr {
|
||||
hword ir;
|
||||
word mi;
|
||||
word data;
|
||||
hword pc;
|
||||
hword ma;
|
||||
hword mas;
|
||||
word mb;
|
||||
word ar;
|
||||
word mq;
|
||||
bool mq36;
|
||||
u16 sc, fe;
|
||||
u8 pr, rlr, rla;
|
||||
bool run;
|
||||
bool sw_addr_stop, sw_repeat, sw_mem_disable, sw_power;
|
||||
/* maint switches */
|
||||
bool sw_rim_maint, sw_rpt_bypass, sw_art3_maint, sw_sct_maint, sw_spltcyc_override;
|
||||
/* keys */
|
||||
bool key_start, key_readin;
|
||||
bool key_mem_cont, key_inst_cont;
|
||||
bool key_mem_stop, key_inst_stop;
|
||||
bool key_io_reset, key_exec;
|
||||
bool key_dep, key_dep_nxt;
|
||||
bool key_ex, key_ex_nxt;
|
||||
bool key_rd_off, key_rd_on;
|
||||
bool key_pt_rd, key_pt_wr;
|
||||
|
||||
/* PI */
|
||||
u8 pio, pir, pih, pi_req;
|
||||
bool pi_active;
|
||||
bool pi_ov, pi_cyc;
|
||||
|
||||
/* flip-flops */
|
||||
bool ex_mode_sync, ex_uuo_sync, ex_pi_sync, ex_ill_op, ex_user;
|
||||
bool ar_pc_chg_flag, ar_ov_flag, ar_cry0_flag, ar_cry1_flag;
|
||||
bool ar_cry0, ar_cry1, ar_com_cont;
|
||||
bool ar_cry0_xor_cry1;
|
||||
|
||||
bool key_ex_st, key_ex_sync;
|
||||
bool key_dep_st, key_dep_sync;
|
||||
bool key_rd_wr, key_rim_sbr;
|
||||
|
||||
bool mc_rd, mc_wr, mc_rq, mc_stop, mc_stop_sync, mc_split_cyc_sync;
|
||||
|
||||
bool cpa_iot_user, cpa_illeg_op, cpa_non_exist_mem,
|
||||
cpa_clock_enable, cpa_clock_flag, cpa_pc_chg_enable, cpa_pdl_ov,
|
||||
cpa_arov_enable;
|
||||
int cpa_pia;
|
||||
|
||||
bool iot_go;
|
||||
|
||||
/* ?? */
|
||||
bool a_long;
|
||||
|
||||
/* sbr flip-flops */
|
||||
bool if1a;
|
||||
bool af0, af3, af3a;
|
||||
bool f1a, f4a, f6a;
|
||||
bool et4_ar_pse;
|
||||
bool chf1, chf2, chf3, chf4, chf5, chf6, chf7;
|
||||
bool lcf1, dcf1;
|
||||
bool sf3, sf5a, sf7;
|
||||
bool shf1;
|
||||
bool mpf1, mpf2;
|
||||
bool msf1;
|
||||
bool dsf1, dsf2, dsf3, dsf4, dsf5, dsf6, dsf7, dsf8, dsf9;
|
||||
bool fsf1;
|
||||
bool fmf1, fmf2;
|
||||
bool fdf1, fdf2;
|
||||
bool faf1, faf2, faf3, faf4;
|
||||
bool fpf1, fpf2;
|
||||
bool nrf1, nrf2, nrf3;
|
||||
bool iot_f0a;
|
||||
bool blt_f0a, blt_f3a, blt_f5a;
|
||||
bool uuo_f1;
|
||||
|
||||
/* temporaries */
|
||||
bool ex_inh_rel;
|
||||
|
||||
/* decoded instructions */
|
||||
int inst, io_inst;
|
||||
bool ir_fp;
|
||||
bool ir_fwt;
|
||||
bool fwt_00, fwt_01, fwt_10, fwt_11;
|
||||
bool shift_op, ir_md, ir_jp, ir_as;
|
||||
bool ir_boole;
|
||||
bool boole_as_00, boole_as_01, boole_as_10, boole_as_11;
|
||||
int ir_boole_op;
|
||||
bool ir_hwt;
|
||||
bool hwt_00, hwt_01, hwt_10, hwt_11;
|
||||
bool ir_acbm;
|
||||
bool ex_ir_uuo, ir_iot, ir_jrst;
|
||||
|
||||
bool fc_e_pse;
|
||||
bool pc_set;
|
||||
|
||||
/* needed for the emulation */
|
||||
int extpulse;
|
||||
bool ia_inh; // this is asserted for some time
|
||||
|
||||
Pulse *pulses1[MAXPULSE], *pulses2[MAXPULSE];
|
||||
Pulse **clist, **nlist;
|
||||
int ncurpulses, nnextpulses;
|
||||
};
|
||||
extern Apr apr;
|
||||
void nextpulse(Apr *apr, Pulse *p);
|
||||
void *aprmain(void *p);
|
||||
|
||||
void initmem(void);
|
||||
void dumpmem(void);
|
||||
void wakemem(void);
|
||||
// 7-2, 7-10
|
||||
enum {
|
||||
MEMBUS_MA21 = 0000000000001,
|
||||
MEMBUS_WR_RQ = 0000000000004,
|
||||
MEMBUS_RD_RQ = 0000000000010,
|
||||
MEMBUS_MA_FMC_SEL0 = 0000001000000,
|
||||
MEMBUS_MA_FMC_SEL1 = 0000002000000,
|
||||
MEMBUS_MA35_0 = 0000004000000,
|
||||
MEMBUS_MA35_1 = 0000010000000,
|
||||
MEMBUS_MA21_0 = 0000020000000,
|
||||
MEMBUS_MA21_1 = 0000040000000,
|
||||
MEMBUS_MA20_0 = 0000100000000,
|
||||
MEMBUS_MA20_1 = 0000200000000,
|
||||
MEMBUS_MA19_0 = 0000400000000,
|
||||
MEMBUS_MA19_1 = 0001000000000,
|
||||
MEMBUS_MA18_0 = 0002000000000,
|
||||
MEMBUS_MA18_1 = 0004000000000,
|
||||
MEMBUS_RQ_CYC = 0020000000000,
|
||||
MEMBUS_WR_RS = 0100000000000,
|
||||
MEMBUS_MAI_RD_RS = 0200000000000,
|
||||
MEMBUS_MAI_ADDR_ACK = 0400000000000,
|
||||
};
|
||||
/* 0 is cable 1 & 2 (above bits); 1 is cable 3 & 4 (data) */
|
||||
extern word membus0, membus1;
|
||||
|
||||
// 7-10
|
||||
enum {
|
||||
IOBUS_PI_REQ_7 = F35,
|
||||
IOBUS_PI_REQ_6 = F34,
|
||||
IOBUS_PI_REQ_5 = F33,
|
||||
IOBUS_PI_REQ_4 = F32,
|
||||
IOBUS_PI_REQ_3 = F31,
|
||||
IOBUS_PI_REQ_2 = F30,
|
||||
IOBUS_PI_REQ_1 = F29,
|
||||
IOBUS_IOB_STATUS = F23,
|
||||
IOBUS_IOB_DATAI = F22,
|
||||
IOBUS_CONO_SET = F21,
|
||||
IOBUS_CONO_CLEAR = F20,
|
||||
IOBUS_DATAO_SET = F19,
|
||||
IOBUS_DATAO_CLEAR = F18,
|
||||
IOBUS_IOS9_1 = F17,
|
||||
IOBUS_IOS9_0 = F16,
|
||||
IOBUS_IOS8_1 = F15,
|
||||
IOBUS_IOS8_0 = F14,
|
||||
IOBUS_IOS7_1 = F13,
|
||||
IOBUS_IOS7_0 = F12,
|
||||
IOBUS_IOS6_1 = F11,
|
||||
IOBUS_IOS6_0 = F10,
|
||||
IOBUS_IOS5_1 = F9,
|
||||
IOBUS_IOS5_0 = F8,
|
||||
IOBUS_IOS4_1 = F7,
|
||||
IOBUS_IOS4_0 = F6,
|
||||
IOBUS_IOS3_1 = F5,
|
||||
IOBUS_IOS3_0 = F4,
|
||||
IOBUS_MC_DR_SPLIT = F3,
|
||||
IOBUS_POWER_ON = F1,
|
||||
IOBUS_IOB_RESET = F0,
|
||||
IOBUS_PULSES = IOBUS_CONO_SET | IOBUS_CONO_CLEAR |
|
||||
IOBUS_DATAO_SET | IOBUS_DATAO_CLEAR
|
||||
};
|
||||
/* 0 is cable 1 & 2 (data); 1 is cable 3 & 4 (above bits) */
|
||||
extern word iobus0, iobus1;
|
||||
/* record the state of iobus1 of the last pulse step
|
||||
* to recognize pulses or edges */
|
||||
extern word iobus1_last, iobus1_pulse;
|
||||
extern int iodev;
|
||||
|
||||
#define IOB_RESET (iobus1 & IOBUS_IOB_RESET)
|
||||
#define IOB_DATAO_CLEAR (iobus1 & IOBUS_DATAO_CLEAR)
|
||||
#define IOB_DATAO_SET (iobus1 & IOBUS_DATAO_SET)
|
||||
#define IOB_CONO_CLEAR (iobus1 & IOBUS_CONO_CLEAR)
|
||||
#define IOB_CONO_SET (iobus1 & IOBUS_CONO_SET)
|
||||
#define IOB_STATUS (iobus1 & IOBUS_IOB_STATUS)
|
||||
#define IOB_DATAI (iobus1 & IOBUS_IOB_DATAI)
|
||||
|
||||
/* every entry is a function to wake up the device */
|
||||
/* TODO: how to handle multiple APRs? */
|
||||
extern void (*iobusmap[128])(void);
|
||||
/* current PI req for each device */
|
||||
extern u8 ioreq[128];
|
||||
void recalc_req(void);
|
||||
|
||||
/*
|
||||
* Devices
|
||||
*/
|
||||
|
||||
void initapr(void);
|
||||
|
||||
#define CPA (0000>>2)
|
||||
#define PI (0004>>2)
|
||||
|
||||
/* TTY */
|
||||
#define TTY (0120>>2)
|
||||
typedef struct Tty Tty;
|
||||
struct Tty
|
||||
{
|
||||
uchar tto, tti;
|
||||
bool tto_busy, tto_flag;
|
||||
bool tti_busy, tti_flag;
|
||||
int pia;
|
||||
int fd;
|
||||
};
|
||||
extern Tty tty;
|
||||
void inittty(void);
|
||||
|
||||
/* Paper tape */
|
||||
#define PTP (0100>>2)
|
||||
typedef struct Ptp Ptp;
|
||||
struct Ptp
|
||||
{
|
||||
FILE *fp;
|
||||
uchar ptp;
|
||||
bool busy, flag, b;
|
||||
int pia;
|
||||
};
|
||||
#define PTR (0104>>2)
|
||||
typedef struct Ptr Ptr;
|
||||
struct Ptr
|
||||
{
|
||||
FILE *fp;
|
||||
int motor_on;
|
||||
word sr;
|
||||
word ptr;
|
||||
bool busy, flag, b;
|
||||
int pia;
|
||||
};
|
||||
extern Ptp ptp;
|
||||
extern Ptr ptr;
|
||||
void initpt(void);
|
||||
void ptr_setmotor(int m);
|
||||
|
||||
|
||||
|
||||
// for debugging
|
||||
char *names[0700];
|
||||
char *ionames[010];
|
||||
185
src/pt.c
Normal file
185
src/pt.c
Normal file
@@ -0,0 +1,185 @@
|
||||
#include "pdp6.h"
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <pthread.h>
|
||||
#include <poll.h>
|
||||
|
||||
Ptp ptp;
|
||||
Ptr ptr;
|
||||
|
||||
void
|
||||
recalc_ptp_req(void)
|
||||
{
|
||||
u8 req;
|
||||
req = ptp.flag ? ptp.pia : 0;
|
||||
if(req != ioreq[PTP]){
|
||||
ioreq[PTP] = req;
|
||||
recalc_req();
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
wake_ptp(void)
|
||||
{
|
||||
if(IOB_RESET){
|
||||
ptp.pia = 0;
|
||||
ptp.busy = 0;
|
||||
ptp.flag = 0;
|
||||
ptp.b = 0;
|
||||
}
|
||||
if(iodev == PTP){
|
||||
if(IOB_STATUS){
|
||||
if(ptp.b) iobus0 |= F30;
|
||||
if(ptp.busy) iobus0 |= F31;
|
||||
if(ptp.flag) iobus0 |= F32;
|
||||
iobus0 |= ptp.pia & 7;
|
||||
}
|
||||
if(IOB_CONO_SET){
|
||||
if(iobus0 & F30) ptp.b = 1;
|
||||
if(iobus0 & F31) ptp.busy = 1;
|
||||
if(iobus0 & F32) ptp.flag = 1;
|
||||
ptp.pia |= iobus0 & 7;
|
||||
}
|
||||
if(IOB_CONO_CLEAR){
|
||||
ptp.pia = 0;
|
||||
ptp.busy = 0;
|
||||
ptp.flag = 0;
|
||||
ptp.b = 0;
|
||||
}
|
||||
if(IOB_DATAO_CLEAR){
|
||||
ptp.ptp = 0;
|
||||
ptp.busy = 1;
|
||||
ptp.flag = 0;
|
||||
}
|
||||
if(IOB_DATAO_SET){
|
||||
ptp.ptp = iobus0 & 0377;
|
||||
if(ptp.fp){
|
||||
if(ptp.b)
|
||||
putc((ptp.ptp & 077) | 0200, ptp.fp);
|
||||
else
|
||||
putc(ptp.ptp, ptp.fp);
|
||||
}
|
||||
ptp.busy = 0;
|
||||
ptp.flag = 1;
|
||||
}
|
||||
}
|
||||
recalc_ptp_req();
|
||||
}
|
||||
|
||||
void
|
||||
recalc_ptr_req(void)
|
||||
{
|
||||
u8 req;
|
||||
req = ptr.flag ? ptr.pia : 0;
|
||||
if(req != ioreq[PTR]){
|
||||
ioreq[PTR] = req;
|
||||
recalc_req();
|
||||
}
|
||||
}
|
||||
|
||||
void*
|
||||
ptrthread(void *arg)
|
||||
{
|
||||
int c;
|
||||
for(;;){
|
||||
if(ptr.busy && ptr.motor_on){
|
||||
// PTR CLR
|
||||
ptr.sr = 0;
|
||||
ptr.ptr = 0;
|
||||
|
||||
next:
|
||||
if(ptr.fp)
|
||||
c = getc(ptr.fp);
|
||||
else
|
||||
c = 0;
|
||||
if(c == EOF)
|
||||
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){
|
||||
ptr.busy = 0;
|
||||
ptr.flag = 1;
|
||||
}else
|
||||
goto next;
|
||||
recalc_ptr_req();
|
||||
}
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
static void
|
||||
wake_ptr(void)
|
||||
{
|
||||
if(IOB_RESET){
|
||||
ptr.pia = 0;
|
||||
ptr.busy = 0;
|
||||
ptr.flag = 0;
|
||||
ptr.b = 0;
|
||||
}
|
||||
|
||||
if(iodev == PTR){
|
||||
if(IOB_STATUS){
|
||||
if(ptr.motor_on) iobus0 |= F27;
|
||||
if(ptr.b) iobus0 |= F30;
|
||||
if(ptr.busy) iobus0 |= F31;
|
||||
if(ptr.flag) iobus0 |= F32;
|
||||
iobus0 |= ptr.pia & 7;
|
||||
}
|
||||
if(IOB_DATAI){
|
||||
iobus0 |= ptr.ptr;
|
||||
debug(" PTR: %012lo\n", iobus0);
|
||||
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){
|
||||
if(iobus0 & F30) ptr.b = 1;
|
||||
if(iobus0 & F31) ptr.busy = 1;
|
||||
if(iobus0 & F32) ptr.flag = 1;
|
||||
ptr.pia |= iobus0 & 7;
|
||||
}
|
||||
}
|
||||
recalc_ptr_req();
|
||||
}
|
||||
|
||||
void
|
||||
ptr_setmotor(int m)
|
||||
{
|
||||
if(ptr.motor_on == m)
|
||||
return;
|
||||
ptr.motor_on = m;
|
||||
if(ptr.motor_on)
|
||||
ptr.busy = 0;
|
||||
ptr.flag = 1;
|
||||
recalc_ptr_req();
|
||||
}
|
||||
|
||||
void
|
||||
initpt(void)
|
||||
{
|
||||
pthread_t thread_id;
|
||||
ioreq[PTP] = 0;
|
||||
iobusmap[PTP] = wake_ptp;
|
||||
ioreq[PTR] = 0;
|
||||
iobusmap[PTR] = wake_ptr;
|
||||
pthread_create(&thread_id, nil, ptrthread, nil);
|
||||
|
||||
ptr.fp = fopen("../code/test.rim", "rb");
|
||||
ptp.fp = fopen("../code/ptp.out", "wb");
|
||||
}
|
||||
133
src/tty.c
Normal file
133
src/tty.c
Normal file
@@ -0,0 +1,133 @@
|
||||
#include "pdp6.h"
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <pthread.h>
|
||||
#include <poll.h>
|
||||
|
||||
Tty tty;
|
||||
|
||||
void
|
||||
recalc_tty_req(void)
|
||||
{
|
||||
u8 req;
|
||||
req = tty.tto_flag || tty.tti_flag ? tty.pia : 0;
|
||||
if(req != ioreq[TTY]){
|
||||
ioreq[TTY] = req;
|
||||
recalc_req();
|
||||
}
|
||||
}
|
||||
|
||||
void*
|
||||
ttythread(void *arg)
|
||||
{
|
||||
int sockfd, newsockfd, portno, clilen;
|
||||
char buf;
|
||||
struct sockaddr_in serv_addr, cli_addr;
|
||||
int n;
|
||||
|
||||
sockfd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if(sockfd < 0){
|
||||
perror("error: socket");
|
||||
exit(1);
|
||||
}
|
||||
memset(&serv_addr, 0, sizeof(serv_addr));
|
||||
portno = 6666;
|
||||
serv_addr.sin_family = AF_INET;
|
||||
serv_addr.sin_addr.s_addr = INADDR_ANY;
|
||||
serv_addr.sin_port = htons(portno);
|
||||
if(bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0){
|
||||
perror("error: bind");
|
||||
exit(1);
|
||||
}
|
||||
listen(sockfd,5);
|
||||
clilen = sizeof(cli_addr);
|
||||
|
||||
while(newsockfd = accept(sockfd, (struct sockaddr*)&cli_addr, &clilen)){
|
||||
printf("TTY attached\n");
|
||||
tty.fd = newsockfd;
|
||||
while(n = read(tty.fd, &buf, 1), n > 0){
|
||||
tty.tti_busy = 1;
|
||||
//fprintf(stderr, "(got.%c)", buf);
|
||||
tty.tti = buf|0200;
|
||||
tty.tti_busy = 0;
|
||||
tty.tti_flag = 1;
|
||||
recalc_tty_req();
|
||||
}
|
||||
tty.fd = -1;
|
||||
close(newsockfd);
|
||||
}
|
||||
if(newsockfd < 0){
|
||||
perror("error: accept");
|
||||
exit(1);
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
static void
|
||||
wake_tty(void)
|
||||
{
|
||||
if(IOB_RESET){
|
||||
tty.pia = 0;
|
||||
tty.tto_busy = 0;
|
||||
tty.tto_flag = 0;
|
||||
tty.tto = 0;
|
||||
tty.tti_busy = 0;
|
||||
tty.tti_flag = 0;
|
||||
tty.tti = 0;
|
||||
}
|
||||
if(iodev == TTY){
|
||||
if(IOB_STATUS){
|
||||
if(tty.tti_busy) iobus0 |= F29;
|
||||
if(tty.tti_flag) iobus0 |= F30;
|
||||
if(tty.tto_busy) iobus0 |= F31;
|
||||
if(tty.tto_flag) iobus0 |= F32;
|
||||
iobus0 |= tty.pia & 7;
|
||||
}
|
||||
if(IOB_DATAI){
|
||||
iobus0 |= tty.tti;
|
||||
tty.tti_flag = 0;
|
||||
}
|
||||
if(IOB_CONO_CLEAR)
|
||||
tty.pia = 0;
|
||||
if(IOB_CONO_SET){
|
||||
if(iobus0 & F25) tty.tti_busy = 0;
|
||||
if(iobus0 & F26) tty.tti_flag = 0;
|
||||
if(iobus0 & F27) tty.tto_busy = 0;
|
||||
if(iobus0 & F28) tty.tto_flag = 0;
|
||||
if(iobus0 & F29) tty.tti_busy = 1;
|
||||
if(iobus0 & F30) tty.tti_flag = 1;
|
||||
if(iobus0 & F31) tty.tto_busy = 1;
|
||||
if(iobus0 & F32) tty.tto_flag = 1;
|
||||
tty.pia |= iobus0 & 7;
|
||||
}
|
||||
if(IOB_DATAO_CLEAR){
|
||||
tty.tto = 0;
|
||||
tty.tto_busy = 1;
|
||||
tty.tto_flag = 0;
|
||||
}
|
||||
if(IOB_DATAO_SET){
|
||||
tty.tto = iobus0 & 0377;
|
||||
if(tty.fd >= 0){
|
||||
tty.tto &= ~0200;
|
||||
write(tty.fd, &tty.tto, 1);
|
||||
}
|
||||
// TTO DONE
|
||||
tty.tto_busy = 0;
|
||||
tty.tto_flag = 1;
|
||||
}
|
||||
}
|
||||
recalc_tty_req();
|
||||
}
|
||||
|
||||
void
|
||||
inittty(void)
|
||||
{
|
||||
pthread_t thread_id;
|
||||
tty.fd = -1;
|
||||
ioreq[TTY] = 0;
|
||||
pthread_create(&thread_id, nil, ttythread, nil);
|
||||
iobusmap[TTY] = wake_tty;
|
||||
}
|
||||
Reference in New Issue
Block a user