; 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 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 start: cls ld game_over_reg, 0 rnd head_x_reg, 63 rnd head_y_reg, 31 ld head_direction_reg, direction_right 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 turn_up ld v0, down_key sknp v0 call turn_down ld v0, left_key sknp v0 call turn_left ld v0, right_key sknp v0 call turn_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 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 turn_down: se head_direction_reg, direction_up ld head_direction_reg, direction_down ret turn_left: se head_direction_reg, direction_right ld head_direction_reg, direction_left ret turn_right: se head_direction_reg, direction_left ld head_direction_reg, direction_right ret move_snake: ld v0, head_direction_reg call unpack_direction 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 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 se head_y_reg, fruit_y_reg jp tail_collision eat_fruit: ; TODO: Lenghten snake ld v0, 1 ld st, v0 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