/* TestSignal.c
 June 21, 1982  4:55 PM */

#include <Alloc.h>
#include <Signal.h>
#include <Env.h>

extern int *Alloc();
extern Deb();
extern int *MyFrame();
extern struct ZN *GetAll();

struct ZN *sysZone;
int sig1, sig2, sig3;
int sigResult;
int *sigVec;

/* TEMP */ int adrPA, adrPS, adrPU, adrPUE, adrGetSigVec; /* TEMP */
main() {
  struct Seal s1, su, sa, su2;
  /* TEMP */ adrs(); /* TEMP */
  sysZone = GetAll();
  sigResult = CONTINUE;
  sigVec = Alloc(sysZone, 100);
  SigInit(sigVec, 100, adrGetSigVec);
  TestPurger();
  if (ENABLE(ANY, adrPA, &sa)) { Deb("Continue from ANY"); };
  sig1=CODE();sig2=CODE();sig3=CODE();
  if (ENABLE(sig1, adrPS, &s1)) { Deb("Continue from Sig1"); P5() };
  else { 
    ENABLE(UNWIND, adrPU, &su);
    ENABLE(UNWIND, adrPU, &su2);
    P2(); };
  Deb("Called P2 from Test");
  EnableUnwind(&su);
  P2();};

Deb(msg) char *msg; {
  Wf1("%s\r", msg);
  getchar(); };

int PS(sig, code, seal)
	int sig, code; struct Seal *seal; { Deb("Sig Caught"); return sigResult; };
int PU(sig, code, seal)
	int sig, code; struct Seal *seal; { Deb("Unwinding");  };
int PA(sig, code, seal)
	int sig, code; struct Seal *seal; { Deb("Any Caught"); return sigResult; };

EnableUnwind(seal) struct Seal *seal; {
  ENABLEWithFrame(UNWIND, adrPUE, seal, MyFrame()); };

PUE(sign, code, seal)
	int sign, code; struct Seal *seal; { Deb("Unwinding, the hard way"); };

P2() {
  P3();
  Deb("Called P3 from P2");
  };

P3() {
  struct Seal s3;
  ENABLE(UNWIND, adrPU, &s3);
  P4();
  Deb("Called P4 from P3");
  };

P4() {
  SIGNAL(sig1, 3);
  Deb("Resumed after raising sig1 in P4");
  };

P5() {
  Deb("Call P5 from Continue code in Test");
  };

TestPurger() {
  struct Seal1 seal, seal2;
  ENABLE(sig1, adrPU, &seal);
  DISABLE(&seal);
  ENABLE(sig1, adrPU, &seal2); /* 1 */
  TP1(); /* 2 */
  ENABLE(sig1, adrPU, &seal2); }; /* 1 */

TP1() {
  struct Seal1 seal;
  ENABLE(sig1, adrPU, &seal); /* 2 */
  TP2(); /* 3 */
  TP3(); /* 3 */
  ENABLE(sig1, adrPU, &seal); /* 2 */
  };
  
TP2() {
  TP3(); }; /* 3 */

TP3() {
  struct Seal1 seal;
  ENABLE(sig1, adrPU, &seal); /* 3 */
  };

int *GetSigVec() { return sigVec; };

adrs() /* TEMP until &P works */
  {
  #asm
  MOV	←adrPA,OFFSET ←PA
  MOV	←adrPS,OFFSET ←PS
  MOV	←adrPU,OFFSET ←PU
  MOV	←adrPUE,OFFSET ←PUE
  MOV	←adrGetSigVec,OFFSET ←GetSigVec
  #endasm
  };