[Coco] LSN0 C code

Bob Devries devries.bob at gmail.com
Thu Jun 9 17:30:57 EDT 2011


Since the code is quite short, I'll include it inline here:

/* Lsn0 - Displays and decodes the contents of Logical Sector Number 0 */
/* CopyRight (c) 1989 by Bob Devries */
/* This programme may be freely distributed, provided this message is */
/* not removed from the source code. */
#include <stdio.h>
#include <direct.h>
union sec {
    long numsec;
    char tsec[4];
    unsigned usec;
    };
main (argc,argv)
int argc;
char *argv[];
{
    int fp;
    char attr[11];
    static char *at[] = {"d","s","e","w","r","e","w","r"};
    struct ddsect disk;
    int i,count;
    union sec totsec;
    pflinit();
    for (i=0;i<4;i++) totsec.tsec[i] = '\0';
        if((argc != 2) || ((argv[1][0] == '-') && (argv[1][1]) == '?'))
        {
        usage();
        exit(0);
        }
    if (argv[1][0] != '/')
    {
    usage();
    exit(0);
    }
    count = strlen(argv[1]);
    for (i=1;i <= count; i++)
    {
        if (argv[1][i] == '/')
        {
        fprintf(stderr,"%s is not a device name.\n\n",argv[1]);
        usage();
        exit(0);
        }
    }
    argv[1][count++] = '@';
    argv[1][count] = '\0';
    if ((fp = open(argv[1],_READ)) == EOF)
        {
        fprintf(stderr,"Can't open %s for reading.\n\n",argv[1]);
        usage();
    }
    read(fp,&disk,sizeof(disk));
    close(fp);
    totsec.tsec[1] = disk.dd_tot[0];
    totsec.tsec[2] = disk.dd_tot[1];
    totsec.tsec[3] = disk.dd_tot[2];
    argv[1][--count] = '\0';
    printf("\n LSN 0 description of %s.\n",argv[1]);
    printf("\n\n Total number of sectors = %ld.\n",totsec.numsec);
    printf(" Sectors per track = %d.\n",disk.dd_tsk);
    printf(" Bytes in allocation map = %u.\n",disk.dd_map);
    printf(" Cluster size = %u.\n",disk.dd_bit);
    totsec.tsec[1] = disk.dd_dir[0];
    totsec.tsec[2] = disk.dd_dir[1];
    totsec.tsec[3] = disk.dd_dir[2];
    printf(" Address of Root Directory = %ld.\n",totsec.numsec);
    printf(" Owner number = %u.\n",disk.dd_own);
    count = 256;
    strcpy(attr," = ");
    for(i=1;i<9;i++)
        {
        count = ((count>>1) & 0xff);
        if(disk.dd_att & count)
            strcat(attr,at[i-1]);
        else
            strcat(attr,"-");
        }
        printf(" Attributes = %02X%s.\n",(disk.dd_att & 0xff),attr);
        printf(" Disk ID = %u.\n",disk.dd_dsk);
        printf(" Media format = %d =",disk.dd_fmt);
        switch(disk.dd_fmt)
            {
            case 0:
                printf("48 tpi SDSS.\n");
                break;
            case 1:
                printf("48 tpi SDDS.\n");
                break;
            case 2:
                printf("48 tpi DDSS.\n");
                break;
            case 3:
                printf("48 tpi DDDS.\n");
                break;
            case 4:
                printf("96 tpi SDSS.\n");
                break;
            case 5:
                printf("96 tpi SDDS.\n");
                break;
            case 6:
                printf("96 tpi DDSS.\n");
                break;
            case 7:
                printf("96 tpi DDDS.\n");
                break;
            default:
                printf(" Can't identify format.\n");
            }
    printf(" Sectors per track (track 0) = %u.\n",disk.dd_spt);
    totsec.tsec[1] = disk.dd_bt[0];
    totsec.tsec[2] = disk.dd_bt[1];
    totsec.tsec[3] = disk.dd_bt[2];
    printf(" Address of bootstrap file = %ld.\n",totsec.numsec);
    printf(" Length of bootstrap file = %u",disk.dd_bsz);
    if (disk.dd_bsz == 0)
        printf(":No boot installed.\n");
    else
        printf(".\n");
    printf(" Creation date : %02d/%02d/%02d %02d:%02d.\n", 
disk.dd_date[0],disk.dd_date[1],disk.dd_date[2],disk.dd_date[3],disk.dd_date[4]);
    for (i=0; i<32; ++i)
        {
            if (disk.dd_name[i] < 0)
                {
                    disk.dd_name[i] -= 128;
                    disk.dd_name[++i] = '\0';
                    break;
                }
        }
        printf(" Volume name = %s.\n\n",disk.dd_name);
 }
usage()
{
    fprintf(stderr,"\n Usage: lsn0 /devicename\n\n");
} 




More information about the Coco mailing list