program AppSkeleton {
	section module {
 		sdl,
		std
	}
	section data {
		int rax = 0
		int rbx = 0
		int rcx = 0
		int rdx = 0
		int rsi = 0
		int rdi = 0
		int r8 = 0
		int r9 = 0
		int r10 = 0
		int r11 = 0
		int r12 = 0
		ptr arg0 = null
		string str_0 = "Logo"
		string str_1 = "font.ttf"
		string str_2 = "Hello, World in Pascal MXVM"
		string str_3 = "failed to init SDL"
		string str_4 = "Could not create window"
		string str_5 = "could not create  renderer"
		string str_6 = "could not create render target"
		string str_7 = "Font subsystem failed to load"
		string str_8 = "failed to open: "
		string fmt_str = "%s "
		string newline = "\n"
		ptr title = null
		ptr filename = null
		int running = 0
		int event_type_result = 0
		int window_id = 0
		int renderer = 0
		int target_id = 0
		int font_id = 0
		ptr init_title = null
		int init_x = 0
		int init_y = 0
		int init_w = 0
		int init_h = 0
		int __funcret_init = 0
	}
	section code {
	start:
		mov title, str_0
		mov filename, str_1
		mov arg0, title
		mov rbx, 100
		mov rcx, 100
		mov rdx, 1280
		mov rsi, 720
		call PROC_init
		mov running, 1
	WHILE_0:
		cmp running, 1
		jne ENDWHILE_1
	WHILE_4:
		invoke poll_event
		return rcx
		cmp rcx, 0
		je ENDWHILE_5
		invoke get_event_type
		return rsi
		mov event_type_result, rsi
		cmp event_type_result, 256
		jne ELSE_8
		mov running, 0
	ELSE_8:
		cmp event_type_result, 768
		jne ELSE_12
		invoke get_key_code
		return r9
		cmp r9, 27
		jne ELSE_12
		mov running, 0
	ELSE_12:
		jmp WHILE_4
	ENDWHILE_5:
		mov r9, 0
		mov r10, 0
		mov r11, 0
		mov r12, 255
		invoke set_draw_color, renderer, r9, r10, r11, r12
		invoke clear, renderer
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call PROC_render
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		mov r9, 1280
		mov r10, 720
		invoke present_scaled, renderer, target_id, r9, r10
		jmp WHILE_0
	ENDWHILE_1:
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call PROC_cleanup
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		done
	function PROC_render:
		invoke set_render_target, renderer, target_id
		mov rbx, 25
		mov rcx, 25
		mov rdx, 255
		mov rsi, 255
		mov rdi, 255
		mov r8, 255
		invoke draw_text, renderer, font_id, str_2, rbx, rcx, rdx, rsi, rdi, r8
	PROC_END_render:
		ret
	function PROC_init:
		mov init_title, arg0
		mov init_x, rbx
		mov init_y, rcx
		mov init_w, rdx
		mov init_h, rsi
		invoke init
		return rbx
		mov __funcret_init, rbx
		cmp __funcret_init, 0
		je ELSE_20
		print fmt_str, str_3
		print newline
		exit 1
	ELSE_20:
		mov rsi, 4
		invoke create_window, title, init_x, init_y, init_w, init_h, rsi
		return rdx
		mov window_id, rdx
		mov rsi, 0
		sub rsi, 1
		cmp window_id, rsi
		jne ELSE_24
		print fmt_str, str_4
		print newline
		invoke quit
		exit 1
	ELSE_24:
		mov r8, 0
		sub r8, 1
		mov r10, 2
		invoke create_renderer, window_id, r8, r10
		return r9
		mov renderer, r9
		mov r8, 0
		sub r8, 1
		cmp renderer, r8
		jne ELSE_28
		print fmt_str, str_5
		print newline
		invoke destroy_window, window_id
		invoke quit
		exit 1
	ELSE_28:
		mov r10, 640
		mov r11, 360
		invoke create_render_target, renderer, r10, r11
		return r9
		mov target_id, r9
		mov r9, 0
		sub r9, 1
		cmp target_id, r9
		jne ELSE_32
		print fmt_str, str_6
		print newline
		invoke destroy_window, window_id
		invoke destroy_renderer, renderer
		exit 1
		invoke quit
	ELSE_32:
		invoke get_ticks
		return r9
		invoke srand, r9
		invoke init_text
		return r9
		cmp r9, 1
		je ELSE_36
		print fmt_str, str_7
		print newline
		exit 1
	ELSE_36:
		mov r10, 32
		invoke load_font, filename, r10
		return r9
		mov font_id, r9
		mov r9, 0
		sub r9, 1
		cmp font_id, r9
		jne ELSE_40
		print fmt_str, str_8
		print fmt_str, filename
		print newline
		exit 1
	ELSE_40:
	PROC_END_init:
		ret
	function PROC_cleanup:
		invoke destroy_render_target, target_id
		invoke destroy_renderer, renderer
		invoke destroy_window, window_id
		invoke quit_text
		invoke quit
	PROC_END_cleanup:
		ret
	}
}