| /* | |
| * debug output, no display: | |
| * cc -g -o tst340 tst340.c type340.c -DTY340_NODISPLAY -DDEBUG_TY340 | |
| * | |
| * w/ display: | |
| * cc -g -o tst340 tst340.c type340.c display.c x11.c -lm -lX11 -lXt | |
| */ | |
| // possible source of test code | |
| // light pen diag: | |
| // http://bitsavers.informatik.uni-stuttgart.de/pdf/dec/pdp7/DIGITAL-7-78-M_370LightPenDiag_Apr64.pdf | |
| #include <stdio.h> | |
| #include <unistd.h> | |
| #include "display.h" | |
| #include "type340.h" | |
| #include "type340cmd.h" | |
| void dump(int *ip); | |
| int words[] = { | |
| #if 0 | |
| // 11sim! | |
| 020154, | |
| 0221000, | |
| 0120000, | |
| 0600001, | |
| 020000, | |
| 0220000, | |
| 0121000, | |
| 0600400, | |
| 03000 | |
| #elif 1 | |
| // p budne: character test | |
| MPT, /* param: point mode */ | |
| MPT|H|0, /* point: h=0; point mode */ | |
| MPAR|V|512, /* point: v=64; par mode */ | |
| MCHR|S3|IN7, /* param: chr mode, size 3, intensity 7 */ | |
| CHAR('H'-'@', 'E'-'@', 'L'-'@'), | |
| CHAR('L'-'@', 'O'-'@', ' '), | |
| CHAR('W'-'@', 'O'-'@', 'R'-'@'), | |
| CHAR('L'-'@', 'D'-'@', '!'), | |
| CHAR(' ', 0, 037), | |
| MCHR|S2|IN7, /* param: chr mode, size 2, intensity 7 */ | |
| CHAR(CHRCR, CHRLF, 'H'-'@'), | |
| CHAR('E'-'@', 'L'-'@', 'L'-'@'), | |
| CHAR('O'-'@', ' ', 'W'-'@'), | |
| CHAR('O'-'@', 'R'-'@', 'L'-'@'), | |
| CHAR('D'-'@', '!', CHRESC), | |
| MCHR|S1|IN7, /* param: chr mode, size 1, intensity 7 */ | |
| CHAR(CHRCR, CHRLF, 'H'-'@'), | |
| CHAR('E'-'@', 'L'-'@', 'L'-'@'), | |
| CHAR('O'-'@', ' ', 'W'-'@'), | |
| CHAR('O'-'@', 'R'-'@', 'L'-'@'), | |
| CHAR('D'-'@', '!', CHRESC), | |
| MCHR|S0|IN2, /* param: chr mode, size 0, intensity 2 */ | |
| CHAR(CHRUC, CHRCR, CHRLF), | |
| CHAR(000, 001, 002), CHAR(003, 004, 005), CHAR(006, 007, ' '), | |
| CHAR(010, 011, 012), CHAR(013, 014, 015), CHAR(016, 017, ' '), | |
| CHAR(020, 021, 022), CHAR(023, 024, 025), CHAR(026, 027, ' '), | |
| CHAR(030, 031, 032), /* 33-37 are control codes */ | |
| CHAR(040, 041, 042), CHAR(043, 044, 045), CHAR(046, 047, ' '), | |
| CHAR(050, 051, 052), CHAR(053, 054, 055), CHAR(056, 057, ' '), | |
| CHAR(060, 061, 062), CHAR(063, 064, 065), CHAR(066, 067, ' '), | |
| CHAR(070, 071, 072), CHAR(073, 074, 075), CHAR(076, 077, ' '), | |
| CHAR(CHRESC, CHRESC, CHRESC), | |
| MCHR|S2|IN7, | |
| CHAR(CHRLC, CHRCR, CHRLF), | |
| CHAR(000, 001, 002), CHAR(003, 004, 005), CHAR(006, 007, ' '), | |
| CHAR(010, 011, 012), CHAR(013, 014, 015), CHAR(016, 017, ' '), | |
| CHAR(020, 021, 022), CHAR(023, 024, 025), CHAR(026, 027, ' '), | |
| CHAR(030, 031, 032), | |
| CHAR(CHRESC, 0, 0), | |
| STP | |
| #elif 1 | |
| /* | |
| 030153: PT LPOFF S2 IN3 | |
| 221000: PT V 512. | |
| 103000: VCT IP H 512. | |
| 703100: ESCP INSFY DN YP4 YP2 RT XP64 | |
| 140000: INCR | |
| 304210: INSFY INCRPT( PR, PR, PR, PR) | |
| 325063: INSFY INCRPT( PUR, PUR, PD, PD) | |
| 631777: ESCP INSFY INCRPT( PD, PD, PDL, PDL) | |
| 100000: VCT | |
| 600210: ESCP INSFY LT XP8 | |
| 140000: INCR | |
| 237463: INSFY INCRPT( PD, PDL, PD, PD) | |
| 231673: INSFY INCRPT( PD, PD, PDR, PDR) | |
| 704210: ESCP INSFY INCRPT( PR, PR, PR, PR) | |
| 100000: VCT | |
| 203400: INSFY UP YP4 YP2 YP1 | |
| 600203: ESCP INSFY LT XP2 XP1 | |
| 140000: INCR | |
| 377463: INSFY INCRPT( PDL, PDL, PD, PD) | |
| 631273: ESCP INSFY INCRPT( PD, PU, PDR, PDR) | |
| 002000: PAR STOP | |
| */ | |
| // H-340_Type_340_Precision_Incremental_CRT_System_Nov64.pdf | |
| MPT|LPON|S2|IN3, // 0030133, /* set params */ | |
| MPT|V|512, // 0220000, /* y axis */ | |
| MVCT|H|IP|512, // 0103760, /* x axis, draw line */ | |
| ESCP|INSFY|DN|YP4|YP2|XP64, // 0703100, /* draw curve */ | |
| MINCR, // 0140000, /* set mode */ | |
| INSFY|INCRPT(PR,PR,PR,PR), // 0304210, /* draw curve */ | |
| INSFY|INCRPT(PUR,PUR,PD,PD), // 0325063, /* draw curve */ | |
| ESCP|INSFY|INCRPT(PD,PD,PDL,PDL), // 0631777, | |
| MVCT, // 0100000, /* set mode */ | |
| ESCP|INSFY|LT|XP8, // 0600210, /* draw line */ | |
| MINCR, // 0140000, /* set mode */ | |
| 0237463, /* draw curve */ | |
| 0231673, /* draw curve */ | |
| 0704210, /* draw curve */ | |
| 0100000, /* set mode */ | |
| 0203400, /* draw line */ | |
| 0600203, /* draw line */ | |
| 0140000, /* set mode */ | |
| 0377463, /* draw curve */ | |
| 0631273, /* draw curve */ | |
| #if 0 | |
| #endif | |
| 0002000, /* stop, set done, send data interrupt */ | |
| #else | |
| // ITS SYSTEM;DDT > @ RECYC | |
| 0020157, | |
| 0261777 | |
| #endif | |
| }; | |
| int | |
| main() { | |
| #ifdef DUMP | |
| dump(words); | |
| #endif | |
| for (;;) { | |
| ty340_reset(); | |
| for (unsigned i = 0; i < sizeof(words)/sizeof(words[0]); i++) { | |
| #ifdef TY340_NODISPLAY | |
| putchar('\n'); | |
| #endif | |
| int s = ty340_instruction(words[i]); | |
| #ifdef TY340_NODISPLAY | |
| printf(" status %#o\n", s); | |
| #endif | |
| if (s & ST340_STOPPED) | |
| break; | |
| /* XXX check for LPHIT? fetch coordinates */ | |
| } | |
| #ifdef TY340_NODISPLAY | |
| break; | |
| #else | |
| display_age(1000, 1); | |
| display_sync(); | |
| #endif | |
| } | |
| } | |
| ty340word | |
| ty340_fetch(ty340word addr) { | |
| printf("ty340_fetch %#o\n", addr); | |
| return 0; | |
| } | |
| void | |
| ty340_store(ty340word addr, ty340word value) { | |
| printf("ty340_store %#o %#o\n", addr, value); | |
| } | |
| void | |
| ty340_cond_int(ty340word status) { | |
| /*printf("ty340_stop_int\n");*/ | |
| } | |
| void | |
| ty340_lp_int(ty340word x, ty340word y) { | |
| printf("ty340_lp_int %d. %d.\n", x, y); | |
| } | |
| void | |
| ty340_rfd(void) { /* request for data */ | |
| #ifdef TY340_NODISPLAY | |
| puts("ty340_rfd"); | |
| #endif | |
| } | |
| void | |
| cpu_get_switches(unsigned long *p1, unsigned long *p2) { | |
| } | |
| void | |
| cpu_set_switches(unsigned long sw1, unsigned long sw2) { | |
| } | |
| /**************************************************************** | |
| * dump display list using symbols from type340cmd.h | |
| */ | |
| #ifdef DUMP | |
| // Vector & incremental modes | |
| static int | |
| escpinsfy(int word) | |
| { | |
| int ret = 0; | |
| if (word & ESCP) { | |
| printf(" ESCP"); | |
| ret = 1; | |
| } | |
| if (word & INSFY) | |
| printf(" INSFY"); | |
| return ret; | |
| } | |
| static void | |
| incr(int pt) | |
| { | |
| pt &= 017; | |
| //printf(" %#o", pt); | |
| switch (pt) { | |
| #define P(X) case X: printf(" " #X); return | |
| P(PR); | |
| P(PL); | |
| P(PU); | |
| P(PD); | |
| P(PUL); | |
| P(PUR); | |
| P(PDL); | |
| P(PDR); | |
| } | |
| printf(" ???"); | |
| } | |
| // PAR, SLV, POINT | |
| static int | |
| xmode(int word) | |
| { | |
| int m = word & MODEMASK; | |
| switch (m) { | |
| #define M(MODE) case MODE: printf(#MODE); break | |
| M(MPAR); | |
| M(MPT); | |
| M(MSLV); | |
| M(MCHR); | |
| M(MVCT); | |
| M(MVCTC); | |
| M(MINCR); | |
| M(MSUBR); | |
| default: printf("M??"); break; /* SNH */ | |
| } | |
| return m; | |
| } | |
| /* returns 1 if not stopped */ | |
| int | |
| dump1(int *mp, int word) | |
| { | |
| int run = 1; | |
| printf("%06o: ", word); | |
| switch (*mp) { | |
| case MPAR: | |
| *mp = xmode(word); | |
| // XXX look at reserved bits: 0300600?? | |
| if (word & LPOFF) { | |
| if ((word & LPON) == LPON) | |
| printf(" LPON"); | |
| else | |
| printf(" LPOFF"); | |
| } | |
| if (word & STP) { | |
| if ((word & STP) == STP) | |
| printf(" STP"); | |
| else | |
| printf(" STOP"); | |
| run = 0; | |
| } | |
| switch (word & S3) { | |
| case S0: printf(" S0"); break; | |
| case S1: printf(" S1"); break; | |
| case S2: printf(" S2"); break; | |
| case S3: printf(" S3"); break; | |
| } | |
| switch (word & IN7) { | |
| case IN0: printf(" IN0"); break; | |
| case IN1: printf(" IN1"); break; | |
| case IN2: printf(" IN2"); break; | |
| case IN3: printf(" IN3"); break; | |
| case IN4: printf(" IN4"); break; | |
| case IN5: printf(" IN5"); break; | |
| case IN6: printf(" IN6"); break; | |
| case IN7: printf(" IN7"); break; | |
| } | |
| break; | |
| case MPT: | |
| // 0400000 reserved | |
| *mp = xmode(word); | |
| if (word & IP) printf(" IP"); | |
| if (word & V) printf(" V"); | |
| else printf(" H"); | |
| printf(" %d.", word & 01777); | |
| break; | |
| case MSLV: | |
| *mp = xmode(word); | |
| // reserved: 010000 | |
| printf(" XXX SLAVE"); | |
| break; | |
| case MCHR: | |
| printf(" XXX CHR"); | |
| if ((word>>12)&077 == 037 || | |
| (word>>6)&077 == 037 || | |
| (word&077) == 037) | |
| *mp = 0; | |
| case MVCT: | |
| case MVCTC: | |
| if (escpinsfy(word)) *mp = 0; | |
| if (word & 077400) { | |
| if (word & DN) printf(" DN"); | |
| else printf(" UP"); | |
| if (word & YP64) printf(" YP64"); | |
| if (word & YP32) printf(" YP32"); | |
| if (word & YP16) printf(" YP16"); | |
| if (word & YP8) printf(" YP8"); | |
| if (word & YP4) printf(" YP4"); | |
| if (word & YP2) printf(" YP2"); | |
| if (word & YP1) printf(" YP1"); | |
| } | |
| if (word & 0377) { | |
| if (word & LT) printf(" LT"); | |
| else printf(" RT"); | |
| if (word & XP64) printf(" XP64"); | |
| if (word & XP32) printf(" XP32"); | |
| if (word & XP16) printf(" XP16"); | |
| if (word & XP8) printf(" XP8"); | |
| if (word & XP4) printf(" XP4"); | |
| if (word & XP2) printf(" XP2"); | |
| if (word & XP1) printf(" XP1"); | |
| } | |
| break; | |
| case MINCR: | |
| if (escpinsfy(word)) *mp = 0; | |
| printf(" INCRPT("); | |
| incr(word >> 12); putchar(','); | |
| incr(word >> 8); putchar(','); | |
| incr(word >> 4); putchar(','); | |
| incr(word); putchar(')'); | |
| break; | |
| case MSUBR: | |
| puts("XXX SUBR: quitting"); | |
| run = 0; | |
| break; | |
| } | |
| putchar('\n'); | |
| return run; | |
| } | |
| void | |
| dump(int *ip) | |
| { | |
| int mode = 0; | |
| puts(" === DUMP ==="); | |
| while (dump1(&mode, *ip++)) | |
| ; | |
| puts("=== END DUMP ==="); | |
| } | |
| #endif |