diff --git a/headers/client.h b/headers/client.h index 0200722b9fc928f538f35999443ef47077fd8599..00fbe1fa70b564302f4c8c67d45d72f67c1e3120 100644 --- a/headers/client.h +++ b/headers/client.h @@ -117,20 +117,6 @@ int client::start_transmission() { return 1; } -// Encerra a transmissao com o servidor -int client::end_transmission() { - cout << "\tEncerrando a transmissao\n";// ->log - frame *end = new frame(FIMT, 0, vector<char>(1, 0)); - frame *enviado = send_frame_socket(end); - if (!enviado) { - cout << "\tFalha ao encerrar a transmissao\n";// ->log - return 0; - } - - cout << "\tTransmissao encerrada com sucesso\n";// ->log - return 1; -} - /** * @brief Send a list of frames through the socket * @@ -162,7 +148,7 @@ int client::send_frames(vector<frame *> frames) { janela.push((iniJanela + frameCounter) % 16); cout << "\tEnviando frame\n"; - frames[iniJanela + frameCounter]->imprime(DEC); + frames[iniJanela + frameCounter]->imprime(HEX); if (socket->send_frame(frames[iniJanela + frameCounter]) == -1) { cout << "Falha ao enviar o frame\n"; diff --git a/headers/conexao.h b/headers/conexao.h index 2b1a362b8943e8b6a85f1967c1826a51d8416ed1..0a1b9cc2d457ffdd1ec7a0d19dd4a89df9f02013 100644 --- a/headers/conexao.h +++ b/headers/conexao.h @@ -106,17 +106,18 @@ frame *conexao::receive_frame() { */ int conexao::send_frame(frame *f) { - add_escapes((char *)f, bufferSend); + int escapes = add_escapes((char *)f, bufferSend); bool ack = false; int timeout = 0; - int byteSend = send(device, bufferSend, sizeof(frame) * 2, 0); - printf("send %d: ", byteSend); - for (int i = 0; i < byteSend; i++) { + cout << "send: "; + for ( int i = 0; i < escapes; i++ ) cout << hex << (int(bufferSend[i]) & 0xff) << " "; - } cout << "\n"; + + int byteSend = send(device, bufferSend, sizeof(frame) * 2, 0); + if (byteSend < 0) { cout << "Erro no sendto" << byteSend << "\n"; return -1; @@ -140,18 +141,23 @@ int conexao::add_escapes(char *f, char *out) { for (size_t i = 0; i < sizeof(frame); i++) { out[j++] = f[i]; - if (f[i] == 0x88 || f[i] == 0x81) out[j++] = 0xFF; + if (f[i] == (char)0x88 || f[i] == (char)0x81) { out[j++] = 0xFF; } } + cout << "\nescapes: "; + for ( int i = 0; i < j; i++ ) + cout << hex << (int(out[i]) & 0xff) << " "; + cout << "\n"; + return j; } int conexao::remove_escapes(char *f, char *out) { int j = 0; - for (size_t i = 0; j < sizeof(frame); i++) { + for (size_t i = 0; i < sizeof(frame); i++) { out[j++] = f[i]; - if (f[i] == 0x88 || f[i] == 0x81) i++; + if (f[i] == (char)0x88 || f[i] == (char)0x81) i++; } return j; diff --git a/match3 b/match3 new file mode 100755 index 0000000000000000000000000000000000000000..b8be5e93afe418689158c81b4d104ca41b7507b2 Binary files /dev/null and b/match3 differ diff --git a/match3.zip b/match3.zip new file mode 100644 index 0000000000000000000000000000000000000000..0b972882ed0c484e6332a2f4b4a6ea218ef5149e Binary files /dev/null and b/match3.zip differ diff --git a/selection_sort.asm b/selection_sort.asm new file mode 100644 index 0000000000000000000000000000000000000000..7d192962e26f3ecca683b6ef7930b326355974d3 --- /dev/null +++ b/selection_sort.asm @@ -0,0 +1,212 @@ + +# s0 = indice inicial +# s1 = indice final +# s2 = tam + +.data + vetor: .space 24 # Espaço em bits para 6 int, cada int tem 4 bits + espaco: .ascii " " # É um espaco + +.text + main: + li $s2, 6 # Tamanho do vetor + li $s0, 0 # Indice inicial do vetor + addi $s1, $s2, -1 # s1 é o indice final, s1 = tam - 1 + + move $a1, $s2 # passa o tam como paramentro + jal leVetor # le um vetor + + # Chama o selection Sort + move $a1, $s0 # ai = indice inicial + move $a2, $s1 # a2 = indice final + jal selectionSort + + move $a1, $s0 # a1 = indice + move $a2, $s2 # a2 = tamanho + jal imprimeVetor + + # Termina o programa + li $v0, 10 + syscall + + + # Função que lê um vetor, não retorna nada + leVetor: + + # Configura a pilha + addiu $sp, $sp, -12 # Aloca 12 bytes na pilha (a, b e ra) + sw $ra, 0($sp) # 1 posicao da pilha = ra + sw $s0, 4($sp) # 2 posicao da pilha = a + sw $s1, 8($sp) # 3 posicao da pilha = b + + li $t0, 0 # t0 é o índice, inicia em 0 + li $t1, 0 # t1 é o contador, t1 = 0 + move $t2, $a1 # t2 = tam + # lê s2 elementos + le_loop: + beq $t1, $t2, endLe # Se cont = tam sai do loop + + li $v0, 5 # Instrução 5 lê um int + syscall + sw $v0, vetor($t0) # vetor[0] = $v0 + + addi $t0, $t0, 4 # Atualiza o indice, 4 pq um int tem 4 bits + addi $t1, $t1, 1 # Atualiza o contador + + j le_loop # Volta para o inicio do loop + endLe: + + # Recupera os valores + lw $ra, 0($sp) # Recupera o ra + lw $s0, 4($sp) # Recupera o a + lw $s1, 8($sp) # Recupera o b + addiu $sp, $sp, 12 # Volta o sp + + jr $ra # Retorna para onde a função foi chamada + + + # Função que imprime um vetor, não retorna nada + imprimeVetor: + + # Configura a pilha + addiu $sp, $sp, -16 # Aloca 16 bytes na pilha (tam, a, b e ra) + sw $ra, 0($sp) # 1 posicao da pilha = ra + sw $s0, 4($sp) # 2 posicao da pilha = a + sw $s1, 8($sp) # 3 posicao da pilha = b + sw $s2, 12($sp) # 4 posica da pilha = tam + + li $t0, 0 # t0 é o contador, t1 = 0 + li $t1, 0 # t1 é o índice, inicia em 0 + + # imprime t0 elementos + imprime_loop: + beq $t0, $a2, endImprime # Se cont = tam sai do loop + + lw $a0, vetor($t1) # a0 = vetor[t1] + li $v0, 1 # instrução 1 imprime a0 + syscall + + la $a0, espaco # Imprime um espaço + li $v0, 4 # instrução 1 imprime a0 + syscall + + addi $t0, $t0, 1 # Atualiza o contador + addi $t1, $t1, 4 # Atualiza o indice, 4 pq um int tem 4 bits + + j imprime_loop # Volta para o inicio do loop + endImprime: + + # Recupera os valores + lw $ra, 0($sp) # Recupera o ra + lw $s0, 4($sp) # Recupera o a + lw $s1, 8($sp) # Recupera o b + lw $s2, 12($sp) # Recupera o tam + addiu $sp, $sp, 16 # Volta o sp + + jr $ra # Retorna para onde a função foi chamada + + + # Ordena em ordem crescente + selectionSort: + + # Configura a pilha + addiu $sp, $sp, -16 # Aloca 12 bytes na pilha (a, b e ra) + sw $ra, 0($sp) # 1 posicao da pilha = ra + sw $s0, 4($sp) # 2 posicao da pilha = a + sw $s1, 8($sp) # 3 posicao da pilha = b + sw $s2, 12($sp) # 4 posica da pilha = tam + + move $t0, $a1 # Libera os registradores de parametro + move $t1, $a2 + bge $t0, $t1, fimSelection # se a >= b sai da recursão + + jal minimo # Acha o menor valor + # Faz a troca + move $a1, $v0 # a3 = min (v0) + move $a2, $t0 # a2 = a + jal troca + # chama a recursão para o prox elem + addi $t0, $t0, 1 # a++ + jal selectionSort + + fimSelection: + + # Recupera os valores + lw $ra, 0($sp) # Recupera o ra + lw $s0, 4($sp) # Recupera o a + lw $s1, 8($sp) # Recupera o b + lw $s2, 12($sp) # Recupera o tam + addiu $sp, $sp, 16 # Volta o sp + + jr $ra # Retorna para onde a função foi chamada + + + minimo: # Acha o minimo do vetor + # Configura a pilha + addiu $sp, $sp, -16 # Aloca 16 bytes na pilha (tam, a, b e ra) + sw $ra, 0($sp) # 1 posicao da pilha = ra + sw $s0, 4($sp) # 2 posicao da pilha = a + sw $s1, 8($sp) # 3 posicao da pilha = b + sw $s2, 12($sp) # 4 posicao da pilha = tam + + move $t0, $a1 # t0 é o índice + sll $t0, $t0, 2 # t0 = t0*4 + lw $t1, vetor($t0) # t1 = vetor[t0*4] + li $t2, 0 # t2 é o contador, t2 = 0 + + min_loop: # Acha o menor valor + + beq $t2, $a2, fimMin # Se cont == b sai do loop + + addi $t0, $t0, 4 # Atualiza o indice, um int tem 4 bits + addi $t2, $t2, 1 # Atualiza o contador, contador++ + + lw $t3, vetor($t0) # t3 = vetor[t0], comeca no 2º elem do vetor + li $t4, 0 # indice do menor valor, comeca em 0 + bgt $t3, $t1, fimMin_if # se t3 > t1 sai do if + move $t1, $t3 # se t3 < t1 t0 = t3 (achou o min) + move $t4, $t0 + fimMin_if: + + j min_loop # repete para o prox elem + + fimMin: + + # Recupera os valores + lw $ra, 0($sp) # Recupera o ra + lw $s0, 4($sp) # Recupera o a + lw $s1, 8($sp) # Recupera o b + lw $s2, 12($sp) # Recupera o tam + addiu $sp, $sp, 16 # Volta o sp + + move $v0, $t4 # retorna o indice do menor valor (t0), v0 = t0 + jr $ra # Retorna para onde a função foi chamada + + # Troca dois elementos + troca: + # Configura a pilha + addiu $sp, $sp, -16 # Aloca 16 bytes na pilha (tam, a, b e ra) + sw $ra, 0($sp) # 1 posicao da pilha = ra + sw $s0, 4($sp) # 2 posicao da pilha = a + sw $s1, 8($sp) # 3 posicao da pilha = b + sw $s2, 12($sp) # 4 posicao da pilha = tam + + # Guarda os valores + lw $t0, vetor($a1) # t0 = vetor[a1] + lw $t1, vetor($a2) # t1 = vetor[a2] + + # Troca os valores + sw $t1, vetor($a1) # vetor[a3] = t1 + sw $t0, vetor($t2) # vetor[a1] = t0 + + # Recupera os valores + lw $ra, 0($sp) # Recupera o ra + lw $s0, 4($sp) # Recupera o a + lw $s1, 8($sp) # Recupera o b + lw $s2, 12($sp) # Recupera o tam + addiu $sp, $sp, 16 # Volta o sp + + jr $ra # Retorna para onde a função foi chamada + +# fazer para mais de 6 elementos +# ler com espaço ao inves de enter