mato8/mato8.asm

195 lines
2.6 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 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 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