/* TABSIZE 4
 * @(#)XHDItest.c
 * 1995-05-27 von Rainer Seitel, Rastatt, DE.
 * 1995-07-28 Zweisprachig: deutsch wenn _AKP = $??????01??, sonst englisch.
 * 1995-10-17 Alte DOS-Limits werden beim Programmende restauriert.
 * Public domain
 */


#include <stdio.h>
#include "xhdi.h"  /* static bei getcookie() auskommentieren */


#define E_OK 0
#define EDRVNR -2
#define EINVFN -32
#define FIRST_CLUSTER 2
#define NUM_DRIVES 32


int main( int argc, unsigned char *argv[] )
{
	long german, r;
	LONG old_secsiz, old_minfat, old_maxfat, old_minspc, old_maxspc, old_clusts,
	     old_maxsec, old_drives;
	UWORD dos_version, xhdi, major, minor;
	ULONG start_sector = 0, blocks = 0;
	const BPB bpb;
	unsigned char partid[4] = {0, 0, 0, 0};

	/* Landessprache bestimmen */
	if (getcookie(0x5F414B50L, &german))  /* _AKP */
		german = (german & 0xFF00) == 0x100;
	else
		german = 0;

	dos_version = Sversion();
		printf("\rXHDI-Test 1995-10-17 Rainer Seitel\n\n"\
		       "GEMDOS Version %x.%02x\n\n", dos_version & 0xFF, dos_version >> 8);

	xhdi = XHGetVersion();
	if (german)
		printf("Plattentreiber hat XHDI %x.%02x", xhdi >> 8, xhdi & 0xFF);
	else
		printf("Hard disc driver has XHDI %x.%02x", xhdi >> 8, xhdi & 0xFF);

	if (xhdi) {
		old_secsiz = XHDOSLimits(XH_DL_SECSIZ, 0);
		old_minfat = XHDOSLimits(XH_DL_MINFAT, 0);
		old_maxfat = XHDOSLimits(XH_DL_MAXFAT, 0);
		old_minspc = XHDOSLimits(XH_DL_MINSPC, 0);
		old_maxspc = XHDOSLimits(XH_DL_MAXSPC, 0);
		old_clusts = XHDOSLimits(XH_DL_CLUSTS, 0);
		old_maxsec = XHDOSLimits(XH_DL_MAXSEC, 0);
		old_drives = XHDOSLimits(XH_DL_DRIVES, 0);

		printf(", XHDOSLimits :-");
		if (XHDOSLimits(XH_DL_MAXSEC, 0xFFFFFFL) == EINVFN)
			printf("(");
		else if (XHDOSLimits(XH_DL_MAXSEC, old_maxsec) != 0xFFFFFFL)
			printf("/");
		else
			printf(")");

		printf("\nXHDI-DOS-Limits XH_DL_SECSIZ: %ld\n", old_secsiz);
		printf("XHDI-DOS-Limits XH_DL_MINFAT: %ld\n", old_minfat);
		printf("XHDI-DOS-Limits XH_DL_MAXFAT: %ld\n", old_maxfat);
		printf("XHDI-DOS-Limits XH_DL_MINSPC: %ld\n", old_minspc);
		printf("XHDI-DOS-Limits XH_DL_MAXSPC: %ld\n", old_maxspc);
		printf("XHDI-DOS-Limits XH_DL_CLUSTS: %ld\n", old_clusts);
		printf("XHDI-DOS-Limits XH_DL_MAXSEC: %ld\n", old_maxsec);
		printf("XHDI-DOS-Limits XH_DL_DRIVES: %ld\n", old_drives);
	
		/* Bei Plattentreiber mit XHDI 1.20 DOS-Limits einstellen. */
		if (xhdi >= 0x120) {
			if (german)
				printf("XHDI  1.20, versuche Big-DOS-Werte einzustellen:\n");
			else
				printf("XHDI  1.20, try to set Big-DOS limits:\n");
			XHDOSLimits(XH_DL_SECSIZ, 32768L);
			XHDOSLimits(XH_DL_MINFAT, 1);
			XHDOSLimits(XH_DL_MAXFAT, 2);
			XHDOSLimits(XH_DL_MINSPC, 1);
			XHDOSLimits(XH_DL_MAXSPC, 64);
			XHDOSLimits(XH_DL_CLUSTS, 0xFFF0L-FIRST_CLUSTER);
			XHDOSLimits(XH_DL_MAXSEC, 0xFFFFFFL);
			XHDOSLimits(XH_DL_DRIVES, NUM_DRIVES);
			printf("XHDI-DOS-Limits XH_DL_SECSIZ: %ld\n", XHDOSLimits(XH_DL_SECSIZ, old_secsiz));
			printf("XHDI-DOS-Limits XH_DL_MINFAT: %ld\n", XHDOSLimits(XH_DL_MINFAT, old_minfat));
			printf("XHDI-DOS-Limits XH_DL_MAXFAT: %ld\n", XHDOSLimits(XH_DL_MAXFAT, old_maxfat));
			printf("XHDI-DOS-Limits XH_DL_MINSPC: %ld\n", XHDOSLimits(XH_DL_MINSPC, old_minspc));
			printf("XHDI-DOS-Limits XH_DL_MAXSPC: %ld\n", XHDOSLimits(XH_DL_MAXSPC, old_maxspc));
			printf("XHDI-DOS-Limits XH_DL_CLUSTS: %ld\n", XHDOSLimits(XH_DL_CLUSTS, old_clusts));
			printf("XHDI-DOS-Limits XH_DL_MAXSEC: %ld\n", XHDOSLimits(XH_DL_MAXSEC, old_maxsec));
			printf("XHDI-DOS-Limits XH_DL_DRIVES: %ld\n", XHDOSLimits(XH_DL_DRIVES, old_drives));
		}

		if (argc < 2)
			if (german)
				printf("\nKein GEMDOS-Laufwerksbuchstabe bergeben!\n");
			else
				printf("\nNo GEMDOS drive letter specified!\n");
		else {
			r = XHInqDev2((*argv[1] & 0x5F) - 'A', &major, &minor, &start_sector,
			              &bpb, &blocks, partid);
			if (r == E_OK || r == EDRVNR) {
				if (partid[0] == 0 && partid[1] == 'D') {  /* MS-DOS-Partition */
					partid[0] = ' ';
					partid[2] += '0';
				}
				if (german)
					printf("\nLaufwerk %c: major %d, minor %d, Start %ld, Gre %ld, ID %s,\n",
					       *argv[1] & 0x5F, major, minor, start_sector, blocks, partid);
				else
					printf("\nDrive %c: major %d, minor %d, start %ld, size %ld, ID %s,\n",
					       *argv[1] & 0x5F, major, minor, start_sector, blocks, partid);
				if (r == E_OK) {
					printf("BPB recsiz %u, ", bpb.recsiz);
					printf("BPB clsiz %d, ", bpb.clsiz);
					printf("BPB clsizb %u, ", bpb.clsizb);
					printf("BPB rdlen %d, ", bpb.rdlen);
					printf("BPB fsiz %d,\n", bpb.fsiz);
					printf("BPB fatrec %d, ", bpb.fatrec);
					printf("BPB datrec %d, ", bpb.datrec);
					printf("BPB numcl %u, ", bpb.numcl);
					printf("BPB bflags %d\n", bpb.bflags);
				}
			}
		}
	}  /* if (xhdi) */

	Bconin(2);  /* braucht 700 Byte weniger als getchar() */
	return 0;
}
