mato8/mato8.asm

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