.text # a0 = start, a1 = player, a2=offset, a3=count, t0=mode, t1=dist check_dir: addu $sp,-32 sw $ra,28($sp) sw $a0,32($sp) sw $a3,44($sp) lw $t0,48($sp) lw $t1,52($sp) li $v0,0 beqz $a3,check_dir_end li $v0,1 lb $t2,0($a0) bne $t2,$a1, check_dir_if3 bnez $t1, check_dir_end li $v0,0 j check_dir_end check_dir_if3: li $v0,0 xori $t3,$a1,1 bne $t2,$t3,check_dir_end beqz $a3,check_dir_end addu $a0,$a0,$a2 addiu $a3,-1 lw $t0,48($sp) sw $t0,16($sp) addiu $t2,$t1,1 sw $t2,20($sp) jal check_dir beqz $v0,check_dir_end lw $t1,52($sp) beqz $t1,check_dir_skip_add add $v0,1 check_dir_skip_add: lw $t0,48($sp) lw $a0,32($sp) beqz $t0,check_dir_end sb $a1,0($a0) check_dir_end: lw $ra,28($sp) lw $a0,32($sp) lw $a3,44($sp) addu $sp,32 jr $ra # a0=board, a1 = size, a2 = row, a3 = col # sp+X+16 = sp+ = player # s1 = sp+X+20 = sp+ = mode # check_or_place: addu $sp,-52 sw $ra,48($sp) sw $a0,52($sp) sw $a1,56($sp) sw $a2,60($sp) sw $a3,64($sp) sw $s0,24($sp) sw $s1,28($sp) sw $s2,32($sp) sw $s3,36($sp) sw $s4,40($sp) sw $s5,44($sp) move $s0, $a2 # row move $s1, $a3 # col move $s2, $a1 # size addi $s3,$s2,-1 # bsize mul $t0,$a1,$a2 # size*row add $s4,$a0,$t0 # board+row*size add $s4,$s4,$a3 # board+row*size+col lw $a1, 68($sp) # Get the player lw $t1, 72($sp) # Get the mode sw $t1, 16($sp) sw $0, 20($sp) move $v0,$0 move $s5,$0 add $a0,$s4,1 li $a2,1 sub $a3,$s3,$s1 jal check_dir add $s5,$s5,$v0 add $a0,$s4,-1 li $a2,-1 move $a3,$s1 jal check_dir add $s5,$s5,$v0 add $a0,$s4,$s2 move $a2,$s2 sub $a3,$s3,$s0 jal check_dir add $s5,$s5,$v0 sub $a0,$s4,$s2 sub $a2,$0,$s2 move $a3,$s0 # sub $a3,$0,$s2 jal check_dir add $s5,$s5,$v0 add $a0,$s4,$s2 # Down Right add $a0,1 add $a2,$s2,1 sub $a3,$s3,$s0 sub $t1,$s3,$s1 ble $a3,$t1,check_or_place_min1 move $a3,$t1 check_or_place_min1: jal check_dir add $s5,$s5,$v0 sub $a0,$s4,$s2 # Up Left sub $a0,1 add $a2,$s2,1 sub $a2,$0,$a2 move $a3,$s0 ble $a3,$s1,check_or_place_min2 move $a3,$s1 check_or_place_min2: jal check_dir add $s5,$s5,$v0 # Up Right (Modified) sub $a0,$s4,$s2 add $a0,1 sub $a2,$0,$s2 add $a2,1 move $a3,$s0 sub $t0,$s3,$s1 ble $a3,$t0,check_or_place_min3 move $a3,$t0 check_or_place_min3: jal check_dir add $s5,$s5,$v0 add $a0,$s4,$s3 # Down Left add $a2,$s2,-1 move $a3,$s1 sub $t0,$s3,$s0 ble $a3,$t0,check_or_place_min4 move $a3,$t0 check_or_place_min4: jal check_dir add $v0,$s5,$v0 check_or_place_end: lw $ra,48($sp) lw $a0,52($sp) lw $a1,56($sp) lw $a2,60($sp) lw $a3,64($sp) lw $s0,24($sp) lw $s1,28($sp) lw $s2,32($sp) lw $s3,36($sp) lw $s4,40($sp) lw $s5,44($sp) addu $sp,52 jr $ra check_move: add $sp,-32 sw $ra,28($sp) lw $t0,48($sp) sw $t0,16($sp) sw $0,20($sp) # add $a2,-1 # add $a3,-1 li $v0,0 mul $t0,$a2,$a1 add $t0, $t0, $a3 add $t0, $t0, $a0 lb $t0,0($t0) bnez $t0,check_move_skip jal check_or_place check_move_skip: # add $a2,1 # add $a3,1 lw $ra,28($sp) add $sp,32 j reg_fubar flip_pieces: add $sp,-32 sw $ra,28($sp) # add $a2,-1 # add $a3,-1 mul $t0,$a2,$a1 add $t0,$t0,$a3 add $t0,$t0,$a0 lb $t0,0($t0) sw $t0,16($sp) sw $t0,20($sp) jal check_or_place # add $a2,1 # add $a3,1 lw $ra,28($sp) add $sp,32 j reg_fubar reg_fubar: li $t0,0xFFFFFFFF move $t1,$t0 move $t2,$t0 move $t3,$t0 move $t4,$t0 move $t5,$t0 move $t6,$t0 move $t7,$t0 move $t8,$t0 move $t9,$t0 sw $t0,0($sp) sw $t0,4($sp) sw $t0,8($sp) sw $t0,12($sp) jr $ra