program MasterPiece {
	section object {
		BlockTypes, PieceUnit, GridUnit, GameUI
	}
	section module {
 		io,
		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
		string str_1 = "Failed to load textures, exiting."
		string str_2 = "MasterPiece: Goodbye"
		string fmt_str = "%s "
		string newline = "\n"
		int running = 0
		int ev = 0
		int ev_type = 0
		int kc = 0
		int load_result = 0
	}
	section code {
	start:
		call BlockTypes.PROC_UNIT_INIT
		call PieceUnit.PROC_UNIT_INIT
		call GridUnit.PROC_UNIT_INIT
		call GameUI.PROC_UNIT_INIT
		invoke seed_random
		call GameUI.PROC_InitSDL
		call GameUI.FUNC_LoadTextures
		mov rbx, GameUI.rax
		mov load_result, rbx
		cmp load_result, 0
		je ELSE_0
		print fmt_str, str_1
		print newline
		push rbx
		push rcx
		call GameUI.PROC_ShutdownSDL
		pop rcx
		pop rbx
		exit 1
	ELSE_0:
		push rbx
		push rcx
		call GridUnit.PROC_ResetGame
		pop rcx
		pop rbx
		mov running, 1
	WHILE_4:
		cmp running, 1
		jne ENDWHILE_5
		push rbx
		push rcx
		push rdx
		call PROC_HandleInput
		pop rdx
		pop rcx
		pop rbx
		mov rsi, GameUI.current_screen
		cmp rsi, 2
		jne ELSE_8
		mov r8, GameUI.paused
		cmp r8, 0
		jne ELSE_8
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call GridUnit.PROC_UpdateGame
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
	ELSE_8:
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call GameUI.PROC_RenderFrame
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		mov r9, 8
		invoke delay, r9
		jmp WHILE_4
	ENDWHILE_5:
		print fmt_str, str_2
		print newline
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call GameUI.PROC_ShutdownSDL
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		done
	function PROC_HandleIntroInput:
		cmp ev_type, 768
		jne ELSE_16
		invoke get_key_code
		return rcx
		mov kc, rcx
		cmp kc, 13
		jne ELSE_20
		mov GameUI.current_screen, 1
		jmp ENDIF_21
	ELSE_20:
		cmp kc, 27
		jne ELSE_24
		mov GameUI.current_screen, 1
	ELSE_24:
	ENDIF_21:
	ELSE_16:
	PROC_END_HandleIntroInput:
		ret
	function PROC_HandleStartInput:
		cmp ev_type, 768
		jne ELSE_28
		invoke get_key_code
		return rcx
		mov kc, rcx
		cmp kc, 1073741906
		jne ELSE_32
		mov rsi, GameUI.cursor_pos
		cmp rsi, 0
		jle ELSE_36
		mov r8, GameUI.cursor_pos
		mov r9, r8
		sub r9, 1
		mov GameUI.cursor_pos, r9
	ELSE_36:
		jmp ENDIF_33
	ELSE_32:
		cmp kc, 1073741905
		jne ELSE_40
		mov r9, GameUI.cursor_pos
		cmp r9, 3
		jge ELSE_44
		mov r9, GameUI.cursor_pos
		add r9, 1
		mov GameUI.cursor_pos, r9
	ELSE_44:
		jmp ENDIF_41
	ELSE_40:
		cmp kc, 13
		jne ELSE_48
		cmp GameUI.cursor_pos, 0
		jne ELSE_52
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call GridUnit.PROC_ResetGame
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		mov GameUI.current_screen, 2
		jmp ENDIF_53
	ELSE_52:
		cmp GameUI.cursor_pos, 1
		jne ELSE_56
		mov GameUI.current_screen, 3
		jmp ENDIF_57
	ELSE_56:
		cmp GameUI.cursor_pos, 2
		jne ELSE_60
		mov GameUI.current_screen, 4
		jmp ENDIF_61
	ELSE_60:
		cmp GameUI.cursor_pos, 3
		jne ELSE_64
		mov running, 0
	ELSE_64:
	ENDIF_61:
	ENDIF_57:
	ENDIF_53:
		jmp ENDIF_49
	ELSE_48:
		cmp kc, 27
		jne ELSE_68
		mov running, 0
	ELSE_68:
	ENDIF_49:
	ENDIF_41:
	ENDIF_33:
	ELSE_28:
	PROC_END_HandleStartInput:
		ret
	function PROC_HandleGameInput:
		cmp ev_type, 768
		jne ELSE_72
		invoke get_key_code
		return rcx
		mov kc, rcx
		cmp kc, 27
		jne ELSE_76
		mov GameUI.current_screen, 1
		jmp ENDIF_77
	ELSE_76:
		cmp kc, 112
		je OR_ONE_86
		cmp kc, 80
		jne ELSE_80
	OR_ONE_86:
		mov r9, GameUI.paused
		mov r10, 1
		sub r10, r9
		mov GameUI.paused, r10
		jmp ENDIF_81
	ELSE_80:
		cmp GameUI.paused, 0
		jne ELSE_88
		cmp GridUnit.game_over, 1
		jne ELSE_92
		cmp kc, 13
		jne ELSE_96
		mov GameUI.current_screen, 5
	ELSE_96:
		jmp ENDIF_93
	ELSE_92:
		cmp kc, 1073741904
		jne ELSE_100
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call GridUnit.FUNC_CanMoveLeft
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		cmp GridUnit.rax, 1
		jne ELSE_104
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call PieceUnit.PROC_PieceMoveLeft
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
	ELSE_104:
		jmp ENDIF_101
	ELSE_100:
		cmp kc, 1073741903
		jne ELSE_108
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call GridUnit.FUNC_CanMoveRight
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		cmp GridUnit.rax, 1
		jne ELSE_112
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call PieceUnit.PROC_PieceMoveRight
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
	ELSE_112:
		jmp ENDIF_109
	ELSE_108:
		cmp kc, 1073741905
		jne ELSE_116
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call GridUnit.PROC_DropPiece
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		jmp ENDIF_117
	ELSE_116:
		cmp kc, 1073741906
		je OR_ONE_126
		cmp kc, 115
		je OR_ONE_126
		mov r11, 0
		jmp OR_END_127
	OR_ONE_126:
		mov r11, 1
	OR_END_127:
		cmp kc, 83
		jne ELSE_120
		cmp r11, 0
		jne OR_ONE_130
	OR_ONE_130:
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call PieceUnit.PROC_PieceShiftUp
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		jmp ENDIF_121
	ELSE_120:
		cmp kc, 97
		je OR_ONE_138
		cmp kc, 65
		jne ELSE_132
	OR_ONE_138:
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call PieceUnit.PROC_PieceShiftDown
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		jmp ENDIF_133
	ELSE_132:
		cmp kc, 32
		jne ELSE_140
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call GridUnit.PROC_HardDrop
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		jmp ENDIF_141
	ELSE_140:
		cmp kc, 13
		jne ELSE_144
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call GridUnit.FUNC_CanRotate
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		cmp GridUnit.rax, 1
		jne ELSE_148
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call PieceUnit.PROC_PieceRotate
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
	ELSE_148:
	ELSE_144:
	ENDIF_141:
	ENDIF_133:
	ENDIF_121:
	ENDIF_117:
	ENDIF_109:
	ENDIF_101:
	ENDIF_93:
	ELSE_88:
	ENDIF_81:
	ENDIF_77:
	ELSE_72:
	PROC_END_HandleGameInput:
		ret
	function PROC_HandleOptionsInput:
		cmp ev_type, 768
		jne ELSE_152
		invoke get_key_code
		return rcx
		mov kc, rcx
		cmp kc, 27
		jne ELSE_156
		mov GameUI.current_screen, 1
		jmp ENDIF_157
	ELSE_156:
		cmp kc, 1073741903
		jne ELSE_160
		cmp GameUI.opt_lines, 15
		jge ELSE_164
		mov r9, GameUI.opt_lines
		add r9, 1
		mov GameUI.opt_lines, r9
	ELSE_164:
		jmp ENDIF_161
	ELSE_160:
		cmp kc, 1073741904
		jne ELSE_168
		mov r9, GameUI.opt_lines
		cmp r9, 5
		jle ELSE_172
		mov r9, GameUI.opt_lines
		sub r9, 1
		mov GameUI.opt_lines, r9
	ELSE_172:
		jmp ENDIF_169
	ELSE_168:
		cmp kc, 13
		jne ELSE_176
		mov r9, GameUI.opt_lines
		mov GridUnit.lines_per_speed, r9
		mov GameUI.current_screen, 1
	ELSE_176:
	ENDIF_169:
	ENDIF_161:
	ENDIF_157:
	ELSE_152:
	PROC_END_HandleOptionsInput:
		ret
	function PROC_HandleCreditsInput:
		cmp ev_type, 768
		jne ELSE_180
		invoke get_key_code
		return rcx
		mov kc, rcx
		cmp kc, 27
		jne ELSE_184
		mov GameUI.current_screen, 1
	ELSE_184:
	ELSE_180:
	PROC_END_HandleCreditsInput:
		ret
	function PROC_HandleHighScoresInput:
		cmp ev_type, 768
		jne ELSE_188
		invoke get_key_code
		return rcx
		mov kc, rcx
		cmp kc, 13
		jne ELSE_192
		mov GameUI.current_screen, 1
		jmp ENDIF_193
	ELSE_192:
		cmp kc, 27
		jne ELSE_196
		mov GameUI.current_screen, 1
	ELSE_196:
	ENDIF_193:
	ELSE_188:
	PROC_END_HandleHighScoresInput:
		ret
	function PROC_HandleInput:
		invoke poll_event
		return rbx
		mov ev, rbx
	WHILE_200:
		cmp ev, 0
		je ENDWHILE_201
		invoke get_event_type
		return rdx
		mov ev_type, rdx
		cmp ev_type, 256
		jne ELSE_204
		mov running, 0
		jmp PROC_END_HandleInput
	ELSE_204:
		mov rdi, GameUI.current_screen
		cmp rdi, 0
		jne ELSE_208
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call PROC_HandleIntroInput
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		jmp ENDIF_209
	ELSE_208:
		mov r9, GameUI.current_screen
		cmp r9, 1
		jne ELSE_212
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call PROC_HandleStartInput
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		jmp ENDIF_213
	ELSE_212:
		mov r9, GameUI.current_screen
		cmp r9, 2
		jne ELSE_216
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call PROC_HandleGameInput
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		jmp ENDIF_217
	ELSE_216:
		mov r9, GameUI.current_screen
		cmp r9, 3
		jne ELSE_220
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call PROC_HandleOptionsInput
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		jmp ENDIF_221
	ELSE_220:
		mov r9, GameUI.current_screen
		cmp r9, 4
		jne ELSE_224
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call PROC_HandleCreditsInput
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
		jmp ENDIF_225
	ELSE_224:
		mov r9, GameUI.current_screen
		cmp r9, 5
		jne ELSE_228
		push rbx
		push rcx
		push rdx
		push rsi
		push rdi
		push r8
		call PROC_HandleHighScoresInput
		pop r8
		pop rdi
		pop rsi
		pop rdx
		pop rcx
		pop rbx
	ELSE_228:
	ENDIF_225:
	ENDIF_221:
	ENDIF_217:
	ENDIF_213:
	ENDIF_209:
		invoke poll_event
		return r9
		mov ev, r9
		jmp WHILE_200
	ENDWHILE_201:
	PROC_END_HandleInput:
		ret
	}
}