From 336f7c17fbc774cd65a3b5cb783ff15375779eda Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Fri, 17 Nov 1989 08:32:12 +0000 Subject: [PATCH] add version : 2.3 --- WEGA/src/cmd/pburn/pb.file.c | 271 +++++++++++++++++++++-------------- 1 file changed, 165 insertions(+), 106 deletions(-) diff --git a/WEGA/src/cmd/pburn/pb.file.c b/WEGA/src/cmd/pburn/pb.file.c index e7d6f97..c65c030 100644 --- a/WEGA/src/cmd/pburn/pb.file.c +++ b/WEGA/src/cmd/pburn/pb.file.c @@ -2,7 +2,7 @@ * * * pburn - prom programmer * * * -* pb1.file.c : wega p8000 16-bit-teil * +* pb2.file.c : wega p8000 16-bit-teil * * c-quelle * * * ************************************************************************/ @@ -49,8 +49,8 @@ /* identifier file --------------- */ extern char namef[50], namee1[20], bre, sect; -extern int kenns, kennfo; -extern unsigned segnr, begadrf, begadre1, begadre2, entryf, lange1, lange2, langf, prlang; +extern int kenns, kennfo, kennB, kennw, kennD; +extern long segnr, begadrf, begadre1, begadre2, entryf, lange1, lange2, langf, prlang; extern int answer, next; /* identifier error @@ -97,18 +97,22 @@ struct st2 struct st2 segt, bsegt; int fd,fd1; /* file deskriptor */ -unsigned nbytes; /* read n bytes */ -unsigned n_read; /* tatsaechlich gelesene bytes */ -unsigned n_write; /* tatsaechlich geschriebene bytes */ +long nbytes; /* read n bytes */ +long n_read; /* tatsaechlich gelesene bytes */ +long n_write; /* tatsaechlich geschriebene bytes */ int offset256; /* offset/256 */ -int zsegt, zhl1, zhl2; -unsigned adr, len; +int zsegt; +unsigned zhl1, zhl2; +long adr, len; int cfd, cfd1; long aoffset, hoffset, boffset, offset; -char progbuf[0x4000]; +char progbuf[0xfffe]; /*program buffer*/ +char progffff; /*adr ffff prom e27512 program buffer*/ char *peprombuf; char *pprogbuf; -char eprombuf[0x4000]; +char eprombuf[0xfffe]; /*prom buffer*/ +char epromffff; /*adr ffff prom e27512 prom buffer*/ + /* open filename ------------- */ @@ -117,51 +121,90 @@ openfile() fd=open (namef,rmode); cfd=1; 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 - { - 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=16; - 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;}} -} + if (kennB==1) + { /* behandlung binary-dateien (ausfuehrbare dateien)*/ + nbytes=512L; + boffset=0L; + do + { + n_read=read (fd, progbuf, nbytes); + if (n_read==-1) {error=8; outerr(); return;} + if (n_read==0L) break; + boffset=boffset+n_read; + }while (n_read!=0L); + if (boffset>0xffffL) {warning=13; outwar();} + if (kennw==1) s_exec.s_magic=N_MAGIC1; + else s_exec.s_magic=X_MAGIC1; + s_exec.s_imsize=boffset; + s_exec.s_bss=0; + s_exec.s_segt=0x10; + s_exec.s_syms=0; + s_exec.s_entry=0; + s_exec.s_flag=0x0001; + s_exec.s_codesz=0; + s_exec.s_lines=0; + + segt.sg_segno=segnr; + segt.sg_coff=0; + segt.sg_doff=0; + segt.sg_boff=0; + segt.sg_bss=0; + segt.sg_unused=0; + segt.sg_code=boffset; + 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 @@ -170,8 +213,8 @@ openfile() readfile () { int bwarning, beof; - for (zhl2=0;zhl2<0x4000;zhl2++) progbuf[zhl2]=0xff; - for (zhl2=0;zhl2<0x4000;zhl2++) eprombuf[zhl2]=0xff; + for (zhl2=0;zhl2 0) nbytes=nbytes/2+1; + else nbytes=nbytes/2; + break; case 'l': zhl1=2; nbytes=nbytes/2; peprombuf++; break; } for (;nbytes>0;pprogbuf++,peprombuf=peprombuf+zhl1,nbytes--) @@ -234,7 +280,10 @@ else /* executable and overlay */ switch (bre) { 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; } for (;nbytes>0;pprogbuf++,peprombuf=peprombuf+zhl1,nbytes--) @@ -253,7 +302,10 @@ else /* executable and overlay */ switch (bre) { 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; } for (;nbytes>0;pprogbuf++,peprombuf=peprombuf+zhl1,nbytes--) @@ -312,7 +364,7 @@ sfile() promfile() { -unsigned offs; +long offs; if (next==false) { fd1=open (namef,wmode); @@ -324,43 +376,48 @@ unsigned offs; if (next==false) { fd1=creat (namef,0755); if (fd1== -1) {error=3; outerr(); return;} - s_exec.s_imsize=0; - segt.sg_code=0; - segt.sg_data=0; - segt.sg_atr=0; - s_exec.s_bss=0; - s_exec.s_segt=0x10; - s_exec.s_syms=0; - s_exec.s_entry=entryf & 0x0000ffff; - s_exec.s_flag=0x0001; - s_exec.s_codesz=0; - s_exec.s_lines=0; + if (kennB==0) + { /*behandlung a.out-datei*/ + s_exec.s_imsize=0; + segt.sg_code=0; + segt.sg_data=0; + segt.sg_atr=0; + s_exec.s_bss=0; + s_exec.s_segt=0x10; + s_exec.s_syms=0; + s_exec.s_entry=entryf & 0x0000ffff; + s_exec.s_flag=0x0001; + s_exec.s_codesz=0; + s_exec.s_lines=0; - segt.sg_segno=segnr; - segt.sg_atr=0; - offs=begadrf; - offs=offs >> 8; - offset256=begadrf & 0xff00; - if ((begadrf & 0x00ff) > 0) {offs++; offset256=offset256+0x0100; - if (sect=='i') {warning=7; outwar();} - else {warning=8; outwar();}} - if (sect=='i') {segt.sg_coff=offs & 0x00ff; segt.sg_doff=0; - segt.sg_atr=segt.sg_atr | 0x0001; - if (bre=='s') s_exec.s_magic=X_MAGIC1; - else {if (kenns==0) s_exec.s_magic=N_MAGIC1; - else s_exec.s_magic=S_MAGIC1;}} - else {segt.sg_doff=offs & 0x00ff; segt.sg_coff=0; - segt.sg_atr=segt.sg_atr | 0x0002; - if (bre=='s') s_exec.s_magic=X_MAGIC3; - else {if (kenns==0) s_exec.s_magic=N_MAGIC3; - else s_exec.s_magic=S_MAGIC3;}} - if (begadrf>0) {if (sect=='i') segt.sg_atr=segt.sg_atr | 0x0010; - else segt.sg_atr=segt.sg_atr | 0x0020;} - segt.sg_boff=0; - segt.sg_bss=0; - segt.sg_unused=0; - - offset=40; + segt.sg_segno=segnr; + segt.sg_atr=0; + offs=begadrf; + offs=offs >> 8; + offset256=begadrf & 0xff00; + if ((begadrf & 0x00ff) > 0) {offs++; offset256=offset256+0x0100; + if (sect=='i') {warning=7; outwar();} + else {warning=8; outwar();}} + if (sect=='i') {segt.sg_coff=offs & 0x00ff; segt.sg_doff=0; + segt.sg_atr=segt.sg_atr | 0x0001; + if (bre=='s') s_exec.s_magic=X_MAGIC1; + else {if (kenns==0) s_exec.s_magic=N_MAGIC1; + else s_exec.s_magic=S_MAGIC1;}} + else {segt.sg_doff=offs & 0x00ff; segt.sg_coff=0; + segt.sg_atr=segt.sg_atr | 0x0002; + if (bre=='s') s_exec.s_magic=X_MAGIC3; + else {if (kenns==0) s_exec.s_magic=N_MAGIC3; + else s_exec.s_magic=S_MAGIC3;}} + if (begadrf>0) {if (sect=='i') segt.sg_atr=segt.sg_atr | 0x0010; + else segt.sg_atr=segt.sg_atr | 0x0020;} + segt.sg_boff=0; + segt.sg_bss=0; + segt.sg_unused=0; + + offset=40; + } + else /*behandlung binary-datei*/ + offset=0; } /* next prom */ @@ -369,12 +426,12 @@ unsigned offs; switch (bre) { case 's': hoffset=prlang; zhl1=1; - for (zhl2=0;zhl2<0x4000;zhl2++) + for (zhl2=0;zhl2