head     56.3;
access   paws bayes jws quist brad dew jwh;
symbols  ;
locks    ; strict;
comment  @# @;


56.3
date     93.01.27.13.28.25;  author jwh;  state Exp;
branches ;
next     56.2;

56.2
date     93.01.27.12.06.16;  author jwh;  state Exp;
branches ;
next     56.1;

56.1
date     91.11.05.09.49.28;  author jwh;  state Exp;
branches ;
next     55.1;

55.1
date     91.08.25.10.25.44;  author jwh;  state Exp;
branches ;
next     54.1;

54.1
date     91.03.18.15.28.51;  author jwh;  state Exp;
branches ;
next     53.1;

53.1
date     91.03.11.19.29.18;  author jwh;  state Exp;
branches ;
next     52.1;

52.1
date     91.02.19.09.13.19;  author jwh;  state Exp;
branches ;
next     51.1;

51.1
date     91.01.30.16.13.07;  author jwh;  state Exp;
branches ;
next     50.1;

50.1
date     90.10.29.16.27.40;  author jwh;  state Exp;
branches ;
next     49.1;

49.1
date     90.08.14.14.11.57;  author jwh;  state Exp;
branches ;
next     48.1;

48.1
date     90.07.26.11.18.12;  author jwh;  state Exp;
branches ;
next     47.1;

47.1
date     90.05.14.11.01.40;  author dew;  state Exp;
branches ;
next     46.1;

46.1
date     90.05.07.08.48.44;  author jwh;  state Exp;
branches ;
next     45.1;

45.1
date     90.04.19.15.56.39;  author jwh;  state Exp;
branches ;
next     44.1;

44.1
date     90.04.01.22.13.43;  author jwh;  state Exp;
branches ;
next     43.1;

43.1
date     90.03.20.14.05.41;  author jwh;  state Exp;
branches ;
next     42.1;

42.1
date     90.01.23.17.50.29;  author jwh;  state Exp;
branches ;
next     41.1;

41.1
date     89.12.22.11.32.23;  author jwh;  state Exp;
branches ;
next     40.1;

40.1
date     89.09.29.11.54.10;  author jwh;  state Exp;
branches ;
next     39.1;

39.1
date     89.09.26.16.38.40;  author dew;  state Exp;
branches ;
next     38.1;

38.1
date     89.08.29.11.30.33;  author jwh;  state Exp;
branches ;
next     37.1;

37.1
date     89.05.12.11.43.30;  author dew;  state Exp;
branches ;
next     36.1;

36.1
date     89.02.06.10.21.35;  author dew;  state Exp;
branches ;
next     35.1;

35.1
date     89.02.02.13.36.48;  author dew;  state Exp;
branches ;
next     34.1;

34.1
date     89.01.23.16.11.55;  author jwh;  state Exp;
branches ;
next     33.1;

33.1
date     89.01.16.11.43.42;  author dew;  state Exp;
branches ;
next     32.1;

32.1
date     89.01.10.11.52.32;  author bayes;  state Exp;
branches ;
next     31.1;

31.1
date     88.12.14.18.13.37;  author bayes;  state Exp;
branches ;
next     30.1;

30.1
date     88.12.09.13.50.31;  author dew;  state Exp;
branches ;
next     29.1;

29.1
date     88.10.31.15.35.28;  author bayes;  state Exp;
branches ;
next     28.1;

28.1
date     88.10.06.11.01.56;  author dew;  state Exp;
branches ;
next     27.1;

27.1
date     88.09.29.11.40.37;  author bayes;  state Exp;
branches ;
next     26.1;

26.1
date     88.09.28.13.18.47;  author bayes;  state Exp;
branches ;
next     25.1;

25.1
date     88.03.02.09.35.17;  author bayes;  state Exp;
branches ;
next     24.1;

24.1
date     87.08.31.09.58.47;  author jws;  state Exp;
branches ;
next     23.1;

23.1
date     87.08.26.10.37.13;  author bayes;  state Exp;
branches ;
next     22.1;

22.1
date     87.08.17.11.22.42;  author bayes;  state Exp;
branches ;
next     21.1;

21.1
date     87.08.12.14.05.21;  author bayes;  state Exp;
branches ;
next     20.1;

20.1
date     87.07.30.11.18.51;  author bayes;  state Exp;
branches ;
next     19.1;

19.1
date     87.06.01.08.32.47;  author jws;  state Exp;
branches ;
next     18.1;

18.1
date     87.05.20.15.33.17;  author bayes;  state Exp;
branches ;
next     17.1;

17.1
date     87.04.30.10.43.37;  author jws;  state Exp;
branches ;
next     16.1;

16.1
date     87.04.26.15.55.18;  author jws;  state Exp;
branches ;
next     15.1;

15.1
date     87.04.13.09.31.57;  author jws;  state Exp;
branches ;
next     14.1;

14.1
date     87.04.01.15.38.36;  author jws;  state Exp;
branches ;
next     13.2;

13.2
date     87.04.01.10.34.44;  author jws;  state Exp;
branches ;
next     13.1;

13.1
date     87.02.28.18.39.50;  author jws;  state Exp;
branches ;
next     12.1;

12.1
date     87.02.02.13.31.17;  author jws;  state Exp;
branches ;
next     11.1;

11.1
date     87.01.19.09.57.47;  author jws;  state Exp;
branches ;
next     10.1;

10.1
date     86.12.24.11.07.10;  author jws;  state Exp;
branches ;
next     9.1;

9.1
date     86.12.12.14.50.57;  author bayes;  state Exp;
branches ;
next     8.1;

8.1
date     86.11.27.12.05.37;  author jws;  state Exp;
branches ;
next     7.1;

7.1
date     86.11.20.13.59.59;  author hal;  state Exp;
branches ;
next     6.1;

6.1
date     86.11.04.18.09.36;  author paws;  state Exp;
branches ;
next     5.1;

5.1
date     86.10.28.16.58.06;  author hal;  state Exp;
branches ;
next     4.1;

4.1
date     86.09.30.19.55.07;  author hal;  state Exp;
branches ;
next     3.1;

3.1
date     86.09.01.12.05.26;  author hal;  state Exp;
branches ;
next     2.1;

2.1
date     86.07.30.14.54.00;  author hal;  state Exp;
branches ;
next     1.1;

1.1
date     86.06.30.15.41.38;  author danm;  state tmp;
branches ;
next     ;


desc
@Base file for PWS 3.2 release.

@


56.3
log
@
pws2rcs automatic delta on Wed Jan 27 13:14:25 MST 1993
@
text
@					      (*

 (c) Copyright Hewlett-Packard Company, 1984.
All rights are reserved.  Copying or other
reproduction of this program except for archival
purposes is prohibited without the prior
written consent of Hewlett-Packard Company.


	    RESTRICTED RIGHTS LEGEND

Use, duplication, or disclosure by the Government
is subject to restrictions as set forth in
paragraph (b) (3) (B) of the Rights in Technical
Data and Computer Software clause in
DAR 7-104.9(a).

HEWLETT-PACKARD COMPANY
Fort Collins, Colorado                         *)

$SYSPROG$
$RANGE OFF$  $DEBUG OFF$
$ALLOW_PACKED ON$ {JWS 3/31/87}
MODULE EDRIVER;
IMPORT SYSGLOBALS,IODECLARATIONS,ASM;
EXPORT
  TYPE
    EPINFOREC = RECORD
		  BFAST   : BOOLEAN;
		  EPSTART : INTEGER;
		  EPEND   : INTEGER;
		END;

    EOPTYPE = (EREAD,EWRITE,ECWRITE,EBLANK,ECHECK);
    EPERROR = (ENOERROR,ENOTPROG,ENOEPROM,ECFAIL,EPFAIL,ENOTBLANK,EBADARGS);

    FUNCTION EPROG(      SCODE   : INTEGER;
			 OP      : EOPTYPE;
		  ANYVAR BUFFER  : WINDOW;
			 BUFSIZE : INTEGER;
		     VAR POSIT   : INTEGER):EPERROR;

    FUNCTION EGETINFO(   SCODE : INTEGER;
		      VAR INFO : EPINFOREC):EPERROR;

    FUNCTION EINIT(SCODE : INTEGER):EPERROR;

    FUNCTION EBRATE(SCODE : INTEGER;
		    BRATE : BOOLEAN):EPERROR;

IMPLEMENT
  TYPE
    EPOPTYPE = (EPINIT,EPREAD,EPWRITE,EPCWRITE,EPBLANK,EPCHECK,EPBRATE,EPINFO);
    STATREG= PACKED RECORD
	       B4  : BYTE;  { PUT HERE TO MAKE THE COMPILER HAPPY }
	       PAD : 0..15; { 7,6,5,4 }
	       FAST: BOOLEAN;
	       ACCS: BOOLEAN;
	       ENAB: BOOLEAN;
	       BUSY: BOOLEAN;
	     END;
    EPTYPE = PACKED RECORD
	       B0 : BYTE;
	       ID : BYTE;
	       B2 : BYTE;
	       B3 : BYTE;
	       CASE BOOLEAN OF
	       TRUE:(CONTROL:STATREG);
	       FALSE:(STATUS:STATREG);
	     END;
    EPTR = ^EPTYPE;
    INFOPTR = ^EPINFOREC;


  PROCEDURE EPPROG(       SCODE   : INTEGER;
			  OP      : EPOPTYPE;
		   ANYVAR BUFFER  : WINDOW;
			  BUFSIZE : INTEGER;
		      VAR POSIT   : INTEGER;
		      VAR ECODE   : EPERROR);
  CONST
    LO_ROM = HEX('20000');  { 128k }
    HI_ROM = HEX('200000'); { 2048k }
    STEPSIZE = HEX('20000');{ 128k }
  TYPE
    TWOBYTES = PACKED ARRAY[0..1] OF CHAR;
    BREC = RECORD
	     CASE INTEGER OF
	     0: (INT:INTEGER);
	     1: (BPTR:^BYTE);
	     2: (WPTR:^TWOBYTES);
	     3: (CPTR:^CHAR);
	     4: (WINPTR:WINDOWP);
	   END;

  VAR
    CARD        : EPTR;
    PBYTE       : BREC;
    DUMMY       : INTEGER;
    DONE        : BOOLEAN;
    ENDSCAN     : INTEGER;
    I           : INTEGER;
    WBYTES      : TWOBYTES;
    INFO        : INFOPTR;

    PROCEDURE BADIO(ECCODE:EPERROR);
    BEGIN
      ECODE := ECCODE; ESCAPE(0);
    END;

    PROCEDURE SETUP;
    BEGIN
      WITH INFO^ DO
      BEGIN
	IF EPSTART=0 THEN BADIO(ENOEPROM);
	ENDSCAN := POSIT + BUFSIZE;
	IF (POSIT<EPSTART) OR (ENDSCAN>EPEND) THEN BADIO(EBADARGS);
	PBYTE.INT := POSIT;
	DONE := FALSE;
      END;
    END;

    PROCEDURE GETINFO(ANYVAR UINFO : EPINFOREC);
    BEGIN
      UINFO := INFO^;
    END;

  BEGIN { EPPROG }
    ECODE := ENOERROR;
    TRY
      { VALIDATE THE SELECT CODE }
      IF (SCODE<IOMINISC) OR (SCODE>IOMAXISC) THEN BADIO(ENOTPROG);
      WITH ISC_TABLE[SCODE] DO
      BEGIN
	CARD := CARD_PTR;
	IF (CARD=NIL) OR (CARD_TYPE=0) THEN BADIO(ENOTPROG);
	IF ((CARD_TYPE=1) AND (CARD_ID=0)) OR
	   ((CARD_TYPE=9) AND (CARD_ID=27)) THEN
	BEGIN
	  IF CARD^.ID<>27 THEN BADIO(ENOTPROG);
	END
	ELSE BADIO(ENOTPROG);
	INFO := ADDR(IO_TMP_PTR^.DRV_MISC);
      END;
      CASE OP OF
      EPINIT:   { INITIALIZE THE CONTROL RECORD }
	BEGIN   { VALIDATE THE CARD ID }
	  WITH ISC_TABLE[SCODE] , INFO^ DO
	  BEGIN
	    IF (CARD_TYPE=1) AND (CARD_ID=0) THEN
	    BEGIN  { FIX CARD TYPE AND ID }
	      CARD_TYPE := 9; CARD_ID := 27;
	    END;
	    WITH CARD^ DO
	    BEGIN
	      ID := 0;  { RESET THE CARD }
	      { INITIALIZE THE CONTROL RECORD }
	      BFAST := STATUS.FAST;     { SAVE PROGRAMMING SPEED }
	      EPSTART :=0 ;             {ADDRESS OF ATTACHED EPROM CARD}
	      EPEND :=0 ;               {ADDRESS OF LAST EPROM BYTE + 1}
	      { FINDOUT WHICH EPROM CARD IS ATTACHED TO THE PROGRAMMER CARD }
	      PBYTE.INT := LO_ROM;
	      DONE := FALSE;
	      CACHE_OFF;                         { 3.0 BUG FIX -- 3/13/84}
	      REPEAT
		TRY
		  DUMMY := PBYTE.BPTR^; { ACCESS THE EPROM SPACE }
		  IF STATUS.ACCS THEN
		  BEGIN  { FOUND THE EPROM CARD }
		    DONE := TRUE;
		    EPSTART := PBYTE.INT;
		    EPEND :=  EPSTART + STEPSIZE;
		    PBYTE.INT := EPEND;
		    { CHECK FOR xx64 PARTS OR xx128 PARTS }
		    IF EPEND<HI_ROM THEN        { DON'T PASS END OF ROM }
		    BEGIN
		      CONTROL.ACCS := FALSE;    { CLEAR THE ACCESS BIT }
		      DUMMY := PBYTE.BPTR^;     { ACCESS THE EPROM SPACE }
		      IF STATUS.ACCS THEN EPEND :=  EPEND + STEPSIZE;
		    END;
		  END
		  ELSE
		    PBYTE.INT := PBYTE.INT + STEPSIZE;
		RECOVER { IGNORE BUS ERRORS }
		  IF ESCAPECODE<>-12 THEN ESCAPE(ESCAPECODE)
		  ELSE
		    PBYTE.INT := PBYTE.INT + STEPSIZE;
		DONE:=DONE OR (PBYTE.INT>=HI_ROM);
	      UNTIL DONE;
	      CACHE_ON;                             { 3.0 BUG FIX 3/13/84 }
	      IF EPSTART=0 THEN BADIO(ENOEPROM);
	    END;
	  END;
	END;

      EPREAD:   { MOVE DATA FROM EPROM SPACE TO BUFFER }
	IF BUFSIZE>0 THEN
	BEGIN
	  SETUP;
	  MOVELEFT(PBYTE.CPTR^,BUFFER[0],BUFSIZE);
	  POSIT := ENDSCAN;
	END;

      EPWRITE,EPCWRITE: { MOVE DATA FROM BUFFER TO EPROM }
	IF BUFSIZE>0 THEN
	BEGIN
	  SETUP;
	  WITH CARD^, INFO^ DO
	  BEGIN
	    TRY
	      CONTROL.FAST := BFAST;    { SET BURN SPEED }
	      CONTROL.ENAB := TRUE;     { ENABLE WRITE }
	      I := 0;
	      IF ODD(PBYTE.INT) THEN
	      BEGIN     { BURN FIRST BYTE }
		IF PBYTE.CPTR^<>BUFFER[I] THEN
		BEGIN   { PATTERN NOT SAME SO BURN IT }
		  PBYTE.CPTR^ := BUFFER[I];
		  WHILE CONTROL.BUSY DO;  { WAIT FOR BURN TO FINISH }
		  IF OP = EPCWRITE THEN   { CHECK PATTERN AFTER BURN }
		    IF PBYTE.CPTR^<>BUFFER[I] THEN BADIO(EPFAIL);
		END;
		I := I + 1;
		PBYTE.INT := PBYTE.INT + 1;
	      END;
	      ENDSCAN := BUFSIZE-1;
	      WHILE I<BUFSIZE DO
	      BEGIN     { BURN 2 BYTES AT A TIME EXECPT FOR LAST ODD BYTE }
		IF I=ENDSCAN THEN
		BEGIN   { BURN LAST BYTE }
		  IF PBYTE.CPTR^<>BUFFER[I] THEN
		  BEGIN { PATTERN NOT SAME SO BURN IT }
		    PBYTE.CPTR^ := BUFFER[I];
		    WHILE CONTROL.BUSY DO;  { WAIT FOR BURN TO FINISH }
		    IF OP = EPCWRITE THEN   { CHECK PATTERN AFTER BURN }
		      IF PBYTE.CPTR^<>BUFFER[I] THEN BADIO(EPFAIL);
		  END;
		  I := I + 1;
		  PBYTE.INT := PBYTE.INT + 1;
		END
		ELSE
		BEGIN   { BURN TWO BYTES }
		  WBYTES[0] := BUFFER[I];
		  WBYTES[1] := BUFFER[I+1];
		  IF PBYTE.WPTR^<>WBYTES THEN
		  BEGIN { PATTERN NOT SAME SO BURN IT }
		    PBYTE.WPTR^ := WBYTES;  { BURN BOTH BYTES }
		    WHILE CONTROL.BUSY DO;  { WAIT FOR BURN TO FINISH }
		    IF OP=EPCWRITE THEN     { CHECK PATTERN AFTER BURN }
		      IF PBYTE.WPTR^<>WBYTES THEN BADIO(EPFAIL);
		  END;
		  I := I + 2;
		  PBYTE.INT := PBYTE.INT + 2;
		END;      { BURN TWO BYTES }
	      END;        { WHILE I<BUFSIZE}
	      CONTROL.ENAB:=FALSE;    { TURN OFF WRITE ENABLE }
	      POSIT := PBYTE.INT;     { RECORD THE POSITION }
	    RECOVER
	      BEGIN
		CONTROL.ENAB:=FALSE;    { TURN OFF WRITE ENABLE }
		POSIT := PBYTE.INT;     { RECORD THE POSITION }
		IF ESCAPECODE<>0 THEN ESCAPE(ESCAPECODE);
	      END;
	  END;          { WITH CARD^, INFO^ }
	END;

      EPBLANK:  { CHECK THE EPROM SPACE FOR HEX FF }
	IF BUFSIZE>0 THEN
	BEGIN
	  SETUP;
	  REPEAT
	    IF PBYTE.WPTR^[0]<>CHR(255) THEN DONE := TRUE
	    ELSE PBYTE.INT := PBYTE.INT + 1;
	    DONE := DONE OR (PBYTE.INT>=ENDSCAN);
	  UNTIL DONE;
	  POSIT := PBYTE.INT;
	  IF POSIT<ENDSCAN THEN BADIO(ENOTBLANK);
	END;

      EPCHECK:  { CHECK DATA FOR POSSIBLE BURN }
	IF BUFSIZE>0 THEN
	BEGIN
	  SETUP;
	  I := 0;
	  REPEAT
	    IF IOR(ORD(PBYTE.WINPTR^[I]),ORD(BUFFER[I]))=ORD(PBYTE.WINPTR^[I])
	    THEN I := I + 1
	    ELSE DONE := TRUE;
	    DONE := DONE OR (I>=BUFSIZE);
	  UNTIL DONE;
	  POSIT := PBYTE.INT + I;
	  IF I<BUFSIZE THEN BADIO(ECFAIL);
	END;

      EPBRATE: INFO^.BFAST := POSIT<>0; { SET BURN RATE }

      EPINFO: GETINFO(BUFFER);   { GET BURN RATE AND ADDRESS INFO }

      END; { CASE }
    RECOVER
    BEGIN
      IF ESCAPECODE<>0 THEN ESCAPE(ESCAPECODE);
    END;
  END; { EPPROG }


  FUNCTION EPROG(      SCODE   : INTEGER;
		       OP      : EOPTYPE;
		ANYVAR BUFFER  : WINDOW;
		       BUFSIZE : INTEGER;
		   VAR POSIT   : INTEGER):EPERROR;
  VAR
    EOP : EPOPTYPE;
    ECODE : EPERROR;
  BEGIN
    CASE OP OF
      EREAD  : EOP:=EPREAD;
      EWRITE : EOP:=EPWRITE;
      ECWRITE: EOP:=EPCWRITE;
      EBLANK : EOP:=EPBLANK;
      ECHECK : EOP:=EPCHECK;
    END;
    EPPROG(SCODE,EOP,BUFFER,BUFSIZE,POSIT,ECODE); EPROG:=ECODE;
  END;

  FUNCTION EGETINFO(   SCODE : INTEGER;
		    VAR INFO : EPINFOREC):EPERROR;
  VAR
    I : INTEGER;
    ECODE : EPERROR;
  BEGIN
    EPPROG(SCODE,EPINFO,INFO,0,I,ECODE); EGETINFO:=ECODE;
  END;

  FUNCTION EBRATE(SCODE : INTEGER;BRATE : BOOLEAN):EPERROR;
  VAR
    I : INTEGER;
    ECODE : EPERROR;
  BEGIN
    I := ORD(BRATE);
    EPPROG(SCODE,EPBRATE,I,0,I,ECODE); EBRATE:=ECODE;
  END;

  FUNCTION EINIT(SCODE : INTEGER):EPERROR;
  VAR
    I : INTEGER;
    ECODE : EPERROR;
  BEGIN
    EPPROG(SCODE,EPINIT,I,0,I,ECODE); EINIT:=ECODE;
  END;

END.

@


56.2
log
@
pws2rcs automatic delta on Wed Jan 27 11:57:27 MST 1993
@
text
@d1 353
@


56.1
log
@Automatic bump of revision number for PWS version 3.25
@
text
@a0 353
					      (*

 (c) Copyright Hewlett-Packard Company, 1984.
All rights are reserved.  Copying or other
reproduction of this program except for archival
purposes is prohibited without the prior
written consent of Hewlett-Packard Company.


	    RESTRICTED RIGHTS LEGEND

Use, duplication, or disclosure by the Government
is subject to restrictions as set forth in
paragraph (b) (3) (B) of the Rights in Technical
Data and Computer Software clause in
DAR 7-104.9(a).

HEWLETT-PACKARD COMPANY
Fort Collins, Colorado                         *)

$SYSPROG$
$RANGE OFF$  $DEBUG OFF$
$ALLOW_PACKED ON$ {JWS 3/31/87}
MODULE EDRIVER;
IMPORT SYSGLOBALS,IODECLARATIONS,ASM;
EXPORT
  TYPE
    EPINFOREC = RECORD
		  BFAST   : BOOLEAN;
		  EPSTART : INTEGER;
		  EPEND   : INTEGER;
		END;

    EOPTYPE = (EREAD,EWRITE,ECWRITE,EBLANK,ECHECK);
    EPERROR = (ENOERROR,ENOTPROG,ENOEPROM,ECFAIL,EPFAIL,ENOTBLANK,EBADARGS);

    FUNCTION EPROG(      SCODE   : INTEGER;
			 OP      : EOPTYPE;
		  ANYVAR BUFFER  : WINDOW;
			 BUFSIZE : INTEGER;
		     VAR POSIT   : INTEGER):EPERROR;

    FUNCTION EGETINFO(   SCODE : INTEGER;
		      VAR INFO : EPINFOREC):EPERROR;

    FUNCTION EINIT(SCODE : INTEGER):EPERROR;

    FUNCTION EBRATE(SCODE : INTEGER;
		    BRATE : BOOLEAN):EPERROR;

IMPLEMENT
  TYPE
    EPOPTYPE = (EPINIT,EPREAD,EPWRITE,EPCWRITE,EPBLANK,EPCHECK,EPBRATE,EPINFO);
    STATREG= PACKED RECORD
	       B4  : BYTE;  { PUT HERE TO MAKE THE COMPILER HAPPY }
	       PAD : 0..15; { 7,6,5,4 }
	       FAST: BOOLEAN;
	       ACCS: BOOLEAN;
	       ENAB: BOOLEAN;
	       BUSY: BOOLEAN;
	     END;
    EPTYPE = PACKED RECORD
	       B0 : BYTE;
	       ID : BYTE;
	       B2 : BYTE;
	       B3 : BYTE;
	       CASE BOOLEAN OF
	       TRUE:(CONTROL:STATREG);
	       FALSE:(STATUS:STATREG);
	     END;
    EPTR = ^EPTYPE;
    INFOPTR = ^EPINFOREC;


  PROCEDURE EPPROG(       SCODE   : INTEGER;
			  OP      : EPOPTYPE;
		   ANYVAR BUFFER  : WINDOW;
			  BUFSIZE : INTEGER;
		      VAR POSIT   : INTEGER;
		      VAR ECODE   : EPERROR);
  CONST
    LO_ROM = HEX('20000');  { 128k }
    HI_ROM = HEX('200000'); { 2048k }
    STEPSIZE = HEX('20000');{ 128k }
  TYPE
    TWOBYTES = PACKED ARRAY[0..1] OF CHAR;
    BREC = RECORD
	     CASE INTEGER OF
	     0: (INT:INTEGER);
	     1: (BPTR:^BYTE);
	     2: (WPTR:^TWOBYTES);
	     3: (CPTR:^CHAR);
	     4: (WINPTR:WINDOWP);
	   END;

  VAR
    CARD        : EPTR;
    PBYTE       : BREC;
    DUMMY       : INTEGER;
    DONE        : BOOLEAN;
    ENDSCAN     : INTEGER;
    I           : INTEGER;
    WBYTES      : TWOBYTES;
    INFO        : INFOPTR;

    PROCEDURE BADIO(ECCODE:EPERROR);
    BEGIN
      ECODE := ECCODE; ESCAPE(0);
    END;

    PROCEDURE SETUP;
    BEGIN
      WITH INFO^ DO
      BEGIN
	IF EPSTART=0 THEN BADIO(ENOEPROM);
	ENDSCAN := POSIT + BUFSIZE;
	IF (POSIT<EPSTART) OR (ENDSCAN>EPEND) THEN BADIO(EBADARGS);
	PBYTE.INT := POSIT;
	DONE := FALSE;
      END;
    END;

    PROCEDURE GETINFO(ANYVAR UINFO : EPINFOREC);
    BEGIN
      UINFO := INFO^;
    END;

  BEGIN { EPPROG }
    ECODE := ENOERROR;
    TRY
      { VALIDATE THE SELECT CODE }
      IF (SCODE<IOMINISC) OR (SCODE>IOMAXISC) THEN BADIO(ENOTPROG);
      WITH ISC_TABLE[SCODE] DO
      BEGIN
	CARD := CARD_PTR;
	IF (CARD=NIL) OR (CARD_TYPE=0) THEN BADIO(ENOTPROG);
	IF ((CARD_TYPE=1) AND (CARD_ID=0)) OR
	   ((CARD_TYPE=9) AND (CARD_ID=27)) THEN
	BEGIN
	  IF CARD^.ID<>27 THEN BADIO(ENOTPROG);
	END
	ELSE BADIO(ENOTPROG);
	INFO := ADDR(IO_TMP_PTR^.DRV_MISC);
      END;
      CASE OP OF
      EPINIT:   { INITIALIZE THE CONTROL RECORD }
	BEGIN   { VALIDATE THE CARD ID }
	  WITH ISC_TABLE[SCODE] , INFO^ DO
	  BEGIN
	    IF (CARD_TYPE=1) AND (CARD_ID=0) THEN
	    BEGIN  { FIX CARD TYPE AND ID }
	      CARD_TYPE := 9; CARD_ID := 27;
	    END;
	    WITH CARD^ DO
	    BEGIN
	      ID := 0;  { RESET THE CARD }
	      { INITIALIZE THE CONTROL RECORD }
	      BFAST := STATUS.FAST;     { SAVE PROGRAMMING SPEED }
	      EPSTART :=0 ;             {ADDRESS OF ATTACHED EPROM CARD}
	      EPEND :=0 ;               {ADDRESS OF LAST EPROM BYTE + 1}
	      { FINDOUT WHICH EPROM CARD IS ATTACHED TO THE PROGRAMMER CARD }
	      PBYTE.INT := LO_ROM;
	      DONE := FALSE;
	      CACHE_OFF;                         { 3.0 BUG FIX -- 3/13/84}
	      REPEAT
		TRY
		  DUMMY := PBYTE.BPTR^; { ACCESS THE EPROM SPACE }
		  IF STATUS.ACCS THEN
		  BEGIN  { FOUND THE EPROM CARD }
		    DONE := TRUE;
		    EPSTART := PBYTE.INT;
		    EPEND :=  EPSTART + STEPSIZE;
		    PBYTE.INT := EPEND;
		    { CHECK FOR xx64 PARTS OR xx128 PARTS }
		    IF EPEND<HI_ROM THEN        { DON'T PASS END OF ROM }
		    BEGIN
		      CONTROL.ACCS := FALSE;    { CLEAR THE ACCESS BIT }
		      DUMMY := PBYTE.BPTR^;     { ACCESS THE EPROM SPACE }
		      IF STATUS.ACCS THEN EPEND :=  EPEND + STEPSIZE;
		    END;
		  END
		  ELSE
		    PBYTE.INT := PBYTE.INT + STEPSIZE;
		RECOVER { IGNORE BUS ERRORS }
		  IF ESCAPECODE<>-12 THEN ESCAPE(ESCAPECODE)
		  ELSE
		    PBYTE.INT := PBYTE.INT + STEPSIZE;
		DONE:=DONE OR (PBYTE.INT>=HI_ROM);
	      UNTIL DONE;
	      CACHE_ON;                             { 3.0 BUG FIX 3/13/84 }
	      IF EPSTART=0 THEN BADIO(ENOEPROM);
	    END;
	  END;
	END;

      EPREAD:   { MOVE DATA FROM EPROM SPACE TO BUFFER }
	IF BUFSIZE>0 THEN
	BEGIN
	  SETUP;
	  MOVELEFT(PBYTE.CPTR^,BUFFER[0],BUFSIZE);
	  POSIT := ENDSCAN;
	END;

      EPWRITE,EPCWRITE: { MOVE DATA FROM BUFFER TO EPROM }
	IF BUFSIZE>0 THEN
	BEGIN
	  SETUP;
	  WITH CARD^, INFO^ DO
	  BEGIN
	    TRY
	      CONTROL.FAST := BFAST;    { SET BURN SPEED }
	      CONTROL.ENAB := TRUE;     { ENABLE WRITE }
	      I := 0;
	      IF ODD(PBYTE.INT) THEN
	      BEGIN     { BURN FIRST BYTE }
		IF PBYTE.CPTR^<>BUFFER[I] THEN
		BEGIN   { PATTERN NOT SAME SO BURN IT }
		  PBYTE.CPTR^ := BUFFER[I];
		  WHILE CONTROL.BUSY DO;  { WAIT FOR BURN TO FINISH }
		  IF OP = EPCWRITE THEN   { CHECK PATTERN AFTER BURN }
		    IF PBYTE.CPTR^<>BUFFER[I] THEN BADIO(EPFAIL);
		END;
		I := I + 1;
		PBYTE.INT := PBYTE.INT + 1;
	      END;
	      ENDSCAN := BUFSIZE-1;
	      WHILE I<BUFSIZE DO
	      BEGIN     { BURN 2 BYTES AT A TIME EXECPT FOR LAST ODD BYTE }
		IF I=ENDSCAN THEN
		BEGIN   { BURN LAST BYTE }
		  IF PBYTE.CPTR^<>BUFFER[I] THEN
		  BEGIN { PATTERN NOT SAME SO BURN IT }
		    PBYTE.CPTR^ := BUFFER[I];
		    WHILE CONTROL.BUSY DO;  { WAIT FOR BURN TO FINISH }
		    IF OP = EPCWRITE THEN   { CHECK PATTERN AFTER BURN }
		      IF PBYTE.CPTR^<>BUFFER[I] THEN BADIO(EPFAIL);
		  END;
		  I := I + 1;
		  PBYTE.INT := PBYTE.INT + 1;
		END
		ELSE
		BEGIN   { BURN TWO BYTES }
		  WBYTES[0] := BUFFER[I];
		  WBYTES[1] := BUFFER[I+1];
		  IF PBYTE.WPTR^<>WBYTES THEN
		  BEGIN { PATTERN NOT SAME SO BURN IT }
		    PBYTE.WPTR^ := WBYTES;  { BURN BOTH BYTES }
		    WHILE CONTROL.BUSY DO;  { WAIT FOR BURN TO FINISH }
		    IF OP=EPCWRITE THEN     { CHECK PATTERN AFTER BURN }
		      IF PBYTE.WPTR^<>WBYTES THEN BADIO(EPFAIL);
		  END;
		  I := I + 2;
		  PBYTE.INT := PBYTE.INT + 2;
		END;      { BURN TWO BYTES }
	      END;        { WHILE I<BUFSIZE}
	      CONTROL.ENAB:=FALSE;    { TURN OFF WRITE ENABLE }
	      POSIT := PBYTE.INT;     { RECORD THE POSITION }
	    RECOVER
	      BEGIN
		CONTROL.ENAB:=FALSE;    { TURN OFF WRITE ENABLE }
		POSIT := PBYTE.INT;     { RECORD THE POSITION }
		IF ESCAPECODE<>0 THEN ESCAPE(ESCAPECODE);
	      END;
	  END;          { WITH CARD^, INFO^ }
	END;

      EPBLANK:  { CHECK THE EPROM SPACE FOR HEX FF }
	IF BUFSIZE>0 THEN
	BEGIN
	  SETUP;
	  REPEAT
	    IF PBYTE.WPTR^[0]<>CHR(255) THEN DONE := TRUE
	    ELSE PBYTE.INT := PBYTE.INT + 1;
	    DONE := DONE OR (PBYTE.INT>=ENDSCAN);
	  UNTIL DONE;
	  POSIT := PBYTE.INT;
	  IF POSIT<ENDSCAN THEN BADIO(ENOTBLANK);
	END;

      EPCHECK:  { CHECK DATA FOR POSSIBLE BURN }
	IF BUFSIZE>0 THEN
	BEGIN
	  SETUP;
	  I := 0;
	  REPEAT
	    IF IOR(ORD(PBYTE.WINPTR^[I]),ORD(BUFFER[I]))=ORD(PBYTE.WINPTR^[I])
	    THEN I := I + 1
	    ELSE DONE := TRUE;
	    DONE := DONE OR (I>=BUFSIZE);
	  UNTIL DONE;
	  POSIT := PBYTE.INT + I;
	  IF I<BUFSIZE THEN BADIO(ECFAIL);
	END;

      EPBRATE: INFO^.BFAST := POSIT<>0; { SET BURN RATE }

      EPINFO: GETINFO(BUFFER);   { GET BURN RATE AND ADDRESS INFO }

      END; { CASE }
    RECOVER
    BEGIN
      IF ESCAPECODE<>0 THEN ESCAPE(ESCAPECODE);
    END;
  END; { EPPROG }


  FUNCTION EPROG(      SCODE   : INTEGER;
		       OP      : EOPTYPE;
		ANYVAR BUFFER  : WINDOW;
		       BUFSIZE : INTEGER;
		   VAR POSIT   : INTEGER):EPERROR;
  VAR
    EOP : EPOPTYPE;
    ECODE : EPERROR;
  BEGIN
    CASE OP OF
      EREAD  : EOP:=EPREAD;
      EWRITE : EOP:=EPWRITE;
      ECWRITE: EOP:=EPCWRITE;
      EBLANK : EOP:=EPBLANK;
      ECHECK : EOP:=EPCHECK;
    END;
    EPPROG(SCODE,EOP,BUFFER,BUFSIZE,POSIT,ECODE); EPROG:=ECODE;
  END;

  FUNCTION EGETINFO(   SCODE : INTEGER;
		    VAR INFO : EPINFOREC):EPERROR;
  VAR
    I : INTEGER;
    ECODE : EPERROR;
  BEGIN
    EPPROG(SCODE,EPINFO,INFO,0,I,ECODE); EGETINFO:=ECODE;
  END;

  FUNCTION EBRATE(SCODE : INTEGER;BRATE : BOOLEAN):EPERROR;
  VAR
    I : INTEGER;
    ECODE : EPERROR;
  BEGIN
    I := ORD(BRATE);
    EPPROG(SCODE,EPBRATE,I,0,I,ECODE); EBRATE:=ECODE;
  END;

  FUNCTION EINIT(SCODE : INTEGER):EPERROR;
  VAR
    I : INTEGER;
    ECODE : EPERROR;
  BEGIN
    EPPROG(SCODE,EPINIT,I,0,I,ECODE); EINIT:=ECODE;
  END;

END.

@


55.1
log
@Automatic bump of revision number for PWS version 3.25A
@
text
@@


54.1
log
@Automatic bump of revision number for PWS version 3.24
@
text
@@


53.1
log
@Automatic bump of revision number for PWS version 3.24B
@
text
@@


52.1
log
@Automatic bump of revision number for PWS version 3.24A
@
text
@@


51.1
log
@Automatic bump of revision number for PWS version 3.24d
@
text
@@


50.1
log
@Automatic bump of revision number for PWS version 3.23c
@
text
@@


49.1
log
@Automatic bump of revision number for PWS version 3.24b
@
text
@@


48.1
log
@Automatic bump of revision number for PWS version 3.24a
@
text
@@


47.1
log
@Automatic bump of revision number for PWS version 3.23
@
text
@@


46.1
log
@Automatic bump of revision number for PWS version 3.23
@
text
@@


45.1
log
@Automatic bump of revision number for PWS version 3.23C
@
text
@@


44.1
log
@Automatic bump of revision number for PWS version 3.23B
@
text
@@


43.1
log
@Automatic bump of revision number for PWS version 3.23aA
@
text
@@


42.1
log
@Automatic bump of revision number for PWS version 3.23e
@
text
@@


41.1
log
@Automatic bump of revision number for PWS version 3.23d
@
text
@@


40.1
log
@Automatic bump of revision number for PWS version 3.23c
@
text
@@


39.1
log
@Automatic bump of revision number for PWS version 3.23b
@
text
@@


38.1
log
@Automatic bump of revision number for PWS version 3.23a
@
text
@@


37.1
log
@Automatic bump of revision number for PWS version 3.3a
@
text
@@


36.1
log
@Automatic bump of revision number for PWS version 3.22
@
text
@@


35.1
log
@Automatic bump of revision number for PWS version 3.22
@
text
@@


34.1
log
@Automatic bump of revision number for PWS version 3.22
@
text
@@


33.1
log
@Automatic bump of revision number for PWS version 3.22D
@
text
@@


32.1
log
@Automatic bump of revision number for PWS version 3.22C
@
text
@@


31.1
log
@Automatic bump of revision number for PWS version 3.22B
@
text
@@


30.1
log
@Automatic bump of revision number for PWS version 3.22A
@
text
@@


29.1
log
@Automatic bump of revision number for PWS version 3.22b
@
text
@@


28.1
log
@Automatic bump of revision number for PWS version 3.3b
@
text
@@


27.1
log
@Automatic bump of revision number for PWS version 3.3a
@
text
@@


26.1
log
@Automatic bump of revision number for PWS version 3.3 Synch
@
text
@@


25.1
log
@Automatic bump of revision number for PWS version 3.2Y
@
text
@@


24.1
log
@Automatic bump of revision number for PWS version 3.2
@
text
@@


23.1
log
@Automatic bump of revision number for PWS version 3.2P
@
text
@@


22.1
log
@Automatic bump of revision number for PWS version 3.2N
@
text
@@


21.1
log
@Automatic bump of revision number for PWS version 3.2M
@
text
@@


20.1
log
@Automatic bump of revision number for PWS version 3.2L
@
text
@@


19.1
log
@Automatic bump of revision number for PWS version 3.2K
@
text
@@


18.1
log
@Automatic bump of revision number for PWS version 3.2J
@
text
@@


17.1
log
@Automatic bump of revision number for PWS version 3.2I+
@
text
@@


16.1
log
@Automatic bump of revision number for PWS version 3.2I
@
text
@@


15.1
log
@Automatic bump of revision number for PWS version 3.2H
@
text
@@


14.1
log
@Automatic bump of revision number for PWS version 3.2G
@
text
@@


13.2
log
@Pws2unix automatic delta on Wed Apr  1 08:30:27 MST 1987
@
text
@@


13.1
log
@Automatic bump of revision number for PWS version 3.2F
@
text
@d23 1
@


12.1
log
@Automatic bump of revision number for PWS version 3.2E
@
text
@@


11.1
log
@Automatic bump of revision number for PWS version 3.2D
@
text
@@


10.1
log
@Automatic bump of revision number for PWS version 3.2C
@
text
@@


9.1
log
@Automatic bump of revision number for PWS version 3.2B
@
text
@@


8.1
log
@Automatic bump of revision number for PWS version 3.2A
@
text
@@


7.1
log
@Automatic bump of revision number for PWS version 3.2l
@
text
@@


6.1
log
@Automatic bump of revision number for PWS version 3.2k
@
text
@@


5.1
log
@Automatic bump of revision number for PWS version 3.2j
@
text
@@


4.1
log
@Automatic bump of revision number for PWS version 3.2i
@
text
@@


3.1
log
@Automatic bump of revision number for PWS version 3.2h
@
text
@@


2.1
log
@Auto bump rev number to 2.1 for sys 3.2e.
@
text
@@


1.1
log
@Initial revision
@
text
@@
