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
}
}