/* testd2001.c   20 Dec. 1981 4:37 pm PST (Sunday)   */

extern char IRESET, I9513, I8237;
extern int encrypt(), decrypt(), encend(), chav();
extern char getchar();

char key[8], plain[160], cypher[160], res[160];
struct ecb {
  char *kp, *srcp, *dstp;
  int count;
  };

struct ecb cbe, cbd;

/*  Test DMA encryption */

main()
  {
  char c;
  int i;
  putstring("\rDMA 2001 test, ? for help.\r");
  portstr(&IRESET);
  audoff();
  portstr(&I9513);
  portstr(&I8237);
  audon();
  for (i=0; i<8; i++) key[i] = 0x01;
  for (i=0; i<160; i++) plain[i] = i;
  cbe.kp = key;
  cbe.srcp = plain;
  cbe.dstp = cypher;
  cbe.count = 160;
  cbd.kp = key;
  cbd.srcp = cypher;
  cbd.dstp = res;
  cbd.count = 160;
  for (;;) {
      c = getchar() & 0177;
      switch (c) {
        case 'q': {
          putstring("\rQuit!\r");
          return;
          };
        case '?': {
          help();
          break;
          };
        case 'f': {
          putstring("\rfast\r");
          while (!chav()) once(&cbe, &cbd);
          getchar();
          break;
          };
        case ' ': {
          once(&cbe, &cbd);
          putchar('.');
          break;
          };
        default: putstring("\r unknown command\r");
        };
 };  /* end of forever loop */
 };

help()
  {
  putstring("\rq: quit, (sp): once, ?: help\r");
  putstring("f: fast");
  };

once(a, b)
  struct ecb *a, *b;
  {
  int i;
  pioaon(1);
  if (encrypt(a)) { putchar('k'); return; };
  while (!encend());
  if (decrypt(b)) { putchar('k'); return; };
  while (!encend());
  pioaoff(1);
  for (i=0; i<160; i++) {
    if (plain[i] != res[i]) {
      putchar('#');
      break;
      };
    };
  };