SlideShare uma empresa Scribd logo
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 escrever
um “Hello, World” e poder apreciar
clá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: 6507




Fotos: Larry Ziegler (2600 CE)
CPU: 6507 2
     650




Fotos: Larry Ziegler (2600 CE)
Video: TIA




Fotos: Larry Ziegler (2600 CE)
Todo o resto: RIOT (6532)




        Fotos: Larry Ziegler (2600 CE)
Mapa da Memória

0000-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ípico
transforma padrões de bits
armazenados 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 de
cores. Memória era cara nos anos
  70/80, levando a um tradeoff.

  Quanta VRAM o Atari tem?
Mapa da Memória

0000-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 scanlines
Para 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)
Playfield
Um 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
████████████████████████████████████████
Programação para Atari 2600
Players
Cada 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 e
inverter o desenho de cada player
usando os registradores NUSIZn e
        REFPn (n=0 ou 1)
NUSIZn (em 5 scanlines)
         000
         001
         010
NUSIZn




         011
         100
         101
         110
         111
Ligando o REFPn
         000
         001
         010
NUSIZn




         011
         100
         101
         110
         111
NUSIZn
Programação para Atari 2600
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 o
formato dos objetos (playfield, players,
 missiles/ball) e as cores/efeitos deles.

O que você configura em uma scanline
vale 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 seg

1.194.720/60 ≅ 19.912 ciclos por tela
Contas de padaria:

   CPU: 19.912 ciclos por tela
  NTSC: 262 scanlines por frame

19.912 / 262 = 76 ciclos por scanline
Contas de padaria:

   CPU: 19.912 ciclos por tela
  NTSC: 262 scanlines por frame

19.912 / 262 = 76 ciclos por scanline

   e o que se faz com “76 ciclos”?
     (aliás, o que exatamente é um “ciclo”?)
Assembly 6502
Programação para Atari 2600
6502
6502 (no Atari)

Executa instruções armazenadas na
ROM que manipulam e transferem
bytes 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 6502
A = 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”
Programação para Atari 2600
Linguagem Assembly

Atribui 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 6502
AD   LDA $0200
00
02
69   ADC #01
01
8D   STA $0201
01
02
Assembler (Montador)
Programa que lê um arquivo-texto
 escrito em linguagem Assembly e
monta o arquivo binário (código de
    máquina) correspondente
 foo.asm             foo.bin
LDA $0200 ASSEMBLER AD000269
ADC #01             018D0102
STA $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 = Transfer
LDA #$10     0x10→A
STY $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→A
INC $0200   m(0x200)+1→
              m(0x200)
DEX         X-1→X
Operações em Bits
AND, ORA, EOR = and, or, xor (A)
ASL, LSR = Shift aritmético/lógico
ROL, ROR = Shift “rotacional”

AND #$11 A&0x11→A
LSR      A>>1→A (A/2→A)
ROR      A>>1 (bit 7=carry)
Comparações e Desvios
CMP, CPX, CPY = compara A/X/Y (-)
BCS, BCC = desvia se Carry/Não
BEQ, BNE = desvia se Equal/Não
BVS, BVC = desvia se Overflow/Não
BMI, BPL = desvia se Minus/Plus
CPY $1234    se y=m(0x1234),
BEQ $0200      0x0200→PC
Pilha e Subrotinas
JSR, RTS = chama subrotina/retorna
PHA, PLA = push/pop(pull) do A
PHP, PLP = push/pop do status (P)

JMP $1234     0x1234→PC
JSR $1234     PC(+3)→pilha,
              0x1234→PC
RTS           pilha→PC
O Resto...
NOP        = No Operation (nada!)
JMP        = Desvio direto (GOTO)
SEC, CLC   = Set/Clear Carry
SEV, CLV   = Set/Clear oVerflow
SEI, CLI   = Set/Clear Interrupt-off
SED, CLD   = Set/Clear Decimal
RTI        = Return from Interrupt
BRK        = Break
© 1999 Warner Bros




Neo: “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 roda
quando o canhão está desenhando a
 tela propriamente dita (através do
   playfield, players e missiles/ball)
(3+37+30).76 = 5320 ciclos
LÓGICA DO JOGO




                                                                                           KERNEL
                                          Fonte: Stella Programmers Guide, Steve Wright, 1979
Estrutura do programa
           VSYNC


         VBLANK


         KERNEL
      (desenha a tela)


       OVERSCAN
Estrutura do programa
              VSYNC


Playfield    VBLANK




            OVERSCAN
Estrutura do programa
              VSYNC


             VBLANK

 Loop         11 chars x
Principal      8 linhas x
 (eterno)     2 linhas por       Kernel
               scanline =     loop X: 0 a 191
                  176        (192 scanlines)
              scanlines
            OVERSCAN
Começando o programa
PROCESSOR 6502
INCLUDE "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 elementos
lda   #$00
sta   ENABL   ; Desliga ball
sta   ENAM0   ; Desliga missiles
sta   ENAM1
sta   GRP0    ; Desliga players
sta   GRP1



                                     VSYNC
                                    VBLANK

                                    KERNEL
                                   OVERSCAN
Configurando o Playfield
sta   COLUBK   ; Cor de fundo (0=preto)
sta   PF0      ; PF0 e PF2 ficam apagados
sta   PF2
lda   #$FF     ;   Cor do playfield
sta   COLUPF   ;   (possivelmente amarelo)
lda   #$00     ;   Reset no bit 0 do CTRLPF
sta   CTRLPF   ;     para duplicar o PF
ldx   #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
Kernel
Scanline:
  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 principal
Overscan:
  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 bit
Frase:
  .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 finais
ORG $FFFA           ; Ficam no final da
                    ; ROM (cartucho)

.WORD InicioFrame   ; Endereço NMI
.WORD InicioFrame   ; Endereço BOOT
.WORD InicioFrame   ; Endereço BRK

END
Montando e Executando
dasm 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 do
registrador 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 playfield

Problema: como mostrar coisas
  DIFERENTES em cada lado?

  Solução: mudar o playfield
  enquanto o canhão passa!
canhã
      o

configure o playfield para “3”
    no início da scanline
canhão

quando 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 com
aleatoriedade aceitável e que também
gera 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 um
gerador de 16 bits (que eventualmente
 se repete), com pequenos ajustes para
tornar 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 para
determine a posição horizontal de
     players, missiles ou ball
  Você tem que contar o tempo
até que o canhão esteja na posição
e 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 em
uma 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 o
canhã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ígitos

Quando o canhão estiver terminando
a 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 o
player 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 a
tela, 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 mais
O nosso Hello, World:              http://pastebin.com/abBRfUjd
Sorteio 2600                       http://github.com/chesterbr/sorteio2600
Racing The Beam (livro):           http://bit.ly/dSqhjS
Palestra David Crane (Pitfall):    http://youtu.be/MBT1OK6VAIU
Tutoriais do Crane para iOS:       http://bit.ly/9pwYHs e http://bit.ly/qWBciZ
Stella Programmer's Guide:         http://emu-docs.org/?page=Atari%202600
Código-fonte de jogos clássicos:   http://classicdev.org/wiki/2600/Source_Code
Especificações do Atari:           http://nocash.emubase.de/2k6specs.htm
Referência 6502:                   http://bit.ly/hxG5c6
Emulador 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.com
Exemplos de som no TIA:            http://bit.ly/tnbPrp
Bankswitching (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 acima

Fotos e ilustrações de terceiros usados sob premissa de “fair use” têm
    sua autoria mencionada e também excluídos da licença acima

Atari™, Adventure™, Donkey Kong™, Pitfall™, Super Mario™ e outros
personagens/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

Mais conteúdo relacionado

PPTX
Wrapped diffuse
PPT
OpenGL 3.2 and More
PPTX
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
PPTX
Built for performance: the UIElements Renderer – Unite Copenhagen 2019
PDF
BUD17-302: LLVM Internals #2
PDF
The Rendering Technology of 'Lords of the Fallen' (Game Connection Europe 2014)
PDF
Practical Spherical Harmonics Based PRT Methods
PPTX
A Certain Slant of Light - Past, Present and Future Challenges of Global Illu...
Wrapped diffuse
OpenGL 3.2 and More
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
Built for performance: the UIElements Renderer – Unite Copenhagen 2019
BUD17-302: LLVM Internals #2
The Rendering Technology of 'Lords of the Fallen' (Game Connection Europe 2014)
Practical Spherical Harmonics Based PRT Methods
A Certain Slant of Light - Past, Present and Future Challenges of Global Illu...

Mais procurados (13)

PPTX
0x003 - Exploiting LOLDrivers - Physical Memory Mayhem
PDF
Introduction to behavior based recommendation system
PDF
James Cameron Masterclass | Purpose Studios.pdf
PDF
Modern OpenGL Usage: Using Vertex Buffer Objects Well
PDF
Screen Space Decals in Warhammer 40,000: Space Marine
PDF
Anchor free object detection by deep learning
PDF
Oracle Cloud is Best for Oracle Database - High Availability
PDF
Choi JiHyun NDC2011
PDF
Tutorial on Polynomial Networks at CVPR'22
PDF
Attribute Based Encryption
PPT
NVIDIA OpenGL 4.6 in 2017
PPTX
Tips and experience_of_dx12_engine_development._ver_1.2
PDF
그래픽 최적화로 가...가버렷! (부제: 배치! 배칭을 보자!) , Batch! Let's take a look at Batching! -...
0x003 - Exploiting LOLDrivers - Physical Memory Mayhem
Introduction to behavior based recommendation system
James Cameron Masterclass | Purpose Studios.pdf
Modern OpenGL Usage: Using Vertex Buffer Objects Well
Screen Space Decals in Warhammer 40,000: Space Marine
Anchor free object detection by deep learning
Oracle Cloud is Best for Oracle Database - High Availability
Choi JiHyun NDC2011
Tutorial on Polynomial Networks at CVPR'22
Attribute Based Encryption
NVIDIA OpenGL 4.6 in 2017
Tips and experience_of_dx12_engine_development._ver_1.2
그래픽 최적화로 가...가버렷! (부제: 배치! 배칭을 보자!) , Batch! Let's take a look at Batching! -...
Anúncio

Destaque (20)

PPTX
The Video Game R-Evolution
PPTX
Atari 2600 Programming for Fun
PDF
E.T. The Extra-Terrestrial - Atari 2600 - Manual
PDF
Atari 2600 VCS Programming
PDF
git fail --force (make it up with your pull requests)
PDF
ruby2600 - an Atari 2600 emulator written in Ruby
PDF
Educacao Digital
PDF
Dinâmicas de grupo
PDF
Português esquematizado
PPS
Plano de ação para coordenação pedagógica
PPT
Como Elaborar Projetos Sociais
PDF
git fail --force (faça as pazes com seus pull requests)
PDF
Micro RetroKomp
PPTX
Primeras consolas de Nintendo
PDF
[Especial] 70 edições da Revista Nintendo Blast
PPT
Adventure lecture
PPTX
PPTX
History of Video Games up to 90s
DOCX
Criando uma imagem personalizada no windows 8
PPTX
Testar é tão fácil que até minha mãe testaria!
The Video Game R-Evolution
Atari 2600 Programming for Fun
E.T. The Extra-Terrestrial - Atari 2600 - Manual
Atari 2600 VCS Programming
git fail --force (make it up with your pull requests)
ruby2600 - an Atari 2600 emulator written in Ruby
Educacao Digital
Dinâmicas de grupo
Português esquematizado
Plano de ação para coordenação pedagógica
Como Elaborar Projetos Sociais
git fail --force (faça as pazes com seus pull requests)
Micro RetroKomp
Primeras consolas de Nintendo
[Especial] 70 edições da Revista Nintendo Blast
Adventure lecture
History of Video Games up to 90s
Criando uma imagem personalizada no windows 8
Testar é tão fácil que até minha mãe testaria!
Anúncio

Semelhante a Programação para Atari 2600 (20)

PDF
Programação para Atari 2600
PDF
Slides CB2k DevInSampa 2012
PDF
Desenvolvimento de jogos para MSX
PDF
Utilização da Engine de Jogos CryENGINE para o Desenvolvimento de Aplicativos...
PPTX
Playstation Mobile - Campus Party 2013
PDF
XNA Framework
PPTX
Introdução ao XNA
PDF
Cth c9 p014
PDF
Fábio Draco - Programando Vídeo Games
PDF
Computação gráfica
PDF
Computação gráfica
PPT
8085 2
PDF
Minicurso pygame
PDF
Desenvolvendo Jogos com pygame.
PDF
Hardware de sistemas
PDF
Augusto loureiro sistemas microprocessados
PDF
Grafica
PPTX
Game programming
PPT
CMG Brasil 2012 - Uso de Lines nos z196
Programação para Atari 2600
Slides CB2k DevInSampa 2012
Desenvolvimento de jogos para MSX
Utilização da Engine de Jogos CryENGINE para o Desenvolvimento de Aplicativos...
Playstation Mobile - Campus Party 2013
XNA Framework
Introdução ao XNA
Cth c9 p014
Fábio Draco - Programando Vídeo Games
Computação gráfica
Computação gráfica
8085 2
Minicurso pygame
Desenvolvendo Jogos com pygame.
Hardware de sistemas
Augusto loureiro sistemas microprocessados
Grafica
Game programming
CMG Brasil 2012 - Uso de Lines nos z196

Mais de Carlos Duarte do Nascimento (7)

PDF
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
PDF
Mashups: Criando Valor na Web 2.0 (BandTec)
PDF
Aplicativos Mobile: Da Idéia ao Produto (ou não)
PDF
Apontador API (para programadores Python)
PDF
Mashups: Criando Valor na Web 2.0
PDF
Cruzalinhas - Palestra Relâmpago no Fisl 11
PDF
SlideMeme - Habilitando o SlideShare dentro do Yahoo! Meme - Yahoo! Open Hack...
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Mashups: Criando Valor na Web 2.0 (BandTec)
Aplicativos Mobile: Da Idéia ao Produto (ou não)
Apontador API (para programadores Python)
Mashups: Criando Valor na Web 2.0
Cruzalinhas - Palestra Relâmpago no Fisl 11
SlideMeme - Habilitando o SlideShare dentro do Yahoo! Meme - Yahoo! Open Hack...

Último (19)

PPTX
Aula 18 - Manipulacao De Arquivos python
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Apple Pippin Uma breve introdução. - David Glotz
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PDF
Processos na gestão de transportes, TM100 Col18
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Aula 18 - Manipulacao De Arquivos python
Aula04-Academia Heri- Tecnologia Geral 2025
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Apple Pippin Uma breve introdução. - David Glotz
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
COBITxITIL-Entenda as diferença em uso governança TI
Processos na gestão de transportes, TM100 Col18
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Custos e liquidação no SAP Transportation Management, TM130 Col18
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14

Programação para Atari 2600

  • 1. game program™ PROGRAMAÇÃO PARA ATARI 2600 Use with Joystick Controllers
  • 2. Proposta Entender o que torna o Atari tão diferente de outros sistemas, aprendendo o básico para escrever um “Hello, World” e poder apreciar clássicos como Enduro ou Pitfall! pela habilidade de seus criadores http://slideshare.net/chesterbr
  • 3. Palestrante @chesterbr http://chester.me
  • 4. Palestrante @chesterbr http://chester.me
  • 6. imagem: mitchelaneous.com Mais de 600 jogos...
  • 7. mas por que eram tão... “Atari”?
  • 8. Por dentro do Atari (Jr.) Fotos: Larry Ziegler (2600 CE)
  • 9. CPU: 6507 Fotos: Larry Ziegler (2600 CE)
  • 10. CPU: 6507 2 650 Fotos: Larry Ziegler (2600 CE)
  • 11. Video: TIA Fotos: Larry Ziegler (2600 CE)
  • 12. Todo o resto: RIOT (6532) Fotos: Larry Ziegler (2600 CE)
  • 13. Mapa da Memória 0000-002C – TIA (Escrita) 0030-003D – TIA (Leitura) 0080-00FF – RIOT (RAM) 0280-0297 – RIOT (I/O, Timer) F000-FFFF – Cartucho (ROM)
  • 14. Mapa da Memória 4 KBytes! F000-FFFF – Cartucho (ROM) esse nem é o maior problema...
  • 15. Mapa da Memória 128 BYTES!!!!! (1/8 de KB) 0080-00FF – RIOT (RAM) e esse ainda não é o maior problema...
  • 16. VRAM Um chip de vídeo típico transforma padrões de bits armazenados em memória (VRAM) em pixels e cores
  • 17. VRAM VRAM VRAM 38 44 44 7C 44 44 EE 00
  • 18. VRAM Quanto mais memória (VRAM), maior a resolução, e variedade de cores. Memória era cara nos anos 70/80, levando a um tradeoff. Quanta VRAM o Atari tem?
  • 19. Mapa da Memória 0000-002C – TIA (Escrita) 0030-003D – TIA (Leitura) 0080-00FF – RIOT (RAM) 0280-0297 – RIOT (I/O, Timer) F000-FFFF – Cartucho (ROM)
  • 21. Mapa da Memória 0 bytes !!!! ????-???? – VRAM #comofas?
  • 23. Funcionamento da TV Fonte: How Stuff Works
  • 24. Funcionamento da TV Fonte: How Stuff Works
  • 25. Scanlines 60 quadros (frames) por segundo Fonte: How Stuff Works
  • 26. TIA opera em scanlines Para 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
  • 28. E que objetos são esses? ● Playfield (PF) ● Players (P0, P1) ● Missiles/Ball (M0, M1, BL)
  • 29. Playfield Um 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
  • 34. Configurando o playfield PF0 = 0000 ←← leitura PF1 = 00000000 leitura →→ PF2 = 00000000 ←← leitura REFLECT = 0 scanline resultante ████████████████████████████████████████
  • 35. Configurando o playfield PF0 = 0001 ←← leitura PF1 = 00000000 leitura →→ PF2 = 00000000 ←← leitura REFLECT = 0 scanline resultante ████████████████████████████████████████
  • 36. Configurando o playfield PF0 = 0011 ←← leitura PF1 = 00000000 leitura →→ PF2 = 00000000 ←← leitura REFLECT = 0 scanline resultante ████████████████████████████████████████
  • 37. Configurando o playfield PF0 = 0111 ←← leitura PF1 = 00000000 leitura →→ PF2 = 00000000 ←← leitura REFLECT = 0 scanline resultante ████████████████████████████████████████
  • 38. Configurando o playfield PF0 = 1111 ←← leitura PF1 = 11110000 leitura →→ PF2 = 00000000 ←← leitura REFLECT = 0 scanline resultante ████████████████████████████████████████
  • 39. Configurando o playfield PF0 = 1111 ←← leitura PF1 = 11111110 leitura →→ PF2 = 00010101 ←← leitura REFLECT = 0 scanline resultante ████████████████████████████████████████
  • 40. Configurando o playfield PF0 = 1111 ←← leitura PF1 = 11111110 leitura →→ PF2 = 00010101 ←← leitura REFLECT = 1 scanline resultante ████████████████████████████████████████
  • 42. Players Cada 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
  • 45. Players É possível esticar/multiplicar e inverter o desenho de cada player usando os registradores NUSIZn e REFPn (n=0 ou 1)
  • 46. NUSIZn (em 5 scanlines) 000 001 010 NUSIZn 011 100 101 110 111
  • 47. Ligando o REFPn 000 001 010 NUSIZn 011 100 101 110 111
  • 53. 8 bits exigem criatividade vs.
  • 54. 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.
  • 56. BALL
  • 57. BALL MISSILE
  • 58. BALL MISSILE
  • 59. Idéia geral Para cada scanline, você configura o formato dos objetos (playfield, players, missiles/ball) e as cores/efeitos deles. O que você configura em uma scanline vale para as seguintes, mas ainda assim o tempo é um problema
  • 60. Contas de padaria: 6502 ≈ 1,19Mhz (1.194.720 ciclos/seg) NTSC: 60 frames (telas) por seg 1.194.720/60 ≅ 19.912 ciclos por tela
  • 61. Contas de padaria: CPU: 19.912 ciclos por tela NTSC: 262 scanlines por frame 19.912 / 262 = 76 ciclos por scanline
  • 62. Contas de padaria: CPU: 19.912 ciclos por tela NTSC: 262 scanlines por frame 19.912 / 262 = 76 ciclos por scanline e o que se faz com “76 ciclos”? (aliás, o que exatamente é um “ciclo”?)
  • 65. 6502
  • 66. 6502 (no Atari) Executa instruções armazenadas na ROM que manipulam e transferem bytes entre o RIOT (RAM + I/O + timers) e o TIA, com o apoio de registradores internos.
  • 67. 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
  • 68. Registradores do 6502 A = Acumulador (8 bits) X,Y= Índices (8 bits) S = Stack Pointer (8 bits) P = Status (flags, 8 bits) PC = Program Counter (16 bits)
  • 69. 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
  • 70. 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”
  • 72. Linguagem Assembly Atribui a cada opcode uma sigla (“mnemônico”) e define uma notação para os parâmetros
  • 73. 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”
  • 74. Assembly 6502 AD LDA $0200 00 02 69 ADC #01 01 8D STA $0201 01 02
  • 75. Assembler (Montador) Programa que lê um arquivo-texto escrito em linguagem Assembly e monta o arquivo binário (código de máquina) correspondente foo.asm foo.bin LDA $0200 ASSEMBLER AD000269 ADC #01 018D0102 STA $0201 ... ...
  • 76. DASM ● Macro Assembler 6502 ● Inclui headers para Atari ● Multiplataforma ● Livre (GPLv2) http://dasm-dillon.sourceforge.net/
  • 77. 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
  • 78. Instruções do 6502 = mais relevantes para o Atari
  • 79. Transferindo Dados LDA, LDX, LDY = Load STA, STX, STY = Store TAX, TAY, TXA, TYA, TSX, TXS = Transfer LDA #$10 0x10→A STY $0200 Y→m(0x0200) TXA X→A
  • 80. Aritmética ADC, SBC = +,- (C=“vai um”) INC, DEC = ++,-- (memória) INX, INY, DEX, DEY = ++,-- ADC $0100 m(0x100)+A→A INC $0200 m(0x200)+1→ m(0x200) DEX X-1→X
  • 81. Operações em Bits AND, ORA, EOR = and, or, xor (A) ASL, LSR = Shift aritmético/lógico ROL, ROR = Shift “rotacional” AND #$11 A&0x11→A LSR A>>1→A (A/2→A) ROR A>>1 (bit 7=carry)
  • 82. Comparações e Desvios CMP, CPX, CPY = compara A/X/Y (-) BCS, BCC = desvia se Carry/Não BEQ, BNE = desvia se Equal/Não BVS, BVC = desvia se Overflow/Não BMI, BPL = desvia se Minus/Plus CPY $1234 se y=m(0x1234), BEQ $0200 0x0200→PC
  • 83. Pilha e Subrotinas JSR, RTS = chama subrotina/retorna PHA, PLA = push/pop(pull) do A PHP, PLP = push/pop do status (P) JMP $1234 0x1234→PC JSR $1234 PC(+3)→pilha, 0x1234→PC RTS pilha→PC
  • 84. O Resto... NOP = No Operation (nada!) JMP = Desvio direto (GOTO) SEC, CLC = Set/Clear Carry SEV, CLV = Set/Clear oVerflow SEI, CLI = Set/Clear Interrupt-off SED, CLD = Set/Clear Decimal RTI = Return from Interrupt BRK = Break
  • 85. © 1999 Warner Bros Neo: “I know kung fu.” Morpheus: “Show me.”
  • 87. Hello, World! Escrever na horizontal é complicado (muitos pixels/elementos por scanline)
  • 88. Hello, World! É mais fácil escrever na vertical → (menos pixels/scanline) Podemos usar um player ou o playfield
  • 89. Display kernel É a parte do programa que roda quando o canhão está desenhando a tela propriamente dita (através do playfield, players e missiles/ball)
  • 90. (3+37+30).76 = 5320 ciclos LÓGICA DO JOGO KERNEL Fonte: Stella Programmers Guide, Steve Wright, 1979
  • 91. Estrutura do programa VSYNC VBLANK KERNEL (desenha a tela) OVERSCAN
  • 92. Estrutura do programa VSYNC Playfield VBLANK OVERSCAN
  • 93. Estrutura do programa VSYNC VBLANK Loop 11 chars x Principal 8 linhas x (eterno) 2 linhas por Kernel scanline = loop X: 0 a 191 176 (192 scanlines) scanlines OVERSCAN
  • 94. Começando o programa PROCESSOR 6502 INCLUDE "vcs.h" ORG $F000 ; Início do cartucho VSYNC VBLANK KERNEL OVERSCAN
  • 95. 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
  • 96. Desligando elementos lda #$00 sta ENABL ; Desliga ball sta ENAM0 ; Desliga missiles sta ENAM1 sta GRP0 ; Desliga players sta GRP1 VSYNC VBLANK KERNEL OVERSCAN
  • 97. Configurando o Playfield sta COLUBK ; Cor de fundo (0=preto) sta PF0 ; PF0 e PF2 ficam apagados sta PF2 lda #$FF ; Cor do playfield sta COLUPF ; (possivelmente amarelo) lda #$00 ; Reset no bit 0 do CTRLPF sta CTRLPF ; para duplicar o PF ldx #0 ; X=contador de scanlines VSYNC VBLANK KERNEL OVERSCAN
  • 98. 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
  • 99. Kernel Scanline: 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
  • 100. 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
  • 101. Fechando o loop principal Overscan: 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
  • 102. A frase, bit a bit Frase: .BYTE %00000000 ; H .BYTE %01000010 .BYTE %01111110 .BYTE %01000010 .BYTE %01000010 .BYTE %01000010 .BYTE %00000000 .BYTE %00000000 ; E .BYTE %01111110 ...
  • 103. 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
  • 104. Configurações finais ORG $FFFA ; Ficam no final da ; ROM (cartucho) .WORD InicioFrame ; Endereço NMI .WORD InicioFrame ; Endereço BOOT .WORD InicioFrame ; Endereço BRK END
  • 105. Montando e Executando dasm fonte.asm -oromcartucho.bin -f3 http://stella.sourceforge.net/
  • 108. Placar com playfield Para identificar os placares, é possível usar as cores dos players no playfield, setando o bit 1 do registrador CTRLPF (score mode) O lado esquerdo fica com a cor do P0, e o direito com a cor do P1
  • 110. (isso dá idéias para melhorar nosso Hello World?)
  • 111. (isso dá idéias para melhorar nosso Hello World?)
  • 112. Placar com playfield Problema: como mostrar coisas DIFERENTES em cada lado? Solução: mudar o playfield enquanto o canhão passa!
  • 113. canhã o configure o playfield para “3” no início da scanline
  • 114. canhão quando o canhão estiver no meio, configure o playfield do “1”...
  • 115. o canhã ...e você terá um desenho diferente do outro lado!
  • 117. 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
  • 118. Pitfall! Solução: gerador de sequência com aleatoriedade aceitável e que também gera 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
  • 119. River Raid A mesma solução é aplicada com um gerador de 16 bits (que eventualmente se repete), com pequenos ajustes para tornar 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
  • 121. Posição horizontal Não existe um registrador para determine a posição horizontal de players, missiles ou ball Você tem que contar o tempo até que o canhão esteja na posição e acionar o strobe correspondente
  • 122. PONTOS DE STROBE (na teoria)
  • 123. 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 ↔
  • 124. 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)
  • 126. MOVIMENTO ↔ registradores HMP0/1 e HMM0/1 MOVIMENTO ↕ basta desenhar o player/missle em uma scanline diferente a cada frame
  • 128. Placar com múltiplos dígitos O truque é o mesmo do placar com playfield: mudar a imagem com o canhão andando, mas o timing tem que ser muito mais preciso Digamos que o placar seja 456789...
  • 129. 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
  • 130. Placar com múltiplos dígitos Posicione o player 1 à direita do player 0, encavalando as cópias: Player 1 454545 Player 0
  • 131. Placar com múltiplos dígitos Troque o desenho dos players (GRP0/GRP1) sincronizando com o canhão, assim: 454545 CANHÃO
  • 132. Placar com múltiplos dígitos Quando o canhão estiver terminando a 1ª cópia do player 1, altere o player 0 para 6 e o player 1 para 7: 454545 CANHÃO
  • 133. Placar com múltiplos dígitos Repita o truque ao final da 2ª cópia do player 2, dessa vez alternado o player 0 para 8 e o player 1 para 9 456767 CANHÃO
  • 134. Placar com múltiplos dígitos Faça a mesma coisa para cada scanline do placar! 456789 CANHÃO
  • 135. 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!
  • 137. Tirando leite de pedra Quando observar um jogo de Atari, tente identificar os truques que o(a) programador(a) usou: como dividiu a tela, o que tem em cada scanline, como gastou a RAM e a ROM...
  • 138. 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á!
  • 139. Para aprender mais O nosso Hello, World: http://pastebin.com/abBRfUjd Sorteio 2600 http://github.com/chesterbr/sorteio2600 Racing The Beam (livro): http://bit.ly/dSqhjS Palestra David Crane (Pitfall): http://youtu.be/MBT1OK6VAIU Tutoriais do Crane para iOS: http://bit.ly/9pwYHs e http://bit.ly/qWBciZ Stella Programmer's Guide: http://emu-docs.org/?page=Atari%202600 Código-fonte de jogos clássicos: http://classicdev.org/wiki/2600/Source_Code Especificações do Atari: http://nocash.emubase.de/2k6specs.htm Referência 6502: http://bit.ly/hxG5c6 Emulador 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.com Exemplos de som no TIA: http://bit.ly/tnbPrp Bankswitching (mais ROM/RAM): http://bit.ly/tqhLZk
  • 140. Dúvidas? Obrigado! @chesterbr http://chester.me http://slideshare.net/chesterbr
  • 141. 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 acima Fotos e ilustrações de terceiros usados sob premissa de “fair use” têm sua autoria mencionada e também excluídos da licença acima Atari™, Adventure™, Donkey Kong™, Pitfall™, Super Mario™ e outros personagens/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