/* BMP2SPEC version 1.0 */

/* By the infamous BLOOD! */

/* (C)1996 Cheese Freak Software */

/* This prog is most definitely FREEWARE! */

/* But please don't distribute updated versions without asking first...! */

/* Amiga compilation with AmigaOS version string, Chris Young 1998 */

#include <stdio.h>

#include <stdlib.h>

#include "bmp2spec.h"



void main(int argc, char *argv[])

{

    FILE *fp1, *fp2;

    BYTE header[24],checkbit=255,data[6144], screen[6144];

    int count,count2,ptr,ptr2,ptr3,x,y,z,result;

char *ver = "$VER:BMP2SPEC 1.0 (13.06.98)";

    getheader(header);

    printf("\nBMP2SPEC version 1.0\n");

    printf("Written by the infamous BLOOD!\naka l.d.tonks@bra0202.wins.icl.co.uk\n");

    printf("(C)1996 Cheese Freak Software\n\n");

    printf("This program is FREEWARE! Don't pay more than 2p for it!\n\n");


    if(argc!=3)

    {
    printf("**** IMPORTANT! ****\n");
    printf("Set STACK 50000 before trying to run this program, or it'll crash!\n\n");

        printf("Usage : BMP2SPEC <bitmap file input> <tape file output>\n");

        printf("Example : BMP2SPEC jetset.bmp jetset.tap\n\n");

        exit(0);

    }

    else

    {

        printf("Converting %s to %s....\n",argv[1],argv[2]);

        fp1=fopen(argv[1],"rb");

        if(fp1==NULL)

        {

            printf("Error opening %s...!\n",argv[1]);

            exit(1);

        };

        fp2=fopen(argv[2],"wb");

        if(fp2==NULL)

        {

            printf("Error opening %s...!\n",argv[2]);

            exit(1);

        };



        result=fwrite(header,24,1,fp2);

        if(result!=1)

        {

            printf("Can't write to %s...!\n",argv[2]);

            exit(1);

        };

        

        result=fread(data,62,1,fp1);

        if(result!=1)

        {

            printf("Can't read from %s...!\n",argv[1]);

            exit(1);

        };



        printf("Reading bitmap data...\n");

        result=fread(screen,6144,1,fp1);

        if(result!=1)

        {

            printf("Read error in %s...!\n",argv[1]);

            exit(1);

        };

        

        printf("Sorting bitmap data...\n");

        ptr=0;

        ptr2=6144;

        ptr3=0;

        for(count=0;count<192;count++)

        {

            ptr2=ptr2-32;

            ptr3=ptr2;

            for(count2=0;count2<32;count2++)

            {

                data[ptr]=screen[ptr3];

                ptr++;

                ptr3++;

            };

        };



        printf("Creating Spectrum Screen...\n");        

        x=0;

        y=0;

        z=0;

        

        for(count=0;count<2048;count++)

        {

            screen[count]=data[x+(y*32)];

            screen[count]=screen[count]^255;

            checkbit = (checkbit ^ screen[count]);

            x++;

            if(x>=32)

            {

                x=0;

                y=y+8;

                if(y>=64)

                {

                    z++;

                    y=z;

                };

            };

        };



        x=0;

        y=64;

        z=64;

        

        for(count=2048;count<4096;count++)

        {

            screen[count]=data[x+(y*32)];

            screen[count]=screen[count]^255;

            checkbit = (checkbit ^ screen[count]);

            x++;

            if(x>=32)

            {

                x=0;

                y=y+8;

                if(y>=128)

                {

                    z++;

                    y=z;

                };

            };

        };



        x=0;

        y=128;

        z=128;

        

        for(count=4096;count<6144;count++)

        {

            screen[count]=data[x+(y*32)];

            screen[count]=screen[count]^255;

            checkbit = (checkbit ^ screen[count]);

            x++;

            if(x>=32)

            {

                x=0;

                y=y+8;

                if(y>=192)

                {

                    z++;

                    y=z;

                };

            };

        };



        printf("Writing TAP file...\n");

        result=fwrite(screen,6144,1,fp2);

        if(result!=1)

        {

            printf("Error writing to %s...!\n",argv[2]);

            exit(1);

        };



        data[0]=56;

        for(count=0;count<768;count++)

        {

            result=fwrite(data,1,1,fp2);

            if(result!=1)

            {

                printf("Error writing to %s...!\n",argv[2]);

                exit(1);

            };



        };

        

        result=fwrite(&checkbit,1,1,fp2);

        if(result!=1)

        {

            printf("Error writing to %s...!\n",argv[2]);

            exit(1);

        };

        

        printf("\nConversion done...!\n");



        fclose(fp1);

        fclose(fp2);

    };

}





void getheader(BYTE header[24])

{

    header[0]=19;    

    header[1]=0;    

    header[2]=0;    

    header[3]=3;    

    header[4]=115;    

    header[5]=99;    

    header[6]=114;    

    header[7]=101;    

    header[8]=101;    

    header[9]=110;    

    header[10]=32;    

    header[11]=32;    

    header[12]=32;    

    header[13]=32;    

    header[14]=0;    

    header[15]=27;    

    header[16]=0;    

    header[17]=64;    

    header[18]=0;    

    header[19]=128;    

    header[20]=212;    

    header[21]=2;    

    header[22]=27;    

    header[23]=255;    

}

