#include <string.h>
#include <stdio.h>
#include <ext.h>
#include <tos.h>

#include "jclkcook.h"

int get_cookie (long cookie, long *value)
{
	long *cookiejar = (long *)Setexc(0x168,-1);

	if (cookiejar)
	{
		while (*cookiejar)
		{
			if (*cookiejar==cookie)
			{
				if (value)
					*value = *++cookiejar;
				return 1;
			}
			cookiejar += 2;
		}
	}
	return 0;
}

char *hotkeystring(int x)
{
	static char string[80];
	*string = 0;

	if (x & 2)
		strcat(string, "LeftShift+");
	if (x & 1)
		strcat(string, "RightShift+");
	if (x & 4)
		strcat(string, "Control+");
	if (x & 8)
		strcat(string, "Alternate+");

	if (*string)
		string[strlen(string)-1] = 0;
	return string;
}

void vypis(long adr)
{
	JCLKSTRUCT *jclk = (JCLKSTRUCT *)adr;

	if (jclk->name != CLOCKY_IDENT) {
		printf("This is not my Clocky!\n");
		getchar();
		return;
	}

	if (jclk->version < CLOCKY_VERSION) {
		printf("Too old Clocky - get newer\n");
		getchar();
		return;
	}

#define BOO(x)	(jclk->parametry.x) ? "[Yes]" : "[No] "

	while((Kbshift(-1)&15) != 14)
	{
		printf("\33H");
		printf("Hotkey combination: %s\n", hotkeystring(jclk->hotshift));
		printf("Seekey combination: %s\n", hotkeystring(jclk->hottime));
		printf("Show time: %s\t", BOO(ShowTime));
		printf("Look at time with Seekeys: %s\n", BOO(ShowKuk));
#if 0
		printf("Zobrazovat datum vlevo od ‡asu: %s\n", BOO(Showdate));
		printf("Zobrazovat den v t˜dnu a symboly: %s\n", BOO(Showday));
		printf("Zobrazovat roky a sekundy: %s\n", BOO(Showyear));
#endif
		printf("Show CapsLock sign: %s\n", BOO(ShowCaps));
		printf("Offer external hotkeys: %s\n", BOO(KbdEHC));
		printf("Dead keys: %s\t", BOO(Kbddead));
		printf("ASCII code via numeric keypad: %s\n", BOO(Kbdasci));
		printf("Turn off keyboard click sound: %s\t", BOO(Kbdcink));
		printf("Turn off system bell sound: %s\n", BOO(Kbdbell));
		printf("Keyboard layout: ");
		switch(jclk->parametry.Kbdlayo) {
			case 0:	printf("do not change\n"); break;
			case 1:	printf("the ROM one\n"); break;
			case 2:	printf("the first predefined\n"); break;
			case 3: printf("the second predefined\n"); break;
		}
		printf("\n");
		printf("Mouse accelerator active: %s\t", BOO(Miscmys));
		if (jclk->parametry.Miscmys)
			printf("Accelerate: %s\n", jclk->parametry.Misc4x ? "four times" : "twice");
		printf("Special Latin2 conversion on printer output: %s\n", BOO(Miscprnt));
		printf("MegaSTE Turbo 16 MHz + cache: %s\t", BOO(Miscturb));
		printf("Colour inversion on boot: %s\n", BOO(Miscinv));
#if 0
		printf("Zvukov‚ znamen¡ ka‘dou hodinu: %s\n", BOO(Misctut));
#endif
		printf("\n");
		printf("Screen saver is active (countdown runs): %s\n", BOO(Saveron));
#if 0
		printf("SS hl¡d  Modem1 CD: %s\n", BOO(SaveMod1));
		printf("SS hl¡d  Modem2 CD: %s\n", BOO(SaveMod2));
		printf("SS akce - zhasnout barvy/st©¡dat inverzi: %s\n", BOO(Saveact1));
		printf("SS tvrd¨¡ akce - extern¡ takt pro Shifter/vypnout VGA: %s\n", BOO(Saveact2));
#endif
		printf("Remaining time to screen saver action: %d\n", jclk->saverlen - jclk->savecount);
		printf("\nAlt+Control+key: actual_key = %02x (for JCLKTOOL.SET)\n", jclk->actual_key);

		printf("\nPress Left Shift+Control+Alt to quit...");
	}
}

main(void)
{
	long adr;

	if (get_cookie('JCLK', &adr)) {
		vypis(adr);
	}
	else {
		printf("JoyCookie not found\n");
		getchar();
		return -1;
	}
	return 0;
}
