The upper 5 bits set the starting address in the nametable. The lower 3 bits set the amount by which pixels are delayed (higher = less delay).
Let's say the first four 8x1 pixel slivers on a particular scanline are as follows:
Code:
01002003 03300330 00112233 30020010
Then, for each X from 0 to 23, I break down how this scroll value is decomposed into a starting position and a delay amount:
Code:
x = 0: 00000 000. Coarse X = 0, fine X = 0. Start at tile 0, delay by 8 - 0 = 8
x = 1: 00000 001. Coarse X = 0, fine X = 1. Start at tile 0, delay by 8 - 1 = 7
x = 2: 00000 010. Coarse X = 0, fine X = 2. Start at tile 0, delay by 8 - 2 = 6
x = 3: 00000 011. Coarse X = 0, fine X = 3. Start at tile 0, delay by 8 - 3 = 5
x = 4: 00000 100. Coarse X = 0, fine X = 4. Start at tile 0, delay by 8 - 4 = 4
x = 5: 00000 101. Coarse X = 0, fine X = 5. Start at tile 0, delay by 8 - 5 = 3
x = 6: 00000 110. Coarse X = 0, fine X = 6. Start at tile 0, delay by 8 - 6 = 2
x = 7: 00000 111. Coarse X = 0, fine X = 7. Start at tile 0, delay by 8 - 7 = 1
x = 8: 00000 000. Coarse X = 1, fine X = 0. Start at tile 1, delay by 8 - 0 = 8
x = 9: 00001 001. Coarse X = 1, fine X = 1. Start at tile 1, delay by 8 - 1 = 7
x = 10: 00001 010. Coarse X = 1, fine X = 2. Start at tile 1, delay by 8 - 2 = 6
x = 11: 00001 011. Coarse X = 1, fine X = 3. Start at tile 1, delay by 8 - 3 = 5
x = 12: 00001 100. Coarse X = 1, fine X = 4. Start at tile 1, delay by 8 - 4 = 4
x = 13: 00001 101. Coarse X = 1, fine X = 5. Start at tile 1, delay by 8 - 5 = 3
x = 14: 00001 110. Coarse X = 1, fine X = 6. Start at tile 1, delay by 8 - 6 = 2
x = 15: 00001 111. Coarse X = 1, fine X = 7. Start at tile 1, delay by 8 - 7 = 1
x = 16: 00010 000. Coarse X = 2, fine X = 0. Start at tile 2, delay by 8 - 0 = 8
x = 17: 00010 001. Coarse X = 2, fine X = 1. Start at tile 2, delay by 8 - 1 = 7
x = 18: 00010 010. Coarse X = 2, fine X = 2. Start at tile 2, delay by 8 - 2 = 6
x = 19: 00010 011. Coarse X = 2, fine X = 3. Start at tile 2, delay by 8 - 3 = 5
x = 20: 00010 100. Coarse X = 2, fine X = 4. Start at tile 2, delay by 8 - 4 = 4
x = 21: 00010 101. Coarse X = 2, fine X = 5. Start at tile 2, delay by 8 - 5 = 3
x = 22: 00010 110. Coarse X = 2, fine X = 6. Start at tile 2, delay by 8 - 6 = 2
x = 23: 00010 111. Coarse X = 2, fine X = 7. Start at tile 2, delay by 8 - 7 = 1
When starting coarse X increases by 1, pixels arrive 8 pixels earlier than they would other have. But most of this being earlier is canceled out by the increased delay from fine X = 7 to fine X = 0 (from 1 to 8 pixels, a difference of 7 pixels). I'll run a few tiles for both x = 7 and x = 8 to show how two adjacent scroll values across a tile boundary changes the fetch pattern and which pixel is used.
With a horizontal scroll value of 7 (coarse X 0, fine X 7), the preroll at dots 321-336 has loaded two slivers from coarse X = 0 and coarse X = 1, leaving coarse X at 2.
Code:
SIPO PISO CX Fetch
01002003 03300330 2 Nametable for X=2
10020030 3300330x 2
00200303 300330xx 2 Attribute for X=2
02003033 00330xxx 2
20030330 0330xxxx 2 Pattern plane 0 for X=2
00303300 330xxxxx 2
03033003 30xxxxxx 2 Pattern plane 1 for X=2
30330033 0xxxxxxx 2 Prepare to load sliver into PISO
03300330 00112233 3 Nametable for X=3
33003300 0112233x 3
30033000 112233xx 3 Attribute for X=3
00330001 12233xxx 3
03300011 2233xxxx 3 Pattern plane 0 for X=3
33000112 233xxxxx 3
30001122 33xxxxxx 3 Pattern plane 1 for X=3
00011223 3xxxxxxx 3 Prepare to load sliver into PISO
^
Fine X=7
Result:
30330033 00011223
With a horizontal scroll value of 8 (coarse X 1, fine X 0), the preroll at dots 321-336 has loaded two slivers from coarse X = 1 and coarse X = 2, leaving coarse X at 3.
Code:
SIPO PISO CX Fetch
03300330 00112233 3 Nametable for X=3
33003300 0112233x 3
30033000 112233xx 3 Attribute for X=3
00330001 12233xxx 3
03300011 2233xxxx 3 Pattern plane 0 for X=3
33000112 233xxxxx 3
30001122 33xxxxxx 3 Pattern plane 1 for X=3
00011223 3xxxxxxx 3 Prepare to load sliver into PISO
00112233 30020010 4 Nametable for X=4
01122333 0020010x 4
11223330 020010xx 4 Attribute for X=4
12233300 20010xxx 4
22333002 0010xxxx 4 Pattern plane 0 for X=4
23330020 010xxxxx 4
33300200 10xxxxxx 4 Pattern plane 1 for X=4
33002001 0xxxxxxx 4 Prepare to load sliver into PISO
^
Fine X=0
Result:
03300330 00112233
Result from X = 7 (fine X = 7, starting coarse X = 0):
30330033 00011223Result from X = 8 (fine X = 0, starting coarse X = 1):
03300330 00112233These are offset by one pixel from each other.
Which is the first line of this diagram that still confuses you?