Advertisement
Guest User

Untitled

a guest
Apr 24th, 2017
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.17 KB | None | 0 0
  1. .data
  2.  
  3. board_data: .space 42
  4.  
  5. beg_msg_out: .asciiz "Test out\n"
  6. nl_char: .asciiz "\n"
  7. done_out: .asciiz "Done\n"
  8. store_error_message: .asciiz "ERROR: Invalid storage location\n"
  9.  
  10. #Draw Board Data
  11. board_edge_output: .asciiz "|"
  12. board_empty_output: .asciiz "_|"
  13. board_O_output: .asciiz "0|"
  14. board_X_output: .asciiz "X|"
  15. board_error_output: .asciiz "?|"
  16. boardSpaceOutput: .asciiz " "
  17.  
  18. .text
  19.  
  20. j main
  21. .globl main #player IDs: 1 = user, 2 = AI
  22.  
  23. # Macros
  24.  
  25.  
  26. .macro setup_random
  27. li $v0, 30
  28. syscall
  29. move $a1, $a0
  30. li $a0, 0
  31. li $v0, 40
  32. syscall
  33. .end_macro
  34.  
  35. .macro get_random_number(%max, %where)
  36. li $a1, %max
  37. li $a0, 0
  38. li $v0, 42
  39. syscall
  40. move %where, $a0
  41. .end_macro
  42.  
  43. .macro GetAIPlaceMacro(%where)
  44. jal GetAIPlace
  45. move %where, $v0
  46. .end_macro
  47.  
  48.  
  49. GetAIPlace:
  50. addi $sp, $sp, -4
  51. sw $ra, 0($sp)
  52. get_random_number(2,$t0)
  53. beq $t0, 0 GetAIPlaceCenter
  54. get_random_number(2,$t0)
  55. beq $t0, 0 GetAIPlace1_5
  56. get_random_number(2,$t0)
  57. beq $t0, 0 GetAIPlace2_4
  58. j GetAIPlace0_6
  59.  
  60. GetAIPlaceCenter:
  61. li $v0, 3
  62. j GetAIPlaceReturn
  63.  
  64. GetAIPlace0_6:
  65. get_random_number(2,$t0)
  66. beq $t0, 0 GetAIPlace6
  67. li $v0, 0
  68. j GetAIPlaceReturn
  69. GetAIPlace6:
  70. li $v0, 6
  71. j GetAIPlaceReturn
  72.  
  73. GetAIPlace1_5:
  74. get_random_number(2,$t0)
  75. beq $t0, 0 GetAIPlace5
  76. li $v0, 1
  77. j GetAIPlaceReturn
  78. GetAIPlace5:
  79. li $v0, 5
  80. j GetAIPlaceReturn
  81.  
  82. GetAIPlace2_4:
  83. get_random_number(2,$t0)
  84. beq $t0, 0 GetAIPlace4
  85. li $v0, 2
  86. j GetAIPlaceReturn
  87. GetAIPlace4:
  88. li $v0, 4
  89. j GetAIPlaceReturn
  90.  
  91. GetAIPlaceReturn:
  92. lw $ra, 0($sp)
  93. addi $sp, $sp, 4
  94. jr $ra
  95.  
  96.  
  97.  
  98.  
  99. .macro Place (%user, %x)#tries to drop a piece at a column.
  100. #where user is the id of the player dropping the piece, and x is the column.
  101. #returns 0 if valid else 1 if the column is filled up at $v0.
  102. addi $a0, $zero, %user
  103. add $a1, $zero, %x
  104. jal PlacePiece
  105. .end_macro
  106.  
  107. .macro getHeightMac(%x,%where)
  108. addi $a0, %x, 0
  109. jal GetHeight
  110. add %where, $v0, $zero
  111. .end_macro
  112.  
  113. .macro exit_prog #Used to terminate the program
  114. li $v0, 10 #Let syscall know we want to terminate the program
  115. syscall #Exit program
  116. .end_macro #End exit_prog macro
  117.  
  118. .macro load_gp_reg(%x, %y, %where)
  119. add $a0, $zero, %x
  120. add $a1, $zero, %y
  121. jal load_game_piece
  122. add %where, $v0, $zero
  123. .end_macro
  124.  
  125. .macro PrintString (%str)#tries to print a string.
  126. .data
  127. string: .asciiz %str
  128. .text
  129. li $v0, 4
  130. la $a0, string
  131. syscall
  132. .end_macro
  133.  
  134. .macro Print(%address)
  135. li $v0, 4
  136. la $a0, %address
  137. syscall
  138. .end_macro
  139.  
  140. .macro PrintLine #tries to print a line return.
  141. .data
  142. string: .asciiz "\n"
  143. .text
  144. li $v0, 4
  145. la $a0, string
  146. syscall
  147. .end_macro
  148.  
  149. .macro PrintInteger (%x)#tries to print an integer.
  150. li $v0, 1
  151. add $a0, $zero, %x
  152. syscall
  153. .end_macro
  154.  
  155. .macro ReadInteger #returns a user input integer at $v0.
  156. li $v0, 5
  157. syscall
  158. #TODO fix invalid integer crashes.
  159. .end_macro
  160.  
  161. .macro CheckWin # Returns the id of the player that has won (or 0 if no one has won) at $v0.
  162.  
  163. # Push stack
  164. add $sp, $sp, -36
  165. sw $ra, 0($sp)
  166. sw $s0, 4($sp)
  167. sw $s1, 8($sp)
  168. sw $s2, 12($sp)
  169. sw $s3, 16($sp)
  170. sw $s4, 20($sp)
  171. sw $s5, 24($sp)
  172. sw $s6, 28($sp)
  173. sw $s7, 32($sp)
  174.  
  175. # Scan horizontally
  176. li $s1, 0 # x
  177. li $s2, 0 # y
  178. li $s3, 0 # Count
  179. li $s4, 0 # Last value
  180. CWHorizontalLoop:
  181. load_gp_reg($s1, $s2, $s0)
  182. beq $s0, $s4, CWHorizontalSkipReset
  183. li $s3, 0
  184. CWHorizontalSkipReset:
  185. addi $s3, $s3, 1
  186. add $s4, $zero, $s0
  187. sge $t0, $s3, 4
  188. sne $t1, $s4, 0
  189. and $t0, $t0, $t1
  190. beq $t0, 1, CWFoundWin
  191. addi $s1, $s1, 1
  192. blt $s1, 7, CWHorizontalLoopContinue
  193. li $s1, 0
  194. addi $s2, $s2, 1
  195. li $s3, 0
  196. li $s4, 0
  197. CWHorizontalLoopContinue:
  198. blt $s2, 6, CWHorizontalLoop
  199.  
  200. # Scan vertically
  201. li $s1, 0 # y
  202. li $s2, 0 # x
  203. li $s3, 0 # Count
  204. li $s4, 0 # Last value
  205. CWVerticalLoop:
  206. load_gp_reg($s2, $s1, $s0)
  207. beq $s0, $s4, CWVerticalSkipReset
  208. li $s3, 0
  209. CWVerticalSkipReset:
  210. addi $s3, $s3, 1
  211. add $s4, $zero, $s0
  212. sge $t0, $s3, 4
  213. sne $t1, $s4, 0
  214. and $t0, $t0, $t1
  215. beq $t0, 1, CWFoundWin
  216. addi $s1, $s1, 1
  217. blt $s1, 6, CWVerticalLoopContinue
  218. li $s1, 0
  219. addi $s2, $s2, 1
  220. li $s3, 0
  221. li $s4, 0
  222. CWVerticalLoopContinue:
  223. blt $s2, 7, CWVerticalLoop
  224.  
  225. # Scan diagonally
  226. li $s1, 0 # x
  227. li $s2, 2 # y
  228. li $s3, 0 # Upward right count
  229. li $s4, 0 # Upward right last value
  230. li $s5, 0 # Downward right count
  231. li $s6, 0 # Downward right last value
  232. CWDiagonalLoop:
  233. load_gp_reg($s1, $s2, $s0)
  234. beq $s0, $s4, CWDiag1SkipReset
  235. li $s3, 0
  236. CWDiag1SkipReset:
  237. add $s4, $zero, $s0
  238. addi $s3, $s3, 1
  239. li $t0, 5
  240. sub $s7, $t0, $s2
  241. load_gp_reg($s1, $s7, $s0)
  242. beq $s0, $s6, CWDiag2SkipReset
  243. li $s5, 0
  244. CWDiag2SkipReset:
  245. add $s6, $zero, $s0
  246. addi $s5, $s5, 1
  247. sge $t0, $s3, 4
  248. sne $t1, $s4, 0
  249. and $t0, $t0, $t1
  250. beq $t0, 1, CWFoundWin
  251. sge $t0, $s5, 4
  252. sne $t1, $s6, 0
  253. and $t0, $t0, $t1
  254. beq $t0, 1, CWFoundWin2
  255. addi $s1, $s1, 1
  256. addi $s2, $s2, 1
  257. slti $t0, $s1, 7
  258. slti $t1, $s2, 6
  259. and $t0, $t0, $t1
  260. beq $t0, 1, CWDiagonalLoop
  261. bge $s1, $s2, CWDiagonalLatterHalf # x >= y
  262. sub $s2, $s2, $s1 # y = y - x
  263. addi $s2, $s2, -1 # y--
  264. li $s1, 0 # x = 0
  265. j CWDiagonalChecks
  266. CWDiagonalLatterHalf:
  267. sub $s1, $s1, $s2 # x = x - y
  268. addi $s1, $s1, 1 # x++
  269. li $s2, 0 # y = 0
  270. CWDiagonalChecks:
  271. li $s3, 0
  272. li $s4, 0
  273. li $s5, 0
  274. li $s6, 0
  275. seq $t0, $s1, 4
  276. seq $t1, $s2, 0
  277. and $t0, $t0, $t1
  278. beq $t0, 1, CWDiagonalEnd
  279. j CWDiagonalLoop
  280. CWDiagonalEnd:
  281.  
  282. j CWFoundNoWin
  283. CWFoundWin:
  284. add $v0, $zero, $s4
  285. j CWEnd
  286. CWFoundWin2:
  287. add $v0, $zero, $s6
  288. j CWEnd
  289. CWFoundNoWin:
  290. li $v0, 0
  291. CWEnd:
  292. # Pop stack
  293. lw $ra, 0($sp)
  294. lw $s0, 4($sp)
  295. lw $s1, 8($sp)
  296. lw $s2, 12($sp)
  297. lw $s3, 16($sp)
  298. lw $s4, 20($sp)
  299. lw $s5, 24($sp)
  300. lw $s6, 28($sp)
  301. lw $s7, 32($sp)
  302. add $sp, $sp, 36
  303. .end_macro
  304.  
  305.  
  306.  
  307. main:
  308. setup_random
  309. PrintString("\n\nWelcome to Connect 4 the assembly game. Enter 0 to go first or 1 to go second: ")
  310. jal PlayOpeningSound
  311. ReadInteger()
  312. bgt $v0, $zero, enemy
  313. j user
  314.  
  315. enemy: #it is the AI's turn.
  316. jal AIMove
  317. move $s0, $v0
  318. move $s1, $v1
  319. bne $s0, -1, EnemyNotRandomAI
  320. bne $s1, -1, EnemyNotRandomAI
  321. EnemyRandomAI:
  322. GetAIPlaceMacro($s0)
  323. beq $s0, -1, EnemyRandomAI
  324. Place(2, $s0)
  325. j PlaceEnemyExit
  326. EnemyNotRandomAI:
  327. Place(2, $s0)
  328. PlaceEnemyExit:
  329. PrintString("Placing piece at ")
  330. PrintInteger($s0)
  331. PrintString(" ")
  332. PrintInteger($s1)
  333. PrintString("\n")
  334. PrintString("It is the AI's turn. They placed a piece at: ")
  335. PrintInteger($s0)
  336. PrintLine()
  337. jal draw_board
  338. CheckWin()
  339. bge $v0, 1, SomeoneWon
  340. j user
  341.  
  342. user: #it is the user's turn.
  343. PrintString("It is your turn. Enter a number from 1 to 7 to place your chip: ")
  344. ReadInteger()
  345. li $t1, 1
  346. slt $t0, $v0, $t1
  347. bne $t0, $zero, user
  348. li $t1, 8
  349. slt $t0, $v0, $t1
  350. beq $t0, $zero, user
  351. addi $v0, $v0, -1
  352. Place(1,$v0)
  353. beq $v0, -1, user
  354. jal draw_board
  355. CheckWin()
  356. bge $v0, 1, SomeoneWon
  357. j enemy
  358.  
  359. SomeoneWon:
  360. beq $v0, 2, AIWon
  361. PlayerWon:
  362. PrintString("Congratulations, you won!")
  363. jal PlayWinningSound
  364. exit_prog
  365. AIWon:
  366. PrintString("Sorry, you lost.")
  367. jal PlayLosingSound
  368. exit_prog
  369.  
  370. .macro print_stored_int (%label) #Used to simplify output and make code look cleaner
  371. li $v0, 1 #Let syscall know we want to print an int
  372. la $t0, %label #Load the address of %label
  373. lw $a0, ($t0) #Load the int that %label points to
  374. syscall #Print the loaded int
  375. .end_macro #End print_stored_int macro
  376.  
  377. .macro print_int(%reg)
  378. add $a0, %reg, $zero
  379. li $v0, 1 #Let syscall know we want to print an int
  380. syscall
  381. .end_macro
  382.  
  383. .macro store_gp(%x, %y, %value)
  384. addi $a0, $zero, %x
  385. addi $a1, $zero, %y
  386. addi $a2, $zero, %value
  387. jal store_game_piece
  388. .end_macro
  389.  
  390. .macro load_gp(%x, %y, %where)
  391. addi $a0, $zero, %x
  392. addi $a1, $zero, %y
  393. jal load_game_piece
  394. add %where, $v0, $zero
  395. .end_macro
  396.  
  397. .macro store_gp_reg(%x, %y, %value)
  398. add $a0, $zero, %x
  399. add $a1, $zero, %y
  400. add $a2, $zero, %value
  401. jal store_game_piece
  402. .end_macro
  403.  
  404.  
  405. draw_board:
  406. add $sp, $sp, -20
  407. sw $ra, 0($sp)
  408. sw $s0, 4($sp)
  409. sw $s1, 8($sp)
  410. sw $s2, 12($sp)
  411. sw $s3, 16($sp)
  412. addi $s0, $zero, 6 #y value max
  413. addi $s1, $zero, 7 #x value max
  414. addi $s2, $zero, 0 #y value
  415. addi $s3, $zero, 0 #x value
  416. li $t0, 0
  417. DrawBoardNumbersLoop: # Number header
  418. addi $t0, $t0, 1
  419. Print(boardSpaceOutput)
  420. print_int($t0)
  421. blt $t0, $s1, DrawBoardNumbersLoop
  422. PrintLine()
  423. draw_board_loop_y:
  424. bge $s2, $s0, draw_board_return
  425. Print(board_edge_output)
  426. addi $s3, $zero, 0 #x value
  427. draw_board_loop_x:
  428. bge $s3, $s1, draw_board_loop_x_exit
  429. addi $t3, $zero, 5
  430. sub $t2, $t3, $s2
  431. load_gp_reg($s3,$t2,$t0)
  432. beq $t0, 0, draw_board_empty
  433. beq $t0, 1, draw_board_x
  434. beq $t0, 2, draw_board_o
  435. j draw_board_error
  436. draw_board_loop_return:
  437. addi $s3, $s3, 1
  438. j draw_board_loop_x
  439. draw_board_loop_x_exit:
  440. addi $s2, $s2, 1
  441. PrintLine()
  442. j draw_board_loop_y
  443.  
  444. draw_board_return:
  445. lw $ra, 0($sp)
  446. lw $s0, 4($sp)
  447. lw $s1, 8($sp)
  448. lw $s2, 12($sp)
  449. lw $s3, 16($sp)
  450. add $sp, $sp, 20 #Pop stack
  451. jr $ra
  452.  
  453. #Board Draws
  454. draw_board_x:
  455. Print(board_X_output)
  456. j draw_board_loop_return
  457.  
  458. draw_board_o:
  459. Print(board_O_output)
  460. j draw_board_loop_return
  461.  
  462. draw_board_error:
  463. Print(board_error_output)
  464. j draw_board_loop_return
  465.  
  466. draw_board_empty:
  467. Print(board_empty_output)
  468. j draw_board_loop_return
  469. #Board Draws END
  470.  
  471.  
  472. #reset board
  473. #Resets all board values to 0x00
  474. reset_board:
  475. add $t0, $a0, $zero
  476. add $t1, $a1, $zero
  477. add $sp, $sp, -4
  478. sw $ra, 0($sp)
  479. li $t2, 0
  480. reset_board_loop:
  481. bge $t2, $t0, reset_board_exit
  482. add $t3, $t1, $t2
  483. sb $zero, 0($t3)
  484. add $t2, $t2, 1
  485. j reset_board_loop
  486. reset_board_exit:
  487. lw $ra, 0($sp)
  488. add $sp, $sp, 4
  489. jr $ra
  490.  
  491. #Save game piece
  492. #param($a0) : x position
  493. #param($a1) : y position
  494. #param($a2) : value to store
  495. #If an invalid position is given, will exit and print error message
  496. store_game_piece:
  497. add $sp, $sp, -4 #Push stack
  498. sw $ra, 0($sp)
  499. add $t0, $a0, $zero
  500. add $t1, $a1, $zero
  501. add $t2, $a2, $zero
  502. #error checking
  503. bge $t0, 7, save_game_piece_error
  504. bge $t1, 6, save_game_piece_error
  505. blt $t0, 0, save_game_piece_error
  506. blt $t1, 0, save_game_piece_error
  507. #error checking end
  508. li $t9, 7 #Place 7 for multiplacation factor
  509. mult $t1, $t9 #Multiply 7 * y value given
  510. mflo $t3 #Get multiplacation answer
  511. la $t4, board_data #grab board address
  512. add $t8, $t3, $t0 #add x to multiplacation answer
  513. add $t8, $t4, $t8 #add offset to board address
  514. sb $t2, 0($t8) #Store value given
  515. save_game_piece_return:
  516. lw $ra, 0($sp)
  517. add $sp, $sp, 4 #Pop stack
  518. jr $ra
  519. save_game_piece_error:
  520. Print(store_error_message)
  521. j save_game_piece_return
  522.  
  523.  
  524.  
  525.  
  526. #Load game piece
  527. #param($a0) : x position
  528. #param($a1) : y position
  529. #return($v0) : Either value stored in location or -1 if error
  530. load_game_piece:
  531. add $sp, $sp, -4
  532. sw $ra, 0($sp)
  533.  
  534. add $t0, $a0, $zero
  535. add $t1, $a1, $zero
  536. #error checking
  537. bge $t0, 7, load_game_piece_error
  538. bge $t1, 6, load_game_piece_error
  539. blt $t0, 0, load_game_piece_error
  540. blt $t1, 0, load_game_piece_error
  541. #error checking end
  542. li $t8, 7 #Place 7 for multiplacation factor
  543. mult $t1, $t8 #Multiply 7 * y value given
  544. mflo $t2 #Get multiplacation answer
  545. la $t3, board_data #grab board address
  546. add $t9, $t2, $t0 #add x to multiplacation answer
  547. add $t4, $t3, $t9 #add offset to board address
  548. lb $v0, 0($t4) #Load value in memory location
  549. load_game_piece_return:
  550. lw $ra, 0($sp)
  551. add $sp, $sp, 4 #Pop stack
  552. jr $ra
  553. load_game_piece_error:
  554. addi $v0, $zero, -1
  555. j load_game_piece_return
  556.  
  557.  
  558. #Get height
  559. GetHeight:
  560. addi $sp, $sp, -12
  561. sw $ra, 0($sp)
  562. sw $s0, 4($sp)
  563. sw $s1, 8($sp)
  564. add $s0, $zero, $a0
  565. add $s1, $zero, 5 #Down counter
  566. GetHeightLoop:
  567. beq $s1, -1, GetHeightReturn
  568. load_gp_reg($s0,$s1,$t0)
  569. bge $t0, 1, GetHeightReturn
  570. addi $s1, $s1, -1
  571. j GetHeightLoop
  572.  
  573.  
  574.  
  575. GetHeightReturn:
  576. addi $v0, $s1, 1
  577. lw $ra, 0($sp)
  578. lw $s0, 4($sp)
  579. lw $s1, 8($sp)
  580. addi $sp, $sp, 12
  581. jr $ra
  582.  
  583.  
  584.  
  585. PlacePiece:
  586. addi $sp, $sp, -16
  587. sw $ra, 0($sp)
  588. sw $s0, 4($sp)
  589. sw $s1, 8($sp)
  590. sw $s2, 12($sp)
  591. add $s0, $zero, $a0 #player
  592. add $s1, $zero, $a1 #Col
  593. add $s2, $zero, 5 #Down counter
  594. bge $s1, 7, PlacePieceError
  595. load_gp_reg($s1,$s2,$t0)
  596. bge $t0, 1, PlacePieceError
  597. addi $s2, $s2, -1
  598. PlacePieceLoop:
  599. beq $s2, -1, PlacePieceSucc
  600. load_gp_reg($s1,$s2,$t0)
  601. bge $t0, 1, PlacePieceSucc
  602. addi $s2, $s2, -1
  603. j PlacePieceLoop
  604.  
  605.  
  606. PlacePieceError:
  607. bne $s0, 1, PlacePieceErrorContinue # Only play sound if it's a player move.
  608. jal PlayNegativeSound
  609. PlacePieceErrorContinue:
  610. addi $v0, $zero, -1
  611. j PlacePieceReturn
  612.  
  613. PlacePieceSucc:
  614. bne $s0, 1, PlacePieceSuccContinue # Only play sound if it's a player move.
  615. jal PlayPositiveSound
  616. PlacePieceSuccContinue:
  617. addi $s2, $s2, 1
  618. store_gp_reg($s1,$s2,$s0)
  619. addi $v0, $zero, 1
  620. j PlacePieceReturn
  621.  
  622. PlacePieceReturn:
  623. lw $ra, 0($sp)
  624. lw $s0, 4($sp)
  625. lw $s1, 8($sp)
  626. lw $s2, 12($sp)
  627. addi $sp, $sp, 16
  628. jr $ra
  629.  
  630. # Sounds
  631.  
  632. .macro setUpSound
  633. li $a2, 114 # Instrument: steel drums
  634. li $a3, 63 # Volume: half
  635. .end_macro
  636.  
  637. .macro playSound(%note, %duration, %isSyncronous)
  638. li $v0, 31
  639. li $t0, %isSyncronous
  640. sll $t0, $t0, 1
  641. add $v0, $v0, $t0
  642. li $a0, %note
  643. li $a1, %duration
  644. syscall
  645. .end_macro
  646.  
  647. PlayOpeningSound:
  648. setUpSound
  649. playSound(72, 100, 1) # C for 0.1 sec
  650. playSound(76, 100, 1) # E for 0.1 sec
  651. playSound(79, 800, 0) # G for 0.8 sec
  652. jr $ra
  653.  
  654. PlayPositiveSound:
  655. setUpSound
  656. playSound(76, 1000, 0) # E for 1 sec
  657. jr $ra
  658.  
  659. PlayNegativeSound:
  660. setUpSound
  661. playSound(72, 1000, 0) # C and C# for 1 sec
  662. playSound(73, 1000, 0)
  663. jr $ra
  664.  
  665. PlayWinningSound:
  666. setUpSound
  667. playSound(79, 100, 1) # G for 0.1 sec
  668. playSound(79, 900, 0) # G for 0.9 sec
  669. jr $ra
  670.  
  671. PlayLosingSound:
  672. setUpSound
  673. playSound(75, 250, 1) # Eb for 0.25 sec
  674. playSound(74, 250, 1) # D for 0.25 sec
  675. playSound(72, 500, 0) # E for 0.5 sec
  676. jr $ra
  677.  
  678.  
  679.  
  680.  
  681.  
  682. AIMove:
  683. addi $sp, $sp, -28
  684. sw $ra, 0($sp)
  685. sw $s0, 4($sp)
  686. sw $s1, 8($sp)
  687. sw $s2, 12($sp)
  688. sw $s3, 16($sp)
  689. sw $s4, 20($sp)
  690. sw $s5, 24($sp)
  691. #Code Stuff
  692. li $s0, 0 #X variable
  693. AIMoveXLoop:
  694. li $s1, 0 #Y variable
  695. AIMoveYLoop:
  696. move $a0, $s0
  697. move $a1, $s1
  698. jal AICheckU
  699. bne $v0, -1, AIMoveReturn
  700. move $a0, $s0
  701. move $a1, $s1
  702. jal AICheckR
  703. bne $v0, -1, AIMoveReturn
  704. move $a0, $s0
  705. move $a1, $s1
  706. jal AICheckL
  707. bne $v0, -1, AIMoveReturn
  708. move $a0, $s0
  709. move $a1, $s1
  710. jal AICheckLU
  711. bne $v0, -1, AIMoveReturn
  712. addi $s1, $s1, 1
  713. blt $s1, 6, AIMoveYLoop
  714. addi $s0, $s0, 1
  715. blt $s0, 7, AIMoveXLoop
  716. li $v0, -1
  717. li $v1, -1
  718. j AIMoveReturn
  719.  
  720. AIMoveReturn:
  721. lw $ra, 0($sp)
  722. lw $s0, 4($sp)
  723. lw $s1, 8($sp)
  724. lw $s2, 12($sp)
  725. lw $s3, 16($sp)
  726. lw $s4, 20($sp)
  727. lw $s5, 24($sp)
  728. addi $sp, $sp, 28
  729. jr $ra
  730.  
  731.  
  732.  
  733.  
  734. #$a0 is x(index), $a1 is y(index)
  735. #$v0 is x in question
  736. #$v1 is y in question
  737. AICheckU:
  738. addi $sp, $sp, -16
  739. sw $ra, 0($sp)
  740. sw $s0, 4($sp)
  741. sw $s1, 8($sp)
  742. sw $s2, 12($sp)
  743. move $s0, $a0 #X
  744. move $s1, $a1 #y
  745. load_gp_reg($s0,$s1,$s2)
  746. bne $s2, 1, AICheckUReturnUnFlagged
  747. addi $s1,$s1,1
  748. load_gp_reg($s0,$s1,$s2)
  749. bne $s2, 1, AICheckUReturnUnFlagged
  750. addi $s1,$s1,1
  751. load_gp_reg($s0,$s1,$s2)
  752. beq $s2, 0, AICheckUReturnFlagged
  753. beq $s2, 2, AICheckUReturnUnFlagged
  754. addi $s1,$s1,1
  755. load_gp_reg($s0,$s1,$s2)
  756. beq $s2, 0, AICheckUReturnFlagged
  757. j AICheckUReturnUnFlagged
  758.  
  759.  
  760. AICheckUReturnFlagged:
  761. move $v0, $s0
  762. move $v1, $s1
  763. lw $ra, 0($sp)
  764. lw $s0, 4($sp)
  765. lw $s1, 8($sp)
  766. lw $s2, 12($sp)
  767. addi $sp, $sp, 16
  768. jr $ra
  769. AICheckUReturnUnFlagged:
  770. lw $ra, 0($sp)
  771. lw $s0, 4($sp)
  772. lw $s1, 8($sp)
  773. lw $s2, 12($sp)
  774. addi $sp, $sp, 16
  775. li $v0, -1
  776. li $v1, -1
  777. jr $ra
  778.  
  779. #$a0 is x(index), $a1 is y(index)
  780. #$v0 is x in question
  781. #$v1 is y in question
  782. AICheckR:
  783. addi $sp, $sp, -16
  784. sw $ra, 0($sp)
  785. sw $s0, 4($sp)
  786. sw $s1, 8($sp)
  787. sw $s2, 12($sp)
  788. move $s0, $a0 #X
  789. move $s1, $a1 #y
  790. load_gp_reg($s0,$s1,$s2)
  791. bne $s2, 1, AICheckRReturnUnFlagged
  792. addi $s0,$s0,1
  793. load_gp_reg($s0,$s1,$s2)
  794. bne $s2, 1, AICheckRReturnUnFlagged
  795. addi $s0,$s0,1
  796. load_gp_reg($s0,$s1,$s2)
  797. beq $s2, 0, AICheckRReturnFlagged
  798. beq $s2, 2, AICheckRReturnUnFlagged
  799. addi $s0,$s0,1
  800. load_gp_reg($s0,$s1,$s2)
  801. beq $s2, 0, AICheckRReturnFlagged
  802. j AICheckRReturnUnFlagged
  803.  
  804.  
  805. AICheckRReturnFlagged:
  806. getHeightMac($s0,$t0)
  807. bne $s1, $t0, AICheckRReturnUnFlagged
  808. move $v0, $s0
  809. move $v1, $s1
  810. lw $ra, 0($sp)
  811. lw $s0, 4($sp)
  812. lw $s1, 8($sp)
  813. lw $s2, 12($sp)
  814. addi $sp, $sp, 16
  815. jr $ra
  816. AICheckRReturnUnFlagged:
  817. lw $ra, 0($sp)
  818. lw $s0, 4($sp)
  819. lw $s1, 8($sp)
  820. lw $s2, 12($sp)
  821. addi $sp, $sp, 16
  822. li $v0, -1
  823. li $v1, -1
  824. jr $ra
  825.  
  826.  
  827. #$a0 is x(index), $a1 is y(index)
  828. #$v0 is x in question
  829. #$v1 is y in question
  830. AICheckL:
  831. addi $sp, $sp, -16
  832. sw $ra, 0($sp)
  833. sw $s0, 4($sp)
  834. sw $s1, 8($sp)
  835. sw $s2, 12($sp)
  836. move $s0, $a0 #X
  837. move $s1, $a1 #y
  838. load_gp_reg($s0,$s1,$s2)
  839. PrintInteger($s2)
  840. bne $s2, 1, AICheckLReturnUnFlagged
  841. PrintString("R Test\n")
  842. addi $s0,$s0,-1
  843. load_gp_reg($s0,$s1,$s2)
  844. bne $s2, 1, AICheckLReturnUnFlagged
  845. addi $s0,$s0,-1
  846. load_gp_reg($s0,$s1,$s2)
  847. beq $s2, 0, AICheckLReturnFlagged
  848. beq $s2, 2, AICheckLReturnUnFlagged
  849. addi $s0,$s0,-1
  850. load_gp_reg($s0,$s1,$s2)
  851. beq $s2, 0, AICheckLReturnFlagged
  852. j AICheckLReturnUnFlagged
  853.  
  854.  
  855. AICheckLReturnFlagged:
  856. getHeightMac($s0,$t0)
  857. PrintString("Found Thingy\n")
  858. bne $s1, $t0, AICheckLReturnUnFlagged
  859. PrintString("Found Thingy OH NOOOOOO\n")
  860. move $v0, $s0
  861. move $v1, $s1
  862. lw $ra, 0($sp)
  863. lw $s0, 4($sp)
  864. lw $s1, 8($sp)
  865. lw $s2, 12($sp)
  866. addi $sp, $sp, 16
  867. jr $ra
  868. AICheckLReturnUnFlagged:
  869. lw $ra, 0($sp)
  870. lw $s0, 4($sp)
  871. lw $s1, 8($sp)
  872. lw $s2, 12($sp)
  873. addi $sp, $sp, 16
  874. li $v0, -1
  875. li $v1, -1
  876. jr $ra
  877.  
  878.  
  879.  
  880. AICheckLU:
  881. addi $sp, $sp, -16
  882. sw $ra, 0($sp)
  883. sw $s0, 4($sp)
  884. sw $s1, 8($sp)
  885. sw $s2, 12($sp)
  886. move $s0, $a0 #X
  887. move $s1, $a1 #y
  888. load_gp_reg($s0,$s1,$s2)
  889. PrintInteger($s2)
  890. bne $s2, 1, AICheckLUReturnUnFlagged
  891. PrintString("R Test\n")
  892. addi $s0,$s0,-1
  893. addi $s1,$s1, 1
  894. load_gp_reg($s0,$s1,$s2)
  895. bne $s2, 1, AICheckLUReturnUnFlagged
  896. addi $s0,$s0,-1
  897. addi $s1,$s1, 1
  898. load_gp_reg($s0,$s1,$s2)
  899. beq $s2, 0, AICheckLUReturnFlagged
  900. beq $s2, 2, AICheckLUReturnUnFlagged
  901. addi $s0,$s0,-1
  902. addi $s1,$s1, 1
  903. load_gp_reg($s0,$s1,$s2)
  904. beq $s2, 0, AICheckLUReturnFlagged
  905. j AICheckLUReturnUnFlagged
  906.  
  907.  
  908. AICheckLUReturnFlagged:
  909. getHeightMac($s0,$t0)
  910. PrintString("Found Thingy\n")
  911. bne $s1, $t0, AICheckLUReturnUnFlagged
  912. PrintString("Found Thingy OH NOOOOOO\n")
  913. move $v0, $s0
  914. move $v1, $s1
  915. lw $ra, 0($sp)
  916. lw $s0, 4($sp)
  917. lw $s1, 8($sp)
  918. lw $s2, 12($sp)
  919. addi $sp, $sp, 16
  920. jr $ra
  921. AICheckLUReturnUnFlagged:
  922. lw $ra, 0($sp)
  923. lw $s0, 4($sp)
  924. lw $s1, 8($sp)
  925. lw $s2, 12($sp)
  926. addi $sp, $sp, 16
  927. li $v0, -1
  928. li $v1, -1
  929. jr $ra
  930.  
  931.  
  932.  
  933.  
  934.  
  935. AIMoveOld: #returns the column that the ai wants to drop the piece in at $v0.
  936. addi $sp, $sp, -28
  937. sw $ra, 0($sp)
  938. sw $s0, 4($sp)
  939. sw $s1, 8($sp)
  940. sw $s2, 12($sp)
  941. sw $s3, 16($sp)
  942. sw $s4, 20($sp)
  943. sw $s5, 24($sp)
  944. li $s1, 0 #i=0
  945. fori: bgt $s1, 5, efori #i<rows
  946. li $s2, 0 #j=0
  947. forj: bgt $s2, 6, eforj #j<columns
  948. li $s3, 0 #vi=0
  949. forvi: bgt $s3, 1, eforvi #vi<2
  950. li $s4, 0 #vj=0
  951. forvj: bgt $s4, 1, eforvj #vj<2
  952. bne $s3, 0, and99 #if(vj!=0 | vi!=0)
  953. bne $s4, 0, and99
  954. j eforv
  955. and99:
  956. li $s0, 0 #counter = 0
  957. li $s5, 0 #v=0
  958. forv: bgt $s5, 3, eforv #v<4
  959. mul $t1, $s3, $s5 #v*vi
  960. mul $t2, $s4, $s5 #v*vj
  961. add $t1, $s1, $t1 #i+v*vi
  962. add $t2, $s2, $t2 #j+v*vj
  963. #j eif98
  964. load_gp_reg($t1,$t2,$t3) #ID = pieces[i+v*vi,j+v*vj]
  965. beq $t3, 1, if99 #if(ID==1)
  966. li $s0, 0 #false: counter = 0
  967. j eif99
  968. if99: addi $s0, $s0, 1 #true: counter++
  969. eif99: blt $s0, 2, eif98 #if(counter >= 2){
  970. addi $v0, $t2, 0 #return j+(v+1)*vj
  971. j return9
  972. addi $t3, $s5, 1 #v+1
  973. mul $t1, $s3, $t3 #(v+1)*vi
  974. mul $t2, $s4, $t3 #(v+1)*vj
  975. add $s7, $s1, $t1 #i+(v+1)*vi
  976. add $s6, $s2, $t2 #j+(v+1)*vj
  977. addi $s6, $s6, 1
  978. getHeightMac($s6,$t3) #height(j+(v+1)*vj)
  979. addi $s6, $s6, -2
  980. bne, $t3, $s7, eif97 #if(height(j+(v+1)*vj)==i+(v+1)*vi){
  981. PrintString("detected an attempt to win")
  982. PrintInteger($s6)
  983. PrintLine()
  984. addi $v0, $s6, 0 #return j+(v+1)*vj
  985. j return9 #}
  986. eif97: sub $t3, $s5, $s0 #v-counter
  987. mul $t1, $s3, $t3 #(v-counter)*vi
  988. mul $t2, $s4, $t3 #(v-counter)*vj
  989. add $s7, $s1, $t1 #i+(v-counter)*vi
  990. add $s6, $s2, $t2 #j+(v-counter)*vj
  991. addi $s6, $s6, 1
  992. getHeightMac($s6,$t3) #height(j+(v-counter)*vj)
  993. addi $s6, $s6, -2
  994. bne, $t3, $s7, eif98 #if(height(j+(v-counter)*vj)==i+(v-counter)*vi){
  995. PrintString("detected an attempt to win")
  996. PrintInteger($s6)
  997. PrintLine()
  998. addi $v0, $s6, 0 #return j+(v-counter)*vj
  999. j return9
  1000. eif98: #}}
  1001. addi $s5, $s5, 1 #v++
  1002. j forv
  1003. eforv:
  1004. addi $s4, $s4, 1 #vj++
  1005. j forvj
  1006. eforvj:
  1007. addi $s3, $s3, 1 #vi++
  1008. j forvi
  1009. eforvi:
  1010. addi $s2, $s2, 1 #j++
  1011. j forj
  1012. eforj:
  1013. addi $s1, $s1, 1 #i++
  1014. j fori
  1015. efori: li $v0, 3 #if nothing interesting is found, drop in center
  1016. return9:lw $ra, 0($sp)
  1017. lw $s0, 4($sp)
  1018. lw $s1, 8($sp)
  1019. lw $s2, 12($sp)
  1020. lw $s3, 16($sp)
  1021. lw $s4, 20($sp)
  1022. lw $s5, 24($sp)
  1023. addi $sp, $sp, 28
  1024. jr $ra
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement