Arquitetura de Computadores – Jogo da Velha

@Tic-Tac-Toe

.global _start
.text
@constantes
.equ SWI_SETSEG8, 0x200 @display on 8 Segment
.equ SEG_A, 0x80 @padrao display de 8 segmentos
.equ SEG_B, 0x40 @valores em byte para cada segmento
.equ SEG_C, 0x20 @no display de 8 segmentos
.equ SEG_D, 0x08
.equ SEG_E, 0x04
.equ SEG_F, 0x02
.equ SEG_G, 0x01
.equ SEG_P, 0x10 @ponto

@ definicao de constantes
.equ SWI_PrintString, 0x02 @ escreve uma string
.equ SWI_PrInt, 0x6b @ escreve um inteiro
.equ SWI_PrChr, 0x00 @ Display Character on Stdout
.equ Stdout, 1 @ Seta o modo de saida para visao de saida
.equ SWI_Open, 0x66 @ Open File (mode values in r1 are: 0 for input, 1 for output, 2 for appending)
.equ SWI_Close, 0x68 @ Close File
.equ SWI_PrStr, 0x69 @ Write String to a File or to Stdout
.equ SWI_RdStr, 0x6a @ Read String from a File
.equ SWI_PrInt, 0x6b @ Write Integer to a File
.equ SWI_RdInt, 0x6c @ Read Integer from a File
.equ SWI_Timer, 0x6d @ Get the current time (ticks)
.equ SWI_LCD, 0x204 @ Display LCD (r0: x position coordinate on the LCD screen (0‐39);
@ r1: y position coordinate on the LCD screen (0‐14);
@ r2: Address of a null ter‐ minated ASCII string.
@ Note: (x,y) = (0,0) is the top left and (0,14) is the bottom left.
@ The display is limited to 40 characters per line.
.equ SWI_LCDClear, 0x206 @ Blank LCD screen.
.equ SWI_LCDClearLine, 0x208 @ Clear one line in the display on the LCD screen
@ r0: line number (y coordinate) on the LCD screen
.equ SWI_LCDInt, 0x205 @r0: x position coordinate on the LCD screen (0‐39);
@r1: y position coordinate on the LCD screen (0‐14);
@r2: integer to print.
.equ SWI_LCDChar, 0x207 @r0: print char.
.equ SWI_Exit, 0x11 @ Halt Execution
.equ SWI_BlackButtons, 0x202 @ verifica se um dos botoes pretos foi pressionado
@cmp r0,#0x02 @botao da esquerda acionado
@cmp r0,#0x01 @botao da direita acionado
.equ SWI_BlueButtons, 0x203 @ verifica se um dos botoes azuis foi pressionado
@cmp r0,#0x01 @botao (1) – binario 00000001 (0 binário – 0 hexadecimal)
@cmp r0,#0x02 @botao (2) – binario 00000010 (2 binário – 2 hexadecimal)
.equ SWI_DisplayLeds, 0x201 @ Acende leds vermelhos
@mov r0,#0x01 @Direita
@mov r0,#0x02 @Esquerda
_start: @inicio

@Desenha titulo
mov r0,#15
mov r1,#0
ldr r2,=Titulo
swi SWI_LCD

ldr r8,=Positions

@Desenha o tabuleiro
ldr r2,=xline;
mov r0,#0
mov r1,#2
swi 0x204
mov r1,#5
swi 0x204
mov r1,#8
swi 0x204
mov r1,#11
swi 0x204

mov r3,#2
pl: mov r4,#0
pinlp: mov r0,r4
mov r1,r3
ldr r2,=yline
swi 0x204
add r4,r4,#9
cmp r4,#36
bne pinlp
add r3,r3,#1
cmp r3,#12
bne pl

mov r3,#0
mov r6,#0
@ Primeiro Jogador Começa
mov r9,#’2 @Variável do jogador 1
BL changePlayer

loopbottonblue: @acionar botao 7 com ponto ou 8 sem ponto
swi SWI_BlueButtons @ verifica se um dos botoes azuis foi pressionado

cmp r0,#0x01 @botao (1) – binario 00000001 (0 binário – 0 hexadecimal)
beq ActOnBlue1 @ir para o label “ActOnblue1”
cmp r0,#0x02 @botao (2) – binario 00000010 (2 binário – 2 hexadecimal)
beq ActOnBlue2 @ir para o label “ActOnblue2”
cmp r0,#0x04 @botao (3) – binario 00000100 (4 binário – 4 hexadecimal)
beq ActOnBlue3 @ir para o label “ActOnblue3”

cmp r0,#0x10 @botao (5) – binario 00010000 (16 binário – 1A hexadecimal)
beq ActOnBlue4 @ir para o label “ActOnblue4”
cmp r0,#0x20 @botao (6) – binario 00100000 (32 binário – 20 hexadecimal)
beq ActOnBlue5 @ir para o label “ActOnblue5”
cmp r0,#0x40 @botao (7) – binario 01000000 (64 binário – 40 hexadecimal)
beq ActOnBlue6 @ir para o label “ActOnblue6”

cmp r0,#0x100 @botao (9) – binario 1 0000 0000 (256 binário – 100 hexadecimal)
beq ActOnBlue7 @ir para o label “ActOnblue7”
cmp r0,#0x200 @botao (10) – binario 10 0000 0000 (512 binário – 200 hexadecimal)
beq ActOnBlue8 @ir para o label “ActOnblue8”
cmp r0,#0x400 @botao (11) – binario 100 0000 0000 (1024 binário – 400 hexadecimal)
beq ActOnBlue9 @ir para o label “ActOnblue9”

bal loopbottonblue
ActOnBlue1: @Botao 1 acionado
BL ClearWrongMove
LDRB R4,[R8,#0] @pega o valor da posição do botao
cmp R4,#’0 @está vazio
mov r3,#0
beq stradd1
BL WrongMove @Avisa que a jogada é inválida

mov R3,#0
stradd1:
LDRB R4,[R8,R3]
cmp R3,#0
beq setMove1
bal sameMove1
setMove1:
mov R4,R9
sameMove1:
STRB R4,[R8,R3]

ADD R3,R3,#1
CMP R3,#9
BNE stradd1 ;keep adding chars

mov R0,R8
swi SWI_PrintString @escrever no stdout
ldr r0,=newline ; endereco da mensagem
swi SWI_PrintString @escrever no stdout
MOV R3,#0
LDRB R3,[R8,R3]
cmp R3,#’1
beq Move11
cmp R3,#’2
beq Move12
volta1:

CheckWinner1:
LDRB R4,[R8,#1] @pega o valor da 2
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner1a
bal CheckWinner1b
CheckWinner1a:
LDRB R4,[R8,#2] @pega o valor da 3
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma
CheckWinner1b:
LDRB R4,[R8,#4] @pega o valor da 5
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner1b1
bal CheckWinner1c
CheckWinner1b1:
LDRB R4,[R8,#8] @pega o valor da 9
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma
CheckWinner1c:
LDRB R4,[R8,#3] @pega o valor da 4
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner1c
bal CheckWinnerEnd1
CheckWinner1c1:
LDRB R4,[R8,#6] @pega o valor da 7
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma

CheckWinnerEnd1:
add r6,r6,#1
cmp r6,#9
beq empate

BL changePlayer
bal loopbottonblue

ActOnBlue2: @Botao 2 acionado
BL ClearWrongMove
LDRB R4,[R8,#1] @pega o valor da posição do botao
cmp R4,#’0 @está vazio
mov R3,#0
beq stradd2 @Coloca a jogada
BL WrongMove @Avisa que a jogada é inválida

mov R3,#0
stradd2:
LDRB R4,[R8,R3]
cmp R3,#1
beq setMove2
bal sameMove2
setMove2:
mov R4,R9
sameMove2:
STRB R4,[R8,R3]

ADD R3,R3,#1
CMP R3,#9
BNE stradd2 ;keep adding chars

mov R0,R8
swi SWI_PrintString @escrever no stdout
ldr r0,=newline ; endereco da mensagem
swi SWI_PrintString @escrever no stdout
MOV R3,#1
LDRB R3,[R8,R3]
cmp R3,#’1
beq Move21
cmp R3,#’2
beq Move22
volta2:

CheckWinner2:
LDRB R4,[R8,#0] @pega o valor da 1
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner2a
bal CheckWinner2b
CheckWinner2a:
LDRB R4,[R8,#2] @pega o valor da 3
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma
CheckWinner2b:
LDRB R4,[R8,#4] @pega o valor da 5
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner2b1
bal CheckWinnerEnd2
CheckWinner2b1:
LDRB R4,[R8,#7] @pega o valor da 8
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma

CheckWinnerEnd2:
add r6,r6,#1
cmp r6,#9
beq empate

BL changePlayer
bal loopbottonblue

ActOnBlue3: @Botao 3 acionado
BL ClearWrongMove
LDRB R4,[R8,#2] @pega o valor da posição do botao
cmp R4,#’0 @está vazio
mov R3,#0
beq stradd3 @Coloca a jogada
BL WrongMove @Avisa que a jogada é inválida

mov R3,#0
stradd3:
LDRB R4,[R8,R3]
cmp R3,#2
beq setMove3
bal sameMove3
setMove3:
mov R4,R9
sameMove3:
STRB R4,[R8,R3]

ADD R3,R3,#1
CMP R3,#9
BNE stradd3 ;keep adding chars

mov R0,R8
swi SWI_PrintString @escrever no stdout
ldr r0,=newline ; endereco da mensagem
swi SWI_PrintString @escrever no stdout
MOV R3,#2
LDRB R3,[R8,R3]
cmp R3,#’1
beq Move31
cmp R3,#’2
beq Move32
volta3:

CheckWinner3:
LDRB R4,[R8,#1] @pega o valor da 2
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner3a
bal CheckWinner3b
CheckWinner3a:
LDRB R4,[R8,#0] @pega o valor da 1
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma
CheckWinner3b:
LDRB R4,[R8,#4] @pega o valor da 5
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner3b1
bal CheckWinner3c
CheckWinner3b1:
LDRB R4,[R8,#6] @pega o valor da 7
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma
CheckWinner3c:
LDRB R4,[R8,#5] @pega o valor da 6
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner3c1
bal CheckWinnerEnd3
CheckWinner3c1:
LDRB R4,[R8,#8] @pega o valor da 9
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma

CheckWinnerEnd3:
add r6,r6,#1
cmp r6,#9
beq empate

BL changePlayer
bal loopbottonblue

ActOnBlue4: @Botao 4 acionado
BL ClearWrongMove
LDRB R4,[R8,#3] @pega o valor da posição do botao
cmp R4,#’0 @está vazio
mov R3,#0
beq stradd4 @Coloca a jogada
BL WrongMove @Avisa que a jogada é inválida

mov R3,#0
stradd4:
LDRB R4,[R8,R3]
cmp R3,#3
beq setMove4
bal sameMove4
setMove4:
mov R4,R9
sameMove4:
STRB R4,[R8,R3]

ADD R3,R3,#1
CMP R3,#9
BNE stradd4 ;keep adding chars

mov R0,R8
swi SWI_PrintString @escrever no stdout
ldr r0,=newline ; endereco da mensagem
swi SWI_PrintString @escrever no stdout
MOV R3,#3
LDRB R3,[R8,R3]
cmp R3,#’1
beq Move41
cmp R3,#’2
beq Move42
volta4:

CheckWinner4:
LDRB R4,[R8,#0] @pega o valor da 1
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner4a
bal CheckWinner4b
CheckWinner4a:
LDRB R4,[R8,#6] @pega o valor da 7
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma
CheckWinner4b:
LDRB R4,[R8,#4] @pega o valor da 5
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner4b1
bal CheckWinnerEnd4
CheckWinner4b1:
LDRB R4,[R8,#5] @pega o valor da 6
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma

CheckWinnerEnd4:
add r6,r6,#1
cmp r6,#9
beq empate

BL changePlayer
bal loopbottonblue

ActOnBlue5: @Botao 5 acionado
BL ClearWrongMove
LDRB R4,[R8,#4] @pega o valor da posição do botao
cmp R4,#’0 @está vazio
mov R3,#0
beq stradd5 @Coloca a jogada
BL WrongMove @Avisa que a jogada é inválida

mov R3,#0
stradd5:
LDRB R4,[R8,R3]
cmp R3,#4
beq setMove5
bal sameMove5
setMove5:
mov R4,R9
sameMove5:
STRB R4,[R8,R3]

ADD R3,R3,#1
CMP R3,#9
BNE stradd5 ;keep adding chars

mov R0,R8
swi SWI_PrintString @escrever no stdout
ldr r0,=newline ; endereco da mensagem
swi SWI_PrintString @escrever no stdout
MOV R3,#4
LDRB R3,[R8,R3]
cmp R3,#’1
beq Move51
cmp R3,#’2
beq Move52
volta5:

CheckWinner5:
LDRB R4,[R8,#7] @pega o valor da 8
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner5a
bal CheckWinner5b
CheckWinner5a:
LDRB R4,[R8,#1] @pega o valor da 2
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma
CheckWinner5b:
LDRB R4,[R8,#3] @pega o valor da 4
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner5b1
bal CheckWinner5c
CheckWinner5b1:
LDRB R4,[R8,#5] @pega o valor da 6
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma
CheckWinner5c:
LDRB R4,[R8,#0] @pega o valor da 1
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner5c1
bal CheckWinner5d
CheckWinner5c1:
LDRB R4,[R8,#8] @pega o valor da 9
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma
CheckWinner5d:
LDRB R4,[R8,#2] @pega o valor da 3
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner5d1
bal CheckWinnerEnd5
CheckWinner5d1:
LDRB R4,[R8,#6] @pega o valor da 7
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma

CheckWinnerEnd5:
add r6,r6,#1
cmp r6,#9
beq empate

BL changePlayer
bal loopbottonblue

ActOnBlue6: @Botao 6 acionado
BL ClearWrongMove
LDRB R4,[R8,#5] @pega o valor da posição do botao
cmp R4,#’0 @está vazio
mov R3,#0
beq stradd6 @Coloca a jogada
BL WrongMove @Avisa que a jogada é inválida

mov R3,#0
stradd6:
LDRB R4,[R8,R3]
cmp R3,#5
beq setMove6
bal sameMove6
setMove6:
mov R4,R9
sameMove6:
STRB R4,[R8,R3]

ADD R3,R3,#1
CMP R3,#9
BNE stradd6 ;keep adding chars

mov R0,R8
swi SWI_PrintString @escrever no stdout
ldr r0,=newline ; endereco da mensagem
swi SWI_PrintString @escrever no stdout
MOV R3,#5
LDRB R3,[R8,R3]
cmp R3,#’1
beq Move61
cmp R3,#’2
beq Move62
volta6:

CheckWinner6:
LDRB R4,[R8,#2] @pega o valor da 3
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner6a
bal CheckWinner6b
CheckWinner6a:
LDRB R4,[R8,#8] @pega o valor da 9
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma
CheckWinner6b:
LDRB R4,[R8,#4] @pega o valor da 5
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner6b1
bal CheckWinnerEnd6
CheckWinner6b1:
LDRB R4,[R8,#3] @pega o valor da 4
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma

CheckWinnerEnd6:
add r6,r6,#1
cmp r6,#9
beq empate

BL changePlayer
bal loopbottonblue

ActOnBlue7: @Botao 7 acionado
BL ClearWrongMove
LDRB R4,[R8,#6] @pega o valor da posição do botao
cmp R4,#’0 @está vazio
mov R3,#0
beq stradd7 @Coloca a jogada
BL WrongMove @Avisa que a jogada é inválida

mov R3,#0
stradd7:
LDRB R4,[R8,R3]
cmp R3,#6
beq setMove7
bal sameMove7
setMove7:
mov R4,R9
sameMove7:
STRB R4,[R8,R3]

ADD R3,R3,#1
CMP R3,#9
BNE stradd7 ;keep adding chars

mov R0,R8
swi SWI_PrintString @escrever no stdout
ldr r0,=newline ; endereco da mensagem
swi SWI_PrintString @escrever no stdout
MOV R3,#6
LDRB R3,[R8,R3]
cmp R3,#’1
beq Move71
cmp R3,#’2
beq Move72
volta7:

CheckWinner7:
LDRB R4,[R8,#7] @pega o valor da 8
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner7a
bal CheckWinner7b
CheckWinner7a:
LDRB R4,[R8,#8] @pega o valor da 9
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma
CheckWinner7b:
LDRB R4,[R8,#4] @pega o valor da 5
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner7b1
bal CheckWinner7c
CheckWinner7b1:
LDRB R4,[R8,#2] @pega o valor da 3
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma
CheckWinner7c:
LDRB R4,[R8,#3] @pega o valor da 4
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner7c1
bal CheckWinnerEnd7
CheckWinner7c1:
LDRB R4,[R8,#0] @pega o valor da 1
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma

CheckWinnerEnd7:
add r6,r6,#1
cmp r6,#9
beq empate

BL changePlayer
bal loopbottonblue

ActOnBlue8: @Botao 8 acionado
BL ClearWrongMove
LDRB R4,[R8,#7] @pega o valor da posição do botao
cmp R4,#’0 @está vazio
mov R3,#0
beq stradd8 @Coloca a jogada
BL WrongMove @Avisa que a jogada é inválida

mov R3,#0
stradd8:
LDRB R4,[R8,R3]
cmp R3,#7
beq setMove8
bal sameMove8
setMove8:
mov R4,R9
sameMove8:
STRB R4,[R8,R3]

ADD R3,R3,#1
CMP R3,#9
BNE stradd8 ;keep adding chars

mov R0,R8
swi SWI_PrintString @escrever no stdout
ldr r0,=newline ; endereco da mensagem
swi SWI_PrintString @escrever no stdout
MOV R3,#7
LDRB R3,[R8,R3]
cmp R3,#’1
beq Move81
cmp R3,#’2
beq Move82
volta8:

CheckWinner8:
LDRB R4,[R8,#6] @pega o valor da 7
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner8a
bal CheckWinner8b
CheckWinner8a:
LDRB R4,[R8,#8] @pega o valor da 8
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma
CheckWinner8b:
LDRB R4,[R8,#4] @pega o valor da 5
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner8b1
bal CheckWinnerEnd8
CheckWinner8b1:
LDRB R4,[R8,#1] @pega o valor da 2
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma

CheckWinnerEnd8:
add r6,r6,#1
cmp r6,#9
beq empate

BL changePlayer
bal loopbottonblue

ActOnBlue9: @Botao 9 acionado
BL ClearWrongMove
LDRB R4,[R8,#8] @pega o valor da posição do botao
cmp R4,#’0 @está vazio
mov R3,#0
beq stradd9 @Coloca a jogada
BL WrongMove @Avisa que a jogada é inválida

mov R3,#0
stradd9:
LDRB R4,[R8,R3]
cmp R3,#8
beq setMove9
bal sameMove9
setMove9:
mov R4,R9
sameMove9:
STRB R4,[R8,R3]

ADD R3,R3,#1
CMP R3,#9
BNE stradd9 ;keep adding chars

mov R0,R8
swi SWI_PrintString @escrever no stdout
ldr r0,=newline ; endereco da mensagem
swi SWI_PrintString @escrever no stdout
MOV R3,#8
LDRB R3,[R8,R3]
cmp R3,#’1
beq Move91
cmp R3,#’2
beq Move92
volta9:

CheckWinner9:
LDRB R4,[R8,#5] @pega o valor da 6
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner9a
bal CheckWinner9b
CheckWinner9a:
LDRB R4,[R8,#2] @pega o valor da 3
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma
CheckWinner9b:
LDRB R4,[R8,#7] @pega o valor da 8
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner9b1
bal CheckWinner9c
CheckWinner9b1:
LDRB R4,[R8,#6] @pega o valor da 7
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma
CheckWinner9c:
LDRB R4,[R8,#4] @pega o valor da 5
cmp R4,R9 @é igual ao valor da posição atual?
beq CheckWinner9c1
bal CheckWinnerEnd9
CheckWinner9c1:
LDRB R4,[R8,#0] @pega o valor da 1
cmp R4,R9 @é igual ao valor da posição atual?
beq fimdoprograma

CheckWinnerEnd9:
add r6,r6,#1
cmp r6,#9
beq empate

BL changePlayer
bal loopbottonblue

changePlayer:
stmfd sp!,{r0-r1,lr}
cmp r9,#’1 @Jogador 1 estava jogando?
beq Jogador2 @Jogador 2 está jogando

cmp r9,#’2 @Jogador 2 está jogando?
beq Jogador1 @Jogador 1 está jogando

Jogador1:
mov r9,#’1
@*** Display8Segment (Number:R0; Point:R1) ***
mov r0,#1
mov r1,#1
BL Display8Segment
ldr r2,=Message1 @Jogador 1 esta jogando
bal ImprimeJogador

Jogador2:
mov r9,#’2
@*** Display8Segment (Number:R0; Point:R1) ***
mov r0,#2
mov r1,#1
BL Display8Segment
ldr r2,=Message2 @Jogador 2 esta jogando
bal ImprimeJogador

ImprimeJogador:
mov r0,#8
mov r1,#13
swi SWI_LCD
ldmfd sp!, {r0-r1,pc}

Display8Segment:
stmfd sp!,{r0-r2,lr}
ldr r2,=Digits
ldr r0,[r2,r0,lsl#2]
tst r1,#0x01 @if r1=1,
orrne r0,r0,#SEG_P @then show P
swi SWI_SETSEG8
ldmfd sp!,{r0-r2,pc}

Move11:
mov r2, #’X’
mov r1,#3
mov r0,#5
swi SWI_LCDChar
bal volta1

Move12:
mov r2, #’O’
mov r1,#3
mov r0,#5
swi SWI_LCDChar
bal volta1

Move21:
mov r2, #’X’
mov r1,#3
mov r0,#14
swi SWI_LCDChar
bal volta2

Move22:
mov r2, #’O’
mov r1,#3
mov r0,#14
swi SWI_LCDChar
bal volta2

Move31:
mov r2, #’X’
mov r1,#3
mov r0,#23
swi SWI_LCDChar
bal volta3

Move32:
mov r2, #’O’
mov r1,#3
mov r0,#23
swi SWI_LCDChar
bal volta3

Move41:
mov r2, #’X’
mov r1,#7
mov r0,#5
swi SWI_LCDChar
bal volta4

Move42:
mov r2, #’O’
mov r1,#7
mov r0,#5
swi SWI_LCDChar
bal volta4

Move51:
mov r2, #’X’
mov r1,#7
mov r0,#14
swi SWI_LCDChar
bal volta5

Move52:
mov r2, #’O’
mov r1,#7
mov r0,#14
swi SWI_LCDChar
bal volta5

Move61:
mov r2, #’X’
mov r1,#7
mov r0,#23
swi SWI_LCDChar
bal volta6

Move62:
mov r2, #’O’
mov r1,#7
mov r0,#23
swi SWI_LCDChar
bal volta6

Move71:
mov r2, #’X’
mov r1,#9
mov r0,#5
swi SWI_LCDChar
bal volta7

Move72:
mov r2, #’O’
mov r1,#9
mov r0,#5
swi SWI_LCDChar
bal volta7

Move81:
mov r2, #’X’
mov r1,#9
mov r0,#14
swi SWI_LCDChar
bal volta8

Move82:
mov r2, #’O’
mov r1,#9
mov r0,#14
swi SWI_LCDChar
bal volta8

Move91:
mov r2, #’X’
mov r1,#9
mov r0,#23
swi SWI_LCDChar
bal volta9

Move92:
mov r2, #’O’
mov r1,#9
mov r0,#23
swi SWI_LCDChar
bal volta9

WrongMove:
ldr r2,=Message3
mov r0,#6
mov r1,#1
swi SWI_LCD
bal loopbottonblue

ClearWrongMove:
stmfd sp!,{r0-r2,lr}
ldr r2,=Message4
mov r0,#6
mov r1,#1
swi SWI_LCD
ldmfd sp!,{r0-r2,pc}

fimdoprograma:
cmp r9,#’1
beq Winner1
cmp r9,#’2
beq Winner2

empate:
ldr r2,=Message7
mov r0,#14
mov r1,#1
swi SWI_LCD
ldr r2,=Message4
mov r0,#8
mov r1,#13
swi SWI_LCD
swi 0x11

Winner1:
ldr r2,=Message5
mov r0,#6
mov r1,#1
swi SWI_LCD
ldr r2,=Message4
mov r0,#8
mov r1,#13
swi SWI_LCD
swi 0x11 @encerra o programa

Winner2:
ldr r2,=Message6
mov r0,#6
mov r1,#1
swi SWI_LCD
ldr r2,=Message4
mov r0,#8
mov r1,#13
swi SWI_LCD
swi 0x11 @encerra o programa

.data
Digits:
.word SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_G @0
.word SEG_B|SEG_C @1
.word SEG_A|SEG_B|SEG_F|SEG_E|SEG_D @2
.word SEG_A|SEG_B|SEG_F|SEG_C|SEG_D @3
.word SEG_G|SEG_F|SEG_B|SEG_C @4
.word SEG_A|SEG_G|SEG_F|SEG_C|SEG_D @5
.word SEG_A|SEG_G|SEG_F|SEG_E|SEG_D|SEG_C @6
.word SEG_A|SEG_B|SEG_C @7
.word SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G @8
.word SEG_A|SEG_B|SEG_F|SEG_G|SEG_C @9
.word 0 @Blank display
newline: .asciz “\n” @setar a variavel com uma string retorno de carro (“\n”)
xline:.asciz”============================”
yline:.asciz”|”
Message1: .asciz “Jogador 1 é a sua vez\n”
Message2: .asciz “Jogador 2 é a sua vez\n”
Message3: .asciz “Jogada Inválida\n”
Message4: .asciz ” \n”
Message5: .asciz “Jogador 1 é o vencedor\n”
Message6: .asciz “Jogador 2 é o vencedor\n”
Message7: .asciz “Empate!”
Titulo: .asciz “Tic-Tac-Toe\n”
Positions: .asciz “0000000009”
.end @fim

 

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s