/*
	NOBOOT.C	written by Leor Zolman
			3/82

	Given a list of C-generated COM files (linked with the standard
	distribution version of the C.CCC run-time package), this program
	changes those COM files so that they do not perform a warm-boot after
	their execution is complete, but instead preserve the CCP (Console
	Command Processor) that is in memory when execution begins and
	return to the CCP directly following execution.

	NOTE: If a command is the object of a pipe operation using DIO,
	then a warm-boot will always occur after its execution, whether
	or not NOBOOT has been applied to it.

	link by:
		A>clink noboot wildexp
	(or)	A>l2 noboot wildexp
*/

#include "bdscio.h"

main(argc,argv)
char **argv;
{
   int fd;
   int i;
   char c;
   char nambuf[30];
   char workbuf[0x500];
   int loop;

   if (argc == 1) {
 	puts("Usage: noboot <list of C-generated COM file names>\n");
	exit();
   }

   for (loop = 1; loop < argc; loop++)
   {
	puts("NOBOOT-ing ");
	puts(argv[loop]);
	putchar('\n');

	for (i=0; (c = argv[loop][i]) && c != '.'; i++)
		 nambuf[i] = c;
	nambuf[i] = '\0';
	strcat(nambuf,".COM");

	if ((fd = open(nambuf,2)) == ERROR) {
		puts("Can't open: ");
		puts(nambuf);
		exit();
	}

	i = read(fd,workbuf+0x100,8);
	if (i != 8) puts("Couldn't read in at least 8 sectors...\n");

	workbuf[0x100] = 0x21;
	workbuf[0x101] = 0x00;
	workbuf[0x102] = 0x00;
	workbuf[0x103] = 0x39;
	workbuf[0x104] = 0x22;
	workbuf[0x105] = 0x79;
	workbuf[0x106] = 0x05;
	workbuf[0x107] = 0xcd;
	workbuf[0x108] = 0x34;
	workbuf[0x109] = 0x01;
	workbuf[0x10a] = 0xf9;

	workbuf[0x12f] = 0x2a;
	workbuf[0x130] = 0x79;
	workbuf[0x131] = 0x05;
	workbuf[0x132] = 0xf9;
	workbuf[0x133] = 0xc9;

	workbuf[0x134] = 0x2a;
	workbuf[0x135] = 0x06;
	workbuf[0x136] = 0x00;
	workbuf[0x137] = 0x11;
	workbuf[0x138] = 0xcc;
	workbuf[0x139] = 0xf7;
	workbuf[0x13a] = 0x19;
	workbuf[0x13b] = 0xc9;
	workbuf[0x13c] = 0x00;
	workbuf[0x13d] = 0x00;
	workbuf[0x13e] = 0x00;

	workbuf[0x443] = 0xc3;
	workbuf[0x444] = 0x2f;
	workbuf[0x445] = 0x01;

	seek(fd,0,0);
	if (write(fd,workbuf+0x100,8) != 8) {
		puts("Write error.\n");
		exit();
	}

	if (close(fd) == ERROR) {
		puts("Close error\n");
	}
   }
}
