program KnightsTour {
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
int r15 = 0
int _ir0 = 0
ptr _tmpptr0 = null
ptr _tmpptr1 = null
string str_0 = "Knights Tour"
string str_1 = "data/font.ttf"
string str_2 = "Could not open font.."
string str_3 = "data/knight.bmp"
string str_4 = "Warning: could not load knight.bmp"
string str_5 = "data/logo.bmp"
string str_6 = "Warning: could not load logo.bmp"
string str_7 = "Press any key to start"
string str_8 = "Knights Tour - Tap Space, Press Return to Reset"
string str_9 = "Moves: "
string str_10 = "-[ Tour Complete ]- Press Return to Reset"
string fmt_str = "%s "
string newline = "\n"
int window_id = 0
int renderer_id = 0
int font_id = 0
int knight_tex = 0
int logo_tex = 0
int running = 0
int game_state = 0
ptr board = null
ptr seq_row = null
ptr seq_col = null
int seq_count = 0
int knight_row = 0
int knight_col = 0
int moves = 0
int tour_over = 0
ptr horizontal = null
ptr vertical = null
ptr sort_deg = null
ptr sort_row = null
ptr sort_col = null
int intro_start = 0
int ev_type = 0
int kc = 0
int frame_start = 0
int frame_time = 0
int delay_time = 0
int cur_time = 0
int mouse_btn = 0
int space_was_down = 0
int space_now = 0
int tour_ready = 0
int last_move_time = 0
int clear_board_i = 0
int set_board_row = 0
int set_board_col = 0
int set_board_val = 0
int sort_moves_n = 0
int sort_moves_i = 0
int sort_moves_j = 0
int sort_moves_min_idx = 0
int sort_moves_tmp = 0
int reset_tour_dummy = 0
int next_move_nr = 0
int next_move_nc = 0
int draw_board_i = 0
int draw_board_j = 0
int draw_board_rx = 0
int draw_board_ry = 0
int draw_knight_dx = 0
int draw_knight_dy = 0
int get_board_row = 0
int get_board_col = 0
int __funcret_get_board = 0
int is_valid_move_row = 0
int is_valid_move_col = 0
int __funcret_is_valid_move = 0
int get_degree_row = 0
int get_degree_col = 0
int get_degree_i = 0
int get_degree_nr = 0
int get_degree_nc = 0
int get_degree_count = 0
int __funcret_get_degree = 0
int solve_tour_pos_row = 0
int solve_tour_pos_col = 0
int solve_tour_move_count = 0
int solve_tour_i = 0
int solve_tour_nr = 0
int solve_tour_nc = 0
int solve_tour_n = 0
int __funcret_solve_tour = 0
}
section code {
start:
alloc board, 8, 64
alloc seq_row, 8, 64
alloc seq_col, 8, 64
alloc horizontal, 8, 8
alloc vertical, 8, 8
alloc sort_deg, 8, 8
alloc sort_row, 8, 8
alloc sort_col, 8, 8
invoke init
mov rcx, 100
mov rdx, 100
mov rsi, 960
mov rdi, 720
mov r8, 0
invoke create_window, str_0, rcx, rdx, rsi, rdi, r8
return rbx
mov window_id, rbx
mov rcx, 0
sub rcx, 1
mov rsi, 0
invoke create_renderer, window_id, rcx, rsi
return rdx
mov renderer_id, rdx
invoke init_text
mov rsi, 14
invoke load_font, str_1, rsi
return rcx
mov font_id, rcx
mov rsi, 0
sub rsi, 1
cmp font_id, rsi
jne ELSE_0
print fmt_str, str_2
print newline
ELSE_0:
mov r9, 255
mov r10, 255
mov r11, 255
invoke load_texture_color_key_rgb, renderer_id, str_3, r9, r10, r11
return r8
mov knight_tex, r8
mov r9, 0
sub r9, 1
cmp knight_tex, r9
jne ELSE_4
print fmt_str, str_4
print newline
ELSE_4:
invoke load_texture, renderer_id, str_5
return r9
mov logo_tex, r9
mov r9, 0
sub r9, 1
cmp logo_tex, r9
jne ELSE_8
print fmt_str, str_6
print newline
ELSE_8:
invoke seed_random
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
call PROC_init_move_offsets
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
mov game_state, 0
invoke get_ticks
return r9
mov intro_start, r9
mov running, 1
mov space_was_down, 0
mov tour_ready, 0
mov last_move_time, 0
WHILE_12:
cmp running, 0
je ENDWHILE_13
invoke get_ticks
return r9
mov frame_start, r9
WHILE_14:
invoke poll_event
return r9
cmp r9, 0
je ENDWHILE_15
invoke get_event_type
return r9
mov ev_type, r9
cmp ev_type, 256
jne ELSE_18
mov running, 0
ELSE_18:
cmp ev_type, 768
jne ELSE_22
invoke get_key_code
return r9
mov kc, r9
cmp kc, 27
jne ELSE_26
mov running, 0
jmp ENDIF_27
ELSE_26:
cmp game_state, 0
jne ELSE_30
mov game_state, 1
cmp tour_ready, 0
jne ELSE_34
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
call PROC_reset_tour
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
mov tour_ready, 1
ELSE_34:
jmp ENDIF_31
ELSE_30:
cmp kc, 13
jne ELSE_38
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
call PROC_reset_tour
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
ELSE_38:
ENDIF_31:
ENDIF_27:
ELSE_22:
cmp ev_type, 1025
jne ELSE_42
cmp game_state, 0
jne ELSE_46
mov game_state, 1
cmp tour_ready, 0
jne ELSE_50
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
call PROC_reset_tour
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
mov tour_ready, 1
ELSE_50:
jmp ENDIF_47
ELSE_46:
invoke get_mouse_button
return r9
mov mouse_btn, r9
cmp mouse_btn, 1
jne ELSE_54
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
call PROC_next_move
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
jmp ENDIF_55
ELSE_54:
cmp mouse_btn, 3
jne ELSE_58
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
call PROC_reset_tour
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
ELSE_58:
ENDIF_55:
ENDIF_47:
ELSE_42:
jmp WHILE_14
ENDWHILE_15:
cmp game_state, 1
jne ELSE_62
mov r10, 44
invoke is_key_pressed, r10
return r9
mov space_now, r9
cmp space_now, 0
je ELSE_66
invoke get_ticks
return r9
mov cur_time, r9
cmp space_was_down, 0
je OR_ONE_76
mov r10, cur_time
sub r10, last_move_time
cmp r10, 150
jl ELSE_70
OR_ONE_76:
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
call PROC_next_move
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
mov last_move_time, cur_time
ELSE_70:
ELSE_66:
mov space_was_down, space_now
ELSE_62:
mov r9, 0
mov r10, 0
mov r11, 0
mov r12, 255
invoke set_draw_color, renderer_id, r9, r10, r11, r12
invoke clear, renderer_id
cmp game_state, 0
jne ELSE_78
mov r9, 0
sub r9, 1
cmp logo_tex, r9
je ELSE_82
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, 0
mov r14, 0
mov r15, 960
mov _ir0, 720
invoke render_texture, renderer_id, logo_tex, r9, r10, r11, r12, r13, r14, r15, _ir0
ELSE_82:
mov r9, 380
mov r10, 680
mov r11, 255
mov r12, 255
mov r13, 255
mov r14, 255
invoke draw_text, renderer_id, font_id, str_7, r9, r10, r11, r12, r13, r14
invoke get_ticks
return r9
mov cur_time, r9
sub r9, intro_start
cmp r9, 2000
jl ELSE_86
mov game_state, 1
cmp tour_ready, 0
jne ELSE_90
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
call PROC_reset_tour
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
mov tour_ready, 1
ELSE_90:
ELSE_86:
jmp ENDIF_79
ELSE_78:
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
call PROC_draw_board
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_draw_knight
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
cmp moves, 65
jge ELSE_94
mov r9, 15
mov r10, 5
mov r11, 255
mov r12, 255
mov r13, 255
mov r14, 255
invoke draw_text, renderer_id, font_id, str_8, r9, r10, r11, r12, r13, r14
invoke inttostr, moves
return _tmpptr0
invoke strlen, str_9
return r9
invoke strlen, _tmpptr0
return r10
mov r11, r9
add r11, r10
add r11, 1
alloc _tmpptr1, 1, r11
invoke strncpy, _tmpptr1, str_9, r9
invoke strncat, _tmpptr1, _tmpptr0, r10
mov r9, 400
mov r10, 5
mov r11, 255
mov r12, 255
mov r13, 255
mov r14, 255
invoke draw_text, renderer_id, font_id, _tmpptr1, r9, r10, r11, r12, r13, r14
free _tmpptr1
free _tmpptr0
jmp ENDIF_95
ELSE_94:
mov r9, 15
mov r10, 5
mov r11, 255
mov r12, 255
mov r13, 255
mov r14, 255
invoke draw_text, renderer_id, font_id, str_10, r9, r10, r11, r12, r13, r14
ENDIF_95:
ENDIF_79:
invoke present, renderer_id
invoke get_ticks
return r9
sub r9, frame_start
mov frame_time, r9
mov r9, 16
sub r9, frame_time
mov delay_time, r9
cmp delay_time, 0
jle ELSE_98
invoke delay, delay_time
ELSE_98:
jmp WHILE_12
ENDWHILE_13:
mov r9, 0
sub r9, 1
cmp knight_tex, r9
je ELSE_102
invoke destroy_texture, knight_tex
ELSE_102:
mov r9, 0
sub r9, 1
cmp logo_tex, r9
je ELSE_106
invoke destroy_texture, logo_tex
ELSE_106:
invoke quit_text
invoke destroy_renderer, renderer_id
invoke destroy_window, window_id
invoke quit
free board
free seq_row
free seq_col
free horizontal
free vertical
free sort_deg
free sort_row
free sort_col
done
function PROC_init_move_offsets:
cmp 0, 0
jl IDX_OOB_111
cmp 0, 7
jg IDX_OOB_111
jmp IDX_OK_110
IDX_OOB_111:
exit 1
IDX_OK_110:
mov rbx, 0
store 2, horizontal, rbx, 8
mov rbx, 0
sub rbx, 1
cmp 0, 0
jl IDX_OOB_113
cmp 0, 7
jg IDX_OOB_113
jmp IDX_OK_112
IDX_OOB_113:
exit 1
IDX_OK_112:
mov rcx, 0
store rbx, vertical, rcx, 8
cmp 1, 0
jl IDX_OOB_115
cmp 1, 7
jg IDX_OOB_115
jmp IDX_OK_114
IDX_OOB_115:
exit 1
IDX_OK_114:
mov rcx, 1
store 1, horizontal, rcx, 8
mov rcx, 0
sub rcx, 2
cmp 1, 0
jl IDX_OOB_117
cmp 1, 7
jg IDX_OOB_117
jmp IDX_OK_116
IDX_OOB_117:
exit 1
IDX_OK_116:
mov rdx, 1
store rcx, vertical, rdx, 8
mov rdx, 0
sub rdx, 1
cmp 2, 0
jl IDX_OOB_119
cmp 2, 7
jg IDX_OOB_119
jmp IDX_OK_118
IDX_OOB_119:
exit 1
IDX_OK_118:
mov rsi, 2
store rdx, horizontal, rsi, 8
mov rsi, 0
sub rsi, 2
cmp 2, 0
jl IDX_OOB_121
cmp 2, 7
jg IDX_OOB_121
jmp IDX_OK_120
IDX_OOB_121:
exit 1
IDX_OK_120:
mov rdi, 2
store rsi, vertical, rdi, 8
mov rdi, 0
sub rdi, 2
cmp 3, 0
jl IDX_OOB_123
cmp 3, 7
jg IDX_OOB_123
jmp IDX_OK_122
IDX_OOB_123:
exit 1
IDX_OK_122:
mov r8, 3
store rdi, horizontal, r8, 8
mov r8, 0
sub r8, 1
cmp 3, 0
jl IDX_OOB_125
cmp 3, 7
jg IDX_OOB_125
jmp IDX_OK_124
IDX_OOB_125:
exit 1
IDX_OK_124:
mov r9, 3
store r8, vertical, r9, 8
mov r9, 0
sub r9, 2
cmp 4, 0
jl IDX_OOB_127
cmp 4, 7
jg IDX_OOB_127
jmp IDX_OK_126
IDX_OOB_127:
exit 1
IDX_OK_126:
mov r10, 4
store r9, horizontal, r10, 8
cmp 4, 0
jl IDX_OOB_129
cmp 4, 7
jg IDX_OOB_129
jmp IDX_OK_128
IDX_OOB_129:
exit 1
IDX_OK_128:
mov r9, 4
store 1, vertical, r9, 8
mov r9, 0
sub r9, 1
cmp 5, 0
jl IDX_OOB_131
cmp 5, 7
jg IDX_OOB_131
jmp IDX_OK_130
IDX_OOB_131:
exit 1
IDX_OK_130:
mov r10, 5
store r9, horizontal, r10, 8
cmp 5, 0
jl IDX_OOB_133
cmp 5, 7
jg IDX_OOB_133
jmp IDX_OK_132
IDX_OOB_133:
exit 1
IDX_OK_132:
mov r9, 5
store 2, vertical, r9, 8
cmp 6, 0
jl IDX_OOB_135
cmp 6, 7
jg IDX_OOB_135
jmp IDX_OK_134
IDX_OOB_135:
exit 1
IDX_OK_134:
mov r9, 6
store 1, horizontal, r9, 8
cmp 6, 0
jl IDX_OOB_137
cmp 6, 7
jg IDX_OOB_137
jmp IDX_OK_136
IDX_OOB_137:
exit 1
IDX_OK_136:
mov r9, 6
store 2, vertical, r9, 8
cmp 7, 0
jl IDX_OOB_139
cmp 7, 7
jg IDX_OOB_139
jmp IDX_OK_138
IDX_OOB_139:
exit 1
IDX_OK_138:
mov r9, 7
store 2, horizontal, r9, 8
cmp 7, 0
jl IDX_OOB_141
cmp 7, 7
jg IDX_OOB_141
jmp IDX_OK_140
IDX_OOB_141:
exit 1
IDX_OK_140:
mov r9, 7
store 1, vertical, r9, 8
PROC_END_init_move_offsets:
ret
function PROC_clear_board:
mov clear_board_i, 0
FOR_142:
cmp clear_board_i, 63
jg ENDFOR_143
cmp clear_board_i, 0
jl IDX_OOB_146
cmp clear_board_i, 63
jg IDX_OOB_146
jmp IDX_OK_145
IDX_OOB_146:
exit 1
IDX_OK_145:
mov rbx, clear_board_i
store 0, board, rbx, 8
FOR_CONTINUE_144:
add clear_board_i, 1
jmp FOR_142
ENDFOR_143:
PROC_END_clear_board:
ret
function PROC_set_board:
mov set_board_row, rbx
mov set_board_col, rcx
mov set_board_val, rdx
mov rbx, set_board_row
mul rbx, 8
mov rcx, rbx
add rcx, set_board_col
cmp rcx, 0
jl IDX_OOB_148
cmp rcx, 63
jg IDX_OOB_148
jmp IDX_OK_147
IDX_OOB_148:
exit 1
IDX_OK_147:
mov rdx, rcx
store set_board_val, board, rdx, 8
PROC_END_set_board:
ret
function PROC_sort_moves:
mov sort_moves_n, rbx
mov sort_moves_i, 0
WHILE_149:
mov rbx, sort_moves_n
sub rbx, 1
cmp sort_moves_i, rbx
jge ENDWHILE_150
mov sort_moves_min_idx, sort_moves_i
mov sort_moves_j, sort_moves_i
add sort_moves_j, 1
WHILE_153:
cmp sort_moves_j, sort_moves_n
jge ENDWHILE_154
mov rdi, sort_moves_j
load r8, sort_deg, rdi, 8
mov rdi, sort_moves_min_idx
load r9, sort_deg, rdi, 8
cmp r8, r9
jge ELSE_157
mov sort_moves_min_idx, sort_moves_j
ELSE_157:
mov r9, sort_moves_j
add r9, 1
mov sort_moves_j, r9
jmp WHILE_153
ENDWHILE_154:
cmp sort_moves_min_idx, sort_moves_i
je ELSE_161
mov r9, sort_moves_i
load r10, sort_deg, r9, 8
mov sort_moves_tmp, r10
mov r9, sort_moves_min_idx
load r10, sort_deg, r9, 8
cmp sort_moves_i, 0
jl IDX_OOB_166
cmp sort_moves_i, 7
jg IDX_OOB_166
jmp IDX_OK_165
IDX_OOB_166:
exit 1
IDX_OK_165:
mov r9, sort_moves_i
store r10, sort_deg, r9, 8
cmp sort_moves_min_idx, 0
jl IDX_OOB_168
cmp sort_moves_min_idx, 7
jg IDX_OOB_168
jmp IDX_OK_167
IDX_OOB_168:
exit 1
IDX_OK_167:
mov r9, sort_moves_min_idx
store sort_moves_tmp, sort_deg, r9, 8
mov r9, sort_moves_i
load r10, sort_row, r9, 8
mov sort_moves_tmp, r10
mov r9, sort_moves_min_idx
load r10, sort_row, r9, 8
cmp sort_moves_i, 0
jl IDX_OOB_170
cmp sort_moves_i, 7
jg IDX_OOB_170
jmp IDX_OK_169
IDX_OOB_170:
exit 1
IDX_OK_169:
mov r9, sort_moves_i
store r10, sort_row, r9, 8
cmp sort_moves_min_idx, 0
jl IDX_OOB_172
cmp sort_moves_min_idx, 7
jg IDX_OOB_172
jmp IDX_OK_171
IDX_OOB_172:
exit 1
IDX_OK_171:
mov r9, sort_moves_min_idx
store sort_moves_tmp, sort_row, r9, 8
mov r9, sort_moves_i
load r10, sort_col, r9, 8
mov sort_moves_tmp, r10
mov r9, sort_moves_min_idx
load r10, sort_col, r9, 8
cmp sort_moves_i, 0
jl IDX_OOB_174
cmp sort_moves_i, 7
jg IDX_OOB_174
jmp IDX_OK_173
IDX_OOB_174:
exit 1
IDX_OK_173:
mov r9, sort_moves_i
store r10, sort_col, r9, 8
cmp sort_moves_min_idx, 0
jl IDX_OOB_176
cmp sort_moves_min_idx, 7
jg IDX_OOB_176
jmp IDX_OK_175
IDX_OOB_176:
exit 1
IDX_OK_175:
mov r9, sort_moves_min_idx
store sort_moves_tmp, sort_col, r9, 8
ELSE_161:
add sort_moves_i, 1
jmp WHILE_149
ENDWHILE_150:
PROC_END_sort_moves:
ret
function PROC_reset_tour:
push reset_tour_dummy
call PROC_clear_board
pop reset_tour_dummy
invoke rand
return rbx
mov rcx, rbx
mod rcx, 8
mov knight_row, rcx
invoke rand
return rdx
mov rsi, rdx
mod rsi, 8
mov knight_col, rsi
push rbx
push rcx
push rdx
push rsi
mov rbx, knight_row
mov rcx, knight_col
mov rdx, 1
push reset_tour_dummy
call PROC_set_board
pop reset_tour_dummy
pop rsi
pop rdx
pop rcx
pop rbx
mov seq_count, 0
cmp 0, 0
jl IDX_OOB_178
cmp 0, 63
jg IDX_OOB_178
jmp IDX_OK_177
IDX_OOB_178:
exit 1
IDX_OK_177:
mov rdi, 0
store knight_row, seq_row, rdi, 8
cmp 0, 0
jl IDX_OOB_180
cmp 0, 63
jg IDX_OOB_180
jmp IDX_OK_179
IDX_OOB_180:
exit 1
IDX_OK_179:
mov rdi, 0
store knight_col, seq_col, rdi, 8
mov seq_count, 1
push rbx
push rcx
push rdx
push rsi
mov rbx, knight_row
mov rcx, knight_col
mov rdx, 2
push reset_tour_dummy
call FUNC_solve_tour
pop reset_tour_dummy
pop rsi
pop rdx
pop rcx
pop rbx
mov rdi, rax
mov reset_tour_dummy, rdi
mov moves, 1
mov tour_over, 0
PROC_END_reset_tour:
ret
function PROC_next_move:
cmp moves, 64
jl ELSE_181
jmp PROC_END_next_move
ELSE_181:
cmp seq_count, 0
jg ELSE_185
jmp PROC_END_next_move
ELSE_185:
cmp tour_over, 0
je ELSE_189
jmp PROC_END_next_move
ELSE_189:
mov rdx, moves
load rsi, seq_row, rdx, 8
mov next_move_nr, rsi
mov rdx, moves
load rdi, seq_col, rdx, 8
mov next_move_nc, rdi
mov rdx, 0
sub rdx, 1
push rbx
push rcx
push rsi
push rdi
mov rbx, knight_row
mov rcx, knight_col
push next_move_nr
push next_move_nc
call PROC_set_board
pop next_move_nc
pop next_move_nr
pop rdi
pop rsi
pop rcx
pop rbx
mov knight_row, next_move_nr
mov knight_col, next_move_nc
mov r8, moves
add r8, 1
mov moves, r8
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
mov rbx, knight_row
mov rcx, knight_col
mov rdx, moves
push next_move_nr
push next_move_nc
call PROC_set_board
pop next_move_nc
pop next_move_nr
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
cmp moves, 64
jl ELSE_191
mov tour_over, 1
ELSE_191:
PROC_END_next_move:
ret
function PROC_draw_board:
mov draw_board_i, 0
FOR_195:
cmp draw_board_i, 7
jg ENDFOR_196
mov draw_board_j, 0
FOR_198:
cmp draw_board_j, 7
jg ENDFOR_199
mov rbx, draw_board_j
mul rbx, 85
mov rcx, 140
add rcx, rbx
mov draw_board_rx, rcx
mov rdx, draw_board_i
mul rdx, 85
mov rsi, 40
add rsi, rdx
mov draw_board_ry, rsi
push rbx
push rcx
push rdx
push rsi
mov rbx, draw_board_i
mov rcx, draw_board_j
push draw_board_i
push draw_board_j
push draw_board_rx
push draw_board_ry
call FUNC_get_board
pop draw_board_ry
pop draw_board_rx
pop draw_board_j
pop draw_board_i
pop rsi
pop rdx
pop rcx
pop rbx
mov rdi, rax
mov r8, 0
sub r8, 1
cmp rdi, r8
jne ELSE_201
mov r9, 0
mov r10, 0
mov r11, 0
mov r12, 255
invoke set_draw_color, renderer_id, r9, r10, r11, r12
jmp ENDIF_202
ELSE_201:
mov r9, draw_board_i
add r9, draw_board_j
mod r9, 2
cmp r9, 0
jne ELSE_205
mov r9, 255
mov r10, 255
mov r11, 255
mov r12, 255
invoke set_draw_color, renderer_id, r9, r10, r11, r12
jmp ENDIF_206
ELSE_205:
mov r9, 255
mov r10, 0
mov r11, 0
mov r12, 255
invoke set_draw_color, renderer_id, r9, r10, r11, r12
ENDIF_206:
ENDIF_202:
mov r9, 80
mov r10, 80
invoke fill_rect, renderer_id, draw_board_rx, draw_board_ry, r9, r10
FOR_CONTINUE_200:
add draw_board_j, 1
jmp FOR_198
ENDFOR_199:
FOR_CONTINUE_197:
add draw_board_i, 1
jmp FOR_195
ENDFOR_196:
PROC_END_draw_board:
ret
function PROC_draw_knight:
mov rbx, knight_col
mul rbx, 85
mov draw_knight_dx, 140
add draw_knight_dx, rbx
add draw_knight_dx, 10
mov rsi, knight_row
mul rsi, 85
mov draw_knight_dy, 40
add draw_knight_dy, rsi
add draw_knight_dy, 10
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, 60
mov r14, 60
invoke render_texture, renderer_id, knight_tex, r9, r10, r11, r12, draw_knight_dx, draw_knight_dy, r13, r14
PROC_END_draw_knight:
ret
function FUNC_get_board:
mov get_board_row, rbx
mov get_board_col, rcx
mov rbx, get_board_row
mul rbx, 8
mov rcx, rbx
add rcx, get_board_col
mov rdx, rcx
load rsi, board, rdx, 8
mov __funcret_get_board, rsi
FUNC_END_get_board:
mov rax, __funcret_get_board
ret
function FUNC_is_valid_move:
mov is_valid_move_row, rbx
mov is_valid_move_col, rcx
cmp is_valid_move_row, 0
jl OR_ONE_215
cmp is_valid_move_row, 8
jl ELSE_209
OR_ONE_215:
mov __funcret_is_valid_move, 0
jmp FUNC_END_is_valid_move
ELSE_209:
cmp is_valid_move_col, 0
jl OR_ONE_223
cmp is_valid_move_col, 8
jl ELSE_217
OR_ONE_223:
mov __funcret_is_valid_move, 0
jmp FUNC_END_is_valid_move
ELSE_217:
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
mov rbx, is_valid_move_row
mov rcx, is_valid_move_col
push is_valid_move_row
push is_valid_move_col
call FUNC_get_board
pop is_valid_move_col
pop is_valid_move_row
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
cmp rax, 0
je ELSE_225
mov __funcret_is_valid_move, 0
jmp ENDIF_226
ELSE_225:
mov __funcret_is_valid_move, 1
ENDIF_226:
FUNC_END_is_valid_move:
mov rax, __funcret_is_valid_move
ret
function FUNC_get_degree:
mov get_degree_row, rbx
mov get_degree_col, rcx
mov get_degree_count, 0
mov get_degree_i, 0
FOR_229:
cmp get_degree_i, 7
jg ENDFOR_230
mov rbx, get_degree_i
load rcx, vertical, rbx, 8
mov rbx, get_degree_row
add rbx, rcx
mov get_degree_nr, rbx
mov rdx, get_degree_i
load rsi, horizontal, rdx, 8
mov rdx, get_degree_col
add rdx, rsi
mov get_degree_nc, rdx
push rbx
push rcx
push rdx
push rsi
mov rbx, get_degree_nr
mov rcx, get_degree_nc
push get_degree_row
push get_degree_col
push get_degree_i
push get_degree_nr
push get_degree_nc
push get_degree_count
call FUNC_is_valid_move
pop get_degree_count
pop get_degree_nc
pop get_degree_nr
pop get_degree_i
pop get_degree_col
pop get_degree_row
pop rsi
pop rdx
pop rcx
pop rbx
cmp rax, 1
jne ELSE_232
add get_degree_count, 1
ELSE_232:
FOR_CONTINUE_231:
add get_degree_i, 1
jmp FOR_229
ENDFOR_230:
mov __funcret_get_degree, get_degree_count
FUNC_END_get_degree:
mov rax, __funcret_get_degree
ret
function FUNC_solve_tour:
mov solve_tour_pos_row, rbx
mov solve_tour_pos_col, rcx
mov solve_tour_move_count, rdx
cmp solve_tour_move_count, 65
jne ELSE_236
mov __funcret_solve_tour, 1
jmp FUNC_END_solve_tour
ELSE_236:
mov solve_tour_n, 0
mov solve_tour_i, 0
FOR_240:
cmp solve_tour_i, 7
jg ENDFOR_241
mov rcx, solve_tour_i
load rdx, vertical, rcx, 8
mov rcx, solve_tour_pos_row
add rcx, rdx
mov solve_tour_nr, rcx
mov rsi, solve_tour_i
load rdi, horizontal, rsi, 8
mov rsi, solve_tour_pos_col
add rsi, rdi
mov solve_tour_nc, rsi
push rbx
push rcx
push rdx
push rsi
push rdi
mov rbx, solve_tour_nr
mov rcx, solve_tour_nc
push solve_tour_pos_row
push solve_tour_pos_col
push solve_tour_move_count
push solve_tour_i
push solve_tour_nr
push solve_tour_nc
push solve_tour_n
call FUNC_is_valid_move
pop solve_tour_n
pop solve_tour_nc
pop solve_tour_nr
pop solve_tour_i
pop solve_tour_move_count
pop solve_tour_pos_col
pop solve_tour_pos_row
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
mov r8, rax
cmp r8, 1
jne ELSE_243
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
mov rbx, solve_tour_nr
mov rcx, solve_tour_nc
push solve_tour_pos_row
push solve_tour_pos_col
push solve_tour_move_count
push solve_tour_i
push solve_tour_nr
push solve_tour_nc
push solve_tour_n
call FUNC_get_degree
pop solve_tour_n
pop solve_tour_nc
pop solve_tour_nr
pop solve_tour_i
pop solve_tour_move_count
pop solve_tour_pos_col
pop solve_tour_pos_row
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
mov r9, rax
cmp solve_tour_n, 0
jl IDX_OOB_248
cmp solve_tour_n, 7
jg IDX_OOB_248
jmp IDX_OK_247
IDX_OOB_248:
exit 1
IDX_OK_247:
mov r10, solve_tour_n
store r9, sort_deg, r10, 8
cmp solve_tour_n, 0
jl IDX_OOB_250
cmp solve_tour_n, 7
jg IDX_OOB_250
jmp IDX_OK_249
IDX_OOB_250:
exit 1
IDX_OK_249:
mov r9, solve_tour_n
store solve_tour_nr, sort_row, r9, 8
cmp solve_tour_n, 0
jl IDX_OOB_252
cmp solve_tour_n, 7
jg IDX_OOB_252
jmp IDX_OK_251
IDX_OOB_252:
exit 1
IDX_OK_251:
mov r9, solve_tour_n
store solve_tour_nc, sort_col, r9, 8
mov r9, solve_tour_n
add r9, 1
mov solve_tour_n, r9
ELSE_243:
FOR_CONTINUE_242:
add solve_tour_i, 1
jmp FOR_240
ENDFOR_241:
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
mov rbx, solve_tour_n
push solve_tour_pos_row
push solve_tour_pos_col
push solve_tour_move_count
push solve_tour_i
push solve_tour_nr
push solve_tour_nc
push solve_tour_n
call PROC_sort_moves
pop solve_tour_n
pop solve_tour_nc
pop solve_tour_nr
pop solve_tour_i
pop solve_tour_move_count
pop solve_tour_pos_col
pop solve_tour_pos_row
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
mov solve_tour_i, 0
WHILE_253:
cmp solve_tour_i, solve_tour_n
jge ENDWHILE_254
mov r9, solve_tour_i
load r10, sort_row, r9, 8
mov r9, solve_tour_i
load r11, sort_col, r9, 8
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
mov rbx, r10
mov rcx, r11
mov rdx, solve_tour_move_count
push solve_tour_pos_row
push solve_tour_pos_col
push solve_tour_move_count
push solve_tour_i
push solve_tour_nr
push solve_tour_nc
push solve_tour_n
call PROC_set_board
pop solve_tour_n
pop solve_tour_nc
pop solve_tour_nr
pop solve_tour_i
pop solve_tour_move_count
pop solve_tour_pos_col
pop solve_tour_pos_row
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
mov r9, solve_tour_i
load r10, sort_row, r9, 8
cmp seq_count, 0
jl IDX_OOB_258
cmp seq_count, 63
jg IDX_OOB_258
jmp IDX_OK_257
IDX_OOB_258:
exit 1
IDX_OK_257:
mov r9, seq_count
store r10, seq_row, r9, 8
mov r9, solve_tour_i
load r10, sort_col, r9, 8
cmp seq_count, 0
jl IDX_OOB_260
cmp seq_count, 63
jg IDX_OOB_260
jmp IDX_OK_259
IDX_OOB_260:
exit 1
IDX_OK_259:
mov r9, seq_count
store r10, seq_col, r9, 8
mov r9, seq_count
add r9, 1
mov seq_count, r9
mov r9, solve_tour_i
load r10, sort_row, r9, 8
mov r9, solve_tour_i
load r11, sort_col, r9, 8
mov r9, solve_tour_move_count
add r9, 1
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
mov rbx, r10
mov rcx, r11
mov rdx, r9
push solve_tour_pos_row
push solve_tour_pos_col
push solve_tour_move_count
push solve_tour_i
push solve_tour_nr
push solve_tour_nc
push solve_tour_n
call FUNC_solve_tour
pop solve_tour_n
pop solve_tour_nc
pop solve_tour_nr
pop solve_tour_i
pop solve_tour_move_count
pop solve_tour_pos_col
pop solve_tour_pos_row
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
cmp rax, 1
jne ELSE_261
mov __funcret_solve_tour, 1
jmp FUNC_END_solve_tour
jmp ENDIF_262
ELSE_261:
mov r9, solve_tour_i
load r10, sort_row, r9, 8
mov r9, solve_tour_i
load r11, sort_col, r9, 8
push rbx
push rcx
push rdx
push rsi
push rdi
push r8
mov rbx, r10
mov rcx, r11
mov rdx, 0
push solve_tour_pos_row
push solve_tour_pos_col
push solve_tour_move_count
push solve_tour_i
push solve_tour_nr
push solve_tour_nc
push solve_tour_n
call PROC_set_board
pop solve_tour_n
pop solve_tour_nc
pop solve_tour_nr
pop solve_tour_i
pop solve_tour_move_count
pop solve_tour_pos_col
pop solve_tour_pos_row
pop r8
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
sub seq_count, 1
ENDIF_262:
add solve_tour_i, 1
jmp WHILE_253
ENDWHILE_254:
mov __funcret_solve_tour, 0
FUNC_END_solve_tour:
mov rax, __funcret_solve_tour
ret
}
}