home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.whtech.com
/
ftp.whtech.com.tar
/
ftp.whtech.com
/
Geneve
/
9640news
/
CAT09
/
TIEXE.ZIP
/
TI.C
< prev
next >
Wrap
Text File
|
1987-02-03
|
9KB
|
357 lines
/* TI 99/4A Disk Reader */
#include <dos.h>
#include <stdio.h>
static char buffer[9][256],msdosfile[30];
static int secinfo[9],tofile,dr;
static char table[11],table1[11];
FILE *fp;
static short dbtable[2];
extern sectread();
main(argc,argv)
int argc;
char *argv[];
{
char ch,c,*mode;
int i,j,ret,cat(),readfile(),getdbt();
int *filen;
ret = getdbt();
dr = 1;
if(argc > 1) {
argv++;
dr = toupper((*argv)[0])-'A';
if(dr < 0 || dr > 1) dr = 1;
if(((*argv)[1] != '\0') && ((*argv)[1] != ':')) dr = 1;
}
printf("Insert TI disk in drive %c: and press Spacebar\n",dr+'A');
do
ch = getch();
while(ch != ' ');
do
{
printf("\nTI 99/4A Disk Reader 1.0 for MS-DOS computers\n");
printf("\nCommand Menu:\n\n");
printf(" 1: Disk Directory\n");
printf(" 2: Display File on Screen\n");
printf(" 3: Copy File to MS-DOS File\n");
printf(" 4: Exit to DOS");
printf("\nEnter Choice:");
do
ch = getch();
while(ch < '1' || ch > '4');
switch(ch)
{
case '1':
printf("\n1: Display Directory\n\n");
ret = cat();
printf("%4.3d Files\n",ret);
break;
case '2':
printf("\n2: Display File\n\n");
ret = cat();
printf("%4.3d Files\n",ret);
tofile = 0; /* don't send output to a filename */
if(ret != 0)
{
do
{
printf("Filename to display (1-%1d)? ",ret);
i = scanf("%d",filen);
}
while(i == 0 || *filen < 1 || *filen > ret);
ret = readfile(*filen);
}
break;
case '3':
printf("\n3: Copy File to MS-DOS file\n\n");
ret = cat();
printf("%4.3d Files\n",ret);
tofile = 1; /* send output to a filename */
if(ret != 0)
{
do
{
printf("Filename to copy (1-%1d)? ",ret);
i = scanf("%d",filen);
}
while(i == 0 || *filen < 1 || *filen > ret);
printf("Destination filename? ");
ret = scanf("%s",msdosfile);
if(msdosfile[0] != '\0') /* filename was entered */
{
*mode = 'w';
fp = fopen(msdosfile,mode);
}
if(fp != NULL)
{
ret = readfile(*filen);
fclose(fp);
}
else
printf("\nError in opening file\n");
}
break;
default:
break;
}
if(ch != '4')
{
printf("\n\nPress Any Key for Command Menu:");
c = getch();
}
}
while(ch != '4');
}
getdbt()
{
/* Get disk base table address and store it */
peek(0,0x78,&dbtable[0],4);
/* copy disk base table into buffers */
peek(dbtable[1],dbtable[0],&table[0],11);
peek(dbtable[1],dbtable[0],&table1[0],11);
/* modify one buffer to TI format */
table[3] = 1;
table[4] = 17;
/* copy modified buffer to disk base table */
return(0);
}
cat()
{
int i,j,k,n,ret,readsect();
ret = readsect(1,0);
printf("\n\nDirectory of TI disk:\n\n");
i = 0;
n = 1;
j = buffer[0][i]*256 + buffer[0][i+1];
while(j != 0)
{
printf("%4.3d:",n++);
ret = readsect(j,1);
for(k = 0;k <= 9;k++)
printf("%c",buffer[ret][k]);
printf("\t");
switch(buffer[ret][12] & 247)
{
case 0:
printf("DIS/FIX%4.2d",buffer[ret][17]);
break;
case 1:
printf("PROGRAM ");
break;
case 2:
printf("INT/FIX%4.2d",buffer[ret][17]);
break;
case 128:
printf("DIS/VAR%4.2d",buffer[ret][17]);
break;
case 130:
printf("INT/VAR%4.2d",buffer[ret][17]);
break;
default:
printf("UNKNOWN%4.2d",buffer[ret][17]);
break;
}
printf("%5.3d",buffer[ret][14]*256+buffer[ret][15]);
if(buffer[ret][12] & 8 == 8)
printf(" P");
printf("\n");
i += 2;
j = buffer[0][i]*256 + buffer[0][i+1];
}
return(i/2);
}
readfile(f)
int f;
{
int i,j,k,l,m,n,p,ret,segstart,seglen,sectcnt,nsect,lim,cat(),readsect();
i = (f - 1)*2;
j = buffer[0][i]*256 + buffer[0][i+1];
ret = readsect(j,0);
i = 0x1C; /* get first block link */
if(tofile == 1)
printf("\nCopying ");
else
printf("Contents of %4.3d:",f);
for(k = 0;k <= 9;k++)
printf("%c",buffer[0][k]);
if(tofile == 1)
printf(" to %s",msdosfile);
printf("\n\n");
segstart = (buffer[0][i+1] & 0x0F) * 256 + buffer[0][i];
seglen = buffer[0][i+2] * 16 + buffer[0][i+1] / 16;
nsect = buffer[0][14]*256 + buffer[0][15];
sectcnt = 0; /* sector count */
while(sectcnt < nsect)
{
for(j = segstart;j <= (segstart + seglen) && sectcnt < nsect;j++)
if(j % 18 != 0)
{
ret = readsect(j,1);
sectcnt++;
m = 0; /* pointer to current byte */
switch(buffer[0][12] & 247)
{
case 0x80:
l = buffer[ret][m++];
k = l; /* number of bytes read in this sector */
while(l != 255 && k < 256)
{
for(n = 1;n <= l;n++)
{
if(tofile == 0)
printf("%c",buffer[ret][m++]);
else
fprintf(fp,"%c",buffer[ret][m++]);
}
if(tofile == 0)
printf("\n");
else
fprintf(fp,"\n");
l = buffer[ret][m++];
k += l;
}
break;
case 0:
for(n=1;n<=buffer[0][13];n++)
{
for(l=1;l<=buffer[0][17];l++)
if(tofile == 0)
printf("%c",buffer[ret][m++]);
else
fprintf(fp,"%c",buffer[ret][m++]);
if (tofile == 0)
printf("\n");
else
fprintf(fp,"\n");
}
break;
case 1:
l = 256;
if(sectcnt == nsect)
l=buffer[0][16];
for(m=0;m<l;m++)
if(tofile == 0)
printf("%c",buffer[ret][m]);
else
fprintf(fp,"%c",buffer[ret][m++]);
break;
case 0x82:
l = buffer[ret][m++];
k = l; /* number of bytes read in this sector */
while(l != 255 && k < 256)
{
while(n <= l)
{
for(p = 1;p <= buffer[ret][m++];p++)
{
if(tofile == 0)
printf("%c",buffer[ret][m++]);
else
fprintf(fp,"%c",buffer[ret][m++]);
n++;
}
if(tofile == 0)
printf("\t");
else
fprintf(fp,"\t");
}
if(tofile == 0)
printf("\n");
else
fprintf(fp,"\n");
l = buffer[ret][m++];
k += l;
}
break;
case 2:
for(n=1;n<=buffer[0][13];n++)
{
l = 1;
while(l <= buffer[0][17])
{
for(p = 1;p <= buffer[ret][m++];p++)
{
if(tofile == 0)
printf("%c",buffer[ret][m++]);
else
fprintf(fp,"%c",buffer[ret][m++]);
l++;
}
if(tofile == 0)
printf("\t");
else
fprintf(fp,"\t");
}
if(tofile == 0)
printf("\n");
else
fprintf(fp,"\n");
}
break;
}
}
else
{
if(tofile == 0)
printf("\n----- Unreadable Sector -----\n\n");
else
fprintf(fp,"\n----- Unreadable Sector -----\n\n");
sectcnt++;
}
i += 3;
segstart = (buffer[0][i+1] & 0x0F) * 256 + buffer[0][i];
seglen = buffer[0][i+2] * 16 + buffer[0][i+1] / 16;
}
if(tofile == 0)
printf("\n\n-- End of File --\n");
else
printf("\nCopying done.\n");
}
/* read one sector from TI disk */
readsect(sector,b)
int sector,b;
{
int i,track,side,sect,ret,rd;
if(b == 0)
rd = 0; /* sector must be read */
else
{
rd = 0;
for(i=1;i<=8;i++)
if(secinfo[i] == sector)
rd = i;
}
ret = rd;
if(rd == 0)
{
poke(dbtable[1],dbtable[0],&table[0],11);
if(b == 0)
{
side = sector / 720;
track = (sector % 720) / 18;
sect = sector % 18;
sectread(dr,track,side,sect,&buffer[0][0]);
ret = 0;
}
else
{
for(i=1;i<=8;i++)
{
side = sector / 720;
track = (sector % 720) / 18;
sect = sector % 18;
sectread(dr,track,side,sect,&buffer[i][0]);
secinfo[i] = sector++;
}
ret = 1;
}
poke(dbtable[1],dbtable[0],&table1[0],11);
}
return(ret);
}