add version : 2.3

This commit is contained in:
Oliver Lehmann 1989-11-17 08:32:12 +00:00
parent 886d9ee47b
commit 336f7c17fb
1 changed files with 165 additions and 106 deletions

View File

@ -2,7 +2,7 @@
* * * *
* pburn - prom programmer * * pburn - prom programmer *
* * * *
* pb1.file.c : wega p8000 16-bit-teil * * pb2.file.c : wega p8000 16-bit-teil *
* c-quelle * * c-quelle *
* * * *
************************************************************************/ ************************************************************************/
@ -49,8 +49,8 @@
/* identifier file /* identifier file
--------------- */ --------------- */
extern char namef[50], namee1[20], bre, sect; extern char namef[50], namee1[20], bre, sect;
extern int kenns, kennfo; extern int kenns, kennfo, kennB, kennw, kennD;
extern unsigned segnr, begadrf, begadre1, begadre2, entryf, lange1, lange2, langf, prlang; extern long segnr, begadrf, begadre1, begadre2, entryf, lange1, lange2, langf, prlang;
extern int answer, next; extern int answer, next;
/* identifier error /* identifier error
@ -97,18 +97,22 @@ struct st2
struct st2 segt, bsegt; struct st2 segt, bsegt;
int fd,fd1; /* file deskriptor */ int fd,fd1; /* file deskriptor */
unsigned nbytes; /* read n bytes */ long nbytes; /* read n bytes */
unsigned n_read; /* tatsaechlich gelesene bytes */ long n_read; /* tatsaechlich gelesene bytes */
unsigned n_write; /* tatsaechlich geschriebene bytes */ long n_write; /* tatsaechlich geschriebene bytes */
int offset256; /* offset/256 */ int offset256; /* offset/256 */
int zsegt, zhl1, zhl2; int zsegt;
unsigned adr, len; unsigned zhl1, zhl2;
long adr, len;
int cfd, cfd1; int cfd, cfd1;
long aoffset, hoffset, boffset, offset; long aoffset, hoffset, boffset, offset;
char progbuf[0x4000]; char progbuf[0xfffe]; /*program buffer*/
char progffff; /*adr ffff prom e27512 program buffer*/
char *peprombuf; char *peprombuf;
char *pprogbuf; char *pprogbuf;
char eprombuf[0x4000]; char eprombuf[0xfffe]; /*prom buffer*/
char epromffff; /*adr ffff prom e27512 prom buffer*/
/* open filename /* open filename
------------- */ ------------- */
@ -117,51 +121,90 @@ openfile()
fd=open (namef,rmode); fd=open (namef,rmode);
cfd=1; cfd=1;
if (fd==-1) {error=3; outerr(); return;} if (fd==-1) {error=3; outerr(); return;}
nbytes=24;
n_read=read (fd,&s_exec,nbytes);
if (n_read!=nbytes||n_read==0) {error=8; outerr(); return;}
if (s_exec.s_magic!=S_MAGIC1&&s_exec.s_magic!=S_MAGIC3&&s_exec.s_magic!=S_MAGIC4&&
s_exec.s_magic!=N_MAGIC1&&s_exec.s_magic!=N_MAGIC3&&s_exec.s_magic!=N_MAGIC4&&
s_exec.s_magic!=X_MAGIC1&&s_exec.s_magic!=X_MAGIC3&&s_exec.s_magic!=X_MAGIC4)
{error=5; outerr(); return;}
nbytes=16;
zsegt=s_exec.s_segt;
zhl1=0;
zhl2=0;
boffset=24;
do if (kennB==1)
{ { /* behandlung binary-dateien (ausfuehrbare dateien)*/
n_read=read (fd,&bsegt,nbytes); nbytes=512L;
if (n_read!=nbytes||n_read==0) {error=8; outerr(); return;} boffset=0L;
if (zhl2==0) {if (segnr==bsegt.sg_segno) {zhl2=1; do
segt.sg_segno=bsegt.sg_segno; {
segt.sg_coff=bsegt.sg_coff; n_read=read (fd, progbuf, nbytes);
segt.sg_doff=bsegt.sg_doff; if (n_read==-1) {error=8; outerr(); return;}
segt.sg_boff=bsegt.sg_boff; if (n_read==0L) break;
segt.sg_code=bsegt.sg_code; boffset=boffset+n_read;
segt.sg_data=bsegt.sg_data; }while (n_read!=0L);
segt.sg_bss=bsegt.sg_bss; if (boffset>0xffffL) {warning=13; outwar();}
segt.sg_atr=bsegt.sg_atr; if (kennw==1) s_exec.s_magic=N_MAGIC1;
segt.sg_unused=bsegt.sg_unused;}} else s_exec.s_magic=X_MAGIC1;
hoffset=16; s_exec.s_imsize=boffset;
boffset=boffset+hoffset; s_exec.s_bss=0;
if (zhl2==0) {hoffset=bsegt.sg_code; s_exec.s_segt=0x10;
boffset=boffset+hoffset; s_exec.s_syms=0;
hoffset=bsegt.sg_data; s_exec.s_entry=0;
boffset=boffset+hoffset;} s_exec.s_flag=0x0001;
zsegt=zsegt-16; s_exec.s_codesz=0;
}while (zsegt!=0); s_exec.s_lines=0;
if (zhl2==0) {error=6; outerr(); return;}
if (sect=='d') {if (s_exec.s_magic!=S_MAGIC3&&s_exec.s_magic!=N_MAGIC3) segt.sg_segno=segnr;
{error=7; outerr(); return;} segt.sg_coff=0;
if (kennfo==0) {begadrf=segt.sg_doff; segt.sg_doff=0;
begadrf=begadrf << 8;}} segt.sg_boff=0;
else {if (kennfo==0) {eof=segt.sg_atr & 0x0003; segt.sg_bss=0;
if (eof==2) begadrf=segt.sg_doff; segt.sg_unused=0;
else begadrf=segt.sg_coff; segt.sg_code=boffset;
begadrf=begadrf << 8;}} segt.sg_data=0;
} segt.sg_atr=1;
boffset=0L;
}
else { /*behandlung a.out-dateien*/
nbytes=24L;
n_read=read (fd,&s_exec,nbytes);
if (n_read!=nbytes||n_read==0L) {error=8; outerr(); return;}
if (s_exec.s_magic!=S_MAGIC1&&s_exec.s_magic!=S_MAGIC3&&s_exec.s_magic!=S_MAGIC4&&
s_exec.s_magic!=N_MAGIC1&&s_exec.s_magic!=N_MAGIC3&&s_exec.s_magic!=N_MAGIC4&&
s_exec.s_magic!=X_MAGIC1&&s_exec.s_magic!=X_MAGIC3&&s_exec.s_magic!=X_MAGIC4)
{error=5; outerr(); return;}
nbytes=16L;
zsegt=s_exec.s_segt;
zhl1=0;
zhl2=0;
boffset=24L;
do
{
n_read=read (fd,&bsegt,nbytes);
if (n_read!=nbytes||n_read==0) {error=8; outerr(); return;}
if (zhl2==0) {if (segnr==bsegt.sg_segno) {zhl2=1;
segt.sg_segno=bsegt.sg_segno;
segt.sg_coff=bsegt.sg_coff;
segt.sg_doff=bsegt.sg_doff;
segt.sg_boff=bsegt.sg_boff;
segt.sg_code=bsegt.sg_code;
segt.sg_data=bsegt.sg_data;
segt.sg_bss=bsegt.sg_bss;
segt.sg_atr=bsegt.sg_atr;
segt.sg_unused=bsegt.sg_unused;}}
hoffset=16L;
boffset=boffset+hoffset;
if (zhl2==0) {hoffset=bsegt.sg_code;
boffset=boffset+hoffset;
hoffset=bsegt.sg_data;
boffset=boffset+hoffset;}
zsegt=zsegt-16;
}while (zsegt!=0);
if (zhl2==0) {error=6; outerr(); return;}
if (sect=='d') {if (s_exec.s_magic!=S_MAGIC3&&s_exec.s_magic!=N_MAGIC3)
{error=7; outerr(); return;}
if (kennfo==0) {begadrf=segt.sg_doff;
begadrf=begadrf << 8;}}
else {if (kennfo==0) {eof=segt.sg_atr & 0x0003;
if (eof==2) begadrf=segt.sg_doff;
else begadrf=segt.sg_coff;
begadrf=begadrf << 8;}}
}
}
/* read file /* read file
@ -170,8 +213,8 @@ openfile()
readfile () readfile ()
{ {
int bwarning, beof; int bwarning, beof;
for (zhl2=0;zhl2<0x4000;zhl2++) progbuf[zhl2]=0xff; for (zhl2=0;zhl2<langf;zhl2++) progbuf[zhl2]=0xff;
for (zhl2=0;zhl2<0x4000;zhl2++) eprombuf[zhl2]=0xff; for (zhl2=0;zhl2<langf;zhl2++) eprombuf[zhl2]=0xff;
bwarning=true, beof=true; bwarning=true, beof=true;
offset=boffset; offset=boffset;
if (s_exec.s_magic==X_MAGIC3||s_exec.s_magic==N_MAGIC3||s_exec.s_magic==S_MAGIC3) if (s_exec.s_magic==X_MAGIC3||s_exec.s_magic==N_MAGIC3||s_exec.s_magic==S_MAGIC3)
@ -209,7 +252,10 @@ else /* executable and overlay */
switch (bre) switch (bre)
{ {
case 's': zhl1=1; break; case 's': zhl1=1; break;
case 'h': zhl1=2; nbytes=nbytes/2; break; case 'h': zhl1=2;
if ((nbytes % 2) > 0) nbytes=nbytes/2+1;
else nbytes=nbytes/2;
break;
case 'l': zhl1=2; nbytes=nbytes/2; peprombuf++; break; case 'l': zhl1=2; nbytes=nbytes/2; peprombuf++; break;
} }
for (;nbytes>0;pprogbuf++,peprombuf=peprombuf+zhl1,nbytes--) for (;nbytes>0;pprogbuf++,peprombuf=peprombuf+zhl1,nbytes--)
@ -234,7 +280,10 @@ else /* executable and overlay */
switch (bre) switch (bre)
{ {
case 's': zhl1=1; break; case 's': zhl1=1; break;
case 'h': zhl1=2; nbytes=nbytes/2; break; case 'h': zhl1=2;
if ((nbytes % 2) > 0) nbytes=nbytes/2+1;
else nbytes=nbytes/2;
break;
case 'l': zhl1=2; nbytes=nbytes/2; peprombuf++; break; case 'l': zhl1=2; nbytes=nbytes/2; peprombuf++; break;
} }
for (;nbytes>0;pprogbuf++,peprombuf=peprombuf+zhl1,nbytes--) for (;nbytes>0;pprogbuf++,peprombuf=peprombuf+zhl1,nbytes--)
@ -253,7 +302,10 @@ else /* executable and overlay */
switch (bre) switch (bre)
{ {
case 's': zhl1=1; break; case 's': zhl1=1; break;
case 'h': zhl1=2; nbytes=nbytes/2; break; case 'h': zhl1=2;
if ((nbytes % 2) > 0) nbytes=nbytes/2+1;
else nbytes=nbytes/2;
break;
case 'l': zhl1=2; nbytes=nbytes/2; peprombuf++; break; case 'l': zhl1=2; nbytes=nbytes/2; peprombuf++; break;
} }
for (;nbytes>0;pprogbuf++,peprombuf=peprombuf+zhl1,nbytes--) for (;nbytes>0;pprogbuf++,peprombuf=peprombuf+zhl1,nbytes--)
@ -312,7 +364,7 @@ sfile()
promfile() promfile()
{ {
unsigned offs; long offs;
if (next==false) { if (next==false) {
fd1=open (namef,wmode); fd1=open (namef,wmode);
@ -324,43 +376,48 @@ unsigned offs;
if (next==false) { if (next==false) {
fd1=creat (namef,0755); fd1=creat (namef,0755);
if (fd1== -1) {error=3; outerr(); return;} if (fd1== -1) {error=3; outerr(); return;}
s_exec.s_imsize=0; if (kennB==0)
segt.sg_code=0; { /*behandlung a.out-datei*/
segt.sg_data=0; s_exec.s_imsize=0;
segt.sg_atr=0; segt.sg_code=0;
s_exec.s_bss=0; segt.sg_data=0;
s_exec.s_segt=0x10; segt.sg_atr=0;
s_exec.s_syms=0; s_exec.s_bss=0;
s_exec.s_entry=entryf & 0x0000ffff; s_exec.s_segt=0x10;
s_exec.s_flag=0x0001; s_exec.s_syms=0;
s_exec.s_codesz=0; s_exec.s_entry=entryf & 0x0000ffff;
s_exec.s_lines=0; s_exec.s_flag=0x0001;
s_exec.s_codesz=0;
s_exec.s_lines=0;
segt.sg_segno=segnr; segt.sg_segno=segnr;
segt.sg_atr=0; segt.sg_atr=0;
offs=begadrf; offs=begadrf;
offs=offs >> 8; offs=offs >> 8;
offset256=begadrf & 0xff00; offset256=begadrf & 0xff00;
if ((begadrf & 0x00ff) > 0) {offs++; offset256=offset256+0x0100; if ((begadrf & 0x00ff) > 0) {offs++; offset256=offset256+0x0100;
if (sect=='i') {warning=7; outwar();} if (sect=='i') {warning=7; outwar();}
else {warning=8; outwar();}} else {warning=8; outwar();}}
if (sect=='i') {segt.sg_coff=offs & 0x00ff; segt.sg_doff=0; if (sect=='i') {segt.sg_coff=offs & 0x00ff; segt.sg_doff=0;
segt.sg_atr=segt.sg_atr | 0x0001; segt.sg_atr=segt.sg_atr | 0x0001;
if (bre=='s') s_exec.s_magic=X_MAGIC1; if (bre=='s') s_exec.s_magic=X_MAGIC1;
else {if (kenns==0) s_exec.s_magic=N_MAGIC1; else {if (kenns==0) s_exec.s_magic=N_MAGIC1;
else s_exec.s_magic=S_MAGIC1;}} else s_exec.s_magic=S_MAGIC1;}}
else {segt.sg_doff=offs & 0x00ff; segt.sg_coff=0; else {segt.sg_doff=offs & 0x00ff; segt.sg_coff=0;
segt.sg_atr=segt.sg_atr | 0x0002; segt.sg_atr=segt.sg_atr | 0x0002;
if (bre=='s') s_exec.s_magic=X_MAGIC3; if (bre=='s') s_exec.s_magic=X_MAGIC3;
else {if (kenns==0) s_exec.s_magic=N_MAGIC3; else {if (kenns==0) s_exec.s_magic=N_MAGIC3;
else s_exec.s_magic=S_MAGIC3;}} else s_exec.s_magic=S_MAGIC3;}}
if (begadrf>0) {if (sect=='i') segt.sg_atr=segt.sg_atr | 0x0010; if (begadrf>0) {if (sect=='i') segt.sg_atr=segt.sg_atr | 0x0010;
else segt.sg_atr=segt.sg_atr | 0x0020;} else segt.sg_atr=segt.sg_atr | 0x0020;}
segt.sg_boff=0; segt.sg_boff=0;
segt.sg_bss=0; segt.sg_bss=0;
segt.sg_unused=0; segt.sg_unused=0;
offset=40; offset=40;
}
else /*behandlung binary-datei*/
offset=0;
} }
/* next prom */ /* next prom */
@ -369,12 +426,12 @@ unsigned offs;
switch (bre) switch (bre)
{ {
case 's': hoffset=prlang; zhl1=1; case 's': hoffset=prlang; zhl1=1;
for (zhl2=0;zhl2<0x4000;zhl2++) for (zhl2=0;zhl2<langf;zhl2++)
eprombuf[zhl2]=0xff; eprombuf[zhl2]=0xff;
peprombuf= &eprombuf[begadre1]; peprombuf= &eprombuf[begadre1];
break; break;
case 'l': lange2=prlang; zhl1=2; case 'l': lange2=prlang; zhl1=2;
for (zhl2=0;zhl2<0x4000;zhl2++) for (zhl2=0;zhl2<langf;zhl2++)
eprombuf[zhl2]=0xff; eprombuf[zhl2]=0xff;
peprombuf= &eprombuf[begadre2]; peprombuf= &eprombuf[begadre2];
peprombuf++; peprombuf++;
@ -410,15 +467,17 @@ unsigned offs;
header_file() header_file()
{ {
lseek (fd1, 0L, 0); if (kennB==0)
{ /*behandlung a.out-datei*/
lseek (fd1, 0L, 0);
nbytes=24; nbytes=24;
n_write=write (fd1,&s_exec,nbytes); n_write=write (fd1,&s_exec,nbytes);
if (n_write != nbytes) {error=9; outerr(); return;} if (n_write != nbytes) {error=9; outerr(); return;}
nbytes=16;
n_write=write (fd1,&segt,nbytes);
if (n_write != nbytes) {error=9; outerr(); return;}
nbytes=16;
n_write=write (fd1,&segt,nbytes);
if (n_write != nbytes) {error=9; outerr(); return;}
}
close (fd1); close (fd1);
} }