MAKING GAMES FOR THE ATARI 2600 An 8bitworkshop Book by Steven Hugg Making Games for the Atari 2600 Copyright©2016byStevenE.Hugg All rights reserved. No part of this book may be reproduced withoutwrittenpermissionfromtheauthor. ISBN-13: 978-1541021303 ISBN-10: 1541021304 Firstprinting: December2016 Disclaimer Although every precaution has been taken in the preparation ofthisbook,thepublisherandauthorassumenoresponsibility forerrorsoromissions,norisanyliabilityassumedfordamages resulting from the use of the information contained herein. No warrantiesofanykindareexpressedorimplied. Making Games for the Atari 2600 is an independent publication andhasnotbeenauthorized,sponsored,orotherwiseapproved byAtari,Inc. Trademarks Brands and product names mentioned in this work are trade- marks or service marks of their respective companies. Use of a term in this work should not be regarded as affecting the validityofanytrademarkorservicemark. Inquiries [email protected]. Contents Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xii 1 Introductionto6502 . . . . . . . . . . . . . . . . . . . 1 1.1 Bits,Bytes,andBinary . . . . . . . . . . . . . . . 2 1.2 HexadecimalNotation . . . . . . . . . . . . . . . 3 1.3 Signedvs. UnsignedBytes . . . . . . . . . . . . . 3 1.4 TheCPUandtheBus . . . . . . . . . . . . . . . . 4 1.5 WritingLoops . . . . . . . . . . . . . . . . . . . . 7 1.6 ConditionFlagsandBranching. . . . . . . . . . . 10 1.7 AdditionandSubtraction . . . . . . . . . . . . . . 12 1.8 TheStack . . . . . . . . . . . . . . . . . . . . . . . 12 1.9 LogicalOperations . . . . . . . . . . . . . . . . . 13 1.10 ShiftOperations . . . . . . . . . . . . . . . . . . . 15 2 The8bitworkshopIDE . . . . . . . . . . . . . . . . . . . 17 2.1 DebugWindow . . . . . . . . . . . . . . . . . . . . 20 2.2 KeyboardShortcuts . . . . . . . . . . . . . . . . . 21 3 VCSMemoryMap . . . . . . . . . . . . . . . . . . . . . 22 3.1 Equates . . . . . . . . . . . . . . . . . . . . . . . . 22 3.2 Segments . . . . . . . . . . . . . . . . . . . . . . . 24 4 WritingYourFirstAssemblyCode . . . . . . . . . . . . 26 5 PaintingontheCRT . . . . . . . . . . . . . . . . . . . . 29 5.1 TimingisEverything . . . . . . . . . . . . . . . . . 31 5.2 MakingRainbows . . . . . . . . . . . . . . . . . . 33 6 PlayfieldGraphics . . . . . . . . . . . . . . . . . . . . . 37 iii Contents 7 PlayersandSprites . . . . . . . . . . . . . . . . . . . . 41 7.1 HorizontalPositioning . . . . . . . . . . . . . . . . 43 8 ColorSprites . . . . . . . . . . . . . . . . . . . . . . . . 46 9 SpriteFinePositioning . . . . . . . . . . . . . . . . . . . 51 10 Player/MissileGraphics . . . . . . . . . . . . . . . . . . 56 11 TheSetHorizPosSubroutine . . . . . . . . . . . . . . . 58 12 ThePIATimer . . . . . . . . . . . . . . . . . . . . . . . 61 13 JoysticksandSwitches . . . . . . . . . . . . . . . . . . 65 13.1 ConsoleSwitches . . . . . . . . . . . . . . . . . . 65 13.2 Joysticks . . . . . . . . . . . . . . . . . . . . . . . 67 14 IndirectAddressing . . . . . . . . . . . . . . . . . . . . 69 14.1 Pointers . . . . . . . . . . . . . . . . . . . . . . . . 69 14.2 IndirectIndexedAddressing . . . . . . . . . . . . 70 14.3 IndexedIndirectAddressing . . . . . . . . . . . . 71 15 AComplexScene,PartI . . . . . . . . . . . . . . . . . . 72 16 AComplexScene,PartII . . . . . . . . . . . . . . . . . 78 17 NUSIZandOtherDelights. . . . . . . . . . . . . . . . . 82 17.1 PlayerReflection . . . . . . . . . . . . . . . . . . . 82 17.2 NUSIZandMultiplePlayerCopies . . . . . . . . . 83 17.3 VDELP:VerticalDelay . . . . . . . . . . . . . . . . 83 17.4 CTRLPFandObjectPriority . . . . . . . . . . . . . 84 17.5 Two-PlayerScoreMode . . . . . . . . . . . . . . . 85 18 Scoreboard . . . . . . . . . . . . . . . . . . . . . . . . . 86 19 Collisions . . . . . . . . . . . . . . . . . . . . . . . . . . 90 20 AsynchronousPlayfields: Bitmap . . . . . . . . . . . . 92 21 AsynchronousPlayfields: Bricks . . . . . . . . . . . . . 95 iv Contents 22 ABig(48pixel)Sprite . . . . . . . . . . . . . . . . . . . 104 23 TinyText . . . . . . . . . . . . . . . . . . . . . . . . . . 108 24 Six-DigitScoreboard . . . . . . . . . . . . . . . . . . . . 114 25 ABigMoveableSprite . . . . . . . . . . . . . . . . . . . 118 26 SpriteFormations . . . . . . . . . . . . . . . . . . . . . 122 27 AdvancedTimerTricks . . . . . . . . . . . . . . . . . . 127 27.1 TimerTables . . . . . . . . . . . . . . . . . . . . . 129 28 Multisprites . . . . . . . . . . . . . . . . . . . . . . . . . 133 28.1 Variables . . . . . . . . . . . . . . . . . . . . . . . 135 28.2 Position . . . . . . . . . . . . . . . . . . . . . . . . 136 28.3 Display . . . . . . . . . . . . . . . . . . . . . . . . 138 28.4 TheMainLoop . . . . . . . . . . . . . . . . . . . . 141 28.5 Sort . . . . . . . . . . . . . . . . . . . . . . . . . . 142 28.6 Improvements . . . . . . . . . . . . . . . . . . . . 143 29 RandomNumberGeneration . . . . . . . . . . . . . . . 144 30 ProceduralGeneration . . . . . . . . . . . . . . . . . . 148 31 DrawingLines . . . . . . . . . . . . . . . . . . . . . . . 153 32 TheSoundandMusic . . . . . . . . . . . . . . . . . . . 158 32.1 MusicPlayer . . . . . . . . . . . . . . . . . . . . . 160 33 Pseudo-3D:SunsetsandStarryNights . . . . . . . . . 165 33.1 Sky,Clouds,andSunset . . . . . . . . . . . . . . . 165 33.2 Mountains . . . . . . . . . . . . . . . . . . . . . . 167 33.3 StarsatNight . . . . . . . . . . . . . . . . . . . . 168 34 Pseudo-3D:DrivingDowntheRoad . . . . . . . . . . . 171 35 BankSwitching . . . . . . . . . . . . . . . . . . . . . . . 181 35.1 Trampolines . . . . . . . . . . . . . . . . . . . . . 182 35.2 CommonBankswitchingMethods . . . . . . . . . 184 v Contents 35.3 ORGvs. RORG . . . . . . . . . . . . . . . . . . . . 184 35.4 BankswitchingExample . . . . . . . . . . . . . . . 185 36 WavetableAudio . . . . . . . . . . . . . . . . . . . . . . 188 36.1 AudioWaveforms . . . . . . . . . . . . . . . . . . 188 36.2 GeneratingSamples . . . . . . . . . . . . . . . . . 189 37 Paddles . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 38 IllegalOpcodes . . . . . . . . . . . . . . . . . . . . . . 195 39 TimingAnalysis . . . . . . . . . . . . . . . . . . . . . . 197 40 MakingGames . . . . . . . . . . . . . . . . . . . . . . . 199 40.1 GameDesign . . . . . . . . . . . . . . . . . . . . . 199 40.2 GameProgramming . . . . . . . . . . . . . . . . . 200 40.3 DistributingYourGame . . . . . . . . . . . . . . . 201 41 Troubleshooting . . . . . . . . . . . . . . . . . . . . . . 203 AppendixA:VCSMemoryMap . . . . . . . . . . . . . . . . 205 AppendixB:VCSColors . . . . . . . . . . . . . . . . . . . . 208 AppendixC:6502Opcodes . . . . . . . . . . . . . . . . . . 209 AppendixD:6502InstructionFlags . . . . . . . . . . . . . 216 Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . 219 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 vi List of Figures 1.1 CPUCycle . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2 Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.3 LDACycle . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.4 Shiftandrotatebitflow . . . . . . . . . . . . . . . . . 15 2.1 8bitworkshop.comIDE . . . . . . . . . . . . . . . . . . 17 2.2 IDEFlow . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.3 IDEPulldown . . . . . . . . . . . . . . . . . . . . . . . 19 2.4 DebuggingFunctions . . . . . . . . . . . . . . . . . . 19 2.5 DebugWindow . . . . . . . . . . . . . . . . . . . . . . 20 2.6 EmulatorKeyboardShortcuts . . . . . . . . . . . . . 21 3.1 MemoryMap . . . . . . . . . . . . . . . . . . . . . . . 23 5.1 AnatomyofaScanline . . . . . . . . . . . . . . . . . 30 5.2 SettinguptheTIAforascanline . . . . . . . . . . . . 31 5.3 AnofficialNTSC-compliantvideoframe . . . . . . . 32 6.1 LayoutofPlayfieldRegisterPixels . . . . . . . . . . . 38 6.2 ExampleSymmetricPlayfield . . . . . . . . . . . . . . 39 6.3 XYCoordinateSystems . . . . . . . . . . . . . . . . . 40 7.1 PongandTank . . . . . . . . . . . . . . . . . . . . . . 41 7.2 Players0and1overbackground . . . . . . . . . . . 43 7.3 InstructionTimingofSettingPlayerPosition . . . . . 45 8.1 Bottom-to-topSpriteLayout . . . . . . . . . . . . . . 48 8.2 SpriteBitmapandColorTableExample . . . . . . . . 50 9.1 HorizontalMotionRegisterValues . . . . . . . . . . . 53 vii ListofFigures 9.2 FineHorizontalPositioningwithHMOVE . . . . . . . 54 12.1 BlankNTSCFrameExample . . . . . . . . . . . . . . 64 15.1 Twospritesoverplayfield . . . . . . . . . . . . . . . . 72 15.2 TimingofDouble-HeightKernelWithPlayfield . . . . 77 16.1 Timingof4-PhaseDouble-HeightKernel . . . . . . . 79 17.1 NUSIZNumber-SizeRegisterSpacing . . . . . . . . . 83 18.1 Examplescoreboard. . . . . . . . . . . . . . . . . . . 86 18.2 ScoreboardDisplay . . . . . . . . . . . . . . . . . . . 89 20.1 TimingofAsynchronousPlayfieldKernel . . . . . . . 93 20.2 PlayfieldBitmapofAdaLovelace . . . . . . . . . . . 94 21.1 Brickgame . . . . . . . . . . . . . . . . . . . . . . . . 95 21.2 LayoutofBricksArray . . . . . . . . . . . . . . . . . . 96 21.3 TimingofBrickPlayfieldandBallKernel . . . . . . . 98 22.1 48-pixelsprite . . . . . . . . . . . . . . . . . . . . . . 104 22.2 OverlappingPlayers’HorizontalPosition . . . . . . . 105 22.3 TimingDiagramforOverlappingPlayers . . . . . . . 107 23.1 Tinytext . . . . . . . . . . . . . . . . . . . . . . . . . 108 23.2 Example48-pixelfontdata . . . . . . . . . . . . . . . 109 24.1 Six-digitscoreboardexample . . . . . . . . . . . . . 114 25.1 WSYNC-FreeBigSpriteKernel . . . . . . . . . . . . . 121 26.1 Spriteretriggeringexamplegame . . . . . . . . . . . 122 27.1 PIATimerScanlineTiming . . . . . . . . . . . . . . . 129 27.2 Timerworst-casescenario . . . . . . . . . . . . . . . 131 27.3 Timer-to-ScanlineLookupTable . . . . . . . . . . . . 131 28.1 Multiplespritesexample . . . . . . . . . . . . . . . . 134 28.2 Phases . . . . . . . . . . . . . . . . . . . . . . . . . . 134 30.1 Procedurally-generatedroom . . . . . . . . . . . . . 148 viii ListofFigures 31.1 Alinedrawnwithplayerobjects . . . . . . . . . . . . 153 32.1 AudioChannelstoOutput . . . . . . . . . . . . . . . 159 33.1 Sunsetwithcloudsandmountains . . . . . . . . . . 166 33.2 Pseudo-3droadwithstars . . . . . . . . . . . . . . . 169 34.1 Pseudo-3droadwithsunset . . . . . . . . . . . . . . 172 ix List of Tables 1.1 BitValuesinHexadecimalNotation . . . . . . . . . . 3 1.2 ExampleHexConversion . . . . . . . . . . . . . . . . 3 1.3 ConditionFlags . . . . . . . . . . . . . . . . . . . . . 10 1.4 BranchInstructions . . . . . . . . . . . . . . . . . . . 11 1.5 LogicalInstructions . . . . . . . . . . . . . . . . . . . 13 1.6 Shiftandrotateinstructions . . . . . . . . . . . . . . 15 5.1 FrameandScanlineSyncRegisters . . . . . . . . . . 33 6.1 PlayfieldRegisters . . . . . . . . . . . . . . . . . . . . 39 7.1 PlayerRegisters . . . . . . . . . . . . . . . . . . . . . 42 7.2 ExampleTimingofHorizontalPositioningLoop . . . 45 9.1 HorizontalMotionRegisters . . . . . . . . . . . . . . 55 10.1 RegistersforMissilesandBall . . . . . . . . . . . . . 57 12.1 TimerRegisters . . . . . . . . . . . . . . . . . . . . . 62 13.1 InputPortsRegisters . . . . . . . . . . . . . . . . . . 65 13.2 SWCHBSwitches . . . . . . . . . . . . . . . . . . . . 66 13.3 SWCHASwitches . . . . . . . . . . . . . . . . . . . . 67 16.1 VerticalDelayRegisters . . . . . . . . . . . . . . . . . 81 17.1 NUSIZ,Control,ReflectRegisters . . . . . . . . . . . 82 17.2 NormalCTRLPFPriorityAssignments . . . . . . . . . 84 17.3 CTRLPFPriorityAssignmentswhenBit2isSet . . . . 85 19.1 CollisionRegisters . . . . . . . . . . . . . . . . . . . . 91 x