/*
	LOAD.C		written by Leo Kenen (I think --LZ)

	Works like the standard CP/M LOAD.COM utility, except it's
	written in C.
*/

#include "bdscio.h"

main(argc,argv)
int argc;
char **argv;
{
        char buf[BUFSIZ], obuf[BUFSIZ];
        int     lfd, ofd;
        char    name[20], oname[20];

        if (!(--argc))
        {
                printf("Useage:load <filename>");
                exit();
        }
        strcpy(name,argv[1]);
        lfd = fopen(name,buf);
        if (lfd == ERROR)
        {
                strcat(name,".HEX");
                lfd = fopen(name,buf);
                if (lfd == ERROR)
                {
                        printf("File not found.\n");
                        exit();
                }
        }
        /* Open the output file */
        strcpy(oname,argv[1]);
        strip(oname);
        strcat(oname,".OBJ");
        ofd = fcreat(oname,obuf);
        if (ofd == ERROR)
        {
                printf("Can not create output file");
                exit();
        }
        load(buf,obuf); /* DO the load operation to fname.obj */
        fflush(obuf);
        fclose(buf);
        fclose(obuf);
}

load(fb,ofb)
char fb[], ofb[];
{
        unsigned  address;
        int       bytes, chksum, count, foo;
        char      ch;

        while((ch=getc(fb)) != ':' );
        while((bytes=rdhex(fb)) != 0 )
        {
                address = rdword(fb);
                foo = rdhex(fb);
                for (count=1;count<=bytes;count++) putc(rdhex(fb),ofb);
                foo = rdhex(fb);
                while((ch=getc(fb)) != ':');
        }
}

rdhex(fbuf)
char fbuf[];
{
        char first, second;

        if (ishex(first=getc(fbuf)) && ishex(second=getc(fbuf)))
        return((tohex(first)*16)+tohex(second));
        else { printf("\nBad hex digit, error.\n");
               exit();
             }
}

rdword(fb)
char fb[];
{
        return((rdhex(fb)<<8)+rdhex(fb));
}

/* Remove anything after a . from a file name */


strip(s)
char *s;
{
        while ((*s != '.') && (*s))  *s++;
        *s = '\0';
}
