/***********************************************************************

	makeboot.c - Erzeugen eines Bootblock-Intros

	by Martin Brenner Dec-87

 ***********************************************************************/

#include <exec/types.h>
#include <exec/exec.h>
#include <devices/trackdisk.h>
#include <stdio.h>

long DoIO();
void *AllocMem();
void FreeMem();
struct MsgPort *CreatePort();
void DeletePort();
struct IOStdReq *CreateStdIO();
void DeleteStdIO();
long OpenDevice();
void CloseDevice();

#define BLOCKSIZE TD_SECTOR

struct MsgPort *diskport;
struct IOStdReq *diskreq;
UBYTE *diskbuffer;
         
WriteBlocks()	/* Block 0 und 1 */
	{
        diskreq->io_Length = BLOCKSIZE*2;	/* 1024 Bytes */
        diskreq->io_Data = (APTR)diskbuffer;
        diskreq->io_Command = CMD_WRITE;
        diskreq->io_Offset = 0;
        DoIO(diskreq);
	}
Update()
	{
        diskreq->io_Command = CMD_UPDATE;
	DoIO(diskreq);
	}
  
Motor(state)
int state;
	{
        diskreq->io_Length = state;
        diskreq->io_Command = TD_MOTOR;
        DoIO(diskreq);
	}
 
main(argc, argv)   
int argc;
char *argv[];
{
        SHORT i, c;
	FILE *fp, *fopen();
	long drive;
	UBYTE *diskdata;
	ULONG *longptr, lng, sum;
	UWORD matchword;
	UBYTE input[256];
	long error;
        
	printf("\23333mBoot Block Writer by -=mb=-\n\2330m");
	if (argc < 3 || argc > 3 || strncmp("df",argv[1],2)) {
		printf("\23333mUsage: %s <drive> <file>\2330m\n", argv[0]);
		printf("- drive: df0:, df1:, df2:, df3:\n");
		printf("- file: boot-intro to write \n");
		exit(1);
		}
	if ((drive = argv[1][2] - 48) < 0 || drive > 3) {
		printf("\23333mWrong drive number %ld !\2330m\n", drive);
		exit(1);
		}

	/* Puffer fuer Trackdisk-Operationen im CHIP-Memory alocieren */
	diskbuffer = (UBYTE *)AllocMem (1024L, MEMF_CHIP|MEMF_CLEAR);
	if (diskbuffer == NULL) printf("No memory!\n"), exit(101);

	/* Intro-Datei oeffnen und nach Matchword suchen */
	fp = fopen(argv[2], "r");
	if (fp == NULL) {
		printf("Datei %s nicht gefunden!\n",argv[2]);
		exit(2);
		}
	do	{
		if ((c = getc(fp)) == EOF) {
			printf("%s ist kein Boot-Intro!\n", argv[2]);
			exit(3);
			}
		}
	while ((matchword = c * 256 + getc(fp)) != 0x4afc);

	/* DOS-Kennung setzen und Intro in Puffer lesen */
	diskdata = diskbuffer;
	strncpy(diskdata,"DOS\0",4);
	diskdata += 12;
	while ((c = getc(fp)) != EOF) {
		*diskdata++ = c;
		}

	/* Bootblock-Checksumme berechnen */
	longptr = (ULONG *)diskbuffer;
	sum = *longptr;
	longptr ++;
	longptr ++;
	*longptr = 0x370;
	for (i = 0; i < 254; i++) {
		lng = sum + *longptr++;
		sum = lng + (lng < sum);
		}
	longptr = (ULONG *)diskbuffer;
	*++longptr = ~sum;

	printf("\n\23333mInsert Disk to write to, hit RETURN\2330m\n");
	gets(input);

	/* Trackdisk-Device oeffnen */
	diskport = CreatePort(0L,0L);
	if(diskport == 0) exit(200);
	diskreq = CreateStdIO(diskport);
	if(diskreq == 0) DeletePort(diskport), exit(201);
	error = OpenDevice(TD_NAME,drive,diskreq,0L);
	if (error) exit(202);

	/* Bootblocks auf Disk schreiben */
	Motor(1);
	WriteBlocks();
	if(diskreq->io_Error) {
		printf("Error Write Blocks, Error %d\n", diskreq->io_Error);
		exit(203);
		}
	Update();
	Motor(0);

	/* Aufraeumen */
	CloseDevice(diskreq);
        DeleteStdIO(diskreq);
        DeletePort(diskport);

	}       /* end of main */
