home *** CD-ROM | disk | FTP | other *** search
- {*****************************************************************************}
- { }
- { Copywrite 1988 by PETER MELLO. }
- { }
- { For more Information you may contact }
- { }
- { Peter Mello }
- { Unisys Corp }
- { 2 Enterprize Dr. }
- { Shelton, Conn 06484 }
- { }
- { or 'PETER MELLO' }
- { on the Circuit Cellar Bulletin Board. (203) 871-1988 }
- { }
- { }
- {*****************************************************************************}
-
- Program EEPROM_UTILITES;
- uses crt;
-
- {$UNDEF DEBUG_CONVERT_TO_INT} { FOR THOSE PESKY PROBLEMS, }
- {$UNDEF DEBUG_CONVERT_TO_HEX}
- {$UNDEF DEBUG_PROCESS_JEDEC} { MOST PROCEDURES HAVE DEBUG }
- {$UNDEF DEBUG_COMPARE_JEDEC}
-
- {$UNDEF DEBUG_PPI_WRITE} { CODE BUILT IN. }
- {$UNDEF DEBUG_PPI_ADDR_READ}
- {$UNDEF DEBUG_SET_ADDR}
- {$UNDEF DEBUG_READ_BUSY}
- {$UNDEF DEBUG_READ_EAROM_ADDR}
-
- {$UNDEF DEBUG_NOT_BURNING} { not a procedure }
- {$UNDEF NO_ERROR_ABORT} { not a procedure }
-
- CONST
-
- MAX_ROM_SIZE = 2047;
-
- PRT_PORT1_DATA = $278; { ADDRESSES OF THE PC PORTS }
- PRT_PORT1_CNTL = $27A; { FOR PRINTER PORT 1. }
- PRT_PORT1_STAT = $279;
-
- PRT_PORT2_DATA = $378; { ADDRESSES OF THE PC PORTS }
- PRT_PORT2_CNTL = $37A; { FOR PRINTER PORT 2. }
- PRT_PORT2_STAT = $379;
-
- {*************************************}
- PRT_PORT_DATA = PRT_PORT2_DATA; {* Change here to define printer *}
- PRT_PORT_CNTL = PRT_PORT2_CNTL; {* port 1 or 2. *}
- PRT_PORT_STAT = PRT_PORT2_STAT; {*************************************}
-
- (*****************************************************************************)
- (* Do not confuse the interface between the PC -> 8255 with the ports *)
- (* of the 8255. Entire program deals with writing to the 'PPI_PORTS', *)
- (* THIS IS THE INPUT/OUTPUT REGISTERS OF THE 8255. Getting data into and *)
- (* out of the 8255 is done transparently to the user/abuser by use of the *)
- (* 'PPI_WRITE' and 'PPI_READ' procedures. *)
- (*****************************************************************************)
-
- DATA_PORT = 'A'; { Here we define what the output ports }
- ADDR_PORT = 'B'; { of the 8255 PPI will be used for. }
- CNTL_PORT = 'C';
- MODE_PORT = 'D';
-
- BUSY_LINE = 128; { Here we further define what the bit }
- WRITE_LINE = 64; { assignment of port C (the control port)}
- READ_LINE = 32; { are to be used for. }
- CHIP_ENABLE = 16; {N.C.}
- NORMAL_STATE = 00; { WRITE_LINE + READ_LINE; }
- { Lines are normally in the high or off }
- { state, which is +5v. }
-
- WRITE_BIT_ON = 13; { send these numbers to the 8255 mode }
- WRITE_BIT_OFF = 12; { register to set the control lines to }
- READ_BIT_ON = 11; { the EAROM on and off. ON is the active }
- READ_BIT_OFF = 10; { state, which is low, 0v. }
-
- TYPE STRING79 = STRING[79];
-
- VAR INPUT_FILE_PARAM : STRING79;
-
- PROCEDURE ERROR ( ERR_MSG :STRING79 );
- BEGIN
- WRITELN (ERR_MSG);
- {$IFDEF NO_ERROR_ABORT}
- { -don't halt- }
- {$ELSE}
- HALT
- {$ENDIF}
- END {PROCEDURE_ERROR};
-
- PROCEDURE PPI_WRITE (PORT_TYPE:CHAR; DATA:INTEGER);
- VAR PORT_ADDR : INTEGER;
- BEGIN
- CASE PORT_TYPE OF { 1 bit inverted }
- DATA_PORT : PORT_ADDR:=08; { Bit 0 off, Bit 1 off }{ 4=0 bit, 8=1 bit }
- ADDR_PORT : PORT_ADDR:=12; { Bit 0 on, Bit 1 off }
- CNTL_PORT : PORT_ADDR:=00; { Bit 0 off, Bit 1 on }
- MODE_PORT : PORT_ADDR:=04; { Bit 0 on, Bit 1 on }{ control register }
- ELSE WRITELN('INVALID PORT ADDR');
- END{CASE};
-
- PORT [PRT_PORT_CNTL] := PORT_ADDR; { PUT 8255 PORT ADDR ON BUSS. }
- PORT [PRT_PORT_DATA] := DATA; { PUT 8255 PORT DATA ON BUSS. }
- PORT [PRT_PORT_CNTL] := PORT_ADDR + 1; { DROP WRITE LINE LOW. }
- {$IFDEF DEBUG_PPI_WRITE}
- writeln('DATA ON BUS, writeln low, HIT RETURN TO CONTINUE.');READLN;
- {$ENDIF}
-
- DELAY(1); { 1 msec delay. }
- PORT [PRT_PORT_CNTL] := PORT_ADDR; { RAISE WRITE LINE BACK HIGH. }
- {$IFDEF DEBUG_PPI_WRITE}
- writeln('writeln high, data writen=',data,'. HIT RETURN TO CONTINUE');READLN;
- {$ENDIF}
-
- END {PROCEDURE_PPI_WRITE};
-
-
- PROCEDURE SET_ADDRESS ( HEX_ADDR:LONGINT );
- VAR
- HIGH_ADDR
- , LOW_ADDR : INTEGER;
- BEGIN
- HIGH_ADDR := HEX_ADDR DIV 256;
- LOW_ADDR := HEX_ADDR MOD 256;
- IF HIGH_ADDR > 7
- THEN ERROR('Current hardware only supports up to 11 address bits.')
- ELSE
- BEGIN
- {$IFDEF DEBUG_SET_ADDR}
- WRITE ('Address passed as >',HEX_ADDR,'<, converted to ');
- WRITELN('HIGH_ADDR = >', HIGH_ADDR, '<, LOW_ADDR = >', LOW_ADDR,'<' );
- {$ELSE}
- PPI_WRITE (CNTL_PORT,HIGH_ADDR );
- PPI_WRITE (ADDR_PORT, LOW_ADDR);
- {$ENDIF}
- END;
- END{PROCEDURE_SET_ADDRESS};
-
-
- PROCEDURE PPI_ADDR_READ ( HEX_ADDR : LONGINT; VAR DATA:INTEGER);
-
- (* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)
- (* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)
- (* THIS IS THE INTERFACE SOFTWARE BETWEEN THE PC's PARALLEL PORT AND *)
- (* THE 8255 PPI CHIP. THERE ARE TWELVE LINES BETWEEN THEM, THE EIGHT *)
- (* DATA LINES, THE TWO MODE SELECT LINES, A /READ SELECT LINE AND A *)
- (* /WRITE SELECT LINE. DUE TO THE HARDWARE, WRITING A ONE ON ANY DATA *)
- (* LINE (AND ONE OF THE MODE SELECT LINES) WILL HAVE A HIGH (+5v) *)
- (* OUTPUT, WHILE WRITING A ONE TO ANY OF OTHER LINES WILL CAUSE THEM *)
- (* TO GO FROM THEIR NORMALLY HIGH (+5v) TO A LOW (+0v). GOT THAT ??? *)
- (* WELL TO REALLY SCREW YOUR HEAD ON, THE DATA LINES AND THE 'A0' *)
- (* MODE SELECT LINE HAVE 'POSITIVE' POLARITY WHILE THE THREE OTHER *)
- (* CONTROL LINES HAVE NEGITIVE 'POLARITY'. *)
- (* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)
- (* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)
-
- CONST MODE_BIT = 128;
- PORT_A = 08; A_IN = 16;
- PORT_B = 12; C_UPPER_IN = 8;
- PORT_C = 00; C_LOWER_IN = 1;
- PORT_MODE = 04; WRITE = 1;
- BEGIN
- { Set up mode register to set data port to read mode. }
- PORT [PRT_PORT_CNTL] := PORT_MODE; { PUT 8255 Mode Addr on BUSS. }
- PORT [PRT_PORT_DATA] := MODE_BIT + A_IN; { Mode bit and data port. }
- PORT [PRT_PORT_CNTL] := PORT_MODE+WRITE; { DROP WRITE LINE LOW. }
- DELAY(1); { 1 msec delay. }
- PORT [PRT_PORT_CNTL] := PORT_MODE; { RAISE WRITE LINE BACK HIGH. }
-
- {$IFDEF DEBUG_PPI_ADDR_READ}
- WRITELN ('PORT ''A'' SET TO READ MODE, HIT ENTER TO CONTINUE.');READLN;
- {$ENDIF}
-
- SET_ADDRESS ( HEX_ADDR );
-
- { Set /READ line low to EAROM. }
- PORT [PRT_PORT_CNTL] := PORT_MODE; { PUT 8255 Mode Reg Addr on BUS }
- PORT [PRT_PORT_DATA] := READ_BIT_ON; { Set read bit on via mode reg. }
- PORT [PRT_PORT_CNTL] := PORT_MODE+WRITE;{ DROP WRITE LINE LOW. }
- DELAY(1); { 1 msec delay. }
- PORT [PRT_PORT_CNTL] := PORT_MODE; { RAISE WRITE LINE BACK HIGH. }
-
- {$IFDEF DEBUG_PPI_ADDR_READ}
- WRITELN ('ADDRESS LATCHED, READ LINE LOW TO EAROM, HIT ENTER TO CONTINUE.');
- READLN;
- {$ENDIF}
-
- PORT [PRT_PORT_DATA] := 255; { PUT ALL HIGH FOR PULLUPS FOR INPUT }
- PORT [PRT_PORT_CNTL] := 08; { PUT 8255 PORT 'A' ADDR ON THE LINES. }
- {$IFDEF DEBUG_PPI_ADDR_READ}
- WRITELN ('ALL HIGH ON PULLUPS, PORT SELECTED, HIT ENTER TO CONTINUE.');READLN;
- {$ENDIF}
-
- PORT [PRT_PORT_CNTL] := 08 + 2; { SELECT 'A' REG & DROP READ LINE LOW. }
- DELAY (0); { 0.1 second delay. }
- {$IFDEF DEBUG_PPI_ADDR_READ}
- WRITELN ('PORT SELECTED, READ LINE LOW, HIT ENTER TO CONTINUE.'); READLN;
- {$ENDIF}
-
- DATA := PORT [PRT_PORT_DATA]; { READ THE 8255 PORT DATA FROM THE BUSS.}
- PORT [PRT_PORT_CNTL] := 08; { RAISE READ LINE BACK HIGH. }
- {$IFDEF DEBUG_PPI_ADDR_READ}
- WRITELN ('PORT READ COMPLETE INPUT = >',DATA,'<, HIT ENTER TO CONTINUE.');
- READLN;
- {$ENDIF}
-
- { Now that we are done we must set 'A' port read back to output. }
- PORT [PRT_PORT_CNTL] := 04; { PUT 8255 PORT ADDR ON BUSS. }
- PORT [PRT_PORT_DATA] := MODE_BIT; { ALL 8255 PORTS TO OUTPUT MODE. }
- PORT [PRT_PORT_CNTL] := 04 + 1; { DROP WRITE LINE LOW. }
- DELAY(1); { 1 msec delay. }
- PORT [PRT_PORT_CNTL] := 04; { RAISE WRITE LINE BACK HIGH. }
-
- {$IFDEF DEBUG_PPI_ADDR_READ}
- WRITELN ('PORT ''A'' SET TO OUTPUT (MODE RESET), HIT ENTER TO CONTINUE.');READLN;
- {$ENDIF}
-
- END {PROCEDURE_PPI_ADDR_READ} ;
-
-
-
- FUNCTION CONVERT_TO_INT ( IN_STRING :STRING79 ) : INTEGER;
-
-
- VAR
- USER_INPUT : STRING79;
- DIGITS
- ,STRING_CNTR
- ,X
- ,CNT : INTEGER;
-
- SUM
- ,POSITION : LONGINT;
-
- DIGIT : CHAR;
-
- BEGIN
-
- DIGITS := LENGTH ( IN_STRING );
-
- {$IFDEF DEBUG_CONVERT_TO_INT}
- WRITELN;
- WRITELN(' FUNCTION CONVERT_TO_INT ');
- WRITELN(' DIGITS PASSED AS >',DIGITS,'<');
- WRITE (' IN_STRING PASSED AS >');
- WRITE( IN_STRING );
- WRITELN('<');
- { WRITELN(' Hit enter to continue......'); READLN; }
- {$ENDIF}
-
- SUM := 0; CNT:=0;
- FOR STRING_CNTR := (DIGITS) DOWNTO 1 DO
- BEGIN
- DIGIT := IN_STRING [STRING_CNTR];
- POSITION := 1;
- FOR X:= 1 TO CNT DO POSITION := POSITION * 16;
- {$IFDEF DEBUG_CONVERT_TO_INT}
- WRITELN ('DIGIT = >',DIGIT,' POSITION = >',POSITION,'<');
- { WRITELN(' Hit enter to continue......'); READLN; }
- {$ENDIF}
- CASE DIGIT OF
- '0' : SUM := SUM;
- '1' : SUM := ( 1*POSITION ) + SUM;
- '2' : SUM := ( 2*POSITION ) + SUM;
- '3' : SUM := ( 3*POSITION ) + SUM;
- '4' : SUM := ( 4*POSITION ) + SUM;
- '5' : SUM := ( 5*POSITION ) + SUM;
- '6' : SUM := ( 6*POSITION ) + SUM;
- '7' : SUM := ( 7*POSITION ) + SUM;
- '8' : SUM := ( 8*POSITION ) + SUM;
- '9' : SUM := ( 9*POSITION ) + SUM;
- 'A','a' : SUM := ( 10*POSITION ) + SUM;
- 'B','b' : SUM := ( 11*POSITION ) + SUM;
- 'C','c' : SUM := ( 12*POSITION ) + SUM;
- 'D','d' : SUM := ( 13*POSITION ) + SUM;
- 'E','e' : SUM := ( 14*POSITION ) + SUM;
- 'F','f' : SUM := ( 15*POSITION ) + SUM;
- ELSE WRITELN ('INVALID HEX CHAR IN CONVERT_TO_INT STRING.');
- END{CASE};
- CNT:=CNT + 1;
- {$IFDEF DEBUG_CONVERT_TO_INT}
- WRITELN('SUM = ',SUM);
- WRITELN(' Hit enter to continue......'); READLN;
- {$ENDIF}
- END{FOR LOOP};
- CONVERT_TO_INT := SUM;
-
- (*
- { gets user input in hex then calls procedure 'convert_to_int' }
- { and converts to integer. }
- REPEAT
- BEGIN
- WRITELN('INPUT HEX NUMBER TO CONVERT.');
- READLN ( USER_INPUT );
- WRITELN(' INPUT READ AS >>',USER_INPUT,'<<');
- WRITELN(' INPUT CONVERTED AS ',CONVERT_TO_INT( USER_INPUT ));
- FOR X := 0 TO 79 DO WRITE('*');WRITELN;
- END;
- UNTIL ( USER_INPUT[1] = 'Q' );
- *)
- END {PROCEDURE_CONVERT_TO_INT};
-
-
- FUNCTION CONVERT_TO_HEX ( INT_IN : LONGINT ) : STRING79 ;
- VAR
- INTERMEDIATE_STRING_OUT
- ,STRING_OUT : STRING79;
-
- HEX_X
- ,DIGIT_POSITION
- ,CNT
-
- ,INT_REMAIN
- ,INT_CARRY
- ,DIGIT_DIVISOR
- ,DIGIT_WEIGHT : LONGINT;
-
- BEGIN
- {$IFDEF DEBUG_CONVERT_TO_HEX}
- WRITELN;
- WRITELN(' FUNCTION CONVERT_TO_HEX ');
- WRITELN(' INTEGER PASSED AS >',INT_IN,'<');
- WRITELN;
- {$ENDIF}
- INTERMEDIATE_STRING_OUT := '';
- STRING_OUT := '';
- INT_CARRY := INT_IN;
-
- DIGIT_DIVISOR := 1;
- DIGIT_POSITION := 1;
- REPEAT
- BEGIN
- DIGIT_WEIGHT := 1;
- FOR HEX_X:= 1 TO DIGIT_POSITION DO DIGIT_WEIGHT := DIGIT_WEIGHT * 16;
- INT_REMAIN := INT_CARRY MOD DIGIT_WEIGHT;
- INT_CARRY := INT_CARRY - INT_REMAIN ;
-
- {$IFDEF DEBUG_CONVERT_TO_HEX}
- WRITE ('DIGIT_POSITION = >', DIGIT_POSITION );
- WRITELN (' DIGIT_WEIGHT = >', DIGIT_WEIGHT ,'<');
- WRITE ('INT_CARRY = >',INT_CARRY,'<');
- WRITELN (' INT_REMAIN = >', INT_REMAIN , '<');
- WRITE ('DIGIT_DIVISOR = >',DIGIT_DIVISOR,'<');
- WRITELN (' STRING_OUT = >',STRING_OUT ,'<' );
- WRITELN;
- { WRITELN(' Hit enter to continue......'); READLN; }
- {$ENDIF}
-
- CASE ( INT_REMAIN DIV DIGIT_DIVISOR ) OF
-
- 0 : STRING_OUT := STRING_OUT + '0';
- 1 : STRING_OUT := STRING_OUT + '1';
- 2 : STRING_OUT := STRING_OUT + '2';
- 3 : STRING_OUT := STRING_OUT + '3';
- 4 : STRING_OUT := STRING_OUT + '4';
- 5 : STRING_OUT := STRING_OUT + '5';
- 6 : STRING_OUT := STRING_OUT + '6';
- 7 : STRING_OUT := STRING_OUT + '7';
- 8 : STRING_OUT := STRING_OUT + '8';
- 9 : STRING_OUT := STRING_OUT + '9';
- 10 : STRING_OUT := STRING_OUT + 'A';
- 11 : STRING_OUT := STRING_OUT + 'B';
- 12 : STRING_OUT := STRING_OUT + 'C';
- 13 : STRING_OUT := STRING_OUT + 'D';
- 14 : STRING_OUT := STRING_OUT + 'E';
- 15 : STRING_OUT := STRING_OUT + 'F';
- ELSE ERROR (' SOMETHING WRONG IN CONVERT_TO_HEX PROCEDURE..... ');
- END{CASE_INT_REMAIN};
-
- DIGIT_DIVISOR := 1;
- FOR HEX_X:= 1 TO DIGIT_POSITION DO DIGIT_DIVISOR := DIGIT_DIVISOR * 16;
- INC(DIGIT_POSITION);
- END
- UNTIL ( INT_CARRY=0 );
-
- {$IFDEF DEBUG_CONVERT_TO_HEX}
- WRITELN ('END OF DIGIT CONVERT, STRING_OUT = >',STRING_OUT,'<');
- WRITELN ('**** LENGTH OF CONVERTED STRING = ',LENGTH(STRING_OUT),' ****');
- {$ENDIF}
-
- FOR CNT := LENGTH(STRING_OUT) DOWNTO 1 DO
- BEGIN
-
- {$IFDEF DEBUG_CONVERT_TO_HEX_OUTPUT}
- WRITE ('INTERMEDIATE_STRING_OUT = >', INTERMEDIATE_STRING_OUT ,'<');
- WRITE (' CNT = >', CNT , '<');
- WRITELN (' STRING_OUT[CNT] = >',STRING_OUT[CNT],'<' );
- WRITELN;
- { WRITELN(' Hit enter to continue......'); READLN; }
- {$ENDIF}
-
- INTERMEDIATE_STRING_OUT := INTERMEDIATE_STRING_OUT + STRING_OUT[CNT];
- END;
- CONVERT_TO_HEX := INTERMEDIATE_STRING_OUT;
- (*
- { Used for debugging convert_to_hex procedure. }
- REPEAT
- BEGIN
- WRITELN('INPUT INTEGER TO CONVERT TO HEX.');
- READLN ( IN_NUM );
- USER_INPUT := CONVERT_TO_HEX( IN_NUM );
- WRITELN ('NUMBER CONVERTED = >',USER_INPUT,'<.');
- END
- UNTIL IN_NUM = 12345;
- *)
- END{PROCEDURE_CONVERT_TO_HEX};
-
-
- PROCEDURE SET_WRITE_DATA ( HEX_DATA : INTEGER );
- BEGIN
- PPI_WRITE ( DATA_PORT,HEX_DATA );
- END {PROCEDURE_SET_DATA};
-
-
-
- PROCEDURE LATCH_WRITE_DATA;
- BEGIN
- PPI_WRITE ( MODE_PORT, WRITE_BIT_ON ); { SET BIT 6 ON. }
- DELAY (1); { WAIT FOR SETUP TIME. }
- PPI_WRITE ( MODE_PORT, WRITE_BIT_OFF ); { TURN BIT 6 OFF. }
- END {PROCEDURE_LATCH_WRITE_DATA};
-
-
-
- PROCEDURE WAIT_FOR_NOT_BUSY;
- VAR CONTROL_DATA : INTEGER;
- BEGIN
- REPEAT
- CONTROL_DATA := PORT [PRT_PORT_STAT];
- {$IFDEF DEBUG_READ_BUSY}
- WRITELN('STATUS REGISTER READ AS >',CONTROL_DATA,'< HIT ENTER TO CONTINUE');
- READLN;
- {$ENDIF}
- UNTIL (CONTROL_DATA >= 128) {** BUSY BIT OFF = 128 OFF **};
- END {WAIT_FOR_NOT_BUSY};
-
- PROCEDURE WRITE_TO_EAROM(HEX_ADDR,HEX_DATA : INTEGER );
- BEGIN
- {$IFDEF DEBUG_NOT_BURNING} { DON'T WANT TO WRITE TO PROGRAMMER HARDWARE }
- (* WRITELN;
- WRITE (' EAROM ADDRESS >>',HEX_ADDR,'<< ');
- WRITELN(' EAROM DATA >>',HEX_DATA,'<<');
- WRITELN('Press enter to continue.......');
- READLN;
- *)
- {$ELSE} { ONLINE MODE, WRITE TO PROGRAMMER HARDWARE }
- SET_ADDRESS( HEX_ADDR );
- SET_WRITE_DATA ( HEX_DATA );
- WAIT_FOR_NOT_BUSY; { JUST IN CASE ??? }
- LATCH_WRITE_DATA;
- WAIT_FOR_NOT_BUSY;
- {$ENDIF}
- END {PROCEDURE_WRITE_TO_EAROM};
-
-
- PROCEDURE FILL_EAROM;
- VAR WRITE_DATA
- ,VERIFY_DATA : INTEGER;
- ADDR : LONGINT;
- HEX_DATA : STRING79;
- BEGIN
- WRITELN('INPUT HEX DATA TO FILL EAROM WITH. ( TWO DIGITS MAX )');
- READLN(HEX_DATA);
- WRITE_DATA := CONVERT_TO_INT(HEX_DATA);
-
- FOR ADDR := 0 TO MAX_ROM_SIZE DO
- BEGIN
- WRITE_TO_EAROM ( ADDR, WRITE_DATA );
- PPI_ADDR_READ ( ADDR, VERIFY_DATA);
- IF (VERIFY_DATA <> WRITE_DATA)
- THEN ERROR('TRY AGAIN, BAD EAROM WRITE !!!!!!!!!');
- END;
- END;
-
-
- PROCEDURE PROCESS_JEDEC_REC ( JEDEC_IN :STRING79 );
- VAR
- HEX_STRING :STRING79 ;
- LAST_RECORD : BOOLEAN; { set on last record of jedec }
- BYTE_CNT
- ,ERR_CNT
- ,REC_TYPE
- ,WRITE_DATA
- ,VERIFY_DATA
- ,CNT : INTEGER;
- START_ADDR : LONGINT;
- BEGIN
- {$IFDEF DEBUG_PROCESS_JEDEC}
- WRITELN('JEDEC RECORD PASSED TO PROCEDURE AS :');
- WRITE('>>>');
- WRITE( JEDEC_IN );
- WRITELN('<<<');
- {$ENDIF}
-
- IF JEDEC_IN[1] <> ':' THEN
- BEGIN
- WRITELN(JEDEC_IN );
- ERROR ('BAD JEDEC RECORD.');
- END;
-
- HEX_STRING := COPY ( JEDEC_IN, 2, 2);
- BYTE_CNT := CONVERT_TO_INT(HEX_STRING);
- {$IFDEF DEBUG_PROCESS_JEDEC}
- WRITELN('BYTE COUNT COMPUTED AS >>',BYTE_CNT,'<<');
- {$ENDIF}
- IF BYTE_CNT > 24 THEN
- BEGIN
- WRITELN ('BYTE COUNT > 24. BYTE_CNT = >',BYTE_CNT,'<');
- ERROR('BAD BYTE COUNT.');
- END;
-
- HEX_STRING := COPY ( JEDEC_IN, 4, 4 );
- START_ADDR := CONVERT_TO_INT(HEX_STRING);
- {$IFDEF DEBUG_PROCESS_JEDEC}
- WRITE ('START_ADDR = >',START_ADDR,'< STRING ADDRESS INPUT AS >');
- WRITE ( JEDEC_IN );
- WRITELN('<');
- {$ENDIF}
-
- HEX_STRING := COPY ( JEDEC_IN, 8, 2 );
- REC_TYPE := CONVERT_TO_INT ( HEX_STRING );
- {$IFDEF DEBUG_PROCESS_JEDEC}
- WRITE (' REC_TYPE = >',REC_TYPE,'< STRING INPUT TO CONVERT_TO_INT AS >');
- WRITELN( JEDEC_IN[8], JEDEC_IN[9],'< ');
- {$ENDIF}
- IF (REC_TYPE = 0) OR (REC_TYPE = 1)
- THEN { great }
- ELSE ERROR(' RECORD TYPE OF JEDEC RECORD NOT EQUAL TO 0 OR 1.');
- IF REC_TYPE = 1
- THEN LAST_RECORD := TRUE
- ELSE LAST_RECORD := FALSE;
- {$IFDEF DEBUG_PROCESS_JEDEC}
- IF LAST_RECORD THEN WRITELN('********** LAST RECORD FOUND ************.');
- {$ENDIF}
-
- IF NOT LAST_RECORD THEN
- BEGIN
- FOR CNT := 0 TO (BYTE_CNT-1) DO
- BEGIN
- HEX_STRING := COPY ( JEDEC_IN, (10+(CNT*2)), 2 );
- WRITE_DATA := CONVERT_TO_INT(HEX_STRING);
- {$IFDEF DEBUG_PROCESS_JEDEC}
- WRITELN;
- WRITE (' EAROM ADDRESS >>',START_ADDR+CNT,'<< ');
- WRITELN(' EAROM DATA >>',WRITE_DATA,'<<');
- WRITELN('Press enter to continue.......');
- READLN;
- {$ELSE}
- WRITE_TO_EAROM ( START_ADDR+CNT, WRITE_DATA );
- PPI_ADDR_READ ( START_ADDR+CNT, VERIFY_DATA);
- IF (VERIFY_DATA <> WRITE_DATA)
- THEN ERROR('TRY AGAIN, BAD EAROM WRITE !!!!!!!!!');
- {$ENDIF}
- END;
- { * * * * * * CHECK CHECKSUM ( FIRST ? )* * * * * * }
- END;
- END {PROCESS_JEDEC_REC};
-
-
- PROCEDURE BURN_EAROM ( FILE_IN : STRING79 );
- VAR
- USER_INPUT : STRING79;
- CODE : TEXT; { internal name of code file. }
- IO_Result : INTEGER;
- BEGIN
- { reads input file, passes input record to 'PROCESS_JEDEC_REC' to test. }
- IF FILE_IN = ''
- THEN
- BEGIN
- WRITELN('INPUT NAME OF FILE FOR CODE, INCLUDE PATH.');
- READLN ( USER_INPUT );
- END
- ELSE
- BEGIN
- USER_INPUT := FILE_IN;
- END;
-
- ASSIGN ( CODE,USER_INPUT );
- {$I-}
- RESET(CODE);
- {$I+}
- IO_Result := IOResult;
- IF IO_Result <> 0
- then BEGIN
- WRITELN ('File not found, try again. IOResult = ',IO_Result );
- WRITELN ('PRESS ENTER TO restart program.');
- READLN;
- Exit;
- END
- else
- REPEAT
- BEGIN
- WRITELN('READING JEDEC INPUT RECORD ......');
- READLN( CODE, USER_INPUT );
- IF EOF(CODE)
- THEN WRITELN('********** E O F Code Reached *********')
- ELSE
- BEGIN
- WRITELN('JEDEC RECORD READ IN AS');
- WRITE('>>');
- WRITE( USER_INPUT );
- WRITELN('<<');
- PROCESS_JEDEC_REC( USER_INPUT );
- END;
- END{REPEAT};
- UNTIL EOF(CODE);
- END {BURN_EAROM};
-
-
- {=============================================================================}
-
- PROCEDURE COMPARE_JEDEC_REC ( JEDEC_IN :STRING79; VAR ERROR_RETURN :BOOLEAN );
- VAR
- HEX_STRING :STRING79 ;
- LAST_RECORD : BOOLEAN; { set on last record of jedec }
- BYTE_CNT
- ,ERR_CNT
- ,REC_TYPE
- ,WRITE_DATA
- ,VERIFY_DATA
- ,CNT : INTEGER;
- START_ADDR : LONGINT;
- BEGIN
- ERROR_RETURN := FALSE;
-
- {$IFDEF DEBUG_COMPARE_JEDEC}
- WRITELN('JEDEC RECORD PASSED TO PROCEDURE AS :');
- WRITE('>>>');
- WRITE( JEDEC_IN );
- WRITELN('<<<');
- {$ENDIF}
-
- IF JEDEC_IN[1] <> ':' THEN
- BEGIN
- WRITELN(JEDEC_IN );
- ERROR ('BAD JEDEC RECORD.');
- END;
-
- HEX_STRING := COPY ( JEDEC_IN, 2, 2);
- BYTE_CNT := CONVERT_TO_INT(HEX_STRING);
- {$IFDEF DEBUG_COMPARE_JEDEC}
- WRITELN('BYTE COUNT COMPUTED AS >>',BYTE_CNT,'<<');
- {$ENDIF}
- IF BYTE_CNT > 24 THEN { Maximum per rec for Intel format }
- BEGIN
- WRITELN ('BYTE COUNT > 24. BYTE_CNT = >',BYTE_CNT,'<');
- ERROR('BAD BYTE COUNT.');
- END;
-
- HEX_STRING := COPY ( JEDEC_IN, 4, 4 ); { Extract starting addr }
- START_ADDR := CONVERT_TO_INT(HEX_STRING);
- {$IFDEF DEBUG_COMPARE_JEDEC}
- WRITE ('START_ADDR = >',START_ADDR,'< STRING ADDRESS INPUT AS >');
- WRITE ( JEDEC_IN );
- WRITELN('<');
- {$ENDIF}
-
- HEX_STRING := COPY ( JEDEC_IN, 8, 2 );
- REC_TYPE := CONVERT_TO_INT ( HEX_STRING );
- {$IFDEF DEBUG_COMPARE_JEDEC}
- WRITE (' REC_TYPE = >',REC_TYPE,'< STRING INPUT TO CONVERT_TO_INT AS >');
- WRITELN( JEDEC_IN[8], JEDEC_IN[9],'< ');
- {$ENDIF}
- IF (REC_TYPE = 0) OR (REC_TYPE = 1)
- THEN { great }
- ELSE ERROR(' RECORD TYPE OF JEDEC RECORD NOT EQUAL TO 0 OR 1.');
- IF REC_TYPE = 1
- THEN LAST_RECORD := TRUE
- ELSE LAST_RECORD := FALSE;
- {$IFDEF DEBUG_COMPARE_JEDEC}
- IF LAST_RECORD THEN WRITELN('********** LAST RECORD FOUND ************.');
- {$ENDIF}
-
- IF NOT LAST_RECORD THEN
- BEGIN
- FOR CNT := 0 TO (BYTE_CNT-1) DO
- BEGIN
- HEX_STRING := COPY ( JEDEC_IN, (10+(CNT*2)), 2 );
- WRITE_DATA := CONVERT_TO_INT(HEX_STRING);
- {$IFDEF DEBUG_COMPARE_JEDEC}
- WRITELN;
- WRITE (' EAROM ADDRESS >>',START_ADDR+CNT,'<< ');
- WRITELN(' EAROM DATA >>',WRITE_DATA,'<<');
- WRITELN('Press enter to continue.......');
- READLN;
- {$ELSE}
- PPI_ADDR_READ ( START_ADDR+CNT, VERIFY_DATA);
- IF (VERIFY_DATA <> WRITE_DATA)
- THEN BEGIN
- ERROR_RETURN := TRUE;
- WRITELN(' MISMATCH DETECTED, BAD EAROM COMPARE !!!!!!!!!');
- WRITE (' Decimal Address = >',START_ADDR+CNT,'< ');
- WRITE (' Data read as >', VERIFY_DATA,'< ');
- WRITELN(' Data should be >',WRITE_DATA,'< ');
- WRITELN(' ENTER TO CONTINUE............ ');
- READLN;
- END;
- {$ENDIF}
- END;
- { * * * * * * CHECK CHECKSUM ( FIRST ? )* * * * * * }
- END;
- END {COMPARE_JEDEC_REC};
-
-
-
-
-
- PROCEDURE COMPARE_EAROM ;
- VAR
- USER_INPUT : STRING79;
- CODE : TEXT; { internal name of code file. }
- IO_Result : INTEGER;
- Error_returned
- ,Error_Status : Boolean;
-
- BEGIN
- Error_status := false;
- { reads input file, passes input record to 'COMPARE_JEDEC_REC' to test. }
-
- WRITELN('INPUT NAME OF FILE FOR CODE, INCLUDE PATH.');
- READLN ( USER_INPUT );
-
- ASSIGN ( CODE,USER_INPUT );
- {$I-}
- RESET(CODE);
- {$I+}
- IO_Result := IOResult;
- IF IO_Result <> 0
- then BEGIN
- WRITELN ('File not found, try again. IOResult = ',IO_Result );
- WRITELN ('PRESS ENTER TO restart program.');
- READLN;
- exit;
- END
- else
- REPEAT
- BEGIN
- WRITELN('READING JEDEC INPUT RECORD ......');
- READLN( CODE, USER_INPUT );
- IF EOF(CODE)
- THEN WRITELN('********** E O F Code Reached *********')
- ELSE
- BEGIN
- WRITELN('JEDEC RECORD READ IN AS');
- WRITE('>>');
- WRITE( USER_INPUT );
- WRITELN('<<');
- COMPARE_JEDEC_REC( USER_INPUT, ERROR_RETURNED );
- IF Error_Returned=True THEN Error_Status := True;
- END;
- END{REPEAT};
- UNTIL EOF(CODE);
-
- CLRSCR;
- GotoXY(10,12);
- IF ( Error_Status = FALSE )
- THEN WRITELN(' N O E R R O R S O N C O M P A R E .')
- ELSE WRITELN(' E R R O R S O N C O M P A R E , (You''ve got problems)');
- WRITELN;
- GotoXY(10,14);
- WRITELN(' P R E S S E N T E R T O C O N T I N U E .');
- READLN;
- END {COMPARE_EAROM};
-
-
- {=============================================================================}
-
- PROCEDURE READ_EAROM_BLOCK;
- LABEL REENTER
- ,D_MODE ;
- VAR
- Display_Mode
- ,CHOICE : CHAR;
-
- SINGLE_STEP : BOOLEAN;
-
- HEX_START
- ,HEX_END
- ,DISP_HEX_ADDR
- ,DISP_HEX_DATA
- ,LINE_IN : STRING79;
-
- DATA : INTEGER;
-
- ADDR_START
- ,ADDR_END
- ,ADDR
- ,DISP_ADDR
- ,LINE_CNT : LONGINT;
-
- BEGIN
- REENTER :
- CLRSCR;
- GOTOXY(10,20); WRITELN(' Enter starting hex address to read EAROM.');
- GOTOXY(30,30);
- READLN( hex_start );
-
- GOTOXY(10,50); WRITELN(' Enter ending hex address to read EAROM.');
- GOTOXY(30,60);
- READLN( hex_end );
-
- D_MODE:
- GOTOXY(10,65); WRITELN(' Single Step or Display 16 Byte Blocks ?');
- GOTOXY(10,67); Writeln(' Enter S (single-step) or B (block-mode)');
- GOTOXY(30,69);
- READLN( Display_Mode );
- IF ( (DISPLAY_MODE='S')
- or (DISPLAY_MODE='s') )
- THEN SINGLE_STEP := TRUE
- ELSE IF ((DISPLAY_MODE='B')
- or (DISPLAY_MODE='b'))
- THEN SINGLE_STEP := FALSE
- ELSE BEGIN
- WRITELN(' Input an ''S'' or ''B'' only you idiot ....... ');
- GOTO D_MODE;
- END;
-
- ADDR_START := CONVERT_TO_INT ( HEX_START );
- ADDR_END := CONVERT_TO_INT ( HEX_END );
-
- IF ADDR_START > ADDR_END
- THEN BEGIN
- WRITELN('ERROR, STARTING ADDRESS LARGER THAN ENDING ADDRESS.');
- WRITELN('Enter an ''A'' to reenter addresses, Enter a ''Q'' to quit.');
- READLN (CHOICE);
- IF ((CHOICE = 'A') OR (CHOICE='a'))
- THEN GOTO REENTER
- ELSE EXIT {block};
- END;
-
- IF (ADDR_END > MAX_ROM_SIZE)
- THEN BEGIN
- WRITELN('ERROR, ENDING ADDRESS LARGER THAN MAX ROM SIZE.');
- WRITELN('Enter an ''A'' to reenter addresses, Enter a ''Q'' to quit.');
- READLN (CHOICE);
- IF ((CHOICE = 'A') OR (CHOICE='a'))
- THEN GOTO REENTER
- ELSE EXIT {block};
- END;
-
- CLRSCR;
- LINE_CNT := 0;
- GOTOXY(0,2);
-
- FOR ADDR := ADDR_START TO ADDR_END DO
- BEGIN
- PPI_ADDR_READ (ADDR,DATA);
- DISP_HEX_ADDR := CONVERT_TO_HEX(ADDR);
- DELETE ( DISP_HEX_ADDR,0,1 );
- WRITE (' ADDRESS = >', ADDR ,'< DATA = >', DATA ,'< HEX DATA = ');
- WRITELN (CONVERT_TO_HEX(DATA),' HEX ADDR = ', CONVERT_TO_HEX(ADDR) );
-
- INC(LINE_CNT);
- IF ( (LINE_CNT >= 16) or (single_step) )
- THEN BEGIN
- GOTOXY( 23,00);
-
- IF SINGLE_STEP
- THEN BEGIN
- { * * * * * * TO PROBE DATA AND ADDRESSES ON CHIP WHILE ON SCREEN * * * * * }
- { Set up mode register to set data port to read mode. }
- PORT [PRT_PORT_CNTL] := 04 {PORT_MODE} ;{ PUT 8255 Mode Addr on BUSS. }
- PORT [PRT_PORT_DATA] := 128 + 16 ;{ MODE_BIT + A_IN }
- PORT [PRT_PORT_CNTL] := 04 + 1 ;{ DROP WRITE LINE LOW. }
- DELAY(1); { 1 msec delay. }
- PORT [PRT_PORT_CNTL] := 04 ;{ RAISE WRITE LINE BACK HIGH. }
- SET_ADDRESS ( ADDR ); { }
- { Set /READ line low to EAROM. }
- PORT [PRT_PORT_CNTL] := 04; {PORT_MODE;}{ PUT 8255 Mode Reg Addr on BUS }
- PORT [PRT_PORT_DATA] := READ_BIT_ON; { Set read bit on via mode reg. }
- PORT [PRT_PORT_CNTL] := 04 + 1 {WRITE}; { DROP WRITE LINE LOW. }
- DELAY(1); { 1 msec delay. }
- PORT [PRT_PORT_CNTL] := 04; { RAISE WRITE LINE BACK HIGH. }
- { * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * }
- WRITELN('Data and addr on chip, Enter to display next address.');
- END
-
- ELSE WRITELN('Enter to display next 16 addresses.');
- READLN;
- CLRSCR;
- LINE_CNT := 0;
- GOTOXY(0,2);
- END;
- END {Addr_reads};
- WRITELN(' Hit Enter to return to menu.');
- READLN;
- END {READ_EAROM_BLOCK};
-
-
- PROCEDURE BEEP ( FREQ, SEC : INTEGER );
- BEGIN
- SOUND(FREQ);
- DELAY(SEC*100);
- NOSOUND;
- END; { Beep }
-
-
-
- PROCEDURE USE_MENU_MODE;
- VAR
- A_CHAR : CHAR; { used to read input able. }
-
- INPUT_FILE_PARAM : STRING79;
- BEGIN
-
- REPEAT
- BEGIN
- CLRSCR;
- GotoXY(20,8); WRITELN('ENTER CHOICE OF FUNCTION DESIRED.');
- GotoXY(10,12);WRITELN('A : To burn EAROM from jedec file input.');
- GotoXY(10,14);WRITELN('B : To verify an EAROM already burned from a file.');
- GotoXY(10,16);Writeln('C : To single step through an EAROM.');
- GotoXY(10,18);WRITELN('D : To fill an EAROM with a user input byte value.');
- GotoXY(10,20);Writeln('Q : TO QUIT PROGRAM.');
- GOTOXY(30,22);
- readln(A_CHAR);
- Input_File_Param := '';
-
- CASE A_CHAR OF
- 'A','a' : BEGIN BURN_EAROM (INPUT_FILE_PARAM); BEEP(500,2); END;
- 'B','b' : BEGIN COMPARE_EAROM; END;
- 'C','c' : BEGIN READ_EAROM_BLOCK ; BEEP(500,2); END;
- 'D','d' : BEGIN FILL_EAROM; BEEP(500,2); END;
- 'Q','q' : BEGIN BEEP(2000,1);HALT END;
- ELSE BEGIN
- WRITELN('INVALID ENTRY, Enter to continue.......');
- SOUND(35);
- DELAY(800);
- NOSOUND;
- DELAY(1000);
- END;
- END {CASE};
- END;
-
- UNTIL ((A_CHAR='Q') OR (A_CHAR='q'));
- END; { Use_Menu_Mode }
-
-
- {*****************************************************************************}
- {* T H E M A I N L I N E C O D E *}
- {*****************************************************************************}
- BEGIN
-
-
- WRITELN ('Initializing 8255 .................');
- ppi_write(MODE_PORT,128 );
- WRITELN ('Initialize complete................');
-
- INPUT_FILE_PARAM := '';
-
- IF ( PARAMCOUNT > 1 )
- THEN BEGIN
- Textcolor (0);
- TextBackGround (7);
- WRITELN('Too many parameters passed, check parameters input.');
- NormVideo;
- TextColor (15+blink );
- WRITELN('Hit enter to exit program.');
- NormVideo;
- READLN;
- HALT;
- END;
-
- IF PARAMCOUNT=0
- THEN USE_MENU_MODE
- ELSE BEGIN
- INPUT_FILE_PARAM := PARAMSTR(1);
- BURN_EAROM (INPUT_FILE_PARAM);
- END;
-
- END.