174 lines
2.2 KiB
NASM
174 lines
2.2 KiB
NASM
; 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
|