#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h>
#include <time.h>
#include "kernel.h"
#include "swis.h"

#include "Wimpy.h" // some Wimp definitions

_kernel_swi_regs  SWIRegs;
#define SWI(swi)  SWIcall(swi,True,#swi,__FILE__,__LINE__)
#define SWIX(swi) SWIcall(swi,False,#swi,__FILE__,__LINE__)
#define SWIE(swi) SWIcall(-1,True,#swi,__FILE__,__LINE__)

// Call an SWI and abort in case of error...
// Call with SWI NULL to just abort
_kernel_oserror *SWIcall(int SWIName, int AbortOnError, char *AbortMessage, char *File, int Line) {
	_kernel_oserror *OSError;

	// Call the SWI (if I have one)
	if (SWIName != -1) {
		OSError = _kernel_swi(SWIName,&SWIRegs,&SWIRegs);
		if (OSError == NULL) { return(OSError); }
	}

	// In case of error write debug log and optionally abort
	if (AbortOnError) {
		SWIRegs.r[0] = (int)OSError;
		SWIRegs.r[1] = 1;
		SWIRegs.r[2] = (int)AbortMessage;
		_kernel_swi(Wimp_ReportError,&SWIRegs,&SWIRegs);
	}

	return(OSError);
}

void ShowDateTime(t_OSTimestamp *Timestamp) {

	t_DateTimeOrdinalBlock DateTime;
	int i;

	printf("\n");
	for (i=0;i<5;i++) { printf("%02X ",Timestamp->All[i]); }
	printf("\n");

	SWIRegs.r[0] = -1;
	SWIRegs.r[1] = (int)(Timestamp);
	SWIRegs.r[2] = (int)(&DateTime);
	SWIX(Territory_ConvertTimeToOrdinals);

	printf("TT.MM.YY HH:MM:SS %02d.%02d.%04d %02d:%02d:%02d\n",DateTime.Day,DateTime.Month,DateTime.Year,DateTime.Hour,DateTime.Minute,DateTime.Second);
}

int main (int argc, char *argv[]) {

	t_OSTimestamp Timestamp;
	char Path[] = "<obey$dir>.timesDDE";
	int load,exec;

	// Rock bottom
	Timestamp.All[0] = 0;
	Timestamp.All[1] = 0;
	Timestamp.All[2] = 0;
	Timestamp.All[3] = 0;
	Timestamp.All[4] = 0;
	ShowDateTime(&Timestamp);

	// Now
	SWIRegs.r[0] = 14;
	Timestamp.All[0] = 3;
	SWIRegs.r[1] = (int)(&Timestamp);
	SWIX(OS_Word);
	ShowDateTime(&Timestamp);

	// A file
	// I do not check if the file has a datestamp; I assume it :-)
	SWIRegs.r[0] = 17;
	SWIRegs.r[1] = (int)(&Path);
	SWIX(OS_File);
	load = SWIRegs.r[2];
	exec = SWIRegs.r[3];
	printf("Load/Exec %08X %08X\n",load,exec);
	Timestamp.Parts.High = (char)(load & 0xff);
	Timestamp.Parts.Low = exec;
	ShowDateTime(&Timestamp);

	return 0;
}
