/* testref.c   Stewart, March 26, 1982  1:35 PM   */

extern char I9513, I8259, I8255;
extern int clklo, clkhi;
int dots;

/*  set up 8259 to use two channels, the
  audio interrupt channel, and the prog. timer
  channel.  The audio interrupt will be set up
  (in the 9513) to produce an interrupt every 3 or
  4 seconds.  the programmable timer will be set up
  to produce an interrupt every millisecond.  
  The audio interrupts will print different characters by
   printing them directly from the service routine */

main()
  {
  char c;
  intoff();
  putstring("\rRefresh test, ? for help.\r");
  portstr(&I8255);
  audclk(0);
  portstr(&I9513);
  audclk(1);
  portstr(&I8259);
  intinit();
  dots = 0;
  for (;;) {
      c = getchar() & 0177;
      switch (c) {
        case 'q': {
          putstring("\rQuit!\r");
          return;
          };
        case '?': {
          help();
          break;
          };
        case 'i': {
          putstring("\rinterrupts on");
          inton();
          break;
          };
        case 'o': {
          putstring("\rinterrupts off");
          intoff();
          break;
          };
        case 'a': {
          putstring("\raudio int: ");
          doaudi();
          break;
          };
        case 'r': {
          putstring("\rrefresh int: ");
          dorefi();
          break;
          };
        case 'c': {
          ptime();
          break;
          };
        default: putstring("\r unknown command");
        };
   putchar('\r');
 };  /* end of forever loop */
 };

help()
  {
  putstring("\rq: quit, ?: help\r");
  putstring("i: int on, o: int off, a: audio int\r");
  putstring("c: time, r: refresh int\r");
  };

ptime()
  {
  putstring("\rclk = ");
  putnum(clkhi, 16);
  putchar(' ');
  putnum(clklo, 16);
  putstring("\r");
  };

audclk(on)
  int on;
  {
  if (on) on = 002;
  else on = 000;
  outbyte(0x00D1, on);
  };

audini()
  {
  int i;
  i = 2;
  };