Форум Эму-Россия
http://forum.emu-russia.net/

Очень низкоуровневый эмулятор 6502 / NES
http://forum.emu-russia.net/viewtopic.php?f=13&t=3938
Страница 6 из 21

Автор:  HardWareMan [ 14 ноя 2012, 17:26 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Просто сделали надежный сброс. Поэтому и пишут, что нужно ждать пару кадров (отслеживать по NMI), прежде чем программировать PPU. Все просто, оказалось.

Растактовку можешь свести в таблицу? Я про развертку кадра и сигналов по двум матрицам H и V.

Автор:  org [ 14 ноя 2012, 18:26 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Как раз этим вопросом занимаюсь (что и когда происходит при разных значениях H/V).

-- 14 ноя 2012, 22:11 --

По поводу сброса PPU: http://breaknes.com/info/9

Автор:  HardWareMan [ 15 ноя 2012, 10:47 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

org писал(а):
По поводу сброса PPU: http://breaknes.com/info/9

Именно.

Автор:  org [ 15 ноя 2012, 13:50 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Несколько продвинулся в понимании 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

Автор:  org [ 16 ноя 2012, 14:07 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Вообщем победил логику работы 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

Автор:  HardWareMan [ 16 ноя 2012, 22:55 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Отключение лишних блоков при отключении рендера нужны для того, чтобы можно было со стороны процессора беспрепятственно работать с ресурсами PPU, у них счетчик адреса рендера используется и для обращения процессором ($2006).

Автор:  org [ 18 ноя 2012, 02:01 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Хоть я и убит сегодня наглухо, но полную схемку PPU всё же доделал.

Изображение Изображение

Осталось узнать назначение всего 3 (!) контрольных линий, ну и ещё кое-где переименовать старые названия, например линия "BLNK" раньше называлась "DB/OAM". Но в целом связи между транзисторами правильные, так что логически - это завершенная схема. И что самое главное - я понимаю как это работает! :D

Bonus: эту схемку я ещё не выкладывал. Адресный декодер (маленькая схемка, находится в самом низу чипа)
Изображение
Декодер всё же присутствует, я совсем забыл, что PPU кроме чтения NT/AT умеет ещё и наружу писать (в эти самые NT/AT), так что декодер ему необходим. Ну и дополнительно в этой схеме находится какая-то логика, на которую всем пох.

Автор:  HardWareMan [ 18 ноя 2012, 17:46 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Коли все ясно, давай нарисуем узлы в логическом эквиваленте, обычной логикой.

Автор:  org [ 18 ноя 2012, 23:29 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Посмотри исходники 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

Автор:  HardWareMan [ 19 ноя 2012, 08:03 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Во первых:
Изображение
Это я хочу сказать, что в C я не очень, читаю со словарем. Во вторых, схема рисуется просто, тебе нужно только подписать, как кучка транзисторов работает в группе. Например, если это двоичный счетчик - то нет необходимости описывать каждый каскад, достаточно сказать, что это счетчик на n разрядов, с предустановкой или нет. Касаемо шинных формирователей, ты тоже не прав: такой транзистор мы рассматриваем как tri-state (ну или pull-up/down).

Автор:  org [ 19 ноя 2012, 09:33 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Нет, я не про pullups, я про вот такие штуки:
Изображение

пока транзистор выполняющий роль "transfer gate" открыт (PCLK=1), затвор получает заряд (или разряжается).
На следующий такт (PCLK=0) мы получаем "плавающий затвор" - заряд сохраняется на манер конденсатора и транзистор всё равно открыт, если на затворе есть заряд.

как такое логическими элементами представить?

-- 19 ноя 2012, 09:12 --

Как инвертированный tri-state можно изобразить?

Изображение

-- 19 ноя 2012, 09:13 --

Если да, то как обозначить что этот вентиль имеет элемент памяти? (статическая защелка)

Автор:  HardWareMan [ 19 ноя 2012, 10:14 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Тактируемый триггер. Это же просто. Только, такие узлы надо рассматривать в целом, а не отдельные транзисторы. Я там, кстати, видел много таких гейт сигналов.

Автор:  org [ 19 ноя 2012, 10:52 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

Агась, вот так ?

Изображение

Цитата:
Это же просто.

Я же говорю, что никогда логические схемы не рисовал )

Автор:  HardWareMan [ 19 ноя 2012, 14:35 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

org писал(а):
Агась, вот так ?
Изображение

Так точно. Правда, полным функциональным аналогом будет все-таки латч (защелка), это триггер с гейтовым входом: пока управление разрешает - выход повторяет вход, когда управление запрещает - выход хранит последнее состояние. Яркий пример 74х373 (или 555ИР22). Пока на входе G у него лог.1 - он пропускает сигналы, если на входе G поставить лог.0 - он запоминает последнее состояние. Инверсия на входе не принципиальна и добавляется по вкусу. У латча заместо символа "С" рисуют либо "L", либо "G".
org писал(а):
Цитата:
Это же просто.

Я же говорю, что никогда логические схемы не рисовал )

Ну никогда не поздно. Давай начнем с верху (по сигналам). Ты объяснять как узел работает, а я реализовывать его в логической схеме. Начать надо с тактового входа и, как следствие, с генератора фаз для видеовыхода.

Автор:  org [ 19 ноя 2012, 17:04 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

вот что получается:
Изображение
По поводу латчей - я не стал "G" рисовать, потому что тут CLK divider, то есть в качестве разрешающего входа используется CLK (формируя регистр сдвига)

у меня вопрос, а H/V-декодер как лучше сделать? по сути дела это NOR с множеством входов. но рисовать длинный NOR как то нелепо получится, может быть есть более удобный способ отображения? вот эта конструкция:
Изображение

EDIT: на картинке опечатка Pixel clock = CLK >> 2 (то есть делитель на 4)

Автор:  HardWareMan [ 19 ноя 2012, 19:44 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

org писал(а):
вот что получается:
По поводу латчей - я не стал "G" рисовать, потому что тут CLK divider, то есть в качестве разрешающего входа используется CLK (формируя регистр сдвига)

Забавный ход. Тем не менее, он работает, но не так.
org писал(а):
EDIT: на картинке опечатка Pixel clock = CLK >> 2 (то есть делитель на 4)

Он делит на 2, т.к. четные и нечетные латчи тактируются инверсией (используется оба перепада). Замена триггера на латч ничего не меняет - эта схема делит на 2.
Изображение
org писал(а):
у меня вопрос, а H/V-декодер как лучше сделать? по сути дела это NOR с множеством входов. но рисовать длинный NOR как то нелепо получится, может быть есть более удобный способ отображения? вот эта конструкция:
Изображение

А я вижу монтажное И. Инверсия по входу дает нам многовходовой ИЛИ. Многовходовые элементы имеют место быть, например 555ЛА2 имеет 8 входов, так что все ОК. Примитивы внутри кактуса имеют предел 12 входов, т.е. рисуем как есть. ;)

Автор:  org [ 19 ноя 2012, 21:50 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

она делит на 2 в степени 2.
делила бы на 2, если бы там было только пара триггеров.
а так первая пара задерживает сигнал в 2 раза, а вторая пара - ещё в 2 раза, в итоге получается 4.

монтажное И не может быть, потому что на выходе каждой "палки" лог.0, если хотя бы один вход имеет лог.1, то есть
OUT = NOR(a,b,c,....,n).
если бы это было "И", тогда выход имел бы лог.0, если хотя бы один вход был равен 0.

Автор:  HardWareMan [ 19 ноя 2012, 21:56 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

org писал(а):
она делит на 2 в степени 2.
делила бы на 2, если бы там было только пара триггеров.
а так первая пара задерживает сигнал в 2 раза, а вторая пара - ещё в 2 раза, в итоге получается 4.

Там инверсия на каждом триггере, стало быть он меняет сигнал на каждом полутакте. Может более детально рассмотреть для начала чисто транзисторную схему?
org писал(а):
монтажное И не может быть, потому что на выходе каждой "палки" лог.0, если хотя бы один вход имеет лог.1, то есть
OUT = NOR(a,b,c,....,n).
если бы это было "И", тогда выход имел бы лог.0, если хотя бы один вход был равен 0.

Схема соединения кучки ОК выходов называется "монтажное И", потому как только лог.1 на всех выходах даст лог.1 в результате. Другое дело, каскад ОК сам по себе инвертор, поэтому мы получаем так называемый НЕ-И (B-AND), что дает настоящий элемент ИЛИ.

Автор:  org [ 19 ноя 2012, 23:07 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

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

Автор:  HardWareMan [ 19 ноя 2012, 23:17 ]
Заголовок сообщения:  Re: Очень низкоуровневый эмулятор 6502 / NES

А, лол, точно по два периода на полупериод, так как 4 триггера, это даже видно на моей симуляции. Звиняйте. Едем дальше.

Страница 6 из 21 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/