·

Engenharia de Software ·

Engenharia de Software

Send your question to AI and receive an answer instantly

Ask Question

Preview text

1 Introdução Este trabalho tem por objetivo desenvolver um programa em assembly do 8086 baseado no jogo KStar Patrol da CBS Software 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 O trabalho deverá ser apresentado no último dia de aula do semestre 12 de dezembro pela equipe A apresentação deverá ser realizada utilizando o GUI Turbo Assembler Windows ou Turbo Assembler Máquina Virtual Portanto o programa deve ser testado frequentemente em um destes dois montadores Somente após a apresentação a equipe poderá submeter o trabalho 2 KStar Patrol KStar Patrol é um jogo de tiro de rolagem horizontal lançado em 1982 para o sistema Atari 8bit desenvolvido pela KByte e publicado pela CBS Software 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 YouTube Links to an external site Para a realização deste trabalho serão realizadas simplificações no jogo original para adequar aos propósitos da disciplina e o tempos disponível 3 Requisitos Esta seção apresenta os requisitos do jogo 31 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 Figura 1 Estrutura do modo de vídeo 320 x 200 Como o vídeo utiliza o método de mapeamento de ES 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 10010 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 é A000H0000H Tabela 1 Código das cores 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 devese 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 32 Tela Inicial A tela inicial deve apresentar 3 elementos conforme ilustrado na Figura 2 Nome do jogo devese imprimir o nome KStar Patrol usando o gerador de arte em ASCII em httppatorjkcomsoftwaretaag 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 Figura 2 Exemplo de tela inicial do jogo 33 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 Figura 3 Tela de apresentação do setor 34 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 Figura 4 Tela do Jogo 341 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 Figura 5 Status do Jogo 342 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 343 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 deslocamse 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 patrulhalí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 344 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 deslocarse 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 15 vezes a largura da tela garantindo uma continuidade visual enquanto se move 35 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 1000 pontos por nave Setor 2 2000 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 35 Tela do Fim do Jogo A tela de fim de jogo pode ser exibida em duas situações 1 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 2 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 5 Mínimo Entregável Para garantir um padrão mínimo de implementação cada trabalho deve incluir e funcionar conforme os seguintes requisitos Tela Inicial Todos os elementos devem estar visíveis e operacionais incluindo a movimentação das naves e a funcionalidade do menu Jogo Após a tela de apresentação do setor o jogo deve exibir todos os elementos necessários status naves e superfície A nave líder deve movimentarse verticalmente usando as setas para cima e para baixo As naves alienígenas devem aparecer de forma aleatória e deslocarse para a esquerda a movimentação diagonal aleatória é opcional A superfície deve estar visível embora a sua movimentação seja opcional A implementação do tiro e da detecção de colisão é opcional O score deve ser incrementado quando uma nave alienígena atingir o lado esquerdo da tela O tempo de 60 segundos para a mudança de setor deve estar funcional e a mudança de setor deve ocorrer ao término desse tempo Fim de Jogo O jogo deve detectar o fim quando o jogador passar por todos os 3 setores ou perder todas as naves Todos os itens mencionados devem ser implementados e funcionais Características não descritas aqui ou definidas como opcionais incluindo o relatório também serão avaliadas para pontuação 6 Entregas A submissão do trabalho deve ser realizada por meio deste site enviando um arquivo compactado no formato RAR ou ZIP contendo dois arquivos 1 Código Fonte do Programa Inclua apenas o arquivo com a extensão ASM A inclusão de um executável resultará na perda de 05 ponto da nota final 2 Relatório do Trabalho Deve ser submetido em PDF utilizando o formato da Revista Scientia cum Industria Exclua a primeira página que contém o resumo gráfico e não é necessário incluir o título em inglês e o abstract A formatação será considerada na avaliação do trabalho Documentos em Word ou LibreOffice resultarão em uma perda de 05 ponto da nota final O relatório deve possuir pelo menos as seguintes seções Seção 1 Jogo Descreva o funcionamento geral do jogo incluindo figuras que representem os três elementos principais tela inicial tela do jogo e tela final Explique qualquer funcionalidade que não esteja funcionando ou não esteja completamente implementada conforme solicitado Esta seção deve funcionar como um manual de operação do jogo sem entrar em detalhes do código Seção 2 Solução Detalhe a lógica do programa e o algoritmo utilizado Esta seção pode incluir várias figuras devidamente identificadas e referenciadas no texto incluindo um fluxograma da solução que facilite a compreensão do algoritmo e do código Seção 21 Algoritmo Descreva o fluxo principal do programa incluindo um fluxograma que ilustre o funcionamento do laço do jogo Mostre o tamanho do código em bytes e o número de linhas de código Seção 22 Memória Detalhe as principais variáveis ou blocos de memória utilizados no programa Inclua o tamanho da memória ocupada pelos dados e pelo código e explique o processo utilizado para estimar o tamanho de cada um Seção 23 Rotinas Liste e descreva as principais rotinas PROC do programa como movimentação das naves controle do tiro e movimentação do terreno Para a rotina de geração de números aleatórios especifique a origem do programa ou algoritmo utilizado consulte a seção de Referências da revista para formatação Seção 24 Instruções 8086 Inclua esta seção somente se você utilizar instruções da arquitetura 8086 não abordadas em aula ou nos exercícios Explique a necessidade da instrução e como ela funciona Seção 3 Conclusões Discuta as dificuldades encontradas durante o desenvolvimento do programa e os aprendizados adquiridos com o trabalho Seção 4 Referências Liste quaisquer sites ou livros utilizados conforme as normas da ABNT e citeos no texto 7 Dicas Esta seção tem por objetivo passar algumas dicas que visam facilitar a implementação do trabalho 71 Escrita de Strings com Cor Para escrever uma string podese 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 DHDL linha coluna da posição de impressão CX tamanho em caracteres da string ESBP endereço do início da string Nota esta interrupção reconhece os códigos CR LF e backspace 72 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 AH86H que permite suspender a execução do programa por um intervalo de tempo especificado O intervalo é definido em microssegundos 11000000 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 2000000 microssegundos CX deve ser configurado com o valor 1EH e DX com o valor 8480H pois 1E8480H é a representação hexadecimal de 2000000 73 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 AH01H 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 AH00H 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 74 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