| 1 | //============================================================================ |
| 2 | // |
| 3 | // SSSS tt lll lll |
| 4 | // SS SS tt ll ll |
| 5 | // SS tttttt eeee ll ll aaaa |
| 6 | // SSSS tt ee ee ll ll aa |
| 7 | // SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" |
| 8 | // SS SS tt ee ll ll aa aa |
| 9 | // SSSS ttt eeeee llll llll aaaaa |
| 10 | // |
| 11 | // Copyright (c) 1995-2019 by Bradford W. Mott, Stephen Anthony |
| 12 | // and the Stella Team |
| 13 | // |
| 14 | // See the file "License.txt" for information on usage and redistribution of |
| 15 | // this file, and for a DISCLAIMER OF ALL WARRANTIES. |
| 16 | //============================================================================ |
| 17 | |
| 18 | #ifndef TIA_CONSTANTS_HXX |
| 19 | #define TIA_CONSTANTS_HXX |
| 20 | |
| 21 | #include "bspf.hxx" |
| 22 | |
| 23 | namespace TIAConstants { |
| 24 | |
| 25 | static constexpr uInt32 frameBufferWidth = 160; |
| 26 | static constexpr uInt32 frameBufferHeight = 320; |
| 27 | static constexpr uInt32 maxYStart = 64; // TODO - this may be removed |
| 28 | static constexpr uInt32 viewableWidth = 320; |
| 29 | static constexpr uInt32 viewableHeight = 240; |
| 30 | static constexpr uInt32 initialGarbageFrames = 10; |
| 31 | |
| 32 | static constexpr uInt16 |
| 33 | H_PIXEL = 160, H_CYCLES = 76, CYCLE_CLOCKS = 3, |
| 34 | H_CLOCKS = H_CYCLES * CYCLE_CLOCKS, // = 228 |
| 35 | H_BLANK_CLOCKS = H_CLOCKS - H_PIXEL; // = 68 |
| 36 | } |
| 37 | |
| 38 | enum TIABit { |
| 39 | P0Bit = 0x01, // Bit for Player 0 |
| 40 | M0Bit = 0x02, // Bit for Missle 0 |
| 41 | P1Bit = 0x04, // Bit for Player 1 |
| 42 | M1Bit = 0x08, // Bit for Missle 1 |
| 43 | BLBit = 0x10, // Bit for Ball |
| 44 | PFBit = 0x20, // Bit for Playfield |
| 45 | ScoreBit = 0x40, // Bit for Playfield score mode |
| 46 | PriorityBit = 0x80 // Bit for Playfield priority |
| 47 | }; |
| 48 | |
| 49 | enum TIAColor { |
| 50 | BKColor = 0, // Color index for Background |
| 51 | PFColor = 1, // Color index for Playfield |
| 52 | P0Color = 2, // Color index for Player 0 |
| 53 | P1Color = 3, // Color index for Player 1 |
| 54 | M0Color = 4, // Color index for Missle 0 |
| 55 | M1Color = 5, // Color index for Missle 1 |
| 56 | BLColor = 6, // Color index for Ball |
| 57 | HBLANKColor = 7 // Color index for HMove blank area |
| 58 | }; |
| 59 | |
| 60 | enum class CollisionBit |
| 61 | { |
| 62 | M0P1 = 1 << 0, // Missle0 - Player1 collision |
| 63 | M0P0 = 1 << 1, // Missle0 - Player0 collision |
| 64 | M1P0 = 1 << 2, // Missle1 - Player0 collision |
| 65 | M1P1 = 1 << 3, // Missle1 - Player1 collision |
| 66 | P0PF = 1 << 4, // Player0 - Playfield collision |
| 67 | P0BL = 1 << 5, // Player0 - Ball collision |
| 68 | P1PF = 1 << 6, // Player1 - Playfield collision |
| 69 | P1BL = 1 << 7, // Player1 - Ball collision |
| 70 | M0PF = 1 << 8, // Missle0 - Playfield collision |
| 71 | M0BL = 1 << 9, // Missle0 - Ball collision |
| 72 | M1PF = 1 << 10, // Missle1 - Playfield collision |
| 73 | M1BL = 1 << 11, // Missle1 - Ball collision |
| 74 | BLPF = 1 << 12, // Ball - Playfield collision |
| 75 | P0P1 = 1 << 13, // Player0 - Player1 collision |
| 76 | M0M1 = 1 << 14 // Missle0 - Missle1 collision |
| 77 | }; |
| 78 | |
| 79 | // TIA Write/Read register names |
| 80 | enum TIARegister { |
| 81 | VSYNC = 0x00, // Write: vertical sync set-clear (D1) |
| 82 | VBLANK = 0x01, // Write: vertical blank set-clear (D7-6,D1) |
| 83 | WSYNC = 0x02, // Write: wait for leading edge of hrz. blank (strobe) |
| 84 | RSYNC = 0x03, // Write: reset hrz. sync counter (strobe) |
| 85 | NUSIZ0 = 0x04, // Write: number-size player-missle 0 (D5-0) |
| 86 | NUSIZ1 = 0x05, // Write: number-size player-missle 1 (D5-0) |
| 87 | COLUP0 = 0x06, // Write: color-lum player 0 (D7-1) |
| 88 | COLUP1 = 0x07, // Write: color-lum player 1 (D7-1) |
| 89 | COLUPF = 0x08, // Write: color-lum playfield (D7-1) |
| 90 | COLUBK = 0x09, // Write: color-lum background (D7-1) |
| 91 | CTRLPF = 0x0a, // Write: cntrl playfield ballsize & coll. (D5-4,D2-0) |
| 92 | REFP0 = 0x0b, // Write: reflect player 0 (D3) |
| 93 | REFP1 = 0x0c, // Write: reflect player 1 (D3) |
| 94 | PF0 = 0x0d, // Write: playfield register byte 0 (D7-4) |
| 95 | PF1 = 0x0e, // Write: playfield register byte 1 (D7-0) |
| 96 | PF2 = 0x0f, // Write: playfield register byte 2 (D7-0) |
| 97 | RESP0 = 0x10, // Write: reset player 0 (strobe) |
| 98 | RESP1 = 0x11, // Write: reset player 1 (strobe) |
| 99 | RESM0 = 0x12, // Write: reset missle 0 (strobe) |
| 100 | RESM1 = 0x13, // Write: reset missle 1 (strobe) |
| 101 | RESBL = 0x14, // Write: reset ball (strobe) |
| 102 | AUDC0 = 0x15, // Write: audio control 0 (D3-0) |
| 103 | AUDC1 = 0x16, // Write: audio control 1 (D4-0) |
| 104 | AUDF0 = 0x17, // Write: audio frequency 0 (D4-0) |
| 105 | AUDF1 = 0x18, // Write: audio frequency 1 (D3-0) |
| 106 | AUDV0 = 0x19, // Write: audio volume 0 (D3-0) |
| 107 | AUDV1 = 0x1a, // Write: audio volume 1 (D3-0) |
| 108 | GRP0 = 0x1b, // Write: graphics player 0 (D7-0) |
| 109 | GRP1 = 0x1c, // Write: graphics player 1 (D7-0) |
| 110 | ENAM0 = 0x1d, // Write: graphics (enable) missle 0 (D1) |
| 111 | ENAM1 = 0x1e, // Write: graphics (enable) missle 1 (D1) |
| 112 | ENABL = 0x1f, // Write: graphics (enable) ball (D1) |
| 113 | HMP0 = 0x20, // Write: horizontal motion player 0 (D7-4) |
| 114 | HMP1 = 0x21, // Write: horizontal motion player 1 (D7-4) |
| 115 | HMM0 = 0x22, // Write: horizontal motion missle 0 (D7-4) |
| 116 | HMM1 = 0x23, // Write: horizontal motion missle 1 (D7-4) |
| 117 | HMBL = 0x24, // Write: horizontal motion ball (D7-4) |
| 118 | VDELP0 = 0x25, // Write: vertical delay player 0 (D0) |
| 119 | VDELP1 = 0x26, // Write: vertical delay player 1 (D0) |
| 120 | VDELBL = 0x27, // Write: vertical delay ball (D0) |
| 121 | RESMP0 = 0x28, // Write: reset missle 0 to player 0 (D1) |
| 122 | RESMP1 = 0x29, // Write: reset missle 1 to player 1 (D1) |
| 123 | HMOVE = 0x2a, // Write: apply horizontal motion (strobe) |
| 124 | HMCLR = 0x2b, // Write: clear horizontal motion registers (strobe) |
| 125 | CXCLR = 0x2c, // Write: clear collision latches (strobe) |
| 126 | |
| 127 | CXM0P = 0x00, // Read collision: D7=(M0,P1); D6=(M0,P0) |
| 128 | CXM1P = 0x01, // Read collision: D7=(M1,P0); D6=(M1,P1) |
| 129 | CXP0FB = 0x02, // Read collision: D7=(P0,PF); D6=(P0,BL) |
| 130 | CXP1FB = 0x03, // Read collision: D7=(P1,PF); D6=(P1,BL) |
| 131 | CXM0FB = 0x04, // Read collision: D7=(M0,PF); D6=(M0,BL) |
| 132 | CXM1FB = 0x05, // Read collision: D7=(M1,PF); D6=(M1,BL) |
| 133 | CXBLPF = 0x06, // Read collision: D7=(BL,PF); D6=(unused) |
| 134 | CXPPMM = 0x07, // Read collision: D7=(P0,P1); D6=(M0,M1) |
| 135 | INPT0 = 0x08, // Read pot port: D7 |
| 136 | INPT1 = 0x09, // Read pot port: D7 |
| 137 | INPT2 = 0x0a, // Read pot port: D7 |
| 138 | INPT3 = 0x0b, // Read pot port: D7 |
| 139 | INPT4 = 0x0c, // Read P1 joystick trigger: D7 |
| 140 | INPT5 = 0x0d // Read P2 joystick trigger: D7 |
| 141 | }; |
| 142 | |
| 143 | #endif // TIA_CONSTANTS_HXX |
| 144 | |