home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Transactor
/
Transactor_27_1988_Transactor_Publishing.d64
/
shellram.sda
/
TWINCOPY.C
< prev
Wrap
Text File
|
2023-02-26
|
4KB
|
213 lines
#include <stdio.h>
char indev;
char outdev;
char verbose;
main(argc,argv)
unsigned argc;
char **av;
{SHIFT-+}
int fcopy();
unsigned i;
char **argv;
argv = av;
argc = init(argc,&argv);
for (i = 1; i < argc; ++i)
glob(argv[i],&fcopy);
{SHIFT--}
init(argc,argv)
{SHIFT-+}
extern char sysdev, wrkdev;
indev = sysdev;
outdev = wrkdev;
verbose = 0;
return argc;
{SHIFT--}
/*
* eventually make this invoke function
* for each file in the work directory
* which matches "pattern"
*
* caveat: opendir() does not work with
* RAM disk
* 2nd caveat: we copy FROM system disk
*/
glob(pattern, pfunc)
char *pattern;
int (*pfunc)();
{SHIFT-+}
(*pfunc)(pattern);
{SHIFT--}
#define CHKIN 0xffc6
#define CHKOUT 0xffc9
#define CLRCHN 0xffcc
static char blflag;
static char mlgetb[] = {SHIFT-+}
0x20, 0xCF, 0xFF, /* t1 jsr chrin */
0x91, 0xFB, /* sta ($fb),y */
0xC8, /* iny */
0x20, 0xB7, 0xFF, /* jsr readst */
0xD0, 0x04, /* bne t2 */
0xC4, 34, /* cpy 34 */
0xD0, 0xF1, /* bne t1 */
0x60, /* t2 rts */
{SHIFT--};
unsigned
getblk(buffer, size, fid)
char *buffer;
unsigned size;
FILE fid;
{SHIFT-+}
static char a, x, y;
unsigned n;
if (blflag) return 0;
/* zero page usage: see Power C Manual */
*((char **)0xfb) = buffer;
*((char *)34) = size;
sys(CLRCHN, &a, &x, &y);
x = fid;
sys(CHKIN, &a, &x, &y);
y = 0;
sys(mlgetb, &a, &x, &y);
n = y;
if (a != 0) blflag = a;
sys(CLRCHN, &a, &x, &y);
return n;
{SHIFT--}
static char mlputb[] = {SHIFT-+}
0xB1, 34, /* t1 lda (34),y */
0x20, 0xD2, 0xFF, /* jsr chrout */
0xC8, /* iny */
0xC4, 0xFB, /* cpy $fb */
0xD0, 0xF6, /* bne t1 */
0x60, /* rts */
{SHIFT--};
unsigned
putblk(buffer, n, fid)
char *buffer;
unsigned n;
FILE fid;
{SHIFT-+}
static char a, x, y;
if (n == 0) return 0;
*((char **)34) = buffer;
*((char *)0xfb) = n;
sys(CLRCHN, &a, &x, &y);
x = fid;
sys(CHKOUT, &a, &x, &y);
y = 0;
sys(mlputb, &a, &x, &y);
sys(CLRCHN, &a, &x, &y);
return n;
{SHIFT--}
static char buff[256];
int
fcopy(name)
char *name;
{SHIFT-+}
FILE openin(), openout();
FILE infid, outfid;
unsigned n;
auto unsigned type;
type = 0;
if (verbose)
printf("copy %s from device %d to work\n",name,indev);
infid = 5;
if ((infid = openin(indev,3,name,&type)) == 0)
printf("can't open %s for input\n", name);
else if ((outfid = openout(name,type)) == 0 {CBM-*}{CBM-*}
ferror())
printf("can't open %s for output\n", name);
else {SHIFT-+}
/*
* sorry, this isn't fast enough!
*
* while((c = fgetc(infid)) != EOF)
* fputc(c, outfid);
*/
blflag = 0;
while ((n = getblk(buff,254,infid)) != 0)
putblk(buff,n,outfid);
{SHIFT--}
fclose(infid);
fclose(outfid);
{SHIFT--}
/*
* openin - special
* opens file on given device, and
* attempts to determine input type
* by the icky method of repeated
* open attempts
*
* unfortunately this will be slow
*/
openin(dev,secadd,name,ptype)
unsigned dev;
unsigned secadd;
char *name;
unsigned *ptype;
{SHIFT-+}
extern char wrkdev;
auto char nambuf[30];
register FILE rfid;
register char *tstr;
register unsigned fe;
device(dev);
*ptype = 0;
tstr = index(name, ',');
if (tstr != NULL &&
*++tstr != '\0' && *tstr != 'r') {SHIFT-+}
rfid = fopen(name,"r"); /* leave *ptype 0 */
device(wrkdev);
return rfid;
{SHIFT--}
for (tstr = "spu"; *tstr != '\0'; ++tstr) {SHIFT-+}
sprintf(nambuf,"%s,%c", name, *tstr);
rfid = fopen(nambuf,"r");
fe = ferror();
if (rfid != 0 && fe == 0) {SHIFT-+}
*ptype = *tstr;
device(wrkdev);
return rfid;
{SHIFT--}
else
fclose(rfid);
{SHIFT--}
device(wrkdev);
return 0;
{SHIFT--}
/*
* openout - special to do fopen of
* specified type
*/
FILE
openout(name,type)
char *name;
unsigned type;
{SHIFT-+}
auto char nambuf[30];
if (type != 0) {SHIFT-+}
sprintf(nambuf,"%s,%c", name, type);
name = nambuf;
{SHIFT--}
return fopen(name,"w");
{SHIFT--}