program CardGame {
section module {
io,
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 _tmpptr2 = null
ptr arg0 = null
string str_0 = "Intuition Builder"
string str_1 = "font.ttf"
string str_2 = "Game Over Your Score: "
string str_3 = "/"
string str_4 = " - [Press Enter for New Game]"
string str_5 = "Guess 1-3 by pressing 1-3 keys "
string str_6 = "Correct! Your Mental Intuition was correct."
string str_7 = "Incorrect! Your Mental Intuition was incorrect."
string str_8 = ""
string str_9 = "failed to init SDL"
string str_10 = "Could not create window"
string str_11 = "could not create renderer"
string str_12 = "could not create render target"
string str_13 = "Font subsystem failed to load"
string str_14 = "failed to open: "
string str_15 = "cardback.bmp"
string str_16 = "card1.bmp"
string str_17 = "card2.bmp"
string str_18 = "card3.bmp"
string str_19 = "failed to load card textures"
string str_20 = "You either have bad luck or things just are not going your way to score zero."
string str_21 = "You are an average player with little psychic abilities."
string str_22 = "You are above average with some mild psychic abilities."
string str_23 = "You are experienced and know what you are doing."
string str_24 = "You are Psychic."
string fmt_str = "%s "
string newline = "\n"
ptr title = null
ptr fontfile = 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 deck = null
int deck_index = 0
int game_over = 0
int next_input = 0
int correct = 0
int draw_card = 0
ptr game_string = null
ptr psychic_string = null
int card_back = 0
int card1 = 0
int card2 = 0
int card3 = 0
int delay_timer = 0
int delay_active = 0
int init_deck_i = 0
int handle_guess_guess = 0
int handle_guess_card = 0
int handle_key_k = 0
int draw_background_row = 0
int draw_background_col = 0
int render_i = 0
int render_x_pos = 0
int render_card_tex = 0
int render_card_w = 0
int render_card_h = 0
int setup_result = 0
int __funcret_setup = 0
int __funcret_cur_card = 0
ptr __funcret_gen_rating = null
}
section code {
start:
mov title, str_0
mov fontfile, str_1
alloc deck, 8, 10
call PROC_setup
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
jmp ENDIF_17
ELSE_16:
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
mov rbx, key
call PROC_handle_key
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
ENDIF_17:
ELSE_12:
jmp WHILE_4
ENDWHILE_5:
cmp delay_active, 1
jne ELSE_20
invoke get_ticks
return r9
sub r9, delay_timer
cmp r9, 3000
jl ELSE_24
mov delay_active, 0
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
call PROC_advance_card
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
ELSE_24:
ELSE_20:
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 deck
done
function PROC_init_deck:
mov init_deck_i, 0
FOR_28:
cmp init_deck_i, 9
jg ENDFOR_29
invoke rand
return rbx
mov rcx, rbx
mod rcx, 3
mov rdx, rcx
add rdx, 1
cmp init_deck_i, 0
jl IDX_OOB_32
cmp init_deck_i, 9
jg IDX_OOB_32
jmp IDX_OK_31
IDX_OOB_32:
exit 1
IDX_OK_31:
mov rsi, init_deck_i
store rdx, deck, rsi, 8
FOR_CONTINUE_30:
add init_deck_i, 1
jmp FOR_28
ENDFOR_29:
mov deck_index, 0
PROC_END_init_deck:
ret
function PROC_advance_card:
mov draw_card, 0
mov next_input, 1
mov rbx, deck_index
add rbx, 1
mov deck_index, rbx
cmp deck_index, 9
jle ELSE_33
invoke inttostr, correct
return _tmpptr0
invoke strlen, str_2
return rdx
invoke strlen, _tmpptr0
return rsi
mov rdi, rdx
add rdi, rsi
add rdi, 1
alloc _tmpptr1, 1, rdi
invoke strncpy, _tmpptr1, str_2, rdx
invoke strncat, _tmpptr1, _tmpptr0, rsi
invoke strlen, _tmpptr1
return rdx
invoke strlen, str_3
return rsi
mov rdi, rdx
add rdi, rsi
add rdi, 1
alloc _tmpptr0, 1, rdi
invoke strncpy, _tmpptr0, _tmpptr1, rdx
invoke strncat, _tmpptr0, str_3, rsi
mov rdx, 10
invoke inttostr, rdx
return _tmpptr1
invoke strlen, _tmpptr0
return rdx
invoke strlen, _tmpptr1
return rsi
mov rdi, rdx
add rdi, rsi
add rdi, 1
alloc _tmpptr2, 1, rdi
invoke strncpy, _tmpptr2, _tmpptr0, rdx
invoke strncat, _tmpptr2, _tmpptr1, rsi
invoke strlen, _tmpptr2
return rdx
invoke strlen, str_4
return rsi
mov rdi, rdx
add rdi, rsi
add rdi, 1
alloc _tmpptr0, 1, rdi
invoke strncpy, _tmpptr0, _tmpptr2, rdx
invoke strncat, _tmpptr0, str_4, rsi
mov game_string, _tmpptr0
free _tmpptr1
free _tmpptr2
mov game_over, 1
push rbx
push rcx
call FUNC_gen_rating
pop rcx
pop rbx
mov _tmpptr0, arg0
mov psychic_string, _tmpptr0
jmp ENDIF_34
ELSE_33:
mov rdx, deck_index
add rdx, 1
invoke inttostr, rdx
return _tmpptr0
invoke strlen, str_5
return rsi
invoke strlen, _tmpptr0
return rdi
mov r8, rsi
add r8, rdi
add r8, 1
alloc _tmpptr1, 1, r8
invoke strncpy, _tmpptr1, str_5, rsi
invoke strncat, _tmpptr1, _tmpptr0, rdi
invoke strlen, _tmpptr1
return rsi
invoke strlen, str_3
return rdi
mov r8, rsi
add r8, rdi
add r8, 1
alloc _tmpptr0, 1, r8
invoke strncpy, _tmpptr0, _tmpptr1, rsi
invoke strncat, _tmpptr0, str_3, rdi
mov rsi, 10
invoke inttostr, rsi
return _tmpptr1
invoke strlen, _tmpptr0
return rsi
invoke strlen, _tmpptr1
return rdi
mov r8, rsi
add r8, rdi
add r8, 1
alloc _tmpptr2, 1, r8
invoke strncpy, _tmpptr2, _tmpptr0, rsi
invoke strncat, _tmpptr2, _tmpptr1, rdi
mov game_string, _tmpptr2
ENDIF_34:
free _tmpptr1
PROC_END_advance_card:
ret
function PROC_handle_guess:
mov handle_guess_guess, rbx
push handle_guess_guess
push handle_guess_card
call FUNC_cur_card
pop handle_guess_card
pop handle_guess_guess
mov rbx, rax
mov handle_guess_card, rbx
cmp handle_guess_card, handle_guess_guess
jne ELSE_37
add correct, 1
mov game_string, str_6
jmp ENDIF_38
ELSE_37:
mov game_string, str_7
ENDIF_38:
mov draw_card, handle_guess_card
mov next_input, 0
mov delay_active, 1
invoke get_ticks
return rsi
mov delay_timer, rsi
PROC_END_handle_guess:
ret
function PROC_handle_key:
mov handle_key_k, rbx
cmp next_input, 0
jne ELSE_41
jmp PROC_END_handle_key
ELSE_41:
cmp game_over, 1
jne ELSE_45
cmp handle_key_k, 13
jne ELSE_49
mov game_over, 0
push rbx
push rcx
push rdx
push handle_key_k
call PROC_init_deck
pop handle_key_k
pop rdx
pop rcx
pop rbx
mov correct, 0
mov draw_card, 0
mov psychic_string, str_8
mov rsi, deck_index
add rsi, 1
invoke inttostr, rsi
return _tmpptr0
invoke strlen, str_5
return rdi
invoke strlen, _tmpptr0
return r8
mov r9, rdi
add r9, r8
add r9, 1
alloc _tmpptr1, 1, r9
invoke strncpy, _tmpptr1, str_5, rdi
invoke strncat, _tmpptr1, _tmpptr0, r8
invoke strlen, _tmpptr1
return rdi
invoke strlen, str_3
return r8
mov r9, rdi
add r9, r8
add r9, 1
alloc _tmpptr0, 1, r9
invoke strncpy, _tmpptr0, _tmpptr1, rdi
invoke strncat, _tmpptr0, str_3, r8
mov rdi, 10
invoke inttostr, rdi
return _tmpptr1
invoke strlen, _tmpptr0
return rdi
invoke strlen, _tmpptr1
return r8
mov r9, rdi
add r9, r8
add r9, 1
alloc _tmpptr2, 1, r9
invoke strncpy, _tmpptr2, _tmpptr0, rdi
invoke strncat, _tmpptr2, _tmpptr1, r8
mov game_string, _tmpptr2
free _tmpptr1
free _tmpptr0
ELSE_49:
jmp ENDIF_46
ELSE_45:
cmp handle_key_k, 49
jne ELSE_53
push rbx
push rcx
push rdx
push rsi
push rdi
mov rbx, 1
push handle_key_k
call PROC_handle_guess
pop handle_key_k
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
jmp ENDIF_54
ELSE_53:
cmp handle_key_k, 50
jne ELSE_57
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
mov rbx, 2
push handle_key_k
call PROC_handle_guess
pop handle_key_k
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
jmp ENDIF_58
ELSE_57:
cmp handle_key_k, 51
jne ELSE_61
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
mov rbx, 3
push handle_key_k
call PROC_handle_guess
pop handle_key_k
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
ELSE_61:
ENDIF_58:
ENDIF_54:
ENDIF_46:
PROC_END_handle_key:
ret
function PROC_draw_background:
mov rbx, 20
mov rcx, 70
mov rdx, 35
mov rsi, 255
invoke set_draw_color, renderer, rbx, rcx, rdx, rsi
mov rbx, 0
mov rcx, 0
mov rdx, 1280
mov rsi, 720
invoke fill_rect, renderer, rbx, rcx, rdx, rsi
mov rbx, 25
mov rcx, 80
mov rdx, 40
mov rsi, 255
invoke set_draw_color, renderer, rbx, rcx, rdx, rsi
mov draw_background_row, 0
WHILE_65:
cmp draw_background_row, 720
jge ENDWHILE_66
mov draw_background_col, 0
mov rcx, draw_background_row
mod rcx, 64
cmp rcx, 32
jne ELSE_69
mov draw_background_col, 32
ELSE_69:
WHILE_73:
cmp draw_background_col, 1280
jge ENDWHILE_74
mov rdi, 30
mov r8, 30
invoke fill_rect, renderer, draw_background_col, draw_background_row, rdi, r8
add draw_background_col, 64
jmp WHILE_73
ENDWHILE_74:
add draw_background_row, 32
jmp WHILE_65
ENDWHILE_66:
mov r9, 40
mov r10, 25
mov r11, 15
mov r12, 255
invoke set_draw_color, renderer, r9, r10, r11, r12
mov r9, 0
mov r10, 0
mov r11, 1280
mov r12, 55
invoke fill_rect, renderer, r9, r10, r11, r12
mov r9, 40
mov r10, 25
mov r11, 15
mov r12, 255
invoke set_draw_color, renderer, r9, r10, r11, r12
mov r9, 0
mov r10, 690
mov r11, 1280
mov r12, 30
invoke fill_rect, renderer, r9, r10, r11, r12
mov r9, 180
mov r10, 140
mov r11, 60
mov r12, 255
invoke set_draw_color, renderer, r9, r10, r11, r12
mov r9, 0
mov r10, 55
mov r11, 1280
mov r12, 2
invoke fill_rect, renderer, r9, r10, r11, r12
mov r9, 0
mov r10, 690
mov r11, 1280
mov r12, 2
invoke fill_rect, renderer, r9, r10, r11, r12
PROC_END_draw_background:
ret
function PROC_render:
mov render_card_w, 160
mov render_card_h, 240
invoke set_render_target, renderer, target_id
push render_i
push render_x_pos
push render_card_tex
push render_card_w
push render_card_h
call PROC_draw_background
pop render_card_h
pop render_card_w
pop render_card_tex
pop render_x_pos
pop render_i
mov rbx, 25
mov rcx, 15
mov rdx, 220
mov rsi, 190
mov rdi, 120
mov r8, 255
invoke draw_text, renderer, font_id, str_0, rbx, rcx, rdx, rsi, rdi, r8
mov rbx, 280
mov rcx, 15
mov rdx, 255
mov rsi, 255
mov rdi, 255
mov r8, 255
invoke draw_text, renderer, font_id, game_string, rbx, rcx, rdx, rsi, rdi, r8
mov render_x_pos, 80
mov rbx, 10
sub rbx, deck_index
mov rcx, rbx
sub rcx, 1
mov render_i, 0
FOR_77:
cmp render_i, rcx
jg ENDFOR_78
mov rdx, 0
sub rdx, 1
mov rsi, 0
sub rsi, 1
mov rdi, 0
sub rdi, 1
mov r8, 0
sub r8, 1
mov r9, 100
invoke render_texture, renderer, card_back, rdx, rsi, rdi, r8, render_x_pos, r9, render_card_w, render_card_h
add render_x_pos, 18
FOR_CONTINUE_79:
add render_i, 1
jmp FOR_77
ENDFOR_78:
cmp draw_card, 0
je ELSE_80
cmp draw_card, 1
jne ELSE_84
mov render_card_tex, card1
jmp ENDIF_85
ELSE_84:
cmp draw_card, 2
jne ELSE_88
mov render_card_tex, card2
jmp ENDIF_89
ELSE_88:
mov render_card_tex, card3
ENDIF_89:
ENDIF_85:
mov r9, 0
sub r9, 1
mov r10, 0
sub r10, 1
mov r11, 0
sub r11, 1
mov r12, 0
sub r12, 1
mov r13, 800
mov r14, 100
invoke render_texture, renderer, render_card_tex, r9, r10, r11, r12, r13, r14, render_card_w, render_card_h
ELSE_80:
cmp game_over, 1
jne ELSE_92
mov r9, 0
mov r10, 0
mov r11, 0
mov r12, 160
invoke set_draw_color, renderer, r9, r10, r11, r12
mov r9, 100
mov r10, 400
mov r11, 1080
mov r12, 60
invoke fill_rect, renderer, r9, r10, r11, r12
mov r9, 130
mov r10, 415
mov r11, 255
mov r12, 80
mov r13, 80
mov r14, 255
invoke draw_text, renderer, font_id, psychic_string, r9, r10, r11, r12, r13, r14
ELSE_92:
PROC_END_render:
ret
function PROC_setup:
invoke init
return rbx
mov __funcret_setup, rbx
cmp __funcret_setup, 0
je ELSE_96
print fmt_str, str_9
print newline
exit 1
ELSE_96:
mov rsi, 100
mov rdi, 100
mov r8, 1280
mov r9, 720
mov r10, 4
invoke create_window, title, rsi, rdi, r8, r9, r10
return rdx
mov window_id, rdx
mov rsi, 0
sub rsi, 1
cmp window_id, rsi
jne ELSE_100
print fmt_str, str_10
print newline
invoke quit
exit 1
ELSE_100:
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_104
print fmt_str, str_11
print newline
invoke destroy_window, window_id
invoke quit
exit 1
ELSE_104:
mov r10, 1280
mov r11, 720
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_108
print fmt_str, str_12
print newline
invoke destroy_renderer, renderer
invoke destroy_window, window_id
invoke quit
exit 1
ELSE_108:
invoke init_text
return r9
cmp r9, 1
je ELSE_112
print fmt_str, str_13
print newline
exit 1
ELSE_112:
mov r10, 24
invoke load_font, fontfile, r10
return r9
mov font_id, r9
mov r9, 0
sub r9, 1
cmp font_id, r9
jne ELSE_116
print fmt_str, str_14
print fmt_str, fontfile
print newline
exit 1
ELSE_116:
invoke load_texture, renderer, str_15
return r9
mov card_back, r9
invoke load_texture, renderer, str_16
return r9
mov card1, r9
invoke load_texture, renderer, str_17
return r9
mov card2, r9
invoke load_texture, renderer, str_18
return r9
mov card3, r9
mov r9, 0
sub r9, 1
cmp card_back, r9
je OR_ONE_126
mov r9, 0
sub r9, 1
cmp card1, r9
je OR_ONE_126
mov r9, 0
jmp OR_END_127
OR_ONE_126:
mov r9, 1
OR_END_127:
mov r10, 0
sub r10, 1
cmp card2, r10
je OR_ONE_130
cmp r9, 0
jne OR_ONE_130
mov r10, 0
jmp OR_END_131
OR_ONE_130:
mov r10, 1
OR_END_131:
mov r9, 0
sub r9, 1
cmp card3, r9
jne ELSE_120
cmp r10, 0
jne OR_ONE_134
OR_ONE_134:
print fmt_str, str_19
print newline
exit 1
ELSE_120:
invoke seed_random
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
push setup_result
call PROC_init_deck
pop setup_result
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
mov correct, 0
mov draw_card, 0
mov next_input, 1
mov game_over, 0
mov delay_active, 0
mov psychic_string, str_8
mov r9, deck_index
add r9, 1
invoke inttostr, r9
return _tmpptr0
invoke strlen, str_5
return r9
invoke strlen, _tmpptr0
return r10
mov r11, r9
add r11, r10
add r11, 1
alloc _tmpptr1, 1, r11
invoke strncpy, _tmpptr1, str_5, r9
invoke strncat, _tmpptr1, _tmpptr0, r10
invoke strlen, _tmpptr1
return r9
invoke strlen, str_3
return r10
mov r11, r9
add r11, r10
add r11, 1
alloc _tmpptr0, 1, r11
invoke strncpy, _tmpptr0, _tmpptr1, r9
invoke strncat, _tmpptr0, str_3, r10
mov r9, 10
invoke inttostr, r9
return _tmpptr1
invoke strlen, _tmpptr0
return r9
invoke strlen, _tmpptr1
return r10
mov r11, r9
add r11, r10
add r11, 1
alloc _tmpptr2, 1, r11
invoke strncpy, _tmpptr2, _tmpptr0, r9
invoke strncat, _tmpptr2, _tmpptr1, r10
mov game_string, _tmpptr2
free _tmpptr1
free _tmpptr0
PROC_END_setup:
ret
function PROC_cleanup:
invoke destroy_texture, card_back
invoke destroy_texture, card1
invoke destroy_texture, card2
invoke destroy_texture, card3
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_cur_card:
cmp deck_index, 10
jge ELSE_136
mov rcx, deck_index
load rdx, deck, rcx, 8
mov __funcret_cur_card, rdx
jmp ENDIF_137
ELSE_136:
mov __funcret_cur_card, 0
ENDIF_137:
FUNC_END_cur_card:
mov rax, __funcret_cur_card
ret
function FUNC_gen_rating:
cmp correct, 0
jne ELSE_140
mov __funcret_gen_rating, str_20
jmp ENDIF_141
ELSE_140:
cmp correct, 3
jg ELSE_144
mov __funcret_gen_rating, str_21
jmp ENDIF_145
ELSE_144:
cmp correct, 6
jg ELSE_148
mov __funcret_gen_rating, str_22
jmp ENDIF_149
ELSE_148:
cmp correct, 8
jg ELSE_152
mov __funcret_gen_rating, str_23
jmp ENDIF_153
ELSE_152:
mov __funcret_gen_rating, str_24
ENDIF_153:
ENDIF_149:
ENDIF_145:
ENDIF_141:
FUNC_END_gen_rating:
mov arg0, __funcret_gen_rating
ret
}
}