Programação para Atari 2600
Upcoming SlideShare
Loading in...5
×
 

Programação para Atari 2600

on

  • 68,271 views

Palestra apresentada em 27/Ago/2011 no Dev in Sampa (http://devinsampa.com.br/), em 06/Nov/2011 no Dev In Vale e em 11/Fev/2012 no Campus Party Brasil (5a. edição, #cpbr5) ...

Palestra apresentada em 27/Ago/2011 no Dev in Sampa (http://devinsampa.com.br/), em 06/Nov/2011 no Dev In Vale e em 11/Fev/2012 no Campus Party Brasil (5a. edição, #cpbr5)

O vídeo da palestra no Dev In Sampa (filmada pelo @agaelebe) está disponível em: http://chester.blog.br/archives/2011/08/palestra-sobre-programacao-para-atari-2600-no-dev-in-sampa-2011.html

Statistics

Views

Total Views
68,271
Views on SlideShare
9,563
Embed Views
58,708

Actions

Likes
15
Downloads
150
Comments
2

27 Embeds 58,708

http://chester.me 49174
http://chester.blog.br 6996
http://www.gonow.com.br 2181
http://www2.gonow.com.br 144
http://localhost:8889 106
http://blog.chester.me 21
http://paper.li 13
http://blog.gonow.com.br 10
http://abtasty.com 10
http://translate.googleusercontent.com 9
http://a0.twimg.com 6
https://twitter.com 6
http://twitter.com 6
http://us-w1.rockmelt.com 6
http://webcache.googleusercontent.com 5
http://www.linkedin.com 4
http://www.newsblur.com 1
https://si0.twimg.com 1
http://twitter-badges.s3.amazonaws.com 1
http://gonow-site.gonow.com.br 1
http://app.brandwatch.com 1
http://mail.mailig.ig.com.br 1
http://chester.blog.br. 1
http://musta.sh 1
http://coo9.comuf.com 1
http://cc.bingj.com 1
http://www.google.com.br 1
More...

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial LicenseCC Attribution-NonCommercial License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Programação para Atari 2600 Programação para Atari 2600 Presentation Transcript

  • game program™PROGRAMAÇÃO PARA ATARI 2600 Use with Joystick Controllers
  • Proposta Entender o que torna o Atari tão diferente de outros sistemas, aprendendo o básico para escreverum “Hello, World” e poder apreciarclássicos como Enduro ou Pitfall! pela habilidade de seus criadores http://slideshare.net/chesterbr
  • Palestrante @chesterbr http://chester.me
  • Palestrante @chesterbr http://chester.me
  • Atari 2600(Video Computer System)
  • imagem: mitchelaneous.com Mais de 600 jogos...
  • mas por que eram tão... “Atari”?
  • Por dentro do Atari (Jr.) Fotos: Larry Ziegler (2600 CE)
  • CPU: 6507Fotos: Larry Ziegler (2600 CE)
  • CPU: 6507 2 650Fotos: Larry Ziegler (2600 CE)
  • Video: TIAFotos: Larry Ziegler (2600 CE)
  • Todo o resto: RIOT (6532) Fotos: Larry Ziegler (2600 CE)
  • Mapa da Memória0000-002C – TIA (Escrita)0030-003D – TIA (Leitura)0080-00FF – RIOT (RAM)0280-0297 – RIOT (I/O, Timer)F000-FFFF – Cartucho (ROM)
  • Mapa da Memória 4 KBytes!F000-FFFF – Cartucho (ROM)esse nem é o maior problema...
  • Mapa da Memória 128 BYTES!!!!! (1/8 de KB) 0080-00FF – RIOT (RAM)e esse ainda não é o maior problema...
  • VRAM Um chip de vídeo típicotransforma padrões de bitsarmazenados em memória(VRAM) em pixels e cores
  • VRAM VRAM VRAM 38 44 44 7C 44 44 EE 00
  • VRAM Quanto mais memória (VRAM),maior a resolução, e variedade decores. Memória era cara nos anos 70/80, levando a um tradeoff. Quanta VRAM o Atari tem?
  • Mapa da Memória0000-002C – TIA (Escrita)0030-003D – TIA (Leitura)0080-00FF – RIOT (RAM)0280-0297 – RIOT (I/O, Timer)F000-FFFF – Cartucho (ROM)
  • Mapa da Memória????-???? – VRAM
  • Mapa da Memória 0 bytes !!!!????-???? – VRAM #comofas?
  • TIA(Television Interface Adaptor)
  • Funcionamento da TV Fonte: How Stuff Works
  • Funcionamento da TV Fonte: How Stuff Works
  • Scanlines 60 quadros (frames) por segundo Fonte: How Stuff Works
  • TIA opera em scanlinesPara cada scanline, você escreve em posições de memória do TIA que configuram “objetos desenháveis” É difícil mudar a cor/forma de um objeto numa mesma scanline
  • Isso explica vs.
  • E que objetos são esses?● Playfield (PF)● Players (P0, P1)● Missiles/Ball (M0, M1, BL)
  • PlayfieldUm padrão de 20 bits (representando cor de frente e cor de fundo) que ocupa o lado esquerdo da scanline. O lado direito repete o mesmo padrão, ou, opcionalmente, uma versão “espelhada” dele
  • PLAYFIELD
  • PLAYFIELD
  • PLAYFIELD
  • PLAYFIELD
  • Configurando o playfield PF0 = 0000 ←← leitura PF1 = 00000000 leitura →→ PF2 = 00000000 ←← leitura REFLECT = 0 scanline resultante████████████████████████████████████████
  • Configurando o playfield PF0 = 0001 ←← leitura PF1 = 00000000 leitura →→ PF2 = 00000000 ←← leitura REFLECT = 0 scanline resultante████████████████████████████████████████
  • Configurando o playfield PF0 = 0011 ←← leitura PF1 = 00000000 leitura →→ PF2 = 00000000 ←← leitura REFLECT = 0 scanline resultante████████████████████████████████████████
  • Configurando o playfield PF0 = 0111 ←← leitura PF1 = 00000000 leitura →→ PF2 = 00000000 ←← leitura REFLECT = 0 scanline resultante████████████████████████████████████████
  • Configurando o playfield PF0 = 1111 ←← leitura PF1 = 11110000 leitura →→ PF2 = 00000000 ←← leitura REFLECT = 0 scanline resultante████████████████████████████████████████
  • Configurando o playfield PF0 = 1111 ←← leitura PF1 = 11111110 leitura →→ PF2 = 00010101 ←← leitura REFLECT = 0 scanline resultante████████████████████████████████████████
  • Configurando o playfield PF0 = 1111 ←← leitura PF1 = 11111110 leitura →→ PF2 = 00010101 ←← leitura REFLECT = 1 scanline resultante████████████████████████████████████████
  • PlayersCada um dos players é um padrão de 8 bits com sua própria cor Ex.: 10100001 → ████████ Os dois padrões (GRP0/GRP1)podem aparecer na mesma scanline
  • PLAYERS
  • PLAYERS
  • Players É possível esticar/multiplicar einverter o desenho de cada playerusando os registradores NUSIZn e REFPn (n=0 ou 1)
  • NUSIZn (em 5 scanlines) 000 001 010NUSIZn 011 100 101 110 111
  • Ligando o REFPn 000 001 010NUSIZn 011 100 101 110 111
  • NUSIZn
  • NUSIZn
  • NUSIZn
  • NUSIZn
  • 8 bits exigem criatividade vs.
  • Missiles/Ball Cada um representa um pixel na scanline, mas pode ter sua largura ampliada em 2, 4 ou 8 vezes.Os missiles têm as cores dos players,enquanto ball tem a cor do playfield.
  • MISSILES
  • BALL
  • BALL MISSILE
  • BALL MISSILE
  • Idéia geral Para cada scanline, você configura oformato dos objetos (playfield, players, missiles/ball) e as cores/efeitos deles.O que você configura em uma scanlinevale para as seguintes, mas ainda assim o tempo é um problema
  • Contas de padaria:6502 ≈ 1,19Mhz (1.194.720 ciclos/seg) NTSC: 60 frames (telas) por seg1.194.720/60 ≅ 19.912 ciclos por tela
  • Contas de padaria: CPU: 19.912 ciclos por tela NTSC: 262 scanlines por frame19.912 / 262 = 76 ciclos por scanline
  • Contas de padaria: CPU: 19.912 ciclos por tela NTSC: 262 scanlines por frame19.912 / 262 = 76 ciclos por scanline e o que se faz com “76 ciclos”? (aliás, o que exatamente é um “ciclo”?)
  • Assembly 6502
  • 6502
  • 6502 (no Atari)Executa instruções armazenadas naROM que manipulam e transferembytes entre o RIOT (RAM + I/O + timers) e o TIA, com o apoio de registradores internos.
  • Instruções Cada instrução é composta por um opcode (1 byte) seguido por um parâmetro (0 a 2 bytes)Dependendo do opcode, a instrução leva de 2 a 6 ciclos para ser executada
  • Registradores do 6502A = Acumulador (8 bits)X,Y= Índices (8 bits)S = Stack Pointer (8 bits)P = Status (flags, 8 bits)PC = Program Counter (16 bits)
  • Exemplo de Programa● Ler o byte da posição de memória 0x0200 para o acumulador (A)● Somar 1 (um) no A● Guardar o resultado (A) na posição de memória 0x0201
  • Código de Máquina 6502 AD Opcode (Memória→A) 00 2a. Parte de “0200” 02 1a. Parte de “0200” 69 Opcode (valor+A→A) 01 valor “01” 8D Opcode (A→Memória) 01 2a. Parte de “0201” 02 1a. Parte de “0201”
  • Linguagem AssemblyAtribui a cada opcode uma sigla (“mnemônico”) e define uma notação para os parâmetros
  • Código de Máquina 6502 AD Opcode (Memória→A) 00 2a. Parte de “0200” 02 1a. Parte de “0200” 69 Opcode (valor+A→A) 01 valor “01” 8D Opcode (A→Memória) 01 2a. Parte de “0201” 02 1a. Parte de “0201”
  • Assembly 6502AD LDA $0200000269 ADC #01018D STA $02010102
  • Assembler (Montador)Programa que lê um arquivo-texto escrito em linguagem Assembly emonta o arquivo binário (código de máquina) correspondente foo.asm foo.binLDA $0200 ASSEMBLER AD000269ADC #01 018D0102STA $0201 ......
  • DASM● Macro Assembler 6502● Inclui headers para Atari● Multiplataforma● Livre (GPLv2) http://dasm-dillon.sourceforge.net/
  • Notação (para hoje)#... = valor absoluto$... = endereço, em hexa$..., X = endereço + X, em hexa#$... = valor absoluto em hexa http://www.obelisk.demon.co.uk/6502/addressing.html
  • Instruções do 6502 = mais relevantes para o Atari
  • Transferindo Dados LDA, LDX, LDY = Load STA, STX, STY = Store TAX, TAY, TXA, TYA, TSX, TXS = TransferLDA #$10 0x10→ASTY $0200 Y→m(0x0200)TXA X→A
  • Aritmética ADC, SBC = +,- (C=“vai um”) INC, DEC = ++,-- (memória) INX, INY, DEX, DEY = ++,--ADC $0100 m(0x100)+A→AINC $0200 m(0x200)+1→ m(0x200)DEX X-1→X
  • Operações em BitsAND, ORA, EOR = and, or, xor (A)ASL, LSR = Shift aritmético/lógicoROL, ROR = Shift “rotacional”AND #$11 A&0x11→ALSR A>>1→A (A/2→A)ROR A>>1 (bit 7=carry)
  • Comparações e DesviosCMP, CPX, CPY = compara A/X/Y (-)BCS, BCC = desvia se Carry/NãoBEQ, BNE = desvia se Equal/NãoBVS, BVC = desvia se Overflow/NãoBMI, BPL = desvia se Minus/PlusCPY $1234 se y=m(0x1234),BEQ $0200 0x0200→PC
  • Pilha e SubrotinasJSR, RTS = chama subrotina/retornaPHA, PLA = push/pop(pull) do APHP, PLP = push/pop do status (P)JMP $1234 0x1234→PCJSR $1234 PC(+3)→pilha, 0x1234→PCRTS pilha→PC
  • O Resto...NOP = No Operation (nada!)JMP = Desvio direto (GOTO)SEC, CLC = Set/Clear CarrySEV, CLV = Set/Clear oVerflowSEI, CLI = Set/Clear Interrupt-offSED, CLD = Set/Clear DecimalRTI = Return from InterruptBRK = Break
  • © 1999 Warner BrosNeo: “I know kung fu.”Morpheus: “Show me.”
  • Hello, World!
  • Hello, World! Escrever na horizontal é complicado(muitos pixels/elementos por scanline)
  • Hello, World! É mais fácil escrever na vertical →(menos pixels/scanline) Podemos usar um player ou o playfield
  • Display kernel É a parte do programa que rodaquando o canhão está desenhando a tela propriamente dita (através do playfield, players e missiles/ball)
  • (3+37+30).76 = 5320 ciclosLÓGICA DO JOGO KERNEL Fonte: Stella Programmers Guide, Steve Wright, 1979
  • Estrutura do programa VSYNC VBLANK KERNEL (desenha a tela) OVERSCAN
  • Estrutura do programa VSYNCPlayfield VBLANK OVERSCAN
  • Estrutura do programa VSYNC VBLANK Loop 11 chars xPrincipal 8 linhas x (eterno) 2 linhas por Kernel scanline = loop X: 0 a 191 176 (192 scanlines) scanlines OVERSCAN
  • Começando o programaPROCESSOR 6502INCLUDE "vcs.h"ORG $F000 ; Início do cartucho VSYNC VBLANK KERNEL OVERSCAN
  • Início do frame (loop principal) InicioFrame: lda #%00000010 ; VSYNC inicia sta VSYNC ; setando o bit 1 REPEAT 3 ; e dura 3 scanlines sta WSYNC ; (WSYNC = aguarda fim REPEND ; da scanline) lda #0 ; VSYNC finaliza sta VSYNC ; limpando o bit 1 VSYNC VBLANK KERNEL OVERSCAN
  • Desligando elementoslda #$00sta ENABL ; Desliga ballsta ENAM0 ; Desliga missilessta ENAM1sta GRP0 ; Desliga playerssta GRP1 VSYNC VBLANK KERNEL OVERSCAN
  • Configurando o Playfieldsta COLUBK ; Cor de fundo (0=preto)sta PF0 ; PF0 e PF2 ficam apagadossta PF2lda #$FF ; Cor do playfieldsta COLUPF ; (possivelmente amarelo)lda #$00 ; Reset no bit 0 do CTRLPFsta CTRLPF ; para duplicar o PFldx #0 ; X=contador de scanlines VSYNC VBLANK KERNEL OVERSCAN
  • VBLANK propriamente dito REPEAT 37 ; VBLANK dura 37 scanlines, sta WSYNC ; (poderíamos ter lógica REPEND ; do jogo aqui) lda #0 ; Finaliza o VBLANK, sta VBLANK ; "ligando o canhão" VSYNC VBLANK KERNEL OVERSCAN
  • KernelScanline: cpx #174 ; Se acabou a frase, pula bcs FimScanline; o desenho txa ; Y=X/2 (usando o shift lsr ; lógico para dividir, tay ; que só opera no A) lda Frase,y ; Frase,Y = mem(Frase+Y) sta PF1 ; PF1 = bits 5 a 11 do ; playfield VSYNC VBLANK KERNEL OVERSCAN
  • Kernel (continuação)FimScanline: sta WSYNC ; Aguarda fim da scanline inx ; Incrementa contador e cpx #191 ; repete até até a bne Scanline ; completar a tela VSYNC VBLANK KERNEL OVERSCAN
  • Fechando o loop principalOverscan: lda #%01000010 ; "Desliga o canhão": sta VBLANK ; 30 scanlines de REPEAT 30 ; overscan... sta WSYNC REPEND jmp InicioFrame ; ...e começa tudo de ; novo! VSYNC VBLANK KERNEL OVERSCAN
  • A frase, bit a bitFrase: .BYTE %00000000 ; H .BYTE %01000010 .BYTE %01111110 .BYTE %01000010 .BYTE %01000010 .BYTE %01000010 .BYTE %00000000 .BYTE %00000000 ; E .BYTE %01111110 ...
  • A frase, bit a bit... .BYTE %00000000 ; D .BYTE %01111000 .BYTE %01000100 .BYTE %01000010 .BYTE %01000010 .BYTE %01000100 .BYTE %01111000 .BYTE %00000000 ; Valor final do PF1
  • Configurações finaisORG $FFFA ; Ficam no final da ; ROM (cartucho).WORD InicioFrame ; Endereço NMI.WORD InicioFrame ; Endereço BOOT.WORD InicioFrame ; Endereço BRKEND
  • Montando e Executandodasm fonte.asm -oromcartucho.bin -f3 http://stella.sourceforge.net/
  • Técnicas Avançadas
  • Placar com playfield
  • Placar com playfield Para identificar os placares, épossível usar as cores dos players no playfield, setando o bit 1 doregistrador CTRLPF (score mode)O lado esquerdo fica com a cor do P0, e o direito com a cor do P1
  • CORES DOS PLAYERS
  • (isso dá idéias para melhorar nosso Hello World?)
  • (isso dá idéias para melhorar nosso Hello World?)
  • Placar com playfieldProblema: como mostrar coisas DIFERENTES em cada lado? Solução: mudar o playfield enquanto o canhão passa!
  • canhã oconfigure o playfield para “3” no início da scanline
  • canhãoquando o canhão estiver no meio, configure o playfield do “1”...
  • o canhã...e você terá um desenho diferente do outro lado!
  • Mundos gigantes
  • Pitfall! Cada uma das 256 telas é definida(objetos, árvores, paredes...) por 1 byte, que deveriam ser armazenados no cartucho (ROM) Tamanho da tabela: 256 bytes
  • Pitfall! Solução: gerador de sequência comaleatoriedade aceitável e que tambémgera o valor anterior a partir do atual, para voltar telas (LFSR bidirecional) Tamanho do código: 50 bytes http://en.wikipedia.org/wiki/Linear_feedback_shift_register
  • River Raid A mesma solução é aplicada com umgerador de 16 bits (que eventualmente se repete), com pequenos ajustes paratornar os primeiros setores mais fáceis. Ao passar a ponte, o jogo guarda o valor atual, recuperando em caso de morte para voltar no mesmo setor
  • Posição horizontal
  • Posição horizontal Não existe um registrador paradetermine a posição horizontal de players, missiles ou ball Você tem que contar o tempoaté que o canhão esteja na posiçãoe acionar o strobe correspondente
  • PONTOS DE STROBE (na teoria)
  • Dá pra calcular... 1 ciclo de CPU = 3 pixels WSYNC = 20 ciclos posição x ≈ (ciclos – 20) * 3...mas é aproximado, porque o TIA só lê os registros a cada 5 ciclos de CPU, tornando inviável para movimento ↔
  • Soluções Você pode mover player, missile ou ball relativamente à posição anterior, usando um registrador de 4 bits (isto é, movendo de -7 a +8 pixels) E o missile pode ser posicionado no meio do player correspondente,tornando fácil “atirar” ele (daí o nome)
  • PONTOS DE STROBE
  • MOVIMENTO ↔ registradores HMP0/1 e HMM0/1 MOVIMENTO ↕ basta desenhar o player/missle emuma scanline diferente a cada frame
  • Placar com múltiplos dígitos
  • Placar com múltiplos dígitos O truque é o mesmo do placar com playfield: mudar a imagem com ocanhão andando, mas o timing tem que ser muito mais preciso Digamos que o placar seja 456789...
  • Placar com múltiplos dígitos Comece cada scanline com a linha do 4 no GRP0 e do 5 no GRP1. Configure NUSIZ0 e NUSIZ1 para repetir três vezes: 4 4 4 5 5 5 Player 0 Player 1
  • Placar com múltiplos dígitos Posicione o player 1 à direita do player 0, encavalando as cópias: Player 1 454545 Player 0
  • Placar com múltiplos dígitos Troque o desenho dos players (GRP0/GRP1) sincronizando com o canhão, assim: 454545 CANHÃO
  • Placar com múltiplos dígitosQuando o canhão estiver terminandoa 1ª cópia do player 1, altere o player 0 para 6 e o player 1 para 7: 454545 CANHÃO
  • Placar com múltiplos dígitos Repita o truque ao final da 2ª cópia do player 2, dessa vez alternado oplayer 0 para 8 e o player 1 para 9 456767 CANHÃO
  • Placar com múltiplos dígitos Faça a mesma coisa para cada scanline do placar! 456789 CANHÃO
  • Placar com múltiplos dígitos É mais difícil do que parece: não dátempo de carregar bitmaps da memória quando o canhão passa, e só temos 3 registradores para guardar 4 dígitos... ...mas é isso que torna divertido!
  • Conclusões
  • Tirando leite de pedra Quando observar um jogo de Atari, tente identificar os truques que o(a) programador(a) usou: como dividiu atela, o que tem em cada scanline, como gastou a RAM e a ROM...
  • Mãos à obra!Você pode fazer seu jogo de Atari – éum desafio de programação divertido!Será preciso estudar várias coisas que não detalhamos: contagem de ciclos, som, leitura de joysticks... mas dá!
  • Para aprender maisO nosso Hello, World: http://pastebin.com/abBRfUjdSorteio 2600 http://github.com/chesterbr/sorteio2600Racing The Beam (livro): http://bit.ly/dSqhjSPalestra David Crane (Pitfall): http://youtu.be/MBT1OK6VAIUTutoriais do Crane para iOS: http://bit.ly/9pwYHs e http://bit.ly/qWBciZStella Programmers Guide: http://emu-docs.org/?page=Atari%202600Código-fonte de jogos clássicos: http://classicdev.org/wiki/2600/Source_CodeEspecificações do Atari: http://nocash.emubase.de/2k6specs.htmReferência 6502: http://bit.ly/hxG5c6Emulador no browser: http://jogosdeatari.com.br/Tutorial Andrew Dave: http://bit.ly/ptQDdA (o site todo é bom)Cartucho com leitor de SD: http://harmony.atariage.com/BAtari (compilador BASIC): http://bataribasic.comExemplos de som no TIA: http://bit.ly/tnbPrpBankswitching (mais ROM/RAM): http://bit.ly/tqhLZk
  • Dúvidas?Obrigado! @chesterbr http://chester.me http://slideshare.net/chesterbr
  • Créditos e Licenciamento Esta apresentação está licenciada sob os termos da licença Creative Commons “by-nc” 3.0, observadas as exceções abaixo O slide de abertura é baseado em ilustração © 2011 Ila Fox, licenciada exclusivamente para o autor e não inclusa na licença acimaFotos e ilustrações de terceiros usados sob premissa de “fair use” têm sua autoria mencionada e também excluídos da licença acimaAtari™, Adventure™, Donkey Kong™, Pitfall™, Super Mario™ e outrospersonagens/jogos citados para fins ilustrativos, bem como suas imagens e logomarcas, são de propriedade de seus detentores, com todos os direitos reservados, não havendo qualquer relação deles com o autor