/* Kone ottaa selville tietokoneen mikroprosessorin tyypin ja tulostaa sen. */
/* Pyydettäessä ohjelma myös muuttaa koneen tyypin kertovaa systeemi-		*/
/* struktuuria.																*/

#include <string.h>
#include <exec/exec.h>
#ifdef __SASC
#include <proto/dos.h>
#else
#include <clib/dos_protos.h>
#endif

static char *Ver = "$VER:FakeCPU 1.0 " __AMIGADATE__;

UBYTE CPUType, *FPUType;
extern struct ExecBase *SysBase;

int main(int argc, char **argv) {
	int i;

	Printf("\nExecBase = %08lx\n", SysBase);

	Printf("The version of exec.library = %2ld.%-2ld\n",
		(LONG) (SysBase -> LibNode.lib_Version), (LONG) (SysBase -> LibNode.lib_Revision));

	if (SysBase->AttnFlags & AFF_68040) CPUType = 4;
	else if (SysBase->AttnFlags & AFF_68030) CPUType = 3;
	else if (SysBase->AttnFlags & AFF_68020) CPUType = 2;
	else if (SysBase->AttnFlags & AFF_68010) CPUType = 1;
	else CPUType = 0;

	if (SysBase->AttnFlags & AFF_FPU40)
		if (SysBase->AttnFlags & (AFF_68882 | AFF_68881)) {
			FPUType = "FPU040 + 68882 emulating software";
		} else {
			FPUType = "FPU040, no 68882 emulation software";
		}
	else if (SysBase->AttnFlags & AFF_68882) FPUType = "68882";
	else if (SysBase->AttnFlags & AFF_68881) FPUType = "68881";
	else FPUType = "NONE";

	Printf("Your CPU: 680%ld0, FPU: %s\n\n", (LONG) CPUType, FPUType);

	for (i=1; i<argc; i++) {
		if (!strcmp(argv[i],"NOFPU") || !(strcmp(argv[i],"nofpu"))) {
			SysBase->AttnFlags &= ~(AFF_68881 | AFF_68882 | AFF_FPU40);
			Printf("FPU marked offline\n\n");
		} else if (!strcmp(argv[i],"68881")) {
			SysBase->AttnFlags &= ~(AFF_68882 | AFF_FPU40);
			SysBase->AttnFlags |= (AFF_68881);
			Printf("FPU marked as 68881\n\n");
		} else if (!strcmp(argv[i],"68882")) {
			SysBase->AttnFlags &= ~(AFF_FPU40);
			SysBase->AttnFlags |= (AFF_68881 | AFF_68882);
			Printf("FPU marked as 68882\n\n");
		} else if (!strcmp(argv[i],"FPU040") || !strcmp(argv[i],"fpu040")) {
			SysBase->AttnFlags &= ~(AFF_68881 | AFF_68882);
			SysBase->AttnFlags |= (AFF_FPU40);
			Printf("FPU marked as FPU040 without 68882 emulating software\n\n");
		} else if (!strcmp(argv[i],"FPU040+882") || !strcmp(argv[i],"fpu040+882")) {
			SysBase->AttnFlags |= (AFF_68881 | AFF_68882 | AFF_FPU40);
			Printf("FPU marked as FPU040 with 68882 emulating software\n\n");
		} else if (!strcmp(argv[i],"68000")) {
			SysBase->AttnFlags &= ~(AFF_68010 | AFF_68020 | AFF_68030 | AFF_68040);
			Printf("CPU marked as 68000\n\n");
		} else if (!strcmp(argv[i],"68010")) {
			SysBase->AttnFlags &= ~(AFF_68020 | AFF_68030 | AFF_68040);
			SysBase->AttnFlags |= (AFF_68010);
			Printf("CPU marked as 68010\n\n");
		} else if (!strcmp(argv[i],"68020")) {
			SysBase->AttnFlags &= ~(AFF_68030 | AFF_68040);
			SysBase->AttnFlags |= (AFF_68010 | AFF_68020);
			Printf("CPU marked as 68020\n\n");
		} else if (!strcmp(argv[i],"68030")) {
			SysBase->AttnFlags &= ~(AFF_68040);
			SysBase->AttnFlags |= (AFF_68010 | AFF_68020 | AFF_68030);
			Printf("CPU marked as 68030\n\n");
		} else if (!strcmp(argv[i],"68040")) {
			SysBase->AttnFlags |= (AFF_68010 | AFF_68020 | AFF_68030 | AFF_68040);
			Printf("CPU marked as 68040\n\n");
		} else {
			if (strcmp(argv[i],"?") && (strcmp(argv[i],"-h"))) {
				Printf("*** ERROR: %s is not a valid option!\n\n", argv[i]);
			}
			Printf("FakeCPU 1.0, ©1994 Leopold-Soft\n"
					"Usage: %s [NOFPU 68881 68882 FPU040 FPU040+882 680x0]\n\n",argv[0]); 
		}
	}

	return 0;
}
