// CJRINFO - shows CJR info
// - Marq
//
// 14.09.2014: Added support for 600/2400 detection, show hex values with $
// 14.09.2014: First vrs

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int showblock(FILE *f)
{
    int c,blknum,len,i,addr;

    unsigned char cs=0;

    // Block header
    c=fgetc(f);
    if(c==EOF)
        return -1;
    c=fgetc(f);

    blknum=fgetc(f);
    printf("blknum: %03d ",blknum);
    len=fgetc(f);
    if(len==0)
        len=256;
    printf("len: %03d ",len);
    addr=fgetc(f)<<8;
    addr+=fgetc(f);
    printf("addr: $%04x ",addr);

    // Data bytes + checksum
    for(i=0;i<len;i++)
        cs+=fgetc(f);

    if(blknum!=255)
    {
        c=fgetc(f);
        printf("checksum: $%02x ",c);
        if(blknum==0 && addr==0xffff)
            printf("(header)\n");
        else
            printf("\n");
    }
    else // Tail block
    {
        printf("checksum: -- (tail)\n");
    }

    return 0;
}

int main(int argc,char *argv[])
{
    FILE *f;
    int length,i,c;

    if((f=fopen(argv[1],"rb"))==NULL)
    {
        printf("File error!\n");
        return 1;
    }

    fseek(f,0,SEEK_END);
    length=ftell(f);
    fseek(f,0,SEEK_SET);

    printf("Opened: %s\n",argv[1]);
    printf("File length: %d\n",length);

    // Read header block separately
    for(i=0;i<4;i++)
        c=fgetc(f);
    if(c==26)
    {
        c=fgetc(f);
        c=fgetc(f);

        printf("BASIC name: \"");
        for(i=0;i<16;i++)
        {
            c=fgetc(f);
            if(isprint(c))
                printf("%c",c);
        }
        printf("\" ");

        c=fgetc(f);
        printf("type: %s (%d) ",(c==1)?"BIN":"BAS",c);
        printf("baud: %s",(fgetc(f)==0)?"2400":"600");
    }
    else // Oh, there was none
    {
        printf("No header block");
    }

    printf("\n");

    fseek(f,0,SEEK_SET);
    while(showblock(f)>=0)
        ;

    fclose(f);

    return 0;
}
