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 >
Text File  |  1987-02-03  |  9KB  |  357 lines

  1. /* TI 99/4A Disk Reader */
  2. #include <dos.h>
  3. #include <stdio.h>
  4. static char buffer[9][256],msdosfile[30];
  5. static int secinfo[9],tofile,dr;
  6. static char table[11],table1[11];
  7. FILE *fp;
  8. static short dbtable[2];
  9. extern sectread();
  10. main(argc,argv)
  11. int argc;
  12. char *argv[];
  13. {
  14. char ch,c,*mode;
  15. int i,j,ret,cat(),readfile(),getdbt();
  16. int *filen;
  17.   ret = getdbt();
  18.   dr = 1;
  19.   if(argc > 1) {
  20.     argv++;
  21.     dr = toupper((*argv)[0])-'A';
  22.     if(dr < 0 || dr > 1) dr = 1;
  23.     if(((*argv)[1] != '\0') && ((*argv)[1] != ':')) dr = 1;
  24.   }
  25.   printf("Insert TI disk in drive %c: and press Spacebar\n",dr+'A');
  26.   do
  27.     ch = getch();
  28.   while(ch != ' ');
  29.   do
  30.   {
  31.     printf("\nTI 99/4A Disk Reader 1.0 for MS-DOS computers\n");
  32.     printf("\nCommand Menu:\n\n");
  33.     printf("  1: Disk Directory\n");
  34.     printf("  2: Display File on Screen\n");
  35.     printf("  3: Copy File to MS-DOS File\n");
  36.     printf("  4: Exit to DOS");
  37.     printf("\nEnter Choice:");
  38.     do
  39.       ch = getch();
  40.     while(ch < '1' || ch > '4');
  41.     switch(ch)
  42.     {
  43.     case '1':
  44.       printf("\n1: Display Directory\n\n");
  45.       ret = cat();
  46.       printf("%4.3d Files\n",ret);
  47.       break;
  48.     case '2':
  49.       printf("\n2: Display File\n\n");
  50.       ret = cat();
  51.       printf("%4.3d Files\n",ret);
  52.       tofile = 0; /* don't send output to a filename */
  53.       if(ret != 0)
  54.       {
  55.         do
  56.         {
  57.           printf("Filename to display (1-%1d)? ",ret);
  58.           i = scanf("%d",filen);
  59.         }
  60.         while(i == 0 || *filen < 1 || *filen > ret);
  61.         ret = readfile(*filen);
  62.       }
  63.       break;
  64.     case '3':
  65.       printf("\n3: Copy File to MS-DOS file\n\n");
  66.       ret = cat();
  67.       printf("%4.3d Files\n",ret);
  68.       tofile = 1; /* send output to a filename */
  69.       if(ret != 0)
  70.       {
  71.         do
  72.         {
  73.           printf("Filename to copy (1-%1d)? ",ret);
  74.           i = scanf("%d",filen);
  75.         }
  76.         while(i == 0 || *filen < 1 || *filen > ret);
  77.         printf("Destination filename? ");
  78.         ret = scanf("%s",msdosfile);
  79.         if(msdosfile[0] != '\0') /* filename was entered */
  80.         {
  81.           *mode = 'w';
  82.           fp = fopen(msdosfile,mode);
  83.         }
  84.         if(fp != NULL)
  85.         {
  86.  
  87.           ret = readfile(*filen);
  88.           fclose(fp);
  89.         }
  90.         else
  91.           printf("\nError in opening file\n");
  92.       }
  93.       break;
  94.     default:
  95.       break;
  96.     }
  97.     if(ch != '4')
  98.     {
  99.       printf("\n\nPress Any Key for Command Menu:");
  100.       c = getch();
  101.     }
  102.   }
  103.   while(ch != '4');
  104. }
  105.  
  106. getdbt()
  107. {
  108.   /* Get disk base table address and store it */
  109.   peek(0,0x78,&dbtable[0],4);
  110.   /* copy disk base table into buffers */
  111.   peek(dbtable[1],dbtable[0],&table[0],11);
  112.   peek(dbtable[1],dbtable[0],&table1[0],11);
  113.   /* modify one buffer to TI format */
  114.   table[3] = 1;
  115.   table[4] = 17;
  116.   /* copy modified buffer to disk base table */
  117.   return(0);
  118. }
  119.  
  120. cat()
  121. {
  122. int i,j,k,n,ret,readsect();
  123.   ret = readsect(1,0);
  124.   printf("\n\nDirectory of TI disk:\n\n");
  125.   i = 0;
  126.   n = 1;
  127.   j = buffer[0][i]*256 + buffer[0][i+1];
  128.   while(j != 0)
  129.   {
  130.     printf("%4.3d:",n++);
  131.     ret = readsect(j,1);
  132.     for(k = 0;k <= 9;k++)
  133.       printf("%c",buffer[ret][k]);
  134.     printf("\t");
  135.     switch(buffer[ret][12] & 247)
  136.     {
  137.     case 0:
  138.       printf("DIS/FIX%4.2d",buffer[ret][17]);
  139.       break;
  140.     case 1:
  141.       printf("PROGRAM    ");
  142.       break;
  143.     case 2:
  144.       printf("INT/FIX%4.2d",buffer[ret][17]);
  145.       break;
  146.     case 128:
  147.       printf("DIS/VAR%4.2d",buffer[ret][17]);
  148.       break;
  149.     case 130:
  150.       printf("INT/VAR%4.2d",buffer[ret][17]);
  151.       break;
  152.     default:
  153.       printf("UNKNOWN%4.2d",buffer[ret][17]);
  154.       break;
  155.     }
  156.     printf("%5.3d",buffer[ret][14]*256+buffer[ret][15]);
  157.     if(buffer[ret][12] & 8 == 8)
  158.       printf(" P");
  159.     printf("\n");
  160.     i += 2;
  161.     j = buffer[0][i]*256 + buffer[0][i+1];
  162.   }
  163.   return(i/2);
  164. }
  165.  
  166. readfile(f)
  167. int f;
  168. {
  169.   int i,j,k,l,m,n,p,ret,segstart,seglen,sectcnt,nsect,lim,cat(),readsect();
  170.   i = (f - 1)*2;
  171.   j = buffer[0][i]*256 + buffer[0][i+1];
  172.   ret = readsect(j,0);
  173.   i = 0x1C; /* get first block link */
  174.   if(tofile == 1)
  175.     printf("\nCopying ");
  176.   else
  177.     printf("Contents of %4.3d:",f);
  178.   for(k = 0;k <= 9;k++)
  179.     printf("%c",buffer[0][k]);
  180.   if(tofile == 1)
  181.     printf(" to %s",msdosfile);
  182.   printf("\n\n");
  183.   segstart = (buffer[0][i+1] & 0x0F) * 256 + buffer[0][i];
  184.   seglen = buffer[0][i+2] * 16 + buffer[0][i+1] / 16;
  185.   nsect = buffer[0][14]*256 + buffer[0][15];
  186.   sectcnt = 0; /* sector count */
  187.   while(sectcnt < nsect)
  188.   {
  189.     for(j = segstart;j <= (segstart + seglen) && sectcnt < nsect;j++)
  190.     if(j % 18 != 0)
  191.     {
  192.       ret = readsect(j,1);
  193.       sectcnt++;
  194.       m = 0;  /* pointer to current byte */
  195.       switch(buffer[0][12] & 247)
  196.       {
  197.       case 0x80:
  198.         l = buffer[ret][m++];
  199.         k = l;  /* number of bytes read in this sector */
  200.         while(l != 255 && k < 256)
  201.         {
  202.           for(n = 1;n <= l;n++)
  203.           {
  204.             if(tofile == 0)
  205.               printf("%c",buffer[ret][m++]);
  206.             else
  207.               fprintf(fp,"%c",buffer[ret][m++]);
  208.           }
  209.           if(tofile == 0)
  210.             printf("\n");
  211.           else
  212.             fprintf(fp,"\n");
  213.           l = buffer[ret][m++];
  214.           k += l;
  215.         }
  216.         break;
  217.       case 0:
  218.         for(n=1;n<=buffer[0][13];n++)
  219.         {
  220.           for(l=1;l<=buffer[0][17];l++)
  221.             if(tofile == 0)
  222.               printf("%c",buffer[ret][m++]);
  223.             else
  224.               fprintf(fp,"%c",buffer[ret][m++]);
  225.           if (tofile == 0)
  226.             printf("\n");
  227.           else
  228.             fprintf(fp,"\n");
  229.         }
  230.         break;
  231.       case 1:
  232.         l = 256;
  233.         if(sectcnt == nsect)
  234.           l=buffer[0][16];
  235.         for(m=0;m<l;m++)
  236.           if(tofile == 0)
  237.             printf("%c",buffer[ret][m]);
  238.           else
  239.             fprintf(fp,"%c",buffer[ret][m++]);
  240.         break;
  241.       case 0x82:
  242.         l = buffer[ret][m++];
  243.         k = l;  /* number of bytes read in this sector */
  244.         while(l != 255 && k < 256)
  245.         {
  246.           while(n <= l)
  247.           {
  248.             for(p = 1;p <= buffer[ret][m++];p++)
  249.             {
  250.               if(tofile == 0)
  251.                 printf("%c",buffer[ret][m++]);
  252.               else
  253.                 fprintf(fp,"%c",buffer[ret][m++]);
  254.               n++;
  255.             }
  256.             if(tofile == 0)
  257.               printf("\t");
  258.             else
  259.               fprintf(fp,"\t");
  260.           }
  261.           if(tofile == 0)
  262.             printf("\n");
  263.           else
  264.             fprintf(fp,"\n");
  265.           l = buffer[ret][m++];
  266.           k += l;
  267.         }
  268.         break;
  269.       case 2:
  270.         for(n=1;n<=buffer[0][13];n++)
  271.         {
  272.           l = 1;
  273.           while(l <= buffer[0][17])
  274.           {
  275.             for(p = 1;p <= buffer[ret][m++];p++)
  276.             {
  277.               if(tofile == 0)
  278.                 printf("%c",buffer[ret][m++]);
  279.               else
  280.                 fprintf(fp,"%c",buffer[ret][m++]);
  281.               l++;
  282.             }
  283.             if(tofile == 0)
  284.               printf("\t");
  285.             else
  286.               fprintf(fp,"\t");
  287.           }
  288.           if(tofile == 0)
  289.             printf("\n");
  290.           else
  291.             fprintf(fp,"\n");
  292.         }
  293.         break;
  294.       }
  295.     }
  296.     else
  297.     {
  298.       if(tofile == 0)
  299.         printf("\n----- Unreadable Sector -----\n\n");
  300.       else
  301.         fprintf(fp,"\n----- Unreadable Sector -----\n\n");
  302.       sectcnt++;
  303.     }
  304.   i += 3;
  305.   segstart = (buffer[0][i+1] & 0x0F) * 256 + buffer[0][i];
  306.   seglen = buffer[0][i+2] * 16 + buffer[0][i+1] / 16;
  307.   }
  308.   if(tofile == 0)
  309.     printf("\n\n-- End of File --\n");
  310.   else
  311.     printf("\nCopying done.\n");
  312. }
  313.  
  314. /* read one sector from TI disk */
  315. readsect(sector,b)
  316. int sector,b;
  317. {
  318. int i,track,side,sect,ret,rd;
  319.   if(b == 0)
  320.     rd = 0; /* sector must be read */
  321.   else
  322.   {
  323.     rd = 0;
  324.     for(i=1;i<=8;i++)
  325.       if(secinfo[i] == sector)
  326.         rd = i;
  327.   }
  328.   ret = rd;
  329.   if(rd == 0)
  330.   {
  331.     poke(dbtable[1],dbtable[0],&table[0],11);
  332.     if(b == 0)
  333.     {
  334.       side = sector / 720;
  335.       track = (sector % 720) / 18;
  336.       sect = sector % 18;
  337.       sectread(dr,track,side,sect,&buffer[0][0]);
  338.       ret = 0;
  339.     }
  340.     else
  341.     {
  342.       for(i=1;i<=8;i++)
  343.       {
  344.         side = sector / 720;
  345.         track = (sector % 720) / 18;
  346.         sect = sector % 18;
  347.         sectread(dr,track,side,sect,&buffer[i][0]);
  348.         secinfo[i] = sector++;
  349.       }
  350.       ret = 1;
  351.     }
  352.     poke(dbtable[1],dbtable[0],&table1[0],11);
  353.   }
  354.   return(ret);
  355. }
  356.  
  357.