我想知道 NES 如何显示其图形肌肉。我已经在网上研究了一些东西并通读了它,但我想知道最后一件事:Nametables。
基本上,根据我的阅读,NES 命名表中的每个 8x8 块都指向模式表中的一个位置,该位置保存图形内存。此外,nametable 也有一个属性表,它为每个 16x16 块设置一个特定的调色板。它们像这样连接在一起:
(假设有 16 个 8x8 块)名称表,ABCD = 指向精灵数据的指针:
ABBB
CDCC
DDDD
DDDD
属性表,其中 1 2 3 = 指向调色板数据的指针,< 左侧引用值,^ 上方,' 左侧和上方:
1<2<
^'^'
3<3<
^'^'
因此,在上面的示例中,块将被着色为
1A 1B 2B 2B
1C 1D 2C 2C
3D 3D 3D 3D
3D 3D 3D 3D
现在,如果我把它放在固定屏幕上——效果很好!因为 NES 分辨率是 256x240 像素。现在,如何调整这些表格以进行滚动?
因为 Nametable 0 可以滚动到 Nametable 1,如果你继续滚动 Nametable 0 将再次环绕。我明白了。但我不明白的是如何滚动属性表。根据我在网上阅读的内容,它为其分配属性的 16x16 块会导致屏幕边缘图块的颜色失真(如在 SMB3 中从左到右滚动时看到的那样,反之亦然)。
我担心的是我了解如何滚动名称表,但是如何滚动属性表?例如,如果我在屏幕左侧有一个绿色块,理论上向右移动屏幕应该会导致右侧的图块也是绿色的,直到它们更多地移动到框架中,它们将恢复到他们的正常颜色。
~~~~编辑:我确实想指出我知道扫描线X和Y。这个想法刚刚在我脑海中闪过。
假设我在 10 的扫描线 Y。这意味着我正在水平读取 10 个值到我的命名表中。这意味着我的第一列不在屏幕上,因为它的像素宽度仅为 8。但是,颜色属性保持不变,因为它的宽度为 16。
假设整个列的颜色属性是绿色,我是否正确假设对用户来说,屏幕左侧的前 6 个像素将被着色为绿色,屏幕上最右边的 10 个像素也应该是绿色的?那么,根据屏幕左侧的假设,我是否正确?