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 | |