home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Guide / c-cplusplus-interactive-guide.iso / c_ref / csource4 / 265_01 / cp3sctrd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-02-15  |  2.8 KB  |  110 lines

  1. /*
  2. HEADER:        ;
  3. TITLE:        copy cpio to file
  4. VERSION:    
  5.  
  6. DESCRIPTION:    Copies 8" SSSD CPM cpio format disk on drive C to a file
  7.  
  8. KEYWORDS:    cpio, archive
  9. SYSTEM:        CP/M-80, V3.1;
  10. FILENAME:    CP3SCTRD.C;
  11. WARNINGS:    Requires Version 3.x of CP/M.
  12.         Tested only on unbanked system, but uses banked calls
  13.         interleave not compatible with UNIX (TM) cpio
  14.  
  15. SEE-ALSO:    SNAIDER.C, GERHARDS.C
  16. AUTHORS:    Tim Prince (adapted from CUG program)
  17. COMPILERS:    Eco-C v2.48
  18. */
  19.  
  20. #include <stdio.h>
  21.  
  22. /* CP/M+ version recreated 16.VII.88 - TCP
  23. **    Tim Prince
  24. **    Chandler Software
  25. **    4456 W. Maple Rd.
  26. **    Birmingham MI 48010-1923 */
  27. #define DRIVEA    0
  28. #define DRIVEC    2
  29. #define SECTORS    26    /* 8" SSSD 128 byte sectors */
  30. #define TRACKS    77
  31. #define    MAXSECT    (TRACKS*SECTORS-1) /* maximum sectors accessible    */
  32. #define    SECTSIZE    128    /* OS sector size            */
  33. #define    EOF_VAL        0xe5    /* Past End of archive file on disk    */
  34.  
  35. static unsigned char    sectbuf[SECTSIZE];    /* must be in DS!    */
  36.  
  37. main(argc, argv)int argc;
  38. char    *argv[];
  39. {
  40. FILE    *fp;
  41. int    i,strtsect,numsect;
  42.  
  43. if(argc != 4)    {
  44.     fprintf(stderr, "Usage: sectrd filenam start-sector number-sectors\n");
  45.     exit(1);
  46.     }
  47. if((fp = fopen(argv[1], "wb")) == NULL)    {
  48.     fprintf(stderr, "Can't open %s\n", argv[1]);
  49.     exit(1);
  50.     }
  51. if((strtsect= atoi(argv[2])) < 0 || strtsect > MAXSECT||
  52.     (numsect= atoi(argv[3])) < 0 || (numsect + strtsect) > MAXSECT)    {
  53.     fprintf(stderr, "start-sector wrong.\n");
  54.     exit(1);
  55.     }
  56. for( ; numsect ; ++strtsect, --numsect)    {
  57.     printf ("\n\nSector %d\n\n", strtsect);
  58.     if(rdsct(strtsect, sectbuf))    {
  59.         fprintf(stderr, "error reading source disk!\n");
  60.         exit(2);
  61.         }
  62.     for(i = 0 ; i < SECTSIZE ; ++i)
  63.         if(sectbuf[i] == EOF_VAL){
  64.             printf("EOF detected, Byteoffset %d\n", i);
  65.             goto CLOSE;
  66.             }
  67.         else    {
  68.             fputc(sectbuf[i], fp);
  69.             putchar(sectbuf[i]);
  70.             }
  71.     }
  72. CLOSE:
  73. fclose(fp);
  74. }
  75.  
  76. char **_bdos(); /* may be int or pointer */
  77. struct {    /* CP/M+ bios call parameter block */
  78.     char funct;
  79.     char areg;
  80.     unsigned bcreg;
  81.     char * dereg;
  82.     char * hlreg;    }pb;
  83.  
  84. char bios(fn,bfr) int fn,bfr;{
  85.     pb.funct=fn;
  86.     pb.bcreg=bfr; /* may be int or (char *) */
  87.     (void)_bdos(50,&pb);
  88.     return pb.areg;}
  89.  
  90. char **seldsk(drive) int drive;{
  91.     pb.funct=9;
  92.     pb.bcreg=drive;
  93.     return _bdos(50,&pb);}
  94.  
  95. int sectran(sec,trans) unsigned sec; char *trans;{
  96.     pb.funct=16;
  97.     pb.bcreg=sec;
  98.     pb.dereg=trans;
  99.     return (int)_bdos(50,&pb);}
  100.  
  101. int rdsct(strtsect,sectbuf) int strtsect; char *sectbuf;{
  102.     int retval;
  103.     bios(10,strtsect/SECTORS);    /* track */
  104.     bios(11,sectran(strtsect%SECTORS,*seldsk(DRIVEC))); /* sector */
  105.     bios(12,sectbuf);        /* buffer */
  106.     retval=(bios(13,NULL)!=0);    /* read sector */
  107.     (void)seldsk((int)*(char *)4);    /* drive last selected by BDOS */
  108.     return retval;
  109. }
  110.