Assembly, Desenvolvimento De Software, Assembly Language, Backend Development, development
Status do projeto
Interessado
Postado em
Localização
Orçamento
postado por
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.
Você conhece alguém que se encaixa bem no projeto? Ganhe comissão indicando freelancers! Por cada inscrição você ganha 5 € diretamente na sua conta e quando o freelancer é contratado pela plataforma você ganha 2% dos ganhos deste freelancer!
Preencha os detalhes do profissional que você gostaria de recomendar:
Quando o freelancer aceitar o convite, ele será automaticamente adicionado à sua rede e você ganhará 2% a mais todos os ganhos deste freelancer através da plataforma. Para mais informações consulte nosso Termos e Condições
Nenhum freelancer interessado ainda
{{item.displayDisciplines}}
Você tem uma conta stand-by e já respondeu a 1 projeto neste período de assinatura.
Atualize sua conta agora com apenas 1 clique e responda a projetos ilimitados.