/* * 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 #include #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