program Pong {
	section module {
 		sdl,
		std,
		string
	}
	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
		int r13 = 0
		int r14 = 0
		ptr _tmpptr0 = null
		ptr _tmpptr1 = null
		ptr arg0 = null
		string str_0 = "Pong"
		string str_1 = "font.ttf"
		string str_2 = "Score: "
		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
		int key = 0
		ptr paddle1 = null
		ptr paddle2 = null
		ptr ball = null
		int ball_dx = 0
		int ball_dy = 0
		int score_l = 0
		int score_r = 0
		int draw_box_px = 0
		int draw_box_py = 0
		int draw_box_pw = 0
		int draw_box_ph = 0
		int reset_ball_to_right = 0
		ptr clamp_paddle_p = null
		int update_ai_center_ball = 0
		int update_ai_center_p2 = 0
		int render_center_line_yy = 0
		ptr init_title = null
		int init_xval = 0
		int init_yval = 0
		int init_wval = 0
		int init_hval = 0
		int init_result = 0
		int __funcret_init = 0
		int aabb_ax = 0
		int aabb_ay = 0
		int aabb_aw = 0
		int aabb_ah = 0
		int aabb_bx = 0
		int aabb_by = 0
		int aabb_bw = 0
		int aabb_bh = 0
		int __funcret_aabb = 0
	}
	section code {
	start:
		mov title, str_0
		mov filename, str_1
		alloc paddle1, 16, 1
		alloc paddle2, 16, 1
		alloc ball, 16, 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
		mov key, r9
		cmp key, 27
		jne ELSE_16
		mov running, 0
	ELSE_16:
	ELSE_12:
		jmp WHILE_4
	ENDWHILE_5:
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call PROC_update_input
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call PROC_update_ai
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call PROC_update_ball
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		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
		mov r9, 16
		invoke delay, r9
		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 paddle1
		free paddle2
		free ball
		done
	function PROC_draw_box:
		mov draw_box_px, rbx
		mov draw_box_py, rcx
		mov draw_box_pw, rdx
		mov draw_box_ph, rsi
		invoke fill_rect, renderer, draw_box_px, draw_box_py, draw_box_pw, draw_box_ph
	PROC_END_draw_box:
		ret
	function PROC_reset_ball:
		mov reset_ball_to_right, rbx
		store 317, ball, 0, 1
		store 177, ball, 8, 1
		cmp reset_ball_to_right, 1
		jne ELSE_20
		mov ball_dx, 4
		jmp ENDIF_21
	ELSE_20:
		mov ball_dx, 0
		sub ball_dx, 4
	ENDIF_21:
		invoke get_ticks
		return rdx
		mov rsi, rdx
		mod rsi, 2
		cmp rsi, 0
		jne ELSE_24
		mov ball_dy, 4
		jmp ENDIF_25
	ELSE_24:
		mov ball_dy, 0
		sub ball_dy, 4
	ENDIF_25:
	PROC_END_reset_ball:
		ret
	function PROC_clamp_paddle:
		mov clamp_paddle_p, arg0
		load rbx, clamp_paddle_p, 8, 1
		cmp rbx, 0
		jge ELSE_28
		store 0, clamp_paddle_p, 8, 1
	ELSE_28:
		load rdx, clamp_paddle_p, 8, 1
		mov rsi, rdx
		add rsi, 56
		cmp rsi, 360
		jle ELSE_32
		store 304, clamp_paddle_p, 8, 1
	ELSE_32:
	PROC_END_clamp_paddle:
		ret
	function PROC_update_input:
		mov rcx, 82
		invoke is_key_pressed, rcx
		return rbx
		cmp rbx, 0
		je ELSE_36
		load rdx, paddle1, 8, 1
		mov rsi, rdx
		sub rsi, 4
		store rsi, paddle1, 8, 1
	ELSE_36:
		mov r8, 81
		invoke is_key_pressed, r8
		return rdi
		cmp rdi, 0
		je ELSE_40
		load r9, paddle1, 8, 1
		add r9, 4
		store r9, paddle1, 8, 1
	ELSE_40:
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		mov arg0, paddle1
		call PROC_clamp_paddle
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
	PROC_END_update_input:
		ret
	function PROC_update_ai:
		load rbx, ball, 8, 1
		mov rcx, rbx
		add rcx, 3
		mov update_ai_center_ball, rcx
		load rdx, paddle2, 8, 1
		mov rsi, rdx
		add rsi, 28
		mov update_ai_center_p2, rsi
		mov rdi, update_ai_center_p2
		sub rdi, 4
		cmp update_ai_center_ball, rdi
		jge ELSE_44
		load r9, paddle2, 8, 1
		sub r9, 4
		store r9, paddle2, 8, 1
		jmp ENDIF_45
	ELSE_44:
		mov r9, update_ai_center_p2
		add r9, 4
		cmp update_ai_center_ball, r9
		jle ELSE_48
		load r9, paddle2, 8, 1
		add r9, 4
		store r9, paddle2, 8, 1
	ELSE_48:
	ENDIF_45:
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		mov arg0, paddle2
		push update_ai_center_ball
		push update_ai_center_p2
		call PROC_clamp_paddle
		pop update_ai_center_p2
		pop update_ai_center_ball
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
	PROC_END_update_ai:
		ret
	function PROC_update_ball:
		load rbx, ball, 0, 1
		mov rcx, rbx
		add rcx, ball_dx
		store rcx, ball, 0, 1
		load rdx, ball, 8, 1
		mov rsi, rdx
		add rsi, ball_dy
		store rsi, ball, 8, 1
		load rdi, ball, 8, 1
		cmp rdi, 0
		jg ELSE_52
		store 0, ball, 8, 1
		mov r9, 0
		sub r9, ball_dy
		mov ball_dy, r9
	ELSE_52:
		load r9, ball, 8, 1
		add r9, 6
		cmp r9, 360
		jl ELSE_56
		store 354, ball, 8, 1
		mov r9, 0
		sub r9, ball_dy
		mov ball_dy, r9
	ELSE_56:
		load r9, ball, 0, 1
		load r10, ball, 8, 1
		load r11, paddle1, 0, 1
		load r12, paddle1, 8, 1
		mov r13, r9
		mov r14, r10
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		push r9
		push r10
		mov rbx, r13
		mov rcx, r14
		mov rdx, 6
		mov rsi, 6
		mov rdi, r11
		mov r8, r12
		mov r9, 6
		mov r10, 56
		call FUNC_aabb
		pop r10
		pop r9
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		cmp rax, 0
		je ELSE_60
		load r11, paddle1, 0, 1
		add r11, 6
		store r11, ball, 0, 1
		mov r11, 0
		sub r11, ball_dx
		mov ball_dx, r11
	ELSE_60:
		load r11, ball, 0, 1
		load r12, ball, 8, 1
		load r13, paddle2, 0, 1
		load r14, paddle2, 8, 1
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		push r9
		push r10
		mov rbx, r11
		mov rcx, r12
		mov rdx, 6
		mov rsi, 6
		mov rdi, r13
		mov r8, r14
		mov r9, 6
		mov r10, 56
		call FUNC_aabb
		pop r10
		pop r9
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		cmp rax, 0
		je ELSE_62
		load r11, paddle2, 0, 1
		sub r11, 6
		store r11, ball, 0, 1
		mov r11, 0
		sub r11, ball_dx
		mov ball_dx, r11
	ELSE_62:
		load r11, ball, 0, 1
		add r11, 6
		cmp r11, 0
		jge ELSE_64
		mov r11, score_r
		add r11, 1
		mov score_r, r11
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		push r9
		push r10
		mov rbx, 1
		call PROC_reset_ball
		pop r10
		pop r9
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
	ELSE_64:
		load r11, ball, 0, 1
		cmp r11, 640
		jle ELSE_68
		add score_l, 1
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		push r9
		push r10
		mov rbx, 0
		call PROC_reset_ball
		pop r10
		pop r9
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
	ELSE_68:
	PROC_END_update_ball:
		ret
	function PROC_render_center_line:
		mov render_center_line_yy, 0
	WHILE_72:
		cmp render_center_line_yy, 360
		jge ENDWHILE_73
		push rbx
		mov rbx, 319
		mov rcx, render_center_line_yy
		mov rdx, 2
		mov rsi, 8
		push render_center_line_yy
		call PROC_draw_box
		pop render_center_line_yy
		pop rbx
		add render_center_line_yy, 16
		jmp WHILE_72
	ENDWHILE_73:
	PROC_END_render_center_line:
		ret
	function PROC_render:
		invoke set_render_target, renderer, target_id
		mov rbx, 0
		mov rcx, 0
		mov rdx, 0
		mov rsi, 255
		invoke set_draw_color, renderer, rbx, rcx, rdx, rsi
		invoke clear, renderer
		mov rbx, 255
		mov rcx, 255
		mov rdx, 255
		mov rsi, 255
		invoke set_draw_color, renderer, rbx, rcx, rdx, rsi
		call PROC_render_center_line
		load rbx, paddle1, 0, 1
		load rcx, paddle1, 8, 1
		mov rdx, 6
		mov rsi, 56
		call PROC_draw_box
		load rdx, paddle2, 0, 1
		load rsi, paddle2, 8, 1
		mov rdi, rdx
		mov r8, rsi
		push rbx
		push rcx
		push rdx
		push rsi
		mov rbx, rdi
		mov rcx, r8
		mov rdx, 6
		mov rsi, 56
		call PROC_draw_box
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		load r9, ball, 0, 1
		load r10, ball, 8, 1
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		mov rbx, r9
		mov rcx, r10
		mov rdx, 6
		mov rsi, 6
		call PROC_draw_box
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		invoke inttostr, score_l
		return _tmpptr0
		invoke strlen, str_2
		return r9
		invoke strlen, _tmpptr0
		return r10
		mov r11, r9
		add r11, r10
		add r11, 1
		alloc _tmpptr1, 1, r11
		invoke strncpy, _tmpptr1, str_2, r9
		invoke strncat, _tmpptr1, _tmpptr0, r10
		mov r9, 220
		mov r10, 8
		mov r11, 255
		mov r12, 255
		mov r13, 255
		mov r14, 255
		invoke draw_text, renderer, font_id, _tmpptr1, r9, r10, r11, r12, r13, r14
		free _tmpptr1
		free _tmpptr0
		invoke inttostr, score_r
		return _tmpptr0
		invoke strlen, str_2
		return r9
		invoke strlen, _tmpptr0
		return r10
		mov r11, r9
		add r11, r10
		add r11, 1
		alloc _tmpptr1, 1, r11
		invoke strncpy, _tmpptr1, str_2, r9
		invoke strncat, _tmpptr1, _tmpptr0, r10
		mov r9, 340
		mov r10, 8
		mov r11, 255
		mov r12, 255
		mov r13, 255
		mov r14, 255
		invoke draw_text, renderer, font_id, _tmpptr1, r9, r10, r11, r12, r13, r14
		free _tmpptr1
		free _tmpptr0
	PROC_END_render:
		ret
	function PROC_init:
		mov init_title, arg0
		mov init_xval, rbx
		mov init_yval, rcx
		mov init_wval, rdx
		mov init_hval, rsi
		invoke init
		return rbx
		mov __funcret_init, rbx
		cmp __funcret_init, 0
		je ELSE_76
		print fmt_str, str_3
		print newline
		exit 1
	ELSE_76:
		mov rsi, 4
		invoke create_window, title, init_xval, init_yval, init_wval, init_hval, rsi
		return rdx
		mov window_id, rdx
		mov rsi, 0
		sub rsi, 1
		cmp window_id, rsi
		jne ELSE_80
		print fmt_str, str_4
		print newline
		invoke quit
		exit 1
	ELSE_80:
		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_84
		print fmt_str, str_5
		print newline
		invoke destroy_window, window_id
		invoke quit
		exit 1
	ELSE_84:
		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_88
		print fmt_str, str_6
		print newline
		invoke destroy_renderer, renderer
		invoke destroy_window, window_id
		invoke quit
		exit 1
	ELSE_88:
		invoke init_text
		return r9
		cmp r9, 1
		je ELSE_92
		print fmt_str, str_7
		print newline
		exit 1
	ELSE_92:
		mov r10, 16
		invoke load_font, filename, r10
		return r9
		mov font_id, r9
		mov r9, 0
		sub r9, 1
		cmp font_id, r9
		jne ELSE_96
		print fmt_str, str_8
		print fmt_str, filename
		print newline
		exit 1
	ELSE_96:
		store 16, paddle1, 0, 1
		store 152, paddle1, 8, 1
		store 618, paddle2, 0, 1
		store 152, paddle2, 8, 1
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		mov rbx, 1
		push init_title
		push init_xval
		push init_yval
		push init_wval
		push init_hval
		push init_result
		call PROC_reset_ball
		pop init_result
		pop init_hval
		pop init_wval
		pop init_yval
		pop init_xval
		pop init_title
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		mov score_l, 0
		mov score_r, 0
	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_aabb:
		mov aabb_ax, rbx
		mov aabb_ay, rcx
		mov aabb_aw, rdx
		mov aabb_ah, rsi
		mov aabb_bx, rdi
		mov aabb_by, r8
		mov aabb_bw, r9
		mov aabb_bh, r10
		mov rbx, aabb_ax
		add rbx, aabb_aw
		cmp rbx, aabb_bx
		jle OR_ONE_104
		mov rdx, aabb_bx
		add rdx, aabb_bw
		cmp rdx, aabb_ax
		jle OR_ONE_104
		mov rdi, 0
		jmp OR_END_105
	OR_ONE_104:
		mov rdi, 1
	OR_END_105:
		mov r8, aabb_ay
		add r8, aabb_ah
		cmp r8, aabb_by
		jle OR_ONE_108
		cmp rdi, 0
		jne OR_ONE_108
		mov r10, 0
		jmp OR_END_109
	OR_ONE_108:
		mov r10, 1
	OR_END_109:
		mov r9, aabb_by
		add r9, aabb_bh
		cmp r9, aabb_ay
		jle OR_ONE_112
		cmp r10, 0
		jne OR_ONE_112
		mov r9, 0
		jmp OR_END_113
	OR_ONE_112:
		mov r9, 1
	OR_END_113:
		not r9
		mov __funcret_aabb, r9
	FUNC_END_aabb:
		mov rax, __funcret_aabb
		ret
	}
}