Created
June 30, 2015 08:41
-
-
Save kmltml/909d2d19421cef2c8128 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ;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