/* di2001.c
   L. Stewart November 8, 1982  2:58 PM
	   use variables in osstatics.c
   L. Stewart February 23, 1983  12:52 PM
	   don't use variables in osstatics.c
   LCS, April 21, 1983  11:50 AM, return on 0 count
 */

#include	"Ec.h"
#include	"Env.h"
#include	"Queue.h"
#include	"Lark.h"
#include	"Encrypt.h"

/* interrupts */
extern EnableInt();
extern IWDC();
extern DWDC();

/* queue */
extern Enqueue();
extern Dequeue();
extern InitQueue();

/* machine code */
extern Crypt();
extern EncEnd();
extern ResetEncInt();

/* runtime */
extern Call1();
extern CallDebugger();
extern MoveBlock();

struct Queue enciq;
struct ECB *ecbwork;

Encrypt(p)
  struct ECB *p;
  {
  if (p->proc == 0) CallDebugger(0x8008);
  if (p->count == 0) {
    Call1(p->proc, p->item);
    return;
    };
  if (p->kp == 0) {
    MoveBlock(p->dstp, p->srcp, p->count >> 1);
    Call1(p->proc, p->item);
    };
  else {
    Enqueue(&enciq, p);
    IWDC();		/* don't think this is needed */
    if (ecbwork == 0) {
      ecbwork = Dequeue(&enciq);
      if (ecbwork != 0) {
        if (!Crypt(ecbwork)) CallDebugger(0x8001);
        };
      };
    DWDC();		/* don't think this is needed */
    };
  };
  
static myEncInt()
  {
  struct ECB *p;
  if (!EncEnd()) CallDebugger(0x8007);	/* shut down dma */
  if (ecbwork == 0) {
    DoEOI();
    CallDebugger(0x8006);
    };
  p = ecbwork;
  ResetEncInt();
  ecbwork = Dequeue(&enciq);
  if (ecbwork != 0) {
    if (!Crypt(ecbwork)) {
      DoEOI();
      CallDebugger(0x8001);
      };
    };
  Call1(p->proc, p->item);  /* called at interrupt level */
  return(true);
  };

InitEncrypt()
  {
  ResetEncInt();
  InitQueue(&enciq);
  ecbwork = 0;
  EnableInt(&myEncInt, EncTyp);
  };

/*
  November 2, 1982  10:37 AM check for 0 key and BLT
	reverse sense of return arg from Crypt
  November 2, 1982  10:43 AM check for no slave TC (!EncEnd)
 */