Skip to content

Instantly share code, notes, and snippets.

@kmltml
Created June 30, 2015 08:41
Show Gist options
  • Select an option

  • Save kmltml/909d2d19421cef2c8128 to your computer and use it in GitHub Desktop.

Select an option

Save kmltml/909d2d19421cef2c8128 to your computer and use it in GitHub Desktop.
;requires graphics
.code "main"
main_v:
jal scanDevices_v
lb $0, [dbg_after_scan_dvcs.]
li $t0, int_handler
mts intv, $t0
li $t0, -1
mts imsk, $t0
li $sp, 0x100000
jal swapBuffers_v
jal time_v
jal rseed_i
.loop:
lw $t0, [food]
bgt $t0, $0, .else
lw $t0, [foodTimer]
sub $t0, 1
sw $t0, [foodTimer]
bne $t0, $0, .else
jal random_v
modu $s0, $a0, $0, 25
jal random_v
modu $t0, $a0, $0, 18
shll $t0, 16
or $t0, $s0
sw $t0, [food]
.else:
lb $0, [dbg_msg0.]
jal advanceSnake_v
lw $t0, [lost]
bne $t0, $0, .lost
lb $0, [dbg_msg1.]
li $a0, 0xff000000
jal clearScreen_i
lb $0, [dbg_msg2.]
jal drawSnake_v
jal drawFood_v
jal swapBuffers_v
li $a0, 250
lb $0, [dbg_msg3.]
jal sleep_i
lb $0, [dbg_msg4.]
b .loop
.lost:
li $s0, 500
li $a0, 0xffff0000
jal clearScreen_i
jal swapBuffers_v
mov $a0, $s0
jal sleep_i
jal swapBuffers_v
.die_loop:
mov $a0, $s0
jal sleep_i
jal swapBuffers_v
b .die_loop
dw 0xffffffff
drawSnake_v:
sw $fp, ($sp)
mov $fp, $sp
sw $ra, $fp(-4)
sw $s0, $fp(-8)
~locals equ 44 ; fp + ra + s0 + a0-7 * 4
sub $sp, ~locals
li $s0, snake ; $s0 = snakePtr
.loop:
lh $t0, $s0(0) ; $t0 = snake.x
lh $t1, $s0(2) ; $t0 = snake.y
blt $t0, $0, .return
`grid_cell_size equ 32
`grid_cell_padding equ 3
`grid_actual_size equ 26 ;32 - 2*3
~snake_color equ 0xffffffff ; white
mul $t0, `grid_cell_size
add $a0, $t0, `grid_cell_padding
mul $t1, `grid_cell_size
add $a1, $t1, `grid_cell_padding
li $a2, `grid_actual_size
mov $a3, $a2
li $a4, ~snake_color
jal drawRect_iiiii
add $s0, 4
b .loop
.return:
lw $s0, $fp(-8)
lw $ra, $fp(-4)
mov $sp, $fp
lw $fp, ($sp)
jr
drawFood_v:
lw $t0, [food]
blt $t0, $0, .return
~food_color equ 0xffffff00
li $t1, 0xffff
and $a0, $t0, $t1
mul $a0, `grid_cell_size
add $a0, `grid_cell_padding
shrl $a1, $t0, $0, 16
mul $a1, `grid_cell_size
add $a1, `grid_cell_padding
li $a2, `grid_actual_size
mov $a3, $a2
li $a4, ~food_color
j drawRect_iiiii
.return:
jr
advanceSnake_v:
sw $fp, ($sp)
mov $fp, $sp
sw $ra, $fp(-4)
sw $s0, $fp(-8)
sw $s1, $fp(-12)
sub $sp, (2 + 3 + 2)*4
lw $t0, [snakeDir]
shll $t0, 2
li $t1, snake
mov $s0, $0
lw $s1, ($t1)
lw $t2, [food]
bne $s1, $t2, .else
li $t2, -1
sw $t2, [food]
li $t2, 3
sw $t2, [foodTimer]
li $s0, 1
.else:
lh $t2, $t1(0)
lh $t3, $t1(2)
lw $t4, .switch_table[$t0]
jr $t4
.switch_table:
dw .sw_right
dw .sw_down
dw .sw_left
dw .sw_up
.sw_right:
add $t2, 1
b .sw_def
.sw_down:
add $t3, 1
b .sw_def
.sw_left:
sub $t2, 1
b .sw_def
.sw_up:
sub $t3, 1
.sw_def:
blt $t2, $0, .setLose
blt $t3, $0, .setLose
li $t0, 25
bge $t2, $t0, .setLose
li $t0, 18
bgt $t3, $t0, .setLose
sh $t2, $t1(0)
sh $t3, $t1(2)
li $a0, snake
add $a0, 4
mov $a1, $s1
jal contains_ipi
bne $a0, $0, .setLose
.loop:
add $t1, 4
lw $t2, ($t1)
blt $t2, $0, .end_snake
sw $s1, ($t1)
mov $s1, $t2
b .loop
.end_snake:
beq $s0, $0, .return
sw $s1, ($t1)
.return:
mov $sp, $fp
lw $ra, $fp(-4)
lw $s0, $fp(-8)
lw $s1, $fp(-12)
lw $fp, ($sp)
jr
.setLose:
li $t0, 1
sw $t0, [lost]
b .return
contains_ipi:
dw 0x000000ff
.loop:
lw $t0, ($a0)
blt $t0, $0, .return_false
beq $t0, $a1, .return_true
add $a0, 4
b .loop
.return_false:
mov $a0, $0
jr
.return_true:
li $a0, 1
jr
`key_right equ 79
`key_left equ 80
`key_down equ 81
`key_up equ 82
int_handler:
lw $k0, (keyboard_ptr)
lw $k1, ($k0)
sw $0, ($k0)
shrl $k0, $k1, $0, 16
beq $k0, $0, .return
li $k0, 0xffff
and $k0, $k1, $k0
li $k1, `key_right
beq $k0, $k1, .right
li $k1, `key_left
beq $k0, $k1, .left
li $k1, `key_down
beq $k0, $k1, .down
li $k1, `key_up
beq $k0, $k1, .up
b .return
.right:
li $k0, `dir_right
sw $k0, [snakeDir]
b .return
.left:
li $k0, `dir_left
sw $k0, [snakeDir]
b .return
.up:
li $k0, `dir_up
sw $k0, [snakeDir]
b .return
.down:
li $k0, `dir_down
sw $k0, [snakeDir]
.return:
mts intd, $0
mfs $k0, rfin
jr $k0
snake:
dw 0
dw 0x00010000
dw 0x00010001
dw -1 x 450
food: dw 0x00050005
foodTimer: dw 10
lost: dw 0
snakeDir: dw 0
`dir_right equ 0
`dir_down equ 1
`dir_left equ 2
`dir_up equ 3
dbg_after_scan_dvcs.:
dz "After scanning for devices"
dbg_msg0.: dz "Before advanceSnake"
dbg_msg1.: dz "After advanceSnake"
dgb_msg2.: dz "Before drawSnake"
dbg_msg3.: dz "Before sleep"
dbg_msg4.: dz "After sleep"
align 4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment