Programação para Atari 2600
-
Upload
chester-carlos-duarte-do-nascimento -
Category
Technology
-
view
68.755 -
download
11
description
Transcript of Programação para Atari 2600
![Page 1: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/1.jpg)
game program™PROGRAMAÇÃO PARA
ATARI 2600Use with Joystick Controllers
![Page 2: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/2.jpg)
Proposta
Entender o que torna o Ataritã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
![Page 5: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/5.jpg)
Atari 2600(Video Computer System)
![Page 6: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/6.jpg)
Mais de 600 jogos...imagem: mitchelaneous.com
![Page 7: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/7.jpg)
mas por que eram tão... “Atari”?
![Page 8: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/8.jpg)
Por dentro do Atari (Jr.)
Fotos: Larry Ziegler (2600 CE)
![Page 9: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/9.jpg)
CPU: 6507
Fotos: Larry Ziegler (2600 CE)
![Page 10: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/10.jpg)
CPU: 6507
Fotos: Larry Ziegler (2600 CE)
6502
![Page 11: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/11.jpg)
Video: TIA
Fotos: Larry Ziegler (2600 CE)
![Page 12: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/12.jpg)
Todo o resto: RIOT (6532)
Fotos: Larry Ziegler (2600 CE)
![Page 13: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/13.jpg)
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)
![Page 14: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/14.jpg)
Mapa da Memória
F000-FFFF – Cartucho (ROM)
esse nem é o maior problema...
4 KBytes!
![Page 15: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/15.jpg)
Mapa da Memória
0080-00FF – RIOT (RAM)
e esse ainda não é o maior problema...
128 BYTES!!!!!(1/8 de KB)
![Page 16: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/16.jpg)
VRAM
Um chip de vídeo típicotransforma padrões de bitsarmazenados em memória(VRAM) em pixels e cores
![Page 17: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/17.jpg)
VRAMVRAM
VRAM
3844447C4444EE00
![Page 18: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/18.jpg)
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?
![Page 19: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/19.jpg)
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)
![Page 20: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/20.jpg)
Mapa da Memória
????-???? – VRAM
![Page 21: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/21.jpg)
Mapa da Memória
0 bytes !!!!
????-???? – VRAM
#comofas?
![Page 22: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/22.jpg)
TIA(Television Interface Adaptor)
![Page 23: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/23.jpg)
Funcionamento da TV
Fonte: How Stuff Works
![Page 24: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/24.jpg)
Funcionamento da TV
Fonte: How Stuff Works
![Page 25: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/25.jpg)
Scanlines
Fonte: How Stuff Works
60 quadros(frames)
por segundo
![Page 26: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/26.jpg)
TIA opera em scanlines
Para cada scanline, você escreve emposições de memória do TIA que configuram “objetos desenháveis”
É difícil mudar a cor/forma de um objeto numa mesma scanline
![Page 27: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/27.jpg)
Isso explica
vs.
![Page 28: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/28.jpg)
E que objetos são esses?
● Playfield (PF)● Players (P0, P1)● Missiles/Ball (M0, M1, BL)
![Page 29: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/29.jpg)
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
![Page 30: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/30.jpg)
PLAYFIELD
![Page 31: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/31.jpg)
PLAYFIELD
![Page 32: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/32.jpg)
PLAYFIELD
![Page 33: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/33.jpg)
PLAYFIELD
![Page 34: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/34.jpg)
Configurando o playfield
PF0 = 0000 ←← leituraPF1 = 00000000 leitura →→PF2 = 00000000 ←← leituraREFLECT = 0
scanline resultante████████████████████████████████████████
![Page 35: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/35.jpg)
Configurando o playfield
PF0 = 0001 ←← leituraPF1 = 00000000 leitura →→PF2 = 00000000 ←← leituraREFLECT = 0
scanline resultante████████████████████████████████████████
![Page 36: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/36.jpg)
Configurando o playfield
PF0 = 0011 ←← leituraPF1 = 00000000 leitura →→PF2 = 00000000 ←← leituraREFLECT = 0
scanline resultante████████████████████████████████████████
![Page 37: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/37.jpg)
Configurando o playfield
PF0 = 0111 ←← leituraPF1 = 00000000 leitura →→PF2 = 00000000 ←← leituraREFLECT = 0
scanline resultante████████████████████████████████████████
![Page 38: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/38.jpg)
Configurando o playfield
PF0 = 1111 ←← leituraPF1 = 11110000 leitura →→PF2 = 00000000 ←← leituraREFLECT = 0
scanline resultante████████████████████████████████████████
![Page 39: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/39.jpg)
Configurando o playfield
PF0 = 1111 ←← leituraPF1 = 11111110 leitura →→PF2 = 00010101 ←← leituraREFLECT = 0
scanline resultante████████████████████████████████████████
![Page 40: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/40.jpg)
Configurando o playfield
PF0 = 1111 ←← leituraPF1 = 11111110 leitura →→PF2 = 00010101 ←← leituraREFLECT = 1
scanline resultante████████████████████████████████████████
![Page 41: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/41.jpg)
![Page 42: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/42.jpg)
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
![Page 43: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/43.jpg)
PLAYERS
![Page 44: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/44.jpg)
PLAYERS
![Page 45: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/45.jpg)
Players
É possível esticar/multiplicar e inverter o desenho de cada player usando os registradores NUSIZn e
REFPn (n=0 ou 1)
![Page 46: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/46.jpg)
NUSIZn (em 5 scanlines)000001010011100101110111
NU
SIZ
n
![Page 47: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/47.jpg)
Ligando o REFPn000001010011100101110111
NU
SIZ
n
![Page 48: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/48.jpg)
NUSIZn
![Page 49: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/49.jpg)
![Page 50: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/50.jpg)
NUSIZn
![Page 51: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/51.jpg)
NUSIZn
![Page 52: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/52.jpg)
NUSIZn
![Page 53: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/53.jpg)
8 bits exigem criatividade
vs.
![Page 54: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/54.jpg)
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.
![Page 55: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/55.jpg)
MISSILES
![Page 56: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/56.jpg)
BALL
![Page 57: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/57.jpg)
BALL
MISSILE
![Page 58: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/58.jpg)
BALL
MISSILE
![Page 59: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/59.jpg)
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
![Page 60: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/60.jpg)
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
![Page 61: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/61.jpg)
Contas de padaria:
CPU: 19.912 ciclos por telaNTSC: 262 scanlines por frame
19.912 / 262 = 76 ciclos por scanline
![Page 62: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/62.jpg)
Contas de padaria:
CPU: 19.912 ciclos por telaNTSC: 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”?)
![Page 63: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/63.jpg)
Assembly 6502
![Page 64: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/64.jpg)
![Page 65: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/65.jpg)
6502
![Page 66: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/66.jpg)
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.
![Page 67: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/67.jpg)
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
![Page 68: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/68.jpg)
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)
![Page 69: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/69.jpg)
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
![Page 70: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/70.jpg)
Código de Máquina 6502AD 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”
![Page 71: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/71.jpg)
![Page 72: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/72.jpg)
Linguagem Assembly
Atribui a cada opcode uma sigla(“mnemônico”) e define uma notação para os parâmetros
![Page 73: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/73.jpg)
Código de Máquina 6502AD 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”
![Page 74: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/74.jpg)
Assembly 6502AD LDA $0200000269 ADC #01018D STA $02010102
![Page 75: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/75.jpg)
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
LDA $0200ADC #01STA $0201...
foo.bin
AD000269018D0102...
ASSEMBLER
![Page 76: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/76.jpg)
DASM
● Macro Assembler 6502● Inclui headers para Atari● Multiplataforma● Livre (GPLv2)
http://dasm-dillon.sourceforge.net/
![Page 77: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/77.jpg)
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
![Page 78: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/78.jpg)
Instruções do 6502 = mais relevantes para o Atari
![Page 79: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/79.jpg)
Transferindo Dados
LDA, LDX, LDY = LoadSTA, STX, STY = StoreTAX, TAY, TXA,TYA, TSX, TXS = Transfer
LDA #$10 0x10→A STY $0200 Y→m(0x0200)TXA X→A
![Page 80: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/80.jpg)
AritméticaADC, 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
![Page 81: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/81.jpg)
Operações em Bits
AND, ORA, EOR = and, or, xor (A) ASL, LSR = Shift aritmético/lógicoROL, ROR = Shift “rotacional”
AND #$11 A&0x11→ALSR A>>1→A (A/2→A)ROR A>>1 (bit 7=carry)
![Page 82: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/82.jpg)
Comparações e Desvios
CMP, CPX, CPY = compara A/X/Y (-)BCS, BCC = desvia se Carry/NãoBEQ, BNE = desvia se Equal/NãoBVS, BVC = desvia se Overflow/NãoBMI, BPL = desvia se Minus/Plus
CPY $1234 se y=m(0x1234),BEQ $0200 0x0200→PC
![Page 83: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/83.jpg)
Pilha e Subrotinas
JSR, RTS = chama subrotina/retornaPHA, PLA = push/pop(pull) do APHP, PLP = push/pop do status (P)
JMP $1234 0x1234→PCJSR $1234 PC(+3)→pilha,
0x1234→PCRTS pilha→PC
![Page 84: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/84.jpg)
O Resto...
NOP = No Operation (nada!)JMP = Desvio direto (GOTO)SEC, CLC = Set/Clear CarrySEV, CLV = Set/Clear oVerflowSEI, CLI = Set/Clear Interrupt-offSED, CLD = Set/Clear DecimalRTI = Return from InterruptBRK = Break
![Page 85: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/85.jpg)
Neo: “I know kung fu.”Morpheus: “Show me.”
© 1999 Warner Bros
![Page 86: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/86.jpg)
Hello, World!
![Page 87: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/87.jpg)
Hello, World!
Escrever na horizontal é complicado (muitos pixels/elementos por scanline)
![Page 88: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/88.jpg)
Hello, World!
É mais fácil escreverna vertical →
(menos pixels/scanline)
Podemos usar um player ou o playfield
![Page 89: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/89.jpg)
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)
![Page 90: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/90.jpg)
Fonte: Stella Programmers Guide, Steve Wright, 1979
LÓG
ICA
DO
JOG
O(3
+37
+30
).76
= 5
320
cicl
osK
ERN
E L
![Page 91: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/91.jpg)
Estrutura do programaVSYNC
VBLANK
KERNEL(desenha a tela)
OVERSCAN
![Page 92: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/92.jpg)
Estrutura do programaVSYNC
VBLANK
OVERSCAN
Playfield
![Page 93: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/93.jpg)
LoopPrincipal
(eterno)Kernel
loop X: 0 a 191(192 scanlines)
Estrutura do programaVSYNC
VBLANK
OVERSCAN
11 chars x8 linhas x
2 linhas por scanline =
176 scanlines
![Page 94: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/94.jpg)
Começando o programa
PROCESSOR 6502INCLUDE "vcs.h"
ORG $F000 ; Início do cartucho
VSYNC
VBLANK
KERNEL
OVERSCAN
![Page 95: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/95.jpg)
Início do frame (loop principal)
InicioFrame:lda #%00000010 ; VSYNC iniciasta VSYNC ; setando o bit 1REPEAT 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
![Page 96: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/96.jpg)
Desligando elementos
lda #$00 sta ENABL ; Desliga ball sta ENAM0 ; Desliga missiles sta ENAM1 sta GRP0 ; Desliga players sta GRP1
VSYNC
VBLANK
KERNEL
OVERSCAN
![Page 97: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/97.jpg)
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
![Page 98: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/98.jpg)
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
![Page 99: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/99.jpg)
Kernel
Scanline:cpx #174 ; Se acabou a frase, pula bcs FimScanline; o desenho
txa ; Y=X/2 (usando o shiftlsr ; 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
; playfieldVSYNC
VBLANK
KERNEL
OVERSCAN
![Page 100: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/100.jpg)
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
![Page 101: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/101.jpg)
Fechando o loop principal
Overscan:lda #%01000010 ; "Desliga o canhão":sta VBLANK ; 30 scanlines deREPEAT 30 ; overscan...
sta WSYNCREPENDjmp InicioFrame ; ...e começa tudo de
; novo!VSYNC
VBLANK
KERNEL
OVERSCAN
![Page 102: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/102.jpg)
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
...
![Page 103: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/103.jpg)
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
![Page 104: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/104.jpg)
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
![Page 105: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/105.jpg)
Montando e Executandodasm fonte.asm -oromcartucho.bin -f3
http://stella.sourceforge.net/
![Page 106: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/106.jpg)
Técnicas Avançadas
![Page 107: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/107.jpg)
Placar com playfield
![Page 108: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/108.jpg)
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
![Page 109: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/109.jpg)
CORES DOS PLAYERS
![Page 110: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/110.jpg)
(isso dá idéias para melhorar nosso Hello World?)
![Page 111: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/111.jpg)
(isso dá idéias para melhorar nosso Hello World?)
![Page 112: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/112.jpg)
Placar com playfield
Problema: como mostrar coisas DIFERENTES em cada lado?
Solução: mudar o playfield enquanto o canhão passa!
![Page 113: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/113.jpg)
canhão
configure o playfield para “3”no início da scanline
![Page 114: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/114.jpg)
quando o canhão estiver no meio,configure o playfield do “1”...
canhão
![Page 115: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/115.jpg)
canhão
...e você terá um desenho diferentedo outro lado!
![Page 116: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/116.jpg)
Mundos gigantes
![Page 117: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/117.jpg)
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
![Page 118: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/118.jpg)
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
![Page 119: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/119.jpg)
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
![Page 120: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/120.jpg)
Posição horizontal
![Page 121: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/121.jpg)
Posição horizontal
Não existe um registrador paradetermine a posição horizontal de
players, missiles ou ball
Você tem que contar o tempoaté que o canhão esteja na posiçãoe acionar o strobe correspondente
![Page 122: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/122.jpg)
PONTOS DE STROBE(na teoria)
![Page 123: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/123.jpg)
Dá pra calcular...
1 ciclo de CPU = 3 pixelsWSYNC = 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 ↔
![Page 124: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/124.jpg)
SoluçõesVocê 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)
![Page 125: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/125.jpg)
PONTOS DE STROBE
![Page 126: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/126.jpg)
MOVIMENTO ↕ basta desenhar o player/missle emuma scanline diferente a cada frame
MOVIMENTO ↔registradores HMP0/1 e HMM0/1
![Page 127: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/127.jpg)
Placar com múltiplos dígitos
![Page 128: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/128.jpg)
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...
![Page 129: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/129.jpg)
Placar com múltiplos dígitosComece 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
![Page 130: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/130.jpg)
Placar com múltiplos dígitos
Posicione o player 1 à direita do player 0, encavalando as cópias:
454545
Player 0
Player 1
![Page 131: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/131.jpg)
Placar com múltiplos dígitos
Troque o desenho dos players (GRP0/GRP1) sincronizando com o
canhão, assim:
CANHÃO
454545
![Page 132: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/132.jpg)
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:
CANHÃO
454545
![Page 133: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/133.jpg)
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
CANHÃO
456767
![Page 134: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/134.jpg)
Placar com múltiplos dígitos
Faça a mesma coisa paracada scanline do placar!
CANHÃO
456789
![Page 135: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/135.jpg)
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!
![Page 136: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/136.jpg)
Conclusões
![Page 137: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/137.jpg)
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...
![Page 138: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/138.jpg)
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á!
![Page 139: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/139.jpg)
Para aprender maisO nosso Hello, World: http://pastebin.com/abBRfUjdSorteio 2600 http://github.com/chesterbr/sorteio2600Racing 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%202600Có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.comExemplos de som no TIA: http://bit.ly/tnbPrp Bankswitching (mais ROM/RAM): http://bit.ly/tqhLZk
![Page 140: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/140.jpg)
Dúvidas?Obrigado!
@chesterbr
http://slideshare.net/chesterbrhttp://chester.me
![Page 141: Programação para Atari 2600](https://reader033.fdocuments.net/reader033/viewer/2022050708/547cb2b85906b55c378b459a/html5/thumbnails/141.jpg)
Créditos e LicenciamentoEsta 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