From c81dee26f2f87abb4517352956a4bcb07266e38c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Sat, 14 Jan 2023 21:33:02 +0200 Subject: [PATCH] Use a direction value instead of dx, dy pair for movement --- mato8.asm | 103 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 62 insertions(+), 41 deletions(-) diff --git a/mato8.asm b/mato8.asm index 61eab6e..e9a14c6 100644 --- a/mato8.asm +++ b/mato8.asm @@ -11,11 +11,15 @@ define down_key 8 define left_key 4 define right_key 6 -define game_over_reg v8 -define fruit_x_reg v9 -define fruit_y_reg va -define head_dx_reg vb -define head_dy_reg vc +define direction_up 0 +define direction_down 6 +define direction_left 12 +define direction_right 18 + +define game_over_reg v9 +define fruit_x_reg va +define fruit_y_reg vb +define head_direction_reg vc define head_x_reg vd define head_y_reg ve @@ -26,8 +30,7 @@ start: rnd head_x_reg, 63 rnd head_y_reg, 31 - ld head_dx_reg, 1 - ld head_dy_reg, 0 + ld head_direction_reg, direction_right ld i, single_pixel drw head_x_reg, head_y_reg, 1 @@ -40,19 +43,19 @@ mainloop: ld v0, up_key sknp v0 - call dir_up + call turn_up ld v0, down_key sknp v0 - call dir_down + call turn_down ld v0, left_key sknp v0 - call dir_left + call turn_left ld v0, right_key sknp v0 - call dir_right + call turn_right call move_snake @@ -106,54 +109,72 @@ spawn_fruit: ret -dir_up: - ; Allow only 90° turns - se head_dy_reg, 0 - ret - ld head_dx_reg, 0 - ld head_dy_reg, #ff +turn_up: + ; Don't allow 180° turns (which would kill the snake instantly) + se head_direction_reg, direction_down + ld head_direction_reg, direction_up ret -dir_down: - se head_dy_reg, 0 - ret - ld head_dx_reg, 0 - ld head_dy_reg, 1 +turn_down: + se head_direction_reg, direction_up + ld head_direction_reg, direction_down ret -dir_left: - se head_dx_reg, 0 - ret - ld head_dx_reg, #ff - ld head_dy_reg, 0 +turn_left: + se head_direction_reg, direction_right + ld head_direction_reg, direction_left ret -dir_right: - se head_dx_reg, 0 - ret - ld head_dx_reg, 1 - ld head_dy_reg, 0 +turn_right: + se head_direction_reg, direction_left + ld head_direction_reg, direction_right ret move_snake: - ld v0, head_x_reg - add head_x_reg, head_dx_reg - ld v2, 63 - and head_x_reg, v2 + ld v0, head_direction_reg + call unpack_direction - ld v1, head_y_reg - add head_y_reg, head_dy_reg - ld v2, 31 - and head_y_reg, v2 + ld v2, head_x_reg + add head_x_reg, v0 + ld v0, 63 + and head_x_reg, v0 + + ld v3, head_y_reg + add head_y_reg, v1 + ld v0, 31 + and head_y_reg, v0 ld i, single_pixel drw head_x_reg, head_y_reg, 1 se vf, 0 call collision - drw v0, v1, 1 + drw v2, v3, 1 ret +unpack_direction: + jp v0, unpack_direction_table + unpack_direction_table: + ; Up + ld v0, 0 + ld v1, #ff + ret + + ; Down + ld v0, 0 + ld v1, 1 + ret + + ; Left + ld v0, #ff + ld v1, 0 + ret + + ; Right + ld v0, 1 + ld v1, 0 + ret + collision: se head_x_reg, fruit_x_reg jp tail_collision