blob: 3d7ce2974cac7b662a9c70b4002ff5ebf64f8b33 [file] [log] [blame] [raw]
/*
* 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