SlideShare uma empresa Scribd logo
1 de 140
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
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
████████████████████████████████████████
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
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
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”
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 P1 8 pixels à direita do
      P0, encavalando as cópias:
                          Player 1

            454545

       Player 0
Placar com múltiplos dígitos

   Troque o desenho da scanline
 (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 P2, altere o P1 para
        6 e o P2 para 7:

          454545

              CANHÃO
Placar com múltiplos dígitos

Repita o truque ao final da 2ª cópia
do P2, dessa vezalterando o P1 para
         8 e o P2 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

Mais procurados

Introdução à estrutura e funcionamento de um sistema informático
Introdução à estrutura e funcionamento de um sistema informáticoIntrodução à estrutura e funcionamento de um sistema informático
Introdução à estrutura e funcionamento de um sistema informático
Ricardo Santos
 
Placa Mãe - Atualizado 29/10/2014
Placa Mãe - Atualizado 29/10/2014Placa Mãe - Atualizado 29/10/2014
Placa Mãe - Atualizado 29/10/2014
Evandro Júnior
 
8086-instruction-set-ppt
 8086-instruction-set-ppt 8086-instruction-set-ppt
8086-instruction-set-ppt
jemimajerome
 

Mais procurados (20)

Aula 12 - Processador
Aula 12 - ProcessadorAula 12 - Processador
Aula 12 - Processador
 
Input output module
Input output moduleInput output module
Input output module
 
Montagem manutenção de computadores
Montagem manutenção de computadoresMontagem manutenção de computadores
Montagem manutenção de computadores
 
Introdução à estrutura e funcionamento de um sistema informático
Introdução à estrutura e funcionamento de um sistema informáticoIntrodução à estrutura e funcionamento de um sistema informático
Introdução à estrutura e funcionamento de um sistema informático
 
Placa Mãe - Atualizado 29/10/2014
Placa Mãe - Atualizado 29/10/2014Placa Mãe - Atualizado 29/10/2014
Placa Mãe - Atualizado 29/10/2014
 
Microprocessor 8086
Microprocessor 8086Microprocessor 8086
Microprocessor 8086
 
Block I/O Layer Tracing: blktrace
Block I/O Layer Tracing: blktraceBlock I/O Layer Tracing: blktrace
Block I/O Layer Tracing: blktrace
 
Placa mãe
Placa mãePlaca mãe
Placa mãe
 
Microprocessor 80286
Microprocessor 80286Microprocessor 80286
Microprocessor 80286
 
USB Drivers
USB DriversUSB Drivers
USB Drivers
 
8086-instruction-set-ppt
 8086-instruction-set-ppt 8086-instruction-set-ppt
8086-instruction-set-ppt
 
INTEL 8086 MICROPROCESSOR
INTEL 8086 MICROPROCESSORINTEL 8086 MICROPROCESSOR
INTEL 8086 MICROPROCESSOR
 
Input & Output
Input & OutputInput & Output
Input & Output
 
BKK16-312 Integrating and controlling embedded devices in LAVA
BKK16-312 Integrating and controlling embedded devices in LAVABKK16-312 Integrating and controlling embedded devices in LAVA
BKK16-312 Integrating and controlling embedded devices in LAVA
 
Memory Segmentation of 8086
Memory Segmentation of 8086Memory Segmentation of 8086
Memory Segmentation of 8086
 
Apresentação Aula Memoria
Apresentação Aula MemoriaApresentação Aula Memoria
Apresentação Aula Memoria
 
Arquitetura de Hardware
Arquitetura de HardwareArquitetura de Hardware
Arquitetura de Hardware
 
07 Input Output
07  Input  Output07  Input  Output
07 Input Output
 
Physical Memory Models.pdf
Physical Memory Models.pdfPhysical Memory Models.pdf
Physical Memory Models.pdf
 
Placa Mãe
Placa MãePlaca Mãe
Placa Mãe
 

Semelhante a Programação para Atari 2600

Desenvolvimento De Jogos Na Plataforma Xna
Desenvolvimento De Jogos Na Plataforma XnaDesenvolvimento De Jogos Na Plataforma Xna
Desenvolvimento De Jogos Na Plataforma Xna
Ellison Leão
 
Componentes PC - Dez.2008
Componentes PC - Dez.2008Componentes PC - Dez.2008
Componentes PC - Dez.2008
prapina
 

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

Programação para Atari 2600
Programação para Atari 2600Programação para Atari 2600
Programação para Atari 2600
 
Seminário de Sistemas Embarcados - Análise sobre Super Nintendo e PlayStation 4
Seminário de Sistemas Embarcados - Análise sobre Super Nintendo e PlayStation 4Seminário de Sistemas Embarcados - Análise sobre Super Nintendo e PlayStation 4
Seminário de Sistemas Embarcados - Análise sobre Super Nintendo e PlayStation 4
 
FLTK Summer Course - Part VIII - Eighth Impact
FLTK Summer Course - Part VIII - Eighth ImpactFLTK Summer Course - Part VIII - Eighth Impact
FLTK Summer Course - Part VIII - Eighth Impact
 
Programação básica de microcontroladores
Programação básica de microcontroladoresProgramação básica de microcontroladores
Programação básica de microcontroladores
 
Aula 2 periféricos
Aula 2   periféricosAula 2   periféricos
Aula 2 periféricos
 
Como criar o seu próprio joystick!
Como criar o seu próprio joystick!Como criar o seu próprio joystick!
Como criar o seu próprio joystick!
 
Cheat sheet Mips 32 bits
Cheat sheet Mips 32 bitsCheat sheet Mips 32 bits
Cheat sheet Mips 32 bits
 
Introdução a plataforma arduino
Introdução a plataforma arduinoIntrodução a plataforma arduino
Introdução a plataforma arduino
 
Desenvolvimento De Jogos Na Plataforma Xna
Desenvolvimento De Jogos Na Plataforma XnaDesenvolvimento De Jogos Na Plataforma Xna
Desenvolvimento De Jogos Na Plataforma Xna
 
Componentes PC - Dez.2008
Componentes PC - Dez.2008Componentes PC - Dez.2008
Componentes PC - Dez.2008
 
Utilizando um Display de LCD
Utilizando um Display de LCDUtilizando um Display de LCD
Utilizando um Display de LCD
 
Microcontroladores pic ling c unicamp
Microcontroladores pic ling c unicampMicrocontroladores pic ling c unicamp
Microcontroladores pic ling c unicamp
 
Microcontroladores pic lingc unicamp-150206140414-conversion-gate02
Microcontroladores pic lingc unicamp-150206140414-conversion-gate02Microcontroladores pic lingc unicamp-150206140414-conversion-gate02
Microcontroladores pic lingc unicamp-150206140414-conversion-gate02
 
Introdução às TIC
Introdução às TICIntrodução às TIC
Introdução às TIC
 
Python 05 - Ponto flutuante
Python 05  - Ponto flutuantePython 05  - Ponto flutuante
Python 05 - Ponto flutuante
 
Mini Curso Sistemas Embarcados
Mini Curso Sistemas EmbarcadosMini Curso Sistemas Embarcados
Mini Curso Sistemas Embarcados
 
Curso "Desenvolvendo aplicações de uso geral para GPU com CUDA".
Curso "Desenvolvendo aplicações de uso geral para GPU com CUDA".Curso "Desenvolvendo aplicações de uso geral para GPU com CUDA".
Curso "Desenvolvendo aplicações de uso geral para GPU com CUDA".
 
Criando um sistema operacional básico
Criando um sistema operacional básicoCriando um sistema operacional básico
Criando um sistema operacional básico
 
FAT
FATFAT
FAT
 
Fundamentos de Informática Gráfica
Fundamentos de Informática Gráfica Fundamentos de Informática Gráfica
Fundamentos de Informática Gráfica
 

Mais de Campus Party Brasil

Tempestades solares: mitos e verdades
Tempestades solares: mitos e verdadesTempestades solares: mitos e verdades
Tempestades solares: mitos e verdades
Campus Party Brasil
 
A busca por planetas além do sistema solar
A busca por planetas além do sistema solarA busca por planetas além do sistema solar
A busca por planetas além do sistema solar
Campus Party Brasil
 
Construção de uma luneta a baixo custo
Construção de uma luneta a baixo custoConstrução de uma luneta a baixo custo
Construção de uma luneta a baixo custo
Campus Party Brasil
 
Hardware livre Arduino: eletrônica e robótica com hardware e software livres
Hardware livre Arduino: eletrônica e robótica com hardware e software livresHardware livre Arduino: eletrônica e robótica com hardware e software livres
Hardware livre Arduino: eletrônica e robótica com hardware e software livres
Campus Party Brasil
 
Robótica e educação inclusiva
Robótica e educação inclusivaRobótica e educação inclusiva
Robótica e educação inclusiva
Campus Party Brasil
 
Robótica e educação inclusiva
	Robótica e educação inclusiva	Robótica e educação inclusiva
Robótica e educação inclusiva
Campus Party Brasil
 
Confecção de Circuito Impresso
Confecção de Circuito ImpressoConfecção de Circuito Impresso
Confecção de Circuito Impresso
Campus Party Brasil
 
Virtualização, cloud computig e suas tendencias
Virtualização, cloud computig e suas tendenciasVirtualização, cloud computig e suas tendencias
Virtualização, cloud computig e suas tendencias
Campus Party Brasil
 

Mais de Campus Party Brasil (20)

Wordpress
WordpressWordpress
Wordpress
 
Buracos negros
Buracos negrosBuracos negros
Buracos negros
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
Técnicas forenses para a recuperação de arquivos
Técnicas forenses para a recuperação de arquivosTécnicas forenses para a recuperação de arquivos
Técnicas forenses para a recuperação de arquivos
 
Como ganhar dinheiro no mundo mobile?
Como ganhar dinheiro no mundo mobile?Como ganhar dinheiro no mundo mobile?
Como ganhar dinheiro no mundo mobile?
 
Tempestades solares: mitos e verdades
Tempestades solares: mitos e verdadesTempestades solares: mitos e verdades
Tempestades solares: mitos e verdades
 
A busca por planetas além do sistema solar
A busca por planetas além do sistema solarA busca por planetas além do sistema solar
A busca por planetas além do sistema solar
 
Passeio virtual pelo LHC
Passeio virtual pelo LHCPasseio virtual pelo LHC
Passeio virtual pelo LHC
 
Construção de uma luneta a baixo custo
Construção de uma luneta a baixo custoConstrução de uma luneta a baixo custo
Construção de uma luneta a baixo custo
 
Hardware livre Arduino: eletrônica e robótica com hardware e software livres
Hardware livre Arduino: eletrônica e robótica com hardware e software livresHardware livre Arduino: eletrônica e robótica com hardware e software livres
Hardware livre Arduino: eletrônica e robótica com hardware e software livres
 
Robótica e educação inclusiva
Robótica e educação inclusivaRobótica e educação inclusiva
Robótica e educação inclusiva
 
Fazendo do jeito certo: criando jogos sofisticados com DirectX
Fazendo do jeito certo: criando jogos sofisticados com DirectXFazendo do jeito certo: criando jogos sofisticados com DirectX
Fazendo do jeito certo: criando jogos sofisticados com DirectX
 
Blue Via
Blue ViaBlue Via
Blue Via
 
Linux para iniciantes
Linux para iniciantesLinux para iniciantes
Linux para iniciantes
 
Robótica e educação inclusiva
	Robótica e educação inclusiva	Robótica e educação inclusiva
Robótica e educação inclusiva
 
Gestão e monitoramento de redes e dispositivos com Software Livre
Gestão e monitoramento de redes e dispositivos com Software LivreGestão e monitoramento de redes e dispositivos com Software Livre
Gestão e monitoramento de redes e dispositivos com Software Livre
 
Confecção de Circuito Impresso
Confecção de Circuito ImpressoConfecção de Circuito Impresso
Confecção de Circuito Impresso
 
Vida de Programador
Vida de Programador Vida de Programador
Vida de Programador
 
Virtualização, cloud computig e suas tendencias
Virtualização, cloud computig e suas tendenciasVirtualização, cloud computig e suas tendencias
Virtualização, cloud computig e suas tendencias
 
Desafio Robótica Livre
Desafio Robótica LivreDesafio Robótica Livre
Desafio Robótica Livre
 

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
  • 5. imagem: mitchelaneous.com Mais de 600 jogos...
  • 6. mas por que eram tão... “Atari”?
  • 7. Por dentro do Atari (Jr.) Fotos: Larry Ziegler (2600 CE)
  • 8. CPU: 6507 Fotos: Larry Ziegler (2600 CE)
  • 9. CPU: 6507 2 650 Fotos: Larry Ziegler (2600 CE)
  • 10. Video: TIA Fotos: Larry Ziegler (2600 CE)
  • 11. Todo o resto: RIOT (6532) Fotos: Larry Ziegler (2600 CE)
  • 12. 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)
  • 13. Mapa da Memória 4 KBytes! F000-FFFF – Cartucho (ROM) esse nem é o maior problema...
  • 14. Mapa da Memória 128 BYTES!!!!! (1/8 de KB) 0080-00FF – RIOT (RAM) e esse ainda não é o maior problema...
  • 15. VRAM Um chip de vídeo típico transforma padrões de bits armazenados em memória (VRAM) em pixels e cores
  • 16. VRAM VRAM VRAM 38 44 44 7C 44 44 EE 00
  • 17. 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?
  • 18. 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)
  • 20. Mapa da Memória 0 bytes !!!! ????-???? – VRAM #comofas?
  • 22. Funcionamento da TV Fonte: How Stuff Works
  • 23. Funcionamento da TV Fonte: How Stuff Works
  • 24. Scanlines 60 quadros (frames) por segundo Fonte: How Stuff Works
  • 25. 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
  • 27. E que objetos são esses? ● Playfield (PF) ● Players (P0, P1) ● Missiles/Ball (M0, M1, BL)
  • 28. 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
  • 33. Configurando o playfield PF0 = 0000 ←← leitura PF1 = 00000000 leitura →→ PF2 = 00000000 ←← leitura REFLECT = 0 scanline resultante ████████████████████████████████████████
  • 34. Configurando o playfield PF0 = 0001 ←← leitura PF1 = 00000000 leitura →→ PF2 = 00000000 ←← leitura REFLECT = 0 scanline resultante ████████████████████████████████████████
  • 35. Configurando o playfield PF0 = 0011 ←← leitura PF1 = 00000000 leitura →→ PF2 = 00000000 ←← leitura REFLECT = 0 scanline resultante ████████████████████████████████████████
  • 36. Configurando o playfield PF0 = 0111 ←← leitura PF1 = 00000000 leitura →→ PF2 = 00000000 ←← leitura REFLECT = 0 scanline resultante ████████████████████████████████████████
  • 37. Configurando o playfield PF0 = 1111 ←← leitura PF1 = 11110000 leitura →→ PF2 = 00000000 ←← leitura REFLECT = 0 scanline resultante ████████████████████████████████████████
  • 38. Configurando o playfield PF0 = 1111 ←← leitura PF1 = 11111110 leitura →→ PF2 = 00010101 ←← leitura REFLECT = 0 scanline resultante ████████████████████████████████████████
  • 39. Configurando o playfield PF0 = 1111 ←← leitura PF1 = 11111110 leitura →→ PF2 = 00010101 ←← leitura REFLECT = 1 scanline resultante ████████████████████████████████████████
  • 40.
  • 41. 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
  • 44. Players É possível esticar/multiplicar e inverter o desenho de cada player usando os registradores NUSIZn e REFPn (n=0 ou 1)
  • 45. NUSIZn (em 5 scanlines) 000 001 010 NUSIZn 011 100 101 110 111
  • 46. Ligando o REFPn 000 001 010 NUSIZn 011 100 101 110 111
  • 48.
  • 52. 8 bits exigem criatividade vs.
  • 53. 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.
  • 55. BALL
  • 56. BALL MISSILE
  • 57. BALL MISSILE
  • 58. 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
  • 59. 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
  • 60. Contas de padaria: CPU: 19.912 ciclos por tela NTSC: 262 scanlines por frame 19.912 / 262 = 76 ciclos por scanline
  • 61. 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”?)
  • 63.
  • 64. 6502
  • 65. 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.
  • 66. 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
  • 67. 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)
  • 68. 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
  • 69. 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”
  • 70.
  • 71. Linguagem Assembly Atribui a cada opcode uma sigla (“mnemônico”) e define uma notação para os parâmetros
  • 72. 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”
  • 73. Assembly 6502 AD LDA $0200 00 02 69 ADC #01 01 8D STA $0201 01 02
  • 74. 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 ... ...
  • 75. DASM ● Macro Assembler 6502 ● Inclui headers para Atari ● Multiplataforma ● Livre (GPLv2) http://dasm-dillon.sourceforge.net/
  • 76. 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
  • 77. Instruções do 6502 = mais relevantes para o Atari
  • 78. 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
  • 79. 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
  • 80. 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)
  • 81. 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
  • 82. 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
  • 83. 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
  • 84. © 1999 Warner Bros Neo: “I know kung fu.” Morpheus: “Show me.”
  • 86. Hello, World! Escrever na horizontal é complicado (muitos pixels/elementos por scanline)
  • 87. Hello, World! É mais fácil escrever na vertical → (menos pixels/scanline) Podemos usar um player ou o playfield
  • 88. 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)
  • 89. (3+37+30).76 = 5320 ciclos LÓGICA DO JOGO KERNEL Fonte: Stella Programmers Guide, Steve Wright, 1979
  • 90. Estrutura do programa VSYNC VBLANK KERNEL (desenha a tela) OVERSCAN
  • 91. Estrutura do programa VSYNC Playfield VBLANK OVERSCAN
  • 92. 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
  • 93. Começando o programa PROCESSOR 6502 INCLUDE "vcs.h" ORG $F000 ; Início do cartucho VSYNC VBLANK KERNEL OVERSCAN
  • 94. 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
  • 95. Desligando elementos lda #$00 sta ENABL ; Desliga ball sta ENAM0 ; Desliga missiles sta ENAM1 sta GRP0 ; Desliga players sta GRP1 VSYNC VBLANK KERNEL OVERSCAN
  • 96. 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
  • 97. 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
  • 98. 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
  • 99. 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
  • 100. 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
  • 101. 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 ...
  • 102. 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
  • 103. 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
  • 104. Montando e Executando dasm fonte.asm -oromcartucho.bin -f3 http://stella.sourceforge.net/
  • 107. 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
  • 109. (isso dá idéias para melhorar nosso Hello World?)
  • 110. (isso dá idéias para melhorar nosso Hello World?)
  • 111. Placar com playfield Problema: como mostrar coisas DIFERENTES em cada lado? Solução: mudar o playfield enquanto o canhão passa!
  • 112. canhã o configure o playfield para “3” no início da scanline
  • 113. canhão quando o canhão estiver no meio, configure o playfield do “1”...
  • 114. o canhã ...e você terá um desenho diferente do outro lado!
  • 116. 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
  • 117. 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
  • 118. 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
  • 120. 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
  • 121. PONTOS DE STROBE (na teoria)
  • 122. 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 ↔
  • 123. 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)
  • 125. MOVIMENTO ↔ registradores HMP0/1 e HMM0/1 MOVIMENTO ↕ basta desenhar o player/missle em uma scanline diferente a cada frame
  • 127. 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...
  • 128. 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
  • 129. Placar com múltiplos dígitos Posicione o P1 8 pixels à direita do P0, encavalando as cópias: Player 1 454545 Player 0
  • 130. Placar com múltiplos dígitos Troque o desenho da scanline (GRP0/GRP1) sincronizando com o canhão, assim: 454545 CANHÃO
  • 131. Placar com múltiplos dígitos Quando o canhão estiver terminando a 1ª cópia do P2, altere o P1 para 6 e o P2 para 7: 454545 CANHÃO
  • 132. Placar com múltiplos dígitos Repita o truque ao final da 2ª cópia do P2, dessa vezalterando o P1 para 8 e o P2 para 9 456767 CANHÃO
  • 133. Placar com múltiplos dígitos Faça a mesma coisa para cada scanline do placar! 456789 CANHÃO
  • 134. 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!
  • 136. 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...
  • 137. 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á!
  • 138. 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
  • 139. Dúvidas? Obrigado! @chesterbr http://chester.me http://slideshare.net/chesterbr
  • 140. 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