home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oakland CPM Archive
/
oakcpm.iso
/
cpm
/
c128
/
c8filcpy.lbr
/
FILECOPY.CQ
/
FILECOPY.C
Wrap
Text File
|
1986-08-13
|
4KB
|
183 lines
#include "fcntl.h"
#include "stdio.h"
#define tpa_plus_one *((int *)6)
main()
{
char *buffer,*dma;
char filename[129][15];
unsigned filestart[129];
char tempname[15];
int lastfile,doread,readfile,writefile,rfd,wfd;
unsigned size,rndex;
int response,assumed,echo,halfbuf;
unsigned maxbuf;
unsigned i;
dma=alloc(128);
maxbuf = (unsigned)tpa_plus_one - ((unsigned)dma+128) - (unsigned)4000;
maxbuf &= 0xff00;
halfbuf=(maxbuf>>1)&0x7fff;
buffer=alloc(halfbuf);
alloc(halfbuf);
fputs("\n\t\t\tSINGLE DRIVE FILE COPY UTILITY\n\n",stdout);
fputs("\t\tInsert SOURCE DISK when prompted for disk E:\n",stdout);
fputs("\t\tInsert DESTINATION DISK when prompted for disk A:\n\n",
stdout);
bdos(0xe,0); /*select drive a*/
bdos(0xd,0); /*reset*/
bdos(0x1a,dma); /*set dma address*/
*buffer=5;
for(i=1;i<12;i++)*(buffer+i)='?';
*(buffer+12)=0;
i=bdos(0x11,buffer);
if(i==255)exit(1);
lastfile=0;
strcpy(&filename[lastfile++][0],dma+1+32*i);
while(i!=255)
{
i=bdos(0x12,0);
if(i!=255)strcpy(&filename[lastfile++][0],dma+1+32*i);
}
fputs("Respond to each file name with:\n",stdout);
fputs(" y - yes, copy this file\n",stdout);
fputs(" n - no, don't copy this file\n",stdout);
fputs(" <return> - respond to remaining files the same way\n\n",
stdout);
response=0;
echo='y';
assumed='E';
for(i=0;i<lastfile;i++)
{
tempname[0]='E';
tempname[1]=':';
strncpy(&tempname[2],&filename[i][0],8);
tempname[10]='.';
strncpy(&tempname[11],&filename[i][8],3);
tempname[14]=0;
fputs(&tempname[2],stdout);
fputs(" ? ",stdout);
if(response!='\r')
{
while((response=bdos(6,0xff))!='y' && response!='n' &&
response!='\r');
}
if(response=='n')
{
assumed=tempname[0]='X';
putchar(echo='n');
}
else if(response=='y')
{
assumed='E';
putchar(echo='y');
}
else
{
tempname[0]=assumed;
putchar(echo);
}
putchar('\n');
strncpy(&filename[i][0],tempname,15);
}
putchar('\n');
filename[lastfile][0]=0;
rndex=0;
readfile=0;
writefile=0;
doread=1;
rfd=0;
wfd=0;
for(;;)
{
if(doread)
{
if(!rfd)
{
if(filename[readfile][0] != 'X')
{
filename[readfile][0]='E';
rfd=open(&filename[readfile][0],
O_RDONLY);
fputs(&filename[readfile][2],stdout);
fputs(" ",stdout);
}
filestart[readfile]=rndex;
}
size=0;
if(rfd) size=read(rfd,buffer+rndex,maxbuf-rndex);
if(size!=0 && size!=0xffff)
{
rndex+=size;
if(rndex==maxbuf)
{
doread=0;
filestart[readfile+1]=maxbuf;
rndex=0;
putchar('\007');
}
}
else
{
if(rfd) close(rfd);
rfd=0;
if(++readfile == lastfile)
{
doread=0;
filestart[readfile]=rndex;
filestart[readfile+1]=rndex;
putchar('\007');
}
}
}
else
{
if(!wfd)
{
if(filename[writefile][0] != 'X')
{
filename[writefile][0]='A';
wfd=open(&filename[writefile][0],
O_WRONLY|O_CREAT);
}
}
if(i=filestart[writefile+1]-filestart[writefile])
{
if(wfd) write(wfd,buffer+filestart[writefile],
i);
}
if(writefile<readfile)
{
if(wfd) close(wfd);
if(++writefile!=readfile || readfile<lastfile)
{
wfd=0;
}
else
{
wfd=3;
}
}
else
{
if(readfile>=lastfile)
{
close(wfd);
exit(0);
}
doread=1;
bdos(0x30,0); /*flush buffers*/
filestart[readfile]=0;
putchar('\007');
}
}
}
}