; tictactoe.s ; By Chris Aubut (psyba.ppc@gmail.com) ; Remove .txt suffix ; Make with "gcc -faltivec tictactoe.S -o tictactoe" ; Run with "./tictactoe" .data .align 4 _win_states: .short 0x01C0 .short 0x0038 .short 0x0007 .short 0x0124 .short 0x0092 .short 0x0049 .short 0x0111 .short 0x0054 .align 2 _board_string: .ascii " | | \n---|---|---\n | | \n---|---|---\n | | \n\n" .align 2 _win_string: .ascii " wins the game.\n\n" .align 2 _nowin_string: .ascii "Nobody wins the game.\n\n" .align 2 .text .globl _main _main: ; Temp Registers #define t0 r20 #define t1 r21 #define t2 r22 #define t3 r23 #define t4 r24 #define vt0 v20 #define vt1 v21 #define vt2 v22 #define vt3 v23 #define vt4 v24 ; Taken Pieces Registers #define v_xo_pieces v0 #define v_ox_pieces v1 vxor v_xo_pieces, v_xo_pieces, v_xo_pieces vxor v_ox_pieces, v_ox_pieces, v_ox_pieces ; Win States Register #define v_win_states v2 lis t0, hi16(_win_states) ori t0, t0, lo16(_win_states) xor t1, t1, t1 lvx v_win_states, t0, t1 ; Board String Pointer #define r_board_string_ptr r30 lis r_board_string_ptr, hi16(_board_string) ori r_board_string_ptr, r_board_string_ptr, lo16(_board_string) ; Row and Column Input Registers #define r_row r25 #define r_col r26 ; Loop Counter Register li t0, 9 mtctr t0 ; ASCII 'x' & 'o' #define r_ox r28 #define r_xo r29 li r_ox, 120 li r_xo, 111 ; VRSAVE li t0, -1 mtspr 256, t0 _play: ; Place Move mftb t1 li t2, 3 divwu r_row, t1, t2 mullw r_row, r_row, t2 subf r_row, r_row, t1 mftb t1 li t2, 3 divwu r_col, t1, t2 mullw r_col, r_col, t2 subf r_col, r_col, t1 ; Put play on Pieces Register mulli t0, r_row, 3 add t0, t0, r_col cmpi cr7, t0, 8 beq cr7, _eq_8 ; All but (2, 2) vspltish vt0, 1 addi t0, t0, 1 lvsl vt1, 0, t0 b _cont ; (2, 2) _eq_8: lvsl vt1, 0, t0 vspltish vt0, 2 _cont: vsl vt0, vt0, vt1 ; Check if unqiue move first vor vt2, v_xo_pieces, v_ox_pieces vor vt3, vt0, vt2 vcmpequh. vt4, vt2, vt3 bc 12, 24, _play vor v_xo_pieces, v_xo_pieces, vt0 ; Put Play on Board String mulli t0, r_row, 23 slwi t1, r_col, 2 addi t1, t1, 1 add t2, t0, t1 add t2, t2, r_board_string_ptr stb r_ox, 0(t2) ; Print Board String li r0, 4 li r3, 1 addi r4, r_board_string_ptr, 0 li r5, 58 sc nop ; Check Win vand vt0, v_xo_pieces, v_win_states vcmpequh. vt1, vt0, v_win_states bc 4, 26, _win ; Swap Pieces Registers vxor v_xo_pieces, v_xo_pieces, v_ox_pieces vxor v_ox_pieces, v_ox_pieces, v_xo_pieces vxor v_xo_pieces, v_xo_pieces, v_ox_pieces ; Swap ASCII 'x' & 'o' xor r_ox, r_ox, r_xo xor r_xo, r_xo, r_ox xor r_ox, r_ox, r_xo bdnz _play ; Print no win message lis t0, hi16(_nowin_string) ori t0, t0, lo16(_nowin_string) li r0, 4 li r3, 1 addi r4, t0, 0 li r5, 23 sc nop li r3, 0 blr _win: ; Print winning message lis t0, hi16(_win_string) ori t0, t0, lo16(_win_string) stb r_ox, 0(t0) li r0, 4 li r3, 1 addi r4, t0, 0 li r5, 18 sc nop li r3, 0 blr