Очень низкоуровневый эмулятор 6502 / NES
Автор |
Сообщение |
14 ноя 2012, 17:26 |
|
Зарегистрирован: 24 июл 2007, 06:54 Сообщения: 492 Откуда: Embedded
|
Просто сделали надежный сброс. Поэтому и пишут, что нужно ждать пару кадров (отслеживать по NMI), прежде чем программировать PPU. Все просто, оказалось.
Растактовку можешь свести в таблицу? Я про развертку кадра и сигналов по двум матрицам H и V.
_________________ Tried so hard and got so far, but in the end, it doesn't even matter...
|
|
14 ноя 2012, 18:26 |
|
Зарегистрирован: 24 июл 2007, 10:41 Сообщения: 570
|
Как раз этим вопросом занимаюсь (что и когда происходит при разных значениях H/V). -- 14 ноя 2012, 22:11 -- По поводу сброса PPU: http://breaknes.com/info/9
|
|
15 ноя 2012, 10:47 |
|
Зарегистрирован: 24 июл 2007, 06:54 Сообщения: 492 Откуда: Embedded
|
_________________ Tried so hard and got so far, but in the end, it doesn't even matter...
|
|
15 ноя 2012, 13:50 |
|
Зарегистрирован: 24 июл 2007, 10:41 Сообщения: 570
|
Несколько продвинулся в понимании H/V логики: Код: left PLA (H select): count from 0 to 340 (341 pixels total)
Line 876543210 Decimal Exception Modifier Functional 0 100010111 279 Colorburst/sync 1 100000000 256 Colorburst/sync 2 001000001 65 DB/OAM OAM/EVAL 3 X00000XXX Object/Background clipping 4 0XXXXXXXX [??] Object/Background clipping 5 1010100XX 336-339 OAM FIFO clear H.position
6 000111111 63 EVAL ready (secondary OAM init done) 7 X11111111 255 to data reader, counter controls ??? 8 000XXXXXX OAM buffer control ?
9 100XXXXXX DB/OAM PAR/D 10 0XXXXXXXX DB/OAM [??] /VIS 11 XXXXXX00X DB/OAM OAM+data reader 12 XXXXXX11X !!! these are tied together 13 XXXXXX10X !!!
14 1X100XXXX DB/OAM !!! 15 0XXXXXXXX DB/OAM !!! 16 XXXXXX01X !!! these are tied together 17 100001110 270 Some latch + 18 101001000 328 + Some latch -> output to V logic
19 100010111 279 Scroll update + to Render 20 100110000 304 Scroll update + to Render 21 101000011 323 Colorburst/sync 22 100110100 308 Colorburst/sync
23 101010100 340 V-counter enable
right PLA (V select): count from 0 to 261 (262 scanlines total)
Line 876543210 Decimal Functional 0 X11110111 247 to Render 1 X11110100 244 to Render
2 100000101 261 + Some latch, color buffer enabler? 3 X11110001 241 + Some latch, color buffer enabler? 4 X11110001 241 Control [3] /INT 5 000000000 0 flip/flop, modifier [??] out, cleared by ... 6 X11110000 240 ... this one 7 100000101 261 DB/OAM out 8 100000101 261 RESCL (clear reset flip/flop)
Также начал эмуляцию PPU: http://code.google.com/p/breaks/source/ ... sPPU/PPU.c
|
|
16 ноя 2012, 14:07 |
|
Зарегистрирован: 24 июл 2007, 10:41 Сообщения: 570
|
Вообщем победил логику работы H/V, результаты ниже. Что интересного обнаружил: - H тикает от 0 до 340 (всего 341 пиксель), V тикает от 0 до 261 (всего 262 строки). - Счёт пикселей самой первой строки начинается с 1, потому что 0й пиксель на самом деле рендерится, начиная с H=329. - Количество видимых пикселей 256, но размер "картинки" NTSC немного больше. Связано это с тем, что после видимых пикселей выводится так называемый "front porch" (черный край). - PPU начинает работу непосредственно с рендеринга пикселей. После отображения видимых пикселей выводится вначале front porch, а потом back porch, которая включает в себя hblank и colorburst. Значения когда что начинается в H следующие: 0: не понятно, типа заглушки чтоли 1-256: видимые пиксели 257-279: front porch 271-328: back porch (как видно у них происходит пересечение) 280-304: hblank 309-323: color burst 329-340: начало выборки и рендеринга 0го пиксела следующей строки Напоминаю структуру композитного NTSC-сигнала: Чуть позже выложу табличку с командами H/V логики остальному чипу, для каждого значения H. -- 16 ноя 2012, 14:22 -- Немного пояснений: H/V - текущие значения счетчиков далее идут названия команд H/V - это те самые контрольные линии, которые расползаются по всему чипу и управ. Расшифровка команд после таблицы. Самая первая строка: H:1 V:0 I/OAM2 F/NT VIS PICTURE H:2 V:0 I/OAM2 F/NT VIS PICTURE H:3 V:0 I/OAM2 F/AT VIS PICTURE H:4 V:0 I/OAM2 F/AT VIS PICTURE H:5 V:0 I/OAM2 F/TA VIS PICTURE H:6 V:0 I/OAM2 F/TA VIS PICTURE H:7 V:0 I/OAM2 F/TB VIS PICTURE H:8 V:0 I/OAM2 F/TB VIS PICTURE H:9 V:0 I/OAM2 F/NT VIS PICTURE H:10 V:0 I/OAM2 F/NT VIS PICTURE H:11 V:0 I/OAM2 F/AT VIS PICTURE H:12 V:0 I/OAM2 F/AT VIS PICTURE H:13 V:0 I/OAM2 F/TA VIS PICTURE H:14 V:0 I/OAM2 F/TA VIS PICTURE H:15 V:0 I/OAM2 F/TB VIS PICTURE H:16 V:0 I/OAM2 F/TB VIS PICTURE H:17 V:0 I/OAM2 F/NT VIS PICTURE H:18 V:0 I/OAM2 F/NT VIS PICTURE H:19 V:0 I/OAM2 F/AT VIS PICTURE H:20 V:0 I/OAM2 F/AT VIS PICTURE H:21 V:0 I/OAM2 F/TA VIS PICTURE H:22 V:0 I/OAM2 F/TA VIS PICTURE H:23 V:0 I/OAM2 F/TB VIS PICTURE H:24 V:0 I/OAM2 F/TB VIS PICTURE H:25 V:0 I/OAM2 F/NT VIS PICTURE H:26 V:0 I/OAM2 F/NT VIS PICTURE H:27 V:0 I/OAM2 F/AT VIS PICTURE H:28 V:0 I/OAM2 F/AT VIS PICTURE H:29 V:0 I/OAM2 F/TA VIS PICTURE H:30 V:0 I/OAM2 F/TA VIS PICTURE H:31 V:0 I/OAM2 F/TB VIS PICTURE H:32 V:0 I/OAM2 F/TB VIS PICTURE H:33 V:0 I/OAM2 F/NT VIS PICTURE H:34 V:0 I/OAM2 F/NT VIS PICTURE H:35 V:0 I/OAM2 F/AT VIS PICTURE H:36 V:0 I/OAM2 F/AT VIS PICTURE H:37 V:0 I/OAM2 F/TA VIS PICTURE H:38 V:0 I/OAM2 F/TA VIS PICTURE H:39 V:0 I/OAM2 F/TB VIS PICTURE H:40 V:0 I/OAM2 F/TB VIS PICTURE H:41 V:0 I/OAM2 F/NT VIS PICTURE H:42 V:0 I/OAM2 F/NT VIS PICTURE H:43 V:0 I/OAM2 F/AT VIS PICTURE H:44 V:0 I/OAM2 F/AT VIS PICTURE H:45 V:0 I/OAM2 F/TA VIS PICTURE H:46 V:0 I/OAM2 F/TA VIS PICTURE H:47 V:0 I/OAM2 F/TB VIS PICTURE H:48 V:0 I/OAM2 F/TB VIS PICTURE H:49 V:0 I/OAM2 F/NT VIS PICTURE H:50 V:0 I/OAM2 F/NT VIS PICTURE H:51 V:0 I/OAM2 F/AT VIS PICTURE H:52 V:0 I/OAM2 F/AT VIS PICTURE H:53 V:0 I/OAM2 F/TA VIS PICTURE H:54 V:0 I/OAM2 F/TA VIS PICTURE H:55 V:0 I/OAM2 F/TB VIS PICTURE H:56 V:0 I/OAM2 F/TB VIS PICTURE H:57 V:0 I/OAM2 F/NT VIS PICTURE H:58 V:0 I/OAM2 F/NT VIS PICTURE H:59 V:0 I/OAM2 F/AT VIS PICTURE H:60 V:0 I/OAM2 F/AT VIS PICTURE H:61 V:0 I/OAM2 F/TA VIS PICTURE H:62 V:0 I/OAM2 F/TA VIS PICTURE H:63 V:0 I/OAM2 F/TB VIS PICTURE H:64 V:0 EVAL I/OAM2 F/TB VIS PICTURE H:65 V:0 F/NT VIS PICTURE H:66 V:0 S/EV F/NT VIS PICTURE H:67 V:0 F/AT VIS PICTURE H:68 V:0 F/AT VIS PICTURE H:69 V:0 F/TA VIS PICTURE H:70 V:0 F/TA VIS PICTURE H:71 V:0 F/TB VIS PICTURE H:72 V:0 F/TB VIS PICTURE H:73 V:0 F/NT VIS PICTURE H:74 V:0 F/NT VIS PICTURE H:75 V:0 F/AT VIS PICTURE H:76 V:0 F/AT VIS PICTURE H:77 V:0 F/TA VIS PICTURE H:78 V:0 F/TA VIS PICTURE H:79 V:0 F/TB VIS PICTURE H:80 V:0 F/TB VIS PICTURE H:81 V:0 F/NT VIS PICTURE H:82 V:0 F/NT VIS PICTURE H:83 V:0 F/AT VIS PICTURE H:84 V:0 F/AT VIS PICTURE H:85 V:0 F/TA VIS PICTURE H:86 V:0 F/TA VIS PICTURE H:87 V:0 F/TB VIS PICTURE H:88 V:0 F/TB VIS PICTURE H:89 V:0 F/NT VIS PICTURE H:90 V:0 F/NT VIS PICTURE H:91 V:0 F/AT VIS PICTURE H:92 V:0 F/AT VIS PICTURE H:93 V:0 F/TA VIS PICTURE H:94 V:0 F/TA VIS PICTURE H:95 V:0 F/TB VIS PICTURE H:96 V:0 F/TB VIS PICTURE H:97 V:0 F/NT VIS PICTURE H:98 V:0 F/NT VIS PICTURE H:99 V:0 F/AT VIS PICTURE H:100 V:0 F/AT VIS PICTURE H:101 V:0 F/TA VIS PICTURE H:102 V:0 F/TA VIS PICTURE H:103 V:0 F/TB VIS PICTURE H:104 V:0 F/TB VIS PICTURE H:105 V:0 F/NT VIS PICTURE H:106 V:0 F/NT VIS PICTURE H:107 V:0 F/AT VIS PICTURE H:108 V:0 F/AT VIS PICTURE H:109 V:0 F/TA VIS PICTURE H:110 V:0 F/TA VIS PICTURE H:111 V:0 F/TB VIS PICTURE H:112 V:0 F/TB VIS PICTURE H:113 V:0 F/NT VIS PICTURE H:114 V:0 F/NT VIS PICTURE H:115 V:0 F/AT VIS PICTURE H:116 V:0 F/AT VIS PICTURE H:117 V:0 F/TA VIS PICTURE H:118 V:0 F/TA VIS PICTURE H:119 V:0 F/TB VIS PICTURE H:120 V:0 F/TB VIS PICTURE H:121 V:0 F/NT VIS PICTURE H:122 V:0 F/NT VIS PICTURE H:123 V:0 F/AT VIS PICTURE H:124 V:0 F/AT VIS PICTURE H:125 V:0 F/TA VIS PICTURE H:126 V:0 F/TA VIS PICTURE H:127 V:0 F/TB VIS PICTURE H:128 V:0 F/TB VIS PICTURE H:129 V:0 F/NT VIS PICTURE H:130 V:0 F/NT VIS PICTURE H:131 V:0 F/AT VIS PICTURE H:132 V:0 F/AT VIS PICTURE H:133 V:0 F/TA VIS PICTURE H:134 V:0 F/TA VIS PICTURE H:135 V:0 F/TB VIS PICTURE H:136 V:0 F/TB VIS PICTURE H:137 V:0 F/NT VIS PICTURE H:138 V:0 F/NT VIS PICTURE H:139 V:0 F/AT VIS PICTURE H:140 V:0 F/AT VIS PICTURE H:141 V:0 F/TA VIS PICTURE H:142 V:0 F/TA VIS PICTURE H:143 V:0 F/TB VIS PICTURE H:144 V:0 F/TB VIS PICTURE H:145 V:0 F/NT VIS PICTURE H:146 V:0 F/NT VIS PICTURE H:147 V:0 F/AT VIS PICTURE H:148 V:0 F/AT VIS PICTURE H:149 V:0 F/TA VIS PICTURE H:150 V:0 F/TA VIS PICTURE H:151 V:0 F/TB VIS PICTURE H:152 V:0 F/TB VIS PICTURE H:153 V:0 F/NT VIS PICTURE H:154 V:0 F/NT VIS PICTURE H:155 V:0 F/AT VIS PICTURE H:156 V:0 F/AT VIS PICTURE H:157 V:0 F/TA VIS PICTURE H:158 V:0 F/TA VIS PICTURE H:159 V:0 F/TB VIS PICTURE H:160 V:0 F/TB VIS PICTURE H:161 V:0 F/NT VIS PICTURE H:162 V:0 F/NT VIS PICTURE H:163 V:0 F/AT VIS PICTURE H:164 V:0 F/AT VIS PICTURE H:165 V:0 F/TA VIS PICTURE H:166 V:0 F/TA VIS PICTURE H:167 V:0 F/TB VIS PICTURE H:168 V:0 F/TB VIS PICTURE H:169 V:0 F/NT VIS PICTURE H:170 V:0 F/NT VIS PICTURE H:171 V:0 F/AT VIS PICTURE H:172 V:0 F/AT VIS PICTURE H:173 V:0 F/TA VIS PICTURE H:174 V:0 F/TA VIS PICTURE H:175 V:0 F/TB VIS PICTURE H:176 V:0 F/TB VIS PICTURE H:177 V:0 F/NT VIS PICTURE H:178 V:0 F/NT VIS PICTURE H:179 V:0 F/AT VIS PICTURE H:180 V:0 F/AT VIS PICTURE H:181 V:0 F/TA VIS PICTURE H:182 V:0 F/TA VIS PICTURE H:183 V:0 F/TB VIS PICTURE H:184 V:0 F/TB VIS PICTURE H:185 V:0 F/NT VIS PICTURE H:186 V:0 F/NT VIS PICTURE H:187 V:0 F/AT VIS PICTURE H:188 V:0 F/AT VIS PICTURE H:189 V:0 F/TA VIS PICTURE H:190 V:0 F/TA VIS PICTURE H:191 V:0 F/TB VIS PICTURE H:192 V:0 F/TB VIS PICTURE H:193 V:0 F/NT VIS PICTURE H:194 V:0 F/NT VIS PICTURE H:195 V:0 F/AT VIS PICTURE H:196 V:0 F/AT VIS PICTURE H:197 V:0 F/TA VIS PICTURE H:198 V:0 F/TA VIS PICTURE H:199 V:0 F/TB VIS PICTURE H:200 V:0 F/TB VIS PICTURE H:201 V:0 F/NT VIS PICTURE H:202 V:0 F/NT VIS PICTURE H:203 V:0 F/AT VIS PICTURE H:204 V:0 F/AT VIS PICTURE H:205 V:0 F/TA VIS PICTURE H:206 V:0 F/TA VIS PICTURE H:207 V:0 F/TB VIS PICTURE H:208 V:0 F/TB VIS PICTURE H:209 V:0 F/NT VIS PICTURE H:210 V:0 F/NT VIS PICTURE H:211 V:0 F/AT VIS PICTURE H:212 V:0 F/AT VIS PICTURE H:213 V:0 F/TA VIS PICTURE H:214 V:0 F/TA VIS PICTURE H:215 V:0 F/TB VIS PICTURE H:216 V:0 F/TB VIS PICTURE H:217 V:0 F/NT VIS PICTURE H:218 V:0 F/NT VIS PICTURE H:219 V:0 F/AT VIS PICTURE H:220 V:0 F/AT VIS PICTURE H:221 V:0 F/TA VIS PICTURE H:222 V:0 F/TA VIS PICTURE H:223 V:0 F/TB VIS PICTURE H:224 V:0 F/TB VIS PICTURE H:225 V:0 F/NT VIS PICTURE H:226 V:0 F/NT VIS PICTURE H:227 V:0 F/AT VIS PICTURE H:228 V:0 F/AT VIS PICTURE H:229 V:0 F/TA VIS PICTURE H:230 V:0 F/TA VIS PICTURE H:231 V:0 F/TB VIS PICTURE H:232 V:0 F/TB VIS PICTURE H:233 V:0 F/NT VIS PICTURE H:234 V:0 F/NT VIS PICTURE H:235 V:0 F/AT VIS PICTURE H:236 V:0 F/AT VIS PICTURE H:237 V:0 F/TA VIS PICTURE H:238 V:0 F/TA VIS PICTURE H:239 V:0 F/TB VIS PICTURE H:240 V:0 F/TB VIS PICTURE H:241 V:0 F/NT VIS PICTURE H:242 V:0 F/NT VIS PICTURE H:243 V:0 F/AT VIS PICTURE H:244 V:0 F/AT VIS PICTURE H:245 V:0 F/TA VIS PICTURE H:246 V:0 F/TA VIS PICTURE H:247 V:0 F/TB VIS PICTURE H:248 V:0 F/TB VIS PICTURE H:249 V:0 F/NT VIS PICTURE H:250 V:0 F/NT VIS PICTURE H:251 V:0 F/AT VIS PICTURE H:252 V:0 F/AT VIS PICTURE H:253 V:0 F/TA VIS PICTURE H:254 V:0 F/TA VIS PICTURE H:255 V:0 F/TB VIS PICTURE H:256 V:0 E/EV EVAL F/TB VIS PICTURE H:257 V:0 F/NT PAR/O /FO PICTURE SYNC FRPORCH H:258 V:0 F/NT PAR/O /FO PICTURE SYNC FRPORCH H:259 V:0 PAR/O /FO PICTURE SYNC FRPORCH H:260 V:0 PAR/O /FO PICTURE SYNC FRPORCH H:261 V:0 PAR/O /FO PICTURE SYNC FRPORCH H:262 V:0 PAR/O /FO PICTURE SYNC FRPORCH H:263 V:0 PAR/O /FO PICTURE SYNC FRPORCH H:264 V:0 PAR/O /FO PICTURE SYNC FRPORCH H:265 V:0 F/NT PAR/O /FO PICTURE SYNC FRPORCH H:266 V:0 F/NT PAR/O /FO PICTURE SYNC FRPORCH H:267 V:0 PAR/O /FO PICTURE SYNC FRPORCH H:268 V:0 PAR/O /FO PICTURE SYNC FRPORCH H:269 V:0 PAR/O /FO PICTURE SYNC FRPORCH H:270 V:0 PAR/O /FO PICTURE SYNC FRPORCH H:271 V:0 PAR/O /FO SYNC FRPORCH BKPORCH H:272 V:0 PAR/O /FO SYNC FRPORCH BKPORCH H:273 V:0 F/NT PAR/O /FO SYNC FRPORCH BKPORCH H:274 V:0 F/NT PAR/O /FO SYNC FRPORCH BKPORCH H:275 V:0 PAR/O /FO SYNC FRPORCH BKPORCH H:276 V:0 PAR/O /FO SYNC FRPORCH BKPORCH H:277 V:0 PAR/O /FO SYNC FRPORCH BKPORCH H:278 V:0 PAR/O /FO SYNC FRPORCH BKPORCH H:279 V:0 PAR/O /FO SYNC FRPORCH BKPORCH H:280 V:0 SC/CNT PAR/O /FO BKPORCH H:281 V:0 SC/CNT F/NT PAR/O /FO BKPORCH H:282 V:0 SC/CNT F/NT PAR/O /FO BKPORCH H:283 V:0 SC/CNT PAR/O /FO BKPORCH H:284 V:0 SC/CNT PAR/O /FO BKPORCH H:285 V:0 SC/CNT PAR/O /FO BKPORCH H:286 V:0 SC/CNT PAR/O /FO BKPORCH H:287 V:0 SC/CNT PAR/O /FO BKPORCH H:288 V:0 SC/CNT PAR/O /FO BKPORCH H:289 V:0 SC/CNT F/NT PAR/O /FO BKPORCH H:290 V:0 SC/CNT F/NT PAR/O /FO BKPORCH H:291 V:0 SC/CNT PAR/O /FO BKPORCH H:292 V:0 SC/CNT PAR/O /FO BKPORCH H:293 V:0 SC/CNT PAR/O /FO BKPORCH H:294 V:0 SC/CNT PAR/O /FO BKPORCH H:295 V:0 SC/CNT PAR/O /FO BKPORCH H:296 V:0 SC/CNT PAR/O /FO BKPORCH H:297 V:0 SC/CNT F/NT PAR/O /FO BKPORCH H:298 V:0 SC/CNT F/NT PAR/O /FO BKPORCH H:299 V:0 SC/CNT PAR/O /FO BKPORCH H:300 V:0 SC/CNT PAR/O /FO BKPORCH H:301 V:0 SC/CNT PAR/O /FO BKPORCH H:302 V:0 SC/CNT PAR/O /FO BKPORCH H:303 V:0 SC/CNT PAR/O /FO BKPORCH H:304 V:0 SC/CNT PAR/O /FO BKPORCH H:305 V:0 F/NT PAR/O /FO BKPORCH H:306 V:0 F/NT PAR/O /FO BKPORCH H:307 V:0 PAR/O /FO BKPORCH H:308 V:0 PAR/O /FO BKPORCH H:309 V:0 PAR/O /FO BKPORCH BURST H:310 V:0 PAR/O /FO BKPORCH BURST H:311 V:0 PAR/O /FO BKPORCH BURST H:312 V:0 PAR/O /FO BKPORCH BURST H:313 V:0 F/NT PAR/O /FO BKPORCH BURST H:314 V:0 F/NT PAR/O /FO BKPORCH BURST H:315 V:0 PAR/O /FO BKPORCH BURST H:316 V:0 PAR/O /FO BKPORCH BURST H:317 V:0 PAR/O /FO BKPORCH BURST H:318 V:0 PAR/O /FO BKPORCH BURST H:319 V:0 PAR/O /FO BKPORCH BURST H:320 V:0 PAR/O /FO BKPORCH BURST H:321 V:0 F/NT BKPORCH BURST H:322 V:0 F/NT BKPORCH BURST H:323 V:0 F/AT BKPORCH BURST H:324 V:0 F/AT BKPORCH H:325 V:0 F/TA BKPORCH H:326 V:0 F/TA BKPORCH H:327 V:0 F/TB BKPORCH H:328 V:0 F/TB BKPORCH H:329 V:0 F/NT PICTURE H:330 V:0 F/NT PICTURE H:331 V:0 F/AT PICTURE H:332 V:0 F/AT PICTURE H:333 V:0 F/TA PICTURE H:334 V:0 F/TA PICTURE H:335 V:0 F/TB PICTURE H:336 V:0 F/TB PICTURE H:337 V:0 0/HPOS EVAL F/NT /FO PICTURE H:338 V:0 0/HPOS EVAL F/NT /FO PICTURE H:339 V:0 0/HPOS EVAL /FO PICTURE H:340 V:0 0/HPOS EVAL /FO PICTUREОстальные строки начинаются так: H:0 V:1 /FO PICTURE H:1 V:1 I/OAM2 F/NT VIS PICTURE H:2 V:1 I/OAM2 F/NT VIS PICTURE .... и дальше понеслась душа по кочкам Полный список команд H/V логики: CLIP_O, CLIP_B: команды обрезания левых 8 пикселей бекгрануда / спрайтов (clipping) 0/HPOS: очистить счетчики H в спрайтовой FIFO (спрайтовая FIFO - это специальная схема, которая выдает наружу смешанный цвет 8 текущих спрайтов) EVAL: сравнение спрайтов в процессе PAR/O: выборка паттернов для спрайтов VIS: PPU ренедерит видимые пиксели (НЕ относится к front porch) BLNK: картинка не видна (vblank) или выключена контрольными регистрами RESCL: сбросить reset flip/flop S/EV, E/EV: точное значение пока не известно, но первая испольняется перед началом сравнения спрайтов, а вторая - вконце I/OAM2: инициализировать дополнительную OAM (32 байта, которые используются для временного хранения 8 текущих спрайтов) SC/CNT: обновить регистры скроллинга. F/NT, F/AT, F/TA, F/TB, /FO: команды выборки данных из памяти. NT - name table, AT - attribute table, TA - tile #0, TB - tile #1, /FO - активна когда PPU выбирает паттерны для спрайтов PICTURE, BURST, SYNC : команды управления видеотрактом /BPORCH :back porch (внутренняя команда, наружу не идет) /FPORCH :front porch (внутренняя команда, наружу не идет) /INT: выход /INT (прерывание VBlank) Таким образом H/V - это черный ящик, который в зависимости от текущего значения H и V выдает различные команды. На вход к нему поступает минимальное количество управляющих линий: - PPU control register bits: OBCLIP, BGCLIP (для упраления командами clippinga), BLACK (выключить отрисовку видимых пикселей), VBL (отключить генерацию /INT) - /R2 and /DBE bus enablers (for DB7), для получения текущего состояния vblank (бит 7 регистра $2002) Несколько слов о контрольной линии "BLACK". - Эта линия активна только в том случае, когда выключены бекграунд И спрайты. То есть на экране вообще ничего нет. - Команда BLNK (blank) - это на самом деле комбинация BLACK и VBLANK. То есть команда BLNK активна во время VBLANK (когда естественно на экране ничего нет), а также если картинка отключена полностью (BLACK=1) BLNK влияет на работу PPU следующим образом: - часть контрольных линий с H/V счетчиков просто отсекаются, в результате чего наружу не идут команды управления другими блоками, ответственными за отрисовку - эта линия дополнительно разводится по остальным блокам и просто отключает их, для экономии электричества и энергии Вселенной. Больше тут сказать особо нечего, можно двигаться дальше ) На очереди "безспрайтовый" PPU. То есть я ставлю задачу вывести задний фон, игнорируя все блоки, которые занимаются сравнением и наложением спрайтов. Исходный код тут: http://code.google.com/p/breaks/source/ ... sPPU/PPU.c
|
|
16 ноя 2012, 22:55 |
|
Зарегистрирован: 24 июл 2007, 06:54 Сообщения: 492 Откуда: Embedded
|
Отключение лишних блоков при отключении рендера нужны для того, чтобы можно было со стороны процессора беспрепятственно работать с ресурсами PPU, у них счетчик адреса рендера используется и для обращения процессором ($2006).
_________________ Tried so hard and got so far, but in the end, it doesn't even matter...
|
|
18 ноя 2012, 02:01 |
|
Зарегистрирован: 24 июл 2007, 10:41 Сообщения: 570
|
Хоть я и убит сегодня наглухо, но полную схемку PPU всё же доделал. Осталось узнать назначение всего 3 (!) контрольных линий, ну и ещё кое-где переименовать старые названия, например линия "BLNK" раньше называлась "DB/OAM". Но в целом связи между транзисторами правильные, так что логически - это завершенная схема. И что самое главное - я понимаю как это работает! Bonus: эту схемку я ещё не выкладывал. Адресный декодер (маленькая схемка, находится в самом низу чипа) Декодер всё же присутствует, я совсем забыл, что PPU кроме чтения NT/AT умеет ещё и наружу писать (в эти самые NT/AT), так что декодер ему необходим. Ну и дополнительно в этой схеме находится какая-то логика, на которую всем пох.
|
|
18 ноя 2012, 17:46 |
|
Зарегистрирован: 24 июл 2007, 06:54 Сообщения: 492 Откуда: Embedded
|
Коли все ясно, давай нарисуем узлы в логическом эквиваленте, обычной логикой.
_________________ Tried so hard and got so far, but in the end, it doesn't even matter...
|
|
18 ноя 2012, 23:29 |
|
Зарегистрирован: 24 июл 2007, 10:41 Сообщения: 570
|
Посмотри исходники PPU: http://code.google.com/p/breaks/source/ ... sPPU/PPU.cсложно такое в Verilog перевести ? Или нужно как-то адаптировать их? По поводу логической схемы - никогда такое не делал, хз как подступиться даже) И надо ли оно? И кстати без трансов ты никак не обойдешся, там очень много "transfer gates" - это когда транзистор соединяет два конца шины. И статические защелки с плавающим затвором тоже на базе трансов. Такого в логических элекментах никак не нарисуешь. -- 19 ноя 2012, 01:02 -- Все схемы PPU теперь будут лежать тут: http://code.google.com/p/breaks/wiki/G2C02
|
|
19 ноя 2012, 08:03 |
|
Зарегистрирован: 24 июл 2007, 06:54 Сообщения: 492 Откуда: Embedded
|
Во первых: Это я хочу сказать, что в C я не очень, читаю со словарем. Во вторых, схема рисуется просто, тебе нужно только подписать, как кучка транзисторов работает в группе. Например, если это двоичный счетчик - то нет необходимости описывать каждый каскад, достаточно сказать, что это счетчик на n разрядов, с предустановкой или нет. Касаемо шинных формирователей, ты тоже не прав: такой транзистор мы рассматриваем как tri-state (ну или pull-up/down).
_________________ Tried so hard and got so far, but in the end, it doesn't even matter...
|
|
19 ноя 2012, 09:33 |
|
Зарегистрирован: 24 июл 2007, 10:41 Сообщения: 570
|
Нет, я не про pullups, я про вот такие штуки: пока транзистор выполняющий роль "transfer gate" открыт (PCLK=1), затвор получает заряд (или разряжается). На следующий такт (PCLK=0) мы получаем "плавающий затвор" - заряд сохраняется на манер конденсатора и транзистор всё равно открыт, если на затворе есть заряд. как такое логическими элементами представить? -- 19 ноя 2012, 09:12 -- Как инвертированный tri-state можно изобразить? -- 19 ноя 2012, 09:13 -- Если да, то как обозначить что этот вентиль имеет элемент памяти? (статическая защелка)
|
|
19 ноя 2012, 10:14 |
|
Зарегистрирован: 24 июл 2007, 06:54 Сообщения: 492 Откуда: Embedded
|
Тактируемый триггер. Это же просто. Только, такие узлы надо рассматривать в целом, а не отдельные транзисторы. Я там, кстати, видел много таких гейт сигналов.
_________________ Tried so hard and got so far, but in the end, it doesn't even matter...
|
|
19 ноя 2012, 10:52 |
|
Зарегистрирован: 24 июл 2007, 10:41 Сообщения: 570
|
Агась, вот так ? Я же говорю, что никогда логические схемы не рисовал )
|
|
19 ноя 2012, 14:35 |
|
Зарегистрирован: 24 июл 2007, 06:54 Сообщения: 492 Откуда: Embedded
|
org писал(а): Агась, вот так ? Так точно. Правда, полным функциональным аналогом будет все-таки латч (защелка), это триггер с гейтовым входом: пока управление разрешает - выход повторяет вход, когда управление запрещает - выход хранит последнее состояние. Яркий пример 74х373 (или 555ИР22). Пока на входе G у него лог.1 - он пропускает сигналы, если на входе G поставить лог.0 - он запоминает последнее состояние. Инверсия на входе не принципиальна и добавляется по вкусу. У латча заместо символа "С" рисуют либо "L", либо "G". org писал(а): Я же говорю, что никогда логические схемы не рисовал ) Ну никогда не поздно. Давай начнем с верху (по сигналам). Ты объяснять как узел работает, а я реализовывать его в логической схеме. Начать надо с тактового входа и, как следствие, с генератора фаз для видеовыхода.
_________________ Tried so hard and got so far, but in the end, it doesn't even matter...
|
|
19 ноя 2012, 17:04 |
|
Зарегистрирован: 24 июл 2007, 10:41 Сообщения: 570
|
вот что получается: По поводу латчей - я не стал "G" рисовать, потому что тут CLK divider, то есть в качестве разрешающего входа используется CLK (формируя регистр сдвига) у меня вопрос, а H/V-декодер как лучше сделать? по сути дела это NOR с множеством входов. но рисовать длинный NOR как то нелепо получится, может быть есть более удобный способ отображения? вот эта конструкция: EDIT: на картинке опечатка Pixel clock = CLK >> 2 (то есть делитель на 4)
|
|
19 ноя 2012, 19:44 |
|
Зарегистрирован: 24 июл 2007, 06:54 Сообщения: 492 Откуда: Embedded
|
org писал(а): вот что получается: По поводу латчей - я не стал "G" рисовать, потому что тут CLK divider, то есть в качестве разрешающего входа используется CLK (формируя регистр сдвига) Забавный ход. Тем не менее, он работает, но не так. org писал(а): EDIT: на картинке опечатка Pixel clock = CLK >> 2 (то есть делитель на 4) Он делит на 2, т.к. четные и нечетные латчи тактируются инверсией (используется оба перепада). Замена триггера на латч ничего не меняет - эта схема делит на 2. org писал(а): у меня вопрос, а H/V-декодер как лучше сделать? по сути дела это NOR с множеством входов. но рисовать длинный NOR как то нелепо получится, может быть есть более удобный способ отображения? вот эта конструкция: А я вижу монтажное И. Инверсия по входу дает нам многовходовой ИЛИ. Многовходовые элементы имеют место быть, например 555ЛА2 имеет 8 входов, так что все ОК. Примитивы внутри кактуса имеют предел 12 входов, т.е. рисуем как есть.
_________________ Tried so hard and got so far, but in the end, it doesn't even matter...
|
|
19 ноя 2012, 21:50 |
|
Зарегистрирован: 24 июл 2007, 10:41 Сообщения: 570
|
она делит на 2 в степени 2. делила бы на 2, если бы там было только пара триггеров. а так первая пара задерживает сигнал в 2 раза, а вторая пара - ещё в 2 раза, в итоге получается 4.
монтажное И не может быть, потому что на выходе каждой "палки" лог.0, если хотя бы один вход имеет лог.1, то есть OUT = NOR(a,b,c,....,n). если бы это было "И", тогда выход имел бы лог.0, если хотя бы один вход был равен 0.
|
|
19 ноя 2012, 21:56 |
|
Зарегистрирован: 24 июл 2007, 06:54 Сообщения: 492 Откуда: Embedded
|
org писал(а): она делит на 2 в степени 2. делила бы на 2, если бы там было только пара триггеров. а так первая пара задерживает сигнал в 2 раза, а вторая пара - ещё в 2 раза, в итоге получается 4. Там инверсия на каждом триггере, стало быть он меняет сигнал на каждом полутакте. Может более детально рассмотреть для начала чисто транзисторную схему? org писал(а): монтажное И не может быть, потому что на выходе каждой "палки" лог.0, если хотя бы один вход имеет лог.1, то есть OUT = NOR(a,b,c,....,n). если бы это было "И", тогда выход имел бы лог.0, если хотя бы один вход был равен 0. Схема соединения кучки ОК выходов называется "монтажное И", потому как только лог.1 на всех выходах даст лог.1 в результате. Другое дело, каскад ОК сам по себе инвертор, поэтому мы получаем так называемый НЕ-И (B-AND), что дает настоящий элемент ИЛИ.
_________________ Tried so hard and got so far, but in the end, it doesn't even matter...
|
|
19 ноя 2012, 23:07 |
|
Зарегистрирован: 24 июл 2007, 10:41 Сообщения: 570
|
CLK=0 PCLK=0 CLK=1 PCLK=0 CLK=0 PCLK=0 CLK=1 PCLK=0 CLK=0 PCLK=1 CLK=1 PCLK=1 CLK=0 PCLK=1 CLK=1 PCLK=1 CLK=0 PCLK=0 CLK=1 PCLK=0 CLK=0 PCLK=0 CLK=1 PCLK=0 CLK=0 PCLK=1 CLK=1 PCLK=1 CLK=0 PCLK=1 CLK=1 PCLK=1
|
|
19 ноя 2012, 23:17 |
|
Зарегистрирован: 24 июл 2007, 06:54 Сообщения: 492 Откуда: Embedded
|
А, лол, точно по два периода на полупериод, так как 4 триггера, это даже видно на моей симуляции. Звиняйте. Едем дальше.
_________________ Tried so hard and got so far, but in the end, it doesn't even matter...
|
|
|
Кто сейчас на конференции |
Сейчас этот форум просматривают: Bing [Bot] и гости: 4 |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения
|
|