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 = "Space"
		string str_1 = "font.ttf"
		string str_2 = "Grid Shift"
		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 blocks = null
		ptr color = null
		int setcolor_color_index = 0
		int shift_array_left_wrap_iq = 0
		int shift_array_left_wrap_first = 0
		int render_ix = 0
		int render_iy = 0
		int render_block = 0
		int init_array_index = 0
		ptr init_title = null
		int init_x = 0
		int init_y = 0
		int init_w = 0
		int init_h = 0
		int init_result = 0
		int __funcret_init = 0
		int indexAt_xval = 0
		int indexAt_yval = 0
		int __funcret_indexAt = 0
	}
	section code {
	start:
		mov title, str_0
		mov filename, str_1
		alloc blocks, 8, 529
		alloc color, 8, 4
		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
		free blocks
		free color
		done
	function PROC_setcolor:
		mov setcolor_color_index, rbx
		cmp setcolor_color_index, 0
		je CASE_0_21
		cmp setcolor_color_index, 1
		je CASE_1_22
		cmp setcolor_color_index, 2
		je CASE_2_23
		cmp setcolor_color_index, 3
		je CASE_3_24
		cmp setcolor_color_index, 4
		je CASE_4_25
		jmp CASE_END_20
	CASE_0_21:
		cmp 0, 0
		jl IDX_OOB_28
		cmp 0, 3
		jg IDX_OOB_28
		jmp IDX_OK_27
	IDX_OOB_28:
		exit 1
	IDX_OK_27:
		mov rbx, 0
		store 255, color, rbx, 8
		cmp 1, 0
		jl IDX_OOB_30
		cmp 1, 3
		jg IDX_OOB_30
		jmp IDX_OK_29
	IDX_OOB_30:
		exit 1
	IDX_OK_29:
		mov rbx, 1
		store 255, color, rbx, 8
		cmp 2, 0
		jl IDX_OOB_32
		cmp 2, 3
		jg IDX_OOB_32
		jmp IDX_OK_31
	IDX_OOB_32:
		exit 1
	IDX_OK_31:
		mov rbx, 2
		store 0, color, rbx, 8
		jmp CASE_END_20
	CASE_1_22:
		cmp 0, 0
		jl IDX_OOB_34
		cmp 0, 3
		jg IDX_OOB_34
		jmp IDX_OK_33
	IDX_OOB_34:
		exit 1
	IDX_OK_33:
		mov rbx, 0
		store 255, color, rbx, 8
		cmp 1, 0
		jl IDX_OOB_36
		cmp 1, 3
		jg IDX_OOB_36
		jmp IDX_OK_35
	IDX_OOB_36:
		exit 1
	IDX_OK_35:
		mov rbx, 1
		store 0, color, rbx, 8
		cmp 2, 0
		jl IDX_OOB_38
		cmp 2, 3
		jg IDX_OOB_38
		jmp IDX_OK_37
	IDX_OOB_38:
		exit 1
	IDX_OK_37:
		mov rbx, 2
		store 0, color, rbx, 8
		jmp CASE_END_20
	CASE_2_23:
		cmp 0, 0
		jl IDX_OOB_40
		cmp 0, 3
		jg IDX_OOB_40
		jmp IDX_OK_39
	IDX_OOB_40:
		exit 1
	IDX_OK_39:
		mov rbx, 0
		store 0, color, rbx, 8
		cmp 1, 0
		jl IDX_OOB_42
		cmp 1, 3
		jg IDX_OOB_42
		jmp IDX_OK_41
	IDX_OOB_42:
		exit 1
	IDX_OK_41:
		mov rbx, 1
		store 255, color, rbx, 8
		cmp 2, 0
		jl IDX_OOB_44
		cmp 2, 3
		jg IDX_OOB_44
		jmp IDX_OK_43
	IDX_OOB_44:
		exit 1
	IDX_OK_43:
		mov rbx, 2
		store 0, color, rbx, 8
		jmp CASE_END_20
	CASE_3_24:
		cmp 0, 0
		jl IDX_OOB_46
		cmp 0, 3
		jg IDX_OOB_46
		jmp IDX_OK_45
	IDX_OOB_46:
		exit 1
	IDX_OK_45:
		mov rbx, 0
		store 0, color, rbx, 8
		cmp 1, 0
		jl IDX_OOB_48
		cmp 1, 3
		jg IDX_OOB_48
		jmp IDX_OK_47
	IDX_OOB_48:
		exit 1
	IDX_OK_47:
		mov rbx, 1
		store 0, color, rbx, 8
		cmp 2, 0
		jl IDX_OOB_50
		cmp 2, 3
		jg IDX_OOB_50
		jmp IDX_OK_49
	IDX_OOB_50:
		exit 1
	IDX_OK_49:
		mov rbx, 2
		store 255, color, rbx, 8
		jmp CASE_END_20
	CASE_4_25:
		cmp 0, 0
		jl IDX_OOB_52
		cmp 0, 3
		jg IDX_OOB_52
		jmp IDX_OK_51
	IDX_OOB_52:
		exit 1
	IDX_OK_51:
		mov rbx, 0
		store 255, color, rbx, 8
		cmp 1, 0
		jl IDX_OOB_54
		cmp 1, 3
		jg IDX_OOB_54
		jmp IDX_OK_53
	IDX_OOB_54:
		exit 1
	IDX_OK_53:
		mov rbx, 1
		store 255, color, rbx, 8
		cmp 2, 0
		jl IDX_OOB_56
		cmp 2, 3
		jg IDX_OOB_56
		jmp IDX_OK_55
	IDX_OOB_56:
		exit 1
	IDX_OK_55:
		mov rbx, 2
		store 255, color, rbx, 8
		jmp CASE_END_20
	CASE_END_20:
	PROC_END_setcolor:
		ret
	function PROC_shift_array_left_wrap:
		mov rbx, 0
		load rcx, blocks, rbx, 8
		mov shift_array_left_wrap_first, rcx
		mov shift_array_left_wrap_iq, 0
	FOR_57:
		cmp shift_array_left_wrap_iq, 527
		jg ENDFOR_58
		mov rbx, shift_array_left_wrap_iq
		add rbx, 1
		mov rdx, rbx
		load rsi, blocks, rdx, 8
		cmp shift_array_left_wrap_iq, 0
		jl IDX_OOB_61
		cmp shift_array_left_wrap_iq, 528
		jg IDX_OOB_61
		jmp IDX_OK_60
	IDX_OOB_61:
		exit 1
	IDX_OK_60:
		mov rdx, shift_array_left_wrap_iq
		store rsi, blocks, rdx, 8
	FOR_CONTINUE_59:
		add shift_array_left_wrap_iq, 1
		jmp FOR_57
	ENDFOR_58:
		cmp 528, 0
		jl IDX_OOB_63
		cmp 528, 528
		jg IDX_OOB_63
		jmp IDX_OK_62
	IDX_OOB_63:
		exit 1
	IDX_OK_62:
		mov rdx, 528
		store shift_array_left_wrap_first, blocks, rdx, 8
	PROC_END_shift_array_left_wrap:
		ret
	function PROC_render:
		invoke set_render_target, renderer, target_id
		mov render_iy, 0
	FOR_64:
		cmp render_iy, 21
		jg ENDFOR_65
		mov render_ix, 0
	FOR_67:
		cmp render_ix, 20
		jg ENDFOR_68
		mov rbx, render_ix
		mov rcx, render_iy
		push render_ix
		push render_iy
		push render_block
		call FUNC_indexAt
		pop render_block
		pop render_iy
		pop render_ix
		mov rbx, rax
		mov rcx, rbx
		load rdx, blocks, rcx, 8
		mov render_block, rdx
		push rbx
		push rdx
		mov rbx, render_block
		push render_ix
		push render_iy
		push render_block
		call PROC_setcolor
		pop render_block
		pop render_iy
		pop render_ix
		pop rdx
		pop rbx
		mov rcx, 0
		load rsi, color, rcx, 8
		mov rcx, 1
		load rdi, color, rcx, 8
		mov rcx, 2
		load r8, color, rcx, 8
		mov rcx, 255
		invoke set_draw_color, renderer, rsi, rdi, r8, rcx
		mov rcx, render_ix
		mul rcx, 32
		mov rsi, render_iy
		mul rsi, 16
		mov rdi, 32
		mov r8, 16
		invoke fill_rect, renderer, rcx, rsi, rdi, r8
	FOR_CONTINUE_69:
		add render_ix, 1
		jmp FOR_67
	ENDFOR_68:
	FOR_CONTINUE_66:
		add render_iy, 1
		jmp FOR_64
	ENDFOR_65:
		invoke rand
		return rcx
		mov rsi, rcx
		mod rsi, 255
		invoke rand
		return rdi
		mov r8, rdi
		mod r8, 255
		invoke rand
		return r9
		mod r9, 255
		mov r10, 15
		mov r11, 15
		mov r12, 255
		invoke draw_text, renderer, font_id, str_2, r10, r11, rsi, r8, r9, r12
		push rbx
		push rcx
		push rdx
		push rdi
		push render_ix
		push render_iy
		push render_block
		call PROC_shift_array_left_wrap
		pop render_block
		pop render_iy
		pop render_ix
		pop rdi
		pop rdx
		pop rcx
		pop rbx
	PROC_END_render:
		ret
	function PROC_init_array:
		mov init_array_index, 0
	FOR_70:
		cmp init_array_index, 527
		jg ENDFOR_71
		invoke rand
		return rbx
		mov rcx, rbx
		mod rcx, 4
		cmp init_array_index, 0
		jl IDX_OOB_74
		cmp init_array_index, 528
		jg IDX_OOB_74
		jmp IDX_OK_73
	IDX_OOB_74:
		exit 1
	IDX_OK_73:
		mov rdx, init_array_index
		store rcx, blocks, rdx, 8
	FOR_CONTINUE_72:
		add init_array_index, 1
		jmp FOR_70
	ENDFOR_71:
	PROC_END_init_array:
		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_75
		print fmt_str, str_3
		print newline
		exit 1
	ELSE_75:
		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_79
		print fmt_str, str_4
		print newline
		invoke quit
		exit 1
	ELSE_79:
		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_83
		print fmt_str, str_5
		print newline
		invoke destroy_window, window_id
		invoke quit
		exit 1
	ELSE_83:
		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_87
		print fmt_str, str_6
		print newline
		invoke destroy_window, window_id
		invoke destroy_renderer, renderer
		exit 1
		invoke quit
	ELSE_87:
		invoke get_ticks
		return r9
		invoke srand, r9
		invoke init_text
		return r9
		cmp r9, 1
		je ELSE_91
		print fmt_str, str_7
		print newline
		exit 1
	ELSE_91:
		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_95
		print fmt_str, str_8
		print fmt_str, filename
		print newline
		exit 1
	ELSE_95:
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		push init_title
		push init_x
		push init_y
		push init_w
		push init_h
		push init_result
		call PROC_init_array
		pop init_result
		pop init_h
		pop init_w
		pop init_y
		pop init_x
		pop init_title
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
	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
	function FUNC_indexAt:
		mov indexAt_xval, rbx
		mov indexAt_yval, rcx
		mov __funcret_indexAt, indexAt_yval
		mul __funcret_indexAt, 22
		add __funcret_indexAt, indexAt_xval
	FUNC_END_indexAt:
		mov rax, __funcret_indexAt
		ret
	}
}