**The Atari 2600/VCS** !!! [**Click here to program the Atari 2600 in the 8bitworkshop IDE now!**](https://8bitworkshop.com/redir.html?platform=vcs) # VCS Specifications Lifespan : 1977–1992 Media : ROM cartridge (2K-64K) CPU 8-bit : MOS Technology 6507 ` 1.19 MHz Memory : 128 bytes RAM (can be expanded by cartridge) Controllers : Joystick, paddles, driving, keypad, Trak-Ball Best-selling game : Pac-Man ![Atari 2600 (by Evan-Amos, CC-BY-SA 3.0)](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Atari-2600-Wood-4Sw-Set.jpg/1024px-Atari-2600-Wood-4Sw-Set.jpg) # History Atari was founded by Nolan Bushnell and Ted Dabney in 1972 to commercialize video games, which were at this time only found in university basements. They developed the arcade games *Computer Space* and *Pong*, the latter becoming a huge success. They also developed more complex games like *Tank* which included a ROM chip. Atari developed a Pong home console, but wanted to develop a console that could play more than one game. In 1975 MOS Technology announced the 6502 CPU, which at $5 (volume pricing) made a programmable home console feasible. To save money on RAM, they'd omit the typical frame buffer, relying on the 6502 to program the TIA chip right before each scanline. By 1974, Atari had acquired Cyan Engineering, and hired Joe Decuir to help debug the first prototype, codenamed "Stella", and to demonstrate that it could play *Tank* (later released as the *Combat* cartridge.) Jay Miner worked on the ASIC design for the TIA chip, and they completed the second prototype by March 1976. The final system included these chips: * 6507, a cost-reduced 6502 in a 28-pin package. * 6532, with 128 bytes of RAM, 16 I/O ports, and a programmable timer * TIA, which generates video and audio * a 2K or 4K ROM via cartridge slot Bushnell considered taking Atari public but instead sold the company to Warner Communications for US$28 million; subsequently, Warner provided approximately US$100 million in new funding, allowing Stella to be prioritized and fast-tracked. The Atari VCS (Video Computer System) was released in time for Christmas 1977 at $199 ($840 adjusted for inflation), and shipped with two joysticks and a Combat cartridge. Other launch titles included *Air-Sea Battle*, *Basic Math*, *Blackjack*, *Indy 500*, *Starship*, *Street Racer*, *Surround*, and *Video Olympics*. The VCS was the best-selling console during the 1979 holiday season, with more than 1 million units sold. It helped Atari earn more than $2 billion in 1980. In 1982 it was rebranded the Atari 2600. Activision, formed by four former Atari VCS programmers, led the vanguard of third-party game development thanks to a victory in court. But changing market conditions made the boom short-lived. By mid-1984, software development for the 2600 had essentially stopped except for that of Atari and Activision. Atari's Consumer Division was sold to Commodore founder Jack Tramiel, who shifted the business' focus to home computers and ended all development of console games. # Programming Because of the precise timing required, the VCS is usually programmed in 6502 assembly language. A "kernel" runs while the video signal is active, setting up the TIA for each scanline. Other game logic usually runs during the blank portions of each frame. batariBASIC is also available. # Registers (vcs.h) Hex | Name | Bit Mask | Description |---------|----------|------------|----------------------------------------| | `00` | `VSYNC` | `......x.` | Vertical Sync | | `01` | `VBLANK` | `xx....x.` | Vertical Blank / Latched Port Enable | | `02` | `WSYNC` | `strobe` | Wait for Horizontal Blank | | `04` | `NUSIZ0` | `..xx.xxx` | Number-size Player/Missile 0 | | `05` | `NUSIZ1` | `..xx.xxx` | Number-size Player/Missile 1 | | `06` | `COLUP0` | `xxxxxxx.` | Color – Player/Missile 0 | | `07` | `COLUP1` | `xxxxxxx.` | Color – Player/Missile 1 | | `08` | `COLUPF` | `xxxxxxx.` | Color – Playfield/Ball | | `09` | `COLUBK` | `xxxxxxx.` | Color – Background | | `0A` | `CTRLPF` | `..xx.xxx` | Control Playfield, Ball | | `0B` | `REFP0` | `....x...` | Reflect Player 0 | | `0C` | `REFP1` | `....x...` | Reflect Player 1 | | `0D` | `PF0` | `xxxx....` | Playfield 0 (pixels 0-3) | | `0E` | `PF1` | `xxxxxxxx` | Playfield 1 (pixels 4-11) | | `0F` | `PF2` | `xxxxxxxx` | Playfield 2 (pixels 12-19) | | `10` | `RESP0` | `strobe` | Reset Player 0 | | `11` | `RESP1` | `strobe` | Reset Player 1 | | `12` | `RESM0` | `strobe` | Reset Missile 0 | | `13` | `RESM1` | `strobe` | Reset Missile 1 | | `14` | `RESBL` | `strobe` | Reset Ball | | `15` | `AUDC0` | `....xxxx` | Audio Control Channel 0 | | `16` | `AUDC1` | `....xxxx` | Audio Control Channel 1 | | `17` | `AUDF0` | `...xxxxx` | Audio Frequency Channel 0 | | `18` | `AUDF1` | `...xxxxx` | Audio Frequency Channel 1 | | `19` | `AUDV0` | `....xxxx` | Audio Volume Channel 0 | | `1A` | `AUDV1` | `....xxxx` | Audio Volume Channel 1 | | `1B` | `GRP0` | `xxxxxxxx` | Graphics Bitmap Player 0 | | `1C` | `GRP1` | `xxxxxxxx` | Graphics Bitmap Player 1 | | `1D` | `ENAM0` | `......x.` | Enable Missile 0 | | `1E` | `ENAM1` | `......x.` | Enable Missile 1 | | `1F` | `ENABL` | `......x.` | Enable Ball | | `20` | `HMP0` | `xxxx....` | Horizontal Motion Player 0 | | `21` | `HMP1` | `xxxx....` | Horizontal Motion Player 1 | | `22` | `HMM0` | `xxxx....` | Horizontal Motion Missile 0 | | `23` | `HMM1` | `xxxx....` | Horizontal Motion Missile 1 | | `24` | `HMBL` | `xxxx....` | Horizontal Motion Ball | | `25` | `VDELP0` | `.......x` | Vertical Delay Player 0 | | `26` | `VDELP1` | `.......x` | Vertical Delay Player 1 | | `27` | `VDELBL` | `.......x` | Vertical Delay Ball | | `28` | `RESMP0` | `......x.` | Reset Missile 0 to Player 0 | | `29` | `RESMP1` | `......x.` | Reset Missile 1 to Player 1 | | `2A` | `HMOVE` | `strobe` | Apply Horizontal Motion (fine offsets) | | `2B` | `HMCLR` | `strobe` | Clear Horizontal Motion Registers | | `2C` | `CXCLR` | `strobe` | Clear Collision Latches | | `30` | `CXM0P` | `xx......` | Collision M0-P1, M0-P0 | | `31` | `CXM1P` | `xx......` | Collision M1-P0, M1-P1 | | `32` | `CXP0FB` | `xx......` | Collision P0-PF, P0-BL | | `33` | `CXP1FB` | `xx......` | Collision P1-PF, P1-BL | | `34` | `CXM0FB` | `xx......` | Collision M0-PF, M0-BL | | `35` | `CXM1FB` | `xx......` | Collision M1-PF, M1-BL | | `36` | `CXBLPF` | `x.......` | Collision BL-PF | | `37` | `CXPPMM` | `xx......` | Collision P0-P1, M0-M1 | | `38` | `INPT0` | `x.......` | Dumped Input Port 0 | | `39` | `INPT1` | `x.......` | Dumped Input Port 1 | | `3A` | `INPT2` | `x.......` | Dumped Input Port 2 | | `3B` | `INPT3` | `x.......` | Dumped Input Port 3 | | `3C` | `INPT4` | `x.......` | Latched Input Port 4 | | `3D` | `INPT5` | `x.......` | Latched Input Port 5 | | `80-FF` | – | `xxxxxxxx` | 128 Bytes RAM | | `0280` | `SWCHA` | `xxxxxxxx` | Joysticks/Controllers | | `0281` | `SWACNT` | `xxxxxxxx` | Port A DDR (Data Direction Register) | | `0282` | `SWCHB` | `xxxxxxxx` | Console Switches | | `0283` | `SWBCNT` | `xxxxxxxx` | Port B DDR (hardwired as input) | | `0284` | `INTIM` | `xxxxxxxx` | Timer Output | | `0294` | `TIM1T` | `xxxxxxxx` | Set 1 Cycle Timer | | `0295` | `TIM8T` | `xxxxxxxx` | Set 8 Cycle Timer | | `0296` | `TIM64T` | `xxxxxxxx` | Set 64 Cycle Timer | | `0297` | `T1024T` | `xxxxxxxx` | Set 1024 Cycle Timer | # Macros (macro.h) `CLEAN_START` : Standardised start-up code at start of program. `VERTICAL_SYNC` : Inserts the code required for a proper 3 scanline vertical sync sequence. Modifies A. `SLEEP` n : Sleep n cycles. `SET_POINTER` variable constant : Set a 2 byte pointer to an absolute address. Modifies A. `SKIP_SCANLINES` n : Skip a given # of scanlines. Sets X to 0. # Extra Macros (xmacro.h) `TIMER_SETUP` lines : The timer will be set so that it expires before `lines` scanlines. A WSYNC will be done first. `TIMER_WAIT` : Use with `TIMER_SETUP` to wait for timer to complete. Performs a WSYNC afterwards. # Helpful Links * [Javatari.js](https://javatari.org/), the emulator used by 8bitworkshop * [Stella Programmer's Guide](https://alienbill.com/2600/101/docs/stella.html) * [6502 Tutorials](http://6502.org/tutorials/) * [Atari 2600 Mappers](http://blog.kevtris.org/blogfiles/Atari%202600%20Mappers.txt) * [batari BASIC Reference](https://alienbill.com/2600/basic/downloads/0.35/help.html) * [Browse 8bitworkshop VCS Projects](https://8bitworkshop.com/projects/?i=vcs) !!! [**Click here to program the Atari 2600 in the 8bitworkshop IDE now!**](https://8bitworkshop.com/redir.html?platform=vcs)