// Application "Hello World" for Windows;

#COMPILER_OPTION UTF8 PE;
#define LOCAL_HEAP = 2000h;
#define STDIN  = 0;
#define STDOUT = 1;
#define STDERR = 2;
#define STD_INPUT_HANDLE       = -10;
#define STD_OUTPUT_HANDLE      = -11;
#define STD_ERROR_HANDLE       = -12;
#define INVALID_HANDLE_VALUE   = -1;

extern ExitProcess() as 'ExitProcess' in KERNEL32 as 'KERNEL32.DLL';
extern WriteFile() as 'WriteFile' in KERNEL32;
extern GetStdHandle() as 'GetStdHandle' in KERNEL32;

m64 _stdin;
m64 _stdout;
m64 _stderr;

proc __Init_Win64(){
	r2 = STD_INPUT_HANDLE;
	call GetStdHandle();
	_stdin = r0;
	r2 = STD_OUTPUT_HANDLE;
	call GetStdHandle();
	_stdout = r0;
	r2 = STD_ERROR_HANDLE;
	call GetStdHandle();
	_stderr = r0;
};

proc strlen(string) {
	push r1, r2;
	r1 = string;
	r1 = r1 + 2;
	r0 = r0 ^ r0;		// our count;
	r2 = r0;			// our char;
	r2b = [r1+r0];
	while (r2){
		r0 = r0 + 1;
		r2b = [r1+r0];
	}
	pop r2, r1;
	return(r0);
};

proc sys_write(_handle, _ptr, _size){
	m64 buffer;
	r2 = _handle;
	r0 = STDIN;
	if(r2 == r0){
		r2 = _stdin;
	} else {
		r0 = STDOUT;
		if(r2 == r0){
			r2 = _stdout;
		} else {
			r0 = STDERR;
			if(r2 == r0){
				r2 = _stderr;
			}
		}
	}
	r3 = _ptr;
	r3 = r3 + 2;
	r8 = _size;
	r9 = &buffer;
	r0 = 0;
	push r0;
	call WriteFile();
	return(r0);
};

proc echo_string(handle, string) {
	r1 = string;
	r3 = strlen(r1);
	r2 = handle;
	sys_write(r2, r1, r3);
	return(r0);
};

proc main(){
	__Init_Win64();
	echo_string(STDOUT, 'Hello world via the console\n');
	echo_string(STDOUT, 'And another string\n');
	exit(0);
};
