Obra: Desenvolvimento de jogos/Programação Megadrive
Matéria: Português
Nível: médio
introdução este wikibook destina se àqueles que estejam interessados no desenvolvimento de jogos para videogame conhecido como mega drive em construção ferramentas montadores também conhecidos pelo termo inglês assemblers geram código de máquina referente ao código fonte escrito na linguagem de montagem assembly no caso do mega drive código escrito para os processadores motorola também conhecido como ou da zilog sendo um coprocessador de áudio para compatibilidade com jogos de master system gas gnu assembler gas ele bem completo pleno de recursos genérico quanto processador sua sintaxe segue padrão at em vez do da intel caso seja necessário compilar gas para utilize os seguintes comandos primeiro comando configura alvo de montagem ser processador família sem sistema operacional segundo efetivamente compila os programas componentes do gas que são addr line ar as cxxfilt ld nm objcopy objdump ranlib readelf size strings strip os mais usados para fins de programas para mega drive são as montador assembler ld ligador linker objcopy para gerar arquivo no formato binário correto usando as importante uso do parâmetro porque padrão parâmetro serve para definir nome do arquivo objeto de saída padrão out por fim não opcional código fonte usando ld após feita as compilações de todas os códigos do programa preciso ligá los oformat binary ttext são necessários para correto formato do arquivo binário como já mencionado para as define nome do arquivo binário de saída no caso rom bin parâmetro obrigatório para ld obviamente arquivo objeto que compõe programa compiladores basiegaxorz compilador de basic criado por devster para mega drive muito fácil de usar vem com muitos exemplos pode ser baixado neste site sgcc sega genesis compiler compilador de para mega drive embora tenha alguns problemas como fato de usar um dialeto arcaico da linguagem sintaxe para ser mais exato ele extremamente simples de usar bastando descompactar usar além de já vir com alguns exemplos simples pode ser baixado deste site ou deste gcc gnu compiler for versão do gnu adaptado para processador mc suporta tanto como podendo também suportar outras linguagens como fortran pascal outros dependendo da configuração tem desvantagem de ser ligeiramente mais difícil de usar do que sgcc neste site você pode baixar uma versão deste compilador já preparada para mega drive sgdk kit de desenvolvimento para sega genesis sega genesis development kit kit de bibliotecas toolchains portados por stephane dalongeville para mega drive seu uso bastante simples também vem com alguns exemplos diretório contém alguns tutoriais de funções básicas intermediárias pode ser baixado por aqui conversores de imagens imagenesis também criado por devster mesmo criador de basiegaxorz esse programa converte imagens para formato de cores do mega drive pode ser baixado por aqui básico para os exemplos desta seção será utilizado basiegaxorz por ser mais simples de usar escrevendo texto na tela usando basiegaxorz esta tarefa se to
siegaxorz por ser mais simples de usar escrevendo texto na tela usando basiegaxorz esta tarefa se torna bastante simples print ola mundo definindo palheta de cores megadrive possui quatro palhetas de cores cada uma com cores selecionáveis dentre basiegaxorz possui dois comandos para setar as palhetas do megadrive pallette seta uma única cor de uma única palheta sua sintaxe pallette um número hexadecimal que repesenta os tons de vermelho verde azul que compõem cor desejada para calcular código equivalente cor utilize fórmula onde representa tom de vermelho entre representa tom de verde entre representa tom de azul entre indica número da palheta que se deseja modificar indica qual das cores desta palheta será alterada exemplo ink print texto usando palheta ink print texto usando palheta ink print texto usando palheta ink print texto usando palheta ink print print pressione qualquer botao while joypad wend waitpadup pallette pallette pallette pallette ink print observe como cor do texto mudou ao print alterar palheta exemplo acima imprime uma linha de texto com cada palheta espera usuário pressionar qualquer botão do joystick então altera cor de cada palheta qual corresponde cor utilizada pelo texto como consequência texto muda de cor pallettes pode setar várias cores de uma determinada palheta de uma só vez sua sintaxe pallettes deslocamento indica qual rótulo de dados será lido para definir as cores da palheta indicada veja exemplo abaixo para entender melhor número da palheta que será alterada cor inicial ser alterada por exemplo se cor inicial for número de cores for serão alteradas as cores número de cores que serão alteradas deslocamento parâmetro opcional que indica posição dentro dos dados indicados pelo rótulo partir da qual os dados serão lidos exemplo ink print texto usando palheta ink print texto usando palheta ink print texto usando palheta ink print texto usando palheta ink print print pressione qualquer botao while joypad wend waitpadup pallettes pallette pallettes pallette pallettes pallette pallettes pallette ink print observe como cor do texto mudou ao print alterar palheta assim como cor print do fundo pallette dataint eca ee ea ca cac ca aa dataint ace aae aa pallette dataint aa ae ae dataint ee ee aa cc pallette dataint cec ca dataint pallette dataint cee dataint ae no exemplo acima pallette palette palette palette são rótulos que apontam para dados os quais neste caso são definidos pelo comando dataint cifrão na frente de cada número serve para indicar que número em questão está em notação hexadecimal isso torna mais fácil visualizar cor que está sendo definida visto que os três últimos dígitos do código da cor em hexa correspondem justamente aos valores de azul verde vermelho respectivamente observe também que cor do fundo também foi alterada porque cor zero da palheta zero também mudou importante se for copiar colar este exemplo para basiegaxorz lembre se de tirar espaço esquerda dos rótulos mas apenas dos rótulos isto necess
o para basiegaxorz lembre se de tirar espaço esquerda dos rótulos mas apenas dos rótulos isto necessário porque basiegaxorz pressupõe que qualquer linha que comece com um ou mais espaços esquerda não contenha um rótulo lendo joystick existem algumas funções para basiegaxorz que fazem software interagir com joystick vou lista las primeiramente seguir dou um exemplo mais prático waitpadup espera que device do numero especificado seja ligado ao console você pode fazer jogo pausar se controle for removido ou caso jogador selecione opção de players verificar existencia de um segundo controle para prosseguir importante os valores para primeiro segundo controle são respectivamente joypad essa função de longe mais importante para interação com controle essa função retorna bit do evento correspondente tabela baixo mostra relação de bit evento bit hex decimal evento cima baixo esquerda direita start botões botões botões mode botões não vou entrar muito em detalhes vocês podem procurar no site da basiegaxorz por uma documentação mais detalhada mas quando se utiliza joystick de botoes os bits referentes aos botões zyx não estarão limpos sim tera um valor randomico qualquer lixo tomar cuidado com isso vamos ao exemplo cole exemplo abaixo no basiegaxorz lembrando que deve haver um espaço em branco antes de cada comando reparem que foi utilizado joypad sem nenhum parâmetro caso este esteja omitido padrão primeiro controle waitpadup se omitir valor ou será valor padrao print controle esta conectado player joypad inputs while sleep so para nao ficar num loop frenetico ocupar muito cpu joy joypad mesma coisa que no waitpadup if joy then cima print cima endif if joy then baixo print baixo endif if joy then esquerda print esquerda endif if joy then direita print direita endif if joy then print endif if joy then print endif if joy then print endif if joy then start print start endif if joy then print endif if joy then print endif if joy then print endif if joy then mode button print mode button endif voce tambem pode usar capturar mais de um envento ao mesmo tempo por exemplo perceba que ele caira em todos os if no do botao no do botao no bc se quizer aninhar os ifs else pode facilmente impedir isso nao fiz pois achei que ficaria mais claro os exemplos assim if joy and joy then print bc endif wend ideal utilizar select case ao invés de estrutura if else por questões de desempenho além de produzir uma melhor legibilidade ao código no caso do select utilize os valores decimais da tabela caso queiram capturar dois botoes por exemplo some os valores um exemplo com as diagonais while sleep joy joypad select case joy case print cima exit case case print baixo exit case case print esquerda exit case case print diagonal esquerda pra cima exit case case print diagonal esquerda pra baixo exit case case print direita exit case case print diagonal direita pra cima exit case case print diagonal direita pra baixo exit case case else exit select end select wend movendo objetos pela
rint diagonal direita pra baixo exit case case else exit select end select wend movendo objetos pela tela utilizando loop do exemplo acima que lê os comandos do controle as unicas adições des comandos foram addsprite propsprite movesprite loadtiles irei comentar no codigo mesmo função de cada coisa caso alguem queria criar um tópico explicando cada comando fique vontade explicando sprites são aquelas sequencias de imagens que permite fazer ilusao de um personagem em movimento possivel comumente utilizado mas no exemplo ficou faltando de trocar as imagens do sprite dado movimento loadtiles tiles carrega imagem do label tiles que será nosso cursor uma imagem pixiels os parametros são respectivamente quantidade de tile cada tile um bloco de pixiels endereço de memoria em que tile será alocado pallettes pallettedata modifica paleta de cores numero zero com as cores do label pallettedata que contem as cores do nosso cursor esse comando já foi explicado acima sprite addsprite cria um sprite de tile de altura tile de comprimento pixiels retona endereço do sprite propsprite sprite desenha tile de endereço sprite iniciando no endereço de memoria utilizando paleta de cores numero while sleep movesprite sprite movimenta sprite para as coordenadas joy joypad select case joy case exit case case exit case case exit case case exit case case exit case case exit case case exit case case exit case case else exit select end select wend tiles tile convertido eu utilizei uma ferramenta para fazer essa conversao embora chato não impossivel de se fazer na mao nao uma espécie de mapa pixiels onde os numeros representa os numeros da paleta de cores preto vermelhor mais claro vermelho mais escuro um vermelho intermediario se repararem bem conseguirao ver nave desenhada nesse mapa ao lado alterem esse mapinha as cores da paleta vcs entenderao como funciona datalong tile datalong datalong datalong datalong datalong datalong datalong pallettedata pallet com as cores do tile eu utilizei uma ferramenta para detectar as cores mas possivel nem tão dificil fazer paleta de cores na mao dataint dataint exibindo uma imagem no fundo da tela sei que explicação não está muito didática mas estou tentando postar aqui conforme tenho tempo pela falta de documentação exemplo em portugues vamos mais um exemplo pratico vou usar praticamente tudo do exemplo anterior espero que tenha ficado claro um pouco de teoria antes do exemplo no mega drive existe planos scroll_a scroll_b window plano scroll_b possui menor prioridade de todas seguido pelo scroll_a por final window manipulando esses planos que damos noção de profundidade ao jogo um elemento mais proximo em um plano de maior prioridade irá tapar outro criando essa ilusao mais importante os spirtes terao uma prioridade mais alta por isso nem me dei ao trabalho de atribuir os planos no exemplo seguir existem mais comandos do que os que vou listar baixo recomendo ir buscar documentação do basiegaxorz vou explicar basico só você pode usar os com
r baixo recomendo ir buscar documentação do basiegaxorz vou explicar basico só você pode usar os comandos settextplane esse comando torna padrão para ascii comandos tipo print etc setgfxplane esse comando permite escolher qual será plano padrão dos comandos de desenho drawtile drawtiles setscrollplane escolhe qual plano será rolado esse não um topico sobre scroll estou explicando por que utilizei no codigo fonte creio que ficará mais claro agora para adicionar as as imagens ao fundo isto imagens de um determinado plano existe varios comandos comando drawtile drawtiles drawtilesovr drawtilesinc drawtilesovr drawtilesinc por hora eu não vou entrar em detalhes nesses varios comandos vou explicar somente drawtile depois eu edito topico com resto dos comandos drawtile desenha determinado tile na tela na posicão com um for você pode preencher toda tela com mesma imagem ou armazenar varios tiles que montem uma imagem maior monta la também com um for sem maiores grandes problemas dito isso vamos ao exemplo prático boa parte do código foi retirado do exemplo acima então não terão dificuldade de entender maioria das coisas se entenderam anterior loadtiles tiles carrega imagem do label tiles que será nosso cursor uma imagem pixiels os parametros são respectivamente quantidade de tile cada tile um bloco de pixiels endereço de memoria em que tile será alocado reparem que alterei funcao loadtiles agora para carregar tiles partir de pallettes pallettedata modifica paleta de cores numero zero com as cores do label pallettedata que contem as cores do nosso cursor esse comando já foi explicado acima sprite addsprite cria um sprite de tile de altura tile de comprimento pixiels retona endereço do sprite propsprite sprite desenha tile de endereço sprite iniciando no endereço de memoria utilizando paleta de cores numero settextplane scroll_a setgfxplane scroll_b setscrollplane scroll_b gera as estrelas no fundo escolhe entre tipos de estrelas grande pequena clara pequena escura randomize aloca delas randomicamente pela tela como estou utilizando mesma semente sempre será nos mesmos lugares for to importante isso tipo de coisa que não se deve fazer função random gera um processamento desnecessário drawtile rnd rnd rnd processador do mega drive não tem tanto poder computacional para ficar desperdicando next muito melhor escolher as posicoes usar drawtile drawtile coordenada coordenada vou declarar umas constantes para deixar codigo mais legivel const max_x nada ver com assunto em questao mas declarei essas contantes para limitar nave de sair da tela const max_y const min_x const min_y ink while isso deve dar algum erro quase certeza uma hora variavel ira ultrapassar valor maximo do integer eu nao vou ficar tratanto essas exeções no exemplo mas ninguem deve ter dificuldade com isso scroll down move plano de scroll scroll_b para posicao sleep observação sobre sleep cada de sleep equivale hz da tv ou seja sleep igual segundo locate move cursos de texto para posicao print c
sleep equivale hz da tv ou seja sleep igual segundo locate move cursos de texto para posicao print coord imprimi coordenada do cursor cada loop valor sera atualizado na tela joy joypad select case joy case if min_y then endif exit case aqui antes de mover nave para qualquer direção eu fiz um verificacao se ela pode ainda mover case de resto mesma interacao com controle de antes if min_x then endif exit case case if min_x and min_y then endif exit case case if min_x and min_y then endif exit case case if then shiftsprite jogador endif else para baixo if joy then if spriteposy jogador and and then locate print perdeu aperte start ink while joypad sleep wend reset endif else jogador locate pontos_jogador print pontos_jogador você ganha jogo com se tiver pontos if pontos_jogador then locate print ganhou aperte start ink while joypad sleep wend reset endif endif retorna cor original ink volta escrita padrão no plano de cima settextplane scroll_a end sub função para reiniciar jogo ela usa um label chamado inicio declare sub reset pontos_jogador pontos_cpu sentidox sentidoy freeallsprites settextplane scroll_a cls settextplane scroll_b cls goto inicio end eu inseri label logo antes da função que desenha tela assim executa sub que apresentará tela de apresentação do jogo apresentacao label que indica inicio do jogo inicio sleep executa sub que irá desenhar tela do pong desenha_tela inteligência artificial básica jogador versus cpu ia horrivel praticamente impossivel passar do cpu fiz mais para vocês terem uma noção do jogo funcionando mesmo com movimento desse jeito da bolinha creio que simplesmente impossivel passar algo pelo cpu mas ai está ok ia horrivel fiz só para verem jogo funcionando declare sub move_cpu cpu as integer bola as integer local bolay as integer local cpuy as integer bolay spriteposy bola cpuy spriteposy cpu if bolay cpuy then if cpuy then shiftsprite cpu endif endif endif end sub nosso loop principal ficou assim while sleep move_sprite jogador movimentar_bola bola move_cpu cpu bola wend pong completo só para postar como ficou jogo completo com ia horrivel movimento da bola ruim modifique faça um pong melhor ignora as opções de compilação da gui compila jogo para mega drive cartucho option cartridge obriga explicitamente declaração de variáveis boas prática option explicit desabilita sensibilidade caixa alta para variaveis labels funcões etc option casesense título que será exibido na janela do seu emulador depois titulo inserido automaticamente pelo basiegaxorz option title pong atribui os comandos de draw para plano scroll_b por padrão os de texto ao plano scroll_a setgfxplane scroll_b settextplane scroll_b executa sub que apresentará tela de apresentação do jogo apresentacao label que indica inicio do jogo inicio sleep executa sub que irá desenhar tela do pong desenha_tela altera padrão to texto para scroll_a settextplane scroll_a adicionar os sprites dos jogadores bola dim jogador as integer dim cpu as integer dim bola as integer
icionar os sprites dos jogadores bola dim jogador as integer dim cpu as integer dim bola as integer jogador addsprite cpu addsprite bola addsprite aloca os sprites dos jogadores loadtiles tiledata insere duas cores na paleta de cor dois tons de cinza pallette pallette atribui em qual região da memória inicio do sprite propsprite jogador propsprite cpu propsprite bola posiciona os sprites na tela movesprite jogador movesprite cpu movesprite bola loop do jogo vou remover tudo do loop while sleep move_sprite jogador movimentar_bola bola move_cpu cpu bola wend função que desenha tela rede laterais jogadores declare sub desenha_tela declara variável dentro da função como local memória será liberada após termino da função boa prática local as integer itera uma vez para cada coluna for to as posições de memória antes de são reservadas para os carateres imprime linha superior drawtile imprime linha inferior drawtile next for to imprime linha vertical drawtile next move cursor de texto para posição comando locate usa as coordenadas não locate muda cor para verde ink print jogador locate print cpu ink imprime placar zerado locate print locate print volta cor original ink end sub função que imprime tela iniciado do jogo pressionar start para seguir em frente declare sub apresentacao locate muda cor do texto para verde ink print pong press start volta cor original ink executa uma espera até que botão de start seja pressionado use comando sleep boa prática while joypad sleep wend cls end sub testa move sprite do jogador se movimento for permitido declare sub move_sprite jogador as integer local joy as integer joy joypad para cima if joy then if spriteposy jogador then shiftsprite jogador endif else para baixo if joy then if spriteposy jogador and then locate print perdeu aperte start ink while joypad sleep wend reset endif else jogador locate pontos_jogador print pontos_jogador você ganha jogo com se tiver pontos if pontos_jogador then locate print ganhou aperte start ink while joypad sleep wend reset endif endif retorna cor original ink volta escrita padrão no plano de cima settextplane scroll_a end sub função que reinicia jogo zera placar limpa tela libera os sprites declare sub reset pontos_jogador pontos_cpu sentidox sentidoy freeallsprites settextplane scroll_a cls settextplane scroll_b cls goto inicio end ok ia horrivel fiz só para verem jogo funcionando declare sub move_cpu cpu as integer bola as integer local bolay as integer local cpuy as integer bolay spriteposy bola cpuy spriteposy cpu if bolay cpuy then if cpuy then shiftsprite cpu endif endif endif end sub tile da raquete dos jogadores tiledata datalong tile datalong datalong datalong datalong datalong datalong datalong datalong tile datalong datalong datalong datalong datalong datalong datalong datalong tile datalong datalong datalong datalong datalong datalong datalong datalong tile datalong datalong datalong datalong datalong datalong datalong múltiplos inimigos na tela fazendo seu próprio gal
long datalong datalong datalong datalong datalong múltiplos inimigos na tela fazendo seu próprio galaxian intermediário visão geral do hardware do mega drive movimentando os planos de fundo abaixo um exemplo de código que demonstra como executada rolagem de um plano permitindo que você possa movimentar se em todas as direções trata se de uma versão melhorada desta postada no fórum oficial do basiegaxorz para que este código funcione corretamente você vai precisar de uma imagem com pixels renderizada no programa imagenesis com segunda opção de mode marcada color bpp plane tiles optimized por ser grande imagem renderização pode demorar um pouco salve arquivo de tiles seu mapa na mesma pasta do código nele insira nos rótulos indicados os nomes dos seus arquivos cole paleta da sua imagem não esqueça de alterar quantidade de tiles no segundo parâmetro do loadtiles que irá carregar cenário no ato da renderização verifique se sua imagem não gera uma quantidade de tiles acima da capacidade da memória disable screen dim mapa as integer palette pallettes paleta_aviao loadtiles desenho_aviao desenho do aviao settextplane scroll_a setgfxplane scroll_b setscrollplane scroll_b loadtiles tiles_mapa carregar cenário pallettes paleta_mapa reload mapa_dados for to for to readint mapa next next for to for to drawtile mapa pallette next next aviao addsprite propsprite aviao enable screen liga tela aviao_x aviao_y mapa_x mapa_y controley controlex pallette do sleep movesprite aviao aviao_x aviao_y joypad if then gosub cima if then gosub baixo if then gosub esquerda if then gosub direita locate print locate print controley controley locate print mapa_y mapa_y locate print buffery buffery locate print aviao_y aviao_y locate print locate print controlex controlex locate print mapa_x mapa_x locate print bufferx bufferx locate print aviao_x aviao_x loop cima if then if then desenha if desenha then desenha if desenha controley then controley desenha mapa_y buffery buffery buffery and bufferx for cont to and drawtile mapa cont mapa_x mapa_y buffery next cont end if scroll up else aviao_y aviao_y end if end if return esquerda if then if then desenha if desenha then desenha if desenha controlex then controlex desenha mapa_x bufferx bufferx bufferx and buffery for cont to and drawtile mapa mapa_x cont mapa_y bufferx next cont end if scroll left else aviao_x aviao_x end if end if return tiles_mapa datafile arquivo bin bin arquivo com os tiles paleta_mapa dataint eee paleta dataint mapa_dados datafile mapa_dados bin bin arquivo do mapa desenho_aviao datalong tile datalong datalong ffff datalong datalong datalong fffff datalong datalong datalong tile datalong datalong datalong ffff datalong datalong datalong datalong datalong tile datalong bb datalong datalong ddff datalong dffef datalong fffffff datalong datalong datalong ff tile datalong datalong datalong ff fff datalong datalong ff datalong datalong datalong tile datalong bb datalong datalong edd datalong eedd datalong ffffff
ff datalong datalong datalong tile datalong bb datalong datalong edd datalong eedd datalong ffffff datalong datalong datalong tile datalong datalong datalong datalong ff datalong datalong datalong ff datalong tile datalong datalong ffff datalong datalong datalong fffff datalong datalong datalong tile datalong datalong datalong datalong fff datalong datalong datalong paleta_aviao dataint ee ee paleta dataint ccc som básico usando psg avançado descrição das portas de do mega drive vdp porta de dados porta de controle leitura vazio cheio sovr impar vb hb pal vazio fifo de escrita vazio cheio fifo de escrita cheio ocorreu interrupção vertical sovr ocorreu estouro de sprites muitos na mesma linha mais de no modo de células mais de no modo de células ocorreu colisão entre dois pixels não nulos entre dois sprites impar quadro ímpar no modo entrelaçado quadro par no modo entrelaçado vb durante blanking vertical hb durante blanking horizontal dma realizando dma pal modo pal modo ntsc escrita enviar dados ao registrador rs rs rs rs rs rs rs número do registrador dados enviar as portas do vdp devem ser acessadas via word ou long word para correto funcionamento escrita seleção de endereço escrita cd cd escrita cd cd cd cd cd cd código de indentificação endereço de destino modo de acesso cd cd cd cd cd cd escrita em vram escrita em cram escrita em vsram leitura da vram leitura da cram leitura da vsram contador horizontal vertical modo não entrelaçado vc vc vc vc vc vc vc vc hc hc hc hc hc hc hc hc modo entrelaçado vc vc vc vc vc vc vc vc hc hc hc hc hc hc hc hc hc hc posição horizontal vc vc posição vertical registradores reg registrador de modo número ie ie habilita interrupção horizontal nível desabilita interrupção horizontal reg parar contador hv habilita contador hv para leitura reg registrador de modo número disp ie disp habilita display desabilita display ie habilita interrupção vertical nível desabilita interrupção vertical habilita dma desabilita dma modo células na horizontal modo pal modo células na horizontal modo pal sempre em modo ntsc reg endereço base do mapa do fundo sa sa sa endereço da vram xxx reg endereço base do mapa da janela wd wd wd wd wd wd deve ser no modo de células horizontais endereço da vram xxxx_x células horizontais endereço da vram xxxx_ células horizontais reg endereço base do mapa do fundo sb sb sb endereço da vram xxx reg endereço base da tabela de atributos dos sprites at at at at at at at wd deve ser no modo de células horizontais endereço da vram xxxx_xxx células horizontais endereço da vram xxxx_xx células horizontais reg cor do fundo cpt cpt col col col col cpt cpt número da palheta col col código da cor reg interrupção horizontal bit bit bit bit bit bit bit bit conta número da linha horizontal da tela sendo atualmente renderizado reg registrador de modo número ie vscr hscr lscr ie habilita interrupção externa nível desabilita interrupção externa modo de deslocamento horizontal vscr função scroll completo scroll cada
sabilita interrupção externa modo de deslocamento horizontal vscr função scroll completo scroll cada duas células modo de deslocamento vertical hscr lscr função scroll completo inválido scroll célula célula scroll linha linha reg registrador de modo número rs te lsm lsm rs rs modo de células horizontais modo de células horizontais rs modo de células horizontais modo de células horizontais recomendável setar mesmo valor para rs rs te habilita sombreamento realce habilita sombreamento realce lsm lsm modo de entrelaçamento lsm lsm função sem entrelaçamento entrelaçado inválido entrelaçado dupla resolução reg endereço da tabela de deslocamento horizontal hs hs hs hs hs hs endereço da vram xxxx_xx reg dados de auto incremento cada vez que cpu acessa memória da vdp do mega drive posição atual desta memória incrementada este registrador define tamanho do incremento hs hs hs hs hs hs inc inc tamanho do incremento ff reg tamanho do plano de fundo vsz vsz hsz hsz vsz vsz função células na vertical células na vertical inválido células na vertical hsz hsz função células na horizontal células na horizontal inválido células na horizontal reg posição horizontal da janela rigt whp whp whp whp whp rigt janela está esquerda do ponto base janela está direita do ponto base whp whp posição horizontal em células isto de em pixels reg posição vertical da janela down wvp wvp wvp wvp wvp down janela está acima do ponto base janela está abaixo do ponto base wvp wvp posição vertical em células reg byte menos significativo do contador de dma lg lg lg lg lg lg lg lg reg byte mais significativo do contador de dma lg lg lg lg lg lg lg lg reg porção inferior do endereço de origem de dma sa sa sa sa sa sa sa sa reg porção central do endereço de origem de dma sa sa sa sa sa sa sa sa reg porção superior do endereço de origem de dma dmd dmd sa sa sa sa sa sa sa sa endereço de origem de dma dmd dmd modo de dma dmd dmd função sa memória para vídeo preenche vram vídeo para vídeo exemplo de utilização das portas void init_gfx register unsigned int pw pw uint xc aponta para porta de controle pw reg habilita hbl pw reg habilita display vbl dma seta largura pw reg plano pw reg janela pw reg plano pw reg tabela de sprites em bc pw reg cor do fundo pw reg hinterrupt timing pw reg abcd interrupção externa scroll horiz cd scroll vert pw reg células horiz sombreamento realce modo entrelaçamento células sem sombreamento sem entrelaçamento pw reg tabela de deslocamento horizontal pw reg auto incremento pw reg tamanho dos planos de fundo pw reg posição horizontal da janela pw ff reg posição vertical da janela programação assembly documentação assembly extensa documentação do assembly do pode ser encontrada no devega cabeçalho da rom cabeçalho da rom para mega drive consiste de duas seções cada uma de bytes primeira exigida pelo processador indicam início da pilha endereço da rotina principal os endereços das rotinas de exceções traps interrupções já segunda seção uma padronização realizada pela s
ereços das rotinas de exceções traps interrupções já segunda seção uma padronização realizada pela sega para identificação do cartucho direitos autorais nome do produto etc informações sobre utilização de recursos do hardware mapeamento de memória periféricos etc os elementos mais usados do vetor de exceções primeiros bytes item endereço descrição endereço do início da pilha geralmente próximo ao fim da memória ram endereço da rotina principal valor inicial do pc também para quando resetado interrupção de nível no mega drive externa interrupção de nível no mega drive retraço horizontal interrupção de nível no mega drive retraço vertical conteúdo de cada elemento do vetor de exceções endereço absoluto em relação ao primeiro byte do arquivo binário da respectiva rotina de tratamento da exceção cada elemento consiste de bytes costume quando for desejado não tratar certas exceções elas reiniciem software ou seja apontem para começo do programa vale destacar que as interrupções de retraço devem ser tratadas nem que seja não fazer nada já que são efetivamente geradas tempo constante as demais exceções interrupções não citadas podem ser encontradas no apêndice do motorola family programmer reference manual disponível no devega programação assembly usando cpu secundária som avançado usando sintetizador fm bibliografia