/*
AEPROM.C PROGRAMATOR EPROMOV
Nastavitve:
BYTE aligment! , SIGNED char, NO stack verflow test,
8088/86 instruction set, Optimize for SIZE, Use REGISTER variables,
REGISTER & JUMP optimization, COMPACT memory model
*/
#ifndef __COMPACT__
#error Preberi si zacetek programa
#endif
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>
#include <alloc.h>
#include <time.h>
#include "getopt.c"
void syntax(void)
{ puts(
"\nAltera EPROM programator Verzija 1.01 (C) 1991 Leon Kos, Cerknica, 791084\n"
"Sintaksa: AEPROM [-celwa<ARG>] [-ivhqpmtbr]\n\n"
"Opcije so ena ali vec opcijskih crk z argumentom ali brez, predznacenih z "
"\"-\"\npo standardni UNIX System V notaciji za opcije programov.\n"
" -w<file> pisi eprom na disk -l<file>beri BIN datoteko v spomin\n"
" -cnumber kanal programatorja -eeprom tip eproma (2732..27512A)\n"
" -i izpis tekocega stanja -v preveri praznost eproma\n"
" -h 21Vpp PGM napetost -q quiet, brez odvecnih sporocil\n"
" -m primerjaj spomin in eprom -a<n|f> normal, fast algoritem\n"
" -p programiranje eproma -b beep -r reset programator\n"
"\n"
"2716,2732 in nekateri 2764 nimajo elektronske signature, zato je potrebna\n"
"rocna nastavitev tipa eproma. 2716 se lahko programira le ce ima 21Vpgm (25V).\n\n"
"Primer: AEPROM -ea -ivqlc:\\xasm51\\mc.bin -pbbb \n"
"\tAVTOdetekcija eproma in kanala izpis informacij, kontrola praznosti,\n"
"\tbranje datoteke v spomin, programiranje eproma in zvok ob koncu.\n"
"Primer: AEPROM -e2764A -c1 -ld:\\aztecc\\plt.bin -m\n"
"\tIzbira eproma in kanala 1, branje podatkov v spomin in primerjava.\n"
"Primer: AEPROM -ea -iwepr12.bin\n"
"\tAVTOdetekcija eproma in kopiranje eproma na disk.");
}
#define BASE 0x0280 /* naslov kanala 0 */
#define LDIN (chan+0) /* Latched Data In offset IC5 */
#define LDOUT (chan+3) /* --||-- -||- Out offset IC11 */
#define CA10 (chan+1) /* Latched Address register IC10 */
#define CA9 (chan+2) /* Control register IC9 */
#define CA8 (chan+0) /* --||-- --||-- IC8 */
/* Napetostni nivoji */
#define VL 0 /* 0 Volts napetost za V<0..3> oz VD<0..3> */
#define VH 1 /* H nivo */
#define V5 2 /* +5V nivo za VD<0..3> sekcijo */
#define VP 3 /* Programska napetost na V<0..3> sekciji */
#define VZ 3 /* Visoka impendanca za VPGM */
/* Prikljucki za EPROM programetor */
/* PIN NET VALID STATES - REGISTER*/
#define A9 ctrl.bit.V0 /* VL|VH|VP - RA10*/
#define A10 ctrl.bit.LA0 /* VL|VP - RA10*/
#define A11 ctrl.bit.V1 /* VL|V5|VP - RA9 */
#define A12 ctrl.bit.LA3 /* VL|VH - RA10*/
#define A13 ctrl.bit.V3 /* VL|V5|VP - RA8 */
#define A14 ctrl.bit.LA2 /* VL|VH - RA10*/
#define A15 ctrl.bit.VPGM /* VL|VH|V5|VZ - RA8 */
#define OE_ ctrl.bit.V2 /* VL|V5|VP - RA9 */
#define CE_ ctrl.bit.LA1 /* VL|VH - RA10*/
#define OC_ ctrl.bit.TRIS_ /* VL|VH - RA8 */
#define RST ctrl.bit.LA5 /* VL|VH - RA9 */
#define CLK ctrl.bit.LA4 /* VL|VH - RA9 */
#define VCC ctrl.bit.VC /* VL|VH - RA9 */
#define CR8 ctrl.reg.c8 /* 6 bitni register */
#define CR9 ctrl.reg.c9 /* 8 bitni register */
#define CR10 ctrl.reg.c10 /* 6 bitni register */
/* makro funkcije */
#define UD8 outportb(CA8, CR8) /* Update register 8 */
#define UD9 outportb(CA9, CR9) /* Update register 9 */
#define UD10 outportb(CA10, CR10)/* Update register 10 */
enum VPP_VOLTAGE {VPP12, VPP12_5, VPP19_7, VPP21};
enum VCC_VOLTAGE {VCC5, VCC6};
enum EPROM_STYLE {M2716=2716, M2732=2732, M2764=2764, M27128=27128,
M27256=27256, M27512=27512};
enum READ_OPERATION {READ, COMPARE, VERIFY};
enum ALGORITHM {NORMAL, FAST, INTERACTIVE, FLASHRITE, QUICK_PULSE};
/* public spremenljivke */
int chan; /* kanal programatorja */
long addr; /* stevec naslovov A<0..15> */
unsigned normPW=50; /* sirina PGM pulza v ms pri norm. nacinu */
unsigned fastPW=1; /* sirina PGM pulza v ms pri hitrem nacinu */
unsigned char quiet=0; /* stikalo programiranje brez izpisa */
struct {
int type;
char version;
unsigned char manufacturer_code;
unsigned char device_code;
unsigned char vpp, algorithm;
}eprom = {0,' ',0,0,VPP12_5,NORMAL};
struct { /* pomnilniski bazen za tekoce delo */
unsigned char huge *buffer;
long size;
long offset;
}pool;
union {
struct {/* polje registrov */
unsigned c8 :6;
unsigned c9 :8;
unsigned c10 :6;
}reg;
struct {/* polje bitov */
unsigned VPGM :2; /* c8 bit_0 */
unsigned V3 :2;
unsigned TRIS_ :1;
unsigned V1 :2; /* c8 bit_5 & c9 bit_0 */
unsigned LA4 :1;
unsigned V2 :2;
unsigned VS2 :1; /* c9 bit_4 */
unsigned VC :1;
unsigned VS1 :1;
unsigned LA5 :1;
unsigned LA0 :1; /* c10 bit_0 */
unsigned LA1 :1;
unsigned LA2 :1;
unsigned LA3 :1;
unsigned V0 :2; /* c10 bit_5_to_6 */
}bit;
}ctrl={0,0,0};
void print_info(void) /*izpise tekoce informacije na stdout*/
{
printf(
"Kanal %d = %04Xh\t\t"
"Tip eproma: %d%c\n"
"Koda proizvajalca: %02X \tProizvajalec: ",
(chan-BASE)/4, chan, eprom.type, eprom.version,
eprom.manufacturer_code);
switch(eprom.manufacturer_code){
case 0x01: printf("AMD\n"); break;
case 0x24: printf("Hitachi\n"); break;
case 0x20: printf("SGS-Thomson\n"); break;
case 0x89: printf("Intel\n");break;
default: printf("Nepoznan\n"); break;
}
printf("Koda eproma: %02X \tEprom: ", eprom.device_code);
switch(eprom.device_code){
case 0x18: printf("2764\n"); break;
case 0x08: printf("2764A\n"); break;
case 0x20: printf("2764A\n"); break;
case 0x83: printf("27128\n"); break;
case 0x89: printf("27128A\n"); break;
case 0x04: printf("27256A\n"); break;
case 0x0D: printf("27512A\n"); break;
case 0x15: printf("27C64\n"); break;
case 0x16: printf("27C128\n"); break;
case 0x10: printf("27C256\n"); break;
case 0x91: printf("27C512\n"); break;
default: printf("______\n"); break;
}
printf("Programska napetost %.1f V\nAlgoritem: ",
(eprom.vpp==VPP12_5) ? 12.5:21.0);
switch(eprom.algorithm){
case NORMAL: printf("Normal\n"); break;
case FAST: printf("Fast Programming\n"); break;
case INTERACTIVE: printf("Interactive\n"); break;
case FLASHRITE: printf("Flashrite\n"); break;
case QUICK_PULSE: printf("Quick Pulse\n"); break;
default: printf("None\n");
}
printf("Podatki v spominu dolzine %u bytov in offset 0x%04X\n",
pool.size, pool.offset);
}
void set_vpp(int vpp) /* nastavi ustrezno programsko napetost */
{
switch(vpp){
case VPP12: ctrl.bit.VS1=VL; ctrl.bit.VS2=VL; break;
case VPP12_5: ctrl.bit.VS1=VH; ctrl.bit.VS2=VL; break;
case VPP19_7: ctrl.bit.VS1=VL; ctrl.bit.VS2=VH; break;
case VPP21: ctrl.bit.VS1=VH; ctrl.bit.VS2=VH; break;
default: printf("nepravilna programska napetost\n");exit(1);
}
}
void reset_addr(int eprom) /* zbrise stevec naslovov eproma na 0000h */
{
CLK=VL; RST=VH; UD9; delay(1); /* brisemo A<0..8> */
addr=0;
switch(eprom){
case M27512: A15=VL;
case M27256: A14=VL;
case M27128: A13=VL;
case M2764: A12=VL;
case M2732: A11=VL;
case M2716: A10=VL;
A9 =VL;
break;
default: printf("Tip eproma ni podan\n"); exit(1);
}
RST=VL; UD9; delay(1);
}
void inc_addr(int eprom) /* naslov se poveca za 1 */
{
CLK=VH; UD9;
addr++;
switch(eprom){
case M27512: A15= (addr & 0x8000)&&1;
case M27256: A14= (addr & 0x4000)&&1;
case M27128: A13=((addr & 0x2000)&&1)<<1;
case M2764: A12= (addr & 0x1000)&&1;
case M2732: A11=((addr & 0x0800)&&1)<<1;
case M2716: A10= (addr & 0x0400)&&1;
A9 =((addr & 0x0200)&&1)<<1;
break;
default: printf("Tip eproma ni podan\n"); exit(1);
}
UD8;UD10;
CLK=VL; UD9; /* Povecaj naslov za 1 se za A<0..8> */
}
long get_last_addr(int eprom) /*vrne zadnji naslov v epromu*/
{
switch(eprom){
case M2716: return 2047;
case M2732: return 4095;
case M2764: return 8191;
case M27128: return 16383;
case M27256: return 32767;
case M27512: return -1;
default: printf("Tip eproma ni podan\n"); exit(1);
}
return 0;
}
int read_eprom(int eprom, int operation) /* Operation: 0=beri v bazen,*/
{ /* 1=compare, 2=verify 0xFF */
/* ob uspehu vrne 0, sicer vrne -1 */
long last;
set_vpp(VPP12);
CE_=OE_=OC_=VL;
switch(eprom){
case M2716: A11=V5;
case M2732: A13=V5; break;
case M2764: case M27128:
case M27256: case M27512: A14=A15=VH; break;
default: printf("Tip eproma ni podan pravilno\n");
exit(1);
}
reset_addr(eprom);
UD8; UD9; UD10;
switch(operation){
case COMPARE: for(;addr<pool.size;inc_addr(eprom))
if(inportb(LDIN)!=pool.buffer[addr]) return -1;
break;
case VERIFY: last=get_last_addr(eprom);
for(; addr<=last; inc_addr(eprom))
if(inportb(LDIN)!=0xFF) return -1;
break;
case READ:last=get_last_addr(eprom);
for(; addr<=last; inc_addr(eprom))
pool.buffer[addr]=inportb(LDIN);
{ long c;
for(c=last; pool.buffer[c]==0xFF; c--);
pool.size=c+1;
}
break;
}
return 0;
}
void prog_normal(int eprom) /*normalen 50ms programski algoritem*/
{
if(!quiet){
printf("Predviden cas programiranja je %.1f minute\n\n",
(float)pool.size*(float)(1+normPW)/60000.0);
}
while(addr<=pool.size+pool.offset){
if(pool.buffer[addr]==0xFF) goto next; /* FFh ni potrebno programirati*/
outportb(LDOUT,pool.buffer[addr]);
if(!(addr%100)&& !quiet) printf("\r%3.1f'",
(float)(pool.size-addr)*(float)normPW/60000.0);
switch(eprom){ /*programiramo 1 byte*/
case M2716: CE_=VH; UD10; delay(normPW); CE_=VL; UD10; break;
case M2732: CE_=VL; UD10; delay(normPW); CE_=VH; UD10; break;
case M2764:
case M27128: A14=VL; UD10; delay(normPW); A14=VH; UD10; break;
case M27256:
case M27512: CE_=VL; UD10; delay(normPW); CE_=VH; UD10; break;
}
next:
inc_addr(eprom);
}
}
unsigned char read_one_byte(int eprom) /* bere byte pri hitrem programiranju */
{
unsigned char one_byte;
OC_=VL; UD8;
switch(eprom){
case M2716:
case M2764:
case M27128:
case M27256: OE_=VL; UD9; one_byte=inportb(LDIN); break;
case M2732:
case M27512: OE_=VL; UD9; CE_=VL; UD10; one_byte=inportb(LDIN); break;
}
switch(eprom){
case M2716:
case M2764:
case M27128:
case M27256: OE_=V5; UD9; break;
case M2732:
case M27512: CE_=VH; UD10; OE_=VP; UD9; break;
}
return one_byte;
}
void prog_fast(int eprom) /*hiter programski algoritem*/
{
unsigned x;
VCC=VCC6; UD9;
while(addr<=pool.size+pool.offset){
outportb(LDOUT,pool.buffer[addr]);
if(!(addr%100)&& !quiet) printf("\r%3.1f%% ",
(float)(pool.size-addr)/(float)pool.size*100.0);
for(x=0;;x++){
OC_=VH; UD8;
switch(eprom){ /*programiramo 1 byte 1ms*/
case M2716: CE_=VH; UD10; delay(fastPW); CE_=VL; UD10; break;
case M2732: CE_=VL; UD10; delay(fastPW); CE_=VH; UD10; break;
case M2764:
case M27128: A14=VL; UD10; delay(fastPW); A14=VH; UD10; break;
case M27256:
case M27512: CE_=VL; UD10; delay(fastPW); CE_=VH; UD10; break;
}
if(x==26){
printf("\rProgramiranje eproma ni uspelo na lokaciji 0x%04X\n",addr);
return;
}
if(read_one_byte(eprom)==pool.buffer[addr]) break;
}
OC_=VH; UD8;
switch(eprom){ /*programiramo 1 byte 3*x casa da je gotovo zapecen*/
case M2716: CE_=VH; UD10; delay(3*x*fastPW); CE_=VL; UD10; break;
case M2732: CE_=VL; UD10; delay(3*x*fastPW); CE_=VH; UD10; break;
case M2764:
case M27128: A14=VL; UD10; delay(3*x*fastPW); A14=VH; UD10; break;
case M27256:
case M27512: CE_=VL; UD10; delay(3*x*fastPW); CE_=VH; UD10; break;
}
inc_addr(eprom);
}
VCC=VCC5; UD9;
}
void program(void) /* glavna rutina ze programiranje eproma */
{
clock_t start_time, elapsed_time; /*cas v sekundah porabljen za prog. */
if(!quiet){
char odgovor;
fflush(stdin);
print_info();
printf("Ali naj programiram? (D:N) >>>");
scanf("%c",&odgovor);
if(odgovor!='d' && odgovor!='D') return;
}
if(pool.size==0) {
printf("Ni podatkov v spomin za programiranje eproma\n");
return;
}
start_time=clock();
if(eprom.vpp==VPP12_5) set_vpp(VPP12_5);
else set_vpp(VPP21);
reset_addr(eprom.type);
if(pool.offset!=0) for(;addr!=pool.offset;inc_addr(eprom.type));
OC_=VL; VCC=VCC5;
switch(eprom.type){ /*nastavimo zacetna programska pogoje */
case M2716: A13=A15=V5; UD8; CE_=VL; UD10; OE_=V5; A11=VP; UD9; break;
case M2732: A13=A15=V5; UD8; CE_=VH; UD10; OE_=VP; UD9; break;
case M2764:
case M27128: CE_=VL; A14=VH; UD10; OE_=V5; UD9; A15=V5; UD8; break;
case M27256: CE_=VH; UD10; OE_=V5; UD9; A15=V5; UD8; break;
case M27512: CE_=VH; UD10; OE_=VP; UD9; break;
default: printf("Tip eproma ni podan\n"); exit(1);
}
outportb(LDOUT,123);
OC_=VH; UD8;
if(inportb(LDIN)!=123){
printf("Napacen naslov programatorja %xh\n",chan);
exit(1);
}
delay(2); /* pocakaj se kaksno milisekundo da se stvari normalizirajo */
switch(eprom.algorithm){
case NORMAL: prog_normal(eprom.type); break;
case FAST: prog_fast(eprom.type); break;
default: printf("Ostali algoritmi se niso sprogramirani!\n");
exit(1);
}
switch(eprom.type){ /*nastavimo normalne pogoje */
case M2716: A11=VL; OE_=V5; UD9; A13=A15=VL; UD8; CE_=VH; UD10; break;
case M2732: OE_=V5; UD9; A13=A15=VL; UD8; CE_=VH; UD10; break;
case M2764:
case M27128: A15=VL; UD8; A14=VL; UD10; OE_=V5; UD9; break;
case M27256: A15=VL; UD8; CE_=VH; UD10; OE_=V5; UD9; break;
case M27512: OE_=V5; UD9; CE_=VH; UD10; break;
}
CE_=VH; OE_=V5; A15=VL; reset_addr(eprom.type); UD8; UD10;
if(!quiet){
if(read_eprom(eprom.type,COMPARE))
printf("\rEprom ni uspesno sprogramiran !\n");
else {
printf("\rEprom je sprogramiran !\n");
elapsed_time = (clock()-start_time)/CLK_TCK;
printf("Potrebno je bilo %.1f minute",
(float)elapsed_time/60.0);
if(eprom.algorithm!=NORMAL && elapsed_time!= 0){
printf(" kar je %.0f krat hitreje kot pri normalnem algoritmu.\n",
(float)pool.size*(float)normPW/1000.0 / (float)elapsed_time);
}
else puts(".\n");
}
}
}
int find_chan(void) /* avtomatsko isce kanal programatorja */
{
for(chan=BASE;chan<BASE+16*4;chan+=4){
reset_addr(M27512);
OE_=V5; CE_=VH; VCC=VCC5;
UD9; UD10; OC_=VH; UD8;
outportb(LDOUT,0xAA);
if(inportb(LDIN)==0xAA){
outportb(LDOUT,0x55);
if(inportb(LDIN)==0x55)
return chan; /* vrne HEX naslov kanala */
}
}
return -1; /* ob neuspehu vrne -1 */
}
void detect_device(void) /* avtomatsko detektira eprom v podnozju */
{ /* ob uspehu nastavi vse potrebne stvari */
set_vpp(VPP12);
reset_addr(M27512);
OC_=VL; UD8;
VCC=VCC5;
CE_=VL; OE_=VL; A14=A15=VH; UD9; UD8;
A9=VP; UD10;
eprom.manufacturer_code=inportb(LDIN);
CLK=VH; UD9; CLK=VL; UD9; /* Povecaj naslov za 1*/
eprom.device_code=inportb(LDIN);
A9=A14=A15=VL; UD8; OE_=V5; CE_=VH; UD9; UD10;
reset_addr(M27512);
eprom.algorithm=NORMAL;
switch(eprom.device_code){
case 0x18: eprom.type=M2764; eprom.version=' '; eprom.vpp=VPP21; break;
case 0x08: eprom.type=M2764; eprom.version='A'; break;
case 0x20: eprom.type=M2764; eprom.version='A'; break;
case 0x83: eprom.type=M27128; eprom.version=' '; break;
case 0x89: eprom.type=M27128; eprom.version='A'; break;
case 0x04: eprom.type=M27256; eprom.version='A'; break;
case 0x0D: eprom.type=M27512; eprom.version='A'; break;
case 0x15: eprom.type=M2764; eprom.version='C'; break;
case 0x16: eprom.type=M27128; eprom.version='C'; break;
case 0x10: eprom.type=M27256; eprom.version='C'; break;
case 0x91: eprom.type=M27512; eprom.version='C'; break;
default: eprom.type=0; eprom.version='A'; eprom.vpp=VPP12_5;
printf("Detekcija eproma je vprasljiva!\n");
}
switch(eprom.device_code){
case 0x20: case 0x89: case 0x04: case 0x0D: case 0x15: case 0x16:
case 0x10: case 0x91: case 0x08: eprom.vpp=VPP12_5; eprom.algorithm=FAST;
}
}
void test(void) /* trash */
{
outportb(CA8,0x00);
outportb(CA9,0x00);
outportb(CA10,0x30);
CR8=CR9=CR10=0;
OC_=VL;
OE_=V5;
UD8;UD9; UD10;
}
void key(void) /* flush stdin in caka na tipko */
{
bdos(0x0C,0x0000,0x07);
}
void trim(int chan) /* nastavljanje trimer potenciometrov programatorja*/
{
int i;
printf("ALTERA APLUS programator\n\n"
"Nastavljanje napetosti programatorja\n(C) 1991 L.K.\n\n");
for(i=0;i<16;i++) printf("Ch %2d = %04Xh\t", i, BASE+i*4);
while(chan<BASE || chan>BASE+15*4){
fflush(stdin);
printf("Kanal programatorja (0..15) >>> ");
scanf("%d",&chan);
}
printf("\nNastavi napetost VR2 s trimerjem R30 na 5.33V\n");
outportb(chan+2,0); key();
printf("Napetost VR2 je sedaj cca 6.23V\n");
outportb(chan+2,0xFF); key();
printf("Zdaj pa je spet 5.33V\n\n");
outportb(chan+2,0); key();
printf("Nastavi napetost VR1 s trimerjem R27 na 12.5V\n");
outportb(chan+2,0x40); key();
printf("Nastavi napetost VR1 s trimerjem R28 na 21.1V\n");
outportb(chan+2,0x50); key();
printf("Nastavi napetost VR1 s trimerjem R32 na 19.7V\n");
outportb(chan+2,0x10); key();
printf("Napetost VR1 mora sedaj biti 12.0V\n\n");
outportb(chan+2,0x00); key();
printf("Meri programsko napetost na uporu R23\n"
"Zdaj mora biti napetost 0V\n");
outportb(chan,0x00); key();
printf("Zdaj je 5.0V\n");
outportb(chan+2,0x00); outportb(chan,0x01); key();
printf("Zdaj je 5.9V\n");
outportb(chan+2,0x20); outportb(chan,0x01); key();
printf("Zdaj je 12.0V\n");
outportb(chan+2,0x20); outportb(chan,0x02); key();
printf("Zdaj je 12.5V\n");
outportb(chan+2,0x40); outportb(chan,0x02); key();
printf("Zdaj je 19.7V\n");
outportb(chan+2,0x10); outportb(chan,0x02); key();
printf("Zdaj je 21.1V\n");
outportb(chan+2,0x50); outportb(chan,0x02); key();
printf("Zdaj je 5.3V plavajoce napetosti Z=50kohm\n");
outportb(chan+2,0x00); outportb(chan,0x03); key();
}
void main(int argc, char *argv[])
{
char *optionS="e:tc:zl:ivhqpw:mbra:";
int opt;
FILE *fp;
if(argc==1) {
syntax();
exit(0);
}
if((pool.buffer=(unsigned char *)farmalloc(0x10000L))==NULL){
perror("64k farmalloc "); /*rezerviramo pomnilnik za bazen*/
exit(errno);
}
pool.offset=0;
chan=find_chan();
SW='-'; /* opijsko stikalo*/
while((opt=getopt(argc,argv,optionS))!=EOF){
switch(opt) {
case 't': trim(chan);
exit(0);
case 'c': if(sscanf(optarg,"%d",&chan)==1)
chan=BASE+4*chan;
if(chan<BASE || chan>BASE+15*4) {
printf("Napacen kanal programatorja #%d (0..15)",chan);
exit(1);
}
chan=find_chan();
CR8=CR9=CR10=0; reset_addr(M27512);
OE_=V5; CE_=VH; UD8;UD9;UD10;
break;
case 'h': eprom.vpp=VPP21;
break;
case 'q': quiet++; break;
case 'e': eprom.version=' ';
if(sscanf(optarg,"%d%c",&eprom.type,&eprom.version)==0 &&
optarg[0]=='a') detect_device();
else {
if(eprom.version==-1)
eprom.vpp=VPP21;
else
eprom.vpp=VPP12_5;
switch(eprom.type){
case M2716: case M2732: eprom.algorithm=NORMAL; break;
default: eprom.algorithm=FAST;
}
}
break;
case 'l': /* bere binarno datoteko v bazen */
if((fp=fopen(optarg,"rb"))==NULL){
perror(optarg);
exit(errno);
}
pool.size=0;
while(!feof(fp))
pool.buffer[pool.size++]=(unsigned char)fgetc(fp);
pool.size--;
if(errno) {
perror(optarg); exit(errno);
}
fclose(fp);
break;
case 'w': /*pise vsebino eproma v bazen in na disk*/
if((fp=fopen(optarg,"wb"))==NULL){
perror(optarg);
exit(errno);
}
read_eprom(eprom.type,READ);
for(addr=0;addr<pool.size;addr++)
if(fputc(pool.buffer[addr],fp)==EOF){
perror(optarg);
exit(errno);
}
fclose(fp);
break;
case 'i': print_info();
break;
case 'v': if(read_eprom(eprom.type,VERIFY))
printf("Eprom ni prazen!\n");
else
printf("Eprom je prazen.\n");
break;
case 'p': program(); break;
case 'z': test();
break;
case 'm': if(read_eprom(eprom.type,COMPARE))
printf("Eprom in podatki niso enaki\n");
else
printf("Eprom in podatki so identicni.\n");
break;
case 'b': sound(1000); delay(200); nosound();
case 'r': CR8=CR9=CR10=0; reset_addr(M27512);
OE_=V5; CE_=VH; UD8;UD9;UD10;
break;
case 'a': switch(optarg[0]){
case 'n': eprom.algorithm=NORMAL; break;
case 'f': eprom.algorithm=FAST; break;
default: printf("Nepravilen algoritem %c.\n"
"Pravilno je -an ali -af .\n",optarg[0]);
}
break;
}
}
CR8=CR9=CR10=0; reset_addr(M27512);
OE_=V5; CE_=VH; UD8;UD9;UD10;
farfree((void *)pool.buffer);
}