Voltar

Aplicação em Assembly

Assembly, Desenvolvimento De Software, Assembly Language, Backend Development, development

  • Status do projeto

    Fechado
  • Interessado

    4
  • Postado em

  • Localização

    O projeto pode ser concluído remotamente
  • Orçamento

    R$ 100 - R$ 500
  • postado por

    Gabriela

Descrição do trabalho

1. Introdução
Este projeto tem por objetivo desenvolver um programa em assembly do 8086 baseado no jogo K-Star Patrol da ************, conforme as especificações deste documento.

O programa deverá ser desenvolvido individualmente ou em duplas. Não serão aceitos equipes com mais de 2 integrantes. No caso de duplas, os alunos devem se inscrever em um dos 10 grupos criados na opção de menu Pessoas, aba TDE B.

2. K-Star Patrol
K-Star Patrol é um jogo de tiro de rolagem horizontal lançado em 1982 para o sistema ***** 8-bit, desenvolvido pela ****** e publicado pela ************. Neste jogo, você controla uma pequena nave que deve proteger uma esquadrilha de 8 naves aliadas enquanto atravessa 10 setores sob controle alienígena. O jogador move a nave verticalmente no lado esquerdo da tela e atira contra os inimigos que se aproximam pela direita. Se o jogador for atingido, a posição de liderança é assumida por uma das naves aliadas. O objetivo é impedir que os alienígenas destruam as naves aliadas. Se todos as naves aliadas forem perdidas e o jogador for atingido, o jogo termina.

Uma amostra do jogo pode ser encontrada no YouTubeLinks to an external site..

3. Requisitos
Esta seção apresenta os requisitos do jogo.

3.1 Vídeo
O programa deve utilizar o modo de vídeo 320 x 200 (modo de vídeo = 13H). Neste modo de vídeo, a tela é dividida em 320 colunas e 200 linhas, conforme mostra a Figura 1. Cada pixel ocupa um byte na memória, podendo assumir, portanto, uma dentre 256 cores distintas (28 possibilidades = 256 cores). A memória de vídeo nesse modo ocupa, então, 320 * 200 bytes, isto é, 64000 bytes.

modoVideo.gif

Figura 1. Estrutura do modo de vídeo 320 x 200

Como o vídeo utiliza o método de mapeamento de E/S em memória, parte da memória principal é reservada para o vídeo. O segmento de memória de vídeo usado pelo modo 13h começa na posição A000h. Para plotar um pixel na tela, basta escrever numa dessas posições a cor desejada para o pixel, conforme a Tabela 1. Para exibir um pixel na posição (100,10), ou seja, na coluna 100, linha 10, basta escrevermos o valor da cor na posição 100 + 10 * 320 do segmento de memória A000H (o endereço inicial da memória de vídeo é A000H:0000H).

Tabela 1 - Código das cores.

cores.jpg

Apesar que a interrupção 10H (vídeo) realize a escrita de pixels na tela, a operação de escrita através do endereçamento de memória (endereçamento indireto) é mais eficiente do que via interrupção. A razão disso é que a interrupção deve aguardar a CPU para tratá-la. Tipo assim “A CPU está ocupada neste momento, mas se você deixar sua rotina após o sinal – nós entraremos em contato.” Além disso, é possível utilizar instruções de manipulação de strings para auxiliar na escrita. Por isso, deve-se utilizar endereçamento indireto ou instruções de manipulação de strings para a realização de escrita de pixels (no caso de escrita de texto, interrupções podem ser utilizadas).

3.2 Tela Inicial
A tela inicial deve apresentar 3 elementos, conforme ilustrado na Figura 2:

Nome do jogo: deve-se imprimir o nome "K-Star Patrol" usando o gerador de arte em ASCII em ************ na cor verde claro (0AH) em duas linhas.
Elementos do Jogo: entre o título e o menu de opções, deverá ocorrer um voo alternado entre as naves aliadas e alienígenas. O ciclo começará com o movimento da nave aliada (cor branco - 0FH), que se deslocará da coluna 0 até a coluna 319, onde desaparecerá. No momento em que a nave aliada desaparecer, uma nave alienígena (cor azul claro - 09H) surgirá na coluna 319 e começará seu deslocamento para a esquerda, até atingir a coluna 0, onde também desaparecerá. O processo será repetido indefinidamente, alternando entre o voo da nave aliada e da nave alienígena.
Menu: as opções "Jogar" e "Sair" devem ser apresentadas, cada uma delimitada por uma caixa composta pelos seguintes caracteres: 218 ("┌"), 191 ("┐"), 192 ("└"), 217 ("┘"), 196 ("─") e 179 ("│"). O usuário poderá navegar entre as opções utilizando as teclas para cima e para baixo, movendo a seleção de uma opção para outra. A seleção ativa será destacada na cor vermelho claro (0CH) e a não ativa será na cor branco (0F). Ao pressionar a tecla Enter, a opção selecionada será executada.
kpatrol-inicial.png

Figura 2 - Exemplo de tela inicial do jogo

3.3 Setor
O jogo contará com três setores, cada um caracterizado por um terreno montanhoso distinto dos demais. Antes de cada setor, uma tela de apresentação será exibida por 4 segundos (configurável), conforme ilustrado na Figura 3. Os textos dessa tela deverão ser apresentados em cores variadas, produzidas pelo o gerador de arte em ASCII. A duração de cada setor será de 60 segundos, e esse tempo será exibido na barra de status. O tempo de duração poderá ser ajustado através de uma constante pré-definida no código.

kpatrol-setor.png

Figura 3 - Tela de apresentação do setor.

3.4 O Jogo
Para atender aos objetivos da disciplina e ao tempo disponível para a tarefa, o jogo passou por algumas adaptações em seu funcionamento. A tela do jogo deve ser semelhante à Figura 4, composta por três áreas principais: o status do jogo na parte superior, o espaço do planeta no centro, e a superfície montanhosa do planeta na parte inferior. Cada um desses elementos será detalhado nas seções a seguir.

kpatrol-jogo.png

Figura 4 - Tela do Jogo.

3.4.1. Status do Jogo
O status do jogo é composto pelo score e o tempo restante, como ilustrado na Figura 5. Ele deve ser exibido no topo da tela, com o score alinhado à esquerda e o tempo restante alinhado à direita. O tempo deve ser atualizado em intervalos de um segundo. Ao término do tempo, o jogo deverá exibir a tela do próximo setor e reiniciar a partida, mantendo o score inalterado.

status.png

Figura 5 - Status do Jogo

3.4.2 Naves Aliadas
O jogo começa com uma nave líder (cor branca) e uma patrulha de 8 naves aliadas em cores diferentes. A patrulha deve estar alinhada à esquerda (coluna 0) com um espaçamento uniforme entre as naves. A nave líder deve ser posicionada centralmente em relação à patrulha e estar cerca de 32 pixels à frente das naves aliadas. Cada nave ocupará 9 pixels de altura e 15 pixels de largura.

O objetivo da nave líder é destruir as naves alienígenas antes que elas colidam com a líder ou com qualquer uma das naves da patrulha. A nave líder poderá ser movida verticalmente usando as setas para cima e para baixo, com a movimentação limitada pela altura ocupada pelas 8 naves aliadas.

A nave líder pode disparar pressionando a barra de espaço. O tiro terá as mesmas dimensões das naves, ocupando 9 pixels de altura e 15 pixels de largura, e viajará até atingir uma nave alienígena ou alcançar o lado direito da tela. Ao colidir com uma nave alienígena, tanto o tiro quanto a nave alienígena devem desaparecer. A destruição de uma nave alienígena adicionará 100 pontos ao score.

Caso a nave líder seja destruída por uma colisão com uma nave alienígena, uma nave da patrulha deverá substituí-la, sempre selecionando a nave mais próxima do topo da tela.

3.4.3 Naves Alienígenas
As naves alienígenas surgem a partir da metade direita da tela (acima da coluna 160), em posições aleatórias. Cada nave ocupa 9 pixels de altura e 15 pixels de largura. O número máximo de naves alienígenas simultâneas varia de acordo com o setor:

Setor 1: até 10 naves
Setor 2: até 15 naves
Setor 3: até 20 naves
As naves alienígenas deslocam-se em direção ao lado esquerdo da tela. Elas podem ser destruídas por tiros (cada nave alienígena destruída vale 100 pontos) ou ao colidirem com uma nave da patrulha ou a nave líder, resultando também na destruição da nave patrulha/líder. Se uma nave alienígena atingir a coluna 0 sem ser destruída, ela escapará do setor.

Durante o deslocamento, a cada movimento horizontal de 10 pixels, a nave alienígena deve se mover 5 pixels para cima ou para baixo, de forma diagonal e aleatória. A velocidade horizontal das naves alienígenas será o dobro da velocidade do movimento vertical da nave líder.

3.4.4 Superfície do Planeta
A superfície do planeta é composta por montanhas e pequenos lagos localizados nos vales. As montanhas devem ser representadas na cor marrom (06H), enquanto os lagos serão destacados em ciano claro (0BH). Para criar um efeito de movimentação, a superfície deve deslocar-se para a esquerda na mesma velocidade das naves alienígenas.

A superfície ocupará as 20 linhas inferiores da tela, com um desenho irregular que represente o terreno rochoso. Esse desenho deve se estender por 480 pixels de largura (equivalente a 1,5 vezes a largura da tela), garantindo uma continuidade visual enquanto se move.

3.5 Pontuação
Existem várias formas de ganho e perda de pontuação no jogo. Para cada nave alienígena destruída, 100 pontos serão adicionados ao score. Ao completar um setor e avançar para o próximo, o jogador receberá um bônus. Esse bônus será calculado multiplicando o número de naves aliadas remanescentes ao final do setor pelos seguintes valores:

Setor 1: 1.000 pontos por nave
Setor 2: 2.000 pontos por nave
No entanto, para cada nave alienígena que escapar ao final de um setor, haverá uma redução na pontuação, de acordo com o setor:

Setor 1: -10 pontos por nave alienígena
Setor 2: -20 pontos por nave alienígena
Setor 3: -30 pontos por nave alienígena
3.5 Tela do Fim do Jogo
A tela de fim de jogo pode ser exibida em duas situações:

Todas as naves foram destruídas: Nesse caso, a tela exibirá a mensagem "GAME OVER" em duas linhas, na cor vermelha, utilizando um gerador de arte em ASCII.

Conclusão dos 3 setores: A tela mostrará a mensagem "VENCEDOR!" em cor verde, também com o gerador de arte em ASCII. Abaixo, o score final será exibido em branco.

Em ambos os casos, o usuário deverá pressionar qualquer tecla para retornar à tela inicial.

4. Restrições do Trabalho
Impressão e Ocultação: A exibição ou ocultação das naves, do terreno e dos tiros deve ser feita exclusivamente por meio de endereçamento indireto ou instruções de manipulação de strings.
Evitar Duplicação de Rotinas: O código deve evitar a duplicação de rotinas. Por exemplo, se é possível implementar uma única rotina de movimentação para todos os elementos (como naves alienígenas, tiro e naves aliadas), não deve haver rotinas separadas para cada tipo.
Configuração de Tempo: O intervalo entre as movimentações dos elementos do jogo (50 ms) e a duração de cada etapa devem ser configuráveis.
Compatibilidade com Ambiente de Montagem: O programa deve funcionar corretamente quando montado utilizando o GUI Turbo Assembler (Windows) ou o Turbo Assembler (em uma máquina virtual).

7. Dicas
Esta seção tem por objetivo passar algumas dicas que visam facilitar a implementação do projeto.

7.1. Escrita de Strings com Cor
Para escrever uma string, pode-se utilizar a função 13H da interrupção 10H:

AH = 13h
AL = modo
bit 0: 1- atualiza a posição do cursor após a escrita
bit 1: 1- string contém caracteres e atributos
BL = atributo do caractere se o bit 1 em AL for 0
BH = número da página de vídeo
DH,DL = linha, coluna da posição de impressão
CX = tamanho, em caracteres, da string
ES:BP = endereço do início da string
Nota: esta interrupção reconhece os códigos CR, LF, e backspace.

7.2. Suspensão da Execução por um Determinado Intervalo de Tempo
A interrupção 15h oferece uma variedade de serviços, incluindo a função AH=86H, que permite suspender a execução do programa por um intervalo de tempo especificado. O intervalo é definido em microssegundos (1/1.000.000 de segundo) e é especificado pelos registradores CX e DX, onde CX contém os 16 bits mais significativos e DX contém os 16 bits menos significativos.

Para converter o intervalo de tempo desejado em microssegundos, é necessário configurar CX e DX de acordo. Por exemplo, para um intervalo de 2 segundos (2.000.000 microssegundos), CX deve ser configurado com o valor 1EH e DX com o valor 8480H, pois 1E8480H é a representação hexadecimal de 2.000.000.

7.3. Leitura de Teclado sem Aguardar
A interrupção 16h oferece várias funções relacionadas ao teclado. Para ler uma tecla sem que o programa precise esperar, você pode usar a interrupção 16h para verificar o status do teclado. Especificamente, o serviço AH=01H permite verificar se há teclas no buffer do teclado. Se o buffer estiver vazio, o Zero Flag (ZF) será setado.

Para ler uma tecla do buffer, você deve utilizar o serviço AH=00H da mesma interrupção. Este serviço não apenas retorna o código da tecla pressionada, mas também remove a tecla do buffer.

7.4. Definir constante com o tamanho da memória
No Assembly, o símbolo $ é uma referência ao deslocamento atual (ou posição atual) dentro de um segmento de código ou de dados. Ele é útil principalmente para cálculos que envolvem endereços e offsets durante o tempo de montagem. O valor de $ pode ser usado para calcular comprimentos ou distâncias entre diferentes partes do código ou dados, principalmente em tabelas, blocos de memória ou instruções que requerem referência a endereços relativos.

Imagine que você está criando um buffer de dados e quer armazenar o tamanho do buffer em outro local. Você pode usar $ para calcular o tamanho do buffer diretamente no momento da montagem:

buffer db "Exemplo de texto"
tamanho equ $ - buffer; Calcula o tamanho do buffer
Neste exemplo:

buffer é o rótulo que marca o início dos dados.
O valor de $ - buffer calcula o número de bytes entre o deslocamento atual (posição $) e o início de buffer. Assim, o valor de tamanho armazenará o tamanho de buffer de forma automática.

Freelancers interessados

    {{ item.displayName }} {{ item.displayName }}

    {{ item.displayDisciplines }}

    • {{ item.hourlyRate || '-' }} por hora
    • {{ item.cityName }}
      {{ item.stateName }}, {{ item.countryName }}
    • {{ item.nrSharedConnections }} conexões compartilhadas

Nenhum freelancer interessado ainda

Operação falhou!
Por favor, tente novamente mais tarde. Se o problema persistir entre em contato com o suporte.