; Mato8 ; By nortti, 2023 ; Snake game for CHIP-8 ; Under Creative Commons Zero 1.0 ; Assemble with c8asm (https://github.com/wernsey/chip8) define frames_wait 4 define up_key 2 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 head_x_reg vd define head_y_reg ve start: cls ld game_over_reg, 0 rnd head_x_reg, 63 rnd head_y_reg, 31 ld head_dx_reg, 1 ld head_dy_reg, 0 ld i, single_pixel drw head_x_reg, head_y_reg, 1 call spawn_fruit mainloop: ld v0, frames_wait ld dt, v0 ld v0, up_key sknp v0 call dir_up ld v0, down_key sknp v0 call dir_down ld v0, left_key sknp v0 call dir_left ld v0, right_key sknp v0 call dir_right call move_snake ; Wait until the frame timer hits zero mainloop_wait_loop: ld v0, dt se v0, 0 jp mainloop_wait_loop sne game_over_reg, 0 jp mainloop game_over: ld v0, 20 ld st, v0 call wait ld v0, 30 call wait ld v0, 20 ld st, v0 call wait ld v0, 30 call wait ld v0, 20 ld st, v0 call wait jp start wait: ld dt, v0 wait_loop: ld v0, dt se v0, 0 jp wait_loop ret spawn_fruit: rnd fruit_x_reg, 63 rnd fruit_y_reg, 31 ld i, single_pixel drw fruit_x_reg, fruit_y_reg, 1 ; Did we spawn over the snake? se vf, 0 jp 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 ret dir_down: se head_dy_reg, 0 ret ld head_dx_reg, 0 ld head_dy_reg, 1 ret dir_left: se head_dx_reg, 0 ret ld head_dx_reg, #ff ld head_dy_reg, 0 ret dir_right: se head_dx_reg, 0 ret ld head_dx_reg, 1 ld head_dy_reg, 0 ret move_snake: ld v0, head_x_reg add head_x_reg, head_dx_reg ld v2, 63 and head_x_reg, v2 ld v1, head_y_reg add head_y_reg, head_dy_reg ld v2, 31 and head_y_reg, v2 ld i, single_pixel drw head_x_reg, head_y_reg, 1 se vf, 0 call collision drw v0, v1, 1 ret collision: se head_x_reg, fruit_x_reg jp tail_collision se head_y_reg, fruit_y_reg jp tail_collision eat_fruit: ; TODO: Lenghten snake ld i, single_pixel drw fruit_x_reg, fruit_y_reg, 1 jp spawn_fruit tail_collision: ld game_over_reg, 1 ret single_pixel: db #80